diff --git a/README.md b/README.md index 1e24dc6d81caf646ac94d4bf5ef0946d048af08d..a1d408033f4e0e643e0ee5a50afe9e107d86e302 100644 --- a/README.md +++ b/README.md @@ -1,134 +1,118 @@ -
+
SimpleAdmin
-

🐔没有花里胡哨,只有简单、稳定、灵活、高效🐔

+

🐔简单之名,非凡之质——稳定、灵活、高效,实力不需夸耀。🐔

- + +
### 如果您觉得有帮助,请点右上角 "Star" 支持一下谢谢 -## 🎨框架介绍🎨 -🪶SimpleAdmin是一个小而美的通用业务型后台管理系统,专为解决开发过程中的痛点难点而生。Vue3+Vite+Vuex+JS,并在此基础上增加更人性化功能,后端基于.NET6/7+Furion,ORM采用Sqlsugar+单例模式,插件式开发。采用RBAC+多机构的权限管理模式,实现全网最灵活的接口级别数据权限控制,集成国密加解密,导入导出、导入导出、批量修改等常用插件。后端代码注释覆盖率>90%,并配备超牛皮的代码生成器和超详细的手摸手教学文档,非常适合二次开发。将日常开发中的业务场景和框架紧密结合,并坚持以人为本,以业务为中心,做到开箱即用,代码简洁、易扩展,注释详细,文档齐全,让你的开发少走弯路。 - -## 🐥选择SimpleAdmin的N个理由🐥 - -#### 📕前端采用Vue3+JavaScript -本系统是基于前端Vue3+Vite+Vuex+JS,。市面上主流的Vue3框架大部分都是采用`TypeScript`开发,虽然是官方推荐,但是也增加了一些学习成本,如果您之前使用的事vue2+js的开发方式,那么再使用本系统就非常的好上手,也不用担心vue2打包之后第一次加载巨慢的问题。 - - -#### 📗后台基于Furion脚手架 -后端基于Furion脚手架搭建。Furion是目前.NET最好用的后端框架之一,有着全网最详细的使用文档和说明,作为新手或二次开发也能很快的上手,你想要的功能基本都能在Furion中找到。而且只要提issues作者基本上都能快速解答,没有后顾之忧。 -##### 🍎 Furion框架特点 -- 全新面貌:基于 `.NET5/6/7+` 平台,没有历史包袱 -- 极少依赖:框架只依赖两个第三方包 -- 极易入门:只需要一个 `Inject()` 即可完成配置 -- 极速开发:内置丰富的企业应用开发功能 -- 极其灵活:轻松面对多变复杂的需求 -- 极易维护:采用独特的架构思想,只为长久维护设计 -- 完整文档:提供完善的开发文档 -- **跨全平台:支持所有主流操作系统及 .NET 全部项目类型** +## 🎨 框架介绍 -文档地址:[https://dotnetchina.gitee.io/furion](https://dotnetchina.gitee.io/furion) +🪶SimpleAdmin 是一个小而美的通用业务型后台管理系统,专为解决开发过程中的痛点难点而生。前端基于 ElementUI+Vue3+TypeScript,后端基于.NET6/7/8+SqlSugar 单例模式。采用 RBAC+多机构的权限管理模式,实现全网最灵活的接口级别数据权限控制。代码注释覆盖率大于`90%`,非常适合二次开发。将日常开发中的业务场景和框架紧密结合,并坚持以人为本,以业务为中心,做到开箱即用,代码简洁、易扩展,注释详细,文档齐全,让你的开发少走弯路。 -源码地址:[https://gitee.com/dotnetchina/Furion](https://gitee.com/dotnetchina/Furion) +## 🎓 设计初衷和理念 -#### 🍭ORM基于Sqlsugar -SqlSugar是一款老牌.NET开源ORM框架,由果糖大数据科技团队维护和更新 ,开箱即用 -最易上手的ORM框架,本系统也是基于Sqlsugar单例模式+CodeFirst+仓储的结构,无需担心作用域问题,直接爽撸! +一个卓越的后台管理框架是开发者提升效率、降本增质的关键工具。我曾经尝试在 Git 上搜索开源的后台管理系统,希望能用它们作为公司项目的起点。可惜的是,我发现很多开源系统难以满足我的期待:要么缺失清晰的文档指导,要么代码质量让人担忧,要么系统的扩展性极为有限,要么系统功能过于庞大而失去焦点,积重难返。 +正因为这样的挑战,我下定决心,要从无到有打造一个全新的后台管理框架,这就是`SimpleAdmin`的诞生背景。SimpleAdmin 是一个聚焦业务需求的管理系统,它的核心理念是`精简至上`。我们深知,在功能和实用性之间找到完美的平衡点至关重要,因此在 SimpleAdmin 中,我们只保留了那些最关键的、行之有效的功能,并且全力以赴将它们做得更完美。 +SimpleAdmin 不只是工具,它更是一种承诺:确保每位开发者都能毫无障碍地掌握、进而深入定制,从而使得框架适应项目,而非让项目被迫适应框架。一个优秀的框架,应该是那样自解释的优雅,同时又能轻松应对二次开发的需求。 +SimpleAdmin 更像是一种信念,它以代码的形式表达了我们对简约而不简单的追求。唯有包含这种哲学的框架,才算得上是有灵魂,有价值的。它不只是一个平台或者框架,而是一个为业务精准打造的解决方案,一个始终在为你省时、省心和省力的可靠盟友。 -文档地址:[https://www.donet5.com/Home/Doc](https://www.donet5.com/Home/Doc) +## ✨ 系统特色 -源码地址:[https://gitee.com/dotnetchina/SqlSugar](https://gitee.com/dotnetchina/SqlSugar) +### ⛏️ 对于后端 -#### 🎮真·插件式开发,代码更灵活,架构更清晰 -引入插件式开发的概念,除项目主体外,每个业务层都可以是独立的,一些拓展性功能采用插件的方式创建在独立的类库中,每一层都可以单独设置初始化表数据结构和种子数据,这样的话我们想要用哪个功能就引用该功能的项目,如果功能有问题我们也能快速定位到代码的位置,非常方便,也使得项目架构变得非常清晰,代码更灵活了,避免后期功能越来越多导致项目成为屎山。 +- 启动及运行,不会出现拉下来代码跑不起来的情况,自动生成数据库表和种子文件。 +- 基于 SqlSugar 单例模式+CodeFirst+仓储的结构,无需担心作用域问题,直接爽撸。 +- 集成国密加密,是国`首个`.NET 内置国密算法且前后端分离快速开发平台。其他说首个的都是吹牛皮的! +- 插件式开发,代码更灵活,架构更清晰,每个业务层都可以是独立的,避免后期功能越来越多导致项目成为屎山。 +- 极致缓存,系统快人一步,一些基础配置和用户权限信息都放在了缓存中,用户首次登录后,下次再登录接口耗时实测`10-30ms`。 +- RBAC+多机构的权限+动态刷新,修改用户权限后无需重新登录即可刷新用户权限。 +- 全网最灵活的接口级别数据范围权限控制,可以指定某个角色/人员的某个接口的数据权限范围。 +- 后端源码注释覆盖率超过90%
,每一个方法,每一步都有详细的解释和说明,根据注释和文档也能轻易看懂和二次开发,不用每天在群里问一些非常基础的问题,节约了大量的开发时间。 - +### 📱 对于前端 -#### 📘极致缓存,系统快人一步 -本系统使用了大量的缓存操作,一些基础配置和用户权限信息都放在了缓存中,用户首次登录后,下次再登录接口耗时实测`10-30ms`。 - - +- 基于 Vue3.3、Vite4、TS、Pinia、Element-Plus 等最新技术栈开发 +- 基于[GeeKer Admin](https://docs.spicyboy.cn/),界面比同类型 UI 更清爽又美观。 +- 配置 Eslint、Prettier、Husky、Commitlint、Lint-staged 规范前端工程代码规范 +- 提供丰富的组件、常用 Hooks 封装,在一定程度上节省你造轮子的时间。 +- 提供多种布局方式切换,主题颜色配置,暗黑、灰色、色弱等模式。 +- 丰富的代码注释,每一个页面都有解释说明,新手也能快速上手。 -系统同时支持MemeryCache和Redis分布式缓存,Redis客户端使用的是我基于[NewLife.Redis](https://github.com/NewLifeX/NewLife.Redis)二次封装的[SimpleRedis](https://gitee.com/zxzyjs/SimpleRedis.git)。简化了注入操作,更方便使用。 +## 💵 适用场景 -##### 🍎NewLife.Redis特性 -* 在ZTO大数据实时计算广泛应用,200多个Redis实例稳定工作一年多,每天处理近1亿包裹数据,日均调用量80亿次 -* 低延迟,Get/Set操作平均耗时200~600us(含往返网络通信) -* 大吞吐,自带连接池,最大支持1000并发 -* 高性能,支持二进制序列化 +- 搭建企业内部后台管理框架 +- 接外包项目/私活 +- 个人学习.Net 搭建 Web 框架 +- 搭建商用项目 -#### 👮RBAC+多机构的权限管理模式+权限及时刷新 -作为一个后台管理系统,一个权限管理框架,权限设计作为一个管理系统的灵魂,是一个系统好不好用的关键。本系统是采用RBAC+多机构的权限管理模式,一个机构下有多个角色,每个角色有不同的菜单和权限,可以将不同角色分配给不同的用户,这样每个用户都会拥有他所属角色的权限。当然,一个用户也可以拥有多个角色的权限,除此之外还支持给用户单独授权,让用户脱离所有角色之外,实现灵活再灵活的权限控制。并且当角色或用户的权限被修改之后,后端会立即刷新,前端只需刷新页面就能更新被重新赋予的权限,无需重新登录。 +## 👨 适用人群 +- 对系统 UI 美观有要求 +- 对学习新技术有兴趣,愿意接受新的技术 +- .NET 新手,想找一个框架学习,增加知识 +- 对技术有要求,喜欢高质量代码 +- 想要花更多时间陪陪家人,出去走走 +- 不想在各种低级 bug 上浪费时间 -#### 🧱接口级别的数据范围权限 -目前在我接触的大部分管理系统中,数据权限这块都不太尽如人意,要么只有接口权限没有数据权限,要么有数据权限但是用起来不是特别顺手而且还有BUG,针对以上痛点和难点结合业务场景,本系统实现全网最灵活的接口级别数据范围权限控制,可以指定某个角色的某个接口的数据权限范围,非常的灵活。 - - -在系统中,获取数据权限非常简单,只需一个方法搞定。 -```cs -//获取数据范围 -var dataScope = await _sysUserService.GetLoginUserApiDataScope(); -``` -#### 📈启动及运行 -您是否有过在使用其他框架时,光是从`启动`到`运行`都会遇到各种奇奇怪怪的问题?并且使用过程中也是各种奇奇怪怪的bug,发到群里也没人解决,非常影响开发效率。本系统做到了`启动即运行`,就算是小白只要照着文档操作,也能非常容易的上手项目。就目前使用的反馈来看,业务占据大多数,系统问题只占很少的一部分,如果您在使用过程中遇到问题,或者发现bug,可以直接发issues描述您的问题,只要是系统bug第一时间修复。或者您对当前系统有什么建议或意见,也欢迎您提出,只要是符合大部分业务场景的都会考虑支持。我们也有和谐内部的qq/微信交流群,没有像其他系统qq群一样每天都是一堆启动报错问题,页面错误问题,有的只是系统功能的讨论和优化方案。 - -#### 🍢支持多种主键类型 -系统默认采用`long`类型的`雪花ID`作为系统主键,但是在交流过程中发现,部分小伙伴使用`string`类型或者`guid`作为系统主键,还有的是部分老系统用的是string类型,但是simpleadmin确是`long`类型,所以根据这个业务场景,本框架也支持`String`类型的系统主键,只需要拉取对应的`stringid`分支即可,完全不需要另外去修改代码,并且也能和master分支进行最新的同步。 +## 🍔 分支说明 -#### 📞支持Mqtt/Signalr的即时通讯 -作为前后端分离项目,前后端交互是一个非常重要的功能。目前主流框架都是通过Socket实现,本系统自然也是实现了基于Signalr的前后端交互,并在此基础上实现了基于MQTT的前后端交互功能,MQTT相比socket业务场景更多更灵活,在物联网方向有着非常多的应用。.NET应用在工业物联网方向也是有很多的岗位,学习MQTT还是非常有必要的。 +- master + 正式稳定版本,具体版本升级内容看更新标签 -MQTT客户端使用的是我基于[NewLife.MQTT](https://github.com/NewLifeX/NewLife.MQTT)二次封装的[SimpleMQTT](https://gitee.com/zxzyjs/SimpleMQTT.git)。采用单例模式,可以动态的添加和删除mqtt客户端,非常好用。 +- dev + 开发的分支(代码可能随时会推,不保证运行和使用) -文档地址:[https://www.cnblogs.com/huguodong/p/16991947.html](https://www.cnblogs.com/huguodong/p/16991947.html) +- js + js 版本的分支,适配于 js 版本前端的代码 -#### 🔧代码生成器 -大部分项目里,其实有很多代码是重复的,几乎每个模块都有 CRUD 增删改查的功能,而这些功能的实现代码往往是大同小异的。如果这些功能都要自己去手写,非常无聊枯燥,浪费时间且效率很低,还可能会写错。代码生成功能通过选择数据库表,完成单表的增删改查管理功能,还支持树形结构的表的生成可以生成包括前端、后端、和SQL语句,支持预览的同时还支持ZIP压缩包和直接生成到项目两种模式,解放你的双手,大大减少了重复代码的编写,无需复制提升开发效率。 +## 🚩 效果展示 + + + + + + + + + + + + + + + + + +
-#### 🎺常用功能组件化 -在系统一些常用的功能直接封装成vue组件,如批量导入,批量导出,批量删除,批量编辑等,只需按照规范传入相应参数就可以很好的实现功能,减少了很多不必要的前端代码。最典型的就是批量导入组件,只需传入api接口,通过后端接口自动生成表头,并实现字段级别的错误信息提示和预览,大数据支持分段导入,非常好用。 +## 🎈 相关连接 +预览地址: [点击查看](http://153.101.199.83:12802) -#### 📖最详细的注释和手摸手教学文档,开发效率直线提升 -作为一个开源项目,如何让使用者看懂代码是非常重要的,很多作者会忽视这一点,导致我们阅读其代码的时候很难理解其为什么要这么写,如果没有详细的文档,想要二次开发需要花精力去研究源码。而本系统完全不用担心这个问题,后端源码注释覆盖率超过90%
,每一个方法,每一步都有详细的解释和说明,并且推出了手摸手教学文档(博客园),目的就是让使用者能够轻易上手,就算不是自己的代码,根据注释和文档也能轻易看懂和二次开发,不用每天在群里问一些非常基础的问题,节约了大量的开发时间。 - +更新日志:[点击查看](https://gitee.com/dotnetmoyu/SimpleAdmin/commits/master) +文档地址(旧):[https://www.cnblogs.com/huguodong/p/17021233.html](https://www.cnblogs.com/huguodong/p/17021233.html) +文档地址(新):[http://118.190.201.181/](http://118.190.201.181/) -## 分支说明 +## 🔖 友情链接 -- master -正式稳定版本,具体版本升级内容看更新标签 +- 👉 Geeker Admin:[https://docs.spicyboy.cn/](https://docs.spicyboy.cn/) +- 👉 MoYu:[https://gitee.com/dotnetmoyu/MoYu](https://gitee.com/dotnetmoyu/MoYu) +- 👉 SqlSugar:[https://www.donet5.com/Doc/1/1180](https://www.donet5.com/Doc/1/1180) +- 👉 NewLife:[https://www.newlifex.com/](https://www.newlifex.com/) +- 👉 IdGenerator:[https://github.com/yitter/idgenerator](https://github.com/yitter/idgenerator) +- 👉 Masuit.Tools:[https://gitee.com/masuit/Masuit.Tools](https://gitee.com/masuit/Masuit.Tools) +- 👉 Emqx:[https://www.emqx.com/zh](https://www.emqx.com/zh) +- 👉 MagicodesIE: [https://github.com/dotnetcore/Magicodes.IE](https://github.com/dotnetcore/Magicodes.IE) -- dev -开发的分支(代码可能随时会推,不保证运行和使用) - -- stringid -字符串类型主键分支,系统主键用string类型的使用此分支 - -## 🎈相关连接🎈 - -更新日志:[点击查看](https://gitee.com/zxzyjs/SimpleAdmin/commits/master) - -文档地址:[https://www.cnblogs.com/huguodong/p/17021233.html](https://www.cnblogs.com/huguodong/p/17021233.html) - -常见问题合集:[https://www.cnblogs.com/huguodong/p/17021241.html](https://www.cnblogs.com/huguodong/p/17021241.html) - -## 🔖友情链接🔖 -- 👉 Furion:[https://dotnetchina.gitee.io/furion](https://dotnetchina.gitee.io/furion) -- 👉 SqlSugar:[https://www.donet5.com/Doc/1/1180](https://www.donet5.com/Doc/1/1180) -- 👉 NewLife:[https://www.newlifex.com/](https://www.newlifex.com/) -- 👉 IdGenerator:[https://github.com/yitter/idgenerator](https://github.com/yitter/idgenerator) -- 👉 Masuit.Tools:[https://gitee.com/masuit/Masuit.Tools](https://gitee.com/masuit/Masuit.Tools) -- 👉 Emqx:[https://www.emqx.com/zh](https://www.emqx.com/zh) -- 👉 MagicodesIE: [https://github.com/dotnetcore/Magicodes.IE](https://github.com/dotnetcore/Magicodes.IE) - -## 👏鸣谢👏 +## 👏 鸣谢 👏 - 感谢 JetBrains 提供的免费开源 License: @@ -136,15 +120,19 @@ MQTT客户端使用的是我基于[NewLife.MQTT](https://github.com/NewLifeX/New

-## 🤌赞助🤌 +## 🤌 赞助 + ``` -如果对您有帮助,请点击右上角⭐Star关注或扫码捐赠,感谢支持开源! +如果对您有帮助,请点击右上角⭐Star关注或扫码捐赠,感谢支持开源!捐赠金额≥99元即可加入内部交流群一起讨论学习,捐赠之后加q531035580即可。 ``` - -## 💾版权声明💾 + + +## 💾 版权声明 💾 -- 后端源码完全免费开源商用。 -- 前端源码因版权问题不能开源,后续准备替换掉之后再开源。 -- 不能以任何形式用于非法为目的的行为。 +- 请不要删除和修改根目录下的 LICENSE 文件。 +- 请不要删除和修改 SimpleAdmin 源码头部的版权声明。 +- 分发源码时候,请注明软件出处。 +- 基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +- 请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 - 任何基于本软件而产生的一切法律纠纷和责任,均于作者无关。 diff --git a/api/.config/dotnet-tools.json b/api/.config/dotnet-tools.json new file mode 100644 index 0000000000000000000000000000000000000000..29ba7ff81ff7418ec520f53481a48ed8a7bcccb2 --- /dev/null +++ b/api/.config/dotnet-tools.json @@ -0,0 +1,12 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "husky": { + "version": "0.6.1", + "commands": [ + "husky" + ] + } + } +} \ No newline at end of file diff --git a/api/.gitignore b/api/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..6804c872717a0dd42a385e04b7c2f34d32e4c962 --- /dev/null +++ b/api/.gitignore @@ -0,0 +1,365 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ +#idea +.idea/ +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd +#sqlite数据库不上传 +SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.db diff --git a/api/.husky/task-runner.json b/api/.husky/task-runner.json new file mode 100644 index 0000000000000000000000000000000000000000..2a016c4cfca005e6d7e8dbf5154a45d8894b7c72 --- /dev/null +++ b/api/.husky/task-runner.json @@ -0,0 +1,13 @@ +{ + "tasks": [ + { + "name": "welcome-message-example", + "command": "bash", + "args": [ "-c", "echo Husky.Net is awesome!" ], + "windows": { + "command": "cmd", + "args": ["/c", "echo Husky.Net is awesome!" ] + } + } + ] +} diff --git a/api/LICENSE b/api/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..5fb082bc7f4e497fdb1da16f6029f296711eb831 --- /dev/null +++ b/api/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2023 HuGuoDong + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/api/README.md b/api/README.md new file mode 100644 index 0000000000000000000000000000000000000000..6955524615a51b2a2b9e4c4838ba0c5bf18d8079 --- /dev/null +++ b/api/README.md @@ -0,0 +1,92 @@ +# SimpleAdmin.Net + + + +## Getting started + +To make it easy for you to get started with GitLab, here's a list of recommended next steps. + +Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)! + +## Add your files + +- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files +- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command: + +``` +cd existing_repo +git remote add origin https://jihulab.com/zxzyjs/simpleadmin.net.git +git branch -M master +git push -uf origin master +``` + +## Integrate with your tools + +- [ ] [Set up project integrations](https://jihulab.com/zxzyjs/simpleadmin.net/-/settings/integrations) + +## Collaborate with your team + +- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) +- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) +- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically) +- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/) +- [ ] [Set auto-merge](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html) + +## Test and Deploy + +Use the built-in continuous integration in GitLab. + +- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html) +- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/) +- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html) +- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/) +- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html) + +*** + +# Editing this README + +When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template. + +## Suggestions for a good README +Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. + +## Name +Choose a self-explaining name for your project. + +## Description +Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. + +## Badges +On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge. + +## Visuals +Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method. + +## Installation +Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection. + +## Usage +Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. + +## Support +Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. + +## Roadmap +If you have ideas for releases in the future, it is a good idea to list them in the README. + +## Contributing +State if you are open to contributions and what your requirements are for accepting them. + +For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. + +You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. + +## Authors and acknowledgment +Show your appreciation to those who have contributed to the project. + +## License +For open source projects, say how it is licensed. + +## Project status +If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. diff --git a/api/SimpleAdmin/.editorconfig b/api/SimpleAdmin/.editorconfig new file mode 100644 index 0000000000000000000000000000000000000000..07608a48b662c1616ce66a757b6bc3664b796d9d --- /dev/null +++ b/api/SimpleAdmin/.editorconfig @@ -0,0 +1,41 @@ +[*.cs] +#### Naming styles #### +# Naming rules +dotnet_naming_rule.const_should_be_all_upper.severity = suggestion +dotnet_naming_rule.const_should_be_all_upper.symbols = const +dotnet_naming_rule.const_should_be_all_upper.style = all_upper + +dotnet_naming_rule.static_readonly_field_should_be_all_upper.severity = suggestion +dotnet_naming_rule.static_readonly_field_should_be_all_upper.symbols = static_readonly_field +dotnet_naming_rule.static_readonly_field_should_be_all_upper.style = all_upper + +dotnet_naming_rule.private_or_internal_field_should_be_private_field.severity = suggestion +dotnet_naming_rule.private_or_internal_field_should_be_private_field.symbols = private_or_internal_field +dotnet_naming_rule.private_or_internal_field_should_be_private_field.style = private_field + +# Symbol specifications +dotnet_naming_symbols.const.applicable_kinds = field +dotnet_naming_symbols.const.applicable_accessibilities = * +dotnet_naming_symbols.const.required_modifiers = const + +dotnet_naming_symbols.static_readonly_field.applicable_kinds = field +dotnet_naming_symbols.static_readonly_field.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.static_readonly_field.required_modifiers = readonly, static + +dotnet_naming_symbols.private_or_internal_field.applicable_kinds = field +dotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private, private_protected +dotnet_naming_symbols.private_or_internal_field.required_modifiers = + +# Naming styles +dotnet_naming_style.private_field.required_prefix = _ +dotnet_naming_style.private_field.required_suffix = +dotnet_naming_style.private_field.word_separator = +dotnet_naming_style.private_field.capitalization = camel_case + +dotnet_naming_style.all_upper.required_prefix = +dotnet_naming_style.all_upper.required_suffix = +dotnet_naming_style.all_upper.word_separator = _ +dotnet_naming_style.all_upper.capitalization = all_upper + +# Add copyright file header +file_header_template = Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛\n\nSimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款:\n1.请不要删除和修改根目录下的LICENSE文件。\n2.请不要删除和修改SimpleAdmin源码头部的版权声明。\n3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin\n4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。\n5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。\n6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/SimpleAdmin.Plugin.Core.csproj b/api/SimpleAdmin/Directory.Build.props similarity index 33% rename from api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/SimpleAdmin.Plugin.Core.csproj rename to api/SimpleAdmin/Directory.Build.props index 589e82d0ea897fe6377998b01cef810e54aa8ebf..527e357e58145d4071d354004eb24aec2532da5c 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/SimpleAdmin.Plugin.Core.csproj +++ b/api/SimpleAdmin/Directory.Build.props @@ -1,15 +1,13 @@ - - + - net7.0;net6.0 + net6.0;net7.0;net8.0; 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 - SimpleAdmin.Plugin.Core.xml + 3.0.0 enable - enable + en-US - - - - - + + $(MSBuildProjectName).xml + + \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Application.Development.json b/api/SimpleAdmin/SimpleAdmin.Application/Application.Development.json index 9c6b05466982756c26170cfec2818936808f1524..2e9e777d12946024e3054bbebf2218fefa8a1140 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Application.Development.json +++ b/api/SimpleAdmin/SimpleAdmin.Application/Application.Development.json @@ -1,5 +1,5 @@ { - "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + "$schema": "https://gitee.com/dotnetmoyu/MoYu/raw/v4/schemas/v4/MoYu-schema.json", //swagger分组设置 "[openapi:Application]": { "Order": 90, //分组排序,int 类型,数字越大排前面,默认 0 @@ -7,7 +7,7 @@ }, //系统层设置 "ApplicationSettings": { - "InitTable": true, //是否初始化表结构 - "InitSeedData": true, //是否初始化种子数据 + "InitTable": false, //是否初始化表结构 + "InitSeedData": false, //是否初始化种子数据 } } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Application.Production.json b/api/SimpleAdmin/SimpleAdmin.Application/Application.Production.json index 271aea52a42c482c590d1eed6e6138577eea1e05..3f68a37ca4421f73b70c53b1c8036c701f5d571f 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Application.Production.json +++ b/api/SimpleAdmin/SimpleAdmin.Application/Application.Production.json @@ -1,5 +1,5 @@ { - "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + "$schema": "https://gitee.com/dotnetmoyu/MoYu/raw/v4/schemas/v4/MoYu-schema.json", //swagger分组设置 "[openapi:Application]": { "Order": 90, //分组排序,int 类型,数字越大排前面,默认 0 diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Const/ApplicationConst.cs b/api/SimpleAdmin/SimpleAdmin.Application/Const/ApplicationConst.cs new file mode 100644 index 0000000000000000000000000000000000000000..6e31e38f5ad9036c7613f30f698bc0a0574eb392 --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.Application/Const/ApplicationConst.cs @@ -0,0 +1,29 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Application; + +public class ApplicationConst +{ + #region 别称 + + /// + /// 机构 + /// + public const string BIZ_ORG = "机构"; + + + /// + /// 岗位 + /// + public const string BIZ_POS = "岗位"; + + #endregion 别称 +} diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Entity/GenTest.cs b/api/SimpleAdmin/SimpleAdmin.Application/Entity/GenTest.cs deleted file mode 100644 index bed18d87b4e2e4eb529ed2191982b0473b47dbb1..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Application/Entity/GenTest.cs +++ /dev/null @@ -1,47 +0,0 @@ -namespace SimpleAdmin.System; - -/// -/// 代码生成基础 -/// -[SugarTable("gen_test", TableDescription = "代码生成测试")] -[Tenant(SqlsugarConst.DB_Default)] -[CodeGen] -[BatchEdit] -public class GenTest : DataEntityBase -{ - /// - /// 姓名 - /// - public string Name { get; set; } - - /// - /// 性别 - /// - public string Sex { get; set; } - - /// - /// 民族 - /// - public string Nation { get; set; } - - /// - /// 年龄 - /// - - public int Age { get; set; } - - /// - /// 生日 - /// - public DateTime Bir { get; set; } - - /// - /// 存款 - /// - public decimal Money { get; set; } - - /// - /// 排序码 - /// - public int SortCode { get; set; } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Application/GlobalUsings.cs b/api/SimpleAdmin/SimpleAdmin.Application/GlobalUsings.cs index 190b275e3f5ac94a44f5146bec32296259a8e9e9..95a49bf75e642c3ae0c5068d828e11cdb53bab9b 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/GlobalUsings.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/GlobalUsings.cs @@ -1,21 +1,25 @@ -global using Furion; -global using Furion.DependencyInjection; -global using Furion.FriendlyException; -global using Magicodes.ExporterAndImporter.Core; -global using Magicodes.ExporterAndImporter.Excel; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +global using MoYu; +global using MoYu.DependencyInjection; +global using MoYu.FriendlyException; global using Mapster; global using Microsoft.AspNetCore.Builder; global using Microsoft.AspNetCore.Hosting; global using Microsoft.AspNetCore.Mvc; -global using Microsoft.CodeAnalysis; global using Microsoft.Extensions.DependencyInjection; -global using OfficeOpenXml.Table; +global using SimpleAdmin.Cache; global using SimpleAdmin.Core; global using SimpleAdmin.Core.Extension; -global using SimpleAdmin.System; -global using SimpleAdmin.Cache; global using SimpleAdmin.SqlSugar; -global using SimpleTool; +global using SimpleAdmin.System; global using SqlSugar; -global using System.ComponentModel.DataAnnotations; -global using SimpleAdmin.Core.Utils; \ No newline at end of file +global using System.Reflection; diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Options/ApplicationSettingsOptions.cs b/api/SimpleAdmin/SimpleAdmin.Application/Options/ApplicationSettingsOptions.cs index 57b15e5efd990a33b05688996d887eff3280ea66..2b64f6bf04b7f482020752bce3540ab4fc6daf49 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Options/ApplicationSettingsOptions.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Options/ApplicationSettingsOptions.cs @@ -1,4 +1,14 @@ -using Furion.ConfigurableOptions; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using MoYu.ConfigurableOptions; namespace SimpleAdmin.Application; @@ -7,4 +17,4 @@ namespace SimpleAdmin.Application; /// public class ApplicationSettingsOptions : BaseOptions, IConfigurableOptions { -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/Dto/GenTestInput.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/Dto/GenTestInput.cs deleted file mode 100644 index c5c23b5ea47dfc8f6708335bc1a02e6167c48618..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/Dto/GenTestInput.cs +++ /dev/null @@ -1,135 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations; -using Masuit.Tools.Core.Validator; -namespace SimpleAdmin.Application; - -/// -/// 测试分页查询参数 -/// -public class GenTestPageInput : BasePageInput -{ - /// - /// 姓名 - /// - public string Name { get; set; } - - /// - /// 组织机构Id - /// - public long OrgId { get; set; } -} - - -/// -/// 添加测试参数 -/// -public class GenTestAddInput -{ - /// - /// 姓名 - /// - public string Name { get; set; } - - /// - /// 性别 - /// - public string Sex { get; set; } - - /// - /// 民族 - /// - public string Nation { get; set; } - - /// - /// 年龄 - /// - public int? Age { get; set; } - - /// - /// 生日 - /// - public DateTime? Bir { get; set; } - - /// - /// 排序码 - /// - public int? SortCode { get; set; } - - /// - /// 存款 - /// - public decimal? Money { get; set; } - -} - -/// -/// 修改测试参数 -/// -public class GenTestEditInput : GenTestAddInput -{ - /// - /// Id - /// - [IdNotNull(ErrorMessage = "Id不能为空")] - public long Id { get; set; } -} - - -/// -/// 测试导入 -/// -public class GenTestImportInput : ImportTemplateInput -{ - /// - /// 姓名 - /// - [ImporterHeader(Name = "姓名")] - [Required(ErrorMessage = "姓名不能为空")] - public string Name { get; set; } - - /// - /// 性别 - /// - [ImporterHeader(Name = "性别")] - [Required(ErrorMessage = "性别不能为空")] - public string Sex { get; set; } - - /// - /// 民族 - /// - [ImporterHeader(Name = "民族")] - [Required(ErrorMessage = "民族不能为空")] - public string Nation { get; set; } - - /// - /// 年龄 - /// - [ImporterHeader(Name = "年龄")] - [Required(ErrorMessage = "年龄不能为空")] - public int? Age { get; set; } - - /// - /// 生日 - /// - [ImporterHeader(Name = "生日")] - [Required(ErrorMessage = "生日不能为空")] - public DateTime? Bir { get; set; } - - /// - /// 排序码 - /// - [ImporterHeader(Name = "排序码")] - [Required(ErrorMessage = "排序码不能为空")] - public int? SortCode { get; set; } - - /// - /// 存款 - /// - [ImporterHeader(Name = "存款")] - [Required(ErrorMessage = "存款不能为空")] - public decimal? Money { get; set; } - -} - - - diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/Dto/GenTestOutput.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/Dto/GenTestOutput.cs deleted file mode 100644 index 140189cb389fa91f59295f94beeb20fbcc4f9b70..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/Dto/GenTestOutput.cs +++ /dev/null @@ -1,54 +0,0 @@ -namespace SimpleAdmin.Application; - -/// -/// 测试导出 -/// -[ExcelExporter(Name = "测试信息", TableStyle = TableStyles.Light10, AutoFitAllColumn = true)] -public class GenTestExportOutput -{ - /// - /// 姓名 - /// - [ExporterHeader(DisplayName = "姓名")] - public string Name { get; set; } - - /// - /// 性别 - /// - [ExporterHeader(DisplayName = "性别")] - public string Sex { get; set; } - - /// - /// 民族 - /// - [ExporterHeader(DisplayName = "民族")] - public string Nation { get; set; } - - /// - /// 年龄 - /// - [ExporterHeader(DisplayName = "年龄")] - public string Age { get; set; } - - /// - /// 生日 - /// - [ExporterHeader(DisplayName = "生日")] - public string Bir { get; set; } - - /// - /// 排序码 - /// - [ExporterHeader(DisplayName = "排序码")] - public string SortCode { get; set; } - - /// - /// 存款 - /// - [ExporterHeader(DisplayName = "存款")] - public string Money { get; set; } - -} - - - diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/GenTestService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/GenTestService.cs deleted file mode 100644 index 0dbc70d1607a2d1d3e63cd23b8ff5520b126745a..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/GenTestService.cs +++ /dev/null @@ -1,199 +0,0 @@ - -using Furion.FriendlyException; -using Mapster; -using SimpleAdmin.Core; -using Microsoft.Extensions.Logging; -using Microsoft.AspNetCore.Mvc; -using SqlSugar; - -namespace SimpleAdmin.Application; - -/// -/// -/// -public class GenTestService : DbRepository, IGenTestService -{ - private readonly ILogger _logger; - private readonly ISysUserService _sysUserService; - private readonly IImportExportService _importExportService; - private readonly ISysOrgService _sysOrgService; - - public GenTestService(ILogger logger,ISysUserService sysUserService - ,IImportExportService importExportService - ,ISysOrgService sysOrgService - ) - { - _sysUserService = sysUserService; - _logger = logger; - _importExportService = importExportService; - _sysOrgService = sysOrgService; - - } - - #region 查询 - - /// - public async Task> Page(GenTestPageInput input) - { - var query = await GetQuery(input);//获取查询条件 - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 - return pageInfo; - } - - /// - public async Task> List(GenTestPageInput input) - { - var query = await GetQuery(input);//获取查询条件 - var list = await query.ToListAsync(); - return list; - } - - /// - public async Task Detail(BaseIdInput input) - { - var genTest = await GetFirstAsync(it => it.Id == input.Id); - return genTest ; - - } - -//外键查询 - #endregion - - #region 新增 - - /// - public async Task Add(GenTestAddInput input) - { - var genTest = input.Adapt();//实体转换 - await CheckInput(genTest);//检查参数 - await InsertAsync(genTest);//插入数据 - } - - #endregion - - #region 编辑 - - /// - public async Task Edit(GenTestEditInput input) - { - var genTest = input.Adapt();//实体转换 - await CheckInput(genTest);//检查参数 - await UpdateAsync(genTest);//更新数据 - } - - - #endregion - - #region 删除 - - /// - public async Task Delete(List input) - { - //获取所有ID - var ids = input.Select(it => it.Id).ToList(); - if (ids.Count > 0) - { - await DeleteByIdsAsync(ids.Cast().ToArray());//删除数据 - ////事务 - //var result = await itenant.UseTranAsync(async () => - //{ - //await DeleteByIdsAsync(ids.Cast().ToArray());//删除数据 - //}); - //if (!result.IsSuccess)//如果成功了 - //{ - ////写日志 - //_logger.LogError(result.ErrorMessage, result.ErrorException); - //throw Oops.Oh(ErrorCodeEnum.A0002); - //} - } - } - - #endregion - - #region 导入导出 - - /// - public async Task Template() - { - var templateName = "测试信息"; - //var result = _importExportService.GenerateLocalTemplate(templateName); - var result = await _importExportService.GenerateTemplate(templateName); - return result; - } - - /// - public async Task> Preview(ImportPreviewInput input) - { - var importPreview = await _importExportService.GetImportPreview(input.File); - importPreview.Data = await CheckImport(importPreview.Data);//检查导入数据 - return importPreview; - } - - /// - public async Task> Import(ImportResultInput input) - { - var data = await CheckImport(input.Data, true);//检查数据格式 - var result = _importExportService.GetImportResultPreview(data, out var importData); - var genTest = importData.Adapt>();//转实体 - await InsertOrBulkCopy(genTest);// 数据导入 - return result; - } - - /// - public async Task Export(GenTestPageInput input) - { - var genTests = await List(input); - var data = genTests.Adapt>();//转为Dto - var result = await _importExportService.Export(data, "测试信息"); - return result; - } - - #endregion - - #region 方法 - - /// - /// 检查输入参数 - /// - /// - private async Task CheckInput(GenTest genTest) - { - var errorMessage = $"您没有权限操作该数据"; - if(genTest.Id==SimpleAdminConst.Zero){ - //表示新增 - } - else{ - //表示编辑 - } - } - - /// - /// 获取Sqlsugar的ISugarQueryable - /// - /// - /// - private async Task> GetQuery(GenTestPageInput input) - { - - var orgIds = await _sysOrgService.GetOrgChildIds(input.OrgId);//获取下级机构 - var query = Context.Queryable() - .WhereIF(!string.IsNullOrWhiteSpace(input.Name), it => it.Name.Contains(input.Name.Trim())) - .WhereIF(input.OrgId > 0, it => orgIds.Contains(it.CreateOrgId))//根据机构ID查询 - //.WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}") - .OrderBy(it => it.SortCode);//排序 - return query; - } - - /// - public async Task> CheckImport(List data, bool clearError = false) - { - return data; - } - #endregion - -} - - - - diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/IGenTestService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/IGenTestService.cs deleted file mode 100644 index 7542024eef05b8a22fbd7b16171155c16820fd62..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/IGenTestService.cs +++ /dev/null @@ -1,100 +0,0 @@ -using Furion.DependencyInjection; -using SimpleAdmin.Core; - -namespace SimpleAdmin.Application; - -/// -/// 测试服务 -/// -public interface IGenTestService : ITransient -{ - #region 查询 - - /// - /// 测试分页查询 - /// - /// 查询参数 - /// 测试分页 - Task> Page(GenTestPageInput input); - - /// - /// 测试列表查询 - /// - /// 查询参数 - /// 测试列表 - Task> List(GenTestPageInput input); - - /// - /// 测试详情 - /// - /// Id参数 - /// 详细信息 - Task Detail(BaseIdInput input); - - - #endregion - - #region 新增 - - /// - /// 添加测试 - /// - /// 添加参数 - /// - Task Add(GenTestAddInput input); - - #endregion - - #region 编辑 - /// - /// 修改测试 - /// - /// 编辑参数 - /// - Task Edit(GenTestEditInput input); - - #endregion - - #region 删除 - - /// - /// 删除测试 - /// - /// 删除参数 - /// - Task Delete(List input); - - #endregion - - #region 导入导出 - - /// - /// 测试导入模板下载 - /// - /// 模板 - Task Template(); - - /// - /// 测试导入预览 - /// - /// 预览参数 - /// 预览结果 - Task> Preview(ImportPreviewInput input); - - /// - /// 测试导入 - /// - /// - /// - Task> Import(ImportResultInput input); - - /// - /// 测试导出 - /// - /// - /// - Task Export(GenTestPageInput input); - - #endregion -} - diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/IOrgService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/Org/IOrgService.cs similarity index 60% rename from api/SimpleAdmin/SimpleAdmin.Application/Services/Org/IOrgService.cs rename to api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/Org/IOrgService.cs index 0c2c4093d748c09ba9d165d82b09b3798cc4741f..0415f9aff52ee08ab74ad5ffa37952d109edc439 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/IOrgService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/Org/IOrgService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Application; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Application; /// /// 机构服务 @@ -24,7 +34,7 @@ public interface IOrgService : ITransient /// /// 删除参数 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); /// /// 编辑机构 @@ -53,4 +63,4 @@ public interface IOrgService : ITransient /// /// Task Detail(BaseIdInput input); -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/OrgService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/Org/OrgService.cs similarity index 44% rename from api/SimpleAdmin/SimpleAdmin.Application/Services/Org/OrgService.cs rename to api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/Org/OrgService.cs index efea75f2153a4f5c7ccc757195d4c8024052fd4e..34255424a54b3b840d4efaf6c1ce317745ca9c58 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/OrgService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/Org/OrgService.cs @@ -1,15 +1,23 @@ -namespace SimpleAdmin.Application; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Application; /// public class OrgService : DbRepository, IOrgService { - private readonly ISimpleCacheService _simpleCacheService; private readonly ISysOrgService _sysOrgService; private readonly ISysUserService _sysUserService; - public OrgService(ISimpleCacheService simpleCacheService, ISysOrgService sysOrgService, ISysUserService sysUserService) + public OrgService(ISysOrgService sysOrgService, ISysUserService sysUserService) { - _simpleCacheService = simpleCacheService; _sysOrgService = sysOrgService; _sysUserService = sysUserService; } @@ -19,9 +27,18 @@ public class OrgService : DbRepository, IOrgService { //获取数据范围 var dataScope = await _sysUserService.GetLoginUserApiDataScope(); - input.OrgIds = dataScope; - //分页查询 - var pageInfo = await _sysOrgService.Page(input); + dataScope?.Remove(UserManager.OrgId); + //构建查询 + var query = Context.Queryable() + .WhereIF(dataScope != null, it => dataScope.Contains(it.Id))//机构ID查询 + .WhereIF(input.ParentId > 0, + it => it.ParentId == input.ParentId || SqlFunc.JsonLike(it.ParentIdList, input.ParentId.ToString()))//父级 + .WhereIF(!string.IsNullOrEmpty(input.Name), it => it.Name.Contains(input.Name))//根据名称查询 + .WhereIF(!string.IsNullOrEmpty(input.Code), it => it.Code.Contains(input.Code))//根据编码查询 + .WhereIF(!string.IsNullOrEmpty(input.Status), it => it.Status == input.Status)//根据状态查询 + .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}").OrderBy(it => it.SortCode) + .OrderBy(it => it.CreateTime);//排序 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } @@ -38,15 +55,15 @@ public class OrgService : DbRepository, IOrgService /// public async Task Add(SysOrgAddInput input) { - await CheckInput(input, SimpleAdminConst.Add);//检查参数 - await _sysOrgService.Add(input, SimpleAdminConst.BizOrg); + await CheckInput(input, SystemConst.ADD);//检查参数 + await _sysOrgService.Add(input, ApplicationConst.BIZ_ORG); } /// public async Task Edit(SysOrgEditInput input) { - await CheckInput(input, SimpleAdminConst.Edit);//检查参数 - await _sysOrgService.Edit(input, SimpleAdminConst.BizOrg); + await CheckInput(input, SystemConst.EDIT);//检查参数 + await _sysOrgService.Edit(input, ApplicationConst.BIZ_ORG); } /// @@ -57,39 +74,35 @@ public class OrgService : DbRepository, IOrgService if (dataScope == null || dataScope.Count > 0)//如果有机构 { if (dataScope is { Count: > 0 } && (!dataScope.ContainsAll(input.Ids) || !dataScope.Contains(input.TargetId)))//判断目标机构和需要复制的机构是否都在数据范围里面 - throw Oops.Bah($"您没有权限复制这些机构"); + throw Oops.Bah("您没有权限复制这些机构"); await _sysOrgService.Copy(input);//复制操作 } } /// - public async Task Delete(List input) + public async Task Delete(BaseIdListInput input) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); - //获取数据范围 - var dataScope = await _sysUserService.GetLoginUserApiDataScope(); - if (dataScope is { Count: > 0 })//如果有机构 - { - if (!dataScope.ContainsAll(ids))//判断要删除的id列表是否都包含在数据范围内 - throw Oops.Bah($"您没有权限删除这些机构"); - } - else if (dataScope is { Count: 0 })//表示仅自己 - { - //获取要删除的机构列表 - var orgs = (await _sysOrgService.GetListAsync()).Where(it => ids.Contains(it.Id)).ToList(); - //如果机构列表里有任何不是自己创建的机构 - if (orgs.Any(it => it.CreateUserId != UserManager.UserId)) - throw Oops.Bah($"只能删除自己创建的机构"); - } - await _sysOrgService.Delete(input, SimpleAdminConst.BizOrg);//删除操作 + var ids = input.Ids; + //获取要删除的机构列表 + var orgList = (await _sysOrgService.GetListAsync()).Where(it => ids.Contains(it.Id)).ToList(); + if (orgList.Any(it => it.Category == CateGoryConst.ORG_COMPANY))//如果有公司{ + throw Oops.Bah("不能删除根机构"); + //检查数据范围 + var orgIds = orgList.Select(it => it.Id).ToList(); + var createUserIds = orgList.Select(it => it.CreateUserId.GetValueOrDefault()).ToList(); + await _sysUserService.CheckApiDataScope(orgIds, createUserIds, "您没有权限删除这些机构"); + await _sysOrgService.Delete(input, ApplicationConst.BIZ_ORG);//删除操作 } /// public async Task Detail(BaseIdInput input) { - var sysOrg = await _sysOrgService.GetSysOrgById(input.Id); - return sysOrg; + var org = await _sysOrgService.GetSysOrgById(input.Id);//获取机构 + var errorMessage = "您没有权限查看该机构"; + //判断数据范围 + await _sysUserService.CheckApiDataScope(org.Id, org.CreateUserId.GetValueOrDefault(), errorMessage); + return org; } #region 方法 @@ -101,6 +114,11 @@ public class OrgService : DbRepository, IOrgService /// 操作名称 private async Task CheckInput(SysOrg sysOrg, string operate) { + sysOrg.Category = CateGoryConst.ORG_DEPT;//设置分类为部门,业务只能操作部门 + if (sysOrg.ParentId == SimpleAdminConst.ZERO) + { + throw Oops.Bah($"不能{operate}根机构"); + } var errorMessage = $"您没有权限{operate}该机构"; //获取数据范围 var dataScope = await _sysUserService.GetLoginUserApiDataScope(); @@ -117,7 +135,8 @@ public class OrgService : DbRepository, IOrgService if (sysOrg.Id > 0) { var org = await _sysOrgService.GetSysOrgById(sysOrg.Id);//获取机构 - if (org.CreateUserId != UserManager.UserId) throw Oops.Bah(errorMessage);//机构的创建人不是自己则报错 + if (org.CreateUserId != UserManager.UserId) + throw Oops.Bah(errorMessage);//机构的创建人不是自己则报错 } else { @@ -127,4 +146,4 @@ public class OrgService : DbRepository, IOrgService } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/IPositionService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/Position/IPositionService.cs similarity index 49% rename from api/SimpleAdmin/SimpleAdmin.Application/Services/Position/IPositionService.cs rename to api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/Position/IPositionService.cs index 33953f31c6d1dc95f0f960d1d354d230cfd8acec..4ffa68de8cdde5cffd340d8c05298d94d966924a 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/IPositionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/Position/IPositionService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Application; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Application; /// /// 岗位管理 @@ -17,7 +27,7 @@ public interface IPositionService : ITransient /// /// id列表 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); /// /// 编辑岗位 @@ -38,7 +48,7 @@ public interface IPositionService : ITransient /// /// /// - Task> PositionSelector(PositionSelectorInput input); + Task> Selector(PositionSelectorInput input); /// /// 岗位详情 @@ -46,4 +56,11 @@ public interface IPositionService : ITransient /// /// Task Detail(BaseIdInput input); -} \ No newline at end of file + + /// + /// 岗位树形结构 + /// + /// + /// + Task> Tree(PositionTreeInput input); +} diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/PositionService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/Position/PositionService.cs similarity index 40% rename from api/SimpleAdmin/SimpleAdmin.Application/Services/Position/PositionService.cs rename to api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/Position/PositionService.cs index 5eb96b37a049520d85526e3532628e613ac705f3..a619a986b588d733f39f4981380602564517fec8 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/PositionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/Position/PositionService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Application; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Application; /// /// @@ -14,6 +24,8 @@ public class PositionService : DbRepository, IPositionService _sysPositionService = sysPositionService; } + #region 查询 + /// public async Task> Page(PositionPageInput input) { @@ -25,52 +37,33 @@ public class PositionService : DbRepository, IPositionService return pageInfo; } - /// - public async Task Add(PositionAddInput input) - { - await CheckInput(input, SimpleAdminConst.Add);//检查参数 - await _sysPositionService.Add(input, SimpleAdminConst.BizPos);//添加岗位 - } - - /// - public async Task Delete(List input) + /// + public async Task> Tree(PositionTreeInput input) { - //获取所有ID - var ids = input.Select(it => it.Id).ToList(); - //获取数据范围 var dataScope = await _sysUserService.GetLoginUserApiDataScope(); - if (dataScope is { Count: > 0 })//如果有机构 - { - //获取职位下所有机构ID - var orgIds = (await _sysPositionService.GetListAsync()).Where(it => ids.Contains(it.Id)).Select(it => it.OrgId).ToList(); - if (!dataScope.ContainsAll(orgIds)) - throw Oops.Bah($"您没有权限删除这些岗位"); - } - else if (dataScope is { Count: 0 })//表示仅自己 - { - //获取要删除的岗位列表 - var positions = (await _sysPositionService.GetListAsync()).Where(it => ids.Contains(it.Id)).ToList(); - //如果岗位列表里有任何不是自己创建的岗位 - if (positions.Any(it => it.CreateUserId != UserManager.UserId)) - throw Oops.Bah($"只能删除自己创建的岗位"); - } - await _sysPositionService.Delete(input, SimpleAdminConst.BizOrg);//删除岗位 + input.OrgIds = dataScope; + var result = await _sysPositionService.Tree(input); + return result; } + #endregion + + #region 新增 + /// - public async Task Edit(PositionEditInput input) + public async Task Add(PositionAddInput input) { - await CheckInput(input, SimpleAdminConst.Edit);//检查参数 - await _sysPositionService.Edit(input, SimpleAdminConst.BizPos);//编辑 + await CheckInput(input, SystemConst.ADD);//检查参数 + await _sysPositionService.Add(input, ApplicationConst.BIZ_POS);//添加岗位 } /// - public async Task> PositionSelector(PositionSelectorInput input) + public async Task> Selector(PositionSelectorInput input) { //获取数据范围 var dataScope = await _sysUserService.GetLoginUserApiDataScope(); input.OrgIds = dataScope;//赋值机构列表 - var result = await _sysPositionService.PositionSelector(input);//查询 + var result = await _sysPositionService.Selector(input);//查询 return result; } @@ -78,9 +71,43 @@ public class PositionService : DbRepository, IPositionService public async Task Detail(BaseIdInput input) { var position = await _sysPositionService.GetSysPositionById(input.Id); + //判断数据范围 + await _sysUserService.CheckApiDataScope(position.OrgId, position.CreateUserId.GetValueOrDefault(), "您没有权限查看该机构"); return position; } + #endregion + + #region 编辑 + + /// + public async Task Edit(PositionEditInput input) + { + await CheckInput(input, SystemConst.EDIT);//检查参数 + await _sysPositionService.Edit(input, ApplicationConst.BIZ_POS);//编辑 + } + + #endregion + + + #region 删除 + + /// + public async Task Delete(BaseIdListInput input) + { + //获取所有ID + var ids = input.Ids; + //获取要删除的岗位列表 + var positions = (await _sysPositionService.GetListAsync()).Where(it => ids.Contains(it.Id)).ToList(); + //检查数据范围 + var orgIds = positions.Select(it => it.OrgId).ToList(); + var createUserIds = positions.Select(it => it.CreateUserId.GetValueOrDefault()).ToList(); + await _sysUserService.CheckApiDataScope(orgIds, createUserIds, "您没有权限删除该机构"); + await _sysPositionService.Delete(input, ApplicationConst.BIZ_ORG);//删除岗位 + } + + #endregion + #region 方法 /// @@ -91,27 +118,14 @@ public class PositionService : DbRepository, IPositionService private async Task CheckInput(SysPosition sysPosition, string operate) { var errorMessage = $"您没有权限在该机构下{operate}岗位"; - //获取数据范围 - var dataScope = await _sysUserService.GetLoginUserApiDataScope(); - if (dataScope is { Count: > 0 })//如果有机构 - { - if (!dataScope.Contains(sysPosition.OrgId))//判断机构ID是否在数据范围 - throw Oops.Bah(errorMessage); - } - else if (dataScope is { Count: 0 })// 仅自己 + //如果id大于0表示编辑 + if (sysPosition.Id > 0) { - //如果id大于0表示编辑 - if (sysPosition.Id > 0) - { - var position = await _sysPositionService.GetSysPositionById(sysPosition.Id);//获取机构 - if (position.CreateUserId != UserManager.UserId) throw Oops.Bah(errorMessage);//岗位的创建人不是自己则报错 - } - else - { - throw Oops.Bah(errorMessage); - } + var position = await _sysPositionService.GetSysPositionById(sysPosition.Id);//获取机构 + sysPosition.CreateUserId = position.CreateUserId; } + await _sysUserService.CheckApiDataScope(sysPosition.OrgId, sysPosition.CreateUserId.GetValueOrDefault(), errorMessage); } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/Role/IRoleService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/Role/IRoleService.cs new file mode 100644 index 0000000000000000000000000000000000000000..39bd73746ac8f8cce1f876da79473739c15321a8 --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/Role/IRoleService.cs @@ -0,0 +1,115 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Application; + +public interface IRoleService : ITransient +{ + #region 查询 + + /// + /// 角色拥有资源 + /// + /// 角色id + /// 资源类型 + /// 角色拥有资源信息 + Task OwnResource(BaseIdInput input, string category); + + /// + /// 获取角色下的用户 + /// + /// 角色ID + /// + Task> OwnUser(BaseIdInput input); + + /// + /// 分页查询角色 + /// + /// 查询参数 + /// + Task> Page(RolePageInput input); + + /// + /// 角色选择器 + /// + /// + /// + Task> RoleSelector(RoleSelectorInput input); + + /// + /// 获取角色树 + /// + /// 角色树 + /// + Task> Tree(RoleTreeInput input); + + /// + /// 角色详情 + /// + /// 角色Id + /// + Task Detail(BaseIdInput input); + + /// + /// 资源树选择器 + /// + /// + Task> ResourceTreeSelector(); + + #endregion + + #region 新增 + + /// + /// 添加角色 + /// + /// 添加参数 + /// + Task Add(RoleAddInput input); + + #endregion + + #region 编辑 + + /// + /// 编辑角色 + /// + /// 编辑参数 + /// + Task Edit(RoleEditInput input); + + + /// + /// 给角色授权 + /// + /// 授权参数 + /// + Task GrantResource(GrantResourceInput input); + + /// + /// 给角色授权用户 + /// + /// 授权信息 + /// + Task GrantUser(GrantUserInput input); + + #endregion + + #region 删除 + + /// + /// 删除角色 + /// + /// 删除参数 + /// + Task Delete(BaseIdListInput input); + + #endregion +} diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/Role/RoleService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/Role/RoleService.cs new file mode 100644 index 0000000000000000000000000000000000000000..9ddeb97f4c75862538ff7980a72c6742b8dbc633 --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/Role/RoleService.cs @@ -0,0 +1,286 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using Microsoft.Extensions.Logging; +using NewLife.Serialization; + +namespace SimpleAdmin.Application; + +/// +public class RoleService : IRoleService +{ + private readonly ILogger _logger; + private readonly ISysUserService _sysUserService; + private readonly ISysRoleService _sysRoleService; + private readonly IResourceService _resourceService; + private readonly IRelationService _relationService; + + public RoleService(ILogger logger, ISysUserService sysUserService, ISysRoleService sysRoleService, + IResourceService resourceService, IRelationService relationService) + { + _logger = logger; + _sysUserService = sysUserService; + _sysRoleService = sysRoleService; + _resourceService = resourceService; + _relationService = relationService; + } + + #region 查询 + + /// + public async Task OwnResource(BaseIdInput input, string category) + { + return await _sysRoleService.OwnResource(input, category); + } + + /// + public async Task> OwnUser(BaseIdInput input) + { + return await _sysRoleService.OwnUser(input); + } + + /// + public async Task> Page(RolePageInput input) + { + //获取数据范围 + var dataScope = await _sysUserService.GetLoginUserApiDataScope(); + input.OrgIds = dataScope; + input.Category = CateGoryConst.ROLE_ORG;//只查询机构角色 + //分页查询 + var pageInfo = await _sysRoleService.Page(input); + return pageInfo; + } + + + /// + public async Task> RoleSelector(RoleSelectorInput input) + { + //获取数据范围 + var dataScope = await _sysUserService.GetLoginUserApiDataScope(); + input.OrgIds = dataScope; + return await _sysRoleService.RoleSelector(input); + } + + /// + public async Task> Tree(RoleTreeInput input) + { + var dataScope = await _sysUserService.GetLoginUserApiDataScope(); + input.OrgIds = dataScope; + return await _sysRoleService.Tree(input); + } + + /// + public async Task Detail(BaseIdInput input) + { + var role = await _sysRoleService.Detail(input); + var errorMessage = "您没有权限查看该角色"; + await _sysUserService.CheckApiDataScope(role.OrgId, role.CreateUserId, errorMessage); + return role; + } + + /// + public async Task> ResourceTreeSelector() + { + var resourceTreeSelectors = new List();//定义结果 + var user = await _sysUserService.GetUserById(UserManager.UserId);//获取用户 + //获取角色资源关系 + var relations = + await _relationService.GetRelationListByObjectIdListAndCategory(user.RoleIdList, CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE); + var menuIds = new HashSet();//菜单ID集合 + var buttonIds = new HashSet();//按钮ID集合 + relations.ForEach(it => + { + var resources = it.ExtJson.ToJsonEntity();//转换为对象获取资源 + menuIds.Add(resources.MenuId);//添加菜单ID + resources.ButtonInfo.ForEach(b => buttonIds.Add(b));//添加按钮ID + }); + var menuList = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_MENU);//获取所有菜单 + var buttonList = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_BUTTON);//获取所有按钮 + var moduleList = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_MODULE);//获取所有模块 + var ownMenuList = menuList.Where(it => menuIds.Contains(it.Id)).ToList();//已拥有的菜单 + var parentMenuList = menuList.Where(it => ownMenuList.Select(m => m.ParentId).Contains(it.Id)).ToList();//获取所有父级菜单 + ownMenuList.AddRange(parentMenuList);//将父级菜单加入到拥有菜单列表 + var ownButtonList = buttonList.Where(it => buttonIds.Contains(it.Id)).ToList();//已拥有的按钮 + var moduleIds = ownMenuList.Select(it => it.Module.GetValueOrDefault()).Distinct().ToList();//模块ID集合 + var ownModuleList = moduleList.Where(it => moduleIds.Contains(it.Id)).ToList();//已拥有的模块 + //遍历模块 + foreach (var module in ownModuleList) + { + //将实体转换为ResourceTreeSelectorOutPut获取基本信息 + var resourceTreeSelector = module.Adapt(); + resourceTreeSelector.Menu = await GetRoleGrantResourceMenus(module.Id, ownMenuList, ownButtonList);//获取授权菜单 + resourceTreeSelectors.Add(resourceTreeSelector); + } + return resourceTreeSelectors; + } + + #endregion + + #region 增加 + + /// + public async Task Add(RoleAddInput input) + { + await CheckInput(input);//检查参数 + await _sysRoleService.Add(input); + } + + #endregion + + #region 编辑 + + /// + public async Task Edit(RoleEditInput input) + { + await CheckInput(input);//检查参数 + await _sysRoleService.Edit(input); + } + + /// + public async Task GrantResource(GrantResourceInput input) + { + await _sysRoleService.GrantResource(input); + } + + /// + public async Task GrantUser(GrantUserInput input) + { + await _sysRoleService.GrantUser(input); + } + + #endregion + + #region 删除 + + /// + public async Task Delete(BaseIdListInput input) + { + //获取所有ID + var ids = input.Ids; + //获取要删除的机构列表 + var roleList = (await _sysRoleService.GetListAsync()).Where(it => ids.Contains(it.Id)).ToList(); + if (roleList.Any(it => it.Category == CateGoryConst.ROLE_GLOBAL))//如果有全局角色 + throw Oops.Bah("不能删除全局角色"); + //检查数据范围 + var orgIds = roleList.Select(it => it.OrgId.GetValueOrDefault()).ToList(); + var createUserIds = roleList.Select(it => it.CreateUserId.GetValueOrDefault()).ToList(); + await _sysUserService.CheckApiDataScope(orgIds, createUserIds, "您没有权限删除这些角色"); + await _sysRoleService.Delete(input); + } + + #endregion + + #region 方法 + + /// + /// 检查输入参数 + /// + /// + private async Task CheckInput(SysRole sysRole) + { + sysRole.Category = CateGoryConst.ROLE_ORG; + if (sysRole.DefaultDataScope.ScopeCategory == CateGoryConst.SCOPE_ALL) + throw Oops.Bah("不能添加全局数据范围的角色"); + await _sysUserService.CheckApiDataScope(sysRole.OrgId, sysRole.CreateUserId.GetValueOrDefault(), "您没有权限添加该角色"); + } + + /// + /// 获取授权菜单 + /// + /// 模块Id + /// 拥有菜单列表 + /// 拥有权限按钮列表 + /// + public async Task> GetRoleGrantResourceMenus(long moduleId, List ownMenuList, + List ownButtonList) + { + var roleGrantResourceMenus = new List();//定义结果 + var parentMenuList = ownMenuList.Where(it => it.ParentId == SimpleAdminConst.ZERO).ToList();//获取一级目录 + //遍历一级目录 + foreach (var parent in parentMenuList) + { + //如果是目录则去遍历下级 + if (parent.MenuType == SysResourceConst.CATALOG) + { + //获取所有下级菜单 + var menuList = _resourceService.GetChildListById(ownMenuList, parent.Id, false); + if (menuList.Count > 0)//如果有菜单 + { + //遍历下级菜单 + foreach (var menu in menuList) + { + //如果菜单类型是菜单 + if (menu.MenuType is SysResourceConst.MENU or SysResourceConst.SUBSET) + { + //获取菜单下按钮集合并转换成对应实体 + var buttonList = ownButtonList.Where(it => it.ParentId == menu.Id).ToList(); + var buttons = buttonList.Adapt>(); + roleGrantResourceMenus.Add(new ResTreeSelector.RoleGrantResourceMenu + { + Id = menu.Id, + ParentId = parent.Id, + ParentName = parent.Title, + Module = moduleId, + Title = _resourceService.GetRoleGrantResourceMenuTitle(menuList, menu),//菜单名称需要特殊处理因为有二级菜单 + Button = buttons + }); + } + else if (menu.MenuType == SysResourceConst.LINK || menu.MenuType == SysResourceConst.IFRAME)//如果是内链或者外链 + { + //直接加到资源列表 + roleGrantResourceMenus.Add(new ResTreeSelector.RoleGrantResourceMenu + { + Id = menu.Id, + ParentId = parent.Id, + ParentName = parent.Title, + Module = moduleId, + Title = menu.Title + }); + } + } + } + else + { + //否则就将自己加到一级目录里面 + roleGrantResourceMenus.Add(new ResTreeSelector.RoleGrantResourceMenu + { + Id = parent.Id, + ParentId = parent.Id, + ParentName = parent.Title, + Module = moduleId + }); + } + } + else + { + //就将自己加到一级目录里面 + var roleGrantResourcesButtons = new ResTreeSelector.RoleGrantResourceMenu + { + Id = parent.Id, + ParentId = parent.Id, + ParentName = parent.Title, + Module = moduleId, + Title = parent.Title + }; + //如果菜单类型是菜单 + if (parent.MenuType == SysResourceConst.MENU) + { + //获取菜单下按钮集合并转换成对应实体 + var buttonList = ownButtonList.Where(it => it.ParentId == parent.Id).ToList(); + roleGrantResourcesButtons.Button = buttonList.Adapt>(); + } + roleGrantResourceMenus.Add(roleGrantResourcesButtons); + } + } + return roleGrantResourceMenus; + } + + #endregion +} diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/User/Dto/UserInput.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/User/Dto/UserInput.cs new file mode 100644 index 0000000000000000000000000000000000000000..d3dd86e43540008b92fa47109aaf2a794f2c7fcc --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/User/Dto/UserInput.cs @@ -0,0 +1,18 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Application; + +/// +/// 业务用户导入 +/// +public class BizUserImportInput : SysUserImportInput +{ +} diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/User/Dto/UserOutput.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/User/Dto/UserOutput.cs new file mode 100644 index 0000000000000000000000000000000000000000..81562dd2489e52e9136d43ede483a6bc4acc856b --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/User/Dto/UserOutput.cs @@ -0,0 +1,18 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Application; + +/// +/// 业务用户导出 +/// +public class BizUserExportOutput : SysUserExportOutput +{ +} diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/IUserService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/User/IUserService.cs similarity index 74% rename from api/SimpleAdmin/SimpleAdmin.Application/Services/User/IUserService.cs rename to api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/User/IUserService.cs index 8655071d04c80f4e0511fb21262612937e1d7dac..57b11e6f7658d65b6f8058195a440ffbc6bdeb83 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/IUserService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/User/IUserService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Application; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Application; /// /// 人员管理服务 @@ -12,7 +22,7 @@ public interface IUserService : ITransient /// /// 查询参数 /// 人员列表 - Task> UserSelector(UserSelectorInput input); + Task> Selector(UserSelectorInput input); /// /// 用户分页查询 @@ -26,14 +36,14 @@ public interface IUserService : ITransient /// /// 用户ID /// - Task> OwnRole(BaseIdInput input); + Task> OwnRole(BaseIdInput input); /// /// 角色选择器 /// /// /// - Task> RoleSelector(RoleSelectorInput input); + Task> RoleSelector(RoleSelectorInput input); /// /// 人员详情 @@ -101,7 +111,7 @@ public interface IUserService : ITransient /// /// Id列表 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); #endregion 删除 @@ -142,4 +152,4 @@ public interface IUserService : ITransient Task Edits(BatchEditInput input); #endregion 导入导出 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/User/UserService.cs similarity index 65% rename from api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs rename to api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/User/UserService.cs index 39dd4513973fb24ec9e8c4fbf2ddab4eedd1a59c..7ca05da76fab59f3b33eda85424ff18039d154ad 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Organization/User/UserService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Application; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Application; /// /// @@ -6,20 +16,13 @@ public class UserService : DbRepository, IUserService { private readonly ISysUserService _sysUserService; - private readonly IRoleService _roleService; - private readonly ISysOrgService _sysOrgService; + private readonly ISysRoleService _sysRoleService; private readonly IImportExportService _importExportService; - public UserService( - ISysUserService sysUserService, - IRoleService roleService, - ISysOrgService sysOrgService, - IImportExportService importExportService - ) + public UserService(ISysUserService sysUserService, ISysRoleService sysRoleService, IImportExportService importExportService) { _sysUserService = sysUserService; - _roleService = roleService; - _sysOrgService = sysOrgService; + _sysRoleService = sysRoleService; _importExportService = importExportService; } @@ -35,22 +38,22 @@ public class UserService : DbRepository, IUserService } /// - public async Task> OwnRole(BaseIdInput input) + public async Task> OwnRole(BaseIdInput input) { return await _sysUserService.OwnRole(input);//获取角色 } /// - public async Task> UserSelector(UserSelectorInput input) + public async Task> Selector(UserSelectorInput input) { //获取数据范围 var dataScope = await _sysUserService.GetLoginUserApiDataScope(); if (dataScope == null) - return await _sysUserService.UserSelector(input);//查询 + return await _sysUserService.Selector(input);//查询 if (dataScope.Count > 0) { input.OrgIds = dataScope;//赋值机构列表 - return await _sysUserService.UserSelector(input);//查询 + return await _sysUserService.Selector(input);//查询 } //返回自己 return new SqlSugarPagedList @@ -59,29 +62,36 @@ public class UserService : DbRepository, IUserService Pages = 1, HasPrevPages = false, HasNextPages = false, - Records = new[] { new UserSelectorOutPut { Account = UserManager.UserAccount, Id = UserManager.UserId, Name = UserManager.Name, OrgId = UserManager.OrgId } } + List = new[] + { + new UserSelectorOutPut + { + Account = UserManager.UserAccount, Id = UserManager.UserId, + Name = UserManager.Name, OrgId = UserManager.OrgId + } + } }; } /// - public async Task> RoleSelector(RoleSelectorInput input) + public async Task> RoleSelector(RoleSelectorInput input) { - var sysRoles = new SqlSugarPagedList() + var sysRoles = new SqlSugarPagedList { Total = 1, Pages = 1, HasPrevPages = false, HasNextPages = false, - Records = new List() + List = new List() }; //获取数据范围 var dataScope = await _sysUserService.GetLoginUserApiDataScope(); if (dataScope == null) - sysRoles = await _roleService.RoleSelector(input);//获取角色选择器列表 + sysRoles = await _sysRoleService.RoleSelector(input);//获取角色选择器列表 else if (dataScope.Count > 0)//如果有机构 { input.OrgIds = dataScope;//将数据范传进去 - sysRoles = await _roleService.RoleSelector(input);//获取角色选择器列表 + sysRoles = await _sysRoleService.RoleSelector(input);//获取角色选择器列表 } return sysRoles; } @@ -90,6 +100,9 @@ public class UserService : DbRepository, IUserService public async Task Detail(BaseIdInput input) { var user = await _sysUserService.Detail(input); + var errorMessage = "您没有权限查看该人员"; + //判断数据范围 + await _sysUserService.CheckApiDataScope(user.OrgId, user.CreateUserId, errorMessage); return user; } @@ -100,7 +113,7 @@ public class UserService : DbRepository, IUserService /// public async Task Add(UserAddInput input) { - await CheckInput(input, SimpleAdminConst.Add);//检查参数 + await CheckInput(input, SystemConst.ADD);//检查参数 await _sysUserService.Add(input);//添加 } @@ -111,7 +124,7 @@ public class UserService : DbRepository, IUserService /// public async Task Edit(UserEditInput input) { - await CheckInput(input, SimpleAdminConst.Edit);//检查参数 + await CheckInput(input, SystemConst.EDIT);//检查参数 await _sysUserService.Edit(input);//编辑 } @@ -120,8 +133,9 @@ public class UserService : DbRepository, IUserService { //获取数据范围 var dataScope = await _sysUserService.GetLoginUserApiDataScope(); - var ids = input.Ids;//获取用户id - var sysUsers = await GetListAsync(it => ids.Contains(it.Id), it => new SysUser { OrgId = it.OrgId, CreateUserId = it.CreateUserId });//根据用户ID获取机构id、 + var ids = input.Ids; + var sysUsers = await GetListAsync(it => ids.Contains(it.Id), + it => new SysUser { OrgId = it.OrgId, CreateUserId = it.CreateUserId });//根据用户ID获取机构id、 sysUsers.ForEach(it => { if (dataScope != null && !dataScope.Contains(it.OrgId) && it.CreateUserId != UserManager.UserId) @@ -133,28 +147,28 @@ public class UserService : DbRepository, IUserService /// public async Task DisableUser(BaseIdInput input) { - await CheckPermission(input.Id, SimpleAdminConst.Disable);//检查权限 + await CheckInput(input.Id, SystemConst.DISABLE);//检查权限 await _sysUserService.DisableUser(input);//禁用 } /// public async Task EnableUser(BaseIdInput input) { - await CheckPermission(input.Id, SimpleAdminConst.Enable);//检查权限 + await CheckInput(input.Id, SystemConst.ENABLE);//检查权限 await _sysUserService.EnableUser(input);//启用 } /// public async Task GrantRole(UserGrantRoleInput input) { - await CheckPermission(input.Id, SimpleAdminConst.Disable);//检查权限 + await CheckInput(input.Id, SystemConst.DISABLE);//检查权限 await _sysUserService.GrantRole(input);//授权 } /// public async Task ResetPassword(BaseIdInput input) { - await CheckPermission(input.Id, SimpleAdminConst.ResestPwd);//检查权限 + await CheckInput(input.Id, SystemConst.RESET_PWD);//检查权限 await _sysUserService.ResetPassword(input);//重置密码 } @@ -163,30 +177,18 @@ public class UserService : DbRepository, IUserService #region 删除 /// - public async Task Delete(List input) + public async Task Delete(BaseIdListInput input) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); - //获取数据范围 - var dataScope = await _sysUserService.GetLoginUserApiDataScope(); + var ids = input.Ids; + //获取用户下信息 var users = await GetListAsync(it => ids.Contains(it.Id), it => new SysUser { OrgId = it.OrgId, Id = it.Id }); - if (dataScope == null)//全部数据权限 - { - await _sysUserService.Delete(input);//删除 - return; - } - if (dataScope.Count > 0)//如果有机构 - { - var orgIds = users.Select(it => it.OrgId).ToList();//获取所有用户机构列表 - if (!dataScope.ContainsAll(orgIds)) - throw Oops.Bah($"您没有权限删除这些人员"); - await _sysUserService.Delete(input);//删除 - } - else - { - throw Oops.Bah($"您没有权限删除这些人员"); - } + //检查数据范围 + var orgIds = users.Select(it => it.OrgId).ToList(); + var createUserIds = users.Select(it => it.CreateUserId.GetValueOrDefault()).ToList(); + await _sysUserService.CheckApiDataScope(orgIds, createUserIds, "您没有权限删除这些人员"); + await _sysUserService.Delete(input);//删除 } #endregion 删除 @@ -213,8 +215,7 @@ public class UserService : DbRepository, IUserService importPreview.Data = await CheckImport(importPreview.Data, dataScope);//检查导入数据 return importPreview; } - else - throw Oops.Bah("您无权导入用户"); + throw Oops.Bah("您无权导入用户"); } /// @@ -241,7 +242,7 @@ public class UserService : DbRepository, IUserService await InsertOrBulkCopy(sysUsers);// 数据导入 return result; } - else throw Oops.Bah("您无权导入用户"); + throw Oops.Bah("您无权导入用户"); } #endregion 导入导出 @@ -256,53 +257,26 @@ public class UserService : DbRepository, IUserService private async Task CheckInput(SysUser sysUser, string operate) { var errorMessage = $"您没有权限{operate}该机构下的人员"; - //获取数据范围 - var dataScope = await _sysUserService.GetLoginUserApiDataScope(); - if (dataScope.Count > 0)//如果有机构 + if (sysUser.Id != SimpleAdminConst.ZERO) { - if (!dataScope.Contains(sysUser.OrgId))//判断父ID是否在数据范围 - throw Oops.Bah(errorMessage); - } - else - { - //如果ID大于0表示编辑 - if (sysUser.Id > 0) - { - //检查权限 - await CheckPermission(sysUser.Id, operate, dataScope); - } - else - { - throw Oops.Bah(errorMessage); - } + var user = await _sysUserService.GetUserById(sysUser.Id); + sysUser.CreateUserId = user.CreateUserId; } + //检查数据范围 + await _sysUserService.CheckApiDataScope(sysUser.OrgId, sysUser.CreateUserId.GetValueOrDefault(), errorMessage); } /// - /// 检查权限 + /// 检查输入参数 /// /// 用户ID - /// 操作名称 - /// 数据范围 - /// - private async Task CheckPermission(long userId, string operate, List dataScope = null) + /// 操作 + private async Task CheckInput(long userId, string operate) { var errorMessage = $"您没有权限{operate}该机构下的人员"; - //获取数据范围 - if (dataScope == null) - dataScope = await _sysUserService.GetLoginUserApiDataScope(); - if (dataScope is { Count: > 0 })//如果有机构 - { - //获取用户信息 - var user = await _sysUserService.GetUserById(userId); - if (!dataScope.Contains(user.OrgId))//判断用户机构ID是否在数据范围 - throw Oops.Bah(errorMessage); - } - else if (dataScope is { Count: 0 })//如果没有机构 - { - if (userId != UserManager.UserId)//如果不是自己 - throw Oops.Bah(errorMessage); - } + var sysUser = await _sysUserService.GetUserById(userId); + //检查数据范围 + await _sysUserService.CheckApiDataScope(sysUser.OrgId, sysUser.CreateUserId.GetValueOrDefault(), errorMessage); } /// @@ -314,7 +288,7 @@ public class UserService : DbRepository, IUserService /// public async Task> CheckImport(List data, List dataScope, bool clearError = false) { - var errorMessage = $"没有权限"; + var errorMessage = "没有权限"; //先经过系统用户检查 var bizUsers = await _sysUserService.CheckImport(data, clearError); bizUsers.ForEach(it => @@ -347,7 +321,7 @@ public class UserService : DbRepository, IUserService var dataScope = await _sysUserService.GetLoginUserApiDataScope(); //动态查询条件 var exp = Expressionable.Create(); - exp.And(u => u.Account != RoleConst.SuperAdmin); + exp.And(u => u.Account != SysRoleConst.SUPER_ADMIN); exp.AndIF(dataScope is { Count: > 0 }, u => dataScope.Contains(u.OrgId));//用户机构在数据范围内 exp.AndIF(dataScope is { Count: 0 }, u => u.Id == UserManager.UserId);//用户ID等于自己 input.Expression = exp; @@ -355,4 +329,4 @@ public class UserService : DbRepository, IUserService } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/Dto/UserInput.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/Dto/UserInput.cs deleted file mode 100644 index 30d389168ced1dbf1a048f916f4f1119d9178624..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/Dto/UserInput.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace SimpleAdmin.Application; - -/// -/// 业务用户导入 -/// -public class BizUserImportInput : SysUserImportInput -{ -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/Dto/UserOutput.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/Dto/UserOutput.cs deleted file mode 100644 index 613c09fe591aa998942d213f45ace0622341ff19..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/Dto/UserOutput.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace SimpleAdmin.Application; - -/// -/// 业务用户导出 -/// -public class BizUserExportOutput : SysUserExportOutput -{ -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Application/SimpleAdmin.Application.csproj b/api/SimpleAdmin/SimpleAdmin.Application/SimpleAdmin.Application.csproj index 375b450dd1a7ca6ee5587a2b8f70ac87d0debe46..22c3f5a90f4b484fbb6ebffe7e2e90638e4615a3 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/SimpleAdmin.Application.csproj +++ b/api/SimpleAdmin/SimpleAdmin.Application/SimpleAdmin.Application.csproj @@ -1,29 +1,27 @@  + + + + + + - - net7.0;net6.0 - 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 - SimpleAdmin.Application.xml - enable - + + + - - - - - + + + PreserveNewest + + + PreserveNewest + + - - - - - - PreserveNewest - - - PreserveNewest - - + + + diff --git a/api/SimpleAdmin/SimpleAdmin.Application/SimpleAdmin.Application.xml b/api/SimpleAdmin/SimpleAdmin.Application/SimpleAdmin.Application.xml index d59513f34a0200ffbab1c73808c56b1df6b7c8d5..30b7b07eee1e43376d8834d503e3e1778716f25d 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/SimpleAdmin.Application.xml +++ b/api/SimpleAdmin/SimpleAdmin.Application/SimpleAdmin.Application.xml @@ -4,44 +4,14 @@ SimpleAdmin.Application - - - 代码生成基础 - - - - - 姓名 - - - - - 性别 - - - - - 民族 - - - - - 年龄 - - - + - 生日 + 机构 - + - 存款 - - - - - 排序码 + 岗位 @@ -49,276 +19,6 @@ 系统配置 - - - 测试分页查询参数 - - - - - 姓名 - - - - - 组织机构Id - - - - - 添加测试参数 - - - - - 姓名 - - - - - 性别 - - - - - 民族 - - - - - 年龄 - - - - - 生日 - - - - - 排序码 - - - - - 存款 - - - - - 修改测试参数 - - - - - Id - - - - - 测试导入 - - - - - 姓名 - - - - - 性别 - - - - - 民族 - - - - - 年龄 - - - - - 生日 - - - - - 排序码 - - - - - 存款 - - - - - 测试导出 - - - - - 姓名 - - - - - 性别 - - - - - 民族 - - - - - 年龄 - - - - - 生日 - - - - - 排序码 - - - - - 存款 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 检查输入参数 - - - - - - 获取Sqlsugar的ISugarQueryable - - - - - - - - - - 测试服务 - - - - - 测试分页查询 - - 查询参数 - 测试分页 - - - - 测试列表查询 - - 查询参数 - 测试列表 - - - - 测试详情 - - Id参数 - 详细信息 - - - - 添加测试 - - 添加参数 - - - - - 修改测试 - - 编辑参数 - - - - - 删除测试 - - 删除参数 - - - - - 测试导入模板下载 - - 模板 - - - - 测试导入预览 - - 预览参数 - 预览结果 - - - - 测试导入 - - - - - - - 测试导出 - - - - 机构服务 @@ -338,7 +38,7 @@ 机构复制参数 - + 删除机构 @@ -391,7 +91,7 @@ - + @@ -416,7 +116,7 @@ 添加参数 - + 删除岗位 @@ -437,7 +137,7 @@ 查询参数 分页列表 - + 岗位选择器 @@ -451,6 +151,13 @@ + + + 岗位树形结构 + + + + @@ -459,19 +166,22 @@ + + + - + + + + - - - - + @@ -481,6 +191,144 @@ 参数 操作名称 + + + 角色拥有资源 + + 角色id + 资源类型 + 角色拥有资源信息 + + + + 获取角色下的用户 + + 角色ID + + + + + 分页查询角色 + + 查询参数 + + + + + 角色选择器 + + + + + + + 获取角色树 + + 角色树 + + + + + 角色详情 + + 角色Id + + + + + 资源树选择器 + + + + + + 添加角色 + + 添加参数 + + + + + 编辑角色 + + 编辑参数 + + + + + 给角色授权 + + 授权参数 + + + + + 给角色授权用户 + + 授权信息 + + + + + 删除角色 + + 删除参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 检查输入参数 + + + + + + 获取授权菜单 + + 模块Id + 拥有菜单列表 + 拥有权限按钮列表 + + 业务用户导入 @@ -496,7 +344,7 @@ 人员管理服务 - + 人员选择器 @@ -573,7 +421,7 @@ 授权参数 - + 删除用户 @@ -625,7 +473,7 @@ - + @@ -655,7 +503,7 @@ - + @@ -677,14 +525,12 @@ 操作类型 - + - 检查权限 + 检查输入参数 用户ID - 操作名称 - 数据范围 - + 操作 diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Startup.cs b/api/SimpleAdmin/SimpleAdmin.Application/Startup.cs index 03a27da9f55e895c0b81fc7ec5128c329c58f418..f20b884da8ce083986833449eab035e5e321cf90 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Startup.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Startup.cs @@ -1,4 +1,12 @@ -using System.Reflection; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Application; @@ -26,4 +34,4 @@ public class Startup : AppStartup var settings = App.GetOptions(); CodeFirstUtils.CodeFirst(settings, fullName);//CodeFirst } -} \ No newline at end of file +} diff --git "a/api/SimpleAdmin/SimpleAdmin.Background/A\345\201\234\346\255\242\346\234\215\345\212\241.bat" "b/api/SimpleAdmin/SimpleAdmin.Background/A\345\201\234\346\255\242\346\234\215\345\212\241.bat" deleted file mode 100644 index 75a8ec0c27d83e24c5ce1ed188c5803e3d511677..0000000000000000000000000000000000000000 --- "a/api/SimpleAdmin/SimpleAdmin.Background/A\345\201\234\346\255\242\346\234\215\345\212\241.bat" +++ /dev/null @@ -1,9 +0,0 @@ -@echo off -color 0e -@echo ================================== -@echo ѣҼļùԱʽ򿪡 -@echo ================================== -@echo Start Stop SimpleAdmin.Background - -Net stop SimpleAdmin.Background -pause \ No newline at end of file diff --git "a/api/SimpleAdmin/SimpleAdmin.Background/A\345\215\270\350\275\275\346\234\215\345\212\241.bat" "b/api/SimpleAdmin/SimpleAdmin.Background/A\345\215\270\350\275\275\346\234\215\345\212\241.bat" deleted file mode 100644 index 8a2989cef400110a8c4e2c87e90897b55598ed2b..0000000000000000000000000000000000000000 --- "a/api/SimpleAdmin/SimpleAdmin.Background/A\345\215\270\350\275\275\346\234\215\345\212\241.bat" +++ /dev/null @@ -1,10 +0,0 @@ -@echo off -color 0e -@echo ================================== -@echo ѣҼļùԱʽ򿪡 -@echo ================================== -@echo Start Remove SimpleAdmin.Background - -Net stop SimpleAdmin.Background -sc delete SimpleAdmin.Background -pause \ No newline at end of file diff --git "a/api/SimpleAdmin/SimpleAdmin.Background/A\345\220\257\345\212\250\346\234\215\345\212\241.bat" "b/api/SimpleAdmin/SimpleAdmin.Background/A\345\220\257\345\212\250\346\234\215\345\212\241.bat" deleted file mode 100644 index 55970d7484cb8b8d703b7b867cba201feb06abd6..0000000000000000000000000000000000000000 --- "a/api/SimpleAdmin/SimpleAdmin.Background/A\345\220\257\345\212\250\346\234\215\345\212\241.bat" +++ /dev/null @@ -1,9 +0,0 @@ -@echo off -color 0e -@echo ================================== -@echo ѣҼļùԱʽ򿪡 -@echo ================================== -@echo Start Start SimpleAdmin.Background - -Net Start SimpleAdmin.Background -pause \ No newline at end of file diff --git "a/api/SimpleAdmin/SimpleAdmin.Background/A\345\256\211\350\243\205\346\234\215\345\212\241.bat" "b/api/SimpleAdmin/SimpleAdmin.Background/A\345\256\211\350\243\205\346\234\215\345\212\241.bat" deleted file mode 100644 index 065b14c15f284c0e990eada7c5d2b51ca8b368cd..0000000000000000000000000000000000000000 --- "a/api/SimpleAdmin/SimpleAdmin.Background/A\345\256\211\350\243\205\346\234\215\345\212\241.bat" +++ /dev/null @@ -1,12 +0,0 @@ -@echo off -color 0e -@echo ================================== -@echo ѣҼļùԱʽ򿪡 -@echo ================================== -@echo Start Install SimpleAdmin.Background - -cd .. -sc create SimpleAdmin.Background binPath=%~dp0SimpleAdmin.Background.exe start= auto -sc description SimpleAdmin.Background "SimpleAdmin̨" -Net Start SimpleAdmin.Background -pause \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Background/Background.Development.json b/api/SimpleAdmin/SimpleAdmin.Background/Background.Development.json deleted file mode 100644 index fead2dc28335afed20ac781fd6b0adb39b5a978e..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Background/Background.Development.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - //mqtt设置 - "MqttSettings": { - "Host": "127.0.0.1", - "Port": 1883, - "UserName": "admin", - "SecretKey": "admin", - "ClientId": "SimpleAdminBackground" - }, -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Background/Background.Production.json b/api/SimpleAdmin/SimpleAdmin.Background/Background.Production.json deleted file mode 100644 index fead2dc28335afed20ac781fd6b0adb39b5a978e..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Background/Background.Production.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - //mqtt设置 - "MqttSettings": { - "Host": "127.0.0.1", - "Port": 1883, - "UserName": "admin", - "SecretKey": "admin", - "ClientId": "SimpleAdminBackground" - }, -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Background/Dto/MqttConnected.cs b/api/SimpleAdmin/SimpleAdmin.Background/Dto/MqttConnected.cs deleted file mode 100644 index 05e3475cdfe55e3fa512947da9161c036ea9d70d..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Background/Dto/MqttConnected.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace SimpleAdmin.Background; - -/// -/// Mqtt连接 -/// -public class MqttConnected -{ - /// - /// 用户名 - /// - public string UserName { get; set; } - - /// - /// 客户端ID - /// - public string Clientid { get; set; } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Background/GlobalUsings.cs b/api/SimpleAdmin/SimpleAdmin.Background/GlobalUsings.cs deleted file mode 100644 index 575db6c2b2c53222ad22640edf45a63dfc089db5..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Background/GlobalUsings.cs +++ /dev/null @@ -1 +0,0 @@ -global using SimpleMQTT; \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Background/MqttWorker.cs b/api/SimpleAdmin/SimpleAdmin.Background/MqttWorker.cs deleted file mode 100644 index 1a50dc533e082c35e00778966141aa7c328cb8f2..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Background/MqttWorker.cs +++ /dev/null @@ -1,67 +0,0 @@ -using Masuit.Tools; -using NewLife.MQTT; -using SimpleAdmin.Core; -using SimpleAdmin.Cache; - -namespace SimpleAdmin.Background; - -/// -/// mqtt̨ -/// -public class MqttWorker : BackgroundService -{ - private readonly ILogger _logger; - private readonly ISimpleCacheService _simpleCacheService; - private readonly MqttClient _mqtt; - - public MqttWorker(ILogger logger, ISimpleCacheService simpleCacheService, IMqttClientManager mqttClientManager) - { - _logger = logger; - this._simpleCacheService = simpleCacheService; - this._mqtt = mqttClientManager.GetClient(); - } - - protected override async Task ExecuteAsync(CancellationToken stoppingToken) - { - //豸 - await _mqtt.SubscribeAsync("$SYS/brokers/+/clients/+/+", (e) => - { - var topicList = e.Topic.Split("/");///ָ - var clientId = topicList[topicList.Length - 2];//ȡͻID - if (clientId.Contains("_"))//жϿͻIDǷ»»߱ʾwebû¼ - { - var userId = clientId.Split("_")[0]; - //ȡredisǰûtokenϢб - var tokenInfos = _simpleCacheService.HashGetOne>(CacheConst.Cache_UserToken, userId); - if (tokenInfos != null) - { - var connectEvent = topicList.Last();//ȡ¼ж߻ - if (connectEvent == "connected")// - { - _logger.LogInformation($"豸{clientId}"); - var token = _simpleCacheService.Get(CacheConst.Cache_MqttClientUser + clientId);//ȡmqttͻIDӦûtoken - if (token == null) return;//ûtokenֱ˳ - //ȡredisеǰtoken - var tokenInfo = tokenInfos.Where(it => it.Token == token).FirstOrDefault(); - if (tokenInfo != null) - { - tokenInfo.ClientIds.Add(clientId);//ӵͻб - _simpleCacheService.HashAdd(CacheConst.Cache_UserToken, userId, tokenInfos);//Redis - } - } - else // - { - _logger.LogInformation($"豸{clientId}"); - //ȡǰͻIDڵtokenϢ - var tokenInfo = tokenInfos.Where(it => it.ClientIds.Contains(clientId)).FirstOrDefault(); - if (tokenInfo != null) - { - tokenInfo.ClientIds.RemoveWhere(it => it == clientId);//ӿͻбɾ - _simpleCacheService.HashAdd(CacheConst.Cache_UserToken, userId, tokenInfos);//Redis - } - } - } - } - }); - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Background/SimpleAdmin.Background.csproj b/api/SimpleAdmin/SimpleAdmin.Background/SimpleAdmin.Background.csproj deleted file mode 100644 index deb8159d1acb224a30b9768635b015a59d6b18f2..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Background/SimpleAdmin.Background.csproj +++ /dev/null @@ -1,47 +0,0 @@ - - - - net7.0;net6.0 - enable - enable - dotnet-SimpleAdmin.Background-97b50b23-4c51-4690-9027-da078c63136a - en-US - - - - - - - - - - - - - - - - - - - - - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - - - - - diff --git a/api/SimpleAdmin/SimpleAdmin.Background/TestWorker.cs b/api/SimpleAdmin/SimpleAdmin.Background/TestWorker.cs deleted file mode 100644 index 6620abaa3a775edb199d92a6712c9e3b44e49a5f..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Background/TestWorker.cs +++ /dev/null @@ -1,20 +0,0 @@ -using SimpleAdmin.Cache; - -namespace SimpleAdmin.Background; - -public class TestWorker : BackgroundService -{ - private readonly ILogger _logger; - private readonly ISimpleCacheService _simpleCacheService; - - public TestWorker(ILogger logger, ISimpleCacheService simpleCacheService) - { - _logger = logger; - this._simpleCacheService = simpleCacheService; - } - - protected override async Task ExecuteAsync(CancellationToken stoppingToken) - { - - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Cache.Development.json b/api/SimpleAdmin/SimpleAdmin.Cache/Cache.Development.json index a136f906aa0f2210192f117534107520ad3f3dc7..6f867d57a7ad9f17109d3dc28d49db827cb8a0b0 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Cache.Development.json +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Cache.Development.json @@ -1,7 +1,7 @@ { //缓存设置 "CacheSettings": { - "UseRedis": false, //启用redis + "UseRedis": true, //启用redis "RedisSettings": { "Address": "127.0.0.1:6379", //地址 "Password": "123456", //Redis服务密码 diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Const/CacheConst.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Const/CacheConst.cs deleted file mode 100644 index 2a47eef55f1f51c5d73100dd58da3372aa41b0c4..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Const/CacheConst.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace SimpleAdmin.Cache; - -/// -/// Redis常量 -/// -public class CacheConst -{ - /// - /// Redis Key前缀(可删除) - /// - public const string Cache_Prefix_Web = "SimpleAdminWeb:"; - - /// - /// Redis Key前缀(需要持久化,不随系统重启删除) - /// - public const string Cache_Prefix = "SimpleAdmin:"; - - /// - /// Redis Hash类型 - /// - public const string Cache_Hash = "Hash"; - - - /// - /// 用户Token缓存Key - /// - public const string Cache_UserToken = Cache_Prefix + "UserToken"; -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/GlobalUsing.cs b/api/SimpleAdmin/SimpleAdmin.Cache/GlobalUsing.cs index eefbe6ddcdcc76f16e370f20c9325692c06ba210..0b4bbe17a8970914af91df1ab1823b536b8effde 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/GlobalUsing.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/GlobalUsing.cs @@ -1,4 +1,14 @@ -global using Furion; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +global using MoYu; global using Masuit.Tools; global using Microsoft.AspNetCore.Builder; global using Microsoft.AspNetCore.Hosting; @@ -6,4 +16,4 @@ global using Microsoft.Extensions.DependencyInjection; global using NewLife.Caching; global using NewLife.Serialization; global using SimpleAdmin.Core; -global using SimpleRedis; \ No newline at end of file +global using SimpleRedis; diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Interface/ISimpleCacheHashService.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Interface/ISimpleCacheHashService.cs index 66496b76c22794766ed199306f686ab7aacee1da..5b3452c64530440c3e5c49e06f5386775802c759 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Interface/ISimpleCacheHashService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Interface/ISimpleCacheHashService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Cache; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Cache; /// /// 缓存服务 @@ -57,4 +67,4 @@ public partial interface ISimpleCacheService /// 键 /// 数据字典 IDictionary HashGetAll(string key); -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Interface/ISimpleCacheQueueService.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Interface/ISimpleCacheQueueService.cs new file mode 100644 index 0000000000000000000000000000000000000000..de157c7cef6e369105c3340edd9e0f3035459b3d --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Interface/ISimpleCacheQueueService.cs @@ -0,0 +1,108 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using NewLife.Caching.Queues; + +namespace SimpleAdmin.Cache; + +/// +/// 缓存服务 +/// +public partial interface ISimpleCacheService +{ + #region 普通队列 + + /// + /// 添加到队列 + /// + /// + /// 键 + /// 值数组 + /// 添加数量 + int AddQueue(string key, T[] value); + + /// + /// 添加到队列 + /// + /// + /// 键 + /// 值 + /// 添加数量 + int AddQueue(string key, T value); + + /// + /// 获取队列实例 + /// + /// + /// 键 + /// 队列实例 + RedisQueue GetRedisQueue(string key); + + /// + /// 从队列中获取数据 + /// + /// + /// 键 + /// 数量 + /// 数据列表 + List GetQueue(string key, int Count = 1); + + /// + /// 取一条数据 + /// + /// + /// 键 + /// 阻塞时间 + /// 数据 + T GetQueueOne(string key, int timeout = 1); + + /// + /// 异步取一条数据 + /// + /// + /// 键 + /// 阻塞时间 + /// 数据 + Task GetQueueOneAsync(string key, int timeout = 1); + + #endregion + + #region 延迟队列 + + /// + /// 添加一条数据到延迟队列 + /// + /// + /// 键 + /// 值 + /// 延迟时间 + /// 添加成功数量 + int AddDelayQueue(string key, T value, int delay); + + /// + /// 批量添加数据到延迟队列 + /// + /// + /// 键 + /// 值 + /// 延迟时间 + /// 添加成功数量 + int AddDelayQueue(string key, List value, int delay); + + /// + /// 获取延迟队列实例 + /// + /// + /// 键 + /// + RedisDelayQueue GetDelayQueue(string key); + + #endregion +} diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Interface/ISimpleCacheService.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Interface/ISimpleCacheService.cs index 5f82485f756c3d80c8b8fa4e13817b09c89be6a4..7299aedba7b5a8c57c41eb456063659d47755d25 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Interface/ISimpleCacheService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Interface/ISimpleCacheService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Cache; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Cache; /// /// 缓存服务 @@ -174,7 +184,8 @@ public partial interface ISimpleCacheService /// 锁过期时间,超过该时间如果没有主动释放则自动释放锁,必须整数秒,单位毫秒 /// 失败时是否抛出异常,如果不抛出异常,可通过返回null得知申请锁失败 /// - IDisposable AcquireLock(string key, int msTimeout, int msExpire, bool throwOnFailure); + IDisposable AcquireLock(string key, int msTimeout, int msExpire, + bool throwOnFailure); #endregion 事务 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Options/CacheSettingsOptions.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Options/CacheSettingsOptions.cs index 7756de996626ac789263e9f9041dfa4df92b16bf..380d26c25da4a98a0e5d2a4806497d37b7943987 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Options/CacheSettingsOptions.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Options/CacheSettingsOptions.cs @@ -1,4 +1,14 @@ -using Furion.ConfigurableOptions; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using MoYu.ConfigurableOptions; namespace SimpleAdmin.Cache; @@ -42,4 +52,4 @@ public class RedisSettings /// 是否每次启动都清空 /// public bool ClearRedis { get; set; } = false; -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheHashService.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheHashService.cs index 9721502e8abcea4004a053a80b76bc8ef7d80878..0b2f8fe5ce2c52c82ddd2c31e370f868797b5040 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheHashService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheHashService.cs @@ -1,10 +1,20 @@ -namespace SimpleAdmin.Cache; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Cache; /// /// /// 内存缓存 /// -public partial class MemoryCacheService : ISimpleCacheService +public partial class MemoryCacheService { /// public void HashAdd(string key, string hashKey, T value) @@ -54,14 +64,14 @@ public partial class MemoryCacheService : ISimpleCacheService /// public List HashGet(string key, params string[] fields) { - List list = new List(); + var list = new List(); //获取字典 var exist = _memoryCache.GetDictionary(key); foreach (var field in fields) { - if (exist.ContainsKey(field))//如果包含Key + if (exist.TryGetValue(field, out var value))//如果包含Key { - list.Add(exist[field]); + list.Add(value); } else { list.Add(default); } } @@ -85,4 +95,4 @@ public partial class MemoryCacheService : ISimpleCacheService var data = _memoryCache.GetDictionary(key); return data; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheQueueService.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheQueueService.cs new file mode 100644 index 0000000000000000000000000000000000000000..a1eff51ad51255cdff8f869eb53bee775903f22e --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheQueueService.cs @@ -0,0 +1,74 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using NewLife.Caching.Queues; + +namespace SimpleAdmin.Cache; + +/// +/// +/// 内存缓存 +/// +public partial class MemoryCacheService +{ + /// + public int AddQueue(string key, T[] value) + { + throw new NotImplementedException(); + } + + /// + public int AddQueue(string key, T value) + { + throw new NotImplementedException(); + } + + /// + public RedisQueue GetRedisQueue(string key) + { + throw new NotImplementedException(); + } + + /// + public List GetQueue(string key, int Count = 1) + { + throw new NotImplementedException(); + } + + /// + public T GetQueueOne(string key, int timeout = 1) + { + throw new NotImplementedException(); + } + + /// + public async Task GetQueueOneAsync(string key, int timeout = 1) + { + throw new NotImplementedException(); + } + + /// + public int AddDelayQueue(string key, T value, int delay) + { + throw new NotImplementedException(); + } + + /// + public int AddDelayQueue(string key, List value, int delay) + { + throw new NotImplementedException(); + } + + /// + public RedisDelayQueue GetDelayQueue(string key) + { + throw new NotImplementedException(); + } +} diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheService.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheService.cs index 908f820b8d3727111bfcaabe98260da2510ca2e6..40d9074e84f677f377254d3b2ecc24dced23718f 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Cache; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Cache; /// /// @@ -6,7 +16,7 @@ /// public partial class MemoryCacheService : ISimpleCacheService { - public readonly MemoryCache _memoryCache; + private readonly MemoryCache _memoryCache; public MemoryCacheService() { @@ -83,7 +93,7 @@ public partial class MemoryCacheService : ISimpleCacheService public IDictionary GetAll(IEnumerable keys) { IDictionary? result = default;//定义集合 - IDictionary? data = _memoryCache.GetAll(keys);//获取数据 + var data = _memoryCache.GetAll(keys);//获取数据 data.ForEach(it => { result.Add(it.Key, it.Value.ToObject());//遍历数据,格式化并加到新的数据集合 @@ -163,8 +173,7 @@ public partial class MemoryCacheService : ISimpleCacheService /// public bool TryGetValue(string key, out T value) { - var result = string.Empty; - _ = _memoryCache.TryGetValue(key, out result); + _ = _memoryCache.TryGetValue(key, out var result); value = result.ToObject(); return value == null; } @@ -210,10 +219,11 @@ public partial class MemoryCacheService : ISimpleCacheService } /// - public IDisposable AcquireLock(string key, int msTimeout, int msExpire, bool throwOnFailure) + public IDisposable AcquireLock(string key, int msTimeout, int msExpire, + bool throwOnFailure) { return _memoryCache.AcquireLock(key, msTimeout, msExpire, throwOnFailure); } #endregion 事务 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheHashService.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheHashService.cs index e9be27a35980ba30c402de979d4b63ad3e8a96bc..9b2d7c2f9e567c3347a4b42120e5fb4f413ba751 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheHashService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheHashService.cs @@ -1,11 +1,20 @@ -namespace SimpleAdmin.Cache; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Cache; /// /// /// Redis缓存 /// - -public partial class RedisCacheService : ISimpleCacheService +public partial class RedisCacheService { /// public void HashAdd(string key, string hashKey, T value) @@ -42,4 +51,4 @@ public partial class RedisCacheService : ISimpleCacheService { return _simpleRedis.HashGetAll(key); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheQueueService.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheQueueService.cs new file mode 100644 index 0000000000000000000000000000000000000000..116569c22f70ecb2ecfbc4e73f8d54e91002908d --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheQueueService.cs @@ -0,0 +1,74 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using NewLife.Caching.Queues; + +namespace SimpleAdmin.Cache; + +/// +/// +/// Redis缓存 +/// +public partial class RedisCacheService +{ + /// + public int AddQueue(string key, T[] value) + { + return _simpleRedis.AddQueue(key, value); + } + + /// + public int AddQueue(string key, T value) + { + return _simpleRedis.AddQueue(key, value); + } + + /// + public RedisQueue GetRedisQueue(string key) + { + return _simpleRedis.GetRedisQueue(key); + } + + /// + public List GetQueue(string key, int Count = 1) + { + return _simpleRedis.GetQueue(key, Count); + } + + /// + public T GetQueueOne(string key, int timeout = 1) + { + return _simpleRedis.GetQueueOne(key, timeout); + } + + /// + public async Task GetQueueOneAsync(string key, int timeout = 1) + { + return await _simpleRedis.GetQueueOneAsync(key, timeout); + } + + /// + public int AddDelayQueue(string key, T value, int delay) + { + return _simpleRedis.AddDelayQueue(key, value, delay); + } + + /// + public int AddDelayQueue(string key, List value, int delay) + { + return _simpleRedis.AddDelayQueue(key, value, delay); + } + + /// + public RedisDelayQueue GetDelayQueue(string key) + { + return _simpleRedis.GetDelayQueue(key); + } +} diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheService.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheService.cs index fda5ae26cec0d0a010003046c0301d25f93504cd..efd873bc57e0577b13d2aa9620a44af93d0482d4 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheService.cs @@ -1,4 +1,16 @@ -namespace SimpleAdmin.Cache; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using NewLife.Caching.Queues; + +namespace SimpleAdmin.Cache; /// /// @@ -10,7 +22,7 @@ public partial class RedisCacheService : ISimpleCacheService public RedisCacheService(ISimpleRedis simpleRedis) { - this._simpleRedis = simpleRedis; + _simpleRedis = simpleRedis; } #region 普通操作 @@ -51,6 +63,7 @@ public partial class RedisCacheService : ISimpleCacheService return _simpleRedis.GetFullRedis().GetExpire(key); } + /// public bool ContainsKey(string key) { @@ -178,10 +191,11 @@ public partial class RedisCacheService : ISimpleCacheService } /// - public IDisposable AcquireLock(string key, int msTimeout, int msExpire, bool throwOnFailure) + public IDisposable AcquireLock(string key, int msTimeout, int msExpire, + bool throwOnFailure) { return _simpleRedis.GetFullRedis().AcquireLock(key, msTimeout, msExpire, throwOnFailure); } #endregion 事务 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/SimpleAdmin.Cache.csproj b/api/SimpleAdmin/SimpleAdmin.Cache/SimpleAdmin.Cache.csproj index 3a0657498888dcaccf798a2fa204d96d53da231f..afe1acd7874e581a7b5d6a39842a8921734a4e8e 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/SimpleAdmin.Cache.csproj +++ b/api/SimpleAdmin/SimpleAdmin.Cache/SimpleAdmin.Cache.csproj @@ -1,28 +1,24 @@  - - net7.0;net6.0 - 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 - SimpleAdmin.Cache.xml - enable - enable - + + + - - - + + + - - - + + + PreserveNewest + + + PreserveNewest + + - - - PreserveNewest - - - PreserveNewest - - + + + diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/SimpleAdmin.Cache.xml b/api/SimpleAdmin/SimpleAdmin.Cache/SimpleAdmin.Cache.xml index 9c773d9103d75497a83a456d9d03f68215c83312..8a0fa49616adad8732d8590b8aec4fd4f9076412 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/SimpleAdmin.Cache.xml +++ b/api/SimpleAdmin/SimpleAdmin.Cache/SimpleAdmin.Cache.xml @@ -4,32 +4,10 @@ SimpleAdmin.Cache - - - Redis常量 - - - - - Redis Key前缀(可删除) - - - - - Redis Key前缀(需要持久化,不随系统重启删除) - - - - - Redis Hash类型 - - - + - 用户Token缓存Key + 缓存服务 - - 缓存服务 @@ -90,6 +68,87 @@ 数据字典 + + + 添加到队列 + + + 键 + 值数组 + 添加数量 + + + + 添加到队列 + + + 键 + 值 + 添加数量 + + + + 获取队列实例 + + + 键 + 队列实例 + + + + 从队列中获取数据 + + + 键 + 数量 + 数据列表 + + + + 取一条数据 + + + 键 + 阻塞时间 + 数据 + + + + 异步取一条数据 + + + 键 + 阻塞时间 + 数据 + + + + 添加一条数据到延迟队列 + + + 键 + 值 + 延迟时间 + 添加成功数量 + + + + 批量添加数据到延迟队列 + + + 键 + 值 + 延迟时间 + 添加成功数量 + + + + 获取延迟队列实例 + + + 键 + + 是否包含缓存项 @@ -296,6 +355,10 @@ 内存缓存 + + + 内存缓存 + @@ -315,6 +378,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -402,6 +492,10 @@ Redis缓存 + + + Redis缓存 + @@ -421,6 +515,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Startup.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Startup.cs index 5346ffb1d98bc2a42b71cdef193f160d4f106d96..0b20d43387216068b38faf2a3f35b7329993c052 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Startup.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Startup.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Cache; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Cache; /// /// AppStartup启动类 @@ -42,7 +52,7 @@ public class Startup : AppStartup { var redis = App.GetService();//获取redis服务 //删除redis的key - redis.DelByPattern(CacheConst.Cache_Prefix_Web); + redis.DelByPattern(CacheConst.CACHE_PREFIX_WEB); } } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/BatchEditAttribute.cs b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/BatchEditAttribute.cs deleted file mode 100644 index 0c9ad30b6a0101bc916fc7a1265af4c1ea7dea8f..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/BatchEditAttribute.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace SimpleAdmin.Core; - -/// -/// 批量更新 -/// -public class BatchEditAttribute : Attribute -{ -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/CodeGenAttribute.cs b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/CodeGenAttribute.cs index 616a15d46e088a4a11ee5a33b417655fe4dc07e8..687d18b6480b56f4da881f99dd4b79bbdc6a8e3d 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/CodeGenAttribute.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/CodeGenAttribute.cs @@ -1,8 +1,18 @@ -namespace SimpleAdmin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 代码生成 /// public class CodeGenAttribute : Attribute { -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/IgnoreInitTableAttribute.cs b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/IgnoreInitTableAttribute.cs index b1a257fe83eb03c0b129d78d7a3b2b6fbc0ad79d..be494f498499e276b8d9dba11f03361cd02b97da 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/IgnoreInitTableAttribute.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/IgnoreInitTableAttribute.cs @@ -1,9 +1,18 @@ -namespace SimpleAdmin.Core +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; + +/// +/// 忽略初始化表 +/// +public class IgnoreInitTableAttribute : Attribute { - /// - /// 忽略初始化表 - /// - public class IgnoreInitTableAttribute : Attribute - { - } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/IgnoreSeedDataAttribute.cs b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/IgnoreSeedDataAttribute.cs index 015c670696b9d41b9c6b82ad0a3888d691151fd0..5935b0f71cf882dd2cc8ca62b3546c420ed8372a 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/IgnoreSeedDataAttribute.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/IgnoreSeedDataAttribute.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 种子数据忽略新增 @@ -12,4 +22,4 @@ public class IgnoreSeedDataAddAttribute : Attribute /// public class IgnoreSeedDataUpdateAttribute : Attribute { -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/RolePermissionAttribute.cs b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/RolePermissionAttribute.cs index 47b1a596cd159f5ebd591bb4e48b23cb72e6354b..c9d3cad781e6ceb4b28002a1064a9de1c3d7982e 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/RolePermissionAttribute.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/RolePermissionAttribute.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 需要角色授权权限 @@ -12,4 +22,4 @@ public class RolePermissionAttribute : Attribute /// public class IgnoreRolePermissionAttribute : Attribute { -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/SuperAdminAttribute.cs b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/SuperAdminAttribute.cs index 86f989376f850a33f7d5b4e97c836d2a64abc518..9e4f6cceced46d65d77e6e0e4d51ecef3c9b7d10 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/SuperAdminAttribute.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/SuperAdminAttribute.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 管理员才能访问特性 @@ -12,4 +22,4 @@ public class SuperAdminAttribute : Attribute /// public class IgnoreSuperAdminAttribute : Attribute { -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/ValidationAttribute/IdNotNull.cs b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/ValidationAttribute/IdNotNull.cs index e80692e5c5e466508dbfe107aa88354366fa4ad8..35e5c506705c71709ff84e4fe8cc7fa50bed0cdf 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/ValidationAttribute/IdNotNull.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/ValidationAttribute/IdNotNull.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 验证Id不能为 空 @@ -9,6 +19,19 @@ public class IdNotNull : ValidationAttribute { if (value.ToLong() > 0 || !string.IsNullOrEmpty(value.ToString())) return true; - else return false; + return false; + } +} + +/// +/// 验证Id列表不能为空 +/// +public class IdsNotNull : ValidationAttribute +{ + public override bool IsValid(object value) + { + if (value is List { Count: 0 }) + return false; + return true; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BaseFileInput.cs b/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BaseFileInput.cs index d30e9cc2fb05b815c152cc71d48d70dcc421ef8e..e5976672577d6246713f38992aaaec764bb51fc7 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BaseFileInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BaseFileInput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 文件上传输入参数 @@ -10,4 +20,4 @@ public class BaseFileInput /// [Required(ErrorMessage = "文件不能为空")] public IFormFile? File { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BaseIdInput.cs b/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BaseIdInput.cs index eeb998bd2758b23e2cef2c6c8fd3fc26a8f6ea15..a47dab85a2738ea393c54fb9777ece67d040df3a 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BaseIdInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BaseIdInput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 主键Id输入参数 @@ -13,6 +23,15 @@ public class BaseIdInput public virtual long Id { get; set; } } +public class BaseIdListInput +{ + /// + /// 主键Id列表 + /// + [IdsNotNull(ErrorMessage = "IdList不能为空")] + public List Ids { get; set; } = new List(); +} + /// /// Id列表输入 /// @@ -20,4 +39,4 @@ public class IdListInput { [Required(ErrorMessage = "IdList不能为空")] public List? IdList { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BasePageInput.cs b/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BasePageInput.cs index beb16e6544af5c1c3828d94bebcc8580bc8c1c1f..8eb2057b25ebb116862ee80ae809c2994fa1b437 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BasePageInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BasePageInput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 全局分页查询输入参数 @@ -9,14 +19,14 @@ public class BasePageInput : IValidatableObject /// 当前页码 /// [DataValidation(ValidationTypes.Numeric)] - public virtual int Current { get; set; } = 1; + public virtual int PageNum { get; set; } = 1; /// /// 每页条数 /// [Range(1, 100, ErrorMessage = "页码容量超过最大限制")] [DataValidation(ValidationTypes.Numeric)] - public virtual int Size { get; set; } = 10; + public virtual int PageSize { get; set; } = 10; /// /// 排序字段 @@ -50,12 +60,11 @@ public class BasePageInput : IValidatableObject var fields = SortField.Split(" "); if (fields.Length > 1) { - yield return new ValidationResult($"排序字段错误", new[] + yield return new ValidationResult("排序字段错误", new[] { nameof(SortField) }); } } - yield break; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/BaseOutput/BaseSelectorOutput.cs b/api/SimpleAdmin/SimpleAdmin.Core/BaseOutput/BaseSelectorOutput.cs index faffb792fc1b2d464912747b637832da6613ade3..ad0bf49fcfd7fc42ffc1bd1f4881e4937f886cf9 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/BaseOutput/BaseSelectorOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/BaseOutput/BaseSelectorOutput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 基础选择器输出 @@ -14,4 +24,4 @@ public class BaseSelectorOutput /// 显示文本 /// public string Label { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Components/GzipCompressionComponent.cs b/api/SimpleAdmin/SimpleAdmin.Core/Components/GzipCompressionComponent.cs index 9376d4286d4fbc33c522c8d97a46d134e5faec27..0366d6fe2a9e4e1854265b18a07ba49567618a94 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Components/GzipCompressionComponent.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Components/GzipCompressionComponent.cs @@ -1,5 +1,12 @@ -using Microsoft.AspNetCore.ResponseCompression; -using System.IO.Compression; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Core; @@ -19,8 +26,8 @@ public sealed class GzipCompressionComponent : IServiceComponent options.Providers.Add(); options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(new[] { - "text/html; charset=utf-8", "application/xhtml+xml", "application/atom+xml", "image/svg+xml" + "text/html; charset=utf-8", "application/xhtml+xml", "application/atom+xml", "image/svg+xml" }); }); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingConsoleComponent.cs b/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingConsoleComponent.cs index 745846a20dddc012135ad6e440f01c1e4f9220a7..bdc2bdf81b5a764a3e49838a131fc53811bce070 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingConsoleComponent.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingConsoleComponent.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 日志写入文件的组件 @@ -12,7 +22,7 @@ public sealed class LoggingConsoleComponent : IServiceComponent { services.AddConsoleFormatter(options => { - options.MessageFormat = (logMsg) => + options.MessageFormat = logMsg => { //如果不是LoggingMonitor日志或者开启了格式化才格式化 if (logMsg.LogName != _monitorName && _loggingSetting.MessageFormat) @@ -28,12 +38,10 @@ public sealed class LoggingConsoleComponent : IServiceComponent } return stringBuilder.ToString(); } - else - { - return logMsg.Message; - } + return logMsg.Message; }; - options.WriteHandler = (logMsg, scopeProvider, writer, fmtMsg, opt) => + options.WriteHandler = (logMsg, scopeProvider, writer, + fmtMsg, opt) => { if (logMsg.LogName == _monitorName && !_loggingSetting.Monitor.Console) return; var consoleColor = ConsoleColor.White; @@ -59,13 +67,10 @@ public sealed class LoggingConsoleComponent : IServiceComponent public static class TextWriterExtensions { - private const string DefaultForegroundColor = "\x1B[39m\x1B[22m"; - private const string DefaultBackgroundColor = "\x1B[49m"; + private const string DEFAULT_FOREGROUND_COLOR = "\x1B[39m\x1B[22m"; + private const string DEFAULT_BACKGROUND_COLOR = "\x1B[49m"; - public static void WriteWithColor( - this TextWriter textWriter, - string message, - ConsoleColor? background, + public static void WriteWithColor(this TextWriter textWriter, string message, ConsoleColor? background, ConsoleColor? foreground) { // Order: @@ -91,11 +96,11 @@ public static class TextWriterExtensions if (foregroundColor != null) { - textWriter.Write(DefaultForegroundColor); + textWriter.Write(DEFAULT_FOREGROUND_COLOR); } if (backgroundColor != null) { - textWriter.Write(DefaultBackgroundColor); + textWriter.Write(DEFAULT_BACKGROUND_COLOR); } } @@ -119,7 +124,7 @@ public static class TextWriterExtensions ConsoleColor.Cyan => "\x1B[1m\x1B[36m", ConsoleColor.White => "\x1B[1m\x1B[37m", - _ => DefaultForegroundColor + _ => DEFAULT_FOREGROUND_COLOR }; } @@ -136,7 +141,7 @@ public static class TextWriterExtensions ConsoleColor.DarkCyan => "\x1B[46m", ConsoleColor.Gray => "\x1B[47m", - _ => DefaultBackgroundColor + _ => DEFAULT_BACKGROUND_COLOR }; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingFileComponent.cs b/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingFileComponent.cs index 54c25107a7bbbc80c9c8e70fc122a119a8fa58a1..990d0b30004fba9bfa6bc2985c15bc2d13bf984e 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingFileComponent.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingFileComponent.cs @@ -1,4 +1,16 @@ -using Microsoft.Extensions.Logging; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using System.Runtime.InteropServices; namespace SimpleAdmin.Core; @@ -10,7 +22,6 @@ public sealed class LoggingFileComponent : IServiceComponent private readonly LoggingSetting _loggingSetting = App.GetConfig("Logging", true); private readonly string _monitorName = "System.Logging.LoggingMonitor"; - public void Load(IServiceCollection services, ComponentContext componentContext) { //获取默认日志等级 @@ -18,7 +29,7 @@ public sealed class LoggingFileComponent : IServiceComponent //获取最大日志等级,默认Error var maxLevel = (LogLevel)Enum.Parse(typeof(LogLevel), _loggingSetting.LogLevel.MaxLevel); //获取程序根目录 - var rootPath = App.HostEnvironment.ContentRootPath; + // var rootPath = App.HostEnvironment.ContentRootPath; //遍历日志等级 foreach (LogLevel level in Enum.GetValues(typeof(LogLevel))) { @@ -28,7 +39,7 @@ public sealed class LoggingFileComponent : IServiceComponent //每天创建一个日志文件 services.AddLogging(builder => { - var fileName = "logs/" + level.ToString() + "/{0:yyyy}-{0:MM}-{0:dd}.log"; + var fileName = "logs/" + level + "/{0:yyyy}-{0:MM}-{0:dd}.log"; builder.AddFile(fileName, options => { SetLogOptions(options, level);//日志格式化 @@ -50,9 +61,9 @@ public sealed class LoggingFileComponent : IServiceComponent if (logLevel != null)//如果日志等级不为空 { //过滤日志等级 - options.WriteFilter = (logMsg) => + options.WriteFilter = logMsg => { - //如果配置不写入mongitor日志和日志名称为System.Logging.LoggingMonitor + //如果配置不写入monitor日志和日志名称为System.Logging.LoggingMonitor if (!_loggingSetting.Monitor.Write && logMsg.LogName == _monitorName) return false; return logMsg.LogLevel == logLevel; @@ -61,13 +72,16 @@ public sealed class LoggingFileComponent : IServiceComponent //定义日志文件名 options.FileNameRule = fileName => { - return rootPath + "\\" + string.Format(fileName, DateTime.UtcNow); + var pathSeparator = @"\"; + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + pathSeparator = "/";//为linux或bsd时修改路径 + return rootPath + pathSeparator + string.Format(fileName, DateTime.UtcNow); }; options.FileSizeLimitBytes = 500000 * 1024;//日志最大500M if (_loggingSetting.MessageFormat) { //日志内容格式化 - options.MessageFormat = (logMsg) => + options.MessageFormat = logMsg => { var stringBuilder = new StringBuilder(); stringBuilder.AppendLine("【日志级别】:" + logMsg.LogLevel); @@ -82,4 +96,4 @@ public sealed class LoggingFileComponent : IServiceComponent }; } } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Const/CacheConst.cs b/api/SimpleAdmin/SimpleAdmin.Core/Const/CacheConst.cs new file mode 100644 index 0000000000000000000000000000000000000000..cf526aff73e10f156a2dad8bd90cc3f2bb4412b3 --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.Core/Const/CacheConst.cs @@ -0,0 +1,47 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; + +/// +/// Redis常量 +/// +public class CacheConst +{ + /// + /// Redis Key前缀(可删除) + /// + public const string CACHE_PREFIX_WEB = "SimpleAdminWeb:"; + + /// + /// Redis Key前缀(需要持久化,不随系统重启删除) + /// + public const string CACHE_PREFIX = "SimpleAdmin:"; + + /// + /// Redis Hash类型 + /// + public const string CACHE_HASH = "Hash"; + + /// + /// 用户Token缓存Key + /// + public const string CACHE_USER_TOKEN = CACHE_PREFIX + "UserToken"; + + + #region 消息中心队列key + + /// + /// 通知消息队列 + /// + public const string CACHE_NOTIFICATION = CACHE_PREFIX + "MsgNotification"; + + #endregion +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Const/ClaimConst.cs b/api/SimpleAdmin/SimpleAdmin.Core/Const/ClaimConst.cs index 81e6a6bd6297d4af70b8a6e399448aa21d0d8ed9..2a05cd09243051382f7af205fdeef52941103e69 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Const/ClaimConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Const/ClaimConst.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 授权用户常量 @@ -8,25 +18,27 @@ public class ClaimConst /// /// 用户Id /// - public const string UserId = "UserId"; + public const string USER_ID = "USER_ID"; /// /// 账号 /// - public const string Account = "Account"; + public const string ACCOUNT = "ACCOUNT"; /// /// 名称 /// - public const string Name = "Name"; + public const string NAME = "NAME"; /// /// 账号类型 /// - public const string IsSuperAdmin = "IsSuperAdmin"; + public const string IS_SUPER_ADMIN = "IS_SUPER_ADMIN"; /// /// 组织机构Id /// - public const string OrgId = "OrgId"; -} \ No newline at end of file + public const string ORG_ID = "ORG_ID"; + + public const string TENANT_ID = "TENANT_ID"; +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Const/MqttConst.cs b/api/SimpleAdmin/SimpleAdmin.Core/Const/MqttConst.cs new file mode 100644 index 0000000000000000000000000000000000000000..e30a351045788d13bbd4f1d6294480dc623dcffe --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.Core/Const/MqttConst.cs @@ -0,0 +1,40 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; + +public class MqttConst +{ + /// + /// mqtt认证登录信息key + /// + public const string CACHE_MQTT_CLIENT_USER = CacheConst.CACHE_PREFIX_WEB + "MqttClientUser:"; + + /// + /// mqtt主题前缀 + /// + public const string MQTT_TOPIC_PREFIX = "SimpleAdmin/"; + + + /// + /// 登出 + /// + public const string MQTT_MESSAGE_LOGIN_OUT = "LoginOut"; + + /// + /// 新消息 + /// + public const string MQTT_MESSAGE_NEW = "NewMessage"; + + /// + /// 修改密码 + /// + public const string MQTT_MESSAGE_UPDATE_PASSWORD = "UpdatePassword"; +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Const/SimpleAdminConst.cs b/api/SimpleAdmin/SimpleAdmin.Core/Const/SimpleAdminConst.cs index 60e78c14c4fc33bb291659a7a95a96db72ed134a..74e3e7d7c968b0d9329a5ab1b4c9916535727bed 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Const/SimpleAdminConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Const/SimpleAdminConst.cs @@ -1,67 +1,19 @@ -namespace SimpleAdmin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; public class SimpleAdminConst { - #region 操作 - - /// - /// 添加操作 - /// - public const string Add = "添加"; - - /// - /// 编辑操作 - /// - public const string Edit = "编辑"; - - /// - /// 启用操作 - /// - public const string Enable = "启用"; - - /// - /// 禁用操作 - /// - public const string Disable = "禁用"; - - /// - /// 重置密码操作 - /// - public const string ResestPwd = "重置密码"; - - /// - /// 用户授权操作 - /// - public const string GrantRole = "授权"; - - #endregion 操作 - - #region 别称 - - /// - /// 组织 - /// - public const string SysOrg = "组织"; - - /// - /// 机构 - /// - public const string BizOrg = "机构"; - - /// - /// 职位 - /// - public const string SysPos = "职位"; - - /// - /// 岗位 - /// - public const string BizPos = "岗位"; - - #endregion 别称 - /// /// 0 /// - public const int Zero = 0; -} \ No newline at end of file + public const int ZERO = 0; +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Core.Development.json b/api/SimpleAdmin/SimpleAdmin.Core/Core.Development.json index 96cbe770b85363e693be71d16966443f9c39867c..da69914c705fa08a260a506d20373cd641539d92 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Core.Development.json +++ b/api/SimpleAdmin/SimpleAdmin.Core/Core.Development.json @@ -22,4 +22,4 @@ "Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware": "Information" } } -} +} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Core.Production.json b/api/SimpleAdmin/SimpleAdmin.Core/Core.Production.json index a3c26d33aeb78e0c03e5b21d18fed3935c008321..33595b5ef2d270382c95a26e483f3781105b1371 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Core.Production.json +++ b/api/SimpleAdmin/SimpleAdmin.Core/Core.Production.json @@ -22,4 +22,4 @@ "Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware": "Information" } } -} +} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Dto/MqttMessage.cs b/api/SimpleAdmin/SimpleAdmin.Core/Dto/MqttMessage.cs index a12464b64740885d4dcdb3c8e42d1c1ce2113923..7ef5b18ca76c8c674e307391b5ed811c71402f31 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Dto/MqttMessage.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Dto/MqttMessage.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// mqtt消息 @@ -13,10 +23,26 @@ public class MqttMessage /// /// 消息内容 /// - public object Data { get; set; } + public MessageData Data { get; set; } /// /// 时间 /// public DateTime DetTime { get; set; } = DateTime.Now; -} \ No newline at end of file +} + +/// +/// 消息格式 +/// +public class MessageData +{ + /// + /// 主题 + /// + public string Subject { get; set; } + + /// + /// 内容 + /// + public string Content { get; set; } +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Dto/TokenInfo.cs b/api/SimpleAdmin/SimpleAdmin.Core/Dto/TokenInfo.cs index a333bb6f7ecd18b5ebe7d6482a919f94320be152..caabfae7fdaf33fae0e0af56438fe76de7a7376e 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Dto/TokenInfo.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Dto/TokenInfo.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// Token信息 @@ -44,4 +54,4 @@ public class TokenInfo /// token剩余有效期百分比 /// public double TokenRemainPercent { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/AuthDeviceTypeEnum.cs b/api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/AuthDeviceTypeEnum.cs new file mode 100644 index 0000000000000000000000000000000000000000..a3de0ec5571e412beaaaa3f87038d3eaf492547c --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/AuthDeviceTypeEnum.cs @@ -0,0 +1,35 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; + +/// +/// 登录设备类型枚举 +/// +public enum AuthDeviceTypeEnum +{ + /// + /// PC端 + /// + [Description("PC端")] + PC, + + /// + /// 移动端 + /// + [Description("移动端")] + APP, + + /// + /// 小程序 + /// + [Description("小程序")] + MINI +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/AuthDeviceTypeEumu.cs b/api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/AuthDeviceTypeEumu.cs deleted file mode 100644 index 3f30a3cfdb7447804d72bebdf5d77f2c102cd280..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/AuthDeviceTypeEumu.cs +++ /dev/null @@ -1,25 +0,0 @@ -namespace SimpleAdmin.Core; - -/// -/// 登录设备类型枚举 -/// -public enum AuthDeviceTypeEumu -{ - /// - /// PC端 - /// - [Description("PC端")] - PC, - - /// - /// 移动端 - /// - [Description("移动端")] - APP, - - /// - /// 小程序 - /// - [Description("小程序")] - MINI -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/LoginClientTypeEnum.cs b/api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/LoginClientTypeEnum.cs index fa210a1d364ddc3732cea1ca8ac9fb38d520ec29..b24ac3ecd2706d979f8b1667020b67e987c059d2 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/LoginClientTypeEnum.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/LoginClientTypeEnum.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 登录端类型枚举 @@ -16,4 +26,4 @@ public enum LoginClientTypeEnum /// [Description("C端")] C -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Enum/ErrorCodeEnum.cs b/api/SimpleAdmin/SimpleAdmin.Core/Enum/ErrorCodeEnum.cs index ff9d92fcfd087388040f13e36d84d86d2d4f21a7..7000797fad944abab4e4750f615f76cc0c88e13d 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Enum/ErrorCodeEnum.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Enum/ErrorCodeEnum.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 通用错误码 @@ -34,5 +44,5 @@ public enum ErrorCodeEnum /// 没有权限 /// [ErrorCodeItemMetadata("没有权限")] - A0004, -} \ No newline at end of file + A0004 +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Extension/LinqExtension.cs b/api/SimpleAdmin/SimpleAdmin.Core/Extension/LinqExtension.cs index 4ef2fbe7fb848d76e2cacaf0bfb44e71bd6ce640..59aa4c87775d69a2f660018d5f9dabb3767e5a9d 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Extension/LinqExtension.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Extension/LinqExtension.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core.Extension; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core.Extension; /// /// Linq扩展 @@ -11,10 +21,10 @@ public static class LinqExtension /// /// /// 第一个列表 - /// 第二个列表 + /// 第二个列表 /// - public static bool ContainsAll(this List first, List secend) + public static bool ContainsAll(this List first, List? second) { - return secend.All(s => first.Any(f => f.Equals(s))); + return second.All(s => first.Any(f => f.Equals(s))); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Extension/ObjectExtension.cs b/api/SimpleAdmin/SimpleAdmin.Core/Extension/ObjectExtension.cs index 95158baeee77cd4ddff79eb28a766296cc4d2d56..01123e8a751df64c56048548af3f9ce6c99f3ca9 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Extension/ObjectExtension.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Extension/ObjectExtension.cs @@ -1,47 +1,53 @@ -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 -namespace SimpleAdmin.Core +namespace SimpleAdmin.Core; + +/// +/// object拓展 +/// +public static class ObjectExtension { /// - /// object拓展 + /// json字符串序列化 /// - public static class ObjectExtension + /// + /// + public static object ToObject(this string json) { - /// - /// json字符串序列化 - /// - /// - /// - public static object ToObject(this string json) - { - return string.IsNullOrEmpty(json) ? null : JsonConvert.DeserializeObject(json); - } + return string.IsNullOrEmpty(json) ? null : JsonConvert.DeserializeObject(json); + } - /// - /// json字符串序列化 - /// - /// - /// - /// - public static T ToObject(this string json) + /// + /// json字符串序列化 + /// + /// + /// + /// + public static T ToObject(this string json) + { + if (json != null) { - if (json != null) - { - json = json.Replace(" ", ""); - return JsonConvert.DeserializeObject(json); - } - else return default; + json = json.Replace(" ", ""); + return JsonConvert.DeserializeObject(json); } + return default; + } - /// - /// json字符串序列化 - /// - /// - /// - public static JObject ToJObject(this string json) - { - return json == null ? JObject.Parse("{}") : JObject.Parse(json.Replace(" ", "")); - } + /// + /// json字符串序列化 + /// + /// + /// + public static JObject ToJObject(this string json) + { + return json == null ? JObject.Parse("{}") : JObject.Parse(json.Replace(" ", "")); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/GlobalUsings.cs b/api/SimpleAdmin/SimpleAdmin.Core/GlobalUsings.cs index 321abfb1ff4095a9ca877bda52ab8ea79df77f02..47848d48fe5b61f9cc0f328ad0d6d838b9b4f91c 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/GlobalUsings.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/GlobalUsings.cs @@ -1,13 +1,24 @@ -global using Furion; -global using Furion.DataValidation; -global using Furion.DependencyInjection; -global using Furion.FriendlyException; -global using Furion.Logging; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +global using MoYu; +global using MoYu.DataValidation; +global using MoYu.DependencyInjection; +global using MoYu.FriendlyException; +global using MoYu.Logging; global using Microsoft.AspNetCore.Builder; global using Microsoft.AspNetCore.Hosting; global using Microsoft.AspNetCore.Http; global using Microsoft.AspNetCore.Mvc; global using Microsoft.Extensions.DependencyInjection; +global using Microsoft.Extensions.Logging; global using System; global using System.Collections.Generic; global using System.ComponentModel; @@ -17,4 +28,25 @@ global using System.Linq; global using System.Text; global using System.Threading.Tasks; global using Yitter.IdGenerator; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using Microsoft.AspNetCore.ResponseCompression; +global using System.IO.Compression; +global using Newtonsoft.Json; +global using Newtonsoft.Json.Linq; +global using MoYu.UnifyResult; +global using Microsoft.AspNetCore.Mvc.Filters; +global using Lazy.Captcha.Core; +global using Lazy.Captcha.Core.Generator.Image; +global using Lazy.Captcha.Core.Generator.Image.Option; +global using Org.BouncyCastle.Utilities.Encoders; +global using Org.BouncyCastle.Crypto.Digests; +global using Org.BouncyCastle.Crypto.Generators; +global using Org.BouncyCastle.Crypto.Parameters; +global using Org.BouncyCastle.Math; +global using Org.BouncyCastle.Math.EC; +global using Org.BouncyCastle.Security; +global using SkiaSharp; +global using System.Drawing; +global using System.Drawing.Drawing2D; +global using ICSharpCode.SharpZipLib.Checksum; +global using ICSharpCode.SharpZipLib.Zip; +global using System.Net; diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Options/BaseOptions.cs b/api/SimpleAdmin/SimpleAdmin.Core/Options/BaseOptions.cs index 54643b95f53ab6565227034aaff5c971dccdc4fc..2ab498878c0c13bb3e8a993509245f1ab8fe2e0b 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Options/BaseOptions.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Options/BaseOptions.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 默认业务配置 @@ -14,4 +24,4 @@ public class BaseOptions /// 初始化数据 /// public bool InitSeedData { get; set; } = false; -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Options/LoggingSetting.cs b/api/SimpleAdmin/SimpleAdmin.Core/Options/LoggingSetting.cs index b8f0ebb8f92f6ec81abe80879868b6bfcc0fe604..5165f2f5d6577b2216593fc791ffbcd4ab2d61ac 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Options/LoggingSetting.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Options/LoggingSetting.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 日志配置 @@ -15,7 +25,6 @@ public class LoggingSetting /// public bool MessageFormat { get; set; } - /// /// 日志等级 /// @@ -37,7 +46,6 @@ public class LoggingSetting public bool Console { get; set; } } - /// /// 日志等级 /// @@ -53,4 +61,4 @@ public class LoggingSetting /// public string MaxLevel { get; set; } = "Error"; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.csproj b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.csproj index 4fb1c11823539daa54985e480096c6fbb0297b94..95acda5db2d0790ae630fc4bf36f7d298ea4117b 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.csproj +++ b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.csproj @@ -1,37 +1,29 @@  - - net7.0;net6.0 - 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 - SimpleAdmin.Core.xml - enable - enable - + + + + + + + + + + + + + - - - - - - - - - + - - - - - - - - - PreserveNewest - - - PreserveNewest - - + + + PreserveNewest + + + PreserveNewest + + \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml index 10d5f4f55b6fdf36819e11a148f871f3101c36dc..fa27763ca23a3b1d7cba3202cb333418bb17c670 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml +++ b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml @@ -4,11 +4,6 @@ SimpleAdmin.Core - - - 批量更新 - - 代码生成 @@ -54,6 +49,11 @@ 验证Id不能为 空 + + + 验证Id列表不能为空 + + 文件上传输入参数 @@ -74,6 +74,11 @@ 主键Id + + + 主键Id列表 + + Id列表输入 @@ -84,12 +89,12 @@ 全局分页查询输入参数 - + 当前页码 - + 每页条数 @@ -139,94 +144,99 @@ 日志写入文件的组件 - + 日志格式化 - + - 授权用户常量 + Redis常量 - + - 用户Id + Redis Key前缀(可删除) - + - 账号 + Redis Key前缀(需要持久化,不随系统重启删除) - + - 名称 + Redis Hash类型 - + - 账号类型 + 用户Token缓存Key - + - 组织机构Id + 通知消息队列 - + - 添加操作 + 授权用户常量 - + - 编辑操作 + 用户Id - + - 启用操作 + 账号 - + - 禁用操作 + 名称 - + - 重置密码操作 + 账号类型 - + - 用户授权操作 + 组织机构Id - + - 组织 + mqtt认证登录信息key - + - 机构 + mqtt主题前缀 - + - 职位 + 登出 - + - 岗位 + 新消息 - + + + 修改密码 + + + 0 @@ -251,6 +261,21 @@ 时间 + + + 消息格式 + + + + + 主题 + + + + + 内容 + + Token信息 @@ -296,22 +321,22 @@ token剩余有效期百分比 - + 登录设备类型枚举 - + PC端 - + 移动端 - + 小程序 @@ -372,7 +397,7 @@ 第一个列表 - 第二个列表 + 第二个列表 @@ -508,7 +533,7 @@ 规范化RESTful风格返回值 - + 异常返回 @@ -524,7 +549,7 @@ - + 验证失败返回 @@ -532,7 +557,7 @@ - + 状态码响应拦截 @@ -541,7 +566,7 @@ - + 返回 RESTful 风格结果集 @@ -602,7 +627,7 @@ 验证码数 长度 - 高度 + 高度 字体大小 类型 0:数字 1:字符 2:计算 @@ -1047,21 +1072,21 @@ base64转bitmap - + - + base64转bitmap - + base64转image格式 - + diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Startup.cs b/api/SimpleAdmin/SimpleAdmin.Core/Startup.cs index 6e1baea6ee90a8675a72a5d868bb13adb217627b..32b127f39af90dd57207226d182a5f817c72a19f 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Startup.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Startup.cs @@ -1,4 +1,16 @@ -namespace SimpleAdmin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using SimpleAdmin.Core.Utils; + +namespace SimpleAdmin.Core; /// /// AppStartup启动类 @@ -21,4 +33,4 @@ public class Startup : AppStartup public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/UnifyResult/SimpleAdminResult.cs b/api/SimpleAdmin/SimpleAdmin.Core/UnifyResult/SimpleAdminResult.cs index 90a68f6b04b359662578adf64f99520967c3f5e0..9ac82d55b2ae3c414998b8d1cc8d98b4ac83291f 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/UnifyResult/SimpleAdminResult.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/UnifyResult/SimpleAdminResult.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 全局返回结果 @@ -30,4 +40,4 @@ public class SimpleAdminResult /// 时间 /// public DateTime Time { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/UnifyResult/SimpleAdminResultProvider.cs b/api/SimpleAdmin/SimpleAdmin.Core/UnifyResult/SimpleAdminResultProvider.cs index a81cca819ccdea1e023c5f97bfb630dbedadca9b..ca38d35f121ace057f4c84e594e0a8d5fcc77a9a 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/UnifyResult/SimpleAdminResultProvider.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/UnifyResult/SimpleAdminResultProvider.cs @@ -1,14 +1,28 @@ -using Furion.UnifyResult; -using Microsoft.AspNetCore.Mvc.Filters; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Core; /// /// 规范化RESTful风格返回值 /// -[SuppressSniffer, UnifyModel(typeof(SimpleAdminResult<>))] +[SuppressSniffer] +[UnifyModel(typeof(SimpleAdminResult<>))] public class SimpleAdminResultProvider : IUnifyResultProvider { + public IActionResult OnAuthorizeException(DefaultHttpContext context, ExceptionMetadata metadata) + { + return new JsonResult(ResTfulResult(metadata.StatusCode, data: metadata.Data, errors: metadata.Errors), + UnifyContext.GetSerializerSettings(context)); + } + /// /// 异常返回 /// @@ -17,7 +31,7 @@ public class SimpleAdminResultProvider : IUnifyResultProvider /// public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata) { - return new JsonResult(RESTfulResult(metadata.StatusCode, data: metadata.Data, errors: metadata.Errors)); + return new JsonResult(ResTfulResult(metadata.StatusCode, data: metadata.Data, errors: metadata.Errors)); } /// @@ -28,7 +42,7 @@ public class SimpleAdminResultProvider : IUnifyResultProvider /// public IActionResult OnSucceeded(ActionExecutedContext context, object data) { - return new JsonResult(RESTfulResult(StatusCodes.Status200OK, true, data)); + return new JsonResult(ResTfulResult(StatusCodes.Status200OK, true, data)); } /// @@ -39,7 +53,7 @@ public class SimpleAdminResultProvider : IUnifyResultProvider /// public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata) { - return new JsonResult(RESTfulResult(metadata.StatusCode ?? StatusCodes.Status400BadRequest, data: metadata.Data, + return new JsonResult(ResTfulResult(metadata.StatusCode ?? StatusCodes.Status400BadRequest, data: metadata.Data, errors: metadata.FirstErrorMessage ?? metadata.Message)); } @@ -50,8 +64,7 @@ public class SimpleAdminResultProvider : IUnifyResultProvider /// /// /// - public async Task OnResponseStatusCodes(HttpContext context, int statusCode, - UnifyResultSettingsOptions unifyResultSettings = null) + public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings = null) { // 设置响应状态码 UnifyContext.SetResponseStatusCodes(context, statusCode, unifyResultSettings); @@ -60,17 +73,14 @@ public class SimpleAdminResultProvider : IUnifyResultProvider { // 处理 401 状态码 case StatusCodes.Status401Unauthorized: - await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: "登录已过期,请重新登录"), + await context.Response.WriteAsJsonAsync(ResTfulResult(statusCode, errors: "登录已过期,请重新登录"), App.GetOptions()?.JsonSerializerOptions); break; // 处理 403 状态码 case StatusCodes.Status403Forbidden: - await context.Response.WriteAsJsonAsync( - RESTfulResult(statusCode, errors: "禁止访问,没有权限", data: context.Request.Path), + await context.Response.WriteAsJsonAsync(ResTfulResult(statusCode, errors: "禁止访问,没有权限", data: context.Request.Path), App.GetOptions()?.JsonSerializerOptions); break; - - default: break; } } @@ -82,8 +92,8 @@ public class SimpleAdminResultProvider : IUnifyResultProvider /// 数据 /// 错误信息 /// - private static SimpleAdminResult RESTfulResult(int statusCode, bool succeeded = default, - object data = default, object errors = default) + private static SimpleAdminResult ResTfulResult(int statusCode, bool succeeded = default, object data = default, + object errors = default) { return new SimpleAdminResult { @@ -94,4 +104,4 @@ public class SimpleAdminResultProvider : IUnifyResultProvider Time = DateTime.Now }; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaInfo.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaInfo.cs index 3dc42d4786aa2357ebf8fcc6da587ca531e4c1f5..575fdb282d62125e12647a20f1f6104257cd69f9 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaInfo.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaInfo.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core.Utils; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core.Utils; /// /// 验证码信息 @@ -13,11 +23,13 @@ public class CaptchaInfo /// /// 验证码数据流 /// - public byte[] Image { get; set; } + public byte[] Image { get; set; } /// /// base64 /// public string Base64Str - { get { return "data:image/png;base64," + Convert.ToBase64String(Image); } } -} \ No newline at end of file + { + get { return "data:image/png;base64," + Convert.ToBase64String(Image); } + } +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaType.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaType.cs index 5efa057db355cbef8a1b67b28693a1d0e492a9e6..e08d7aa50feae1235a71f62af557953b67a9ea94 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaType.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaType.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core.Utils; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core.Utils; /// /// 验证码类型 @@ -21,5 +31,5 @@ public enum CaptchaType /// 数字运算验证码 /// [Description("数字运算验证码")] - ARITH = 2, -} \ No newline at end of file + ARITH = 2 +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaUtil.cs index f83417aa40e21a443138f69930a6496bbc5e0701..48c00212aa74ba87917b20810ca754802e00465b 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaUtil.cs @@ -1,7 +1,12 @@ -using Lazy.Captcha.Core.Generator.Image.Option; -using Lazy.Captcha.Core.Generator.Image; -using Lazy.Captcha.Core; -using SkiaSharp; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Core.Utils; @@ -15,11 +20,12 @@ public static class CaptchaUtil /// /// 验证码数 /// 长度 - /// 高度 + /// 高度 /// 字体大小 /// 类型 0:数字 1:字符 2:计算 /// - public static CaptchaInfo CreateCaptcha(CaptchaType type = CaptchaType.CHAR, int length = 4, int width = 170, int heigh = 50, int fontSize = 20) + public static CaptchaInfo CreateCaptcha(CaptchaType type = CaptchaType.CHAR, int length = 4, int width = 170, + int height = 50, int fontSize = 20) { //初始化验证码 string charCode; @@ -39,12 +45,12 @@ public static class CaptchaUtil break; } var imageGenerator = new DefaultCaptchaImageGenerator(); - var imageGeneratorOption = new CaptchaImageGeneratorOption() + var imageGeneratorOption = new CaptchaImageGeneratorOption { // 必须设置 ForegroundColors = DefaultColors.Instance.Colors, Width = width, - Height = heigh, + Height = height, FontSize = fontSize, TextBold = true, BubbleCount = 1, @@ -53,7 +59,7 @@ public static class CaptchaUtil var bytes = imageGenerator.Generate(charCode, imageGeneratorOption); - var captchaInfo = new CaptchaInfo() + var captchaInfo = new CaptchaInfo { Code = type.ToString() == "ARITH" ? resultCode : charCode, Image = bytes @@ -108,11 +114,11 @@ public static class CaptchaUtil /// public static string CreateArithCode(out string resultCode) { - var checkCode = ""; + string checkCode; var random = new Random(); var intFirst = random.Next(1, 10);//生成第一个数字 var intSec = random.Next(1, 10);//生成第二个数字 - var intTemp = 0; + int intTemp; switch (random.Next(1, 3).ToString()) { case "2": @@ -133,4 +139,4 @@ public static class CaptchaUtil } return checkCode; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/CommonUtils.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/CommonUtils.cs index 0a91de040d76c390981a17c5298e913a2e6eec1a..f57597b60a39b998bc528a77bd45bee4d603cc55 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/CommonUtils.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/CommonUtils.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core.Utils; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core.Utils; /// /// 公共功能 @@ -13,4 +23,4 @@ public static class CommonUtils { return YitIdHelper.NextId(); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/CryptogramUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/CryptogramUtil.cs index 77fbb68bc6a97d058e2d2bcc039da3dfe2c248c8..2c1420b620daed79689fd7fbda45f253a7305906 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/CryptogramUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/CryptogramUtil.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core.Utils; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core.Utils; /// /// 加解密功能 @@ -17,7 +27,17 @@ public class CryptogramUtil // 解密 if (!string.IsNullOrWhiteSpace(str)) return SM2Util.Decrypt(str); - else return ""; + try + { + // // 解密 + // if (!string.IsNullOrWhiteSpace(str)) + // return SM2Util.Decrypt(str); + } + catch + { + return ""; + } + return ""; } /// @@ -27,10 +47,17 @@ public class CryptogramUtil /// 密文 public static string Sm2Encrypt(string str) { - // 加密 - if (!string.IsNullOrWhiteSpace(str)) - return SM2Util.Encrypt(str); - else return ""; + try + { + // 加密 + if (!string.IsNullOrWhiteSpace(str)) + return SM2Util.Encrypt(str); + } + catch + { + return ""; + } + return ""; } #endregion SM2 @@ -46,8 +73,7 @@ public class CryptogramUtil { if (!string.IsNullOrWhiteSpace(str))// 解密 return SM4Util.Decrypt(new SM4Util { Data = str }); - else - return ""; + return ""; } /// @@ -59,9 +85,8 @@ public class CryptogramUtil { if (!string.IsNullOrWhiteSpace(str))// 加密 return SM4Util.Encrypt(new SM4Util { Data = str }); - else - return ""; + return ""; } #endregion Sm4 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/SM2Util.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/SM2Util.cs index 0aa9eabe436e68fbfc1e50153c3d06f2c5f61508..cad81cf863f7876ffbc17315b11029aca1c1953e 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/SM2Util.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/SM2Util.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core.Utils; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core.Utils; /// /// SM2加密解密 @@ -35,4 +45,4 @@ public class SM2Util if (!cipherText.StartsWith("04")) cipherText = "04" + cipherText;//如果不是04开头加上04 return SM2CryptoUtil.Decrypt(PrivateKey, cipherText); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/SM4Util.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/SM4Util.cs index e9d310eec6908d4277230caacefce3125bf581c2..8103f816b4832434825509f60c65790f4d0fdec7 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/SM4Util.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/SM4Util.cs @@ -1,4 +1,12 @@ -using Org.BouncyCastle.Utilities.Encoders; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Core.Utils; @@ -57,14 +65,14 @@ public class SM4Util /// public static string EncryptECB(SM4Util entity) { - Sm4Context ctx = new Sm4Context + var ctx = new Sm4Context { IsPadding = true }; - byte[] keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key); - SM4CryptoUtil sm4 = new SM4CryptoUtil(); + var keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key); + var sm4 = new SM4CryptoUtil(); sm4.SetKeyEnc(ctx, keyBytes); - byte[] encrypted = sm4.Sm4CryptEcb(ctx, Encoding.Default.GetBytes(entity.Data)); + var encrypted = sm4.Sm4CryptEcb(ctx, Encoding.Default.GetBytes(entity.Data)); return Encoding.Default.GetString(Hex.Encode(encrypted)); } @@ -75,15 +83,15 @@ public class SM4Util /// public static string EncryptCBC(SM4Util entity) { - Sm4Context ctx = new Sm4Context + var ctx = new Sm4Context { IsPadding = true }; - byte[] keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key); - byte[] ivBytes = entity.HexString ? Hex.Decode(entity.Iv) : Encoding.Default.GetBytes(entity.Iv); - SM4CryptoUtil sm4 = new SM4CryptoUtil(); + var keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key); + var ivBytes = entity.HexString ? Hex.Decode(entity.Iv) : Encoding.Default.GetBytes(entity.Iv); + var sm4 = new SM4CryptoUtil(); sm4.SetKeyEnc(ctx, keyBytes); - byte[] encrypted = sm4.Sm4CryptCbc(ctx, ivBytes, Encoding.Default.GetBytes(entity.Data)); + var encrypted = sm4.Sm4CryptCbc(ctx, ivBytes, Encoding.Default.GetBytes(entity.Data)); return Convert.ToBase64String(encrypted); } @@ -108,15 +116,15 @@ public class SM4Util /// public static string DecryptECB(SM4Util entity) { - Sm4Context ctx = new Sm4Context + var ctx = new Sm4Context { IsPadding = true, Mode = 0 }; - byte[] keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key); - SM4CryptoUtil sm4 = new SM4CryptoUtil(); + var keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key); + var sm4 = new SM4CryptoUtil(); sm4.Sm4SetKeyDec(ctx, keyBytes); - byte[] decrypted = sm4.Sm4CryptEcb(ctx, Hex.Decode(entity.Data)); + var decrypted = sm4.Sm4CryptEcb(ctx, Hex.Decode(entity.Data)); return Encoding.Default.GetString(decrypted); } @@ -127,16 +135,16 @@ public class SM4Util /// public static string DecryptCBC(SM4Util entity) { - Sm4Context ctx = new Sm4Context + var ctx = new Sm4Context { IsPadding = true, Mode = 0 }; - byte[] keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key); - byte[] ivBytes = entity.HexString ? Hex.Decode(entity.Iv) : Encoding.Default.GetBytes(entity.Iv); - SM4CryptoUtil sm4 = new SM4CryptoUtil(); + var keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key); + var ivBytes = entity.HexString ? Hex.Decode(entity.Iv) : Encoding.Default.GetBytes(entity.Iv); + var sm4 = new SM4CryptoUtil(); sm4.Sm4SetKeyDec(ctx, keyBytes); - byte[] decrypted = sm4.Sm4CryptCbc(ctx, ivBytes, Convert.FromBase64String(entity.Data)); + var decrypted = sm4.Sm4CryptCbc(ctx, ivBytes, Convert.FromBase64String(entity.Data)); return Encoding.Default.GetString(decrypted); } @@ -159,4 +167,4 @@ public class SM4Util [Description("CBC模式")] CBC = 1 } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM2CryptoUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM2CryptoUtil.cs index 16772271df368b75ae84fe8f8ad2fdd12d431593..d8f6d2a909227f6d858e6f99ccbb7b9319a27b23 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM2CryptoUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM2CryptoUtil.cs @@ -1,11 +1,12 @@ -using Org.BouncyCastle.Crypto; -using Org.BouncyCastle.Crypto.Digests; -using Org.BouncyCastle.Crypto.Generators; -using Org.BouncyCastle.Crypto.Parameters; -using Org.BouncyCastle.Math; -using Org.BouncyCastle.Math.EC; -using Org.BouncyCastle.Security; -using Org.BouncyCastle.Utilities.Encoders; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Core.Utils; @@ -22,13 +23,13 @@ public class SM2CryptoUtil /// public static SM2Model GetKey() { - SM2 sm2 = SM2.Instance; - AsymmetricCipherKeyPair key = sm2.ecc_key_pair_generator.GenerateKeyPair(); - ECPrivateKeyParameters ecpriv = (ECPrivateKeyParameters)key.Private; - ECPublicKeyParameters ecpub = (ECPublicKeyParameters)key.Public; - BigInteger privateKey = ecpriv.D; - ECPoint publicKey = ecpub.Q; - SM2Model sM2Model = new SM2Model(); + var sm2 = SM2.Instance; + var key = sm2.ecc_key_pair_generator.GenerateKeyPair(); + var ecpriv = (ECPrivateKeyParameters)key.Private; + var ecpub = (ECPublicKeyParameters)key.Public; + var privateKey = ecpriv.D; + var publicKey = ecpub.Q; + var sM2Model = new SM2Model(); sM2Model.PrivateKey = Encoding.UTF8.GetString(Hex.Encode(privateKey.ToByteArray())).ToUpper(); sM2Model.PublicKey = Encoding.UTF8.GetString(Hex.Encode(publicKey.GetEncoded())).ToUpper(); return sM2Model; @@ -56,7 +57,7 @@ public class SM2CryptoUtil /// 公钥 /// 需要加密的值 /// - public static String Encrypt(byte[] publicKey, byte[] data) + public static string Encrypt(byte[] publicKey, byte[] data) { if (null == publicKey || publicKey.Length == 0) { @@ -67,23 +68,24 @@ public class SM2CryptoUtil return null; } - byte[] source = new byte[data.Length]; - Array.Copy(data, 0, source, 0, data.Length); + var source = new byte[data.Length]; + Array.Copy(data, 0, source, 0, + data.Length); - Cipher cipher = new Cipher(); - SM2 sm2 = SM2.Instance; + var cipher = new Cipher(); + var sm2 = SM2.Instance; - ECPoint userKey = sm2.ecc_curve.DecodePoint(publicKey); + var userKey = sm2.ecc_curve.DecodePoint(publicKey); - ECPoint c1 = cipher.Init_enc(sm2, userKey); + var c1 = cipher.Init_enc(sm2, userKey); cipher.Encrypt(source); - byte[] c3 = new byte[32]; + var c3 = new byte[32]; cipher.Dofinal(c3); - String sc1 = Encoding.UTF8.GetString(Hex.Encode(c1.GetEncoded())); - String sc2 = Encoding.UTF8.GetString(Hex.Encode(source)); - String sc3 = Encoding.UTF8.GetString(Hex.Encode(c3)); + var sc1 = Encoding.UTF8.GetString(Hex.Encode(c1.GetEncoded())); + var sc2 = Encoding.UTF8.GetString(Hex.Encode(source)); + var sc3 = Encoding.UTF8.GetString(Hex.Encode(c3)); return (sc1 + sc2 + sc3).ToUpper(); } @@ -121,20 +123,20 @@ public class SM2CryptoUtil return null; } - String data = Encoding.UTF8.GetString(Hex.Encode(encryptedData)); + var data = Encoding.UTF8.GetString(Hex.Encode(encryptedData)); - byte[] c1Bytes = Hex.Decode(Encoding.UTF8.GetBytes(data.Substring(0, 130))); - int c2Len = encryptedData.Length - 97; - byte[] c2 = Hex.Decode(Encoding.UTF8.GetBytes(data.Substring(130, 2 * c2Len))); - byte[] c3 = Hex.Decode(Encoding.UTF8.GetBytes(data.Substring(130 + 2 * c2Len, 64))); + var c1Bytes = Hex.Decode(Encoding.UTF8.GetBytes(data.Substring(0, 130))); + var c2Len = encryptedData.Length - 97; + var c2 = Hex.Decode(Encoding.UTF8.GetBytes(data.Substring(130, 2 * c2Len))); + var c3 = Hex.Decode(Encoding.UTF8.GetBytes(data.Substring(130 + 2 * c2Len, 64))); - SM2 sm2 = SM2.Instance; - BigInteger userD = new BigInteger(1, privateKey); + var sm2 = SM2.Instance; + var userD = new BigInteger(1, privateKey); //ECPoint c1 = sm2.ecc_curve.DecodePoint(c1Bytes); - ECPoint c1 = sm2.ecc_curve.DecodePoint(c1Bytes); - Cipher cipher = new Cipher(); + var c1 = sm2.ecc_curve.DecodePoint(c1Bytes); + var cipher = new Cipher(); cipher.Init_dec(userD, c1); cipher.Decrypt(c2); cipher.Dofinal(c3); @@ -155,14 +157,14 @@ public class SM2CryptoUtil public Cipher() { - this.ct = 1; - this.key = new byte[32]; - this.keyOff = 0; + ct = 1; + key = new byte[32]; + keyOff = 0; } public static byte[] byteConvert32Bytes(BigInteger n) { - byte[] tmpd = null; + byte[] tmpd; if (n == null) { return null; @@ -171,7 +173,8 @@ public class SM2CryptoUtil if (n.ToByteArray().Length == 33) { tmpd = new byte[32]; - Array.Copy(n.ToByteArray(), 1, tmpd, 0, 32); + Array.Copy(n.ToByteArray(), 1, tmpd, 0, + 32); } else if (n.ToByteArray().Length == 32) { @@ -180,58 +183,59 @@ public class SM2CryptoUtil else { tmpd = new byte[32]; - for (int i = 0; i < 32 - n.ToByteArray().Length; i++) + for (var i = 0; i < 32 - n.ToByteArray().Length; i++) { tmpd[i] = 0; } - Array.Copy(n.ToByteArray(), 0, tmpd, 32 - n.ToByteArray().Length, n.ToByteArray().Length); + Array.Copy(n.ToByteArray(), 0, tmpd, 32 - n.ToByteArray().Length, + n.ToByteArray().Length); } return tmpd; } private void Reset() { - this.sm3keybase = new SM3Digest(); - this.sm3c3 = new SM3Digest(); + sm3keybase = new SM3Digest(); + sm3c3 = new SM3Digest(); - byte[] p = byteConvert32Bytes(p2.Normalize().XCoord.ToBigInteger()); - this.sm3keybase.BlockUpdate(p, 0, p.Length); - this.sm3c3.BlockUpdate(p, 0, p.Length); + var p = byteConvert32Bytes(p2.Normalize().XCoord.ToBigInteger()); + sm3keybase.BlockUpdate(p, 0, p.Length); + sm3c3.BlockUpdate(p, 0, p.Length); p = byteConvert32Bytes(p2.Normalize().YCoord.ToBigInteger()); - this.sm3keybase.BlockUpdate(p, 0, p.Length); - this.ct = 1; + sm3keybase.BlockUpdate(p, 0, p.Length); + ct = 1; NextKey(); } private void NextKey() { - SM3Digest sm3keycur = new SM3Digest(this.sm3keybase); + var sm3keycur = new SM3Digest(sm3keybase); sm3keycur.Update((byte)(ct >> 24 & 0xff)); sm3keycur.Update((byte)(ct >> 16 & 0xff)); sm3keycur.Update((byte)(ct >> 8 & 0xff)); sm3keycur.Update((byte)(ct & 0xff)); sm3keycur.DoFinal(key, 0); - this.keyOff = 0; - this.ct++; + keyOff = 0; + ct++; } public ECPoint Init_enc(SM2 sm2, ECPoint userKey) { - AsymmetricCipherKeyPair key = sm2.ecc_key_pair_generator.GenerateKeyPair(); - ECPrivateKeyParameters ecpriv = (ECPrivateKeyParameters)key.Private; - ECPublicKeyParameters ecpub = (ECPublicKeyParameters)key.Public; - BigInteger k = ecpriv.D; - ECPoint c1 = ecpub.Q; - this.p2 = userKey.Multiply(k); + var key = sm2.ecc_key_pair_generator.GenerateKeyPair(); + var ecpriv = (ECPrivateKeyParameters)key.Private; + var ecpub = (ECPublicKeyParameters)key.Public; + var k = ecpriv.D; + var c1 = ecpub.Q; + p2 = userKey.Multiply(k); Reset(); return c1; } public void Encrypt(byte[] data) { - this.sm3c3.BlockUpdate(data, 0, data.Length); - for (int i = 0; i < data.Length; i++) + sm3c3.BlockUpdate(data, 0, data.Length); + for (var i = 0; i < data.Length; i++) { if (keyOff == key.Length) { @@ -243,13 +247,13 @@ public class SM2CryptoUtil public void Init_dec(BigInteger userD, ECPoint c1) { - this.p2 = c1.Multiply(userD); + p2 = c1.Multiply(userD); Reset(); } public void Decrypt(byte[] data) { - for (int i = 0; i < data.Length; i++) + for (var i = 0; i < data.Length; i++) { if (keyOff == key.Length) { @@ -258,14 +262,14 @@ public class SM2CryptoUtil data[i] ^= key[keyOff++]; } - this.sm3c3.BlockUpdate(data, 0, data.Length); + sm3c3.BlockUpdate(data, 0, data.Length); } public void Dofinal(byte[] c3) { - byte[] p = byteConvert32Bytes(p2.Normalize().YCoord.ToBigInteger()); - this.sm3c3.BlockUpdate(p, 0, p.Length); - this.sm3c3.DoFinal(c3, 0); + var p = byteConvert32Bytes(p2.Normalize().YCoord.ToBigInteger()); + sm3c3.BlockUpdate(p, 0, p.Length); + sm3c3.DoFinal(c3, 0); Reset(); } } @@ -288,14 +292,15 @@ public class SM2CryptoUtil } } - public static readonly string[] sm2_param = { - "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF",// p,0 - "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC",// a,1 - "28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93",// b,2 - "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123",// n,3 - "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7",// gx,4 - "BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0" // gy,5 - }; + public static readonly string[] sm2_param = + { + "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF",// p,0 + "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC",// a,1 + "28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93",// b,2 + "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123",// n,3 + "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7",// gx,4 + "BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0"// gy,5 + }; public string[] ecc_param = sm2_param; @@ -344,10 +349,10 @@ public class SM2CryptoUtil public virtual byte[] Sm2GetZ(byte[] userId, ECPoint userKey) { - SM3Digest sm3 = new SM3Digest(); + var sm3 = new SM3Digest(); byte[] p; // userId length - int len = userId.Length * 8; + var len = userId.Length * 8; sm3.Update((byte)(len >> 8 & 0x00ff)); sm3.Update((byte)(len & 0x00ff)); @@ -372,7 +377,7 @@ public class SM2CryptoUtil sm3.BlockUpdate(p, 0, p.Length); // Z - byte[] md = new byte[sm3.GetDigestSize()]; + var md = new byte[sm3.GetDigestSize()]; sm3.DoFinal(md, 0); return md; @@ -391,4 +396,4 @@ public class SM2CryptoUtil /// public string PrivateKey { get; set; } } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM4CryptoUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM4CryptoUtil.cs index 9812d3e2113c9ee1aabc3cd8aa638f0f79266103..0da6070e25d56eb07a3ece77bc837d17b928b53a 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM4CryptoUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM4CryptoUtil.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Core.Utils; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core.Utils; /// /// SM4工具类 @@ -13,10 +23,7 @@ public class SM4CryptoUtil /// private static long GetULongByBe(byte[] b, int i) { - long n = (long)(b[i] & 0xff) << 24 | - (long)((b[i + 1] & 0xff) << 16) | - (long)((b[i + 2] & 0xff) << 8) | - b[i + 3] & 0xff & 0xffffffffL; + var n = (long)(b[i] & 0xff) << 24 | (uint)((b[i + 1] & 0xff) << 16) | (uint)((b[i + 2] & 0xff) << 8) | b[i + 3] & 0xff & 0xffffffffL; return n; } @@ -42,7 +49,7 @@ public class SM4CryptoUtil /// private static long Rotl(long x, int n) { - return ((x & 0xFFFFFFFF) << n) | x >> (32 - n); + return (x & 0xFFFFFFFF) << n | x >> 32 - n; } /// @@ -52,16 +59,17 @@ public class SM4CryptoUtil /// private static void Swap(long[] sk, int i) { - long t = sk[i]; - sk[i] = sk[(31 - i)]; - sk[(31 - i)] = t; + var t = sk[i]; + sk[i] = sk[31 - i]; + sk[31 - i] = t; } /// /// S盒 /// - public byte[] SboxTable = new byte[] { - // 0 1 2 3 4 5 6 7 8 9 a b c d e f + public byte[] SboxTable = new byte[] + { + // 0 1 2 3 4 5 6 7 8 9 a b c d e f 0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7, 0x16, 0xb6, 0x14, 0xc2, 0x28, 0xfb, 0x2c, 0x05, 0x2b, 0x67, 0x9a, 0x76, 0x2a, 0xbe, 0x04, 0xc3, 0xaa, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99, 0x9c, 0x42, 0x50, 0xf4, 0x91, 0xef, 0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43, 0xed, 0xcf, 0xac, 0x62, @@ -88,15 +96,16 @@ public class SM4CryptoUtil /// /// 固定参数CK /// - public uint[] CK = { - 0x00070e15,0x1c232a31,0x383f464d,0x545b6269, - 0x70777e85,0x8c939aa1,0xa8afb6bd,0xc4cbd2d9, - 0xe0e7eef5,0xfc030a11,0x181f262d,0x343b4249, - 0x50575e65,0x6c737a81,0x888f969d,0xa4abb2b9, - 0xc0c7ced5,0xdce3eaf1,0xf8ff060d,0x141b2229, - 0x30373e45,0x4c535a61,0x686f767d,0x848b9299, - 0xa0a7aeb5,0xbcc3cad1,0xd8dfe6ed,0xf4fb0209, - 0x10171e25,0x2c333a41,0x484f565d,0x646b7279 + public uint[] CK = + { + 0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269, + 0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9, + 0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249, + 0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9, + 0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229, + 0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299, + 0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209, + 0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279 }; /// @@ -106,8 +115,8 @@ public class SM4CryptoUtil /// private byte Sm4Sbox(byte inch) { - int i = inch & 0xFF; - byte retVal = SboxTable[i]; + var i = inch & 0xFF; + var retVal = SboxTable[i]; return retVal; } @@ -118,15 +127,15 @@ public class SM4CryptoUtil /// private long Sm4Lt(long ka) { - byte[] a = new byte[4]; - byte[] b = new byte[4]; + var a = new byte[4]; + var b = new byte[4]; PutULongToBe(ka, a, 0); b[0] = Sm4Sbox(a[0]); b[1] = Sm4Sbox(a[1]); b[2] = Sm4Sbox(a[2]); b[3] = Sm4Sbox(a[3]); - long bb = GetULongByBe(b, 0); - long c = bb ^ Rotl(bb, 2) ^ Rotl(bb, 10) ^ Rotl(bb, 18) ^ Rotl(bb, 24); + var bb = GetULongByBe(b, 0); + var c = bb ^ Rotl(bb, 2) ^ Rotl(bb, 10) ^ Rotl(bb, 18) ^ Rotl(bb, 24); return c; } @@ -139,7 +148,8 @@ public class SM4CryptoUtil /// /// /// - private long Sm4F(long x0, long x1, long x2, long x3, long rk) + private long Sm4F(long x0, long x1, long x2, + long x3, long rk) { return x0 ^ Sm4Lt(x1 ^ x2 ^ x3 ^ rk); } @@ -151,15 +161,15 @@ public class SM4CryptoUtil /// private long Sm4CalciRk(long ka) { - byte[] a = new byte[4]; - byte[] b = new byte[4]; + var a = new byte[4]; + var b = new byte[4]; PutULongToBe(ka, a, 0); b[0] = Sm4Sbox(a[0]); b[1] = Sm4Sbox(a[1]); b[2] = Sm4Sbox(a[2]); b[3] = Sm4Sbox(a[3]); - long bb = GetULongByBe(b, 0); - long rk = bb ^ Rotl(bb, 13) ^ Rotl(bb, 23); + var bb = GetULongByBe(b, 0); + var rk = bb ^ Rotl(bb, 13) ^ Rotl(bb, 23); return rk; } @@ -171,13 +181,13 @@ public class SM4CryptoUtil private void SetKey(long[] SK, byte[] key) { //加密密钥长度为 128 比特 - long[] MK = new long[4]; - int i = 0; + var MK = new long[4]; + var i = 0; MK[0] = GetULongByBe(key, 0); MK[1] = GetULongByBe(key, 4); MK[2] = GetULongByBe(key, 8); MK[3] = GetULongByBe(key, 12); - long[] k = new long[36]; + var k = new long[36]; //轮密钥生成方法 k[0] = MK[0] ^ FK[0]; k[1] = MK[1] ^ FK[1]; @@ -185,8 +195,8 @@ public class SM4CryptoUtil k[3] = MK[3] ^ FK[3]; for (; i < 32; i++) { - k[(i + 4)] = (k[i] ^ Sm4CalciRk(k[(i + 1)] ^ k[(i + 2)] ^ k[(i + 3)] ^ CK[i])); - SK[i] = k[(i + 4)]; + k[i + 4] = k[i] ^ Sm4CalciRk(k[i + 1] ^ k[i + 2] ^ k[i + 3] ^ CK[i]); + SK[i] = k[i + 4]; } } @@ -198,15 +208,16 @@ public class SM4CryptoUtil /// 输出的对应的分组明文 private void Sm4OneRound(long[] sk, byte[] input, byte[] output) { - int i = 0; - long[] ulbuf = new long[36]; + var i = 0; + var ulbuf = new long[36]; ulbuf[0] = GetULongByBe(input, 0); ulbuf[1] = GetULongByBe(input, 4); ulbuf[2] = GetULongByBe(input, 8); ulbuf[3] = GetULongByBe(input, 12); - while (i < 32) //开始32轮解密 ,一次进行4轮,共计八次 + while (i < 32)//开始32轮解密 ,一次进行4轮,共计八次 { - ulbuf[(i + 4)] = Sm4F(ulbuf[i], ulbuf[(i + 1)], ulbuf[(i + 2)], ulbuf[(i + 3)], sk[i]); + ulbuf[i + 4] = Sm4F(ulbuf[i], ulbuf[i + 1], ulbuf[i + 2], ulbuf[i + 3], + sk[i]); i++; } PutULongToBe(ulbuf[35], output, 0); @@ -227,13 +238,14 @@ public class SM4CryptoUtil { return null; } - byte[] ret = null; + byte[] ret; if (mode == 1) { - int p = 16 - input.Length % 16; + var p = 16 - input.Length % 16; ret = new byte[input.Length + p]; - Array.Copy(input, 0, ret, 0, input.Length); - for (int i = 0; i < p; i++) + Array.Copy(input, 0, ret, 0, + input.Length); + for (var i = 0; i < p; i++) { ret[input.Length + i] = (byte)p; } @@ -242,7 +254,8 @@ public class SM4CryptoUtil { int p = input[input.Length - 1]; ret = new byte[input.Length - p]; - Array.Copy(input, 0, ret, 0, input.Length - p); + Array.Copy(input, 0, ret, 0, + input.Length - p); } return ret; } @@ -282,21 +295,24 @@ public class SM4CryptoUtil /// public byte[] Sm4CryptEcb(Sm4Context ctx, byte[] input) { - if (ctx.IsPadding && (ctx.Mode == 1)) + if (ctx.IsPadding && ctx.Mode == 1) { input = Padding(input, 1); } - int length = input.Length; - byte[] bins = new byte[length]; - Array.Copy(input, 0, bins, 0, length); - byte[] bous = new byte[length]; - for (int i = 0; length > 0; length -= 16, i++) + var length = input.Length; + var bins = new byte[length]; + Array.Copy(input, 0, bins, 0, + length); + var bous = new byte[length]; + for (var i = 0; length > 0; length -= 16, i++) { - byte[] inBytes = new byte[16]; - byte[] outBytes = new byte[16]; - Array.Copy(bins, i * 16, inBytes, 0, length > 16 ? 16 : length); + var inBytes = new byte[16]; + var outBytes = new byte[16]; + Array.Copy(bins, i * 16, inBytes, 0, + length > 16 ? 16 : length); Sm4OneRound(ctx.Key, inBytes, outBytes); - Array.Copy(outBytes, 0, bous, i * 16, length > 16 ? 16 : length); + Array.Copy(outBytes, 0, bous, i * 16, + length > 16 ? 16 : length); } if (ctx.IsPadding && ctx.Mode == 0) { @@ -318,26 +334,29 @@ public class SM4CryptoUtil { input = Padding(input, 1); } - int length = input.Length; - byte[] bins = new byte[length]; - Array.Copy(input, 0, bins, 0, length); - List bousList = new List(); + var length = input.Length; + var bins = new byte[length]; + Array.Copy(input, 0, bins, 0, + length); + var bousList = new List(); int i; if (ctx.Mode == 1) { - for (int j = 0; length > 0; length -= 16, j++) + for (var j = 0; length > 0; length -= 16, j++) { - byte[] inBytes = new byte[16]; - byte[] outBytes = new byte[16]; - byte[] out1 = new byte[16]; - Array.Copy(bins, j * 16, inBytes, 0, length > 16 ? 16 : length); + var inBytes = new byte[16]; + var outBytes = new byte[16]; + var out1 = new byte[16]; + Array.Copy(bins, j * 16, inBytes, 0, + length > 16 ? 16 : length); for (i = 0; i < 16; i++) { - outBytes[i] = ((byte)(inBytes[i] ^ iv[i])); + outBytes[i] = (byte)(inBytes[i] ^ iv[i]); } Sm4OneRound(ctx.Key, outBytes, out1); - Array.Copy(out1, 0, iv, 0, 16); - for (int k = 0; k < 16; k++) + Array.Copy(out1, 0, iv, 0, + 16); + for (var k = 0; k < 16; k++) { bousList.Add(out1[k]); } @@ -345,21 +364,24 @@ public class SM4CryptoUtil } else { - byte[] temp = new byte[16]; - for (int j = 0; length > 0; length -= 16, j++) + var temp = new byte[16]; + for (var j = 0; length > 0; length -= 16, j++) { - byte[] inBytes = new byte[16]; - byte[] outBytes = new byte[16]; - byte[] out1 = new byte[16]; - Array.Copy(bins, j * 16, inBytes, 0, length > 16 ? 16 : length); - Array.Copy(inBytes, 0, temp, 0, 16); + var inBytes = new byte[16]; + var outBytes = new byte[16]; + var out1 = new byte[16]; + Array.Copy(bins, j * 16, inBytes, 0, + length > 16 ? 16 : length); + Array.Copy(inBytes, 0, temp, 0, + 16); Sm4OneRound(ctx.Key, inBytes, outBytes); for (i = 0; i < 16; i++) { - out1[i] = ((byte)(outBytes[i] ^ iv[i])); + out1[i] = (byte)(outBytes[i] ^ iv[i]); } - Array.Copy(temp, 0, iv, 0, 16); - for (int k = 0; k < 16; k++) + Array.Copy(temp, 0, iv, 0, + 16); + for (var k = 0; k < 16; k++) { bousList.Add(out1[k]); } @@ -367,13 +389,10 @@ public class SM4CryptoUtil } if (ctx.IsPadding && ctx.Mode == 0) { - byte[] bous = Padding(bousList.ToArray(), 0); + var bous = Padding(bousList.ToArray(), 0); return bous; } - else - { - return bousList.ToArray(); - } + return bousList.ToArray(); } } @@ -403,4 +422,4 @@ public class Sm4Context /// 是否补足16进制字符串 /// public bool IsPadding; -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/AvatarUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/AvatarUtil.cs index 8d9281d6376d0b98411d025a46977154a7ed304f..f69fa7eafa483a7dd828b89dff86bb86cdca4aa6 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/AvatarUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/AvatarUtil.cs @@ -1,4 +1,12 @@ -using SkiaSharp; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Core.Utils; @@ -91,7 +99,7 @@ public static class AvatarUtil { var img = GetNameImage(name, width, height); var imgByte = img.ImgToBase64String(); - return $"data:image/png;base64," + imgByte; + return "data:image/png;base64," + imgByte; } /// @@ -105,4 +113,4 @@ public static class AvatarUtil } #endregion 姓名生成图片处理 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/ImageUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/ImageUtil.cs index 8b3ed92a97a6abeae77c4fc1ef4178a4f3c0af04..2a04a50e3db508e84329f63c39c802c5870c760f 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/ImageUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/ImageUtil.cs @@ -1,6 +1,12 @@ -using SkiaSharp; -using System.Drawing; -using System.Drawing.Drawing2D; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Core.Utils; @@ -45,30 +51,28 @@ public static class ImageUtil } } - /// /// base64转bitmap /// - /// + /// /// - public static Bitmap GetBitmapFromBase64(this string base64string) + public static Bitmap GetBitmapFromBase64(this string base64String) { - var b = Convert.FromBase64String(base64string); + var b = Convert.FromBase64String(base64String); var ms = new MemoryStream(b); var bitmap = new Bitmap(ms); ms.Close(); return bitmap; } - /// /// base64转bitmap /// - /// + /// /// - public static SKBitmap GetSKBitmapFromBase64(this string base64string) + public static SKBitmap GetSkBitmapFromBase64(this string base64String) { - var b = Convert.FromBase64String(base64string); + var b = Convert.FromBase64String(base64String); var bitmap = SKBitmap.Decode(b); return bitmap; } @@ -76,14 +80,13 @@ public static class ImageUtil /// /// base64转image格式 /// - /// + /// /// - public static string ToImageBase64(this string base64string) + public static string ToImageBase64(this string base64String) { - return "data:image/png;base64," + base64string; + return "data:image/png;base64," + base64String; } - /// /// 重新修改尺寸 /// @@ -97,13 +100,11 @@ public static class ImageUtil //获取图片高度 var sourceHeight = imgToResize.Height; - float nPercent = 0; - float nPercentW = 0; - float nPercentH = 0; + float nPercent; //计算宽度的缩放比例 - nPercentW = size.Width / (float)sourceWidth; + var nPercentW = size.Width / (float)sourceWidth; //计算高度的缩放比例 - nPercentH = size.Height / (float)sourceHeight; + var nPercentH = size.Height / (float)sourceHeight; if (nPercentH < nPercentW) nPercent = nPercentH; @@ -118,7 +119,8 @@ public static class ImageUtil var g = Graphics.FromImage(b); g.InterpolationMode = InterpolationMode.HighQualityBicubic; //绘制图像 - g.DrawImage(imgToResize, 0, 0, destWidth, destHeight); + g.DrawImage(imgToResize, 0, 0, destWidth, + destHeight); g.Dispose(); return b; } @@ -218,4 +220,4 @@ public static class ImageUtil return null; } } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Pwd/PwdUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Pwd/PwdUtil.cs index 27d7de7e3e8a9629daf475749625788c3cf05e3c..fada5825ad5bbf1f9e26086676af02decc8a8f4f 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Pwd/PwdUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Pwd/PwdUtil.cs @@ -1,8 +1,12 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Core.Utils; @@ -20,7 +24,7 @@ public class PwdUtil public static double Similarity(string oldPassword, string newPassword) { var editDistance = LevenshteinDistance(oldPassword, newPassword); - var similarity = 1.0 - (double)editDistance / (double)Math.Max(oldPassword.Length, newPassword.Length); + var similarity = 1.0 - editDistance / (double)Math.Max(oldPassword.Length, newPassword.Length); return similarity * 100; } @@ -50,11 +54,9 @@ public class PwdUtil { var cost = s1[i - 1] == s2[j - 1] ? 0 : 1; - distance[i, j] = Math.Min( - Math.Min(distance[i - 1, j] + 1, distance[i, j - 1] + 1), - distance[i - 1, j - 1] + cost); + distance[i, j] = Math.Min(Math.Min(distance[i - 1, j] + 1, distance[i, j - 1] + 1), distance[i - 1, j - 1] + cost); } } return distance[s1.Length, s2.Length]; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Zip/ZipUtils.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Zip/ZipUtils.cs index 957da5619173d9ace031c5095bf0b4d5c10506af..0222ebc70d2dec04e64e51a62f239052aae8fbdd 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Zip/ZipUtils.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Zip/ZipUtils.cs @@ -1,6 +1,12 @@ -using ICSharpCode.SharpZipLib.Checksum; -using ICSharpCode.SharpZipLib.Zip; -using System.Net; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Core.Utils; @@ -13,54 +19,53 @@ public class ZipUtils /// 压缩后的文件 /// 压缩等级 /// 每次写入大小 - public static void ZipFile(string fileToZip, string zipedFile, int compressionLevel, int blockSize) + public static void ZipFile(string fileToZip, string zipedFile, int compressionLevel, + int blockSize) { //如果文件没有找到,则报错 - if (!System.IO.File.Exists(fileToZip)) + if (!File.Exists(fileToZip)) { - throw new System.IO.FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!"); + throw new FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!"); } - using (System.IO.FileStream ZipFile = System.IO.File.Create(zipedFile)) + using (var zipFile = File.Create(zipedFile)) { - using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile)) + using (var zipStream = new ZipOutputStream(zipFile)) { - using (System.IO.FileStream StreamToZip = new System.IO.FileStream(fileToZip, System.IO.FileMode.Open, System.IO.FileAccess.Read)) + using (var streamToZip = new FileStream(fileToZip, FileMode.Open, FileAccess.Read)) { - string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1); - - ZipEntry ZipEntry = new ZipEntry(fileName); + var fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\", StringComparison.Ordinal) + 1); - ZipStream.PutNextEntry(ZipEntry); + var zipEntry = new ZipEntry(fileName); - ZipStream.SetLevel(compressionLevel); + zipStream.PutNextEntry(zipEntry); - byte[] buffer = new byte[blockSize]; + zipStream.SetLevel(compressionLevel); - int sizeRead = 0; + var buffer = new byte[blockSize]; try { + var sizeRead = 0; do { - sizeRead = StreamToZip.Read(buffer, 0, buffer.Length); - ZipStream.Write(buffer, 0, sizeRead); - } - while (sizeRead > 0); + sizeRead = streamToZip.Read(buffer, 0, buffer.Length); + zipStream.Write(buffer, 0, sizeRead); + } while (sizeRead > 0); } - catch (System.Exception ex) + catch (Exception ex) { throw ex; } - StreamToZip.Close(); + streamToZip.Close(); } - ZipStream.Finish(); - ZipStream.Close(); + zipStream.Finish(); + zipStream.Close(); } - ZipFile.Close(); + zipFile.Close(); } } @@ -74,27 +79,27 @@ public class ZipUtils //如果文件没有找到,则报错 if (!File.Exists(fileToZip)) { - throw new System.IO.FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!"); + throw new FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!"); } - using (FileStream fs = File.OpenRead(fileToZip)) + using (var fs = File.OpenRead(fileToZip)) { - byte[] buffer = new byte[fs.Length]; + var buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); fs.Close(); - using (FileStream ZipFile = File.Create(zipedFile)) + using (var zipFile = File.Create(zipedFile)) { - using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile)) + using (var zipStream = new ZipOutputStream(zipFile)) { - string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1); - ZipEntry ZipEntry = new ZipEntry(fileName); - ZipStream.PutNextEntry(ZipEntry); - ZipStream.SetLevel(5); - - ZipStream.Write(buffer, 0, buffer.Length); - ZipStream.Finish(); - ZipStream.Close(); + var fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1); + var zipEntry = new ZipEntry(fileName); + zipStream.PutNextEntry(zipEntry); + zipStream.SetLevel(5); + + zipStream.Write(buffer, 0, buffer.Length); + zipStream.Finish(); + zipStream.Close(); } } } @@ -108,25 +113,25 @@ public class ZipUtils public static void ZipFile(List sourceFileNames, string zipFileName) { //压缩文件打包 - using (ZipOutputStream s = new ZipOutputStream(File.Create(zipFileName))) + using (var s = new ZipOutputStream(File.Create(zipFileName))) { s.SetLevel(9); - byte[] buffer = new byte[4096]; - foreach (string file in sourceFileNames) + var buffer = new byte[4096]; + foreach (var file in sourceFileNames) { if (Directory.Exists(file))// 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件 { - string pPath = ""; + var pPath = ""; pPath += Path.GetFileName(file); pPath += "\\"; ZipSetp(file, s, pPath, sourceFileNames); } - else // 否则直接压缩文件 + else// 否则直接压缩文件 { - ZipEntry entry = new ZipEntry(Path.GetFileName(file)); + var entry = new ZipEntry(Path.GetFileName(file)); entry.DateTime = DateTime.Now; s.PutNextEntry(entry); - using (FileStream fs = File.OpenRead(file)) + using (var fs = File.OpenRead(file)) { int sourceBytes; do @@ -149,9 +154,9 @@ public class ZipUtils /// 压缩后生成的压缩文件名,绝对路径 public static void ZipFileDirectory(string strDirectory, string zipedFile) { - using (System.IO.FileStream ZipFile = System.IO.File.Create(zipedFile)) + using (var zipFile = File.Create(zipedFile)) { - using (ZipOutputStream s = new ZipOutputStream(ZipFile)) + using (var s = new ZipOutputStream(zipFile)) { s.SetLevel(9); ZipSetp(strDirectory, s, ""); @@ -167,9 +172,9 @@ public class ZipUtils /// 指定要压缩的文件列表(完全路径) public static void ZipFileDirectory(string strDirectory, string zipedFile, List files) { - using (System.IO.FileStream ZipFile = System.IO.File.Create(zipedFile)) + using (var zipFile = File.Create(zipedFile)) { - using (ZipOutputStream s = new ZipOutputStream(ZipFile)) + using (var s = new ZipOutputStream(zipFile)) { s.SetLevel(9); ZipSetp(strDirectory, s, "", files); @@ -184,17 +189,18 @@ public class ZipUtils /// 压缩输出流对象 /// The parent path. /// 需要压缩的文件 - private static void ZipSetp(string strDirectory, ZipOutputStream s, string parentPath, List files = null) + private static void ZipSetp(string strDirectory, ZipOutputStream s, string parentPath, + List files = null) { if (strDirectory[strDirectory.Length - 1] != Path.DirectorySeparatorChar) { strDirectory += Path.DirectorySeparatorChar; } - string[] filenames = Directory.GetFileSystemEntries(strDirectory); + var filenames = Directory.GetFileSystemEntries(strDirectory); - byte[] buffer = new byte[4096]; - foreach (string file in filenames)// 遍历所有的文件和目录 + var buffer = new byte[4096]; + foreach (var file in filenames)// 遍历所有的文件和目录 { if (files != null && !files.Contains(file)) { @@ -202,21 +208,21 @@ public class ZipUtils } if (Directory.Exists(file))// 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件 { - string pPath = parentPath; + var pPath = parentPath; pPath += Path.GetFileName(file); pPath += "\\"; ZipSetp(file, s, pPath, files); } - else // 否则直接压缩文件 + else// 否则直接压缩文件 { //打开压缩文件 - string fileName = parentPath + Path.GetFileName(file); - ZipEntry entry = new ZipEntry(fileName); + var fileName = parentPath + Path.GetFileName(file); + var entry = new ZipEntry(fileName); entry.DateTime = DateTime.Now; s.PutNextEntry(entry); - using (FileStream fs = File.OpenRead(file)) + using (var fs = File.OpenRead(file)) { int sourceBytes; do @@ -236,14 +242,15 @@ public class ZipUtils /// 解压目录 /// zip 文件的密码。 /// 是否覆盖已存在的文件。 - public static void UnZip(string zipedFile, string strDirectory, bool overWrite, string password) + public static void UnZip(string zipedFile, string strDirectory, bool overWrite, + string password) { if (strDirectory == "") strDirectory = Directory.GetCurrentDirectory(); if (!strDirectory.EndsWith("\\")) strDirectory = strDirectory + "\\"; - using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipedFile))) + using (var s = new ZipInputStream(File.OpenRead(zipedFile))) { if (password != null) { @@ -253,25 +260,25 @@ public class ZipUtils while ((theEntry = s.GetNextEntry()) != null) { - string directoryName = ""; - string pathToZip = ""; + var directoryName = ""; + var pathToZip = ""; pathToZip = theEntry.Name; if (pathToZip != "") directoryName = Path.GetDirectoryName(pathToZip) + "\\"; - string fileName = Path.GetFileName(pathToZip); + var fileName = Path.GetFileName(pathToZip); Directory.CreateDirectory(strDirectory + directoryName); if (fileName != "") { - if ((File.Exists(strDirectory + directoryName + fileName) && overWrite) || (!File.Exists(strDirectory + directoryName + fileName))) + if (File.Exists(strDirectory + directoryName + fileName) && overWrite || !File.Exists(strDirectory + directoryName + fileName)) { - using (FileStream streamWriter = File.Create(strDirectory + directoryName + fileName)) + using (var streamWriter = File.Create(strDirectory + directoryName + fileName)) { - int size = 2048; - byte[] data = new byte[2048]; + var size = 2048; + var data = new byte[2048]; while (true) { size = s.Read(data, 0, data.Length); @@ -321,14 +328,14 @@ public class ZipUtils /// 文件名称列表(包含子目录) public static List GetFiles(string zipedFile, List fileExtension) { - List files = new List(); + var files = new List(); if (!File.Exists(zipedFile)) { //return files; throw new FileNotFoundException(zipedFile); } - using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipedFile))) + using (var s = new ZipInputStream(File.OpenRead(zipedFile))) { ZipEntry theEntry; while ((theEntry = s.GetNextEntry()) != null) @@ -372,16 +379,17 @@ public class ZipUtils /// 文件列表 /// 保存路径 /// 是否本地 - public static string ZipFiles(string zipName, List fileList, out string error, bool isLocal = true) + public static string ZipFiles(string zipName, List fileList, out string error, + bool isLocal = true) { error = string.Empty; - string path = string.Format("/ZipFiles/{0}/{1}/{2}/", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day); + var path = string.Format("/ZipFiles/{0}/{1}/{2}/", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day); //文件保存目录 - string directory = App.WebHostEnvironment.WebRootPath + path; + var directory = App.WebHostEnvironment.WebRootPath + path; - string url = App.Configuration["FileHostUrl"].TrimEnd('/') + path + zipName; - string savePath = directory + zipName; + var url = App.Configuration["FileHostUrl"].TrimEnd('/') + path + zipName; + var savePath = directory + zipName; try { if (!Directory.Exists(directory)) @@ -389,16 +397,16 @@ public class ZipUtils Directory.CreateDirectory(directory); } - using (ZipOutputStream zipStream = new ZipOutputStream(File.Create(savePath))) + using (var zipStream = new ZipOutputStream(File.Create(savePath))) { - zipStream.SetLevel(9); //压缩级别0-9 + zipStream.SetLevel(9);//压缩级别0-9 foreach (var item in fileList) { byte[] buffer = null; if (isLocal) { - FileStream stream = new FileInfo(item.FilePath).OpenRead(); + var stream = new FileInfo(item.FilePath).OpenRead(); buffer = new byte[stream.Length]; stream.Read(buffer, 0, Convert.ToInt32(stream.Length)); } @@ -406,7 +414,7 @@ public class ZipUtils { buffer = new WebClient().DownloadData(item.FilePath);//取消 } - ZipEntry entry = new ZipEntry(item.FileName); + var entry = new ZipEntry(item.FileName); entry.DateTime = DateTime.Now; entry.Size = buffer.Length; zipStream.PutNextEntry(entry); @@ -427,22 +435,22 @@ public class ZipUtils public static string CompressDirectory(string dirPath, bool deleteDir) { //压缩文件路径 - string pCompressPath = dirPath + ".zip"; + var pCompressPath = dirPath + ".zip"; if (File.Exists(pCompressPath)) File.Delete(pCompressPath); //创建压缩文件 - FileStream pCompressFile = new FileStream(pCompressPath, FileMode.Create); - using (ZipOutputStream zipoutputstream = new ZipOutputStream(pCompressFile)) + var pCompressFile = new FileStream(pCompressPath, FileMode.Create); + using (var zipoutputstream = new ZipOutputStream(pCompressFile)) { - Crc32 crc = new Crc32(); - Dictionary fileList = GetAllFies(dirPath); - foreach (KeyValuePair item in fileList) + var crc = new Crc32(); + var fileList = GetAllFies(dirPath); + foreach (var item in fileList) { - FileStream fs = new FileStream(item.Key.ToString(), FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + var fs = new FileStream(item.Key, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); // FileStream fs = File.OpenRead(item.Key.ToString()); - byte[] buffer = new byte[fs.Length]; + var buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); - ZipEntry entry = new ZipEntry(item.Key.Substring(dirPath.Length)); + var entry = new ZipEntry(item.Key.Substring(dirPath.Length)); entry.DateTime = item.Value; entry.Size = fs.Length; fs.Close(); @@ -466,15 +474,15 @@ public class ZipUtils /// private static Dictionary GetAllFies(string dir) { - Dictionary FilesList = new Dictionary(); - DirectoryInfo fileDire = new DirectoryInfo(dir); + var filesList = new Dictionary(); + var fileDire = new DirectoryInfo(dir); if (!fileDire.Exists) { - throw new System.IO.FileNotFoundException("目录:" + fileDire.FullName + "没有找到!"); + throw new FileNotFoundException("目录:" + fileDire.FullName + "没有找到!"); } - GetAllDirFiles(fileDire, FilesList); - GetAllDirsFiles(fileDire.GetDirectories(), FilesList); - return FilesList; + GetAllDirFiles(fileDire, filesList); + GetAllDirsFiles(fileDire.GetDirectories(), filesList); + return filesList; } /// @@ -484,9 +492,9 @@ public class ZipUtils /// private static void GetAllDirsFiles(DirectoryInfo[] dirs, Dictionary filesList) { - foreach (DirectoryInfo dir in dirs) + foreach (var dir in dirs) { - foreach (FileInfo file in dir.GetFiles(".")) + foreach (var file in dir.GetFiles(".")) { filesList.Add(file.FullName, file.LastWriteTime); } @@ -501,7 +509,7 @@ public class ZipUtils /// 文件列表HastTable private static void GetAllDirFiles(DirectoryInfo dir, Dictionary filesList) { - foreach (FileInfo file in dir.GetFiles()) + foreach (var file in dir.GetFiles()) { filesList.Add(file.FullName, file.LastWriteTime); } @@ -522,4 +530,4 @@ public class FileItem /// 文件路径 /// public string FilePath { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.MessageCenter/GlobalUsing.cs b/api/SimpleAdmin/SimpleAdmin.MessageCenter/GlobalUsing.cs new file mode 100644 index 0000000000000000000000000000000000000000..7d5051f662d57b0941a083cf253e6da5f945c481 --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.MessageCenter/GlobalUsing.cs @@ -0,0 +1 @@ +global using SimpleMQTT; diff --git a/api/SimpleAdmin/SimpleAdmin.MessageCenter/MessageWorker.cs b/api/SimpleAdmin/SimpleAdmin.MessageCenter/MessageWorker.cs new file mode 100644 index 0000000000000000000000000000000000000000..55fbacbe427a090d821c5584b3951b40954873f8 --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.MessageCenter/MessageWorker.cs @@ -0,0 +1,91 @@ +using NewLife.MQTT; +using SimpleAdmin.Cache; +using SimpleAdmin.Core; +using SimpleAdmin.SqlSugar; +using SimpleAdmin.System; + +namespace SimpleAdmin.MessageCenter; + +public class MessageWorker : BackgroundService +{ + private readonly ILogger _logger; + private readonly ISimpleCacheService _simpleCacheService; + private readonly IMqttClientManager _mqttClientManager; + private readonly MqttClient _mqttClient; + + public MessageWorker(ILogger logger, ISimpleCacheService simpleCacheService, IMqttClientManager mqttClientManager) + { + _logger = logger; + _simpleCacheService = simpleCacheService; + _mqttClientManager = mqttClientManager; + _mqttClient = mqttClientManager.GetClient(); + } + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + //ȡӳٶ + var queue = _simpleCacheService.GetDelayQueue(CacheConst.CACHE_NOTIFICATION); + while (!stoppingToken.IsCancellationRequested) + { + //һʮһqueue.TakeOneAsync(-1);-1dzʱʱ䣬Ĭ0Զʾֱӷأ + var data = await queue.TakeOneAsync(-1); + if (data != 0) + { + _logger.LogDebug($"յϢ,ϢID:{data},ʱ䣺{DateTime.Now}"); + var db = DbContext.DB.CopyNew(); + //ȡϢ + var message = await db.Queryable().InSingleAsync(data); + if (message != null) + { + message.Status = SysDictConst.MESSAGE_STATUS_ALREADY; + //ȡ͵Ϣ + var messageUsers = await db.Queryable() + .Where(it => it.MessageId == message.Id && it.Status == SysDictConst.MESSAGE_STATUS_READY).ToListAsync(); + var hasError = false; + // + var result = await db.UseTranAsync(async () => + { + messageUsers.ForEach(it => + { + try + { + //Ϣ + _mqttClient.PublishAsync(MqttConst.MQTT_TOPIC_PREFIX + it.UserId, new MqttMessage() + { + MsgType = MqttConst.MQTT_MESSAGE_NEW, + Data = new MessageData() + { + Subject = message.Subject, + Content = message.Content + } + }); + it.Status = SysDictConst.MESSAGE_STATUS_ALREADY; + it.UpdateTime = DateTime.Now; + } + catch (Exception e) + { + hasError = true; + _logger.LogError($"Ϣʧ:{e.Message}"); + } + }); + await db.Updateable(messageUsers).ExecuteCommandAsync(); + await db.Updateable(message).ExecuteCommandAsync(); + }); + //ʧܵģдӳٶ + if (hasError) + { + _logger.LogDebug($"ʧܵϢ·ӳٶ"); + queue.Add(message.Id, 5); + } + } + queue.Acknowledge(data);//߶Ѿ˵ + _logger.LogDebug("ѳɹ"); + } + else + { + _logger.LogDebug("ߴӶûõ:" + DateTime.Now); + await Task.Delay(1000, stoppingToken); + } + } + } +} diff --git a/api/SimpleAdmin/SimpleAdmin.Background/Program.cs b/api/SimpleAdmin/SimpleAdmin.MessageCenter/Program.cs similarity index 67% rename from api/SimpleAdmin/SimpleAdmin.Background/Program.cs rename to api/SimpleAdmin/SimpleAdmin.MessageCenter/Program.cs index 54d13f70dd3467b96c4601bb9055a5faa9bddab5..f5909fa0b3505a678f2cfb3c2489166a9de0a4cb 100644 --- a/api/SimpleAdmin/SimpleAdmin.Background/Program.cs +++ b/api/SimpleAdmin/SimpleAdmin.MessageCenter/Program.cs @@ -1,10 +1,13 @@ try { - Console.Title = "SimpleAdmin̨"; + Console.Title = "SimpleAdminϢķ"; } -catch { }//עᱨҪcatch +catch +{ + // ignored +}//עᱨҪcatch Serve.Run(GenericRunOptions.Default - .ConfigureBuilder(hostBuilder => + .ConfigureBuilder(hostBuilder => { hostBuilder.UseWindowsService();//֧עɷ hostBuilder.ConfigureServices((hostContext, services) => @@ -13,5 +16,4 @@ Serve.Run(GenericRunOptions.Default }); return hostBuilder; }) - -); \ No newline at end of file + ); diff --git a/api/SimpleAdmin/SimpleAdmin.Background/Properties/launchSettings.json b/api/SimpleAdmin/SimpleAdmin.MessageCenter/Properties/launchSettings.json similarity index 64% rename from api/SimpleAdmin/SimpleAdmin.Background/Properties/launchSettings.json rename to api/SimpleAdmin/SimpleAdmin.MessageCenter/Properties/launchSettings.json index 7a614646bbf237994a31e9f6c1da652a4bdef3dd..5a4aa9d8216ea57634604b2ae40a025e5fb87c5f 100644 --- a/api/SimpleAdmin/SimpleAdmin.Background/Properties/launchSettings.json +++ b/api/SimpleAdmin/SimpleAdmin.MessageCenter/Properties/launchSettings.json @@ -1,6 +1,7 @@ { + "$schema": "http://json.schemastore.org/launchsettings.json", "profiles": { - "SimpleAdmin.Background": { + "SimpleAdmin.MessageCenter": { "commandName": "Project", "dotnetRunMessages": true, "environmentVariables": { @@ -8,4 +9,4 @@ } } } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.MessageCenter/SimpleAdmin.MessageCenter.csproj b/api/SimpleAdmin/SimpleAdmin.MessageCenter/SimpleAdmin.MessageCenter.csproj new file mode 100644 index 0000000000000000000000000000000000000000..112a5b325224c7471d865aa1c36e89ec0a584780 --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.MessageCenter/SimpleAdmin.MessageCenter.csproj @@ -0,0 +1,31 @@ + + + + net8.0;net7.0;net6.0 + enable + enable + dotnet-SimpleAdmin.MessageCenter-031b40d7-f6af-456f-a00c-48f5a3e234de + en-US + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/SimpleAdmin/SimpleAdmin.MessageCenter/SimpleAdmin.MessageCenter.xml b/api/SimpleAdmin/SimpleAdmin.MessageCenter/SimpleAdmin.MessageCenter.xml new file mode 100644 index 0000000000000000000000000000000000000000..3426b3866aa1874db6fe256943b1bed18ab3357c --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.MessageCenter/SimpleAdmin.MessageCenter.xml @@ -0,0 +1,8 @@ + + + + SimpleAdmin.MessageCenter + + + + diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Mqtt.Development.json b/api/SimpleAdmin/SimpleAdmin.MessageCenter/appsettings.Development.json similarity index 66% rename from api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Mqtt.Development.json rename to api/SimpleAdmin/SimpleAdmin.MessageCenter/appsettings.Development.json index 34281ee93c3f46c3a0ed95dd6867d2523fe9524b..686b93274d8d011a3a511fc776de311e0bb7aa56 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Mqtt.Development.json +++ b/api/SimpleAdmin/SimpleAdmin.MessageCenter/appsettings.Development.json @@ -1,10 +1,10 @@ { - //mqtt设置 + //mqtt "MqttSettings": { "Host": "127.0.0.1", "Port": 1883, "UserName": "admin", "SecretKey": "admin", - "ClientId": "SimpleAdminWeb" + "ClientId": "SimpleAdminMessageCenter_Dev" } } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Mqtt.Production.json b/api/SimpleAdmin/SimpleAdmin.MessageCenter/appsettings.Production.json similarity index 66% rename from api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Mqtt.Production.json rename to api/SimpleAdmin/SimpleAdmin.MessageCenter/appsettings.Production.json index 34281ee93c3f46c3a0ed95dd6867d2523fe9524b..391f3bf5b353eed02d4f29282e5029104c338ff9 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Mqtt.Production.json +++ b/api/SimpleAdmin/SimpleAdmin.MessageCenter/appsettings.Production.json @@ -1,10 +1,10 @@ { - //mqtt设置 + //mqtt "MqttSettings": { "Host": "127.0.0.1", "Port": 1883, "UserName": "admin", "SecretKey": "admin", - "ClientId": "SimpleAdminWeb" + "ClientId": "SimpleAdminMessageCenter_Pro" } } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Aop/GlobalDispatchProxy.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Aop/GlobalDispatchProxy.cs index 6cbb857cb63af3cfe46df9b4b0f06e4556da9200..9258675b350b5f2a8eb60c8662aec792a5df5e6c 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Aop/GlobalDispatchProxy.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Aop/GlobalDispatchProxy.cs @@ -1,4 +1,16 @@ -namespace SimpleAdmin.Plugin.Aop; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using SimpleAdmin.Core; + +namespace SimpleAdmin.Plugin.Aop; /// /// Aop @@ -31,13 +43,10 @@ public class GlobalDispatchProxy : AspectDispatchProxy, IDispatchProxy After(method, null, args); return method.Invoke(Target, args);//直接返回 } - else - { - var result = Before(method, args);//方法执行之前判断是否有缓存的数据 - if (result == null) result = method.Invoke(Target, args);//如果没有缓存就执行方法返回数据 - After(method, result, args);//方法执行之后干的事 - return result;//返回结果 - } + var result = Before(method, args);//方法执行之前判断是否有缓存的数据 + if (result == null) result = method.Invoke(Target, args);//如果没有缓存就执行方法返回数据 + After(method, result, args);//方法执行之后干的事 + return result;//返回结果 } /// @@ -109,16 +118,17 @@ public class GlobalDispatchProxy : AspectDispatchProxy, IDispatchProxy //判断需不需要读取缓存 if (cacheAttribute != null) { - var _redisManager = Services.GetService();// 获取redis服务 - var cacheKey = cacheAttribute.CustomKeyValue ?? CustomCacheKey(cacheAttribute.KeyPrefix, method, args);//如果redisKey值,如果有自定义值就用自定义Key,否则以前缀+系统自动生成的Key - var cacheValue = string.Empty; - if (cacheAttribute.StoreType == CacheConst.Cache_Hash)//如果存的是Hash值 + var redisManager = Services.GetService();// 获取redis服务 + var cacheKey = cacheAttribute.CustomKeyValue + ?? CustomCacheKey(cacheAttribute.KeyPrefix, method, args);//如果redisKey值,如果有自定义值就用自定义Key,否则以前缀+系统自动生成的Key + string cacheValue; + if (cacheAttribute.StoreType == CacheConst.CACHE_HASH)//如果存的是Hash值 { - cacheValue = _redisManager.HashGet(cacheKey, new string[] { args[0].ToString() })[0];//从redis获取Hash数据取第一个,注意是 string 类型 + cacheValue = redisManager.HashGet(cacheKey, args[0].ToString())[0];//从redis获取Hash数据取第一个,注意是 string 类型 } else { - cacheValue = _redisManager.Get(cacheKey);//注意是 string 类型,方法GetValue + cacheValue = redisManager.Get(cacheKey);//注意是 string 类型,方法GetValue } if (!string.IsNullOrEmpty(cacheValue))//如果返回值不是空 { @@ -150,10 +160,7 @@ public class GlobalDispatchProxy : AspectDispatchProxy, IDispatchProxy dynamic result = JsonConvert.DeserializeObject(cacheValue, returnType);//序列化数据 return result; } - else - { - return cacheValue; - } + return cacheValue; } } return null; @@ -174,29 +181,29 @@ public class GlobalDispatchProxy : AspectDispatchProxy, IDispatchProxy var cacheKey = cacheAttribute.CustomKeyValue ?? CustomCacheKey(cacheAttribute.KeyPrefix, method, args); if (!string.IsNullOrWhiteSpace(cacheKey))//如果有key { - var _redisManager = Services.GetService();// 获取redis服务 + var redisManager = Services.GetService();// 获取redis服务 if (cacheAttribute.IsDelete)//判断是否是删除操作 { //删除Redis整个KEY - _redisManager.Remove(cacheKey); + redisManager.Remove(cacheKey); } else { if (returnValue == null) { return; } - if (cacheAttribute.StoreType == CacheConst.Cache_Hash)//如果是hash类型的 + if (cacheAttribute.StoreType == CacheConst.CACHE_HASH)//如果是hash类型的 { //插入到hash,这里规定是方法的第一个参数 - _redisManager.HashAdd(cacheKey, args[0].ToString(), returnValue); + redisManager.HashAdd(cacheKey, args[0].ToString(), returnValue); } else { if (cacheAttribute.AbsoluteExpiration != null)//如果有超时时间 { - _redisManager.Set(cacheKey, returnValue, cacheAttribute.AbsoluteExpiration.Value);//插入redis + redisManager.Set(cacheKey, returnValue, cacheAttribute.AbsoluteExpiration.Value);//插入redis } else { - _redisManager.Set(cacheKey, returnValue);//插入redis + redisManager.Set(cacheKey, returnValue);//插入redis } } } @@ -226,7 +233,7 @@ public class GlobalDispatchProxy : AspectDispatchProxy, IDispatchProxy { var typeName = Target.GetType().Name;//获取实例名 var methodName = method.Name;//获取方法名 - key = $"{CacheConst.Cache_Prefix_Web}{typeName}:{methodName}:";//生成Key + key = $"{CacheConst.CACHE_PREFIX_WEB}{typeName}:{methodName}:";//生成Key foreach (var param in methodArguments)//遍历参数列表 { key = $"{key}{param}:";//生成加上参数的KEY @@ -248,7 +255,7 @@ internal static class GetCacheKey /// public static string GetArgumentValue(object arg) { - if (arg is DateTime || arg is DateTime?) + if (arg is DateTime || arg is DateTime) return ((DateTime)arg).ToString("yyyyMMddHHmmss"); if (arg is string || arg is ValueType || arg is Nullable) @@ -262,7 +269,7 @@ internal static class GetCacheKey var result = Resolve(obj); return MD5Encryption.Encrypt(result); } - else if (arg.GetType().IsClass) + if (arg.GetType().IsClass) { return MD5Encryption.Encrypt(JsonConvert.SerializeObject(arg)); } @@ -322,40 +329,38 @@ internal static class GetCacheKey //已经修改过代码body应该不会是null值了 if (!(expression is BinaryExpression body)) return string.Empty; - var Operator = GetOperator(body.NodeType); - var Left = Resolve(body.Left); - var Right = Resolve(body.Right); - var Result = string.Format("({0} {1} {2})", Left, Operator, Right); - return Result; + var @operator = GetOperator(body.NodeType); + var left = Resolve(body.Left); + var right = Resolve(body.Right); + var result = string.Format("({0} {1} {2})", left, @operator, right); + return result; } private static string ResolveFunc(Expression left, Expression right, ExpressionType expressiontype) { - var Name = (left as MemberExpression).Member.Name; - var Value = (right as ConstantExpression).Value; - var Operator = GetOperator(expressiontype); - return Name + Operator + Value ?? "null"; + var name = (left as MemberExpression).Member.Name; + var value = (right as ConstantExpression).Value; + var @operator = GetOperator(expressiontype); + return name + @operator + value; } private static string ResolveLinqToObject(Expression expression, object value, ExpressionType? expressiontype = null) { - var MethodCall = expression as MethodCallExpression; - var MethodName = MethodCall.Method.Name; - switch (MethodName) + var methodCall = expression as MethodCallExpression; + var methodName = methodCall.Method.Name; + switch (methodName) { case "Contains": - if (MethodCall.Object != null) - return Like(MethodCall); - return In(MethodCall, value); + return methodCall.Object != null ? Like(methodCall) : In(methodCall, value); case "Count": - return Len(MethodCall, value, expressiontype.Value); + return Len(methodCall, value, expressiontype.Value); case "LongCount": - return Len(MethodCall, value, expressiontype.Value); + return Len(methodCall, value, expressiontype.Value); default: - throw new Exception(string.Format("不支持{0}方法的查找!", MethodName)); + throw new Exception(string.Format("不支持{0}方法的查找!", methodName)); } } @@ -379,40 +384,40 @@ internal static class GetCacheKey private static string In(MethodCallExpression expression, object isTrue) { - var Argument1 = (expression.Arguments[0] as MemberExpression).Expression as ConstantExpression; - var Argument2 = expression.Arguments[1] as MemberExpression; - var Field_Array = Argument1.Value.GetType().GetFields().First(); - object[] Array = Field_Array.GetValue(Argument1.Value) as object[]; - List SetInPara = new List(); - for (var i = 0; i < Array.Length; i++) + var argument1 = (expression.Arguments[0] as MemberExpression).Expression as ConstantExpression; + var argument2 = expression.Arguments[1] as MemberExpression; + var fieldArray = argument1.Value.GetType().GetFields().First(); + var array = fieldArray.GetValue(argument1.Value) as object[]; + var setInPara = new List(); + for (var i = 0; i < array.Length; i++) { - var Value = Array[i].ToString(); - SetInPara.Add(Value); + var value = array[i].ToString(); + setInPara.Add(value); } - var Name = Argument2.Member.Name; - var Operator = Convert.ToBoolean(isTrue) ? "in" : " not in"; - var CompName = string.Join(",", SetInPara); - var Result = string.Format("{0} {1} ({2})", Name, Operator, CompName); - return Result; + var name = argument2.Member.Name; + var @operator = Convert.ToBoolean(isTrue) ? "in" : " not in"; + var compName = string.Join(",", setInPara); + var result = string.Format("{0} {1} ({2})", name, @operator, compName); + return result; } private static string Like(MethodCallExpression expression) { - var Temp = expression.Arguments[0]; - var lambda = Expression.Lambda(Temp); + var temp = expression.Arguments[0]; + var lambda = Expression.Lambda(temp); var fn = lambda.Compile(); - var tempValue = Expression.Constant(fn.DynamicInvoke(null), Temp.Type); - var Value = string.Format("%{0}%", tempValue); - var Name = (expression.Object as MemberExpression).Member.Name; - var Result = string.Format("{0} like {1}", Name, Value); - return Result; + var tempValue = Expression.Constant(fn.DynamicInvoke(null), temp.Type); + var value = string.Format("%{0}%", tempValue); + var name = (expression.Object as MemberExpression).Member.Name; + var result = string.Format("{0} like {1}", name, value); + return result; } private static string Len(MethodCallExpression expression, object value, ExpressionType expressiontype) { - object Name = (expression.Arguments[0] as MemberExpression).Member.Name; - var Operator = GetOperator(expressiontype); - var Result = string.Format("len({0}){1}{2}", Name, Operator, value.ToString()); - return Result; + object name = (expression.Arguments[0] as MemberExpression).Member.Name; + var @operator = GetOperator(expressiontype); + var result = string.Format("len({0}){1}{2}", name, @operator, value); + return result; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Attributes/CacheAttribute.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Attributes/CacheAttribute.cs index f63667278fdc575f3a253db13a6340af3b8eaf76..ad9014a9e4a7c5951d7c6dd163c7471fdcc98ed7 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Attributes/CacheAttribute.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Attributes/CacheAttribute.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Plugin.Aop; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Plugin.Aop; /// /// 缓存结果特性 @@ -29,4 +39,4 @@ public class CacheAttribute : Attribute /// 存储类型 /// public string StoreType { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/GlobalUsing.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/GlobalUsing.cs index 5e623d1b9e99d564c919f256bae1f83fac7c0bf6..58094d401274fd3ed36561a5b3e69d25ea2ea97b 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/GlobalUsing.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/GlobalUsing.cs @@ -1,8 +1,18 @@ -global using Furion.DataEncryption; -global using Furion.Reflection; -global using Furion.Reflection.Extensions; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +global using MoYu.DataEncryption; +global using MoYu.Reflection; +global using MoYu.Reflection.Extensions; global using Microsoft.Extensions.DependencyInjection; global using Newtonsoft.Json; global using SimpleAdmin.Cache; global using System.Linq.Expressions; -global using System.Reflection; \ No newline at end of file +global using System.Reflection; diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/SimpleAdmin.Plugin.Aop.csproj b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/SimpleAdmin.Plugin.Aop.csproj index 19af1946c51400f0ea8aed9bcddb2688bb505bc9..99705fb28d8d70874b9ed94c4410c7bc3a5bd46d 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/SimpleAdmin.Plugin.Aop.csproj +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/SimpleAdmin.Plugin.Aop.csproj @@ -1,15 +1,7 @@  - - net7.0;net6.0 - 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 - SimpleAdmin.Plugin.Aop.xml - enable - enable - - - - - + + + diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Enum/NoticeComponent.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Enum/NoticeComponent.cs deleted file mode 100644 index a045e69a7f977a9198f9c5afe703955fcedfcf0b..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Enum/NoticeComponent.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace SimpleAdmin.Plugin.Core; - -/// -/// 通知组件类型 -/// -public enum NoticeComponent -{ - Signalr, Mqtt -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/GlobalUsing.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/GlobalUsing.cs deleted file mode 100644 index 306646a3a87a4bfc586d18a8a7b0c6c068ceda84..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/GlobalUsing.cs +++ /dev/null @@ -1 +0,0 @@ -global using Furion.DependencyInjection; \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Options/PluginSettingsOptions.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Options/PluginSettingsOptions.cs deleted file mode 100644 index c605386d8b3a940f40081dc9bf3de01c3f2774bf..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Options/PluginSettingsOptions.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Furion.ConfigurableOptions; - -namespace SimpleAdmin.Plugin.Core; - -/// -/// 插件配置选项 -/// -public class PluginSettingsOptions : IConfigurableOptions -{ - /// - /// 是否开启SignalR - /// - public bool UseSignalR { get; set; } = true; - - /// - /// 是否开启Mqtt - /// - public bool UseMqtt { get; set; } = false; - - /// - /// 默认通知类型 - /// SignalR/Mqtt - /// - public NoticeComponent NoticeComponent { get; set; } = NoticeComponent.Signalr; -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/SimpleAdmin.Plugin.Core.xml b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/SimpleAdmin.Plugin.Core.xml deleted file mode 100644 index 5fc9cbe506ab2491896f9d5f1347e6303e0a4938..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/SimpleAdmin.Plugin.Core.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - SimpleAdmin.Plugin.Core - - - - - 通知组件类型 - - - - - 通知服务 - - - - - 通知用户下线 - - 用户ID - clientId列表 - 通知内容 - - - - - 通知用户修改密码 - - 用户ID - clientId列表 - 通知内容 - - - - - 收到新的消息 - - 用户Id列表 - clientId列表 - - - - - - 插件配置选项 - - - - - 是否开启SignalR - - - - - 是否开启Mqtt - - - - - 默认通知类型 - SignalR/Mqtt - - - - diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Controllers/Controller.cs.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Controllers/Controller.cs.vm deleted file mode 100644 index 34f21484d06dc0b78e9b6a636707789b6a9fcf2e..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Controllers/Controller.cs.vm +++ /dev/null @@ -1,299 +0,0 @@ -@{ -var dataPermission=@Model.DataPermission=="Y";//是否启用数据权限 -var isOrgTree=@Model.LeftTree=="org";//是否启用组织树 -var funcList=@Model.FuncList;//获取功能列表 -var isTreeList = @Model.ModuleType=="treeList";//是否是树表-列表 -var isTreeTree = @Model.ModuleType=="treeTree"; //是否是树-树 -var tableFieIds=@Model.TableFields;//获取字段 -} -using Microsoft.AspNetCore.Mvc; -using System.ComponentModel; -using Furion.DynamicApiController; -using @(@Model.ServicePosition); - -namespace @(@Model.ControllerPosition); - -/// -/// @(@Model.FunctionName)控制器 -/// -[ApiDescriptionSettings("@(@Model.ApiGroup)", Tag = "@(@Model.FunctionName)")] -[Route("/@(@Model.RouteName)/@(@Model.BusName)")] -@if(dataPermission) @:[RolePermission] -public class @(@Model.ClassName)Controller: IDynamicApiController -{ - private readonly I@(@Model.ServiceName) _@(@Model.ServiceFirstLower); - @if(isOrgTree){ - @if(dataPermission){ - @:private readonly IOrgService _orgService; - } - else{ - @:private readonly ISysOrgService _sysOrgService; - } - } - public @(@Model.ClassName)Controller(I@(@Model.ServiceName) @(@Model.ServiceFirstLower) - @if(isOrgTree){ - @if(dataPermission){ - @:,IOrgService orgService - } - else{ - @:,ISysOrgService sysOrgService - } - } - ) - { - this._@(@Model.ServiceFirstLower) = @(@Model.ServiceFirstLower); - @if(isOrgTree){ - @if(dataPermission){ - @:_orgService = orgService; - } - else{ - @:_sysOrgService = sysOrgService; - } - } - } - #region Get请求 - - /// - /// @(@Model.DescriptionPage) - /// - /// - /// - [HttpGet("page")] - [DisplayName("@(@Model.DescriptionPage)")] - public async Task Page([FromQuery] @Model.PageInput input) - { - return await _@(@Model.ServiceFirstLower).Page(input); - } - - /// - /// @(@Model.DescriptionList) - /// - /// - /// - [HttpGet("list")] - [DisplayName("@(@Model.DescriptionList)")] - public async Task List([FromQuery] @Model.PageInput input) - { - return await _@(@Model.ServiceFirstLower).List(input); - } - - /// - /// @(@Model.DescriptionDetail) - /// - /// - /// - [HttpGet("detail")] - [DisplayName("@(@Model.DescriptionDetail)")] - public async Task Detail([FromQuery] BaseIdInput input) - { - return await _@(@Model.ServiceFirstLower).Detail(input); - } - - @{Fk();} - - @{Tree();} - - @{OtherGet();} - - #endregion - - - #region Post请求 - - /// - /// @(@Model.DescriptionAdd) - /// - /// - /// - [HttpPost("add")] - [DisplayName("@(@Model.DescriptionAdd)")] - public async Task Add([FromBody] @(@Model.ClassName)AddInput input) - { - await _@(@Model.ServiceFirstLower).Add(input); - } - - /// - /// @(@Model.DescriptionEdit) - /// - /// - /// - [HttpPost("edit")] - [DisplayName("@(@Model.DescriptionEdit)")] - public async Task Edit([FromBody] @(@Model.ClassName)EditInput input) - { - await _@(@Model.ServiceFirstLower).Edit(input); - } - - /// - /// @(@Model.DescriptionDelete) - /// - /// - /// - [HttpPost("delete")] - [DisplayName("@(@Model.DescriptionDelete)")] - public async Task Delete([FromBody] List input) - { - await _@(@Model.ServiceFirstLower).Delete(input); - } - - @{OtherPost();} - #endregion -} - -@{ - -void Fk(){ -foreach (var column in tableFieIds){//遍历字段 -if(column.EffectType=="fk"){//如果是外键 - @:/// - @:/// @(column.FieldRemark)选择器 - @:/// - @:/// - @:[HttpGet("fk@(column.FkEntityName)Selector")] - @:[DisplayName("@(column.FieldRemark)选择器")] - @:public async Task Fk@(column.FkEntityName)Selector() - @:{ - @:return await _@(@Model.ServiceFirstLower).Fk@(column.FkEntityName)Selector(); - @:} - @: -} -} -} - -void OtherGet(){ -foreach(var func in funcList){ -switch (func)//根据类型生成不同请求 -{ -//导入 -case "import": - @:/// - @:/// @(@Model.DescriptionPreview) - @:/// - @:/// - @:/// - @:[HttpPost("preview")] - @:[DisableRequestSizeLimit] - @:[SuppressMonitor] - @:[DisplayName("@(@Model.DescriptionPreview)")] - @:public async Task Preview([FromForm] ImportPreviewInput input) - @:{ - @:return await _@(@Model.ServiceFirstLower).Preview(input); - @:} - @: - @:/// - @:/// @(@Model.DescriptionTemplate) - @:/// - @:/// - @:[HttpGet("template")] - @:[SuppressMonitor] - @:public async Task Template() - @:{ - @:return await _@(@Model.ServiceFirstLower).Template(); - @:} - @: -break; -} -} -} - -//左侧树接口 -void Tree(){ -if(isOrgTree){ - @:/// - @:/// 获取组织树选择器 - @:/// - @:/// - @:[HttpGet("orgTreeSelector")] - @:[DisplayName("组织树查询")] - @:public async Task OrgTreeSelector() - @:{ - @if(dataPermission){ - @:return await _orgService.Tree(); - } - else{ - @:return await _sysOrgService.Tree(); - } - @:} -} -else if(isTreeList){ - @:/// - @:/// @(@Model.DescriptionTree) - @:/// - @:/// - @:[HttpGet("tree")] - @:[DisplayName("@(@Model.DescriptionTree)")] - @:public async Task Tree() - @:{ - @:return await _@(@Model.ServiceFirstLower).Tree(); - @:} -} -else if(isTreeTree){ - @:/// - @:/// @(@Model.DescriptionTree) - @:/// - @:/// - @:[HttpGet("tree")] - @:[DisplayName("@(@Model.DescriptionTree)")] - @:public async Task Tree([FromQuery] @Model.TreeInput input) - @:{ - @:return await _@(@Model.ServiceFirstLower).Tree(input); - @:} -} - -} - -void OtherPost(){ -foreach(var func in funcList){ -switch (func)//根据类型生成不同请求 -{ -//导入 -case "import": - @:/// - @:/// @(@Model.DescriptionImport) - @:/// - @:/// - @:/// - @:[HttpPost("import")] - @:[DisplayName("@(@Model.DescriptionImport)")] - @:public async Task Import([SuppressMonitor][FromBody] ImportResultInput<@(@Model.ClassName)ImportInput> input) - @:{ - @:return await _@(@Model.ServiceFirstLower).Import(input); - @:} - @: -break; -//导出 -case "export": - @:/// - @:/// @(@Model.DescriptionExport) - @:/// - @:/// - @:/// - @:[HttpPost("export")] - @:[DisplayName("@(@Model.DescriptionExport)")] - @:public async Task Export([FromBody] @Model.PageInput input) - @:{ - @:return await _@(@Model.ServiceFirstLower).Export(input); - @:} - @: -break; -//批量编辑 -case "batchEdit": - @:/// - @:/// @(@Model.DescriptionEdits) - @:/// - @:/// - @:/// - @:[HttpPost("edits")] - @:[DisplayName("@(@Model.DescriptionEdits)")] - @:public async Task Edits([FromBody] BatchEditInput input) - @:{ - @:await _@(@Model.ServiceFirstLower).Edits(input); - @:} - @: -break; -} -} -} - - -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/Dto/Input.cs.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/Dto/Input.cs.vm deleted file mode 100644 index fc9c3ea56481244931887b6395a10983299b1306..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/Dto/Input.cs.vm +++ /dev/null @@ -1,170 +0,0 @@ -@{ - var tableFieIds=@Model.TableFields;//获取字段 - var isTreeList = @Model.ModuleType=="treeList";//是否是树表-列表 - var isTreeTree = @Model.ModuleType=="treeTree"; //是否是树-树 -} -using System; -using System.ComponentModel.DataAnnotations; -using Masuit.Tools.Core.Validator; -namespace @(@Model.ServicePosition); - -/// -/// @(@Model.DescriptionPage)参数 -/// -public class @Model.PageInput : BasePageInput -{ - @{PageInput();} - @if(@Model.LeftTree=="org"){ - @:/// - @:/// 组织机构Id - @:/// - @:public long OrgId { get; set; } - } - @if(isTreeList){ - @:/// - @:/// 父Id - @:/// - @:public long @Model.TreePid { get; set; } - } -} - - -/// -/// @(@Model.DescriptionAdd)参数 -/// -public class @Model.AddInput -{ - @{AddInput();} -} - -/// -/// @(@Model.DescriptionEdit)参数 -/// -public class @Model.EditInput : @Model.AddInput -{ - /// - /// Id - /// - [IdNotNull(ErrorMessage = "Id不能为空")] - public long Id { get; set; } -} - -@if(isTreeTree){ -@{TreeTree();} -} - -@{OtherInput();} - -@{ - -void TreeTree(){ -@:/// -@:/// @(@Model.DescriptionTree)参数 -@:/// -@:public class @Model.TreeInput -@:{ - @{PageInput();} -@:} -} - -void OtherInput(){ -var funcList=@Model.FuncList;//获取功能列表 -foreach(var func in funcList){ -switch (func)//根据类型生成不同请求 -{ -//导入 -case "import": -@:/// -@:/// @(@Model.DescriptionImport) -@:/// -@:public class @(@Model.ClassName)ImportInput : ImportTemplateInput -@:{ - ImportInput(); -@:} -break; -}} - -} - -//生成导入字段 -void ImportInput(){ - foreach (var column in tableFieIds){ - if(column.WhetherImportExport=="Y")//判断是否新增 - { - @:/// - @:/// @column.FieldRemark - @:/// - @:[ImporterHeader(Name = "@column.FieldRemark")] - if(column.WhetherImportExport=="Y")//判断是否必填 - { - @:[Required(ErrorMessage = "@(@column.FieldRemark)不能为空")] - } - if(column.FieldNetType!="string")//如果不是string类型后面要加?号 - { - @:public @(@column.FieldNetType)? @column.FieldName { get; set; } - }else{ - @:public @column.FieldNetType @column.FieldName { get; set; } - } - @: - } - } -} - -//生成分页字段 -void PageInput() -{ - foreach (var column in tableFieIds){ - if(column.QueryWhether=="Y")//判断是否查询 - { - if(column.EffectType=="datepicker"){//如果是时间类型 - @:/// - @:/// @column.FieldRemark - @:/// - @:public @column.FieldNetType? Start@(@column.FieldName) { get; set; } - @: - @:/// - @:/// @column.FieldRemark - @:/// - @:public @column.FieldNetType? End@(@column.FieldName) { get; set; } - @: - } - else{ - @:/// - @:/// @column.FieldRemark - @:/// - if(column.FieldNetType!="string")//如果不是string类型后面要加?号 - { - @:public @(@column.FieldNetType)? @column.FieldName { get; set; } - }else{ - @:public @column.FieldNetType @column.FieldName { get; set; } - } - @: - }}}} -} - -@{ -//生成新增字段 -void AddInput() -{ - foreach (var column in tableFieIds){//遍历字段 - if(column.WhetherAddUpdate=="Y")//判断是否新增 - { - @:/// - @:/// @column.FieldRemark - @:/// - if(column.WhetherRequired=="Y")//判断是否必填 - { - @:[Required(ErrorMessage = "@(@column.FieldName)不能为空")] - } - if(column.FieldNetType!="string")//如果不是string类型后面要加?号 - { - @:public @(@column.FieldNetType)? @column.FieldName { get; set; } - }else{ - @:public @column.FieldNetType @column.FieldName { get; set; } - } - @: - } - } -} -} - diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/Dto/Output.cs.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/Dto/Output.cs.vm deleted file mode 100644 index c4659ed310486b39df515c000f8741f9b264636f..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/Dto/Output.cs.vm +++ /dev/null @@ -1,44 +0,0 @@ -namespace @(@Model.ServicePosition); - -@{OtherOutput();} - - - -@{ - -void OtherOutput(){ -var funcList=@Model.FuncList;//获取功能列表 -foreach(var func in funcList){ -switch (func)//根据类型生成不同请求 -{ -//导入 -case "export": -@:/// -@:/// @(@Model.DescriptionExport) -@:/// -@:[ExcelExporter(Name = "@(@Model.FunctionName)信息", TableStyle = TableStyles.Light10, AutoFitAllColumn = true)] -@:public class @(@Model.ClassName)ExportOutput -@:{ - ExportOutput(); -@:} -break; -}} - -} - -void ExportOutput(){ - var tableFieIds=@Model.TableFields;//获取字段 - foreach (var column in tableFieIds){ - if(column.WhetherImportExport=="Y")//判断是否新增 - { - @:/// - @:/// @column.FieldRemark - @:/// - @:[ExporterHeader(DisplayName = "@column.FieldRemark")] - @:public string @column.FieldName { get; set; } - @: - } - } -} - -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/IService.cs.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/IService.cs.vm deleted file mode 100644 index 671ff8188d15ea305ea67c50afa7fecd4f9de524..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/IService.cs.vm +++ /dev/null @@ -1,164 +0,0 @@ -@{ -var isTreeList = @Model.ModuleType=="treeList";//是否是树表-列表 -var isTreeTree = @Model.ModuleType=="treeTree"; //是否是树-树 -var tableFieIds=@Model.TableFields;//获取字段 -} -using Furion.DependencyInjection; -using SimpleAdmin.Core; - -namespace @(@Model.ServicePosition); - -/// -/// @(@Model.FunctionName)服务 -/// -public interface I@(@Model.ServiceName) : ITransient -{ - #region 查询 - - /// - /// @Model.DescriptionPage - /// - /// 查询参数 - /// @(@Model.FunctionName)分页 - Task> Page(@Model.PageInput input); - - /// - /// @Model.DescriptionList - /// - /// 查询参数 - /// @(@Model.FunctionName)列表 - Task> List(@Model.PageInput input); - - /// - /// @Model.DescriptionDetail - /// - /// Id参数 - /// 详细信息 - Task<@(@Model.EntityName)> Detail(BaseIdInput input); - - @if(isTreeList){ - @:/// - @:/// @Model.DescriptionTree - @:/// - @:/// @(@Model.FunctionName)树 - @:Task> Tree(); - } - @if(isTreeTree){ - @:/// - @:/// @Model.DescriptionTree - @:/// - @:/// @(@Model.FunctionName)树 - @:Task> Tree(@Model.TreeInput input); - } - - @{Fk();} - #endregion - - #region 新增 - - /// - /// @Model.DescriptionAdd - /// - /// 添加参数 - /// - Task Add(@Model.AddInput input); - - #endregion - - #region 编辑 - /// - /// @Model.DescriptionEdit - /// - /// 编辑参数 - /// - Task Edit(@Model.EditInput input); - - @if(@Model.FuncList.Contains("batchEdit")){ - @:/// - @:/// @(@Model.DescriptionEdits) - @:/// - @:/// 批量编辑信息 - @:/// - @:Task Edits(BatchEditInput input); - } - #endregion - - #region 删除 - - /// - /// @Model.DescriptionDelete - /// - /// 删除参数 - /// - Task Delete(List input); - - #endregion - - #region 导入导出 - - @{ImportExport();} - - #endregion -} - -@{ - -void Fk(){ -foreach (var column in tableFieIds){//遍历字段 -if(column.EffectType=="fk"){//如果是外键 - @:/// - @:/// @(column.FieldRemark)选择器 - @:/// - @:/// - @:Task> Fk@(column.FkEntityName)Selector(); - -} -} -} - -void ImportExport(){ - -var funcList=@Model.FuncList;//获取功能列表 -foreach(var func in funcList){ -switch (func)//根据类型生成不同请求 -{ -//导入 -case "import": - @:/// - @:/// @(@Model.DescriptionTemplate) - @:/// - @:/// 模板 - @:Task Template(); - @: - @:/// - @:/// @(@Model.DescriptionPreview) - @:/// - @:/// 预览参数 - @:/// 预览结果 - @:Task> Preview(ImportPreviewInput input); - @: - @:/// - @:/// @(@Model.DescriptionImport) - @:/// - @:/// - @:/// - @:Task> Import(ImportResultInput<@(@Model.ClassName)ImportInput> input); - @: -break; -//导出 -case "export": - @:/// - @:/// @(@Model.DescriptionExport) - @:/// - @:/// - @:/// - @:Task Export(@Model.PageInput input); -break; -} -} - -} - - - -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/Service.cs.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/Service.cs.vm deleted file mode 100644 index 645c7b528205c84bfa4e96de76be05832d0dd65c..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/Service.cs.vm +++ /dev/null @@ -1,451 +0,0 @@ -@{ -var orgField=@Model.TableFields.Any(it=>it.FieldName=="OrgId")?"OrgId":"CreateOrgId";//机构字段 -var dataPermission=@Model.DataPermission=="Y";//是否有数据权限 -var tableFieIds=@Model.TableFields;//获取字段 -var isTreeList = @Model.ModuleType=="treeList";//是否是树表-列表 -var isTreeTree = @Model.ModuleType=="treeTree"; //是否是树-树 -var isMasterChild = @Model.ModuleType=="masterChild"; //是否是主子表 -} - -using Furion.FriendlyException; -using Mapster; -using SimpleAdmin.Core; -using Microsoft.Extensions.Logging; -using Microsoft.AspNetCore.Mvc; -using SqlSugar; - -namespace @(@Model.ServicePosition); - -/// -/// -/// -public class @(@Model.ServiceName) : DbRepository<@(@Model.EntityName)>, I@(@Model.ServiceName) -{ - private readonly ILogger<@(@Model.ServiceName)> _logger; - private readonly ISysUserService _sysUserService; - @if(@Model.FuncList.Contains("import")||@Model.FuncList.Contains("export")){ - @:private readonly IImportExportService _importExportService; - } - @if(@Model.FuncList.Contains("batchEdit")){ - @:private readonly IBatchEditService _batchEditService; - } - @if(@Model.LeftTree=="org"){ - @:private readonly ISysOrgService _sysOrgService; - } - - public @(@Model.ServiceName)(ILogger<@(@Model.ServiceName)> logger,ISysUserService sysUserService - @if(@Model.FuncList.Contains("import")||@Model.FuncList.Contains("export")){ - @:,IImportExportService importExportService - } - @if(@Model.FuncList.Contains("batchEdit")){ - @:,IBatchEditService updateBatchService - } - @if(@Model.LeftTree=="org"){ - @:,ISysOrgService sysOrgService - } - ) - { - _sysUserService = sysUserService; - _logger = logger; - @if(@Model.FuncList.Contains("import")||@Model.FuncList.Contains("export")){ - @:_importExportService = importExportService; - } - @if(@Model.FuncList.Contains("batchEdit")){ - @: _batchEditService = updateBatchService; - } - @if(@Model.LeftTree=="org"){ - @: _sysOrgService = sysOrgService; - } - - } - - #region 查询 - - /// - public async Task> Page(@Model.PageInput input) - { - var query = await GetQuery(input);//获取查询条件 - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 - return pageInfo; - } - - /// - public async Task> List(@Model.PageInput input) - { - var query = await GetQuery(input);//获取查询条件 - var list = await query.ToListAsync(); - return list; - } - - /// - public async Task<@(@Model.EntityName)> Detail(BaseIdInput input) - { - var @Model.ClassNameFirstLower = await GetFirstAsync(it => it.Id == input.Id); - @if(dataPermission){ - @:var errorMessage = $"您没有权限查看该数据"; - @://获取数据范围 - @:var dataScope = await _sysUserService.GetLoginUserApiDataScope(); - @:if (dataScope!=null&&(!dataScope.Contains(@(@Model.ClassNameFirstLower).@(orgField)) || @(@Model.ClassNameFirstLower).CreateUserId != UserManager.UserId))//判断机构ID是否在数据范围或者创建人是否为当前登录人 - @:throw Oops.Bah(errorMessage); - } - @if(isMasterChild){ - @:var child=await Context.Queryable<@Model.ChildTable>().Where(it => it.@(Model.ChildFk) == @(@Model.ClassNameFirstLower).Id).ToListAsync(); - } - return @Model.ClassNameFirstLower ; - - } - @if(isTreeList){ - @:/// - @:public async Task> Tree() - @:{ - @://第三个参数为0 表示 : parentid为 0 设置成根目录, 正常情况下最顶层的parentid不是0就是null - @:var tree = Context.Queryable<@(@Model.EntityName)>().ToTree(it => it.Children, it => it.ParentId, 0); - @:return tree; - @:} - } - @if(isTreeTree){ - @:/// - @:public async Task> Tree(@Model.TreeInput input) - @:{ - @://第三个参数为0 表示 : parentid为 0 设置成根目录, 正常情况下最顶层的parentid不是0就是null - @:var tree = Context.Queryable<@(@Model.EntityName)>() - @if(isTreeTree){ - @{PageWhereIf();}//查询条件 - } - @:.ToTree(it => it.Children, it => it.ParentId, 0); - @:return tree; - @:} - } - - @{Fk();}//外键查询 - #endregion - - #region 新增 - - /// - public async Task Add(@Model.AddInput input) - { - var @Model.ClassNameFirstLower = input.Adapt<@(@Model.EntityName)>();//实体转换 - await CheckInput(@Model.ClassNameFirstLower);//检查参数 - @if(dataPermission){ - @://获取数据范围 - @:var dataScope = await _sysUserService.GetLoginUserApiDataScope(); - @://判断机构ID是否在数据范围,这里只是简单示例,根据实际情况判断 - @://if (dataScope!=null&&(!dataScope.Contains(@(@Model.ClassNameFirstLower).OrgId))) - @://throw Oops.Bah("您没有权限添加该数据"); - } - await InsertAsync(@Model.ClassNameFirstLower);//插入数据 - } - - #endregion - - #region 编辑 - - /// - public async Task Edit(@Model.EditInput input) - { - var @Model.ClassNameFirstLower = input.Adapt<@(@Model.EntityName)>();//实体转换 - await CheckInput(@Model.ClassNameFirstLower);//检查参数 - @if(dataPermission){ - @://判断机构ID是否在数据范围并且创建者是自己,这里只是简单示例,根据实际情况判断 - @://if (dataScope!=null&&(!dataScope.Contains(@(@Model.ClassNameFirstLower).@(orgField)) || @(@Model.ClassNameFirstLower).CreateUserId != UserManager.UserId)) - @://throw Oops.Bah("您没有权限编辑该数据"); - } - await UpdateAsync(@Model.ClassNameFirstLower);//更新数据 - } - - @if(@Model.FuncList.Contains("batchEdit")){ - @:/// - @:public async Task Edits(BatchEditInput input) - @:{ - Edits(); - @:} - } - - #endregion - - #region 删除 - - /// - public async Task Delete(List input) - { - //获取所有ID - var ids = input.Select(it => it.Id).ToList(); - if (ids.Count > 0) - { - @if(dataPermission){ - @://获取数据范围 - @:var dataScope = await _sysUserService.GetLoginUserApiDataScope(); - @:var @(@Model.ClassNameFirstLower)s = await GetListAsync(it => ids.Contains(it.Id), it =>new @(@Model.EntityName){ @(orgField)=it.@(orgField),CreateUserId=it.CreateUserId });//根据ID获取机构ID和创建者ID - @:@(@Model.ClassNameFirstLower)s.ForEach(it => - @:{ - @: if (dataScope!=null&&!dataScope.Contains(it.@(orgField))&&it.CreateUserId != UserManager.UserId) throw Oops.Bah(ErrorCodeEnum.A0004);//如果不包含机构id并且不是自己创建的 - @:}); - } - @if(isMasterChild){ - @://如果@(Model.FunctionName)下有下级数据则不允许删除 - @:if (await Context.Queryable<@(@Model.ChildTable)>().AnyAsync(it => ids.Contains(it.@(Model.ChildFk)))) - @:{ - @:throw Oops.Bah($"有数据依赖@(Model.FunctionName),无法删除"); - @:} - } - await DeleteByIdsAsync(ids.Cast().ToArray());//删除数据 - ////事务 - //var result = await itenant.UseTranAsync(async () => - //{ - //await DeleteByIdsAsync(ids.Cast().ToArray());//删除数据 - @if(isMasterChild){ - @://Context.Deleteable<@(@Model.ChildTable)>().Where(it => ids.Contains(it.@(Model.ChildFk))).ExecuteCommandAsync();//删除子表数据 - } - //}); - //if (!result.IsSuccess)//如果成功了 - //{ - ////写日志 - //_logger.LogError(result.ErrorMessage, result.ErrorException); - //throw Oops.Oh(ErrorCodeEnum.A0002); - //} - } - } - - #endregion - - #region 导入导出 - - @{ImportExport();} - - #endregion - - #region 方法 - - /// - /// 检查输入参数 - /// - /// - private async Task CheckInput(@Model.EntityName @Model.ClassNameFirstLower) - { - @{CheckInput();} - } - - /// - /// 获取Sqlsugar的ISugarQueryable - /// - /// - /// - private async Task> GetQuery(@Model.PageInput input) - { - - @if(dataPermission){ - @://获取数据范围 - @:var dataScope = await _sysUserService.GetLoginUserApiDataScope(); - @://动态查询条件,如果是连表查询,里面的it要改成连表里对应的别名 - @:var exp = Expressionable.Create<@(@Model.EntityName)>(); - @:exp.AndIF(dataScope is { Count: > 0 }, it => dataScope.Contains(it.@(orgField)));//用户机构在数据范围内 - @:exp.AndIF(dataScope is { Count: 0 }, it => it.CreateUserId == UserManager.UserId);//默认创建者ID等于自己,根据实际情况修改条件 - } - @if(@Model.LeftTree=="org"){ - @:var orgIds = await _sysOrgService.GetOrgChildIds(input.OrgId);//获取下级机构 - } - var query = Context.Queryable<@(@Model.EntityName)>() - @{PageWhereIf();} - @if(dataPermission){ - @:.Where(exp.ToExpression()) - } - @if(@Model.LeftTree=="org"){ - @:.WhereIF(input.OrgId > 0, it => orgIds.Contains(it.@(orgField)))//根据机构ID查询 - } - @if(isTreeList){ - @:.WhereIF(input.@(@Model.TreePid) > 0, it => it.@(@Model.TreePid) ==input.@(@Model.TreePid))//父级 - } - //.WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}") - @{PageSortCode();} - return query; - } - - /// - public async Task> CheckImport<@(@Model.ClassName)ImportInput>(List<@(@Model.ClassName)ImportInput> data, bool clearError = false) - { - return data; - } - #endregion - -} - -@{ - -void Fk(){ -foreach (var column in tableFieIds){//遍历字段 -if(column.EffectType=="fk"){//如果是外键 - @:/// - @:/// @(column.FieldRemark)选择器 - @:/// - @:/// - @:public async Task> Fk@(column.FkEntityName)Selector() - @:{ - @if(dataPermission){ - @://获取数据范围 - @:var dataScope = await _sysUserService.GetLoginUserApiDataScope(); - } - @:return await Context.Queryable<@(column.FkEntityName)>() - @if(dataPermission){ - @://.WhereIf(dataScope!=null,it => it.CreateOrgId == UserManager.OrgId || (dataScope.Contains(it.Id))) - } - @:.Select(it => new BaseSelectorOutput { Value = it.@(column.FkColumnId), Label = it.@(column.FkColumnName) }).ToListAsync(); - @:} - -} -} -} - -//删除 -void Delete(){ - -} - -//批量编辑 -void Edits(){ - @if(dataPermission){ - @://获取数据范围 - @:var dataScope = await _sysUserService.GetLoginUserApiDataScope(); - @:var ids = input.Ids;//获取id列表 - @:var @(@Model.ClassNameFirstLower)s = await GetListAsync(it => ids.Contains(it.Id), it =>new @(@Model.EntityName){ @(orgField)=it.@(orgField),CreateUserId=it.CreateUserId });//根据ID获取机构ID和创建者ID - @:@(@Model.ClassNameFirstLower)s.ForEach(it => - @:{ - @: if (dataScope!=null&&!dataScope.Contains(it.@(orgField))&&it.CreateUserId != UserManager.UserId) throw Oops.Bah(ErrorCodeEnum.A0004);//如果不包含机构id并且不是自己创建的 - @:}); - } - @://获取参数字典 - @:var data = await _batchEditService.GetUpdateBatchConfigDict(input.Code, input.Columns); - @:if (data.Count > 0) - @:{ - @:await Context.Updateable<@(@Model.EntityName)>(data).Where(it => input.Ids.Contains(it.Id)).ExecuteCommandAsync(); - @:} -} - -//检查输入 -void CheckInput(){ - @:var errorMessage = $"您没有权限操作该数据"; - @:if(@(@Model.ClassNameFirstLower).Id==SimpleAdminConst.Zero){ - @://表示新增 - @:} - @:else{ - @://表示编辑 - @:} -} - -//导入导出 -void ImportExport() -{ -if(@Model.FuncList.Contains("import")) -{ - @:/// - @:public async Task Template() - @:{ - @:var templateName = "@(@Model.FunctionName)信息"; - @://var result = _importExportService.GenerateLocalTemplate(templateName); - @:var result = await _importExportService.GenerateTemplate<@(@Model.ClassName)ImportInput>(templateName); - @:return result; - @:} - @: - @:/// - @:public async Task> Preview(ImportPreviewInput input) - @:{ - @:var importPreview = await _importExportService.GetImportPreview<@(@Model.ClassName)ImportInput>(input.File); - @:importPreview.Data = await CheckImport(importPreview.Data);//检查导入数据 - @:return importPreview; - @:} - @: - @:/// - @:public async Task> Import(ImportResultInput<@(@Model.ClassName)ImportInput> input) - @:{ - @:var data = await CheckImport(input.Data, true);//检查数据格式 - @:var result = _importExportService.GetImportResultPreview(data, out var importData); - @:var @Model.ClassNameFirstLower = importData.Adapt>();//转实体 - @:await InsertOrBulkCopy(@Model.ClassNameFirstLower);// 数据导入 - @:return result; - @:} - @: -} -if(@Model.FuncList.Contains("export")) -{ - @:/// - @:public async Task Export(@Model.PageInput input) - @:{ - @:var genTests = await List(input); - @:var data = genTests.Adapt>();//转为Dto - @:var result = await _importExportService.Export(data, "@(@Model.FunctionName)信息"); - @:return result; - @:} -} -} -} - - -@{ -//生成查询条件 -void PageWhereIf() -{ - foreach (var column in tableFieIds){//遍历字段 - if(column.QueryWhether=="Y")//判断是否查询 - { - if(@column.FieldNetType.ToLower() == "string")//判断是否是字符串类型 - { - switch (@column.QueryType)//遍历查询方式 - { - case "eq"://等于 - @:.WhereIF(!string.IsNullOrWhiteSpace(input.@column.FieldName), it => it.@(@column.FieldName) == input.@(@column.FieldName)) - break; - case "like"://包含 - @:.WhereIF(!string.IsNullOrWhiteSpace(input.@column.FieldName), it => it.@(@column.FieldName).Contains(input.@(@column.FieldName).Trim())) - break; - case "notlike"://不包含 - @:.WhereIF(!string.IsNullOrWhiteSpace(input.@column.FieldName), it => !it.@(@column.FieldName).Contains(input.@(@column.FieldName).Trim())) - break; - case "ne"://不等于 - @:.WhereIF(!string.IsNullOrWhiteSpace(input.@column.FieldName), it => it.@(@column.FieldName) != input.@(@column.FieldName)) - break; - } - } - else if(@column.EffectType=="datepicker"){//如果是时间类型则生成时间戳 - @:.WhereIF(input.Start@(@column.FieldName)!=null||input.End@(@column.FieldName)!=null, it=> SqlFunc.Between(it.@column.FieldName, input.Start@(@column.FieldName), input.End@(@column.FieldName))) - } - else{//其他 - switch (@column.QueryType)//遍历查询方式 - { - case "eq"://等于 - @:.WhereIF(input.@column.FieldName!=null, it => it.@(@column.FieldName) == input.@(@column.FieldName)) - break; - case "ne"://不等于 - @:.WhereIF(input.@column.FieldName!=null, it => it.@(@column.FieldName) != input.@(@column.FieldName)) - break; - case "gt"://大于 - @:.WhereIF(input.@column.FieldName!=null, it => it.@(@column.FieldName) > input.@(@column.FieldName)) - break; - case "ge"://大于等于 - @:.WhereIF(input.@column.FieldName!=null, it => it.@(@column.FieldName) >= input.@(@column.FieldName)) - break; - case "lt"://小于 - @:.WhereIF(input.@column.FieldName!=null, it => it.@(@column.FieldName) < input.@(@column.FieldName)) - break; - case "le"://小于等于 - @:.WhereIF(input.@column.FieldName!=null, it => it.@(@column.FieldName) <= input.@(@column.FieldName)) - break; - } - } - } - } -} -} - -@{ -//生成根据SortCode排序 -void PageSortCode() -{ - var hasSortCode= tableFieIds.Any(it => it.FieldName == "SortCode"); - if(hasSortCode){//如果有sortcode字段 - @:.OrderBy(it => it.SortCode);//排序 - }else{ - @:; - } -} -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Frontend/api/Api.js.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Frontend/api/Api.js.vm deleted file mode 100644 index 39f82378de87c208cceed0b811eb6d0de5cb596d..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Frontend/api/Api.js.vm +++ /dev/null @@ -1,121 +0,0 @@ -@{ -var isTreeList = @Model.ModuleType=="treeList";//是否是树表-列表 -var isTreeTree = @Model.ModuleType=="treeTree"; //是否是树-树 -var isMasterChild = @Model.ModuleType=="masterChild";//是否是主子表 -var busName= @Model.BusName;//业务名称 -var tableFieIds=@Model.TableFields;//获取字段 -} -import { baseRequest } from '@@/utils/request' - -const request = (url, ...arg) => baseRequest(`/@(@Model.RouteName)/@(@Model.BusName)/` + url, ...arg) - -/** - * @(@Model.FunctionName)Api接口管理器 - * - * @@author @Model.AuthorName - * @@date @Model.GenTime - **/ - - export default { - // 获取@(@Model.FunctionName)分页 - @(busName)Page(data) { - return request('page', data, 'get') - }, - // 获取@(@Model.FunctionName)列表 - @(busName)List(data) { - return request('list', data, 'get') - }, - // 提交@(@Model.FunctionName)表单 edit为true时为编辑,默认为新增 - submitForm(data, edit = false) { - return request(edit ? 'edit' : 'add', data) - }, - // 获取@(@Model.FunctionName)详情 - @(busName)Detail(data) { - return request('detail', data, 'get') - }, - // 删除@(@Model.FunctionName) - @(busName)Delete(data) { - return request('delete', data) - }, - @if(isTreeList||isTreeTree){ - @:// 获取@(@Model.FunctionName)树 - @:@(busName)Tree(data) { - @:return request('tree', data, 'get') - @:}, - } - @{Func();} - @{LeftTree();} - @{Fk();} -} - -@{ -void Func(){ -var funcList=@Model.FuncList;//获取功能列表 -foreach(var func in funcList){ -switch (func)//根据类型生成不同请求 -{ -//导入 -case "import": - @:// @(@Model.FunctionName)导入模板下载 - @:template(data={}) { - @: return request('template', data, 'get', { - @: responseType: 'blob' - @: }) - @:}, - @:// @(@Model.FunctionName)导入预览 - @:preview(data={}) { - @: return request('preview', data) - @:}, - @:// @(@Model.FunctionName)导入数据 - @:import(data={}) { - @: return request('import', data, 'post', { - @: ignoreError: true - @: }) - @:}, -break; -//导出 -case "export": - @:// 导出@(@Model.FunctionName)数据 - @:@(busName)Export(data) { - @: return request('export', data, 'post', { - @: responseType: 'blob' - @: }) - @:}, -break; -//批量编辑 -case "batchEdit": - @:// @(@Model.FunctionName)批量编辑 - @:edits(data) { - @: return request('edits', data) - @:}, -break; -}} -} -//左侧树 -void LeftTree(){ -var leftTree=@Model.LeftTree;//获取左侧树 -switch (leftTree)//根据类型生成不同控件 -{ -//获取组织选择器 -case "org": - @:// 获取组织选择器 - @:@(leftTree)Tree(data) { - @: return request('@(leftTree)TreeSelector', data, 'get') - @:}, -break; -} -} - -void Fk(){ -foreach (var column in tableFieIds){//遍历字段 -if(column.EffectType=="fk"){//如果是外键 - @:// @(@Model.FunctionName)@(column.FieldRemark)选择器 - @:@(busName)Fk@(column.FkEntityName)Selector(data) { - @: return request('fk@(column.FkEntityName)Selector', data,'get') - @:}, - -} -} -} - -} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Frontend/views/form.vue.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Frontend/views/form.vue.vm deleted file mode 100644 index 2fb3797d0f7dda01f8d63dbe236085ae10629534..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Frontend/views/form.vue.vm +++ /dev/null @@ -1,288 +0,0 @@ -@{ -var tableFieIds=@Model.TableFields;//获取字段 -var isTreeList = @Model.ModuleType=="treeList";//是否是树表-列表 -var isTreeTree = @Model.ModuleType=="treeTree"; //是否是树-树 -var treeId=@SimpleTool.StringHelper.FirstCharToLower(@Model.TreeId);//获取树的id -var treeName=@SimpleTool.StringHelper.FirstCharToLower(@Model.TreeName);//获取树的名称 -var treePid=@SimpleTool.StringHelper.FirstCharToLower(@Model.TreePid);//获取树的父级id -var funcName=@Model.FunctionName; -} - -@ -@{Script();} - -@{ -//主体 -void Main() -{ - - - @if(@Model.GridWhether=="Y"){//使用栅格 - @: - @if(isTreeList||isTreeTree){ - @{parent();} - } - @foreach (var column in tableFieIds){//遍历字段 - @if(column.WhetherAddUpdate=="Y"){//如果增改 - @: - @: - @:@{FormItem(@column);} - @: - } - } - @: - } - else{ - @if(isTreeList||isTreeTree){ - @{parent();} - } - @foreach (var column in tableFieIds){//遍历字段 - @if(column.WhetherAddUpdate=="Y"){//如果增改 - @: - @:@{FormItem(@column);} - } - } - } - - - -} -//父节点选择 -void parent(){ - - - -} -//表单控件 -void FormItem(dynamic column){ -switch (@column.EffectType)//根据类型生成不同控件 -{ -//输入框 -case "input": - -break; -case "textarea": - -break; -//选择 -case "select": - -break; -case "radio": - -break; -case "checkbox": - -break; -//数字 -case "inputNumber": - -break; -case "slider": - -break; -//时间 -case "datepicker": -@if(@column.FieldNetType=="Date") -{ - @: -}else{ - -} -break; -case "timepicker": - -break; -case "fk": - -break; -default: -break;}} - -void Script(){ - -var primaryKey=tableFieIds.Where(it => it.IsPrimarykey=="Y").First();//主键字段 -var selectColumns=tableFieIds.Where(it => it.EffectType=="select"||it.EffectType=="radio"||it.EffectType=="checkbox").ToList();//选择框字段列表 -var addOrUpdateColumns=tableFieIds.Where(it => it.WhetherAddUpdate=="Y").ToList();//增改字段列表 -var selectCount=selectColumns.Count;//选择框数量 - -} - -//外键选项 -void FkOptions(){ -foreach (var column in tableFieIds){//遍历字段 -if(column.EffectType=="fk"){//如果是外键 - @:const fk@(column.FkEntityName)Options = ref() //@(column.FieldRemark)数据 - @:const getFk@(column.FkEntityName)Options= () => { - @:@(@Model.ClassNameFirstLower)Api.@(@Model.BusName)Fk@(column.FkEntityName)Selector().then((data) => { - @: fk@(column.FkEntityName)Options.value = data - @:}) - @:} - @: -} -} -} - -//获取外键 -void FkGet(){ -foreach (var column in tableFieIds){//遍历字段 -if(column.EffectType=="fk"){//如果是外键 - @:getFk@(column.FkEntityName)Options() - @: -} -} -} - -//定义树列表常量 -void TreeListConst(){ -if(isTreeList||isTreeTree){ - @:// 定义机构元素 -@:const treeData = ref([]) -} -} - -//定义树列表方法 -void TreeListMethod() -{ -if(isTreeList||isTreeTree){ - @:// 获取@(funcName)树并加入顶级 - @:@(@Model.ClassNameFirstLower)Api.@(@Model.BusName)Tree().then((res) => { - @:treeData.value = [ - @:{ - @:id: 0, - @:parentId: '-1', - @:name: '顶级', - @:children: res - @:} - @:] - @:}) -} -} - -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Frontend/views/index.vue.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Frontend/views/index.vue.vm deleted file mode 100644 index 7295bad7a00ae412cb17c3e50f19909f386659e7..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Frontend/views/index.vue.vm +++ /dev/null @@ -1,600 +0,0 @@ -@{ -var dataPermission=@Model.DataPermission=="Y";//是否需要数据权限 -var isLeftTree=@Model.LeftTree!="null";//是否有左侧树 -var tableFieIds=@Model.TableFields;//获取字段 -var funcList=@Model.FuncList;//获取功能列表 -var isTreeList = @Model.ModuleType=="treeList";//是否是树表-列表 -var isTreeTree = @Model.ModuleType=="treeTree"; //是否是树-树 -var isMasterChild = @Model.ModuleType=="masterChild";//是否是主子表 -var treeId=@SimpleTool.StringHelper.FirstCharToLower(@Model.TreeId);//获取树的id -var treeName=@SimpleTool.StringHelper.FirstCharToLower(@Model.TreeName);//获取树的名称 -var treePid=@SimpleTool.StringHelper.FirstCharToLower(@Model.TreePid);//获取树的父级id -var busName= @Model.BusName;//获取业务名称 -var funcName= @Model.FunctionName;//获取功能名称 -var showColumns= tableFieIds.Where(it => it.WhetherTable == "Y").ToList();//获取需要显示的字段 -var resizeColumn=showColumns.Any(it => it.WhetherResizable == "Y");//获取需要显示的字段 -} - -@ -@{Script();} -@ -@{Style();} - -@{ -void Template() -{ -//如果左侧树不为空则生成左侧树 -if(isLeftTree||isTreeList){ -LeftTree(); -} -else{ -Main();//否则直接生成主体 -} -} - - -//左侧树 -void LeftTree(){ - - - - - - - - -@{Main();} - - -} - - -//主体 -void Main() -{ -var columnCount = 0;//字段数量 -var searchColumns= tableFieIds.Where(it => it.QueryWhether == "Y").ToList();//获取需要查询的字段 - - - - @foreach (var column in searchColumns)//遍历字段 - { - - - @switch (@column.EffectType)//根据类型生成不同控件 - { - //输入框 - case "input": - case "textarea": - - break; - //选择 - case "select": - case "radio": - case "checkbox": - - break; - //数字 - case "inputNumber": - case "slider": - - break; - //时间 - case "datepicker": - case "timepicker": - @if(@column.FieldNetType.ToLower()=="date") - { - @: - }else{ - @: - } - break; - default: - - break; - } - - - columnCount++; - if(columnCount==3) break;//默认只显示3个字段,其他的折叠 - } - @if(searchColumns.Count>3)//如果字段大于3个则生成折叠面板 - { - - } - - - 查询 - - 重置 - @if(searchColumns.Count>3){//折叠 - - {{ advanced ? '收起' : '展开' }} - - - } - - - - -@{Table();} -} - -//表格部分 -void Table() -{ - - - - - - -
-@if(funcList.Contains("import")){//如果有导入 - -} -@if(funcList.Contains("batchEdit")){//如果有批量编辑 - -} -} - -//Js部分 -void Script() -{ -var searchColumns= tableFieIds.Where(it => it.QueryWhether == "Y").ToList();//获取需要查询的字段 -var searchCount=searchColumns.Count;//查询字段数量 -var isSelect=searchColumns.Any(it => it.EffectType=="select"||it.EffectType=="radio"||it.EffectType=="checkbox");//是否有选择框 - -} - -void FkOptions(){ -foreach (var column in tableFieIds){//遍历字段 -if(column.EffectType=="fk"){//如果是外键 - @:const fk@(column.FkEntityName)Options = ref([]) //@(column.FieldRemark)数据 - @:@(@Model.ClassNameFirstLower)Api.@(busName)Fk@(column.FkEntityName)Selector().then((data) => { - @: fk@(column.FkEntityName)Options.value = data - @:}) - @: -} -} -} - -//表格属性配置 -void TableConst() -{ - - @://表格配置 - @:const table = ref() //表格 - @:let selectedRowKeys = ref([]) //选中项 - @:const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false } //表格工具配置 - @:const columns = [ - @foreach (var column in tableFieIds){//遍历字段 - @if(column.WhetherTable=="Y"){//如果列表显示 - @:{ - @:title: '@column.FieldRemark', - @if(@column.Width!=0){ - @:width: @column.Width, - } - @if(@column.WhetherResizable=="Y"){//如果列可伸缩 - @:resizable: true, - } - @if(column.WhetherRetract=="Y")//如果列省略 - { - @:dataIndex: '@column.FieldNameFirstLower', - @:ellipsis: true - } - else{ - @:dataIndex: '@column.FieldNameFirstLower' - } - @:}, - } - } - @:] - - @:if (hasPerm(['@(@Model.ClassNameFirstLower)Edit', '@(@Model.ClassNameFirstLower)Delete'])) { - @:columns.push({ - @:title: '操作', - @:dataIndex: 'action', - @:align: 'center', - @:fixed: 'right', - @:width: '130px' - @:}) - @:} - @: - @:// 列表选择配置 - @:const options = reactive({ - @:alert: { - @:show: true, //显示选择多少个 - @:clear: () => { - @:selectedRowKeys = ref([]) - @:} - @:}, - @:rowSelection: { - @:onChange: (selectedRowKey, selectedRows) => { - @:selectedRowKeys.value = selectedRowKey - @:} - @:} - @:}) - @: - @if(resizeColumn){//如果可伸缩列 - @:const handleResizeColumn = (w, col) => { - @:col.width = w - @:} - } - -} - -//表单属性配置 -void FormConst(int searchCount){ - if(searchCount>0){ - @:let searchFormState = reactive({}) //查询表单状态 - @:const searchFormRef = ref() //查询表单 - @:// 查询区域显示更多控制 - @:const advanced = ref(false) - @:const toggleAdvanced = () => { - @: advanced.value = !advanced.value - @:} - } - @:const formRef = ref()//新增/编辑表单页 -} - -//删除方法 -void DeleteScript(){ - @:// 删除 - @:const delete@(@Model.ClassName) = (record) => { - @:let params = [ - @:{ - @foreach (var column in tableFieIds){//遍历字段 - @if(column.IsPrimarykey=="Y"){//如果是主键 - @:@column.FieldNameFirstLower: record.@column.FieldNameFirstLower , - }} - @:} - @:] - @:@(@Model.ClassNameFirstLower)Api.@(busName)Delete(params).then(() => { - @:table.value.refresh(true) - @:}) - @:} - @: - @if(funcList.Contains("batchDelete")){//如果有批量删除功能 - @:// 批量删除 - @:const batchDelete@(@Model.ClassName) = (params,callback) => { - @:@(@Model.ClassNameFirstLower)Api.@(busName)Delete(params).then(() => {}) - @:.finally(() => { - @:table.value.clearRefreshSelected() - @:callback() //调用组件中的回调方法 - @:}) - @:} - } -} - -//其他常定义 -void OtherConst(){ - @if(funcList.Contains("import")) @: const importRef = ref() //导入组件 - @if(funcList.Contains("batchEdit")) @: const batchEditRef = ref() //批量更新组件 -} - -//其他方法 -void OtherMethod() -{ -@if(funcList.Contains("import")) { - @:// 打开导入界面 - @:const openImport = (record) => { - @:nextTick(() => { - @:importRef.value.importSteps(record) - @:}) - @:} -} - -@if(funcList.Contains("export")) { - @:// 导出数据 - @:const dataExport@(@Model.ClassNameFirstLower) = (callback) => { - @:@(@Model.ClassNameFirstLower)Api.@(busName)Export(searchFormState) - @:.then((data) => { - @:callback(data) - @:}) - @:.catch(() => { - @:callback(null) - @:}) - @:} -} - -} - -//左侧树属性配置 -void LeftTreeConst() -{ - @://左侧树配置 - @:let defaultExpandedKeys = ref([]) // 默认展开的节点 - @:const treeData = ref([]) // 左侧树数据 - @:// 替换treeNode 中 title,key,children - @if(isTreeList){//如果是树列表就用配置的字段 - @:const treeFieldNames = { children: 'children', title: '@(treeName)', key: '@(@SimpleTool.StringHelper.FirstCharToLower(treeId))' } - } - else{ //如果不是树列表就用默认的字段 - @:const treeFieldNames = { children: 'children', title: 'name', key: 'id' } - } - @:const cardLoading = ref(true) // 左侧树加载状态 -} - -//左侧树方法定义 -void LeftTreeMethod(string leftTree) -{ - @:// 点击树查询 - @:const treeSelect = (selectedKeys) => { - @: if (selectedKeys.length > 0) { - @if(isTreeList){ - @: searchFormState.@(treePid) = selectedKeys.toString() - } - else{ - @: searchFormState.@(leftTree)Id = selectedKeys.toString() - } - @: } else { - @if(isTreeList){ - @: delete searchFormState.@(treePid) - } - else{ - @: delete searchFormState.@(leftTree)Id - } - @: } - @: table.value.refresh(true) - @: } - - @:// 左侧树查询 - @:@(@Model.ClassNameFirstLower)Api.@(leftTree)Tree() - @:.then((res) => { - @:cardLoading.value = false - @:if (res !== null) { - @:treeData.value = res - @:// 默认展开2级 - @:treeData.value.forEach((item) => { - @:// 因为0的顶级 - @:if (item.parentId === 0) { - @:defaultExpandedKeys.value.push(item.id) - @:// 取到下级ID - @:if (item.children) { - @:item.children.forEach((items) => { - @:defaultExpandedKeys.value.push(items.id) - @:}) - @:} - @:} - @:}) - @:} - @:}) - @:.finally(() => { - @:cardLoading.value = false - @:}) -} - - -//Css部分 -void Style() -{ -@: - -} -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/MySql.sql.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/MySql.sql.vm deleted file mode 100644 index ca36b6c4a979bc88694d74f5c969f3fa3f3fe509..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/MySql.sql.vm +++ /dev/null @@ -1,19 +0,0 @@ -/* - Source Server Type: Mysql - Date: @Model.GenTime -*/ - -/*添加菜单*/ -INSERT INTO `sys_resource` VALUES (@Model.MenuId, 0, '@(@Model.FunctionName)管理', '@Model.BusName', '@Model.MenuCode', 'MENU', @Model.Module, 'MENU', '@Model.MenuPath', '@Model.MenuComponent', '@Model.Icon', NULL, 99, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*添加按钮*/ -INSERT INTO `sys_resource` VALUES (@Model.AddButtonId, @Model.MenuId, '新增@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Add', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*批量删除*/ -INSERT INTO `sys_resource` VALUES (@Model.BatchDeleteButtonId, @Model.MenuId, '批量删除@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)BatchDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*编辑按钮*/ -INSERT INTO `sys_resource` VALUES (@Model.EditButtonId, @Model.MenuId, '编辑@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Edit', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*删除删除*/ -INSERT INTO `sys_resource` VALUES (@Model.DeleteButtonId, @Model.MenuId, '删除@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Delete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL,4, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/Oracle.sql.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/Oracle.sql.vm deleted file mode 100644 index 6c008c664bf7672d042cfb197b70c9171d1c7cce..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/Oracle.sql.vm +++ /dev/null @@ -1,19 +0,0 @@ -/* - Source Server Type: Oracle - Date: @Model.GenTime -*/ - -/*添加菜单*/ -INSERT INTO "sys_resource" VALUES (@Model.MenuId, 0, '@(@Model.FunctionName)管理', '@Model.BusName', '@Model.MenuCode', 'MENU', @Model.Module, 'MENU', '@Model.MenuPath', '@Model.MenuComponent', '@Model.Icon', NULL, 99, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*添加按钮*/ -INSERT INTO "sys_resource" VALUES (@Model.AddButtonId, @Model.MenuId, '新增@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Add', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*批量删除*/ -INSERT INTO "sys_resource" VALUES (@Model.BatchDeleteButtonId, @Model.MenuId, '批量删除@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)BatchDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*编辑按钮*/ -INSERT INTO "sys_resource" VALUES (@Model.EditButtonId, @Model.MenuId, '编辑@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Edit', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*删除删除*/ -INSERT INTO "sys_resource" VALUES (@Model.DeleteButtonId, @Model.MenuId, '删除@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Delete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL,4, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/SqlServer.sql.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/SqlServer.sql.vm deleted file mode 100644 index 7c6a89d0617918ff7fa80bf954e0bc1c2076796a..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/SqlServer.sql.vm +++ /dev/null @@ -1,19 +0,0 @@ -/* - Source Server Type: SqlServer - Date: @Model.GenTime -*/ - -/*添加菜单*/ -INSERT INTO [dbo].[sys_resource] VALUES (@Model.MenuId, 0, '@(@Model.FunctionName)管理', '@Model.BusName', '@Model.MenuCode', 'MENU', @Model.Module, 'MENU', '@Model.MenuPath', '@Model.MenuComponent', '@Model.Icon', NULL, 99, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*添加按钮*/ -INSERT INTO [dbo].[sys_resource] VALUES (@Model.AddButtonId, @Model.MenuId, '新增@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Add', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*批量删除*/ -INSERT INTO [dbo].[sys_resource] VALUES (@Model.BatchDeleteButtonId, @Model.MenuId, '批量删除@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)BatchDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*编辑按钮*/ -INSERT INTO [dbo].[sys_resource] VALUES (@Model.EditButtonId, @Model.MenuId, '编辑@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Edit', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*删除删除*/ -INSERT INTO [dbo].[sys_resource] VALUES (@Model.DeleteButtonId, @Model.MenuId, '删除@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Delete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL,4, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/Sqlite.sql.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/Sqlite.sql.vm deleted file mode 100644 index ba611a1f40ff5c4ac9fcefc31227372afa183110..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/Sqlite.sql.vm +++ /dev/null @@ -1,19 +0,0 @@ -/* - Source Server Type: Sqlite - Date: @Model.GenTime -*/ - -/*添加菜单*/ -INSERT INTO "sys_resource" VALUES (@Model.MenuId, 0, '@(@Model.FunctionName)管理', '@Model.BusName', '@Model.MenuCode', 'MENU', @Model.Module, 'MENU', '@Model.MenuPath', '@Model.MenuComponent', '@Model.Icon', NULL, 99, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*添加按钮*/ -INSERT INTO "sys_resource" VALUES (@Model.AddButtonId, @Model.MenuId, '新增@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Add', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*批量删除*/ -INSERT INTO "sys_resource" VALUES (@Model.BatchDeleteButtonId, @Model.MenuId, '批量删除@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)BatchDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*编辑按钮*/ -INSERT INTO "sys_resource" VALUES (@Model.EditButtonId, @Model.MenuId, '编辑@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Edit', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*删除删除*/ -INSERT INTO "sys_resource" VALUES (@Model.DeleteButtonId, @Model.MenuId, '删除@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Delete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL,4, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Const/GenConst.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Const/GenConst.cs deleted file mode 100644 index df883e10fbee80687ef40a40e1df37d4cf30939b..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Const/GenConst.cs +++ /dev/null @@ -1,46 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 代码生成器常量 -/// -public class GenConst -{ - #region 是否 - - /// - /// 是 - /// - public const string Yes = "Y"; - - /// - /// 否 - /// - public const string No = "N"; - - #endregion 是否 - - /// - /// 压缩包 - /// - public const string Zip = "ZIP"; - - /// - /// 项目中 - /// - public const string Pro = "PRO"; - - /// - /// 全部 - /// - public const string ExecAll = "ALL"; - - /// - /// 前端 - /// - public const string ExecFrontend = "FRONTEND"; - - /// - /// 后端 - /// - public const string ExecBackend = "BACKEND"; -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Controllers/GenBasicController.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Controllers/GenBasicController.cs deleted file mode 100644 index f00e4a45baeaf3db6c6056a97da9990c34cf0474..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Controllers/GenBasicController.cs +++ /dev/null @@ -1,120 +0,0 @@ - -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 代码生成基础控制器 -/// -[ApiDescriptionSettings(Tag = "代码生成基础")] -[Route("gen/basic")] -[SuperAdmin] -public class GenBasicController : IDynamicApiController -{ - private readonly IGenbasicService _genbasicService; - - public GenBasicController(IGenbasicService genbasicService) - { - _genbasicService = genbasicService; - } - - /// - /// 代码生成基础分页 - /// - /// - /// - [HttpGet("page")] - public async Task Page([FromQuery] BasePageInput input) - { - return await _genbasicService.Page(input); - } - - /// - /// 获取所有表信息 - /// - /// - [HttpGet("tables")] - public dynamic Tables(bool isAll = false) - { - return _genbasicService.GetTables(isAll); - } - - /// - /// 获取项目所有程序集 - /// - /// - [HttpGet("assemblies")] - public dynamic GetAssemblies() - { - return _genbasicService.GetAssemblies(); - } - - /// - /// 添加代码生成器 - /// - /// - /// - [DisplayName("添加代码生成")] - [HttpPost("add")] - public async Task Add([FromBody] GenBasicAddInput input) - { - return await _genbasicService.Add(input); - } - - /// - /// 编辑代码生成器 - /// - /// - /// - [DisplayName("编辑代码生成基础")] - [HttpPost("edit")] - public async Task Edit([FromBody] GenBasicEditInput input) - { - return await _genbasicService.Edit(input); - } - - /// - /// 删除代码生成配置 - /// - /// - /// - [DisplayName("删除代码生成基础")] - [HttpPost("delete")] - public async Task Delete([FromBody] List input) - { - await _genbasicService.Delete(input); - } - - /// - /// 代码生成预览 - /// - /// - /// - [HttpGet("previewGen")] - public async Task PreviewGen([FromQuery] BaseIdInput input) - { - return await _genbasicService.PreviewGen(input); - } - - /// - /// 执行代码生成(本地)" - /// - /// - /// - [DisplayName("执行代码生成(本地)")] - [HttpPost("execGenPro")] - public async Task ExecGenPro([FromBody] ExecGenInput input) - { - await _genbasicService.ExecGenPro(input); - } - - /// - /// 执行代码生成(压缩包) - /// - /// - /// - [DisplayName("执行代码生成(压缩包)")] - [HttpGet("execGenZip")] - public async Task ExecGenZip([FromQuery] ExecGenInput input) - { - return await _genbasicService.ExecGenZip(input); - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Controllers/GenConfigController.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Controllers/GenConfigController.cs deleted file mode 100644 index e20b6b45bf3ccab88ad896cdbc5d1b8a18edf390..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Controllers/GenConfigController.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 代码生成配置控制器 -/// -[ApiDescriptionSettings(Tag = "代码生成配置")] -[Route("gen/config")] -[SuperAdmin] -public class GenConfigController : IDynamicApiController -{ - private readonly IGenConfigService _genConfigService; - - public GenConfigController(IGenConfigService genConfigService) - { - _genConfigService = genConfigService; - } - - /// - /// 查询代码生成详细配置列表 - /// - /// - /// - [HttpGet("list")] - [QueryParameters] - public async Task List(string basicId) - { - return await _genConfigService.List(basicId.ToLong()); - } - - /// - /// 编辑代码生成详细 - /// - /// - /// - [DisplayName("编辑代码生成详细")] - [HttpPost("editBatch")] - public async Task EditBatch([FromBody] List input) - { - await _genConfigService.EditBatch(input); - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Entity/GenBasic.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Entity/GenBasic.cs deleted file mode 100644 index 96cd9d4f8f2e846aad2f959f0605c01a8b7fe90e..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Entity/GenBasic.cs +++ /dev/null @@ -1,190 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 代码生成基础 -/// -[SugarTable("gen_basic", TableDescription = "代码生成基础")] -[Tenant(SqlsugarConst.DB_Default)] -public class GenBasic : BaseEntity -{ - /// - /// 所属库 - /// - [SugarColumn(ColumnName = "ConfigId", ColumnDescription = "库名", Length = 200)] - public virtual string ConfigId { get; set; } - - /// - /// 主表 - /// - [SugarColumn(ColumnName = "DbTable", ColumnDescription = "主表", Length = 200)] - public virtual string DbTable { get; set; } - - - /// - /// 表实体名称 - /// - [SugarColumn(ColumnName = "EntityName", ColumnDescription = "表实体名称", Length = 200)] - public virtual string EntityName { get; set; } - - /// - /// 功能列表 - /// - [SugarColumn(ColumnName = "Functions", ColumnDescription = "功能列表", Length = 200, IsNullable = false)] - public virtual string Functions { get; set; } - - /// - /// 数据权限 - /// - [SugarColumn(ColumnName = "DataPermission", ColumnDescription = "数据权限", Length = 200, IsNullable = false)] - public virtual string DataPermission { get; set; } - - /// - /// 生成模版 - /// - [SugarColumn(ColumnName = "ModuleType", ColumnDescription = "生成模版", Length = 200, IsNullable = false)] - public virtual string ModuleType { get; set; } - - /// - /// 树Id字段 - /// - [SugarColumn(ColumnName = "TreeId", ColumnDescription = "树Id字段", Length = 200, IsNullable = true)] - public virtual string TreeId { get; set; } - - /// - /// 树父Id字段 - /// - [SugarColumn(ColumnName = "TreePid", ColumnDescription = "树父Id字段", Length = 200, IsNullable = true)] - public virtual string TreePid { get; set; } - - /// - /// 树名称字段 - /// - [SugarColumn(ColumnName = "TreeName", ColumnDescription = "树名称字段", Length = 200, IsNullable = true)] - public virtual string TreeName { get; set; } - - /// - /// 关联子表名 - /// - [SugarColumn(ColumnName = "ChildTable", ColumnDescription = "关联子表名", Length = 200, IsNullable = true)] - public virtual string ChildTable { get; set; } - - /// - /// 关联子表外键 - /// - [SugarColumn(ColumnName = "ChildFk", ColumnDescription = "关联子表外键", Length = 200, IsNullable = true)] - public virtual string ChildFk { get; set; } - - /// - /// 移除表前缀 - /// - [SugarColumn(ColumnName = "TablePrefix", ColumnDescription = "移除表前缀", Length = 200)] - public virtual string TablePrefix { get; set; } - - /// - /// 生成方式 - /// - [SugarColumn(ColumnName = "GenerateType", ColumnDescription = "生成方式", Length = 200)] - public virtual string GenerateType { get; set; } - - /// - /// 所属模块 - /// - [SugarColumn(ColumnName = "Module", ColumnDescription = "所属模块")] - public virtual long Module { get; set; } - - /// - /// 上级目录 - /// - [SugarColumn(ColumnName = "MenuPid", ColumnDescription = "上级目录")] - public virtual long MenuPid { get; set; } - - /// - /// 业务名 - /// - [SugarColumn(ColumnName = "RouteName", ColumnDescription = "路由名", Length = 200)] - public virtual string RouteName { get; set; } - - /// - /// 图标 - /// - [SugarColumn(ColumnName = "Icon", ColumnDescription = "图标", Length = 200)] - public virtual string Icon { get; set; } - - /// - /// 功能名 - /// - [SugarColumn(ColumnName = "FunctionName", ColumnDescription = "功能名", Length = 200)] - public virtual string FunctionName { get; set; } - - /// - /// 功能名后缀 - /// - [SugarColumn(ColumnName = "FunctionNameSuffix", ColumnDescription = "功能名后缀", Length = 200, IsNullable = true)] - public virtual string FunctionNameSuffix { get; set; } - - /// - /// 业务名 - /// - [SugarColumn(ColumnName = "BusName", ColumnDescription = "业务名", Length = 200)] - public virtual string BusName { get; set; } - - /// - /// 类名 - /// - [SugarColumn(ColumnName = "ClassName", ColumnDescription = "类名", Length = 200)] - public virtual string ClassName { get; set; } - - /// - /// 表单布局 - /// - [SugarColumn(ColumnName = "FormLayout", ColumnDescription = "表单布局", Length = 200)] - public virtual string FormLayout { get; set; } - - /// - /// 使用栅格 - /// - [SugarColumn(ColumnName = "GridWhether", ColumnDescription = "使用栅格", Length = 200)] - public virtual string GridWhether { get; set; } - - /// - /// 左侧树 - /// - [SugarColumn(ColumnName = "LeftTree", ColumnDescription = "使用左侧树", Length = 200)] - public virtual string LeftTree { get; set; } - - /// - /// 前端项目路径 - /// - [SugarColumn(ColumnName = "FrontedPath", ColumnDescription = "前端项目路径", IsNullable = true, Length = 200)] - public virtual string FrontedPath { get; set; } - - /// - /// 服务代码存放位置 - /// - [SugarColumn(ColumnName = "ServicePosition", ColumnDescription = "服务代码存放位置", IsNullable = true, Length = 200)] - public virtual string ServicePosition { get; set; } - - /// - /// 控制器代码存放位置 - /// - [SugarColumn(ColumnName = "ControllerPosition", ColumnDescription = "控制器代码存放位置", IsNullable = true, Length = 200)] - public virtual string ControllerPosition { get; set; } - - /// - /// 作者 - /// - [SugarColumn(ColumnName = "AuthorName", ColumnDescription = "作者", Length = 200)] - public virtual string AuthorName { get; set; } - - /// - /// 排序 - /// - [SugarColumn(ColumnName = "SortCode", ColumnDescription = "排序")] - public virtual int SortCode { get; set; } - - /// - /// 功能列表 - /// - [SugarColumn(IsIgnore = true)] - public virtual List FuncList { get; set; } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Entity/GenConfig.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Entity/GenConfig.cs deleted file mode 100644 index bda808590973456e17f113720a54a2c1e28724d6..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Entity/GenConfig.cs +++ /dev/null @@ -1,154 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 代码生成配置 -/// -[SugarTable("gen_config", TableDescription = "代码生成配置")] -[Tenant(SqlsugarConst.DB_Default)] -public class GenConfig : BaseEntity -{ - /// - /// 基础ID - /// - [SugarColumn(ColumnName = "BasicId", ColumnDescription = "基础配置ID")] - public long BasicId { get; set; } - - /// - /// 字段排序 - /// - [SugarColumn(ColumnName = "FieldIndex", ColumnDescription = "字段排序", IsNullable = true)] - public int FieldIndex { get; set; } - - /// - /// 是否主键 - /// - [SugarColumn(ColumnName = "IsPrimarykey", ColumnDescription = "是否主键", Length = 200)] - public string IsPrimarykey { get; set; } - - /// - /// 字段 - /// - [SugarColumn(ColumnName = "FieldName", ColumnDescription = "字段", Length = 200)] - public string FieldName { get; set; } - - /// - /// 名称 - /// - [SugarColumn(ColumnName = "FieldRemark", ColumnDescription = "名称", Length = 200)] - public string FieldRemark { get; set; } - - /// - /// 类型 - /// - [SugarColumn(ColumnName = "FieldType", ColumnDescription = "类型", Length = 200)] - public string FieldType { get; set; } - - /// - /// 实体类型 - /// - [SugarColumn(ColumnName = "FieldNetType", ColumnDescription = "实体类型", Length = 200)] - public string FieldNetType { get; set; } - - /// - /// 作用类型 - /// - [SugarColumn(ColumnName = "EffectType", ColumnDescription = "作用类型", Length = 200)] - public string EffectType { get; set; } - - /// - /// 外键显示字段 - /// - [SugarColumn(ColumnName = "FkEntityName", ColumnDescription = "外键实体名称", Length = 200, IsNullable = true)] - public string FkEntityName { get; set; } - - /// - /// 外键ID - /// - [SugarColumn(ColumnName = "FkColumnId", ColumnDescription = "外键ID", Length = 200, IsNullable = true)] - public string FkColumnId { get; set; } - - /// - /// 外键显示字段 - /// - [SugarColumn(ColumnName = "FkColumnName", ColumnDescription = "外键显示字段", Length = 200, IsNullable = true)] - public string FkColumnName { get; set; } - - /// - /// 字典 - /// - [SugarColumn(ColumnName = "DictTypeCode", ColumnDescription = "字典", Length = 200, IsNullable = true)] - public string DictTypeCode { get; set; } - - /// - /// 列宽度 - /// - [SugarColumn(ColumnName = "Width", ColumnDescription = "列宽度")] - public int Width { get; set; } - - - /// - /// 列表显示 - /// - [SugarColumn(ColumnName = "WhetherTable", ColumnDescription = "列表显示", Length = 200)] - public string WhetherTable { get; set; } - - /// - /// 列省略 - /// - [SugarColumn(ColumnName = "WhetherRetract", ColumnDescription = "列省略", Length = 200)] - public string WhetherRetract { get; set; } - - /// - /// 可伸缩列 - /// - [SugarColumn(ColumnName = "WhetherResizable", ColumnDescription = "可伸缩列", Length = 200)] - public string WhetherResizable { get; set; } - - /// - /// 是否增改 - /// - [SugarColumn(ColumnName = "WhetherAddUpdate", ColumnDescription = "是否增改", Length = 200)] - public string WhetherAddUpdate { get; set; } - - /// - /// 是否导入导出 - /// - [SugarColumn(ColumnName = "WhetherImportExport", ColumnDescription = "是否导入导出", Length = 200)] - public string WhetherImportExport { get; set; } - - /// - /// 必填 - /// - [SugarColumn(ColumnName = "WhetherRequired", ColumnDescription = "必填", Length = 200)] - public string WhetherRequired { get; set; } - - /// - /// 查询 - /// - [SugarColumn(ColumnName = "QueryWhether", ColumnDescription = "查询", Length = 200)] - public string QueryWhether { get; set; } - - /// - /// 查询方式 - /// - [SugarColumn(ColumnName = "QueryType", ColumnDescription = "查询方式", Length = 200, IsNullable = true)] - public string QueryType { get; set; } - - /// - /// 排序 - /// - [SugarColumn(ColumnName = "SortCode", ColumnDescription = "排序")] - public int SortCode { get; set; } - - /// - /// 字段名首字母小写 - /// - [SugarColumn(IsIgnore = true)] - public string FieldNameFirstLower { get; set; } - - /// - /// 字段名首字母大写 - /// - [SugarColumn(IsIgnore = true)] - public string FieldNameFirstUpper { get; set; } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Gen.Development.json b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Gen.Development.json deleted file mode 100644 index 55e513f6c6aa16a9da1bf815a1cc98786dc7c9a9..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Gen.Development.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - //代码生成器设置 - "GenSettings": { - "InitTable": true, //是否初始化表结构 - "InitSeedData": true, //是否初始化种子数据 - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Gen.Production.json b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Gen.Production.json deleted file mode 100644 index d9c5a433ba4f8cf0e83a0490853ae5034e087737..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Gen.Production.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - //代码生成器设置 - "GenSettings": { - "InitTable": false, //是否初始化表结构 - "InitSeedData": false, //是否初始化种子数据 - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/GlobalUsing.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/GlobalUsing.cs deleted file mode 100644 index 5c8bffdf59cf4ea1e7c51bd237d9885c91903252..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/GlobalUsing.cs +++ /dev/null @@ -1,20 +0,0 @@ -global using Furion; -global using Furion.DependencyInjection; -global using Furion.FriendlyException; -global using Furion.ViewEngine; -global using Mapster; -global using Microsoft.AspNetCore.Builder; -global using Microsoft.AspNetCore.Hosting; -global using Microsoft.AspNetCore.Mvc; -global using Microsoft.Extensions.DependencyInjection; -global using Microsoft.Extensions.Logging; -global using SimpleAdmin.Core; -global using SimpleAdmin.Core.Utils; -global using SimpleAdmin.System; -global using SimpleTool; -global using System.ComponentModel.DataAnnotations; -global using System.Text; -global using Furion.DynamicApiController; -global using System.ComponentModel; -global using SimpleAdmin.SqlSugar; -global using SqlSugar; \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Options/GenSettingsOptions.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Options/GenSettingsOptions.cs deleted file mode 100644 index 03cd249cfa2778e77c996dff18edcc1f23e19ccf..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Options/GenSettingsOptions.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Furion.ConfigurableOptions; - -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 代码生成器配置 -/// -public class GenSettingsOptions : BaseOptions, IConfigurableOptions -{ -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/GenBaseSeedData.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/GenBaseSeedData.cs deleted file mode 100644 index 71ecd43f27214ce31afb30fcd90634dc15c83da7..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/GenBaseSeedData.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 系统配置种子数据 -/// -public class GenBaseSeedData : ISqlSugarEntitySeedData -{ - public IEnumerable SeedData() - { - return SeedDataUtil.GetSeedData("seed_gen_basic.json"); - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/GenConfigSeedData.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/GenConfigSeedData.cs deleted file mode 100644 index 1ddf542bba560d8e3d9ffe6c9ff19b86dad8f851..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/GenConfigSeedData.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 系统配置种子数据 -/// -public class GenConfigSeedData : ISqlSugarEntitySeedData -{ - public IEnumerable SeedData() - { - return SeedDataUtil.GetSeedData("seed_gen_config.json"); - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/Json/seed_gen_basic.json b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/Json/seed_gen_basic.json deleted file mode 100644 index 18bad0c38c41c663eb25ea89ee39e45447f084c2..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/Json/seed_gen_basic.json +++ /dev/null @@ -1,204 +0,0 @@ -{ - "RECORDS": [ - { - "Id": "415472469950533", - "ConfigId": "SimpleAdmin", - "DbTable": "sys_org", - "EntityName": "SysOrg", - "TablePrefix": "Y", - "GenerateType": "PRO", - "Module": "212755263003743", - "MenuPid": "212755263003744", - "RouteName": "biz", - "Icon": "vertical-right-outlined", - "FunctionName": "测试", - "FunctionNameSuffix": "管理", - "BusName": "test", - "ClassName": "GenTest", - "FormLayout": "vertical", - "GridWhether": "N", - "FrontedPath": "D:\\SimpleAdminWeb\\SimpleAdminWeb", - "ServicePosition": "SimpleAdmin.Application", - "ControllerPosition": "SimpleAdmin.Web.Core", - "AuthorName": "superAdmin", - "SortCode": "99", - "CreateTime": "2023-5-9 10:21:50.503", - "UpdateTime": "2023-5-15 19:47:52.84", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "IsDelete": "0", - "ExtJson": "", - "DataPermission": "N", - "ModuleType": "treeList", - "TreeId": "Id", - "TreePid": "ParentId", - "TreeName": "Name", - "ChildTable": "", - "ChildFk": "", - "Functions": "curd,batchDelete,import,export,batchEdit", - "LeftTree": "null" - }, - { - "Id": "415806515720261", - "ConfigId": "SimpleAdmin", - "DbTable": "sys_org", - "EntityName": "SysOrg", - "TablePrefix": "Y", - "GenerateType": "PRO", - "Module": "212755263003743", - "MenuPid": "212755263003744", - "RouteName": "biz", - "Icon": "vertical-right-outlined", - "FunctionName": "测试", - "FunctionNameSuffix": "管理", - "BusName": "test", - "ClassName": "GenTest", - "FormLayout": "vertical", - "GridWhether": "N", - "FrontedPath": "D:\\SimpleAdminWeb\\SimpleAdminWeb", - "ServicePosition": "SimpleAdmin.Application", - "ControllerPosition": "SimpleAdmin.Web.Core", - "AuthorName": "superAdmin", - "SortCode": "99", - "CreateTime": "2023-5-10 09:01:04.647", - "UpdateTime": "2023-5-15 19:41:19.443", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "IsDelete": "0", - "ExtJson": "", - "DataPermission": "N", - "ModuleType": "treeTree", - "TreeId": "Id", - "TreePid": "ParentId", - "TreeName": "Name", - "ChildTable": "", - "ChildFk": "", - "Functions": "curd", - "LeftTree": "null" - }, - { - "Id": "415904006602821", - "ConfigId": "SimpleAdmin", - "DbTable": "sys_org", - "EntityName": "SysOrg", - "TablePrefix": "Y", - "GenerateType": "PRO", - "Module": "212755263003743", - "MenuPid": "212755263003744", - "RouteName": "biz", - "Icon": "left-square-outlined", - "FunctionName": "测试", - "FunctionNameSuffix": "管理", - "BusName": "test", - "ClassName": "GenTest", - "FormLayout": "vertical", - "GridWhether": "N", - "FrontedPath": "D:\\SimpleAdminWeb\\SimpleAdminWeb", - "ServicePosition": "SimpleAdmin.Application", - "ControllerPosition": "SimpleAdmin.Web.Core", - "AuthorName": "superAdmin", - "SortCode": "99", - "CreateTime": "2023-5-10 15:37:46.133", - "UpdateTime": "2023-5-17 08:34:09.823", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "IsDelete": "0", - "ExtJson": "", - "DataPermission": "N", - "ModuleType": "masterChild", - "TreeId": "", - "TreePid": "", - "TreeName": "", - "ChildTable": "SysPosition", - "ChildFk": "OrgId", - "Functions": "curd", - "LeftTree": "null" - }, - { - "Id": "417692167622725", - "ConfigId": "SimpleAdmin", - "DbTable": "gen_test", - "EntityName": "GenTest", - "TablePrefix": "Y", - "GenerateType": "ZIP", - "Module": "212755263003743", - "MenuPid": "212755263003744", - "RouteName": "biz", - "Icon": "caret-right-outlined", - "FunctionName": "测试", - "FunctionNameSuffix": "管理", - "BusName": "test", - "ClassName": "GenTest", - "FormLayout": "vertical", - "GridWhether": "N", - "FrontedPath": "D:\\SimpleAdminWeb\\SimpleAdminWeb", - "ServicePosition": "SimpleAdmin.Application", - "ControllerPosition": "SimpleAdmin.Application", - "AuthorName": "superAdmin", - "SortCode": "99", - "CreateTime": "2023-5-15 16:53:48.883", - "UpdateTime": "2023-5-17 08:36:40.743", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "IsDelete": "0", - "ExtJson": "", - "DataPermission": "N", - "ModuleType": "single", - "TreeId": "", - "TreePid": "", - "TreeName": "", - "ChildTable": "", - "ChildFk": "", - "Functions": "curd", - "LeftTree": "null" - }, - { - "Id": "418032046346309", - "ConfigId": "SimpleAdmin", - "DbTable": "sys_user", - "EntityName": "SysUser", - "TablePrefix": "Y", - "GenerateType": "PRO", - "Module": "212755263003743", - "MenuPid": "212755263003744", - "RouteName": "biz", - "Icon": "vertical-right-outlined", - "FunctionName": "测试", - "FunctionNameSuffix": "管理", - "BusName": "test", - "ClassName": "GenTest", - "FormLayout": "vertical", - "GridWhether": "N", - "FrontedPath": "D:\\SimpleAdminWeb\\SimpleAdminWeb", - "ServicePosition": "SimpleAdmin.Application", - "ControllerPosition": "SimpleAdmin.Web.Core", - "AuthorName": "superAdmin", - "SortCode": "99", - "CreateTime": "2023-5-16 15:56:47.083", - "UpdateTime": "2023-5-29 11:10:10.74", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "IsDelete": "0", - "ExtJson": "", - "DataPermission": "Y", - "ModuleType": "single", - "TreeId": "", - "TreePid": "", - "TreeName": "", - "ChildTable": "", - "ChildFk": "", - "Functions": "curd", - "LeftTree": "null" - } - ] -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/Json/seed_gen_config.json b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/Json/seed_gen_config.json deleted file mode 100644 index 31b9efccbebba4a8c6380154a07e628f4cbc4822..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/Json/seed_gen_config.json +++ /dev/null @@ -1,3898 +0,0 @@ -{ - "RECORDS": [ - { - "Id": "415472470216773", - "BasicId": "415472469950533", - "FieldIndex": "0", - "FieldName": "Id", - "FieldRemark": "Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-9 10:21:50.57", - "UpdateTime": "2023-5-15 19:45:29.987", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "Y", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415472470229061", - "BasicId": "415472469950533", - "FieldIndex": "1", - "FieldName": "ParentId", - "FieldRemark": "父id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "1", - "CreateTime": "2023-5-9 10:21:50.57", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415472470229062", - "BasicId": "415472469950533", - "FieldIndex": "2", - "FieldName": "DirectorId", - "FieldRemark": "主管ID", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "2", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415472470229063", - "BasicId": "415472469950533", - "FieldIndex": "3", - "FieldName": "Name", - "FieldRemark": "名称", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "Y", - "QueryType": "like", - "SortCode": "3", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415472470229064", - "BasicId": "415472469950533", - "FieldIndex": "4", - "FieldName": "Names", - "FieldRemark": "全称", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "4", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415472470229065", - "BasicId": "415472469950533", - "FieldIndex": "5", - "FieldName": "Code", - "FieldRemark": "编码", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "5", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415472470229066", - "BasicId": "415472469950533", - "FieldIndex": "6", - "FieldName": "Category", - "FieldRemark": "分类", - "FieldType": "nvarchar", - "EffectType": "select", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "ORG_CATEGORY", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "Y", - "QueryType": "eq", - "SortCode": "6", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415472470229067", - "BasicId": "415472469950533", - "FieldIndex": "7", - "FieldName": "SortCode", - "FieldRemark": "排序码", - "FieldType": "int", - "EffectType": "slider", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "7", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "int", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415472470229068", - "BasicId": "415472469950533", - "FieldIndex": "8", - "FieldName": "CreateTime", - "FieldRemark": "创建时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415472470229069", - "BasicId": "415472469950533", - "FieldIndex": "9", - "FieldName": "UpdateTime", - "FieldRemark": "更新时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415472470229070", - "BasicId": "415472469950533", - "FieldIndex": "10", - "FieldName": "CreateUserId", - "FieldRemark": "创建者Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415472470229071", - "BasicId": "415472469950533", - "FieldIndex": "11", - "FieldName": "UpdateUserId", - "FieldRemark": "修改者Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-9 15:29:22.517", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415472470229072", - "BasicId": "415472469950533", - "FieldIndex": "12", - "FieldName": "IsDelete", - "FieldRemark": "软删除", - "FieldType": "bit", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "bool", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415472470229073", - "BasicId": "415472469950533", - "FieldIndex": "13", - "FieldName": "ExtJson", - "FieldRemark": "扩展信息", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415472470229074", - "BasicId": "415472469950533", - "FieldIndex": "14", - "FieldName": "CreateUser", - "FieldRemark": "创建人", - "FieldType": "varchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415472470229075", - "BasicId": "415472469950533", - "FieldIndex": "15", - "FieldName": "UpdateUser", - "FieldRemark": "更新人", - "FieldType": "varchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515941445", - "BasicId": "415806515720261", - "FieldIndex": "7", - "FieldName": "Id", - "FieldRemark": "Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 09:01:04.7", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "Y", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515957829", - "BasicId": "415806515720261", - "FieldIndex": "0", - "FieldName": "ParentId", - "FieldRemark": "父id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "1", - "CreateTime": "2023-5-10 09:01:04.703", - "UpdateTime": "2023-5-15 19:41:21.28", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515957830", - "BasicId": "415806515720261", - "FieldIndex": "1", - "FieldName": "DirectorId", - "FieldRemark": "主管ID", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "2", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515957831", - "BasicId": "415806515720261", - "FieldIndex": "2", - "FieldName": "Name", - "FieldRemark": "名称", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "Y", - "QueryType": "like", - "SortCode": "3", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415806515957832", - "BasicId": "415806515720261", - "FieldIndex": "3", - "FieldName": "Names", - "FieldRemark": "全称", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "4", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515957833", - "BasicId": "415806515720261", - "FieldIndex": "4", - "FieldName": "Code", - "FieldRemark": "编码", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "5", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415806515957834", - "BasicId": "415806515720261", - "FieldIndex": "5", - "FieldName": "Category", - "FieldRemark": "分类", - "FieldType": "nvarchar", - "EffectType": "select", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "ROLE_CATEGORY", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "Y", - "QueryType": "eq", - "SortCode": "6", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415806515957835", - "BasicId": "415806515720261", - "FieldIndex": "6", - "FieldName": "SortCode", - "FieldRemark": "排序码", - "FieldType": "int", - "EffectType": "slider", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "7", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "int", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515957836", - "BasicId": "415806515720261", - "FieldIndex": "8", - "FieldName": "CreateTime", - "FieldRemark": "创建时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515957837", - "BasicId": "415806515720261", - "FieldIndex": "9", - "FieldName": "UpdateTime", - "FieldRemark": "更新时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515957838", - "BasicId": "415806515720261", - "FieldIndex": "0", - "FieldName": "CreateUserId", - "FieldRemark": "创建者Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515957839", - "BasicId": "415806515720261", - "FieldIndex": "0", - "FieldName": "UpdateUserId", - "FieldRemark": "修改者Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-10 09:12:20.477", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515961925", - "BasicId": "415806515720261", - "FieldIndex": "0", - "FieldName": "IsDelete", - "FieldRemark": "软删除", - "FieldType": "bit", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "bool", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515961926", - "BasicId": "415806515720261", - "FieldIndex": "13", - "FieldName": "ExtJson", - "FieldRemark": "扩展信息", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515961927", - "BasicId": "415806515720261", - "FieldIndex": "14", - "FieldName": "CreateUser", - "FieldRemark": "创建人", - "FieldType": "varchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515961928", - "BasicId": "415806515720261", - "FieldIndex": "15", - "FieldName": "UpdateUser", - "FieldRemark": "更新人", - "FieldType": "varchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415904006709317", - "BasicId": "415904006602821", - "FieldIndex": "7", - "FieldName": "Id", - "FieldRemark": "Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 15:37:46.157", - "UpdateTime": "2023-5-15 19:41:24.913", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "Y", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415904006717509", - "BasicId": "415904006602821", - "FieldIndex": "0", - "FieldName": "ParentId", - "FieldRemark": "父id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "1", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.07", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415904006717510", - "BasicId": "415904006602821", - "FieldIndex": "1", - "FieldName": "DirectorId", - "FieldRemark": "主管ID", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "2", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.07", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415904006717511", - "BasicId": "415904006602821", - "FieldIndex": "2", - "FieldName": "Name", - "FieldRemark": "名称", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "Y", - "QueryType": "like", - "SortCode": "3", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.07", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415904006717512", - "BasicId": "415904006602821", - "FieldIndex": "3", - "FieldName": "Names", - "FieldRemark": "全称", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "4", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.07", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415904006717513", - "BasicId": "415904006602821", - "FieldIndex": "4", - "FieldName": "Code", - "FieldRemark": "编码", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "5", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.07", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415904006717514", - "BasicId": "415904006602821", - "FieldIndex": "5", - "FieldName": "Category", - "FieldRemark": "分类", - "FieldType": "nvarchar", - "EffectType": "radio", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "POSITION_CATEGORY", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "Y", - "QueryType": "eq", - "SortCode": "6", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.07", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415904006717515", - "BasicId": "415904006602821", - "FieldIndex": "6", - "FieldName": "SortCode", - "FieldRemark": "排序码", - "FieldType": "int", - "EffectType": "slider", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "7", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.07", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "int", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415904006721605", - "BasicId": "415904006602821", - "FieldIndex": "8", - "FieldName": "CreateTime", - "FieldRemark": "创建时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.073", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415904006721606", - "BasicId": "415904006602821", - "FieldIndex": "9", - "FieldName": "UpdateTime", - "FieldRemark": "更新时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.073", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415904006721607", - "BasicId": "415904006602821", - "FieldIndex": "10", - "FieldName": "CreateUserId", - "FieldRemark": "创建者Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415904006721608", - "BasicId": "415904006602821", - "FieldIndex": "11", - "FieldName": "UpdateUserId", - "FieldRemark": "修改者Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-10 15:38:18.29", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415904006721609", - "BasicId": "415904006602821", - "FieldIndex": "12", - "FieldName": "IsDelete", - "FieldRemark": "软删除", - "FieldType": "bit", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "bool", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415904006721610", - "BasicId": "415904006602821", - "FieldIndex": "13", - "FieldName": "ExtJson", - "FieldRemark": "扩展信息", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.073", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415904006721611", - "BasicId": "415904006602821", - "FieldIndex": "14", - "FieldName": "CreateUser", - "FieldRemark": "创建人", - "FieldType": "varchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.073", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415904006721612", - "BasicId": "415904006602821", - "FieldIndex": "15", - "FieldName": "UpdateUser", - "FieldRemark": "更新人", - "FieldType": "varchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.073", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "417692167675973", - "BasicId": "417692167622725", - "FieldIndex": "7", - "FieldName": "Id", - "FieldRemark": "Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-15 16:53:48.893", - "UpdateTime": "2023-5-15 19:41:27.993", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "Y", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "417692167688261", - "BasicId": "417692167622725", - "FieldIndex": "0", - "FieldName": "Name", - "FieldRemark": "姓名", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "1", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "417692167688262", - "BasicId": "417692167622725", - "FieldIndex": "1", - "FieldName": "Sex", - "FieldRemark": "性别", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "2", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "417692167688263", - "BasicId": "417692167622725", - "FieldIndex": "2", - "FieldName": "Nation", - "FieldRemark": "民族", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "3", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "417692167688264", - "BasicId": "417692167622725", - "FieldIndex": "3", - "FieldName": "Age", - "FieldRemark": "年龄", - "FieldType": "int", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "4", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "int", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "417692167688265", - "BasicId": "417692167622725", - "FieldIndex": "4", - "FieldName": "Bir", - "FieldRemark": "生日", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "5", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "417692167688266", - "BasicId": "417692167622725", - "FieldIndex": "5", - "FieldName": "SortCode", - "FieldRemark": "排序码", - "FieldType": "int", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "6", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "int", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "417692167688267", - "BasicId": "417692167622725", - "FieldIndex": "8", - "FieldName": "CreateOrgId", - "FieldRemark": "创建者部门Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "417692167688268", - "BasicId": "417692167622725", - "FieldIndex": "9", - "FieldName": "CreateTime", - "FieldRemark": "创建时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "417692167688269", - "BasicId": "417692167622725", - "FieldIndex": "10", - "FieldName": "UpdateTime", - "FieldRemark": "更新时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "417692167688270", - "BasicId": "417692167622725", - "FieldIndex": "11", - "FieldName": "CreateUserId", - "FieldRemark": "创建者Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "417692167688271", - "BasicId": "417692167622725", - "FieldIndex": "12", - "FieldName": "UpdateUserId", - "FieldRemark": "修改者Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "417692167688272", - "BasicId": "417692167622725", - "FieldIndex": "13", - "FieldName": "CreateUser", - "FieldRemark": "创建人", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "417692167688273", - "BasicId": "417692167622725", - "FieldIndex": "14", - "FieldName": "UpdateUser", - "FieldRemark": "更新人", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "417692167688274", - "BasicId": "417692167622725", - "FieldIndex": "15", - "FieldName": "IsDelete", - "FieldRemark": "软删除", - "FieldType": "bit", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "bool", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "417692167688275", - "BasicId": "417692167622725", - "FieldIndex": "16", - "FieldName": "ExtJson", - "FieldRemark": "扩展信息", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "417692167688276", - "BasicId": "417692167622725", - "FieldIndex": "6", - "FieldName": "Money", - "FieldRemark": "存款", - "FieldType": "decimal", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "16", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "decimal", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046575685", - "BasicId": "418032046346309", - "FieldIndex": "0", - "FieldName": "Avatar", - "FieldRemark": "头像", - "FieldType": "nvarchar", - "EffectType": "image", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "GENDER", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "Y", - "QueryType": "like", - "SortCode": "1", - "CreateTime": "2023-5-16 15:56:47.14", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "418032046587973", - "BasicId": "418032046346309", - "FieldIndex": "1", - "FieldName": "Signature", - "FieldRemark": "签名", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "2", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "418032046587974", - "BasicId": "418032046346309", - "FieldIndex": "2", - "FieldName": "Account", - "FieldRemark": "账号", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "3", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "Y" - }, - { - "Id": "418032046587975", - "BasicId": "418032046346309", - "FieldIndex": "3", - "FieldName": "Password", - "FieldRemark": "密码", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "Y", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "4", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587976", - "BasicId": "418032046346309", - "FieldIndex": "4", - "FieldName": "Name", - "FieldRemark": "姓名", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "5", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587977", - "BasicId": "418032046346309", - "FieldIndex": "5", - "FieldName": "Nickname", - "FieldRemark": "昵称", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "6", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587978", - "BasicId": "418032046346309", - "FieldIndex": "6", - "FieldName": "Gender", - "FieldRemark": "性别", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "7", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587979", - "BasicId": "418032046346309", - "FieldIndex": "7", - "FieldName": "Birthday", - "FieldRemark": "出生日期", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "8", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587980", - "BasicId": "418032046346309", - "FieldIndex": "8", - "FieldName": "Nation", - "FieldRemark": "民族", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "9", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587981", - "BasicId": "418032046346309", - "FieldIndex": "9", - "FieldName": "HomeAddress", - "FieldRemark": "家庭住址", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "10", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587982", - "BasicId": "418032046346309", - "FieldIndex": "10", - "FieldName": "MailingAddress", - "FieldRemark": "通信地址", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "11", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587983", - "BasicId": "418032046346309", - "FieldIndex": "11", - "FieldName": "IdCardType", - "FieldRemark": "证件类型", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "12", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587984", - "BasicId": "418032046346309", - "FieldIndex": "12", - "FieldName": "IdCardNumber", - "FieldRemark": "证件号码", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "13", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587985", - "BasicId": "418032046346309", - "FieldIndex": "13", - "FieldName": "CultureLevel", - "FieldRemark": "文化程度", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "14", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587986", - "BasicId": "418032046346309", - "FieldIndex": "14", - "FieldName": "PoliticalOutlook", - "FieldRemark": "政治面貌", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "15", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587987", - "BasicId": "418032046346309", - "FieldIndex": "15", - "FieldName": "College", - "FieldRemark": "毕业院校", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "16", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587988", - "BasicId": "418032046346309", - "FieldIndex": "16", - "FieldName": "Education", - "FieldRemark": "学历", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "17", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587989", - "BasicId": "418032046346309", - "FieldIndex": "17", - "FieldName": "EduLength", - "FieldRemark": "学制", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "18", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587990", - "BasicId": "418032046346309", - "FieldIndex": "18", - "FieldName": "Degree", - "FieldRemark": "学位", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "19", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587991", - "BasicId": "418032046346309", - "FieldIndex": "19", - "FieldName": "Phone", - "FieldRemark": "手机", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "20", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587992", - "BasicId": "418032046346309", - "FieldIndex": "20", - "FieldName": "Email", - "FieldRemark": "邮箱", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "21", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592069", - "BasicId": "418032046346309", - "FieldIndex": "21", - "FieldName": "HomeTel", - "FieldRemark": "家庭电话", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "22", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592070", - "BasicId": "418032046346309", - "FieldIndex": "22", - "FieldName": "OfficeTel", - "FieldRemark": "办公电话", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "23", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592071", - "BasicId": "418032046346309", - "FieldIndex": "23", - "FieldName": "EmergencyPhone", - "FieldRemark": "紧急联系人电话", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "24", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592072", - "BasicId": "418032046346309", - "FieldIndex": "24", - "FieldName": "EmergencyAddress", - "FieldRemark": "紧急联系人地址", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "25", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592073", - "BasicId": "418032046346309", - "FieldIndex": "25", - "FieldName": "EmpNo", - "FieldRemark": "员工编号", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "26", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592074", - "BasicId": "418032046346309", - "FieldIndex": "26", - "FieldName": "EntryDate", - "FieldRemark": "入职日期", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "27", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592075", - "BasicId": "418032046346309", - "FieldIndex": "27", - "FieldName": "OrgId", - "FieldRemark": "机构id", - "FieldType": "bigint", - "EffectType": "fk", - "FkEntityName": "SysOrg", - "FkColumnId": "Id", - "FkColumnName": "Name", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "28", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592076", - "BasicId": "418032046346309", - "FieldIndex": "28", - "FieldName": "PositionId", - "FieldRemark": "职位id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "29", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592077", - "BasicId": "418032046346309", - "FieldIndex": "29", - "FieldName": "PositionLevel", - "FieldRemark": "职级", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "30", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592078", - "BasicId": "418032046346309", - "FieldIndex": "30", - "FieldName": "DirectorId", - "FieldRemark": "主管id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "31", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592079", - "BasicId": "418032046346309", - "FieldIndex": "31", - "FieldName": "PositionJson", - "FieldRemark": "兼任信息", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "32", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592080", - "BasicId": "418032046346309", - "FieldIndex": "32", - "FieldName": "LastLoginIp", - "FieldRemark": "上次登录ip", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "33", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592081", - "BasicId": "418032046346309", - "FieldIndex": "33", - "FieldName": "LastLoginAddress", - "FieldRemark": "上次登录地点", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "34", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592082", - "BasicId": "418032046346309", - "FieldIndex": "34", - "FieldName": "LastLoginTime", - "FieldRemark": "上次登录时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "35", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592083", - "BasicId": "418032046346309", - "FieldIndex": "35", - "FieldName": "LastLoginDevice", - "FieldRemark": "上次登录设备", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "36", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592084", - "BasicId": "418032046346309", - "FieldIndex": "36", - "FieldName": "LatestLoginIp", - "FieldRemark": "最新登录ip", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "37", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592085", - "BasicId": "418032046346309", - "FieldIndex": "37", - "FieldName": "LatestLoginAddress", - "FieldRemark": "最新登录地点", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "38", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592086", - "BasicId": "418032046346309", - "FieldIndex": "38", - "FieldName": "LatestLoginTime", - "FieldRemark": "最新登录时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "39", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592087", - "BasicId": "418032046346309", - "FieldIndex": "39", - "FieldName": "LatestLoginDevice", - "FieldRemark": "最新登录设备", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "40", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592088", - "BasicId": "418032046346309", - "FieldIndex": "40", - "FieldName": "UserStatus", - "FieldRemark": "用户状态", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "41", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592089", - "BasicId": "418032046346309", - "FieldIndex": "41", - "FieldName": "SortCode", - "FieldRemark": "排序码", - "FieldType": "int", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "42", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "int", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592090", - "BasicId": "418032046346309", - "FieldIndex": "42", - "FieldName": "NativePlace", - "FieldRemark": "籍贯", - "FieldType": "varchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "49", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592091", - "BasicId": "418032046346309", - "FieldIndex": "43", - "FieldName": "EmergencyContact", - "FieldRemark": "紧急联系人", - "FieldType": "varchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "50", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592092", - "BasicId": "418032046346309", - "FieldIndex": "44", - "FieldName": "Id", - "FieldRemark": "Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "Y", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "418032046592093", - "BasicId": "418032046346309", - "FieldIndex": "45", - "FieldName": "CreateTime", - "FieldRemark": "创建时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "418032046592094", - "BasicId": "418032046346309", - "FieldIndex": "46", - "FieldName": "UpdateTime", - "FieldRemark": "更新时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "418032046592095", - "BasicId": "418032046346309", - "FieldIndex": "47", - "FieldName": "CreateUserId", - "FieldRemark": "创建者Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "418032046592096", - "BasicId": "418032046346309", - "FieldIndex": "48", - "FieldName": "UpdateUserId", - "FieldRemark": "修改者Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "418032046592097", - "BasicId": "418032046346309", - "FieldIndex": "49", - "FieldName": "IsDelete", - "FieldRemark": "软删除", - "FieldType": "bit", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "bool", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "418032046592098", - "BasicId": "418032046346309", - "FieldIndex": "50", - "FieldName": "ExtJson", - "FieldRemark": "扩展信息", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "418032046592099", - "BasicId": "418032046346309", - "FieldIndex": "51", - "FieldName": "CreateUser", - "FieldRemark": "创建人", - "FieldType": "varchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "418032046592100", - "BasicId": "418032046346309", - "FieldIndex": "52", - "FieldName": "UpdateUser", - "FieldRemark": "更新人", - "FieldType": "varchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - } - ] -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/Dto/GenBasicInput.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/Dto/GenBasicInput.cs deleted file mode 100644 index 0e8fd60cdee6228b2966d2e79ea825145272931a..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/Dto/GenBasicInput.cs +++ /dev/null @@ -1,180 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 代码生成基础添加参数 -/// -public class GenBasicAddInput : GenBasic, IValidatableObject -{ - /// - /// 所属库名称 - /// - [Required(ErrorMessage = "ConfigId不能为空")] - public override string ConfigId { get; set; } - - /// - /// 主表名称 - /// - [Required(ErrorMessage = "BbTable不能为空")] - public override string DbTable { get; set; } - - /// - /// 功能列表 - /// - [Required(ErrorMessage = "FuncList不能为空")] - public override List? FuncList { get; set; } - - /// - /// 生成模版 - /// - [Required(ErrorMessage = "ModuleType不能为空")] - public override string ModuleType { get; set; } - - /// - /// 数据权限 - /// - [Required(ErrorMessage = "DataPermission不能为空")] - public override string DataPermission { get; set; } - - /// - /// 实体名称 - /// - [Required(ErrorMessage = "EntityName不能为空")] - public override string EntityName { get; set; } - - /// - /// 表前缀移除 - /// - [Required(ErrorMessage = "TablePrefix不能为空")] - public override string TablePrefix { get; set; } - - /// - /// 生成方式 - /// - [Required(ErrorMessage = "GenerateType不能为空")] - public override string GenerateType { get; set; } - - /// - /// 所属模块 - /// - [IdNotNull(ErrorMessage = "Module不能为空")] - public override long Module { get; set; } - - /// - /// 路由名 - /// - [Required(ErrorMessage = "RouteName不能为空")] - public override string RouteName { get; set; } - - - /// - /// 图标 - /// - [Required(ErrorMessage = "Icon不能为空")] - public override string Icon { get; set; } - - /// - /// 功能名 - /// - [Required(ErrorMessage = "FunctionName不能为空")] - public override string FunctionName { get; set; } - - /// - /// 业务名 - /// - [Required(ErrorMessage = "BusName不能为空")] - public override string BusName { get; set; } - - /// - /// 类名 - /// - [Required(ErrorMessage = "ClassName不能为空")] - public override string ClassName { get; set; } - - /// - /// 表单布局 - /// - [Required(ErrorMessage = "FormLayout不能为空")] - public override string FormLayout { get; set; } - - /// - /// 使用栅格 - /// - [Required(ErrorMessage = "GridWhether不能为空")] - public override string GridWhether { get; set; } - - /// - /// 左侧树 - /// - [Required(ErrorMessage = "LeftTree不能为空")] - public override string LeftTree { get; set; } - - /// - /// 前端路径 - /// - [Required(ErrorMessage = "FrontedPath不能为空")] - public override string FrontedPath { get; set; } - - /// - /// 服务层 - /// - [Required(ErrorMessage = "ServicePosition不能为空")] - public override string ServicePosition { get; set; } - - /// - /// 控制器层 - /// - [Required(ErrorMessage = "ControllerPosition不能为空")] - public override string ControllerPosition { get; set; } - - /// - /// 排序 - /// - [Required(ErrorMessage = "SortCode不能为空")] - public override int SortCode { get; set; } - - /// - /// 作者名 - /// - [Required(ErrorMessage = "AuthorName不能为空")] - public override string AuthorName { get; set; } - - public IEnumerable Validate(ValidationContext validationContext) - { - //如果是树形结构 - if (ModuleType.Contains("tree")) - { - if (string.IsNullOrEmpty(TreeId) || string.IsNullOrEmpty(TreeName) || string.IsNullOrEmpty(TreePid)) - yield return new ValidationResult($"必须配置树表相关信息", new[] { nameof(TreeId), nameof(TreeName), nameof(TreePid) }); - } - //如果是树形结构 - if (ModuleType.Contains("master")) - { - if (string.IsNullOrEmpty(ChildFk) || string.IsNullOrEmpty(ChildTable)) - yield return new ValidationResult($"必须配置主子表相关信息", new[] { nameof(ChildTable), nameof(ChildFk) }); - } - if (!FuncList.Contains("curd")) - { - yield return new ValidationResult($"必须包含基础的增删改查功能", new[] { nameof(FuncList) }); - } - } -} - -/// -/// 代码生成基础编辑参数 -/// -public class GenBasicEditInput : GenBasicAddInput -{ - [IdNotNull(ErrorMessage = "Id不能为空")] - public override long Id { get; set; } -} - -/// -/// 执行代码生成参数 -/// -public class ExecGenInput : BaseIdInput -{ - /// - /// 生成类型 - /// - public string ExecType { get; set; } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/Dto/GenBasicOutput.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/Dto/GenBasicOutput.cs deleted file mode 100644 index 418cd590ef3600047a8cd003cb34a2f610644224..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/Dto/GenBasicOutput.cs +++ /dev/null @@ -1,67 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 表字段信息输出 -/// -public class GenBasicColumnOutput -{ - /// - /// 字段名称 - /// - public string ColumnName { get; set; } - - /// - /// 是否主键 - /// - public bool IsPrimarykey { get; set; } - - /// - /// 字段类型 - /// - public string TypeName { get; set; } - - /// - /// 字段注释 - /// - public string ColumnRemark { get; set; } -} - -/// -/// 预览代码生成结果 -/// -public class GenBasePreviewOutput -{ - /// - /// SQL代码结果集 - /// - public List SqlResults { get; set; } = new List(); - - /// - /// 前端代码结果集 - /// - public List CodeFrontendResults { get; set; } = new List(); - - /// - /// 后端代码结果集 - /// - - public List CodeBackendResults { get; set; } = new List(); - - public class GenBaseCodeResult - { - /// - /// 代码文件名称 - /// - public string CodeFileName { get; set; } - - /// - /// 文件路径 - /// - public string FilePath { get; set; } - - /// - /// 代码文件内容 - /// - public string CodeFileContent { get; set; } - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/Dto/GenViewModel.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/Dto/GenViewModel.cs deleted file mode 100644 index c6cbe6869f91ec2e2ea755464adb97c867a9e604..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/Dto/GenViewModel.cs +++ /dev/null @@ -1,251 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 代码生成绑定视图 -/// -public class GenViewModel : GenBasic -{ - #region 基础 - - /// - /// 生成时间 - /// - public string GenTime { get; set; } = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - - /// - /// 表字段 - /// - public List TableFields { get; set; } - - #endregion 基础 - - #region 菜单 - - /// - /// 菜单ID - /// - public long MenuId { get; set; } = CommonUtils.GetSingleId(); - - /// - /// 菜单编码 - /// - public string MenuCode { get; set; } = RandomHelper.CreateRandomString(10); - - /// - /// /菜单路径 - /// - public string MenuPath - { - get { return $"/{RouteName}/{BusName}"; } - } - - /// - /// /菜单路径 - /// - public string MenuComponent - { - get { return $"{RouteName}/{BusName}/index"; } - } - - #endregion 菜单 - - #region 按钮 - - /// - /// 添加按钮ID - /// - public long AddButtonId { get; set; } = CommonUtils.GetSingleId(); - - /// - /// 批量删除按钮ID - /// - public long BatchDeleteButtonId { get; set; } = CommonUtils.GetSingleId(); - - /// - /// 编辑按钮ID - /// - public long EditButtonId { get; set; } = CommonUtils.GetSingleId(); - - /// - /// 删除按钮ID - /// - public long DeleteButtonId { get; set; } = CommonUtils.GetSingleId(); - - #endregion 按钮 - - #region 后端 - - /// - /// 类名首字母小写 - /// - public string ClassNameFirstLower - { - get { return StringHelper.FirstCharToLower(ClassName); } - } - - /// - /// swagger分组名称 - /// - public string ApiGroup - { - get - { - return ServicePosition.Split(".").Last(); - } - } - - /// - /// 服务名 - /// - public string ServiceName - { - get { return ClassName + "Service"; } - } - - /// - /// 服务名开头首字母小写 - /// - public string ServiceFirstLower - { - get { return ClassNameFirstLower + "Service"; } - } - - #endregion 后端 - - #region 注释描述 - - /// - /// 分页查询 - /// - public string DescriptionPage - { - get { return FunctionName + "分页查询"; } - } - - /// - /// 列表查询 - /// - public string DescriptionList - { - get { return FunctionName + "列表查询"; } - } - - /// - /// 添加 - /// - public string DescriptionAdd - { - get { return "添加" + FunctionName; } - } - - /// - /// 修改 - /// - public string DescriptionEdit - { - get { return "修改" + FunctionName; } - } - - /// - /// 修改 - /// - public string DescriptionDelete - { - get { return "删除" + FunctionName; } - } - - /// - /// 详情 - /// - public string DescriptionDetail - { - get { return FunctionName + "详情"; } - } - - - /// - /// 导入 - /// - public string DescriptionImport - { - get { return FunctionName + "导入"; } - } - - /// - /// 导入模板下载 - /// - public string DescriptionTemplate - { - get { return FunctionName + "导入模板下载"; } - } - - /// - /// 导入预览 - /// - public string DescriptionPreview - { - get { return FunctionName + "导入预览"; } - } - - /// - /// 导入 - /// - public string DescriptionExport - { - get { return FunctionName + "导出"; } - } - - /// - /// 批量编辑 - /// - public string DescriptionEdits - { - get { return FunctionName + "批量编辑"; } - } - - /// - /// 树查询 - /// - public string DescriptionTree - { - get { return FunctionName + "树"; } - } - - #endregion 注释描述 - - #region 参数 - - /// - /// 分页参数 - /// - public string PageInput - { - get { return ClassName + "PageInput"; } - } - - /// - /// 添加参数 - /// - public string AddInput - { - get { return ClassName + "AddInput"; } - } - - /// - /// 编辑参数 - /// - public string EditInput - { - get { return ClassName + "EditInput"; } - } - - /// - /// 树查询参数 - /// - public string TreeInput - { - get { return ClassName + "TreeInput"; } - } - - #endregion 参数 -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/GenBasicService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/GenBasicService.cs deleted file mode 100644 index 15c86d8982605d5a247c0c0eafd260aeb85297e8..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/GenBasicService.cs +++ /dev/null @@ -1,636 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// -/// -public class GenBasicService : DbRepository, IGenbasicService -{ - private readonly ILogger _logger; - private readonly IViewEngine _viewEngine; - private readonly IGenConfigService _genConfigService; - private readonly IMenuService _menuService; - private readonly IButtonService _buttonService; - private readonly IRoleService _roleService; - private readonly string _sqlDir = "Sql"; - private readonly string _backendDir = "Backend"; - private readonly string _frontDir = "Frontend"; - - public GenBasicService(ILogger logger, - IViewEngine viewEngine, - IGenConfigService genConfigService, - IMenuService menuService, - IButtonService buttonService, IRoleService roleService) - { - _logger = logger; - _viewEngine = viewEngine; - _genConfigService = genConfigService; - _menuService = menuService; - _buttonService = buttonService; - _roleService = roleService; - } - - /// - public async Task> Page(BasePageInput input) - { - var query = Context.Queryable() - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}")//排序 - .OrderBy(it => it.SortCode, OrderByType.Desc)//默认排序 - .OrderBy(it => it.CreateTime, OrderByType.Desc)//默认排序 - .Mapper(it => - { - it.FuncList = it.Functions.Split(",", StringSplitOptions.RemoveEmptyEntries).ToList();//功能集合转为列表 - }); - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 - return pageInfo; - } - - /// - public List GetTables(bool isAll = false) - { - if (isAll) - return SqlSugarUtils.GetTablesByAttribute(); - return SqlSugarUtils.GetTablesByAttribute(); - } - - - - /// - public List GetAssemblies() - { - var names = new List();//结果集 - var excludeList = new List - { - "Web.Entry", "Core", "Cache", "SqlSugar", "Plugin.Core", "Plugin.Gen", "Plugin.Mqtt", "Plugin.SignalR", "Plugin.Aop" - };//排除的程序集 - //获取所有程序集名称 - var assemblies = App.Assemblies - .Where(it => !it.FullName.StartsWith("Furion")) - .Select(it => it.FullName).ToList(); - assemblies.ForEach(it => - { - var name = it.Split(",")[0];//根据逗号分割取第一个 - //根据.分割获取最后两个 - - - var projectName = string.Join(".", name.Split(".").Skip(1).ToList()); - if (!excludeList.Contains(projectName))//去掉排除的程序集 - { - names.Add(name); - } - }); - return names; - } - - - /// - public async Task Add(GenBasicAddInput input) - { - var entity = input.Adapt();//输入参数转实体 - entity.Functions = string.Join(",", input.FuncList);//功能集合 - var tableColumns = SqlSugarUtils.GetTableColumns(input.ConfigId, input.DbTable);//获取表的字段信息 - var genConfigs = new List();//代码生成配置字段集合 - //遍历字段 - var sortCode = 0; - //遍历字段 - tableColumns.ForEach(it => - { - #region 判断是否想显示 - - var yesOrNo = GenConst.Yes; - if (it.IsPrimarykey || SqlSugarUtils.IsCommonColumn(it.ColumnName))//如果是主键或者是公共字段则不显示 - yesOrNo = GenConst.No; - else - yesOrNo = GenConst.Yes; - - #endregion 判断是否想显示 - - //添加到字段集合 - genConfigs.Add(new GenConfig - { - IsPrimarykey = it.IsPrimarykey ? GenConst.Yes : GenConst.No, - FieldName = it.ColumnName, - FieldType = it.DataType, - FieldNetType = SqlSugarUtils.ConvertDataType(it.DataType), - FieldRemark = it.ColumnDescription ?? it.ColumnName, - EffectType = EffTypeConst.INPUT, - Width = 100, - WhetherTable = yesOrNo, - WhetherAddUpdate = yesOrNo, - WhetherImportExport = yesOrNo, - WhetherResizable = GenConst.No, - WhetherRequired = GenConst.No, - WhetherRetract = GenConst.No, - QueryWhether = GenConst.No, - SortCode = yesOrNo == GenConst.No ? 99 : sortCode//如果是公共字段就排最后 - }); - sortCode++; - }); - var index = 0; - genConfigs = genConfigs.OrderBy(it => it.SortCode).ToList();//排序 - genConfigs.ForEach(it => - { - it.FieldIndex = index; - index++; - }); - if (!genConfigs.Any(it => it.IsPrimarykey == GenConst.Yes))//判断是否有主键 - { - throw Oops.Bah("要生成的表必须有主键"); - } - - //事务 - var result = await itenant.UseTranAsync(async () => - { - entity = await InsertReturnEntityAsync(entity);//输入参数转实体并插入 - genConfigs.ForEach(it => { it.BasicId = entity.Id; });//遍历字段赋值基础Id - await Context.Insertable(genConfigs).ExecuteCommandAsync(); - }); - if (!result.IsSuccess)//如果失败了 - { - //写日志 - _logger.LogError(result.ErrorMessage, result.ErrorException); - throw Oops.Oh(ErrorCodeEnum.A0003); - } - - return entity; - } - - /// - public async Task Delete(List input) - { - //获取所有ID - var ids = input.Select(it => it.Id).ToList(); - if (ids.Count > 0) - { - //事务 - var result = await itenant.UseTranAsync(async () => - { - await DeleteByIdsAsync(ids.Cast().ToArray());//删除基础表 - await Context.Deleteable().Where(it => ids.Contains(it.BasicId)) - .ExecuteCommandAsync();//删除配置表 - }); - if (!result.IsSuccess)//如果失败了 - { - //写日志 - _logger.LogError(result.ErrorMessage, result.ErrorException); - throw Oops.Oh(ErrorCodeEnum.A0002); - } - } - } - - /// - public async Task Edit(GenBasicEditInput input) - { - var entity = input.Adapt();//输入参数转实体 - entity.Functions = string.Join(",", input.FuncList);//功能集合 - await UpdateAsync(entity); - return entity; - } - - /// - public async Task PreviewGen(BaseIdInput input) - { - var genBasic = await GetGenBasic(input.Id);//获取代码生成基础 - return await PreviewGen(genBasic); - } - - /// - public async Task ExecGenPro(ExecGenInput input) - { - var genBasic = await GetGenBasic(input.Id);//获取代码生成基础 - if (genBasic.GenerateType != GenConst.Pro) throw Oops.Bah("当前配置生成方式为:项目中"); - var backendPath = - Path.Combine(new DirectoryInfo(App.WebHostEnvironment.ContentRootPath).Parent.FullName);//获取主工程目录 - var srcDir = "src";//默认都是代码放在src文件夹 - var frontedPath = genBasic.FrontedPath;//获取前端代码路径, - if (!frontedPath.Contains(srcDir))//如果不包含src - frontedPath = genBasic.FrontedPath.CombinePath(srcDir); - if (await CreateMenuButtonAndRelation(genBasic)) - { - var previewCode = await PreviewGen(genBasic);//获取代码生成预览 - if (input.ExecType != GenConst.ExecAll)//如果不是全部执行 - { - if (input.ExecType == GenConst.ExecBackend) - ExecBackend(previewCode.CodeBackendResults, genBasic, backendPath);//执行后端代码生成 - else if (input.ExecType == GenConst.ExecFrontend) - ExecFronted(previewCode.CodeFrontendResults, genBasic, frontedPath);//执行前端代码生成 - } - else - { - ExecBackend(previewCode.CodeBackendResults, genBasic, backendPath);//执行后端代码生成 - - ExecFronted(previewCode.CodeFrontendResults, genBasic, frontedPath);//执行前端代码生成 - } - } - else - { - throw Oops.Bah("代码生成失败"); - } - } - - /// - public async Task ExecGenZip(ExecGenInput input) - { - var genBasic = await GetGenBasic(input.Id);//获取代码生成基础 - if (genBasic.GenerateType != GenConst.Zip) throw Oops.Bah("当前配置生成方式为:压缩包"); - var temDir = Path.GetTempPath().CombinePath(genBasic.ClassName);//获取临时目录并用类名做存放代码文件文件夹 - File.Delete(temDir + ".zip");// 先删除压缩包 - var previewCode = await PreviewGen(genBasic);//获取代码生成预览 - if (input.ExecType != GenConst.ExecAll)//如果不是全部执行 - { - if (input.ExecType == GenConst.ExecBackend) - { - ExecBackend(previewCode.CodeBackendResults, genBasic, temDir.CombinePath(_backendDir), true);//执行后端代码生成 - ExecSql(previewCode.SqlResults, temDir);//执行sql生成 - } - else if (input.ExecType == GenConst.ExecFrontend) - ExecFronted(previewCode.CodeFrontendResults, genBasic, temDir.CombinePath(_frontDir));//执行前端生成 - } - else - { - ExecBackend(previewCode.CodeBackendResults, genBasic, temDir.CombinePath(_backendDir), true);//执行后端代码生成 - ExecFronted(previewCode.CodeFrontendResults, genBasic, temDir.CombinePath(_frontDir));//执行前端生成 - } - var zipPath = ZipUtils.CompressDirectory(temDir, true);//压缩文件夹 - var result = new FileStreamResult(new FileStream(zipPath, FileMode.Open), "application/octet-stream") - { FileDownloadName = $"{genBasic.ClassName}.zip" }; - return result; - } - - #region 方法 - - /// - /// 生成后端代码文件 - /// - /// 后端代码模板 - /// 代码基础 - /// 后端生成路径 - /// 是否是zip方式 - public void ExecBackend(List baseCodeResults, GenBasic genBasic, - string backendPath, bool isZip = false) - { - var serviceDir = "Services";//服务代码文件夹 - var controllerDir = "Controllers";//服务代码文件夹 - var tempDicName = "";//临时文件夹名称 - var dirList = new HashSet { };//文件夹列表 - var postion = "";//文件夹位置 - var parentDir = _backendDir;//父文件文件夹名称 - var serviceName = genBasic.ServicePosition.Split(".").Last();//取服务层最后一个单词命名为接口层控制器下的文件夹 - baseCodeResults.ForEach(it => - { - var fileInfo = new FileInfo(it.FilePath);//获取文件信息 - var dirName = fileInfo.Directory.Name;//获取文件文件夹名称 - var parentName = fileInfo.Directory.Parent.Name;//获取父文件文件夹名称 - if (dirName == controllerDir)//如果是控制器 - { - dirList.Add(dirName);//添加到当前文件夹到文件夹列表 - dirList.Add(serviceName);//添加服务层目录名到文件夹列表 - postion = genBasic.ControllerPosition;//设置文件夹创建位置为Api层 - } - else if (dirName == serviceDir)//如果是服务 - { - dirList.Remove(controllerDir);//删除接口文件夹 - dirList.Remove(serviceName);//删除服务层目录 - dirList.Add(genBasic.ClassName);//添加ClassName到文件夹列表 - dirList.Add(dirName);//添加到当前文件夹到文件夹列表 - postion = genBasic.ServicePosition;//设置文件夹创建位置为服务层 - } - - if (parentDir != parentName)//如果当前文件的父文件夹不等于partDir表示层级有变动 - { - dirList.Add(dirName);//添加到文件夹列表 - parentDir = parentName;//重新赋值父文件夹 - } - else - { - if (tempDicName != dirName)//如果临时文件夹不是当前文件夹表示同级目录下的另一个文件夹 - { - dirList.Remove(tempDicName);//删除上一个文件夹 - dirList.Add(dirName);//添加当前文件夹到文件夹列表 - } - } - - tempDicName = dirName;//给临时文件夹赋值 - var path = backendPath;//后端文件目录 - if (!isZip) path = backendPath.CombinePath(postion);//如果不是zip方式就加上命名空间 - path = path.CombinePath(dirList.ToArray()); - if (!Directory.Exists(path))//如果文件夹不存在就创建文件夹 - Directory.CreateDirectory(path); - //var fileName = genBasic.ClassName + it.CodeFileName;//文件名等于类名加代码文件名 - //if (it.CodeFileName.StartsWith("IService")) - // fileName = $"I{genBasic.ClassName}Service.cs";//对IService接口要特殊处理 - //path = path.CombinePath(fileName);//最终生成文件地址 - File.WriteAllText(path.CombinePath(it.CodeFileName), it.CodeFileContent, Encoding.UTF8);//写入文件 - }); - } - - /// - /// 生成前端代码文件 - /// - /// 前端代码模板 - /// 代码基础 - /// 前端生成路径 - public void ExecFronted(List baseCodeResults, GenBasic genBasic, - string frontedPath) - { - var apiDir = "api"; - var viewDir = "views"; - var parentDir = _frontDir;//父文件文件夹名称 - var dirList = new HashSet { };//文件夹列表 - baseCodeResults.ForEach(it => - { - var fileInfo = new FileInfo(it.FilePath);//获取文件信息 - var dirName = fileInfo.Directory.Name;//获取文件文件夹名称 - var parentName = fileInfo.Directory.Parent.Name;//获取父文件文件夹名称 - var path = frontedPath.CombinePath(fileInfo.Directory.Name) - .CombinePath(genBasic.RouteName);//生成路径为前端路径+代码文件所在文件夹+路由地址 - if (dirName == apiDir)//如果是api文件夹 - it.CodeFileName = - StringHelper.FirstCharToLower(genBasic.ClassName) + it.CodeFileName;//文件名等于路由名加类名加代码文件名 - else if (dirName == viewDir) - path = path.CombinePath(genBasic.BusName); - if (!Directory.Exists(path))//如果文件夹不存在就创建文件夹 - Directory.CreateDirectory(path); - File.WriteAllText(path.CombinePath(it.CodeFileName), it.CodeFileContent, Encoding.UTF8);//写入文件 - }); - } - - /// - /// 生成sql代码文件 - /// - /// 后端代码模板 - /// 生成路径 - public void ExecSql(List baseCodeResults, string execPath) - { - execPath = execPath.CombinePath(_sqlDir);//写在sql目录里面 - if (!Directory.Exists(execPath))//如果文件夹不存在就创建文件夹 - Directory.CreateDirectory(execPath); - baseCodeResults.ForEach(it => - { - File.WriteAllText(execPath.CombinePath(it.CodeFileName), it.CodeFileContent, Encoding.UTF8);//写入文件 - }); - } - - /// - /// 获取sql代码预览结果 - /// - /// 视图 - /// 模板路径 - /// - public async Task> GetSqlCodeResult(GenViewModel genViewModel, - string templatePath) - { - var sqlCodeResults = new List();//结果集 - var sqlTemplatePath = Path.Combine(templatePath, _sqlDir);//获取sql模板文件路径 - - var files = GetAllFileInfo(sqlTemplatePath); - foreach (var fileInfo in files) - { - var fileName = fileInfo.Name;//文件名 - var fileNoPrefix = fileName.Split(fileInfo.Extension)[0];//不带模板后缀的文件名 - var tContent = File.ReadAllText(fileInfo.FullName);//读取文件 - var tResult = await GetViewEngine(tContent, genViewModel);//渲染 - //将渲染结果添加到结果集 - sqlCodeResults.Add(new GenBasePreviewOutput.GenBaseCodeResult - { - CodeFileContent = tResult, - CodeFileName = fileNoPrefix, - FilePath = fileInfo.FullName - }); - } - - return sqlCodeResults; - } - - /// - /// 获取后端代码预览结果 - /// - /// 视图 - /// 模板路径 - /// - public async Task> GetBackendCodeResult(GenViewModel genViewModel, - string templatePath) - { - // templatePath = "D:\\SimpleAdmin\\api\\SimpleAdmin\\SimpleAdmin.Plugin\\SimpleAdmin.Plugin.Gen\\CodeGen";//测试用 - var backendCodeResults = new List();//结果集 - var backendTemplatePath = Path.Combine(templatePath, _backendDir);//获取后端模板文件路径 - var files = GetAllFileInfo(backendTemplatePath); - // files = files.Where(it => it.Name == "Service.cs.vm").ToArray();//测试用 - foreach (var fileInfo in files) - { - var nameWithPrefix = fileInfo.Name;//文件名 - var fileNoPrefix = nameWithPrefix.Split(fileInfo.Extension)[0];//不带模板后缀的文件名 - var tContent = File.ReadAllText(fileInfo.FullName);//读取文件 - var fileName = genViewModel.ClassName + fileNoPrefix;//文件名等于类名加代码文件名 - if (fileNoPrefix.StartsWith("IService")) - fileName = $"I{genViewModel.ClassName}Service.cs";//对IService接口要特殊处理 - var tResult = await GetViewEngine(tContent, genViewModel);//渲染 - //将渲染结果添加到结果集 - backendCodeResults.Add(new GenBasePreviewOutput.GenBaseCodeResult - { - CodeFileContent = tResult, - CodeFileName = fileName, - FilePath = fileInfo.FullName - }); - } - - return backendCodeResults; - } - - /// - /// 获取前端代码预览结果 - /// - /// 视图 - /// 模板路径 - /// - public async Task> GetForntCodeResult(GenViewModel genViewModel, - string templatePath) - { - // templatePath = "D:\\SimpleAdmin\\api\\SimpleAdmin\\SimpleAdmin.Plugin\\SimpleAdmin.Plugin.Gen\\CodeGen";//测试用 - var frontCodeResults = new List();//结果集 - var frontTemplatePath = Path.Combine(templatePath, _frontDir);//获取前端模板文件路径 - var files = GetAllFileInfo(frontTemplatePath); - // files = files.Where(it => it.Name == "index.vue.vm").ToArray();//测试用 - foreach (var fileInfo in files) - { - var fileName = fileInfo.Name;//文件名 - var fileNoPrefix = fileName.Split(fileInfo.Extension)[0];//不带模板后缀的文件名 - var tContent = File.ReadAllText(fileInfo.FullName);//读取文件 - var tResult = await GetViewEngine(tContent, genViewModel);//渲染 - //将渲染结果添加到结果集 - frontCodeResults.Add(new GenBasePreviewOutput.GenBaseCodeResult - { - CodeFileContent = tResult, - CodeFileName = fileNoPrefix, - FilePath = fileInfo.FullName - }); - } - - return frontCodeResults; - } - - /// - /// 获取代码生成视图 - /// - /// - /// - public async Task GetGenViewModel(GenBasic genBasic) - { - //实体转视图 - var genViewEngine = genBasic.Adapt(); - //获取字段信息 - var tableFieldList = await _genConfigService.List(genBasic.Id); - tableFieldList.ForEach(it => - { - it.FieldNameFirstLower = StringHelper.FirstCharToLower(it.FieldName);//首字母小写 - it.FieldNameFirstUpper = StringHelper.FirstCharToUpper(it.FieldName);//首字母大写 - }); - genViewEngine.TableFields = tableFieldList;//赋值表字段信息 - - return genViewEngine; - } - - /// - /// 视图渲染 - /// - /// 模板内容 - /// 参数 - /// - public async Task GetViewEngine(string tContent, GenViewModel genViewModel) - { - //视图引擎渲染 - var tResult = await _viewEngine.RunCompileFromCachedAsync(tContent, genViewModel, builderAction: builder => - { - builder.AddAssemblyReference(typeof(GenBasic));//添加程序集 - builder.AddAssemblyReferenceByName("System.Collections");//添加程序集 - builder.AddAssemblyReferenceByName("SimpleTool");//添加程序集 - }); - return tResult; - } - - /// - /// 获得文件夹下所有的文件 - /// - /// 文件夹路径 - /// - private FileInfo[] GetAllFileInfo(string path) - { - var dir = new DirectoryInfo(path); - return dir.GetFiles(".", SearchOption.AllDirectories); - } - - /// - /// 代码生成预览 - /// - /// 基础配置 - /// - public async Task PreviewGen(GenBasic genBasic) - { - var basePath = AppContext.BaseDirectory;//获取项目目录 - var templatePath = basePath.CombinePath("CodeGen");//获取文件路径 - //var templatePath = App.WebHostEnvironment.WebRootPath + @"\CodeGen";//模板文件文件夹 - var genViewModel = await GetGenViewModel(genBasic); - var frontendResult = await GetForntCodeResult(genViewModel, templatePath); - var backendResult = await GetBackendCodeResult(genViewModel, templatePath); - var sqlResult = await GetSqlCodeResult(genViewModel, templatePath); - return new GenBasePreviewOutput - { - CodeBackendResults = backendResult, - SqlResults = sqlResult, - CodeFrontendResults = frontendResult - }; - } - - /// - /// 获取代码生成基础 - /// - /// - /// - private async Task GetGenBasic(long id) - { - var genBasic = await GetByIdAsync(id); - if (genBasic == null) - throw Oops.Bah("代码生成配置不存在"); - genBasic.FuncList = genBasic.Functions.Split(',').ToList(); - return genBasic; - } - - /// - /// 创建代码生成相关的菜单按钮和授权关系 - /// - /// - /// - private async Task CreateMenuButtonAndRelation(GenBasic genBasic) - { - try - { - #region 菜单 - - var title = genBasic.FunctionName + genBasic.FunctionNameSuffix; - var menuRep = ChangeRepository>();//切换仓储 - //获取已经存在的旧菜单 - var oldMenu = await menuRep.GetFirstAsync(it => it.Title == title - && it.Category == CateGoryConst.Resource_MENU - && it.MenuType == ResourceConst.MENU && - it.Code != ResourceConst.System); - if (oldMenu != null)//如果存在就直接和删除(同时删除其下面的菜单、按钮,清除对应的角色与资源信息) - await _menuService.Delete(new List { new BaseIdInput { Id = oldMenu.Id } }); - //添加菜单参数 - var menu = new MenuAddInput - { - Id = CommonUtils.GetSingleId(), - ParentId = genBasic.MenuPid, - Title = title, - Category = CateGoryConst.Resource_MENU, - Module = genBasic.Module, - Icon = genBasic.Icon, - Name = genBasic.BusName, - Code = RandomHelper.CreateRandomString(10), - Path = $"/{genBasic.RouteName}/{genBasic.BusName}", - Component = $"{genBasic.RouteName}/{genBasic.BusName}/index", - SortCode = 99 - }; - await _menuService.Add(menu);//添加菜单 - - #endregion 菜单 - - #region 按钮 - - //添加按钮参数 - var button = new ButtonAddInput - { - Title = genBasic.FunctionName, - ParentId = menu.Id, - Code = StringHelper.FirstCharToLower(genBasic.ClassName) - }; - var buttonIds = await _buttonService.AddBatch(button);//添加按钮 - - #endregion 按钮 - - #region 角色授权 - - var roleRep = ChangeRepository>();//切换仓储 - var superAdmin = await roleRep.GetFirstAsync(it => - it.Code == RoleConst.SuperAdmin && it.Category == CateGoryConst.Role_GLOBAL);//获取超级管理员 - //授权菜单参数 - var grantResource = new GrantResourceInput - { - Id = superAdmin.Id, - GrantInfoList = new List - { new RelationRoleResuorce { MenuId = menu.Id, ButtonInfo = buttonIds } }, - IsCodeGen = true - }; - await _roleService.GrantResource(grantResource);//授权菜单 - - #endregion 角色授权 - - return true; - } - catch (Exception ex) - { - _logger.LogError($"代码生成创建菜单和授权报错{ex.Message}", ex.InnerException); - return false; - } - } - - #endregion 方法 -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/IGenbasicService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/IGenbasicService.cs deleted file mode 100644 index 5262f9d809c818cd801a0ad7dfc34ecec3255147..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/IGenbasicService.cs +++ /dev/null @@ -1,69 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 代码生成基础服务 -/// -public interface IGenbasicService : ITransient -{ - /// - /// 添加代码生成器基础 - /// - /// - /// - Task Add(GenBasicAddInput input); - - /// - /// 删除代码生成配置 - /// - /// ID列表 - /// - Task Delete(List input); - - /// - /// 编辑代码生成基础配置 - /// - /// - /// 代码生产基础 - Task Edit(GenBasicEditInput input); - - /// - /// 执行代码生成:本地 - /// - /// - /// - Task ExecGenPro(ExecGenInput input); - - /// - /// 执行代码生成:压缩包 - /// - /// - /// - Task ExecGenZip(ExecGenInput input); - - /// - /// 获取项目所有程序集 - /// - /// 程序集列表 - List GetAssemblies(); - - /// - /// 获取表信息 - /// - /// 是否所有表 - /// 实体表列表 - List GetTables(bool isAll = false); - - /// - /// 获取代码生成基础分页 - /// - /// 查询参数 - /// 代码生成基础分页列表 - Task> Page(BasePageInput input); - - /// - /// 代码生成预览 - /// - /// 代码生成基础Id - /// 预览结果 - Task PreviewGen(BaseIdInput input); -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Config/Dto/GenConfigInput.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Config/Dto/GenConfigInput.cs deleted file mode 100644 index 4d1cf072250f19df8d1a4831a21b97b64d452f21..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Config/Dto/GenConfigInput.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -public class GenConfigInput -{ -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Config/GenConfigService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Config/GenConfigService.cs deleted file mode 100644 index 76eff9fa0530702c42875d8a5893844a1e2a2c7c..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Config/GenConfigService.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// -/// -public class GenConfigService : DbRepository, IGenConfigService -{ - private readonly ILogger logger; - - public GenConfigService(ILogger logger) - { - this.logger = logger; - } - - /// - public async Task> List(long basicId) - { - var configs = await GetListAsync(it => it.BasicId == basicId);//获取配置表相关配置 - configs = configs.OrderBy(it => it.FieldIndex).ToList();//排序一下 - return configs; - } - - /// - public async Task EditBatch(List configs) - { - await UpdateRangeAsync(configs);//批量更新 - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Config/IGenConfigService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Config/IGenConfigService.cs deleted file mode 100644 index b05931639bbf87044201d606f3a32462f2232819..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Config/IGenConfigService.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 代码生成详细配置服务 -/// -public interface IGenConfigService : ITransient -{ - /// - /// 批量更新 - /// - /// - /// - Task EditBatch(List configs); - - /// - /// 查询代码生成详细配置列表 - /// - /// - /// 配置列表 - Task> List(long basicId); -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SimpleAdmin.Plugin.Gen.csproj b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SimpleAdmin.Plugin.Gen.csproj deleted file mode 100644 index eb3a57559bf4ebd7c74c43626ee1884bffeed7ec..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SimpleAdmin.Plugin.Gen.csproj +++ /dev/null @@ -1,111 +0,0 @@ - - - - net7.0;net6.0 - 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 - SimpleAdmin.Plugin.Gen.xml - enable - enable - - - - - - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - - - - - - - - - - - - - - - - - - - true - PreserveNewest - PreserveNewest - - - true - PreserveNewest - PreserveNewest - - - true - PreserveNewest - PreserveNewest - - - true - PreserveNewest - PreserveNewest - - - true - PreserveNewest - PreserveNewest - - - true - PreserveNewest - PreserveNewest - - - true - PreserveNewest - PreserveNewest - - - true - PreserveNewest - PreserveNewest - - - true - PreserveNewest - PreserveNewest - - - true - PreserveNewest - PreserveNewest - - - true - PreserveNewest - PreserveNewest - - - true - PreserveNewest - PreserveNewest - - - - - - - - diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SimpleAdmin.Plugin.Gen.xml b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SimpleAdmin.Plugin.Gen.xml deleted file mode 100644 index d856b6c98ce96d77c62b7d7689b9b9dc519a4b03..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SimpleAdmin.Plugin.Gen.xml +++ /dev/null @@ -1,1006 +0,0 @@ - - - - SimpleAdmin.Plugin.Gen - - - - - 代码生成器常量 - - - - - 是 - - - - - 否 - - - - - 压缩包 - - - - - 项目中 - - - - - 全部 - - - - - 前端 - - - - - 后端 - - - - - 代码生成基础控制器 - - - - - 代码生成基础分页 - - - - - - - 获取所有表信息 - - - - - - 获取项目所有程序集 - - - - - - 添加代码生成器 - - - - - - - 编辑代码生成器 - - - - - - - 删除代码生成配置 - - - - - - - 代码生成预览 - - - - - - - 执行代码生成(本地)" - - - - - - - 执行代码生成(压缩包) - - - - - - - 代码生成配置控制器 - - - - - 查询代码生成详细配置列表 - - - - - - - 编辑代码生成详细 - - - - - - - 代码生成基础 - - - - - 所属库 - - - - - 主表 - - - - - 表实体名称 - - - - - 功能列表 - - - - - 数据权限 - - - - - 生成模版 - - - - - 树Id字段 - - - - - 树父Id字段 - - - - - 树名称字段 - - - - - 关联子表名 - - - - - 关联子表外键 - - - - - 移除表前缀 - - - - - 生成方式 - - - - - 所属模块 - - - - - 上级目录 - - - - - 业务名 - - - - - 图标 - - - - - 功能名 - - - - - 功能名后缀 - - - - - 业务名 - - - - - 类名 - - - - - 表单布局 - - - - - 使用栅格 - - - - - 左侧树 - - - - - 前端项目路径 - - - - - 服务代码存放位置 - - - - - 控制器代码存放位置 - - - - - 作者 - - - - - 排序 - - - - - 功能列表 - - - - - 代码生成配置 - - - - - 基础ID - - - - - 字段排序 - - - - - 是否主键 - - - - - 字段 - - - - - 名称 - - - - - 类型 - - - - - 实体类型 - - - - - 作用类型 - - - - - 外键显示字段 - - - - - 外键ID - - - - - 外键显示字段 - - - - - 字典 - - - - - 列宽度 - - - - - 列表显示 - - - - - 列省略 - - - - - 可伸缩列 - - - - - 是否增改 - - - - - 是否导入导出 - - - - - 必填 - - - - - 查询 - - - - - 查询方式 - - - - - 排序 - - - - - 字段名首字母小写 - - - - - 字段名首字母大写 - - - - - 代码生成器配置 - - - - - 系统配置种子数据 - - - - - 系统配置种子数据 - - - - - 代码生成基础添加参数 - - - - - 所属库名称 - - - - - 主表名称 - - - - - 功能列表 - - - - - 生成模版 - - - - - 数据权限 - - - - - 实体名称 - - - - - 表前缀移除 - - - - - 生成方式 - - - - - 所属模块 - - - - - 路由名 - - - - - 图标 - - - - - 功能名 - - - - - 业务名 - - - - - 类名 - - - - - 表单布局 - - - - - 使用栅格 - - - - - 左侧树 - - - - - 前端路径 - - - - - 服务层 - - - - - 控制器层 - - - - - 排序 - - - - - 作者名 - - - - - 代码生成基础编辑参数 - - - - - 执行代码生成参数 - - - - - 生成类型 - - - - - 表字段信息输出 - - - - - 字段名称 - - - - - 是否主键 - - - - - 字段类型 - - - - - 字段注释 - - - - - 预览代码生成结果 - - - - - SQL代码结果集 - - - - - 前端代码结果集 - - - - - 后端代码结果集 - - - - - 代码文件名称 - - - - - 文件路径 - - - - - 代码文件内容 - - - - - 代码生成绑定视图 - - - - - 生成时间 - - - - - 表字段 - - - - - 菜单ID - - - - - 菜单编码 - - - - - /菜单路径 - - - - - /菜单路径 - - - - - 添加按钮ID - - - - - 批量删除按钮ID - - - - - 编辑按钮ID - - - - - 删除按钮ID - - - - - 类名首字母小写 - - - - - swagger分组名称 - - - - - 服务名 - - - - - 服务名开头首字母小写 - - - - - 分页查询 - - - - - 列表查询 - - - - - 添加 - - - - - 修改 - - - - - 修改 - - - - - 详情 - - - - - 导入 - - - - - 导入模板下载 - - - - - 导入预览 - - - - - 导入 - - - - - 批量编辑 - - - - - 树查询 - - - - - 分页参数 - - - - - 添加参数 - - - - - 编辑参数 - - - - - 树查询参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 生成后端代码文件 - - 后端代码模板 - 代码基础 - 后端生成路径 - 是否是zip方式 - - - - 生成前端代码文件 - - 前端代码模板 - 代码基础 - 前端生成路径 - - - - 生成sql代码文件 - - 后端代码模板 - 生成路径 - - - - 获取sql代码预览结果 - - 视图 - 模板路径 - - - - - 获取后端代码预览结果 - - 视图 - 模板路径 - - - - - 获取前端代码预览结果 - - 视图 - 模板路径 - - - - - 获取代码生成视图 - - - - - - - 视图渲染 - - 模板内容 - 参数 - - - - - 获得文件夹下所有的文件 - - 文件夹路径 - - - - - 代码生成预览 - - 基础配置 - - - - - 获取代码生成基础 - - - - - - - 创建代码生成相关的菜单按钮和授权关系 - - - - - - - 代码生成基础服务 - - - - - 添加代码生成器基础 - - - - - - - 删除代码生成配置 - - ID列表 - - - - - 编辑代码生成基础配置 - - - 代码生产基础 - - - - 执行代码生成:本地 - - - - - - - 执行代码生成:压缩包 - - - - - - - 获取项目所有程序集 - - 程序集列表 - - - - 获取表信息 - - 是否所有表 - 实体表列表 - - - - 获取代码生成基础分页 - - 查询参数 - 代码生成基础分页列表 - - - - 代码生成预览 - - 代码生成基础Id - 预览结果 - - - - - - - - - - - - - - - 代码生成详细配置服务 - - - - - 批量更新 - - - - - - - 查询代码生成详细配置列表 - - - 配置列表 - - - - AppStartup启动类 - - - - - ConfigureServices中不能解析服务,比如App.GetService(),尤其是不能在ConfigureServices中获取诸如缓存等数据进行初始化,应该在Configure中进行 - 服务都还没初始化完成,会导致内存中存在多份 IOC 容器!! - 正确应该在 Configure 中,这个时候服务(IServiceCollection 已经完成 BuildServiceProvider() 操作了 - - - - - diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Startup.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Startup.cs deleted file mode 100644 index 98dc77f805ab73516a4e18b57af52d64f7734ccc..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Startup.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Reflection; - -namespace SimpleAdmin.Plugin.Gen; - -/// -/// AppStartup启动类 -/// -public class Startup : AppStartup -{ - /// - /// ConfigureServices中不能解析服务,比如App.GetService(),尤其是不能在ConfigureServices中获取诸如缓存等数据进行初始化,应该在Configure中进行 - /// 服务都还没初始化完成,会导致内存中存在多份 IOC 容器!! - /// 正确应该在 Configure 中,这个时候服务(IServiceCollection 已经完成 BuildServiceProvider() 操作了 - /// - /// - public void ConfigureServices(IServiceCollection services) - { - //代码生成器配置转实体 - services.AddConfigurableOptions(); - //试图引擎 - services.AddViewEngine(); - } - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - var fullName = Assembly.GetExecutingAssembly().FullName;//获取程序集全名 - //通过 App.GetOptions 获取选项 - var settings = App.GetOptions(); - CodeFirstUtils.CodeFirst(settings, fullName);//CodeFirst - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Const/MqttConst.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Const/MqttConst.cs deleted file mode 100644 index 60941cdbf4e728f0c96247a2dfc87e732dd06801..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Const/MqttConst.cs +++ /dev/null @@ -1,32 +0,0 @@ -namespace SimpleAdmin.Plugin.Mqtt; - -/// -/// mqtt常量 -/// -public class MqttConst -{ - /// - /// mqtt认证登录信息key - /// - public const string Cache_MqttClientUser = CacheConst.Cache_Prefix_Web + "MqttClientUser:"; - - /// - /// mqtt主题前缀 - /// - public const string Mqtt_TopicPrefix = "SimpleAdmin/"; - - /// - /// 登出 - /// - public const string Mqtt_Message_LoginOut = "LoginOut"; - - /// - /// 新消息 - /// - public const string Mqtt_Message_New = "NewMessage"; - - /// - /// 修改密码 - /// - public const string Mqtt_Message_UpdatePassword = "UpdatePassword"; -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/GlobalUsing.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/GlobalUsing.cs deleted file mode 100644 index 1992ecd78b9aee5a7fee9a372d8c3383006467e6..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/GlobalUsing.cs +++ /dev/null @@ -1,13 +0,0 @@ -global using Furion; -global using Furion.DependencyInjection; -global using Microsoft.AspNetCore.Builder; -global using Microsoft.AspNetCore.Hosting; -global using Microsoft.Extensions.DependencyInjection; -global using SimpleAdmin.Core; -global using SimpleAdmin.Cache; -global using SimpleAdmin.Plugin.Core; -global using SimpleAdmin.SqlSugar; -global using SimpleMQTT; -global using Microsoft.AspNetCore.Authorization; -global using Microsoft.AspNetCore.Mvc; -global using SimpleAdmin.System; diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/MqttComponent.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/MqttComponent.cs deleted file mode 100644 index 8554148209e1330082df43500fa955405f2e001d..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/MqttComponent.cs +++ /dev/null @@ -1,32 +0,0 @@ -namespace SimpleAdmin.Plugin.Mqtt; - -/// -/// mqtt组件 -/// -public sealed class MqttComponent : IServiceComponent -{ - /// - /// ConfigureServices中不能解析服务,比如App.GetService(),尤其是不能在ConfigureServices中获取诸如缓存等数据进行初始化,应该在Configure中进行 - /// 服务都还没初始化完成,会导致内存中存在多份 IOC 容器!! - /// 正确应该在 Configure 中,这个时候服务(IServiceCollection 已经完成 BuildServiceProvider() 操作了 - /// - /// - /// - public void Load(IServiceCollection services, ComponentContext componentContext) - { - Console.WriteLine("注册Mqtt插件"); - services.AddMqttClientManager(); - } -} - -/// -/// mqtt组件 -/// 模拟 Configure -/// -public sealed class MqttApplicationComponent : IApplicationComponent -{ - public void Load(IApplicationBuilder app, IWebHostEnvironment env, ComponentContext componentContext) - { - App.GetService();//获取mqtt服务判断配置是否有问题 - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Notice/MqttNoticeService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Notice/MqttNoticeService.cs deleted file mode 100644 index 400533af20ceb24158c74a1eb449fca54b02e56b..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Notice/MqttNoticeService.cs +++ /dev/null @@ -1,63 +0,0 @@ -namespace SimpleAdmin.Plugin.Mqtt; - -/// -/// -/// -[Injection(Named = "mqtt")] -public class MqttNoticeService : INoticeService -{ - public MqttNoticeService() - { - } - - /// - public async Task UpdatePassWord(string userId, List clientIds, string message) - { - var _mqttClientManager = GetMqttClientManager(); - //发送修改密码消息 - await _mqttClientManager.GetClient().PublishAsync(MqttConst.Mqtt_TopicPrefix + userId, new MqttMessage - { - Data = new { Message = message, ClientIds = clientIds }, - MsgType = MqttConst.Mqtt_Message_UpdatePassword - }); - } - - /// - public async Task NewMesage(List userIds, List clientIds, string message) - { - var _mqttClientManager = GetMqttClientManager(); - //遍历用户Id - foreach (var userId in userIds) - { - //发送消息 - await _mqttClientManager.GetClient().PublishAsync(MqttConst.Mqtt_TopicPrefix + userId, new MqttMessage - { - Data = new { Message = message }, - MsgType = MqttConst.Mqtt_Message_New - }); - } - } - - /// - public async Task UserLoginOut(string userId, List clientIds, string message) - { - var _mqttClientManager = GetMqttClientManager(); - //发送通知下线消息 - await _mqttClientManager.GetClient().PublishAsync(MqttConst.Mqtt_TopicPrefix + userId, new MqttMessage - { - Data = new { Message = message, ClientIds = clientIds }, - MsgType = MqttConst.Mqtt_Message_LoginOut - }); - } - - /// - /// 获取hubContext - /// - /// - private IMqttClientManager GetMqttClientManager() - { - //解析服务 - var service = App.GetService(); - return service; - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.csproj b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.csproj deleted file mode 100644 index 73136c4ef8168130042fd3f05179cef2fceff3e3..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.csproj +++ /dev/null @@ -1,28 +0,0 @@ - - - - net7.0;net6.0 - 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 - SimpleAdmin.Plugin.Mqtt.xml - enable - enable - - - - - - - - - - - - - PreserveNewest - - - PreserveNewest - - - - diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.xml b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.xml deleted file mode 100644 index 1516ce2870f88411324ffefa63582b61e52a1457..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.xml +++ /dev/null @@ -1,196 +0,0 @@ - - - - SimpleAdmin.Plugin.Mqtt - - - - - mqtt常量 - - - - - mqtt认证登录信息key - - - - - mqtt主题前缀 - - - - - 登出 - - - - - 新消息 - - - - - 修改密码 - - - - - mqtt服务控制器 - - - - - 获取mqtt登录参数 - - - - - - mqtt认证 - - - - - - - mqtt组件 - - - - - ConfigureServices中不能解析服务,比如App.GetService(),尤其是不能在ConfigureServices中获取诸如缓存等数据进行初始化,应该在Configure中进行 - 服务都还没初始化完成,会导致内存中存在多份 IOC 容器!! - 正确应该在 Configure 中,这个时候服务(IServiceCollection 已经完成 BuildServiceProvider() 操作了 - - - - - - - mqtt组件 - 模拟 Configure - - - - - mqtt认证参数 - - - - - 用户ID - - - - - 账号 - - - - - 密码 - - - - - 客户端ID - - - - - mqtt登录参数输出 - - - - - 地址 - - - - - 用户名 - - - - - 密码 - - - - - 客户端ID - - - - - 主题列表 - - - - - mqtt认证输出 - - - - - 结果 "allow" | "deny" | "ignore", // Default `"ignore"` - - - - - 是否超级管理员 - - - - - Mqtt服务 - - - - - mqtt登录http认证 - - 认证参数 - 用户Id - 认证结果 - - - - 获取mqtt登录web端参数 - - 登录参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 获取hubContext - - - - - diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Notice/GlobalUsing.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Notice/GlobalUsing.cs new file mode 100644 index 0000000000000000000000000000000000000000..e02abfc9b0e17c18f0c365f044cc760d3b961f4a --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Notice/GlobalUsing.cs @@ -0,0 +1 @@ + diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Interface/INoticeService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Notice/Interface/INoticeService.cs similarity index 37% rename from api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Interface/INoticeService.cs rename to api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Notice/Interface/INoticeService.cs index 710944b9ee21ae30b1f82a7ab005e2b21a873e5a..575a8c82f6f06d659978db5d83c6b3723c691253 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Interface/INoticeService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Notice/Interface/INoticeService.cs @@ -1,7 +1,19 @@ -namespace SimpleAdmin.Plugin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using MoYu.DependencyInjection; + +namespace SimpleAdmin.Plugin.Notice; /// -/// 通知服务 +/// 通知接口 /// public interface INoticeService : ISingleton { @@ -9,26 +21,23 @@ public interface INoticeService : ISingleton /// 通知用户下线 /// /// 用户ID - /// clientId列表 /// 通知内容 /// - Task UserLoginOut(string userId, List clientIds, string message); + internal Task UserLoginOut(string userId, string message); /// /// 通知用户修改密码 /// /// 用户ID - /// clientId列表 /// 通知内容 /// - Task UpdatePassWord(string userId, List clientIds, string message); + internal Task UpdatePassWord(string userId, string message); /// /// 收到新的消息 /// /// 用户Id列表 - /// clientId列表 /// /// - Task NewMesage(List userIds, List clientIds, string message); -} \ No newline at end of file + internal Task NewMesage(List userIds, string message); +} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Notice/SimpleAdmin.Plugin.Notice.csproj b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Notice/SimpleAdmin.Plugin.Notice.csproj new file mode 100644 index 0000000000000000000000000000000000000000..33acd59288914ff6a7edb68dcc46758311571bc7 --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Notice/SimpleAdmin.Plugin.Notice.csproj @@ -0,0 +1,5 @@ + + + + + diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/GlobalUsing.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/GlobalUsing.cs deleted file mode 100644 index d97fa4af6cded6c452304fb9134db188338d7755..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/GlobalUsing.cs +++ /dev/null @@ -1,7 +0,0 @@ -global using Furion; -global using Furion.DependencyInjection; -global using Microsoft.AspNetCore.SignalR; -global using Microsoft.Extensions.DependencyInjection; -global using SimpleAdmin.Core; -global using SimpleAdmin.Cache; -global using SimpleAdmin.Plugin.Core; \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/ISimpleHub.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/ISimpleHub.cs deleted file mode 100644 index 37d306ac377c12f122ab07b5ccd08a556f6593ed..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/ISimpleHub.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace SimpleAdmin.Plugin.SignalR; - -/// -/// 即时通讯集线器 -/// -public interface ISimpleHub -{ - /// - /// 退出登录 - /// - /// - /// - Task LoginOut(object context); - - /// - /// 新消息 - /// - /// - /// - Task NewMessage(object context); -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/SimpleHub.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/SimpleHub.cs deleted file mode 100644 index c76457a6f6a9141691be74f1828b4ef76d4c8c36..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/SimpleHub.cs +++ /dev/null @@ -1,101 +0,0 @@ -using Furion.InstantMessaging; -using Masuit.Tools; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Http.Connections; - -namespace SimpleAdmin.Plugin.SignalR; - -/// -/// -/// -//[Authorize] -[MapHub("/hubs/simple")] -[Authorize] -public class SimpleHub : Hub -{ - private readonly ISimpleCacheService _simpleCacheService; - - public SimpleHub(ISimpleCacheService simpleCacheService) - { - _simpleCacheService = simpleCacheService; - } - - /// - /// 连接 - /// - /// - public override async Task OnConnectedAsync() - { - var token = Context.GetHttpContext().Request.Query["access_token"];//获取token - if (!string.IsNullOrEmpty(token)) - { - var userIdentifier = Context.UserIdentifier;//自定义的Id - UpdateRedis(userIdentifier, token);//更新redis - } - } - - /// - /// 断开连接 - /// - /// - /// - public override async Task OnDisconnectedAsync(Exception? exception) - { - var userIdentifier = Context.UserIdentifier;//自定义的Id - UpdateRedis(userIdentifier, null, false);//更新redis - await base.OnDisconnectedAsync(exception); - } - - /// - /// 退出登录 - /// - /// - /// - public async Task LoginOut(string userId) - { - await Clients.User(userId).LoginOut("退出登录"); - } - - #region 方法 - - /// - /// 更新redis - /// - /// 用户id - /// token - /// 是否是上线 - private void UpdateRedis(string userIdentifier, string token, bool ifConnect = true) - { - var userId = userIdentifier.Split("_")[0];//分割取第一个 - if (!string.IsNullOrEmpty(userId)) - { - //获取redis当前用户的token信息列表 - var tokenInfos = _simpleCacheService.HashGetOne>(CacheConst.Cache_UserToken, userId); - if (tokenInfos != null) - { - if (ifConnect) - { - //获取redis中当前token - var tokenInfo = tokenInfos.Where(it => it.Token == token).FirstOrDefault(); - if (tokenInfo != null) - { - tokenInfo.ClientIds.Add(userIdentifier);//添加到客户端列表 - _simpleCacheService.HashAdd(CacheConst.Cache_UserToken, userId, tokenInfos);//更新Redis - } - } - else - { - //获取当前客户端ID所在的token信息 - var tokenInfo = tokenInfos.Where(it => it.ClientIds.Contains(userIdentifier)).FirstOrDefault(); - if (tokenInfo != null) - { - tokenInfo.ClientIds.RemoveWhere(it => it == userIdentifier);//从客户端列表删除 - _simpleCacheService.HashAdd(CacheConst.Cache_UserToken, userId, tokenInfos);//更新Redis - } - } - } - } - } - - #endregion 方法 -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Provider/UserIdProvider.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Provider/UserIdProvider.cs deleted file mode 100644 index 889c563fec7ebe62b205e45e0ef039099099684b..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Provider/UserIdProvider.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Furion.DataEncryption; -using SimpleTool; - -namespace SimpleAdmin.Plugin.SignalR; - -/// -/// 用户ID提供器 -/// -public class UserIdProvider : IUserIdProvider -{ - public string GetUserId(HubConnectionContext connection) - { - var token = connection.GetHttpContext().Request.Query["access_token"];//获取token - var claims = JWTEncryption.ReadJwtToken(token)?.Claims;//解析token - var userId = claims.FirstOrDefault(u => u.Type == ClaimConst.UserId)?.Value;//获取用户ID - if (!string.IsNullOrEmpty(userId))//如果不为空 - return $"{userId}_{RandomHelper.CreateLetterAndNumber(5)}";//返回用户ID - else - return connection.ConnectionId; - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Service/SignalrNoticeService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Service/SignalrNoticeService.cs deleted file mode 100644 index ff6f1b8fead6e43696bda768fb32eb4499f8f57e..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Service/SignalrNoticeService.cs +++ /dev/null @@ -1,48 +0,0 @@ -namespace SimpleAdmin.Plugin.SignalR; - -/// -/// -/// -[Injection(Named = "signalr")] -public class SignalrNoticeService : INoticeService -{ - public SignalrNoticeService() - { - } - - /// - public async Task UpdatePassWord(string userId, List clientIds, string message) - { - //发送消息给用户 - await GetHubContext().Clients.Users(clientIds).NewMessage(message); - } - - /// - public async Task NewMesage(List userIds, List clientIds, string message) - { - //发送消息给用户 - await GetHubContext().Clients.Users(clientIds).NewMessage(message); - } - - /// - public async Task UserLoginOut(string userId, List clientIds, string message) - { - //发送消息给用户 - await GetHubContext().Clients.Users(clientIds).LoginOut(message); - } - - #region MyRegion - - /// - /// 获取hubContext - /// - /// - private IHubContext GetHubContext() - { - //解析服务 - var service = App.GetService>(); - return service; - } - - #endregion MyRegion -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SignalRComponent.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SignalRComponent.cs deleted file mode 100644 index 9231afdeb2b5faaf54e5de44ae5da2b2efc0918f..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SignalRComponent.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace SimpleAdmin.Plugin.SignalR; - -/// -/// SignalR组件 -/// -public sealed class SignalRComponent : IServiceComponent -{ - /// - /// ConfigureServices中不能解析服务,比如App.GetService(),尤其是不能在ConfigureServices中获取诸如缓存等数据进行初始化,应该在Configure中进行 - /// 服务都还没初始化完成,会导致内存中存在多份 IOC 容器!! - /// 正确应该在 Configure 中,这个时候服务(IServiceCollection 已经完成 BuildServiceProvider() 操作了 - /// - /// - /// - public void Load(IServiceCollection services, ComponentContext componentContext) - { - Console.WriteLine("注册SignalR插件"); - services.AddSignalR();//注册SignalR - services.AddSingleton();//用户ID提供器 - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SimpleAdmin.Plugin.SignalR.csproj b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SimpleAdmin.Plugin.SignalR.csproj deleted file mode 100644 index 305f8c2fab0ee73c7410df885147c9a1eff9902d..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SimpleAdmin.Plugin.SignalR.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - - net7.0;net6.0 - 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 - SimpleAdmin.Plugin.SignalR.xml - enable - enable - - - - - - - - diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SimpleAdmin.Plugin.SignalR.xml b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SimpleAdmin.Plugin.SignalR.xml deleted file mode 100644 index 6357d3a5be40ac0a32e45b6b4e08415b99f47c58..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SimpleAdmin.Plugin.SignalR.xml +++ /dev/null @@ -1,99 +0,0 @@ - - - - SimpleAdmin.Plugin.SignalR - - - - - 即时通讯集线器 - - - - - 退出登录 - - - - - - - 新消息 - - - - - - - - - - - - 连接 - - - - - - 断开连接 - - - - - - - 退出登录 - - - - - - - 更新redis - - 用户id - token - 是否是上线 - - - - 用户ID提供器 - - - - - - - - - - - - - - - - - - - 获取hubContext - - - - - - SignalR组件 - - - - - ConfigureServices中不能解析服务,比如App.GetService(),尤其是不能在ConfigureServices中获取诸如缓存等数据进行初始化,应该在Configure中进行 - 服务都还没初始化完成,会导致内存中存在多份 IOC 容器!! - 正确应该在 Configure 中,这个时候服务(IServiceCollection 已经完成 BuildServiceProvider() 操作了 - - - - - - diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/CommonStatusConst.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/CommonStatusConst.cs new file mode 100644 index 0000000000000000000000000000000000000000..b8aa3764e8c943d4623ca309a7c02d2d73d5423a --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/CommonStatusConst.cs @@ -0,0 +1,27 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; + +/// +/// 通用状态常量 +/// +public class CommonStatusConst +{ + /// + /// 启用 + /// + public const string ENABLE = "ENABLE"; + + /// + /// 停用 + /// + public const string DISABLED = "DISABLED"; +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/DevDictConst.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/DevDictConst.cs deleted file mode 100644 index f024785c3b5ea3eb25d1a362f1daa3d5b44ebb36..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/DevDictConst.cs +++ /dev/null @@ -1,75 +0,0 @@ -namespace SimpleAdmin.SqlSugar; - -/// -/// 字典常量 -/// -public class DevDictConst -{ - #region 系统字典 - - /// - /// 性别 - /// - public const string GENDER = "GENDER"; - - /// - /// 名族 - /// - public const string NATION = "NATION"; - - /// - /// 用户证件类型 - /// - public const string IDCARD_TYPE = "IDCARD_TYPE"; - - /// - /// 通用文化程度 - /// - public const string CULTURE_LEVEL = "CULTURE_LEVEL"; - - - - #region 系统通用状态 - - /// - /// 启用 - /// - public const string COMMON_STATUS_ENABLE = "ENABLE"; - - /// - /// 停用 - /// - public const string COMMON_STATUS_DISABLED = "DISABLED"; - - #endregion 系统通用状态 - - #region 在线用户状态 - - /// - /// 在线 - /// - public const string ONLINE_STATUS_ONLINE = "ONLINE"; - - /// - /// 离线 - /// - public const string ONLINE_STATUS_OFFLINE = "OFFLINE"; - - #endregion 在线用户状态 - - #region 上传文件引擎 - - /// - /// 本地 - /// - public const string FILE_ENGINE_LOCAL = "LOCAL"; - - /// - /// MINIO - /// - public const string FILE_ENGINE_MINIO = "MINIO"; - - #endregion 上传文件引擎 - - #endregion 系统字典 -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/DevLogConst.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/DevLogConst.cs deleted file mode 100644 index 7fde88f0a776c99860e55c4583a912d73f658fe4..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/DevLogConst.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace SimpleAdmin.SqlSugar; - -/// -/// 日志常量 -/// -public class DevLogConst -{ - /// - /// 成功 - /// - public const string SUCCESS = "SUCCESS"; - - /// - /// 成功 - /// - public const string FAIL = "FAIL"; -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/EffTypeConst.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/EffTypeConst.cs index 39a4d855cce3314273721a36fe8eec0e6f064f5a..a886470749b205f0470c0c20efe8266d9b4ac3cb 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/EffTypeConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/EffTypeConst.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.SqlSugar; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// /// 前端控件作用类型常量 @@ -43,7 +53,7 @@ public class EffTypeConst /// /// 数字输入框 /// - public const string INPUTNUMBER = "inputNumber"; + public const string INPUT_NUMBER = "inputNumber"; /// /// 滑动数字条 @@ -54,4 +64,4 @@ public class EffTypeConst /// 下拉框 /// public const string SWITCH = "switch"; -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/RoleConst.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/RoleConst.cs deleted file mode 100644 index 6f0337b528a277197e38ba6f699cf7f890353e2d..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/RoleConst.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace SimpleAdmin.SqlSugar; - -/// -/// 角色常量 -/// -public class RoleConst -{ - /// - /// 超级管理员 - /// - public const string SuperAdmin = "superAdmin"; - - /// - /// 业务管理员 - /// - public const string BizAdmin = "bizAdmin"; -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SqlsugarConst.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SqlsugarConst.cs index 894dd0af7dd347e3404fdfb0a21fb75cad2e1238..373ffc2c6189966e0d2eb24094c81c5c1f010cdc 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SqlsugarConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SqlsugarConst.cs @@ -1,36 +1,56 @@ -namespace SimpleAdmin.SqlSugar; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// -/// Sqlsugar系统常量类 +/// SqlSugar系统常量类 /// -public class SqlsugarConst +public class SqlSugarConst { /// /// 默认库ConfigId /// - public const string DB_Default = "SimpleAdmin"; + public const string DB_DEFAULT = "SimpleAdmin"; /// /// 默认表主键 /// - public const string DB_PrimaryKey = "Id"; + public const string DB_PRIMARY_KEY = "Id"; #region 数据库字段类型 /// /// varchar(max) /// - public const string NVarCharMax = "nvarchar(max)"; + public const string N_VAR_CHAR_MAX = "nvarchar(max)"; + + /// + /// varchar(4000) + /// + public const string N_VAR_CHAR_4000 = "nvarchar(4000)"; + + /// + /// varchar(20) + /// + public const string N_VAR_CHAR_20 = "nvarchar(20)"; /// /// mysql的longtext /// - public const string LongText = "longtext"; + public const string LONG_TEXT = "longtext"; /// /// sqlite的text /// - public const string Text = "text"; + public const string TEXT = "text"; #endregion 数据库字段类型 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbContext.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbContext.cs index be5da9d75bcf01bf4455032277770850ff0f3d9e..b785973875b94f42c4c5ec3c065e1be0f003add5 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbContext.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbContext.cs @@ -1,4 +1,16 @@ -namespace SimpleAdmin.SqlSugar; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using DbType = SqlSugar.DbType; + +namespace SimpleAdmin.SqlSugar; /// /// 数据库上下文对象 @@ -6,23 +18,23 @@ public static class DbContext { /// - /// 读取配置文件中的 ConnectionStrings:Sqlsugar 配置节点 + /// 读取配置文件中的 ConnectionStrings:SqlSugar 配置节点 /// - public static readonly List DbConfigs = App.GetConfig>("SqlSugarSettings:ConnectionStrings"); + public static readonly List DB_CONFIGS = App.GetConfig>("SqlSugarSettings:ConnectionStrings"); /// /// SqlSugar 数据库实例 /// - public static readonly SqlSugarScope Db = new SqlSugarScope(DbConfigs.Adapt>(), db => + public static readonly SqlSugarScope DB = new SqlSugarScope(DB_CONFIGS.Adapt>(), db => { //遍历配置的数据库 - DbConfigs.ForEach(it => + DB_CONFIGS.ForEach(it => { - var sqlsugarScope = db.GetConnectionScope(it.ConfigId);//获取当前库 - MoreSetting(sqlsugarScope);//更多设置 - ExternalServicesSetting(sqlsugarScope, it);//实体拓展配置 - AopSetting(sqlsugarScope);//aop配置 - FilterSetting(sqlsugarScope);//过滤器配置 + var sqlSugarScope = db.GetConnectionScope(it.ConfigId);//获取当前库 + MoreSetting(sqlSugarScope, it.DbType);//更多设置 + ExternalServicesSetting(sqlSugarScope, it);//实体拓展配置 + AopSetting(sqlSugarScope);//aop配置 + FilterSetting(sqlSugarScope);//过滤器配置 }); }); @@ -45,18 +57,18 @@ public static class DbContext EntityService = (c, p) => { //如果是mysql并且是varchar(max) 已弃用 - //if (config.DbType == SqlSugar.DbType.MySql && (p.DataType == SqlsugarConst.NVarCharMax)) + //if (config.DbType == SqlSugar.DbType.MySql && (p.DataType == SqlSugarConst.NVarCharMax)) //{ - // p.DataType = SqlsugarConst.LongText;//转成mysql的longtext + // p.DataType = SqlSugarConst.LongText;//转成mysql的longtext //} - //else if (config.DbType == SqlSugar.DbType.Sqlite && (p.DataType == SqlsugarConst.NVarCharMax)) + //else if (config.DbType == SqlSugar.DbType.Sqlite && (p.DataType == SqlSugarConst.NVarCharMax)) //{ - // p.DataType = SqlsugarConst.Text;//转成sqlite的text + // p.DataType = SqlSugarConst.Text;//转成sqlite的text //} //默认不写IsNullable为非必填 //if (new NullabilityInfoContext().Create(c).WriteState is NullabilityState.Nullable) // p.IsNullable = true; - if (config.IsUnderLine && !p.IsIgnore && !p.DbColumnName.Contains('_')) + if (config.IsUnderLine && !p.IsIgnore && !p.DbColumnName.Contains('_') && p.DbColumnName != "ColumnName") p.DbColumnName = UtilMethods.ToUnderLine(p.DbColumnName);// 驼峰转下划线 } }; @@ -101,7 +113,7 @@ public static class DbContext } }; //异常 - db.Aop.OnError = (ex) => + db.Aop.OnError = ex => { //如果不是开发环境就打印日志 if (App.WebHostEnvironment.IsDevelopment()) @@ -134,11 +146,11 @@ public static class DbContext { //创建人和创建机构ID if (entityInfo.PropertyName == nameof(BaseEntity.CreateUserId)) - entityInfo.SetValue(App.User.FindFirst(ClaimConst.UserId)?.Value); + entityInfo.SetValue(App.User.FindFirst(ClaimConst.USER_ID)?.Value); if (entityInfo.PropertyName == nameof(BaseEntity.CreateUser)) - entityInfo.SetValue(App.User?.FindFirst(ClaimConst.Account)?.Value); + entityInfo.SetValue(App.User.FindFirst(ClaimConst.ACCOUNT)?.Value); if (entityInfo.PropertyName == nameof(DataEntityBase.CreateOrgId)) - entityInfo.SetValue(App.User.FindFirst(ClaimConst.OrgId)?.Value); + entityInfo.SetValue(App.User.FindFirst(ClaimConst.ORG_ID)?.Value); } } // 更新操作 @@ -151,9 +163,9 @@ public static class DbContext if (App.User != null) { if (entityInfo.PropertyName == nameof(BaseEntity.UpdateUserId)) - entityInfo.SetValue(App.User?.FindFirst(ClaimConst.UserId)?.Value); + entityInfo.SetValue(App.User?.FindFirst(ClaimConst.USER_ID)?.Value); if (entityInfo.PropertyName == nameof(BaseEntity.UpdateUser)) - entityInfo.SetValue(App.User?.FindFirst(ClaimConst.Account)?.Value); + entityInfo.SetValue(App.User?.FindFirst(ClaimConst.ACCOUNT)?.Value); } } }; @@ -167,12 +179,13 @@ public static class DbContext /// /// 实体更多配置 /// - /// - private static void MoreSetting(SqlSugarScopeProvider db) + /// db + /// 数据库类型 + private static void MoreSetting(SqlSugarScopeProvider db, DbType dbType) { db.CurrentConnectionConfig.MoreSettings = new ConnMoreSettings { - SqlServerCodeFirstNvarchar = true//设置默认nvarchar + SqlServerCodeFirstNvarchar = dbType == DbType.SqlServer//设置默认nvarchar }; } @@ -198,4 +211,4 @@ public static class DbContext { Console.WriteLine($"=============={msg}=============="); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbRepository.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbRepository.cs index d5aa0d540b4fa3b9407d4e13e8a961732262fcbb..6f18a07dbce679ac7b5cb8be6280ea9117d50fd3 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbRepository.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbRepository.cs @@ -1,17 +1,27 @@ -namespace SimpleAdmin.SqlSugar; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// /// 仓储模式对象 /// [SuppressSniffer] -public partial class DbRepository : SimpleClient where T : class, new() +public class DbRepository : SimpleClient where T : class, new() { - protected ITenant itenant = null;//多租户事务、GetConnection、IsAnyConnection等功能 + protected ITenant Tenant;//多租户事务、GetConnection、IsAnyConnection等功能 public DbRepository(ISqlSugarClient context = null) : base(context)//注意这里要有默认值等于null { - Context = DbContext.Db.GetConnectionScopeWithAttr();//ioc注入的对象 - itenant = DbContext.Db; + Context = DbContext.DB.GetConnectionScopeWithAttr();//ioc注入的对象 + Tenant = DbContext.DB; } #region 仓储方法拓展 @@ -28,8 +38,7 @@ public partial class DbRepository : SimpleClient where T : class, new() { if (data.Count > threshold) return await Context.Fastest().BulkCopyAsync(data);//大数据导入 - else - return await Context.Insertable(data).ExecuteCommandAsync();//普通导入 + return await Context.Insertable(data).ExecuteCommandAsync();//普通导入 } #endregion 插入 @@ -90,12 +99,36 @@ public partial class DbRepository : SimpleClient where T : class, new() /// 查询条件 /// 查询字段 /// - public virtual Task GetFirstAsync(Expression> whereExpression, Expression> selectExpression) + protected virtual Task GetFirstAsync(Expression> whereExpression, Expression> selectExpression) { return Context.Queryable().Where(whereExpression).Select(selectExpression).FirstAsync(); } + /// + /// 根据条件查询获取自动分表的单个数据 + /// + /// 条件表达式 + /// 开始时间 + /// 结束时间 + /// 实体 + public virtual Task GetFirstSplitTableAsync(Expression> whereExpression, DateTime startTime, DateTime endTime) + { + return Context.Queryable().Where(whereExpression).SplitTable(startTime, endTime).FirstAsync(); + } + + /// + /// 根据条件查询获取自动分表的单个数据 + /// + /// 条件表达式 + /// 分表查询表达式 + /// 实体 + public virtual Task GetFirstSplitTableAsync(Expression> whereExpression, + Func, IEnumerable> getTableNamesFunc) + { + return Context.Queryable().Where(whereExpression).SplitTable(getTableNamesFunc).FirstAsync(); + } + #endregion 单查 #endregion 仓储方法拓展 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/SqlsugarConfig.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/SqlsugarConfig.cs index 11ad5bd11eb44a741d887554077550f6fd08c7b0..f1cc31cf81e5723a587425276053ed5316c94dfd 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/SqlsugarConfig.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/SqlsugarConfig.cs @@ -1,7 +1,17 @@ -namespace SimpleAdmin.SqlSugar; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// -/// sqlsugar数据库配置 +/// SqlSugar数据库配置 /// public sealed class SqlSugarConfig : ConnectionConfig { @@ -9,4 +19,4 @@ public sealed class SqlSugarConfig : ConnectionConfig /// 是否驼峰转下划线 /// public bool IsUnderLine { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Dto/LinqPagedList.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Dto/LinqPagedList.cs index 2f570566e92cb89017cb07915a1ea312d54d8dcb..2425b3bc6c9afe3b831c0723874f258a4cf5f71c 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Dto/LinqPagedList.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Dto/LinqPagedList.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.SqlSugar; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// /// Linq分页泛型集合 @@ -6,4 +16,4 @@ /// public class LinqPagedList : SqlSugarPagedList { -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Entity/BaseEntity.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Entity/BaseEntity.cs index 90bad6859c0e99f1a4b0398158b948404fd1a9c1..c4b0240df4b5b2b3272a2c212349a3dbb07b04ee 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Entity/BaseEntity.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Entity/BaseEntity.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.SqlSugar; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// /// 主键实体基类 @@ -23,6 +33,10 @@ public abstract class PrimaryKeyEntity /// public class BaseEntity : PrimaryKeyEntity { + [SugarColumn(ColumnName = "Status", ColumnDescription = "状态", Length = 20, DefaultValue = CommonStatusConst.ENABLE, + IsNullable = true)] + public virtual string Status { get; set; } + /// /// 创建时间 /// @@ -63,7 +77,7 @@ public class BaseEntity : PrimaryKeyEntity /// 软删除 /// [SugarColumn(ColumnDescription = "软删除", IsNullable = true)] - public virtual bool IsDelete { get; set; } = false; + public virtual bool IsDelete { get; set; } } /// @@ -74,6 +88,6 @@ public abstract class DataEntityBase : BaseEntity /// /// 创建者部门Id /// - [SugarColumn(ColumnDescription = "创建者部门Id")] + [SugarColumn(ColumnDescription = "创建者部门Id", IsOnlyIgnoreUpdate = true, IsNullable = true)] public virtual long CreateOrgId { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/ISqlSugarEntitySeedData.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/ISqlSugarEntitySeedData.cs index 95fc54a444fd590a14bc5fc7a2b3466113fa7b22..12e090b0e30eb6935ae48e6f29ca50faed0dccc4 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/ISqlSugarEntitySeedData.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/ISqlSugarEntitySeedData.cs @@ -1,15 +1,24 @@ -namespace SimpleAdmin.SqlSugar; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// /// 实体种子数据接口 /// /// -public interface ISqlSugarEntitySeedData - where TEntity : class, new() +public interface ISqlSugarEntitySeedData where TEntity : class, new() { /// /// 种子数据 /// /// IEnumerable SeedData(); -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarPageExtension.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarPageExtension.cs index 134b64c63ac36d1636dbab5af1c444909b07328f..0e00dcc08741da692072d5603f7de3fa1b9d2292 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarPageExtension.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarPageExtension.cs @@ -1,9 +1,17 @@ -using Masuit.Tools.Models; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.SqlSugar; /// -/// Sqlsugar分页拓展类 +/// SqlSugar分页拓展类 /// public static class SqlSugarPageExtension { @@ -12,24 +20,23 @@ public static class SqlSugarPageExtension /// /// /// - /// - /// + /// + /// /// - public static SqlSugarPagedList ToPagedList(this ISugarQueryable queryable, int current, - int size) + public static SqlSugarPagedList ToPagedList(this ISugarQueryable queryable, int pageNum, int pageSize) { var total = 0; - var records = queryable.ToPageList(current, size, ref total); - var pages = (int)Math.Ceiling(total / (double)size); + var list = queryable.ToPageList(pageSize, pageNum, ref total); + var pages = (int)Math.Ceiling(total / (double)pageSize); return new SqlSugarPagedList { - Current = current, - Size = size, - Records = records, + PageNum = pageSize, + PageSize = pageNum, + List = list, Total = total, Pages = pages, - HasNextPages = current < pages, - HasPrevPages = current - 1 > 0 + HasNextPages = pageSize < pages, + HasPrevPages = pageSize - 1 > 0 }; } @@ -38,24 +45,23 @@ public static class SqlSugarPageExtension /// /// /// - /// - /// + /// + /// /// - public static async Task> ToPagedListAsync(this ISugarQueryable queryable, - int current, int size) + public static async Task> ToPagedListAsync(this ISugarQueryable queryable, int pageNum, int pageSize) { RefAsync totalCount = 0; - var records = await queryable.ToPageListAsync(current, size, totalCount); - var totalPages = (int)Math.Ceiling(totalCount / (double)size); + var list = await queryable.ToPageListAsync(pageNum, pageSize, totalCount); + var totalPages = (int)Math.Ceiling(totalCount / (double)pageSize); return new SqlSugarPagedList { - Current = current, - Size = size, - Records = records, + PageNum = pageNum, + PageSize = pageSize, + List = list, Total = (int)totalCount, Pages = totalPages, - HasNextPages = current < totalPages, - HasPrevPages = current - 1 > 0 + HasNextPages = pageNum < totalPages, + HasPrevPages = pageNum - 1 > 0 }; } @@ -65,25 +71,25 @@ public static class SqlSugarPageExtension /// /// /// - /// + /// /// /// /// - public static SqlSugarPagedList ToPagedList(this ISugarQueryable queryable, int pageIndex, - int pageSize, Expression> expression) + public static SqlSugarPagedList ToPagedList(this ISugarQueryable queryable, int pageNum, int pageSize, + Expression> expression) { var totalCount = 0; - var items = queryable.ToPageList(pageIndex, pageSize, ref totalCount, expression); + var items = queryable.ToPageList(pageNum, pageSize, ref totalCount, expression); var totalPages = (int)Math.Ceiling(totalCount / (double)pageSize); return new SqlSugarPagedList { - Current = pageIndex, - Size = pageSize, - Records = items, + PageNum = pageNum, + PageSize = pageSize, + List = items, Total = totalCount, Pages = totalPages, - HasNextPages = pageIndex < totalPages, - HasPrevPages = pageIndex - 1 > 0 + HasNextPages = pageNum < totalPages, + HasPrevPages = pageNum - 1 > 0 }; } @@ -93,25 +99,26 @@ public static class SqlSugarPageExtension /// /// /// - /// + /// /// /// /// - public static async Task> ToPagedListAsync( - this ISugarQueryable queryable, int pageIndex, int pageSize, Expression> expression) + public static async Task> ToPagedListAsync(this ISugarQueryable queryable, int pageNum, + int pageSize, + Expression> expression) { RefAsync totalCount = 0; - var items = await queryable.ToPageListAsync(pageIndex, pageSize, totalCount, expression); + var items = await queryable.ToPageListAsync(pageNum, pageSize, totalCount, expression); var totalPages = (int)Math.Ceiling(totalCount / (double)pageSize); return new SqlSugarPagedList { - Current = pageIndex, - Size = pageSize, - Records = items, + PageNum = pageNum, + PageSize = pageSize, + List = items, Total = (int)totalCount, Pages = totalPages, - HasNextPages = pageIndex < totalPages, - HasPrevPages = pageIndex - 1 > 0 + HasNextPages = pageNum < totalPages, + HasPrevPages = pageNum - 1 > 0 }; } @@ -120,18 +127,18 @@ public static class SqlSugarPageExtension /// /// /// 数据列表 - /// 当前页 + /// 当前页 /// 每页数量 /// 分页集合 - public static LinqPagedList LinqPagedList(this List list, int pageIndex, int pageSize) + public static LinqPagedList LinqPagedList(this List list, int pageNum, int pageSize) { - var result = list.ToPagedList(pageIndex, pageSize);//获取分页 + var result = list.ToPagedList(pageNum, pageSize);//获取分页 //格式化 return new LinqPagedList { - Current = pageIndex, - Size = result.PageSize, - Records = result.Data, + PageNum = pageNum, + PageSize = result.PageSize, + List = result.Data, Total = result.TotalCount, Pages = result.TotalPages, HasNextPages = result.HasNext, @@ -149,12 +156,12 @@ public class SqlSugarPagedList /// /// 页码 /// - public int Current { get; set; } + public int PageNum { get; set; } /// /// 数量 /// - public int Size { get; set; } + public int PageSize { get; set; } /// /// 总条数 @@ -169,7 +176,7 @@ public class SqlSugarPagedList /// /// 当前页集合 /// - public IEnumerable Records { get; set; } + public IEnumerable List { get; set; } /// /// 是否有上一页 @@ -180,4 +187,4 @@ public class SqlSugarPagedList /// 是否有下一页 /// public bool HasNextPages { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarUnitOfWork.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarUnitOfWork.cs index db208af68bbfa66040796244f70a6624488c27ba..d085315edd48b03130b47bc1134a05fe36e1e852 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarUnitOfWork.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarUnitOfWork.cs @@ -1,5 +1,12 @@ -using Furion.DatabaseAccessor; -using Microsoft.AspNetCore.Mvc.Filters; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.SqlSugar; @@ -69,4 +76,4 @@ public sealed class SqlSugarUnitOfWork : IUnitOfWork { _sqlSugarClient.Dispose(); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/GlobalUsing.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/GlobalUsing.cs index 243ed79061e8d213477c30b7e60874f47df72126..97f859ce937bd74c479a0f09ac97472db21e77a9 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/GlobalUsing.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/GlobalUsing.cs @@ -1,6 +1,16 @@ -global using Furion; -global using Furion.DependencyInjection; -global using Furion.FriendlyException; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +global using MoYu; +global using MoYu.DependencyInjection; +global using MoYu.FriendlyException; global using Mapster; global using Masuit.Tools; global using Microsoft.AspNetCore.Builder; @@ -8,12 +18,14 @@ global using Microsoft.AspNetCore.Hosting; global using Microsoft.Extensions.DependencyInjection; global using Microsoft.Extensions.Hosting; global using Microsoft.Extensions.Logging; +global using NewLife.Serialization; global using SimpleAdmin.Core; global using SimpleAdmin.Core.Utils; -global using SimpleAdmin.SqlSugar; global using SimpleTool; global using SqlSugar; global using System.Data; global using System.Linq.Expressions; global using System.Reflection; -global using NewLife.Serialization; \ No newline at end of file +global using Masuit.Tools.Models; +global using MoYu.DatabaseAccessor; +global using Microsoft.AspNetCore.Mvc.Filters; diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.csproj b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.csproj index 708bbb96ee4f71c5c7b08428037704aad2643b19..87c1c0b688d84fadcf3a38664cf8582c0fccd702 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.csproj +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.csproj @@ -1,32 +1,25 @@ - - net7.0;net6.0 - 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 - SimpleAdmin.SqlSugar.xml - enable - enable - - - - - - - - - - PreserveNewest - - - PreserveNewest - - - - - - - - - + + + + + + + + + PreserveNewest + + + PreserveNewest + + + + + + + + + diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml index 6f08d6f82e74a5759fce652195363aa92a0f91ac..c0909fa320c557e54cdc5c339febfad05596c33a 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml @@ -4,406 +4,21 @@ SimpleAdmin.SqlSugar - + - 分类常量 + 通用状态常量 - - - 系统基础 - - - - - 登录策略 - - - - - 密码策略 - - - - - 业务定义 - - - - - 文件-本地 - - - - - 文件-MINIO - - - - - MQTT配置 - - - - - 用户有哪些角色 - - - - - 角色有哪些资源 - - - - - 用户有哪些资源 - - - - - 角色有哪些权限 - - - - - 角色有哪些权限 - - - - - 用户工作台数据 - - - - - 用户日程数据 - - - - - 站内信与接收用户 - - - - - 本人 - - - - - 所有 - - - - - 仅所属组织 - - - - - 所属组织及以下 - - - - - 自定义 - - - - - 模块 - - - - - 菜单 - - - - - 单页 - - - - - 按钮 - - - - - 登录 - - - - - 登出 - - - - - 操作 - - - - - 异常 - - - - - 框架 - - - - - 业务 - - - - - 部门 - - - - - 公司 - - - - - 高层 - - - - - 中层 - - - - - 基层 - - - - - 全局 - - - - - 机构 - - - - - 通知 - - - - - 公告 - - - - - 系统配置常量 - - - - - 系统默认工作台 - - - - - 登录验证码开关 - - - - - 登录验证码开关 - - - - - 单用户登录开关 - - - - - 登录错误锁定时长 - - - - - 登录错误锁定时长 - - - - - 登录错误次数 - - - - - 默认用户密码 - - - - - 密码定期提醒更新 - - - - - 密码定期提醒更新时间 - - - - - 修改初始密码提醒 - - - - - 密码最小长度 - - - - - 包含数字 - - - - - 包含小写字母 - - - - - 包含大写字母 - - - - - 包含特殊字符 - - - - - mqtt连接地址 - - - - - mqtt连接用户名 - - - - - mqtt连接密码 - - - - - windows系统本地目录 - - - - - Unix系统本地目录 - - - - - MINIO文件AccessKey - - - - - MINIO文件SecetKey - - - - - MINIO文件EndPoint - - - - - MINIO文件默认存储桶 - - - - - 字典常量 - - - - - 性别 - - - - - 名族 - - - - - 用户证件类型 - - - - - 通用文化程度 - - - + 启用 - + 停用 - - - 在线 - - - - - 离线 - - - - - 本地 - - - - - MINIO - - - - - 日志常量 - - - - - 成功 - - - - - 成功 - - 前端控件作用类型常量 @@ -444,7 +59,7 @@ 时间选择器 - + 数字输入框 @@ -459,77 +74,42 @@ 下拉框 - - - 资源表常量 - - - + - 目录 + SqlSugar系统常量类 - + - 组件 - - - - - 内链 - - - - - 外链 - - - - - 系统内置单页面编码 - - - - - 角色常量 - - - - - 超级管理员 - - - - - 业务管理员 + 默认库ConfigId - + - Sqlsugar系统常量类 + 默认表主键 - + - 默认库ConfigId + varchar(max) - + - 默认表主键 + varchar(4000) - + - varchar(max) + varchar(20) - + mysql的longtext - + sqlite的text @@ -539,12 +119,12 @@ 数据库上下文对象 - + - 读取配置文件中的 ConnectionStrings:Sqlsugar 配置节点 + 读取配置文件中的 ConnectionStrings:SqlSugar 配置节点 - + SqlSugar 数据库实例 @@ -562,11 +142,12 @@ - + 实体更多配置 - + db + 数据库类型 @@ -633,9 +214,26 @@ 查询字段 + + + 根据条件查询获取自动分表的单个数据 + + 条件表达式 + 开始时间 + 结束时间 + 实体 + + + + 根据条件查询获取自动分表的单个数据 + + 条件表达式 + 分表查询表达式 + 实体 + - sqlsugar数据库配置 + SqlSugar数据库配置 @@ -728,7 +326,7 @@ - Sqlsugar分页拓展类 + SqlSugar分页拓展类 @@ -737,8 +335,8 @@ - - + + @@ -747,8 +345,8 @@ - - + + @@ -758,7 +356,7 @@ - + @@ -770,7 +368,7 @@ - + @@ -781,7 +379,7 @@ 数据列表 - 当前页 + 当前页 每页数量 分页集合 @@ -791,12 +389,12 @@ - + 页码 - + 数量 @@ -811,7 +409,7 @@ 总页数 - + 当前页集合 @@ -843,7 +441,7 @@ - + 开启工作单元处理 @@ -851,7 +449,7 @@ - + 提交工作单元处理 @@ -859,7 +457,7 @@ - + 回滚工作单元处理 @@ -941,34 +539,34 @@ - + - Sqlsugar字段信息 + SqlSugar字段信息 - + 字段名称 - + 是否主键 - + 字段类型 - + 字段注释 - Sqlsugar表信息 + SqlSugar表信息 @@ -1014,7 +612,7 @@ - Sqlusgar通用功能 + SqlSugar通用功能 diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SqlSugar.Development.json b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SqlSugar.Development.json index dc22f7f0bae609ae1b1b3a881a961c72befa2dc8..7a54e5ddee6cdfedeb1b34b7e7a8b7743a7882ca 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SqlSugar.Development.json +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SqlSugar.Development.json @@ -1,7 +1,7 @@ { - //sqlsugar设置 + //sqlSugar设置 "SqlSugarSettings": { - //Sqlsugar连接字符串配置 + //SqlSugar连接字符串配置 "ConnectionStrings": [ { "ConfigId": "SimpleAdmin", //租户ID @@ -20,7 +20,7 @@ // { // "ConfigId": "SimpleAdmin", //租户ID // "ConnectionString": "Server=192.168.1.16;Database=SimpleAdmin;User=sa;Password=123456;MultipleActiveResultSets=True;", //连接字符串 - // "DbType": "SqlServer", //数据库类型 + // "DbType": "SqlServer", //数据库类型 // "IsAutoCloseConnection": true, //是否自动释放 // "IsUnderLine": false //是否驼峰转下划线 // } diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SqlSugar.Production.json b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SqlSugar.Production.json index 41f46d9f88b73b0f68aeb8251133ef9a57b8b0b5..6943b6afe106fd1b11b509b4fb31061fd46d80af 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SqlSugar.Production.json +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SqlSugar.Production.json @@ -1,7 +1,7 @@ { //sqlsugar设置 "SqlSugarSettings": { - //Sqlsugar连接字符串配置 + //SqlSugar连接字符串配置 "ConnectionStrings": [ { "ConfigId": "SimpleAdmin", //租户ID diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Startup.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Startup.cs index 4f5156ac708a723797268cbdbf4b70e263407cdf..8104ceee25353013c5f8f76840655065f721e2ef 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Startup.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Startup.cs @@ -1,4 +1,12 @@ -using System.Collections; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.SqlSugar; @@ -23,9 +31,9 @@ public class Startup : AppStartup public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { //遍历配置 - DbContext.DbConfigs.ForEach(it => + DbContext.DB_CONFIGS.ForEach(it => { - var connection = DbContext.Db.GetConnection(it.ConfigId);//获取数据库连接对象 + var connection = DbContext.DB.GetConnection(it.ConfigId);//获取数据库连接对象 connection.DbMaintenance.CreateDatabase();//创建数据库,如果存在则不创建 }); } @@ -36,10 +44,10 @@ public class Startup : AppStartup /// private static void CheckSameConfigId() { - var configIdGroup = DbContext.DbConfigs.GroupBy(it => it.ConfigId).ToList(); + var configIdGroup = DbContext.DB_CONFIGS.GroupBy(it => it.ConfigId).ToList(); foreach (var configId in configIdGroup) { - if (configId.ToList().Count > 1) throw Oops.Oh($"Sqlsugar连接配置ConfigId:{configId.Key}重复了"); + if (configId.ToList().Count > 1) throw Oops.Oh($"SqlSugar连接配置ConfigId:{configId.Key}重复了"); } } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/CodeFirstUtils.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/CodeFirstUtils.cs index 20e6c83a586fd6cd718113207d09ec4e5fc8ef69..148895b538402a6be52f77730505f7d1fe7e37fd 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/CodeFirstUtils.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/CodeFirstUtils.cs @@ -1,4 +1,13 @@ -using NewLife.Serialization; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + using System.Collections; namespace SimpleAdmin.SqlSugar; @@ -16,17 +25,19 @@ public static class CodeFirstUtils /// 程序集名称 public static void CodeFirst(BaseOptions options, string assemblyName) { + var appName = assemblyName.Split(",")[0]; if (options.InitTable)//如果需要初始化表结构 { + Console.WriteLine($"开始初始化{appName}数据库表结构"); InitTable(assemblyName); } if (options.InitSeedData) { + Console.WriteLine($"开始初始化{appName}数据库种子数据"); InitSeedData(assemblyName); } } - /// /// 初始化数据库表结构 /// @@ -34,15 +45,16 @@ public static class CodeFirstUtils private static void InitTable(string assemblyName) { // 获取所有实体表-初始化表结构 - var entityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.IsDefined(typeof(SugarTable), false) && u.Assembly.FullName == assemblyName); + var entityTypes = App.EffectiveTypes.Where(u => + !u.IsInterface && !u.IsAbstract && u.IsClass && u.IsDefined(typeof(SugarTable), false) && u.Assembly.FullName == assemblyName); if (!entityTypes.Any()) return;//没有就退出 foreach (var entityType in entityTypes) { - var tenantAtt = entityType.GetCustomAttribute();//获取Sqlsugar多租户特性 + var tenantAtt = entityType.GetCustomAttribute();//获取SqlSugar多租户特性 var ignoreInit = entityType.GetCustomAttribute();//获取忽略初始化特性 if (ignoreInit != null) continue;//如果有忽略初始化特性 if (tenantAtt == null) continue;//如果没有租户特性就下一个 - var db = DbContext.Db.GetConnectionScope(tenantAtt.configId.ToString());//获取数据库对象 + var db = DbContext.DB.GetConnectionScope(tenantAtt.configId.ToString());//获取数据库对象 var splitTable = entityType.GetCustomAttribute();//获取自动分表特性 if (splitTable == null)//如果特性是空 db.CodeFirst.InitTables(entityType);//普通创建 @@ -51,8 +63,6 @@ public static class CodeFirstUtils } } - - /// /// 初始化种子数据 /// @@ -73,10 +83,10 @@ public static class CodeFirstUtils var seedData = ((IEnumerable)hasDataMethod?.Invoke(instance, null))?.Cast(); if (seedData == null) continue;//没有种子数据就下一个 var entityType = seedType.GetInterfaces().First().GetGenericArguments().First();//获取实体类型 - var tenantAtt = entityType.GetCustomAttribute();//获取sqlsugar租户特性 + var tenantAtt = entityType.GetCustomAttribute();//获取SqlSugar租户特性 if (tenantAtt == null) continue;//如果没有租户特性就下一个 - var db = DbContext.Db.GetConnectionScope(tenantAtt.configId.ToString());//获取数据库对象 - var config = DbContext.DbConfigs.FirstOrDefault(u => u.ConfigId == tenantAtt.configId.ToString());//获取数据库配置 + var db = DbContext.DB.GetConnectionScope(tenantAtt.configId.ToString());//获取数据库对象 + var config = DbContext.DB_CONFIGS.FirstOrDefault(u => u.ConfigId == tenantAtt.configId.ToString());//获取数据库配置 // var seedDataTable = seedData.ToList().ToDataTable();//获取种子数据:已弃用 var entityInfo = db.EntityMaintenance.GetEntityInfo(entityType); // seedDataTable.TableName = db.EntityMaintenance.GetEntityInfo(entityType).DbTableName;//获取表名 @@ -99,9 +109,6 @@ public static class CodeFirstUtils } } - - - /// /// 判断类型是否实现某个泛型 /// @@ -166,7 +173,7 @@ public static class CodeFirstUtils obj = obj?.ToJson();//如果json字符串是空就传null tempList.Add(obj); } - object[] array = tempList.ToArray(); + var array = tempList.ToArray(); result.LoadDataRow(array, true); } } @@ -180,14 +187,13 @@ public static class CodeFirstUtils /// private static bool IsIgnoreColumn(PropertyInfo pi) { - var sc = pi.GetCustomAttributes(false).FirstOrDefault(u => u.IsIgnore == true); + var sc = pi.GetCustomAttributes(false).FirstOrDefault(u => u.IsIgnore); return sc != null; } - private static bool IsJsonColumn(PropertyInfo pi) { - var sc = pi.GetCustomAttributes(false).FirstOrDefault(u => u.IsJson == true); + var sc = pi.GetCustomAttributes(false).FirstOrDefault(u => u.IsJson); return sc != null; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlSugarTableInfo.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlSugarTableInfo.cs index 5f5f7cda0f169723bc1e8392acc8e482787d27b5..12ec97af39f8b939751ec3ca900277e2f4da8ccf 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlSugarTableInfo.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlSugarTableInfo.cs @@ -1,7 +1,17 @@ -namespace SimpleAdmin.SqlSugar; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// -/// Sqlsugar表信息 +/// SqlSugar表信息 /// public class SqlSugarTableInfo { @@ -28,5 +38,5 @@ public class SqlSugarTableInfo /// /// 表字段 /// - public List Columns { get; set; } -} \ No newline at end of file + public List Columns { get; set; } +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlsugarColumnInfo.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlsugarColumnInfo.cs index b9b4f0a96619430c8a3355499f0063e8c888772b..ed4ab963709bd60a060224b6e982be574b3e0fd5 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlsugarColumnInfo.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlsugarColumnInfo.cs @@ -1,9 +1,19 @@ -namespace SimpleAdmin.SqlSugar; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// -/// Sqlsugar字段信息 +/// SqlSugar字段信息 /// -public class SqlsugarColumnInfo +public class SqlSugarColumnInfo { /// /// 字段名称 @@ -13,7 +23,7 @@ public class SqlsugarColumnInfo /// /// 是否主键 /// - public bool IsPrimarykey { get; set; } + public bool IsPrimaryKey { get; set; } /// /// 字段类型 @@ -24,4 +34,4 @@ public class SqlsugarColumnInfo /// 字段注释 /// public string ColumnDescription { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SeedDataUtil.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SeedDataUtil.cs index ad12ac528c030e1c5535c2acf0c7cc035ba3386a..7244ed88f3876333ed37ccd13563389fdd4b0173 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SeedDataUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SeedDataUtil.cs @@ -1,4 +1,16 @@ -namespace SimpleAdmin.SqlSugar; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using System.Text.RegularExpressions; + +namespace SimpleAdmin.SqlSugar; /// /// 种子数据工具类 @@ -15,9 +27,55 @@ public class SeedDataUtil { //字段没有数据的替换成null dataString = dataString.Replace("\"\"", "null"); - //将json字符串转为实体,这里extjson可以正常转换为字符串 + + #region 针对导出的json字符串嵌套json字符串如 "DefaultDataScope": "{\"Level\":5,\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[]}" + + //正则匹配"ConfigValue": "[{开头的字符串以]"结尾 + var matcheDefaultDataScope = Regex.Matches(dataString, "\"DefaultDataScope\": \"\\{.*?\\}\""); + foreach (Match match in matcheDefaultDataScope) + { + //获取匹配的值 + var value = match.Value; + //将匹配的值替换成"ConfigValue": "{XXX}" + //字符串是\"的替换成" + var newValue = value.Replace("\\\"", "\""); + //字符串是\{替换成{ + newValue = newValue.Replace("\"{", "{"); + //字符串是}"的替换成} + newValue = newValue.Replace("}\"", "}"); + dataString = dataString.Replace(value, newValue); + } + + #endregion 针对导出的json字符串嵌套json字符串如 "DefaultDataScope": "{\"Level\":5,\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[]}" + + #region Sys_Org + + //如果T是Sys_Org + var nameofT = typeof(T).Name;//获取类型名称 + if (nameofT == "SysOrg") + { + //字段是"[的替换成[ + dataString = dataString.Replace("\"[", "["); + //字段是]"的替换成] + dataString = dataString.Replace("]\"", "]"); + } + + #endregion + + //将json字符串转为实体,这里ExtJson可以正常转换为字符串 var seedDataRecord1 = dataString.ToJsonEntity>(); + + //正则匹配"ConfigValue": "[{开头的字符串以]"结尾 + var matches = Regex.Matches(dataString, "\"ConfigValue\": \"\\[\\{.*?\\}\\]\""); + foreach (Match match in matches) + { + //获取匹配的值 + var value = match.Value; + //将匹配的值替换成"ConfigValue": "null" + dataString = dataString.Replace(value, "\"ConfigValue\": \"null\""); + } + #region 针对导出的json字符串嵌套json字符串如 "DefaultDataScope": "{\"Level\":5,\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[]}" //字符串是\"的替换成" @@ -26,29 +84,30 @@ public class SeedDataUtil dataString = dataString.Replace("\"{", "{"); //字符串是}"的替换成} dataString = dataString.Replace("}\"", "}"); - //将json字符串转为实体,这里extjson会转为null,替换字符串把extjson值变为实体类型而实体类是string类型 + //将json字符串转为实体,这里ExtJson会转为null,替换字符串把ExtJson值变为实体类型而实体类是string类型 var seedDataRecord2 = dataString.ToJsonEntity>(); #endregion 针对导出的json字符串嵌套json字符串如 "DefaultDataScope": "{\"Level\":5,\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[]}" + //遍历seedDataRecord2 for (var i = 0; i < seedDataRecord2.Records.Count; i++) { #region 处理ExtJosn - //获取extjson属性 - var propertyExtJosn = typeof(T).GetProperty(nameof(PrimaryKeyEntity.ExtJson)); - if (propertyExtJosn != null) + //获取ExtJson属性 + var propertyExtJson = typeof(T).GetProperty(nameof(PrimaryKeyEntity.ExtJson)); + if (propertyExtJson != null) { - //获取extjson的值 - var extJson = propertyExtJosn.GetValue(seedDataRecord2.Records[i])?.ToString(); - // 如果extjson不为空并且包含NullableDictionary表示序列化失败了 + //获取ExtJson的值 + var extJson = propertyExtJson.GetValue(seedDataRecord2.Records[i])?.ToString(); + // 如果ExtJson不为空并且包含NullableDictionary表示序列化失败了 if (!string.IsNullOrEmpty(extJson) && extJson.Contains("NullableDictionary")) { - //设置extjson为seedDataRecord1对应的值 - extJson = propertyExtJosn.GetValue(seedDataRecord1.Records[i])?.ToString(); - //seedDataRecord2赋值seedDataRecord1的extjson - propertyExtJosn.SetValue(seedDataRecord2.Records[i], extJson); + //设置ExtJson为seedDataRecord1对应的值 + extJson = propertyExtJson.GetValue(seedDataRecord1.Records[i])?.ToString(); + //seedDataRecord2赋值seedDataRecord1的ExtJson + propertyExtJson.SetValue(seedDataRecord2.Records[i], extJson); } } @@ -56,18 +115,18 @@ public class SeedDataUtil #region 处理ConfigValue - //获取extjson属性 + //获取ExtJson属性 var propertyConfigValue = typeof(T).GetProperty("ConfigValue"); if (propertyConfigValue != null) { - //获取extjson的值 + //获取configValue的值 var configValue = propertyConfigValue.GetValue(seedDataRecord2.Records[i])?.ToString(); - // 如果extjson不为空并且包含NullableDictionary表示序列化失败了 - if (!string.IsNullOrEmpty(configValue) && configValue.Contains("NullableDictionary")) + // 如果configValue不为空并且包含NullableDictionary表示序列化失败了 + if (!string.IsNullOrEmpty(configValue) && (configValue.Contains("NullableDictionary") || configValue == "null")) { - //设置extjson为seedDataRecord1对应的值 + //设置ExtJson为seedDataRecord1对应的值 configValue = propertyConfigValue.GetValue(seedDataRecord1.Records[i])?.ToString(); - //seedDataRecord2赋值seedDataRecord1的extjson + //seedDataRecord2赋值seedDataRecord1的ExtJson propertyConfigValue.SetValue(seedDataRecord2.Records[i], configValue); } } @@ -92,4 +151,4 @@ public class SeedDataRecords /// 数据 /// public List Records { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SqlSugarUtils.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SqlSugarUtils.cs index b9dcdb2df854c599df9df096ca62ad185e1faee3..f67c691ec345d06d48df30e51e5c9de692141dbb 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SqlSugarUtils.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SqlSugarUtils.cs @@ -1,7 +1,17 @@ -namespace SimpleAdmin.SqlSugar; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// -/// Sqlusgar通用功能 +/// SqlSugar通用功能 /// public static class SqlSugarUtils { @@ -12,7 +22,7 @@ public static class SqlSugarUtils /// public static List GetTablesByAttribute() { - List tables = new List();//结果集 + var tables = new List();//结果集 // 获取实体表 var entityTypes = App.EffectiveTypes @@ -21,24 +31,21 @@ public static class SqlSugarUtils foreach (var entityType in entityTypes) { - var teanant = entityType.GetCustomAttribute();//获取多租户特性 - var configId = teanant.configId.ToString();//获取租户Id - if (teanant != null) + var tenantAttr = entityType.GetCustomAttribute();//获取多租户特性 + var configId = tenantAttr.configId.ToString();//获取租户Id + var connection = DbContext.DB.GetConnection(tenantAttr.configId.ToString());//根据租户ID获取连接信息 + var entityInfo = connection.EntityMaintenance.GetEntityInfo(entityType);//获取实体信息 + if (entityInfo != null) { - var connection = DbContext.Db.GetConnection(teanant.configId.ToString());//根据租户ID获取连接信息 - var entityInfo = connection.EntityMaintenance.GetEntityInfo(entityType);//获取实体信息 - if (entityInfo != null) + var columns = GetTableColumns(configId, entityInfo.DbTableName);//获取字段信息 + tables.Add(new SqlSugarTableInfo { - var columns = GetTableColumns(configId, entityInfo.DbTableName);//获取字段信息 - tables.Add(new SqlSugarTableInfo - { - TableName = entityInfo.DbTableName, - EntityName = entityInfo.EntityName, - TableDescription = entityInfo.TableDescription, - ConfigId = configId, - Columns = columns - }); - } + TableName = entityInfo.DbTableName, + EntityName = entityInfo.EntityName, + TableDescription = entityInfo.TableDescription, + ConfigId = configId, + Columns = columns + }); } } return tables; @@ -50,10 +57,10 @@ public static class SqlSugarUtils /// /// /// - public static List GetTableColumns(string configId, string tableName) + public static List GetTableColumns(string configId, string tableName) { - var columns = new List();//结果集 - var connection = DbContext.Db.GetConnection(configId); + var columns = new List();//结果集 + var connection = DbContext.DB.GetConnection(configId); var dbColumnInfos = connection.DbMaintenance.GetColumnInfosByTableName(tableName);//根据表名获取表信息 if (dbColumnInfos != null) { @@ -74,10 +81,10 @@ public static class SqlSugarUtils { it.DbColumnName = StringHelper.FirstCharToUpper(it.DbColumnName);//首字母大写 } - columns.Add(new SqlsugarColumnInfo + columns.Add(new SqlSugarColumnInfo { ColumnName = it.DbColumnName, - IsPrimarykey = it.IsPrimarykey, + IsPrimaryKey = it.IsPrimarykey, ColumnDescription = it.ColumnDescription, DataType = it.DataType }); @@ -167,7 +174,7 @@ public static class SqlSugarUtils return dataType switch { "string" => EffTypeConst.INPUT, - "int" => EffTypeConst.INPUTNUMBER, + "int" => EffTypeConst.INPUT_NUMBER, "long" => EffTypeConst.INPUT, "float" => EffTypeConst.INPUT, "double" => EffTypeConst.INPUT, @@ -186,7 +193,7 @@ public static class SqlSugarUtils /// public static bool IsCommonColumn(string columnName) { - var columnList = new List() + var columnList = new List { nameof(BaseEntity.CreateTime), nameof(BaseEntity.UpdateTime), nameof(BaseEntity.CreateUserId), nameof(BaseEntity.CreateUser), @@ -196,4 +203,4 @@ public static class SqlSugarUtils }; return columnList.Contains(columnName); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Attributes/AntTableAttribute.cs b/api/SimpleAdmin/SimpleAdmin.System/Attributes/AntTableAttribute.cs index 60ec6e0b069259ffc48fb972e018e937b17f5e09..4bfc2a86e1320af2a459343216e2b96bae0b5c38 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Attributes/AntTableAttribute.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Attributes/AntTableAttribute.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 前端表格特性 @@ -8,7 +18,7 @@ public class AntTableAttribute : Attribute /// /// 是否是日期格式 /// - public bool IsDate { get; set; } = false; + public bool IsDate { get; set; } /// /// 是否自动省略 @@ -19,4 +29,4 @@ public class AntTableAttribute : Attribute /// 宽度 /// public int Width { get; set; } = 100; -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Attributes/BatchEditAttribute.cs b/api/SimpleAdmin/SimpleAdmin.System/Attributes/BatchEditAttribute.cs new file mode 100644 index 0000000000000000000000000000000000000000..be55b152966f5b57c43cd435feac64e3b6f4c7bb --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.System/Attributes/BatchEditAttribute.cs @@ -0,0 +1,18 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; + +/// +/// 批量更新 +/// +public class BatchEditAttribute : Attribute +{ +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Attributes/InDictAttribute.cs b/api/SimpleAdmin/SimpleAdmin.System/Attributes/InDictAttribute.cs index 75e9a1abf367e5bda0d6298feb8ea17590ef49a9..beb5ae9ace6e886789ed849548e4ef1d2ad5c836 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Attributes/InDictAttribute.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Attributes/InDictAttribute.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 验证值是否在字典中,大数据慎用 @@ -26,30 +36,30 @@ public class InDictAttribute : ValidationAttribute { switch (DictValue) { - case DevDictConst.GENDER: + case SysDictConst.GENDER: return "性别只能是男和女"; - case DevDictConst.NATION: + case SysDictConst.NATION: return "不存在的民族"; default: return $"字典中不存在{value}"; } } - else return ErrorMessage; + return ErrorMessage; } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { if (value != null) { - var dictSerivce = App.GetService(); - var values = dictSerivce.GetValuesByDictValue(DictValue).Result; + var dictService = App.GetService(); + var values = dictService.GetValuesByDictValue(DictValue).Result; if (!values.Contains(value)) { - return new ValidationResult(GetErrorMessage(value.ToString()), new string[] { validationContext.MemberName }); + return new ValidationResult(GetErrorMessage(value.ToString()), new[] { validationContext.MemberName }); } } return ValidationResult.Success; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/CateGoryConst.cs b/api/SimpleAdmin/SimpleAdmin.System/Const/CateGoryConst.cs similarity index 52% rename from api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/CateGoryConst.cs rename to api/SimpleAdmin/SimpleAdmin.System/Const/CateGoryConst.cs index 43cc43a0d0909f57ceb78e2cfb95ac47ef2ecaf8..4d24d65c8484552a3748a272446c53cae8f3cc61 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/CateGoryConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Const/CateGoryConst.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.SqlSugar; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 分类常量 @@ -10,32 +20,32 @@ public class CateGoryConst /// /// 系统基础 /// - public const string Config_SYS_BASE = "SYS_BASE"; + public const string CONFIG_SYS_BASE = "SYS_BASE"; /// /// 登录策略 /// - public const string Config_LOGIN_POLICY = "LOGIN_POLICY"; + public const string CONFIG_LOGIN_POLICY = "LOGIN_POLICY"; /// /// 密码策略 /// - public const string Config_PWD_POLICY = "PWD_POLICY"; + public const string CONFIG_PWD_POLICY = "PWD_POLICY"; /// /// 业务定义 /// - public const string Config_BIZ_DEFINE = "BIZ_DEFINE"; + public const string CONFIG_BIZ_DEFINE = "BIZ_DEFINE"; /// /// 文件-本地 /// - public const string Config_FILE_LOCAL = "FILE_LOCAL"; + public const string CONFIG_FILE_LOCAL = "FILE_LOCAL"; /// /// 文件-MINIO /// - public const string Config_FILE_MINIO = "FILE_MINIO"; + public const string CONFIG_FILE_MINIO = "FILE_MINIO"; #endregion 系统配置 @@ -44,7 +54,7 @@ public class CateGoryConst /// /// MQTT配置 /// - public const string Config_MQTT_BASE = "MQTT_BASE"; + public const string CONFIG_MQTT_BASE = "MQTT_BASE"; #endregion Mqtt配置 @@ -53,42 +63,52 @@ public class CateGoryConst /// /// 用户有哪些角色 /// - public const string Relation_SYS_USER_HAS_ROLE = "SYS_USER_HAS_ROLE"; + public const string RELATION_SYS_USER_HAS_ROLE = "SYS_USER_HAS_ROLE"; /// /// 角色有哪些资源 /// - public const string Relation_SYS_ROLE_HAS_RESOURCE = "SYS_ROLE_HAS_RESOURCE"; + public const string RELATION_SYS_ROLE_HAS_RESOURCE = "SYS_ROLE_HAS_RESOURCE"; + + /// + /// 角色有哪些模块 + /// + public const string RELATION_SYS_ROLE_HAS_MODULE = "SYS_ROLE_HAS_MODULE"; + + /// + /// 用户有哪些模块 + /// + public const string RELATION_SYS_USER_HAS_MODULE = "SYS_USER_HAS_MODULE"; /// ///用户有哪些资源 /// - public const string Relation_SYS_USER_HAS_RESOURCE = "SYS_USER_HAS_RESOURCE"; + public const string RELATION_SYS_USER_HAS_RESOURCE = "SYS_USER_HAS_RESOURCE"; /// /// 角色有哪些权限 /// - public const string Relation_SYS_ROLE_HAS_PERMISSION = "SYS_ROLE_HAS_PERMISSION"; + public const string RELATION_SYS_ROLE_HAS_PERMISSION = "SYS_ROLE_HAS_PERMISSION"; /// - /// 角色有哪些权限 + /// 用户有哪些权限 /// - public const string Relation_SYS_USER_HAS_PERMISSION = "SYS_USER_HAS_PERMISSION"; + public const string RELATION_SYS_USER_HAS_PERMISSION = "SYS_USER_HAS_PERMISSION"; /// /// 用户工作台数据 /// - public const string Relation_SYS_USER_WORKBENCH_DATA = "SYS_USER_WORKBENCH_DATA"; + public const string RELATION_SYS_USER_WORKBENCH_DATA = "SYS_USER_WORKBENCH_DATA"; /// /// 用户日程数据 /// - public const string Relation_SYS_USER_SCHEDULE_DATA = "SYS_USER_SCHEDULE_DATA"; + public const string RELATION_SYS_USER_SCHEDULE_DATA = "SYS_USER_SCHEDULE_DATA"; /// /// 站内信与接收用户 /// - public const string Relation_MSG_TO_USER = "MSG_TO_USER"; + public const string RELATION_MSG_TO_USER = "MSG_TO_USER"; #endregion 关系表 @@ -126,22 +146,22 @@ public class CateGoryConst /// /// 模块 /// - public const string Resource_MODULE = "MODULE"; + public const string RESOURCE_MODULE = "MODULE"; /// /// 菜单 /// - public const string Resource_MENU = "MENU"; + public const string RESOURCE_MENU = "MENU"; /// /// 单页 /// - public const string Resource_SPA = "SPA"; + public const string RESOURCE_SPA = "SPA"; /// /// 按钮 /// - public const string Resource_BUTTON = "BUTTON"; + public const string RESOURCE_BUTTON = "BUTTON"; #endregion 资源表 @@ -150,22 +170,22 @@ public class CateGoryConst /// /// 登录 /// - public const string Log_LOGIN = "LOGIN"; + public const string LOG_LOGIN = "LOGIN"; /// /// 登出 /// - public const string Log_LOGOUT = "LOGOUT"; + public const string LOG_LOGOUT = "LOGOUT"; /// /// 操作 /// - public const string Log_OPERATE = "OPERATE"; + public const string LOG_OPERATE = "OPERATE"; /// /// 异常 /// - public const string Log_EXCEPTION = "EXCEPTION"; + public const string LOG_EXCEPTION = "EXCEPTION"; #endregion 日志表 @@ -174,12 +194,12 @@ public class CateGoryConst /// /// 框架 /// - public const string Dict_FRM = "FRM"; + public const string DICT_FRM = "FRM"; /// /// 业务 /// - public const string Dict_BIZ = "BIZ"; + public const string DICT_BIZ = "BIZ"; #endregion 字典表 @@ -188,12 +208,12 @@ public class CateGoryConst /// /// 部门 /// - public const string Org_DEPT = "DEPT"; + public const string ORG_DEPT = "DEPT"; /// /// 公司 /// - public const string Org_COMPANY = "COMPANY"; + public const string ORG_COMPANY = "COMPANY"; #endregion 组织表 @@ -202,17 +222,17 @@ public class CateGoryConst /// /// 高层 /// - public const string Position_HIGH = "HIGH"; + public const string POSITION_HIGH = "HIGH"; /// /// 中层 /// - public const string Position_MIDDLE = "MIDDLE"; + public const string POSITION_MIDDLE = "MIDDLE"; /// /// 基层 /// - public const string Position_LOW = "LOW"; + public const string POSITION_LOW = "LOW"; #endregion 职位表 @@ -221,12 +241,12 @@ public class CateGoryConst /// /// 全局 /// - public const string Role_GLOBAL = "GLOBAL"; + public const string ROLE_GLOBAL = "GLOBAL"; /// /// 机构 /// - public const string Role_ORG = "ORG"; + public const string ROLE_ORG = "ORG"; #endregion 角色表 @@ -235,12 +255,12 @@ public class CateGoryConst /// /// 通知 /// - public const string Message_INFORM = "INFORM"; + public const string MESSAGE_INFORM = "INFORM"; /// /// 公告 /// - public const string Message_NOTICE = "NOTICE"; + public const string MESSAGE_NOTICE = "NOTICE"; #endregion 站内信表 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/DevConfigConst.cs b/api/SimpleAdmin/SimpleAdmin.System/Const/SysConfigConst.cs similarity index 66% rename from api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/DevConfigConst.cs rename to api/SimpleAdmin/SimpleAdmin.System/Const/SysConfigConst.cs index 0b2ae5ec68c421eb5ba168c8e2076ca8ce6de21e..d364b82c0b3197e0d1228602f8e54c8940f045ff 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/DevConfigConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Const/SysConfigConst.cs @@ -1,15 +1,67 @@ -namespace SimpleAdmin.SqlSugar; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 系统配置常量 /// -public class DevConfigConst +public class SysConfigConst { + #region MyRegion + + /// + /// 系统名称 + /// + public const string SYS_NAME = "SYS_NAME"; + + + /// + /// ico图标 + /// + public const string SYS_ICO = "SYS_ICO"; + + /// + /// 网站开启访问 + /// + public const string SYS_WEB_STATUS = "SYS_WEB_STATUS"; + + + /// + /// 网站关闭提示 + /// + public const string SYS_WEB_CLOSE_PROMPT = "SYS_WEB_CLOSE_PROMPT"; + + /// + /// 系统logo + /// + public const string SYS_LOGO = "SYS_LOGO"; + + /// + /// 系统版本 + /// + public const string SYS_VERSION = "SYS_VERSION"; + + /// + /// 多租户开关 + /// + public const string SYS_TENANT_OPTIONS = "SYS_TENANT_OPTIONS"; + + /// /// 系统默认工作台 /// public const string SYS_DEFAULT_WORKBENCH_DATA = "SYS_DEFAULT_WORKBENCH_DATA"; + #endregion + #region 登录策略 /// @@ -32,7 +84,6 @@ public class DevConfigConst /// public const string LOGIN_ERROR_LOCK = "LOGIN_ERROR_LOCK"; - /// /// 登录错误锁定时长 /// @@ -43,7 +94,7 @@ public class DevConfigConst /// public const string LOGIN_ERROR_COUNT = "LOGIN_ERROR_COUNT"; - #endregion + #endregion 登录策略 #region 密码策略 @@ -92,26 +143,7 @@ public class DevConfigConst /// public const string PWD_CONTAIN_CHARACTER = "PWD_CONTAIN_UPPER"; - #endregion - - #region MQTT - - /// - /// mqtt连接地址 - /// - public const string MQTT_PARAM_URL = "MQTT_PARAM_URL"; - - /// - /// mqtt连接用户名 - /// - public const string MQTT_PARAM_USERNAME = "MQTT_PARAM_USERNAME"; - - /// - /// mqtt连接密码 - /// - public const string MQTT_PARAM_PASSWORD = "MQTT_PARAM_PASSWORD"; - - #endregion MQTT + #endregion 密码策略 #region 存储引擎 @@ -131,7 +163,7 @@ public class DevConfigConst public const string FILE_MINIO_ACCESS_KEY = "FILE_MINIO_ACCESS_KEY"; /// - /// MINIO文件SecetKey + /// MINIO文件SecretKey /// public const string FILE_MINIO_SECRET_KEY = "FILE_MINIO_SECRET_KEY"; @@ -146,4 +178,23 @@ public class DevConfigConst public const string FILE_MINIO_DEFAULT_BUCKET_NAME = "FILE_MINIO_DEFAULT_BUCKET_NAME"; #endregion 存储引擎 -} \ No newline at end of file + + #region MQTT + + /// + /// mqtt连接地址 + /// + public const string MQTT_PARAM_URL = "MQTT_PARAM_URL"; + + /// + /// mqtt连接用户名 + /// + public const string MQTT_PARAM_USERNAME = "MQTT_PARAM_USERNAME"; + + /// + /// mqtt连接密码 + /// + public const string MQTT_PARAM_PASSWORD = "MQTT_PARAM_PASSWORD"; + + #endregion +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Const/SysDictConst.cs b/api/SimpleAdmin/SimpleAdmin.System/Const/SysDictConst.cs new file mode 100644 index 0000000000000000000000000000000000000000..16ace39be5a4a18814cc660aace3c4afbdf90975 --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.System/Const/SysDictConst.cs @@ -0,0 +1,166 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; + +/// +/// 字典常量 +/// +public class SysDictConst +{ + #region 系统字典 + + /// + /// 性别 + /// + public const string GENDER = "GENDER"; + + /// + /// 名族 + /// + public const string NATION = "NATION"; + + /// + /// 用户证件类型 + /// + public const string ID_CARD_TYPE = "ID_CARD_TYPE"; + + /// + /// 通用文化程度 + /// + public const string CULTURE_LEVEL = "CULTURE_LEVEL"; + + /// + /// 系统职位分类 + /// + public const string POSITION_CATEGORY = "POSITION_CATEGORY"; + + #region 在线用户状态 + + /// + /// 在线 + /// + public const string ONLINE_STATUS_ONLINE = "ONLINE"; + + /// + /// 离线 + /// + public const string ONLINE_STATUS_OFFLINE = "OFFLINE"; + + #endregion 在线用户状态 + + #region 上传文件引擎 + + /// + /// 本地 + /// + public const string FILE_ENGINE_LOCAL = "LOCAL"; + + /// + /// MINIO + /// + public const string FILE_ENGINE_MINIO = "MINIO"; + + #endregion 上传文件引擎 + + #region 系统字典分类 + + /// + /// 系统 + /// + public const string DICT_CATEGORY_FRM = "FRM"; + + /// + /// 业务 + /// + public const string DICT_CATEGORY_BIZ = "BIZ"; + + #endregion 系统字典分类 + + #region 多租户选项 + + /// + /// 关闭 + /// + public const string TENANT_OPTIONS_CLOSE = "TENANT_OPTIONS_CLOSE"; + + /// + /// 手动选择 + /// + public const string TENANT_OPTIONS_CHOSE = "TENANT_OPTIONS_CHOSE"; + + /// + /// 根据域名 + /// + public const string TENANT_OPTIONS_DOMAIN = "TENANT_OPTIONS_DOMAIN"; + + #endregion + + #region 站内信 + + /// + /// 消息分类 + /// + public const string MESSAGE_CATEGORY = "MESSAGE_CATEGORY"; + + /// + /// 接受者类型 + /// + public const string RECEIVER_TYPE = "RECEIVER_TYPE"; + + /// + /// 发送方式 + /// + public const string MESSAGE_WAY = "MESSAGE_WAY"; + + /// + /// 立即发送 + /// + public const string SEND_WAY_NOW = "NOW"; + + /// + /// 延迟发送 + /// + public const string SEND_WAY_DELAY = "DELAY"; + + /// + /// 指定时间 + /// + public const string SEND_WAY_SCHEDULE = "SCHEDULE"; + + /// + /// 待发送 + /// + public const string MESSAGE_STATUS_READY = "READY"; + + /// + /// 已发送 + /// + public const string MESSAGE_STATUS_ALREADY = "ALREADY"; + + /// + /// 所有 + /// + public const string RECEIVER_TYPE_ALL = "ALL"; + + /// + /// 角色 + /// + public const string RECEIVER_TYPE_ROLE = "ROLE"; + + /// + /// 指定 + /// + public const string RECEIVER_TYPE_APPOINT = "APPOINT"; + + #endregion + + #endregion 系统字典 +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Const/SysLogConst.cs b/api/SimpleAdmin/SimpleAdmin.System/Const/SysLogConst.cs new file mode 100644 index 0000000000000000000000000000000000000000..093cd9b9476cd7795af7d97c30b83c66b17029ed --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.System/Const/SysLogConst.cs @@ -0,0 +1,27 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; + +/// +/// 日志常量 +/// +public class SysLogConst +{ + /// + /// 成功 + /// + public const string SUCCESS = "SUCCESS"; + + /// + /// 成功 + /// + public const string FAIL = "FAIL"; +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/ResourceConst.cs b/api/SimpleAdmin/SimpleAdmin.System/Const/SysResourceConst.cs similarity index 30% rename from api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/ResourceConst.cs rename to api/SimpleAdmin/SimpleAdmin.System/Const/SysResourceConst.cs index 1fe11dac51b3d27ff0bbd58f24c029cd2d57b2cb..ed032dfed7888d083bb6c659448434f7e887b3ce 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/ResourceConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Const/SysResourceConst.cs @@ -1,9 +1,19 @@ -namespace SimpleAdmin.SqlSugar; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 资源表常量 /// -public class ResourceConst +public class SysResourceConst { /// /// 目录 @@ -11,7 +21,7 @@ public class ResourceConst public const string CATALOG = "CATALOG"; /// - /// 组件 + /// 菜单 /// public const string MENU = "MENU"; @@ -20,13 +30,23 @@ public class ResourceConst /// public const string IFRAME = "IFRAME"; + /// + /// 子页 + /// + public const string SUBSET = "SUBSET"; + /// /// 外链 /// public const string LINK = "LINK"; + /// + /// 单页 + /// + public const string SPA = "SPA"; + /// /// 系统内置单页面编码 /// - public const string System = "system"; -} \ No newline at end of file + public const string SYSTEM = "system"; +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Const/SysRoleConst.cs b/api/SimpleAdmin/SimpleAdmin.System/Const/SysRoleConst.cs new file mode 100644 index 0000000000000000000000000000000000000000..d03ad5a951af77501062d9f043250958631237d9 --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.System/Const/SysRoleConst.cs @@ -0,0 +1,27 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; + +/// +/// 角色常量 +/// +public class SysRoleConst +{ + /// + /// 超级管理员 + /// + public const string SUPER_ADMIN = "superAdmin"; + + /// + /// 业务管理员 + /// + public const string BIZ_ADMIN = "bizAdmin"; +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Const/SystemConst.cs b/api/SimpleAdmin/SimpleAdmin.System/Const/SystemConst.cs index 28430aa1c06a87e18e51d346908f0d6cd629c920..e3595dc1f2ff6db8943087330c79f1b92d3f233c 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Const/SystemConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Const/SystemConst.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 系统层常量 @@ -8,65 +18,128 @@ public class SystemConst /// /// 系统配置表缓存Key /// - public const string Cache_DevConfig = CacheConst.Cache_Prefix_Web + "DevConfig:"; + public const string CACHE_DEV_CONFIG = CacheConst.CACHE_PREFIX_WEB + "SysConfig:"; /// /// 登录验证码缓存Key /// - public const string Cache_Captcha = CacheConst.Cache_Prefix_Web + "Captcha:"; + public const string CACHE_CAPTCHA = CacheConst.CACHE_PREFIX_WEB + "Captcha:"; /// /// 用户表缓存Key /// - public const string Cache_SysUser = CacheConst.Cache_Prefix_Web + "SysUser"; + public const string CACHE_SYS_USER = CacheConst.CACHE_PREFIX_WEB + "SysUser"; + + /// + /// 用户头像缓存关系Key + /// + public const string CACHE_SYS_USER_AVATAR = CacheConst.CACHE_PREFIX_WEB + "SysUserAvatar"; /// /// 用户手机号关系缓存Key /// - public const string Cache_SysUserPhone = CacheConst.Cache_Prefix_Web + "SysUserPhone"; + public const string CACHE_SYS_USER_PHONE = CacheConst.CACHE_PREFIX_WEB + "SysUserPhone"; /// /// 用户手机号关系缓存Key /// - public const string Cache_SysUserAccount = CacheConst.Cache_Prefix_Web + "SysUserAccount"; + public const string CACHE_SYS_USER_ACCOUNT = CacheConst.CACHE_PREFIX_WEB + "SysUserAccount"; /// /// 资源表缓存Key /// - public const string Cache_SysResource = CacheConst.Cache_Prefix_Web + "SysResource:"; + public const string CACHE_SYS_RESOURCE = CacheConst.CACHE_PREFIX_WEB + "SysResource:"; /// /// 字典表缓存Key /// - public const string Cache_DevDict = CacheConst.Cache_Prefix_Web + "DevDict"; + public const string CACHE_DEV_DICT = CacheConst.CACHE_PREFIX_WEB + "SysDict"; /// /// 关系表缓存Key /// - public const string Cache_SysRelation = CacheConst.Cache_Prefix_Web + "SysRelation:"; + public const string CACHE_SYS_RELATION = CacheConst.CACHE_PREFIX_WEB + "SysRelation:"; /// /// 机构表缓存Key /// - public const string Cache_SysOrg = CacheConst.Cache_Prefix_Web + "SysOrg"; + public const string CACHE_SYS_ORG = CacheConst.CACHE_PREFIX_WEB + "SysOrg"; + + /// + /// 机构对应租户关系缓存Key + /// + public const string CACHE_SYS_ORG_TENANT = CacheConst.CACHE_PREFIX_WEB + "SysOrgTenant"; + + /// + /// 租户列表缓存 + /// + public const string CACHE_SYS_TENANT = CacheConst.CACHE_PREFIX_WEB + "Tenant"; /// /// 角色表缓存Key /// - public const string Cache_SysRole = CacheConst.Cache_Prefix_Web + "SysRole"; + public const string CACHE_SYS_ROLE = CacheConst.CACHE_PREFIX_WEB + "SysRole"; /// /// 职位表缓存Key /// - public const string Cache_SysPosition = CacheConst.Cache_Prefix_Web + "SysPosition"; - + public const string CACHE_SYS_POSITION = CacheConst.CACHE_PREFIX_WEB + "SysPosition"; #region 登录错误次数 /// /// 登录错误次数缓存Key /// - public const string Cache_LoginErrorCount = CacheConst.Cache_Prefix_Web + "LoginErrorCount:"; + public const string CACHE_LOGIN_ERROR_COUNT = CacheConst.CACHE_PREFIX_WEB + "LoginErrorCount:"; + + #endregion 登录错误次数 + + #region 操作 + + /// + /// 添加操作 + /// + public const string ADD = "添加"; + + /// + /// 编辑操作 + /// + public const string EDIT = "编辑"; + + /// + /// 启用操作 + /// + public const string ENABLE = "启用"; + + /// + /// 禁用操作 + /// + public const string DISABLE = "禁用"; + + /// + /// 重置密码操作 + /// + public const string RESET_PWD = "重置密码"; + + /// + /// 用户授权操作 + /// + public const string GRANT_ROLE = "授权"; + + #endregion 操作 + + #region 别称 + + /// + /// 组织 + /// + public const string SYS_ORG = "组织"; + + + /// + /// 职位 + /// + public const string SYS_POS = "职位"; - #endregion -} \ No newline at end of file + #endregion 别称 +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEdit.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEdit.cs index 1851c3624dd2a3c013bc23d1ba3b5d2be1a3ef13..0648d6798e1c83f794eec54f7e0824c8a424537c 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEdit.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEdit.cs @@ -1,10 +1,20 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 批量修改 /// [SugarTable("batch_edit", TableDescription = "批量修改")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlSugarConst.DB_DEFAULT)] [CodeGen] public class BatchEdit : PrimaryKeyEntity { @@ -37,4 +47,4 @@ public class BatchEdit : PrimaryKeyEntity /// [SugarColumn(ColumnName = "TableDescription", ColumnDescription = "表描述", Length = 100, IsNullable = false)] public string TableDescription { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEditConfig.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEditConfig.cs index d753da305f0da690abd79a815107dc0fe17ccc43..cb7ec2ed8bcb44b80c950d84f786372ee9d72cb0 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEditConfig.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEditConfig.cs @@ -1,10 +1,20 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 批量修改配置表 /// [SugarTable("batch_edit_config", TableDescription = "批量修改配置表")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlSugarConst.DB_DEFAULT)] public class BatchEditConfig : PrimaryKeyEntity { /// @@ -72,4 +82,4 @@ public class BatchEditConfig : PrimaryKeyEntity /// [SugarColumn(ColumnName = "Status", ColumnDescription = "状态", Length = 100, IsNullable = false)] public string Status { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientRelation.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientRelation.cs index ddca066ec7c0d5c114835ff49f04190b60bf65fa..b0c492114eaf79918ded0780da1d921a8d5993a3 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientRelation.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientRelation.cs @@ -1,10 +1,20 @@ -namespace SimpleAdmin.Core.Entity.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core.Entity.System; /// /// C端用户关系 /// [SugarTable("client_relation", TableDescription = "关系")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlSugarConst.DB_DEFAULT)] public class ClientRelation : PrimaryKeyEntity { /// @@ -24,4 +34,4 @@ public class ClientRelation : PrimaryKeyEntity /// [SugarColumn(ColumnName = "Category", ColumnDescription = "分类", Length = 200, IsNullable = true)] public string Category { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientUser.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientUser.cs index 7e7dbfa5bd27c2a5e7651dd4c11ac0fd5cf7816b..eaf348fa03fced319721951c2550fdc27eb1f378 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientUser.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientUser.cs @@ -1,10 +1,20 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// C端用户 /// [SugarTable("client_user", TableDescription = "C端用户")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlSugarConst.DB_DEFAULT)] public class ClientUser : DataEntityBase { /// @@ -268,12 +278,12 @@ public class ClientUser : DataEntityBase /// /// 用户状态 /// - [SugarColumn(ColumnName = "UserStatus", ColumnDescription = "用户状态", Length = 200, IsNullable = true)] - public string UserStatus { get; set; } + [SugarColumn(ColumnName = "Status", ColumnDescription = "用户状态", Length = 200, IsNullable = true)] + public string Status { get; set; } /// /// 排序码 /// [SugarColumn(ColumnName = "SortCode", ColumnDescription = "排序码", IsNullable = true)] public int? SortCode { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevMessage.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/DevMessage.cs deleted file mode 100644 index 46dbe45a6bbec2b1add954bfd5f51fc2fffa4039..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevMessage.cs +++ /dev/null @@ -1,33 +0,0 @@ -namespace SimpleAdmin.System; - -/// -/// 站内信 -/// -[SugarTable("dev_message", TableDescription = "站内信")] -[Tenant(SqlsugarConst.DB_Default)] -public class DevMessage : BaseEntity -{ - /// - /// 分类 - /// - [SugarColumn(ColumnName = "Category", ColumnDescription = "分类", Length = 200)] - public virtual string Category { get; set; } - - /// - /// 主题 - /// - [SugarColumn(ColumnName = "Subject", ColumnDescription = "主题")] - public virtual string Subject { get; set; } - - /// - /// 正文 - /// - [SugarColumn(ColumnName = "Content", ColumnDescription = "正文", ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] - public virtual string Content { get; set; } - - /// - /// 是否已读 - /// - [SugarColumn(IsIgnore = true)] - public bool Read { get; set; } = true; -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevRelation.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/DevRelation.cs deleted file mode 100644 index 47baea961cf2f1604174fc81ca5bf426a229fe1f..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevRelation.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace SimpleAdmin.System; - -/// -/// 开发关系表 -/// -[SugarTable("dev_relation", TableDescription = "开发关系表")] -[Tenant(SqlsugarConst.DB_Default)] -public class DevRelation : SysRelation -{ -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevConfig.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysConfig.cs similarity index 52% rename from api/SimpleAdmin/SimpleAdmin.System/Entity/DevConfig.cs rename to api/SimpleAdmin/SimpleAdmin.System/Entity/SysConfig.cs index a0a629a06c96201795d0c33015b933f2b90545c2..28f5f4057a8841d9bbfa3b9ef54b5ca9cc29c0b2 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevConfig.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysConfig.cs @@ -1,11 +1,21 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 配置 /// -[SugarTable("dev_config", TableDescription = "配置")] -[Tenant(SqlsugarConst.DB_Default)] -public class DevConfig : BaseEntity +[SugarTable("sys_config", TableDescription = "配置")] +[Tenant(SqlSugarConst.DB_DEFAULT)] +public class SysConfig : BaseEntity { /// /// 配置键 @@ -36,4 +46,4 @@ public class DevConfig : BaseEntity /// [SugarColumn(ColumnName = "SortCode", ColumnDescription = "排序码", IsNullable = true)] public int SortCode { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevDict.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysDict.cs similarity index 48% rename from api/SimpleAdmin/SimpleAdmin.System/Entity/DevDict.cs rename to api/SimpleAdmin/SimpleAdmin.System/Entity/SysDict.cs index dee0e877615548727fa32002e086c3bb4cc7c7d9..3f4fb505b3c9d111ab926a544bb33cf46624ce97 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevDict.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysDict.cs @@ -1,11 +1,21 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 字典 /// -[SugarTable("dev_dict", TableDescription = "字典表")] -[Tenant(SqlsugarConst.DB_Default)] -public class DevDict : BaseEntity +[SugarTable("sys_dict", TableDescription = "字典表")] +[Tenant(SqlSugarConst.DB_DEFAULT)] +public class SysDict : BaseEntity { /// /// 父id @@ -29,7 +39,7 @@ public class DevDict : BaseEntity /// 分类 /// [SugarColumn(ColumnName = "Category", ColumnDescription = "分类", Length = 200)] - public string Category { get; set; } + public virtual string Category { get; set; } /// /// 排序码 @@ -37,9 +47,10 @@ public class DevDict : BaseEntity [SugarColumn(ColumnName = "SortCode", ColumnDescription = "排序码")] public int SortCode { get; set; } + /// /// 子节点 /// [SugarColumn(IsIgnore = true)] - public List Children { get; set; } -} \ No newline at end of file + public List Children { get; set; } +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevFile.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysFile.cs similarity index 68% rename from api/SimpleAdmin/SimpleAdmin.System/Entity/DevFile.cs rename to api/SimpleAdmin/SimpleAdmin.System/Entity/SysFile.cs index acd488184ad1d27124d69bd849b3ed91ad91d3f7..0d6c2508fd8c42e99531e1b3fd3c9356dda9d368 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevFile.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysFile.cs @@ -1,11 +1,21 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 文件表 /// -[SugarTable("dev_file", TableDescription = "文件表")] -[Tenant(SqlsugarConst.DB_Default)] -public class DevFile : DataEntityBase +[SugarTable("sys_file", TableDescription = "文件表")] +[Tenant(SqlSugarConst.DB_DEFAULT)] +public class SysFile : DataEntityBase { /// /// 存储引擎 @@ -66,4 +76,4 @@ public class DevFile : DataEntityBase /// [SugarColumn(ColumnName = "Thumbnail", ColumnDescription = "图片缩略图", IsNullable = true, ColumnDataType = StaticConfig.CodeFirst_BigString)] public string Thumbnail { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevLogOperate.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogOperate.cs similarity index 62% rename from api/SimpleAdmin/SimpleAdmin.System/Entity/DevLogOperate.cs rename to api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogOperate.cs index 035b45fafca38b227121168f627578b36880931c..bae5e10685af1a0c450fac0da93764316654b658 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevLogOperate.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogOperate.cs @@ -1,11 +1,21 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 操作日志表 /// -[SugarTable("dev_log_operate", TableDescription = "操作日志表")] -[Tenant(SqlsugarConst.DB_Default)] -public class DevLogOperate : DevLogVisit +[SugarTable("sys_log_operate_{year}{month}{day}", TableDescription = "操作日志表")] +[Tenant(SqlSugarConst.DB_DEFAULT)] +public class SysLogOperate : SysLogVisit { /// /// 具体消息 @@ -48,4 +58,4 @@ public class DevLogOperate : DevLogVisit /// [SugarColumn(ColumnName = "ResultJson", ColumnDescription = "返回结果", ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] public string ResultJson { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevLogVisit.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogVisit.cs similarity index 61% rename from api/SimpleAdmin/SimpleAdmin.System/Entity/DevLogVisit.cs rename to api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogVisit.cs index 2cf18213b2c6fb7079eff5a86c33a304e33e7f95..e085d4fa0d40a5ce1ca622508d88c23eb297f34a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevLogVisit.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogVisit.cs @@ -1,11 +1,22 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 访问日志表 /// -[SugarTable("dev_log_visit", TableDescription = "访问日志表")] -[Tenant(SqlsugarConst.DB_Default)] -public class DevLogVisit : BaseEntity +[SugarTable("sys_log_visit_{year}{month}{day}", TableDescription = "访问日志表")] +[SplitTable(SplitType.Year)]//按年分表 (自带分表支持 年、季、月、周、日) +[Tenant(SqlSugarConst.DB_DEFAULT)] +public class SysLogVisit : BaseEntity { /// /// 日志分类 @@ -53,6 +64,7 @@ public class DevLogVisit : BaseEntity /// 操作时间 /// [SugarColumn(ColumnName = "OpTime", ColumnDescription = "操作时间")] + [SplitField]//分表字段 在插入的时候会根据这个字段插入哪个表,在更新删除的时候用这个字段找出相关表 public DateTime OpTime { get; set; } /// @@ -66,4 +78,4 @@ public class DevLogVisit : BaseEntity /// [SugarColumn(ColumnName = "OpAccount", ColumnDescription = "操作人账号", Length = 200, IsNullable = true)] public string OpAccount { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessage.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessage.cs new file mode 100644 index 0000000000000000000000000000000000000000..4d01fd08efc8976d19bf41e77c84abca72587d66 --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessage.cs @@ -0,0 +1,123 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; + +/// +/// 站内信 +/// +[SugarTable("sys_message", TableDescription = "站内信")] +[Tenant(SqlSugarConst.DB_DEFAULT)] +public class SysMessage : BaseEntity +{ + /// + /// 分类 + /// + [SugarColumn(ColumnName = "Category", ColumnDescription = "分类", Length = 200)] + public virtual string Category { get; set; } + + /// + /// 主题 + /// + [SugarColumn(ColumnName = "Subject", ColumnDescription = "主题")] + public virtual string Subject { get; set; } + + /// + /// 接收人类型 + /// + [SugarColumn(ColumnName = "ReceiverType", ColumnDescription = "接收人类型")] + public virtual string ReceiverType { get; set; } + + /// + /// 接收人列表 + /// + [SugarColumn(ColumnName = "ReceiverInfo", ColumnDescription = "接收人列表", IsJson = true)] + public virtual List ReceiverInfo { get; set; } + + /// + /// 发送方式 + /// + [SugarColumn(ColumnName = "SendWay", ColumnDescription = "发送方式")] + public virtual string SendWay { get; set; } + + /// + /// 发送时间 + /// + [SugarColumn(ColumnDescription = "发送时间")] + public virtual DateTime SendTime { get; set; } + + /// + /// 正文 + /// + [SugarColumn(ColumnName = "Content", ColumnDescription = "正文", ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] + public virtual string Content { get; set; } + + + /// + /// 延迟时间(秒) + /// + [SugarColumn(IsIgnore = true)] + public int DelayTime { get; set; } + + /// + /// 已读情况 + /// + [SugarColumn(IsIgnore = true)] + public List ReceiverDetail { get; set; } = new List(); + + /// + /// 发送时间格式化 + /// + [SugarColumn(IsIgnore = true)] + public string SendTimeFormat { get; set; } + + /// + /// 分组查询用 + /// + [SugarColumn(IsIgnore = true)] + public int Index2 { get; set; } + + /// + /// 是否已读 + /// + [SugarColumn(IsIgnore = true)] + public bool Read { get; set; } +} + +public class ReceiverInfo +{ + /// + /// ID + /// + public long Id { get; set; } + + /// + /// 名称 + /// + public string Name { get; set; } +} + +public class ReceiverDetail +{ + /// + /// ID + /// + public long Id { get; set; } + + /// + /// 名称 + /// + public string Name { get; set; } + + /// + /// 是否已读 + /// + public bool Read { get; set; } +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevMessageUser.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessageUser.cs similarity index 39% rename from api/SimpleAdmin/SimpleAdmin.System/Entity/DevMessageUser.cs rename to api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessageUser.cs index 02a2230919ecd832f6ef4358a16f0b67b0dea867..73a7b794331fa8954e48fa60b968f24398ca2778 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevMessageUser.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessageUser.cs @@ -1,11 +1,21 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 用户消息表 /// -[SugarTable("dev_message_user", TableDescription = "用户消息表")] -[Tenant(SqlsugarConst.DB_Default)] -public class DevMessageUser : BaseEntity +[SugarTable("sys_message_user", TableDescription = "用户消息表")] +[Tenant(SqlSugarConst.DB_DEFAULT)] +public class SysMessageUser : BaseEntity { /// /// 消息Id @@ -24,4 +34,4 @@ public class DevMessageUser : BaseEntity /// [SugarColumn(ColumnName = "Read", ColumnDescription = "已读未读", IsNullable = false)] public bool Read { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysOrg.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysOrg.cs index e6be1f648fa34fee1d5b5de2310b3a16addbc10e..cb0e3a8d48c99c0100ff8080c268b5602b606093 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysOrg.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysOrg.cs @@ -1,10 +1,20 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 组织 /// [SugarTable("sys_org", TableDescription = "组织")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlSugarConst.DB_DEFAULT)] [CodeGen] public class SysOrg : BaseEntity { @@ -14,6 +24,9 @@ public class SysOrg : BaseEntity [SugarColumn(ColumnName = "ParentId", ColumnDescription = "父id")] public long ParentId { get; set; } + [SugarColumn(ColumnName = "ParentIdList", ColumnDescription = "父id列表", IsNullable = true, IsJson = true)] + public List ParentIdList { get; set; } = new List(); + /// /// 主管ID /// @@ -50,6 +63,12 @@ public class SysOrg : BaseEntity [SugarColumn(ColumnName = "SortCode", ColumnDescription = "排序码", IsNullable = true)] public int? SortCode { get; set; } + /// + /// 主管信息 + /// + [SugarColumn(IsIgnore = true)] + public UserSelectorOutPut DirectorInfo { get; set; } + /// /// 子节点 /// @@ -60,5 +79,5 @@ public class SysOrg : BaseEntity /// 设置为叶子节点(设置了loadData时有效) /// [SugarColumn(IsIgnore = true)] - public bool? IsLeaf { get; set; } -} \ No newline at end of file + public bool? Leaf { get; set; } +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysPosition.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysPosition.cs index 3afe43f5851472f33e666ca1df251469f815907f..16af01f9cc98c53d50105b94f830e51c87239fd9 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysPosition.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysPosition.cs @@ -1,10 +1,20 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 职位表 /// [SugarTable("sys_position", TableDescription = "职位表")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlSugarConst.DB_DEFAULT)] [CodeGen] public class SysPosition : DataEntityBase { @@ -37,4 +47,4 @@ public class SysPosition : DataEntityBase /// [SugarColumn(ColumnName = "SortCode", ColumnDescription = "排序码", IsNullable = true)] public int? SortCode { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRelation.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRelation.cs index 573650d1bb8fba80d0ee0291929e4a16f776984e..b7e514ec26cc7d8cb2660d4cdd8e905a2ae65905 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRelation.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRelation.cs @@ -1,10 +1,20 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 系统关系表 /// [SugarTable("sys_relation", TableDescription = "系统关系表")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlSugarConst.DB_DEFAULT)] public class SysRelation : PrimaryKeyEntity { /// @@ -24,4 +34,4 @@ public class SysRelation : PrimaryKeyEntity /// [SugarColumn(ColumnName = "Category", ColumnDescription = "分类", Length = 200, IsNullable = false)] public string Category { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs index 8ecaa27e52cd83d0778c9cc92c5ccb31a1747786..93238890a3c2bacd60363aba2c0765f49055025a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs @@ -1,10 +1,20 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 资源 /// [SugarTable("sys_resource", TableDescription = "资源")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlSugarConst.DB_DEFAULT)] public class SysResource : BaseEntity { /// @@ -25,6 +35,12 @@ public class SysResource : BaseEntity [SugarColumn(ColumnName = "Name", ColumnDescription = "别名", Length = 200, IsNullable = true)] public string Name { get; set; } + /// + /// 描述 + /// + [SugarColumn(ColumnName = "Description", ColumnDescription = "描述", Length = 200, IsNullable = true)] + public string Description { get; set; } + /// /// 编码 /// @@ -68,10 +84,40 @@ public class SysResource : BaseEntity public virtual string Icon { get; set; } /// - /// 颜色 + /// 是否在菜单中隐藏, 需要高亮的 path (通常用作详情页高亮父级菜单) + /// + [SugarColumn(ColumnName = "ActiveMenu", ColumnDescription = "需要高亮的 path (通常用作详情页高亮父级菜单)", Length = 200, IsNullable = true)] + public string ActiveMenu { get; set; } + + /// + /// 是否在菜单中隐藏 (通常列表详情页需要隐藏) + /// + [SugarColumn(ColumnName = "IsHide", ColumnDescription = "是否在菜单中隐藏 (通常列表详情页需要隐藏) ", IsNullable = true)] + public bool IsHide { get; set; } + + /// + /// 是否在菜单中隐藏 (通常列表详情页需要隐藏) + /// + [SugarColumn(ColumnName = "IsFull", ColumnDescription = "菜单是否全屏 (示例:数据大屏页面)", IsNullable = true)] + public bool IsFull { get; set; } + + /// + /// 菜单是否固定在标签页中 (首页通常是固定项) + /// + [SugarColumn(ColumnName = "IsAffix", ColumnDescription = "菜单是否固定在标签页中 (首页通常是固定项)", IsNullable = true)] + public bool IsAffix { get; set; } + + /// + /// 菜单是否固定在标签页中 (首页通常是固定项) + /// + [SugarColumn(ColumnName = "IsKeepAlive", ColumnDescription = " 当前路由是否缓存", IsNullable = true)] + public bool IsKeepAlive { get; set; } + + /// + /// 是否为首页 /// - [SugarColumn(ColumnName = "Color", ColumnDescription = "颜色", Length = 200, IsNullable = true)] - public string Color { get; set; } + [SugarColumn(ColumnName = "IsHome", ColumnDescription = " 是否为首页", IsNullable = true)] + public bool IsHome { get; set; } /// /// 排序码 @@ -79,6 +125,12 @@ public class SysResource : BaseEntity [SugarColumn(ColumnName = "SortCode", ColumnDescription = "排序码", IsNullable = true)] public int? SortCode { get; set; } + /// + /// 外链地址 + /// + [SugarColumn(ColumnName = "IsLink", ColumnDescription = "外链地址", IsNullable = true)] + public string IsLink { get; set; } + /// /// 菜单元标签 /// @@ -86,7 +138,7 @@ public class SysResource : BaseEntity public Meta Meta { get; set; } /// - /// 字节点 + /// 子节点 /// [SugarColumn(IsIgnore = true)] public List Children { get; set; } @@ -108,17 +160,32 @@ public class Meta public string Title { get; set; } /// - /// 类型 - /// - public string Type { get; set; } + /// 是否在菜单中隐藏, 需要高亮的 path (通常用作详情页高亮父级菜单) + /// + public string ActiveMenu { get; set; } /// - /// 是否首页 - /// - public bool Affix { get; set; } = false; + /// 是否在菜单中隐藏 (通常列表详情页需要隐藏) + /// + public bool IsHide { get; set; } /// - /// 是否隐藏 + /// 路由外链时填写的访问地址 /// - public bool hidden { get; set; } = false; -} \ No newline at end of file + public string IsLink { get; set; } = ""; + + /// + /// 是否在菜单中隐藏 (通常列表详情页需要隐藏) + /// + public bool IsFull { get; set; } + + /// + /// 菜单是否固定在标签页中 (首页通常是固定项) + /// + public bool IsAffix { get; set; } + + /// + /// 菜单是否固定在标签页中 (首页通常是固定项) + /// + public bool IsKeepAlive { get; set; } +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRole.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRole.cs index 864b20241a46b03531c5fa49ef421e3e12a9d6d4..1fde4929d8e14d45f0cf3662b07fd49778ab3c3a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRole.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRole.cs @@ -1,10 +1,20 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 角色 /// [SugarTable("sys_role", TableDescription = "角色")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlSugarConst.DB_DEFAULT)] public class SysRole : DataEntityBase { /// @@ -34,7 +44,8 @@ public class SysRole : DataEntityBase /// /// 默认数据范围 /// - [SugarColumn(ColumnName = "DefaultDataScope", ColumnDescription = "默认数据范围", IsJson = true, ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = false)] + [SugarColumn(ColumnName = "DefaultDataScope", ColumnDescription = "默认数据范围", IsJson = true, ColumnDataType = StaticConfig.CodeFirst_BigString, + IsNullable = false)] public virtual DefaultDataScope DefaultDataScope { get; set; } /// @@ -42,6 +53,12 @@ public class SysRole : DataEntityBase /// [SugarColumn(ColumnName = "SortCode", ColumnDescription = "排序码", IsNullable = true)] public int? SortCode { get; set; } + + /// + /// 用户列表 + /// + [SugarColumn(IsIgnore = true)] + public List UserList { get; set; } = new List(); } /// @@ -63,4 +80,4 @@ public class DefaultDataScope /// 自定义机构范围列表 /// public List ScopeDefineOrgIdList { get; set; } = new List(); -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysUser.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysUser.cs index bbcc98ec6404dbf97edc8e19830cba2cf5fe92fe..b1a7628a82ab5f719050df0b9e4ba29433ce7a6f 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysUser.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysUser.cs @@ -1,10 +1,20 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 用户信息表 /// [SugarTable("sys_user", TableDescription = "用户信息表")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlSugarConst.DB_DEFAULT)] [BatchEdit] [CodeGen] public class SysUser : BaseEntity @@ -208,11 +218,6 @@ public class SysUser : BaseEntity [SugarColumn(ColumnName = "DirectorId", ColumnDescription = "主管id", IsNullable = true)] public long? DirectorId { get; set; } - /// - /// 兼任信息 - /// - [SugarColumn(ColumnName = "PositionJson", ColumnDescription = "兼任信息", IsJson = true, ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] - public List PositionJson { get; set; } /// /// 上次修改密码时间 @@ -268,11 +273,6 @@ public class SysUser : BaseEntity [SugarColumn(ColumnName = "LatestLoginDevice", ColumnDescription = "最新登录设备", IsNullable = true)] public string LatestLoginDevice { get; set; } - /// - /// 用户状态 - /// - [SugarColumn(ColumnName = "UserStatus", ColumnDescription = "用户状态", Length = 200, IsNullable = true)] - public string UserStatus { get; set; } /// /// 排序码 @@ -280,6 +280,12 @@ public class SysUser : BaseEntity [SugarColumn(ColumnName = "SortCode", ColumnDescription = "排序码", IsNullable = true)] public int? SortCode { get; set; } + /// + /// 默认模块 + /// + [SugarColumn(ColumnName = "DefaultModule", ColumnDescription = "默认模块", IsNullable = true)] + public long? DefaultModule { get; set; } + /// /// 机构信息 /// @@ -298,6 +304,18 @@ public class SysUser : BaseEntity [SugarColumn(IsIgnore = true)] public string PositionName { get; set; } + /// + /// 组织和机构ID列表,组织ID从上到下最后是职位 + /// + [SugarColumn(IsIgnore = true, IsJson = true)] + public List OrgAndPosIdList { get; set; } = new List(); + + /// + /// 主管信息 + /// + [SugarColumn(IsIgnore = true)] + public UserSelectorOutPut DirectorInfo { get; set; } + /// /// 按钮码集合 /// @@ -339,6 +357,18 @@ public class SysUser : BaseEntity /// [SugarColumn(IsIgnore = true)] public List ScopeOrgChildList { get; set; } + + /// + /// 机构及以下机构ID集合 + /// + [SugarColumn(IsIgnore = true)] + public List ModuleList { get; set; } = new List(); + + /// + /// 租户Id + /// + [SugarColumn(IsIgnore = true)] + public long? TenantId { get; set; } } /// @@ -361,24 +391,3 @@ public class DataScope /// public List? DataScopes { get; set; } } - -/// -/// 兼任信息 -/// -public class PositionJson -{ - /// - /// 组织ID - /// - public long OrgId { get; set; } - - /// - /// 机构ID - /// - public long PositionId { get; set; } - - /// - /// 主管ID - /// - public long? DirectorId { get; set; } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/AuthEventSubscriber.cs b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/AuthEventSubscriber.cs index 6eb0f6a1eeabb77034a170f21414c6aab846e29a..747687e1841fa1acf34f1608fabc57bf2951f912 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/AuthEventSubscriber.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/AuthEventSubscriber.cs @@ -1,5 +1,15 @@ -using IPTools.Core; -using SimpleAdmin.Plugin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + + +using IP2Region.Net.Abstractions; namespace SimpleAdmin.System; @@ -9,16 +19,17 @@ namespace SimpleAdmin.System; public class AuthEventSubscriber : IEventSubscriber, ISingleton { private readonly ISimpleCacheService _simpleCacheService; - private readonly INamedServiceProvider _namedServiceProvider; - public IServiceProvider _services { get; } + private readonly ISearcher _searcher; + + public IServiceProvider Services { get; } private readonly SqlSugarScope _db; - public AuthEventSubscriber(ISimpleCacheService simpleCacheService, IServiceProvider services, INamedServiceProvider namedServiceProvider) + public AuthEventSubscriber(ISimpleCacheService simpleCacheService, IServiceProvider services, ISearcher searcher) { - _db = DbContext.Db; + _db = DbContext.DB; _simpleCacheService = simpleCacheService; - _namedServiceProvider = namedServiceProvider; - _services = services; + _searcher = searcher; + Services = services; } /// @@ -26,27 +37,27 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton /// /// /// - [EventSubscribe(EventSubscriberConst.LoginB)] + [EventSubscribe(EventSubscriberConst.LOGIN_B)] public async Task Login(EventHandlerExecutingContext context) { var loginEvent = (LoginEvent)context.Source.Payload;//获取参数 - var LoginAddress = GetLoginAddress(loginEvent.Ip); + var loginAddress = GetLoginAddress(loginEvent.Ip); var sysUser = loginEvent.SysUser; #region 登录/密码策略 - var key = SystemConst.Cache_LoginErrorCount + sysUser.Account;//获取登录错误次数Key值 + var key = SystemConst.CACHE_LOGIN_ERROR_COUNT + sysUser.Account;//获取登录错误次数Key值 _simpleCacheService.Remove(key);//移除登录错误次数 // 创建新的作用域 - using var scope = _services.CreateScope(); + using var scope = Services.CreateScope(); // 解析服务 var configService = scope.ServiceProvider.GetRequiredService(); var messageService = scope.ServiceProvider.GetRequiredService(); var pwdRemindUpdateTime = sysUser.PwdRemindUpdateTime;//获取上次提醒修改密码时间 - var loginPolicy = await configService.GetListByCategory(CateGoryConst.Config_PWD_POLICY);//获取密码策略 + var loginPolicy = await configService.GetConfigsByCategory(CateGoryConst.CONFIG_PWD_POLICY);//获取密码策略 //获取用户token列表 - var tokenInfos = _simpleCacheService.HashGetOne>(CacheConst.Cache_UserToken, sysUser.Id.ToString()); + var tokenInfos = _simpleCacheService.HashGetOne>(CacheConst.CACHE_USER_TOKEN, sysUser.Id.ToString()); var userToken = tokenInfos.Where(it => it.Token == loginEvent.Token).FirstOrDefault(); if (userToken != null) { @@ -54,34 +65,35 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton //如果上次修改密码时间为空 if (pwdRemindUpdateTime == null) { - var pwdUpdateDefault = loginPolicy.First(x => x.ConfigKey == DevConfigConst.PWD_UPDATE_DEFAULT).ConfigValue.ToBoolean();//获取初始化提醒 + var pwdUpdateDefault = loginPolicy.First(x => x.ConfigKey == SysConfigConst.PWD_UPDATE_DEFAULT).ConfigValue.ToBoolean();//获取初始化提醒 //如果密码初始化提醒为true if (pwdUpdateDefault) { - await messageService.Send(new MessageSendInput() + await messageService.Add(new MessageSendInput { Subject = subject, - Content = $"请及时修改初始密码", - Category = CateGoryConst.Message_INFORM, - ReceiverIdList = new List() { sysUser.Id } + Content = "请及时修改初始密码", + Category = CateGoryConst.MESSAGE_INFORM, + ReceiverIdList = new List { sysUser.Id } }); } sysUser.PwdRemindUpdateTime = DateTime.Now;//设置提醒时密码时间为当前时间 } else { - var pwdRemind = loginPolicy.First(x => x.ConfigKey == DevConfigConst.PWD_REMIND).ConfigValue.ToBoolean();//获取密码提醒天数 + var pwdRemind = loginPolicy.First(x => x.ConfigKey == SysConfigConst.PWD_REMIND).ConfigValue.ToBoolean();//获取密码提醒天数 if (pwdRemind) { - var pwdRemindDay = loginPolicy.First(x => x.ConfigKey == DevConfigConst.PWD_REMIND_DAY).ConfigValue.ToInt();//获取密码提醒时间 + var pwdRemindDay = loginPolicy.First(x => x.ConfigKey == SysConfigConst.PWD_REMIND_DAY).ConfigValue.ToInt();//获取密码提醒时间 if (DateTime.Now - pwdRemindUpdateTime > TimeSpan.FromDays(pwdRemindDay)) { - await messageService.Send(new MessageSendInput() + await messageService.Add(new MessageSendInput { Subject = subject, Content = $"已超过{pwdRemindDay}天未修改密码,请及时修改密码", - Category = CateGoryConst.Message_INFORM, - ReceiverIdList = new List() { sysUser.Id } + Category = CateGoryConst.MESSAGE_INFORM, + SendWay = SysDictConst.SEND_WAY_NOW, + ReceiverInfo = new List { new ReceiverInfo { Id = sysUser.Id, Name = sysUser.Name } } }); } sysUser.PwdRemindUpdateTime = DateTime.Now;//设置提醒时密码时间为当前时间,避免重复提醒 @@ -89,7 +101,7 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton } } - #endregion + #endregion 登录/密码策略 #region 重新赋值属性,设置本次登录信息为最新的信息 @@ -97,7 +109,7 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton sysUser.LastLoginDevice = sysUser.LatestLoginDevice; sysUser.LastLoginIp = sysUser.LatestLoginIp; sysUser.LastLoginTime = sysUser.LatestLoginTime; - sysUser.LatestLoginAddress = LoginAddress; + sysUser.LatestLoginAddress = loginAddress; sysUser.LatestLoginDevice = loginEvent.Device.ToString(); sysUser.LatestLoginIp = loginEvent.Ip; sysUser.LatestLoginTime = loginEvent.DateTime; @@ -117,8 +129,7 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton it.LatestLoginTime, LastUpdatePwdTime = it.PwdRemindUpdateTime }).ExecuteCommandAsync() > 0) - _simpleCacheService.HashAdd(SystemConst.Cache_SysUser, sysUser.Id.ToString(), sysUser);//更新Redis信息 - + _simpleCacheService.HashAdd(SystemConst.CACHE_SYS_USER, sysUser.Id.ToString(), sysUser);//更新Redis信息 await Task.CompletedTask; } @@ -128,7 +139,7 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton /// /// /// - [EventSubscribe(EventSubscriberConst.LoginOutB)] + [EventSubscribe(EventSubscriberConst.LOGIN_OUT_B)] public async Task LoginOut(EventHandlerExecutingContext context) { _ = (LoginEvent)context.Source.Payload;//获取参数 @@ -143,28 +154,12 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton { try { - var ipInfo = IpTool.Search(ip); - var LoginAddressList = new List() { ipInfo.Country, ipInfo.Province, ipInfo.City, ipInfo.NetworkOperator };//定义登录地址列表 - var LoginAddress = string.Join("|", LoginAddressList.Where(it => it != "0").ToList());//过滤掉0的信息并用|连接成字符串 - return LoginAddress; + var ipInfo = _searcher.Search(ip).Replace("0|", "");//解析ip并格式化 + return ipInfo; } catch { return "未知"; } } - - /// - /// 获取通知服务 - /// - /// - private INoticeService GetNoticeService() - { - // 获取插件选项 - var pluginsOptions = App.GetOptions(); - //根据通知类型获取对应的服务 - var noticeComponent = pluginsOptions.NoticeComponent.ToString().ToLower(); - var noticeService = _namedServiceProvider.GetService(noticeComponent);//获取服务 - return noticeService; - } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Const/EventSubscriberConst.cs b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Const/EventSubscriberConst.cs index e8a5bfee332dd7ef01edb048134e55bc8efffbe2..514b70e33cfe54bf533c04fa114a65a09bd9b7f8 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Const/EventSubscriberConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Const/EventSubscriberConst.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 事件总线常量 @@ -10,12 +20,12 @@ public class EventSubscriberConst /// /// B端登录 /// - public const string LoginB = "B端登录"; + public const string LOGIN_B = "B端登录"; /// /// B端登录 /// - public const string LoginOutB = "B端登出"; + public const string LOGIN_OUT_B = "B端登出"; #endregion AuthEventSubscriber @@ -24,7 +34,17 @@ public class EventSubscriberConst /// /// 清除用户缓存 /// - public const string ClearUserCache = "清除用户缓存"; + public const string CLEAR_USER_CACHE = "清除用户缓存"; + + /// + /// 清除组织下用户Token + /// + public const string CLEAR_ORG_TOKEN = "清除组织下用户Token"; + + /// + /// 清除模块下用户Token + /// + public const string CLEAR_MODULE_TOKEN = "清除模块下用户Token"; #endregion UserEventSubscriber @@ -33,12 +53,12 @@ public class EventSubscriberConst /// /// 通知用户下线 /// - public const string UserLoginOut = "通知用户下线"; + public const string USER_LOGIN_OUT = "通知用户下线"; /// /// 新消息 /// - public const string NewMessage = "新消息"; + public const string NEW_MESSAGE = "新消息"; #endregion NoticeEventSubscriber -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Dto/LoginEvent.cs b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Dto/LoginEvent.cs index b8eacfc054a5816febd5d01380e642e6d28d778a..7781fa2f77982cf425876d3bd9e66de5b8c833ea 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Dto/LoginEvent.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Dto/LoginEvent.cs @@ -1,4 +1,14 @@ -using UAParser; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using UAParser; namespace SimpleAdmin.System; @@ -17,7 +27,6 @@ public class LoginEvent /// public SysUser SysUser { get; set; } - /// /// Ip地址 /// @@ -26,7 +35,7 @@ public class LoginEvent /// /// 登录设备 /// - public AuthDeviceTypeEumu Device { get; set; } + public AuthDeviceTypeEnum Device { get; set; } /// /// Tokens @@ -42,4 +51,4 @@ public class LoginEvent /// 时间 /// public DateTime DateTime = DateTime.Now; -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Dto/NoticeEvent.cs b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Dto/NoticeEvent.cs index 442bcc682da996d78fc5c7ea2f14c1e67732fed5..dbf2f56fcf137bbda34fabfc7e9107bfa129a4d6 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Dto/NoticeEvent.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Dto/NoticeEvent.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 用户登出事件 @@ -28,12 +38,17 @@ public class UserLoginOutEvent public class NewMessageEvent { /// - /// 用户Id + /// 消息Id /// - public List UserIds { get; set; } + public long Id { get; set; } /// - /// 内容 + /// 发送方式 /// - public string Message { get; set; } = "收到一条新的消息!"; -} \ No newline at end of file + public string SendWay { get; set; } + + /// + /// 发送时间 + /// + public DateTime SendTime { get; set; } +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubsciber.cs b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubscriber.cs similarity index 39% rename from api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubsciber.cs rename to api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubscriber.cs index c92caffd82f97869f62d026461d474acbba9fc82..9f3b839325db604078deb8bb5fa70d7e79b26a53 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubsciber.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubscriber.cs @@ -1,24 +1,35 @@ -using SimpleAdmin.Plugin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using Microsoft.Extensions.Options; namespace SimpleAdmin.System; /// /// 通知事件总线 /// -public class NoticeEventSubsciber : IEventSubscriber, ISingleton +public class NoticeEventSubscriber : IEventSubscriber, ISingleton { private readonly ISimpleCacheService _simpleCacheService; - private readonly INamedServiceProvider _namedServiceProvider; - public IServiceScopeFactory _scopeFactory { get; } + private readonly IServiceScopeFactory _scopeFactory; + private readonly bool _useMessageCenter; private readonly SqlSugarScope _db; - public NoticeEventSubsciber(ISimpleCacheService simpleCacheService, IServiceScopeFactory scopeFactory, INamedServiceProvider namedServiceProvider) + public NoticeEventSubscriber(ISimpleCacheService simpleCacheService, IServiceScopeFactory scopeFactory, + IOptionsMonitor options) { - _db = DbContext.Db; + _db = DbContext.DB; _simpleCacheService = simpleCacheService; _scopeFactory = scopeFactory; - _namedServiceProvider = namedServiceProvider; + _useMessageCenter = options.CurrentValue.UseMessageCenter; } /// @@ -26,7 +37,7 @@ public class NoticeEventSubsciber : IEventSubscriber, ISingleton /// /// /// - [EventSubscribe(EventSubscriberConst.UserLoginOut)] + [EventSubscribe(EventSubscriberConst.USER_LOGIN_OUT)] public async Task UserLoginOut(EventHandlerExecutingContext context) { var loginEvent = (UserLoginOutEvent)context.Source.Payload;//获取参数 @@ -37,7 +48,6 @@ public class NoticeEventSubsciber : IEventSubscriber, ISingleton { clientIds.AddRange(it.ClientIds); }); - await GetNoticeService().UserLoginOut(loginEvent.UserId, clientIds, loginEvent.Message);//发送消息 } /// @@ -45,28 +55,45 @@ public class NoticeEventSubsciber : IEventSubscriber, ISingleton /// /// /// - [EventSubscribe(EventSubscriberConst.NewMessage)] + [EventSubscribe(EventSubscriberConst.NEW_MESSAGE)] public async Task NewMessage(EventHandlerExecutingContext context) { var newMessageEvent = (NewMessageEvent)context.Source.Payload;//获取参数 - - var clientIds = new List(); - //获取用户token列表 - var tokenInfos = _simpleCacheService.HashGet>(CacheConst.Cache_UserToken, newMessageEvent.UserIds.ToArray()); - tokenInfos.ForEach(it => + var messageId = newMessageEvent.Id; + //如果启用了通知中心 + if (_useMessageCenter) { - if (it != null) + if (newMessageEvent.SendWay == SysDictConst.SEND_WAY_NOW) + { + //立即发送 + await SendMessage(messageId); + } + else { - it = it.Where(it => it.TokenTimeout > DateTime.Now).ToList();//去掉登录超时的 - //遍历token - it.ForEach(it => + //延迟发送 + var sendTime = newMessageEvent.SendTime; + //计算延迟时间 + var delay = (int)(sendTime - DateTime.Now).TotalSeconds; + if (delay > 0) { - clientIds.AddRange(it.ClientIds);//添加到客户端ID列表 - }); + await SendMessage(messageId, delay); + } + else + { + await SendMessage(messageId); + } } - }); + } + } - await GetNoticeService().NewMesage(newMessageEvent.UserIds, clientIds, newMessageEvent.Message);//发送消息 + /// + /// 发送消息 + /// + /// 消息id + /// 延迟 + private async Task SendMessage(long messageId, int delay = 0) + { + _simpleCacheService.AddDelayQueue(CacheConst.CACHE_NOTIFICATION, messageId, delay); } /// @@ -80,18 +107,4 @@ public class NoticeEventSubsciber : IEventSubscriber, ISingleton using var scope = _scopeFactory.CreateScope(); return scope.ServiceProvider.GetRequiredService(); } - - /// - /// 获取通知服务 - /// - /// - private INoticeService GetNoticeService() - { - // 获取插件选项 - var pluginsOptions = App.GetOptions(); - //根据通知类型获取对应的服务 - var noticeComponent = pluginsOptions.NoticeComponent.ToString().ToLower(); - var noticeService = _namedServiceProvider.GetService(noticeComponent);//获取服务 - return noticeService; - } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/UserEventSubscriber.cs b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/UserEventSubscriber.cs index 9acbea16c0e63175c72a2774af5becbd90f3eecc..4a0d69338326fc03fa1bdfac3c8089fc3c6798a8 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/UserEventSubscriber.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/UserEventSubscriber.cs @@ -1,4 +1,17 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using NetTaste; +using SimpleRedis; + +namespace SimpleAdmin.System; /// /// 用户模块事件总线 @@ -6,10 +19,13 @@ public class UserEventSubscriber : IEventSubscriber, ISingleton { private readonly IServiceProvider _services; + private readonly ISimpleCacheService _simpleCacheService; + - public UserEventSubscriber(IServiceProvider services) + public UserEventSubscriber(IServiceProvider services, ISimpleCacheService simpleCacheService) { - this._services = services; + _services = services; + _simpleCacheService = simpleCacheService; } /// @@ -17,7 +33,7 @@ public class UserEventSubscriber : IEventSubscriber, ISingleton /// /// /// - [EventSubscribe(EventSubscriberConst.ClearUserCache)] + [EventSubscribe(EventSubscriberConst.CLEAR_USER_CACHE)] public async Task DeleteUserCacheByRoleIds(EventHandlerExecutingContext context) { var roleIds = (List)context.Source.Payload;//获取角色ID @@ -27,14 +43,66 @@ public class UserEventSubscriber : IEventSubscriber, ISingleton // 解析角色服务 var relationService = scope.ServiceProvider.GetRequiredService(); //获取用户和角色关系 - var relations = await relationService.GetRelationListByTargetIdListAndCategory(roleIds.Select(it => it.ToString()).ToList(), CateGoryConst.Relation_SYS_USER_HAS_ROLE); + var relations = await relationService.GetRelationListByTargetIdListAndCategory(roleIds.Select(it => it.ToString()).ToList(), + CateGoryConst.RELATION_SYS_USER_HAS_ROLE); if (relations.Count > 0) { var userIds = relations.Select(it => it.ObjectId).ToList();//用户ID列表 - // 解析用户服务 - var userService = scope.ServiceProvider.GetRequiredService(); - //从redis中删除 + if (userIds.Count > 0) + { + // 解析用户服务 + var userService = scope.ServiceProvider.GetRequiredService(); + //从redis中删除 + userService.DeleteUserFromRedis(userIds); + } + } + } + + /// + /// 根据机构ID列表清除用户token + /// + /// + [EventSubscribe(EventSubscriberConst.CLEAR_ORG_TOKEN)] + public async Task DeleteUserTokenByOrgIds(EventHandlerExecutingContext context) + { + var orgIds = (List)context.Source.Payload;//获取机构ID + // 创建新的作用域 + using var scope = _services.CreateScope(); + // 获取用户ID列表 + var userIds = await DbContext.DB.QueryableWithAttr().Where(it => orgIds.Contains(it.OrgId)).Select(it => it.Id).ToListAsync(); + //从redis中删除所属机构的用户token + _simpleCacheService.HashDel>(CacheConst.CACHE_USER_TOKEN, userIds.Select(it => it.ToString()).ToArray()); + } + + /// + /// 根据模块ID列表清除用户token + /// + /// + [EventSubscribe(EventSubscriberConst.CLEAR_MODULE_TOKEN)] + public async Task DeleteUserTokenByModuleId(EventHandlerExecutingContext context) + { + var moduleId = (long)context.Source.Payload;//获取机构ID + // 创建新的作用域 + using var scope = _services.CreateScope(); + // 解析关系服务 + var relationService = scope.ServiceProvider.GetRequiredService(); + var roleModuleRelations = + await relationService.GetRelationListByTargetIdAndCategory(moduleId.ToString(), CateGoryConst.RELATION_SYS_ROLE_HAS_MODULE);//角色模块关系 + var userModuleRelations = + await relationService.GetRelationListByTargetIdAndCategory(moduleId.ToString(), CateGoryConst.RELATION_SYS_USER_HAS_MODULE);//用户模块关系 + var userIds = userModuleRelations.Select(it => it.ObjectId).ToList();//用户ID列表 + var roleIds = roleModuleRelations.Select(it => it.ObjectId).ToList();//角色ID列表 + var userRoleRelations = await relationService.GetRelationListByTargetIdListAndCategory(roleIds.Select(it => it.ToString()).ToList(), + CateGoryConst.RELATION_SYS_USER_HAS_ROLE);//用户角色关系 + userIds.AddRange(userRoleRelations.Select(it => it.ObjectId).ToList());//添加用户ID列表 + // 解析用户服务 + var userService = scope.ServiceProvider.GetRequiredService(); + if (userIds.Count > 0) + { + //从redis中删除用户信息 userService.DeleteUserFromRedis(userIds); + //从redis中删除用户token + _simpleCacheService.HashDel>(CacheConst.CACHE_USER_TOKEN, userIds.Select(it => it.ToString()).ToArray()); } } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationMsgUser.cs b/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationMsgUser.cs index f1f2928475ac6acb0726fa6245dad499975e5ccc..c09f45ffac45bfcb7dd336542c8d5d6659d47317 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationMsgUser.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationMsgUser.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 站内信与接收用户拓展 @@ -10,4 +20,4 @@ public class RelationMsgUser /// 是否已读 /// public bool Read { get; set; } = false; -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRolePermission.cs b/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRolePermission.cs index 3048d9ff1357a559fc837164f4ea0906752fc36e..993d93ae8a01da140cc65dc297c4d72eac5c3957 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRolePermission.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRolePermission.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// SYS_ROLE_HAS_PERMISSION @@ -20,4 +30,4 @@ public class RelationRolePermission /// 接口Url /// public string ApiUrl { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRoleResource.cs b/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRoleResource.cs new file mode 100644 index 0000000000000000000000000000000000000000..bd1899c405ef6c82be0509fdf7a7574af60456a1 --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRoleResource.cs @@ -0,0 +1,28 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; + +/// +/// SYS_ROLE_HAS_RESOURCE +/// 角色有哪些资源扩展 +/// +public class RelationRoleResource +{ + /// + /// 菜单ID + /// + public long MenuId { get; set; } + + /// + /// 按钮信息 + /// + public List ButtonInfo { get; set; } = new List(); +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRoleResuorce.cs b/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRoleResuorce.cs deleted file mode 100644 index 3056e46ea555e554541d1d1d9b9161f003ff72ff..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRoleResuorce.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace SimpleAdmin.System; - -/// -/// SYS_ROLE_HAS_RESOURCE -/// 角色有哪些资源扩展 -/// -public class RelationRoleResuorce -{ - /// - /// 菜单ID - /// - public long MenuId { get; set; } - - /// - /// 按钮信息 - /// - public List ButtonInfo { get; set; } = new List(); -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationUserSchedule.cs b/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationUserSchedule.cs index ba0e6c68175a14e6e44e79d685046106e2031c79..d95de94b25f3508d5034aeb1550ff1ca4c9ce090 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationUserSchedule.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationUserSchedule.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// SYS_USER_SCHEDULE_DATA @@ -30,4 +40,4 @@ public class RelationUserSchedule /// 用户姓名 /// public string ScheduleUserName { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationUserWorkBench.cs b/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationUserWorkBench.cs index 6fce18a3ec892b431eb0d2a0c344777658b6ea0d..ef615c17e2e5ad4e5fc35202023a3fece15ea0dd 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationUserWorkBench.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationUserWorkBench.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// SYS_USER_WORKBENCH_DATA @@ -36,4 +46,4 @@ public class WorkBenchShortcut /// 路由地址 /// public string Path { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/GlobalUsings.cs b/api/SimpleAdmin/SimpleAdmin.System/GlobalUsings.cs index 92bec64afa6beacfd56544bb197a9d0f274422aa..7d323f1943525d81241c14037a6d6f6faa05126c 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/GlobalUsings.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/GlobalUsings.cs @@ -1,27 +1,41 @@ -global using Furion; -global using Furion.DataEncryption; -global using Furion.DependencyInjection; -global using Furion.EventBus; -global using Furion.FriendlyException; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +global using MoYu; +global using MoYu.DataEncryption; +global using MoYu.DependencyInjection; +global using MoYu.EventBus; +global using MoYu.FriendlyException; global using Magicodes.ExporterAndImporter.Core; +global using Magicodes.ExporterAndImporter.Core.Models; global using Magicodes.ExporterAndImporter.Excel; global using Mapster; global using Masuit.Tools; global using Microsoft.AspNetCore.Http; global using Microsoft.AspNetCore.Mvc; -global using Microsoft.CodeAnalysis; global using Microsoft.Extensions.DependencyInjection; global using Microsoft.Extensions.Logging; global using NewLife.Serialization; global using OfficeOpenXml.Table; +global using SimpleAdmin.Cache; global using SimpleAdmin.Core; global using SimpleAdmin.Core.Utils; -global using SimpleAdmin.Cache; global using SimpleAdmin.SqlSugar; global using SimpleTool; global using SqlSugar; global using System.ComponentModel.DataAnnotations; global using System.Reflection; global using System.Text; -global using Magicodes.ExporterAndImporter.Core.Models; -global using System.Web; \ No newline at end of file +global using System.Web; +global using SkiaSharp; +global using System.Runtime.InteropServices; +global using Microsoft.AspNetCore.Builder; +global using Microsoft.AspNetCore.Hosting; +global using Newtonsoft.Json.Linq; diff --git a/api/SimpleAdmin/SimpleAdmin.System/Mapper.cs b/api/SimpleAdmin/SimpleAdmin.System/Mapper.cs index 4da317cce5d4a855b0d92b614ac7665cfde698c8..7f4c027a99c3434f587377064234a16d7bd9b8fd 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Mapper.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Mapper.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 对象映射 @@ -8,4 +18,4 @@ public class Mapper : IRegister public void Register(TypeAdapterConfig config) { } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Options/SystemSettingsOptions.cs b/api/SimpleAdmin/SimpleAdmin.System/Options/SystemSettingsOptions.cs index 8f9796079e7247ea416c4e15ed1e2a688d9c22d0..2586f37d199ba50d173fd6128cf991d7a8d2eaab 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Options/SystemSettingsOptions.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Options/SystemSettingsOptions.cs @@ -1,4 +1,14 @@ -using Furion.ConfigurableOptions; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using MoYu.ConfigurableOptions; namespace SimpleAdmin.System; @@ -7,4 +17,13 @@ namespace SimpleAdmin.System; /// public class SystemSettingsOptions : BaseOptions, IConfigurableOptions { -} \ No newline at end of file + /// + /// 超级管理员可以看到全部数据 + /// + public bool SuperAdminViewAllData { get; set; } + + /// + /// 启用通知中心 + /// + public bool UseMessageCenter { get; set; } +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Oss/MinioUtils.cs b/api/SimpleAdmin/SimpleAdmin.System/Oss/MinioUtils.cs index eb455b0dcd92e9e21ab933ef775bf6dc69e04964..75608154eb416e9e855e19e810b8e3defb1f4bcb 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Oss/MinioUtils.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Oss/MinioUtils.cs @@ -1,4 +1,14 @@ -using Minio; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using Minio; using Minio.Exceptions; namespace SimpleAdmin.System; @@ -8,15 +18,15 @@ namespace SimpleAdmin.System; /// public class MinioUtils : ITransient { - public MinioClient minioClient; - private string defaultBucketName; - private string defaultEndPoint; - private string defaultPrefix = "http://"; + public MinioClient MinioClient; + private string _defaultBucketName; + private string _defaultEndPoint; + private string _defaultPrefix = "http://"; private readonly IConfigService _configService; public MinioUtils(IConfigService configService) { - this._configService = configService; + _configService = configService; InitClient(); } @@ -26,28 +36,29 @@ public class MinioUtils : ITransient /// private async void InitClient() { - var configs = await _configService.GetListByCategory(CateGoryConst.Config_FILE_MINIO);//获取minio配置 - var accessKey = configs.Where(it => it.ConfigKey == DevConfigConst.FILE_MINIO_ACCESS_KEY).FirstOrDefault();//MINIO文件AccessKey - var secretKey = configs.Where(it => it.ConfigKey == DevConfigConst.FILE_MINIO_SECRET_KEY).FirstOrDefault();//MINIO文件SecetKey - var endPoint = configs.Where(it => it.ConfigKey == DevConfigConst.FILE_MINIO_END_POINT).FirstOrDefault();//MINIO文件EndPoint - var bucketName = configs.Where(it => it.ConfigKey == DevConfigConst.FILE_MINIO_DEFAULT_BUCKET_NAME).FirstOrDefault();//MINIO文件默认存储桶 + var configs = await _configService.GetConfigsByCategory(CateGoryConst.CONFIG_FILE_MINIO);//获取minio配置 + var accessKey = configs.Where(it => it.ConfigKey == SysConfigConst.FILE_MINIO_ACCESS_KEY).FirstOrDefault();//MINIO文件AccessKey + var secretKey = configs.Where(it => it.ConfigKey == SysConfigConst.FILE_MINIO_SECRET_KEY).FirstOrDefault();//MINIO文件SecretKey + var endPoint = configs.Where(it => it.ConfigKey == SysConfigConst.FILE_MINIO_END_POINT).FirstOrDefault();//MINIO文件EndPoint + var bucketName = configs.Where(it => it.ConfigKey == SysConfigConst.FILE_MINIO_DEFAULT_BUCKET_NAME).FirstOrDefault();//MINIO文件默认存储桶 if (accessKey == null || secretKey == null || endPoint == null || bucketName == null) { - throw Oops.Oh($"MINIO客户端未正确配置"); + throw Oops.Oh("MINIO客户端未正确配置"); } try { //默认值赋值 - defaultBucketName = bucketName.ConfigValue; - defaultEndPoint = endPoint.ConfigValue; - if (defaultEndPoint.ToLower().StartsWith("http")) + _defaultBucketName = bucketName.ConfigValue; + _defaultEndPoint = endPoint.ConfigValue; + if (_defaultEndPoint.ToLower().StartsWith("http")) { - var point = defaultEndPoint.Split("//").ToList();//分割、 - defaultPrefix = $"{point[0]}//"; - defaultEndPoint = point[1]; + var point = _defaultEndPoint.Split("//").ToList();//分割、 + _defaultPrefix = $"{point[0]}//"; + _defaultEndPoint = point[1]; } - this.minioClient = new MinioClient().WithEndpoint(defaultEndPoint).WithCredentials(accessKey.ConfigValue, secretKey.ConfigValue).Build();//初始化monio对象 - this.minioClient.WithTimeout(5000);//超时时间 + MinioClient = new MinioClient().WithEndpoint(_defaultEndPoint).WithCredentials(accessKey.ConfigValue, secretKey.ConfigValue) + .Build();//初始化minio对象 + MinioClient.WithTimeout(5000);//超时时间 } catch (Exception ex) { @@ -67,17 +78,18 @@ public class MinioUtils : ITransient try { using var fileStream = file.OpenReadStream();//获取文件流 - PutObjectArgs putObjectArgs = new PutObjectArgs().WithBucket(defaultBucketName).WithObject(objectName).WithStreamData(fileStream).WithObjectSize(file.Length).WithContentType(contentType); - await minioClient.PutObjectAsync(putObjectArgs); - return $"{defaultPrefix}{defaultEndPoint}/{defaultBucketName}/{objectName}";//默认http + var putObjectArgs = new PutObjectArgs().WithBucket(_defaultBucketName).WithObject(objectName).WithStreamData(fileStream) + .WithObjectSize(file.Length).WithContentType(contentType); + await MinioClient.PutObjectAsync(putObjectArgs); + return $"{_defaultPrefix}{_defaultEndPoint}/{_defaultBucketName}/{objectName}";//默认http } catch (MinioException e) { - throw Oops.Oh($"上传文件失败!", e); + throw Oops.Oh("上传文件失败!", e); } catch (Exception e) { - throw Oops.Oh($"上传文件失败!", e); + throw Oops.Oh("上传文件失败!", e); } } @@ -91,15 +103,13 @@ public class MinioUtils : ITransient var stream = new MemoryStream(); try { - var getObjectArgs = new GetObjectArgs().WithBucket(defaultBucketName) - .WithObject(objectName) - .WithCallbackStream(cb => - { - cb.CopyTo(stream); - }); - await minioClient.GetObjectAsync(getObjectArgs); + var getObjectArgs = new GetObjectArgs().WithBucket(_defaultBucketName).WithObject(objectName).WithCallbackStream(cb => + { + cb.CopyTo(stream); + }); + await MinioClient.GetObjectAsync(getObjectArgs); - //System.InvalidOperationException: Response Content-Length mismatch: too few bytes written (0 of 30788) + //UserCenter.InvalidOperationException: Response Content-Length mismatch: too few bytes written (0 of 30788) if (stream.CanSeek) { stream.Seek(0, SeekOrigin.Begin); @@ -108,11 +118,11 @@ public class MinioUtils : ITransient } catch (MinioException e) { - throw Oops.Oh($"下载文件失败!", e); + throw Oops.Oh("下载文件失败!", e); } catch (Exception e) { - throw Oops.Oh($"下载文件失败!", e); + throw Oops.Oh("下载文件失败!", e); } } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/BatchEditConfigSeedData.cs b/api/SimpleAdmin/SimpleAdmin.System/SeedData/BatchEditConfigSeedData.cs deleted file mode 100644 index 126d72789a84f497f139cea448eebc9bab43d56e..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/BatchEditConfigSeedData.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace SimpleAdmin.System; - -/// -/// 批量修改字段种子数据 -/// -public class BatchEditConfigSeedData : ISqlSugarEntitySeedData -{ - public IEnumerable SeedData() - { - return SeedDataUtil.GetSeedData("seed_batch_edit_config.json"); - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/BatchEditSeedData.cs b/api/SimpleAdmin/SimpleAdmin.System/SeedData/BatchEditSeedData.cs deleted file mode 100644 index 31615dc4a65cfd1e93f2b29d80258b8d41f6a66a..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/BatchEditSeedData.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace SimpleAdmin.System; - -/// -/// 批量修改配置种子数据 -/// -public class BatchEditSeedData : ISqlSugarEntitySeedData -{ - public IEnumerable SeedData() - { - return SeedDataUtil.GetSeedData("seed_batch_edit.json"); - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/DevConfigSeedData.cs b/api/SimpleAdmin/SimpleAdmin.System/SeedData/DevConfigSeedData.cs deleted file mode 100644 index e090ff7cae1ca4f5decb7d643c9a6a13826df15a..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/DevConfigSeedData.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace SimpleAdmin.System; - -/// -/// 系统配置种子数据 -/// -public class DevConfigSeedData : ISqlSugarEntitySeedData -{ - public IEnumerable SeedData() - { - return SeedDataUtil.GetSeedData("seed_dev_config.json"); - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/DevDictSeedData.cs b/api/SimpleAdmin/SimpleAdmin.System/SeedData/DevDictSeedData.cs deleted file mode 100644 index 007cbe89bdde719ea17fb76ae0fdb91091dc48ad..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/DevDictSeedData.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace SimpleAdmin.System; - -/// -/// 字典表种子数据 -/// -public class DevDictSeedData : ISqlSugarEntitySeedData -{ - public IEnumerable SeedData() - { - return SeedDataUtil.GetSeedData("seed_dev_dict.json"); - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_batch_edit.json b/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_batch_edit.json deleted file mode 100644 index f62b0535c3b4377ec340a62f4d88aecd53d18c3a..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_batch_edit.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "RECORDS": [ - { - "Id": "395358682767429", - "Code": "sysUser", - "ConfigId": "SimpleAdmin", - "EntityName": "SysUser", - "TableName": "sys_user", - "TableDescription": "用户信息表", - "ExtJson": "" - }, - { - "Id": "395711906775109", - "Code": "bizUser", - "ConfigId": "SimpleAdmin", - "EntityName": "SysUser", - "TableName": "sys_user", - "TableDescription": "用户信息表", - "ExtJson": "" - } - ] -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_batch_edit_config.json b/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_batch_edit_config.json deleted file mode 100644 index 7def40b3e136318ff4e9af8fa37abd6348eab6b6..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_batch_edit_config.json +++ /dev/null @@ -1,1324 +0,0 @@ -{ - "RECORDS": [ - { - "Id": "395707076743237", - "UId": "395358682767429", - "ColumnName": "Avatar", - "ColumnComment": "头像", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076759621", - "UId": "395358682767429", - "ColumnName": "Signature", - "ColumnComment": "签名", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763717", - "UId": "395358682767429", - "ColumnName": "Account", - "ColumnComment": "账号", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763718", - "UId": "395358682767429", - "ColumnName": "Password", - "ColumnComment": "密码", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763719", - "UId": "395358682767429", - "ColumnName": "Name", - "ColumnComment": "姓名", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763720", - "UId": "395358682767429", - "ColumnName": "Nickname", - "ColumnComment": "昵称", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763721", - "UId": "395358682767429", - "ColumnName": "Gender", - "ColumnComment": "性别", - "DataType": "radio_dict", - "DictTypeCode": "GENDER", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "ENABLE" - }, - { - "Id": "395707076763722", - "UId": "395358682767429", - "ColumnName": "Birthday", - "ColumnComment": "出生日期", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763723", - "UId": "395358682767429", - "ColumnName": "Nation", - "ColumnComment": "民族", - "DataType": "select_dict", - "DictTypeCode": "NATION", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "ENABLE" - }, - { - "Id": "395707076763724", - "UId": "395358682767429", - "ColumnName": "HomeAddress", - "ColumnComment": "家庭住址", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763725", - "UId": "395358682767429", - "ColumnName": "MailingAddress", - "ColumnComment": "通信地址", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763726", - "UId": "395358682767429", - "ColumnName": "IdCardType", - "ColumnComment": "证件类型", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763727", - "UId": "395358682767429", - "ColumnName": "IdCardNumber", - "ColumnComment": "证件号码", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763728", - "UId": "395358682767429", - "ColumnName": "CultureLevel", - "ColumnComment": "文化程度", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763729", - "UId": "395358682767429", - "ColumnName": "PoliticalOutlook", - "ColumnComment": "政治面貌", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763730", - "UId": "395358682767429", - "ColumnName": "College", - "ColumnComment": "毕业院校", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763731", - "UId": "395358682767429", - "ColumnName": "Education", - "ColumnComment": "学历", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763732", - "UId": "395358682767429", - "ColumnName": "EduLength", - "ColumnComment": "学制", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763733", - "UId": "395358682767429", - "ColumnName": "Degree", - "ColumnComment": "学位", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763734", - "UId": "395358682767429", - "ColumnName": "Phone", - "ColumnComment": "手机", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763735", - "UId": "395358682767429", - "ColumnName": "Email", - "ColumnComment": "邮箱", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763736", - "UId": "395358682767429", - "ColumnName": "HomeTel", - "ColumnComment": "家庭电话", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763737", - "UId": "395358682767429", - "ColumnName": "OfficeTel", - "ColumnComment": "办公电话", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763738", - "UId": "395358682767429", - "ColumnName": "EmergencyPhone", - "ColumnComment": "紧急联系人电话", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763739", - "UId": "395358682767429", - "ColumnName": "EmergencyAddress", - "ColumnComment": "紧急联系人地址", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763740", - "UId": "395358682767429", - "ColumnName": "EmpNo", - "ColumnComment": "员工编号", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISENABLE" - }, - { - "Id": "395707076763741", - "UId": "395358682767429", - "ColumnName": "EntryDate", - "ColumnComment": "入职日期", - "DataType": "datepicker", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "ENABLE" - }, - { - "Id": "395707076763742", - "UId": "395358682767429", - "ColumnName": "OrgId", - "ColumnComment": "机构id", - "DataType": "input", - "DictTypeCode": "", - "NetType": "long", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763743", - "UId": "395358682767429", - "ColumnName": "PositionId", - "ColumnComment": "职位id", - "DataType": "input", - "DictTypeCode": "", - "NetType": "long", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763744", - "UId": "395358682767429", - "ColumnName": "PositionLevel", - "ColumnComment": "职级", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "ENABLE" - }, - { - "Id": "395707076763745", - "UId": "395358682767429", - "ColumnName": "DirectorId", - "ColumnComment": "主管id", - "DataType": "input", - "DictTypeCode": "", - "NetType": "long", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISENABLE" - }, - { - "Id": "395707076763746", - "UId": "395358682767429", - "ColumnName": "PositionJson", - "ColumnComment": "兼任信息", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763747", - "UId": "395358682767429", - "ColumnName": "LastLoginIp", - "ColumnComment": "上次登录ip", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763748", - "UId": "395358682767429", - "ColumnName": "LastLoginAddress", - "ColumnComment": "上次登录地点", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763749", - "UId": "395358682767429", - "ColumnName": "LastLoginTime", - "ColumnComment": "上次登录时间", - "DataType": "datepicker", - "DictTypeCode": "", - "NetType": "DateTime", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763750", - "UId": "395358682767429", - "ColumnName": "LastLoginDevice", - "ColumnComment": "上次登录设备", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763751", - "UId": "395358682767429", - "ColumnName": "LatestLoginIp", - "ColumnComment": "最新登录ip", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763752", - "UId": "395358682767429", - "ColumnName": "LatestLoginAddress", - "ColumnComment": "最新登录地点", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763753", - "UId": "395358682767429", - "ColumnName": "LatestLoginTime", - "ColumnComment": "最新登录时间", - "DataType": "datepicker", - "DictTypeCode": "", - "NetType": "DateTime", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763754", - "UId": "395358682767429", - "ColumnName": "LatestLoginDevice", - "ColumnComment": "最新登录设备", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763755", - "UId": "395358682767429", - "ColumnName": "UserStatus", - "ColumnComment": "用户状态", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763756", - "UId": "395358682767429", - "ColumnName": "SortCode", - "ColumnComment": "排序码", - "DataType": "inputNumber", - "DictTypeCode": "", - "NetType": "int", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763757", - "UId": "395358682767429", - "ColumnName": "NativePlace", - "ColumnComment": "籍贯", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395707076763758", - "UId": "395358682767429", - "ColumnName": "EmergencyContact", - "ColumnComment": "紧急联系人", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816069", - "UId": "395711906775109", - "ColumnName": "Avatar", - "ColumnComment": "头像", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816070", - "UId": "395711906775109", - "ColumnName": "Signature", - "ColumnComment": "签名", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816071", - "UId": "395711906775109", - "ColumnName": "Account", - "ColumnComment": "账号", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816072", - "UId": "395711906775109", - "ColumnName": "Password", - "ColumnComment": "密码", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816073", - "UId": "395711906775109", - "ColumnName": "Name", - "ColumnComment": "姓名", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816074", - "UId": "395711906775109", - "ColumnName": "Nickname", - "ColumnComment": "昵称", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816075", - "UId": "395711906775109", - "ColumnName": "Gender", - "ColumnComment": "性别", - "DataType": "select_dict", - "DictTypeCode": "GENDER", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "ENABLE" - }, - { - "Id": "395711906816076", - "UId": "395711906775109", - "ColumnName": "Birthday", - "ColumnComment": "出生日期", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816077", - "UId": "395711906775109", - "ColumnName": "Nation", - "ColumnComment": "民族", - "DataType": "select_dict", - "DictTypeCode": "NATION", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "ENABLE" - }, - { - "Id": "395711906816078", - "UId": "395711906775109", - "ColumnName": "HomeAddress", - "ColumnComment": "家庭住址", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816079", - "UId": "395711906775109", - "ColumnName": "MailingAddress", - "ColumnComment": "通信地址", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816080", - "UId": "395711906775109", - "ColumnName": "IdCardType", - "ColumnComment": "证件类型", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816081", - "UId": "395711906775109", - "ColumnName": "IdCardNumber", - "ColumnComment": "证件号码", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816082", - "UId": "395711906775109", - "ColumnName": "CultureLevel", - "ColumnComment": "文化程度", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816083", - "UId": "395711906775109", - "ColumnName": "PoliticalOutlook", - "ColumnComment": "政治面貌", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816084", - "UId": "395711906775109", - "ColumnName": "College", - "ColumnComment": "毕业院校", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816085", - "UId": "395711906775109", - "ColumnName": "Education", - "ColumnComment": "学历", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816086", - "UId": "395711906775109", - "ColumnName": "EduLength", - "ColumnComment": "学制", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816087", - "UId": "395711906775109", - "ColumnName": "Degree", - "ColumnComment": "学位", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816088", - "UId": "395711906775109", - "ColumnName": "Phone", - "ColumnComment": "手机", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816089", - "UId": "395711906775109", - "ColumnName": "Email", - "ColumnComment": "邮箱", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816090", - "UId": "395711906775109", - "ColumnName": "HomeTel", - "ColumnComment": "家庭电话", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816091", - "UId": "395711906775109", - "ColumnName": "OfficeTel", - "ColumnComment": "办公电话", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816092", - "UId": "395711906775109", - "ColumnName": "EmergencyPhone", - "ColumnComment": "紧急联系人电话", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816093", - "UId": "395711906775109", - "ColumnName": "EmergencyAddress", - "ColumnComment": "紧急联系人地址", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816094", - "UId": "395711906775109", - "ColumnName": "EmpNo", - "ColumnComment": "员工编号", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816095", - "UId": "395711906775109", - "ColumnName": "EntryDate", - "ColumnComment": "入职日期", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816096", - "UId": "395711906775109", - "ColumnName": "OrgId", - "ColumnComment": "机构id", - "DataType": "input", - "DictTypeCode": "", - "NetType": "long", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816097", - "UId": "395711906775109", - "ColumnName": "PositionId", - "ColumnComment": "职位id", - "DataType": "input", - "DictTypeCode": "", - "NetType": "long", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816098", - "UId": "395711906775109", - "ColumnName": "PositionLevel", - "ColumnComment": "职级", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816099", - "UId": "395711906775109", - "ColumnName": "DirectorId", - "ColumnComment": "主管id", - "DataType": "input", - "DictTypeCode": "", - "NetType": "long", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816100", - "UId": "395711906775109", - "ColumnName": "PositionJson", - "ColumnComment": "兼任信息", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816101", - "UId": "395711906775109", - "ColumnName": "LastLoginIp", - "ColumnComment": "上次登录ip", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816102", - "UId": "395711906775109", - "ColumnName": "LastLoginAddress", - "ColumnComment": "上次登录地点", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816103", - "UId": "395711906775109", - "ColumnName": "LastLoginTime", - "ColumnComment": "上次登录时间", - "DataType": "datepicker", - "DictTypeCode": "", - "NetType": "DateTime", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816104", - "UId": "395711906775109", - "ColumnName": "LastLoginDevice", - "ColumnComment": "上次登录设备", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816105", - "UId": "395711906775109", - "ColumnName": "LatestLoginIp", - "ColumnComment": "最新登录ip", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816106", - "UId": "395711906775109", - "ColumnName": "LatestLoginAddress", - "ColumnComment": "最新登录地点", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816107", - "UId": "395711906775109", - "ColumnName": "LatestLoginTime", - "ColumnComment": "最新登录时间", - "DataType": "datepicker", - "DictTypeCode": "", - "NetType": "DateTime", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816108", - "UId": "395711906775109", - "ColumnName": "LatestLoginDevice", - "ColumnComment": "最新登录设备", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816109", - "UId": "395711906775109", - "ColumnName": "UserStatus", - "ColumnComment": "用户状态", - "DataType": "switch", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816110", - "UId": "395711906775109", - "ColumnName": "SortCode", - "ColumnComment": "排序码", - "DataType": "input", - "DictTypeCode": "", - "NetType": "int", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "ENABLE" - }, - { - "Id": "395711906816111", - "UId": "395711906775109", - "ColumnName": "NativePlace", - "ColumnComment": "籍贯", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - }, - { - "Id": "395711906816112", - "UId": "395711906775109", - "ColumnName": "EmergencyContact", - "ColumnComment": "紧急联系人", - "DataType": "input", - "DictTypeCode": "", - "NetType": "string", - "RequestUrl": "", - "RequestType": "", - "RequestLabel": "", - "RequestValue": "", - "ExtJson": "", - "Status": "DISABLED" - } - ] -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_dev_config.json b/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_config.json similarity index 90% rename from api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_dev_config.json rename to api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_config.json index 2cd6580e90ce77691f42cf09d686e5b8db18e5a4..85ed46a5fa5e1b53798b0d140989c6958a1a95ac 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_dev_config.json +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_config.json @@ -1,36 +1,106 @@ { "RECORDS": [ { - "Id": "252875263003710", - "ConfigKey": "SYS_DEFAULT_DESCRRIPTION", - "ConfigValue": "🪶SimpleAdmin是一个小而美的通用业务型后台管理系统,专为解决开发过程中的痛点难点而生。前端基于小诺2.0版本二次开发,采用Vue3+Vite+Vuex+JS,并在此基础上增加更人性化功能,后端基于.NET6/7+Furion,ORM采用Sqlsugar+单例模式,插件式开发。采用RBAC+多机构的权限管理模式,实现全网最灵活的接口级别数据权限控制,集成国密加解密,导入导出、导入导出、批量修改等常用插件。后端代码注释覆盖率>90%,并配备超牛皮的代码生成器和超详细的手摸手教学文档,非常适合二次开发。将日常开发中的业务场景和框架紧密结合,并坚持以人为本,以业务为中心,做到开箱即用,代码简洁、易扩展,注释详细,文档齐全,让你的开发少走弯路。", + "Id": "252875233003720", + "ConfigKey": "SYS_FOOTER_LINKS", + "ConfigValue": "[{\"name\":\"苏ICP备2023040827号\",\"url\":\"https://beian.miit.gov.cn/\",\"sortCode\":1}]", + "Category": "SYS_BASE", + "Remark": "底部超链接", + "SortCode": "1", + "CreateTime": "2024-1-24 10:32:12.58", + "UpdateTime": "2024-7-23 09:09:40.207", + "CreateUserId": "", + "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "" + }, + { + "Id": "252875262003737", + "ConfigKey": "SYS_TENANT_OPTIONS", + "ConfigValue": "CHOSE", "Category": "SYS_BASE", - "Remark": "系统描述", + "Remark": "多租户配置", + "SortCode": "1", + "CreateTime": "2024-1-24 10:32:12.587", + "UpdateTime": "2024-7-23 09:09:40.207", + "CreateUserId": "", + "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "" + }, + { + "Id": "252875263002722", + "ConfigKey": "SYS_ICO", + "ConfigValue": "data:image/x-icon;base64,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", + "Category": "SYS_BASE", + "Remark": "系统ICO文件", "SortCode": "1", "CreateTime": "", - "UpdateTime": "2023-6-6 09:22:59.433", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "", "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", + "Status": "" + }, + { + "Id": "252875263002737", + "ConfigKey": "SYS_WEB_STATUS", + "ConfigValue": "ENABLE", + "Category": "SYS_BASE", + "Remark": "网站开启访问", + "SortCode": "1", + "CreateTime": "2024-1-24 10:32:12.587", + "UpdateTime": "2024-7-23 09:09:40.207", + "CreateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "superAdmin" + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "" + }, + { + "Id": "252875263003710", + "ConfigKey": "SYS_WEB_CLOSE_PROMPT", + "ConfigValue": "网站维护中,暂时无法访问!本网站正在进行系统维护和技术升级,网站暂时无法访问,敬请谅解!", + "Category": "SYS_BASE", + "Remark": "网站关闭提示", + "SortCode": "1", + "CreateTime": "", + "UpdateTime": "2024-7-23 09:09:40.207", + "CreateUserId": "", + "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "" }, { "Id": "252875263003720", "ConfigKey": "SYS_DEFAULT_WORKBENCH_DATA", - "ConfigValue": "{\"shortcut\":[{\"id\":212725263003722,\"title\":\"系统首页\",\"icon\":\"home-outlined\",\"path\":\"/index\"},{\"id\":212725263003723,\"title\":\"个人中心\",\"icon\":\"appstore-outlined\",\"path\":\"/usercenter\"}]}", + "ConfigValue": "{\"shortcut\":[212725263003723,212725263003722]}", "Category": "SYS_BASE", "Remark": "系统默认工作台数据", "SortCode": "1", "CreateTime": "", - "UpdateTime": "2023-6-6 09:22:59.433", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "", "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "", - "UpdateUser": "superAdmin" + "Status": "" }, { "Id": "252875263003721", @@ -40,13 +110,14 @@ "Remark": "系统LOGO", "SortCode": "1", "CreateTime": "", - "UpdateTime": "2023-6-6 09:22:59.433", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "", "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "", - "UpdateUser": "superAdmin" + "Status": "" }, { "Id": "252875263003722", @@ -56,29 +127,31 @@ "Remark": "系统名称", "SortCode": "1", "CreateTime": "", - "UpdateTime": "2023-6-6 09:22:59.433", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "", "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "", - "UpdateUser": "superAdmin" + "Status": "" }, { "Id": "252875263003723", "ConfigKey": "SYS_VERSION", - "ConfigValue": "V2.1.0", + "ConfigValue": "V3.0.0", "Category": "SYS_BASE", "Remark": "系统版本", "SortCode": "1", "CreateTime": "", - "UpdateTime": "2023-6-6 09:22:59.433", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "", "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "", - "UpdateUser": "superAdmin" + "Status": "" }, { "Id": "252875263003724", @@ -88,29 +161,31 @@ "Remark": "系统版权", "SortCode": "1", "CreateTime": "", - "UpdateTime": "2023-6-6 09:22:59.433", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "", "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "", - "UpdateUser": "superAdmin" + "Status": "" }, { "Id": "252875263003725", "ConfigKey": "SYS_COPYRIGHT_URL", - "ConfigValue": "https://gitee.com/zxzyjs/SimpleAdmin", + "ConfigValue": "https://gitee.com/dotnetmoyu/SimpleAdmin", "Category": "SYS_BASE", "Remark": "系统版权链接地址", "SortCode": "1", "CreateTime": "", - "UpdateTime": "2023-6-6 09:22:59.433", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "", "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "", - "UpdateUser": "superAdmin" + "Status": "" }, { "Id": "252875263003726", @@ -120,13 +195,14 @@ "Remark": "登录验证码开关", "SortCode": "1", "CreateTime": "", - "UpdateTime": "2023-6-25 09:46:09.427", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "", "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "", - "UpdateUser": "superAdmin" + "Status": "" }, { "Id": "252875263003727", @@ -136,13 +212,14 @@ "Remark": "默认文件存储引擎", "SortCode": "1", "CreateTime": "", - "UpdateTime": "2023-6-6 09:22:59.433", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "", "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "", - "UpdateUser": "superAdmin" + "Status": "" }, { "Id": "252875263003728", @@ -152,13 +229,14 @@ "Remark": "默认用户密码", "SortCode": "1", "CreateTime": "", - "UpdateTime": "2023-6-25 14:30:34.477", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "", "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "", - "UpdateUser": "superAdmin" + "Status": "" }, { "Id": "364564896825413", @@ -168,13 +246,14 @@ "Remark": "单用户登录开关", "SortCode": "1", "CreateTime": "2022-12-16 13:58:23.783", - "UpdateTime": "2023-6-25 09:46:09.427", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "212725263002001", "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "", - "UpdateUser": "superAdmin" + "Status": "" }, { "Id": "364564896825414", @@ -184,13 +263,14 @@ "Remark": "MQTT服务端地址", "SortCode": "1", "CreateTime": "", - "UpdateTime": "2022-12-26 11:03:32.013", + "UpdateTime": "2024-11-7 14:39:38.423", "CreateUserId": "", "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "", - "UpdateUser": "" + "Status": "" }, { "Id": "364564896825415", @@ -200,13 +280,14 @@ "Remark": "MQTT用户名", "SortCode": "1", "CreateTime": "", - "UpdateTime": "2022-12-26 11:03:32.013", + "UpdateTime": "2024-11-7 14:39:38.42", "CreateUserId": "", "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "", - "UpdateUser": "" + "Status": "" }, { "Id": "364564896825416", @@ -216,13 +297,14 @@ "Remark": "MQTT密码", "SortCode": "1", "CreateTime": "", - "UpdateTime": "2022-12-26 11:03:32.013", + "UpdateTime": "2024-11-7 14:39:38.42", "CreateUserId": "", "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "", - "UpdateUser": "" + "Status": "" }, { "Id": "364564896825417", @@ -232,13 +314,14 @@ "Remark": "本地文件Windows存储位置", "SortCode": "1", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", "ExtJson": "", - "CreateUser": "", - "UpdateUser": "" + "Status": "" }, { "Id": "364564896825418", @@ -248,13 +331,14 @@ "Remark": "本地文件Linux存储位置", "SortCode": "1", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", "ExtJson": "", - "CreateUser": "", - "UpdateUser": "" + "Status": "" }, { "Id": "364564896825419", @@ -264,13 +348,14 @@ "Remark": "MINIO文件AccessKey", "SortCode": "1", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", "ExtJson": "", - "CreateUser": "", - "UpdateUser": "" + "Status": "" }, { "Id": "364564896825420", @@ -280,13 +365,14 @@ "Remark": "MINIO文件SecetKey", "SortCode": "1", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", "ExtJson": "", - "CreateUser": "", - "UpdateUser": "" + "Status": "" }, { "Id": "364564896825421", @@ -296,13 +382,14 @@ "Remark": "MINIO文件EndPoint", "SortCode": "1", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", "ExtJson": "", - "CreateUser": "", - "UpdateUser": "" + "Status": "" }, { "Id": "364564896825422", @@ -312,13 +399,14 @@ "Remark": "MINIO文件默认存储桶", "SortCode": "1", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", "ExtJson": "", - "CreateUser": "", - "UpdateUser": "" + "Status": "" }, { "Id": "432079395405893", @@ -328,29 +416,31 @@ "Remark": "验证码类型", "SortCode": "99", "CreateTime": "2023-6-25 08:35:35.663", - "UpdateTime": "2023-6-25 09:46:09.427", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "212725263002001", "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin" + "Status": "" }, { "Id": "432079540875333", "ConfigKey": "LOGIN_ERROR_COUNT", - "ConfigValue": "5", + "ConfigValue": "6", "Category": "LOGIN_POLICY", "Remark": "登录错误次数", "SortCode": "99", "CreateTime": "2023-6-25 08:36:11.18", - "UpdateTime": "2023-6-25 09:46:09.427", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "212725263002001", "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin" + "Status": "" }, { "Id": "432079718375493", @@ -360,13 +450,14 @@ "Remark": "错误重置时间", "SortCode": "99", "CreateTime": "2023-6-25 08:36:54.513", - "UpdateTime": "2023-6-25 09:46:09.427", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "212725263002001", "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin" + "Status": "" }, { "Id": "432079850803269", @@ -376,45 +467,48 @@ "Remark": "登录错误锁定时长", "SortCode": "99", "CreateTime": "2023-6-25 08:37:26.847", - "UpdateTime": "2023-6-25 09:46:09.427", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "212725263002001", "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin" + "Status": "" }, { "Id": "432110816800837", "ConfigKey": "PWD_REMIND", - "ConfigValue": "true", + "ConfigValue": "false", "Category": "PWD_POLICY", "Remark": "密码定期提醒更新", "SortCode": "99", "CreateTime": "2023-6-25 10:43:26.903", - "UpdateTime": "2023-6-25 14:30:34.477", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "212725263002001", "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin" + "Status": "" }, { "Id": "432110956560453", "ConfigKey": "PWD_REMIND_DAY", - "ConfigValue": "30", + "ConfigValue": "1", "Category": "PWD_POLICY", "Remark": "密码定期提醒更新时间", "SortCode": "99", "CreateTime": "2023-6-25 10:44:01.023", - "UpdateTime": "2023-6-25 14:30:34.477", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "212725263002001", "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin" + "Status": "" }, { "Id": "432111166894149", @@ -424,13 +518,14 @@ "Remark": "修改初始密码提醒", "SortCode": "99", "CreateTime": "2023-6-25 10:44:52.377", - "UpdateTime": "2023-6-25 14:30:34.477", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "212725263002001", "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin" + "Status": "" }, { "Id": "432111701160005", @@ -440,13 +535,14 @@ "Remark": "密码最小长度", "SortCode": "99", "CreateTime": "2023-6-25 10:47:02.81", - "UpdateTime": "2023-6-25 14:30:34.477", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "212725263002001", "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin" + "Status": "" }, { "Id": "432112135159877", @@ -456,13 +552,14 @@ "Remark": "包含数字", "SortCode": "99", "CreateTime": "2023-6-25 10:48:48.77", - "UpdateTime": "2023-6-25 14:30:34.477", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "212725263002001", "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin" + "Status": "" }, { "Id": "432112321953861", @@ -472,13 +569,14 @@ "Remark": "包含小写字母", "SortCode": "99", "CreateTime": "2023-6-25 10:49:34.373", - "UpdateTime": "2023-6-25 14:30:34.477", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "212725263002001", "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin" + "Status": "" }, { "Id": "432112380907589", @@ -488,13 +586,14 @@ "Remark": "包含大写字母", "SortCode": "99", "CreateTime": "2023-6-25 10:49:48.767", - "UpdateTime": "2023-6-25 14:30:34.477", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "212725263002001", "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin" + "Status": "" }, { "Id": "432112495247429", @@ -504,13 +603,14 @@ "Remark": "包含特殊字符", "SortCode": "99", "CreateTime": "2023-6-25 10:50:16.68", - "UpdateTime": "2023-6-25 14:30:34.477", + "UpdateTime": "2024-7-23 09:09:40.207", "CreateUserId": "212725263002001", "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", "IsDelete": "0", "ExtJson": "", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin" + "Status": "" } ] } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_dev_dict.json b/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_dict.json similarity index 51% rename from api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_dev_dict.json rename to api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_dict.json index b0c5b56e2650d7469fa450711773b2bb12c876ea..a65b6365e022663f610581d7a4c5dc7eccac6667 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_dev_dict.json +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_dict.json @@ -8,11 +8,14 @@ "Category": "FRM", "SortCode": "1", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003702", @@ -22,11 +25,14 @@ "Category": "FRM", "SortCode": "10", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003703", @@ -36,11 +42,14 @@ "Category": "FRM", "SortCode": "20", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003704", @@ -50,11 +59,14 @@ "Category": "FRM", "SortCode": "2", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003705", @@ -64,11 +76,14 @@ "Category": "FRM", "SortCode": "10", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003706", @@ -78,25 +93,31 @@ "Category": "FRM", "SortCode": "20", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003707", "ParentId": "252875263003704", - "DictLabel": "内链", - "DictValue": "IFRAME", + "DictLabel": "子页", + "DictValue": "SUBSET", "Category": "FRM", "SortCode": "30", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003708", @@ -106,11 +127,14 @@ "Category": "FRM", "SortCode": "40", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003711", @@ -120,11 +144,14 @@ "Category": "FRM", "SortCode": "3", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003712", @@ -134,11 +161,14 @@ "Category": "FRM", "SortCode": "10", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003713", @@ -148,11 +178,14 @@ "Category": "FRM", "SortCode": "20", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003714", @@ -162,11 +195,14 @@ "Category": "FRM", "SortCode": "4", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003715", @@ -176,11 +212,14 @@ "Category": "FRM", "SortCode": "10", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003716", @@ -190,11 +229,14 @@ "Category": "FRM", "SortCode": "20", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003717", @@ -204,11 +246,14 @@ "Category": "FRM", "SortCode": "5", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003718", @@ -218,11 +263,14 @@ "Category": "FRM", "SortCode": "10", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003719", @@ -232,11 +280,14 @@ "Category": "FRM", "SortCode": "20", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003720", @@ -246,11 +297,14 @@ "Category": "FRM", "SortCode": "6", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003721", @@ -260,11 +314,14 @@ "Category": "FRM", "SortCode": "10", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003722", @@ -274,11 +331,14 @@ "Category": "FRM", "SortCode": "20", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003723", @@ -288,11 +348,14 @@ "Category": "FRM", "SortCode": "30", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003724", @@ -302,11 +365,14 @@ "Category": "FRM", "SortCode": "7", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003725", @@ -316,11 +382,14 @@ "Category": "FRM", "SortCode": "10", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003726", @@ -330,11 +399,14 @@ "Category": "FRM", "SortCode": "20", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003727", @@ -344,11 +416,14 @@ "Category": "FRM", "SortCode": "30", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003728", @@ -358,11 +433,14 @@ "Category": "FRM", "SortCode": "40", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003730", @@ -372,11 +450,14 @@ "Category": "FRM", "SortCode": "8", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003731", @@ -386,11 +467,14 @@ "Category": "FRM", "SortCode": "10", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003732", @@ -400,11 +484,14 @@ "Category": "FRM", "SortCode": "20", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003733", @@ -414,11 +501,14 @@ "Category": "FRM", "SortCode": "30", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003734", @@ -428,39 +518,48 @@ "Category": "FRM", "SortCode": "9", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003735", "ParentId": "252875263003734", - "DictLabel": "部门", + "DictLabel": "系统", "DictValue": "FRM", "Category": "FRM", "SortCode": "10", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003736", "ParentId": "252875263003734", - "DictLabel": "公司", + "DictLabel": "业务", "DictValue": "BIZ", "Category": "FRM", "SortCode": "20", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003737", @@ -470,11 +569,14 @@ "Category": "FRM", "SortCode": "10", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003738", @@ -484,11 +586,14 @@ "Category": "FRM", "SortCode": "10", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003739", @@ -498,11 +603,14 @@ "Category": "FRM", "SortCode": "10", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003741", @@ -512,11 +620,14 @@ "Category": "FRM", "SortCode": "11", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003742", @@ -526,11 +637,14 @@ "Category": "FRM", "SortCode": "10", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003743", @@ -540,11 +654,14 @@ "Category": "FRM", "SortCode": "20", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003744", @@ -554,11 +671,14 @@ "Category": "FRM", "SortCode": "12", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003745", @@ -568,11 +688,14 @@ "Category": "FRM", "SortCode": "10", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003746", @@ -582,11 +705,14 @@ "Category": "FRM", "SortCode": "20", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003747", @@ -596,11 +722,14 @@ "Category": "FRM", "SortCode": "30", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003748", @@ -610,11 +739,14 @@ "Category": "FRM", "SortCode": "40", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003749", @@ -624,11 +756,14 @@ "Category": "FRM", "SortCode": "13", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003750", @@ -638,11 +773,14 @@ "Category": "FRM", "SortCode": "10", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003751", @@ -652,11 +790,14 @@ "Category": "FRM", "SortCode": "20", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003752", @@ -666,11 +807,14 @@ "Category": "FRM", "SortCode": "30", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003753", @@ -680,11 +824,14 @@ "Category": "FRM", "SortCode": "40", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003754", @@ -694,11 +841,14 @@ "Category": "FRM", "SortCode": "50", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003755", @@ -708,11 +858,14 @@ "Category": "FRM", "SortCode": "60", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003756", @@ -722,11 +875,14 @@ "Category": "FRM", "SortCode": "70", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003757", @@ -736,11 +892,14 @@ "Category": "FRM", "SortCode": "80", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003758", @@ -750,11 +909,14 @@ "Category": "FRM", "SortCode": "14", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003759", @@ -764,11 +926,14 @@ "Category": "FRM", "SortCode": "10", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003760", @@ -778,53 +943,14 @@ "Category": "FRM", "SortCode": "20", "CreateTime": "", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "252875263003761", - "ParentId": "0", - "DictLabel": "定时任务状态", - "DictValue": "JOB_STATUS", - "Category": "FRM", - "SortCode": "15", - "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "252875263003762", - "ParentId": "252875263003761", - "DictLabel": "运行", - "DictValue": "RUNNING", - "Category": "FRM", - "SortCode": "10", - "CreateTime": "", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "252875263003763", - "ParentId": "252875263003761", - "DictLabel": "停止", - "DictValue": "STOPPED", - "Category": "FRM", - "SortCode": "20", - "CreateTime": "", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003764", @@ -834,11 +960,14 @@ "Category": "FRM", "SortCode": "14", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003765", @@ -848,11 +977,14 @@ "Category": "FRM", "SortCode": "10", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "252875263003766", @@ -862,11 +994,14 @@ "Category": "FRM", "SortCode": "20", "CreateTime": "", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "367777942233157", @@ -876,11 +1011,14 @@ "Category": "FRM", "SortCode": "99", "CreateTime": "2022-12-25 15:52:18.697", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "212725263002001", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "367778072543301", @@ -890,11 +1028,14 @@ "Category": "FRM", "SortCode": "99", "CreateTime": "2022-12-25 15:52:50.513", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "212725263002001", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "367778141515845", @@ -904,11 +1045,14 @@ "Category": "FRM", "SortCode": "99", "CreateTime": "2022-12-25 15:53:07.35", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "212725263002001", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "382969159073861", @@ -918,13 +1062,14 @@ "Category": "FRM", "SortCode": "99", "CreateTime": "2023-2-6 14:05:31.87", - "UpdateTime": "", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "212725263002001", "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", "IsDelete": "0", "ExtJson": "", - "CreateUser": "superAdmin", - "UpdateUser": "" + "Status": "ENABLE" }, { "Id": "382969320693829", @@ -934,13 +1079,14 @@ "Category": "FRM", "SortCode": "99", "CreateTime": "2023-2-6 14:06:11.33", - "UpdateTime": "2023-2-6 14:06:40.78", + "UpdateTime": "2024-7-23 09:09:40.697", "CreateUserId": "212725263002001", "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "", "IsDelete": "0", "ExtJson": "", - "CreateUser": "superAdmin", - "UpdateUser": "" + "Status": "ENABLE" }, { "Id": "382969486618693", @@ -950,13 +1096,354 @@ "Category": "FRM", "SortCode": "99", "CreateTime": "2023-2-6 14:06:51.84", + "UpdateTime": "2024-7-23 09:09:40.697", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "507475491864645", + "ParentId": "0", + "DictLabel": "多租户选项", + "DictValue": "TENANT_OPTIONS", + "Category": "FRM", + "SortCode": "99", + "CreateTime": "2024-1-24 09:43:05.773", + "UpdateTime": "2024-7-23 09:09:40.697", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "507482950717509", + "ParentId": "507475491864645", + "DictLabel": "关闭", + "DictValue": "CLOSE", + "Category": "FRM", + "SortCode": "99", + "CreateTime": "2024-1-24 10:13:26.787", + "UpdateTime": "2024-7-23 09:09:40.697", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "507483171848261", + "ParentId": "507475491864645", + "DictLabel": "手动选择", + "DictValue": "CHOSE", + "Category": "FRM", + "SortCode": "99", + "CreateTime": "2024-1-24 10:14:20.77", + "UpdateTime": "2024-7-23 09:09:40.697", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "507483274203205", + "ParentId": "507475491864645", + "DictLabel": "根据域名", + "DictValue": "DOMAIN", + "Category": "FRM", + "SortCode": "99", + "CreateTime": "2024-1-24 10:14:45.763", + "UpdateTime": "2024-7-23 09:09:40.697", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "510326350884933", + "ParentId": "0", + "DictLabel": "登录验证码类型", + "DictValue": "CAPTCHA_TYPE", + "Category": "FRM", + "SortCode": "99", + "CreateTime": "2024-2-1 11:03:16.28", + "UpdateTime": "2024-7-23 09:09:40.697", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "510326446264389", + "ParentId": "510326350884933", + "DictLabel": "纯数字验证码", + "DictValue": "NUM", + "Category": "FRM", + "SortCode": "99", + "CreateTime": "2024-2-1 11:03:39.567", + "UpdateTime": "2024-7-23 09:09:40.697", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "510326482235461", + "ParentId": "510326350884933", + "DictLabel": "数字加字母验证码", + "DictValue": "CHAR", + "Category": "FRM", + "SortCode": "99", + "CreateTime": "2024-2-1 11:03:48.347", + "UpdateTime": "2024-7-23 09:09:40.697", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "510326508625989", + "ParentId": "510326350884933", + "DictLabel": "数字运算验证码", + "DictValue": "ARITH", + "Category": "FRM", + "SortCode": "99", + "CreateTime": "2024-2-1 11:03:54.79", + "UpdateTime": "2024-7-23 09:09:40.697", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "610820365340741", + "ParentId": "252875263003764", + "DictLabel": "消息", + "DictValue": "MESSAGE", + "Category": "FRM", + "SortCode": "99", + "CreateTime": "2024-11-11 10:14:27.777", + "UpdateTime": "", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "610871373713477", + "ParentId": "0", + "DictLabel": "系统消息接受者类型", + "DictValue": "RECEIVER_TYPE", + "Category": "FRM", + "SortCode": "99", + "CreateTime": "2024-11-11 13:42:00.993", + "UpdateTime": "", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "610871459205189", + "ParentId": "610871373713477", + "DictLabel": "所有人", + "DictValue": "ALL", + "Category": "FRM", + "SortCode": "99", + "CreateTime": "2024-11-11 13:42:21.863", "UpdateTime": "", "CreateUserId": "212725263002001", "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", "IsDelete": "0", "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "610871525576773", + "ParentId": "610871373713477", + "DictLabel": "指定角色", + "DictValue": "ROLE", + "Category": "FRM", + "SortCode": "99", + "CreateTime": "2024-11-11 13:42:38.07", + "UpdateTime": "2024-11-11 15:58:34.453", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", "CreateUser": "superAdmin", - "UpdateUser": "" + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "610871552700485", + "ParentId": "610871373713477", + "DictLabel": "指定用户", + "DictValue": "APPOINT", + "Category": "FRM", + "SortCode": "99", + "CreateTime": "2024-11-11 13:42:44.69", + "UpdateTime": "2024-11-11 15:58:39.39", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "611939803328581", + "ParentId": "0", + "DictLabel": "系统消息发送方式", + "DictValue": "MESSAGE_WAY", + "Category": "FRM", + "SortCode": "99", + "CreateTime": "2024-11-14 14:09:28.067", + "UpdateTime": "", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "611940036890693", + "ParentId": "611939803328581", + "DictLabel": "立即发送", + "DictValue": "NOW", + "Category": "FRM", + "SortCode": "99", + "CreateTime": "2024-11-14 14:10:25.087", + "UpdateTime": "", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "611940097024069", + "ParentId": "611939803328581", + "DictLabel": "延迟发送", + "DictValue": "DELAY", + "Category": "FRM", + "SortCode": "99", + "CreateTime": "2024-11-14 14:10:39.77", + "UpdateTime": "", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "611940248596549", + "ParentId": "611939803328581", + "DictLabel": "指定时间", + "DictValue": "SCHEDULE", + "Category": "FRM", + "SortCode": "99", + "CreateTime": "2024-11-14 14:11:16.777", + "UpdateTime": "", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "611940407885893", + "ParentId": "0", + "DictLabel": "消息发送状态", + "DictValue": "MESSAGE_STATUS", + "Category": "FRM", + "SortCode": "99", + "CreateTime": "2024-11-14 14:11:55.663", + "UpdateTime": "", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "611940509208645", + "ParentId": "611940407885893", + "DictLabel": "待发送", + "DictValue": "READY", + "Category": "FRM", + "SortCode": "99", + "CreateTime": "2024-11-14 14:12:20.4", + "UpdateTime": "2024-11-15 10:06:49.79", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "611940679856197", + "ParentId": "611940407885893", + "DictLabel": "已发送", + "DictValue": "ALREADY", + "Category": "FRM", + "SortCode": "99", + "CreateTime": "2024-11-14 14:13:02.063", + "UpdateTime": "", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" } ] } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_org.json b/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_org.json index 55456eee46f4329a68377c08dc9d4365aeb1c922..eb1850f333e5fcfc077391d98647fa63ca18196e 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_org.json +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_org.json @@ -3,20 +3,22 @@ { "Id": "252885263003720", "ParentId": "0", - "DirectorId": "", + "DirectorId": "212725263002001", "Name": "果冻科技有限公司", "Names": "果冻科技有限公司", - "Code": "yfqtrbd5qz", + "Code": "4fuFapeKGy", "Category": "COMPANY", "SortCode": "1", - "CreateTime": "", - "UpdateTime": "2023-1-3 10:23:06.743", + "CreateTime": "2023-8-14 16:19:29.15", + "UpdateTime": "2024-7-23 09:09:40.967", "CreateUserId": "", "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "{\"__v_isShallow\":false,\"__v_isRef\":true,\"_rawValue\":[],\"_value\":[]}", "CreateUser": "", - "UpdateUser": "superAdmin" + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[]" }, { "Id": "252885263003721", @@ -24,35 +26,39 @@ "DirectorId": "", "Name": "科技部", "Names": "果冻科技有限公司/科技部", - "Code": "yfqtrbc5qz", + "Code": "5JOEG44G62", "Category": "DEPT", "SortCode": "2", - "CreateTime": "", - "UpdateTime": "2023-1-3 10:23:14.183", + "CreateTime": "2023-8-14 16:19:29.15", + "UpdateTime": "2024-7-23 09:09:40.967", "CreateUserId": "", "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "{\"__v_isShallow\":false,\"__v_isRef\":true,\"_rawValue\":[],\"_value\":[]}", "CreateUser": "", - "UpdateUser": "superAdmin" + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[252885263003720]" }, { "Id": "252885263003722", "ParentId": "252885263003720", - "DirectorId": "", + "DirectorId": "359177888051269", "Name": "生产部", "Names": "果冻科技有限公司/生产部", - "Code": "yfqtrbc3qz", + "Code": "aln9y4tno6", "Category": "DEPT", "SortCode": "3", - "CreateTime": "", - "UpdateTime": "2023-1-3 10:24:35.903", + "CreateTime": "2023-8-14 16:19:29.15", + "UpdateTime": "2024-7-23 09:09:40.967", "CreateUserId": "", "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "{\"__v_isShallow\":false,\"__v_isRef\":true,\"_rawValue\":[],\"_value\":[]}", "CreateUser": "", - "UpdateUser": "superAdmin" + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[252885263003720]" }, { "Id": "359569393872965", @@ -62,15 +68,17 @@ "Names": "萝卜科技有限公司", "Code": "l77v30V3yG", "Category": "COMPANY", - "SortCode": "99", - "CreateTime": "2022-2-12 11:11:38.57", - "UpdateTime": "2023-1-3 10:23:23.05", + "SortCode": "1", + "CreateTime": "2023-8-14 16:19:29.153", + "UpdateTime": "2024-7-23 09:09:40.967", "CreateUserId": "212725263002001", "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "{\"__v_isShallow\":false,\"__v_isRef\":true,\"_rawValue\":[],\"_value\":[]}", "CreateUser": "", - "UpdateUser": "superAdmin" + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[]" }, { "Id": "360642028625989", @@ -81,14 +89,16 @@ "Code": "dihhtLuWG1", "Category": "DEPT", "SortCode": "4", - "CreateTime": "2022-5-12 11:56:12.29", - "UpdateTime": "2023-1-3 10:23:19.417", + "CreateTime": "2023-8-14 16:19:29.153", + "UpdateTime": "2024-7-23 09:09:40.967", "CreateUserId": "212725263002001", "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "{\"__v_isShallow\":false,\"__v_isRef\":true,\"_rawValue\":[],\"_value\":[]}", "CreateUser": "", - "UpdateUser": "superAdmin" + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[252885263003720]" }, { "Id": "361404296994885", @@ -99,14 +109,16 @@ "Code": "fLOhh7s091", "Category": "DEPT", "SortCode": "99", - "CreateTime": "2022-7-12 15:37:52.967", - "UpdateTime": "2023-1-3 10:23:33.87", + "CreateTime": "2023-8-14 16:19:29.153", + "UpdateTime": "2024-7-23 09:09:40.967", "CreateUserId": "212725263002001", "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "{\"__v_isShallow\":false,\"__v_isRef\":true,\"_rawValue\":[],\"_value\":[]}", "CreateUser": "", - "UpdateUser": "superAdmin" + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[359569393872965]" }, { "Id": "361404346445893", @@ -117,14 +129,636 @@ "Code": "tmDWFRfXuQ", "Category": "DEPT", "SortCode": "99", - "CreateTime": "2022-7-12 15:38:05.04", - "UpdateTime": "2023-1-3 10:23:21.323", + "CreateTime": "2023-8-14 16:19:29.153", + "UpdateTime": "2024-7-23 09:09:40.967", "CreateUserId": "212725263002001", "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "{\"__v_isShallow\":false,\"__v_isRef\":true,\"_rawValue\":[],\"_value\":[]}", "CreateUser": "", - "UpdateUser": "superAdmin" + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[359569393872965]" + }, + { + "Id": "464837351616581", + "ParentId": "252885263003721", + "DirectorId": "", + "Name": "科技一部", + "Names": "果冻科技有限公司/科技部/科技一部", + "Code": "Mzv2sj1MEo", + "Category": "DEPT", + "SortCode": "99", + "CreateTime": "2023-9-25 22:08:03.567", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[252885263003720,252885263003721]" + }, + { + "Id": "464837557956677", + "ParentId": "464837351616581", + "DirectorId": "", + "Name": "科技一部1组", + "Names": "果冻科技有限公司/科技部/科技一部/科技一部1组", + "Code": "g6R7zuMMk4", + "Category": "DEPT", + "SortCode": "99", + "CreateTime": "2023-9-25 22:08:53.943", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[252885263003720,252885263003721,464837351616581]" + }, + { + "Id": "479974472933445", + "ParentId": "359569393872965", + "DirectorId": "", + "Name": "销售部", + "Names": "萝卜科技有限公司/销售部", + "Code": "jjQ1i8btel", + "Category": "DEPT", + "SortCode": "4", + "CreateTime": "2023-11-7 16:41:09.83", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[359569393872965]" + }, + { + "Id": "485978445475909", + "ParentId": "252885263003722", + "DirectorId": "", + "Name": "生产一部", + "Names": "果冻科技有限公司/生产部/生产一部", + "Code": "fHsgj48J0D", + "Category": "DEPT", + "SortCode": "99", + "CreateTime": "2023-11-24 15:51:23.437", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[252885263003720,252885263003722]" + }, + { + "Id": "487320043610181", + "ParentId": "359569393872965", + "DirectorId": "", + "Name": "科技部", + "Names": "萝卜科技有限公司/科技部", + "Code": "1QWox5893Q", + "Category": "DEPT", + "SortCode": "2", + "CreateTime": "2023-11-28 10:50:49.177", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[359569393872965]" + }, + { + "Id": "487320070803525", + "ParentId": "487320043610181", + "DirectorId": "", + "Name": "科技一部", + "Names": "萝卜科技有限公司/科技部/科技一部", + "Code": "fIaBZ15osx", + "Category": "DEPT", + "SortCode": "99", + "CreateTime": "2023-11-28 10:50:49.18", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[359569393872965,487320043610181]" + }, + { + "Id": "510752889880645", + "ParentId": "0", + "DirectorId": "", + "Name": "旺仔科技有限公司", + "Names": "旺仔科技有限公司", + "Code": "wz", + "Category": "COMPANY", + "SortCode": "99", + "CreateTime": "2024-2-2 15:58:51.777", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[]" + }, + { + "Id": "510753093025861", + "ParentId": "0", + "DirectorId": "", + "Name": "达达科技有限公司", + "Names": "达达科技有限公司", + "Code": "dd", + "Category": "COMPANY", + "SortCode": "99", + "CreateTime": "2024-2-2 15:59:41.373", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[]" + }, + { + "Id": "510753219502149", + "ParentId": "0", + "DirectorId": "", + "Name": "杰尼科技有限公司", + "Names": "杰尼科技有限公司", + "Code": "jn", + "Category": "DEPT", + "SortCode": "99", + "CreateTime": "2024-2-2 16:00:12.25", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[]" + }, + { + "Id": "510753479417925", + "ParentId": "510752889880645", + "DirectorId": "", + "Name": "科技部", + "Names": "旺仔科技有限公司/科技部", + "Code": "oNSxenwpqn", + "Category": "DEPT", + "SortCode": "2", + "CreateTime": "2024-2-2 16:01:15.713", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[510752889880645]" + }, + { + "Id": "510753479422021", + "ParentId": "510753479417925", + "DirectorId": "", + "Name": "科技一部", + "Names": "旺仔科技有限公司/科技部/科技一部", + "Code": "j83kVrfVD0", + "Category": "DEPT", + "SortCode": "99", + "CreateTime": "2024-2-2 16:01:15.713", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[510752889880645,510753479417925]" + }, + { + "Id": "510753479422022", + "ParentId": "510753479422021", + "DirectorId": "", + "Name": "科技一部1组", + "Names": "旺仔科技有限公司/科技部/科技一部/科技一部1组", + "Code": "93BGNo5HXE", + "Category": "DEPT", + "SortCode": "99", + "CreateTime": "2024-2-2 16:01:15.713", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[510752889880645,510753479417925,510753479422021]" + }, + { + "Id": "510753479422023", + "ParentId": "510752889880645", + "DirectorId": "359177888051269", + "Name": "生产部", + "Names": "旺仔科技有限公司/生产部", + "Code": "2l3276Q5Tg", + "Category": "DEPT", + "SortCode": "3", + "CreateTime": "2024-2-2 16:01:15.713", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[510752889880645]" + }, + { + "Id": "510753479426117", + "ParentId": "510753479422023", + "DirectorId": "", + "Name": "生产一部", + "Names": "旺仔科技有限公司/生产部/生产一部", + "Code": "298gdc2Oy6", + "Category": "DEPT", + "SortCode": "99", + "CreateTime": "2024-2-2 16:01:15.713", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[510752889880645,510753479422023]" + }, + { + "Id": "510753479430213", + "ParentId": "510752889880645", + "DirectorId": "", + "Name": "销售部", + "Names": "旺仔科技有限公司/销售部", + "Code": "qEB7a8wtP3", + "Category": "DEPT", + "SortCode": "4", + "CreateTime": "2024-2-2 16:01:15.713", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[510752889880645]" + }, + { + "Id": "510753515745349", + "ParentId": "510753093025861", + "DirectorId": "", + "Name": "科技部", + "Names": "达达科技有限公司/科技部", + "Code": "LMB0GjrOM8", + "Category": "DEPT", + "SortCode": "2", + "CreateTime": "2024-2-2 16:01:24.577", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[510753093025861]" + }, + { + "Id": "510753515745350", + "ParentId": "510753515745349", + "DirectorId": "", + "Name": "科技一部", + "Names": "达达科技有限公司/科技部/科技一部", + "Code": "mgd2SJ35jH", + "Category": "DEPT", + "SortCode": "99", + "CreateTime": "2024-2-2 16:01:24.577", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[510753093025861,510753515745349]" + }, + { + "Id": "510753515745351", + "ParentId": "510753515745350", + "DirectorId": "", + "Name": "科技一部1组", + "Names": "达达科技有限公司/科技部/科技一部/科技一部1组", + "Code": "jQ5ymWaxz1", + "Category": "DEPT", + "SortCode": "99", + "CreateTime": "2024-2-2 16:01:24.577", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[510753093025861,510753515745349,510753515745350]" + }, + { + "Id": "510753515749445", + "ParentId": "510753093025861", + "DirectorId": "359177888051269", + "Name": "生产部", + "Names": "达达科技有限公司/生产部", + "Code": "nNmBAfO2dG", + "Category": "DEPT", + "SortCode": "3", + "CreateTime": "2024-2-2 16:01:24.577", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[510753093025861]" + }, + { + "Id": "510753515749446", + "ParentId": "510753515749445", + "DirectorId": "", + "Name": "生产一部", + "Names": "达达科技有限公司/生产部/生产一部", + "Code": "D37d9K1QMn", + "Category": "DEPT", + "SortCode": "99", + "CreateTime": "2024-2-2 16:01:24.577", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[510753093025861,510753515749445]" + }, + { + "Id": "510753515749447", + "ParentId": "510753093025861", + "DirectorId": "", + "Name": "销售部", + "Names": "达达科技有限公司/销售部", + "Code": "Jt6ZJfT4g2", + "Category": "DEPT", + "SortCode": "4", + "CreateTime": "2024-2-2 16:01:24.577", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[510753093025861]" + }, + { + "Id": "510753541705799", + "ParentId": "510753219502149", + "DirectorId": "359177888051269", + "Name": "生产部", + "Names": "杰尼科技有限公司/生产部", + "Code": "LuOvsCpXL9", + "Category": "DEPT", + "SortCode": "3", + "CreateTime": "2024-2-2 16:01:30.917", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[510753219502149]" + }, + { + "Id": "510753541709893", + "ParentId": "510753541705799", + "DirectorId": "", + "Name": "生产一部", + "Names": "杰尼科技有限公司/生产部/生产一部", + "Code": "3jz7oH2YdB", + "Category": "DEPT", + "SortCode": "99", + "CreateTime": "2024-2-2 16:01:30.92", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[510753219502149,510753541705799]" + }, + { + "Id": "510753541709894", + "ParentId": "510753219502149", + "DirectorId": "", + "Name": "销售部", + "Names": "杰尼科技有限公司/销售部", + "Code": "1175P8fpKj", + "Category": "DEPT", + "SortCode": "4", + "CreateTime": "2024-2-2 16:01:30.92", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[510753219502149]" + }, + { + "Id": "516762847445061", + "ParentId": "510753219502149", + "DirectorId": "", + "Name": "科技部", + "Names": "杰尼科技有限公司/科技部", + "Code": "aixpW3fg7h", + "Category": "DEPT", + "SortCode": "2", + "CreateTime": "2024-2-19 15:33:26.577", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[510753219502149]" + }, + { + "Id": "516762847465541", + "ParentId": "516762847445061", + "DirectorId": "", + "Name": "科技一部", + "Names": "杰尼科技有限公司/科技部/科技一部", + "Code": "8IGvu1YbVv", + "Category": "DEPT", + "SortCode": "99", + "CreateTime": "2024-2-19 15:33:26.58", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[510753219502149,516762847445061]" + }, + { + "Id": "516762847465542", + "ParentId": "516762847465541", + "DirectorId": "", + "Name": "科技一部1组", + "Names": "杰尼科技有限公司/科技部/科技一部/科技一部1组", + "Code": "7i2xo2x63S", + "Category": "DEPT", + "SortCode": "99", + "CreateTime": "2024-2-19 15:33:26.58", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[510753219502149,516762847445061,516762847465541]" + }, + { + "Id": "517088662995013", + "ParentId": "510752889880645", + "DirectorId": "", + "Name": "研发部", + "Names": "旺仔科技有限公司/研发部", + "Code": "28s3SaDA24", + "Category": "DEPT", + "SortCode": "99", + "CreateTime": "2024-2-20 13:39:11.383", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "511724553736261", + "UpdateUserId": "", + "CreateUser": "旺仔科技管理员", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[510752889880645]" + }, + { + "Id": "517125532377157", + "ParentId": "510753219502149", + "DirectorId": "212725263002001", + "Name": "果冻科技有限公司", + "Names": "杰尼科技有限公司/果冻科技有限公司", + "Code": "1wfUJ6288S", + "Category": "COMPANY", + "SortCode": "1", + "CreateTime": "2024-2-20 16:09:12.727", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[510753219502149]" + }, + { + "Id": "517129906487365", + "ParentId": "510753219502149", + "DirectorId": "", + "Name": "研发部", + "Names": "杰尼科技有限公司/研发部", + "Code": "OMkYEanrD3", + "Category": "DEPT", + "SortCode": "99", + "CreateTime": "2024-2-20 16:27:02.277", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[510753219502149]" + }, + { + "Id": "517130541625413", + "ParentId": "252885263003720", + "DirectorId": "", + "Name": "研发部", + "Names": "果冻科技有限公司/研发部", + "Code": "Ql894KJrdb", + "Category": "DEPT", + "SortCode": "99", + "CreateTime": "2024-2-20 16:29:35.677", + "UpdateTime": "2024-7-23 09:09:40.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE", + "ParentIdList": "[252885263003720]" } ] } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_position.json b/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_position.json index 10e217572f902094539f90f96b2118746cd3afc3..4b5ff16d15978743853374f696eec25bd5fc6310 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_position.json +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_position.json @@ -8,12 +8,15 @@ "Category": "HIGH", "SortCode": "1", "CreateOrgId": "252885263003720", - "CreateTime": "", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.213", + "UpdateTime": "2024-7-23 09:09:41.073", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "212725263003002", @@ -23,12 +26,15 @@ "Category": "HIGH", "SortCode": "2", "CreateOrgId": "252885263003720", - "CreateTime": "", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.217", + "UpdateTime": "2024-7-23 09:09:41.073", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "212725263003003", @@ -38,12 +44,15 @@ "Category": "HIGH", "SortCode": "3", "CreateOrgId": "252885263003720", - "CreateTime": "", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.217", + "UpdateTime": "2024-7-23 09:09:41.073", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "212725263003004", @@ -53,12 +62,15 @@ "Category": "HIGH", "SortCode": "4", "CreateOrgId": "252885263003720", - "CreateTime": "", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.217", + "UpdateTime": "2024-7-23 09:09:41.073", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "212725263003005", @@ -68,12 +80,15 @@ "Category": "MIDDLE", "SortCode": "5", "CreateOrgId": "252885263003720", - "CreateTime": "", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.217", + "UpdateTime": "2024-7-23 09:09:41.073", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "359569658515525", @@ -83,12 +98,15 @@ "Category": "MIDDLE", "SortCode": "99", "CreateOrgId": "0", - "CreateTime": "2022-12-2 11:12:43.18", - "UpdateTime": "2022-12-2 11:13:19.637", + "CreateTime": "2023-8-14 16:19:29.217", + "UpdateTime": "2024-7-23 09:09:41.073", "CreateUserId": "212725263002001", "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "360728646910021", @@ -98,12 +116,15 @@ "Category": "MIDDLE", "SortCode": "99", "CreateOrgId": "0", - "CreateTime": "2022-12-5 17:48:39.33", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.217", + "UpdateTime": "2024-7-23 09:09:41.073", "CreateUserId": "212725263002001", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "361407055544389", @@ -113,12 +134,15 @@ "Category": "LOW", "SortCode": "99", "CreateOrgId": "252885263003720", - "CreateTime": "2022-12-7 15:49:06.44", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.217", + "UpdateTime": "2024-7-23 09:09:41.073", "CreateUserId": "212725263002001", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "361414036955205", @@ -128,12 +152,15 @@ "Category": "LOW", "SortCode": "99", "CreateOrgId": "252885263003720", - "CreateTime": "2022-12-7 16:17:30.887", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.217", + "UpdateTime": "2024-7-23 09:09:41.073", "CreateUserId": "212725263002001", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "361414093332549", @@ -143,12 +170,15 @@ "Category": "HIGH", "SortCode": "99", "CreateOrgId": "252885263003720", - "CreateTime": "2022-12-7 16:17:44.65", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.217", + "UpdateTime": "2024-7-23 09:09:41.073", "CreateUserId": "212725263002001", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "361415094177861", @@ -158,12 +188,141 @@ "Category": "MIDDLE", "SortCode": "99", "CreateOrgId": "252885263003720", - "CreateTime": "2022-12-7 16:21:48.997", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.217", + "UpdateTime": "2024-7-23 09:09:41.073", "CreateUserId": "212725263002001", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "485593012985925", + "OrgId": "464837557956677", + "Name": "组长", + "Code": "YWUz4Fc794", + "Category": "HIGH", + "SortCode": "99", + "CreateOrgId": "252885263003720", + "CreateTime": "2023-11-23 13:43:03.707", + "UpdateTime": "2024-7-23 09:09:41.073", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "511723823370309", + "OrgId": "510752889880645", + "Name": "职工", + "Code": "2KVZ6Uz3ne", + "Category": "LOW", + "SortCode": "99", + "CreateOrgId": "252885263003720", + "CreateTime": "2024-2-5 09:49:36.083", + "UpdateTime": "2024-7-23 09:09:41.073", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "511723919061061", + "OrgId": "510753093025861", + "Name": "董事长", + "Code": "4RbqYeVTG7", + "Category": "HIGH", + "SortCode": "99", + "CreateOrgId": "252885263003720", + "CreateTime": "2024-2-5 09:49:59.447", + "UpdateTime": "2024-7-23 09:09:41.073", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "511723963043909", + "OrgId": "510753219502149", + "Name": "董事长", + "Code": "50wshEGBxd", + "Category": "HIGH", + "SortCode": "99", + "CreateOrgId": "252885263003720", + "CreateTime": "2024-2-5 09:50:10.187", + "UpdateTime": "2024-7-23 09:09:41.073", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "517095081300037", + "OrgId": "517088662995013", + "Name": "研发部经理", + "Code": "KXs5l2W2v9", + "Category": "HIGH", + "SortCode": "99", + "CreateOrgId": "510752889880645", + "CreateTime": "2024-2-20 14:05:18.353", + "UpdateTime": "2024-7-23 09:09:41.073", + "CreateUserId": "511724553736261", + "UpdateUserId": "", + "CreateUser": "旺仔科技管理员", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "517129906495557", + "OrgId": "517129906487365", + "Name": "研发部经理", + "Code": "KXs5A2W3v9", + "Category": "HIGH", + "SortCode": "99", + "CreateOrgId": "252885263003720", + "CreateTime": "2024-2-20 16:27:02.323", + "UpdateTime": "2024-7-23 09:09:41.073", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "517130541629509", + "OrgId": "517130541625413", + "Name": "研发部经理", + "Code": "0EyfLIDRJC", + "Category": "HIGH", + "SortCode": "99", + "CreateOrgId": "252885263003720", + "CreateTime": "2024-2-20 16:29:35.687", + "UpdateTime": "2024-7-23 09:09:41.073", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" } ] } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_relation.json b/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_relation.json index c8c0b359079914ca74603289197dbb781095b2c0..a3b6dafe26be880de77a3814372d28ca1765687f 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_relation.json +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_relation.json @@ -8,1467 +8,3098 @@ "ExtJson": "" }, { - "Id": "212725263003113", + "Id": "361376304689221", + "ObjectId": "359177888051269", + "TargetId": "360646662586437", + "Category": "SYS_USER_HAS_ROLE", + "ExtJson": "" + }, + { + "Id": "361406212943941", + "ObjectId": "361405857865797", + "TargetId": "359567292014661", + "Category": "SYS_USER_HAS_ROLE", + "ExtJson": "" + }, + { + "Id": "361406234341445", + "ObjectId": "361405930270789", + "TargetId": "360645671104581", + "Category": "SYS_USER_HAS_ROLE", + "ExtJson": "" + }, + { + "Id": "361424325550149", + "ObjectId": "361406147739717", + "TargetId": "360646281904197", + "Category": "SYS_USER_HAS_ROLE", + "ExtJson": "" + }, + { + "Id": "391885190627397", + "ObjectId": "361405857865797", + "TargetId": "", + "Category": "SYS_USER_WORKBENCH_DATA", + "ExtJson": "{\"shortcut\":[{\"id\":212725263003722,\"title\":\"系统首页\",\"icon\":\"home-outlined\",\"path\":\"/index\"},{\"id\":212725263003723,\"title\":\"个人中心\",\"icon\":\"appstore-outlined\",\"path\":\"/usercenter\"}]}" + }, + { + "Id": "396380690288709", + "ObjectId": "381871212765253", + "TargetId": "212755263003745", + "Category": "SYS_USER_HAS_RESOURCE", + "ExtJson": "{\"MenuId\":212755263003745,\"ButtonInfo\":[212825263004728,212825263004729,212825263004730,212825263004731,383020955254853,383022400483397]}" + }, + { + "Id": "396380690300997", + "ObjectId": "381871212765253", + "TargetId": "/biz/organization/org/tree", + "Category": "SYS_USER_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/tree\"}" + }, + { + "Id": "396380690300998", + "ObjectId": "381871212765253", + "TargetId": "/biz/organization/org/page", + "Category": "SYS_USER_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/page\"}" + }, + { + "Id": "396380690300999", + "ObjectId": "381871212765253", + "TargetId": "/biz/organization/org/add", + "Category": "SYS_USER_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/add\"}" + }, + { + "Id": "396380690301000", + "ObjectId": "381871212765253", + "TargetId": "/biz/organization/org/edit", + "Category": "SYS_USER_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/edit\"}" + }, + { + "Id": "396380690301001", + "ObjectId": "381871212765253", + "TargetId": "/biz/organization/org/copy", + "Category": "SYS_USER_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/copy\"}" + }, + { + "Id": "396380690301002", + "ObjectId": "381871212765253", + "TargetId": "/biz/organization/org/delete", + "Category": "SYS_USER_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/delete\"}" + }, + { + "Id": "396380690301003", + "ObjectId": "381871212765253", + "TargetId": "/biz/organization/org/orgTreeSelector", + "Category": "SYS_USER_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/orgTreeSelector\"}" + }, + { + "Id": "396380690301004", + "ObjectId": "381871212765253", + "TargetId": "/biz/organization/org/userSelector", + "Category": "SYS_USER_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/userSelector\"}" + }, + { + "Id": "425798456791109", + "ObjectId": "212725263001001", + "TargetId": "425472310554693", + "Category": "SYS_ROLE_HAS_MOBILE_RESOURCE", + "ExtJson": "{\"MenuId\":425472310554693,\"ButtonInfo\":[425710965174341,425711012839493,425711060901957]}" + }, + { + "Id": "425798456791110", + "ObjectId": "212725263001001", + "TargetId": "425472601616453", + "Category": "SYS_ROLE_HAS_MOBILE_RESOURCE", + "ExtJson": "{\"MenuId\":425472601616453,\"ButtonInfo\":[425711343288389,425711397343301,425711457501253]}" + }, + { + "Id": "425798456791111", + "ObjectId": "212725263001001", + "TargetId": "425472851824709", + "Category": "SYS_ROLE_HAS_MOBILE_RESOURCE", + "ExtJson": "{\"MenuId\":425472851824709,\"ButtonInfo\":[425711559307333,425711600533573,425711647805509]}" + }, + { + "Id": "425798456791112", + "ObjectId": "212725263001001", + "TargetId": "425474847338565", + "Category": "SYS_ROLE_HAS_MOBILE_RESOURCE", + "ExtJson": "{\"MenuId\":425474847338565,\"ButtonInfo\":[]}" + }, + { + "Id": "425798456791113", + "ObjectId": "212725263001001", + "TargetId": "425476704763973", + "Category": "SYS_ROLE_HAS_MOBILE_RESOURCE", + "ExtJson": "{\"MenuId\":425476704763973,\"ButtonInfo\":[]}" + }, + { + "Id": "428982141747269", + "ObjectId": "361405857865797", + "TargetId": "359567292014661", + "Category": "SYS_USER_HAS_ROLE", + "ExtJson": "" + }, + { + "Id": "428982141751365", + "ObjectId": "212725263002001", + "TargetId": "359567292014661", + "Category": "SYS_USER_HAS_ROLE", + "ExtJson": "" + }, + { + "Id": "493059010035781", + "ObjectId": "212725263002001", + "TargetId": "212725263001001", + "Category": "SYS_USER_HAS_ROLE", + "ExtJson": "" + }, + { + "Id": "493420102176837", + "ObjectId": "363085233066053", + "TargetId": "212755263003745", + "Category": "SYS_USER_HAS_RESOURCE", + "ExtJson": "{\"MenuId\":212755263003745,\"ButtonInfo\":[212825263004728,212825263004729,212825263004730,212825263004731,383020955254853,383022400483397]}" + }, + { + "Id": "493420102176838", + "ObjectId": "363085233066053", + "TargetId": "212755263003743", + "Category": "SYS_USER_HAS_MODULE", + "ExtJson": "" + }, + { + "Id": "493420102176839", + "ObjectId": "363085233066053", + "TargetId": "/biz/organization/org/tree", + "Category": "SYS_USER_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/tree\"}" + }, + { + "Id": "493420102176840", + "ObjectId": "363085233066053", + "TargetId": "/biz/organization/org/page", + "Category": "SYS_USER_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/page\"}" + }, + { + "Id": "493420102176841", + "ObjectId": "363085233066053", + "TargetId": "/biz/organization/org/add", + "Category": "SYS_USER_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/add\"}" + }, + { + "Id": "493420102176842", + "ObjectId": "363085233066053", + "TargetId": "/biz/organization/org/edit", + "Category": "SYS_USER_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/edit\"}" + }, + { + "Id": "493420102176843", + "ObjectId": "363085233066053", + "TargetId": "/biz/organization/org/copy", + "Category": "SYS_USER_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/copy\"}" + }, + { + "Id": "493420102176844", + "ObjectId": "363085233066053", + "TargetId": "/biz/organization/org/delete", + "Category": "SYS_USER_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/delete\"}" + }, + { + "Id": "493420102176845", + "ObjectId": "363085233066053", + "TargetId": "/biz/organization/org/orgTreeSelector", + "Category": "SYS_USER_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/orgTreeSelector\"}" + }, + { + "Id": "493420102176846", + "ObjectId": "363085233066053", + "TargetId": "/biz/organization/org/userSelector", + "Category": "SYS_USER_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/userSelector\"}" + }, + { + "Id": "493420102176847", + "ObjectId": "363085233066053", + "TargetId": "/biz/organization/org/detail", + "Category": "SYS_USER_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/detail\"}" + }, + { + "Id": "511793721868357", + "ObjectId": "511724755705925", + "TargetId": "511793641513029", + "Category": "SYS_USER_HAS_ROLE", + "ExtJson": "" + }, + { + "Id": "511793721868358", + "ObjectId": "511724553736261", + "TargetId": "511793641513029", + "Category": "SYS_USER_HAS_ROLE", + "ExtJson": "" + }, + { + "Id": "511793721868359", + "ObjectId": "511724397056069", + "TargetId": "511793641513029", + "Category": "SYS_USER_HAS_ROLE", + "ExtJson": "" + }, + { + "Id": "511793721868360", + "ObjectId": "511724668047429", + "TargetId": "511793641513029", + "Category": "SYS_USER_HAS_ROLE", + "ExtJson": "" + }, + { + "Id": "511793776644165", "ObjectId": "212725263002002", "TargetId": "212725263001002", "Category": "SYS_USER_HAS_ROLE", "ExtJson": "" }, { - "Id": "212725263003300", - "ObjectId": "212725263002001", - "TargetId": "", - "Category": "SYS_USER_WORKBENCH_DATA", - "ExtJson": "{\"Shortcut\":[{\"Id\":212725263003723,\"Title\":\"个人中心\",\"Icon\":\"appstore-outlined\",\"Path\":\"/usercenter\"},{\"Id\":212745263003737,\"Title\":\"系统配置\",\"Icon\":\"appstore-outlined\",\"Path\":\"/sys/config\"}]}" + "Id": "516759017201733", + "ObjectId": "359567292014661", + "TargetId": "212755263003743", + "Category": "SYS_ROLE_HAS_MODULE", + "ExtJson": "" + }, + { + "Id": "516759017201734", + "ObjectId": "359567292014661", + "TargetId": "212755263003745", + "Category": "SYS_ROLE_HAS_RESOURCE", + "ExtJson": "{\"MenuId\":212755263003745,\"ButtonInfo\":[212825263004728,212825263004729,212825263004730,212825263004731,383020955254853,383022400483397]}" + }, + { + "Id": "516759017201735", + "ObjectId": "359567292014661", + "TargetId": "212755263003746", + "Category": "SYS_ROLE_HAS_RESOURCE", + "ExtJson": "{\"MenuId\":212755263003746,\"ButtonInfo\":[212825263005734,212825263005735,212825263005736,212825263005737,212825263005738,212825263005739,212825263005740,391869166551109,391869250662469,395712751292485]}" + }, + { + "Id": "516759017201736", + "ObjectId": "359567292014661", + "TargetId": "212755263003747", + "Category": "SYS_ROLE_HAS_RESOURCE", + "ExtJson": "{\"MenuId\":212755263003747,\"ButtonInfo\":[212825263006739,212825263006749,212825263006750,212825263006751]}" + }, + { + "Id": "516759017201737", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/org/tree", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/tree\"}" + }, + { + "Id": "516759017201738", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/org/page", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/page\"}" + }, + { + "Id": "516759017201739", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/org/add", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/add\"}" + }, + { + "Id": "516759017201740", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/org/edit", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/edit\"}" + }, + { + "Id": "516759017201741", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/org/copy", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/copy\"}" + }, + { + "Id": "516759017201742", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/org/delete", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/delete\"}" + }, + { + "Id": "516759017201743", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/org/orgTreeSelector", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/orgTreeSelector\"}" + }, + { + "Id": "516759017201744", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/org/userSelector", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/userSelector\"}" + }, + { + "Id": "516759017201745", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/org/detail", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/detail\"}" + }, + { + "Id": "516759017201746", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/position/page", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/page\"}" + }, + { + "Id": "516759017201747", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/position/add", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/add\"}" + }, + { + "Id": "516759017205829", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/position/edit", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/edit\"}" + }, + { + "Id": "516759017205830", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/position/delete", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/delete\"}" + }, + { + "Id": "516759017205831", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/position/detail", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/detail\"}" + }, + { + "Id": "516759017205832", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/position/selector", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/selector\"}" + }, + { + "Id": "516759017205833", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/user/preview", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/preview\"}" + }, + { + "Id": "516759017205834", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/user/page", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/page\"}" + }, + { + "Id": "516759017205835", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/user/userSelector", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/userSelector\"}" + }, + { + "Id": "516759017205836", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/user/ownRole", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/ownRole\"}" + }, + { + "Id": "516759017205837", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/user/detail", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/detail\"}" + }, + { + "Id": "516759017205838", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/user/add", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/add\"}" + }, + { + "Id": "516759017205839", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/user/edit", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/edit\"}" + }, + { + "Id": "516759017205840", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/user/edits", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/edits\"}" + }, + { + "Id": "516759017205841", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/user/delete", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/delete\"}" + }, + { + "Id": "516759017205842", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/user/disableUser", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/disableUser\"}" + }, + { + "Id": "516759017205843", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/user/enableUser", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/enableUser\"}" + }, + { + "Id": "516759017205844", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/user/resetPassword", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/resetPassword\"}" + }, + { + "Id": "516759017205845", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/user/grantRole", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/grantRole\"}" + }, + { + "Id": "516759017205846", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/user/import", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/import\"}" + }, + { + "Id": "516759017205847", + "ObjectId": "359567292014661", + "TargetId": "/biz/organization/user/export", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/export\"}" + }, + { + "Id": "516759017205848", + "ObjectId": "359567292014661", + "TargetId": "/home/index/visLog/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/visLog/list\"}" + }, + { + "Id": "516759017205849", + "ObjectId": "359567292014661", + "TargetId": "/home/index/opLog/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/opLog/list\"}" + }, + { + "Id": "516759017205850", + "ObjectId": "359567292014661", + "TargetId": "/home/index/message/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/message/list\"}" + }, + { + "Id": "516759017205851", + "ObjectId": "359567292014661", + "TargetId": "/home/index/schedule/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/list\"}" + }, + { + "Id": "516759017205852", + "ObjectId": "359567292014661", + "TargetId": "/home/index/schedule/add", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/add\"}" + }, + { + "Id": "516759017205853", + "ObjectId": "359567292014661", + "TargetId": "/home/index/schedule/deleteSchedule", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/deleteSchedule\"}" + }, + { + "Id": "516759049244741", + "ObjectId": "360645671104581", + "TargetId": "212755263003743", + "Category": "SYS_ROLE_HAS_MODULE", + "ExtJson": "" + }, + { + "Id": "516759049244742", + "ObjectId": "360645671104581", + "TargetId": "212755263003745", + "Category": "SYS_ROLE_HAS_RESOURCE", + "ExtJson": "{\"MenuId\":212755263003745,\"ButtonInfo\":[212825263004728,212825263004729,212825263004730,212825263004731,383020955254853,383022400483397]}" + }, + { + "Id": "516759049244743", + "ObjectId": "360645671104581", + "TargetId": "212755263003746", + "Category": "SYS_ROLE_HAS_RESOURCE", + "ExtJson": "{\"MenuId\":212755263003746,\"ButtonInfo\":[212825263005734,212825263005735,212825263005736,212825263005737,212825263005738,212825263005739,212825263005740,391869166551109,391869250662469,395712751292485]}" + }, + { + "Id": "516759049244744", + "ObjectId": "360645671104581", + "TargetId": "212755263003747", + "Category": "SYS_ROLE_HAS_RESOURCE", + "ExtJson": "{\"MenuId\":212755263003747,\"ButtonInfo\":[212825263006739,212825263006749,212825263006750,212825263006751]}" + }, + { + "Id": "516759049244745", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/org/tree", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/org/tree\"}" + }, + { + "Id": "516759049244746", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/org/page", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/org/page\"}" + }, + { + "Id": "516759049244747", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/org/add", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/org/add\"}" + }, + { + "Id": "516759049244748", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/org/edit", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/org/edit\"}" + }, + { + "Id": "516759049244749", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/org/copy", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/org/copy\"}" + }, + { + "Id": "516759049244750", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/org/delete", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/org/delete\"}" + }, + { + "Id": "516759049244751", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/org/orgTreeSelector", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/org/orgTreeSelector\"}" + }, + { + "Id": "516759049244752", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/org/userSelector", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/org/userSelector\"}" + }, + { + "Id": "516759049244753", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/org/detail", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/org/detail\"}" + }, + { + "Id": "516759049244754", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/position/page", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/position/page\"}" + }, + { + "Id": "516759049244755", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/position/add", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/position/add\"}" + }, + { + "Id": "516759049244756", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/position/edit", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/position/edit\"}" + }, + { + "Id": "516759049244757", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/position/delete", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/position/delete\"}" + }, + { + "Id": "516759049244758", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/position/detail", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/position/detail\"}" + }, + { + "Id": "516759049244759", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/position/selector", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/position/selector\"}" + }, + { + "Id": "516759049244760", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/user/preview", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/preview\"}" + }, + { + "Id": "516759049244761", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/user/page", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/page\"}" + }, + { + "Id": "516759049244762", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/user/userSelector", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/userSelector\"}" + }, + { + "Id": "516759049244763", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/user/ownRole", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/ownRole\"}" + }, + { + "Id": "516759049244764", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/user/detail", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/detail\"}" + }, + { + "Id": "516759049244765", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/user/add", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/add\"}" + }, + { + "Id": "516759049244766", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/user/edit", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/edit\"}" + }, + { + "Id": "516759049248837", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/user/edits", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/edits\"}" + }, + { + "Id": "516759049248838", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/user/delete", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/delete\"}" + }, + { + "Id": "516759049248839", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/user/disableUser", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/disableUser\"}" + }, + { + "Id": "516759049248840", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/user/enableUser", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/enableUser\"}" + }, + { + "Id": "516759049248841", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/user/resetPassword", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/resetPassword\"}" + }, + { + "Id": "516759049248842", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/user/grantRole", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/grantRole\"}" + }, + { + "Id": "516759049248843", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/user/import", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/import\"}" + }, + { + "Id": "516759049248844", + "ObjectId": "360645671104581", + "TargetId": "/biz/organization/user/export", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/export\"}" + }, + { + "Id": "516759049248845", + "ObjectId": "360645671104581", + "TargetId": "/home/index/visLog/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/home/index/visLog/list\"}" + }, + { + "Id": "516759049248846", + "ObjectId": "360645671104581", + "TargetId": "/home/index/opLog/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/home/index/opLog/list\"}" + }, + { + "Id": "516759049248847", + "ObjectId": "360645671104581", + "TargetId": "/home/index/message/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/home/index/message/list\"}" + }, + { + "Id": "516759049248848", + "ObjectId": "360645671104581", + "TargetId": "/home/index/schedule/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/home/index/schedule/list\"}" + }, + { + "Id": "516759049248849", + "ObjectId": "360645671104581", + "TargetId": "/home/index/schedule/add", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/home/index/schedule/add\"}" + }, + { + "Id": "516759049248850", + "ObjectId": "360645671104581", + "TargetId": "/home/index/schedule/deleteSchedule", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/home/index/schedule/deleteSchedule\"}" + }, + { + "Id": "516759084105797", + "ObjectId": "360646281904197", + "TargetId": "212755263003743", + "Category": "SYS_ROLE_HAS_MODULE", + "ExtJson": "" + }, + { + "Id": "516759084105798", + "ObjectId": "360646281904197", + "TargetId": "212755263003745", + "Category": "SYS_ROLE_HAS_RESOURCE", + "ExtJson": "{\"MenuId\":212755263003745,\"ButtonInfo\":[212825263004728,212825263004729,212825263004730,212825263004731,383020955254853,383022400483397]}" + }, + { + "Id": "516759084105799", + "ObjectId": "360646281904197", + "TargetId": "212755263003746", + "Category": "SYS_ROLE_HAS_RESOURCE", + "ExtJson": "{\"MenuId\":212755263003746,\"ButtonInfo\":[212825263005734,212825263005735,212825263005736,212825263005737,212825263005738,212825263005739,212825263005740,391869166551109,391869250662469,395712751292485]}" + }, + { + "Id": "516759084105800", + "ObjectId": "360646281904197", + "TargetId": "212755263003747", + "Category": "SYS_ROLE_HAS_RESOURCE", + "ExtJson": "{\"MenuId\":212755263003747,\"ButtonInfo\":[212825263006739,212825263006749,212825263006750,212825263006751]}" + }, + { + "Id": "516759084105801", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/org/tree", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/org/tree\"}" + }, + { + "Id": "516759084105802", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/org/page", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/org/page\"}" + }, + { + "Id": "516759084105803", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/org/add", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/org/add\"}" + }, + { + "Id": "516759084105804", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/org/edit", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/org/edit\"}" + }, + { + "Id": "516759084109893", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/org/copy", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/org/copy\"}" + }, + { + "Id": "516759084109894", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/org/delete", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/org/delete\"}" + }, + { + "Id": "516759084109895", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/org/orgTreeSelector", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/org/orgTreeSelector\"}" + }, + { + "Id": "516759084109896", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/org/userSelector", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/org/userSelector\"}" + }, + { + "Id": "516759084109897", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/org/detail", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/org/detail\"}" + }, + { + "Id": "516759084109898", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/position/page", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/position/page\"}" + }, + { + "Id": "516759084109899", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/position/add", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/position/add\"}" + }, + { + "Id": "516759084109900", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/position/edit", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/position/edit\"}" + }, + { + "Id": "516759084109901", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/position/delete", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/position/delete\"}" + }, + { + "Id": "516759084109902", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/position/detail", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/position/detail\"}" + }, + { + "Id": "516759084109903", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/position/selector", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/position/selector\"}" + }, + { + "Id": "516759084109904", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/user/preview", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/preview\"}" + }, + { + "Id": "516759084109905", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/user/page", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/page\"}" + }, + { + "Id": "516759084109906", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/user/userSelector", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/userSelector\"}" + }, + { + "Id": "516759084109907", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/user/ownRole", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/ownRole\"}" + }, + { + "Id": "516759084109908", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/user/detail", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/detail\"}" + }, + { + "Id": "516759084109909", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/user/add", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/add\"}" + }, + { + "Id": "516759084109910", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/user/edit", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/edit\"}" + }, + { + "Id": "516759084109911", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/user/edits", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/edits\"}" + }, + { + "Id": "516759084109912", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/user/delete", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/delete\"}" + }, + { + "Id": "516759084109913", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/user/disableUser", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/disableUser\"}" + }, + { + "Id": "516759084109914", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/user/enableUser", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/enableUser\"}" + }, + { + "Id": "516759084109915", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/user/resetPassword", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/resetPassword\"}" + }, + { + "Id": "516759084109916", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/user/grantRole", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/grantRole\"}" + }, + { + "Id": "516759084109917", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/user/import", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/import\"}" + }, + { + "Id": "516759084109918", + "ObjectId": "360646281904197", + "TargetId": "/biz/organization/user/export", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/organization/user/export\"}" + }, + { + "Id": "516759084109919", + "ObjectId": "360646281904197", + "TargetId": "/home/index/visLog/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/home/index/visLog/list\"}" + }, + { + "Id": "516759084109920", + "ObjectId": "360646281904197", + "TargetId": "/home/index/opLog/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/home/index/opLog/list\"}" + }, + { + "Id": "516759084109921", + "ObjectId": "360646281904197", + "TargetId": "/home/index/message/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/home/index/message/list\"}" + }, + { + "Id": "516759084109922", + "ObjectId": "360646281904197", + "TargetId": "/home/index/schedule/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/home/index/schedule/list\"}" + }, + { + "Id": "516759084109923", + "ObjectId": "360646281904197", + "TargetId": "/home/index/schedule/add", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/home/index/schedule/add\"}" + }, + { + "Id": "516759084109924", + "ObjectId": "360646281904197", + "TargetId": "/home/index/schedule/deleteSchedule", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/home/index/schedule/deleteSchedule\"}" + }, + { + "Id": "516759117541445", + "ObjectId": "360646662586437", + "TargetId": "212755263003743", + "Category": "SYS_ROLE_HAS_MODULE", + "ExtJson": "" + }, + { + "Id": "516759117541446", + "ObjectId": "360646662586437", + "TargetId": "212755263003746", + "Category": "SYS_ROLE_HAS_RESOURCE", + "ExtJson": "{\"MenuId\":212755263003746,\"ButtonInfo\":[212825263005734,212825263005735,212825263005736,212825263005737,212825263005738,212825263005739,212825263005740,391869166551109,391869250662469,395712751292485]}" + }, + { + "Id": "516759117541447", + "ObjectId": "360646662586437", + "TargetId": "/biz/organization/user/preview", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/preview\"}" + }, + { + "Id": "516759117541448", + "ObjectId": "360646662586437", + "TargetId": "/biz/organization/user/page", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/page\"}" + }, + { + "Id": "516759117541449", + "ObjectId": "360646662586437", + "TargetId": "/biz/organization/user/userSelector", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/userSelector\"}" + }, + { + "Id": "516759117541450", + "ObjectId": "360646662586437", + "TargetId": "/biz/organization/user/ownRole", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/ownRole\"}" + }, + { + "Id": "516759117541451", + "ObjectId": "360646662586437", + "TargetId": "/biz/organization/user/detail", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/detail\"}" + }, + { + "Id": "516759117541452", + "ObjectId": "360646662586437", + "TargetId": "/biz/organization/user/add", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/add\"}" + }, + { + "Id": "516759117541453", + "ObjectId": "360646662586437", + "TargetId": "/biz/organization/user/edit", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/edit\"}" + }, + { + "Id": "516759117541454", + "ObjectId": "360646662586437", + "TargetId": "/biz/organization/user/edits", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/edits\"}" + }, + { + "Id": "516759117541455", + "ObjectId": "360646662586437", + "TargetId": "/biz/organization/user/delete", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/delete\"}" + }, + { + "Id": "516759117541456", + "ObjectId": "360646662586437", + "TargetId": "/biz/organization/user/disableUser", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/disableUser\"}" + }, + { + "Id": "516759117541457", + "ObjectId": "360646662586437", + "TargetId": "/biz/organization/user/enableUser", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/enableUser\"}" + }, + { + "Id": "516759117541458", + "ObjectId": "360646662586437", + "TargetId": "/biz/organization/user/resetPassword", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/resetPassword\"}" + }, + { + "Id": "516759117541459", + "ObjectId": "360646662586437", + "TargetId": "/biz/organization/user/grantRole", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/grantRole\"}" + }, + { + "Id": "516759117541460", + "ObjectId": "360646662586437", + "TargetId": "/biz/organization/user/import", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/import\"}" + }, + { + "Id": "516759117541461", + "ObjectId": "360646662586437", + "TargetId": "/biz/organization/user/export", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/export\"}" + }, + { + "Id": "516759117541462", + "ObjectId": "360646662586437", + "TargetId": "/home/index/visLog/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/visLog/list\"}" + }, + { + "Id": "516759117541463", + "ObjectId": "360646662586437", + "TargetId": "/home/index/opLog/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/opLog/list\"}" + }, + { + "Id": "516759117541464", + "ObjectId": "360646662586437", + "TargetId": "/home/index/message/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/message/list\"}" + }, + { + "Id": "516759117541465", + "ObjectId": "360646662586437", + "TargetId": "/home/index/schedule/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/list\"}" + }, + { + "Id": "516759117541466", + "ObjectId": "360646662586437", + "TargetId": "/home/index/schedule/add", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/add\"}" + }, + { + "Id": "516759117541467", + "ObjectId": "360646662586437", + "TargetId": "/home/index/schedule/deleteSchedule", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/deleteSchedule\"}" + }, + { + "Id": "516759156367429", + "ObjectId": "363084914917445", + "TargetId": "212755263003743", + "Category": "SYS_ROLE_HAS_MODULE", + "ExtJson": "" + }, + { + "Id": "516759156367430", + "ObjectId": "363084914917445", + "TargetId": "212755263003745", + "Category": "SYS_ROLE_HAS_RESOURCE", + "ExtJson": "{\"MenuId\":212755263003745,\"ButtonInfo\":[212825263004728,212825263004729,212825263004730,212825263004731,383020955254853,383022400483397]}" + }, + { + "Id": "516759156367431", + "ObjectId": "363084914917445", + "TargetId": "/biz/organization/org/tree", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/tree\"}" + }, + { + "Id": "516759156367432", + "ObjectId": "363084914917445", + "TargetId": "/biz/organization/org/page", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/page\"}" + }, + { + "Id": "516759156367433", + "ObjectId": "363084914917445", + "TargetId": "/biz/organization/org/add", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/add\"}" + }, + { + "Id": "516759156367434", + "ObjectId": "363084914917445", + "TargetId": "/biz/organization/org/edit", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/edit\"}" + }, + { + "Id": "516759156367435", + "ObjectId": "363084914917445", + "TargetId": "/biz/organization/org/copy", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/copy\"}" + }, + { + "Id": "516759156367436", + "ObjectId": "363084914917445", + "TargetId": "/biz/organization/org/delete", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/delete\"}" + }, + { + "Id": "516759156367437", + "ObjectId": "363084914917445", + "TargetId": "/biz/organization/org/orgTreeSelector", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/orgTreeSelector\"}" + }, + { + "Id": "516759156367438", + "ObjectId": "363084914917445", + "TargetId": "/biz/organization/org/userSelector", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/userSelector\"}" + }, + { + "Id": "516759156367439", + "ObjectId": "363084914917445", + "TargetId": "/biz/organization/org/detail", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/detail\"}" + }, + { + "Id": "516759156367440", + "ObjectId": "363084914917445", + "TargetId": "/home/index/visLog/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/visLog/list\"}" + }, + { + "Id": "516759156367441", + "ObjectId": "363084914917445", + "TargetId": "/home/index/opLog/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/opLog/list\"}" + }, + { + "Id": "516759156367442", + "ObjectId": "363084914917445", + "TargetId": "/home/index/message/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/message/list\"}" + }, + { + "Id": "516759156367443", + "ObjectId": "363084914917445", + "TargetId": "/home/index/schedule/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/list\"}" + }, + { + "Id": "516759156367444", + "ObjectId": "363084914917445", + "TargetId": "/home/index/schedule/add", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/add\"}" + }, + { + "Id": "516759156367445", + "ObjectId": "363084914917445", + "TargetId": "/home/index/schedule/deleteSchedule", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/deleteSchedule\"}" + }, + { + "Id": "517480282214469", + "ObjectId": "511793641513029", + "TargetId": "212755263003743", + "Category": "SYS_ROLE_HAS_MODULE", + "ExtJson": "" + }, + { + "Id": "517480282214470", + "ObjectId": "511793641513029", + "TargetId": "212755263003745", + "Category": "SYS_ROLE_HAS_RESOURCE", + "ExtJson": "{\"MenuId\":212755263003745,\"ButtonInfo\":[212825263004728,212825263004729,212825263004730,212825263004731,383020955254853,383022400483397]}" + }, + { + "Id": "517480282214471", + "ObjectId": "511793641513029", + "TargetId": "212755263003746", + "Category": "SYS_ROLE_HAS_RESOURCE", + "ExtJson": "{\"MenuId\":212755263003746,\"ButtonInfo\":[212825263005734,212825263005735,212825263005736,212825263005737,212825263005738,212825263005739,212825263005740,391869166551109,391869250662469,395712751292485]}" + }, + { + "Id": "517480282214472", + "ObjectId": "511793641513029", + "TargetId": "212755263003747", + "Category": "SYS_ROLE_HAS_RESOURCE", + "ExtJson": "{\"MenuId\":212755263003747,\"ButtonInfo\":[212825263006739,212825263006749,212825263006750,212825263006751]}" + }, + { + "Id": "517480282214473", + "ObjectId": "511793641513029", + "TargetId": "517412647174213", + "Category": "SYS_ROLE_HAS_RESOURCE", + "ExtJson": "{\"MenuId\":517412647174213,\"ButtonInfo\":[517470837813317,517470837813318,517470837813319,517470837813320,517480163758149,517480218902597]}" + }, + { + "Id": "517480282214474", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/org/tree", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/tree\"}" + }, + { + "Id": "517480282214475", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/org/page", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/page\"}" }, { - "Id": "361376058916933", - "ObjectId": "360646662586437", - "TargetId": "212755263003746", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003746,\"ButtonInfo\":[212825263005734,212825263005736,212825263005737,212825263005738,212825263005740]}" + "Id": "517480282214476", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/org/orgTreeSelector", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/orgTreeSelector\"}" }, { - "Id": "361376304689221", - "ObjectId": "359177888051269", - "TargetId": "360646662586437", - "Category": "SYS_USER_HAS_ROLE", - "ExtJson": "" + "Id": "517480282214477", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/org/userSelector", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/userSelector\"}" }, { - "Id": "361378601926725", - "ObjectId": "360646662586437", - "TargetId": "/biz/user/orgTreeSelector", + "Id": "517480282214478", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/org/detail", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/orgTreeSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/detail\"}" }, { - "Id": "361378601926726", - "ObjectId": "360646662586437", - "TargetId": "/biz/user/page", + "Id": "517480282214479", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/org/add", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/page\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/add\"}" }, { - "Id": "361378601926727", - "ObjectId": "360646662586437", - "TargetId": "/biz/user/userSelector", + "Id": "517480282214480", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/org/edit", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/userSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/edit\"}" }, { - "Id": "361378601926728", - "ObjectId": "360646662586437", - "TargetId": "/biz/user/positionSelector", + "Id": "517480282214481", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/org/copy", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/positionSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/copy\"}" }, { - "Id": "361378601926729", - "ObjectId": "360646662586437", - "TargetId": "/biz/user/add", + "Id": "517480282214482", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/org/delete", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/add\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/delete\"}" }, { - "Id": "361378601926730", - "ObjectId": "360646662586437", - "TargetId": "/biz/user/edit", + "Id": "517480282214483", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/position/tree", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/edit\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/tree\"}" }, { - "Id": "361378601926731", - "ObjectId": "360646662586437", - "TargetId": "/biz/user/delete", + "Id": "517480282214484", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/position/page", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/delete\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/page\"}" }, { - "Id": "361378601926732", - "ObjectId": "360646662586437", - "TargetId": "/biz/user/disableUser", + "Id": "517480282214485", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/position/detail", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/disableUser\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/detail\"}" }, { - "Id": "361378601926733", - "ObjectId": "360646662586437", - "TargetId": "/biz/user/enableUser", + "Id": "517480282214486", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/position/selector", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/enableUser\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/selector\"}" }, { - "Id": "361378601926734", - "ObjectId": "360646662586437", - "TargetId": "/biz/user/resetPassword", + "Id": "517480282214487", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/position/add", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/resetPassword\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/add\"}" }, { - "Id": "361378601926735", - "ObjectId": "360646662586437", - "TargetId": "/biz/user/ownRole", + "Id": "517480282214488", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/position/edit", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/ownRole\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/edit\"}" }, { - "Id": "361378601926736", - "ObjectId": "360646662586437", - "TargetId": "/biz/user/grantRole", + "Id": "517480282214489", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/position/delete", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/grantRole\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/delete\"}" }, { - "Id": "361378601926737", - "ObjectId": "360646662586437", - "TargetId": "/biz/user/roleSelector", + "Id": "517480282214490", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/role/page", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/roleSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/page\"}" }, { - "Id": "361406212943941", - "ObjectId": "361405857865797", - "TargetId": "359567292014661", - "Category": "SYS_USER_HAS_ROLE", - "ExtJson": "" + "Id": "517480282214491", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/role/add", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/add\"}" }, { - "Id": "361406234341445", - "ObjectId": "361405930270789", - "TargetId": "360645671104581", - "Category": "SYS_USER_HAS_ROLE", - "ExtJson": "" + "Id": "517480282214492", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/role/edit", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/edit\"}" }, { - "Id": "361424325550149", - "ObjectId": "361406147739717", - "TargetId": "360646281904197", - "Category": "SYS_USER_HAS_ROLE", + "Id": "517480282214493", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/role/delete", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/delete\"}" + }, + { + "Id": "517480282214494", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/role/resourceTreeSelector", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/resourceTreeSelector\"}" + }, + { + "Id": "517480282214495", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/role/ownResource", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/ownResource\"}" + }, + { + "Id": "517480282214496", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/role/grantResource", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/grantResource\"}" + }, + { + "Id": "517480282214497", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/role/permissionTreeSelector", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/permissionTreeSelector\"}" + }, + { + "Id": "517480282214498", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/role/ownPermission", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/ownPermission\"}" + }, + { + "Id": "517480282214499", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/role/grantPermission", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/grantPermission\"}" + }, + { + "Id": "517480282214500", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/role/ownUser", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/ownUser\"}" + }, + { + "Id": "517480282218565", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/role/grantUser", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/grantUser\"}" + }, + { + "Id": "517480282218566", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/role/tree", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/tree\"}" + }, + { + "Id": "517480282218567", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/role/detail", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/detail\"}" + }, + { + "Id": "517480282218568", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/role/roleSelector", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/roleSelector\"}" + }, + { + "Id": "517480282218569", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/user/preview", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/preview\"}" + }, + { + "Id": "517480282218570", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/user/page", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/page\"}" + }, + { + "Id": "517480282218571", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/user/selector", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/selector\"}" + }, + { + "Id": "517480282218572", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/user/ownRole", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/ownRole\"}" + }, + { + "Id": "517480282218573", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/user/detail", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/detail\"}" + }, + { + "Id": "517480282218574", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/user/add", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/add\"}" + }, + { + "Id": "517480282218575", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/user/edit", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/edit\"}" + }, + { + "Id": "517480282218576", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/user/edits", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/edits\"}" + }, + { + "Id": "517480282218577", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/user/delete", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/delete\"}" + }, + { + "Id": "517480282218578", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/user/disableUser", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/disableUser\"}" + }, + { + "Id": "517480282218579", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/user/enableUser", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/enableUser\"}" + }, + { + "Id": "517480282218580", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/user/resetPassword", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/resetPassword\"}" + }, + { + "Id": "517480282218581", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/user/grantRole", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/grantRole\"}" + }, + { + "Id": "517480282218582", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/user/import", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/import\"}" + }, + { + "Id": "517480282218583", + "ObjectId": "511793641513029", + "TargetId": "/biz/organization/user/export", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/export\"}" + }, + { + "Id": "517480282218584", + "ObjectId": "511793641513029", + "TargetId": "/home/index/visLog/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/visLog/list\"}" + }, + { + "Id": "517480282218585", + "ObjectId": "511793641513029", + "TargetId": "/home/index/opLog/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/opLog/list\"}" + }, + { + "Id": "517480282218586", + "ObjectId": "511793641513029", + "TargetId": "/home/index/message/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/message/list\"}" + }, + { + "Id": "517480282218587", + "ObjectId": "511793641513029", + "TargetId": "/home/index/schedule/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/list\"}" + }, + { + "Id": "517480282218588", + "ObjectId": "511793641513029", + "TargetId": "/home/index/schedule/add", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/add\"}" + }, + { + "Id": "517480282218589", + "ObjectId": "511793641513029", + "TargetId": "/home/index/schedule/deleteSchedule", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/deleteSchedule\"}" + }, + { + "Id": "518179745652805", + "ObjectId": "517794467639365", + "TargetId": "212755263003743", + "Category": "SYS_ROLE_HAS_MODULE", "ExtJson": "" }, { - "Id": "361435467165765", - "ObjectId": "360645671104581", + "Id": "518179745652806", + "ObjectId": "517794467639365", "TargetId": "212755263003745", "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003745,\"ButtonInfo\":[212825263004729,212825263004730,212825263004731]}" + "ExtJson": "{\"MenuId\":212755263003745,\"ButtonInfo\":[212825263004728,212825263004729,212825263004730,212825263004731,383020955254853,383022400483397]}" }, { - "Id": "361435467165766", - "ObjectId": "360645671104581", + "Id": "518179745652807", + "ObjectId": "517794467639365", "TargetId": "212755263003746", "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003746,\"ButtonInfo\":[212825263005735,212825263005736,212825263005737,212825263005738,212825263005739,212825263005740]}" + "ExtJson": "{\"MenuId\":212755263003746,\"ButtonInfo\":[212825263005734,212825263005736,212825263005737,212825263005738,212825263005739,212825263005740,391869166551109,391869250662469]}" }, { - "Id": "361435467165767", - "ObjectId": "360645671104581", - "TargetId": "212755263003747", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003747,\"ButtonInfo\":[212825263006749,212825263006750,212825263006751]}" + "Id": "518179745652808", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/org/tree", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/tree\"}" }, { - "Id": "361435467165768", - "ObjectId": "360645671104581", - "TargetId": "/biz/org/tree", + "Id": "518179745652809", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/org/page", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/org/tree\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/page\"}" }, { - "Id": "361435467165769", - "ObjectId": "360645671104581", - "TargetId": "/biz/org/page", + "Id": "518179745652810", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/org/orgTreeSelector", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/org/page\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/orgTreeSelector\"}" }, { - "Id": "361435467165770", - "ObjectId": "360645671104581", - "TargetId": "/biz/org/add", + "Id": "518179745652811", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/org/userSelector", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/org/add\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/userSelector\"}" }, { - "Id": "361435467165771", - "ObjectId": "360645671104581", - "TargetId": "/biz/org/edit", + "Id": "518179745652812", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/org/detail", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/org/edit\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/detail\"}" }, { - "Id": "361435467165772", - "ObjectId": "360645671104581", - "TargetId": "/biz/org/delete", + "Id": "518179745652813", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/org/add", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/org/delete\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/add\"}" }, { - "Id": "361435467165773", - "ObjectId": "360645671104581", - "TargetId": "/biz/org/orgTreeSelector", + "Id": "518179745652814", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/org/edit", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/org/orgTreeSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/edit\"}" }, { - "Id": "361435467165774", - "ObjectId": "360645671104581", - "TargetId": "/biz/org/userSelector", + "Id": "518179745652815", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/org/copy", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/org/userSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/copy\"}" }, { - "Id": "361435467165775", - "ObjectId": "360645671104581", - "TargetId": "/biz/position/page", + "Id": "518179745652816", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/org/delete", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/position/page\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/delete\"}" }, { - "Id": "361435467165776", - "ObjectId": "360645671104581", - "TargetId": "/biz/position/add", + "Id": "518179745652817", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/preview", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/position/add\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/preview\"}" }, { - "Id": "361435467165777", - "ObjectId": "360645671104581", - "TargetId": "/biz/position/edit", + "Id": "518179745652818", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/page", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/position/edit\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/page\"}" }, { - "Id": "361435467165778", - "ObjectId": "360645671104581", - "TargetId": "/biz/position/delete", + "Id": "518179745652819", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/selector", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/position/delete\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/selector\"}" }, { - "Id": "361435467165779", - "ObjectId": "360645671104581", - "TargetId": "/biz/user/orgTreeSelector", + "Id": "518179745652820", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/ownRole", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/orgTreeSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/ownRole\"}" }, { - "Id": "361435467165780", - "ObjectId": "360645671104581", - "TargetId": "/biz/user/page", + "Id": "518179745652821", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/detail", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/page\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/detail\"}" }, { - "Id": "361435467165781", - "ObjectId": "360645671104581", - "TargetId": "/biz/user/userSelector", + "Id": "518179745652822", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/add", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/userSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/add\"}" }, { - "Id": "361435467165782", - "ObjectId": "360645671104581", - "TargetId": "/biz/user/positionSelector", + "Id": "518179745652823", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/edit", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/positionSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/edit\"}" }, { - "Id": "361435467165783", - "ObjectId": "360645671104581", - "TargetId": "/biz/user/add", + "Id": "518179745652824", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/edits", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/add\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/edits\"}" }, { - "Id": "361435467165784", - "ObjectId": "360645671104581", - "TargetId": "/biz/user/edit", + "Id": "518179745652825", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/delete", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/edit\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/delete\"}" }, { - "Id": "361435467165785", - "ObjectId": "360645671104581", - "TargetId": "/biz/user/delete", + "Id": "518179745652826", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/disableUser", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/delete\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/disableUser\"}" }, { - "Id": "361435467165786", - "ObjectId": "360645671104581", - "TargetId": "/biz/user/disableUser", + "Id": "518179745652827", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/enableUser", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/disableUser\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/enableUser\"}" }, { - "Id": "361435467165787", - "ObjectId": "360645671104581", - "TargetId": "/biz/user/enableUser", + "Id": "518179745652828", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/resetPassword", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/enableUser\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/resetPassword\"}" }, { - "Id": "361435467165788", - "ObjectId": "360645671104581", - "TargetId": "/biz/user/resetPassword", + "Id": "518179745652829", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/grantRole", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/resetPassword\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/grantRole\"}" }, { - "Id": "361435467165789", - "ObjectId": "360645671104581", - "TargetId": "/biz/user/ownRole", + "Id": "518179745652830", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/import", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/ownRole\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/import\"}" }, { - "Id": "361435467165790", - "ObjectId": "360645671104581", - "TargetId": "/biz/user/grantRole", + "Id": "518179745652831", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/export", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/grantRole\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/export\"}" }, { - "Id": "361435467165791", - "ObjectId": "360645671104581", - "TargetId": "/biz/user/roleSelector", + "Id": "518179745652832", + "ObjectId": "517794467639365", + "TargetId": "/home/index/visLog/list", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/roleSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/visLog/list\"}" }, { - "Id": "361435731247173", - "ObjectId": "360646281904197", + "Id": "518179745652833", + "ObjectId": "517794467639365", + "TargetId": "/home/index/opLog/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/opLog/list\"}" + }, + { + "Id": "518179745652834", + "ObjectId": "517794467639365", + "TargetId": "/home/index/message/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/message/list\"}" + }, + { + "Id": "518179745652835", + "ObjectId": "517794467639365", + "TargetId": "/home/index/schedule/list", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/list\"}" + }, + { + "Id": "518179745652836", + "ObjectId": "517794467639365", + "TargetId": "/home/index/schedule/add", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/add\"}" + }, + { + "Id": "518179745652837", + "ObjectId": "517794467639365", + "TargetId": "/home/index/schedule/deleteSchedule", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/deleteSchedule\"}" + }, + { + "Id": "518189837262917", + "ObjectId": "518189781848133", + "TargetId": "517794467639365", + "Category": "SYS_USER_HAS_ROLE", + "ExtJson": "" + }, + { + "Id": "518190547849285", + "ObjectId": "517794467639365", + "TargetId": "212755263003743", + "Category": "SYS_ROLE_HAS_MODULE", + "ExtJson": "" + }, + { + "Id": "518190547849286", + "ObjectId": "517794467639365", "TargetId": "212755263003745", "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003745,\"ButtonInfo\":[212825263004729,212825263004730,212825263004731]}" + "ExtJson": "{\"MenuId\":212755263003745,\"ButtonInfo\":[212825263004728,212825263004729,212825263004730,212825263004731,383020955254853,383022400483397]}" }, { - "Id": "361435731247174", - "ObjectId": "360646281904197", + "Id": "518190547849287", + "ObjectId": "517794467639365", "TargetId": "212755263003746", "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003746,\"ButtonInfo\":[212825263005734,212825263005735,212825263005736,212825263005737,212825263005738,212825263005739,212825263005740]}" + "ExtJson": "{\"MenuId\":212755263003746,\"ButtonInfo\":[212825263005734,212825263005736,212825263005737,212825263005738,212825263005739,212825263005740,391869166551109,391869250662469]}" }, { - "Id": "361435731247175", - "ObjectId": "360646281904197", + "Id": "518190547849288", + "ObjectId": "517794467639365", "TargetId": "212755263003747", "Category": "SYS_ROLE_HAS_RESOURCE", "ExtJson": "{\"MenuId\":212755263003747,\"ButtonInfo\":[212825263006739,212825263006749,212825263006750,212825263006751]}" }, { - "Id": "361435731247176", - "ObjectId": "360646281904197", - "TargetId": "/biz/org/tree", + "Id": "518190547849289", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/org/tree", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/org/tree\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/tree\"}" }, { - "Id": "361435731247177", - "ObjectId": "360646281904197", - "TargetId": "/biz/org/page", + "Id": "518190547849290", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/org/page", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/org/page\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/page\"}" }, { - "Id": "361435731247178", - "ObjectId": "360646281904197", - "TargetId": "/biz/org/add", + "Id": "518190547849291", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/org/orgTreeSelector", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/org/add\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/orgTreeSelector\"}" }, { - "Id": "361435731247179", - "ObjectId": "360646281904197", - "TargetId": "/biz/org/edit", + "Id": "518190547849292", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/org/userSelector", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/org/edit\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/userSelector\"}" }, { - "Id": "361435731247180", - "ObjectId": "360646281904197", - "TargetId": "/biz/org/delete", + "Id": "518190547849293", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/org/detail", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/org/delete\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/detail\"}" }, { - "Id": "361435731247181", - "ObjectId": "360646281904197", - "TargetId": "/biz/org/orgTreeSelector", + "Id": "518190547849294", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/org/add", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/org/orgTreeSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/add\"}" }, { - "Id": "361435731247182", - "ObjectId": "360646281904197", - "TargetId": "/biz/org/userSelector", + "Id": "518190547849295", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/org/edit", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/org/userSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/edit\"}" }, { - "Id": "361435731247183", - "ObjectId": "360646281904197", - "TargetId": "/biz/position/page", + "Id": "518190547849296", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/org/copy", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/position/page\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/copy\"}" }, { - "Id": "361435731247184", - "ObjectId": "360646281904197", - "TargetId": "/biz/position/add", + "Id": "518190547849297", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/org/delete", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/position/add\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/delete\"}" }, { - "Id": "361435731247185", - "ObjectId": "360646281904197", - "TargetId": "/biz/position/edit", + "Id": "518190547849298", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/position/tree", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/position/edit\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/tree\"}" }, { - "Id": "361435731247186", - "ObjectId": "360646281904197", - "TargetId": "/biz/position/delete", + "Id": "518190547849299", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/position/page", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/position/delete\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/page\"}" }, { - "Id": "361435731247187", - "ObjectId": "360646281904197", - "TargetId": "/biz/user/orgTreeSelector", + "Id": "518190547849300", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/position/detail", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/orgTreeSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/detail\"}" }, { - "Id": "361435731247188", - "ObjectId": "360646281904197", - "TargetId": "/biz/user/page", + "Id": "518190547849301", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/position/selector", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/page\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/selector\"}" }, { - "Id": "361435731247189", - "ObjectId": "360646281904197", - "TargetId": "/biz/user/userSelector", + "Id": "518190547849302", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/position/add", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/userSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/add\"}" }, { - "Id": "361435731247190", - "ObjectId": "360646281904197", - "TargetId": "/biz/user/positionSelector", + "Id": "518190547849303", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/position/edit", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/positionSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/edit\"}" }, { - "Id": "361435731247191", - "ObjectId": "360646281904197", - "TargetId": "/biz/user/add", + "Id": "518190547849304", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/position/delete", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/add\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/delete\"}" }, { - "Id": "361435731247192", - "ObjectId": "360646281904197", - "TargetId": "/biz/user/edit", + "Id": "518190547849305", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/preview", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/edit\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/preview\"}" }, { - "Id": "361435731247193", - "ObjectId": "360646281904197", - "TargetId": "/biz/user/delete", + "Id": "518190547849306", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/page", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/delete\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/page\"}" }, { - "Id": "361435731247194", - "ObjectId": "360646281904197", - "TargetId": "/biz/user/disableUser", + "Id": "518190547849307", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/selector", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/disableUser\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/selector\"}" }, { - "Id": "361435731247195", - "ObjectId": "360646281904197", - "TargetId": "/biz/user/enableUser", + "Id": "518190547849308", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/ownRole", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/ownRole\"}" + }, + { + "Id": "518190547849309", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/detail", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/detail\"}" + }, + { + "Id": "518190547849310", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/add", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/add\"}" + }, + { + "Id": "518190547849311", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/edit", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/edit\"}" + }, + { + "Id": "518190547849312", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/edits", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/edits\"}" + }, + { + "Id": "518190547849313", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/delete", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/delete\"}" + }, + { + "Id": "518190547849314", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/disableUser", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/disableUser\"}" + }, + { + "Id": "518190547849315", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/enableUser", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/enableUser\"}" + }, + { + "Id": "518190547849316", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/resetPassword", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/resetPassword\"}" + }, + { + "Id": "518190547849317", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/grantRole", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/grantRole\"}" + }, + { + "Id": "518190547849318", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/import", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/import\"}" + }, + { + "Id": "518190547849319", + "ObjectId": "517794467639365", + "TargetId": "/biz/organization/user/export", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/export\"}" + }, + { + "Id": "518190547849320", + "ObjectId": "517794467639365", + "TargetId": "/home/index/visLog/list", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/enableUser\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/visLog/list\"}" }, { - "Id": "361435731247196", - "ObjectId": "360646281904197", - "TargetId": "/biz/user/resetPassword", + "Id": "518190547849321", + "ObjectId": "517794467639365", + "TargetId": "/home/index/opLog/list", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/resetPassword\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/opLog/list\"}" }, { - "Id": "361435731247197", - "ObjectId": "360646281904197", - "TargetId": "/biz/user/ownRole", + "Id": "518190547849322", + "ObjectId": "517794467639365", + "TargetId": "/home/index/message/list", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/ownRole\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/message/list\"}" }, { - "Id": "361435731247198", - "ObjectId": "360646281904197", - "TargetId": "/biz/user/grantRole", + "Id": "518190547849323", + "ObjectId": "517794467639365", + "TargetId": "/home/index/schedule/list", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/grantRole\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/list\"}" }, { - "Id": "361435731247199", - "ObjectId": "360646281904197", - "TargetId": "/biz/user/roleSelector", + "Id": "518190547849324", + "ObjectId": "517794467639365", + "TargetId": "/home/index/schedule/add", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885],\"ApiUrl\":\"/biz/user/roleSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/add\"}" }, { - "Id": "363164398264389", - "ObjectId": "212725263002001", - "TargetId": "", - "Category": "SYS_USER_WORKBENCH_DATA", - "ExtJson": "{\"shortcut\":[{\"id\":212725263003723,\"title\":\"个人中心\",\"icon\":\"appstore-outlined\",\"path\":\"/usercenter\"},{\"id\":212725263003729,\"title\":\"角色管理\",\"icon\":\"deployment-unit-outlined\",\"path\":\"/sys/role\"},{\"id\":212745263003737,\"title\":\"系统配置\",\"icon\":\"setting-outlined\",\"path\":\"/sys/config\"}]}" + "Id": "518190547849325", + "ObjectId": "517794467639365", + "TargetId": "/home/index/schedule/deleteSchedule", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/deleteSchedule\"}" }, { - "Id": "363519722537029", - "ObjectId": "212725263002002", - "TargetId": "", - "Category": "SYS_USER_WORKBENCH_DATA", - "ExtJson": "{\"shortcut\":[{\"id\":212725263003722,\"title\":\"系统首页\",\"icon\":\"home-outlined\",\"path\":\"/index\"},{\"id\":212725263003723,\"title\":\"个人中心\",\"icon\":\"appstore-outlined\",\"path\":\"/usercenter\"},{\"id\":212755263003745,\"title\":\"机构管理\",\"icon\":\"cluster-outlined\",\"path\":\"/biz/org\"},{\"id\":212755263003746,\"title\":\"人员管理\",\"icon\":\"user-outlined\",\"path\":\"/biz/user\"},{\"id\":212755263003747,\"title\":\"岗位管理\",\"icon\":\"apartment-outlined\",\"path\":\"/biz/position\"}]}" + "Id": "571526548275269", + "ObjectId": "212725263001001", + "TargetId": "212725263003721", + "Category": "SYS_ROLE_HAS_MODULE", + "ExtJson": "" }, { - "Id": "391885190627397", - "ObjectId": "361405857865797", - "TargetId": "", - "Category": "SYS_USER_WORKBENCH_DATA", - "ExtJson": "{\"shortcut\":[{\"id\":212725263003722,\"title\":\"系统首页\",\"icon\":\"home-outlined\",\"path\":\"/index\"},{\"id\":212725263003723,\"title\":\"个人中心\",\"icon\":\"appstore-outlined\",\"path\":\"/usercenter\"}]}" + "Id": "571526548279365", + "ObjectId": "212725263001001", + "TargetId": "212755263003743", + "Category": "SYS_ROLE_HAS_MODULE", + "ExtJson": "" }, { - "Id": "395717370404933", + "Id": "571526548279366", "ObjectId": "212725263001001", "TargetId": "212725263003725", "Category": "SYS_ROLE_HAS_RESOURCE", "ExtJson": "{\"MenuId\":212725263003725,\"ButtonInfo\":[]}" }, { - "Id": "395717370417221", + "Id": "571526548279367", "ObjectId": "212725263001001", "TargetId": "212725263003726", "Category": "SYS_ROLE_HAS_RESOURCE", "ExtJson": "{\"MenuId\":212725263003726,\"ButtonInfo\":[]}" }, { - "Id": "395717370417222", + "Id": "571526548279368", "ObjectId": "212725263001001", "TargetId": "212725263003727", "Category": "SYS_ROLE_HAS_RESOURCE", "ExtJson": "{\"MenuId\":212725263003727,\"ButtonInfo\":[]}" }, { - "Id": "395717370417223", + "Id": "571526548279369", "ObjectId": "212725263001001", "TargetId": "212725263003729", "Category": "SYS_ROLE_HAS_RESOURCE", "ExtJson": "{\"MenuId\":212725263003729,\"ButtonInfo\":[]}" }, { - "Id": "395717370417224", + "Id": "571526548279370", "ObjectId": "212725263001001", "TargetId": "212725263003730", "Category": "SYS_ROLE_HAS_RESOURCE", "ExtJson": "{\"MenuId\":212725263003730,\"ButtonInfo\":[]}" }, { - "Id": "395717370417225", + "Id": "571526548279371", "ObjectId": "212725263001001", "TargetId": "212725263003731", "Category": "SYS_ROLE_HAS_RESOURCE", "ExtJson": "{\"MenuId\":212725263003731,\"ButtonInfo\":[]}" }, { - "Id": "395717370417226", + "Id": "571526548279372", "ObjectId": "212725263001001", "TargetId": "212725263003732", "Category": "SYS_ROLE_HAS_RESOURCE", "ExtJson": "{\"MenuId\":212725263003732,\"ButtonInfo\":[]}" }, { - "Id": "395717370417227", + "Id": "571526548279373", "ObjectId": "212725263001001", "TargetId": "212735263003734", "Category": "SYS_ROLE_HAS_RESOURCE", "ExtJson": "{\"MenuId\":212735263003734,\"ButtonInfo\":[]}" }, { - "Id": "395717370417228", + "Id": "571526548279374", "ObjectId": "212725263001001", "TargetId": "369089951367237", "Category": "SYS_ROLE_HAS_RESOURCE", "ExtJson": "{\"MenuId\":369089951367237,\"ButtonInfo\":[]}" }, { - "Id": "395717370417229", + "Id": "571526548279375", "ObjectId": "212725263001001", "TargetId": "212745263003736", "Category": "SYS_ROLE_HAS_RESOURCE", "ExtJson": "{\"MenuId\":212745263003736,\"ButtonInfo\":[]}" }, { - "Id": "395717370417230", + "Id": "571526548279376", "ObjectId": "212725263001001", "TargetId": "212745263003737", "Category": "SYS_ROLE_HAS_RESOURCE", "ExtJson": "{\"MenuId\":212745263003737,\"ButtonInfo\":[]}" }, { - "Id": "395717370417231", - "ObjectId": "212725263001001", - "TargetId": "212755263003739", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003739,\"ButtonInfo\":[]}" - }, - { - "Id": "395717370417232", - "ObjectId": "212725263001001", - "TargetId": "212755263003740", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003740,\"ButtonInfo\":[]}" - }, - { - "Id": "395717370417233", - "ObjectId": "212725263001001", - "TargetId": "363532005732421", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":363532005732421,\"ButtonInfo\":[]}" - }, - { - "Id": "395717370417234", + "Id": "571526548279377", "ObjectId": "212725263001001", "TargetId": "363798244282437", "Category": "SYS_ROLE_HAS_RESOURCE", "ExtJson": "{\"MenuId\":363798244282437,\"ButtonInfo\":[]}" }, { - "Id": "395717370417235", - "ObjectId": "212725263001001", - "TargetId": "371662120710213", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":371662120710213,\"ButtonInfo\":[]}" - }, - { - "Id": "395717370417236", - "ObjectId": "212725263001001", - "TargetId": "394242824978501", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":394242824978501,\"ButtonInfo\":[]}" - }, - { - "Id": "395717370417237", - "ObjectId": "212725263001001", - "TargetId": "212755263003742", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003742,\"ButtonInfo\":[]}" - }, - { - "Id": "395717370417238", - "ObjectId": "212725263001001", - "TargetId": "212755263003749", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003749,\"ButtonInfo\":[]}" - }, - { - "Id": "395717370417239", - "ObjectId": "212725263001001", - "TargetId": "212755263003750", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003750,\"ButtonInfo\":[]}" - }, - { - "Id": "395717370417240", - "ObjectId": "212725263001001", - "TargetId": "212755263003751", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003751,\"ButtonInfo\":[]}" - }, - { - "Id": "395717370417241", - "ObjectId": "212725263001001", - "TargetId": "212755263003752", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003752,\"ButtonInfo\":[]}" - }, - { - "Id": "395717370417242", + "Id": "571526548279378", "ObjectId": "212725263001001", - "TargetId": "212755263003753", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003753,\"ButtonInfo\":[]}" - }, - { - "Id": "395717370417243", - "ObjectId": "212725263001001", - "TargetId": "212755263003754", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003754,\"ButtonInfo\":[]}" - }, - { - "Id": "395717370417244", - "ObjectId": "212725263001001", - "TargetId": "212755263003755", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003755,\"ButtonInfo\":[]}" - }, - { - "Id": "395717370417245", - "ObjectId": "212725263001001", - "TargetId": "212755263003756", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003756,\"ButtonInfo\":[]}" - }, - { - "Id": "395717370417246", - "ObjectId": "212725263001001", - "TargetId": "212755263003757", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003757,\"ButtonInfo\":[]}" - }, - { - "Id": "395717370417247", - "ObjectId": "212725263001001", - "TargetId": "212755263003758", + "TargetId": "212755263003739", "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003758,\"ButtonInfo\":[]}" + "ExtJson": "{\"MenuId\":212755263003739,\"ButtonInfo\":[]}" }, { - "Id": "395717370417248", + "Id": "571526548279379", "ObjectId": "212725263001001", - "TargetId": "212755263003759", + "TargetId": "212755263003740", "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003759,\"ButtonInfo\":[]}" + "ExtJson": "{\"MenuId\":212755263003740,\"ButtonInfo\":[]}" }, { - "Id": "395717370417249", + "Id": "571526548279380", "ObjectId": "212725263001001", - "TargetId": "212755263003760", + "TargetId": "212755263003745", "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003760,\"ButtonInfo\":[]}" + "ExtJson": "{\"MenuId\":212755263003745,\"ButtonInfo\":[212825263004728,212825263004729,212825263004730,212825263004731,383020955254853,383022400483397]}" }, { - "Id": "395717370417250", + "Id": "571526548279381", "ObjectId": "212725263001001", - "TargetId": "212755263003761", + "TargetId": "212755263003746", "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003761,\"ButtonInfo\":[]}" + "ExtJson": "{\"MenuId\":212755263003746,\"ButtonInfo\":[212825263005734,212825263005735,212825263005736,212825263005737,212825263005738,212825263005739,212825263005740,391869166551109,391869250662469,395712751292485]}" }, { - "Id": "395717370417251", + "Id": "571526548279382", "ObjectId": "212725263001001", - "TargetId": "212755263003762", + "TargetId": "212755263003747", "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003762,\"ButtonInfo\":[]}" + "ExtJson": "{\"MenuId\":212755263003747,\"ButtonInfo\":[212825263006739,212825263006749,212825263006750,212825263006751]}" }, { - "Id": "395717370417252", + "Id": "571526548279383", "ObjectId": "212725263001001", - "TargetId": "212755263003763", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003763,\"ButtonInfo\":[]}" + "TargetId": "/biz/organization/org/tree", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/tree\"}" }, { - "Id": "395717370417253", + "Id": "571526548279384", "ObjectId": "212725263001001", - "TargetId": "212755263003764", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003764,\"ButtonInfo\":[]}" + "TargetId": "/biz/organization/org/page", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/page\"}" }, { - "Id": "395717370417254", + "Id": "571526548279385", "ObjectId": "212725263001001", - "TargetId": "212755263003765", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003765,\"ButtonInfo\":[]}" + "TargetId": "/biz/organization/org/orgTreeSelector", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/orgTreeSelector\"}" }, { - "Id": "395717370417255", + "Id": "571526548279386", "ObjectId": "212725263001001", - "TargetId": "212755263003766", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003766,\"ButtonInfo\":[]}" + "TargetId": "/biz/organization/org/userSelector", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/userSelector\"}" }, { - "Id": "395717370417256", + "Id": "571526548279387", "ObjectId": "212725263001001", - "TargetId": "212755263003767", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003767,\"ButtonInfo\":[]}" + "TargetId": "/biz/organization/org/detail", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/detail\"}" }, { - "Id": "395717370417257", + "Id": "571526548279388", "ObjectId": "212725263001001", - "TargetId": "212755263003745", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003745,\"ButtonInfo\":[212825263004728,212825263004729,212825263004730,212825263004731,383020955254853,383022400483397]}" + "TargetId": "/biz/organization/org/add", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/add\"}" }, { - "Id": "395717370417258", + "Id": "571526548279389", "ObjectId": "212725263001001", - "TargetId": "212755263003746", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003746,\"ButtonInfo\":[212825263005734,212825263005735,212825263005736,212825263005737,212825263005738,212825263005739,212825263005740,391869166551109,391869250662469,395712751292485]}" + "TargetId": "/biz/organization/org/edit", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/edit\"}" }, { - "Id": "395717370417259", + "Id": "571526548279390", "ObjectId": "212725263001001", - "TargetId": "212755263003747", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003747,\"ButtonInfo\":[212825263006739,212825263006749,212825263006750,212825263006751]}" + "TargetId": "/biz/organization/org/copy", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/copy\"}" }, { - "Id": "395717370417260", + "Id": "571526548279391", "ObjectId": "212725263001001", - "TargetId": "385833289756741", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":385833289756741,\"ButtonInfo\":[385833289920581,385833289920582,385833289920583,385833289920584]}" - }, - { - "Id": "395717391978565", - "ObjectId": "212725263001002", - "TargetId": "212755263003745", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003745,\"ButtonInfo\":[212825263004728,212825263004729,212825263004730,212825263004731,383020955254853,383022400483397]}" - }, - { - "Id": "395717391978566", - "ObjectId": "212725263001002", - "TargetId": "212755263003746", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003746,\"ButtonInfo\":[212825263005734,212825263005735,212825263005736,212825263005737,212825263005738,212825263005739,212825263005740,391869166551109,391869250662469,395712751292485]}" - }, - { - "Id": "395717391978567", - "ObjectId": "212725263001002", - "TargetId": "212755263003747", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003747,\"ButtonInfo\":[212825263006739,212825263006749,212825263006750,212825263006751]}" - }, - { - "Id": "395717391978568", - "ObjectId": "212725263001002", - "TargetId": "385833289756741", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":385833289756741,\"ButtonInfo\":[385833289920581,385833289920582,385833289920583,385833289920584]}" - }, - { - "Id": "395717488414789", - "ObjectId": "359567292014661", - "TargetId": "212755263003745", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003745,\"ButtonInfo\":[212825263004728,212825263004729,212825263004730,212825263004731,383020955254853,383022400483397]}" - }, - { - "Id": "395717488414790", - "ObjectId": "359567292014661", - "TargetId": "212755263003746", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003746,\"ButtonInfo\":[212825263005734,212825263005735,212825263005736,212825263005737,212825263005738,212825263005739,212825263005740,391869166551109,391869250662469,395712751292485]}" - }, - { - "Id": "395717488414791", - "ObjectId": "359567292014661", - "TargetId": "212755263003747", - "Category": "SYS_ROLE_HAS_RESOURCE", - "ExtJson": "{\"MenuId\":212755263003747,\"ButtonInfo\":[212825263006739,212825263006749,212825263006750,212825263006751]}" + "TargetId": "/biz/organization/org/delete", + "Category": "SYS_ROLE_HAS_PERMISSION", + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/delete\"}" }, { - "Id": "395725241905221", + "Id": "571526548279392", "ObjectId": "212725263001001", - "TargetId": "/biz/org/tree", + "TargetId": "/biz/organization/position/tree", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/tree\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/tree\"}" }, { - "Id": "395725241921605", + "Id": "571526548279393", "ObjectId": "212725263001001", - "TargetId": "/biz/org/page", + "TargetId": "/biz/organization/position/page", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/page\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/page\"}" }, { - "Id": "395725241921606", + "Id": "571526548279394", "ObjectId": "212725263001001", - "TargetId": "/biz/org/add", + "TargetId": "/biz/organization/position/detail", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/add\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/detail\"}" }, { - "Id": "395725241921607", + "Id": "571526548279395", "ObjectId": "212725263001001", - "TargetId": "/biz/org/edit", + "TargetId": "/biz/organization/position/selector", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/edit\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/selector\"}" }, { - "Id": "395725241921608", + "Id": "571526548279396", "ObjectId": "212725263001001", - "TargetId": "/biz/org/copy", + "TargetId": "/biz/organization/position/add", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/copy\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/add\"}" }, { - "Id": "395725241921609", + "Id": "571526548279397", "ObjectId": "212725263001001", - "TargetId": "/biz/org/delete", + "TargetId": "/biz/organization/position/edit", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/delete\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/edit\"}" }, { - "Id": "395725241921610", + "Id": "571526548279398", "ObjectId": "212725263001001", - "TargetId": "/biz/org/orgTreeSelector", + "TargetId": "/biz/organization/position/delete", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/orgTreeSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/delete\"}" }, { - "Id": "395725241921611", + "Id": "571526548279399", "ObjectId": "212725263001001", - "TargetId": "/biz/org/userSelector", + "TargetId": "/biz/organization/user/preview", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/userSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/preview\"}" }, { - "Id": "395725241921612", + "Id": "571526548279400", "ObjectId": "212725263001001", - "TargetId": "/biz/position/page", + "TargetId": "/biz/organization/user/page", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/position/page\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/page\"}" }, { - "Id": "395725241921613", + "Id": "571526548279401", "ObjectId": "212725263001001", - "TargetId": "/biz/position/add", + "TargetId": "/biz/organization/user/selector", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/position/add\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/selector\"}" }, { - "Id": "395725241921614", + "Id": "571526548279402", "ObjectId": "212725263001001", - "TargetId": "/biz/position/edit", + "TargetId": "/biz/organization/user/ownRole", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/position/edit\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/ownRole\"}" }, { - "Id": "395725241921615", + "Id": "571526548279403", "ObjectId": "212725263001001", - "TargetId": "/biz/position/delete", + "TargetId": "/biz/organization/user/detail", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/position/delete\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/detail\"}" }, { - "Id": "395725241921616", + "Id": "571526548279404", "ObjectId": "212725263001001", - "TargetId": "/biz/user/orgTreeSelector", + "TargetId": "/biz/organization/user/add", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/orgTreeSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/add\"}" }, { - "Id": "395725241921617", + "Id": "571526548279405", "ObjectId": "212725263001001", - "TargetId": "/biz/user/page", + "TargetId": "/biz/organization/user/edit", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/page\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/edit\"}" }, { - "Id": "395725241921618", + "Id": "571526548279406", "ObjectId": "212725263001001", - "TargetId": "/biz/user/userSelector", + "TargetId": "/biz/organization/user/edits", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/userSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/edits\"}" }, { - "Id": "395725241921619", + "Id": "571526548279407", "ObjectId": "212725263001001", - "TargetId": "/biz/user/positionSelector", + "TargetId": "/biz/organization/user/delete", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/positionSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/delete\"}" }, { - "Id": "395725241921620", + "Id": "571526548279408", "ObjectId": "212725263001001", - "TargetId": "/biz/user/ownRole", + "TargetId": "/biz/organization/user/disableUser", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/ownRole\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/disableUser\"}" }, { - "Id": "395725241921621", + "Id": "571526548279409", "ObjectId": "212725263001001", - "TargetId": "/biz/user/roleSelector", + "TargetId": "/biz/organization/user/enableUser", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/roleSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/enableUser\"}" }, { - "Id": "395725241921622", + "Id": "571526548279410", "ObjectId": "212725263001001", - "TargetId": "/biz/user/add", + "TargetId": "/biz/organization/user/resetPassword", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/add\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/resetPassword\"}" }, { - "Id": "395725241921623", + "Id": "571526548279411", "ObjectId": "212725263001001", - "TargetId": "/biz/user/edit", + "TargetId": "/biz/organization/user/grantRole", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/edit\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/grantRole\"}" }, { - "Id": "395725241921624", + "Id": "571526548279412", "ObjectId": "212725263001001", - "TargetId": "/biz/user/edits", + "TargetId": "/biz/organization/user/import", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/edits\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/import\"}" }, { - "Id": "395725241921625", + "Id": "571526548279413", "ObjectId": "212725263001001", - "TargetId": "/biz/user/delete", + "TargetId": "/biz/organization/user/export", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/delete\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/export\"}" }, { - "Id": "395725241921626", + "Id": "571526548279414", "ObjectId": "212725263001001", - "TargetId": "/biz/user/disableUser", + "TargetId": "/home/index/visLog/list", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/disableUser\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/visLog/list\"}" }, { - "Id": "395725241921627", + "Id": "571526548279415", "ObjectId": "212725263001001", - "TargetId": "/biz/user/enableUser", + "TargetId": "/home/index/opLog/list", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/enableUser\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/opLog/list\"}" }, { - "Id": "395725241921628", + "Id": "571526548279416", "ObjectId": "212725263001001", - "TargetId": "/biz/user/resetPassword", + "TargetId": "/home/index/message/list", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/resetPassword\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/message/list\"}" }, { - "Id": "395725241921629", + "Id": "571526548279417", "ObjectId": "212725263001001", - "TargetId": "/biz/user/grantRole", + "TargetId": "/home/index/schedule/list", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/grantRole\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/list\"}" }, { - "Id": "395725241921630", + "Id": "571526548279418", "ObjectId": "212725263001001", - "TargetId": "/biz/user/import", + "TargetId": "/home/index/schedule/add", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/import\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/add\"}" }, { - "Id": "395725241921631", + "Id": "571526548279419", "ObjectId": "212725263001001", - "TargetId": "/biz/user/export", + "TargetId": "/home/index/schedule/deleteSchedule", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/export\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/deleteSchedule\"}" }, { - "Id": "395725328527429", - "ObjectId": "212725263001002", - "TargetId": "/biz/org/tree", - "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/tree\"}" + "Id": "592396865929285", + "ObjectId": "212725263002001", + "TargetId": "", + "Category": "SYS_USER_WORKBENCH_DATA", + "ExtJson": "{\"shortcut\":[212725263003723,212745263003737]}" }, { - "Id": "395725328527430", - "ObjectId": "212725263001002", - "TargetId": "/biz/org/page", - "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/page\"}" + "Id": "614733361340485", + "ObjectId": "212725263002002", + "TargetId": "", + "Category": "SYS_USER_WORKBENCH_DATA", + "ExtJson": "{\"shortcut\":[212725263003723,212725263003722]}" }, { - "Id": "395725328527431", + "Id": "622206493061189", "ObjectId": "212725263001002", - "TargetId": "/biz/org/add", - "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/add\"}" + "TargetId": "212755263003743", + "Category": "SYS_ROLE_HAS_MODULE", + "ExtJson": "" }, { - "Id": "395725328527432", + "Id": "622206493061190", "ObjectId": "212725263001002", - "TargetId": "/biz/org/edit", - "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/edit\"}" + "TargetId": "212755263003745", + "Category": "SYS_ROLE_HAS_RESOURCE", + "ExtJson": "{\"MenuId\":212755263003745,\"ButtonInfo\":[212825263004728,212825263004729,212825263004730,212825263004731,383020955254853,383022400483397]}" }, { - "Id": "395725328527433", + "Id": "622206493065285", "ObjectId": "212725263001002", - "TargetId": "/biz/org/copy", - "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/copy\"}" + "TargetId": "212755263003746", + "Category": "SYS_ROLE_HAS_RESOURCE", + "ExtJson": "{\"MenuId\":212755263003746,\"ButtonInfo\":[212825263005734,212825263005735,212825263005736,212825263005737,212825263005738,212825263005739,212825263005740,391869166551109,391869250662469,395712751292485]}" }, { - "Id": "395725328527434", + "Id": "622206493065286", "ObjectId": "212725263001002", - "TargetId": "/biz/org/delete", - "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/delete\"}" + "TargetId": "212755263003747", + "Category": "SYS_ROLE_HAS_RESOURCE", + "ExtJson": "{\"MenuId\":212755263003747,\"ButtonInfo\":[212825263006739,212825263006749,212825263006750,212825263006751]}" }, { - "Id": "395725328527435", + "Id": "622206493065287", "ObjectId": "212725263001002", - "TargetId": "/biz/org/orgTreeSelector", - "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/orgTreeSelector\"}" + "TargetId": "517412647174213", + "Category": "SYS_ROLE_HAS_RESOURCE", + "ExtJson": "{\"MenuId\":517412647174213,\"ButtonInfo\":[517470837813317,517470837813318,517470837813319,517470837813320,517480163758149,517480218902597]}" }, { - "Id": "395725328527436", + "Id": "622206493065288", "ObjectId": "212725263001002", - "TargetId": "/biz/org/userSelector", + "TargetId": "/biz/organization/org/tree", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/userSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/tree\"}" }, { - "Id": "395725328527437", + "Id": "622206493065289", "ObjectId": "212725263001002", - "TargetId": "/biz/position/page", + "TargetId": "/biz/organization/org/page", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/position/page\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/page\"}" }, { - "Id": "395725328527438", + "Id": "622206493065290", "ObjectId": "212725263001002", - "TargetId": "/biz/position/add", + "TargetId": "/biz/organization/org/orgTreeSelector", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/position/add\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/orgTreeSelector\"}" }, { - "Id": "395725328527439", + "Id": "622206493065291", "ObjectId": "212725263001002", - "TargetId": "/biz/position/edit", + "TargetId": "/biz/organization/org/userSelector", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/position/edit\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/userSelector\"}" }, { - "Id": "395725328527440", + "Id": "622206493065292", "ObjectId": "212725263001002", - "TargetId": "/biz/position/delete", + "TargetId": "/biz/organization/org/detail", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/position/delete\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/detail\"}" }, { - "Id": "395725328527441", + "Id": "622206493065293", "ObjectId": "212725263001002", - "TargetId": "/biz/user/orgTreeSelector", + "TargetId": "/biz/organization/org/add", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/orgTreeSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/add\"}" }, { - "Id": "395725328527442", + "Id": "622206493065294", "ObjectId": "212725263001002", - "TargetId": "/biz/user/page", + "TargetId": "/biz/organization/org/edit", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/page\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/edit\"}" }, { - "Id": "395725328527443", + "Id": "622206493065295", "ObjectId": "212725263001002", - "TargetId": "/biz/user/userSelector", + "TargetId": "/biz/organization/org/copy", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/userSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/copy\"}" }, { - "Id": "395725328527444", + "Id": "622206493065296", "ObjectId": "212725263001002", - "TargetId": "/biz/user/positionSelector", + "TargetId": "/biz/organization/org/delete", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/positionSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/org/delete\"}" }, { - "Id": "395725328527445", + "Id": "622206493065297", "ObjectId": "212725263001002", - "TargetId": "/biz/user/ownRole", + "TargetId": "/biz/organization/position/tree", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/ownRole\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/tree\"}" }, { - "Id": "395725328527446", + "Id": "622206493065298", "ObjectId": "212725263001002", - "TargetId": "/biz/user/roleSelector", + "TargetId": "/biz/organization/position/page", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/roleSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/page\"}" }, { - "Id": "395725328527447", + "Id": "622206493065299", "ObjectId": "212725263001002", - "TargetId": "/biz/user/add", + "TargetId": "/biz/organization/position/detail", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/add\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/detail\"}" }, { - "Id": "395725328527448", + "Id": "622206493065300", "ObjectId": "212725263001002", - "TargetId": "/biz/user/edit", + "TargetId": "/biz/organization/position/selector", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/edit\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/selector\"}" }, { - "Id": "395725328527449", + "Id": "622206493065301", "ObjectId": "212725263001002", - "TargetId": "/biz/user/edits", + "TargetId": "/biz/organization/position/add", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/edits\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/add\"}" }, { - "Id": "395725328527450", + "Id": "622206493065302", "ObjectId": "212725263001002", - "TargetId": "/biz/user/delete", + "TargetId": "/biz/organization/position/edit", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/delete\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/edit\"}" }, { - "Id": "395725328527451", + "Id": "622206493065303", "ObjectId": "212725263001002", - "TargetId": "/biz/user/disableUser", + "TargetId": "/biz/organization/position/delete", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/disableUser\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/position/delete\"}" }, { - "Id": "395725328527452", + "Id": "622206493065304", "ObjectId": "212725263001002", - "TargetId": "/biz/user/enableUser", + "TargetId": "/biz/organization/role/page", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/enableUser\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/page\"}" }, { - "Id": "395725328527453", + "Id": "622206493065305", "ObjectId": "212725263001002", - "TargetId": "/biz/user/resetPassword", + "TargetId": "/biz/organization/role/add", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/resetPassword\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/add\"}" }, { - "Id": "395725328527454", + "Id": "622206493065306", "ObjectId": "212725263001002", - "TargetId": "/biz/user/grantRole", + "TargetId": "/biz/organization/role/edit", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/grantRole\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/edit\"}" }, { - "Id": "395725328527455", + "Id": "622206493065307", "ObjectId": "212725263001002", - "TargetId": "/biz/user/import", + "TargetId": "/biz/organization/role/delete", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/import\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/delete\"}" }, { - "Id": "395725328527456", + "Id": "622206493065308", "ObjectId": "212725263001002", - "TargetId": "/biz/user/export", + "TargetId": "/biz/organization/role/resourceTreeSelector", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/export\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/resourceTreeSelector\"}" }, { - "Id": "395725362061381", - "ObjectId": "359567292014661", - "TargetId": "/biz/org/tree", + "Id": "622206493065309", + "ObjectId": "212725263001002", + "TargetId": "/biz/organization/role/ownResource", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/tree\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/ownResource\"}" }, { - "Id": "395725362061382", - "ObjectId": "359567292014661", - "TargetId": "/biz/org/page", + "Id": "622206493065310", + "ObjectId": "212725263001002", + "TargetId": "/biz/organization/role/grantResource", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/page\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/grantResource\"}" }, { - "Id": "395725362061383", - "ObjectId": "359567292014661", - "TargetId": "/biz/org/add", + "Id": "622206493065311", + "ObjectId": "212725263001002", + "TargetId": "/biz/organization/role/ownUser", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/add\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/ownUser\"}" }, { - "Id": "395725362061384", - "ObjectId": "359567292014661", - "TargetId": "/biz/org/edit", + "Id": "622206493065312", + "ObjectId": "212725263001002", + "TargetId": "/biz/organization/role/grantUser", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/edit\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/grantUser\"}" }, { - "Id": "395725362061385", - "ObjectId": "359567292014661", - "TargetId": "/biz/org/copy", + "Id": "622206493065313", + "ObjectId": "212725263001002", + "TargetId": "/biz/organization/role/tree", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/copy\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/tree\"}" }, { - "Id": "395725362061386", - "ObjectId": "359567292014661", - "TargetId": "/biz/org/delete", + "Id": "622206493065314", + "ObjectId": "212725263001002", + "TargetId": "/biz/organization/role/detail", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/delete\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/detail\"}" }, { - "Id": "395725362061387", - "ObjectId": "359567292014661", - "TargetId": "/biz/org/orgTreeSelector", + "Id": "622206493065315", + "ObjectId": "212725263001002", + "TargetId": "/biz/organization/role/roleSelector", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/orgTreeSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/role/roleSelector\"}" }, { - "Id": "395725362061388", - "ObjectId": "359567292014661", - "TargetId": "/biz/org/userSelector", + "Id": "622206493065316", + "ObjectId": "212725263001002", + "TargetId": "/biz/organization/user/preview", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/org/userSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/preview\"}" }, { - "Id": "395725362061389", - "ObjectId": "359567292014661", - "TargetId": "/biz/position/page", + "Id": "622206493065317", + "ObjectId": "212725263001002", + "TargetId": "/biz/organization/user/page", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/position/page\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/page\"}" }, { - "Id": "395725362061390", - "ObjectId": "359567292014661", - "TargetId": "/biz/position/add", + "Id": "622206493065318", + "ObjectId": "212725263001002", + "TargetId": "/biz/organization/user/selector", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/position/add\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/selector\"}" }, { - "Id": "395725362061391", - "ObjectId": "359567292014661", - "TargetId": "/biz/position/edit", + "Id": "622206493065319", + "ObjectId": "212725263001002", + "TargetId": "/biz/organization/user/ownRole", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/position/edit\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/ownRole\"}" }, { - "Id": "395725362061392", - "ObjectId": "359567292014661", - "TargetId": "/biz/position/delete", + "Id": "622206493065320", + "ObjectId": "212725263001002", + "TargetId": "/biz/organization/user/detail", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/position/delete\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/detail\"}" }, { - "Id": "395725362061393", - "ObjectId": "359567292014661", - "TargetId": "/biz/user/orgTreeSelector", + "Id": "622206493065321", + "ObjectId": "212725263001002", + "TargetId": "/biz/organization/user/add", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/orgTreeSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/add\"}" }, { - "Id": "395725362061394", - "ObjectId": "359567292014661", - "TargetId": "/biz/user/page", + "Id": "622206493065322", + "ObjectId": "212725263001002", + "TargetId": "/biz/organization/user/edit", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/page\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/edit\"}" }, { - "Id": "395725362061395", - "ObjectId": "359567292014661", - "TargetId": "/biz/user/userSelector", + "Id": "622206493065323", + "ObjectId": "212725263001002", + "TargetId": "/biz/organization/user/edits", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/userSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/edits\"}" }, { - "Id": "395725362061396", - "ObjectId": "359567292014661", - "TargetId": "/biz/user/positionSelector", + "Id": "622206493065324", + "ObjectId": "212725263001002", + "TargetId": "/biz/organization/user/delete", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/positionSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/delete\"}" }, { - "Id": "395725362061397", - "ObjectId": "359567292014661", - "TargetId": "/biz/user/ownRole", + "Id": "622206493065325", + "ObjectId": "212725263001002", + "TargetId": "/biz/organization/user/disableUser", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/ownRole\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/disableUser\"}" }, { - "Id": "395725362061398", - "ObjectId": "359567292014661", - "TargetId": "/biz/user/roleSelector", + "Id": "622206493065326", + "ObjectId": "212725263001002", + "TargetId": "/biz/organization/user/enableUser", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/roleSelector\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/enableUser\"}" }, { - "Id": "395725362061399", - "ObjectId": "359567292014661", - "TargetId": "/biz/user/add", + "Id": "622206493065327", + "ObjectId": "212725263001002", + "TargetId": "/biz/organization/user/resetPassword", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/add\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/resetPassword\"}" }, { - "Id": "395725362061400", - "ObjectId": "359567292014661", - "TargetId": "/biz/user/edit", + "Id": "622206493065328", + "ObjectId": "212725263001002", + "TargetId": "/biz/organization/user/grantRole", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/edit\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/grantRole\"}" }, { - "Id": "395725362061401", - "ObjectId": "359567292014661", - "TargetId": "/biz/user/edits", + "Id": "622206493065329", + "ObjectId": "212725263001002", + "TargetId": "/biz/organization/user/import", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/edits\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/import\"}" }, { - "Id": "395725362061402", - "ObjectId": "359567292014661", - "TargetId": "/biz/user/delete", + "Id": "622206493065330", + "ObjectId": "212725263001002", + "TargetId": "/biz/organization/user/export", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/delete\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/organization/user/export\"}" }, { - "Id": "395725362061403", - "ObjectId": "359567292014661", - "TargetId": "/biz/user/disableUser", + "Id": "622206493065331", + "ObjectId": "212725263001002", + "TargetId": "/home/index/visLog/list", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/disableUser\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/visLog/list\"}" }, { - "Id": "395725362061404", - "ObjectId": "359567292014661", - "TargetId": "/biz/user/enableUser", + "Id": "622206493065332", + "ObjectId": "212725263001002", + "TargetId": "/home/index/opLog/list", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/enableUser\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/opLog/list\"}" }, { - "Id": "395725362061405", - "ObjectId": "359567292014661", - "TargetId": "/biz/user/resetPassword", + "Id": "622206493065333", + "ObjectId": "212725263001002", + "TargetId": "/home/index/message/list", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/resetPassword\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/message/list\"}" }, { - "Id": "395725362061406", - "ObjectId": "359567292014661", - "TargetId": "/biz/user/grantRole", + "Id": "622206493065334", + "ObjectId": "212725263001002", + "TargetId": "/home/index/schedule/list", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/grantRole\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/list\"}" }, { - "Id": "395725362061407", - "ObjectId": "359567292014661", - "TargetId": "/biz/user/import", + "Id": "622206493065335", + "ObjectId": "212725263001002", + "TargetId": "/home/index/schedule/add", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/import\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/add\"}" }, { - "Id": "395725362061408", - "ObjectId": "359567292014661", - "TargetId": "/biz/user/export", + "Id": "622206493065336", + "ObjectId": "212725263001002", + "TargetId": "/home/index/schedule/deleteSchedule", "Category": "SYS_ROLE_HAS_PERMISSION", - "ExtJson": "{\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/biz/user/export\"}" + "ExtJson": "{\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[],\"ApiUrl\":\"/home/index/schedule/deleteSchedule\"}" } ] } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_resource.json b/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_resource.json index 8316c9bde1f9c86da2ab601bc2e604aff227b870..550fd6527406b8401d05b2149a220d730bbb384a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_resource.json +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_resource.json @@ -3,1089 +3,784 @@ { "Id": "212725263003721", "ParentId": "", - "Title": "系统", + "Title": "系统管理", "Name": "", + "Description": "管理平台的用户、权限、菜单等", "Code": "system", "Category": "MODULE", "Module": "", "MenuType": "", "Path": "", "Component": "", - "Icon": "appstore-add-outlined", - "Color": "#05a045", + "Icon": "ep:setting", "SortCode": "1", - "CreateTime": "2022-12-7 12:20:46.193", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.633", + "UpdateTime": "2024-7-23 09:09:41.823", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212725263003722", "ParentId": "", "Title": "系统首页", "Name": "index", + "Description": "系统首页", "Code": "system", "Category": "SPA", "Module": "", "MenuType": "MENU", - "Path": "/index", - "Component": "index/index", - "Icon": "home-outlined", - "Color": "", - "SortCode": "2", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "Path": "/home/index", + "Component": "home/index", + "Icon": "ant-design:home-outlined", + "SortCode": "1", + "CreateTime": "2023-8-14 16:19:29.633", + "UpdateTime": "2024-7-23 09:09:41.823", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "1", + "IsKeepAlive": "0", + "IsHome": "1", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212725263003723", "ParentId": "", "Title": "个人中心", "Name": "userCenter", + "Description": "个人中心", "Code": "system", "Category": "SPA", "Module": "", "MenuType": "MENU", "Path": "/usercenter", - "Component": "sys/user/userCenter", - "Icon": "appstore-outlined", - "Color": "", - "SortCode": "3", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "Component": "userCenter/index", + "Icon": "ep:user", + "SortCode": "99", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-9-20 08:35:15.35", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "1", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212725263003724", "ParentId": "0", "Title": "组织架构", "Name": "", + "Description": "", "Code": "system", "Category": "MENU", "Module": "212725263003721", "MenuType": "CATALOG", - "Path": "/e4y8y7ib2p", + "Path": "/sys/organization", "Component": "", - "Icon": "apartment-outlined", - "Color": "", + "Icon": "ep:office-building", "SortCode": "4", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.823", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212725263003725", "ParentId": "212725263003724", "Title": "组织管理", "Name": "sysOrg", + "Description": "", "Code": "system", "Category": "MENU", "Module": "212725263003721", "MenuType": "MENU", - "Path": "/sys/org", - "Component": "sys/org/index", - "Icon": "cluster-outlined", - "Color": "", + "Path": "/sys/organization/org", + "Component": "sys/organization/org/index", + "Icon": "ant-design:apartment-outlined", "SortCode": "5", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.823", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212725263003726", "ParentId": "212725263003724", "Title": "用户管理", "Name": "sysUser", + "Description": "", "Code": "system", "Category": "MENU", "Module": "212725263003721", "MenuType": "MENU", - "Path": "/sys/user", - "Component": "sys/user/index", - "Icon": "user-outlined", - "Color": "", + "Path": "/sys/organization/user", + "Component": "sys/organization/user/index", + "Icon": "eva:people-outline", "SortCode": "6", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.823", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212725263003727", "ParentId": "212725263003724", "Title": "职位管理", "Name": "sysPosition", + "Description": "", "Code": "system", "Category": "MENU", "Module": "212725263003721", "MenuType": "MENU", - "Path": "/sys/position", - "Component": "sys/position/index", - "Icon": "apartment-outlined", - "Color": "", + "Path": "/sys/organization/position", + "Component": "sys/organization/position/index", + "Icon": "ep:postcard", "SortCode": "7", - "CreateTime": "", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.823", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212725263003728", "ParentId": "0", "Title": "权限管理", "Name": "", + "Description": "", "Code": "system", "Category": "MENU", "Module": "212725263003721", "MenuType": "CATALOG", - "Path": "/5k9uuuzafi", + "Path": "/sys/limit", "Component": "", - "Icon": "user-switch-outlined", - "Color": "", + "Icon": "eva:shield-outline", "SortCode": "8", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.823", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212725263003729", "ParentId": "212725263003728", "Title": "角色管理", "Name": "sysRole", + "Description": "", "Code": "system", "Category": "MENU", "Module": "212725263003721", "MenuType": "MENU", - "Path": "/sys/role", - "Component": "sys/role/index", - "Icon": "deployment-unit-outlined", - "Color": "", + "Path": "/sys/limit/role", + "Component": "sys/limit/role/index", + "Icon": "ep:user", "SortCode": "9", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.823", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "1", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212725263003730", "ParentId": "212725263003728", "Title": "模块管理", "Name": "sysModule", + "Description": "", "Code": "system", "Category": "MENU", "Module": "212725263003721", "MenuType": "MENU", - "Path": "/sys/module", - "Component": "sys/resource/module/index", - "Icon": "appstore-add-outlined", - "Color": "", + "Path": "/sys/limit/module", + "Component": "sys/limit/module/index", + "Icon": "eva:grid-outline", "SortCode": "10", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.823", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "1", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212725263003731", "ParentId": "212725263003728", "Title": "菜单管理", "Name": "sysMenu", + "Description": "", "Code": "system", "Category": "MENU", "Module": "212725263003721", "MenuType": "MENU", - "Path": "/sys/menu", - "Component": "sys/resource/menu/index", - "Icon": "pic-left-outlined", - "Color": "", + "Path": "/sys/limit/menu", + "Component": "sys/limit/menu/index", + "Icon": "ep:menu", "SortCode": "11", - "CreateTime": "", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.823", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "1", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212725263003732", "ParentId": "212725263003728", "Title": "单页管理", "Name": "sysSpa", + "Description": "", "Code": "system", "Category": "MENU", "Module": "212725263003721", "MenuType": "MENU", - "Path": "/sys/spa", - "Component": "sys/resource/spa/index", - "Icon": "pic-center-outlined", - "Color": "", + "Path": "/sys/limit/spa", + "Component": "sys/limit/spa/index", + "Icon": "eva:book-open-outline", "SortCode": "12", - "CreateTime": "", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.823", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "1", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212735263003733", "ParentId": "0", "Title": "基础工具", "Name": "", + "Description": "", "Code": "system", "Category": "MENU", "Module": "212725263003721", "MenuType": "CATALOG", - "Path": "/ozmlc6eyw5", + "Path": "/sys/dev", "Component": "", - "Icon": "tool-outlined", - "Color": "", + "Icon": "ant-design:tool-outlined", "SortCode": "13", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-11-11 08:42:34.04", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212735263003734", "ParentId": "212735263003733", "Title": "站内信息", "Name": "devMessage", + "Description": "", "Code": "system", "Category": "MENU", "Module": "212725263003721", "MenuType": "MENU", - "Path": "/dev/message/index", - "Component": "dev/message/index", - "Icon": "message-outlined", - "Color": "", + "Path": "/sys/dev/message", + "Component": "sys/dev/message/index", + "Icon": "ep:message", "SortCode": "14", - "CreateTime": "", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-11-11 08:43:10.76", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212745263003735", "ParentId": "0", "Title": "系统运维", "Name": "", + "Description": "", "Code": "system", "Category": "MENU", "Module": "212725263003721", "MenuType": "CATALOG", - "Path": "/a0l7fxfq3m", + "Path": "/sys/ops", "Component": "", - "Icon": "hdd-outlined", - "Color": "", + "Icon": "zondicons:servers", "SortCode": "15", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.823", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212745263003736", "ParentId": "212745263003735", "Title": "数据字典", - "Name": "devDict", + "Name": "sysDict", + "Description": "", "Code": "system", "Category": "MENU", "Module": "212725263003721", "MenuType": "MENU", - "Path": "/sys/dict", - "Component": "dev/dict/index", - "Icon": "file-search-outlined", - "Color": "", + "Path": "/sys/ops/dict", + "Component": "sys/ops/dict/index", + "Icon": "ep:notebook", "SortCode": "16", - "CreateTime": "", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.823", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "1", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212745263003737", "ParentId": "212745263003735", "Title": "系统配置", - "Name": "devConfig", + "Name": "sysConfig", + "Description": "", "Code": "system", "Category": "MENU", "Module": "212725263003721", "MenuType": "MENU", - "Path": "/sys/config", - "Component": "dev/config/index", - "Icon": "setting-outlined", - "Color": "", + "Path": "/sys/ops/config", + "Component": "sys/ops/config/index", + "Icon": "eva:settings-2-outline", "SortCode": "17", - "CreateTime": "", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.823", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "1", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212745263003738", - "ParentId": "212745263003735", + "ParentId": "0", "Title": "日志审计", "Name": "", + "Description": "", "Code": "system", "Category": "MENU", "Module": "212725263003721", "MenuType": "CATALOG", - "Path": "/x1vjuegii4", + "Path": "/sys/audit", "Component": "", - "Icon": "robot-outlined", - "Color": "", - "SortCode": "1", - "CreateTime": "", - "UpdateTime": "", + "Icon": "line-md:clipboard-list", + "SortCode": "14", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.823", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "undefined/:id", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212755263003739", "ParentId": "212745263003738", "Title": "访问日志", - "Name": "devVislog", + "Name": "sysVisLog", + "Description": "", "Code": "system", "Category": "MENU", "Module": "212725263003721", "MenuType": "MENU", - "Path": "/dev/vislog", - "Component": "dev/log/vislog/index", - "Icon": "bars-outlined", - "Color": "", + "Path": "/sys/audit/vislog", + "Component": "sys/audit/vislog/index", + "Icon": "ant-design:read-outlined", "SortCode": "18", - "CreateTime": "", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.823", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "1", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212755263003740", "ParentId": "212745263003738", "Title": "操作日志", - "Name": "devOplog", + "Name": "sysOpLog", + "Description": "", "Code": "system", "Category": "MENU", "Module": "212725263003721", "MenuType": "MENU", - "Path": "/dev/oplog", - "Component": "dev/log/oplog/index", - "Icon": "bars-outlined", - "Color": "", + "Path": "/sys/audit/oplog", + "Component": "sys/audit/oplog/index", + "Icon": "ant-design:solution-outlined", "SortCode": "19", - "CreateTime": "", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "212755263003741", - "ParentId": "0", - "Title": "在线开发", - "Name": "", - "Code": "system", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "CATALOG", - "Path": "/94mcv3octp", - "Component": "", - "Icon": "project-outlined", - "Color": "", - "SortCode": "20", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "212755263003742", - "ParentId": "212755263003741", - "Title": "代码生成", - "Name": "genIndex", - "Code": "system", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "MENU", - "Path": "/gen", - "Component": "gen/index", - "Icon": "rocket-outlined", - "Color": "", - "SortCode": "21", - "CreateTime": "", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "1", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212755263003743", "ParentId": "", - "Title": "业务", + "Title": "业务管理", "Name": "", - "Code": "system", + "Description": "用户自己的业务模块", + "Code": "biz", "Category": "MODULE", "Module": "", "MenuType": "", "Path": "", "Component": "", - "Icon": "profile-outlined", - "Color": "#d81b43", - "SortCode": "1", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "Icon": "local:ikun", + "SortCode": "2", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212755263003744", "ParentId": "0", "Title": "公司架构", "Name": "", + "Description": "", "Code": "system", "Category": "MENU", "Module": "212755263003743", "MenuType": "CATALOG", - "Path": "/1nlpdpnief", + "Path": "/biz/organization", "Component": "", - "Icon": "cluster-outlined", - "Color": "", + "Icon": "ep:school", "SortCode": "22", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212755263003745", "ParentId": "212755263003744", "Title": "机构管理", "Name": "bizOrg", + "Description": "", "Code": "system", "Category": "MENU", "Module": "212755263003743", "MenuType": "MENU", - "Path": "/biz/org", - "Component": "biz/org/index", - "Icon": "cluster-outlined", - "Color": "", + "Path": "/biz/organization/org", + "Component": "biz/organization/org/index", + "Icon": "ant-design:group-outlined", "SortCode": "23", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212755263003746", "ParentId": "212755263003744", "Title": "人员管理", "Name": "bizUser", + "Description": "", "Code": "system", "Category": "MENU", "Module": "212755263003743", "MenuType": "MENU", - "Path": "/biz/user", - "Component": "biz/user/index", - "Icon": "user-outlined", - "Color": "", + "Path": "/biz/organization/user", + "Component": "biz/organization/user/index", + "Icon": "ep:user", "SortCode": "24", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212755263003747", "ParentId": "212755263003744", "Title": "岗位管理", "Name": "bizPosition", + "Description": "", "Code": "system", "Category": "MENU", "Module": "212755263003743", "MenuType": "MENU", - "Path": "/biz/position", - "Component": "biz/position/index", - "Icon": "apartment-outlined", - "Color": "", + "Path": "/biz/organization/position", + "Component": "biz/organization/position/index", + "Icon": "ant-design:idcard-outlined", "SortCode": "25", - "CreateTime": "", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "212755263003748", - "ParentId": "0", - "Title": "开发示例", - "Name": "", - "Code": "system", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "CATALOG", - "Path": "/e2re4evf5y", - "Component": "", - "Icon": "project-outlined", - "Color": "", - "SortCode": "20", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "212755263003749", - "ParentId": "212755263003748", - "Title": "图标选择", - "Name": "tuBiaoXuanZe", - "Code": "system", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "MENU", - "Path": "/exm/iconSelect", - "Component": "exm/iconSelect/index", - "Icon": "right-circle-outlined", - "Color": "", - "SortCode": "43", - "CreateTime": "", - "UpdateTime": "2022-12-26 15:53:56.927", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "", "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "212755263003750", - "ParentId": "212755263003748", - "Title": "ECK线图", - "Name": "eCKXianTu", - "Code": "7voetv0mru", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "MENU", - "Path": "/exm/chart/eCKXianTu", - "Component": "exm/chart/eCYiBiaoTu", - "Icon": "appstore-outlined", - "Color": "", - "SortCode": "44", - "CreateTime": "", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "212755263003751", - "ParentId": "212755263003748", - "Title": "EC仪表图", - "Name": "eCYiBiaoTu", - "Code": "c4uor9wg1b", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "MENU", - "Path": "/exm/chart/eCYiBiaoTu", - "Component": "exm/chart/eCSanDianTu", - "Icon": "appstore-outlined", - "Color": "", - "SortCode": "45", - "CreateTime": "", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "212755263003752", - "ParentId": "212755263003748", - "Title": "EC散点图", - "Name": "eCSanDianTu", - "Code": "6r6ti8izxi", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "MENU", - "Path": "/exm/chart/eCSanDianTu", - "Component": "exm/chart/eCZhuZhuangTu", - "Icon": "appstore-outlined", - "Color": "", - "SortCode": "46", - "CreateTime": "", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "212755263003753", - "ParentId": "212755263003748", - "Title": "EC柱状图", - "Name": "eCZhuZhuangTu", - "Code": "s3ft1ri9qz", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "MENU", - "Path": "/exm/chart/eCZhuZhuangTu", - "Component": "exm/chart/eCShuXingTu", - "Icon": "appstore-outlined", - "Color": "", - "SortCode": "47", - "CreateTime": "", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "212755263003754", - "ParentId": "212755263003748", - "Title": "EC树形图", - "Name": "eCShuXingTu", - "Code": "63lz6owubp", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "MENU", - "Path": "/exm/chart/eCShuXingTu", - "Component": "exm/chart/eCLouDouTu", - "Icon": "appstore-outlined", - "Color": "", - "SortCode": "48", - "CreateTime": "", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "212755263003755", - "ParentId": "212755263003748", - "Title": "EC漏斗图", - "Name": "eCLouDouTu", - "Code": "d46vov3j2d", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "MENU", - "Path": "/exm/chart/eCLouDouTu", - "Component": "exm/chart/eCXianXingTu", - "Icon": "appstore-outlined", - "Color": "", - "SortCode": "49", - "CreateTime": "", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "212755263003756", - "ParentId": "212755263003748", - "Title": "EC线形图", - "Name": "eCXianXingTu", - "Code": "dgp8hclhlr", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "MENU", - "Path": "/exm/chart/eCXianXingTu", - "Component": "exm/chart/eCBingZhuangTu", - "Icon": "appstore-outlined", - "Color": "", - "SortCode": "50", - "CreateTime": "", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "212755263003757", - "ParentId": "212755263003748", - "Title": "EC饼状图", - "Name": "eCBingZhuangTu", - "Code": "2y1g7u2p1k", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "MENU", - "Path": "/exm/chart/eCBingZhuangTu", - "Component": "exm/chart/g2JinDuTu", - "Icon": "appstore-outlined", - "Color": "", - "SortCode": "51", - "CreateTime": "", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "212755263003758", - "ParentId": "212755263003748", - "Title": "G2进度图", - "Name": "g2JinDuTu", - "Code": "8vvhyctv2w", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "MENU", - "Path": "/exm/chart/g2JinDuTu", - "Component": "exm/chart/g2ZiDanTu", - "Icon": "appstore-outlined", - "Color": "", - "SortCode": "52", - "CreateTime": "", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "212755263003759", - "ParentId": "212755263003748", - "Title": "G2子弹图", - "Name": "g2ZiDanTu", - "Code": "3lgc3ci5f3", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "MENU", - "Path": "/exm/chart/g2ZiDanTu", - "Component": "exm/chart/g2SanDianTu", - "Icon": "appstore-outlined", - "Color": "", - "SortCode": "53", - "CreateTime": "", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "212755263003760", - "ParentId": "212755263003748", - "Title": "G2散点图", - "Name": "g2SanDianTu", - "Code": "e22qm4b30d", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "MENU", - "Path": "/exm/chart/g2SanDianTu", - "Component": "exm/chart/g2ZhuZhuangTu", - "Icon": "appstore-outlined", - "Color": "", - "SortCode": "54", - "CreateTime": "", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "212755263003761", - "ParentId": "212755263003748", - "Title": "G2柱状图", - "Name": "g2ZhuZhuangTu", - "Code": "92huf33fcf", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "MENU", - "Path": "/exm/chart/g2ZhuZhuangTu", - "Component": "exm/chart/g2LouDouTu", - "Icon": "appstore-outlined", - "Color": "", - "SortCode": "55", - "CreateTime": "", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "212755263003762", - "ParentId": "212755263003748", - "Title": "G2漏斗图", - "Name": "g2LouDouTu", - "Code": "7w3gnlts80", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "MENU", - "Path": "/exm/chart/g2LouDouTu", - "Component": "exm/chart/g2ZheXianTu", - "Icon": "appstore-outlined", - "Color": "", - "SortCode": "56", - "CreateTime": "", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "212755263003763", - "ParentId": "212755263003748", - "Title": "G2折线图", - "Name": "g2ZheXianTu", - "Code": "4g3gr90z1i", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "MENU", - "Path": "/exm/chart/g2ZheXianTu", - "Component": "exm/chart/g2CiYunTu", - "Icon": "appstore-outlined", - "Color": "", - "SortCode": "57", - "CreateTime": "", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "212755263003764", - "ParentId": "212755263003748", - "Title": "G2词云图", - "Name": "g2CiYunTu", - "Code": "atpbicf8em", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "MENU", - "Path": "/exm/chart/g2CiYunTu", - "Component": "exm/chart/g2MianJiTu", - "Icon": "appstore-outlined", - "Color": "", - "SortCode": "58", - "CreateTime": "", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "212755263003765", - "ParentId": "212755263003748", - "Title": "G2面积图", - "Name": "g2MianJiTu", - "Code": "m5lnxo3d56", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "MENU", - "Path": "/exm/chart/g2MianJiTu", - "Component": "exm/chart/g2BingZhuangTu", - "Icon": "appstore-outlined", - "Color": "", - "SortCode": "59", - "CreateTime": "", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "212755263003766", - "ParentId": "212755263003748", - "Title": "G2饼状图", - "Name": "g2BingZhuangTu", - "Code": "tmn482a18x", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "MENU", - "Path": "/exm/chart/g2BingZhuangTu", - "Component": "exm/chart/g2TiaoXingTu", - "Icon": "appstore-outlined", - "Color": "", - "SortCode": "60", - "CreateTime": "", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "212755263003767", - "ParentId": "212755263003748", - "Title": "G2条形图", - "Name": "g2TiaoXingTu", - "Code": "aej0gwpe43", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "MENU", - "Path": "/exm/chart/g2TiaoXingTu", - "Component": "", - "Icon": "appstore-outlined", - "Color": "", - "SortCode": "61", - "CreateTime": "", - "UpdateTime": "", - "CreateUserId": "", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212825263004728", "ParentId": "212755263003745", "Title": "新增机构", "Name": "", + "Description": "", "Code": "bizOrgAdd", "Category": "BUTTON", "Module": "", @@ -1093,22 +788,30 @@ "Path": "", "Component": "", "Icon": "", - "Color": "", "SortCode": "1", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "", "UpdateUserId": "", "CreateUser": "", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212825263004729", "ParentId": "212755263003745", "Title": "查询机构", "Name": "", + "Description": "", "Code": "bizOrgPage", "Category": "BUTTON", "Module": "", @@ -1116,22 +819,30 @@ "Path": "", "Component": "", "Icon": "", - "Color": "", "SortCode": "1", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "", "UpdateUserId": "", "CreateUser": "", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212825263004730", "ParentId": "212755263003745", "Title": "编辑机构", "Name": "", + "Description": "", "Code": "bizOrgEdit", "Category": "BUTTON", "Module": "", @@ -1139,22 +850,30 @@ "Path": "", "Component": "", "Icon": "", - "Color": "", "SortCode": "1", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "", "UpdateUserId": "", "CreateUser": "", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212825263004731", "ParentId": "212755263003745", "Title": "删除机构", "Name": "", + "Description": "", "Code": "bizOrgDelete", "Category": "BUTTON", "Module": "", @@ -1162,22 +881,30 @@ "Path": "", "Component": "", "Icon": "", - "Color": "", "SortCode": "1", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "", "UpdateUserId": "", "CreateUser": "", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212825263005734", "ParentId": "212755263003746", "Title": "新增人员", "Name": "", + "Description": "", "Code": "bizUserAdd", "Category": "BUTTON", "Module": "", @@ -1185,22 +912,30 @@ "Path": "", "Component": "", "Icon": "", - "Color": "", "SortCode": "1", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "", "UpdateUserId": "", "CreateUser": "", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212825263005735", "ParentId": "212755263003746", "Title": "批量删除", "Name": "", + "Description": "", "Code": "bizUserBatchDelete", "Category": "BUTTON", "Module": "", @@ -1208,22 +943,30 @@ "Path": "", "Component": "", "Icon": "", - "Color": "", "SortCode": "1", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "", "UpdateUserId": "", "CreateUser": "", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212825263005736", "ParentId": "212755263003746", "Title": "编辑人员", "Name": "", + "Description": "", "Code": "bizUserEdit", "Category": "BUTTON", "Module": "", @@ -1231,22 +974,30 @@ "Path": "", "Component": "", "Icon": "", - "Color": "", "SortCode": "1", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "", "UpdateUserId": "", "CreateUser": "", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212825263005737", "ParentId": "212755263003746", "Title": "授权角色", "Name": "", + "Description": "", "Code": "bizUserGrantRole", "Category": "BUTTON", "Module": "", @@ -1254,22 +1005,30 @@ "Path": "", "Component": "", "Icon": "", - "Color": "", "SortCode": "1", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "", "UpdateUserId": "", "CreateUser": "", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212825263005738", "ParentId": "212755263003746", "Title": "重置密码", "Name": "", + "Description": "", "Code": "bizUserPwdReset", "Category": "BUTTON", "Module": "", @@ -1277,22 +1036,30 @@ "Path": "", "Component": "", "Icon": "", - "Color": "", "SortCode": "1", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "", "UpdateUserId": "", "CreateUser": "", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212825263005739", "ParentId": "212755263003746", "Title": "删除人员", "Name": "", + "Description": "", "Code": "bizUserDelete", "Category": "BUTTON", "Module": "", @@ -1300,45 +1067,61 @@ "Path": "", "Component": "", "Icon": "", - "Color": "", "SortCode": "1", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "", "UpdateUserId": "", "CreateUser": "", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212825263005740", "ParentId": "212755263003746", "Title": "启用禁用", "Name": "", - "Code": "bizUserUpdataStatus", + "Description": "", + "Code": "bizUserUpdateStatus", "Category": "BUTTON", "Module": "", "MenuType": "", "Path": "", "Component": "", "Icon": "", - "Color": "", "SortCode": "1", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "", "UpdateUserId": "", "CreateUser": "", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212825263006739", "ParentId": "212755263003747", "Title": "新增岗位", "Name": "", + "Description": "", "Code": "bizPositionAdd", "Category": "BUTTON", "Module": "", @@ -1346,22 +1129,30 @@ "Path": "", "Component": "", "Icon": "", - "Color": "", "SortCode": "1", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "", "UpdateUserId": "", "CreateUser": "", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212825263006749", "ParentId": "212755263003747", "Title": "批量删除", "Name": "", + "Description": "", "Code": "bizPositionBatchDelete", "Category": "BUTTON", "Module": "", @@ -1369,22 +1160,30 @@ "Path": "", "Component": "", "Icon": "", - "Color": "", "SortCode": "1", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "", "UpdateUserId": "", "CreateUser": "", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212825263006750", "ParentId": "212755263003747", "Title": "编辑岗位", "Name": "", + "Description": "", "Code": "bizPositionEdit", "Category": "BUTTON", "Module": "", @@ -1392,22 +1191,30 @@ "Path": "", "Component": "", "Icon": "", - "Color": "", "SortCode": "1", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "", "UpdateUserId": "", "CreateUser": "", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "212825263006751", "ParentId": "212755263003747", "Title": "删除岗位", "Name": "", + "Description": "", "Code": "bizPositionDelete", "Category": "BUTTON", "Module": "", @@ -1415,114 +1222,92 @@ "Path": "", "Component": "", "Icon": "", - "Color": "", "SortCode": "1", - "CreateTime": "2022-12-7 12:20:46.197", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "", "UpdateUserId": "", "CreateUser": "", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "363532005732421", - "ParentId": "212745263003735", - "Title": "接口文档", - "Name": "7008338600685211648", - "Code": "", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "IFRAME", - "Path": "https://console-docs.apipost.cn/preview/1e7bca3db35bd13a/6d6e3ad27d4721de", - "Component": "", - "Icon": "file-word-outlined", - "Color": "", - "SortCode": "99", - "CreateTime": "2022-12-13 15:55:33.107", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "363798244282437", "ParentId": "212745263003735", "Title": "会话管理", "Name": "authMonitor", + "Description": "", "Code": "", "Category": "MENU", "Module": "212725263003721", "MenuType": "MENU", - "Path": "/auth/monitor", - "Component": "auth/monitor/index", - "Icon": "usergroup-delete-outlined", - "Color": "", + "Path": "/sys/ops/monitor", + "Component": "sys/ops/monitor/index", + "Icon": "ep:refrigerator", "SortCode": "23", - "CreateTime": "2022-12-14 09:58:52.753", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-9-24 10:56:44.767", "CreateUserId": "212725263002001", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", "CreateUser": "", - "UpdateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "1", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "369089951367237", "ParentId": "212735263003733", "Title": "文件管理", "Name": "devFile", + "Description": "", "Code": "", "Category": "MENU", "Module": "212725263003721", "MenuType": "MENU", "Path": "/dev/file/index", "Component": "dev/file/index", - "Icon": "copy-outlined", - "Color": "", + "Icon": "ep:home-filled", "SortCode": "99", - "CreateTime": "2022-12-29 08:50:53.427", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "212725263002001", "UpdateUserId": "", "CreateUser": "", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" - }, - { - "Id": "371662120710213", - "ParentId": "212745263003735", - "Title": "任务调度", - "Name": "7016663846832050176", - "Code": "", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "IFRAME", - "Path": "http://localhost:5566/schedule/", - "Component": "", - "Icon": "field-time-outlined", - "Color": "", - "SortCode": "99", - "CreateTime": "2023-1-5 15:17:04.46", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "CreateUser": "", - "UpdateUser": "", - "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "383020955254853", "ParentId": "212755263003745", "Title": "复制机构", "Name": "", + "Description": "", "Code": "bizOrgCopy", "Category": "BUTTON", "Module": "", @@ -1530,22 +1315,30 @@ "Path": "", "Component": "", "Icon": "", - "Color": "", "SortCode": "99", - "CreateTime": "2023-2-6 17:36:17.423", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "212725263002001", "UpdateUserId": "", "CreateUser": "superAdmin", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { "Id": "383022400483397", "ParentId": "212755263003745", "Title": "批量删除机构", "Name": "", + "Description": "", "Code": "bizOrgBatchDelete", "Category": "BUTTON", "Module": "", @@ -1553,223 +1346,364 @@ "Path": "", "Component": "", "Icon": "", - "Color": "", "SortCode": "99", - "CreateTime": "2023-2-6 17:42:10.263", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "212725263002001", "UpdateUserId": "", "CreateUser": "superAdmin", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { - "Id": "385833289756741", - "ParentId": "212755263003744", - "Title": "测试管理", - "Name": "test", - "Code": "82kwR49WBU", - "Category": "MENU", - "Module": "212755263003743", - "MenuType": "MENU", - "Path": "/biz/test", - "Component": "biz/test/index", - "Icon": "down-square-outlined", - "Color": "", + "Id": "391869166551109", + "ParentId": "212755263003746", + "Title": "导入人员", + "Name": "", + "Description": "", + "Code": "bizUserImport", + "Category": "BUTTON", + "Module": "", + "MenuType": "", + "Path": "", + "Component": "", + "Icon": "", "SortCode": "99", - "CreateTime": "2023-2-14 16:19:42.553", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "212725263002001", "UpdateUserId": "", "CreateUser": "superAdmin", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { - "Id": "385833289920581", - "ParentId": "385833289756741", - "Title": "新增测试", + "Id": "391869250662469", + "ParentId": "212755263003746", + "Title": "导出人员", "Name": "", - "Code": "genTestAdd", + "Description": "", + "Code": "bizUserExport", "Category": "BUTTON", "Module": "", "MenuType": "", "Path": "", "Component": "", "Icon": "", - "Color": "", - "SortCode": "1", - "CreateTime": "2023-2-14 16:19:42.577", - "UpdateTime": "", + "SortCode": "99", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "212725263002001", "UpdateUserId": "", "CreateUser": "superAdmin", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { - "Id": "385833289920582", - "ParentId": "385833289756741", - "Title": "编辑测试", + "Id": "395712751292485", + "ParentId": "212755263003746", + "Title": "批量编辑", "Name": "", - "Code": "genTestEdit", + "Description": "", + "Code": "bizUserBatchEdit", "Category": "BUTTON", "Module": "", "MenuType": "", "Path": "", "Component": "", "Icon": "", - "Color": "", - "SortCode": "2", - "CreateTime": "2023-2-14 16:19:42.577", - "UpdateTime": "", + "SortCode": "99", + "CreateTime": "2023-8-14 16:19:29.637", + "UpdateTime": "2024-7-23 09:09:41.827", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" + }, + { + "Id": "516428665102405", + "ParentId": "0", + "Title": "系统设置", + "Name": "", + "Description": "", + "Code": "", + "Category": "MENU", + "Module": "212755263003743", + "MenuType": "CATALOG", + "Path": "/biz/ops", + "Component": "", + "Icon": "ep:set-up", + "SortCode": "99", + "CreateTime": "2024-2-18 16:53:39.087", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "212725263002001", "UpdateUserId": "", "CreateUser": "superAdmin", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "1", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" }, { - "Id": "385833289920583", - "ParentId": "385833289756741", - "Title": "删除测试", + "Id": "517412647174213", + "ParentId": "212755263003744", + "Title": "角色管理", + "Name": "bizRole", + "Description": "", + "Code": "", + "Category": "MENU", + "Module": "212755263003743", + "MenuType": "MENU", + "Path": "/biz/organization/role", + "Component": "biz/organization/role/index", + "Icon": "ant-design:team-outlined", + "SortCode": "99", + "CreateTime": "2024-2-21 11:37:29.083", + "UpdateTime": "2024-7-23 09:09:41.827", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "1", + "IsHome": "0", + "Status": "ENABLE", + "IsLink": "" + }, + { + "Id": "517470837813317", + "ParentId": "517412647174213", + "Title": "新增角色", "Name": "", - "Code": "genTestDelete", + "Description": "", + "Code": "bizRoleAdd", "Category": "BUTTON", "Module": "", "MenuType": "", "Path": "", "Component": "", "Icon": "", - "Color": "", - "SortCode": "3", - "CreateTime": "2023-2-14 16:19:42.577", - "UpdateTime": "", + "SortCode": "1", + "CreateTime": "2024-2-21 15:34:15.803", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "212725263002001", "UpdateUserId": "", "CreateUser": "superAdmin", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "", + "IsLink": "" }, { - "Id": "385833289920584", - "ParentId": "385833289756741", - "Title": "批量删除测试", + "Id": "517470837813318", + "ParentId": "517412647174213", + "Title": "编辑角色", "Name": "", - "Code": "genTestBatchDelete", + "Description": "", + "Code": "bizRoleEdit", "Category": "BUTTON", "Module": "", "MenuType": "", "Path": "", "Component": "", "Icon": "", - "Color": "", - "SortCode": "4", - "CreateTime": "2023-2-14 16:19:42.577", - "UpdateTime": "", + "SortCode": "2", + "CreateTime": "2024-2-21 15:34:15.807", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "212725263002001", "UpdateUserId": "", "CreateUser": "superAdmin", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "", + "IsLink": "" }, { - "Id": "391869166551109", - "ParentId": "212755263003746", - "Title": "导入人员", + "Id": "517470837813319", + "ParentId": "517412647174213", + "Title": "删除角色", "Name": "", - "Code": "bizUserImport", + "Description": "", + "Code": "bizRoleDelete", "Category": "BUTTON", "Module": "", "MenuType": "", "Path": "", "Component": "", "Icon": "", - "Color": "", - "SortCode": "99", - "CreateTime": "2023-3-3 17:39:45.26", - "UpdateTime": "", + "SortCode": "3", + "CreateTime": "2024-2-21 15:34:15.81", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "212725263002001", "UpdateUserId": "", "CreateUser": "superAdmin", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "", + "IsLink": "" }, { - "Id": "391869250662469", - "ParentId": "212755263003746", - "Title": "导出人员", + "Id": "517470837813320", + "ParentId": "517412647174213", + "Title": "批量删除角色", "Name": "", - "Code": "bizUserExport", + "Description": "", + "Code": "bizRoleBatchDelete", "Category": "BUTTON", "Module": "", "MenuType": "", "Path": "", "Component": "", "Icon": "", - "Color": "", - "SortCode": "99", - "CreateTime": "2023-3-3 17:40:05.793", - "UpdateTime": "", + "SortCode": "4", + "CreateTime": "2024-2-21 15:34:15.81", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "212725263002001", "UpdateUserId": "", "CreateUser": "superAdmin", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "", + "IsLink": "" }, { - "Id": "394242824978501", - "ParentId": "212745263003735", - "Title": "批量修改", - "Name": "batch", - "Code": "1eODEEBHRv", - "Category": "MENU", - "Module": "212725263003721", - "MenuType": "MENU", - "Path": "/sys/batch", - "Component": "sys/batch/index", - "Icon": "form-outlined", - "Color": "", + "Id": "517480163758149", + "ParentId": "517412647174213", + "Title": "授权资源", + "Name": "", + "Description": "", + "Code": "bizRoleGrantResource", + "Category": "BUTTON", + "Module": "", + "MenuType": "", + "Path": "", + "Component": "", + "Icon": "", "SortCode": "99", - "CreateTime": "2023-3-10 10:38:11.737", - "UpdateTime": "", + "CreateTime": "2024-2-21 16:12:12.627", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "212725263002001", "UpdateUserId": "", "CreateUser": "superAdmin", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "", + "IsLink": "" }, { - "Id": "395712751292485", - "ParentId": "212755263003746", - "Title": "批量编辑", + "Id": "517480218902597", + "ParentId": "517412647174213", + "Title": "授权用户", "Name": "", - "Code": "bizUserBatchEdit", + "Description": "", + "Code": "bizRoleGrantUser", "Category": "BUTTON", "Module": "", "MenuType": "", "Path": "", "Component": "", "Icon": "", - "Color": "", "SortCode": "99", - "CreateTime": "2023-3-14 14:19:20.44", - "UpdateTime": "", + "CreateTime": "2024-2-21 16:12:26.087", + "UpdateTime": "2024-7-23 09:09:41.827", "CreateUserId": "212725263002001", "UpdateUserId": "", "CreateUser": "superAdmin", "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "ActiveMenu": "", + "IsHide": "0", + "IsFull": "0", + "IsAffix": "0", + "IsKeepAlive": "0", + "IsHome": "0", + "Status": "", + "IsLink": "" } ] } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_role.json b/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_role.json index 9ebc34774f61b7ccf9bebf56842ac9c1667af7c8..7637fa0e962d74c8bc252010e2c9ab0afb859a2b 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_role.json +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_role.json @@ -9,12 +9,15 @@ "DefaultDataScope": "{\"Level\":5,\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[]}", "SortCode": "1", "CreateOrgId": "0", - "CreateTime": "", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.82", + "UpdateTime": "2024-7-23 09:09:42.077", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "212725263001002", @@ -25,12 +28,15 @@ "DefaultDataScope": "{\"Level\":5,\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[]}", "SortCode": "1", "CreateOrgId": "0", - "CreateTime": "", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.9", + "UpdateTime": "2024-7-23 09:09:42.077", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "359567292014661", @@ -41,12 +47,15 @@ "DefaultDataScope": "{\"Level\":4,\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[]}", "SortCode": "99", "CreateOrgId": "0", - "CreateTime": "", - "UpdateTime": "2022-12-7 16:52:36.607", + "CreateTime": "2023-8-14 16:19:29.9", + "UpdateTime": "2024-7-23 09:09:42.077", "CreateUserId": "", "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "360645671104581", @@ -57,12 +66,15 @@ "DefaultDataScope": "{\"Level\":2,\"ScopeCategory\":\"SCOPE_ORG\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885]}", "SortCode": "99", "CreateOrgId": "0", - "CreateTime": "", - "UpdateTime": "2022-12-7 16:52:32.42", + "CreateTime": "2023-8-14 16:19:29.9", + "UpdateTime": "2024-7-23 09:09:42.077", "CreateUserId": "", "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "360646281904197", @@ -73,12 +85,15 @@ "DefaultDataScope": "{\"Level\":3,\"ScopeCategory\":\"SCOPE_ORG_DEFINE\",\"ScopeDefineOrgIdList\":[360642028625989,361404296994885,360642028625989,361404296994885]}", "SortCode": "99", "CreateOrgId": "0", - "CreateTime": "", - "UpdateTime": "2022-12-7 16:52:26.153", + "CreateTime": "2023-8-14 16:19:29.903", + "UpdateTime": "2024-7-23 09:09:42.077", "CreateUserId": "", "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "360646662586437", @@ -89,12 +104,15 @@ "DefaultDataScope": "{\"Level\":1,\"ScopeCategory\":\"SCOPE_SELF\",\"ScopeDefineOrgIdList\":[]}", "SortCode": "99", "CreateOrgId": "0", - "CreateTime": "", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.903", + "UpdateTime": "2024-7-23 09:09:42.077", "CreateUserId": "", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "363084914917445", @@ -105,12 +123,53 @@ "DefaultDataScope": "{\"Level\":4,\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[]}", "SortCode": "99", "CreateOrgId": "252885263003720", - "CreateTime": "2022-12-12 09:36:20.077", - "UpdateTime": "", + "CreateTime": "2023-8-14 16:19:29.903", + "UpdateTime": "2024-7-23 09:09:42.077", "CreateUserId": "212725263002001", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "511793641513029", + "OrgId": "", + "Name": "租户管理员", + "Code": "1q8bMS9rgF", + "Category": "GLOBAL", + "DefaultDataScope": "{\"Level\":4,\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[]}", + "SortCode": "99", + "CreateOrgId": "252885263003720", + "CreateTime": "2024-2-5 14:33:41.53", + "UpdateTime": "2024-7-23 09:09:42.077", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "517794467639365", + "OrgId": "510752889880645", + "Name": "测试", + "Code": "pwrxO3v8X5", + "Category": "ORG", + "DefaultDataScope": "{\"Level\":4,\"ScopeCategory\":\"SCOPE_ORG_CHILD\",\"ScopeDefineOrgIdList\":[]}", + "SortCode": "99", + "CreateOrgId": "510752889880645", + "CreateTime": "2024-2-22 13:31:06.97", + "UpdateTime": "2024-7-23 09:09:42.077", + "CreateUserId": "511724553736261", + "UpdateUserId": "511724553736261", + "CreateUser": "旺仔科技管理员", + "UpdateUser": "旺仔科技管理员", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" } ] } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_user.json b/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_user.json index a7d46074f2f04ec7aa2e11d682c23c1ce51df09f..737cc4ff0bcdae9cb8f2e534446cf7d6dd8c04f4 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_user.json +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_user.json @@ -3,16 +3,15 @@ { "Id": "212725263002001", "Avatar": "data:image/png;base64,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", - "Signature": "", + "Signature": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAEsCAYAAAA7Ldc6AAAAAXNSR0IArs4c6QAAIABJREFUeF7t3Qe0fVldH/CvM5Sh9w4qOAMRqQMICIIEgUWRGiBUKQOCgKFZQFSEABIgGJOhdw1tAkNHIiGCEUTaAGYy9C6hCAy9Dt7f8kwyPu9975377j1v330/e61ZrGHOPvu3P7+z/v/3e+fsvX8iGgECBAgQIECAAAECBCYS+ImJxjEMAQIECBAgQIAAAQIEogDxEBAgQIAAAQIECBAgMJmAAmQyagMRIECAAAECBAgQIKAA8QwQIECAAAECBAgQIDCZgAJkMmoDESBAgAABAgQIECCgAPEMECBAgAABAgQIECAwmYACZDJqAxEgQIAAAQIECBAgoADxDBAgQIAAAQIECBAgMJmAAmQyagMRIECAAAECBAgQIKAA8QwQIECAAAECBAgQIDCZgAJkMmoDESBAgAABAgQIECCgAPEMECBAgAABAgQIECAwmYACZDJqAxEgQIAAAQIECBAgoADxDBAgQIAAAQIECBAgMJmAAmQyagMRIECAAAECBAgQIKAA8QwQIECAAAECBAgQIDCZgAJkMmoDESBAgAABAgQIECCgAPEMECBAgAABAgQIECAwmYACZDJqAxEgQIAAAQIECBAgoADxDBAgQIAAAQIECBAgMJmAAmQyagMRIECAAAECBAgQIKAA8QwQIECAAAECBAgQIDCZgAJkMmoDESBAgAABAgQIECCgAPEMECBAgAABAgQIECAwmYACZDJqAxEgQIAAAQIECBAgoADxDBAgQIAAAQIECBAgMJmAAmQyagMRIECAAAECBAgQIKAA8QwQIECAAAECBAgQIDCZgAJkMmoDESBAgAABAgQIECCgAPEMECBAgAABAgQIECAwmYACZDJqAxEgQIAAAQIECBAgoADxDBAgQIAAAQIECBAgMJmAAmQyagMRIECAAAECBAgQIKAA8QwQIECAAAECBAgQIDCZgAJkMmoDESBAgAABAgQIECCgAPEMECBAgAABAgQIECAwmYACZDJqAxEgQIAAAQIECBAgoADxDBAgQIAAAQIECBAgMJmAAmQyagMRIECAAAECBAgQIKAA8QwQIECAAAECBAgQIDCZgAJkMmoDESBAgAABAgQIECCgAPEMECBAgAABAgQIECAwmYACZDJqAxEg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", "Account": "superAdmin", "Password": "c1c4766b4aa8340df0efa38ff9b50011", "Name": "超管", "Nickname": "", "Gender": "男", - "Age": "", "Birthday": "1990-01-01", "Nation": "汉", - "Native_Place": "", + "NativePlace": "", "HomeAddress": "少林寺驻北固山办事处", "MailingAddress": "", "IdCardType": "身份证", @@ -27,7 +26,7 @@ "Email": "superAdmin@foxmail.com", "HomeTel": "", "OfficeTel": "", - "Emergency_Contact": "", + "EmergencyContact": "", "EmergencyPhone": "", "EmergencyAddress": "", "EmpNo": "0001", @@ -36,23 +35,26 @@ "PositionId": "212725263003001", "PositionLevel": "C1", "DirectorId": "", - "PositionJson": "", - "LastLoginIp": "127.0.0.1", + "PwdRemindUpdateTime": "2023-9-1 09:47:18", + "LastLoginIp": "192.168.0.25", "LastLoginAddress": "内网IP|内网IP", - "LastLoginTime": "2022-12-12 10:17:06", + "LastLoginTime": "2024-12-23 14:37:51", "LastLoginDevice": "PC", - "LatestLoginIp": "127.0.0.1", + "LatestLoginIp": "192.168.0.25", "LatestLoginAddress": "内网IP|内网IP", - "LatestLoginTime": "2022-12-12 10:17:51.92", + "LatestLoginTime": "2024-12-23 14:48:57.13", "LatestLoginDevice": "PC", - "UserStatus": "ENABLE", "SortCode": "1", - "CreateTime": "", - "UpdateTime": "2022-12-12 10:17:51.923", + "DefaultModule": "", + "CreateTime": "2023-8-14 16:19:30.043", + "UpdateTime": "2024-9-20 08:46:32.93", "CreateUserId": "0", - "UpdateUserId": "", + "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "212725263002002", @@ -63,10 +65,9 @@ "Name": "业管", "Nickname": "", "Gender": "男", - "Age": "", "Birthday": "1990-01-01", "Nation": "汉", - "Native_Place": "", + "NativePlace": "", "HomeAddress": "少林寺驻武当山办事处", "MailingAddress": "", "IdCardType": "身份证", @@ -81,7 +82,7 @@ "Email": "bizAdmin@foxmail.com", "HomeTel": "", "OfficeTel": "", - "Emergency_Contact": "", + "EmergencyContact": "", "EmergencyPhone": "", "EmergencyAddress": "", "EmpNo": "0002", @@ -90,23 +91,26 @@ "PositionId": "212725263003001", "PositionLevel": "C1", "DirectorId": "212725263002001", - "PositionJson": "", - "LastLoginIp": "", - "LastLoginAddress": "", - "LastLoginTime": "", - "LastLoginDevice": "", + "PwdRemindUpdateTime": "2023-8-17 09:45:29", + "LastLoginIp": "127.0.0.1", + "LastLoginAddress": "内网IP|内网IP", + "LastLoginTime": "2024-12-23 11:30:42", + "LastLoginDevice": "PC", "LatestLoginIp": "127.0.0.1", "LatestLoginAddress": "内网IP|内网IP", - "LatestLoginTime": "2022-12-7 13:41:37", + "LatestLoginTime": "2024-12-23 13:59:37.683", "LatestLoginDevice": "PC", - "UserStatus": "ENABLE", "SortCode": "1", - "CreateTime": "", - "UpdateTime": "2022-12-7 14:50:55.86", + "DefaultModule": "", + "CreateTime": "2023-8-14 16:19:30.047", + "UpdateTime": "2024-7-23 09:09:42.963", "CreateUserId": "0", "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "359177888051269", @@ -117,10 +121,9 @@ "Name": "仅自己", "Nickname": "", "Gender": "男", - "Age": "", "Birthday": "", "Nation": "", - "Native_Place": "", + "NativePlace": "", "HomeAddress": "", "MailingAddress": "", "IdCardType": "", @@ -135,7 +138,7 @@ "Email": "", "HomeTel": "", "OfficeTel": "", - "Emergency_Contact": "", + "EmergencyContact": "", "EmergencyPhone": "", "EmergencyAddress": "", "EmpNo": "", @@ -144,7 +147,7 @@ "PositionId": "360728646910021", "PositionLevel": "", "DirectorId": "359177888051269", - "PositionJson": "", + "PwdRemindUpdateTime": "", "LastLoginIp": "127.0.0.1", "LastLoginAddress": "内网IP|内网IP", "LastLoginTime": "2022-12-7 13:08:56", @@ -153,14 +156,17 @@ "LatestLoginAddress": "内网IP|内网IP", "LatestLoginTime": "2022-12-7 13:10:34", "LatestLoginDevice": "PC", - "UserStatus": "ENABLE", "SortCode": "0", - "CreateTime": "2022-1-12 08:38:36.093", - "UpdateTime": "2022-12-7 14:51:13.677", + "DefaultModule": "", + "CreateTime": "2023-8-14 16:19:30.05", + "UpdateTime": "2024-7-23 09:09:42.963", "CreateUserId": "212725263002001", "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "361405857865797", @@ -171,10 +177,9 @@ "Name": "所属组织及以下", "Nickname": "", "Gender": "男", - "Age": "", "Birthday": "", "Nation": "", - "Native_Place": "", + "NativePlace": "", "HomeAddress": "", "MailingAddress": "", "IdCardType": "", @@ -189,7 +194,7 @@ "Email": "", "HomeTel": "", "OfficeTel": "", - "Emergency_Contact": "", + "EmergencyContact": "", "EmergencyPhone": "", "EmergencyAddress": "", "EmpNo": "", @@ -198,23 +203,26 @@ "PositionId": "212725263003002", "PositionLevel": "", "DirectorId": "", - "PositionJson": "", - "LastLoginIp": "", - "LastLoginAddress": "", - "LastLoginTime": "", - "LastLoginDevice": "", - "LatestLoginIp": "127.0.0.1", + "PwdRemindUpdateTime": "2024-9-13 15:59:32", + "LastLoginIp": "192.168.0.25", + "LastLoginAddress": "内网IP|内网IP", + "LastLoginTime": "2024-9-13 15:59:32", + "LastLoginDevice": "PC", + "LatestLoginIp": "192.168.0.25", "LatestLoginAddress": "内网IP|内网IP", - "LatestLoginTime": "2022-12-7 16:57:56.567", + "LatestLoginTime": "2024-9-13 15:59:39.623", "LatestLoginDevice": "PC", - "UserStatus": "ENABLE", "SortCode": "", - "CreateTime": "2022-12-7 15:44:14.037", - "UpdateTime": "2022-12-7 16:57:56.637", + "DefaultModule": "", + "CreateTime": "2023-8-14 16:19:30.05", + "UpdateTime": "2024-7-23 09:09:42.967", "CreateUserId": "212725263002001", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "361405930270789", @@ -225,10 +233,9 @@ "Name": "所属组织", "Nickname": "", "Gender": "男", - "Age": "", "Birthday": "", "Nation": "", - "Native_Place": "", + "NativePlace": "", "HomeAddress": "", "MailingAddress": "", "IdCardType": "", @@ -243,7 +250,7 @@ "Email": "", "HomeTel": "", "OfficeTel": "", - "Emergency_Contact": "", + "EmergencyContact": "", "EmergencyPhone": "", "EmergencyAddress": "", "EmpNo": "", @@ -252,7 +259,7 @@ "PositionId": "361415094177861", "PositionLevel": "", "DirectorId": "", - "PositionJson": "", + "PwdRemindUpdateTime": "", "LastLoginIp": "127.0.0.1", "LastLoginAddress": "内网IP|内网IP", "LastLoginTime": "2022-12-7 17:45:07.437", @@ -261,14 +268,17 @@ "LatestLoginAddress": "内网IP|内网IP", "LatestLoginTime": "2022-12-12 10:17:14.463", "LatestLoginDevice": "PC", - "UserStatus": "ENABLE", "SortCode": "", - "CreateTime": "2022-12-7 15:44:31.713", - "UpdateTime": "2022-12-12 10:17:14.467", + "DefaultModule": "", + "CreateTime": "2023-8-14 16:19:30.05", + "UpdateTime": "2024-7-23 09:09:42.967", "CreateUserId": "212725263002001", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "361406147739717", @@ -279,10 +289,9 @@ "Name": "自定义", "Nickname": "", "Gender": "男", - "Age": "", "Birthday": "", "Nation": "", - "Native_Place": "", + "NativePlace": "", "HomeAddress": "", "MailingAddress": "", "IdCardType": "", @@ -297,7 +306,7 @@ "Email": "", "HomeTel": "", "OfficeTel": "", - "Emergency_Contact": "", + "EmergencyContact": "", "EmergencyPhone": "", "EmergencyAddress": "", "EmpNo": "", @@ -306,7 +315,7 @@ "PositionId": "212725263003005", "PositionLevel": "", "DirectorId": "", - "PositionJson": "", + "PwdRemindUpdateTime": "", "LastLoginIp": "127.0.0.1", "LastLoginAddress": "内网IP|内网IP", "LastLoginTime": "2022-12-7 17:26:06.2", @@ -315,14 +324,17 @@ "LatestLoginAddress": "内网IP|内网IP", "LatestLoginTime": "2022-12-7 17:45:53.667", "LatestLoginDevice": "PC", - "UserStatus": "ENABLE", "SortCode": "", - "CreateTime": "2022-12-7 15:45:24.81", - "UpdateTime": "2022-12-7 17:45:53.667", + "DefaultModule": "", + "CreateTime": "2023-8-14 16:19:30.05", + "UpdateTime": "2024-7-23 09:09:42.967", "CreateUserId": "212725263002001", "UpdateUserId": "", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "361414413160517", @@ -333,10 +345,9 @@ "Name": "研发1", "Nickname": "", "Gender": "男", - "Age": "", "Birthday": "", "Nation": "", - "Native_Place": "", + "NativePlace": "", "HomeAddress": "", "MailingAddress": "", "IdCardType": "", @@ -351,7 +362,7 @@ "Email": "", "HomeTel": "", "OfficeTel": "", - "Emergency_Contact": "", + "EmergencyContact": "", "EmergencyPhone": "", "EmergencyAddress": "", "EmpNo": "", @@ -360,7 +371,7 @@ "PositionId": "361414036955205", "PositionLevel": "", "DirectorId": "", - "PositionJson": "", + "PwdRemindUpdateTime": "", "LastLoginIp": "", "LastLoginAddress": "", "LastLoginTime": "", @@ -369,14 +380,17 @@ "LatestLoginAddress": "", "LatestLoginTime": "", "LatestLoginDevice": "", - "UserStatus": "ENABLE", "SortCode": "", - "CreateTime": "2022-12-7 16:19:02.733", - "UpdateTime": "2022-12-7 16:22:14.62", + "DefaultModule": "", + "CreateTime": "2023-8-14 16:19:30.05", + "UpdateTime": "2024-7-23 09:09:42.967", "CreateUserId": "212725263002001", "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "361414486462533", @@ -387,10 +401,9 @@ "Name": "研发2", "Nickname": "", "Gender": "男", - "Age": "", "Birthday": "", "Nation": "", - "Native_Place": "", + "NativePlace": "", "HomeAddress": "", "MailingAddress": "", "IdCardType": "", @@ -405,7 +418,7 @@ "Email": "", "HomeTel": "", "OfficeTel": "", - "Emergency_Contact": "", + "EmergencyContact": "", "EmergencyPhone": "", "EmergencyAddress": "", "EmpNo": "", @@ -414,7 +427,7 @@ "PositionId": "361414036955205", "PositionLevel": "", "DirectorId": "", - "PositionJson": "", + "PwdRemindUpdateTime": "", "LastLoginIp": "", "LastLoginAddress": "", "LastLoginTime": "", @@ -423,14 +436,17 @@ "LatestLoginAddress": "", "LatestLoginTime": "", "LatestLoginDevice": "", - "UserStatus": "ENABLE", "SortCode": "", - "CreateTime": "2022-12-7 16:19:20.63", - "UpdateTime": "2022-12-7 17:28:05.203", + "DefaultModule": "", + "CreateTime": "2023-8-14 16:19:30.05", + "UpdateTime": "2024-7-23 09:09:42.967", "CreateUserId": "212725263002001", "UpdateUserId": "361406147739717", + "CreateUser": "", + "UpdateUser": "", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" }, { "Id": "363085233066053", @@ -441,10 +457,9 @@ "Name": "研管", "Nickname": "", "Gender": "男", - "Age": "", "Birthday": "", "Nation": "", - "Native_Place": "", + "NativePlace": "", "HomeAddress": "", "MailingAddress": "", "IdCardType": "", @@ -455,11 +470,11 @@ "Education": "", "EduLength": "", "Degree": "", - "Phone": "", + "Phone": "e126a5a340f0b9f7bf372f5f212ca0e4", "Email": "", "HomeTel": "", "OfficeTel": "", - "Emergency_Contact": "", + "EmergencyContact": "", "EmergencyPhone": "", "EmergencyAddress": "", "EmpNo": "", @@ -468,23 +483,362 @@ "PositionId": "361415094177861", "PositionLevel": "", "DirectorId": "", - "PositionJson": "", + "PwdRemindUpdateTime": "2024-2-4 16:27:36", + "LastLoginIp": "127.0.0.1", + "LastLoginAddress": "内网IP|内网IP", + "LastLoginTime": "2024-2-5 14:37:14", + "LastLoginDevice": "PC", + "LatestLoginIp": "192.168.0.25", + "LatestLoginAddress": "内网IP|内网IP", + "LatestLoginTime": "2024-11-11 15:19:05.53", + "LatestLoginDevice": "PC", + "SortCode": "", + "DefaultModule": "", + "CreateTime": "2023-8-14 16:19:30.05", + "UpdateTime": "2024-7-23 09:09:42.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "511717041197125", + "Avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAABHNCSVQICAgIfAhkiAAABFlJREFUeJzt3E1MFGcAxvGHRoIoLaxa1lDqtOGjVi8QtyHBA4lghGjS9kRNTS9sUps22hPbHtpLDwVOjYeWAyY90AZujTZRW23gYLXJEq1JMUHauAYIS5EFWYObJbEHswPLMrs77Ozsk/r8TjrAzGz+M/O+75BQhEDbUwiNFwp9ApJMQcgoCBkFIaMgZBSEjIKQURAyCkJGQcgoCBkFIaMgZBSEjIKQURAyCkJGQcgoCBkFIaMgZBSEjIKQURAyCkJGQcgoCBkFIaMgZBSEjIKQURAyCkJGQcgoCBkFIaMgZBSEzLZCn0C+3A8MwvB4t/zz1yZvoW2g28Ezyo4rQa76+9Ba25j2e/pGh9Hd0ml7332jwwhcGrD8+lx0ESvxWNb7Ky0uQWVZhe3zcIorQcLRCEKRMIC1DxxbjWN2eSHlezdurygtQ/n2nVh68hiLK1Fz+94Xd6FkW3HGY38/diVtsI16O/xbujCc4kqQ94e+Nv+d+MCzywt4rfdU0nYAKdsTd1dwaiLpEZLrI4mVBnUy/9tBPaG7pbOgjyC76IIYHi+e9vyasr21tnHT7ZloUM/R0pPHCE5NmP+v3V0Fw+NFKBLG5MMZc7uvuh7l23dm3J8G9RwtrkSTBu+r/j4YHi8mH86kDOrpgqyfGNgRuDRgK6DTXAmy2VW3/tEUioQxfGfEseNt5dFmpeizo47tKxuuBImsRNOuQ6YfzTt+TKt1TrYKNaV2JUjPyBB6RoYAZF6HODWob9z/eom1TbrXI07eZXbQjSFOr9Q3s3vHSwCevUFgQxPEajC1WqnnwlNaBgCYWvrXkf056blcqZcWlxT6FCzR3CGZ3k1ZjSGhSNjWFPdYna+gC79MChqky9eOkw1HUF2+x3KmZTWGJNidoX3Zthavu6UTHzadwOg/f+LbGxdx5V7Q3gfIgyK3/26v1UrYar6fzYwoW9c/+gbNxkEAwIXx37GvwouGqhrz67dn/sbwnRFzRlgIrtwhx+p8+ODQURx6pQ5vvPyquX0uuoibD8ZxYfxGXo//w3uf4/j+JnNl/+Pt38xfCSTuUl91PRqqatBQVYPTTSdwPfRX0q8N3OLOOqTDb16JsdU4xqYncPHuzbxdiV2+dhypbcSBSgNvVu4zp8ehSBj9f/ycdNzzwcs4H7wM4Fm4w8ZBGB4vDI8Xx/c3uf44c+WR1f/uWbTXv2V51eW6CAtFwvjq2iC+aD2Vsj6JrcZxd+4BfrkXzPodVW+HH28faDbv5thqHB//dM4Ml0+ujyGbuR8YzOnnpx/N4/B3n+LWmX68vmsvZpcXMLU0j7HpiZxeFHb52vFJ8zsAgMZzp3M6x2xRBJE1z+XCkJmCkFEQMgpCRkHIKAgZBSGjIGQUhIyCkFEQMgpCRkHIKAgZBSGjIGQUhIyCkFEQMgpCRkHIKAgZBSGjIGQUhIyCkFEQMgpCRkHIKAgZBSGjIGQUhIyCkFEQMgpCRkHIKAiZ/wCVVIG9+MF24QAAAABJRU5ErkJggg==", + "Signature": "", + "Account": "研发部管理员", + "Password": "c1c4766b4aa8340df0efa38ff9b50011", + "Name": "研发部管理员", + "Nickname": "", + "Gender": "男", + "Birthday": "", + "Nation": "", + "NativePlace": "", + "HomeAddress": "", + "MailingAddress": "", + "IdCardType": "身份证", + "IdCardNumber": "", + "CultureLevel": "", + "PoliticalOutlook": "", + "College": "", + "Education": "", + "EduLength": "", + "Degree": "", + "Phone": "e126a5a340f0b9f7bf372f5f212ca0e4", + "Email": "", + "HomeTel": "", + "OfficeTel": "", + "EmergencyContact": "", + "EmergencyPhone": "", + "EmergencyAddress": "", + "EmpNo": "", + "EntryDate": "", + "OrgId": "464837557956677", + "PositionId": "485593012985925", + "PositionLevel": "", + "DirectorId": "", + "PwdRemindUpdateTime": "", + "LastLoginIp": "", + "LastLoginAddress": "", + "LastLoginTime": "", + "LastLoginDevice": "", + "LatestLoginIp": "", + "LatestLoginAddress": "", + "LatestLoginTime": "", + "LatestLoginDevice": "", + "SortCode": "99", + "DefaultModule": "", + "CreateTime": "2024-2-5 09:22:00.28", + "UpdateTime": "2024-7-23 09:09:42.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "511724397056069", + "Avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAABHNCSVQICAgIfAhkiAAABFxJREFUeJzt3FFoG3UAx/HftCxV13SuWhLjqG0nlbB1SnUd3ea2B9mLteDoGHOzDJUyoQ++TATxRR/cXnwozA0UNzZFrD7MKMgcMlsmrTjKFmgRK6XOkKxdOrhbxxIs+jBya5pekmsulx/u93nqru3dhe/d/f//K2xF24dN/0Jo3FfpE5BsCkJGQcgoCBkFIaMgZBSEjIKQURAyCkJGQcgoCBkFIaMgZBSEjIKQURAyCkJGQcgoCBkFIaMgZBSEjIKQURAyCkJGQcgoCBkFIaMgZBSEjIKQURAyCkJGQcgoCBkFIaMgZKoqfQLlEjk0iKA/tOzf/3XqF7z55QEXz6g4ngQ5tvc0NjV05P2ZUyMn0NPe63jfp0ZOoP/CUdvvz95KIvXP7aL356uqxpoH6xyfh1s8CTI7dx1xIwbg7gdOz6eRnJvJ+dnF22t8fqzy1eBmyoSZMqztdQ89ipX3ryx47Ej067zBFuvbcXhZF4ZbPAnybuQt6+vMB07OzaDz4+eztgPI2Z65u8YS0axHSKmPJFYa1Mn8bwf1jJ723oo+gpyiCxL0h/Db23/mbN/U0LHk9kI0qJfoZsrEWCJq/Xvtww0I+kOIGzFcvTFlbQ8HNmCVr6bg/jSol8hMGVmD97G9pxH0h3D1xlTOoJ4vyMKJgRP9F446Cug2T4IsddUtfDTFjRjOjX/n2vGW82iz8+yRZtf2VQxPgpi3jbzrkGkz4fox7dY5xarUlNqTICeHj+Pk8HEAhdchbg3qi/e/UGZtk+/1iJt3mRN0Y4jbK/Wl1D6wGsCdNwhsaILYDaZ2K/VS+KtrAQDXzLgr+3PTPblS91VVV/oUbNHcIYXeTdmNIXEj5miKu7lxW0UXfoVUNEhXazd2hV9CfU3AdqZlN4ZkOJ2hvbGlz/q6p70Xu5/eh0t/jWBg9AyGJ4ecfYAyWOH1/9trtxK2m+8XMyMq1qf7v8LGUBsA4Oc/ziNQ+xha6sPW93+fHsOP499bM8JK8OQO2dy4DS+ufxlPBdbjiTVN1vbZW0lEY6MYnDhf1uN/0PkRtjbvtFb2P4x9a/1JIHOXhgMb0FIfRkt9GLuf2YfLf1/K+rOBVzxbqWeuxPR8GuOJKIYmfirbldjV2o3nGjrQ+Mg6NNats6bHcSOGb0a/yDru2SsDOHtlAMCdcBsfb0PQH0IwHMLW5p2eP848eWS9s+t9dDRtt73qSl2ExY0YPrnYj9e39OWsT9LzaUwmJzA8OVT0O6q+HYex/ckXrLs5PZ/GkXPvWeHKyfMxZCmRQ4Ml/f60mcBrZ/bg84MRhGrX4vrcDKbNBMYT0ZJeFHa1dmNP26sAgFc+6yzpHItFEUTuuicXhswUhIyCkFEQMgpCRkHIKAgZBSGjIGQUhIyCkFEQMgpCRkHIKAgZBSGjIGQUhIyCkFEQMgpCRkHIKAgZBSGjIGQUhIyCkFEQMgpCRkHIKAgZBSGjIGQUhIyCkFEQMgpCRkHI/AdcyoGMDQFIagAAAABJRU5ErkJggg==", + "Signature": "", + "Account": "萝卜科技管理员", + "Password": "c1c4766b4aa8340df0efa38ff9b50011", + "Name": "萝卜科技管理员", + "Nickname": "", + "Gender": "男", + "Birthday": "", + "Nation": "", + "NativePlace": "", + "HomeAddress": "", + "MailingAddress": "", + "IdCardType": "身份证", + "IdCardNumber": "", + "CultureLevel": "", + "PoliticalOutlook": "", + "College": "", + "Education": "", + "EduLength": "", + "Degree": "", + "Phone": "", + "Email": "", + "HomeTel": "", + "OfficeTel": "", + "EmergencyContact": "", + "EmergencyPhone": "", + "EmergencyAddress": "", + "EmpNo": "", + "EntryDate": "", + "OrgId": "359569393872965", + "PositionId": "359569658515525", + "PositionLevel": "", + "DirectorId": "", + "PwdRemindUpdateTime": "", "LastLoginIp": "", "LastLoginAddress": "", "LastLoginTime": "", "LastLoginDevice": "", + "LatestLoginIp": "", + "LatestLoginAddress": "", + "LatestLoginTime": "", + "LatestLoginDevice": "", + "SortCode": "99", + "DefaultModule": "", + "CreateTime": "2024-2-5 09:51:56.147", + "UpdateTime": "2024-7-23 09:09:42.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "511724553736261", + "Avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAABHNCSVQICAgIfAhkiAAABF1JREFUeJzt3FFoG3UAx/FfZWzrxLVr3Nhk2alTVyuhLQ6HBlrsxqJWEOeLsiKM4iYolD20A1HHUEZXEbcXmULRh1kYSAsT6SpzWCHiRkZbhSljlh1Za9cQl3TQGinow8itaXpJrrlcfrjf56m9pncXvnf3v/8FUrF/Hf6F0Lin3DsgmRSEjIKQURAyCkJGQcgoCBkFIaMgZBSEjIKQURAyCkJGQcgoCBkFIaMgZBSEjIKQURAyCkJGQcgoCBkFIaMgZBSEjIKQURAyCkJGQcgoCBkFIaMgZBSEjIKQURAyCkJGQcisKPcOlMrRsWvw+Y1l///vw9/jk5d3ubhHhfEkyMGBc6ht3pnzNUMnehDq6HK87qETPeg/csj277di0/jn77mC17dydSXuW7/B8X64xZMgM7EbiEdNAHfe8HwqheT0VNZrFy9fU1WNyrVVmJtJYjaZsJZXbdiIFatW5d32T31f5gy22J7Dx5Z1YLjFkyC9+/daP6ffcHJ6Cu/UP5ixHEDW8vTZZY5EMi4hxV6SWGlQJ/O/HdTTQh1dZb0EOUUXxOc38Nlf2d+HU9u8c8nl+WhQL9LcTBLmSMT6ff3Dj8DnNxCPmoiNX7WWG43bUbm2Ku/6NKgXaTaZyBi8Dw6cg89vIDZ+NWtQzxVk4Y2BE/1HDjkK6DZPgix11C28NMWjJiL9p13b3nIubXYO1FS4tq5CeBJkNnkz5zwkMTnh+jbt5jmFKtcttSdBzh7vxtnj3QDyz0PcGtQXr3+h9Nwm1+MRN88yJ+jGELdn6ku5t8YH4PYTBDY0QewGU7uZejHWVK8DANycuO7K+tx0V87UV66uLPcu2KI5Q/I9m7IbQ+JR09Etbl1LqKwTv3zKGiTY1o6nXnkN1Q9str3TshtD0pzeob3Y+b71c6ijC037DuBKeBg/9H6Ky+eHnL2BEqjw+nt77WbCdvf7hdwRFaprMIytO54BAIwNnkHN5i3wBxqsv0d/HUVk4LR1R1gOnpwhdS0hPP3q69hS/yQ2PrrNWn4rNo3xyM8YGzxT0u23f/4VArtbrZn9xa/7rI8E0mep0bgd/kAD/IEGNO17E39cCGd8bOAVj2bq3daROJ9KwRy9hF+GvinZkRhsa0dtUws2bavDpscet26P41ETP35xMmO74VO9CJ/qBXA73NYdQfj8Bnx+A4HdrZ5fzjy5ZO39+CSe2PWc7VFX7CQsHjXx7UcfoLXzvaz5yXwqhT+v/IbL578r+BnVnsPHUP/CS9bZPJ9Koa/zLStcKXk+hizl6Ni1ov4/MTmBnueDeHd4BPcbDyF5YwqJyeswRy8V9aAw2NaOZ994GwDwYXNjUftYKIogcsddOTFkpiBkFISMgpBREDIKQkZByCgIGQUhoyBkFISMgpBREDIKQkZByCgIGQUhoyBkFISMgpBREDIKQkZByCgIGQUhoyBkFISMgpBREDIKQkZByCgIGQUhoyBkFISMgpBREDIKQuY/u06CTgWqX4UAAAAASUVORK5CYII=", + "Signature": "", + "Account": "旺仔科技管理员", + "Password": "c1c4766b4aa8340df0efa38ff9b50011", + "Name": "旺仔科技管理员", + "Nickname": "", + "Gender": "男", + "Birthday": "", + "Nation": "", + "NativePlace": "", + "HomeAddress": "", + "MailingAddress": "", + "IdCardType": "身份证", + "IdCardNumber": "", + "CultureLevel": "", + "PoliticalOutlook": "", + "College": "", + "Education": "", + "EduLength": "", + "Degree": "", + "Phone": "", + "Email": "", + "HomeTel": "", + "OfficeTel": "", + "EmergencyContact": "", + "EmergencyPhone": "", + "EmergencyAddress": "", + "EmpNo": "", + "EntryDate": "", + "OrgId": "510752889880645", + "PositionId": "511723823370309", + "PositionLevel": "", + "DirectorId": "", + "PwdRemindUpdateTime": "2024-2-19 15:53:43", + "LastLoginIp": "127.0.0.1", + "LastLoginAddress": "内网IP|内网IP", + "LastLoginTime": "2024-2-23 10:50:42", + "LastLoginDevice": "PC", "LatestLoginIp": "127.0.0.1", "LatestLoginAddress": "内网IP|内网IP", - "LatestLoginTime": "2022-12-12 09:49:51.583", + "LatestLoginTime": "2024-2-23 15:47:54.05", "LatestLoginDevice": "PC", - "UserStatus": "ENABLE", - "SortCode": "", - "CreateTime": "2022-12-12 09:37:37.75", - "UpdateTime": "2022-12-12 09:49:51.64", + "SortCode": "99", + "DefaultModule": "", + "CreateTime": "2024-2-5 09:52:34.397", + "UpdateTime": "2024-7-23 09:09:42.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "511724668047429", + "Avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAABHNCSVQICAgIfAhkiAAABE1JREFUeJzt3O9vE3UAx/EPMuo6SrZyDmG/+oDC6oTMZIuLLLKgJguZiYFHRh9KMDzkiRj/AKOPfIzRhxIfoU8I8EAz1GlmSrItsTpgxOomhq3punY7qG3wAem5rru2116vn8jn9Wi7bndt3nf3/X5vyXacvXDxEYTGU81+A1JMQcgoCBkFIaMgZBSEjIKQURAyCkJGQcgoCBkFIaMgZBSEjIKQURAyCkJGQcgoCBkFIaMgZBSEjIKQURAyCkJGQcgoCBkFIaMgZBSEjIKQURAyCkJGQcgoCBkFIaMgZBSETEuz30CjfHjhLRjBQM2//9udJXzy2RUX31F1PAly/swEIuHusj9z/cYsxscGHe/7+o1ZXL46bft6OmMi+0++6v35du3EnoDf8ftwiydB1jImEskMgP8+cC6XRyptlvzs1u1tfh/8rT6YD7LYMLPW9vY9frS07Kx47B9v3iobbKvTJ0dqOjHc4kmQz7/81vq68IFTaRMffHypaDuAku2Fqyu+uFx0C6n3lsRKgzqZ/+2gXjA+NtjUW5BTdEGMYAAXPzpbsj0S7t52eyUa1OtkPsgivrhsfd9ptMMIBpBIZrCcSFnbQz2d8Lf6Ku5Pg3qdNsxs0eB9/swEjGAAy4lUyaBeLsjmiYETl69OOwroNk+CbHfWbb41JZIZROcWXDteLbc2O+++/6lr+6qGJ0E2zIdl1yGra+uuH9NunVOtZk2pPQlybXIG1yZnAFReh7g1qG/d/2aFtU25xyNuXmVO0I0hbq/Ut7O7rRXA4ycIbGiC2A2mdiv1erT5nwYAJFPu3yrr9USu1H27aruyvEBzhVR6NmU3hiSSGUdT3IFDPU1d+FXS1CCjw/148YUwOtp328607MaQAqcztNdfG7K+Hh8bxPGR53Dr7j1M/vQLYrcXnX2ABtjh9f/ttVsJ2833q5kRVeu9c2/gYOhZAMBsLI69HQH0dhnW63/+lUB0bsGaETaDJ1fIwKEevDR0GH3dz2B/Z4e1PZ0xcfeP+5iN/d7Q47/z5is4GumzVvY/z9yx/iRQuEpDPZ3o7TLQ22Xg+MgAFuJ/F/3ZwCuerdQLZ2Iul0d8aQVzv8YbdiaODvcjEu7GgX1BHNjXYU2PE8kMvpuOFR13KjqPqeg8gMfhDob2wwgGYATDOBrp8/x25skt6+1TL+P5w722Z129i7BEMoMr39zExKtDJeuTXC6Pe/dXEbu9WPUzqtMnRzA4ELKu5lwuj0tf/2CFayRPrpAvvvq+7OuFxyq1Wl1bx1R0HieOHUGb34eVZBqrqXXEl1ZqelBYWBONDvfjxLEjAOBJDKAJg7qU90QuDJkpCBkFIaMgZBSEjIKQURAyCkJGQcgoCBkFIaMgZBSEjIKQURAyCkJGQcgoCBkFIaMgZBSEjIKQURAyCkJGQcgoCBkFIaMgZBSEjIKQURAyCkJGQcgoCBkFIaMgZBSEjIKQ+RdFsYZDcg+0XAAAAABJRU5ErkJggg==", + "Signature": "", + "Account": "达达科技管理员", + "Password": "c1c4766b4aa8340df0efa38ff9b50011", + "Name": "达达科技管理员", + "Nickname": "", + "Gender": "男", + "Birthday": "", + "Nation": "", + "NativePlace": "", + "HomeAddress": "", + "MailingAddress": "", + "IdCardType": "身份证", + "IdCardNumber": "", + "CultureLevel": "", + "PoliticalOutlook": "", + "College": "", + "Education": "", + "EduLength": "", + "Degree": "", + "Phone": "", + "Email": "", + "HomeTel": "", + "OfficeTel": "", + "EmergencyContact": "", + "EmergencyPhone": "", + "EmergencyAddress": "", + "EmpNo": "", + "EntryDate": "", + "OrgId": "510753093025861", + "PositionId": "511723919061061", + "PositionLevel": "", + "DirectorId": "", + "PwdRemindUpdateTime": "2024-9-11 23:55:59.987", + "LastLoginIp": "", + "LastLoginAddress": "", + "LastLoginTime": "", + "LastLoginDevice": "", + "LatestLoginIp": "192.168.0.25", + "LatestLoginAddress": "内网IP|内网IP", + "LatestLoginTime": "2024-9-11 23:55:59.913", + "LatestLoginDevice": "PC", + "SortCode": "99", + "DefaultModule": "", + "CreateTime": "2024-2-5 09:53:02.307", + "UpdateTime": "2024-7-23 09:09:42.967", + "CreateUserId": "212725263002001", + "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "511724755705925", + "Avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAABHNCSVQICAgIfAhkiAAABFZJREFUeJzt3O9rG3UAx/HPtC72x7LZzKZTuzDDRmldtWwaNDA2cbRghbEnHdhnDsVHsicT/QP8sSf+eCLCfDale7InU0gVJAidnRRKK3aSbY5MnYlt1jRpMmNT9MG4s2l6+Xm5fHCf16P00t5deN/d974X6JZXX3jvHwiN+5q9A1JIQcgoCBkFIaMgZBSEjIKQURAyCkJGQcgoCBkFIaMgZBSEjIKQURAyCkJGQcgoCBkFIaMgZBSEjIKQURAyCkJGQcgoCBkFIaMgZBSEjIKQURAyCkJGQcgoCBkFIaMgZBSETEuzd6BR3jn3Ojxed81///NMFB+cHrdxjyrjSJBTZ06gd9BX8ncmzl/G0Gig6nVPnL+MC2fDlu+nk1n8nctXvL6trhZs29FW9X7YxZEgqaUMEvEUgP8+cH51Dcu3M0W/u3F5W4cLre0u3MnkkF3Jmcu3d7aj5YH7y2770sSPJYNtdPzk4ZoODLs4EuSzdy+ar40PvHw7g7fHPilYDqBouXF2RSOxgktIvZckVhrUyfxvB3XD0GigqZegatEF8Xjd+PSbN4uW9w76Nl1ejgb1Ot3J5BCNxMyfH37kIXi8biTiKSzcWjKX+/Z1o7XdVXZ9GtTrlF3JFQzep86cgMfrxsKtpaJBvVSQ9TcG1bhwNlxVQLs5EmSzo279pSkRT2E6fMW27dVyabPy2tH3bVtXJRwJkl35q+Q8JLmYtn2bVvOcSjXrltqRIKHxKYTGpwCUn4fYNahvXP96xtym1OMRO8+yatCNIXbP1DfT7m4FcPcJAhuaIFaDqdVMvR5tHQ8CAJYW7L9U1uuenKlvddEch0Vo9qzcsymrMSQRT1V1i9t3cE9TJ37lNDVIcHgAzzzfhx07t1neaVmNIYZq79BGxoLm66HRAA6NPIXI7E2EL85gfvpGdR+gAbY4/X97rWbCVvf7ldwRVer0h2Pw9z8KAJi9dBWd3u3o8XeZ7/96/U9Mh6+Yd4TN4MgZ0ndwD549+gR27+1Gd0+nuTydzOKX+d8x+/21hm7/lbdewv6A35zZ//DtvPmVgHGW+vZ1o8ffhR5/Fw6NDOL6T78VfG3gFMdm6saRmF9dQzQSw9zUtYYdicHhAfQO+rDLtxO7dnvM2+NEPIXvvpwp2O5kaA6ToTkAd8P5+x+Dx+uGx9uH/QG/45czRy5ZL78xhP6nH7c86uqdhCXiKXx1bhIvjgWL5if51TX8cTOB+ekbFT+jOn7yMJ58bq95NudX1/DFx1+b4RrJkTPk848mSr5vPFapVXIxjcnQHI4cO4C2DhcWY8tILqYRjcRqelBozImCwwM4cuwAADgSA2jCoC6l3ZMTQ2YKQkZByCgIGQUhoyBkFISMgpBREDIKQkZByCgIGQUhoyBkFISMgpBREDIKQkZByCgIGQUhoyBkFISMgpBREDIKQkZByCgIGQUhoyBkFISMgpBREDIKQkZByCgIGQUhoyBk/gX5tIZuRn97CgAAAABJRU5ErkJggg==", + "Signature": "", + "Account": "杰尼科技管理员", + "Password": "c1c4766b4aa8340df0efa38ff9b50011", + "Name": "杰尼科技管理员", + "Nickname": "", + "Gender": "男", + "Birthday": "", + "Nation": "", + "NativePlace": "", + "HomeAddress": "", + "MailingAddress": "", + "IdCardType": "身份证", + "IdCardNumber": "", + "CultureLevel": "", + "PoliticalOutlook": "", + "College": "", + "Education": "", + "EduLength": "", + "Degree": "", + "Phone": "", + "Email": "", + "HomeTel": "", + "OfficeTel": "", + "EmergencyContact": "", + "EmergencyPhone": "", + "EmergencyAddress": "", + "EmpNo": "", + "EntryDate": "", + "OrgId": "510753219502149", + "PositionId": "511723963043909", + "PositionLevel": "", + "DirectorId": "", + "PwdRemindUpdateTime": "", + "LastLoginIp": "", + "LastLoginAddress": "", + "LastLoginTime": "", + "LastLoginDevice": "", + "LatestLoginIp": "", + "LatestLoginAddress": "", + "LatestLoginTime": "", + "LatestLoginDevice": "", + "SortCode": "99", + "DefaultModule": "", + "CreateTime": "2024-2-5 09:53:23.707", + "UpdateTime": "2024-7-23 09:09:42.967", "CreateUserId": "212725263002001", "UpdateUserId": "", + "CreateUser": "superAdmin", + "UpdateUser": "", + "IsDelete": "0", + "ExtJson": "", + "Status": "ENABLE" + }, + { + "Id": "518189781848133", + "Avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAABHNCSVQICAgIfAhkiAAABJJJREFUeJzt3G9oG3Ucx/FPJXorsr9hY2wL0QdztaO04lAwsGBblo7hyoIgNHngFlyHKFuQdUWUtiDDOEcV17o6gjLaqeAaXBk1I+2MkEnHcCvBtg4Ki3G26+ifi5DuIDAflMbGJTXdkt4n8n09S+9y9+u9e73fXSBFB9fiPgSNx/QegEglQchIEDIShIwEISNByEgQMhKEjAQhI0HISBAyEoSMBCEjQchIEDIShIwEISNByEgQMhKEjAQhI0HISBAyEoSMBCEjQchIEDIShIwEISNByEgQMhKEjAQhI0HISBAyEoSMBCEjQcjQBbE3edAxdR/HB28taX23L5DfgS0TuiB6sDd50DZ2jyKqQe8B6MnidGHX20exces2vYeSVDBBjg/egtFkzri8xFqFjqn0X0rh//QjdLccS752nDyNp3e8CFNZRc7H+agogrh9AZRYq1J+ZjSZkwd4JNiHmT9vp33vEyuKsXL9BszGVMTVmbTrxNXpjPsaCfY9sG89UQSJ3b2DyWgEwD8HOKFpUCfGk8u9Bx1p32tv8sB2uAGR69fQuq86631Gwzdw+cwphDq9Gc8sPVAEWXiw5w+wOjGOd8ufyvm+rp7/Gv7PTmCo35/zbecCRZDlFOr06j2ERRXEtLe00qb3EJYN9Rni+qILZbv24KcvO+Bs7VjyLGsyGsnLv718oguydvMWAHOzLKPJjISmIa5OY3QghPjMNExlFfjr7gRuD4UzbmPNpi1U9xZLQRHE4nShfPdePGOxonjVagBAQtPwa78fP3rbUy7AbWP3YFCURWdU7wWvAwBGB0L5HXgeUFxDXn7jLZTv3ovHlRXJ6a86MY52R+0Ds6Gxm8MoXrUa9iZP2m3VHGmEqawCszE141SZGUWQqT9+x0iwD22OWlzr/nbRdS+fOQUA2GF/Le3ynfsPAQDCly7mdpDLhCJIu6MWrfuqs7o3CHV6EQ3fgNFkxptd36csc/sCMJrMmIxGCvLsAEiCLFV3SyMSmobtlTbUHGkEMDcjK7FWIaFp6HTX6zzCh1eQQYb6/fil5zwMioJXjjXD7QvghVfrkNA09Hiaae/Cs1GQQYC5xy2jA1dgUJTkmdHjacYPn3yo99AeScEGsThdeHKdMfnaoCh41pr9w0VWBRektNIGty+AuhNt2Lh1GyajEQz2XkBC01BircLHv93JOCUuBBQ3hgvN3xj+m8XpgsVxAOaK52FQFMzGVFw59xW63jmUXL7n6PswmsywHW7AS3WvYzgYwM/fnP3Pa0r9uqKc/x4Pq4jhu9/nH7kvNNh7Ae2OWpRW2nDg87NYuX4DAGA2piJ86eKin4/s3F+fEvbqd+cKZhpMEQRA8sFgQtMwdnMY3S2Nyb/sht4Q1mzajNGBUNYH1nHyNLZX1yA+M40PrM/lbdy5RhNEzCm4i/r/nQQhI0HISBAyEoSMBCEjQchIEDIShIwEISNByEgQMhKEjAQhI0HISBAyEoSMBCEjQchIEDIShIwEISNByEgQMhKEjAQhI0HISBAyEoSMBCEjQchIEDIShIwEISNByEgQMhKEzN96BFLRl5sEoAAAAABJRU5ErkJggg==", + "Signature": "", + "Account": "旺仔科技1", + "Password": "c1c4766b4aa8340df0efa38ff9b50011", + "Name": "旺仔科技1", + "Nickname": "", + "Gender": "男", + "Birthday": "", + "Nation": "", + "NativePlace": "", + "HomeAddress": "", + "MailingAddress": "", + "IdCardType": "身份证", + "IdCardNumber": "", + "CultureLevel": "", + "PoliticalOutlook": "", + "College": "", + "Education": "", + "EduLength": "", + "Degree": "", + "Phone": "", + "Email": "", + "HomeTel": "", + "OfficeTel": "", + "EmergencyContact": "", + "EmergencyPhone": "", + "EmergencyAddress": "", + "EmpNo": "", + "EntryDate": "", + "OrgId": "517088662995013", + "PositionId": "517095081300037", + "PositionLevel": "", + "DirectorId": "", + "PwdRemindUpdateTime": "2024-2-23 16:19:56", + "LastLoginIp": "127.0.0.1", + "LastLoginAddress": "内网IP|内网IP", + "LastLoginTime": "2024-2-23 16:19:56.733", + "LastLoginDevice": "PC", + "LatestLoginIp": "127.0.0.1", + "LatestLoginAddress": "内网IP|内网IP", + "LatestLoginTime": "2024-2-23 16:20:34.887", + "LatestLoginDevice": "PC", + "SortCode": "99", + "DefaultModule": "", + "CreateTime": "2024-2-23 16:19:39.23", + "UpdateTime": "2024-2-23 16:20:26.987", + "CreateUserId": "212725263002001", + "UpdateUserId": "212725263002001", + "CreateUser": "superAdmin", + "UpdateUser": "superAdmin", "IsDelete": "0", - "ExtJson": "" + "ExtJson": "", + "Status": "ENABLE" } ] } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysConfigSeedData.cs b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysConfigSeedData.cs new file mode 100644 index 0000000000000000000000000000000000000000..ae061cd7092e1e64186c43e59a1a486471bebd85 --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysConfigSeedData.cs @@ -0,0 +1,22 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; + +/// +/// 系统配置种子数据 +/// +public class SysConfigSeedData : ISqlSugarEntitySeedData +{ + public IEnumerable SeedData() + { + return SeedDataUtil.GetSeedData("seed_sys_config.json"); + } +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysDictSeedData.cs b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysDictSeedData.cs new file mode 100644 index 0000000000000000000000000000000000000000..165310f8c151c8b3f5dfd338e095676e102e7673 --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysDictSeedData.cs @@ -0,0 +1,22 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; + +/// +/// 字典表种子数据 +/// +public class SysDictSeedData : ISqlSugarEntitySeedData +{ + public IEnumerable SeedData() + { + return SeedDataUtil.GetSeedData("seed_sys_dict.json"); + } +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysOrgSeedData.cs b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysOrgSeedData.cs index bd7a955ce2a701ddc5ce1ba41e353673858e4daf..ce90ef77fe59114f11c83f9bf812f7862e9a6ac3 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysOrgSeedData.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysOrgSeedData.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 机构种子数据 @@ -9,4 +19,4 @@ public class SysOrgSeedData : ISqlSugarEntitySeedData { return SeedDataUtil.GetSeedData("seed_sys_org.json"); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysPositionSeedData.cs b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysPositionSeedData.cs index a9aeb8f6630603c5612aa868b82b6648ba658eb9..7aecffee9cde2113d310694644043fd171d1cf1b 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysPositionSeedData.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysPositionSeedData.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 职位表种子数据 @@ -9,4 +19,4 @@ public class SysPositionSeedData : ISqlSugarEntitySeedData { return SeedDataUtil.GetSeedData("seed_sys_position.json"); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysRelationSeedData.cs b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysRelationSeedData.cs index e1a0ca973129a92bb470d6b953244c07b681b718..35187eaeff906ebe19bcc75bd948b585d7bc1ed0 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysRelationSeedData.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysRelationSeedData.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 关系表种子数据 @@ -9,4 +19,4 @@ public class SysRelationSeedData : ISqlSugarEntitySeedData { return SeedDataUtil.GetSeedData("seed_sys_relation.json"); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysResourceSeedData.cs b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysResourceSeedData.cs index 6ba130a242c68e11f3070661c687f904d2e7b5a1..d2178e48d2814a1920f5d1aa33aad2a374173b94 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysResourceSeedData.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysResourceSeedData.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 资源表种子数据 @@ -9,4 +19,4 @@ public class SysResourceSeedData : ISqlSugarEntitySeedData { return SeedDataUtil.GetSeedData("seed_sys_resource.json"); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysRoleSeedData.cs b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysRoleSeedData.cs index 0849e0c044bd700d0ff1ee21072b32637867777f..67b932f8dc9a08a4c484fb8cf84ca22050243a6a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysRoleSeedData.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysRoleSeedData.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 角色种子数据 @@ -9,4 +19,4 @@ public class SysRoleSeedData : ISqlSugarEntitySeedData { return SeedDataUtil.GetSeedData("seed_sys_role.json"); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysUserSeedData.cs b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysUserSeedData.cs index 69d61a89b81748bc5004fba00d157e26a7c978e3..8890f1e78a582ed1dd087d0a96f46bebb213a290 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysUserSeedData.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysUserSeedData.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 用户表种子数据 @@ -9,4 +19,4 @@ public class SysUserSeedData : ISqlSugarEntitySeedData { return SeedDataUtil.GetSeedData("seed_sys_user.json"); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs index 4661a3ed69192d8e67731b07b631de8570f2ce0a..8757982774de48f699df083d4269639d8d302cd6 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System.Services.Auth; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System.Services.Auth; /// public class AuthService : IAuthService @@ -7,34 +17,31 @@ public class AuthService : IAuthService private readonly IEventPublisher _eventPublisher; private readonly IConfigService _configService; private readonly ISysUserService _userService; - private readonly IRoleService _roleService; + private readonly ISysOrgService _sysOrgService; - public AuthService(ISimpleCacheService simpleCacheService, - IEventPublisher eventPublisher, - IConfigService configService, - ISysUserService userService, - IRoleService roleService) + public AuthService(ISimpleCacheService simpleCacheService, IEventPublisher eventPublisher, IConfigService configService, + ISysUserService userService, ISysOrgService sysOrgService) { _simpleCacheService = simpleCacheService; _eventPublisher = eventPublisher; _configService = configService; _userService = userService; - _roleService = roleService; + _sysOrgService = sysOrgService; } /// public async Task GetCaptchaInfo() { - var config = await _configService.GetByConfigKey(CateGoryConst.Config_LOGIN_POLICY, DevConfigConst.LOGIN_CAPTCHA_TYPE); + var config = await _configService.GetByConfigKey(CateGoryConst.CONFIG_LOGIN_POLICY, SysConfigConst.LOGIN_CAPTCHA_TYPE); var captchaType = (CaptchaType)Enum.Parse(typeof(CaptchaType), config.ConfigValue); //生成验证码 - var captchInfo = CaptchaUtil.CreateCaptcha(captchaType, 4, 100, 38); - //生成请求号,并将验证码放入redis - var reqNo = AddValidCodeToRedis(captchInfo.Code); + var captchaInfo = CaptchaUtil.CreateCaptcha(captchaType, 4, 100, 38); + //生成请求号,并将验证码放入缓存 + var reqNo = AddValidCodeToRedis(captchaInfo.Code); //返回验证码和请求号 return new PicValidCodeOutPut { - ValidCodeBase64 = captchInfo.Base64Str, + ValidCodeBase64 = captchaInfo.Base64Str, ValidCodeReqNo = reqNo }; } @@ -43,8 +50,8 @@ public class AuthService : IAuthService public async Task GetPhoneValidCode(GetPhoneValidCodeInput input, LoginClientTypeEnum loginClientType) { await ValidPhoneValidCode(input, loginClientType);//校验手机号验证码 - string? phoneValidCode; - _ = RandomHelper.CreateNum(6);//生产随机数字 + var phoneValidCode = RandomHelper.CreateNum(6);//生产随机数字; + #region 发送短信和记录数据库等操作 @@ -55,48 +62,37 @@ public class AuthService : IAuthService #endregion 发送短信和记录数据库等操作 - //生成请求号,并将验证码放入redis + //生成请求号,并将验证码放入缓存 var reqNo = AddValidCodeToRedis(phoneValidCode); return reqNo; } - - /// public async Task Login(LoginInput input, LoginClientTypeEnum loginClientType) { - //判断是否有验证码 - var sysBase = await _configService.GetByConfigKey(CateGoryConst.Config_SYS_BASE, DevConfigConst.LOGIN_CAPTCHA_OPEN); - if (sysBase != null)//如果有这个配置项 - { - if (sysBase.ConfigValue.ToBoolean())//如果需要验证码 - { - //如果没填验证码,提示验证码不能为空 - if (string.IsNullOrEmpty(input.ValidCode) || string.IsNullOrEmpty(input.ValidCodeReqNo)) throw Oops.Bah("验证码不能为空").StatusCode(410); - ValidValidCode(input.ValidCode, input.ValidCodeReqNo);//校验验证码 - } - } + await CheckCaptcha(input);//检查验证码 + await CheckWebOpen(input);//检查网站是否开启 var password = CryptogramUtil.Sm2Decrypt(input.Password);//SM2解密 - var loginPolicy = await _configService.GetListByCategory(CateGoryConst.Config_LOGIN_POLICY); - BeforeLogin(loginPolicy, input.Account);//登录前校验 + //获取多租户配置 + var isTenant = await _configService.IsTenant(); + //获取登录策略 + var loginPolicy = await _configService.GetConfigsByCategory(CateGoryConst.CONFIG_LOGIN_POLICY); + await BeforeLogin(loginPolicy, input, isTenant);//登录前校验 // 根据账号获取用户信息,根据B端或C端判断 if (loginClientType == LoginClientTypeEnum.B)//如果是B端 { - var userInfo = await _userService.GetUserByAccount(input.Account);//获取用户信息 + var userInfo = await _userService.GetUserByAccount(input.Account, input.TenantId);//获取用户信息 if (userInfo == null) throw Oops.Bah("用户不存在");//用户不存在 if (userInfo.Password != password) { - LoginError(loginPolicy, input.Account);//登录错误操作 + LoginError(loginPolicy, input, isTenant);//登录错误操作 throw Oops.Bah("账号密码错误");//账号密码错误 } - var result = await ExecLoginB(userInfo, input.Device, loginClientType);// 执行B端登录 + var result = await ExecLoginB(userInfo, input.Device, loginClientType, input.TenantId);// 执行B端登录 return result; } - else - { - //执行c端登录 - return null; - } + //执行c端登录 + return null; } /// @@ -108,22 +104,19 @@ public class AuthService : IAuthService { var userInfo = await _userService.GetUserByPhone(input.Phone);//获取信息 if (userInfo == null) throw Oops.Bah("用户不存在");//用户不存在 - var result = await ExecLoginB(userInfo, input.Device, loginClientType);// 执行B端登录 + var result = await ExecLoginB(userInfo, input.Device, loginClientType, input.TenantId);// 执行B端登录 RemoveValidCodeFromRedis(input.ValidCodeReqNo);//删除验证码 return result; } - else - { - //执行c端登录 - return null; - } + //执行c端登录 + return null; } /// public async Task LoginOut(string token, LoginClientTypeEnum loginClientType) { //获取用户信息 - var userinfo = await _userService.GetUserByAccount(UserManager.UserAccount); + var userinfo = await _userService.GetUserByAccount(UserManager.UserAccount, UserManager.TenantId); if (userinfo != null) { var loginEvent = new LoginEvent @@ -134,16 +127,17 @@ public class AuthService : IAuthService }; RemoveTokenFromRedis(loginEvent, loginClientType);//移除token //发布登出事件总线 - await _eventPublisher.PublishAsync(EventSubscriberConst.LoginOutB, loginEvent); + await _eventPublisher.PublishAsync(EventSubscriberConst.LOGIN_OUT_B, loginEvent); } } /// public async Task GetLoginUser() { - var userInfo = await _userService.GetUserByAccount(UserManager.UserAccount);//根据账号获取用户信息 + var userInfo = await _userService.GetUserByAccount(UserManager.UserAccount, UserManager.TenantId);//根据账号获取用户信息 if (userInfo != null) { + userInfo.Avatar = await _userService.GetUserAvatar(userInfo.Id);//获取头像 return userInfo.Adapt(); } return null; @@ -151,19 +145,85 @@ public class AuthService : IAuthService #region 方法 + /// + /// 检查验证码 + /// + /// + /// + public async Task CheckCaptcha(LoginInput input) + { + //判断是否有验证码 + var sysBase = await _configService.GetByConfigKey(CateGoryConst.CONFIG_LOGIN_POLICY, SysConfigConst.LOGIN_CAPTCHA_OPEN); + if (sysBase != null)//如果有这个配置项 + { + if (sysBase.ConfigValue.ToBoolean())//如果需要验证码 + { + //如果没填验证码,提示验证码不能为空 + if (string.IsNullOrEmpty(input.ValidCode) || string.IsNullOrEmpty(input.ValidCodeReqNo)) + throw Oops.Bah("验证码不能为空").StatusCode(410); + ValidValidCode(input.ValidCode, input.ValidCodeReqNo);//校验验证码 + } + } + } + + /// + /// 检查网站是否开启 + /// + /// + /// + public async Task CheckWebOpen(LoginInput input) + { + //判断是否开启web访问 + var webStatus = await _configService.GetByConfigKey(CateGoryConst.CONFIG_SYS_BASE, SysConfigConst.SYS_WEB_STATUS); + if (webStatus != null && webStatus.ConfigValue == CommonStatusConst.DISABLED + && input.Account.ToLower() != SysRoleConst.SUPER_ADMIN.ToLower())//如果禁用了网站并且不是超级管理员 + { + var closePrompt = await _configService.GetByConfigKey(CateGoryConst.CONFIG_SYS_BASE, SysConfigConst.SYS_WEB_CLOSE_PROMPT); + throw Oops.Bah(closePrompt.ConfigValue); + } + } + /// /// 登录之前执行的方法 /// /// - /// - public void BeforeLogin(List loginPolicy, string userName) + /// + /// + public async Task BeforeLogin(List loginPolicy, LoginInput input, bool isTenant) { - var lockTime = loginPolicy.First(x => x.ConfigKey == DevConfigConst.LOGIN_ERROR_LOCK).ConfigValue.ToInt();//获取锁定时间 - var errorCount = loginPolicy.First(x => x.ConfigKey == DevConfigConst.LOGIN_ERROR_COUNT).ConfigValue.ToInt();//获取错误次数 - var key = SystemConst.Cache_LoginErrorCount + userName;//获取登录错误次数Key值 + var lockTime = loginPolicy.First(x => x.ConfigKey == SysConfigConst.LOGIN_ERROR_LOCK).ConfigValue.ToInt();//获取锁定时间 + var errorCount = loginPolicy.First(x => x.ConfigKey == SysConfigConst.LOGIN_ERROR_COUNT).ConfigValue.ToInt();//获取错误次数 + var key = SystemConst.CACHE_LOGIN_ERROR_COUNT;//获取登录错误次数Key值 + //如果是关闭多租户则直接用账号 + if (!isTenant) + key += input.Account; + else + { + //如果租户ID为空表示用域名登录 + if (input.TenantId == null) + { + //获取域名 + var origin = App.HttpContext.Request.Headers["Origin"].ToString(); + // 如果Origin头不存在,可以尝试使用Referer头作为备选 + if (string.IsNullOrEmpty(origin)) + origin = App.HttpContext.Request.Headers["Referer"].ToString(); + //根据域名获取二级域名 + var domain = origin.Split("//")[1].Split(".")[0]; + //根据二级域名获取租户 + var tenantList = await _sysOrgService.GetTenantList(); + var tenant = tenantList.FirstOrDefault(x => x.Code.ToLower() == domain);//获取租户默认是机构编码 + if (tenant != null) + input.TenantId = tenant.Id; + else + throw Oops.Bah("租户不存在"); + } + //如果是手动选择多租户则用账号+租户 + key += $"{input.TenantId}:{input.Account}"; + } var errorCountCache = _simpleCacheService.Get(key);//获取登录错误次数 if (errorCountCache >= errorCount) { + _simpleCacheService.SetExpire(key, TimeSpan.FromMinutes(lockTime));//设置缓存 throw Oops.Bah($"密码错误次数过多,请{lockTime}分钟后再试"); } } @@ -172,11 +232,20 @@ public class AuthService : IAuthService /// 登录错误操作 /// /// - /// - public void LoginError(List loginPolicy, string userName) + /// + /// + public void LoginError(List loginPolicy, LoginInput input, bool isTenant) { - var resetTime = loginPolicy.First(x => x.ConfigKey == DevConfigConst.LOGIN_ERROR_RESET_TIME).ConfigValue.ToInt();//获取重置时间 - var key = SystemConst.Cache_LoginErrorCount + userName;//获取登录错误次数Key值 + var resetTime = loginPolicy.First(x => x.ConfigKey == SysConfigConst.LOGIN_ERROR_RESET_TIME).ConfigValue.ToInt();//获取重置时间 + var key = SystemConst.CACHE_LOGIN_ERROR_COUNT;//获取登录错误次数Key值 + //如果是关闭多租户则直接用账号 + if (!isTenant) + key += input.Account; + else + { + //如果是手动选择多租户则用账号+租户 + key += $"{input.TenantId}:{input.Account}"; + } _simpleCacheService.Increment(key, 1);// 登录错误次数+1 _simpleCacheService.SetExpire(key, TimeSpan.FromMinutes(resetTime));//设置过期时间 } @@ -189,8 +258,8 @@ public class AuthService : IAuthService /// 是否从Redis删除 public void ValidValidCode(string validCode, string validCodeReqNo, bool isDelete = true) { - var key = SystemConst.Cache_Captcha + validCodeReqNo;//获取验证码Key值 - var code = _simpleCacheService.Get(key);//从redis拿数据 + var key = SystemConst.CACHE_CAPTCHA + validCodeReqNo;//获取验证码Key值 + var code = _simpleCacheService.Get(key);//从缓存拿数据 if (isDelete) RemoveValidCodeFromRedis(validCodeReqNo);//如果需要删除验证码 if (code != null && validCode != null)//如果有 { @@ -209,7 +278,7 @@ public class AuthService : IAuthService /// public void RemoveValidCodeFromRedis(string validCodeReqNo) { - var key = SystemConst.Cache_Captcha + validCodeReqNo;//获取验证码Key值 + var key = SystemConst.CACHE_CAPTCHA + validCodeReqNo;//获取验证码Key值 _simpleCacheService.Remove(key);//删除验证码 } @@ -234,12 +303,12 @@ public class AuthService : IAuthService else { //校验C段用户手机号 - throw Oops.Bah("手机号不存在");//抛出验证码不能为空 + throw Oops.Bah("手机号不存在");//手机号不存在 } } /// - /// 添加验证码到redis + /// 添加验证码到缓存 /// /// 验证码 /// 过期时间 @@ -248,8 +317,8 @@ public class AuthService : IAuthService { //生成请求号 var reqNo = CommonUtils.GetSingleId().ToString(); - //插入redis - _simpleCacheService.Set(SystemConst.Cache_Captcha + reqNo, code, TimeSpan.FromMinutes(expire)); + //插入缓存 + _simpleCacheService.Set(SystemConst.CACHE_CAPTCHA + reqNo, code, TimeSpan.FromMinutes(expire)); return reqNo; } @@ -259,28 +328,36 @@ public class AuthService : IAuthService /// 用户信息 /// 登录设备 /// 登录类型 + /// 租户id /// - public async Task ExecLoginB(SysUser sysUser, AuthDeviceTypeEumu device, LoginClientTypeEnum loginClientType) + public async Task ExecLoginB(SysUser sysUser, AuthDeviceTypeEnum device, LoginClientTypeEnum loginClientType, + long? tenantId) { - if (sysUser.UserStatus == DevDictConst.COMMON_STATUS_DISABLED) throw Oops.Bah("账号已停用");//账号冻结 - + if (sysUser.Status == CommonStatusConst.DISABLED) + throw Oops.Bah("账号已停用");//账号冻结 + if (sysUser.ModuleList.Count == 0) throw Oops.Bah("该账号未分配模块,请联系管理员");//没有分配菜单权限 + var org = await _sysOrgService.GetSysOrgById(sysUser.OrgId);//获取机构 + if (org.Status == CommonStatusConst.DISABLED) throw Oops.Bah("所属公司/部门已停用,请联系管理员");//机构冻结 //生成Token var accessToken = JWTEncryption.Encrypt(new Dictionary { { - ClaimConst.UserId, sysUser.Id + ClaimConst.USER_ID, sysUser.Id + }, + { + ClaimConst.ACCOUNT, sysUser.Account }, { - ClaimConst.Account, sysUser.Account + ClaimConst.NAME, sysUser.Name }, { - ClaimConst.Name, sysUser.Name + ClaimConst.IS_SUPER_ADMIN, sysUser.RoleCodeList.Contains(SysRoleConst.SUPER_ADMIN) }, { - ClaimConst.IsSuperAdmin, sysUser.RoleCodeList.Contains(RoleConst.SuperAdmin) + ClaimConst.ORG_ID, sysUser.OrgId }, { - ClaimConst.OrgId, sysUser.OrgId + ClaimConst.TENANT_ID, tenantId } }); var expire = App.GetConfig("JWTSettings:ExpiredTime");//获取过期时间(分钟) @@ -291,7 +368,7 @@ public class AuthService : IAuthService // 设置响应报文头 App.HttpContext.SetTokensOfResponseHeaders(accessToken, refreshToken); //登录事件参数 - var logingEvent = new LoginEvent + var loginEvent = new LoginEvent { Ip = App.HttpContext.GetRemoteIpAddressToIPv4(), Device = device, @@ -299,19 +376,21 @@ public class AuthService : IAuthService SysUser = sysUser, Token = accessToken }; - await WriteTokenToRedis(logingEvent, loginClientType);//写入token到redis - await _eventPublisher.PublishAsync(EventSubscriberConst.LoginB, logingEvent);//发布登录事件总线 + await WriteTokenToRedis(loginEvent, loginClientType);//写入token到缓存 + await _eventPublisher.PublishAsync(EventSubscriberConst.LOGIN_B, loginEvent);//发布登录事件总线 //返回结果 return new LoginOutPut { Token = accessToken, Account = sysUser.Account, - Name = sysUser.Name + Name = sysUser.Name, + DefaultModule = sysUser.DefaultModule, + ModuleList = sysUser.ModuleList }; } /// - /// 写入用户token到redis + /// 写入用户token到缓存 /// /// 登录事件参数 /// 登录类型 @@ -329,12 +408,13 @@ public class AuthService : IAuthService LoginClientType = loginClientType, Token = loginEvent.Token }; - //如果redis有数据 + //如果缓存有数据 if (tokenInfos != null) { var isSingle = false;//默认不开启单用户登录 - var singleConfig = await _configService.GetByConfigKey(CateGoryConst.Config_LOGIN_POLICY, DevConfigConst.LOGIN_SINGLE_OPEN);//获取系统单用户登录选项 - if (singleConfig != null) isSingle = singleConfig.ConfigValue.ToBoolean();//如果配置不为空则设置单用户登录选项为系统配置的值 + var singleConfig = await _configService.GetByConfigKey(CateGoryConst.CONFIG_LOGIN_POLICY, SysConfigConst.LOGIN_SINGLE_OPEN);//获取系统单用户登录选项 + if (singleConfig != null) + isSingle = singleConfig.ConfigValue.ToBoolean();//如果配置不为空则设置单用户登录选项为系统配置的值 //判断是否单用户登录 if (isSingle) { @@ -356,11 +436,11 @@ public class AuthService : IAuthService } //添加到token列表 - _simpleCacheService.HashAdd(CacheConst.Cache_UserToken, loginEvent.SysUser.Id.ToString(), tokenInfos); + _simpleCacheService.HashAdd(CacheConst.CACHE_USER_TOKEN, loginEvent.SysUser.Id.ToString(), tokenInfos); } /// - /// redis删除用户token + /// 缓存删除用户token /// /// 登录事件参数 /// 登录类型 @@ -377,15 +457,12 @@ public class AuthService : IAuthService if (tokenInfos.Count > 0) { //更新token列表 - _simpleCacheService.HashAdd(CacheConst.Cache_UserToken, loginEvent.SysUser.Id.ToString(), tokenInfos); + _simpleCacheService.HashAdd(CacheConst.CACHE_USER_TOKEN, loginEvent.SysUser.Id.ToString(), tokenInfos); } else { //从列表中删除 - _simpleCacheService.HashDel>(CacheConst.Cache_UserToken, new string[] - { - loginEvent.SysUser.Id.ToString() - }); + _simpleCacheService.HashDel>(CacheConst.CACHE_USER_TOKEN, loginEvent.SysUser.Id.ToString()); } } } @@ -397,8 +474,8 @@ public class AuthService : IAuthService /// token列表 private List GetTokenInfos(long userId) { - //redis获取用户token列表 - var tokenInfos = _simpleCacheService.HashGetOne>(CacheConst.Cache_UserToken, userId.ToString()); + //缓存获取用户token列表 + var tokenInfos = _simpleCacheService.HashGetOne>(CacheConst.CACHE_USER_TOKEN, userId.ToString()); if (tokenInfos != null) { tokenInfos = tokenInfos.Where(it => it.TokenTimeout > DateTime.Now).ToList();//去掉登录超时的 @@ -413,7 +490,7 @@ public class AuthService : IAuthService /// Token列表 private async Task SingleLogin(string userId, List tokenInfos) { - await _eventPublisher.PublishAsync(EventSubscriberConst.UserLoginOut, new UserLoginOutEvent + await _eventPublisher.PublishAsync(EventSubscriberConst.USER_LOGIN_OUT, new UserLoginOutEvent { Message = "您的账号已在别处登录!", TokenInfos = tokenInfos, @@ -422,4 +499,4 @@ public class AuthService : IAuthService } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthInput.cs index f8a80103f897c39e722ae3af56e5d0148ecc1e0b..2f44162dba1734680aae42cc5cb15e97c7050e89 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthInput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 权限认证输入 @@ -43,13 +53,18 @@ public class LoginInput : ValidCodeInput /// 设备类型,默认PC /// /// 0 - public AuthDeviceTypeEumu Device { get; set; } = AuthDeviceTypeEumu.PC; + public AuthDeviceTypeEnum Device { get; set; } = AuthDeviceTypeEnum.PC; + + /// + /// 租户ID + /// + public long? TenantId { get; set; } } /// /// 登出输入参数 /// -public class LoginOutIput +public class LoginOutInput { /// /// token @@ -79,5 +94,10 @@ public class LoginByPhoneInput : GetPhoneValidCodeInput /// 设备类型,默认PC /// /// 0 - public AuthDeviceTypeEumu Device { get; set; } = AuthDeviceTypeEumu.PC; -} \ No newline at end of file + public AuthDeviceTypeEnum Device { get; set; } = AuthDeviceTypeEnum.PC; + + /// + /// 租户ID + /// + public long? TenantId { get; set; } +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthOutPut.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthOutPut.cs index 927a0c1bb5f32267944d34d7a18595934204ff8a..65eafbec2cc5512c52dc0567e5796ce6c64083ba 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthOutPut.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthOutPut.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; public class AuthOutPut { @@ -39,6 +49,16 @@ public class LoginOutPut /// 姓名 /// public string Name { get; set; } + + /// + /// 默认模块 + /// + public long? DefaultModule { get; set; } + + /// + /// 模块列表 + /// + public List ModuleList { get; set; } } /// @@ -121,4 +141,14 @@ public class LoginUserOutput /// 按钮码集合 /// public List ButtonCodeList { get; set; } -} \ No newline at end of file + + /// + /// 机构及以下机构ID集合 + /// + public List ModuleList { get; set; } = new List(); + + /// + /// 默认模块 + /// + public long? DefaultModule { get; set; } +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/IAuthService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/IAuthService.cs index 979006b0f89f4fb1d78d1f18e44d949a083870b8..8bcb72c9931e7f18c415d8f53f7ec3c3e9832ede 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/IAuthService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/IAuthService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 权限校验服务 @@ -48,4 +58,4 @@ public interface IAuthService : ITransient /// 登出类型 /// Task LoginOut(string token, LoginClientTypeEnum loginClientType); -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/Dto/SessionInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/Dto/SessionInput.cs index 1f801c319e2bbb82e439b4556ac35732ae3604a5..aa67a122eb7bd289cefa55298079515f49f64cfe 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/Dto/SessionInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/Dto/SessionInput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 会话分页查询 @@ -32,4 +42,4 @@ public class ExitTokenInput : BaseIdInput /// [Required(ErrorMessage = "Tokens不能为空")] public List Tokens { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/Dto/SessionOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/Dto/SessionOutput.cs index 4bd989700e24d52c0b2e6c388bce722c028dbb3f..0d2f619cfba4febd1f6308d06c842e9e17296e42 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/Dto/SessionOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/Dto/SessionOutput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 会话输出 @@ -81,4 +91,4 @@ public class SessionAnalysisOutPut /// BC端会话比例 /// public string ProportionOfBAndC { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/ISessionService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/ISessionService.cs index 185ece5b909f2db442a6729008fae53ec7811758..47af0e3e2f9182ea134900bc5511ec5dd60ae430 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/ISessionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/ISessionService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 会话管理服务 @@ -36,4 +46,4 @@ public interface ISessionService : ITransient /// 查询参数 /// C端会话列表 Task> PageC(SessionPageInput input); -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/SessionService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/SessionService.cs index 1b0eb75206822422b7d59081acbe791ca0a33353..e7a76070e4dbb7821aafce80ff3a2d72b2fe1005 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/SessionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/SessionService.cs @@ -1,5 +1,14 @@ -using Masuit.Tools.DateTimeExt; -using Masuit.Tools.Models; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using Masuit.Tools.DateTimeExt; namespace SimpleAdmin.System; @@ -29,33 +38,33 @@ public class SessionService : DbRepository, ISessionService .WhereIF(!string.IsNullOrEmpty(input.Name), it => it.Name.Contains(input.Name))//根据姓名查询 .WhereIF(!string.IsNullOrEmpty(input.Account), it => it.Account.Contains(input.Account))//根据账号查询 .WhereIF(!string.IsNullOrEmpty(input.LatestLoginIp), it => it.LatestLoginIp.Contains(input.LatestLoginIp))//根据IP查询 - .OrderBy(it => it.LatestLoginTime, OrderByType.Desc) - .Select() - .Mapper(it => + .OrderBy(it => it.LatestLoginTime, OrderByType.Desc).Select().Mapper(it => { var tokenInfos = bTokenInfoDic[it.Id.ToString()];//获取用户token信息 GetTokenInfos(ref tokenInfos, LoginClientTypeEnum.B);//获取剩余时间 it.TokenCount = tokenInfos.Count;//令牌数量 it.TokenSignList = tokenInfos;//令牌列表 //如果有mqtt客户端ID就是在线 - it.OnlineStatus = tokenInfos.Any(it => it.ClientIds.Count > 0) ? DevDictConst.ONLINE_STATUS_ONLINE : DevDictConst.ONLINE_STATUS_OFFLINE; + it.OnlineStatus = tokenInfos.Any(it => it.ClientIds.Count > 0) + ? SysDictConst.ONLINE_STATUS_ONLINE + : SysDictConst.ONLINE_STATUS_OFFLINE; }); - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 - pageInfo.Records.OrderByDescending(it => it.TokenCount); + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 + pageInfo.List.OrderByDescending(it => it.TokenCount); return pageInfo; } /// public async Task> PageC(SessionPageInput input) { - return new SqlSugarPagedList() { Current = 1, Size = 20, Total = 0, Pages = 1, HasNextPages = false }; + return new SqlSugarPagedList { PageNum = 1, PageSize = 20, Total = 0, Pages = 1, HasNextPages = false }; } /// public SessionAnalysisOutPut Analysis() { - var tokenDic = GetTokenDicFromRedis();//redistoken会话字典信息 + var tokenDic = GetTokenDicFromRedis();//redisToken会话字典信息 var tokenInfosList = tokenDic.Values.ToList();//端token列表 var dicB = new Dictionary>(); var dicC = new Dictionary>(); @@ -75,11 +84,11 @@ public class SessionService : DbRepository, ISessionService var tokenC = dicC.Values.ToList();//c端token列表 int maxCountB = 0, maxCountC = 0; if (tokenB.Count > 0) - maxCountB = tokenB.OrderByDescending(it => it.Count).Take(1).First().Count();//b端最大会话数 + maxCountB = tokenB.OrderByDescending(it => it.Count).Take(1).First().Count;//b端最大会话数 if (tokenC.Count > 0) - maxCountC = tokenC.OrderByDescending(it => it.Count).Take(1).First().Count();//C端最大会话数 - return new SessionAnalysisOutPut() + maxCountC = tokenC.OrderByDescending(it => it.Count).Take(1).First().Count;//C端最大会话数 + return new SessionAnalysisOutPut { OnLineCount = onLineCount, CurrentSessionTotalCount = tokenB.Count + tokenC.Count, @@ -93,9 +102,9 @@ public class SessionService : DbRepository, ISessionService { var userId = input.Id.ToString(); //token列表 - var tokenInfos = _simpleCacheService.HashGetOne>(CacheConst.Cache_UserToken, userId); + var tokenInfos = _simpleCacheService.HashGetOne>(CacheConst.CACHE_USER_TOKEN, userId); //从列表中删除 - _simpleCacheService.HashDel>(CacheConst.Cache_UserToken, new string[] { userId }); + _simpleCacheService.HashDel>(CacheConst.CACHE_USER_TOKEN, userId); await NoticeUserLoginOut(userId, tokenInfos); } @@ -104,15 +113,15 @@ public class SessionService : DbRepository, ISessionService { var userId = input.Id.ToString(); //获取该用户的token信息 - var tokenInfos = _simpleCacheService.HashGetOne>(CacheConst.Cache_UserToken, userId); + var tokenInfos = _simpleCacheService.HashGetOne>(CacheConst.CACHE_USER_TOKEN, userId); //当前需要踢掉用户的token var deleteTokens = tokenInfos.Where(it => input.Tokens.Contains(it.Token)).ToList(); //踢掉包含token列表的token信息 tokenInfos = tokenInfos.Where(it => !input.Tokens.Contains(it.Token)).ToList(); if (tokenInfos.Count > 0) - _simpleCacheService.HashAdd(CacheConst.Cache_UserToken, userId, tokenInfos);//如果还有token则更新token + _simpleCacheService.HashAdd(CacheConst.CACHE_USER_TOKEN, userId, tokenInfos);//如果还有token则更新token else - _simpleCacheService.HashDel>(CacheConst.Cache_UserToken, new string[] { userId });//否则直接删除key + _simpleCacheService.HashDel>(CacheConst.CACHE_USER_TOKEN, userId);//否则直接删除key await NoticeUserLoginOut(userId, deleteTokens); } @@ -126,7 +135,7 @@ public class SessionService : DbRepository, ISessionService { var clockSkew = App.GetConfig("JWTSettings:ClockSkew");//获取过期时间容错值(秒) //redis获取token信息hash集合,并转成字典 - var bTokenDic = _simpleCacheService.HashGetAll>(CacheConst.Cache_UserToken).ToDictionary(u => u.Key, u => u.Value); + var bTokenDic = _simpleCacheService.HashGetAll>(CacheConst.CACHE_USER_TOKEN).ToDictionary(u => u.Key, u => u.Value); if (bTokenDic != null) { bTokenDic.ForEach(it => @@ -144,18 +153,15 @@ public class SessionService : DbRepository, ISessionService }); if (bTokenDic.Count > 0) { - _simpleCacheService.HashSet(CacheConst.Cache_UserToken, bTokenDic);//如果还有token则更新token + _simpleCacheService.HashSet(CacheConst.CACHE_USER_TOKEN, bTokenDic);//如果还有token则更新token } else { - _simpleCacheService.Remove(CacheConst.Cache_UserToken);//否则直接删除key + _simpleCacheService.Remove(CacheConst.CACHE_USER_TOKEN);//否则直接删除key } return bTokenDic; } - else - { - return new Dictionary>(); - } + return new Dictionary>(); } /// @@ -172,7 +178,8 @@ public class SessionService : DbRepository, ISessionService it.TokenRemain = now.GetDiffTime(it.TokenTimeout);//获取时间差 var tokenSecond = it.TokenTimeout.AddMinutes(-it.Expire).ConvertDateTimeToLong();//颁发时间转为时间戳 var timeoutSecond = it.TokenTimeout.ConvertDateTimeToLong();//过期时间转为时间戳 - var tokenRemainPercent = 1 - (now.ConvertDateTimeToLong() - tokenSecond) * 1.0 / (timeoutSecond - tokenSecond);//求百分比,用现在时间-token颁布时间除以超时时间-token颁布时间 + var tokenRemainPercent = + 1 - (now.ConvertDateTimeToLong() - tokenSecond) * 1.0 / (timeoutSecond - tokenSecond);//求百分比,用现在时间-token颁布时间除以超时时间-token颁布时间 it.TokenRemainPercent = tokenRemainPercent; }); } @@ -183,7 +190,7 @@ public class SessionService : DbRepository, ISessionService /// private async Task NoticeUserLoginOut(string userId, List tokenInfos) { - await _eventPublisher.PublishAsync(EventSubscriberConst.UserLoginOut, new UserLoginOutEvent + await _eventPublisher.PublishAsync(EventSubscriberConst.USER_LOGIN_OUT, new UserLoginOutEvent { Message = "您已被强制下线!", TokenInfos = tokenInfos, @@ -192,4 +199,4 @@ public class SessionService : DbRepository, ISessionService } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs index f0172d1fd0a2c762b5b3992f50f34345b9b20d70..858075b02ac0c6cbcb1403eb9a514ae60d1d7c34 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// @@ -16,13 +26,12 @@ public class BatchEditService : DbRepository, IBatchEditService public async Task> Page(BatchEditPageInput input) { var query = Context.Queryable() - .WhereIF(!string.IsNullOrWhiteSpace(input.ConfigId), it => it.ConfigId.Contains(input.ConfigId.Trim())) - .WhereIF(!string.IsNullOrWhiteSpace(input.Entityname), it => it.EntityName.Contains(input.Entityname.Trim())) - .WhereIF(!string.IsNullOrWhiteSpace(input.Tablename), it => it.TableName.Contains(input.Tablename.Trim())) - //.WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}") - ; - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + .WhereIF(!string.IsNullOrWhiteSpace(input.ConfigId), it => it.ConfigId.Contains(input.ConfigId.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.EntityName), it => it.EntityName.Contains(input.EntityName.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.TableName), it => it.TableName.Contains(input.TableName.Trim())) + //.WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 + .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}"); + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } @@ -38,7 +47,7 @@ public class BatchEditService : DbRepository, IBatchEditService tableColumns.ForEach(it => { //判断是否是主键或者通用字段 - var isPkOrCommon = it.IsPrimarykey || SqlSugarUtils.IsCommonColumn(it.ColumnName); + var isPkOrCommon = it.IsPrimaryKey || SqlSugarUtils.IsCommonColumn(it.ColumnName); if (!isPkOrCommon) { //添加到字段集合 @@ -46,7 +55,7 @@ public class BatchEditService : DbRepository, IBatchEditService } }); //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { entity = await InsertReturnEntityAsync(entity);//输入参数转实体并插入 batchEdiConfig.ForEach(it => { it.UId = entity.Id; });//遍历字段赋值基础Id @@ -74,14 +83,14 @@ public class BatchEditService : DbRepository, IBatchEditService } /// - public async Task Delete(List input) + public async Task Delete(BaseIdListInput input) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; if (ids.Count > 0) { //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { await DeleteByIdsAsync(ids.Cast().ToArray());//删除数据 await Context.Deleteable().Where(it => ids.Contains(it.UId)).ExecuteCommandAsync(); @@ -109,7 +118,7 @@ public class BatchEditService : DbRepository, IBatchEditService foreach (var tableColumn in tableColumns) { //判断是否是主键或者通用字段 - var isPkOrCommon = tableColumn.IsPrimarykey || SqlSugarUtils.IsCommonColumn(tableColumn.ColumnName); + var isPkOrCommon = tableColumn.IsPrimaryKey || SqlSugarUtils.IsCommonColumn(tableColumn.ColumnName); if (!isPkOrCommon) { //如果当前配置没有 @@ -137,7 +146,8 @@ public class BatchEditService : DbRepository, IBatchEditService if (updateBatch != null) { //找到对应字段 - batchEdiConfig = await Context.Queryable().Where(it => it.UId == updateBatch.Id && it.Status == DevDictConst.COMMON_STATUS_ENABLE).ToListAsync(); + batchEdiConfig = await Context.Queryable().Where(it => it.UId == updateBatch.Id && it.Status == CommonStatusConst.ENABLE) + .ToListAsync(); } return batchEdiConfig; } @@ -174,7 +184,7 @@ public class BatchEditService : DbRepository, IBatchEditService /// 获取配置 /// /// - private BatchEditConfig GetUpdateBatchConfig(SqlsugarColumnInfo columnInfo) + private BatchEditConfig GetUpdateBatchConfig(SqlSugarColumnInfo columnInfo) { var netType = SqlSugarUtils.ConvertDataType(columnInfo.DataType); return new BatchEditConfig @@ -183,7 +193,7 @@ public class BatchEditService : DbRepository, IBatchEditService ColumnComment = string.IsNullOrWhiteSpace(columnInfo.ColumnDescription) ? columnInfo.ColumnName : columnInfo.ColumnDescription, NetType = netType, DataType = SqlSugarUtils.DataTypeToEff(netType), - Status = DevDictConst.COMMON_STATUS_DISABLED + Status = CommonStatusConst.DISABLED }; } @@ -201,4 +211,4 @@ public class BatchEditService : DbRepository, IBatchEditService } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditInput.cs index 2b3288ac06a24d9281081f9d7da109ac42afc6c5..98ed51f1b53865df5eebe61af009b231f98c262e 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditInput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 批量分页查询参数 @@ -18,12 +28,12 @@ public class BatchEditPageInput : BasePageInput /// /// 实体名 /// - public string Entityname { get; set; } + public string EntityName { get; set; } /// /// 表名 /// - public string Tablename { get; set; } + public string TableName { get; set; } } /// @@ -58,7 +68,7 @@ public class BatchEditAddInput /// /// 表描述 /// - public string Tabledescription { get; set; } + public string TableDescription { get; set; } } /// @@ -74,10 +84,11 @@ public class BatchEditConfigInput : BatchEditConfig, IValidatableObject public IEnumerable Validate(ValidationContext validationContext) { - if (Status == DevDictConst.COMMON_STATUS_ENABLE) + if (Status == CommonStatusConst.ENABLE) { //如果是api请求并且必填参数有空的 - if (DataType.Contains("api") && (string.IsNullOrEmpty(RequestUrl) || string.IsNullOrEmpty(RequestType) || string.IsNullOrEmpty(RequestLabel) || string.IsNullOrEmpty(RequestValue))) + if (DataType.Contains("api") && (string.IsNullOrEmpty(RequestUrl) || string.IsNullOrEmpty(RequestType) + || string.IsNullOrEmpty(RequestLabel) || string.IsNullOrEmpty(RequestValue))) { yield return new ValidationResult($"字段{ColumnName}接口信息必填", new[] { nameof(DataType) }); } @@ -124,4 +135,4 @@ public class BatchEditColumn [Required(ErrorMessage = "字段值必填")] public object ColumnValue { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditOutput.cs index 10b1c277eff201aeb5c7d4f13a97f4545de34af6..cfde937b2177320a060cf6539690df5ed58f58e5 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditOutput.cs @@ -1 +1,14 @@ -namespace SimpleAdmin.System; \ No newline at end of file +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + + + + + diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/IBatchEditService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/IBatchEditService.cs index 89086a0122a8bdd240d8cb6a503557ed78b21b51..1ad691007829d7ffcbfe9bf5c890a8cfa0dfe401 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/IBatchEditService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/IBatchEditService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 批量服务 @@ -24,7 +34,7 @@ public interface IBatchEditService : ITransient /// /// 删除参数 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); /// /// 获取需要批量修改的表 @@ -58,7 +68,7 @@ public interface IBatchEditService : ITransient /// /// 唯一编码 /// 字段信息 - /// sqlsugar对应字典 + /// SqlSugar对应字典 Task> GetUpdateBatchConfigDict(string code, List columns); /// @@ -67,4 +77,4 @@ public interface IBatchEditService : ITransient /// id /// Task SyncColumns(BaseIdInput input); -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/Dto/FileInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/Dto/FileInput.cs index 2c80468782ee15b8fddb5b099a9f289e16b6f97d..df413f60ac7e52802ca0a4fa37b1b4e9adc17baf 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/Dto/FileInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/Dto/FileInput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 文件分页输出 @@ -9,4 +19,4 @@ public class FilePageInput : BasePageInput /// 文件引擎 /// public string Engine { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs index 0d20169bb492919628353462b78dde02bfc431de..621457defc48dc8b472f5ae76235b45c4fa26b29 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs @@ -1,13 +1,19 @@ -using SkiaSharp; -using System.Runtime.InteropServices; -using System.Web; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.System; /// /// /// -public class FileService : DbRepository, IFileService +public class FileService : DbRepository, IFileService { private readonly IConfigService _configService; @@ -17,14 +23,13 @@ public class FileService : DbRepository, IFileService } /// - public async Task> Page(FilePageInput input) + public async Task> Page(FilePageInput input) { - var query = Context.Queryable() - .WhereIF(!string.IsNullOrEmpty(input.Engine), it => it.Engine == input.Engine)//根据关键字查询 + var query = Context.Queryable().WhereIF(!string.IsNullOrEmpty(input.Engine), it => it.Engine == input.Engine)//根据关键字查询 .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}")//排序 .OrderBy(it => it.Id); - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } @@ -35,9 +40,9 @@ public class FileService : DbRepository, IFileService } /// - public async Task Delete(List input) + public async Task Delete(BaseIdListInput input) { - var ids = input.Select(it => it.Id).ToList();//获取ID + var ids = input.Ids;//获取ID await DeleteByIdsAsync(ids.Cast().ToArray());//根据ID删除数据库 } @@ -86,17 +91,13 @@ public class FileService : DbRepository, IFileService var devFile = await GetByIdAsync(input.Id); if (devFile != null) { - if (devFile.Engine == DevDictConst.FILE_ENGINE_LOCAL) + if (devFile.Engine == SysDictConst.FILE_ENGINE_LOCAL) return GetFileStreamResult(devFile.StoragePath, devFile.Name); - else if (devFile.Engine == DevDictConst.FILE_ENGINE_MINIO) + if (devFile.Engine == SysDictConst.FILE_ENGINE_MINIO) return await GetFileStreamResultFromMinio(devFile.ObjName, devFile.Name); - else - return null; - } - else - { return null; } + return null; } #region 方法 @@ -117,13 +118,13 @@ public class FileService : DbRepository, IFileService switch (engine) { //存储本地 - case DevDictConst.FILE_ENGINE_LOCAL: + case SysDictConst.FILE_ENGINE_LOCAL: bucketName = "defaultBucketName";// 存储桶名称 storageUrl = await StorageLocal(objectId, file); break; //存储本地 - case DevDictConst.FILE_ENGINE_MINIO: - var config = await _configService.GetByConfigKey(CateGoryConst.Config_FILE_MINIO, DevConfigConst.FILE_MINIO_DEFAULT_BUCKET_NAME); + case SysDictConst.FILE_ENGINE_MINIO: + var config = await _configService.GetByConfigKey(CateGoryConst.CONFIG_FILE_MINIO, SysConfigConst.FILE_MINIO_DEFAULT_BUCKET_NAME); if (config != null) { bucketName = config.ConfigValue;// 存储桶名称 @@ -133,11 +134,11 @@ public class FileService : DbRepository, IFileService default: - throw Oops.Bah($"不支持的文件引擎"); + throw Oops.Bah("不支持的文件引擎"); } var fileSizeKb = (long)(file.Length / 1024.0);// 文件大小KB var fileSuffix = Path.GetExtension(file.FileName).ToLower();// 文件后缀 - var devFile = new DevFile + var devFile = new SysFile { Id = objectId, Engine = engine, @@ -149,7 +150,7 @@ public class FileService : DbRepository, IFileService SizeInfo = GetSizeInfo(fileSizeKb), StoragePath = storageUrl }; - if (engine != CateGoryConst.Config_FILE_LOCAL)//如果不是本地,设置下载地址 + if (engine != CateGoryConst.CONFIG_FILE_LOCAL)//如果不是本地,设置下载地址 { devFile.DownloadPath = storageUrl; } @@ -162,7 +163,7 @@ public class FileService : DbRepository, IFileService var bmp = SKBitmap.FromImage(image); var thubnail = bmp.GetPicThumbnail(100, 100);//压缩图片 var thubnailBase64 = ImageUtil.ImgToBase64String(thubnail);//转base64 - devFile.Thumbnail = $"data:image/png;base64," + thubnailBase64; + devFile.Thumbnail = "data:image/png;base64," + thubnailBase64; } await InsertAsync(devFile); return objectId; @@ -177,17 +178,17 @@ public class FileService : DbRepository, IFileService { string uploadFileFolder; var configKey = string.Empty; - //判断是windos还是linux + //判断是windows还是linux if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { - configKey = DevConfigConst.FILE_LOCAL_FOLDER_FOR_UNIX;//Linux + configKey = SysConfigConst.FILE_LOCAL_FOLDER_FOR_UNIX;//Linux } else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { - configKey = DevConfigConst.FILE_LOCAL_FOLDER_FOR_WINDOWS;//Windows + configKey = SysConfigConst.FILE_LOCAL_FOLDER_FOR_WINDOWS;//Windows } //获取路径配置 - var config = await _configService.GetByConfigKey(CateGoryConst.Config_FILE_LOCAL, configKey); + var config = await _configService.GetByConfigKey(CateGoryConst.CONFIG_FILE_LOCAL, configKey); if (config != null) { uploadFileFolder = config.ConfigValue;//赋值路径 @@ -206,10 +207,7 @@ public class FileService : DbRepository, IFileService } return fileName; } - else - { - throw Oops.Oh($"文件存储路径未配置"); - } + throw Oops.Oh("文件存储路径未配置"); } /// @@ -236,16 +234,16 @@ public class FileService : DbRepository, IFileService private string GetSizeInfo(long fileSizeKb) { var b = fileSizeKb * 1024; - const int MB = 1024 * 1024; - const int KB = 1024; - if (b / MB >= 1) + const int mb = 1024 * 1024; + const int kb = 1024; + if (b / mb >= 1) { - return Math.Round(b / (float)MB, 2) + "MB"; + return Math.Round(b / (float)mb, 2) + "MB"; } - if (b / KB >= 1) + if (b / kb >= 1) { - return Math.Round(b / (float)KB, 2) + "KB"; + return Math.Round(b / (float)kb, 2) + "KB"; } if (b == 0) { @@ -262,15 +260,14 @@ public class FileService : DbRepository, IFileService private bool IsPic(string suffix) { //图片后缀名列表 - var pics = new string[] + var pics = new[] { ".png", ".bmp", ".gif", ".jpg", ".jpeg", ".psd" }; if (pics.Contains(suffix)) return true; - else - return false; + return false; } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/IFileService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/IFileService.cs index c4adce24ee536586535f5a2ba85ff90bdff7627c..1a576325d7421e4a23e23f87d70360136b4fb376 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/IFileService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/IFileService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 文件管理服务 @@ -10,7 +20,7 @@ public interface IFileService : ITransient /// /// ID列表 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); /// /// 文件下载 @@ -41,7 +51,7 @@ public interface IFileService : ITransient /// /// 查询参数 /// 文件列表 - Task> Page(FilePageInput input); + Task> Page(FilePageInput input); /// /// 上传文件到本地返回下载url @@ -50,4 +60,4 @@ public interface IFileService : ITransient /// 文件 /// Task UploadFile(string engine, IFormFile file); -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/Dto/MessageInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/Dto/MessageInput.cs index bc7d596821ae5e55e4aa040ff37245337297979b..9aeab1531e6489dc27bf8c6a3811b2c73b2cf202 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/Dto/MessageInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/Dto/MessageInput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; public class MessagePageInput : BasePageInput { @@ -11,7 +21,7 @@ public class MessagePageInput : BasePageInput /// /// 发送参数 /// -public class MessageSendInput : DevMessage, IValidatableObject +public class MessageSendInput : SysMessage { /// /// 主题 @@ -28,14 +38,53 @@ public class MessageSendInput : DevMessage, IValidatableObject /// /// 接收人Id /// - [Required(ErrorMessage = "ReceiverIdList不能为空")] public List ReceiverIdList { get; set; } - public IEnumerable Validate(ValidationContext validationContext) - { - if (Category != CateGoryConst.Message_INFORM && Category != CateGoryConst.Message_NOTICE) - { - yield return new ValidationResult("分类错误", new[] { nameof(Category) }); - } - } -} \ No newline at end of file + public override string Status { get; set; } = SysDictConst.MESSAGE_STATUS_READY; +} + +public class MessageSendUpdateInput : MessageSendInput +{ + /// + /// 消息Id + /// + [Required(ErrorMessage = "Id不能为空")] + public override long Id { get; set; } +} + +/// +/// 消息详情输入参数 +/// +public class MessageDetailInput : BaseIdInput +{ + /// + /// 是否显示接收信息 + /// + public bool ShowReceiveInfo { get; set; } = false; + + /// + /// 是否已读 + /// + public bool Read { get; set; } = false; +} + +/// +/// 已读输入参数 +/// +public class MessageReadInput +{ + /// + /// 分类 + /// + public string Category { get; set; } + + /// + /// 用户Id + /// + public long Id { get; set; } + + /// + /// 消息Id + /// + public List Ids { get; set; } = new List(); +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/Dto/MessageOutPut.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/Dto/MessageOutPut.cs index c84fbff426d18d750e1570f596afb7861d2729ba..66d02c37c4a11b34470262cc6c22752fe14b2f7e 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/Dto/MessageOutPut.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/Dto/MessageOutPut.cs @@ -1,31 +1,34 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 消息详情 /// -public class MessageDetailOutPut : DevMessage +public class MessageDetailOutPut : SysMessage { - public List ReceiveInfoList { get; set; } = new List(); +} +/// +/// 未读消息数量输出 +/// +public class MessageUnReadOutPut +{ /// - /// 接收信息类 + /// 未读消息数量 /// + public int UnReadCount { get; set; } - public class ReceiveInfo - { - /// - /// 接收人ID - /// - public long ReceiveUserId { get; set; } - - /// - /// 接收人姓名 - /// - public string ReceiveUserName { get; set; } - - /// - /// 是否已读 - /// - public bool Read { get; set; } - } -} \ No newline at end of file + /// + /// 分类 + /// + public string Category { get; set; } +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/IMessageService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/IMessageService.cs index eb8bfa12fed1c61aacbce2f3f58ff5efd9b755b4..0ecb7c4c297e6420781560898070f8c264824e64 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/IMessageService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/IMessageService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 站内信服务 @@ -10,7 +20,7 @@ public interface IMessageService : ITransient /// /// id列表 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); /// /// 删除我的消息 @@ -23,10 +33,9 @@ public interface IMessageService : ITransient /// /// 获取消息详情 /// - /// 消息ID - /// 是否是自己 + /// 输入参数 /// 消息详情 - Task Detail(BaseIdInput input, bool isSelf = false); + Task Detail(MessageDetailInput input); /// /// 我的消息列表 @@ -34,26 +43,55 @@ public interface IMessageService : ITransient /// /// /// - Task> MyMessagePage(MessagePageInput input, long userId); + Task> MyMessagePage(MessagePageInput input, long userId); /// /// 分页查询 /// /// 查询参数 /// - Task> Page(MessagePageInput input); + Task> Page(MessagePageInput input); + /// - /// 发送站内信 + /// 获取未读消息数 /// - /// 站内信信息 + /// 用户Id /// - Task Send(MessageSendInput input); + Task> UnReadCount(long userId); /// - /// 获取未读消息数 + /// 最新未读 /// /// /// - Task UnReadCount(long userId); -} \ No newline at end of file + Task> NewUnRead(long userId); + + /// + /// 标记已读 + /// + /// + /// + Task SetRead(MessageReadInput input); + + /// + /// 删除消息 + /// + /// + /// + Task SetDelete(MessageReadInput input); + + /// + /// 新增 + /// + /// + /// + Task Add(MessageSendInput input); + + /// + /// 编辑 + /// + /// + /// + Task Edit(MessageSendUpdateInput input); +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs index 855edbaeba573e762e6561404d7e5b972009f87d..d0d311723faacc8e5aaaa9a27e06f971c7510833 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs @@ -1,80 +1,122 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using Masuit.Tools.DateTimeExt; + +namespace SimpleAdmin.System; /// /// /// -public class MessageService : DbRepository, IMessageService +public class MessageService : DbRepository, IMessageService { private readonly ILogger _logger; private readonly ISimpleCacheService _simpleCacheService; private readonly IRelationService _relationService; private readonly IEventPublisher _eventPublisher; - public MessageService(ILogger logger, ISimpleCacheService simpleCacheService, IRelationService relationService, IEventPublisher eventPublisher) + public MessageService(ILogger logger, ISimpleCacheService simpleCacheService, IRelationService relationService, + IEventPublisher eventPublisher) { - this._logger = logger; - this._simpleCacheService = simpleCacheService; - this._relationService = relationService; - this._eventPublisher = eventPublisher; + _logger = logger; + _simpleCacheService = simpleCacheService; + _relationService = relationService; + _eventPublisher = eventPublisher; } /// - public async Task> Page(MessagePageInput input) + public async Task> Page(MessagePageInput input) { - var query = Context.Queryable() - .WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category)//根据分类查询 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Subject.Contains(input.SearchKey) || it.Content.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}")//排序 - .OrderBy(it => it.CreateTime, OrderByType.Desc) - ; - - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + var query = Context.Queryable().WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category)//根据分类查询 + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), + it => it.Subject.Contains(input.SearchKey) || it.Content.Contains(input.SearchKey))//根据关键字查询 + .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}")//排序 + .OrderBy(it => it.CreateTime, OrderByType.Desc); + + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } /// - public async Task> MyMessagePage(MessagePageInput input, long userId) + public async Task> MyMessagePage(MessagePageInput input, long userId) { - var query = Context.Queryable().LeftJoin((u, m) => u.MessageId == m.Id) - .Where((u, m) => u.IsDelete == false && u.UserId == userId) - .WhereIF(!string.IsNullOrEmpty(input.Category), (u, m) => m.Category == input.Category)//根据分类查询 - .OrderBy((u, m) => u.Read, OrderByType.Asc) - .OrderBy((u, m) => m.CreateTime, OrderByType.Desc) - .Select((u, m) => new DevMessage - { - Id = m.Id.SelectAll(), - Read = u.Read, - }) - ; - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + var query = Context.Queryable().LeftJoin((u, m) => u.MessageId == m.Id) + .Where((u, m) => u.IsDelete == false && u.UserId == userId && u.Status == SysDictConst.MESSAGE_STATUS_ALREADY) + .WhereIF(!string.IsNullOrEmpty(input.Category), (u, m) => m.Category == input.Category)//根据分类查询 + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), + (u, m) => m.Subject.Contains(input.SearchKey) || m.Content.Contains(input.SearchKey))//根据关键字查询 + .OrderBy((u, m) => u.Read).OrderBy((u, m) => u.CreateTime, OrderByType.Desc).Select((u, m) => new SysMessage + { + Id = m.Id.SelectAll(), + Read = u.Read + }); + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } /// - public async Task Send(MessageSendInput input) + public async Task Add(MessageSendInput input) { - var message = input.Adapt();//实体转换 - var messageUsers = new List(); - input.ReceiverIdList.ForEach(it => + CheckInput(input); + var sysMessage = input.Adapt();//实体转换 + sysMessage.Id = CommonUtils.GetSingleId(); + //如果是立即发送的直接修改状态 + if (sysMessage.SendWay == SysDictConst.SEND_WAY_NOW) + sysMessage.Status = SysDictConst.MESSAGE_STATUS_ALREADY;//已发送 + var messageUsers = new List(); + var userIds = new List(); + //根据接收人获取需要发送的用户id + switch (sysMessage.ReceiverType) { - //遍历用户ID列表,生成拓展列表 - messageUsers.Add(new DevMessageUser { UserId = it, Read = false, IsDelete = false }); - }); + case SysDictConst.RECEIVER_TYPE_ALL: + userIds = await Context.Queryable().Select(it => it.Id).ToListAsync(); + break; + case SysDictConst.RECEIVER_TYPE_ROLE: + var roleIds = sysMessage.ReceiverInfo.Select(it => it.Id.ToString()).ToList();//获取角色ID列表 + var roleUsers = + await _relationService.GetRelationListByTargetIdListAndCategory(roleIds, CateGoryConst.RELATION_SYS_USER_HAS_ROLE);//获取角色用户列表 + userIds = roleUsers.Select(it => it.ObjectId).ToList();//获取用户ID列表 + break; + case SysDictConst.RECEIVER_TYPE_APPOINT: + userIds = sysMessage.ReceiverInfo.Select(it => it.Id).ToList(); + break; + } + //去掉自己 + userIds = userIds.Where(it => it != UserManager.UserId).ToList(); + //遍历用户ID + userIds.ForEach(userId => + { + messageUsers.Add(new SysMessageUser + { + MessageId = sysMessage.Id, + UserId = userId, + Read = false, + IsDelete = false, + Status = sysMessage.SendWay == SysDictConst.SEND_WAY_NOW ? SysDictConst.MESSAGE_STATUS_ALREADY : SysDictConst.MESSAGE_STATUS_READY + }); + }); //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { - message = await InsertReturnEntityAsync(message);//添加消息 - messageUsers.ForEach(it => it.MessageId = message.Id);//添加关系 + await InsertAsync(sysMessage);//添加消息 await Context.Insertable(messageUsers).ExecuteCommandAsync(); }); if (result.IsSuccess)//如果成功了 { - await _eventPublisher.PublishAsync(EventSubscriberConst.NewMessage, new NewMessageEvent + await _eventPublisher.PublishAsync(EventSubscriberConst.NEW_MESSAGE, new NewMessageEvent { - UserIds = input.ReceiverIdList.Select(it => it.ToString()).ToList(), - Message = input.Subject - }); //通知用户有新的消息 + Id = sysMessage.Id, + SendWay = sysMessage.SendWay, + SendTime = sysMessage.SendTime + });//通知用户有新的消息 } else { @@ -85,73 +127,76 @@ public class MessageService : DbRepository, IMessageService } /// - public async Task Detail(BaseIdInput input, bool isSelf = false) + public async Task Edit(MessageSendUpdateInput input) + { + CheckInput(input); + var sysMessage = input.Adapt();//实体转换 + await UpdateAsync(sysMessage);//更新数据 + } + + + + + /// + public async Task Detail(MessageDetailInput input) { //获取消息 var message = await GetFirstAsync(it => it.Id == input.Id); - if (message != null) + if (message != null && message.SendWay == SysDictConst.SEND_WAY_DELAY) + { + //delayTime等于发送时间减掉创建时间 + message.DelayTime = (int)(message.SendTime.GetTotalSeconds() - message.CreateTime.Value.GetTotalSeconds()); + } + if (message != null && input.ShowReceiveInfo) { - var messageDetail = message.Adapt();//实体转换 - var messageUserRep = ChangeRepository>();//切换仓储 + var messageUserRep = ChangeRepository>();//切换仓储 var messageUsers = await messageUserRep.GetListAsync(it => it.MessageId == message.Id); - var myMessage = messageUsers.Where(it => it.UserId == UserManager.UserId && it.MessageId == input.Id).FirstOrDefault();//查询是否发给自己 - if (myMessage != null) - { - myMessage.Read = true;//设置已读 - await messageUserRep.UpdateAsync(myMessage);//修改状态 - } - if (!isSelf)//如果不是自己则把所有的用户都列出来 - { - var userIds = messageUsers.Select(it => it.UserId).ToList();//获取用户ID列表 - var userInfos = await Context.Queryable() - .Where(it => userIds.Contains(it.Id)).Select(it => new { it.Id, it.Name }).ToListAsync();//获取用户姓名信息列表 - //遍历关系 - messageUsers.ForEach(messageUser => + var userIds = messageUsers.Select(it => it.UserId).ToList();//获取用户ID列表 + var userInfos = await Context.Queryable().Where(it => userIds.Contains(it.Id)).Select(it => new { it.Id, it.Name }) + .ToListAsync();//获取用户姓名信息列表 + //遍历关系 + messageUsers.ForEach(messageUser => + { + var user = userInfos.Where(u => u.Id == messageUser.UserId).FirstOrDefault();//获取用户信息 + if (user != null) { - var user = userInfos.Where(u => u.Id == messageUser.UserId).FirstOrDefault();//获取用户信息 - if (user != null) + //添加到已读列表 + message.ReceiverDetail.Add(new ReceiverDetail { - //添加到已读列表 - messageDetail.ReceiveInfoList.Add(new MessageDetailOutPut.ReceiveInfo - { - ReceiveUserId = user.Id, - ReceiveUserName = user.Name, - Read = messageUser.Read - }); - } - else//用户ID没找到 - { - //添加到已读列表 - messageDetail.ReceiveInfoList.Add(new MessageDetailOutPut.ReceiveInfo - { - ReceiveUserId = messageUser.UserId, - ReceiveUserName = "未知用户", - Read = messageUser.Read - }); - } - }); - } - return messageDetail; + Id = user.Id, + Name = user.Name, + Read = messageUser.Read + }); + } + }); } - else + //设置已读 + if (input.Read) { - return null; + await Context.Updateable() + .SetColumns(it => it.Read == true) + .SetColumns(it => it.UpdateTime == DateTime.Now) + .Where(it => it.MessageId == input.Id && it.Read == false && it.UserId == UserManager.UserId).ExecuteCommandAsync(); } + return message; } + + + /// - public async Task Delete(List input) + public async Task Delete(BaseIdListInput input) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; if (ids.Count > 0) { //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { await DeleteAsync(it => ids.Contains(it.Id)); - await Context.Deleteable().Where(it => ids.Contains(it.MessageId)).ExecuteCommandAsync(); + await Context.Deleteable().Where(it => ids.Contains(it.MessageId)).ExecuteCommandAsync(); }); if (!result.IsSuccess)//如果失败了 { @@ -165,16 +210,130 @@ public class MessageService : DbRepository, IMessageService /// public async Task DeleteMyMessage(BaseIdInput input, long userId) { - var messageUserRep = ChangeRepository>();//切换仓储 - await Context.Deleteable().Where(it => it.UserId == userId && it.MessageId == input.Id).IsLogic().ExecuteCommandAsync();//逻辑删除 + var messageUserRep = ChangeRepository>();//切换仓储 + await Context.Deleteable().Where(it => it.UserId == userId && it.MessageId == input.Id).IsLogic().ExecuteCommandAsync();//逻辑删除 } /// - public async Task UnReadCount(long userId) + public async Task> UnReadCount(long userId) { - var messageUserRep = ChangeRepository>();//切换仓储 - //获取未读数量 - var unRead = await messageUserRep.CountAsync(it => it.UserId == userId && it.Read == false && it.IsDelete == false); - return unRead; + // 连表查询未读 + var unReadList = await Context.Queryable().LeftJoin((m, u) => u.MessageId == m.Id) + .Where((m, u) => u.UserId == userId && u.Read == false && u.IsDelete == false) + .Select().ToListAsync(); + //根据消息分类分组 + var groupList = unReadList.GroupBy(it => it.Category).Select(it => new MessageUnReadOutPut + { + Category = it.Key, + UnReadCount = it.Count() + }).ToList(); + return groupList; } -} \ No newline at end of file + + /// + public async Task> NewUnRead(long userId) + { + //根据消息分类分组,获取每组未读前五条 + var result = await Context.Queryable().LeftJoin((m, u) => u.MessageId == m.Id) + .Where((m, u) => u.UserId == userId && u.IsDelete == false && u.Status == SysDictConst.MESSAGE_STATUS_ALREADY) + .Select((m, u) => new SysMessage + { + Index2 = SqlFunc.RowNumber($"{m.Id} desc", + m.Category),//order by id partition by name,参考sqlsugar分组查询https://www.donet5.com/Doc/1/2243 + Subject = m.Subject, + CreateTime = m.CreateTime, + SendTime = m.SendTime, + Category = m.Category, + Read = u.Read + }) + .MergeTable()//将结果合并成一个表 + .Where(it => it.Index2 <= 5)//取第五条 + .Mapper(it => + { + it.SendTimeFormat = TimeHelper.FormatTimeAgo(it.SendTime); + }) + .ToListAsync(); + return result; + } + + /// + public async Task SetRead(MessageReadInput input) + { + //如果ID列表为空,就是全部已读 + if (input.Ids.Count == 0 && input.Category != null) + { + var result = await Context.Updateable() + .SetColumns(it => it.Read == true) + .SetColumns(it => it.UpdateTime == DateTime.Now) + .Where(it => it.UserId == UserManager.UserId && it.Read == false) + .Where(it => SqlFunc.Subqueryable().Where(s => s.Id == it.MessageId && s.Category == input.Category).Any()) + .ExecuteCommandAsync(); + return result; + } + else + { + return await Context.Updateable() + .SetColumns(it => it.Read == true) + .SetColumns(it => it.UpdateTime == DateTime.Now) + .Where(it => it.UserId == UserManager.UserId && input.Ids.Contains(it.MessageId)) + .Where(it => it.Read == false) + .ExecuteCommandAsync(); + } + } + + /// + public async Task SetDelete(MessageReadInput input) + { + //如果ID列表为空,就是全部删除 + if (input.Ids.Count == 0 && input.Category != null) + { + var result = await Context.Updateable() + .SetColumns(it => it.IsDelete == true) + .SetColumns(it => it.UpdateTime == DateTime.Now) + .Where(it => it.UserId == UserManager.UserId && it.IsDelete == false) + .Where(it => SqlFunc.Subqueryable().Where(s => s.Id == it.MessageId && s.Category == input.Category).Any()) + .ExecuteCommandAsync(); + return result; + } + else + { + return await Context.Updateable() + .SetColumns(it => it.IsDelete == true) + .SetColumns(it => it.UpdateTime == DateTime.Now) + .Where(it => it.UserId == UserManager.UserId && input.Ids.Contains(it.MessageId)) + .Where(it => it.IsDelete == false) + .ExecuteCommandAsync(); + } + } + + #region 方法 + + /// + /// 检查输入 + /// + /// + private void CheckInput(MessageSendInput input) + { + if (input.Status == SysDictConst.MESSAGE_STATUS_ALREADY) + throw Oops.Oh("已发送的消息不能修改"); + switch (input.SendWay) + { + case SysDictConst.SEND_WAY_NOW: + input.SendTime = DateTime.Now; + break; + case SysDictConst.SEND_WAY_DELAY: + if (input.CreateTime != null) + input.SendTime = input.CreateTime.Value.AddSeconds(input.DelayTime); + else + input.SendTime = DateTime.Now.AddSeconds(input.DelayTime); + break; + case SysDictConst.SEND_WAY_SCHEDULE: + if (input.SendTime < DateTime.Now) + throw Oops.Oh("发送时间不能小于当前时间"); + input.SendTime = input.SendTime; + break; + } + } + + #endregion +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/Dto/OperateLogInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/Dto/OperateLogInput.cs deleted file mode 100644 index c5e0c5f657ef84fdee982bc63f19a8510134983a..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/Dto/OperateLogInput.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace SimpleAdmin.System; - -/// -/// 操作日志分页输入 -/// -public class OperateLogPageInput : VisitLogPageInput -{ -} - -/// -/// 操作日志日志删除输入 -/// -public class OperateLogDeleteInput : VisitLogDeleteInput -{ -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/OperateLogService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/OperateLogService.cs deleted file mode 100644 index 573fe12c17b685e5dcfb33a28714b79b488af5b8..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/OperateLogService.cs +++ /dev/null @@ -1,104 +0,0 @@ -namespace SimpleAdmin.System; - -/// -/// -/// -public class OperateLogService : DbRepository, IOperateLogService -{ - /// - /// 操作日志中文名称 - /// - private readonly string NameOperate = "操作日志"; - - /// - /// 异常日志中文名称 - /// - private readonly string NameExecption = "异常日志"; - - /// - public async Task> Page(OperateLogPageInput input) - { - var query = Context.Queryable() - .WhereIF(!string.IsNullOrEmpty(input.Account), it => it.OpAccount == input.Account)//根据账号查询 - .WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category)//根据分类查询 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey) || it.OpIp.Contains(input.SearchKey))//根据关键字查询 - .IgnoreColumns(it => new { it.ParamJson, it.ResultJson }) - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}")//排序 - .OrderBy(it => it.CreateTime, OrderByType.Desc); - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 - return pageInfo; - } - - /// - public async Task> StatisticsByDay(int day) - { - //取最近七天 - var dayArray = Enumerable.Range(0, day).Select(it => DateTime.Now.Date.AddDays(it * -1)).ToList(); - //生成时间表 - var queryableLeft = Context.Reportable(dayArray).ToQueryable(); - //ReportableDateType.MonthsInLast1yea 表式近一年月份 并且queryable之后还能在where过滤 - var queryableRight = Context.Queryable(); //声名表 - //报表查询 - var list = await Context.Queryable(queryableLeft, queryableRight, JoinType.Left, (x1, x2) - => x2.CreateTime.Value.ToString("yyyy-MM-dd") == x1.ColumnName.ToString("yyyy-MM-dd")) - .GroupBy((x1, x2) => x1.ColumnName)//根据时间分组 - .OrderBy((x1, x2) => x1.ColumnName)//根据时间升序排序 - .Select((x1, x2) => new - { - OperateCount = SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.Log_OPERATE, 1, 0)), //null的数据要为0所以不能用count - ExceptionCount = SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.Log_EXCEPTION, 1, 0)), //null的数据要为0所以不能用count - Date = x1.ColumnName.ToString("yyyy-MM-dd") - } - ).ToListAsync(); - //定义返回结果 - List result = new List(); - //遍历结果 - list.ForEach(it => - { - result.Add(new OperateLogDayStatisticsOutput { Date = it.Date, Name = NameOperate, Count = it.OperateCount });//添加访问日志 - result.Add(new OperateLogDayStatisticsOutput { Date = it.Date, Name = NameExecption, Count = it.ExceptionCount });//添加异常日志 - }); - return result; - } - - /// - public async Task> TotalCount() - { - var data = await Context.Queryable() - .GroupBy(it => it.Category)//根据分类分组 - .Select(it => new - { - Category = it.Category,//分类 - Count = SqlFunc.AggregateCount(it.Category)//数量 - }).ToListAsync(); - //定义结果数组 - List operageLogTotalCounts = new List - { - //添加操作日志数据 - new OperateLogTotalCountOutpu - { - Type = NameOperate, - Value = data.Where(it => it.Category == CateGoryConst.Log_OPERATE).Select(it => it.Count).FirstOrDefault() - }, - //添加异常日志数据 - new OperateLogTotalCountOutpu - { - Type = NameExecption, - Value = data.Where(it => it.Category == CateGoryConst.Log_EXCEPTION).Select(it => it.Count).FirstOrDefault() - } - }; - return operageLogTotalCounts; - } - - /// - public async Task Delete(string category) - { - await DeleteAsync(it => it.Category == category);//删除对应分类日志 - } - - /// - public async Task Detail(BaseIdInput input) - { - return await GetFirstAsync(it => it.Id == input.Id);//删除对应分类日志 - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/VisitLogService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/VisitLogService.cs deleted file mode 100644 index a10eaf7aa95ff22f48e5aa8bb8b0d6e266bdd8c7..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/VisitLogService.cs +++ /dev/null @@ -1,85 +0,0 @@ -namespace SimpleAdmin.System; - -/// -/// -/// -public class VisitLogService : DbRepository, IVisitLogService -{ - public VisitLogService() - { - } - - /// - public async Task> Page(VisitLogPageInput input) - { - var query = Context.Queryable() - .WhereIF(!string.IsNullOrEmpty(input.Account), it => it.OpAccount == input.Account)//根据账号查询 - .WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category)//根据分类查询 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey) || it.OpIp.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}")//排序 - .OrderBy(it => it.CreateTime, OrderByType.Desc); - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 - return pageInfo; - } - - /// - public async Task> StatisticsByDay(int day) - { - //取最近七天 - var dayArray = Enumerable.Range(0, day).Select(it => DateTime.Now.Date.AddDays(it * -1)).ToList(); - //生成时间表 - var queryableLeft = Context.Reportable(dayArray).ToQueryable(); - //ReportableDateType.MonthsInLast1yea 表式近一年月份 并且queryable之后还能在where过滤 - var queryableRight = Context.Queryable(); //声名表 - //报表查询 - var list = await Context.Queryable(queryableLeft, queryableRight, JoinType.Left, (x1, x2) - => x2.CreateTime.Value.ToString("yyyy-MM-dd") == x1.ColumnName.ToString("yyyy-MM-dd")) - .GroupBy((x1, x2) => x1.ColumnName)//根据时间分组 - .OrderBy((x1, x2) => x1.ColumnName)//根据时间升序排序 - .Select((x1, x2) => new VisitLogDayStatisticsOutput - { - LoginCount = SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.Log_LOGIN, 1, 0)), //null的数据要为0所以不能用count - LogoutCount = SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.Log_LOGOUT, 1, 0)), //null的数据要为0所以不能用count - Date = x1.ColumnName.ToString("yyyy-MM-dd") - } - ) - - .ToListAsync(); - return list; - } - - /// - public async Task> TotalCount() - { - var data = await Context.Queryable() - .GroupBy(it => it.Category)//根据分类分组 - .Select(it => new - { - Category = it.Category,//分类 - Count = SqlFunc.AggregateCount(it.Category)//数量 - }).ToListAsync(); - //定义结果数组 - List visitLogTotalCounts = new List - { - //添加登录数据 - new VisitLogTotalCountOutput - { - Type = EventSubscriberConst.LoginB, - Value = data.Where(it => it.Category == CateGoryConst.Log_LOGIN).Select(it => it.Count).FirstOrDefault() - }, - //添加登出数据 - new VisitLogTotalCountOutput - { - Type = EventSubscriberConst.LoginOutB, - Value = data.Where(it => it.Category == CateGoryConst.Log_LOGOUT).Select(it => it.Count).FirstOrDefault() - } - }; - return visitLogTotalCounts; - } - - /// - public async Task Delete(string category) - { - await DeleteAsync(it => it.Category == category);//删除对应分类日志 - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportPreviewInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportPreviewInput.cs index 2e6083053f30299d66fc8b9b0b72e8f20978c3ae..2eca9b782e5d39660df3cfbdf223a535c95ef0bf 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportPreviewInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportPreviewInput.cs @@ -1,4 +1,12 @@ -using SimpleAdmin.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.System; @@ -7,4 +15,4 @@ namespace SimpleAdmin.System; /// public class ImportPreviewInput : BaseFileInput { -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportPreviewOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportPreviewOutput.cs index 1ce73cd675b7317d90a13075f0b6a55a3fe46b43..4c49d160d47444f7b019423c09fe5b6d3c64588a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportPreviewOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportPreviewOutput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 文件导入通用输出 @@ -44,10 +54,10 @@ public class TableColumns /// /// 超过宽度将自动省略 /// - public bool Ellipsis { get; set; } = false; + public bool Ellipsis { get; set; } /// /// 是否是日期格式 /// - public bool Date { get; set; } = false; -} \ No newline at end of file + public bool Date { get; set; } +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportResultInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportResultInput.cs index 5fff3ef8f9d15723244faff18b2e53ab6577f14a..d17bd07f72f2ce87c0a899370ca0fc4a49fad965 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportResultInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportResultInput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 批量导入结果输入 @@ -10,4 +20,4 @@ public class ImportResultInput where T : class /// 数据 /// public List Data { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportResultOutPut.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportResultOutPut.cs index fdb4efe3f0e2e79fe61fd8924909348f34fef4ce..2d679d2f744750981fb948c03639ae9696f8f683 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportResultOutPut.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportResultOutPut.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 导入结果输出 @@ -31,4 +41,4 @@ public class ImportResultOutPut where T : class /// public List Data { get; set; } = new List(); -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportTemplateInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportTemplateInput.cs index a07d212d50a1de174fd86a4798015ce37960b0c4..803f33cc59e83150416fe71d28b87a887ef32d2b 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportTemplateInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportTemplateInput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 导入基础输入 @@ -16,11 +26,11 @@ public class ImportTemplateInput /// 是否有错误 /// [ImporterHeader(IsIgnore = true)] - public bool HasError { get; set; } = false; + public bool HasError { get; set; } /// /// 错误详情 /// [ImporterHeader(IsIgnore = true)] public IDictionary ErrorInfo { get; set; } = new Dictionary(); -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/IImportExportService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/IImportExportService.cs index 294e9e7686e23fd78bd089512c0f85a03b3cdb5e..596e54c10027cab1ad2edd1a0f82a9a8c9ffdc81 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/IImportExportService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/IImportExportService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 导入服务 @@ -51,9 +61,9 @@ public interface IImportExportService : ITransient /// 导入文件验证 /// /// 文件 - /// 文件最大体积(M) + /// 文件最大体积(M) /// 允许的格式 - void ImportVerification(IFormFile file, int maxSzie = 30, string[] allowTypes = null); + void ImportVerification(IFormFile file, int maxSize = 30, string[] allowTypes = null); /// /// 模板数据验证 @@ -62,4 +72,4 @@ public interface IImportExportService : ITransient /// 结果 /// 导入预览数据 ImportPreviewOutput TemplateDataVerification(ImportResult importResult) where T : ImportTemplateInput; -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/ImportExportService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/ImportExportService.cs index c642337df17b00b2ec4d90ad64b5fc9c6ef504c1..f48ef45739a1a49d144e9a10f75b2f0209906459 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/ImportExportService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/ImportExportService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// @@ -8,12 +18,12 @@ public class ImportExportService : IImportExportService #region 导入 /// - public void ImportVerification(IFormFile file, int maxSzie = 30, string[] allowTypes = null) + public void ImportVerification(IFormFile file, int maxSize = 30, string[] allowTypes = null) { if (file == null) throw Oops.Bah("文件不能为空"); - if (file.Length > maxSzie * 1024 * 1024) throw Oops.Bah($"文件大小不允许超过{maxSzie}M"); - var fileSuffix = Path.GetExtension(file.FileName).ToLower().Split(".")[1]; // 文件后缀 - string[] allowTypeS = allowTypes == null ? new string[] { "xlsx" } : allowTypes;//允许上传的文件类型 + if (file.Length > maxSize * 1024 * 1024) throw Oops.Bah($"文件大小不允许超过{maxSize}M"); + var fileSuffix = Path.GetExtension(file.FileName).ToLower().Split(".")[1];// 文件后缀 + var allowTypeS = allowTypes == null ? new[] { "xlsx" } : allowTypes;//允许上传的文件类型 if (!allowTypeS.Contains(fileSuffix)) throw Oops.Bah(errorMessage: "文件格式错误"); } @@ -25,19 +35,20 @@ public class ImportExportService : IImportExportService importResult.TemplateErrors.ForEach(error => { if (error.Message.Contains("not found")) throw Oops.Bah($"列[{error.RequireColumnName}]未找到"); - else throw Oops.Bah($"列[{error.RequireColumnName}]:{error.Message}"); + throw Oops.Bah($"列[{error.RequireColumnName}]:{error.Message}"); }); if (importResult.Data == null) throw Oops.Bah("文件数据格式有误,请重新导入!"); //导入结果输出 - var importPreview = new ImportPreviewOutput() { HasError = importResult.HasError }; - Dictionary headerMap = new Dictionary(); + var importPreview = new ImportPreviewOutput { HasError = importResult.HasError }; + var headerMap = new Dictionary(); //遍历导入的表头列表信息 importResult.ImporterHeaderInfos.ForEach(it => { headerMap.Add(it.Header.Name, it.PropertyName); - var tableColumns = new TableColumns { Title = it.Header.Name.Split("(")[0], DataIndex = it.PropertyName.FirstCharToLower() };//定义表头,部分表头有说明用(分组去掉说明 + var tableColumns = new TableColumns + { Title = it.Header.Name.Split("(")[0], DataIndex = it.PropertyName.FirstCharToLower() };//定义表头,部分表头有说明用(分组去掉说明 var antTableAttribute = it.PropertyInfo.GetCustomAttribute();//获取表格特性 if (antTableAttribute != null) { @@ -51,11 +62,11 @@ public class ImportExportService : IImportExportService //导入的数据转集合 var data = importResult.Data.ToList(); var systemError = new string[] { };//系统错误提示 - //遍历错误列,将错误字典中的中文改成英文跟实体对应 + //遍历错误列,将错误字典中的中文改成英文跟实体对应 importResult.RowErrors.ForEach(row => { IDictionary fieldErrors = new Dictionary();//定义字典 - //遍历错误列,赋值给新的字典 + //遍历错误列,赋值给新的字典 row.FieldErrors.ForEach(it => { var errrVaule = it.Value; @@ -78,8 +89,8 @@ public class ImportExportService : IImportExportService /// public async Task GenerateTemplate(string fileName) where T : class, new() { - IImporter Importer = new ExcelImporter(); - var byteArray = await Importer.GenerateTemplateBytes(); + IImporter importer = new ExcelImporter(); + var byteArray = await importer.GenerateTemplateBytes(); var result = GetFileStreamResult(byteArray, fileName); return result; } @@ -95,11 +106,11 @@ public class ImportExportService : IImportExportService public async Task> GetImportPreview(IFormFile file) where T : ImportTemplateInput, new() { ImportVerification(file);//验证文件 - IImporter Importer = new ExcelImporter(); + IImporter importer = new ExcelImporter(); using var fileStream = file.OpenReadStream();//获取文件流 - var import = await Importer.Import(fileStream);//导入的文件转化为带入结果 - var ImportPreview = TemplateDataVerification(import);//验证数据完整度 - return ImportPreview; + var import = await importer.Import(fileStream);//导入的文件转化为带入结果 + var importPreview = TemplateDataVerification(import);//验证数据完整度 + return importPreview; } /// @@ -113,7 +124,7 @@ public class ImportExportService : IImportExportService if (importData.Count != data.Count) { result.Success = false; - result.Data = data.Where(it => it.HasError == true).ToList(); + result.Data = data.Where(it => it.HasError).ToList(); result.FailCount = data.Count - importData.Count; } result.ImportCount = importData.Count; @@ -190,4 +201,4 @@ public class ImportExportService : IImportExportService } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/Dto/IndexInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/Dto/IndexInput.cs index 0c710c0a6c1e4ffcb0dc589075a8dffafc849671..20551f78b72a9238b2d66cf91441e9ee87d35657 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/Dto/IndexInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/Dto/IndexInput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 日程列表查询参数 @@ -31,4 +41,4 @@ public class ScheduleAddInput : RelationUserSchedule /// [Required(ErrorMessage = "ScheduleTime 不能为空")] public override string ScheduleTime { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/Dto/IndexOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/Dto/IndexOutput.cs index 1a094d925a3e1cc8555beec24c43cbbfc0f7a288..3a162a34ef39369044407331a22413d4ef82bcab 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/Dto/IndexOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/Dto/IndexOutput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; public class ScheduleListOutput : RelationUserSchedule { @@ -6,4 +16,4 @@ public class ScheduleListOutput : RelationUserSchedule /// ID /// public long Id { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IIndexService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IIndexService.cs index 8e6625c50d56ab552e86e4ec2f20533769a3c2aa..bf861aa98ad68d90c447c1759eeea104ed6fce2f 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IIndexService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IIndexService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 首页服务 @@ -17,7 +27,7 @@ public interface IIndexService : ITransient /// /// id列表 /// - Task DeleteSchedule(List input); + Task DeleteSchedule(BaseIdListInput input); /// /// 获取日程列表 @@ -25,4 +35,4 @@ public interface IIndexService : ITransient /// 查询参数 /// 日程列表 Task> ScheduleList(ScheduleListInput input); -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IndexService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IndexService.cs index fcb5090fc5d9298d946b085e1752afe7213497bc..1fd684c40ffb4ece06da86ae4bf528c3ea259257 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IndexService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IndexService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// @@ -9,19 +19,21 @@ public class IndexService : DbRepository, IIndexService public IndexService(IRelationService relationService) { - this._relationService = relationService; + _relationService = relationService; } /// public async Task> ScheduleList(ScheduleListInput input) { - var relations = await GetListAsync(it => it.Category == CateGoryConst.Relation_SYS_USER_SCHEDULE_DATA - && it.ObjectId == UserManager.UserId && it.TargetId == input.ScheduleDate, it => new SysRelation { ExtJson = it.ExtJson, Id = it.Id });//获取当前用户的日程列表 - List userSchedules = new List();//结果集 + var relations = await GetListAsync( + it => it.Category == CateGoryConst.RELATION_SYS_USER_SCHEDULE_DATA && it.ObjectId == UserManager.UserId + && it.TargetId == input.ScheduleDate, + it => new SysRelation { ExtJson = it.ExtJson, Id = it.Id });//获取当前用户的日程列表 + var userSchedules = new List();//结果集 relations.ForEach(it => { - var extjson = it.ExtJson.ToJsonEntity();//转成实体 - var userSchedule = extjson.Adapt();//格式化 + var extJson = it.ExtJson.ToJsonEntity();//转成实体 + var userSchedule = extJson.Adapt();//格式化 userSchedule.Id = it.Id;//赋值ID userSchedules.Add(userSchedule);//添加到结果集 }); @@ -34,14 +46,15 @@ public class IndexService : DbRepository, IIndexService input.ScheduleUserId = UserManager.UserId; input.ScheduleUserName = UserManager.Name; //添加日程 - await _relationService.SaveRelation(CateGoryConst.Relation_SYS_USER_SCHEDULE_DATA, UserManager.UserId, input.ScheduleDate, input.ToJson(), false, false); + await _relationService.SaveRelation(CateGoryConst.RELATION_SYS_USER_SCHEDULE_DATA, UserManager.UserId, input.ScheduleDate, input.ToJson(), + false, false); } /// - public async Task DeleteSchedule(List input) + public async Task DeleteSchedule(BaseIdListInput input) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; await DeleteAsync(it => ids.Contains(it.Id) && it.ObjectId == UserManager.UserId); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/ButtonService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/ButtonService.cs similarity index 64% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/ButtonService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/ButtonService.cs index ab4e7298a092d81d0db68e95b9d23ddaa31771ea..d98179df65789ff952491938661fa23f6ab180ea 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/ButtonService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/ButtonService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// @@ -8,26 +18,21 @@ public class ButtonService : DbRepository, IButtonService private readonly ILogger _logger; private readonly IResourceService _resourceService; private readonly IRelationService _relationService; - private readonly IEventPublisher _eventPublisher; - public ButtonService(ILogger logger, IResourceService resourceService, IRelationService relationService, - IEventPublisher eventPublisher) + public ButtonService(ILogger logger, IResourceService resourceService, IRelationService relationService) { _logger = logger; _resourceService = resourceService; _relationService = relationService; - _eventPublisher = eventPublisher; } /// public async Task> Page(ButtonPageInput input) { - var query = Context.Queryable() - .Where(it => it.ParentId == input.ParentId && it.Category == CateGoryConst.Resource_BUTTON) + var query = Context.Queryable().Where(it => it.ParentId == input.ParentId && it.Category == CateGoryConst.RESOURCE_BUTTON) .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Title.Contains(input.SearchKey) || it.Path.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}") - .OrderBy(it => it.SortCode);//排序 - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}").OrderBy(it => it.SortCode);//排序 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } @@ -37,15 +42,15 @@ public class ButtonService : DbRepository, IButtonService await CheckInput(input);//检查参数 var sysResource = input.Adapt();//实体转换 if (await InsertAsync(sysResource))//插入数据 - await _resourceService.RefreshCache(CateGoryConst.Resource_BUTTON);//刷新缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_BUTTON);//刷新缓存 } /// public async Task> AddBatch(ButtonAddInput input) { var sysResources = new List();//按钮列表 - var codeList = new List() { "Add", "Edit", "Delete", "BatchDelete", "Import", "Export", "BatchEdit" };//code后缀 - var titleList = new List() { "新增", "编辑", "删除", "批量删除", "导入", "导出", "批量编辑" };//title前缀 + var codeList = new List { "Add", "Edit", "Delete", "BatchDelete", "Import", "Export", "BatchEdit" };//code后缀 + var titleList = new List { "新增", "编辑", "删除", "批量删除", "导入", "导出", "批量编辑" };//title前缀 var idList = new List();//Id列表 for (var i = 0; i < codeList.Count; i++) { @@ -68,13 +73,10 @@ public class ButtonService : DbRepository, IButtonService //添加到数据库 if (await InsertRangeAsync(sysResources))//插入数据 { - await _resourceService.RefreshCache(CateGoryConst.Resource_BUTTON);//刷新缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_BUTTON);//刷新缓存 return sysResources.Select(it => it.Id).ToList(); } - else - { - return new List(); - } + return new List(); } /// @@ -83,13 +85,13 @@ public class ButtonService : DbRepository, IButtonService await CheckInput(input);//检查参数 var sysResource = input.Adapt();//实体转换 //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { await UpdateAsync(sysResource);//更新按钮 }); if (result.IsSuccess)//如果成功了 { - await _resourceService.RefreshCache(CateGoryConst.Resource_BUTTON);//资源表按钮刷新缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_BUTTON);//资源表按钮刷新缓存 } else { @@ -100,29 +102,28 @@ public class ButtonService : DbRepository, IButtonService } /// - public async Task Delete(List input) + public async Task Delete(BaseIdListInput input) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; //获取所有按钮集合 - var buttonList = await _resourceService.GetListByCategory(CateGoryConst.Resource_BUTTON); + var buttonList = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_BUTTON); #region 处理关系表角色资源信息 //获取所有菜单集合 - var menuList = await _resourceService.GetListByCategory(CateGoryConst.Resource_MENU); + var menuList = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_MENU); //获取按钮的父菜单id集合 var parentIds = buttonList.Where(it => ids.Contains(it.Id)).Select(it => it.ParentId.Value.ToString()).ToList(); //获取关系表分类为SYS_ROLE_HAS_RESOURCE数据 - var roleResources = await _relationService.GetRelationByCategory(CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE); + var roleResources = await _relationService.GetRelationByCategory(CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE); //获取相关关系表数据 - var relationList = roleResources - .Where(it => parentIds.Contains(it.TargetId))//目标ID是父ID中 + var relationList = roleResources.Where(it => parentIds.Contains(it.TargetId))//目标ID是父ID中 .Where(it => it.ExtJson != null).ToList();//扩展信息不为空 //遍历关系表 relationList.ForEach(it => { - var relationRoleResuorce = it.ExtJson.ToJsonEntity();//拓展信息转实体 + var relationRoleResuorce = it.ExtJson.ToJsonEntity();//拓展信息转实体 var buttonInfo = relationRoleResuorce.ButtonInfo;//获取按钮信息 if (buttonInfo.Count > 0) { @@ -136,7 +137,7 @@ public class ButtonService : DbRepository, IButtonService #endregion 处理关系表角色资源信息 //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { await DeleteByIdsAsync(ids.Cast().ToArray());//删除按钮 if (relationList.Count > 0) @@ -146,8 +147,8 @@ public class ButtonService : DbRepository, IButtonService }); if (result.IsSuccess)//如果成功了 { - await _resourceService.RefreshCache(CateGoryConst.Resource_BUTTON);//资源表按钮刷新缓存 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE);//关系表刷新角色资源缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_BUTTON);//资源表按钮刷新缓存 + await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE);//关系表刷新角色资源缓存 } else { @@ -157,6 +158,15 @@ public class ButtonService : DbRepository, IButtonService } } + /// + public async Task Detail(BaseIdInput input) + { + var sysResources = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_BUTTON); + var resource = sysResources.Where(it => it.Id == input.Id).FirstOrDefault(); + return resource; + } + + #region 方法 /// @@ -166,15 +176,15 @@ public class ButtonService : DbRepository, IButtonService private async Task CheckInput(SysResource sysResource) { //获取所有按钮和菜单 - var buttonList = await _resourceService.GetListAsync(new List { CateGoryConst.Resource_BUTTON, CateGoryConst.Resource_MENU }); + var buttonList = await _resourceService.GetListAsync(new List { CateGoryConst.RESOURCE_BUTTON, CateGoryConst.RESOURCE_MENU }); //判断code是否重复 if (buttonList.Any(it => it.Code == sysResource.Code && it.Id != sysResource.Id)) throw Oops.Bah($"存在重复的按钮编码:{sysResource.Code}"); //判断菜单是否存在 if (!buttonList.Any(it => it.Id == sysResource.ParentId)) throw Oops.Bah($"不存在的父级菜单:{sysResource.ParentId}"); - sysResource.Category = CateGoryConst.Resource_BUTTON;//设置分类为按钮 + sysResource.Category = CateGoryConst.RESOURCE_BUTTON;//设置分类为按钮 } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/Dto/ButtonInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/Dto/ButtonInput.cs similarity index 53% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/Dto/ButtonInput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/Dto/ButtonInput.cs index 26537f4d21bb9ea0720bcb70aa9effeb99cf0086..1d5b734103225a093808ce8ae52f9b1d7f92ec78 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/Dto/ButtonInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/Dto/ButtonInput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; public class ButtonPageInput : BasePageInput { @@ -40,4 +50,4 @@ public class ButtonEditInput : ButtonAddInput /// [IdNotNull(ErrorMessage = "Id不能为空")] public override long Id { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/IButtonService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/IButtonService.cs similarity index 48% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/IButtonService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/IButtonService.cs index 6c00b02145fcf47ae60f1079518cec4e2485556e..a1b03fea00ad986c230875fe0254b80a9db87044 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/IButtonService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/IButtonService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 权限按钮服务 @@ -24,7 +34,7 @@ public interface IButtonService : ITransient /// /// 删除参数 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); /// /// 编辑按钮 @@ -39,4 +49,11 @@ public interface IButtonService : ITransient /// 查询条件 /// 按钮分页列表 Task> Page(ButtonPageInput input); -} \ No newline at end of file + + /// + /// 按钮详情 + /// + /// + /// + Task Detail(BaseIdInput input); +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/Dto/MenuInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/Dto/MenuInput.cs similarity index 63% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/Dto/MenuInput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/Dto/MenuInput.cs index a44947e75f15f63a4d3c703b20df6e8c694097b5..29b774c52babccd791ef4d7b8642191339ecafed 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/Dto/MenuInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/Dto/MenuInput.cs @@ -1,9 +1,18 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 菜单树查询参数 /// - public class MenuTreeInput { /// @@ -20,7 +29,6 @@ public class MenuTreeInput /// /// 添加菜单参数 /// - public class MenuAddInput : SysResource, IValidatableObject { /// @@ -38,7 +46,7 @@ public class MenuAddInput : SysResource, IValidatableObject /// /// 菜单类型 /// - public override string MenuType { get; set; } = ResourceConst.MENU; + public override string MenuType { get; set; } = SysResourceConst.MENU; /// /// 模块 @@ -67,19 +75,22 @@ public class MenuAddInput : SysResource, IValidatableObject public IEnumerable Validate(ValidationContext validationContext) { //如果菜单类型是菜单 - if (MenuType == ResourceConst.MENU) + if (MenuType is SysResourceConst.MENU or SysResourceConst.SUBSET or SysResourceConst.LINK) { if (string.IsNullOrEmpty(Name)) yield return new ValidationResult("Name不能为空", new[] { nameof(Name) }); if (string.IsNullOrEmpty(Component)) yield return new ValidationResult("Component不能为空", new[] { nameof(Name) }); - } - //如果是内链或者外链 - else if (MenuType == ResourceConst.IFRAME || MenuType == ResourceConst.LINK) - { - Component = null;//设置组件为空 - if (string.IsNullOrEmpty(Name)) - Name = RandomHelper.CreateRandomString(10);//name为随机字符串 + if (MenuType is SysResourceConst.SUBSET)//如果是子集 + { + if (string.IsNullOrEmpty(ActiveMenu)) + yield return new ValidationResult("ActiveMenu不能为空", new[] { nameof(Name) }); + IsHome = false; + IsHide = true; + IsFull = false; + IsAffix = false; + IsKeepAlive = true; + } } else { @@ -87,7 +98,7 @@ public class MenuAddInput : SysResource, IValidatableObject Component = null;//设置组件为空 } //设置分类为菜单 - Category = CateGoryConst.Resource_MENU; + Category = CateGoryConst.RESOURCE_MENU; } } @@ -113,4 +124,4 @@ public class MenuChangeModuleInput : BaseIdInput /// [Required(ErrorMessage = "Module不能为空")] public long? Module { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/IMenuService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/IMenuService.cs similarity index 52% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/IMenuService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/IMenuService.cs index d0a20a35a0e9917f64cadff26937e9d3ed02aedf..b81e0676434b3e6cb1db9960b6511e083da1d23e 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/IMenuService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/IMenuService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 菜单服务 @@ -25,14 +35,15 @@ public interface IMenuService : ITransient /// 菜单列表 /// 父ID /// 菜单形结构 - List ConstructMenuTrees(List resourceList, long parentId = 0); + List ConstructMenuTrees(List resourceList, long? parentId = 0); /// /// 获取菜单树 /// /// 菜单树查询参数 + /// 是否显示禁用的 /// 菜单树列表 - Task> Tree(MenuTreeInput input); + Task> Tree(MenuTreeInput input, bool showDisabled = true); /// /// 编辑菜单 @@ -46,7 +57,7 @@ public interface IMenuService : ITransient /// /// 删除菜单参数 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); /// /// 改变菜单模块 @@ -54,4 +65,11 @@ public interface IMenuService : ITransient /// 改变菜单模块参数 /// Task ChangeModule(MenuChangeModuleInput input); -} \ No newline at end of file + + /// + /// 快捷方式菜单树 + /// + /// 资源列表 + /// + Task> ShortcutTree(List sysResources = null); +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/MenuService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/MenuService.cs similarity index 50% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/MenuService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/MenuService.cs index bbb6ad7391ad865631f4a642b4f005d6762e8fd0..105cc6973bd7172d0ea78e204389b1297bcb6ec9 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/MenuService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/MenuService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// @@ -11,13 +21,13 @@ public class MenuService : DbRepository, IMenuService public MenuService(ILogger logger, IResourceService resourceService, IRelationService relationService) { - this._logger = logger; - this._resourceService = resourceService; - this._relationService = relationService; + _logger = logger; + _resourceService = resourceService; + _relationService = relationService; } /// - public List ConstructMenuTrees(List resourceList, long parentId = 0) + public List ConstructMenuTrees(List resourceList, long? parentId = 0) { //找下级资源ID列表 var resources = resourceList.Where(it => it.ParentId == parentId).OrderBy(it => it.SortCode).ToList(); @@ -35,11 +45,12 @@ public class MenuService : DbRepository, IMenuService } /// - public async Task> Tree(MenuTreeInput input) + public async Task> Tree(MenuTreeInput input, bool showDisabled = true) { //获取所有菜单 - var sysResources = await _resourceService.GetListByCategory(CateGoryConst.Resource_MENU); + var sysResources = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_MENU); sysResources = sysResources.WhereIF(input.Module != null, it => it.Module.Value == input.Module.Value)//根据模块查找 + .WhereIF(!showDisabled, it => it.Status == CommonStatusConst.ENABLE)//是否显示禁用的 .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Title == input.SearchKey)//根据关键字查找 .ToList(); //构建菜单树 @@ -47,6 +58,29 @@ public class MenuService : DbRepository, IMenuService return tree; } + /// + public async Task> ShortcutTree(List sysResources = null) + { + if (sysResources == null) + //获取所有菜单 + sysResources = (await _resourceService.GetAllModuleAndMenuAndSpaList()) + .Where(it => it.Status == CommonStatusConst.ENABLE).ToList(); + // //获取所有单页 + // var sysSpas = (await _resourceService.GetConfigsByCategory(CateGoryConst.RESOURCE_SPA)) + // .Where(it => it.Status == CommonStatusConst.ENABLE).ToList(); + sysResources.ForEach(it => + { + if (it.MenuType == SysResourceConst.CATALOG) + it.ParentId = it.Module.Value;//目录的父级ID设置为模块ID + }); + + //构建菜单树 + var tree = ConstructMenuTrees(sysResources, null); + //将单页的排前面根据排序码排序 + tree = tree.OrderByDescending(it => it.Category == CateGoryConst.RESOURCE_SPA).ThenBy(it => it.SortCode).ToList(); + return tree; + } + /// public async Task Add(MenuAddInput input) { @@ -54,31 +88,66 @@ public class MenuService : DbRepository, IMenuService var sysResource = input.Adapt();//实体转换 if (await InsertAsync(sysResource))//插入数据 - await _resourceService.RefreshCache(CateGoryConst.Resource_MENU);//刷新菜单缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_MENU);//刷新菜单缓存 } /// public async Task Edit(MenuEditInput input) { - await CheckInput(input);//检查参数 + var resource = await CheckInput(input);//检查参数 var sysResource = input.Adapt();//实体转换 - if (await UpdateAsync(sysResource))//更新数据 - await _resourceService.RefreshCache(CateGoryConst.Resource_MENU);//刷新菜单缓存 + var updatePath = resource.Path != input.Path;//是否更新路径 + var permissions = new List(); + if (updatePath) + { + //获取所有角色和用户的权限关系 + var rolePermissions = await _relationService.GetRelationByCategory(CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION); + var userPermissions = await _relationService.GetRelationByCategory(CateGoryConst.RELATION_SYS_USER_HAS_PERMISSION); + //找到所有匹配的权限 + rolePermissions = rolePermissions.Where(it => it.TargetId.Contains(resource.Path)).ToList(); + userPermissions = userPermissions.Where(it => it.TargetId.Contains(resource.Path)).ToList(); + //更新路径 + rolePermissions.ForEach(it => it.TargetId = it.TargetId.Replace(resource.Path, input.Path)); + userPermissions.ForEach(it => it.TargetId = it.TargetId.Replace(resource.Path, input.Path)); + //添加到权限列表 + permissions.AddRange(rolePermissions); + permissions.AddRange(userPermissions); + } + //事务 + var result = await Tenant.UseTranAsync(async () => + { + await UpdateAsync(sysResource);//更新数据 + if (permissions.Count > 0)//如果权限列表大于0就更新 + { + await Context.Updateable(permissions) + .ExecuteCommandAsync();//更新关系表 + } + }); + if (result.IsSuccess)//如果成功了 + { + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_MENU);//刷新菜单缓存 + //刷新关系表缓存 + if (updatePath) + { + await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION); + await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_USER_HAS_PERMISSION); + } + } } /// - public async Task Delete(List input) + public async Task Delete(BaseIdListInput input) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; if (ids.Count > 0) { //获取所有菜单和按钮 - var resourceList = await _resourceService.GetListAsync(new List { CateGoryConst.Resource_MENU, CateGoryConst.Resource_BUTTON }); + var resourceList = await _resourceService.GetListAsync(new List { CateGoryConst.RESOURCE_MENU, CateGoryConst.RESOURCE_BUTTON }); //找到要删除的菜单 var sysResources = resourceList.Where(it => ids.Contains(it.Id)).ToList(); //查找内置菜单 - var system = sysResources.Where(it => it.Code == ResourceConst.System).FirstOrDefault(); + var system = sysResources.Where(it => it.Code == SysResourceConst.SYSTEM).FirstOrDefault(); if (system != null) throw Oops.Bah($"不可删除系统菜单:{system.Title}"); //需要删除的资源ID列表 @@ -94,17 +163,18 @@ public class MenuService : DbRepository, IMenuService }); ids.AddRange(resourceIds);//添加到删除ID列表 //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { await DeleteByIdsAsync(ids.Cast().ToArray());//删除菜单和按钮 await Context.Deleteable()//关系表删除对应SYS_ROLE_HAS_RESOURCE - .Where(it => it.Category == CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE && resourceIds.Contains(SqlFunc.ToInt64(it.TargetId))).ExecuteCommandAsync(); + .Where(it => it.Category == CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE && resourceIds.Contains(SqlFunc.ToInt64(it.TargetId))) + .ExecuteCommandAsync(); }); if (result.IsSuccess)//如果成功了 { - await _resourceService.RefreshCache(CateGoryConst.Resource_MENU);//资源表菜单刷新缓存 - await _resourceService.RefreshCache(CateGoryConst.Resource_BUTTON);//资源表按钮刷新缓存 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE);//关系表刷新缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_MENU);//资源表菜单刷新缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_BUTTON);//资源表按钮刷新缓存 + await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE);//关系表刷新缓存 } else { @@ -118,7 +188,7 @@ public class MenuService : DbRepository, IMenuService /// public async Task Detail(BaseIdInput input) { - var sysResources = await _resourceService.GetListByCategory(CateGoryConst.Resource_MENU); + var sysResources = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_MENU); var resource = sysResources.Where(it => it.Id == input.Id).FirstOrDefault(); return resource; } @@ -132,20 +202,20 @@ public class MenuService : DbRepository, IMenuService if (sysResource.Module == input.Module)//如果模块ID没变直接返回 return; if (sysResource.ParentId != 0) - throw Oops.Bah($"非顶级菜单不可修改所属模块"); + throw Oops.Bah("非顶级菜单不可修改所属模块"); //获取所有菜单和模块 - var resourceList = await _resourceService.GetListAsync(new List { CateGoryConst.Resource_MENU, CateGoryConst.Resource_MODULE }); - if (!resourceList.Any(it => it.Category == CateGoryConst.Resource_MODULE && it.Id == input.Module.Value)) - throw Oops.Bah($"不存在的模块"); + var resourceList = await _resourceService.GetListAsync(new List { CateGoryConst.RESOURCE_MENU, CateGoryConst.RESOURCE_MODULE }); + if (!resourceList.Any(it => it.Category == CateGoryConst.RESOURCE_MODULE && it.Id == input.Module.Value)) + throw Oops.Bah("不存在的模块"); //获取所有菜单 - var menuList = resourceList.Where(it => it.Category == CateGoryConst.Resource_MENU).ToList(); + var menuList = resourceList.Where(it => it.Category == CateGoryConst.RESOURCE_MENU).ToList(); //获取需要改变模块菜单的所有子菜单 var childList = _resourceService.GetChildListById(menuList, input.Id); childList.ForEach(it => it.Module = input.Module); //更新数据 await UpdateRangeAsync(childList); //刷新菜单缓存 - await _resourceService.RefreshCache(CateGoryConst.Resource_MENU); + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_MENU); } } @@ -155,10 +225,10 @@ public class MenuService : DbRepository, IMenuService /// 检查输入参数 /// /// - private async Task CheckInput(SysResource sysResource) + private async Task CheckInput(SysResource sysResource) { //获取所有菜单列表 - var menList = await _resourceService.GetListByCategory(CateGoryConst.Resource_MENU); + var menList = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_MENU); //判断是否有同级且同名的菜单 if (menList.Any(it => it.ParentId == sysResource.ParentId && it.Title == sysResource.Title && it.Id != sysResource.Id)) throw Oops.Bah($"存在重复的菜单名称:{sysResource.Title}"); @@ -169,16 +239,25 @@ public class MenuService : DbRepository, IMenuService if (parent != null) { if (parent.Module != sysResource.Module)//如果父级的模块和当前模块不一样 - throw Oops.Bah($"模块与上级菜单不一致"); + throw Oops.Bah("模块与上级菜单不一致"); if (parent.Id == sysResource.Id) - throw Oops.Bah($"上级菜单不能选择自己"); + throw Oops.Bah("上级菜单不能选择自己"); } else { throw Oops.Bah($"上级菜单不存在:{sysResource.ParentId}"); } } + //如果ID大于0表示编辑 + if (sysResource.Id > 0) + { + var resource = menList.Where(it => it.Id == sysResource.Id).FirstOrDefault(); + if (resource == null) + throw Oops.Bah($"菜单不存在:{sysResource.Id}"); + return resource; + } + return null; } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/Dto/ModuleInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/Dto/ModuleInput.cs similarity index 34% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/Dto/ModuleInput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/Dto/ModuleInput.cs index f5c49d773b18f9eab9882c8eb8bd168d41179efa..6154fe7b2fb7f0652675faa263c06072a6d96349 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/Dto/ModuleInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/Dto/ModuleInput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 模块分页输入 @@ -24,4 +34,4 @@ public class ModuleEditInput : ModuleAddInput /// [IdNotNull(ErrorMessage = "Id不能为空")] public override long Id { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/IModuleService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/IModuleService.cs similarity index 40% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/IModuleService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/IModuleService.cs index 6e0aad1500bd1c0d4929ce39d06888518e100f33..2407f0a35778e804221670f9dd2ed95f2fa4af37 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/IModuleService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/IModuleService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 模块管理服务 @@ -17,7 +27,7 @@ public interface IModuleService : ITransient /// /// 删除参数 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); /// /// 编辑模块 @@ -32,4 +42,17 @@ public interface IModuleService : ITransient /// 分页参数 /// Task> Page(ModulePageInput input); -} \ No newline at end of file + + /// + /// 模块详情 + /// + /// + /// + Task Detail(BaseIdInput input); + + /// + /// 模块列表 + /// + /// + Task> List(); +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/ModuleService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/ModuleService.cs similarity index 46% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/ModuleService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/ModuleService.cs index f64dafab5eb94fdedcb0fe4ae13d1b9cebc36ff4..d3ac21a61495fc8f45f95e3c3a5516a19dacf280 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/ModuleService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/ModuleService.cs @@ -1,4 +1,12 @@ -using DnsClient.Internal; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.System; @@ -8,29 +16,28 @@ namespace SimpleAdmin.System; public class ModuleService : DbRepository, IModuleService { private readonly ILogger _logger; - private readonly ISimpleCacheService _simpleCacheService; private readonly IResourceService _resourceService; private readonly IRelationService _relationService; + private readonly IEventPublisher _eventPublisher; + private readonly ISysUserService _sysUserService; - public ModuleService(ILogger logger, ISimpleCacheService simpleCacheService, - IResourceService resourceService, - IRelationService relationService) + public ModuleService(ILogger logger, IResourceService resourceService, IRelationService relationService, + IEventPublisher eventPublisher, ISysUserService sysUserService) { - this._logger = logger; - this._simpleCacheService = simpleCacheService; - this._resourceService = resourceService; - this._relationService = relationService; + _logger = logger; + _resourceService = resourceService; + _relationService = relationService; + _eventPublisher = eventPublisher; + _sysUserService = sysUserService; } /// public async Task> Page(ModulePageInput input) { - var query = Context.Queryable() - .Where(it => it.Category == CateGoryConst.Resource_MODULE)//模块 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Title.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}") - .OrderBy(it => it.SortCode);//排序 - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + var query = Context.Queryable().Where(it => it.Category == CateGoryConst.RESOURCE_MODULE)//模块 + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Title.Contains(input.SearchKey))//根据关键字查询 + .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}").OrderBy(it => it.SortCode);//排序 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } @@ -40,7 +47,10 @@ public class ModuleService : DbRepository, IModuleService await CheckInput(input);//检查参数 var sysResource = input.Adapt();//实体转换 if (await InsertAsync(sysResource))//插入数据 - await _resourceService.RefreshCache(CateGoryConst.Resource_MODULE);//刷新缓存 + { + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_MODULE);//刷新缓存 + _sysUserService.DeleteUserFromRedis(UserManager.UserId); + } } /// @@ -49,26 +59,41 @@ public class ModuleService : DbRepository, IModuleService await CheckInput(input);//检查参数 var sysResource = input.Adapt();//实体转换 if (await UpdateAsync(sysResource))//更新数据 - await _resourceService.RefreshCache(CateGoryConst.Resource_MODULE);//刷新缓存 + { + if (sysResource.Status == CommonStatusConst.DISABLED)//如果禁用 + await _eventPublisher.PublishAsync(EventSubscriberConst.CLEAR_MODULE_TOKEN, sysResource.Id);//清除角色下用户缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_MODULE);//刷新缓存 + } + } + + /// + public async Task Detail(BaseIdInput input) + { + var sysResources = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_MODULE); + var resource = sysResources.Where(it => it.Id == input.Id).FirstOrDefault(); + return resource; } /// - public async Task Delete(List input) + public async Task Delete(BaseIdListInput input) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; if (ids.Count > 0) { //获取所有 var resourceList = await _resourceService.GetListAsync(); //找到要删除的模块 - var sysresources = resourceList.Where(it => ids.Contains(it.Id)).ToList(); + var sysResources = resourceList.Where(it => ids.Contains(it.Id)).ToList(); //查找内置模块 - var system = sysresources.Where(it => it.Code == ResourceConst.System).FirstOrDefault(); + var system = sysResources.Where(it => it.Code == SysResourceConst.SYSTEM).FirstOrDefault(); if (system != null) throw Oops.Bah($"不可删除系统内置模块:{system.Title}"); + if (sysResources.Any(it => it.Status == CommonStatusConst.ENABLE))//如果有启用的模块 + throw Oops.Bah($"请先禁用模块再删除"); //获取模块下的所有菜单Id列表 - var menuIds = resourceList.Where(it => ids.Contains(it.Module.ToLong()) && it.ParentId.ToLong() == SimpleAdminConst.Zero).Select(it => it.Id).ToList(); + var menuIds = resourceList.Where(it => ids.Contains(it.Module.ToLong()) && it.ParentId.ToLong() == SimpleAdminConst.ZERO) + .Select(it => it.Id).ToList(); //需要删除的资源ID列表 var resourceIds = new List(); //遍历列表 @@ -82,16 +107,18 @@ public class ModuleService : DbRepository, IModuleService }); ids.AddRange(resourceIds); //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { await DeleteByIdsAsync(ids.Cast().ToArray());//删除菜单和按钮 await Context.Deleteable()//关系表删除对应SYS_ROLE_HAS_RESOURCE - .Where(it => it.Category == CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE && resourceIds.Contains(SqlFunc.ToInt64(it.TargetId))).ExecuteCommandAsync(); + .Where(it => it.Category == CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE && resourceIds.Contains(SqlFunc.ToInt64(it.TargetId))) + .ExecuteCommandAsync(); }); if (result.IsSuccess)//如果成功了 { await _resourceService.RefreshCache();//资源表刷新缓存 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE);//关系表刷新缓存 + await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE);//关系表刷新缓存 + _sysUserService.DeleteUserFromRedis(UserManager.UserId); } else { @@ -102,6 +129,13 @@ public class ModuleService : DbRepository, IModuleService } } + /// + public async Task> List() + { + var sysResources = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_MODULE); + return sysResources; + } + #region 方法 /// @@ -110,16 +144,18 @@ public class ModuleService : DbRepository, IModuleService /// private async Task CheckInput(SysResource sysResource) { - var sysResourceList = await _resourceService.GetListByCategory(CateGoryConst.Resource_MODULE); + var sysResourceList = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_MODULE); //判断是否从存在重复模块 var hasSameName = sysResourceList.Any(it => it.Title == sysResource.Title && it.Id != sysResource.Id); if (hasSameName) { throw Oops.Bah($"存在重复的模块:{sysResource.Title}"); } + if (sysResource.Status == CommonStatusConst.DISABLED)//如果禁用 + await _eventPublisher.PublishAsync(EventSubscriberConst.CLEAR_MODULE_TOKEN, sysResource.Id);//清除角色下用户缓存 //设置为模块 - sysResource.Category = CateGoryConst.Resource_MODULE; + sysResource.Category = CateGoryConst.RESOURCE_MODULE; } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/Dto/RoleInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/Dto/RoleInput.cs similarity index 69% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/Dto/RoleInput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/Dto/RoleInput.cs index 57b64d67e2f6b9e80ff20e645ee6115c21eea611..fb539aaae0b0c5023cf406fa084d657b1e78c1bb 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/Dto/RoleInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/Dto/RoleInput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 角色查询参数 @@ -17,12 +27,6 @@ public class RoleAddInput : SysRole /// [Required(ErrorMessage = "Name不能为空")] public override string Name { get; set; } - - /// - /// 分类 - /// - [Required(ErrorMessage = "Category不能为空")] - public override string Category { get; set; } } /// @@ -52,7 +56,7 @@ public class GrantResourceInput : RoleOwnResourceOutput /// 授权资源信息 /// [Required(ErrorMessage = "GrantInfoList不能为空")] - public override List GrantInfoList { get; set; } + public override List GrantInfoList { get; set; } /// /// 是否代码生成 @@ -112,12 +116,15 @@ public class RoleSelectorInput : BasePageInput public List OrgIds { get; set; } /// - /// 关键字 + /// 角色名称 /// - public string SearchKey { get; set; } + public string Name { get; set; } +} +public class RoleTreeInput +{ /// - /// 角色分类 + /// 机构ID列表 /// - public string Category { get; set; } -} \ No newline at end of file + public List OrgIds { get; set; } +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/Dto/RoleOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/Dto/RoleOutput.cs similarity index 30% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/Dto/RoleOutput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/Dto/RoleOutput.cs index e0575fea8ba3419f19770db3936505e0fed5edb6..3db084ebbed25311411c2add4498ffe1620193bf 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/Dto/RoleOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/Dto/RoleOutput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 角色拥有的资源输出 @@ -13,7 +23,7 @@ public class RoleOwnResourceOutput /// /// 已授权资源信息 /// - public virtual List GrantInfoList { get; set; } + public virtual List GrantInfoList { get; set; } } /// @@ -30,4 +40,30 @@ public class RoleOwnPermissionOutput /// 已授权资源信息 /// public virtual List GrantInfoList { get; set; } -} \ No newline at end of file +} + +/// +/// 角色树输出参数 +/// +public class RoleTreeOutput +{ + /// + /// 职位Id + /// + public long Id { get; set; } + + /// + /// 名称 + /// + public string Name { get; set; } + + /// + /// 是否是职位 + /// + public bool IsRole { get; set; } + + /// + /// 子项 + /// + public List Children { get; set; } = new List(); +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/IRoleService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/ISysRoleService.cs similarity index 65% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/IRoleService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/ISysRoleService.cs index 367539717ec80b23b87ca488c9aadcbe24027527..c784bba3138f876f3efa54511d702a5bdf8b2614 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/IRoleService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/ISysRoleService.cs @@ -1,10 +1,22 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 角色服务 /// -public interface IRoleService : ITransient +public interface ISysRoleService : ITransient { + #region 查询 + /// /// 获取所有角色 /// @@ -12,107 +24,136 @@ public interface IRoleService : ITransient Task> GetListAsync(); /// - /// 添加角色 + /// 根据用户ID获取用户角色集合 /// - /// 添加参数 + /// 用户ID /// - Task Add(RoleAddInput input); + Task> GetRoleListByUserId(long userId); + /// - /// 删除角色 + /// 获取角色拥有权限 /// - /// 删除参数 + /// 角色ID /// - Task Delete(List input); + Task OwnPermission(BaseIdInput input); /// - /// 编辑角色 + /// 角色拥有资源 /// - /// 编辑参数 + /// 角色id + /// 资源类型 + /// 角色拥有资源信息 + Task OwnResource(BaseIdInput input, string category); + + /// + /// 获取角色下的用户 + /// + /// 角色ID /// - Task Edit(RoleEditInput input); + Task> OwnUser(BaseIdInput input); /// - /// 根据用户ID获取用户角色集合 + /// 分页查询角色 /// - /// 用户ID + /// 查询参数 /// - Task> GetRoleListByUserId(long userId); + Task> Page(RolePageInput input); /// - /// 给角色授权权限 + /// 获取角色授权权限选择器 /// - /// 授权信息 + /// 角色ID /// - Task GrantPermission(GrantPermissionInput input); + Task> RolePermissionTreeSelector(BaseIdInput input); /// - /// 给角色授权 + /// 角色选择器 /// - /// 授权参数 + /// /// - Task GrantResource(GrantResourceInput input); + Task> RoleSelector(RoleSelectorInput input); /// - /// 给角色授权用户 + /// 根据id集合获取角色集合 /// - /// 授权信息 + /// /// - Task GrantUser(GrantUserInput input); + Task> GetRoleListByIdList(IdListInput input); /// - /// 获取角色拥有权限 + /// 获取角色树 /// - /// 角色ID + /// 角色树 /// - Task OwnPermission(BaseIdInput input); + Task> Tree(RoleTreeInput input); /// - /// 角色拥有资源 + /// 角色详情 /// - /// 角色id - /// 资源类型 - /// 角色拥有资源信息 - Task OwnResource(BaseIdInput input, string category); + /// 角色Id + /// + Task Detail(BaseIdInput input); + + #endregion + + #region 新增 /// - /// 获取角色下的用户 + /// 添加角色 /// - /// 角色ID + /// 添加参数 /// - Task> OwnUser(BaseIdInput input); + Task Add(RoleAddInput input); + + #endregion + + #region 编辑 /// - /// 分页查询角色 + /// 编辑角色 /// - /// 查询参数 + /// 编辑参数 /// - Task> Page(RolePageInput input); + Task Edit(RoleEditInput input); /// - /// 刷新缓存 + /// 给角色授权权限 /// + /// 授权信息 /// - Task RefreshCache(); + Task GrantPermission(GrantPermissionInput input); /// - /// 获取角色授权权限选择器 + /// 给角色授权 /// - /// 角色ID + /// 授权参数 /// - Task> RolePermissionTreeSelector(BaseIdInput input); + Task GrantResource(GrantResourceInput input); /// - /// 角色选择器 + /// 给角色授权用户 /// - /// + /// 授权信息 /// - Task> RoleSelector(RoleSelectorInput input); + Task GrantUser(GrantUserInput input); + + #endregion + + #region 删除 /// - /// 根据id集合获取角色集合 + /// 刷新缓存 /// - /// /// - Task> GetRoleListByIdList(IdListInput input); -} \ No newline at end of file + Task RefreshCache(); + + /// + /// 删除角色 + /// + /// 删除参数 + /// + Task Delete(BaseIdListInput input); + + #endregion +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/RoleService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/SysRoleService.cs similarity index 54% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/RoleService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/SysRoleService.cs index 437f88df9d47f08c4c77e3d537ee64ca1ee55a83..a942c49e7991865451a5e3c449c273c773bc06de 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/RoleService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/SysRoleService.cs @@ -1,22 +1,28 @@ -namespace SimpleAdmin.System; - -/// +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; + +/// //[Injection(Proxy = typeof(GlobalDispatchProxy))] -public class RoleService : DbRepository, IRoleService +public class SysRoleService : DbRepository, ISysRoleService { - private readonly ILogger _logger; + private readonly ILogger _logger; private readonly ISimpleCacheService _simpleCacheService; private readonly IRelationService _relationService; private readonly ISysOrgService _sysOrgService; private readonly IResourceService _resourceService; private readonly IEventPublisher _eventPublisher; - public RoleService(ILogger logger, - ISimpleCacheService simpleCacheService, - IRelationService relationService, - ISysOrgService sysOrgService, - IResourceService resourceService, - IEventPublisher eventPublisher) + public SysRoleService(ILogger logger, ISimpleCacheService simpleCacheService, IRelationService relationService, + ISysOrgService sysOrgService, IResourceService resourceService, IEventPublisher eventPublisher) { _logger = logger; _simpleCacheService = simpleCacheService; @@ -26,11 +32,16 @@ public class RoleService : DbRepository, IRoleService _eventPublisher = eventPublisher; } - /// + #region 查询 + + /// + /// 获取所有 + /// + /// public override async Task> GetListAsync() { //先从Redis拿 - var sysRoles = _simpleCacheService.Get>(SystemConst.Cache_SysRole); + var sysRoles = _simpleCacheService.Get>(SystemConst.CACHE_SYS_ROLE); if (sysRoles == null) { //redis没有就去数据库拿 @@ -38,7 +49,7 @@ public class RoleService : DbRepository, IRoleService if (sysRoles.Count > 0) { //插入Redis - _simpleCacheService.Set(SystemConst.Cache_SysRole, sysRoles); + _simpleCacheService.Set(SystemConst.CACHE_SYS_ROLE, sysRoles); } } return sysRoles; @@ -48,7 +59,7 @@ public class RoleService : DbRepository, IRoleService public async Task> GetRoleListByUserId(long userId) { var cods = new List();//角色代码集合 - var roleList = await _relationService.GetRelationListByObjectIdAndCategory(userId, CateGoryConst.Relation_SYS_USER_HAS_ROLE);//根据用户ID获取角色ID + var roleList = await _relationService.GetRelationListByObjectIdAndCategory(userId, CateGoryConst.RELATION_SYS_USER_HAS_ROLE);//根据用户ID获取角色ID var roleIdList = roleList.Select(x => x.TargetId.ToLong()).ToList();//角色ID列表 if (roleIdList.Count > 0) { @@ -63,30 +74,203 @@ public class RoleService : DbRepository, IRoleService var orgIds = await _sysOrgService.GetOrgChildIds(input.OrgId);//获取下级机构 var query = Context.Queryable() .WhereIF(input.OrgId > 0, it => orgIds.Contains(it.OrgId.Value))//根据组织 + .WhereIF(input.OrgIds != null, it => input.OrgIds.Contains(it.OrgId.Value))//数据权限 .WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category)//根据分类 .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}") - .OrderBy(it => it.SortCode);//排序 - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}").OrderBy(it => it.SortCode);//排序 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } + /// + public async Task> Tree(RoleTreeInput input) + { + var result = new List();//返回结果 + var sysOrgList = await _sysOrgService.GetListAsync(false);//获取所有机构 + var sysRoles = await GetListAsync();//获取所有角色 + sysRoles = sysRoles.Where(it => it.Code != SysRoleConst.SUPER_ADMIN).ToList();//排除超管 + if (input.OrgIds != null)//根据数据范围查 + { + sysOrgList = sysOrgList.Where(it => input.OrgIds.Contains(it.Id)).ToList();//在指定组织列表查询 + sysRoles = sysRoles.Where(it => input.OrgIds.Contains(it.OrgId.GetValueOrDefault())).ToList();//在指定职位列表查询 + } + var topOrgList = sysOrgList.Where(it => it.ParentId == 0).ToList();//获取顶级机构 + var globalRole = sysRoles.Where(it => it.Category == CateGoryConst.ROLE_GLOBAL).ToList();//获取全局角色 + if (globalRole.Count > 0) + { + result.Add(new RoleTreeOutput() + { + Id = CommonUtils.GetSingleId(), + Name = "全局角色", + Children = globalRole.Select(it => new RoleTreeOutput + { + Id = it.Id, + Name = it.Name, + IsRole = true + }).ToList() + });//添加全局角色 + } + //遍历顶级机构 + foreach (var org in topOrgList) + { + var childIds = await _sysOrgService.GetOrgChildIds(org.Id, true, sysOrgList);//获取机构下的所有子级ID + var childRoles = sysRoles.Where(it => it.OrgId != null && childIds.Contains(it.OrgId.Value)).ToList();//获取机构下的所有角色 + if (childRoles.Count == 0) + continue; + var roleTreeOutput = new RoleTreeOutput + { + Id = org.Id, + Name = org.Name, + IsRole = false + };//实例化角色树 + childRoles.ForEach(it => + { + roleTreeOutput.Children.Add(new RoleTreeOutput() + { + Id = it.Id, + Name = it.Name, + IsRole = true + }); + }); + result.Add(roleTreeOutput); + } + return result; + } + + /// + public async Task OwnResource(BaseIdInput input, string category) + { + var roleOwnResource = new RoleOwnResourceOutput { Id = input.Id };//定义结果集 + var grantInfoList = new List();//已授权信息集合 + //获取关系列表 + var relations = await _relationService.GetRelationListByObjectIdAndCategory(input.Id, category); + //遍历关系表 + relations.ForEach(it => + { + //将扩展信息转为实体 + var relationRole = it.ExtJson.ToJsonEntity(); + grantInfoList.Add(relationRole);//添加到已授权信息 + }); + roleOwnResource.GrantInfoList = grantInfoList;//赋值已授权信息 + return roleOwnResource; + } + + /// + public async Task OwnPermission(BaseIdInput input) + { + var roleOwnPermission = new RoleOwnPermissionOutput { Id = input.Id };//定义结果集 + var grantInfoList = new List();//已授权信息集合 + //获取关系列表 + var relations = await _relationService.GetRelationListByObjectIdAndCategory(input.Id, CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION); + //遍历关系表 + relations.ForEach(it => + { + //将扩展信息转为实体 + var relationPermission = it.ExtJson.ToJsonEntity(); + grantInfoList.Add(relationPermission);//添加到已授权信息 + }); + roleOwnPermission.GrantInfoList = grantInfoList;//赋值已授权信息 + return roleOwnPermission; + } + + /// + public async Task> OwnUser(BaseIdInput input) + { + //获取关系列表 + var relations = await _relationService.GetRelationListByTargetIdAndCategory(input.Id.ToString(), CateGoryConst.RELATION_SYS_USER_HAS_ROLE); + var userIds = relations.Select(it => it.ObjectId).ToList(); + var userList = await Context.Queryable().Where(it => userIds.Contains(it.Id)).Select().ToListAsync(); + return userList; + } + + /// + public async Task> RoleSelector(RoleSelectorInput input) + { + var orgIds = await _sysOrgService.GetOrgChildIds(input.OrgId);//获取下级组织 + //如果机构ID列表不为空 + if (input.OrgIds != null) + { + orgIds = orgIds.Where(it => input.OrgIds.Contains(it)).ToList();//包含在机构ID列表中的组织ID + } + var result = await Context.Queryable() + .Where(it => it.Code != SysRoleConst.SUPER_ADMIN) + .WhereIF(input.OrgId == 0, it => it.Category == CateGoryConst.ROLE_GLOBAL)//不传机构ID就是全局角色 + .WhereIF(orgIds.Count > 0, it => orgIds.Contains(it.OrgId.Value))//组织ID + .WhereIF(!string.IsNullOrEmpty(input.Name), it => it.Name.Contains(input.Name))//根据关键字查询 + .Select() + .ToPagedListAsync(input.PageNum, input.PageSize); + return result; + } + + /// + public async Task> RolePermissionTreeSelector(BaseIdInput input) + { + var permissionTreeSelectors = new List();//授权树结果集 + //获取单页信息 + var spa = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_SPA); + var spaIds = spa.Select(it => it.Id).ToList(); + if (spaIds.Any()) + { + //获取权限授权树 + var permissions = _resourceService.PermissionTreeSelector(spa.Select(it => it.Path).ToList()); + if (permissions.Count > 0) + permissionTreeSelectors.AddRange(permissions.Select(it => it.PermissionName).ToList());//返回授权树权限名称列表 + } + //获取角色资源关系 + var relationsRes = await _relationService.GetRelationByCategory(CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE); + var menuIds = relationsRes.Where(it => it.ObjectId == input.Id).Select(it => it.TargetId.ToLong()).ToList(); + if (menuIds.Any()) + { + //获取菜单信息 + var menus = await _resourceService.GetResourcesByIds(menuIds, CateGoryConst.RESOURCE_MENU); + //获取权限授权树 + var permissions = _resourceService.PermissionTreeSelector(menus.Select(it => it.Path).ToList()); + if (permissions.Count > 0) + permissionTreeSelectors.AddRange(permissions.Select(it => it.PermissionName).ToList());//返回授权树权限名称列表 + } + return permissionTreeSelectors; + } + + + /// + public async Task> GetRoleListByIdList(IdListInput input) + { + var roles = await GetListAsync(); + var roleList = roles.Where(it => input.IdList.Contains(it.Id)).ToList();// 获取指定ID的岗位列表 + return roleList; + } + + /// + public async Task Detail(BaseIdInput input) + { + var roles = await GetListAsync(); + var role = roles.Where(it => it.Id == input.Id).FirstOrDefault(); + return role; + } + + #endregion + + #region 新增 + /// public async Task Add(RoleAddInput input) { await CheckInput(input);//检查参数 var sysRole = input.Adapt();//实体转换 - sysRole.Code = RandomHelper.CreateRandomString(10);//赋值Code if (await InsertAsync(sysRole))//插入数据 await RefreshCache();//刷新缓存 } + #endregion + + #region 编辑 + /// public async Task Edit(RoleEditInput input) { //判断是否超管 - if (input.Code == RoleConst.SuperAdmin) - throw Oops.Bah($"不可编辑超管角色"); + if (input.Code == SysRoleConst.SUPER_ADMIN) + throw Oops.Bah("不可编辑超管角色"); await CheckInput(input);//检查参数 var role = await GetFirstAsync(it => it.Id == input.Id);//获取角色 if (role != null) @@ -96,7 +280,7 @@ public class RoleService : DbRepository, IRoleService if (role.DefaultDataScope.ScopeCategory != input.DefaultDataScope.ScopeCategory) { //获取角色授权列表 - var relations = await _relationService.GetRelationByCategory(CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION); + var relations = await _relationService.GetRelationByCategory(CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION); //找到当前角色的 permissions = relations.Where(it => it.ObjectId == input.Id).ToList(); permissions.ForEach(it => @@ -115,7 +299,7 @@ public class RoleService : DbRepository, IRoleService } var sysRole = input.Adapt();//实体转换 //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { await UpdateAsync(sysRole);//更新角色 if (permissions.Any())//如果有授权权限就更新 @@ -124,9 +308,9 @@ public class RoleService : DbRepository, IRoleService if (result.IsSuccess)//如果成功了 { await RefreshCache();//刷新缓存 - if (permissions.Any())//如果有授权权 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION);//关系表刷新SYS_ROLE_HAS_PERMISSION缓存 - await _eventPublisher.PublishAsync(EventSubscriberConst.ClearUserCache, new List { input.Id });//清除角色下用户缓存 + if (permissions.Any())//如果有授权 + await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION);//关系表刷新SYS_ROLE_HAS_PERMISSION缓存 + await _eventPublisher.PublishAsync(EventSubscriberConst.CLEAR_USER_CACHE, new List { input.Id });//清除角色下用户缓存 } else { @@ -137,75 +321,36 @@ public class RoleService : DbRepository, IRoleService } } - /// - public async Task Delete(List input) - { - //获取所有ID - var ids = input.Select(it => it.Id).ToList(); - if (ids.Count > 0) - { - var sysRoles = await GetListAsync();//获取所有角色 - var hasSuperAdmin = sysRoles.Any(it => it.Code == RoleConst.SuperAdmin && ids.Contains(it.Id));//判断是否有超级管理员 - if (hasSuperAdmin) throw Oops.Bah($"不可删除系统内置超管角色"); - - //数据库是string所以这里转下 - var targetIds = ids.Select(it => it.ToString()).ToList(); - //定义删除的关系 - var delRelations = new List { CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE, CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION }; - //事务 - var result = await itenant.UseTranAsync(async () => - { - await DeleteByIdsAsync(ids.Cast().ToArray());//删除按钮 - var relationRep = ChangeRepository>();//切换仓储 - //删除关系表角色与资源关系,角色与权限关系 - await relationRep.DeleteAsync(it => ids.Contains(it.ObjectId) && delRelations.Contains(it.Category)); - //删除关系表角色与用户关系 - await relationRep.DeleteAsync(it => targetIds.Contains(it.TargetId) && it.Category == CateGoryConst.Relation_SYS_USER_HAS_ROLE); - }); - if (result.IsSuccess)//如果成功了 - { - await RefreshCache();//刷新缓存 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_USER_HAS_ROLE);//关系表刷新SYS_USER_HAS_ROLE缓存 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE);//关系表刷新Relation_SYS_ROLE_HAS_RESOURCE缓存 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION);//关系表刷新Relation_SYS_ROLE_HAS_PERMISSION缓存 - await _eventPublisher.PublishAsync(EventSubscriberConst.ClearUserCache, ids);//清除角色下用户缓存 - } - else - { - //写日志 - _logger.LogError(result.ErrorMessage, result.ErrorException); - throw Oops.Oh(ErrorCodeEnum.A0002); - } - } - } - - /// - public async Task OwnResource(BaseIdInput input, string category) - { - var roleOwnResource = new RoleOwnResourceOutput() { Id = input.Id };//定义结果集 - var GrantInfoList = new List();//已授权信息集合 - //获取关系列表 - var relations = await _relationService.GetRelationListByObjectIdAndCategory(input.Id, category); - //遍历关系表 - relations.ForEach(it => - { - //将扩展信息转为实体 - var relationRole = it.ExtJson.ToJsonEntity(); - GrantInfoList.Add(relationRole);//添加到已授权信息 - }); - roleOwnResource.GrantInfoList = GrantInfoList;//赋值已授权信息 - return roleOwnResource; - } /// public async Task GrantResource(GrantResourceInput input) { + var allMenus = await _resourceService.GetListByCategory(SysResourceConst.MENU);//获取所有菜单 + var spas = await _resourceService.GetListByCategory(SysResourceConst.SPA); var menuIds = input.GrantInfoList.Select(it => it.MenuId).ToList();//菜单ID var extJsons = input.GrantInfoList.Select(it => it.ToJson()).ToList();//拓展信息 var relationRoles = new List();//要添加的角色资源和授权关系表 var sysRole = (await GetListAsync()).Where(it => it.Id == input.Id).FirstOrDefault();//获取角色 if (sysRole != null) { + #region 角色模块处理 + + var menusList = allMenus.Where(it => menuIds.Contains(it.Id)).ToList();//获取菜单信息 + //获取我的模块信息Id列表 + var moduleIds = menusList.Select(it => it.Module.Value).Distinct().ToList(); + moduleIds.ForEach(it => + { + //将角色资源添加到列表 + relationRoles.Add(new SysRelation + { + ObjectId = sysRole.Id, + TargetId = it.ToString(), + Category = CateGoryConst.RELATION_SYS_ROLE_HAS_MODULE + }); + }); + + #endregion 角色模块处理 + #region 角色资源处理 //遍历菜单列表 @@ -216,7 +361,7 @@ public class RoleService : DbRepository, IRoleService { ObjectId = sysRole.Id, TargetId = menuIds[i].ToString(), - Category = CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE, + Category = CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE, ExtJson = extJsons?[i] }); } @@ -229,7 +374,8 @@ public class RoleService : DbRepository, IRoleService var defaultDataScope = sysRole.DefaultDataScope;//获取默认数据范围 //获取菜单信息 - var menus = await _resourceService.GetMenuByMenuIds(menuIds); + var menus = allMenus.Where(it => menuIds.Contains(it.Id)).ToList(); + menus.AddRange(spas);//单页id添加到列表 if (menus.Count > 0) { //获取权限授权树 @@ -241,9 +387,13 @@ public class RoleService : DbRepository, IRoleService { ObjectId = sysRole.Id, TargetId = it.ApiRoute, - Category = CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION, - ExtJson = new RelationRolePermission { ApiUrl = it.ApiRoute, ScopeCategory = defaultDataScope.ScopeCategory, ScopeDefineOrgIdList = defaultDataScope.ScopeDefineOrgIdList } - .ToJson() + Category = CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION, + ExtJson = new RelationRolePermission + { + ApiUrl = it.ApiRoute, + ScopeCategory = defaultDataScope.ScopeCategory, + ScopeDefineOrgIdList = defaultDataScope.ScopeDefineOrgIdList + }.ToJson() }); }); } @@ -254,20 +404,22 @@ public class RoleService : DbRepository, IRoleService #region 保存数据库 //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { - var relatioRep = ChangeRepository>();//切换仓储 + var relationRep = ChangeRepository>();//切换仓储 //如果不是代码生成,就删除老的 if (!input.IsCodeGen) - await relatioRep.DeleteAsync(it => - it.ObjectId == sysRole.Id && (it.Category == CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION || it.Category == CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE)); - await relatioRep.InsertRangeAsync(relationRoles);//添加新的 + await relationRep.DeleteAsync(it => it.ObjectId == sysRole.Id && (it.Category == CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION + || it.Category == CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE + || it.Category == CateGoryConst.RELATION_SYS_ROLE_HAS_MODULE)); + await relationRep.InsertRangeAsync(relationRoles);//添加新的 }); if (result.IsSuccess)//如果成功了 { - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE);//刷新关系缓存 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION);//刷新关系缓存 - await _eventPublisher.PublishAsync(EventSubscriberConst.ClearUserCache, new List { input.Id });//发送事件清除角色下用户缓存 + await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE);//刷新关系缓存 + await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION);//刷新关系缓存 + await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_ROLE_HAS_MODULE);//刷新关系缓存 + await _eventPublisher.PublishAsync(EventSubscriberConst.CLEAR_USER_CACHE, new List { input.Id });//发送事件清除角色下用户缓存 } else { @@ -280,23 +432,6 @@ public class RoleService : DbRepository, IRoleService } } - /// - public async Task OwnPermission(BaseIdInput input) - { - var roleOwnPermission = new RoleOwnPermissionOutput { Id = input.Id };//定义结果集 - var GrantInfoList = new List();//已授权信息集合 - //获取关系列表 - var relations = await _relationService.GetRelationListByObjectIdAndCategory(input.Id, CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION); - //遍历关系表 - relations.ForEach(it => - { - //将扩展信息转为实体 - var relationPermission = it.ExtJson.ToJsonEntity(); - GrantInfoList.Add(relationPermission);//添加到已授权信息 - }); - roleOwnPermission.GrantInfoList = GrantInfoList;//赋值已授权信息 - return roleOwnPermission; - } /// public async Task GrantPermission(GrantPermissionInput input) @@ -304,20 +439,14 @@ public class RoleService : DbRepository, IRoleService var sysRole = (await GetListAsync()).Where(it => it.Id == input.Id).FirstOrDefault();//获取角色 if (sysRole != null) { - var apiUrls = input.GrantInfoList.Select(it => it.ApiUrl).ToList();//apiurl列表 + var apiUrls = input.GrantInfoList.Select(it => it.ApiUrl).ToList();//apiUrl列表 var extJsons = input.GrantInfoList.Select(it => it.ToJson()).ToList();//拓展信息 - await _relationService.SaveRelationBatch(CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION, input.Id, apiUrls, extJsons, true);//添加到数据库 - await _eventPublisher.PublishAsync(EventSubscriberConst.ClearUserCache, new List { input.Id });//清除角色下用户缓存 + await _relationService.SaveRelationBatch(CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION, input.Id, apiUrls, extJsons, + true);//添加到数据库 + await _eventPublisher.PublishAsync(EventSubscriberConst.CLEAR_USER_CACHE, new List { input.Id });//清除角色下用户缓存 } } - /// - public async Task> OwnUser(BaseIdInput input) - { - //获取关系列表 - var relations = await _relationService.GetRelationListByTargetIdAndCategory(input.Id.ToString(), CateGoryConst.Relation_SYS_USER_HAS_ROLE); - return relations.Select(it => it.ObjectId).ToList(); - } /// public async Task GrantUser(GrantUserInput input) @@ -330,22 +459,22 @@ public class RoleService : DbRepository, IRoleService { ObjectId = it, TargetId = input.Id.ToString(), - Category = CateGoryConst.Relation_SYS_USER_HAS_ROLE + Category = CateGoryConst.RELATION_SYS_USER_HAS_ROLE }); }); //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { var relationRep = ChangeRepository>();//切换仓储 var targetId = input.Id.ToString();//目标ID转string - await relationRep.DeleteAsync(it => it.TargetId == targetId && it.Category == CateGoryConst.Relation_SYS_USER_HAS_ROLE);//删除老的 + await relationRep.DeleteAsync(it => it.TargetId == targetId && it.Category == CateGoryConst.RELATION_SYS_USER_HAS_ROLE);//删除老的 await relationRep.InsertRangeAsync(sysRelations);//添加新的 }); if (result.IsSuccess)//如果成功了 { - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_USER_HAS_ROLE);//刷新关系表SYS_USER_HAS_ROLE缓存 - await _eventPublisher.PublishAsync(EventSubscriberConst.ClearUserCache, new List { input.Id });//清除角色下用户缓存 + await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_USER_HAS_ROLE);//刷新关系表SYS_USER_HAS_ROLE缓存 + await _eventPublisher.PublishAsync(EventSubscriberConst.CLEAR_USER_CACHE, new List { input.Id });//清除角色下用户缓存 } else { @@ -355,58 +484,67 @@ public class RoleService : DbRepository, IRoleService } } - /// - public async Task> RoleSelector(RoleSelectorInput input) - { - var orgIds = await _sysOrgService.GetOrgChildIds(input.OrgId);//获取下级组织 - //如果机构ID列表不为空 - if (input.OrgIds != null) - { - orgIds = orgIds.Where(it => input.OrgIds.Contains(it)).ToList();//包含在机构ID列表中的组织ID - } - var result = await Context.Queryable() - .WhereIF(orgIds.Count > 0, it => orgIds.Contains(it.OrgId.Value))//组织ID - .WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category)//分类 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 - .ToPagedListAsync(input.Current, input.Size); - return result; - } + #endregion + + #region 删除 /// - public async Task> RolePermissionTreeSelector(BaseIdInput input) + public async Task Delete(BaseIdListInput input) { - var permissionTreeSelectors = new List();//授权树结果集 - //获取角色资源关系 - var relationsRes = await _relationService.GetRelationByCategory(CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE); - var menuIds = relationsRes.Where(it => it.ObjectId == input.Id).Select(it => it.TargetId.ToLong()).ToList(); - if (menuIds.Any()) + //获取所有ID + var ids = input.Ids; + if (ids.Count > 0) { - //获取菜单信息 - var menus = await _resourceService.GetMenuByMenuIds(menuIds); - //获取权限授权树 - var permissions = _resourceService.PermissionTreeSelector(menus.Select(it => it.Path).ToList()); - if (permissions.Count > 0) + var sysRoles = await GetListAsync();//获取所有角色 + var hasSuperAdmin = sysRoles.Any(it => it.Code == SysRoleConst.SUPER_ADMIN && ids.Contains(it.Id));//判断是否有超级管理员 + if (hasSuperAdmin) throw Oops.Bah("不可删除系统内置超管角色"); + + //数据库是string所以这里转下 + var targetIds = ids.Select(it => it.ToString()).ToList(); + //定义删除的关系 + var delRelations = new List { - permissionTreeSelectors = permissions.Select(it => it.PermissionName).ToList();//返回授权树权限名称列表 + CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE, + CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION, + CateGoryConst.RELATION_SYS_ROLE_HAS_MODULE + }; + //事务 + var result = await Tenant.UseTranAsync(async () => + { + await DeleteByIdsAsync(ids.Cast().ToArray());//删除按钮 + var relationRep = ChangeRepository>();//切换仓储 + //删除关系表角色与资源关系,角色与权限关系 + await relationRep.DeleteAsync(it => ids.Contains(it.ObjectId) && delRelations.Contains(it.Category)); + //删除关系表角色与用户关系 + await relationRep.DeleteAsync(it => targetIds.Contains(it.TargetId) && it.Category == CateGoryConst.RELATION_SYS_USER_HAS_ROLE); + }); + if (result.IsSuccess)//如果成功了 + { + await RefreshCache();//刷新缓存 + await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_USER_HAS_ROLE);//关系表刷新SYS_USER_HAS_ROLE缓存 + await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE);//关系表刷新Relation_SYS_ROLE_HAS_RESOURCE缓存 + await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION);//关系表刷新Relation_SYS_ROLE_HAS_PERMISSION缓存 + await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_ROLE_HAS_MODULE);//关系表刷新RELATION_SYS_ROLE_HAS_MODULE缓存 + await _eventPublisher.PublishAsync(EventSubscriberConst.CLEAR_USER_CACHE, ids);//清除角色下用户缓存 + } + else + { + //写日志 + _logger.LogError(result.ErrorMessage, result.ErrorException); + throw Oops.Oh(ErrorCodeEnum.A0002); } } - return permissionTreeSelectors; } + /// public async Task RefreshCache() { - _simpleCacheService.Remove(SystemConst.Cache_SysRole);//删除KEY + _simpleCacheService.Remove(SystemConst.CACHE_SYS_ROLE);//删除KEY await GetListAsync();//重新缓存 } - /// - public async Task> GetRoleListByIdList(IdListInput input) - { - var roles = await GetListAsync(); - var roleList = roles.Where(it => input.IdList.Contains(it.Id)).ToList();// 获取指定ID的岗位列表 - return roleList; - } + #endregion #region 方法 @@ -417,12 +555,12 @@ public class RoleService : DbRepository, IRoleService private async Task CheckInput(SysRole sysRole) { //判断分类 - if (sysRole.Category != CateGoryConst.Role_GLOBAL && sysRole.Category != CateGoryConst.Role_ORG) + if (sysRole.Category != CateGoryConst.ROLE_GLOBAL && sysRole.Category != CateGoryConst.ROLE_ORG) throw Oops.Bah($"角色所属分类错误:{sysRole.Category}"); //如果是机构角色orgId不能为空 - if (sysRole.Category == CateGoryConst.Role_ORG && sysRole.OrgId == null) - throw Oops.Bah($"orgId不能为空"); - else if (sysRole.Category == CateGoryConst.Role_GLOBAL)//如果是全局 + if (sysRole is { Category: CateGoryConst.ROLE_ORG, OrgId: null }) + throw Oops.Bah("orgId不能为空"); + if (sysRole.Category == CateGoryConst.ROLE_GLOBAL)//如果是全局 sysRole.OrgId = null;//机构id设null var sysRoles = await GetListAsync();//获取所有 @@ -431,10 +569,20 @@ public class RoleService : DbRepository, IRoleService { if (sysRole.OrgId == null) throw Oops.Bah($"存在重复的全局角色:{sysRole.Name}"); - else - throw Oops.Bah($"同组织下存在重复的角色:{sysRole.Name}"); + throw Oops.Bah($"同组织下存在重复的角色:{sysRole.Name}"); + } + //如果code没填 + if (string.IsNullOrEmpty(sysRole.Code)) + { + sysRole.Code = RandomHelper.CreateRandomString(10);//赋值Code + } + else + { + //判断是否有相同的Code + if (sysRoles.Any(it => it.Code == sysRole.Code && it.Id != sysRole.Id)) + throw Oops.Bah($"存在重复的编码:{sysRole.Code}"); } } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/Dto/SpaInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/Dto/SpaInput.cs similarity index 57% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/Dto/SpaInput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/Dto/SpaInput.cs index 2b0e4bae276ac6a729318f8a262bac2269ae1abc..b208dd1f7cd6894912083241421eb137aa2a7f2b 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/Dto/SpaInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/Dto/SpaInput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 单页输入参数 @@ -51,4 +61,4 @@ public class SpaEditInput : SpaAddInput /// [IdNotNull(ErrorMessage = "Id不能为空")] public override long Id { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/ISpaService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/ISpaService.cs similarity index 42% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/ISpaService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/ISpaService.cs index 1d516d9a66b3f53e7b22fe9617c8405cda330d17..b3fe419610ed51ed655285471566b365caa311fa 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/ISpaService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/ISpaService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 单页服务 @@ -17,7 +27,7 @@ public interface ISpaService : ITransient /// /// 删除参数 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); /// /// 编辑单页 @@ -32,4 +42,11 @@ public interface ISpaService : ITransient /// /// Task> Page(SpaPageInput input); -} \ No newline at end of file + + /// + /// 详情 + /// + /// + /// + Task Detail(BaseIdInput input); +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/SpaService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/SpaService.cs similarity index 35% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/SpaService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/SpaService.cs index b2a66cdbc4aa5a5bc40e139110de9e2fffce3c98..4806e9697c387cdbab12e4d13babd461ca7a9b00 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/SpaService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/SpaService.cs @@ -1,104 +1,130 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// /// public class SpaService : DbRepository, ISpaService { - private readonly ISimpleCacheService _simpleCacheService; private readonly IResourceService _resourceService; - public SpaService(ISimpleCacheService simpleCacheService, IResourceService resourceService) + public SpaService(IResourceService resourceService) { - _simpleCacheService = simpleCacheService; - this._resourceService = resourceService; + _resourceService = resourceService; } /// public async Task> Page(SpaPageInput input) { - var query = Context.Queryable() - .Where(it => it.Category == CateGoryConst.Resource_SPA)//单页 - .WhereIF(!string.IsNullOrEmpty(input.MenuType), it => it.MenuType == input.MenuType)//根据菜单类型查询 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Title.Contains(input.SearchKey) || it.Path.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}") - .OrderBy(it => it.SortCode);//排序 - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + var query = Context.Queryable().Where(it => it.Category == CateGoryConst.RESOURCE_SPA)//单页 + .WhereIF(!string.IsNullOrEmpty(input.MenuType), it => it.MenuType == input.MenuType)//根据菜单类型查询 + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Title.Contains(input.SearchKey) || it.Path.Contains(input.SearchKey))//根据关键字查询 + .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}").OrderBy(it => it.SortCode);//排序 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } /// public async Task Add(SpaAddInput input) { - CheckInput(input);//检查参数 + await CheckInput(input);//检查参数 input.Code = RandomHelper.CreateRandomString(10);//code取随机值 var sysResource = input.Adapt();//实体转换 if (await InsertAsync(sysResource))//插入数据 - await _resourceService.RefreshCache(CateGoryConst.Resource_SPA);//刷新缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_SPA);//刷新缓存 } /// public async Task Edit(SpaEditInput input) { - CheckInput(input);//检查参数 + await CheckInput(input);//检查参数 var sysResource = input.Adapt();//实体转换 if (await UpdateAsync(sysResource))//更新数据 - await _resourceService.RefreshCache(CateGoryConst.Resource_SPA);//刷新缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_SPA);//刷新缓存 } /// - public async Task Delete(List input) + public async Task Delete(BaseIdListInput input) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; if (ids.Count > 0) { //获取所有 - var resourceList = await _resourceService.GetListByCategory(CateGoryConst.Resource_SPA); + var resourceList = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_SPA); //找到要删除的 var sysresources = resourceList.Where(it => ids.Contains(it.Id)).ToList(); //查找内置单页面 - var system = sysresources.Where(it => it.Code == ResourceConst.System).FirstOrDefault(); + var system = sysresources.Where(it => it.Code == SysResourceConst.SYSTEM).FirstOrDefault(); if (system != null) throw Oops.Bah($"不可删除系统内置单页面:{system.Title}"); //删除菜单 await DeleteAsync(sysresources); - await _resourceService.RefreshCache(CateGoryConst.Resource_SPA);//刷新缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_SPA);//刷新缓存 } } + /// + public async Task Detail(BaseIdInput input) + { + var sysResources = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_SPA); + var resource = sysResources.Where(it => it.Id == input.Id).FirstOrDefault(); + return resource; + } + + #region 方法 /// /// 检查输入参数 /// /// - private void CheckInput(SysResource sysResource) + private async Task CheckInput(SysResource sysResource) { //判断菜单类型 - if (sysResource.MenuType == ResourceConst.MENU)//如果是菜单 + if (sysResource.MenuType == SysResourceConst.MENU)//如果是菜单 { if (string.IsNullOrEmpty(sysResource.Name)) { - throw Oops.Bah($"单页名称不能为空"); + throw Oops.Bah("单页名称不能为空"); } if (string.IsNullOrEmpty(sysResource.Component)) { - throw Oops.Bah($"组件地址不能为空"); + throw Oops.Bah("组件地址不能为空"); } } - else if (sysResource.MenuType == ResourceConst.IFRAME || sysResource.MenuType == ResourceConst.LINK)//如果是内链或者外链 + else if (sysResource.MenuType == SysResourceConst.IFRAME || sysResource.MenuType == SysResourceConst.LINK)//如果是内链或者外链 { - sysResource.Name = RandomHelper.CreateNum(10);//设置name为随机数 + // sysResource.Name = RandomHelper.CreateNum(10);//设置name为随机数 + sysResource.Name = null;//设置name为标题 sysResource.Component = null; } else { throw Oops.Bah($"单页类型错误:{sysResource.MenuType}");//都不是 } + if (sysResource.IsHome) + { + var spas = await _resourceService.GetListByCategory(SysResourceConst.SPA);//获取所有单页 + if (spas.Any(it => it.IsHome && it.Id != sysResource.Id))//如果有多个主页 + { + throw Oops.Bah("已存在首页,请取消其他主页后再试"); + } + sysResource.IsHide = false;//如果是主页,则不隐藏 + sysResource.IsAffix = true;//如果是主页,则固定 + } //设置为单页 - sysResource.Category = CateGoryConst.Resource_SPA; + sysResource.Category = CateGoryConst.RESOURCE_SPA; } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/Dto/OperateLogInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/Dto/OperateLogInput.cs new file mode 100644 index 0000000000000000000000000000000000000000..32cd1742fbe576eaef23cdd5a8bbbca1f71c46ae --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/Dto/OperateLogInput.cs @@ -0,0 +1,25 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; + +/// +/// 操作日志分页输入 +/// +public class OperateLogPageInput : VisitLogPageInput +{ +} + +/// +/// 操作日志日志删除输入 +/// +public class OperateLogDeleteInput : VisitLogDeleteInput +{ +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/Dto/OperateLogOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/Dto/OperateLogOutput.cs similarity index 32% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/Dto/OperateLogOutput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/Dto/OperateLogOutput.cs index 9d2644cc42f7df62c27367a2f3cc5217742eb272..78e81793cfb8c68f34d67a362b10e931102780b6 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/Dto/OperateLogOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/Dto/OperateLogOutput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 操作日志周统计输出 @@ -24,6 +34,6 @@ public class OperateLogDayStatisticsOutput /// /// 操作日志统计 /// -public class OperateLogTotalCountOutpu : VisitLogTotalCountOutput +public class OperateLogTotalCountOutput : VisitLogTotalCountOutput { -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/IOperateLogService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/IOperateLogService.cs similarity index 48% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/IOperateLogService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/IOperateLogService.cs index 2bfa6f7e0821892b0ed1079c451b6de3a07d0341..c44d516563e78ae30ac999f2e4db26c12b5fa101 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/IOperateLogService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/IOperateLogService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 操作日志服务 @@ -17,14 +27,14 @@ public interface IOperateLogService : ITransient /// /// id /// 日志详情 - Task Detail(BaseIdInput input); + Task Detail(BaseIdInput input); /// /// 操作日志分页查询 /// /// 查询参数 /// 分页列表 - Task> Page(OperateLogPageInput input); + Task> Page(OperateLogPageInput input); /// /// 操作日志周统计 @@ -37,5 +47,5 @@ public interface IOperateLogService : ITransient /// 操作日志总览 /// /// 异常日志和操作日志的数量 - Task> TotalCount(); -} \ No newline at end of file + Task> TotalCount(); +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/OperateLogService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/OperateLogService.cs new file mode 100644 index 0000000000000000000000000000000000000000..0ad47ec2589e16feee7946e6fc58d6a046f14c10 --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/OperateLogService.cs @@ -0,0 +1,118 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; + +/// +/// +/// +public class OperateLogService : DbRepository, IOperateLogService +{ + /// + /// 操作日志中文名称 + /// + private readonly string _nameOperate = "操作日志"; + + /// + /// 异常日志中文名称 + /// + private readonly string _nameException = "异常日志"; + + /// + /// 分表最多查近多少年的数据 + /// + private readonly int _maxTabs = 100; + + /// + public async Task> Page(OperateLogPageInput input) + { + var query = Context.Queryable().WhereIF(!string.IsNullOrEmpty(input.Account), it => it.OpAccount == input.Account)//根据账号查询 + .WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category)//根据分类查询 + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey) || it.OpIp.Contains(input.SearchKey))//根据关键字查询 + .IgnoreColumns(it => new { it.ParamJson, it.ResultJson }).SplitTable(tabs => tabs.Take(_maxTabs)) + .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}")//排序 + .OrderBy(it => it.CreateTime, OrderByType.Desc); + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 + return pageInfo; + } + + /// + public async Task> StatisticsByDay(int day) + { + //取最近七天 + var dayArray = Enumerable.Range(0, day).Select(it => DateTime.Now.Date.AddDays(it * -1)).ToList(); + //生成时间表 + var queryableLeft = Context.Reportable(dayArray).ToQueryable(); + //ReportableDateType.MonthsInLast1yea 表式近一年月份 并且queryable之后还能在where过滤 + var queryableRight = Context.Queryable().SplitTable(tabs => tabs.Take(_maxTabs));//声名表 + //报表查询 + var list = await Context + .Queryable(queryableLeft, queryableRight, JoinType.Left, + (x1, x2) => x2.CreateTime.Value.ToString("yyyy-MM-dd") == x1.ColumnName.ToString("yyyy-MM-dd")) + .GroupBy((x1, x2) => x1.ColumnName)//根据时间分组 + .OrderBy((x1, x2) => x1.ColumnName)//根据时间升序排序 + .Select((x1, x2) => new + { + OperateCount = SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.LOG_OPERATE, 1, 0)),//null的数据要为0所以不能用count + ExceptionCount = SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.LOG_EXCEPTION, 1, 0)),//null的数据要为0所以不能用count + Date = x1.ColumnName.ToString("yyyy-MM-dd") + }).ToListAsync(); + //定义返回结果 + var result = new List(); + //遍历结果 + list.ForEach(it => + { + result.Add(new OperateLogDayStatisticsOutput { Date = it.Date, Name = _nameOperate, Count = it.OperateCount });//添加访问日志 + result.Add(new OperateLogDayStatisticsOutput { Date = it.Date, Name = _nameException, Count = it.ExceptionCount });//添加异常日志 + }); + return result; + } + + /// + public async Task> TotalCount() + { + var data = await Context.Queryable().SplitTable(tabs => tabs.Take(_maxTabs)).GroupBy(it => it.Category)//根据分类分组 + .Select(it => new + { + it.Category,//分类 + Count = SqlFunc.AggregateCount(it.Category)//数量 + }).ToListAsync(); + //定义结果数组 + var operateLogTotalCounts = new List + { + //添加操作日志数据 + new OperateLogTotalCountOutput + { + Type = _nameOperate, + Value = data.Where(it => it.Category == CateGoryConst.LOG_OPERATE).Select(it => it.Count).FirstOrDefault() + }, + //添加异常日志数据 + new OperateLogTotalCountOutput + { + Type = _nameException, + Value = data.Where(it => it.Category == CateGoryConst.LOG_EXCEPTION).Select(it => it.Count).FirstOrDefault() + } + }; + return operateLogTotalCounts; + } + + /// + public async Task Delete(string category) + { + await Context.Deleteable().Where(it => it.Category == category).SplitTable(tabs => tabs.Take(_maxTabs)) + .ExecuteCommandAsync();//删除对应分类日志 + } + + /// + public async Task Detail(BaseIdInput input) + { + return await GetFirstSplitTableAsync(it => it.Id == input.Id, tabs => tabs.Take(_maxTabs)); + } +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/Dto/VisitLogInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/Dto/VisitLogInput.cs similarity index 36% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/Dto/VisitLogInput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/Dto/VisitLogInput.cs index 8f527e1e714d4ec4085c1fa3a1874238d249ac15..c4c64d9091d52a328520429b74b4bc305d51def5 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/Dto/VisitLogInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/Dto/VisitLogInput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 访问日志分页输入 @@ -25,4 +35,4 @@ public class VisitLogDeleteInput /// 分类 /// public string Category { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/Dto/VisitLogOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/Dto/VisitLogOutput.cs similarity index 44% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/Dto/VisitLogOutput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/Dto/VisitLogOutput.cs index 3b348f44e7b48399b539f68a64c519432fc8f58d..ace9a8fa60922a88e61edd26e4f3fe84a5f7647e 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/Dto/VisitLogOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/Dto/VisitLogOutput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 周统计输出 @@ -35,4 +45,4 @@ public class VisitLogTotalCountOutput /// 数量 /// public int Value { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/IVisitLogService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/IVisitLogService.cs similarity index 49% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/IVisitLogService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/IVisitLogService.cs index 180e7cc2adac49b3f87e05834e9ef9f2fffa121a..7829618df70ec05b9363f410e3da917b10f5311c 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/IVisitLogService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/IVisitLogService.cs @@ -1,9 +1,18 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 访问日志服务 /// - public interface IVisitLogService : ITransient { /// @@ -18,7 +27,7 @@ public interface IVisitLogService : ITransient /// /// 查询参数 /// 日志列表 - Task> Page(VisitLogPageInput input); + Task> Page(VisitLogPageInput input); /// /// 根统计N天来登录和登出数量 @@ -32,4 +41,4 @@ public interface IVisitLogService : ITransient /// /// 登录和登出的数量 Task> TotalCount(); -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/VisitLogService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/VisitLogService.cs new file mode 100644 index 0000000000000000000000000000000000000000..7770edd759195a9b86b7ea432c36ee077cccf13e --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/VisitLogService.cs @@ -0,0 +1,93 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; + +/// +/// +/// +public class VisitLogService : DbRepository, IVisitLogService +{ + /// + /// 分表最多查近多少年的数据 + /// + private readonly int _maxTabs = 100; + + /// + public async Task> Page(VisitLogPageInput input) + { + var query = Context.Queryable().WhereIF(!string.IsNullOrEmpty(input.Account), it => it.OpAccount == input.Account)//根据账号查询 + .WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category)//根据分类查询 + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey) || it.OpIp.Contains(input.SearchKey))//根据关键字查询 + .SplitTable(tabs => tabs.Take(_maxTabs)).OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}")//排序 + .OrderBy(it => it.CreateTime, OrderByType.Desc); + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 + return pageInfo; + } + + /// + public async Task> StatisticsByDay(int day) + { + //取最近七天 + var dayArray = Enumerable.Range(0, day).Select(it => DateTime.Now.Date.AddDays(it * -1)).ToList(); + //生成时间表 + var queryableLeft = Context.Reportable(dayArray).ToQueryable(); + //ReportableDateType.MonthsInLast1yea 表式近一年月份 并且queryable之后还能在where过滤 + var queryableRight = Context.Queryable().SplitTable(tabs => tabs.Take(_maxTabs));//声名表 + //报表查询 + var list = await Context + .Queryable(queryableLeft, queryableRight, JoinType.Left, + (x1, x2) => x2.CreateTime.Value.ToString("yyyy-MM-dd") == x1.ColumnName.ToString("yyyy-MM-dd")) + .GroupBy((x1, x2) => x1.ColumnName)//根据时间分组 + .OrderBy((x1, x2) => x1.ColumnName)//根据时间升序排序 + .Select((x1, x2) => new VisitLogDayStatisticsOutput + { + LoginCount = SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.LOG_LOGIN, 1, 0)),//null的数据要为0所以不能用count + LogoutCount = SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.LOG_LOGOUT, 1, 0)),//null的数据要为0所以不能用count + Date = x1.ColumnName.ToString("yyyy-MM-dd") + }).ToListAsync(); + return list; + } + + /// + public async Task> TotalCount() + { + var data = await Context.Queryable().SplitTable(tabs => tabs.Take(_maxTabs)).GroupBy(it => it.Category)//根据分类分组 + .Select(it => new + { + it.Category,//分类 + Count = SqlFunc.AggregateCount(it.Category)//数量 + }).ToListAsync(); + //定义结果数组 + var visitLogTotalCounts = new List + { + //添加登录数据 + new VisitLogTotalCountOutput + { + Type = EventSubscriberConst.LOGIN_B, + Value = data.Where(it => it.Category == CateGoryConst.LOG_LOGIN).Select(it => it.Count).FirstOrDefault() + }, + //添加登出数据 + new VisitLogTotalCountOutput + { + Type = EventSubscriberConst.LOGIN_OUT_B, + Value = data.Where(it => it.Category == CateGoryConst.LOG_LOGOUT).Select(it => it.Count).FirstOrDefault() + } + }; + return visitLogTotalCounts; + } + + /// + public async Task Delete(string category) + { + await Context.Deleteable().Where(it => it.Category == category).SplitTable(tabs => tabs.Take(_maxTabs)) + .ExecuteCommandAsync();//删除对应分类日志 + } +} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Mqtt/Dto/MqttInput.cs similarity index 92% rename from api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttInput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Mqtt/Dto/MqttInput.cs index b6a82b4c50bd283d4ac4e0ed368a710b2848f428..328cfc70941f7892f19503e099f880fc4424db3a 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Mqtt/Dto/MqttInput.cs @@ -1,4 +1,4 @@ -namespace SimpleAdmin.Plugin.Mqtt; +namespace SimpleAdmin.System; /// /// mqtt认证参数 @@ -24,4 +24,4 @@ public class MqttAuthInput /// 客户端ID /// public string ClientId { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Mqtt/Dto/MqttOutput.cs similarity index 95% rename from api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttOutput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Mqtt/Dto/MqttOutput.cs index 962e6010cbfcefabf54979eafd0bed7cb29276e1..62b24773fdb30c806dc794955b6b3e4de7e0c65b 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Mqtt/Dto/MqttOutput.cs @@ -1,4 +1,4 @@ -namespace SimpleAdmin.Plugin.Mqtt; +namespace SimpleAdmin.System; /// /// mqtt登录参数输出 @@ -46,4 +46,4 @@ public class MqttAuthOutput /// 是否超级管理员 /// public bool Is_superuser { get; set; } = false; -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/IMqttService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Mqtt/IMqttService.cs similarity index 92% rename from api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/IMqttService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Mqtt/IMqttService.cs index aca239ef9a59d2be8ffaa56158684470f20ffb27..9aecf5fdf594967e0276373250be8cf6ce16a0d0 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/IMqttService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Mqtt/IMqttService.cs @@ -1,4 +1,4 @@ -namespace SimpleAdmin.Plugin.Mqtt; +namespace SimpleAdmin.System; /// ///Mqtt服务 @@ -18,4 +18,4 @@ public interface IMqttService : ITransient /// /// 登录参数 Task GetWebLoginParameter(); -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/MqttService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Mqtt/MqttService.cs similarity index 71% rename from api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/MqttService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Mqtt/MqttService.cs index 3828debbb32153f05e64a39d57655be691da2447..daa47883955f58bce7f3b7a6bdd9090220b42323 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/MqttService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Mqtt/MqttService.cs @@ -1,8 +1,4 @@ -using Furion.DataEncryption; -using Microsoft.AspNetCore.Http; -using SimpleTool; - -namespace SimpleAdmin.Plugin.Mqtt; +namespace SimpleAdmin.System; /// /// @@ -26,13 +22,13 @@ public class MqttService : IMqttService var user = await _sysUserService.GetUserById(UserManager.UserId);//获取用户信息 var token = JWTEncryption.GetJwtBearerToken((DefaultHttpContext)App.HttpContext);// 获取当前token //获取mqtt配置 - var mqttconfig = await _configService.GetListByCategory(CateGoryConst.Config_MQTT_BASE); + var mqttconfig = await _configService.GetConfigsByCategory(CateGoryConst.CONFIG_MQTT_BASE); //地址 - var url = mqttconfig.Where(it => it.ConfigKey == DevConfigConst.MQTT_PARAM_URL).Select(it => it.ConfigValue).FirstOrDefault(); + var url = mqttconfig.Where(it => it.ConfigKey == SysConfigConst.MQTT_PARAM_URL).Select(it => it.ConfigValue).FirstOrDefault(); //用户名 - var userName = mqttconfig.Where(it => it.ConfigKey == DevConfigConst.MQTT_PARAM_USERNAME).Select(it => it.ConfigValue).FirstOrDefault(); + var userName = mqttconfig.Where(it => it.ConfigKey == SysConfigConst.MQTT_PARAM_USERNAME).Select(it => it.ConfigValue).FirstOrDefault(); //密码 - var password = mqttconfig.Where(it => it.ConfigKey == DevConfigConst.MQTT_PARAM_PASSWORD).Select(it => it.ConfigValue).FirstOrDefault(); + var password = mqttconfig.Where(it => it.ConfigKey == SysConfigConst.MQTT_PARAM_PASSWORD).Select(it => it.ConfigValue).FirstOrDefault(); #region 用户名特殊处理 @@ -51,14 +47,15 @@ public class MqttService : IMqttService #endregion 密码特殊处理 var clientId = $"{user.Id}_{RandomHelper.CreateLetterAndNumber(5)}";//客户端ID - _simpleCacheService.Set(MqttConst.Cache_MqttClientUser + clientId, token, TimeSpan.FromMinutes(1));//将该客户端ID对应的token插入redis后面可以根据这个判断是哪个token登录的 + _simpleCacheService.Set(MqttConst.CACHE_MQTT_CLIENT_USER + clientId, token, + TimeSpan.FromMinutes(1));//将该客户端ID对应的token插入redis后面可以根据这个判断是哪个token登录的 return new MqttParameterOutput { ClientId = clientId, Password = password, Url = url, UserName = userName, - Topics = new List { MqttConst.Mqtt_TopicPrefix + user.Id }//默认监听自己 + Topics = new List { MqttConst.MQTT_TOPIC_PREFIX + user.Id }//默认监听自己 }; } @@ -67,9 +64,8 @@ public class MqttService : IMqttService { var user = await _sysUserService.GetUserByAccount(input.Username); var mqttAuthOutput = new MqttAuthOutput { Is_superuser = false, Result = "deny" }; - //获取用户token - var tokens = _simpleCacheService.HashGetOne>(CacheConst.Cache_UserToken, user.Id.ToString()); + var tokens = _simpleCacheService.HashGetOne>(CacheConst.CACHE_USER_TOKEN, user.Id.ToString()); if (tokens != null) { if (tokens.Any(it => it.Token == input.Password))//判断是否有token @@ -77,8 +73,4 @@ public class MqttService : IMqttService } return mqttAuthOutput; } - - #region 方法 - - #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Config/ConfigService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/ConfigService.cs similarity index 35% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Config/ConfigService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/ConfigService.cs index 0ca0d3b3fe7dff93d5150a3b9153f07cf49a5e01..46e0698c2a728feff9901335a81d2f9ff2779c41 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Config/ConfigService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/ConfigService.cs @@ -1,7 +1,17 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// -public class ConfigService : DbRepository, IConfigService +public class ConfigService : DbRepository, IConfigService { private readonly ISimpleCacheService _simpleCacheService; @@ -10,76 +20,113 @@ public class ConfigService : DbRepository, IConfigService _simpleCacheService = simpleCacheService; } + #region 查询 + /// - public async Task> GetListByCategory(string category) + public async Task> GetConfigsByCategory(string category) { - var key = SystemConst.Cache_DevConfig + category;//系统配置key + var key = SystemConst.CACHE_DEV_CONFIG + category;//系统配置key //先从redis拿配置 - var configList = _simpleCacheService.Get>(key); - if (configList == null) + var configList = _simpleCacheService.HashGetAll(key).Values.ToList(); + if (configList.Count == 0) { //redis没有再去数据可拿 - configList = await GetListAsync(it => it.Category == category);//获取系统配置列表 - if (configList.Count > 0) + var configs = await GetListAsync(it => it.Category == category);//获取系统配置列表 + if (configs.Count > 0) { - _simpleCacheService.Set(key, configList);//如果不为空,插入redis + configList = configs; + _simpleCacheService.HashSet(key, configList.ToDictionary(it => it.ConfigKey));//如果不为空,插入redis } } - return configList; + return configList.ToList(); } /// - public async Task GetByConfigKey(string category, string configKey) + public async Task> GetSysConfigList() { - var configList = await GetListByCategory(category);//获取系统配置列表 - var configValue = configList.Where(it => it.ConfigKey == configKey).FirstOrDefault();//根据configkey获取对应值 - return configValue; + //这里不返回系统配置 + return await GetListAsync(it => it.Category != CateGoryConst.CONFIG_BIZ_DEFINE); } /// - public async Task> Page(ConfigPageInput input) + public async Task GetByConfigKey(string category, string configKey) { - var query = Context.Queryable() - .Where(it => it.Category == CateGoryConst.Config_BIZ_DEFINE)//自定义配置 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.ConfigKey.Contains(input.SearchKey) || it.ConfigKey.Contains(input.SearchKey))//根据关键字查询 + var key = SystemConst.CACHE_DEV_CONFIG + category;//系统配置key + //先从redis拿配置 + var config = _simpleCacheService.HashGetOne(key, configKey); + if (config == null) + { + //redis没有再去数据可拿 + config = await GetFirstAsync(it => it.Category == category && it.ConfigKey == configKey);//获取系统配置 + if (config != null) + { + await GetConfigsByCategory(category);//获取全部字典,并插入redis + } + } + return config; + } + + /// + public async Task> Page(ConfigPageInput input) + { + var query = Context.Queryable().Where(it => it.Category == CateGoryConst.CONFIG_BIZ_DEFINE)//自定义配置 + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), + it => it.ConfigKey.Contains(input.SearchKey) || it.ConfigValue.Contains(input.SearchKey))//根据关键字查询 .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}")//排序 - .OrderBy(it => it.SortCode); - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + .OrderBy(it => it.SortCode) + .OrderBy(it => it.CreateTime);//排序 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } + /// + public async Task GetIco() + { + var config = await GetByConfigKey(CateGoryConst.CONFIG_SYS_BASE, SysConfigConst.SYS_ICO);//获取系统配置 ico + var icoBase64 = config.ConfigValue.Split(",")[1];//获取ico的base64 + //转为byte数组 + var bytes = Convert.FromBase64String(icoBase64); + //将byte数组转为流 + var stream = new MemoryStream(bytes); + return new FileStreamResult(stream, "image/x-icon"); + } + + /// + public async Task IsTenant() + { + var tenantOption = await GetByConfigKey(CateGoryConst.CONFIG_SYS_BASE, SysConfigConst.SYS_TENANT_OPTIONS); + var isTenant = tenantOption.ConfigValue != SysDictConst.TENANT_OPTIONS_CLOSE;//是否开启多租户 + return isTenant; + } + + #endregion + + #region 添加 + /// public async Task Add(ConfigAddInput input) { await CheckInput(input); - var devConfig = input.Adapt();//实体转换 + var devConfig = input.Adapt();//实体转换 if (await InsertAsync(devConfig))//插入数据) - await RefreshCache(CateGoryConst.Config_BIZ_DEFINE);//刷新缓存 + await RefreshCache(CateGoryConst.CONFIG_BIZ_DEFINE);//刷新缓存 } + #endregion + + #region 编辑 + /// public async Task Edit(ConfigEditInput input) { await CheckInput(input); - var devConfig = input.Adapt();//实体转换 + var devConfig = input.Adapt();//实体转换 if (await UpdateAsync(devConfig))//更新数据 - await RefreshCache(CateGoryConst.Config_BIZ_DEFINE);//刷新缓存 + await RefreshCache(CateGoryConst.CONFIG_BIZ_DEFINE);//刷新缓存 } /// - public async Task Delete(ConfigDeleteInput input) - { - //获取所有业务配置 - var configs = await GetListByCategory(CateGoryConst.Config_BIZ_DEFINE); - if (configs.Any(it => it.Id == input.Id))//如果有当前配置 - { - if (await DeleteByIdAsync(input.Id))//删除配置 - await RefreshCache(CateGoryConst.Config_BIZ_DEFINE);//刷新缓存 - } - } - - /// - public async Task EditBatch(List devConfigs) + public async Task EditBatch(List devConfigs) { if (devConfigs.Count > 0) { @@ -88,7 +135,7 @@ public class ConfigService : DbRepository, IConfigService //遍历分组 foreach (var item in configGroups) { - var configList = await GetListByCategory(item.Key);//获取系统配置列表 + var configList = await GetConfigsByCategory(item.Key);//获取系统配置 var configs = item.ToList();//获取分组完的配置列表 var keys = configs.Select(it => it.ConfigKey).ToList();//获取key列表 configList = configList.Where(it => keys.Contains(it.ConfigKey)).ToList();//获取要修改的列表 @@ -105,6 +152,26 @@ public class ConfigService : DbRepository, IConfigService } } + #endregion + + #region 删除 + + /// + public async Task Delete(ConfigDeleteInput input) + { + //获取所有业务配置 + var configs = await GetConfigsByCategory(CateGoryConst.CONFIG_BIZ_DEFINE); + if (configs.Any(it => it.Id == input.Id))//如果有当前配置 + { + if (await DeleteByIdAsync(input.Id))//删除配置 + await RefreshCache(CateGoryConst.CONFIG_BIZ_DEFINE);//刷新缓存 + } + } + + #endregion + + + #region 方法 /// @@ -114,26 +181,26 @@ public class ConfigService : DbRepository, IConfigService /// private async Task RefreshCache(string category) { - _simpleCacheService.Remove(SystemConst.Cache_DevConfig + category);//redis删除 - await GetListByCategory(category);//重新获取 + _simpleCacheService.Remove(SystemConst.CACHE_DEV_CONFIG + category);//redis删除 + await GetConfigsByCategory(category);//重新获取 } /// /// 检查输入参数 /// - /// - private async Task CheckInput(DevConfig devConfig) + /// + private async Task CheckInput(SysConfig sysConfig) { - var configs = await GetListByCategory(CateGoryConst.Config_BIZ_DEFINE);//获取全部字典 + var configs = await GetConfigsByCategory(CateGoryConst.CONFIG_BIZ_DEFINE);//获取全部字典 //判断是否从存在重复字典名 - var hasSameKey = configs.Any(it => it.ConfigKey == devConfig.ConfigKey && it.Id != devConfig.Id); + var hasSameKey = configs.Any(it => it.ConfigKey == sysConfig.ConfigKey && it.Id != sysConfig.Id); if (hasSameKey) { - throw Oops.Bah($"存在重复的配置键:{devConfig.ConfigKey}"); + throw Oops.Bah($"存在重复的配置键:{sysConfig.ConfigKey}"); } //设置分类为业务 - devConfig.Category = CateGoryConst.Config_BIZ_DEFINE; + sysConfig.Category = CateGoryConst.CONFIG_BIZ_DEFINE; } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Config/Dto/ConfigInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/Dto/ConfigInput.cs similarity index 52% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Config/Dto/ConfigInput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/Dto/ConfigInput.cs index 32cd0552672037bf6f83ff89957fa1fa6542a7eb..42a02dbce5e8776e32867b101f85da3751bd7738 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Config/Dto/ConfigInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/Dto/ConfigInput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 配置分页参数 @@ -10,7 +20,7 @@ public class ConfigPageInput : BasePageInput /// /// 添加配置参数 /// -public class ConfigAddInput : DevConfig +public class ConfigAddInput : SysConfig { /// /// 配置键 @@ -41,7 +51,6 @@ public class ConfigEditInput : ConfigAddInput /// /// 删除配置参数 /// - public class ConfigDeleteInput : BaseIdInput { } @@ -56,5 +65,5 @@ public class ConfigEditBatchInput /// public string CateGory { get; set; } - public List DevConfigs { get; set; } -} \ No newline at end of file + public List DevConfigs { get; set; } +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Config/IConfigService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/IConfigService.cs similarity index 46% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Config/IConfigService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/IConfigService.cs index 16a36939e1086c4f41bce3c0c1407cc6864b2c56..a629fe876e0846733747168e649022a29cd351a8 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Config/IConfigService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/IConfigService.cs @@ -1,23 +1,72 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 系统配置服务 /// public interface IConfigService : ITransient { + #region 查询 + /// - /// 新增配置 + /// 根据分类和配置键获配置 + /// + /// 分类 + /// 配置键 + /// 配置信息 + Task GetByConfigKey(string category, string configKey); + + /// + /// 根据分类获取配置列表 + /// + /// 分类名称 + /// 配置列表 + Task> GetConfigsByCategory(string category); + + /// + /// 分页查询其他配置 + /// + /// 查询参数 + /// 其他配置列表 + Task> Page(ConfigPageInput input); + + Task GetIco(); + + /// + /// 获取系统配置列表,不包含业务的 /// - /// 新增参数 /// - Task Add(ConfigAddInput input); + Task> GetSysConfigList(); /// - /// 删除配置 + /// 是否是多租户模式 /// - /// 删除 /// - Task Delete(ConfigDeleteInput input); + Task IsTenant(); + + #endregion + + #region 新增 + + /// + /// 新增配置 + /// + /// 新增参数 + /// + Task Add(ConfigAddInput input); + + #endregion + + #region 编辑 /// /// 修改配置 @@ -31,27 +80,18 @@ public interface IConfigService : ITransient /// /// 配置列表 /// - Task EditBatch(List devConfigs); + Task EditBatch(List devConfigs); - /// - /// 根据分类和配置键获配置 - /// - /// 分类 - /// 配置键 - /// 配置信息 - Task GetByConfigKey(string category, string configKey); + #endregion - /// - /// 根据分类获取配置列表 - /// - /// 分类名称 - /// 配置列表 - Task> GetListByCategory(string category); + #region 删除 /// - /// 分页查询其他配置 + /// 删除配置 /// - /// 查询参数 - /// 其他配置列表 - Task> Page(ConfigPageInput input); -} \ No newline at end of file + /// 删除 + /// + Task Delete(ConfigDeleteInput input); + + #endregion +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Dict/DictService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/DictService.cs similarity index 32% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Dict/DictService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/DictService.cs index 9e6bd329ba1570fd54244a168c8ce2ae41f39edb..a4ae78fdfa635f62518a02b295ec355a854add11 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Dict/DictService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/DictService.cs @@ -1,9 +1,19 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// /// -public class DictService : DbRepository, IDictService +public class DictService : DbRepository, IDictService { private readonly ISimpleCacheService _simpleCacheService; @@ -13,15 +23,16 @@ public class DictService : DbRepository, IDictService } /// - public async Task> Page(DictPageInput input) + public async Task> Page(DictPageInput input) { - var query = Context.Queryable() - .WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category)//根据分类查询 - .WhereIF(input.ParentId != null, it => it.ParentId == input.ParentId || it.Id == input.ParentId)//根据父ID查询 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.DictLabel.Contains(input.SearchKey) || it.DictValue.Contains(input.SearchKey))//根据关键字查询 + var query = Context.Queryable().Where(it => it.Category == input.Category)//根据分类查询 + .Where(it => it.ParentId == input.ParentId)//根据父ID查询 + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), + it => it.DictLabel.Contains(input.SearchKey) || it.DictValue.Contains(input.SearchKey))//根据关键字查询 .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}") - .OrderBy(it => it.SortCode);//排序 - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + .OrderBy(it => it.SortCode)//排序 + .OrderBy(it => it.CreateTime);//排序 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } @@ -29,7 +40,7 @@ public class DictService : DbRepository, IDictService public async Task Add(DictAddInput input) { await CheckInput(input);//检查参数 - var devDict = input.Adapt();//实体转换 + var devDict = input.Adapt();//实体转换 if (await InsertAsync(devDict))//插入数据 await RefreshCache();//刷新缓存 } @@ -38,7 +49,7 @@ public class DictService : DbRepository, IDictService public async Task Edit(DictAddInput input) { await CheckInput(input);//检查参数 - var devDict = input.Adapt();//实体转换 + var devDict = input.Adapt();//实体转换 if (await UpdateAsync(devDict))//更新数据 await RefreshCache();//刷新缓存 } @@ -46,88 +57,114 @@ public class DictService : DbRepository, IDictService /// public async Task Delete(DictDeleteInput input) { - //获取所有字典 - var dicts = await GetListAsync(); - //获取当前字典分类 - var category = dicts.Where(it => it.Id == input.Id).Select(it => it.Category).FirstOrDefault(); - //如果是系统字典提示不可删除 - //if (category == CateGoryConst.Dict_FRM) throw Oops.Bah("不可删除系统内置字典"); - //获取子节点 - var childens = GetDevDictChilden(dicts, input.Id); - //提取ID - var ids = childens.Select(it => it.Id).ToList(); - ids.Add(input.Id);//加上自己的 - //删除数据 - if (await DeleteByIdsAsync(ids.Cast().ToArray())) - await RefreshCache();//刷新缓存 + //获取所有ID + var ids = input.Ids; + if (ids.Count > 0) + { + //获取所有字典 + var dictList = await GetListAsync(); + //判断是否有系统字典 + var frm = dictList.Any(it => ids.Contains(it.Id) && it.Category == CateGoryConst.DICT_FRM); + + //如果是系统字典提示不可删除 + if (frm) throw Oops.Bah("不可删除系统内置字典"); + var deleteIds = new List();//要删除的id列表 + deleteIds.AddRange(ids);// + ids.ForEach(it => + { + //获取子节点 + var children = GetDevDictChildren(dictList, it); + //提取ID + var childrenIds = children.Select(c => c.Id).ToList(); + deleteIds.AddRange(childrenIds); + }); + //删除数据 + if (await DeleteByIdsAsync(deleteIds.Cast().ToArray())) + await RefreshCache();//刷新缓存 + } } - /// - public override async Task> GetListAsync() + /// + /// 获取全部 + /// + /// + public override async Task> GetListAsync() { //先从redis拿 - var devDicts = _simpleCacheService.Get>(SystemConst.Cache_DevDict); - if (devDicts == null) + var sysDictList = _simpleCacheService.Get>(SystemConst.CACHE_DEV_DICT); + if (sysDictList == null) { - devDicts = await base.GetListAsync();//去数据库拿 - if (devDicts.Count > 0) + sysDictList = await base.GetListAsync();//去数据库拿 + if (sysDictList.Count > 0) { - _simpleCacheService.Set(SystemConst.Cache_DevDict, devDicts);//如果数据库有数,更新redis - return devDicts; + _simpleCacheService.Set(SystemConst.CACHE_DEV_DICT, sysDictList);//如果数据库有数,更新redis + return sysDictList; } } - return devDicts; + return sysDictList; } /// - public async Task GetDict(string DictValue) + public async Task GetDict(string dictValue) { - var devDicts = await GetListAsync(); - var devDict = devDicts.Where(it => it.DictValue == DictValue).FirstOrDefault(); + var sysDictList = await GetListAsync(); + var devDict = sysDictList.Where(it => it.DictValue == dictValue).FirstOrDefault(); return devDict; } /// - public async Task> GetValuesByDictValue(string DictValue, List devDictList = null) + public async Task> GetChildrenByDictValue(string dictValue) { - var devDicts = devDictList == null ? await GetListAsync() : devDictList;//获取全部 - var id = devDicts.Where(it => it.DictValue == DictValue).Select(it => it.Id).FirstOrDefault();//根据value找到父节点 + var sysDictList = await GetListAsync(); + var devDict = sysDictList.Where(it => it.DictValue == dictValue).FirstOrDefault(); + if (devDict != null) + { + var children = GetDevDictChildren(sysDictList, devDict.Id); + return children; + } + return new List(); + } + + /// + public async Task> GetValuesByDictValue(string dictValue, List devDictList = null) + { + var sysDictList = devDictList == null ? await GetListAsync() : devDictList;//获取全部 + var id = sysDictList.Where(it => it.DictValue == dictValue).Select(it => it.Id).FirstOrDefault();//根据value找到父节点 if (id > 0) - return devDicts.Where(it => it.ParentId == id).Select(it => it.DictValue).ToList();//拿到字典值 - else - return new List(); + return sysDictList.Where(it => it.ParentId == id).Select(it => it.DictValue).ToList();//拿到字典值 + return new List(); } /// - public async Task>> GetValuesByDictValue(string[] DictValues) + public async Task>> GetValuesByDictValue(string[] dictValues) { - Dictionary> result = new Dictionary>(); - var devDicts = await GetListAsync();//获取全部 - var ids = devDicts.Where(it => DictValues.Contains(it.DictValue)).Select(it => it.Id).ToList();//根据value找到父节点 - foreach (var dictValue in DictValues) + var result = new Dictionary>(); + var sysDictList = await GetListAsync();//获取全部 + foreach (var dictValue in dictValues) { - var data = await GetValuesByDictValue(dictValue, devDicts); + var data = await GetValuesByDictValue(dictValue, sysDictList); result.Add(dictValue, data); } return result; } /// - public async Task> Tree(DictTreeInput input) + public async Task> Tree(DictTreeInput input) { - var devDicts = await GetListAsync();//获取字典列表 - var devList = devDicts.WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category).OrderBy(it => it.SortCode).ToList(); + var sysDictList = await GetListAsync();//获取字典列表 + var devList = sysDictList.WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category).OrderBy(it => it.SortCode) + .ToList(); return ConstructResourceTrees(devList); } /// - public List ConstructResourceTrees(List dictList, long parentId = 0) + public List ConstructResourceTrees(List dictList, long parentId = 0) { //找下级字典ID列表 var resources = dictList.Where(it => it.ParentId == parentId).OrderBy(it => it.SortCode).ToList(); if (resources.Count > 0)//如果数量大于0 { - var data = new List(); + var data = new List(); foreach (var item in resources)//遍历字典 { item.Children = ConstructResourceTrees(dictList, item.Id);//添加子节点 @@ -135,7 +172,7 @@ public class DictService : DbRepository, IDictService } return data;//返回结果 } - return new List(); + return new List(); } #region 方法 @@ -145,28 +182,29 @@ public class DictService : DbRepository, IDictService /// private async Task RefreshCache() { - _simpleCacheService.Remove(SystemConst.Cache_DevDict); + _simpleCacheService.Remove(SystemConst.CACHE_DEV_DICT); await GetListAsync(); } /// /// 检查输入参数 /// - /// - private async Task CheckInput(DevDict devDict) + /// + private async Task CheckInput(SysDict sysDict) { - var dicts = await GetListAsync();//获取全部字典 + var dictList = await GetListAsync();//获取全部字典 //判断是否从存在重复字典名 - var hasSameLable = dicts.Any(it => it.ParentId == devDict.ParentId && it.Category == devDict.Category && it.DictLabel == devDict.DictLabel && it.Id != devDict.Id); - if (hasSameLable) + var hasSameLabel = dictList.Any(it => + it.ParentId == sysDict.ParentId && it.Category == sysDict.Category && it.DictLabel == sysDict.DictLabel && it.Id != sysDict.Id); + if (hasSameLabel) { - throw Oops.Bah($"存在重复的字典名称:{devDict.DictLabel}"); + throw Oops.Bah($"存在重复的字典名称:{sysDict.DictLabel}"); } //判断是否存在重复字典值 - var hasSameValue = dicts.Any(it => it.ParentId == devDict.ParentId && it.DictValue == devDict.DictValue && it.Id != devDict.Id); + var hasSameValue = dictList.Any(it => it.ParentId == sysDict.ParentId && it.DictValue == sysDict.DictValue && it.Id != sysDict.Id); if (hasSameValue) { - throw Oops.Bah($"存在重复的字典值:{devDict.DictValue}"); + throw Oops.Bah($"存在重复的字典值:{sysDict.DictValue}"); } } @@ -176,23 +214,23 @@ public class DictService : DbRepository, IDictService /// 字典列表 /// 父ID /// - public List GetDevDictChilden(List dictList, long parentId) + public List GetDevDictChildren(List dictList, long parentId) { //找下级ID列表 - var resources = dictList.Where(it => it.ParentId == parentId).ToList(); - if (resources.Count > 0)//如果数量大于0 + var dicts = dictList.Where(it => it.ParentId == parentId).ToList(); + if (dicts.Count > 0)//如果数量大于0 { - var data = new List(); - foreach (var item in resources)//遍历机构 + var data = new List(); + foreach (var item in dicts)//遍历机构 { - var orgs = GetDevDictChilden(dictList, item.Id); - data.AddRange(orgs);//添加子节点); + var devDictChildren = GetDevDictChildren(dictList, item.Id); + data.AddRange(devDictChildren);//添加子节点); data.Add(item);////添加到列表 } return data;//返回结果 } - return new List(); + return new List(); } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Dict/Dto/DictInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/Dto/DictInput.cs similarity index 54% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Dict/Dto/DictInput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/Dto/DictInput.cs index d2afbff13f01b84cdf700e59f6c1c20a04b0aa03..089f3f495097b0f6c52bb91bfbaa24635d87fd68 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Dict/Dto/DictInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/Dto/DictInput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 字典查询参数 @@ -26,18 +36,18 @@ public class DictPageInput : BasePageInput /// /// 父id /// - public long? ParentId { get; set; } + public long ParentId { get; set; } /// /// 分类 /// - public string Category { get; set; } + public string Category { get; set; } = SysDictConst.DICT_CATEGORY_FRM; } /// /// 添加字典参数 /// -public class DictAddInput : DevDict +public class DictAddInput : SysDict { /// /// 父ID @@ -73,6 +83,6 @@ public class DictEditInput : DictAddInput /// /// 删除字典参数 /// -public class DictDeleteInput : BaseIdInput +public class DictDeleteInput : BaseIdListInput { -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Dict/IDictService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/IDictService.cs similarity index 52% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Dict/IDictService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/IDictService.cs index 8a337bfbe2b1a3bc302a1999171f67756422cf5b..6ba922b786e2637c1f59b5559db5de9d9879c22d 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Dict/IDictService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/IDictService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 字典服务 @@ -18,7 +28,7 @@ public interface IDictService : ITransient /// 字典列表 /// 父ID /// 字典树形结构 - List ConstructResourceTrees(List dictList, long parentId = 0); + List ConstructResourceTrees(List dictList, long parentId = 0); /// /// 删除字典 @@ -37,42 +47,49 @@ public interface IDictService : ITransient /// /// 获取字典 /// - /// 字典 + /// 字典 /// - Task GetDict(string DictValue); + Task GetDict(string dictValue); /// /// 获取所有 /// /// 字典列表 - Task> GetListAsync(); + Task> GetListAsync(); /// /// 根据字典DictValue获取字典值列表 /// - /// 字典值 + /// 字典值 /// 字典列表 /// 字典值列表 - Task> GetValuesByDictValue(string DictValue, List devDictList = null); + Task> GetValuesByDictValue(string dictValue, List devDictList = null); /// /// 根据字典DictValue列表获取对应字典值列表 /// - /// 字典值列表 + /// 字典值列表 /// - Task>> GetValuesByDictValue(string[] DictValues); + Task>> GetValuesByDictValue(string[] dictValues); /// /// 字典分页查询 /// /// 查询参数 /// 字典分页列表 - Task> Page(DictPageInput input); + Task> Page(DictPageInput input); /// /// 获取字典树形结构 /// /// 查询参数 /// 字典树形结构 - Task> Tree(DictTreeInput input); -} \ No newline at end of file + Task> Tree(DictTreeInput input); + + /// + /// 根据字典值获取子级字典 + /// + /// 字典值 + /// + Task> GetChildrenByDictValue(string dictValue); +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/Dto/SysOrgInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/Dto/SysOrgInput.cs similarity index 63% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/Dto/SysOrgInput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/Dto/SysOrgInput.cs index 7df2175ba6ef53466dacb5637235d3f00beaa521..7ac2b301b37ea1bec60ac47d75cb9bc18fe48bdc 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/Dto/SysOrgInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/Dto/SysOrgInput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 组织分页查询参数 @@ -11,9 +21,24 @@ public class SysOrgPageInput : BasePageInput public long ParentId { get; set; } /// - /// 机构列表 + /// 名称 /// - public List OrgIds { get; set; } + public string Name { get; set; } + + /// + /// 编码 + /// + public string Code { get; set; } + + /// + /// 分类 + /// + public string Category { get; set; } + + /// + /// 状态 + /// + public string Status { get; set; } } /// @@ -55,6 +80,11 @@ public class SysOrgCopyInput /// 是否包含下级 /// public bool ContainsChild { get; set; } = false; + + /// + /// 是否包含职位 + /// + public bool ContainsPosition { get; set; } = false; } /// @@ -107,4 +137,4 @@ public class SysOrgTreeInput /// 父Id /// public long? ParentId { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/Dto/SysOrgOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/Dto/SysOrgOutput.cs new file mode 100644 index 0000000000000000000000000000000000000000..cfde937b2177320a060cf6539690df5ed58f58e5 --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/Dto/SysOrgOutput.cs @@ -0,0 +1,14 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + + + + + diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/ISysOrgService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/ISysOrgService.cs similarity index 64% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/ISysOrgService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/ISysOrgService.cs index 01016486bcb0a34e0bc3aacbba26836603b66fc0..be05e096f988049158a7550bf37c97c8e602c439 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/ISysOrgService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/ISysOrgService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 组织架构服务 @@ -10,12 +20,12 @@ public interface ISysOrgService : ITransient /// /// 检查组织是否存在 /// - /// 组织列表 + /// 组织列表 /// 组织名称 /// 父Id /// 组织Id /// 是否存在,存在返回组织ID - bool IsExistOrgByName(List sysOrgs, string orgName, long parentId, + bool IsExistOrgByName(List sysOrgList, string orgName, long parentId, out long orgId); /// @@ -30,22 +40,26 @@ public interface ISysOrgService : ITransient /// /// 组织ID /// 是否包含自己 + /// 组织列表 /// - Task> GetChildListById(long orgId, bool isContainOneself = true); + Task> GetChildListById(long orgId, bool isContainOneself = true, List sysOrgList = null); + /// /// 获取所有组织 /// - /// 组织列表 - Task> GetListAsync(); + /// 是否显示禁用的 + /// + Task> GetListAsync(bool showDisabled = true); /// /// 获取机构及下级ID列表 /// /// /// + /// 组织列表 /// - Task> GetOrgChildIds(long orgId, bool isContainOneself = true); + Task> GetOrgChildIds(long orgId, bool isContainOneself = true, List sysOrgList = null); /// /// 根据组织Id递归获取上级 @@ -77,6 +91,20 @@ public interface ISysOrgService : ITransient /// Task> GetOrgListByIdList(IdListInput input); + /// + /// 获取租户列表 + /// + /// + Task> GetTenantList(); + + /// + /// 根据组织ID获取租户ID + /// + /// 组织id + /// 租户id + /// + Task GetTenantIdByOrgId(long orgId, List sysOrgList = null); + #endregion 查询 #region 新增 @@ -87,7 +115,7 @@ public interface ISysOrgService : ITransient /// 添加参数 /// 名称 /// - Task Add(SysOrgAddInput input, string name = SimpleAdminConst.SysOrg); + Task Add(SysOrgAddInput input, string name = SystemConst.SYS_ORG); /// /// 复制组织 @@ -106,7 +134,7 @@ public interface ISysOrgService : ITransient /// 编辑参数 /// 名称 /// - Task Edit(SysOrgEditInput input, string name = SimpleAdminConst.SysOrg); + Task Edit(SysOrgEditInput input, string name = SystemConst.SYS_ORG); #endregion 编辑 @@ -118,7 +146,7 @@ public interface ISysOrgService : ITransient /// 删除参数 /// 名称 /// - Task Delete(List input, string name = SimpleAdminConst.SysOrg); + Task Delete(BaseIdListInput input, string name = SystemConst.SYS_ORG); #endregion 删除 @@ -130,7 +158,7 @@ public interface ISysOrgService : ITransient /// 组织列表 /// 父ID /// 树型结构 - List ConstrucOrgTrees(List orgList, long parentId = 0); + List ConstructOrgTrees(List orgList, long parentId = SimpleAdminConst.ZERO); /// /// 刷新缓存 @@ -147,4 +175,4 @@ public interface ISysOrgService : ITransient Task> Tree(List orgIds = null, SysOrgTreeInput treeInput = null); #endregion 其他 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/SysOrgService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/SysOrgService.cs similarity index 40% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/SysOrgService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/SysOrgService.cs index 897c015a6cd66d6a7a06804243dc15b8b97a63c9..77e92ffe7e65c4422d0af31b05e99d1cc69a458f 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/SysOrgService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/SysOrgService.cs @@ -1,35 +1,52 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using System.Diagnostics; + +namespace SimpleAdmin.System; /// public class SysOrgService : DbRepository, ISysOrgService { + private readonly ILogger _logger; private readonly ISimpleCacheService _simpleCacheService; - private readonly IImportExportService _importExportService; + private readonly IEventPublisher _eventPublisher; - public SysOrgService(ISimpleCacheService simpleCacheService, IImportExportService importExportService) + public SysOrgService(ILogger logger, ISimpleCacheService simpleCacheService, IEventPublisher eventPublisher) { + _logger = logger; _simpleCacheService = simpleCacheService; - _importExportService = importExportService; + _eventPublisher = eventPublisher; } #region 查询 /// - public override async Task> GetListAsync() + public async Task> GetListAsync(bool showDisabled = true) { - //先从Redis拿 - var sysOrgs = _simpleCacheService.Get>(SystemConst.Cache_SysOrg); - if (sysOrgs == null) + var sysOrgList = _simpleCacheService.Get>(SystemConst.CACHE_SYS_ORG); + if (sysOrgList == null) { //redis没有就去数据库拿 - sysOrgs = await base.GetListAsync(); - if (sysOrgs.Count > 0) + sysOrgList = await base.GetListAsync(); + if (sysOrgList.Count > 0) { //插入Redis - _simpleCacheService.Set(SystemConst.Cache_SysOrg, sysOrgs); + _simpleCacheService.Set(SystemConst.CACHE_SYS_ORG, sysOrgList); } } - return sysOrgs; + if (!showDisabled) + { + sysOrgList = sysOrgList.Where(it => it.Status == CommonStatusConst.ENABLE).ToList(); + } + return sysOrgList; } /// @@ -41,30 +58,30 @@ public class SysOrgService : DbRepository, ISysOrgService } /// - public async Task> GetChildListById(long orgId, bool isContainOneself = true) + public async Task> GetChildListById(long orgId, bool isContainOneself = true, List sysOrgList = null) { //获取所有组织 - var sysOrgs = await GetListAsync(); + sysOrgList ??= await GetListAsync(); //查找下级 - var childLsit = GetSysOrgChilden(sysOrgs, orgId); + var childList = GetSysOrgChildren(sysOrgList, orgId); if (isContainOneself)//如果包含自己 { //获取自己的组织信息 - var self = sysOrgs.Where(it => it.Id == orgId).FirstOrDefault(); - if (self != null) childLsit.Insert(0, self);//如果组织不为空就插到第一个 + var self = sysOrgList.Where(it => it.Id == orgId).FirstOrDefault(); + if (self != null) childList.Insert(0, self);//如果组织不为空就插到第一个 } - return childLsit; + return childList; } /// - public async Task> GetOrgChildIds(long orgId, bool isContainOneself = true) + public async Task> GetOrgChildIds(long orgId, bool isContainOneself = true, List sysOrgList = null) { var orgIds = new List();//组织列表 - if (orgId > 0)//如果orgid有值 + if (orgId > 0)//如果orgId有值 { //获取所有子集 - var sysOrgs = await GetChildListById(orgId, isContainOneself); - orgIds = sysOrgs.Select(x => x.Id).ToList();//提取ID列表 + var childList = await GetChildListById(orgId, isContainOneself, sysOrgList); + orgIds = childList.Select(x => x.Id).ToList();//提取ID列表 } return orgIds; } @@ -73,40 +90,54 @@ public class SysOrgService : DbRepository, ISysOrgService public async Task> Page(SysOrgPageInput input) { var query = Context.Queryable() - .WhereIF(input.ParentId > 0, it => it.ParentId == input.ParentId)//父级 - .WhereIF(input.OrgIds != null, it => input.OrgIds.Contains(it.Id))//机构ID查询 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}") - .OrderBy(it => it.SortCode);//排序 - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + .WhereIF(input.ParentId > 0, + it => it.ParentId == input.ParentId || it.Id == input.ParentId || SqlFunc.JsonLike(it.ParentIdList, input.ParentId.ToString()))//父级 + .WhereIF(!string.IsNullOrEmpty(input.Name), it => it.Name.Contains(input.Name))//根据名称查询 + .WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category)//根据分类查询 + .WhereIF(!string.IsNullOrEmpty(input.Code), it => it.Code.Contains(input.Code))//根据编码查询 + .WhereIF(!string.IsNullOrEmpty(input.Status), it => it.Status == input.Status)//根据状态查询 + .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}").OrderBy(it => it.SortCode) + .OrderBy(it => it.CreateTime);//排序 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } /// public async Task> Tree(List orgIds = null, SysOrgTreeInput treeInput = null) { - long parentId = SimpleAdminConst.Zero;//父级ID + long parentId = SimpleAdminConst.ZERO;//父级ID //获取所有组织 - var sysOrgs = await GetListAsync(); + var sysOrgList = await GetListAsync(false); if (orgIds != null) - sysOrgs = GetParentListByIds(sysOrgs, orgIds);//如果组织ID不为空则获取组织ID列表的所有父节点 + sysOrgList = GetParentListByIds(sysOrgList, orgIds);//如果组织ID不为空则获取组织ID列表的所有父节点 //如果选择器ID不为空则表示是懒加载,只加载子节点 if (treeInput != null && treeInput.ParentId != null) { parentId = treeInput.ParentId.Value; - sysOrgs = GetSysOrgChildenLazy(sysOrgs, treeInput.ParentId.Value);//获取懒加载下级 + sysOrgList = GetSysOrgChildrenLazy(sysOrgList, treeInput.ParentId.Value);//获取懒加载下级 } - sysOrgs = sysOrgs.OrderBy(it => it.SortCode).ToList();//排序 + sysOrgList = sysOrgList.OrderBy(it => it.SortCode).ToList();//排序 //构建组织树 - var result = ConstrucOrgTrees(sysOrgs, parentId); + var result = ConstructOrgTrees(sysOrgList, parentId); return result; } /// public async Task Detail(BaseIdInput input) { - var sysOrgs = await GetListAsync(); - var orgDetail = sysOrgs.Where(it => it.Id == input.Id).FirstOrDefault(); + var sysOrgList = await GetListAsync(); + var orgDetail = sysOrgList.Where(it => it.Id == input.Id).FirstOrDefault(); + if (orgDetail.DirectorId != null) + { + //获取主管信息 + orgDetail.DirectorInfo = await Tenant.QueryableWithAttr().Where(it => it.Id == orgDetail.DirectorId).Select(it => + new UserSelectorOutPut + { + Id = it.Id, + Name = it.Name, + Account = it.Account + }).FirstAsync(); + } return orgDetail; } @@ -114,53 +145,107 @@ public class SysOrgService : DbRepository, ISysOrgService public List GetOrgParents(List allOrgList, long orgId, bool includeSelf = true) { //找到组织 - var sysOrgs = allOrgList.Where(it => it.Id == orgId).FirstOrDefault(); - if (sysOrgs != null)//如果组织不为空 + var sysOrgList = allOrgList.Where(it => it.Id == orgId).FirstOrDefault(); + if (sysOrgList != null)//如果组织不为空 { var data = new List(); - var parents = GetOrgParents(allOrgList, sysOrgs.ParentId, includeSelf);//递归获取父节点 + var parents = GetOrgParents(allOrgList, sysOrgList.ParentId, includeSelf);//递归获取父节点 data.AddRange(parents);//添加父节点; if (includeSelf) - data.Add(sysOrgs);//添加到列表 + data.Add(sysOrgList);//添加到列表 return data;//返回结果 } return new List(); } /// - public bool IsExistOrgByName(List sysOrgs, string orgName, long parentId, + public bool IsExistOrgByName(List sysOrgList, string orgName, long parentId, out long orgId) { orgId = 0; - var sysOrg = sysOrgs.Where(it => it.ParentId == parentId && it.Name == orgName).FirstOrDefault(); + var sysOrg = sysOrgList.Where(it => it.ParentId == parentId && it.Name == orgName).FirstOrDefault(); if (sysOrg != null) { orgId = sysOrg.Id; return true; } - else - return false; + return false; } - /// public async Task> GetOrgListByIdList(IdListInput input) { - var sysOrgs = await GetListAsync(); - var orgList = sysOrgs.Where(it => input.IdList.Contains(it.Id)).ToList();// 获取指定ID的岗位列表 + var sysOrgList = await GetListAsync(); + var orgList = sysOrgList.Where(it => input.IdList.Contains(it.Id)).ToList();// 获取指定ID的组织列表 return orgList; } + + /// + public async Task> GetTenantList() + { + var tenantList = _simpleCacheService.Get>(SystemConst.CACHE_SYS_TENANT); + if (tenantList == null) + { + var orgList = await GetListAsync(false); + tenantList = orgList.Where(it => it.Category == CateGoryConst.ORG_COMPANY).ToList(); + if (tenantList.Count > 0) + { + //插入Redis + _simpleCacheService.Set(SystemConst.CACHE_SYS_TENANT, tenantList); + } + } + return tenantList; + } + + /// + public async Task GetTenantIdByOrgId(long orgId, List sysOrgList = null) + { + //先从缓存拿租户Id + var tenantId = _simpleCacheService.HashGetOne(SystemConst.CACHE_SYS_ORG_TENANT, orgId.ToString()); + if (tenantId == null) + { + //获取所有组织 + sysOrgList ??= await GetListAsync(); + var userOrg = sysOrgList.FirstOrDefault(it => it.Id == orgId); + if (userOrg != null) + { + //如果是公司直接返回 + if (userOrg.Category == CateGoryConst.ORG_COMPANY) + { + tenantId = userOrg.Id; + } + else + { + var parentIds = userOrg.ParentIdList;//获取父级ID列表 + //从最后一个往前遍历,取第一个公司ID为租户ID + for (var i = parentIds.Count - 1; i >= 0; i--) + { + var parentId = parentIds[i]; + var org = sysOrgList.FirstOrDefault(it => it.Id == parentId); + if (org.Category == CateGoryConst.ORG_COMPANY) + { + tenantId = org.Id;//租户ID + break; + } + } + } + if (tenantId != null) + _simpleCacheService.HashAdd(SystemConst.CACHE_SYS_ORG_TENANT, orgId.ToString(), tenantId);//插入缓存 + } + } + return tenantId; + } + #endregion 查询 #region 新增 /// - public async Task Add(SysOrgAddInput input, string name = SimpleAdminConst.SysOrg) + public async Task Add(SysOrgAddInput input, string name = SystemConst.SYS_ORG) { await CheckInput(input, name);//检查参数 var sysOrg = input.Adapt();//实体转换 - sysOrg.Code = RandomHelper.CreateRandomString(10);//赋值Code if (await InsertAsync(sysOrg))//插入数据 await RefreshCache();//刷新缓存 } @@ -169,15 +254,17 @@ public class SysOrgService : DbRepository, ISysOrgService public async Task Copy(SysOrgCopyInput input) { var orgList = await GetListAsync();//获取所有 + var positionList = await Context.Queryable().ToListAsync();//获取所有职位 var ids = new HashSet();//定义不重复Id集合 var addOrgList = new List();//添加机构列表 + var addPositionList = new List();//添加职位列表 var alreadyIds = new HashSet();//定义已经复制过得组织Id ids.AddRange(input.Ids);//加到集合 if (ids.Contains(input.TargetId)) - throw Oops.Bah($"不能包含自己"); + throw Oops.Bah("不能包含自己"); //获取目标组织 var target = orgList.Where(it => it.Id == input.TargetId).FirstOrDefault(); - if (target != null || input.TargetId == SimpleAdminConst.Zero) + if (target != null) { //需要复制的组织名称列表 var orgNames = orgList.Where(it => ids.Contains(it.Id)).Select(it => it.Name).ToList(); @@ -187,35 +274,73 @@ public class SysOrgService : DbRepository, ISysOrgService { if (targetChildNames.Contains(it)) throw Oops.Bah($"已存在{it}"); }); - foreach (var id in input.Ids) { - var org = orgList.Where(o => o.Id == id).FirstOrDefault();//获取下级 + var org = orgList.Where(o => o.Id == id).FirstOrDefault();//获取组织 if (org != null && !alreadyIds.Contains(id)) { alreadyIds.Add(id);//添加到已复制列表 RedirectOrg(org);//生成新的实体 org.ParentId = input.TargetId;//父id为目标Id addOrgList.Add(org); + //是否包含职位 + if (input.ContainsPosition) + { + var positions = positionList.Where(p => p.OrgId == id).ToList();//获取机构下的职位 + positions.ForEach(p => + { + p.OrgId = org.Id;//赋值新的机构ID + p.Id = CommonUtils.GetSingleId();//生成新的ID + p.Code = RandomHelper.CreateRandomString(10);//生成新的Code + addPositionList.Add(p);//添加到职位列表 + }); + } //是否包含下级 if (input.ContainsChild) { var childIds = await GetOrgChildIds(id, false);//获取下级id列表 alreadyIds.AddRange(childIds);//添加到已复制id var childList = orgList.Where(c => childIds.Contains(c.Id)).ToList();//获取下级 - var addOrgs = CopySysOrgChilden(childList, id, org.Id);//赋值下级组织 - addOrgList.AddRange(addOrgs); + var sysOrgChildren = CopySysOrgChildren(childList, id, org.Id, input.ContainsPosition, + positionList);//赋值下级组织 + addOrgList.AddRange(sysOrgChildren.Item1);//添加到组织列表 + addPositionList.AddRange(sysOrgChildren.Item2);//添加到职位列表 } } } - //遍历机构重新赋值全称 + orgList.AddRange(addOrgList);//要添加的组织添加到组织列表 + //遍历机构重新赋值全称和父Id列表 addOrgList.ForEach(it => { - it.Names = it.ParentId == SimpleAdminConst.Zero ? it.Name : GetNames(orgList, it.ParentId, it.Name); + it.Names = it.Name; + if (it.ParentId != SimpleAdminConst.ZERO) + { + GetNames(orgList, it.ParentId, it.Name, out var names, + out var parentIdList); + it.Names = names; + it.ParentIdList = parentIdList; + } }); - if (await InsertRangeAsync(addOrgList))//插入数据 + //事务 + var result = await Tenant.UseTranAsync(async () => + { + await InsertRangeAsync(addOrgList);//插入组织 + if (addPositionList.Count > 0) + { + await Context.Insertable(addPositionList).ExecuteCommandAsync(); + } + }); + if (result.IsSuccess)//如果成功了 + { await RefreshCache();//刷新缓存 + if (addPositionList.Count > 0) _simpleCacheService.Remove(SystemConst.CACHE_SYS_POSITION);//删除机构缓存 + } + else + { + _logger.LogError(result.ErrorException, result.ErrorMessage); + throw Oops.Oh($"复制失败"); + } } } @@ -224,12 +349,20 @@ public class SysOrgService : DbRepository, ISysOrgService #region 编辑 /// - public async Task Edit(SysOrgEditInput input, string name = SimpleAdminConst.SysOrg) + public async Task Edit(SysOrgEditInput input, string name = SystemConst.SYS_ORG) { await CheckInput(input, name);//检查参数 var sysOrg = input.Adapt();//实体转换 if (await UpdateAsync(sysOrg))//更新数据 + { + //如果状态为禁用 + if (sysOrg.Status == CommonStatusConst.DISABLED) + { + var orgIds = await GetOrgChildIds(sysOrg.Id, true);//获取所有下级 + await _eventPublisher.PublishAsync(EventSubscriberConst.CLEAR_ORG_TOKEN, orgIds);//清除角色下用户缓存 + } await RefreshCache();//刷新缓存 + } } #endregion 编辑 @@ -237,18 +370,18 @@ public class SysOrgService : DbRepository, ISysOrgService #region 删除 /// - public async Task Delete(List input, string name = SimpleAdminConst.SysOrg) + public async Task Delete(BaseIdListInput input, string name = SystemConst.SYS_ORG) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; if (ids.Count > 0) { - var sysOrgs = await GetListAsync();//获取所有组织 + var sysOrgList = await GetListAsync();//获取所有组织 var sysDeleteOrgList = new List();//需要删除的组织ID集合 ids.ForEach(it => { - var childen = GetSysOrgChilden(sysOrgs, it);//查找下级组织 - sysDeleteOrgList.AddRange(childen.Select(it => it.Id).ToList()); + var children = GetSysOrgChildren(sysOrgList, it);//查找下级组织 + sysDeleteOrgList.AddRange(children.Select(it => it.Id).ToList()); sysDeleteOrgList.Add(it); }); //如果组织下有用户则不能删除 @@ -256,23 +389,6 @@ public class SysOrgService : DbRepository, ISysOrgService { throw Oops.Bah($"请先删除{name}下的用户"); } - //获取用户表有兼任组织的信息,oracle要改成Context.Queryable().Where(it => SqlFunc.Length(it.PositionJson) > 0).Select(it => it.PositionJson).ToListAsync(); - var positionJsons = await Context.Queryable().Where(it => !SqlFunc.IsNullOrEmpty(it.PositionJson)).Select(it => it.PositionJson).ToListAsync(); - if (positionJsons.Count > 0) - { - //去一次空 - positionJsons.Where(it => it != null).ToList().ForEach(it => - { - //获取组织列表 - var orgIds = it.Select(it => it.OrgId).ToList(); - //获取交集 - var sameOrgIds = sysDeleteOrgList.Intersect(orgIds).ToList(); - if (sameOrgIds.Count > 0) - { - throw Oops.Bah($"请先删除{name}下的兼任用户"); - } - }); - } //判断组织下是否有角色 var hasRole = await Context.Queryable().Where(it => sysDeleteOrgList.Contains(it.OrgId.Value)).CountAsync() > 0; if (hasRole) throw Oops.Bah($"请先删除{name}下的角色"); @@ -292,22 +408,23 @@ public class SysOrgService : DbRepository, ISysOrgService /// public async Task RefreshCache() { - _simpleCacheService.Remove(SystemConst.Cache_SysOrg);//从redis删除 - _simpleCacheService.Remove(SystemConst.Cache_SysUser);//清空redis所有的用户信息 + _simpleCacheService.Remove(SystemConst.CACHE_SYS_ORG);//从redis删除 + _simpleCacheService.Remove(SystemConst.CACHE_SYS_TENANT);//从redis删除 + _simpleCacheService.Remove(SystemConst.CACHE_SYS_USER);//清空redis所有的用户信息 await GetListAsync();//刷新缓存 } /// - public List ConstrucOrgTrees(List orgList, long parentId = 0) + public List ConstructOrgTrees(List orgList, long parentId = SimpleAdminConst.ZERO) { - //找下级字典ID列表 - var orgs = orgList.Where(it => it.ParentId == parentId).OrderBy(it => it.SortCode).ToList(); - if (orgs.Count > 0)//如果数量大于0 + //找下级ID列表 + var orgInfos = orgList.Where(it => it.ParentId == parentId).OrderBy(it => it.SortCode).ToList(); + if (orgInfos.Count > 0)//如果数量大于0 { var data = new List(); - foreach (var item in orgs)//遍历字典 + foreach (var item in orgInfos)//遍历组织 { - item.Children = ConstrucOrgTrees(orgList, item.Id);//添加子节点 + item.Children = ConstructOrgTrees(orgList, item.Id);//添加子节点 data.Add(item);//添加到列表 } return data;//返回结果 @@ -327,17 +444,17 @@ public class SysOrgService : DbRepository, ISysOrgService private async Task CheckInput(SysOrg sysOrg, string name) { //判断分类是否正确 - if (sysOrg.Category != CateGoryConst.Org_COMPANY && sysOrg.Category != CateGoryConst.Org_DEPT) + if (sysOrg.Category != CateGoryConst.ORG_COMPANY && sysOrg.Category != CateGoryConst.ORG_DEPT) throw Oops.Bah($"{name}所属分类错误:{sysOrg.Category}"); - var sysOrgs = await GetListAsync();//获取全部 - if (sysOrgs.Any(it => it.ParentId == sysOrg.ParentId && it.Name == sysOrg.Name && it.Id != sysOrg.Id))//判断同级是否有名称重复的 + var sysOrgList = await GetListAsync();//获取全部 + if (sysOrgList.Any(it => it.ParentId == sysOrg.ParentId && it.Name == sysOrg.Name && it.Id != sysOrg.Id))//判断同级是否有名称重复的 throw Oops.Bah($"存在重复的同级{name}:{sysOrg.Name}"); sysOrg.Names = sysOrg.Name;//全称默认自己 if (sysOrg.ParentId != 0) { //获取父级,判断父级ID正不正确 - var parent = sysOrgs.Where(it => it.Id == sysOrg.ParentId).FirstOrDefault(); + var parent = sysOrgList.Where(it => it.Id == sysOrg.ParentId).FirstOrDefault(); if (parent != null) { if (parent.Id == sysOrg.Id) @@ -347,7 +464,21 @@ public class SysOrgService : DbRepository, ISysOrgService { throw Oops.Bah($"上级{name}不存在:{sysOrg.ParentId}"); } - sysOrg.Names = GetNames(sysOrgs, sysOrg.ParentId, sysOrg.Name); + GetNames(sysOrgList, sysOrg.ParentId, sysOrg.Name, out var names, + out var parentIdList); + sysOrg.Names = names; + sysOrg.ParentIdList = parentIdList; + } + //如果code没填 + if (string.IsNullOrEmpty(sysOrg.Code)) + { + sysOrg.Code = RandomHelper.CreateRandomString(10);//赋值Code + } + else + { + //判断是否有相同的Code + if (sysOrgList.Any(it => it.Code == sysOrg.Code && it.Id != sysOrg.Id)) + throw Oops.Bah($"存在重复的编码:{sysOrg.Code}"); } } @@ -359,15 +490,15 @@ public class SysOrgService : DbRepository, ISysOrgService /// public List GetParentListByIds(List allOrgList, List orgIds) { - var sysOrgs = new HashSet();//结果列表 + var sysOrgList = new HashSet();//结果列表 //遍历组织ID orgIds.ForEach(it => { //获取该组织ID的所有父级 var parents = GetOrgParents(allOrgList, it); - sysOrgs.AddRange(parents);//添加到结果 + sysOrgList.AddRange(parents);//添加到结果 }); - return sysOrgs.ToList(); + return sysOrgList.ToList(); } /// @@ -376,17 +507,17 @@ public class SysOrgService : DbRepository, ISysOrgService /// /// /// - public List GetSysOrgChilden(List orgList, long parentId) + public List GetSysOrgChildren(List orgList, long parentId) { //找下级组织ID列表 - var orgs = orgList.Where(it => it.ParentId == parentId).ToList(); - if (orgs.Count > 0)//如果数量大于0 + var orgInfos = orgList.Where(it => it.ParentId == parentId).ToList(); + if (orgInfos.Count > 0)//如果数量大于0 { var data = new List(); - foreach (var item in orgs)//遍历组织 + foreach (var item in orgInfos)//遍历组织 { - var childen = GetSysOrgChilden(orgList, item.Id);//获取子节点 - data.AddRange(childen);//添加子节点); + var children = GetSysOrgChildren(orgList, item.Id);//获取子节点 + data.AddRange(children);//添加子节点); data.Add(item);//添加到列表 } return data;//返回结果 @@ -400,22 +531,23 @@ public class SysOrgService : DbRepository, ISysOrgService /// /// /// - public List GetSysOrgChildenLazy(List orgList, long parentId) + public List GetSysOrgChildrenLazy(List orgList, long parentId) { //找下级组织ID列表 - var orgs = orgList.Where(it => it.ParentId == parentId).ToList(); - if (orgs.Count > 0)//如果数量大于0 + var orgInfos = orgList.Where(it => it.ParentId == parentId).ToList(); + if (orgInfos.Count > 0)//如果数量大于0 { var data = new List(); - foreach (var item in orgs)//遍历组织 + foreach (var item in orgInfos)//遍历组织 { - var childen = orgList.Where(it => it.ParentId == item.Id).ToList();//获取子节点 + var children = orgList.Where(it => it.ParentId == item.Id).ToList();//获取子节点 //遍历子节点 - childen.ForEach(it => + children.ForEach(it => { - if (!orgList.Any(org => org.ParentId == it.Id)) it.IsLeaf = true;//如果没有下级,则设置为叶子节点 + if (!orgList.Any(org => org.ParentId == it.Id)) + it.Leaf = true;//如果没有下级,则设置为叶子节点 }); - data.AddRange(childen);//添加子节点); + data.AddRange(children);//添加子节点); data.Add(item);//添加到列表 } return data;//返回结果 @@ -426,35 +558,54 @@ public class SysOrgService : DbRepository, ISysOrgService /// /// 赋值组织的所有下级 /// - /// 组织列表 - /// 父Id - /// 新父Id + /// 组织列表 + /// 父Id + /// 新父Id + /// + /// /// - public List CopySysOrgChilden(List orgList, long parentId, long newParentId) + public Tuple, List> CopySysOrgChildren(List orgList, long parentId, long newParentId, + bool isCopyPosition, + List positions) { //找下级组织列表 - var orgs = orgList.Where(it => it.ParentId == parentId).ToList(); - if (orgs.Count > 0)//如果数量大于0 + var orgInfos = orgList.Where(it => it.ParentId == parentId).ToList(); + if (orgInfos.Count > 0)//如果数量大于0 { - var data = new List(); - var newId = CommonUtils.GetSingleId(); - foreach (var item in orgs)//遍历组织 + var result = new Tuple, List>( + new List(), new List() + ); + foreach (var item in orgInfos)//遍历组织 { - var childen = CopySysOrgChilden(orgList, item.Id, newId);//获取子节点 - data.AddRange(childen);//添加子节点); + var oldId = item.Id;//获取旧Id RedirectOrg(item);//实体重新赋值 - item.ParentId = newParentId;//赋值父Id - data.Add(item);//添加到列表 + var children = CopySysOrgChildren(orgList, oldId, item.Id, isCopyPosition, + positions);//获取子节点 + item.ParentId = newParentId;//赋值新的父Id + result.Item1.AddRange(children.Item1);//添加下级组织; + if (isCopyPosition)//如果包含职位 + { + var positionList = positions.Where(it => it.OrgId == oldId).ToList();//获取职位列表 + positionList.ForEach(it => + { + it.OrgId = item.Id;//赋值新的机构ID + it.Id = CommonUtils.GetSingleId();//生成新的ID + it.Code = RandomHelper.CreateRandomString(10);//生成新的Code + }); + result.Item2.AddRange(positionList);//添加职位列表 + } } - return data;//返回结果 + return result;//返回结果 } - return new List(); + return new Tuple, List>( + new List(), new List() + ); } /// /// 重新生成组织实体 /// - /// + /// private void RedirectOrg(SysOrg org) { //重新生成ID并赋值 @@ -469,18 +620,24 @@ public class SysOrgService : DbRepository, ISysOrgService /// /// 获取全称 /// - /// 组织列表 + /// 组织列表 /// 父Id /// 组织名称 - public string GetNames(List sysOrgs, long parentId, string orgName) + /// 组织全称 + /// 组织父Id列表 + public void GetNames(List sysOrgList, long parentId, string orgName, + out string names, out List parentIdList) { - var names = ""; + names = ""; //获取父级菜单 - var parents = GetOrgParents(sysOrgs, parentId, true); - parents.ForEach(it => names += $"{it.Name}/");//循环加上名称 - names = names + orgName;//赋值全称 - return names; + var parents = GetOrgParents(sysOrgList, parentId); + foreach (var item in parents) + { + names += $"{item.Name}/"; + } + names += orgName;//赋值全称 + parentIdList = parents.Select(it => it.Id).ToList();//赋值父Id列表 } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/Dto/PositionInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/Dto/PositionInput.cs similarity index 53% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/Dto/PositionInput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/Dto/PositionInput.cs index 72e535669c1debad09e254636ba18fb59fc94ddf..0bbc40239183d2045e8e6d95f985beae48f32034 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/Dto/PositionInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/Dto/PositionInput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 职位分页查询 @@ -19,6 +29,11 @@ public class PositionPageInput : BasePageInput /// 分类 /// public string Category { get; set; } + + /// + /// 状态 + /// + public string Status { get; set; } } /// @@ -62,4 +77,15 @@ public class PositionEditInput : PositionAddInput /// public class PositionSelectorInput : UserSelectorInput { -} \ No newline at end of file +} + +/// +/// 机构树形选择器参数 +/// +public class PositionTreeInput +{ + /// + /// 机构ID列表 + /// + public List OrgIds { get; set; } +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/Dto/PositionOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/Dto/PositionOutput.cs new file mode 100644 index 0000000000000000000000000000000000000000..4daa99337e78240703ed9413427cd3f7a23588c2 --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/Dto/PositionOutput.cs @@ -0,0 +1,58 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; + +/// +/// 组织树输出参数 +/// +public class PositionTreeOutput +{ + /// + /// 职位Id + /// + public long Id { get; set; } + + /// + /// 名称 + /// + public string Name { get; set; } + + /// + /// 是否是职位 + /// + public bool IsPosition { get; set; } + + /// + /// 子项 + /// + public List Children { get; set; } = new List(); +} + +/// +/// 组织选择器输出参数 +/// +public class PositionSelectorOutput +{ + /// + /// 组织Id或者职位Id + /// + public long Id { get; set; } + + /// + /// 名称 + /// + public string Name { get; set; } + + /// + /// 子项 + /// + public List Children { get; set; } = new List(); +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/ISysPositionService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/ISysPositionService.cs similarity index 50% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/ISysPositionService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/ISysPositionService.cs index adb5aa332f03159e7ec8ef4e515e13d6c6d47e9f..3c5d7e0ede3ac703891b2671686f3204cf8fd5a5 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/ISysPositionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/ISysPositionService.cs @@ -1,33 +1,21 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 职位服务 /// public interface ISysPositionService : ITransient { - /// - /// 添加职位 - /// - /// 添加参数 - /// 名称 - /// - Task Add(PositionAddInput input, string name = SimpleAdminConst.SysPos); - - /// - /// 删除职位 - /// - /// id列表 - /// 名称 - /// - Task Delete(List input, string name = SimpleAdminConst.SysPos); - - /// - /// 编辑职位 - /// - /// 编辑参数 - /// 名称 - /// - Task Edit(PositionEditInput input, string name = SimpleAdminConst.SysPos); + #region 查询 /// /// 获取职位列表 @@ -54,7 +42,43 @@ public interface ISysPositionService : ITransient /// /// 查询参数 /// - Task> PositionSelector(PositionSelectorInput input); + Task> Selector(PositionSelectorInput input); + + + + /// + /// 根据id集合获取职位集合 + /// + /// + /// + Task> GetPositionListByIdList(IdListInput input); + + /// + /// 职位树形结构 + /// + /// + /// + Task> Tree(PositionTreeInput input); + + /// + /// 职位详情 + /// + /// + /// + Task Detail(BaseIdInput input); + + #endregion + + #region 编辑 + + /// + /// 编辑职位 + /// + /// 编辑参数 + /// 名称 + /// + Task Edit(PositionEditInput input, string name = SystemConst.SYS_POS); + /// /// 刷新缓存 @@ -62,10 +86,29 @@ public interface ISysPositionService : ITransient /// Task RefreshCache(); + #endregion + + #region 新增 + /// - /// 根据id集合获取职位集合 + /// 添加职位 /// - /// + /// 添加参数 + /// 名称 /// - Task> GetPositionListByIdList(IdListInput input); -} \ No newline at end of file + Task Add(PositionAddInput input, string name = SystemConst.SYS_POS); + + #endregion + + #region 删除 + + /// + /// 删除职位 + /// + /// id列表 + /// 名称 + /// + Task Delete(BaseIdListInput input, string name = SystemConst.SYS_POS); + + #endregion +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/SysPositionService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/SysPositionService.cs similarity index 34% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/SysPositionService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/SysPositionService.cs index a466a298e6619348e8a1238b3933482eaea12f6a..66cc15d143788f39831fcd0f3f0350a6e855ba39 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/SysPositionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/SysPositionService.cs @@ -1,4 +1,12 @@ -using Masuit.Tools.Models; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.System; @@ -9,18 +17,25 @@ public class SysPositionService : DbRepository, ISysPositionService { private readonly ISimpleCacheService _simpleCacheService; private readonly ISysOrgService _sysOrgService; + private readonly IDictService _dictService; - public SysPositionService(ISimpleCacheService simpleCacheService, ISysOrgService sysOrgService) + public SysPositionService(ISimpleCacheService simpleCacheService, ISysOrgService sysOrgService, IDictService dictService) { _simpleCacheService = simpleCacheService; _sysOrgService = sysOrgService; + _dictService = dictService; } - /// + #region 查询 + + /// + /// 获取全部 + /// + /// public override async Task> GetListAsync() { //先从Redis拿 - var sysPositions = _simpleCacheService.Get>(SystemConst.Cache_SysPosition); + var sysPositions = _simpleCacheService.Get>(SystemConst.CACHE_SYS_POSITION); if (sysPositions == null) { //redis没有就去数据库拿 @@ -28,7 +43,7 @@ public class SysPositionService : DbRepository, ISysPositionService if (sysPositions.Count > 0) { //插入Redis - _simpleCacheService.Set(SystemConst.Cache_SysPosition, sysPositions); + _simpleCacheService.Set(SystemConst.CACHE_SYS_POSITION, sysPositions); } } return sysPositions; @@ -42,19 +57,22 @@ public class SysPositionService : DbRepository, ISysPositionService return positionList; } - /// - public async Task> PositionSelector(PositionSelectorInput input) + public async Task> Selector(PositionSelectorInput input) { - var orgIds = await _sysOrgService.GetOrgChildIds(input.OrgId);//获取下级机构 - var positions = await GetListAsync(); - var result = positions.WhereIF(input.OrgId > 0, it => orgIds.Contains(it.OrgId))//父级 - .WhereIF(input.OrgIds != null, it => input.OrgIds.Contains(it.OrgId))//在指定机构列表查询 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 - .ToList().LinqPagedList(input.Current, input.Size); + var sysOrgList = await _sysOrgService.GetListAsync(false);//获取所有组织 + var sysPositions = await GetListAsync();//获取所有职位 + if (input.OrgIds != null)//根据数据范围查 + { + sysOrgList = sysOrgList.Where(it => input.OrgIds.Contains(it.Id)).ToList();//在指定组织列表查询 + sysPositions = sysPositions.Where(it => input.OrgIds.Contains(it.OrgId)).ToList();//在指定职位列表查询 + } + var result = await ConstructPositionSelector(sysOrgList, sysPositions);//构造树 return result; } + + /// public async Task GetSysPositionById(long id) { @@ -66,42 +84,125 @@ public class SysPositionService : DbRepository, ISysPositionService /// public async Task> Page(PositionPageInput input) { - var orgIds = await _sysOrgService.GetOrgChildIds(input.OrgId);//获取下级机构 - var query = Context.Queryable() - .WhereIF(input.OrgId > 0, it => orgIds.Contains(it.OrgId))//根据组织ID查询 - .WhereIF(input.OrgIds != null, it => input.OrgIds.Contains(it.OrgId))//在指定机构列表查询 + var orgIds = await _sysOrgService.GetOrgChildIds(input.OrgId);//获取下级组织 + var query = Context.Queryable().WhereIF(input.OrgId > 0, it => orgIds.Contains(it.OrgId))//根据组织ID查询 + .WhereIF(input.OrgIds != null, it => input.OrgIds.Contains(it.OrgId))//在指定组织列表查询 .WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category)//根据分类 + .WhereIF(!string.IsNullOrEmpty(input.Status), it => it.Status == input.Status)//根据状态 .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}") - .OrderBy(it => it.SortCode);//排序 - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + .OrderBy(it => it.SortCode)//排序 + .OrderBy(it => it.CreateTime);//排序 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } + + + /// + public async Task> Tree(PositionTreeInput input) + { + var result = new List();//返回结果 + var sysOrgList = await _sysOrgService.GetListAsync(false);//获取所有组织 + var sysPositions = await GetListAsync();//获取所有职位 + if (input.OrgIds != null)//根据数据范围查 + { + sysOrgList = sysOrgList.Where(it => input.OrgIds.Contains(it.Id)).ToList();//在指定组织列表查询 + sysPositions = sysPositions.Where(it => input.OrgIds.Contains(it.OrgId)).ToList();//在指定职位列表查询 + } + var posCategory = await _dictService.GetChildrenByDictValue(SysDictConst.POSITION_CATEGORY);//获取职位分类 + var topOrgList = sysOrgList.Where(it => it.ParentId == 0).ToList();//获取顶级组织 + //遍历顶级组织 + foreach (var org in topOrgList) + { + var childIds = await _sysOrgService.GetOrgChildIds(org.Id, true, sysOrgList);//获取组织下的所有子级ID + var orgPositions = sysPositions.Where(it => childIds.Contains(it.OrgId)).ToList();//获取组织下的职位 + if (orgPositions.Count == 0) continue; + var positionTreeOutput = new PositionTreeOutput + { + Id = org.Id, + Name = org.Name, + IsPosition = false + };//实例化组织树 + //获取组织下的职位职位分类 + foreach (var category in posCategory) + { + var id = CommonUtils.GetSingleId();//生成唯一ID临时用,因为前端需要ID + var categoryTreeOutput = new PositionTreeOutput + { + Id = id, + Name = category.DictLabel, + IsPosition = false + };//实例化职位分类树 + var positions = orgPositions.Where(it => it.Category == category.DictValue).ToList();//获取职位分类下的职位 + //遍历职位,实例化职位树 + positions.ForEach(it => + { + categoryTreeOutput.Children.Add(new PositionTreeOutput() + { + Id = it.Id, + Name = it.Name, + IsPosition = true + });//添加职位 + }); + positionTreeOutput.Children.Add(categoryTreeOutput); + } + result.Add(positionTreeOutput); + } + + return result; + } + /// - public async Task Add(PositionAddInput input, string name = SimpleAdminConst.SysPos) + public async Task Detail(BaseIdInput input) + { + return await GetSysPositionById(input.Id); + } + + #endregion + + #region 编辑 + + /// + public async Task Edit(PositionEditInput input, string name = SystemConst.SYS_POS) { await CheckInput(input, name);//检查参数 var sysPosition = input.Adapt();//实体转换 - sysPosition.Code = RandomHelper.CreateRandomString(10);//赋值Code - if (await InsertAsync(sysPosition))//插入数据 + if (await UpdateAsync(sysPosition))//更新数据 await RefreshCache();//刷新缓存 } + + + /// + public async Task RefreshCache() + { + _simpleCacheService.Remove(SystemConst.CACHE_SYS_POSITION);//删除缓存 + await GetListAsync();//重新写入缓存 + } + + #endregion + + #region 新增 + /// - public async Task Edit(PositionEditInput input, string name = SimpleAdminConst.SysPos) + public async Task Add(PositionAddInput input, string name = SystemConst.SYS_POS) { await CheckInput(input, name);//检查参数 var sysPosition = input.Adapt();//实体转换 - if (await UpdateAsync(sysPosition))//更新数据 + if (await InsertAsync(sysPosition))//插入数据 await RefreshCache();//刷新缓存 } + #endregion + + #region 删除 + /// - public async Task Delete(List input, string name = SimpleAdminConst.SysPos) + public async Task Delete(BaseIdListInput input, string name = SystemConst.SYS_POS) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; if (ids.Count > 0) { //如果组织下有用户则不能删除 @@ -109,34 +210,13 @@ public class SysPositionService : DbRepository, ISysPositionService { throw Oops.Bah($"请先删除{name}下的用户"); } - //获取用户表有兼任组织的信息 oracle要改成Context.Queryable().Where(it => SqlFunc.Length(it.PositionJson) > 0).Select(it => it.PositionJson).ToListAsync(); - var positionJsons = await Context.Queryable().Where(it => !SqlFunc.IsNullOrEmpty(it.PositionJson)).Select(it => it.PositionJson).ToListAsync(); - if (positionJsons.Count > 0) - { - positionJsons.ForEach(it => - { - //获取机构列表 - var positionIds = it.Select(it => it.PositionId).ToList(); - //获取交集 - var samePositionIds = ids.Intersect(positionIds).ToList(); - if (samePositionIds.Count > 0) - { - throw Oops.Bah($"请先删除{name}下的兼任用户"); - } - }); - } //删除职位 if (await DeleteByIdsAsync(ids.Cast().ToArray())) await RefreshCache();//刷新缓存 } } - /// - public async Task RefreshCache() - { - _simpleCacheService.Remove(SystemConst.Cache_SysPosition);//删除Key - await GetListAsync();//重新写入缓存 - } + #endregion #region 方法 @@ -148,27 +228,80 @@ public class SysPositionService : DbRepository, ISysPositionService private async Task CheckInput(SysPosition sysPosition, string name) { //所有分类放一个列表 - var positionCategorys = new List() { CateGoryConst.Position_HIGH, CateGoryConst.Position_LOW, CateGoryConst.Position_MIDDLE }; - if (!positionCategorys.Contains(sysPosition.Category)) + var posCategoryList = new List + { + CateGoryConst.POSITION_HIGH, CateGoryConst.POSITION_LOW, CateGoryConst.POSITION_MIDDLE + }; + if (!posCategoryList.Contains(sysPosition.Category)) throw Oops.Bah($"{name}所属分类错误:{sysPosition.Category}"); var sysPositions = await GetListAsync();//获取全部 if (sysPositions.Any(it => it.OrgId == sysPosition.OrgId && it.Name == sysPosition.Name && it.Id != sysPosition.Id))//判断同级是否有名称重复的 throw Oops.Bah($"存在重复的{name}:{sysPosition.Name}"); if (sysPosition.Id > 0)//如果ID大于0表示编辑 { - var postion = sysPositions.Where(it => it.Id == sysPosition.Id).FirstOrDefault();//获取当前职位 - if (postion != null) + var position = sysPositions.Where(it => it.Id == sysPosition.Id).FirstOrDefault();//获取当前职位 + if (position == null) + throw Oops.Bah($"{name}不存在"); + } + //如果code没填 + if (string.IsNullOrEmpty(sysPosition.Code)) + { + sysPosition.Code = RandomHelper.CreateRandomString(10);//赋值Code + } + else + { + //判断是否有相同的Code + if (sysPositions.Any(it => it.Code == sysPosition.Code && it.Id != sysPosition.Id)) + throw Oops.Bah($"存在重复的编码:{sysPosition.Code}"); + } + } + + /// + /// 构建职位选择器 + /// + /// 组织列表 + /// 职位列表 + /// 父Id + /// + public async Task> ConstructPositionSelector(List orgList, List sysPositions, + long parentId = SimpleAdminConst.ZERO) + { + //找下级组织列表 + var orgInfos = orgList.Where(it => it.ParentId == parentId).OrderBy(it => it.SortCode).ToList(); + var data = new List(); + if (orgInfos.Count > 0)//如果数量大于0 + { + foreach (var item in orgInfos)//遍历组织 { - if (postion.OrgId != sysPosition.OrgId)//如果orgId不一样表示换机构了 + var childIds = await _sysOrgService.GetOrgChildIds(item.Id, true, orgList);//获取组织下的所有子级ID + var orgPositions = sysPositions.Where(it => childIds.Contains(it.OrgId)).ToList();//获取组织下的职位 + if (orgPositions.Count > 0)//如果组织和组织下级有职位 { - if (await Context.Queryable().Where(it => it.PositionId == sysPosition.Id || SqlFunc.JsonLike(it.PositionJson, sysPosition.Id.ToString())).AnyAsync())//如果职位下有用户 - throw Oops.Bah($"该{name}下已存在用户,请先删除{name}下的用户"); + var positionSelectorOutput = new PositionSelectorOutput + { + Id = item.Id, + Name = item.Name, + Children = await ConstructPositionSelector(orgList, sysPositions, item.Id)//递归 + };//实例化职位树 + var positions = orgPositions.Where(it => it.OrgId == item.Id).ToList();//获取组织下的职位 + if (positions.Count > 0)//如果数量大于0 + { + foreach (var position in positions) + { + positionSelectorOutput.Children.Add(new PositionSelectorOutput + { + Id = position.Id, + Name = position.Name + });//添加职位 + } + } + data.Add(positionSelectorOutput);//添加到列表 } } - else - throw Oops.Bah($"{name}不存在"); + return data;//返回结果 } + return new List(); } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/Dto/UserInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/Dto/UserInput.cs similarity index 86% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/User/Dto/UserInput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/Dto/UserInput.cs index 98a7787b1df62a880a11d1a2218cefacff9e6fe5..e933776a1a5b510798bd27bead0a448d1a0d92f5 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/Dto/UserInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/Dto/UserInput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 用户选择器参数 @@ -15,10 +25,20 @@ public class UserSelectorInput : BasePageInput /// public List OrgIds { get; set; } + /// + /// 机构ID + /// + public long PositionId { get; set; } + + /// + /// 角色ID + /// + public long RoleId { get; set; } + /// /// 关键字 /// - public virtual string SearchKey { get; set; } + public string Account { get; set; } } /// @@ -29,7 +49,6 @@ public class UserPageInput : BasePageInput /// /// 所属组织 /// - public long OrgId { get; set; } /// @@ -41,7 +60,7 @@ public class UserPageInput : BasePageInput /// 用户状态 /// - public string UserStatus { get; set; } + public string Status { get; set; } } /// @@ -308,4 +327,4 @@ public class SysUserImportInput : ImportTemplateInput /// [ImporterHeader(IsIgnore = true)] public long PositionId { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/Dto/UserOutPut.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/Dto/UserOutPut.cs similarity index 82% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/User/Dto/UserOutPut.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/Dto/UserOutPut.cs index 99b3e1bd6b7408f46deb7c291970aebb9633dc9a..52a81c6de678d6ca3c0a3084379bc91f3cbb59b9 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/Dto/UserOutPut.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/Dto/UserOutPut.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 选择用户输出参数 @@ -29,21 +39,6 @@ public class UserSelectorOutPut /// 性别 /// public string Gender { get; set; } - - /// - /// 组织名称 - /// - public string OrgName { get; set; } - - /// - /// 职位名称 - /// - public string PositionName { get; set; } - - /// - /// 头像 - /// - public string Avatar { get; set; } } /// @@ -233,4 +228,27 @@ public class SysUserExportOutput /// [ExporterHeader(DisplayName = "职级")] public string PositionLevel { get; set; } -} \ No newline at end of file +} + +public class RoleSelectorOutPut +{ + /// + /// Id + /// + public long Id { get; set; } + + /// + /// 组织ID + /// + public long OrgId { get; set; } + + /// + /// 角色名称 + /// + public string Name { get; set; } + + /// + /// 角色编码 + /// + public string Code { get; set; } +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/ISysUserService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/ISysUserService.cs similarity index 71% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/User/ISysUserService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/ISysUserService.cs index f9ea6044e4ab0f3a3c171722238cd153f22e96cf..43ed8381094491052539a8e597c5e7a45e3ad432 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/ISysUserService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/ISysUserService.cs @@ -1,9 +1,19 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 用户服务 /// -public partial interface ISysUserService : ITransient +public interface ISysUserService : ITransient { #region 查询 @@ -18,8 +28,9 @@ public partial interface ISysUserService : ITransient /// 根据账号获取用户信息 /// /// 用户名 + /// 租户ID /// 用户信息 - Task GetUserByAccount(string account); + Task GetUserByAccount(string account, long? tenantId = null); /// /// 根据用户ID和机构ID获取角色权限 @@ -33,15 +44,16 @@ public partial interface ISysUserService : ITransient /// 根据手机号获取用户账号 /// /// 手机号 + /// 租户ID /// 用户账号名称 - Task GetIdByPhone(string phone); + Task GetIdByPhone(string phone, long? tenantId = null); /// /// 用户选择器 /// /// 查询参数 /// - Task> UserSelector(UserSelectorInput input); + Task> Selector(UserSelectorInput input); /// /// 用户分页查询 @@ -72,35 +84,28 @@ public partial interface ISysUserService : ITransient /// Task GetUserById(long userId); - /// - ///根据用户账号获取用户ID - /// - /// 用户账号 - /// - Task GetIdByAccount(string account); + /// + /// 根据用户账号获取用户ID + /// + /// 用户账号 + /// 租户id + /// + Task GetIdByAccount(string account, long? tenantId = null); /// /// 根据用户手机获取用户信息 /// /// 手机号 + /// 租户Id /// 用户信息 - Task GetUserByPhone(string phone); + Task GetUserByPhone(string phone, long? tenantId = null); /// /// 获取用户拥有角色 /// /// 用户ID /// - Task> OwnRole(BaseIdInput input); - - /// - /// 获取当前API用户的数据范围 - ///null:代表拥有全部数据权限 - ///[xx,xx]:代表拥有部分机构的权限 - ///[]:代表仅自己权限 - /// - /// 机构列表 - Task?> GetLoginUserApiDataScope(); + Task> OwnRole(BaseIdInput input); /// /// 获取用户拥有的资源 @@ -137,8 +142,46 @@ public partial interface ISysUserService : ITransient /// Task Detail(BaseIdInput input); + /// + /// 获取用户头像 + /// + /// 用户id + /// base64头像 + Task GetUserAvatar(long userId); + #endregion 查询 + #region 数据范围相关 + + /// + /// 获取当前API用户的数据范围 + /// null:代表拥有全部数据权限 + /// [xx,xx]:代表拥有部分机构的权限 + /// []:代表仅自己权限 + /// + /// 机构列表 + Task?> GetLoginUserApiDataScope(); + + /// + /// 检查用户是否有机构的数据权限 + /// + /// 机构id + /// 创建者id + /// 错误提示:不为空则直接抛出异常 + /// 是否有权限 + Task CheckApiDataScope(long? orgId, long? createUerId, string errMsg = ""); + + /// + /// 检查用户是否有机构的数据权限 + /// + /// 机构id列表 + /// 创建者id列表 + /// 错误提示:不为空则直接抛出异常 + /// + Task CheckApiDataScope(List orgIds, List createUerIds, string errMsg = ""); + + #endregion + #region 新增 /// @@ -224,7 +267,7 @@ public partial interface ISysUserService : ITransient /// /// Id列表 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); /// /// 从redis中删除用户信息 @@ -278,4 +321,4 @@ public partial interface ISysUserService : ITransient Task> CheckImport(List data, bool clearError = false) where T : SysUserImportInput; #endregion 导入导出 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/SysUserService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/SysUserService.cs similarity index 60% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/User/SysUserService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/SysUserService.cs index 49034e6246a4d7d9c6ab8e2853fede7e1565fdd9..577a60e26039201f7442165b6d3ac88351f86e28 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/SysUserService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/SysUserService.cs @@ -1,5 +1,14 @@ -using OfficeOpenXml.FormulaParsing.Excel.Functions.Text; -using System.Linq.Expressions; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using SimpleAdmin.Core.Extension; namespace SimpleAdmin.System; @@ -13,21 +22,16 @@ public class SysUserService : DbRepository, ISysUserService private readonly IRelationService _relationService; private readonly IResourceService _resourceService; private readonly ISysOrgService _sysOrgService; - private readonly IRoleService _roleService; + private readonly ISysRoleService _sysRoleService; private readonly IImportExportService _importExportService; private readonly ISysPositionService _sysPositionService; private readonly IDictService _dictService; private readonly IConfigService _configService; private readonly IBatchEditService _batchEditService; - public SysUserService(ILogger logger, ISimpleCacheService simpleCacheService, - IRelationService relationService, - IResourceService resourceService, - ISysOrgService orgService, - IRoleService roleService, - IImportExportService importExportService, - ISysPositionService sysPositionService, - IDictService dictService, + public SysUserService(ILogger logger, ISimpleCacheService simpleCacheService, IRelationService relationService, + IResourceService resourceService, ISysOrgService orgService, ISysRoleService sysRoleService, + IImportExportService importExportService, ISysPositionService sysPositionService, IDictService dictService, IConfigService configService, IBatchEditService updateBatchService) { _logger = logger; @@ -35,7 +39,7 @@ public class SysUserService : DbRepository, ISysUserService _relationService = relationService; _resourceService = resourceService; _sysOrgService = orgService; - _roleService = roleService; + _sysRoleService = sysRoleService; _importExportService = importExportService; _sysPositionService = sysPositionService; _dictService = dictService; @@ -46,51 +50,73 @@ public class SysUserService : DbRepository, ISysUserService #region 查询 /// - public async Task GetUserByAccount(string account) + public async Task GetUserAvatar(long userId) { - var userId = await GetIdByAccount(account);//获取用户ID - if (userId > 0) + //先从缓存拿 + var avatar = _simpleCacheService.HashGetOne(SystemConst.CACHE_SYS_USER_AVATAR, userId.ToString()); + if (string.IsNullOrEmpty(avatar)) + { + //单查获取用户头像 + avatar = await GetFirstAsync(it => it.Id == userId, it => it.Avatar); + if (!string.IsNullOrEmpty(avatar)) + { + //插入缓存 + _simpleCacheService.HashAdd(SystemConst.CACHE_SYS_USER_AVATAR, userId.ToString(), avatar); + } + } + return avatar; + } + + /// + public async Task GetUserByAccount(string account, long? tenantId = null) + { + var userId = await GetIdByAccount(account, tenantId);//获取用户ID + if (userId != SimpleAdminConst.ZERO) { var sysUser = await GetUserById(userId);//获取用户信息 if (sysUser.Account == account)//这里做了比较用来限制大小写 return sysUser; - else - return null; - } - else - { return null; } + return null; } /// - public async Task GetUserByPhone(string phone) + public async Task GetUserByPhone(string phone, long? tenantId = null) { - var userId = await GetIdByPhone(phone);//获取用户ID + var userId = await GetIdByPhone(phone, tenantId);//获取用户ID if (userId > 0) { return await GetUserById(userId);//获取用户信息 } - else - { - return null; - } + return null; } /// - public async Task GetIdByPhone(string phone) + public async Task GetIdByPhone(string phone, long? tenantId = null) { - //先从Redis拿 - var userId = _simpleCacheService.HashGetOne(SystemConst.Cache_SysUserPhone, phone); + var orgIds = new List(); + var key = SystemConst.CACHE_SYS_USER_PHONE; + if (tenantId != null) + { + key += $":{tenantId}"; + orgIds = await _sysOrgService.GetOrgChildIds(tenantId.Value);//获取下级机构 + } + //先从缓存拿 + var userId = _simpleCacheService.HashGetOne(key, phone); if (userId == 0) { - phone = CryptogramUtil.Sm4Encrypt(phone);//SM4加密一下 + var sm4Phone = CryptogramUtil.Sm4Encrypt(phone);//SM4加密一下 //单查获取用户手机号对应的账号 - userId = await GetFirstAsync(it => it.Phone == phone, it => it.Id); + userId = await Context.Queryable() + .Where(it => it.Phone == sm4Phone) + .WhereIF(orgIds.Count > 0, it => orgIds.Contains(it.OrgId)) + .Select(it => it.Id) + .FirstAsync(); if (userId > 0) { - //插入Redis - _simpleCacheService.HashAdd(SystemConst.Cache_SysUserPhone, phone, userId); + //插入缓存 + _simpleCacheService.HashAdd(key, phone, userId); } } return userId; @@ -99,8 +125,8 @@ public class SysUserService : DbRepository, ISysUserService /// public async Task GetUserById(long userId) { - //先从Redis拿 - var sysUser = _simpleCacheService.HashGetOne(SystemConst.Cache_SysUser, userId.ToString()); + //先从缓存拿 + var sysUser = _simpleCacheService.HashGetOne(SystemConst.CACHE_SYS_USER, userId.ToString()); if (sysUser == null) { sysUser = await GetUserFromDb(userId);//从数据库拿用户信息 @@ -111,35 +137,34 @@ public class SysUserService : DbRepository, ISysUserService /// public async Task GetUserById(long userId) { - //先从Redis拿 - var sysUser = _simpleCacheService.HashGetOne(SystemConst.Cache_SysUser, userId.ToString()); - if (sysUser == null) - { - var user = await GetUserFromDb(userId);//从数据库拿用户信息 - if (sysUser != null) - { - sysUser = user.Adapt(); - } - } - return sysUser; + var user = await GetUserById(userId); + return user.Adapt(); } - - - /// - public async Task GetIdByAccount(string account) + public async Task GetIdByAccount(string account, long? tenantId = null) { - //先从Redis拿 - var userId = _simpleCacheService.HashGetOne(SystemConst.Cache_SysUserAccount, account); + var orgIds = new List(); + var key = SystemConst.CACHE_SYS_USER_ACCOUNT; + if (tenantId != null) + { + key += $":{tenantId}"; + orgIds = await _sysOrgService.GetOrgChildIds(tenantId.Value);//获取下级机构 + } + //先从缓存拿 + var userId = _simpleCacheService.HashGetOne(key, account); if (userId == 0) { //单查获取用户账号对应ID - userId = await GetFirstAsync(it => it.Account == account, it => it.Id); + userId = await Context.Queryable() + .Where(it => it.Account == account) + .WhereIF(orgIds.Count > 0, it => orgIds.Contains(it.OrgId)) + .Select(it => it.Id) + .FirstAsync(); if (userId != 0) { - //插入Redis - _simpleCacheService.HashAdd(SystemConst.Cache_SysUserAccount, account, userId); + //插入缓存 + _simpleCacheService.HashAdd(key, account, userId); } } return userId; @@ -150,25 +175,27 @@ public class SysUserService : DbRepository, ISysUserService { var buttonCodeList = new List();//按钮ID集合 //获取用户资源集合 - var resourceList = await _relationService.GetRelationListByObjectIdAndCategory(userId, CateGoryConst.Relation_SYS_USER_HAS_RESOURCE); + var resourceList = await _relationService.GetRelationListByObjectIdAndCategory(userId, CateGoryConst.RELATION_SYS_USER_HAS_RESOURCE); var buttonIdList = new List();//按钮ID集合 if (resourceList.Count == 0)//如果有表示用户单独授权了不走用户角色 { //获取用户角色关系集合 - var roleList = await _relationService.GetRelationListByObjectIdAndCategory(userId, CateGoryConst.Relation_SYS_USER_HAS_ROLE); + var roleList = await _relationService.GetRelationListByObjectIdAndCategory(userId, CateGoryConst.RELATION_SYS_USER_HAS_ROLE); var roleIdList = roleList.Select(x => x.TargetId.ToLong()).ToList();//角色ID列表 if (roleIdList.Count > 0)//如果该用户有角色 { - resourceList = await _relationService.GetRelationListByObjectIdListAndCategory(roleIdList, CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE);//获取资源集合 + resourceList = await _relationService.GetRelationListByObjectIdListAndCategory(roleIdList, + CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE);//获取资源集合 } } resourceList.ForEach(it => { - if (!string.IsNullOrEmpty(it.ExtJson)) buttonIdList.AddRange(it.ExtJson.ToJsonEntity().ButtonInfo);//如果有按钮权限,将按钮ID放到buttonIdList + if (!string.IsNullOrEmpty(it.ExtJson)) + buttonIdList.AddRange(it.ExtJson.ToJsonEntity().ButtonInfo);//如果有按钮权限,将按钮ID放到buttonIdList }); if (buttonIdList.Count > 0) { - buttonCodeList = await _resourceService.GetCodeByIds(buttonIdList, CateGoryConst.Resource_BUTTON); + buttonCodeList = await _resourceService.GetCodeByIds(buttonIdList, CateGoryConst.RESOURCE_BUTTON); } return buttonCodeList; } @@ -177,14 +204,17 @@ public class SysUserService : DbRepository, ISysUserService public async Task> GetPermissionListByUserId(long userId, long orgId) { var permissions = new List();//权限集合 - var sysRelations = await _relationService.GetRelationListByObjectIdAndCategory(userId, CateGoryConst.Relation_SYS_USER_HAS_PERMISSION);//根据用户ID获取用户权限 + var sysRelations = + await _relationService.GetRelationListByObjectIdAndCategory(userId, CateGoryConst.RELATION_SYS_USER_HAS_PERMISSION);//根据用户ID获取用户权限 if (sysRelations.Count == 0)//如果有表示用户单独授权了不走用户角色 { - var roleIdList = await _relationService.GetRelationListByObjectIdAndCategory(userId, CateGoryConst.Relation_SYS_USER_HAS_ROLE);//根据用户ID获取角色ID + var roleIdList = + await _relationService.GetRelationListByObjectIdAndCategory(userId, CateGoryConst.RELATION_SYS_USER_HAS_ROLE);//根据用户ID获取角色ID if (roleIdList.Count > 0)//如果角色ID不为空 { //获取角色权限信息 - sysRelations = await _relationService.GetRelationListByObjectIdListAndCategory(roleIdList.Select(it => it.TargetId.ToLong()).ToList(), CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION); + sysRelations = await _relationService.GetRelationListByObjectIdListAndCategory(roleIdList.Select(it => it.TargetId.ToLong()).ToList(), + CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION); } } var relationGroup = sysRelations.GroupBy(it => it.TargetId).ToList();//根据目标ID,也就是接口名分组,因为存在一个用户多个角色 @@ -221,53 +251,21 @@ public class SysUserService : DbRepository, ISysUserService return permissions; } - /// - public async Task?> GetLoginUserApiDataScope() - { - var userInfo = await GetUserById(UserManager.UserId);//获取用户信息 - // 路由名称 - var routeName = App.HttpContext.Request.Path.Value; - //获取当前url的数据范围 - var dataScope = userInfo.DataScopeList.Where(it => it.ApiUrl == routeName).FirstOrDefault(); - if (dataScope != null) - { - //根据数据范围分类获取数据范围 - //null:代表拥有全部数据权限 - //[xx,xx]:代表拥有部分机构的权限 - //[]:代表仅自己权限 - switch (dataScope.ScopeCategory) - { - case CateGoryConst.SCOPE_ALL: - return null; - case CateGoryConst.SCOPE_ORG_CHILD: - return userInfo.ScopeOrgChildList; - case CateGoryConst.SCOPE_ORG: - return new List { userInfo.OrgId }; - case CateGoryConst.SCOPE_ORG_DEFINE: - return dataScope.DataScopes; - case CateGoryConst.SCOPE_SELF: - return new List(); - } - } - return new List(); - } /// - public async Task> UserSelector(UserSelectorInput input) + public async Task> Selector(UserSelectorInput input) { var orgIds = await _sysOrgService.GetOrgChildIds(input.OrgId);//获取下级机构 - var result = await Context.Queryable().LeftJoin((u, o) => u.OrgId == o.Id) - .LeftJoin((u, o, p) => u.PositionId == p.Id) + var result = await Context.Queryable() .WhereIF(input.OrgId > 0, u => orgIds.Contains(u.OrgId))//指定机构 .WhereIF(input.OrgIds != null, u => input.OrgIds.Contains(u.OrgId))//在指定机构列表查询 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), u => u.Name.Contains(input.SearchKey) || u.Account.Contains(input.SearchKey))//根据关键字查询 - .Select((u, o, p) => new UserSelectorOutPut - { - Id = u.Id.SelectAll(), - OrgName = o.Name, - PositionName = p.Name - }) - .ToPagedListAsync(input.Current, input.Size); + .WhereIF(input.PositionId > 0, u => u.PositionId == input.PositionId)//指定职位 + .WhereIF(input.RoleId > 0, + u => SqlFunc.Subqueryable() + .Where(r => r.TargetId == input.RoleId.ToString() && r.ObjectId == u.Id && r.Category == CateGoryConst.RELATION_SYS_USER_HAS_ROLE) + .Any())//指定角色 + .WhereIF(!string.IsNullOrEmpty(input.Account), u => u.Account.Contains(input.Account))//根据关键字查询 + .Select().ToPagedListAsync(input.PageNum, input.PageSize); return result; } @@ -275,7 +273,7 @@ public class SysUserService : DbRepository, ISysUserService public async Task> Page(UserPageInput input) { var query = await GetQuery(input);//获取查询条件 - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } @@ -288,16 +286,18 @@ public class SysUserService : DbRepository, ISysUserService } /// - public async Task> OwnRole(BaseIdInput input) + public async Task> OwnRole(BaseIdInput input) { - var relations = await _relationService.GetRelationListByObjectIdAndCategory(input.Id, CateGoryConst.Relation_SYS_USER_HAS_ROLE); - return relations.Select(it => it.TargetId.ToLong()).ToList(); + var relations = await _relationService.GetRelationListByObjectIdAndCategory(input.Id, CateGoryConst.RELATION_SYS_USER_HAS_ROLE); + var roleIds = relations.Select(it => it.TargetId.ToLong()).ToList(); + var roleList = await Context.Queryable().Where(it => roleIds.Contains(it.Id)).Select().ToListAsync(); + return roleList; } /// public async Task OwnResource(BaseIdInput input) { - return await _roleService.OwnResource(input, CateGoryConst.Relation_SYS_USER_HAS_RESOURCE); + return await _sysRoleService.OwnResource(input, CateGoryConst.RELATION_SYS_USER_HAS_RESOURCE); } /// @@ -309,7 +309,7 @@ public class SysUserService : DbRepository, ISysUserService };//定义结果集 var grantInfoList = new List();//已授权信息集合 //获取关系列表 - var relations = await _relationService.GetRelationListByObjectIdAndCategory(input.Id, CateGoryConst.Relation_SYS_USER_HAS_PERMISSION); + var relations = await _relationService.GetRelationListByObjectIdAndCategory(input.Id, CateGoryConst.RELATION_SYS_USER_HAS_PERMISSION); //遍历关系表 relations.ForEach(it => { @@ -326,12 +326,12 @@ public class SysUserService : DbRepository, ISysUserService { var permissionTreeSelectors = new List();//授权树结果集 //获取用户资源关系 - var relationsRes = await _relationService.GetRelationByCategory(CateGoryConst.Relation_SYS_USER_HAS_RESOURCE); + var relationsRes = await _relationService.GetRelationByCategory(CateGoryConst.RELATION_SYS_USER_HAS_RESOURCE); var menuIds = relationsRes.Where(it => it.ObjectId == input.Id).Select(it => it.TargetId.ToLong()).ToList(); if (menuIds.Any()) { //获取菜单信息 - var menus = await _resourceService.GetMenuByMenuIds(menuIds); + var menus = await _resourceService.GetResourcesByIds(menuIds, CateGoryConst.RESOURCE_MENU); //获取权限授权树 var permissions = _resourceService.PermissionTreeSelector(menus.Select(it => it.Path).ToList()); if (permissions.Count > 0) @@ -362,6 +362,88 @@ public class SysUserService : DbRepository, ISysUserService #endregion 查询 + #region 数据范围相关 + + /// + public async Task?> GetLoginUserApiDataScope() + { + var userInfo = await GetUserById(UserManager.UserId);//获取用户信息 + // 路由名称 + var routeName = App.HttpContext.Request.Path.Value; + //获取当前url的数据范围 + var dataScope = userInfo.DataScopeList.Where(it => it.ApiUrl == routeName).FirstOrDefault(); + if (dataScope != null) + { + //根据数据范围分类获取数据范围 + //null:代表拥有全部数据权限 + //[xx,xx]:代表拥有部分机构的权限 + //[]:代表仅自己权限 + switch (dataScope.ScopeCategory) + { + case CateGoryConst.SCOPE_ALL: + return null; + + case CateGoryConst.SCOPE_ORG_CHILD: + return userInfo.ScopeOrgChildList; + + case CateGoryConst.SCOPE_ORG: + return new List { userInfo.OrgId }; + + case CateGoryConst.SCOPE_ORG_DEFINE: + return dataScope.DataScopes; + + case CateGoryConst.SCOPE_SELF: + return new List(); + } + } + return new List(); + } + + /// + public async Task CheckApiDataScope(long? orgId, long? createUerId, string errMsg = "") + { + var hasPermission = true; + //判断数据范围 + var dataScope = await GetLoginUserApiDataScope(); + if (dataScope is { Count: > 0 })//如果有机构 + { + if (orgId == null || !dataScope.Contains(orgId.Value))//判断机构id是否在数据范围 + hasPermission = false; + } + else if (dataScope is { Count: 0 })// 表示仅自己 + { + if (createUerId != UserManager.UserId) + hasPermission = false;//机构的创建人不是自己则报错 + } + //如果传了错误信息,直接抛出异常 + if (!hasPermission && !string.IsNullOrEmpty(errMsg)) + throw Oops.Bah(errMsg); + return hasPermission; + } + + public async Task CheckApiDataScope(List orgIds, List createUerIds, string errMsg = "") + { + var hasPermission = true; + //判断数据范围 + var dataScope = await GetLoginUserApiDataScope(); + if (dataScope is { Count: > 0 })//如果有机构 + { + if (orgIds == null || !dataScope.ContainsAll(orgIds))//判断机构id列表是否全在数据范围 + hasPermission = false; + } + else if (dataScope is { Count: 0 })// 表示仅自己 + { + if (createUerIds.Any(it => it != UserManager.UserId))//如果创建者id里有任何不是自己创建的机构 + hasPermission = false; + } + //如果传了错误信息,直接抛出异常 + if (!hasPermission && !string.IsNullOrEmpty(errMsg)) + throw Oops.Bah(errMsg); + return hasPermission; + } + + #endregion + #region 新增 /// @@ -373,7 +455,7 @@ public class SysUserService : DbRepository, ISysUserService sysUser.Avatar = AvatarUtil.GetNameImageBase64(sysUser.Name); //获取默认密码 sysUser.Password = await GetDefaultPassWord(true);//设置密码 - sysUser.UserStatus = DevDictConst.COMMON_STATUS_ENABLE;//默认状态 + sysUser.Status = CommonStatusConst.ENABLE;//默认状态 await InsertAsync(sysUser);//添加数据 } @@ -388,32 +470,31 @@ public class SysUserService : DbRepository, ISysUserService var exist = await GetUserById(input.Id);//获取用户信息 if (exist != null) { - var isSuperAdmin = exist.Account == RoleConst.SuperAdmin;//判断是否有超管 + var isSuperAdmin = exist.Account == SysRoleConst.SUPER_ADMIN;//判断是否有超管 if (isSuperAdmin && !UserManager.SuperAdmin) - throw Oops.Bah($"不可修改系统内置超管用户账号"); + throw Oops.Bah("不可修改系统内置超管用户账号"); var name = exist.Name;//姓名 var sysUser = input.Adapt();//实体转换 if (name != input.Name) - //默认头像 - sysUser.Avatar = AvatarUtil.GetNameImageBase64(input.Name); - if (await Context.Updateable(sysUser).IgnoreColumns(it => - new - { - //忽略更新字段 - it.Password, - it.LastLoginAddress, - it.LastLoginDevice, - it.LastLoginIp, - it.LastLoginTime, - it.LatestLoginAddress, - it.LatestLoginDevice, - it.LatestLoginIp, - it.LatestLoginTime - }).ExecuteCommandAsync() > 0)//修改数据 + sysUser.Avatar = AvatarUtil.GetNameImageBase64(input.Name);//如果姓名改变了,重新生成头像 + if (await Context.Updateable(sysUser).IgnoreColumns(it => new + { + //忽略更新字段 + it.Password, + it.LastLoginAddress, + it.LastLoginDevice, + it.LastLoginIp, + it.LastLoginTime, + it.LatestLoginAddress, + it.LatestLoginDevice, + it.LatestLoginIp, + it.LatestLoginTime + }).IgnoreColumnsIF(name == input.Name, it => it.Avatar).ExecuteCommandAsync() > 0 + )//修改数据 { DeleteUserFromRedis(sysUser.Id);//删除用户缓存 //删除用户token缓存 - _simpleCacheService.HashDel>(CacheConst.Cache_UserToken, new string[] { sysUser.Id.ToString() }); + _simpleCacheService.HashDel>(CacheConst.CACHE_USER_TOKEN, sysUser.Id.ToString()); } } } @@ -435,29 +516,29 @@ public class SysUserService : DbRepository, ISysUserService var sysUser = await GetUserById(input.Id);//获取用户信息 if (sysUser != null) { - var isSuperAdmin = sysUser.Account == RoleConst.SuperAdmin;//判断是否有超管 + var isSuperAdmin = sysUser.Account == SysRoleConst.SUPER_ADMIN;//判断是否有超管 if (isSuperAdmin) - throw Oops.Bah($"不可禁用系统内置超管用户账号"); - CheckSelf(input.Id, SimpleAdminConst.Disable);//判断是不是自己 + throw Oops.Bah("不可禁用系统内置超管用户账号"); + CheckSelf(input.Id, SystemConst.DISABLE);//判断是不是自己 //设置状态为禁用 - if (await UpdateAsync(it => new SysUser + if (await UpdateSetColumnsTrueAsync(it => new SysUser { - UserStatus = DevDictConst.COMMON_STATUS_DISABLED + Status = CommonStatusConst.DISABLED }, it => it.Id == input.Id)) - DeleteUserFromRedis(input.Id);//从redis删除用户信息 + DeleteUserFromRedis(input.Id);//从缓存删除用户信息 } } /// public async Task EnableUser(BaseIdInput input) { - CheckSelf(input.Id, SimpleAdminConst.Enable);//判断是不是自己 + CheckSelf(input.Id, SystemConst.ENABLE);//判断是不是自己 //设置状态为启用 - if (await UpdateAsync(it => new SysUser + if (await UpdateSetColumnsTrueAsync(it => new SysUser { - UserStatus = DevDictConst.COMMON_STATUS_ENABLE + Status = CommonStatusConst.ENABLE }, it => it.Id == input.Id)) - DeleteUserFromRedis(input.Id);//从redis删除用户信息 + DeleteUserFromRedis(input.Id);//从缓存删除用户信息 } /// @@ -465,11 +546,11 @@ public class SysUserService : DbRepository, ISysUserService { var password = await GetDefaultPassWord(true);//获取默认密码,这里不走Aop所以需要加密一下 //重置密码 - if (await UpdateAsync(it => new SysUser + if (await UpdateSetColumnsTrueAsync(it => new SysUser { Password = password }, it => it.Id == input.Id)) - DeleteUserFromRedis(input.Id);//从redis删除用户信息 + DeleteUserFromRedis(input.Id);//从缓存删除用户信息 } /// @@ -478,13 +559,14 @@ public class SysUserService : DbRepository, ISysUserService var sysUser = await GetUserById(input.Id);//获取用户信息 if (sysUser != null) { - var isSuperAdmin = sysUser.Account == RoleConst.SuperAdmin;//判断是否有超管 + var isSuperAdmin = sysUser.Account == SysRoleConst.SUPER_ADMIN;//判断是否有超管 if (isSuperAdmin) - throw Oops.Bah($"不能给超管分配角色"); - CheckSelf(input.Id, SimpleAdminConst.GrantRole);//判断是不是自己 + throw Oops.Bah("不能给超管分配角色"); + CheckSelf(input.Id, SystemConst.GRANT_ROLE);//判断是不是自己 //给用户赋角色 - await _relationService.SaveRelationBatch(CateGoryConst.Relation_SYS_USER_HAS_ROLE, input.Id, input.RoleIdList.Select(it => it.ToString()).ToList(), null, true); - DeleteUserFromRedis(input.Id);//从redis删除用户信息 + await _relationService.SaveRelationBatch(CateGoryConst.RELATION_SYS_USER_HAS_ROLE, input.Id, + input.RoleIdList.Select(it => it.ToString()).ToList(), null, true); + DeleteUserFromRedis(input.Id);//从缓存删除用户信息 } } @@ -507,7 +589,7 @@ public class SysUserService : DbRepository, ISysUserService { ObjectId = sysUser.Id, TargetId = menuIds[i].ToString(), - Category = CateGoryConst.Relation_SYS_USER_HAS_RESOURCE, + Category = CateGoryConst.RELATION_SYS_USER_HAS_RESOURCE, ExtJson = extJsons == null ? null : extJsons[i] }); } @@ -516,13 +598,30 @@ public class SysUserService : DbRepository, ISysUserService #region 用户权限处理. - var relationRolePer = new List();//要添加的角色有哪些权限列表 + var relationRolePer = new List();//要添加的用户有哪些权限列表 var defaultDataScope = input.DefaultDataScope;//获取默认数据范围 //获取菜单信息 - var menus = await _resourceService.GetMenuByMenuIds(menuIds); + var menus = await _resourceService.GetResourcesByIds(menuIds, CateGoryConst.RESOURCE_MENU); if (menus.Count > 0) { + #region 用户模块关系 + + //获取我的模块信息Id列表 + var moduleIds = menus.Select(it => it.Module.Value).Distinct().ToList(); + moduleIds.ForEach(it => + { + //将角色资源添加到列表 + relationRoles.Add(new SysRelation + { + ObjectId = sysUser.Id, + TargetId = it.ToString(), + Category = CateGoryConst.RELATION_SYS_USER_HAS_MODULE + }); + }); + + #endregion + //获取权限授权树 var permissions = _resourceService.PermissionTreeSelector(menus.Select(it => it.Path).ToList()); permissions.ForEach(it => @@ -532,7 +631,7 @@ public class SysUserService : DbRepository, ISysUserService { ObjectId = sysUser.Id, TargetId = it.ApiRoute, - Category = CateGoryConst.Relation_SYS_USER_HAS_PERMISSION, + Category = CateGoryConst.RELATION_SYS_USER_HAS_PERMISSION, ExtJson = new RelationRolePermission { ApiUrl = it.ApiRoute, @@ -549,17 +648,18 @@ public class SysUserService : DbRepository, ISysUserService #region 保存数据库 //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { - var relatioRep = ChangeRepository>();//切换仓储 - await relatioRep.DeleteAsync(it => - it.ObjectId == sysUser.Id && (it.Category == CateGoryConst.Relation_SYS_USER_HAS_PERMISSION || it.Category == CateGoryConst.Relation_SYS_USER_HAS_RESOURCE)); - await relatioRep.InsertRangeAsync(relationRoles);//添加新的 + var relationRep = ChangeRepository>();//切换仓储 + await relationRep.DeleteAsync(it => it.ObjectId == sysUser.Id && (it.Category == CateGoryConst.RELATION_SYS_USER_HAS_PERMISSION + || it.Category == CateGoryConst.RELATION_SYS_USER_HAS_RESOURCE) || it.Category == CateGoryConst.RELATION_SYS_USER_HAS_MODULE); + await relationRep.InsertRangeAsync(relationRoles);//添加新的 }); if (result.IsSuccess)//如果成功了 { - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_USER_HAS_PERMISSION);//刷新关系缓存 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_USER_HAS_RESOURCE);//刷新关系缓存 + await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_USER_HAS_PERMISSION);//刷新关系缓存 + await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_USER_HAS_RESOURCE);//刷新关系缓存 + await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_USER_HAS_MODULE);//刷新关系缓存 DeleteUserFromRedis(input.Id);//删除该用户缓存 } else @@ -581,7 +681,8 @@ public class SysUserService : DbRepository, ISysUserService { var apiUrls = input.GrantInfoList.Select(it => it.ApiUrl).ToList();//apiurl列表 var extJsons = input.GrantInfoList.Select(it => it.ToJson()).ToList();//拓展信息 - await _relationService.SaveRelationBatch(CateGoryConst.Relation_SYS_USER_HAS_PERMISSION, input.Id, apiUrls, extJsons, true);//添加到数据库 + await _relationService.SaveRelationBatch(CateGoryConst.RELATION_SYS_USER_HAS_PERMISSION, input.Id, apiUrls, extJsons, + true);//添加到数据库 DeleteUserFromRedis(input.Id); } } @@ -591,77 +692,59 @@ public class SysUserService : DbRepository, ISysUserService #region 删除 /// - public async Task Delete(List input) + public async Task Delete(BaseIdListInput input) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; if (ids.Count > 0) { - var containsSuperAdmin = await IsAnyAsync(it => it.Account == RoleConst.SuperAdmin && ids.Contains(it.Id));//判断是否有超管 + var containsSuperAdmin = await IsAnyAsync(it => it.Account == SysRoleConst.SUPER_ADMIN && ids.Contains(it.Id));//判断是否有超管 if (containsSuperAdmin) - throw Oops.Bah($"不可删除系统内置超管用户"); + throw Oops.Bah("不可删除系统内置超管用户"); if (ids.Contains(UserManager.UserId)) - throw Oops.Bah($"不可删除自己"); + throw Oops.Bah("不可删除自己"); - //需要更新兼任信息的用户列表 - var updatePositionJsonUser = new List(); - //获取兼任主管不是空的用户信息 - var positionJsons = await GetListAsync(it => !SqlFunc.IsNullOrEmpty(it.PositionJson), it => new SysUser - { - Id = it.Id, - PositionJson = it.PositionJson - }); - positionJsons.ForEach(position => - { - var update = false;//是否要更新标致 - - //过滤主管是空的 - var positionJson = position.PositionJson.Where(it => it.DirectorId != null).ToList(); - //遍历兼任信息 - positionJson.ForEach(it => - { - if (it.DirectorId != null)//如果主管ID不是空的 - { - if (ids.Contains(it.DirectorId.Value))//如果是兼任主管 - { - it.DirectorId = null;//移除 - update = true;//需要更新 - } - } - }); - if (update)//如果需要更新主管信息 - updatePositionJsonUser.Add(position); - }); //定义删除的关系 - var delRelations = new List { CateGoryConst.Relation_SYS_USER_HAS_RESOURCE, CateGoryConst.Relation_SYS_USER_HAS_PERMISSION, CateGoryConst.Relation_SYS_USER_HAS_ROLE }; + var delRelations = new List + { + CateGoryConst.RELATION_SYS_USER_HAS_RESOURCE, + CateGoryConst.RELATION_SYS_USER_HAS_PERMISSION, + CateGoryConst.RELATION_SYS_USER_HAS_ROLE, + CateGoryConst.RELATION_SYS_USER_HAS_MODULE, + CateGoryConst.RELATION_SYS_USER_SCHEDULE_DATA, + CateGoryConst.RELATION_SYS_USER_WORKBENCH_DATA + }; //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { //清除该用户作为主管信息 await UpdateAsync(it => new SysUser { DirectorId = null }, it => ids.Contains(it.DirectorId.Value)); - //如果有兼任主管就清除兼任主管信息 - if (updatePositionJsonUser.Count > 0) - await Context.Updateable(updatePositionJsonUser).UpdateColumns(it => it.PositionJson).ExecuteCommandAsync(); + //删除用户 await DeleteByIdsAsync(ids.Cast().ToArray()); - var relationRep = ChangeRepository>();//切换仓储 //删除关系表用户与资源关系,用户与权限关系,用户与角色关系 await relationRep.DeleteAsync(it => ids.Contains(it.ObjectId) && delRelations.Contains(it.Category)); + var orgRep = ChangeRepository>();//切换仓储 + //删除组织表主管信息 + await orgRep.DeleteAsync(it => ids.Contains(it.DirectorId.Value)); }); if (result.IsSuccess)//如果成功了 { - DeleteUserFromRedis(ids);//redis删除用户 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_USER_HAS_ROLE);//关系表刷新SYS_USER_HAS_ROLE缓存 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_USER_HAS_RESOURCE);//关系表刷新SYS_USER_HAS_ROLE缓存 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_USER_HAS_PERMISSION);//关系表刷新SYS_USER_HAS_ROLE缓存 + DeleteUserFromRedis(ids);//缓存删除用户 + await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_USER_HAS_ROLE);//关系表刷新SYS_USER_HAS_ROLE缓存 + await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_USER_HAS_RESOURCE);//关系表刷新SYS_USER_HAS_ROLE缓存 + await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_USER_HAS_PERMISSION);//关系表刷新SYS_USER_HAS_ROLE缓存 + await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_USER_HAS_MODULE);//关系表刷新RELATION_SYS_USER_HAS_MODULE缓存 + await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_USER_SCHEDULE_DATA);//关系表刷新RELATION_SYS_USER_SCHEDULE_DATA缓存 + await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_USER_WORKBENCH_DATA);//关系表刷新RELATION_SYS_USER_WORKBENCH_DATA缓存 // TODO 此处需要将这些用户踢下线,并永久注销这些用户 var idArray = ids.Select(it => it.ToString()).ToArray(); //从列表中删除 - _simpleCacheService.HashDel>(CacheConst.Cache_UserToken, idArray); + _simpleCacheService.HashDel>(CacheConst.CACHE_USER_TOKEN, idArray); } else { @@ -685,19 +768,40 @@ public class SysUserService : DbRepository, ISysUserService public void DeleteUserFromRedis(List ids) { var userIds = ids.Select(it => it.ToString()).ToArray();//id转string列表 - var sysUsers = _simpleCacheService.HashGet(SystemConst.Cache_SysUser, userIds);//获取用户列表 + var sysUsers = _simpleCacheService.HashGet(SystemConst.CACHE_SYS_USER, userIds);//获取用户列表 sysUsers = sysUsers.Where(it => it != null).ToList();//过滤掉不存在的 if (sysUsers.Count > 0) { var accounts = sysUsers.Select(it => it.Account).ToArray();//账号集合 var phones = sysUsers.Select(it => it.Phone).ToArray();//手机号集合 //删除用户信息 - _simpleCacheService.HashDel(SystemConst.Cache_SysUser, userIds); - //删除账号 - _simpleCacheService.HashDel(SystemConst.Cache_SysUserAccount, accounts); - //删除手机 - if (phones != null) - _simpleCacheService.HashDel(SystemConst.Cache_SysUserPhone, phones); + _simpleCacheService.HashDel(SystemConst.CACHE_SYS_USER, userIds); + //删除用户头像信息 + _simpleCacheService.HashDel(SystemConst.CACHE_SYS_USER_AVATAR, userIds); + var userAccountKey = SystemConst.CACHE_SYS_USER_ACCOUNT; + var userPhoneKey = SystemConst.CACHE_SYS_USER_PHONE; + if (sysUsers.Any(it => it.TenantId != null))//如果有租户id不是空的表示是多租户模式 + { + var tenantIds = sysUsers.Where(it => it.TenantId != null).Select(it => it.TenantId.Value).Distinct().ToArray();//租户id列表 + foreach (var tenantId in tenantIds) + { + userAccountKey = $"{userAccountKey}:{tenantId}"; + userPhoneKey = $"{userPhoneKey}:{tenantId}"; + //删除账号 + _simpleCacheService.HashDel(userAccountKey, accounts); + //删除手机 + if (phones != null) + _simpleCacheService.HashDel(userPhoneKey, phones); + } + } + else + { + //删除账号 + _simpleCacheService.HashDel(userAccountKey, accounts); + //删除手机 + if (phones != null) + _simpleCacheService.HashDel(userPhoneKey, phones); + } } } @@ -759,9 +863,9 @@ public class SysUserService : DbRepository, ISysUserService var dbAccounts = sysUsers.Select(it => it.Account).ToList();//数据库账号列表 var dbPhones = sysUsers.Where(it => !string.IsNullOrEmpty(it.Phone)).Select(it => it.Phone).ToList();//数据库手机号列表 var dbEmails = sysUsers.Where(it => !string.IsNullOrEmpty(it.Email)).Select(it => it.Email).ToList();//邮箱账号列表 - var sysOrgs = await _sysOrgService.GetListAsync(); + var sysOrgList = await _sysOrgService.GetListAsync(); var sysPositions = await _sysPositionService.GetListAsync(); - var dicts = await _dictService.GetListAsync(); + var dictList = await _dictService.GetListAsync(); #endregion 校验要用到的数据 @@ -778,7 +882,7 @@ public class SysUserService : DbRepository, ISysUserService if (dbAccounts.Contains(item.Account)) item.ErrorInfo.Add(nameof(item.Account), $"系统已存在账号{item.Account}"); if (accounts.Where(u => u == item.Account).Count() > 1) - item.ErrorInfo.Add(nameof(item.Account), $"账号重复"); + item.ErrorInfo.Add(nameof(item.Account), "账号重复"); #endregion 校验账号 @@ -789,7 +893,7 @@ public class SysUserService : DbRepository, ISysUserService if (dbPhones.Contains(item.Phone)) item.ErrorInfo.Add(nameof(item.Phone), $"系统已存在手机号{item.Phone}的用户"); if (phones.Where(u => u == item.Phone).Count() > 1) - item.ErrorInfo.Add(nameof(item.Phone), $"手机号重复"); + item.ErrorInfo.Add(nameof(item.Phone), "手机号重复"); } #endregion 校验手机号 @@ -801,7 +905,7 @@ public class SysUserService : DbRepository, ISysUserService if (dbEmails.Contains(item.Email)) item.ErrorInfo.Add(nameof(item.Email), $"系统已存在邮箱{item.Email}"); if (emails.Where(u => u == item.Email).Count() > 1) - item.ErrorInfo.Add(nameof(item.Email), $"邮箱重复"); + item.ErrorInfo.Add(nameof(item.Email), "邮箱重复"); } #endregion 校验邮箱 @@ -810,14 +914,15 @@ public class SysUserService : DbRepository, ISysUserService if (!string.IsNullOrEmpty(item.OrgName)) { - var org = sysOrgs.Where(u => u.Names == item.OrgName).FirstOrDefault(); + var org = sysOrgList.Where(u => u.Names == item.OrgName).FirstOrDefault(); if (org != null) item.OrgId = org.Id;//赋值组织Id else item.ErrorInfo.Add(nameof(item.OrgName), $"部门{org}不存在"); } //校验职位 if (!string.IsNullOrEmpty(item.PositionName)) { - if (string.IsNullOrEmpty(item.OrgName)) item.ErrorInfo.Add(nameof(item.PositionName), $"请填写部门"); + if (string.IsNullOrEmpty(item.OrgName)) + item.ErrorInfo.Add(nameof(item.PositionName), "请填写部门"); else { //根据部门ID和职位名判断是否有职位 @@ -831,22 +936,26 @@ public class SysUserService : DbRepository, ISysUserService #region 校验性别等字典 - var genders = await _dictService.GetValuesByDictValue(DevDictConst.GENDER, dicts); - if (!genders.Contains(item.Gender)) item.ErrorInfo.Add(nameof(item.Gender), $"性别只能是男和女"); + var genders = await _dictService.GetValuesByDictValue(SysDictConst.GENDER, dictList); + if (!genders.Contains(item.Gender)) + item.ErrorInfo.Add(nameof(item.Gender), "性别只能是男和女"); if (!string.IsNullOrEmpty(item.Nation)) { - var nations = await _dictService.GetValuesByDictValue(DevDictConst.NATION, dicts); - if (!nations.Contains(item.Nation)) item.ErrorInfo.Add(nameof(item.Nation), $"不存在的民族"); + var nations = await _dictService.GetValuesByDictValue(SysDictConst.NATION, dictList); + if (!nations.Contains(item.Nation)) + item.ErrorInfo.Add(nameof(item.Nation), "不存在的民族"); } if (!string.IsNullOrEmpty(item.IdCardType)) { - var idCarTypes = await _dictService.GetValuesByDictValue(DevDictConst.IDCARD_TYPE, dicts); - if (!idCarTypes.Contains(item.IdCardType)) item.ErrorInfo.Add(nameof(item.IdCardType), $"证件类型错误"); + var idCarTypes = await _dictService.GetValuesByDictValue(SysDictConst.ID_CARD_TYPE, dictList); + if (!idCarTypes.Contains(item.IdCardType)) + item.ErrorInfo.Add(nameof(item.IdCardType), "证件类型错误"); } if (!string.IsNullOrEmpty(item.CultureLevel)) { - var cultrueLevels = await _dictService.GetValuesByDictValue(DevDictConst.CULTURE_LEVEL, dicts); - if (!cultrueLevels.Contains(item.CultureLevel)) item.ErrorInfo.Add(nameof(item.CultureLevel), $"文化程度有误"); + var cultureLevels = await _dictService.GetValuesByDictValue(SysDictConst.CULTURE_LEVEL, dictList); + if (!cultureLevels.Contains(item.CultureLevel)) + item.ErrorInfo.Add(nameof(item.CultureLevel), "文化程度有误"); } #endregion 校验性别等字典 @@ -865,7 +974,7 @@ public class SysUserService : DbRepository, ISysUserService //默认值赋值 sysUsers.ForEach(user => { - user.UserStatus = DevDictConst.COMMON_STATUS_ENABLE;//状态 + user.Status = CommonStatusConst.ENABLE;//状态 user.Phone = CryptogramUtil.Sm4Encrypt(user.Phone);//手机号 user.Password = defaultPassword;//默认密码 user.Avatar = AvatarUtil.GetNameImageBase64(user.Name);//默认头像 @@ -883,7 +992,7 @@ public class SysUserService : DbRepository, ISysUserService private async Task GetDefaultPassWord(bool isSm4 = false) { //获取默认密码 - var defaultPassword = (await _configService.GetByConfigKey(CateGoryConst.Config_PWD_POLICY, DevConfigConst.PWD_DEFAULT_PASSWORD)).ConfigValue; + var defaultPassword = (await _configService.GetByConfigKey(CateGoryConst.CONFIG_PWD_POLICY, SysConfigConst.PWD_DEFAULT_PASSWORD)).ConfigValue; return isSm4 ? CryptogramUtil.Sm4Encrypt(defaultPassword) : defaultPassword;//判断是否需要加密 } @@ -893,8 +1002,17 @@ public class SysUserService : DbRepository, ISysUserService /// private async Task CheckInput(SysUser sysUser) { - //判断账号重复,直接从redis拿 - var accountId = await GetIdByAccount(sysUser.Account); + var sysOrgList = await _sysOrgService.GetListAsync();//获取组织列表 + var userOrg = sysOrgList.FirstOrDefault(it => it.Id == sysUser.OrgId); + if (userOrg == null) + throw Oops.Bah($"组织机构不存在"); + //获取多租户配置 + var isTenant = await _configService.IsTenant(); + long? tenantId = null; + if (isTenant) + tenantId = await _sysOrgService.GetTenantIdByOrgId(sysUser.OrgId, sysOrgList); + //判断账号重复,直接从缓存拿 + var accountId = await GetIdByAccount(sysUser.Account, tenantId); if (accountId > 0 && accountId != sysUser.Id) throw Oops.Bah($"存在重复的账号:{sysUser.Account}"); //如果手机号不是空 @@ -902,7 +1020,7 @@ public class SysUserService : DbRepository, ISysUserService { if (!sysUser.Phone.MatchPhoneNumber())//验证手机格式 throw Oops.Bah($"手机号码:{sysUser.Phone} 格式错误"); - var phoneId = await GetIdByPhone(sysUser.Phone); + var phoneId = await GetIdByPhone(sysUser.Phone, tenantId); if (phoneId > 0 && sysUser.Id != phoneId)//判断重复 throw Oops.Bah($"存在重复的手机号:{sysUser.Phone}"); sysUser.Phone = CryptogramUtil.Sm4Encrypt(sysUser.Phone); @@ -910,12 +1028,16 @@ public class SysUserService : DbRepository, ISysUserService //如果邮箱不是空 if (!string.IsNullOrEmpty(sysUser.Email)) { - var (ismatch, match) = sysUser.Email.MatchEmail();//验证邮箱格式 - if (!ismatch) + var (isMatch, match) = sysUser.Email.MatchEmail();//验证邮箱格式 + if (!isMatch) throw Oops.Bah($"邮箱:{sysUser.Email} 格式错误"); if (await IsAnyAsync(it => it.Email == sysUser.Email && it.Id != sysUser.Id)) throw Oops.Bah($"存在重复的邮箱:{sysUser.Email}"); } + if (sysUser.DirectorId != null) + { + if (sysUser.DirectorId.Value == UserManager.UserId) throw Oops.Bah($"不能设置自己为主管"); + } } /// @@ -948,29 +1070,27 @@ public class SysUserService : DbRepository, ISysUserService } /// - /// 获取Sqlsugar的ISugarQueryable - /// + /// 获取SqlSugar的ISugarQueryable + /// /// /// private async Task> GetQuery(UserPageInput input) { var orgIds = await _sysOrgService.GetOrgChildIds(input.OrgId);//获取下级机构 - var query = Context.Queryable().LeftJoin((u, o) => u.OrgId == o.Id) - .LeftJoin((u, o, p) => u.PositionId == p.Id) + var query = Context.Queryable().LeftJoin((u, o) => u.OrgId == o.Id).LeftJoin((u, o, p) => u.PositionId == p.Id) .WhereIF(input.OrgId > 0, u => orgIds.Contains(u.OrgId))//根据组织 .WhereIF(input.Expression != null, input.Expression?.ToExpression())//动态查询 - .WhereIF(!string.IsNullOrEmpty(input.UserStatus), u => u.UserStatus == input.UserStatus)//根据状态查询 + .WhereIF(!string.IsNullOrEmpty(input.Status), u => u.Status == input.Status)//根据状态查询 .WhereIF(!string.IsNullOrEmpty(input.SearchKey), u => u.Name.Contains(input.SearchKey) || u.Account.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"u.{input.SortField} {input.SortOrder}") - .OrderBy(u => u.Id)//排序 + .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"u.{input.SortField} {input.SortOrder}").OrderBy(u => u.Id)//排序 + .OrderBy((u, o) => u.CreateTime)//排序 .Select((u, o, p) => new SysUser { Id = u.Id.SelectAll(), OrgName = o.Name, PositionName = p.Name, OrgNames = o.Names - }) - .Mapper(u => + }).Mapper(u => { u.Password = null;//密码清空 u.Phone = CryptogramUtil.Sm4Decrypt(u.Phone);//手机号解密 @@ -978,7 +1098,6 @@ public class SysUserService : DbRepository, ISysUserService return query; } - /// /// 数据库获取用户信息 /// @@ -986,21 +1105,26 @@ public class SysUserService : DbRepository, ISysUserService /// private async Task GetUserFromDb(long userId) { - var sysUser = await Context.Queryable() - .LeftJoin((u, o) => u.OrgId == o.Id)//连表 + var sysUser = await Context.Queryable().LeftJoin((u, o) => u.OrgId == o.Id)//连表 .LeftJoin((u, o, p) => u.PositionId == p.Id)//连表 .Where(u => u.Id == userId) .Select((u, o, p) => new SysUser { Id = u.Id.SelectAll(), OrgName = o.Name, - PositionName = p.Name - }) - .FirstAsync(); + OrgNames = o.Names, + PositionName = p.Name, + OrgAndPosIdList = o.ParentIdList + }).FirstAsync(); if (sysUser != null) { sysUser.Password = CryptogramUtil.Sm4Decrypt(sysUser.Password);//解密密码 sysUser.Phone = CryptogramUtil.Sm4Decrypt(sysUser.Phone);//解密手机号 + sysUser.OrgAndPosIdList.AddRange(sysUser.OrgId, sysUser.PositionId);//添加组织和职位Id + if (sysUser.DirectorId != null) + { + sysUser.DirectorInfo = await GetUserById(sysUser.DirectorId.Value);//获取主管信息 + } //获取按钮码 var buttonCodeList = await GetButtonCodeList(sysUser.Id); //获取数据权限 @@ -1008,21 +1132,33 @@ public class SysUserService : DbRepository, ISysUserService //获取权限码 var permissionCodeList = dataScopeList.Select(it => it.ApiUrl).ToList(); //获取角色码 - var roleCodeList = await _roleService.GetRoleListByUserId(sysUser.Id); + var roleCodeList = await _sysRoleService.GetRoleListByUserId(sysUser.Id); //权限码赋值 sysUser.ButtonCodeList = buttonCodeList; sysUser.RoleCodeList = roleCodeList.Select(it => it.Code).ToList(); sysUser.RoleIdList = roleCodeList.Select(it => it.Id).ToList(); sysUser.PermissionCodeList = permissionCodeList; sysUser.DataScopeList = dataScopeList; - var scopeOrgChildList = (await _sysOrgService.GetChildListById(sysUser.OrgId)).Select(it => it.Id).ToList();//获取所属机构的下级机构Id列表 + var sysOrgList = await _sysOrgService.GetListAsync(); + var scopeOrgChildList = + (await _sysOrgService.GetChildListById(sysUser.OrgId, true, sysOrgList)).Select(it => it.Id).ToList();//获取所属机构的下级机构Id列表 sysUser.ScopeOrgChildList = scopeOrgChildList; - //插入Redis - _simpleCacheService.HashAdd(SystemConst.Cache_SysUser, sysUser.Id.ToString(), sysUser); + if (await _configService.IsTenant())//如果是多租户就获取用户的租户Id + { + var tenantId = await _sysOrgService.GetTenantIdByOrgId(sysUser.OrgId, sysOrgList); + sysUser.TenantId = tenantId; + } + var moduleIds = await _relationService.GetUserModuleId(sysUser.RoleIdList, sysUser.Id);//获取模块ID列表 + var modules = await _resourceService.GetResourcesByIds(moduleIds, CateGoryConst.RESOURCE_MODULE);//获取模块列表 + sysUser.ModuleList = modules;//模块列表赋值给用户 + //插入缓存 + _simpleCacheService.HashAdd(SystemConst.CACHE_SYS_USER_AVATAR, sysUser.Id.ToString(), sysUser.Avatar); + sysUser.Avatar = null;//头像清空,减少CACHE_SYS_USER的大小 + _simpleCacheService.HashAdd(SystemConst.CACHE_SYS_USER, sysUser.Id.ToString(), sysUser); return sysUser; } return null; } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/Dto/SysOrgOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/Dto/SysOrgOutput.cs deleted file mode 100644 index 10b1c277eff201aeb5c7d4f13a97f4545de34af6..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/Dto/SysOrgOutput.cs +++ /dev/null @@ -1 +0,0 @@ -namespace SimpleAdmin.System; \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/Dto/PositionOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/Dto/PositionOutput.cs deleted file mode 100644 index 10b1c277eff201aeb5c7d4f13a97f4545de34af6..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/Dto/PositionOutput.cs +++ /dev/null @@ -1 +0,0 @@ -namespace SimpleAdmin.System; \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/Dto/RelationInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/Dto/RelationInput.cs index 10b1c277eff201aeb5c7d4f13a97f4545de34af6..cfde937b2177320a060cf6539690df5ed58f58e5 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/Dto/RelationInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/Dto/RelationInput.cs @@ -1 +1,14 @@ -namespace SimpleAdmin.System; \ No newline at end of file +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + + + + + diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/Dto/RelationOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/Dto/RelationOutput.cs index 52dd398c300d7245ddec34b64d79180c1e7c7182..8836584d21be1f6edfc20db1e7438e48e53e0266 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/Dto/RelationOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/Dto/RelationOutput.cs @@ -1,5 +1,15 @@ -namespace SimpleAdmin.System.Services.System.Relation.Dto; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System.Services.System.Relation.Dto; public class RelationOutput { -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/IRelationService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/IRelationService.cs index 0fde3319a28367152bf65f278c3191bdc965cb0b..edb4c1c95e444768772dad18b20488d5f1d44f0f 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/IRelationService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/IRelationService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 关系服务 @@ -68,7 +78,8 @@ public interface IRelationService : ITransient /// 是否清除老的数据 /// 是否刷新缓存 /// - Task SaveRelation(string category, long objectId, string targetId, string extJson, bool clear, bool refreshCache = true); + Task SaveRelation(string category, long objectId, string targetId, + string extJson, bool clear, bool refreshCache = true); /// /// 批量保存关系 @@ -79,5 +90,14 @@ public interface IRelationService : ITransient /// 拓展信息列表 /// 是否清除老的数据 /// - Task SaveRelationBatch(string category, long objectId, List targetIds, List extJsons, bool clear); -} \ No newline at end of file + Task SaveRelationBatch(string category, long objectId, List targetIds, + List extJsons, bool clear); + + /// + /// 获取用户模块ID + /// + /// + /// + /// + Task> GetUserModuleId(List roleIdList, long userId); +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/RelationService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/RelationService.cs index 5e5862cbe615e33156564661f1fd13c2b863fc20..66fe096caa72a888d0a59e277dad8f99c6a59ae4 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/RelationService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/RelationService.cs @@ -1,23 +1,31 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// -public class Relationservice : DbRepository, IRelationService +public class RelationService : DbRepository, IRelationService { - private readonly ILogger _logger; + private readonly ILogger _logger; private readonly ISimpleCacheService _simpleCacheService; - private readonly IResourceService _resourceService; - public Relationservice(ILogger logger, ISimpleCacheService simpleCacheService, IResourceService resourceService) + public RelationService(ILogger logger, ISimpleCacheService simpleCacheService) { _logger = logger; _simpleCacheService = simpleCacheService; - _resourceService = resourceService; } /// public async Task> GetRelationByCategory(string category) { - var key = SystemConst.Cache_SysRelation + category; + var key = SystemConst.CACHE_SYS_RELATION + category; //先从Redis拿 var sysRelations = _simpleCacheService.Get>(key); if (sysRelations == null) @@ -44,7 +52,7 @@ public class Relationservice : DbRepository, IRelationService /// public async Task GetWorkbench(long userId) { - var sysRelations = await GetRelationByCategory(CateGoryConst.Relation_SYS_USER_WORKBENCH_DATA); + var sysRelations = await GetRelationByCategory(CateGoryConst.RELATION_SYS_USER_WORKBENCH_DATA); var result = sysRelations.Where(it => it.ObjectId == userId).FirstOrDefault();//获取个人工作台 return result; } @@ -76,7 +84,7 @@ public class Relationservice : DbRepository, IRelationService /// public async Task RefreshCache(string category) { - var key = SystemConst.Cache_SysRelation + category;//key + var key = SystemConst.CACHE_SYS_RELATION + category;//key _simpleCacheService.Remove(key);//删除redis await GetRelationByCategory(category);//更新缓存 } @@ -97,7 +105,7 @@ public class Relationservice : DbRepository, IRelationService }); } //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { if (clear) await DeleteAsync(it => it.ObjectId == objectId && it.Category == category);//删除老的 @@ -127,7 +135,7 @@ public class Relationservice : DbRepository, IRelationService ExtJson = extJson }; //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { if (clear) await DeleteAsync(it => it.ObjectId == objectId && it.Category == category);//删除老的 @@ -145,4 +153,22 @@ public class Relationservice : DbRepository, IRelationService throw Oops.Oh(ErrorCodeEnum.A0003); } } -} \ No newline at end of file + + /// + public async Task> GetUserModuleId(List roleIdList, long userId) + { + var moduleIds = new List(); + var roleRelation = await GetRelationByCategory(CateGoryConst.RELATION_SYS_ROLE_HAS_MODULE);//获取角色模块关系集合 + if (roleRelation != null && roleRelation.Count > 0) + { + moduleIds = roleRelation.Where(it => roleIdList.Contains(it.ObjectId)).Select(it => it.TargetId.ToLong()).ToList(); + } + var userRelation = await GetRelationByCategory(CateGoryConst.RELATION_SYS_USER_HAS_MODULE);//获取用户模块关系集合 + if (userRelation != null && userRelation.Count > 0) + { + var userModuleIds = userRelation.Where(it => it.ObjectId == userId).Select(it => it.TargetId.ToLong()).ToList(); + moduleIds.AddRange(userModuleIds); + } + return moduleIds; + } +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Dto/ResourceInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Dto/ResourceInput.cs new file mode 100644 index 0000000000000000000000000000000000000000..a8d456371de9f3136112a1abda2d097d35a585a7 --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Dto/ResourceInput.cs @@ -0,0 +1,27 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; + +/// +/// 资源输入 +/// +public class ResTreeSelectorInput +{ + /// + /// 资源分类 + /// + public string ShowSystem { get; set; } + + /// + /// 是否包含按钮 + /// + public bool IsContainButton { get; set; } +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/Dto/ResourceOutPut.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Dto/ResourceOutPut.cs similarity index 67% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/Dto/ResourceOutPut.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Dto/ResourceOutPut.cs index 2e147a5de01413adb4b67fa12825eb8cb0b31bb1..38871d196c0d1de278d10fdbf701ef71c5c1c190 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/Dto/ResourceOutPut.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Dto/ResourceOutPut.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 角色授权资源树输出 @@ -61,6 +71,9 @@ public class ResTreeSelector public List Button { get; set; } = new List(); } + /// + /// 角色授权资源按钮信息 + /// public class RoleGrantResourceButton { /// @@ -75,6 +88,9 @@ public class ResTreeSelector } } +/// +/// 权限树选择器输出 +/// public class PermissionTreeSelector { /// @@ -91,4 +107,4 @@ public class PermissionTreeSelector /// 权限名称 /// public string PermissionName { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/IResourceService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/IResourceService.cs similarity index 53% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/IResourceService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/IResourceService.cs index 3ebff093a118fb371442b7852677f4fd0839085c..209a3fd5aaf606df96315565e087d25b214b3730 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/IResourceService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/IResourceService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 资源服务 @@ -9,7 +19,14 @@ public interface IResourceService : ITransient /// 获取所有的菜单和模块以及单页面列表,并按分类和排序码排序 /// /// 所有的菜单和模块以及单页面列表 - Task> GetaModuleAndMenuAndSpaList(); + Task> GetAllModuleAndMenuAndSpaList(); + + /// + /// 根据模块ID获取菜单和单页面列表 + /// + /// + /// + Task> GetMenuAndSpaListByModuleId(long id); /// /// 根据资源ID获取所有下级资源 @@ -39,9 +56,9 @@ public interface IResourceService : ITransient /// /// 获取资源列表 /// - /// 资源分类列表 + /// 资源分类列表 /// - Task> GetListAsync(List? categorys = null); + Task> GetListAsync(List? categoryList = null); /// /// 根据分类获取资源列表 @@ -53,9 +70,10 @@ public interface IResourceService : ITransient /// /// 根据菜单ID获取菜单 /// - /// 菜单id列表 - /// 菜单列表 - Task> GetMenuByMenuIds(List menuIds); + /// id列表 + /// 分类 + /// + Task> GetResourcesByIds(List ids, string category); /// /// 获取权限授权树 @@ -76,4 +94,20 @@ public interface IResourceService : ITransient /// /// Task> ResourceTreeSelector(); -} \ No newline at end of file + + /// + /// 获取上级 + /// + /// + /// + /// + List GetResourceParent(List resourceList, long parentId); + + /// + /// 获取授权菜单类菜单名称 + /// + /// 菜单列表 + /// 当前菜单 + /// + string GetRoleGrantResourceMenuTitle(List menuList, SysResource menu); +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/ResourceService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/ResourceService.cs similarity index 70% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/ResourceService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/ResourceService.cs index 907b06a3a48d9447ea894d9c34e5df4197afbe4f..28da60f909d80d2b9f0f3e4119581ef4f7b9ede9 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/ResourceService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/ResourceService.cs @@ -1,4 +1,14 @@ -using System.ComponentModel; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using System.ComponentModel; namespace SimpleAdmin.System; @@ -6,10 +16,12 @@ namespace SimpleAdmin.System; public class ResourceService : DbRepository, IResourceService { private readonly ISimpleCacheService _simpleCacheService; + private readonly IRelationService _relationService; - public ResourceService(ISimpleCacheService simpleCacheService) + public ResourceService(ISimpleCacheService simpleCacheService, IRelationService relationService) { _simpleCacheService = simpleCacheService; + _relationService = relationService; } /// @@ -29,7 +41,13 @@ public class ResourceService : DbRepository, IResourceService var sysResources = new List(); //定义资源分类列表,如果是空的则获取全部资源 - categoryList = categoryList != null ? categoryList : new List { CateGoryConst.Resource_MENU, CateGoryConst.Resource_BUTTON, CateGoryConst.Resource_SPA, CateGoryConst.Resource_MODULE }; + categoryList = categoryList != null + ? categoryList + : new List + { + CateGoryConst.RESOURCE_MENU, CateGoryConst.RESOURCE_BUTTON, + CateGoryConst.RESOURCE_SPA, CateGoryConst.RESOURCE_MODULE + }; //遍历列表 foreach (var category in categoryList) { @@ -42,10 +60,13 @@ public class ResourceService : DbRepository, IResourceService } /// - public async Task> GetaModuleAndMenuAndSpaList() + public async Task> GetAllModuleAndMenuAndSpaList() { //获取所有的菜单和模块以及单页面列表, - var sysResources = await GetListAsync(new List { CateGoryConst.Resource_MODULE, CateGoryConst.Resource_MENU, CateGoryConst.Resource_SPA }); + var sysResources = await GetListAsync(new List + { + CateGoryConst.RESOURCE_MODULE, CateGoryConst.RESOURCE_MENU, CateGoryConst.RESOURCE_SPA + }); if (sysResources != null) { //并按分类和排序码排序 @@ -54,6 +75,20 @@ public class ResourceService : DbRepository, IResourceService return sysResources; } + /// + public async Task> GetMenuAndSpaListByModuleId(long id) + { + //获取所有的菜单和模块以及单页面列表, + var sysResources = await GetListAsync(new List { CateGoryConst.RESOURCE_MENU, CateGoryConst.RESOURCE_SPA }); + if (sysResources != null) + { + //并按分类和排序码排序 + sysResources = sysResources.Where(it => it.Category == CateGoryConst.RESOURCE_SPA || it.Module == id)//根据模块ID获取菜单 + .OrderBy(it => it.Category).ThenBy(it => it.SortCode).ToList();//排序 + } + return sysResources; + } + /// public async Task RefreshCache(string category = null) { @@ -61,13 +96,13 @@ public class ResourceService : DbRepository, IResourceService if (category == null) { //删除全部key - _simpleCacheService.DelByPattern(SystemConst.Cache_SysResource); + _simpleCacheService.DelByPattern(SystemConst.CACHE_SYS_RESOURCE); await GetListAsync(); } else { //否则只删除一个Key - _simpleCacheService.Remove(SystemConst.Cache_SysResource + category); + _simpleCacheService.Remove(SystemConst.CACHE_SYS_RESOURCE + category); await GetListByCategory(category); } } @@ -78,35 +113,35 @@ public class ResourceService : DbRepository, IResourceService //获取所有机构 var sysResources = await GetListAsync(); //查找下级 - var childLsit = GetResourceChilden(sysResources, resId); + var childList = GetResourceChildren(sysResources, resId); if (isContainOneself)//如果包含自己 { //获取自己的机构信息 var self = sysResources.Where(it => it.Id == resId).FirstOrDefault(); - if (self != null) childLsit.Insert(0, self);//如果机构不为空就插到第一个 + if (self != null) childList.Insert(0, self);//如果机构不为空就插到第一个 } - return childLsit; + return childList; } /// public List GetChildListById(List sysResources, long resId, bool isContainOneself = true) { //查找下级 - var childLsit = GetResourceChilden(sysResources, resId); + var childList = GetResourceChildren(sysResources, resId); if (isContainOneself)//如果包含自己 { //获取自己的机构信息 var self = sysResources.Where(it => it.Id == resId).FirstOrDefault(); - if (self != null) childLsit.Insert(0, self);//如果机构不为空就插到第一个 + if (self != null) childList.Insert(0, self);//如果机构不为空就插到第一个 } - return childLsit; + return childList; } /// public async Task> GetListByCategory(string category) { //先从Redis拿 - var sysResources = _simpleCacheService.Get>(SystemConst.Cache_SysResource + category); + var sysResources = _simpleCacheService.Get>(SystemConst.CACHE_SYS_RESOURCE + category); if (sysResources == null) { //redis没有就去数据库拿 @@ -114,7 +149,7 @@ public class ResourceService : DbRepository, IResourceService if (sysResources.Count > 0) { //插入Redis - _simpleCacheService.Set(SystemConst.Cache_SysResource + category, sysResources); + _simpleCacheService.Set(SystemConst.CACHE_SYS_RESOURCE + category, sysResources); } } return sysResources; @@ -123,9 +158,9 @@ public class ResourceService : DbRepository, IResourceService /// public async Task> ResourceTreeSelector() { - List resourceTreeSelectors = new List();//定义结果 + var resourceTreeSelectors = new List();//定义结果 //获取模块列表 - var moduleList = await GetListByCategory(CateGoryConst.Resource_MODULE); + var moduleList = await GetListByCategory(CateGoryConst.RESOURCE_MODULE); //遍历模块 foreach (var module in moduleList) { @@ -140,12 +175,14 @@ public class ResourceService : DbRepository, IResourceService /// public List PermissionTreeSelector(List routes) { - List permissions = new List();//权限列表 - - // 获取所有需要数据权限的控制器 - var controllerTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.IsDefined(typeof(RolePermissionAttribute), false)); + var permissions = new List();//权限列表 + var controllerTypes = + App.EffectiveTypes.Where(u => + !u.IsInterface && !u.IsAbstract && u.IsDefined(typeof(RolePermissionAttribute), false)); foreach (var controller in controllerTypes) { + var apiAttribute = controller.GetCustomAttribute();//获取接口描述特性 + var tag = apiAttribute.Tag;//获取标签 //获取数据权限特性 var routeAttributes = controller.GetCustomAttributes().ToList(); if (routeAttributes == null) @@ -156,35 +193,37 @@ public class ResourceService : DbRepository, IResourceService if (routes.Contains(routeName)) { //获取所有方法 - var menthods = controller.GetMethods(); + var methods = controller.GetMethods(); //遍历方法 - foreach (var menthod in menthods) + foreach (var method in methods) { //获取忽略数据权限特性 - var ignoreRolePermission = menthod.GetCustomAttribute(); + var ignoreRolePermission = method.GetCustomAttribute(); if (ignoreRolePermission == null)//如果是空的代表需要数据权限 { //获取接口描述 - var displayName = menthod.GetCustomAttribute(); + var displayName = method.GetCustomAttribute(); if (displayName != null) { //默认路由名称 - var apiRoute = StringHelper.FirstCharToLower(menthod.Name); + var apiRoute = StringHelper.FirstCharToLower(method.Name); //获取get特性 - var requestGet = menthod.GetCustomAttribute(); + var requestGet = method.GetCustomAttribute(); if (requestGet != null)//如果是get方法 apiRoute = requestGet.Template; else { //获取post特性 - var requestPost = menthod.GetCustomAttribute(); + var requestPost = method.GetCustomAttribute(); if (requestPost != null)//如果是post方法 apiRoute = requestPost.Template; } apiRoute = route.Template + $"/{apiRoute}"; + if (!apiRoute.StartsWith("/")) + apiRoute = "/" + apiRoute;//如果路由地址不是/开头则加上/防止控制器没写 var apiName = displayName.DisplayName;//如果描述不为空则接口名称用描述的名称 //合并 - var permissionName = apiRoute + $"[{apiName}]"; + var permissionName = apiRoute + $"[{tag}-{apiName}]"; //添加到权限列表 permissions.Add(new PermissionTreeSelector { @@ -201,15 +240,35 @@ public class ResourceService : DbRepository, IResourceService } /// - public async Task> GetMenuByMenuIds(List menuIds) + public async Task> GetResourcesByIds(List ids, string category) { //获取所有菜单 - var menuList = await GetListByCategory(CateGoryConst.Resource_MENU); - //获取菜单信息 - var menus = menuList.Where(it => menuIds.Contains(it.Id)).ToList(); + var menus = await GetListByCategory(category); + if (!UserManager.SuperAdmin)//超级管理员获取所有 + { + //获取菜单信息 + menus = menus.Where(it => ids.Contains(it.Id)).ToList(); + } return menus; } + + /// + public List GetResourceParent(List resourceList, long parentId) + { + //找上级资源ID列表 + var resources = resourceList.Where(it => it.Id == parentId).FirstOrDefault(); + if (resources != null)//如果数量大于0 + { + var data = new List(); + var parents = GetResourceParent(resourceList, resources.ParentId.Value); + data.AddRange(parents);//添加子节点; + data.Add(resources);//添加到列表 + return data;//返回结果 + } + return new List(); + } + #region 方法 /// @@ -238,7 +297,7 @@ public class ResourceService : DbRepository, IResourceService /// 资源列表 /// 父ID /// - public List GetResourceChilden(List resourceList, long parentId) + public List GetResourceChildren(List resourceList, long parentId) { //找下级资源ID列表 var resources = resourceList.Where(it => it.ParentId == parentId).ToList(); @@ -247,7 +306,7 @@ public class ResourceService : DbRepository, IResourceService var data = new List(); foreach (var item in resources)//遍历资源 { - var res = GetResourceChilden(resourceList, item.Id); + var res = GetResourceChildren(resourceList, item.Id); data.AddRange(res);//添加子节点; data.Add(item);//添加到列表 } @@ -256,27 +315,6 @@ public class ResourceService : DbRepository, IResourceService return new List(); } - /// - /// 获取上级 - /// - /// - /// - /// - public List GetResourceParent(List resourceList, long parentId) - { - //找上级资源ID列表 - var resources = resourceList.Where(it => it.Id == parentId).FirstOrDefault(); - if (resources != null)//如果数量大于0 - { - var data = new List(); - var parents = GetResourceParent(resourceList, resources.ParentId.Value); - data.AddRange(parents);//添加子节点; - data.Add(resources);//添加到列表 - return data;//返回结果 - } - return new List(); - } - /// /// 获取授权菜单 /// @@ -285,15 +323,15 @@ public class ResourceService : DbRepository, IResourceService public async Task> GetRoleGrantResourceMenus(long moduleId) { var roleGrantResourceMenus = new List();//定义结果 - List allMenuList = (await GetListByCategory(CateGoryConst.Resource_MENU)).Where(it => it.Module == moduleId).ToList();//获取所有菜单列表 - List allButtonList = await GetListByCategory(CateGoryConst.Resource_BUTTON);//获取所有按钮列表 - var parentMenuList = allMenuList.Where(it => it.ParentId == SimpleAdminConst.Zero).ToList();//获取一级目录 + var allMenuList = (await GetListByCategory(CateGoryConst.RESOURCE_MENU)).Where(it => it.Module == moduleId).ToList();//获取所有菜单列表 + var allButtonList = await GetListByCategory(CateGoryConst.RESOURCE_BUTTON);//获取所有按钮列表 + var parentMenuList = allMenuList.Where(it => it.ParentId == SimpleAdminConst.ZERO).ToList();//获取一级目录 //遍历一级目录 foreach (var parent in parentMenuList) { //如果是目录则去遍历下级 - if (parent.MenuType == ResourceConst.CATALOG) + if (parent.MenuType == SysResourceConst.CATALOG) { //获取所有下级菜单 var menuList = GetChildListById(allMenuList, parent.Id, false); @@ -303,7 +341,7 @@ public class ResourceService : DbRepository, IResourceService foreach (var menu in menuList) { //如果菜单类型是菜单 - if (menu.MenuType == ResourceConst.MENU) + if (menu.MenuType is SysResourceConst.MENU or SysResourceConst.SUBSET) { //获取菜单下按钮集合并转换成对应实体 var buttonList = allButtonList.Where(it => it.ParentId == menu.Id).ToList(); @@ -318,7 +356,7 @@ public class ResourceService : DbRepository, IResourceService Button = buttons }); } - else if (menu.MenuType == ResourceConst.LINK || menu.MenuType == ResourceConst.IFRAME)//如果是内链或者外链 + else if (menu.MenuType == SysResourceConst.LINK || menu.MenuType == SysResourceConst.IFRAME)//如果是内链或者外链 { //直接加到资源列表 roleGrantResourceMenus.Add(new ResTreeSelector.RoleGrantResourceMenu @@ -356,7 +394,7 @@ public class ResourceService : DbRepository, IResourceService Title = parent.Title }; //如果菜单类型是菜单 - if (parent.MenuType == ResourceConst.MENU) + if (parent.MenuType == SysResourceConst.MENU) { //获取菜单下按钮集合并转换成对应实体 var buttonList = allButtonList.Where(it => it.ParentId == parent.Id).ToList(); @@ -368,13 +406,9 @@ public class ResourceService : DbRepository, IResourceService return roleGrantResourceMenus; } - /// - /// 获取授权菜单类菜单名称 - /// - /// 菜单列表 - /// 当前菜单 - /// - private string GetRoleGrantResourceMenuTitle(List menuList, SysResource menu) + + /// + public string GetRoleGrantResourceMenuTitle(List menuList, SysResource menu) { //查找菜单上级 var parentList = GetResourceParent(menuList, menu.ParentId.Value); @@ -385,11 +419,8 @@ public class ResourceService : DbRepository, IResourceService var title = string.Join("- ", titles) + $"-{menu.Title}";//根据-分割,转换成字符串并在最后加上菜单的title return title; } - else - { - return menu.Title;//原路返回 - } + return menu.Title;//原路返回 } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterInput.cs index 4b973dc4eaa9edf2c435d9d78be68f8ed177d135..de4b0b1663bae58b3157fa0470b5cbaf9238d202 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterInput.cs @@ -1,11 +1,20 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 编辑个人信息参数 /// public class UpdateInfoInput : SysUser { - /// /// 姓名 /// @@ -26,9 +35,10 @@ public class UpdateSignatureInput /// 更新个人工作台 /// public class UpdateWorkbenchInput -{ /// - /// 工作台数据 - /// +{ + /// + /// 工作台数据 + /// [Required(ErrorMessage = "WorkbenchData不能为空")] public string WorkbenchData { get; set; } } @@ -49,4 +59,22 @@ public class UpdatePasswordInput /// [Required(ErrorMessage = "NewPassword不能为空")] public string NewPassword { get; set; } -} \ No newline at end of file +} + +/// +/// 设置默认模块输入 +/// +public class SetDefaultModuleInput +{ + /// + /// 模块Id + /// + [Required(ErrorMessage = "Id不能为空")] + public long Id { get; set; } + + /// + /// 是否默认 + /// + [Required(ErrorMessage = "IfDefault不能为空")] + public bool IfDefault { get; set; } +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterOutput.cs index ea979e9eb5c7fd7b45bc9f49f724f61c8c0a7028..fb56f36be646c66df48df9390e2d058ee002bb86 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterOutput.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 我的机构数样式 @@ -28,7 +38,7 @@ public class LoginOrgTreeOutput /// /// 样式 /// - public MyStyle Style { get; set; } + public MyStyle? Style { get; set; } /// /// 我的机构样式 @@ -45,4 +55,4 @@ public class LoginOrgTreeOutput /// public string Color { get; set; } = "#FFF"; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/IUserCenterService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/IUserCenterService.cs index 90a9803dbbea80e697e008df78e87703b838eb33..c0b41a82468eaa5ad41a227c82642fcd9d132f9a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/IUserCenterService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/IUserCenterService.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 个人信息中心服务 @@ -8,10 +18,11 @@ public interface IUserCenterService : ITransient #region 查询 /// - /// 获取个人菜单 + /// 获取登录用户菜单 /// + /// /// - Task> GetOwnMenu(); + Task> GetLoginMenu(BaseIdInput input); /// /// 获取个人工作台 @@ -26,24 +37,10 @@ public interface IUserCenterService : ITransient Task> LoginOrgTree(); /// - /// 获取登录用户的站内信分页 - /// - /// 查询参数 - /// 站内信列表 - Task> LoginMessagePage(MessagePageInput input); - - /// - /// 读取登录用户站内信详情 - /// - /// 消息ID - /// 消息详情 - Task LoginMessageDetail(BaseIdInput input); - - /// - /// 获取未读消息数量 + /// 获取快捷菜单树 /// - /// 未读消息数量 - Task UnReadCount(); + /// + Task> ShortcutTree(); #endregion 查询 @@ -91,5 +88,56 @@ public interface IUserCenterService : ITransient /// Task UpdateAvatar(BaseFileInput input); + /// + /// 修改默认模块 + /// + /// 默认模块输入参数 + /// + Task SetDefaultModule(SetDefaultModuleInput input); + #endregion 编辑 -} \ No newline at end of file + + #region 我的消息 + + /// + /// 获取登录用户的站内信分页 + /// + /// 查询参数 + /// 站内信列表 + Task> MyMessagePage(MessagePageInput input); + + /// + /// 读取登录用户站内信详情 + /// + /// 消息ID + /// 消息详情 + Task MyMessageDetail(BaseIdInput input); + + /// + /// 获取未读消息数量 + /// + /// 未读消息数量 + Task> UnReadCount(); + + /// + /// 最新未读消息 + /// + /// + Task> NewUnRead(); + + /// + /// 设置已读 + /// + /// + /// + Task SetRead(MessageReadInput input); + + /// + /// 删除我的消息 + /// + /// + /// + Task SetDelete(MessageReadInput input); + + #endregion +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs index 877148b48c7f631cb26ac04f619186e587b6334a..c2b6539e6fce5a5955298201fd77614f9ee223a9 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs @@ -1,4 +1,14 @@ -using System.Text.RegularExpressions; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using System.Text.RegularExpressions; namespace SimpleAdmin.System; @@ -13,12 +23,8 @@ public class UserCenterService : DbRepository, IUserCenterService private readonly ISysOrgService _sysOrgService; private readonly IMessageService _messageService; - public UserCenterService(ISysUserService userService, - IRelationService relationService, - IResourceService resourceService, - IMenuService menuService, - IConfigService configService, - ISysOrgService sysOrgService, + public UserCenterService(ISysUserService userService, IRelationService relationService, IResourceService resourceService, + IMenuService menuService, IConfigService configService, ISysOrgService sysOrgService, IMessageService messageService) { _userService = userService; @@ -33,27 +39,35 @@ public class UserCenterService : DbRepository, IUserCenterService #region 查询 /// - public async Task> GetOwnMenu() + public async Task> GetLoginMenu(BaseIdInput input) { var result = new List(); //获取用户信息 - var userInfo = await _userService.GetUserByAccount(UserManager.UserAccount); + var userInfo = await _userService.GetUserByAccount(UserManager.UserAccount, UserManager.TenantId); if (userInfo != null) { - //获取用户所拥有的资源集合 - var resourceList = await _relationService.GetRelationListByObjectIdAndCategory(userInfo.Id, CateGoryConst.Relation_SYS_USER_HAS_RESOURCE); - if (resourceList.Count == 0)//如果没有就获取角色的 - //获取角色所拥有的资源集合 - resourceList = await _relationService.GetRelationListByObjectIdListAndCategory(userInfo.RoleIdList, CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE); //定义菜单ID列表 - var menuIdList = new HashSet(); - - //获取菜单集合 - menuIdList.AddRange(resourceList.Select(r => r.TargetId.ToLong()).ToList()); - - //获取所有的菜单和模块以及单页面列表,并按分类和排序码排序 - var allModuleAndMenuAndSpaList = await _resourceService.GetaModuleAndMenuAndSpaList(); - var allModuleList = new List();//模块列表 + var menuIdList = new HashSet();//获取所有的菜单和模块以及单页面列表,并按分类和排序码排序 + var allModuleAndMenuAndSpaList = await _resourceService.GetMenuAndSpaListByModuleId(input.Id); + //通过 App.GetOptions 获取选项 + var settings = App.GetOptions(); + //如果设置了超级管理员可以看到全部 + if (settings.SuperAdminViewAllData && UserManager.SuperAdmin) + { + menuIdList = allModuleAndMenuAndSpaList.Select(it => it.Id).ToHashSet(); + } + else + { + //获取用户所拥有的资源集合 + var resourceList = + await _relationService.GetRelationListByObjectIdAndCategory(userInfo.Id, CateGoryConst.RELATION_SYS_USER_HAS_RESOURCE); + if (resourceList.Count == 0)//如果没有就获取角色的 + //获取角色所拥有的资源集合 + resourceList = await _relationService.GetRelationListByObjectIdListAndCategory(userInfo.RoleIdList, + CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE); + //获取菜单Id集合 + menuIdList.AddRange(resourceList.Select(r => r.TargetId.ToLong()).ToList()); + } var allMenuList = new List();//菜单列表 var allSpaList = new List();//单页列表 //遍历菜单集合 @@ -61,43 +75,28 @@ public class UserCenterService : DbRepository, IUserCenterService { switch (it.Category) { - case CateGoryConst.Resource_MODULE://模块 - it.Name = it.Title;//设置Name等于title - allModuleList.Add(it);//添加到模块列表 - break; - - case CateGoryConst.Resource_MENU://菜单 + case CateGoryConst.RESOURCE_MENU://菜单 allMenuList.Add(it);//添加到菜单列表 break; - case CateGoryConst.Resource_SPA://单页 + case CateGoryConst.RESOURCE_SPA://单页 allSpaList.Add(it);//添加到单页列表 break; } }); - //获取我的菜单列表 - var myMenus = allMenuList.Where(it => menuIdList.Contains(it.Id)).ToList(); + //获取我的菜单列表,只显示启用的 + var myMenus = allMenuList.Where(it => menuIdList.Contains(it.Id) && it.Status == CommonStatusConst.ENABLE).ToList(); // 对获取到的角色对应的菜单列表进行处理,获取父列表 var parentList = GetMyParentMenus(allMenuList, myMenus); myMenus.AddRange(parentList);//合并列表 - //获取我的模块信息Id列表 - var moduleIds = myMenus.Select(it => it.Module.Value).Distinct().ToList(); - //获取我的模块集合 - var myModules = GetMyModules(allModuleList, moduleIds, allSpaList.Count); - myMenus.AddRange(myModules);//模块添加到菜单列表 // 遍历单页列表 allSpaList.ForEach(it => { - // 将第一个模块作为所有单页面的所属模块,并添加 - var firstModuleId = myModules[0].Id; - it.ParentId = firstModuleId; - it.Module = firstModuleId; + it.ParentId = SimpleAdminConst.ZERO; }); - - myMenus.AddRange(allSpaList);//但也添加到菜单 - + myMenus.AddRange(allSpaList);//单页添加到菜单 //构建meta - ConstructMeta(myMenus, allSpaList[0].Id); + ConstructMeta(myMenus); //构建菜单树 result = _menuService.ConstructMenuTrees(myMenus); } @@ -114,53 +113,73 @@ public class UserCenterService : DbRepository, IUserCenterService //如果有数据直接返回个人工作台 return sysRelation.ExtJson.ToLower(); } - else + //如果没数据去系统配置里取默认的工作台 + var devConfig = await _configService.GetByConfigKey(CateGoryConst.CONFIG_SYS_BASE, SysConfigConst.SYS_DEFAULT_WORKBENCH_DATA); + if (devConfig != null) { - //如果没数据去系统配置里取默认的工作台 - var devConfig = await _configService.GetByConfigKey(CateGoryConst.Config_SYS_BASE, DevConfigConst.SYS_DEFAULT_WORKBENCH_DATA); - if (devConfig != null) - { - return devConfig.ConfigValue.ToLower();//返回工作台信息 - } - else - { - return ""; - } + return devConfig.ConfigValue.ToLower();//返回工作台信息 } + return ""; } /// public async Task> LoginOrgTree() { var orgList = await _sysOrgService.GetListAsync();//获取全部机构 - var parentOrgs = _sysOrgService.GetOrgParents(orgList, UserManager.OrgId);//获取父节点列表 - var topOrg = parentOrgs.Where(it => it.ParentId == SimpleAdminConst.Zero).FirstOrDefault();//获取顶级节点 + var parentOrgList = _sysOrgService.GetOrgParents(orgList, UserManager.OrgId);//获取父节点列表 + var topOrg = parentOrgList.Where(it => it.ParentId == SimpleAdminConst.ZERO).FirstOrDefault();//获取顶级节点 if (topOrg != null) { - var orgs = await _sysOrgService.GetChildListById(topOrg.Id);//获取下级 - var orgTree = ConstrucOrgTrees(orgs, 0, UserManager.OrgId);//获取组织架构 + var orgChildList = await _sysOrgService.GetChildListById(topOrg.Id);//获取下级 + var orgTree = ConstrucOrgTrees(orgChildList, 0, UserManager.OrgId);//获取组织架构 return orgTree; } return new List(); } - /// - public async Task> LoginMessagePage(MessagePageInput input) - { - var messages = await _messageService.MyMessagePage(input, UserManager.UserId);//分页查询 - return messages; - } /// - public async Task LoginMessageDetail(BaseIdInput input) + public async Task> ShortcutTree() { - return await _messageService.Detail(input, true);//返回详情,不带用户列表 - } + var sysResourceList = await _resourceService.GetAllModuleAndMenuAndSpaList();//获取模块和菜单和单页列表 + var userInfo = await _userService.GetUserById(UserManager.UserId); + var hasResourcesList = new HashSet();//拥有的资源列表 + var hasModuleList = new HashSet();//拥有的资源列表 + var userResourceList = + (await _relationService.GetRelationListByObjectIdAndCategory(UserManager.UserId, CateGoryConst.RELATION_SYS_USER_HAS_RESOURCE)) + .Select(it => it.TargetId.ToLong()).ToList();//获取用户资源id列表 + var userModuleList = + (await _relationService.GetRelationListByObjectIdAndCategory(UserManager.UserId, CateGoryConst.RELATION_SYS_USER_HAS_MODULE)) + .Select(it => it.TargetId.ToLong()).ToList();//获取用户模块id列表 + if (userResourceList.Count > 0)//如果用户资源列表大于0就以用户为主 + { + hasResourcesList.AddRange(userResourceList); + hasResourcesList.AddRange(userModuleList); + } + else + { + var roleIds = userInfo.RoleIdList;//获取角色ID列表 + var roleResourceList = + (await _relationService.GetRelationListByObjectIdListAndCategory(roleIds, CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE)) + .Select(it => it.TargetId.ToLong()).ToList();//获取角色资源id列表 + var roleModuleList = + (await _relationService.GetRelationListByObjectIdListAndCategory(roleIds, CateGoryConst.RELATION_SYS_ROLE_HAS_MODULE)) + .Select(it => it.TargetId.ToLong()).ToList();//获取角色模块id列表 + hasResourcesList.AddRange(roleResourceList); + hasResourcesList.AddRange(roleModuleList); + } - /// - public async Task UnReadCount() - { - return await _messageService.UnReadCount(UserManager.UserId); + // 获取目录 + var catalogList = sysResourceList.Where(it => it.MenuType == SysResourceConst.CATALOG).ToList(); + //过滤出拥有的资源列表 + sysResourceList = + sysResourceList.Where(it => + hasResourcesList.Contains(it.Id) || it.Category == CateGoryConst.RESOURCE_SPA) + .ToList();//获取拥有的资源列表 + var parentIds = sysResourceList.Select(it => it.ParentId).Distinct().ToList();//获取父ID列表 + var parentList = catalogList.Where(it => parentIds.Contains(it.Id)).ToList();//获取所拥有的父级目录 + sysResourceList.AddRange(parentList);//添加到列表 + return await _menuService.ShortcutTree(sysResourceList); } #endregion 查询 @@ -174,21 +193,21 @@ public class UserCenterService : DbRepository, IUserCenterService if (!string.IsNullOrEmpty(input.Phone)) { if (!input.Phone.MatchPhoneNumber())//判断是否是手机号格式 - throw Oops.Bah($"手机号码格式错误"); + throw Oops.Bah("手机号码格式错误"); input.Phone = CryptogramUtil.Sm4Encrypt(input.Phone); var any = await IsAnyAsync(it => it.Phone == input.Phone && it.Id != UserManager.UserId);//判断是否有重复的 if (any) - throw Oops.Bah($"系统已存在该手机号"); + throw Oops.Bah("系统已存在该手机号"); } if (!string.IsNullOrEmpty(input.Email)) { var match = input.Email.MatchEmail(); if (!match.isMatch) - throw Oops.Bah($"邮箱格式错误"); + throw Oops.Bah("邮箱格式错误"); } //更新指定字段 - var result = await UpdateAsync(it => new SysUser + var result = await UpdateSetColumnsTrueAsync(it => new SysUser { Name = input.Name, Email = input.Email, @@ -204,18 +223,17 @@ public class UserCenterService : DbRepository, IUserCenterService /// public async Task UpdateSignature(UpdateSignatureInput input) { - var user = await _userService.GetUserById(UserManager.UserId);//获取信息 var signatureArray = input.Signature.Split(",");//分割 - var base64String = signatureArray[1];//根据逗号分割取到base64字符串 - var image = base64String.GetSKBitmapFromBase64();//转成图片 - var resizeImage = image.ResizeImage(100, 50);//重新裁剪 - var newBase64String = resizeImage.ImgToBase64String();//重新转为base64 - var newSignature = signatureArray[0] + "," + newBase64String;//赋值新的签名 + // var base64String = signatureArray[1];//根据逗号分割取到base64字符串 + // var image = base64String.GetSkBitmapFromBase64();//转成图片 + // var resizeImage = image.ResizeImage(100, 50);//重新裁剪 + // var newBase64String = resizeImage.ImgToBase64String();//重新转为base64 + // var newSignature = signatureArray[0] + "," + newBase64String;//赋值新的签名 //更新签名 - var result = await UpdateAsync(it => new SysUser + var result = await UpdateSetColumnsTrueAsync(it => new SysUser { - Signature = newSignature + Signature = input.Signature }, it => it.Id == UserManager.UserId); if (result) _userService.DeleteUserFromRedis(UserManager.UserId);//redis删除用户数据 @@ -225,7 +243,8 @@ public class UserCenterService : DbRepository, IUserCenterService public async Task UpdateWorkbench(UpdateWorkbenchInput input) { //关系表保存个人工作台 - await _relationService.SaveRelation(CateGoryConst.Relation_SYS_USER_WORKBENCH_DATA, UserManager.UserId, null, input.WorkbenchData, true); + await _relationService.SaveRelation(CateGoryConst.RELATION_SYS_USER_WORKBENCH_DATA, UserManager.UserId, null, input.WorkbenchData, + true); } /// @@ -242,28 +261,28 @@ public class UserCenterService : DbRepository, IUserCenterService var password = CryptogramUtil.Sm2Decrypt(input.Password);//SM2解密 if (userInfo.Password != password) throw Oops.Bah("原密码错误"); var newPassword = CryptogramUtil.Sm2Decrypt(input.NewPassword);//sm2解密 - var loginPolicy = await _configService.GetListByCategory(CateGoryConst.Config_PWD_POLICY);//获取密码策略 - var containNumber = loginPolicy.First(it => it.ConfigKey == DevConfigConst.PWD_CONTAIN_NUM).ConfigValue.ToBoolean();//是否包含数字 - var containLower = loginPolicy.First(it => it.ConfigKey == DevConfigConst.PWD_CONTAIN_LOWER).ConfigValue.ToBoolean();//是否包含小写 - var containUpper = loginPolicy.First(it => it.ConfigKey == DevConfigConst.PWD_CONTAIN_UPPER).ConfigValue.ToBoolean();//是否包含大写 - var containChar = loginPolicy.First(it => it.ConfigKey == DevConfigConst.PWD_CONTAIN_CHARACTER).ConfigValue.ToBoolean();//是否包含特殊字符 - var minLength = loginPolicy.First(it => it.ConfigKey == DevConfigConst.PWD_MIN_LENGTH).ConfigValue.ToInt();//最小长度 + var loginPolicy = await _configService.GetConfigsByCategory(CateGoryConst.CONFIG_PWD_POLICY);//获取密码策略 + var containNumber = loginPolicy.First(it => it.ConfigKey == SysConfigConst.PWD_CONTAIN_NUM).ConfigValue.ToBoolean();//是否包含数字 + var containLower = loginPolicy.First(it => it.ConfigKey == SysConfigConst.PWD_CONTAIN_LOWER).ConfigValue.ToBoolean();//是否包含小写 + var containUpper = loginPolicy.First(it => it.ConfigKey == SysConfigConst.PWD_CONTAIN_UPPER).ConfigValue.ToBoolean();//是否包含大写 + var containChar = loginPolicy.First(it => it.ConfigKey == SysConfigConst.PWD_CONTAIN_CHARACTER).ConfigValue.ToBoolean();//是否包含特殊字符 + var minLength = loginPolicy.First(it => it.ConfigKey == SysConfigConst.PWD_MIN_LENGTH).ConfigValue.ToInt();//最小长度 if (minLength > newPassword.Length) throw Oops.Bah($"密码长度不能小于{minLength}"); if (containNumber && !Regex.IsMatch(newPassword, "[0-9]")) - throw Oops.Bah($"密码必须包含数字"); + throw Oops.Bah("密码必须包含数字"); if (containLower && !Regex.IsMatch(newPassword, "[a-z]")) - throw Oops.Bah($"密码必须包含小写字母"); + throw Oops.Bah("密码必须包含小写字母"); if (containUpper && !Regex.IsMatch(newPassword, "[A-Z]")) - throw Oops.Bah($"密码必须包含大写字母"); + throw Oops.Bah("密码必须包含大写字母"); if (containChar && !Regex.IsMatch(newPassword, "[~!@#$%^&*()_+`\\-={}|\\[\\]:\";'<>?,./]")) - throw Oops.Bah($"密码必须包含特殊字符"); + throw Oops.Bah("密码必须包含特殊字符"); // var similarity = PwdUtil.Similarity(password, newPassword); // if (similarity > 80) // throw Oops.Bah($"新密码请勿与旧密码过于相似"); newPassword = CryptogramUtil.Sm4Encrypt(newPassword);//SM4加密 userInfo.Password = newPassword; - await Context.Updateable(userInfo).UpdateColumns(it => new { it.Password }).ExecuteCommandAsync();//修改密码 + await UpdateSetColumnsTrueAsync(it => new SysUser() { Password = newPassword }, it => it.Id == userInfo.Id);//更新密码 _userService.DeleteUserFromRedis(UserManager.UserId);//redis删除用户数据 } @@ -279,14 +298,69 @@ public class UserCenterService : DbRepository, IUserCenterService fileStream.Close(); var base64String = Convert.ToBase64String(bytes);//转base64 var avatar = base64String.ToImageBase64();//转图片 - userInfo.Avatar = avatar; - await Context.Updateable(userInfo).UpdateColumns(it => new { it.Avatar }).ExecuteCommandAsync();//修改密码 + await UpdateSetColumnsTrueAsync(it => new SysUser() { Avatar = avatar }, it => it.Id == userInfo.Id);// 更新头像 _userService.DeleteUserFromRedis(UserManager.UserId);//redis删除用户数据 return avatar; } + /// + public async Task SetDefaultModule(SetDefaultModuleInput input) + { + //获取用户信息 + var userInfo = await _userService.GetUserById(UserManager.UserId); + //如果是默认模块 + if (input.IfDefault) + userInfo.DefaultModule = input.Id; + else + userInfo.DefaultModule = null; + await Context.Updateable(userInfo).UpdateColumns(it => new { it.DefaultModule }).ExecuteCommandAsync();//修改默认模块 + _userService.DeleteUserFromRedis(UserManager.UserId);//redis删除用户数据 + } + #endregion 编辑 + #region 我的消息 + + /// + public async Task> MyMessagePage(MessagePageInput input) + { + var messages = await _messageService.MyMessagePage(input, UserManager.UserId);//分页查询 + return messages; + } + + /// + public async Task MyMessageDetail(BaseIdInput input) + { + return await _messageService.Detail(new MessageDetailInput() { Id = input.Id, Read = true });//返回详情,不带用户列表 + } + + /// + public async Task> UnReadCount() + { + return await _messageService.UnReadCount(UserManager.UserId); + } + + /// + public async Task> NewUnRead() + { + return await _messageService.NewUnRead(UserManager.UserId); + } + + + /// + public async Task SetRead(MessageReadInput input) + { + return await _messageService.SetRead(input); + } + + /// + public async Task SetDelete(MessageReadInput input) + { + return await _messageService.SetDelete(input); + } + + #endregion + #region 方法 /// @@ -300,105 +374,40 @@ public class UserCenterService : DbRepository, IUserCenterService var parentList = new List(); myMenus.ForEach(it => { - //找到父ID对应的菜单 - var parent = allMenuList.Where(r => r.Id == it.ParentId.Value).FirstOrDefault(); - if (parent != null && !parentList.Contains(parent) && !myMenus.Contains(parent))//如果不为空且两个列表里没有 + var parents = _resourceService.GetResourceParent(allMenuList, it.ParentId.Value);//获取父级 + parents.ForEach(parent => { - parentList.Add(parent);//添加到父列表 - } - }); - return parentList; - } - - /// - /// 获取我的模块集合 - /// - /// - /// - /// - /// - private List GetMyModules(List allModuleList, List moduleIds, int spaCount) - { - //获取我的模块信息 - var myModules = allModuleList.Where(it => moduleIds.Contains(it.Id)).ToList(); - // 如果一个模块都没拥有 - if (myModules.Count == 0) - { - // 如果系统中无模块(极端情况) - if (allModuleList.Count == 0) - { - if (spaCount == 0)// 如果系统中无单页面,则返回空列表 - { - return new List(); - } - else + // 如果父级菜单存在,并且父级菜单状态为启用,并不在父级列表中,则添加到父级列表 + if (parent != null && parent.Status == CommonStatusConst.ENABLE && !parentList.Contains(parent) + && !myMenus.Contains(parent)) { - // 否则构造一个模块,并添加到拥有模块 - var sysResource = new SysResource(); - sysResource.Id = CommonUtils.GetSingleId(); - sysResource.Path = "/" + RandomHelper.CreateRandomString(10); - sysResource.Category = CateGoryConst.Resource_MODULE; - allModuleList.Add(sysResource); - myModules.Add(sysResource); + parentList.Add(parent);//添加到父列表 } - } - else - { - // 否则将系统中第一个模块作为拥有的模块 - myModules.Add(allModuleList[0]); - } - } - return myModules; + }); + }); + return parentList; } /// /// 构建Meta /// /// 我的菜单集合 - /// 第一个单页面ID - private void ConstructMeta(List myMenus, long firstSpaId) + private void ConstructMeta(List myMenus) { myMenus.ForEach(it => { - // 将模块的父id设置为0,设置随机path - if (it.Category == CateGoryConst.Resource_MODULE) - { - it.ParentId = 0; - it.Path = "/" + RandomHelper.CreateRandomString(10); - } - // 将根菜单的父id设置为模块的id - if (it.Category == CateGoryConst.Resource_MENU) - { - if (it.ParentId == SimpleAdminConst.Zero) - { - it.ParentId = it.Module; - } - } //定义meta - var meta = new Meta { Icon = it.Icon, Title = it.Title, Type = it.Category.ToLower() }; - // 如果是菜单,则设置type菜单类型为小写 - if (it.Category == CateGoryConst.Resource_MENU) + var meta = new Meta { - if (it.MenuType != ResourceConst.CATALOG)//菜单类型不是目录 - { - meta.Type = it.MenuType.ToLower(); - } - } - // 如果是单页面 - if (it.Category == CateGoryConst.Resource_SPA) - { - meta.Type = ResourceConst.MENU.ToLower();//类型等于菜单 - if (it.Id == firstSpaId) - { - // 如果是首页(第一个单页面)则设置affix - meta.Affix = true; - } - else - { - // 否则隐藏该单页面 - meta.hidden = true; - } - } + Icon = it.Icon, + Title = it.Title, + IsAffix = it.IsAffix, + IsHide = it.IsHide, + IsKeepAlive = it.IsKeepAlive, + IsFull = it.IsFull, + ActiveMenu = it.ActiveMenu, + IsLink = it.IsLink + }; it.Meta = meta; }); } @@ -413,11 +422,11 @@ public class UserCenterService : DbRepository, IUserCenterService public List ConstrucOrgTrees(List orgList, long parentId, long orgId) { //找下级字典ID列表 - var orgs = orgList.Where(it => it.ParentId == parentId).OrderBy(it => it.SortCode).ToList(); - if (orgs.Count > 0)//如果数量大于0 + var orgParents = orgList.Where(it => it.ParentId == parentId).OrderBy(it => it.SortCode).ToList(); + if (orgParents.Count > 0)//如果数量大于0 { var data = new List(); - foreach (var item in orgs)//遍历字典 + foreach (var item in orgParents)//遍历字典 { var loginOrg = new LoginOrgTreeOutput { @@ -425,7 +434,7 @@ public class UserCenterService : DbRepository, IUserCenterService Id = item.Id, Label = item.Name, Pid = item.ParentId, - Style = orgId != item.Id ? null : new LoginOrgTreeOutput.MyStyle { } + Style = orgId != item.Id ? null : new LoginOrgTreeOutput.MyStyle() }; data.Add(loginOrg);//添加到列表 } @@ -435,4 +444,4 @@ public class UserCenterService : DbRepository, IUserCenterService } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Upload/IUploadService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Upload/IUploadService.cs new file mode 100644 index 0000000000000000000000000000000000000000..6aaf277f0898e6158197a114e1ad7bea3bc414da --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Upload/IUploadService.cs @@ -0,0 +1,16 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System.Services.Upload; + +public class IUploadService +{ + +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Upload/UploadService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Upload/UploadService.cs new file mode 100644 index 0000000000000000000000000000000000000000..b6ed87db0ad1b254adad91acc2f05d56a5ddaff3 --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Upload/UploadService.cs @@ -0,0 +1,15 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System.Services.Upload; + +public class UploadService : IUploadService +{ +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.csproj b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.csproj index 3e76d740209d71e7c43d8c9afbc5d16f97fe1f58..4f6438115298e0f5e13402d4e8761ef82abd7607 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.csproj +++ b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.csproj @@ -1,79 +1,56 @@  - - net7.0;net6.0 - 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 - SimpleAdmin.System.xml - enable - enable - True - - - 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 - - - - 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 - - - - - - - - - - - - - - - - - - - - - - PreserveNewest - - - PreserveNewest - - - - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - + + + + + + + + + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + + + + diff --git a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml index 3a6c6a549d6e49ddf73232c65e8204eb5a49daaf..8ea9b100f9e03b8c12e29b85fb712b4333a5a314 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml +++ b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml @@ -24,6 +24,11 @@ 宽度 + + + 批量更新 + + 验证值是否在字典中,大数据慎用 @@ -41,4039 +46,3791 @@ - + - 系统层常量 + 分类常量 - + - 系统配置表缓存Key + 系统基础 - + - 登录验证码缓存Key + 登录策略 - + - 用户表缓存Key + 密码策略 - + - 用户手机号关系缓存Key + 业务定义 - + - 用户手机号关系缓存Key + 文件-本地 - + - 资源表缓存Key + 文件-MINIO - + - 字典表缓存Key + MQTT配置 - + - 关系表缓存Key + 用户有哪些角色 - + - 机构表缓存Key + 角色有哪些资源 - + - 角色表缓存Key + 角色有哪些模块 - + - 职位表缓存Key + 用户有哪些模块 - + + + 用户有哪些资源 + + + - 登录错误次数缓存Key + 角色有哪些权限 - - - 批量修改 + + + 用户有哪些权限 - - - 唯一编码 + + + 用户工作台数据 - - - 所属库 + + + 用户日程数据 - - - 实体名 + + + 站内信与接收用户 - - - 表名 + + + 本人 - - - 表描述 + + + 所有 - - - 批量修改配置表 + + + 仅所属组织 - - - 批量配置Id + + + 所属组织及以下 - - - 字段名 + + + 自定义 - - - 字段描述 + + + 模块 - - - 作用类型 + + + 菜单 - - - 字典值 + + + 单页 - - - 数据库类型 + + + 按钮 - + - 接口名称 + 登录 - + - 接口类型 + 登出 - + - 接口结果标签 + 操作 - + - 接口结果值 + 异常 - + - 启用状态 + 框架 - - - C端用户 + + + 业务 - - - 头像 + + + 部门 - - - 签名 + + + 公司 - - - 账号 + + + 高层 - - - 密码 + + + 中层 - - - 姓名 + + + 基层 - - - 昵称 + + + 全局 - - - 性别 + + + 机构 - - - 年龄 + + + 通知 - - - 出生日期 + + + 公告 - - - 民族 + + + 系统配置常量 - - - 籍贯 + + + 系统名称 - - - 家庭住址 + + + ico图标 - - - 通信地址 + + + 网站开启访问 - - - 证件类型 + + + 网站关闭提示 - - - 证件号码 + + + 系统logo - - - 文化程度 + + + 系统版本 - - - 政治面貌 + + + 多租户开关 - - - 毕业院校 + + + 系统默认工作台 - - - 学历 + + + 登录验证码开关 - - - 学制 + + + 登录验证码开关 - - - 学位 + + + 单用户登录开关 - - - 手机 + + + 登录错误锁定时长 - - - 邮箱 + + + 登录错误锁定时长 - - - 家庭电话 + + + 登录错误次数 - - - 办公电话 + + + 默认用户密码 - - - 紧急联系人 + + + 密码定期提醒更新 - - - 紧急联系人电话 + + + 密码定期提醒更新时间 - - - 紧急联系人地址 + + + 修改初始密码提醒 - - - 员工编号 + + + 密码最小长度 - - - 入职日期 + + + 包含数字 - - - 机构id + + + 包含小写字母 - - - 职位id + + + 包含大写字母 - - - 职级 + + + 包含特殊字符 - - - 主管id + + + windows系统本地目录 - - - 兼任信息 + + + Unix系统本地目录 - - - 上次登录ip + + + MINIO文件AccessKey - - - 上次登录地点 + + + MINIO文件SecretKey - - - 上次登录时间 + + + MINIO文件EndPoint - - - 上次登录设备 + + + MINIO文件默认存储桶 - - - 最新登录ip + + + mqtt连接地址 - - - 最新登录地点 + + + mqtt连接用户名 - - - 最新登录时间 + + + mqtt连接密码 - - - 最新登录设备 - - - - - 用户状态 - - - - - 排序码 + + + 字典常量 - - - 配置 + + + 性别 - - - 配置键 + + + 名族 - - - 配置值 + + + 用户证件类型 - - - 分类 + + + 通用文化程度 - - - 备注 + + + 系统职位分类 - - - 排序码 + + + 在线 - - - 字典 + + + 离线 - - - 父id + + + 本地 - - - 字典文字 + + + MINIO - - - 字典值 + + + 系统 - - - 分类 + + + 业务 - - - 排序码 + + + 关闭 - + - 子节点 + 手动选择 - - - 文件表 + + + 根据域名 - - - 存储引擎 + + + 消息分类 - - - 存储桶 + + + 接受者类型 - - - 文件名称 + + + 发送方式 - - - 文件后缀 + + + 立即发送 - - - 文件大小kb + + + 延迟发送 - - - 文件大小(格式化后) + + + 指定时间 - - - 文件的对象名(唯一名称) + + + 待发送 - - - 文件存储路径 + + + 已发送 - - - 文件下载路径 + + + 所有 - - - 图片缩略图 + + + 角色 - - - 操作日志表 + + + 指定 - - - 具体消息 + + + 日志常量 - - - 类名称 + + + 成功 - - - 方法名称 + + + 成功 - - - 请求方式 + + + 资源表常量 - - - 请求地址 + + + 目录 - - - 请求参数 + + + 菜单 - - - 返回结果 + + + 内链 - - - 访问日志表 + + + 子页 - - - 日志分类 + + + 外链 - - - 日志名称 + + + 单页 - - - 执行状态 + + + 系统内置单页面编码 - - - 操作ip + + + 角色常量 - - - 操作地址 + + + 超级管理员 - - - 操作浏览器 + + + 业务管理员 - - - 操作系统 + + + 系统层常量 - - - 操作时间 + + + 系统配置表缓存Key - - - 操作人姓名 + + + 登录验证码缓存Key - - - 操作人姓名 + + + 用户表缓存Key - - - 站内信 + + + 用户头像缓存关系Key - - - 分类 + + + 用户手机号关系缓存Key - - - 主题 + + + 用户手机号关系缓存Key - - - 正文 + + + 资源表缓存Key - + - 是否已读 + 字典表缓存Key - - - 用户消息表 + + + 关系表缓存Key - - - 消息Id + + + 机构表缓存Key - - - 用户Id + + + 机构对应租户关系缓存Key - - - 已读未读 + + + 租户列表缓存 - - - 开发关系表 + + + 角色表缓存Key - - - 组织 + + + 职位表缓存Key - - - 父id + + + 登录错误次数缓存Key - - - 主管ID + + + 添加操作 - - - 名称 + + + 编辑操作 - - - 全称 + + + 启用操作 - - - 编码 + + + 禁用操作 - - - 分类 + + + 重置密码操作 - - - 排序码 + + + 用户授权操作 - + - 子节点 + 组织 - + - 设置为叶子节点(设置了loadData时有效) + 职位 - + - 职位表 + 批量修改 - + - 组织id + 唯一编码 - + - 名称 + 所属库 - + - 编码 + 实体名 - + - 分类 + 表名 - + - 排序码 + 表描述 - + - 系统关系表 + 批量修改配置表 - + - 对象ID + 批量配置Id - + - 目标ID + 字段名 - + - 分类 - - - - - 资源 - - - - - 父id - - - - - 标题 - - - - - 别名 - - - - - 编码 - - - - - 分类 - - - - - 模块 - - - - - 菜单类型 - - - - - 路径 - - - - - 组件 + 字段描述 - + - 图标 + 作用类型 - + - 颜色 + 字典值 - + - 排序码 - - - - - 菜单元标签 - - - - - 字节点 - - - - - 菜单元标签 - - - - - 图标 - - - - - 标题 - - - - - 类型 - - - - - 是否首页 + 数据库类型 - + - 是否隐藏 - - - - - 角色 - - - - - 组织id - - - - - 名称 - - - - - 编码 - - - - - 分类 - - - - - 默认数据范围 - - - - - 排序码 + 接口名称 - + - 默认数据范围 + 接口类型 - + - 数据范围等级 + 接口结果标签 - + - 数据范围 + 接口结果值 - + - 自定义机构范围列表 + 启用状态 - + - 用户信息表 + C端用户 - + 头像 - + 签名 - + 账号 - + 密码 - + 姓名 - + 昵称 - + 性别 - + + + 年龄 + + + 出生日期 - + 民族 - + 籍贯 - + 家庭住址 - + 通信地址 - + 证件类型 - + 证件号码 - + 文化程度 - + 政治面貌 - + 毕业院校 - + 学历 - + 学制 - + 学位 - + 手机 - 这里使用了SM4自动加密解密 - + 邮箱 - + 家庭电话 - + 办公电话 - + 紧急联系人 - + 紧急联系人电话 - + 紧急联系人地址 - + 员工编号 - + 入职日期 - + 机构id - + 职位id - + 职级 - + 主管id - + 兼任信息 - - - 上次修改密码时间 - - - + 上次登录ip - + 上次登录地点 - + 上次登录时间 - + 上次登录设备 - + 最新登录ip - + 最新登录地点 - + 最新登录时间 - + 最新登录设备 - + 用户状态 - + 排序码 - - - 机构信息 + + + 配置 - - - 机构信息全称 + + + 配置键 - - - 职位信息 + + + 配置值 - - - 按钮码集合 + + + 分类 - - - 权限码集合 + + + 备注 - - - 角色码集合 + + + 排序码 - - - 角色ID集合 + + + 字典 - - - 数据范围集合 + + + 父id - - - 默认数据范围 + + + 字典文字 - - - 机构及以下机构ID集合 + + + 字典值 - - - 数据范围类 + + + 分类 - - - API接口 + + + 排序码 - + - 数据范围分类 + 子节点 - - - 数据范围的机构ID列表 + + + 文件表 - - - 兼任信息 + + + 存储引擎 - - - 组织ID + + + 存储桶 - - - 机构ID + + + 文件名称 - - - 主管ID + + + 文件后缀 - - - 认证模块事件总线 + + + 文件大小kb - - - 登录事件 + + + 文件大小(格式化后) - - - - - 登出事件 + + + 文件的对象名(唯一名称) - - - - - 解析IP地址 + + + 文件存储路径 - ip地址 - - - - 获取通知服务 + + + 文件下载路径 - - - - 事件总线常量 + + + 图片缩略图 - - - B端登录 + + + 操作日志表 - - - B端登录 + + + 具体消息 - - - 清除用户缓存 + + + 类名称 - - - 通知用户下线 + + + 方法名称 - - - 新消息 + + + 请求方式 - - - 登录事件参数 + + + 请求地址 - - - 请求上下文 + + + 请求参数 - - - 用户信息 + + + 返回结果 - - - Ip地址 + + + 访问日志表 - - - 登录设备 + + + 日志分类 - - - Tokens + + + 日志名称 - - - 过期时间 + + + 执行状态 - - - 时间 + + + 操作ip - - - 用户登出事件 + + + 操作地址 - - - 用户Id + + + 操作浏览器 - - - token信息 + + + 操作系统 - - - 内容 + + + 操作时间 - - - 新消息事件 + + + 操作人姓名 - - - 用户Id + + + 操作人姓名 - - - 内容 + + + 站内信 - - - 通知事件总线 + + + 分类 - - - 通知用户下线事件 + + + 主题 - - - + - 有新的消息 + 接收人类型 - - - + - 获取服务 + 接收人列表 - - - + - 获取通知服务 + 发送方式 - - + - 用户模块事件总线 + 发送时间 - - - 根据角色ID列表清除用户缓存 + + + 正文 - - - + - 站内信与接收用户拓展 - MSG_TO_USER + 延迟时间(秒) - + - 是否已读 + 已读情况 - + - SYS_ROLE_HAS_PERMISSION - 角色权限关系扩展 + 发送时间格式化 - + - 数据范围 + 分组查询用 - + - 自定义机构范围列表 + 是否已读 - + - 接口Url + ID - + - SYS_ROLE_HAS_RESOURCE - 角色有哪些资源扩展 + 名称 - + - 菜单ID + ID - + - 按钮信息 + 名称 - + - SYS_USER_SCHEDULE_DATA - 用户日程扩展 + 是否已读 - - - 日程日期 + + + 用户消息表 - - - 日程时间 + + + 消息Id - - - 日程内容 + + + 用户Id - - - 用户id + + + 已读未读 - - - 用户姓名 + + + 组织 - - - SYS_USER_WORKBENCH_DATA - 用户工作台扩展 + + + 父id - - - 快捷方式列表 + + + 主管ID - - - 工作台快捷方式信息 + + + 名称 - - - id + + + 全称 - - - 标题 + + + 编码 - - - 图标 + + + 分类 - - - 路由地址 + + + 排序码 - + - 对象映射 + 主管信息 - + - 系统配置 + 子节点 - + - Minio功能类 + 设置为叶子节点(设置了loadData时有效) - - - 初始化操作 + + + 职位表 - - - - 上传文件 - 返回Minio文件完整Url + + + 组织id - 存储桶里的对象名称,例:/mnt/photos/island.jpg - 文件 - 文件的Content type,默认是"application/octet-stream" - - - - 下载文件 + + + 名称 - - - - - 批量修改字段种子数据 + + + 编码 - - - 批量修改配置种子数据 + + + 分类 - - - 系统配置种子数据 + + + 排序码 - - - 字典表种子数据 + + + 系统关系表 - - - 机构种子数据 + + + 对象ID - - - 职位表种子数据 + + + 目标ID - - - 关系表种子数据 + + + 分类 - - - 资源表种子数据 + + + 资源 - - - 角色种子数据 + + + 父id - - - 用户表种子数据 + + + 标题 - - + + + 别名 + - - + + + 描述 + - - + + + 编码 + - - + + + 分类 + - - + + + 模块 + - - + + + 菜单类型 + - - + + + 路径 + - - - 登录之前执行的方法 + + + 组件 - - - - - 登录错误操作 + + + 图标 - - - - - 校验验证码方法 + + + 是否在菜单中隐藏, 需要高亮的 path (通常用作详情页高亮父级菜单) - 验证码 - 请求号 - 是否从Redis删除 - - - 从Redis中删除验证码 + + + 是否在菜单中隐藏 (通常列表详情页需要隐藏) - - - - 校验手机验证码 + + + 是否在菜单中隐藏 (通常列表详情页需要隐藏) - 输入参数 - 登录端类型 - 是否删除 - - - - 添加验证码到redis + + + 菜单是否固定在标签页中 (首页通常是固定项) - 验证码 - 过期时间 - 验证码请求号 - - - 执行B端登录 + + + 菜单是否固定在标签页中 (首页通常是固定项) - 用户信息 - 登录设备 - 登录类型 - - - - 写入用户token到redis + + + 是否为首页 - 登录事件参数 - 登录类型 - - - redis删除用户token + + + 排序码 - 登录事件参数 - 登录类型 - - - 获取用户token列表 + + + 外链地址 - 用户ID - token列表 - + - 单用户登录通知用户下线 + 菜单元标签 - 用户ID - Token列表 - + - 权限认证输入 + 子节点 - + - 验证码 + 菜单元标签 - + - 请求号 + 图标 - + - 登录输入参数 + 标题 - + - 账号 + 是否在菜单中隐藏, 需要高亮的 path (通常用作详情页高亮父级菜单) - superAdmin - + - 密码 + 是否在菜单中隐藏 (通常列表详情页需要隐藏) - 04fc514b346f14b23d7cf5e6f64663b030512aa380a9e7d311288ed1e8be7b863ae5ee0bb570df2405fc9daff2b2d1ac627a0fbbd49ef2c6b8fac4fd5e4b9a1b7120999bdc0a8e425aa37abab3aec6f9f3570775ff901f2845e957b0c2d0542e21fbf1bbb65c04 - + - 设备类型,默认PC + 路由外链时填写的访问地址 - 0 - - - 登出输入参数 + + + 是否在菜单中隐藏 (通常列表详情页需要隐藏) - - - token + + + 菜单是否固定在标签页中 (首页通常是固定项) - - - 获取短信验证码输入 + + + 菜单是否固定在标签页中 (首页通常是固定项) - - - 手机号 + + + 角色 - - - 手机号登录输入 + + + 组织id - - - 设备类型,默认PC + + + 名称 - 0 - - - 验证码返回 + + + 编码 - - - 验证码图片,Base64 + + + 分类 - - - 验证码请求号 + + + 默认数据范围 - + + + 排序码 + + + - 登录返回参数 + 用户列表 - + - 令牌Token + 默认数据范围 - + - 账号 + 数据范围等级 - + - 姓名 + 数据范围 - + - 登录用互信息 + 自定义机构范围列表 - + + + 用户信息表 + + + 头像 - + 签名 - + 账号 - + + + 密码 + + + 姓名 - + 昵称 - - - 手机号 + + + 性别 - - - 生日 + + + 出生日期 - - - 邮箱 + + + 民族 - + - 性别 + 籍贯 - + 家庭住址 - - - 机构信息 + + + 通信地址 - - - 机构信息全称 + + + 证件类型 - - - 职位信息 + + + 证件号码 - - - 角色码集合 + + + 文化程度 - - - 按钮码集合 + + + 政治面貌 - - - 权限校验服务 + + + 毕业院校 - - - 获取图形验证码 + + + 学历 - - - - 获取登录用户信息 + + + 学制 - - - - 获取手机短信验证码 + + + 学位 - 验证码参数 - 登录类型 - - - - 登录 + + + 手机 + 这里使用了SM4自动加密解密 - 登录参数 - 登录类型 - Token信息 - - - 手机号登录 + + + 邮箱 - 登录参数 - 登录端类型 - Token信息 - - - 退出登录 + + + 家庭电话 - token - 登出类型 - - - - 会话分页查询 + + + 办公电话 - + - 账号 + 紧急联系人 - + - 姓名 + 紧急联系人电话 - + - 最新登录ip + 紧急联系人地址 - - - Token退出参数 + + + 员工编号 - - - token + + + 入职日期 - - - 会话输出 + + + 机构id - - - 主键Id + + + 职位id - + - 头像 + 职级 - + - 账号 + 主管id - + - 姓名 + 上次修改密码时间 - - - 在线状态 + + + 上次登录ip - + + + 上次登录地点 + + + + + 上次登录时间 + + + + + 上次登录设备 + + + 最新登录ip - + 最新登录地点 - + 最新登录时间 - - - 令牌数量 + + + 最新登录设备 - - - 令牌信息集合 + + + 排序码 - - - 会话统计结果 + + + 默认模块 - + - 当前会话总数量 + 机构信息 - + - 最大签发令牌数 + 机构信息全称 - + - 在线用户数 + 职位信息 - + - BC端会话比例 + 组织和机构ID列表,组织ID从上到下最后是职位 - + - 会话管理服务 + 主管信息 - + - 会话统计 + 按钮码集合 - 统计结果 - + - 强退会话 + 权限码集合 - 用户ID - + - 强退token + 角色码集合 - token列表 - + - B端会话分页查询 + 角色ID集合 - 查询参数 - B端会话列表 - + - C端会话分页查询 + 数据范围集合 - 查询参数 - C端会话列表 - + - + 默认数据范围 - - - - - - - - - - - - - - - - + - 获取redis中token信息列表 + 机构及以下机构ID集合 - - + - 获取token剩余时间信息 + 机构及以下机构ID集合 - token列表 - 登录类型 - + - 通知用户下线 + 租户Id - - + - + 数据范围类 - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - 获取配置 + API接口 - - + - 检查输入参数 + 数据范围分类 - - + - 批量分页查询参数 + 数据范围的机构ID列表 - + - 唯一编码 + 认证模块事件总线 - + - 所属库 + 登录事件 + + - + - 实体名 + 登出事件 + + - + - 表名 + 解析IP地址 + ip地址 + - + - 添加批量参数 + 事件总线常量 - + - 唯一编码 + B端登录 - + - 所属库 + B端登录 - + - 实体名 + 清除用户缓存 - + - 表名 + 清除组织下用户Token - + - 表描述 + 清除模块下用户Token - + - 修改批量参数 + 通知用户下线 - + - Id + 新消息 - + - 批量修改输入 + 登录事件参数 - + - 批量编辑Code + 请求上下文 - + - Id列表 + 用户信息 - + - 字段列表 + Ip地址 - + - 批量修改DTO + 登录设备 - + - 批量服务 + Tokens - + - 批量分页查询 + 过期时间 - 查询参数 - 分页结果 - + - 添加批量 + 时间 - 添加参数 - - + - 删除批量 + 用户登出事件 - 删除参数 - - + - 获取需要批量修改的表 + 用户Id - - + - 获取批量修改配置 + token信息 - - - + - 配置字段 + 内容 - 字段信息 - - + - 批量配置字段列表 + 新消息事件 - 唯一编码 - 列表 - + - 获取字典配置 + 消息Id - 唯一编码 - 字段信息 - sqlsugar对应字典 - + - 同步字段 + 发送方式 - id - - - - - - - - - - - - - - - - - - - - - - - - - - + - 刷新缓存 + 发送时间 - 分类 - - + - 检查输入参数 + 通知事件总线 - - + - 配置分页参数 + 通知用户下线事件 + + - + - 添加配置参数 + 有新的消息 + + - + - 配置键 + 发送消息 + 消息id + 延迟 - + - 配置值 + 获取服务 + + - + - 编辑配置参数 + 用户模块事件总线 - + - ID + 根据角色ID列表清除用户缓存 + + - + - 删除配置参数 + 根据机构ID列表清除用户token + - + - 批量修改输入参数 + 根据模块ID列表清除用户token + - + - 分类 + 站内信与接收用户拓展 + MSG_TO_USER - + - 系统配置服务 + 是否已读 - + - 新增配置 + SYS_ROLE_HAS_PERMISSION + 角色权限关系扩展 - 新增参数 - - + - 删除配置 + 数据范围 - 删除 - - + - 修改配置 + 自定义机构范围列表 - 修改参数 - - + - 批量编辑 + 接口Url - 配置列表 - - + - 根据分类和配置键获配置 + SYS_ROLE_HAS_RESOURCE + 角色有哪些资源扩展 - 分类 - 配置键 - 配置信息 - + - 根据分类获取配置列表 + 菜单ID - 分类名称 - 配置列表 - + - 分页查询其他配置 + 按钮信息 - 查询参数 - 其他配置列表 - + - + SYS_USER_SCHEDULE_DATA + 用户日程扩展 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - 刷新缓存 + 日程日期 - + - 检查输入参数 + 日程时间 - - + - 获取字典所有下级 + 日程内容 - 字典列表 - 父ID - - + - 字典查询参数 + 用户id - + - 字典树参数 + 用户姓名 - + - 字典分类 + SYS_USER_WORKBENCH_DATA + 用户工作台扩展 - + - 字典查询参数 - - - - - 父id + 快捷方式列表 - - - 分类 + + + 工作台快捷方式信息 - + - 添加字典参数 + id - + - 父ID + 标题 - + - 字典名称 + 图标 - + - 字典值 + 路由地址 - + - 编辑字典参数 + 对象映射 - + - ID + 系统配置 - + - 删除字典参数 + 超级管理员可以看到全部数据 - + - 字典服务 + 启用通知中心 - - - 添加字典 - - 输入参数 - - - + - 构建字典树形结构 + Minio功能类 - 字典列表 - 父ID - 字典树形结构 - + - 删除字典 + 初始化操作 - 删除参数 - + - 编辑字典 + 上传文件 - 返回Minio文件完整Url - 输入参数 + 存储桶里的对象名称,例:/mnt/photos/island.jpg + 文件 + 文件的Content type,默认是"application/octet-stream" - + - 获取字典 + 下载文件 - 字典 + - + - 获取所有 + 系统配置种子数据 - 字典列表 - + - 根据字典DictValue获取字典值列表 + 字典表种子数据 - 字典值 - 字典列表 - 字典值列表 - + - 根据字典DictValue列表获取对应字典值列表 + 机构种子数据 - 字典值列表 - - + - 字典分页查询 + 职位表种子数据 - 查询参数 - 字典分页列表 - + - 获取字典树形结构 + 关系表种子数据 - 查询参数 - 字典树形结构 - + - 文件分页输出 + 资源表种子数据 - + - 文件引擎 + 角色种子数据 - + - + 用户表种子数据 - + + + + - + - + - + - + - + - + - 存储文件 + 检查验证码 - - + + - + - 存储本地文件 + 检查网站是否开启 - - + + - + - 存储到minio + 登录之前执行的方法 - - - + + + - + - 获取文件大小 + 登录错误操作 - - + + + - + - 判断是否是图片 + 校验验证码方法 - 后缀名 - + 验证码 + 请求号 + 是否从Redis删除 - + - 文件管理服务 + 从Redis中删除验证码 + - + - 删除文件 + 校验手机验证码 - ID列表 + 输入参数 + 登录端类型 + 是否删除 - + - 文件下载 + 添加验证码到缓存 - 文件iD - 文件流 + 验证码 + 过期时间 + 验证码请求号 - + - 获取FileStreamResult文件流 + 执行B端登录 - 路径 - 文件名 - 路径是否是文件夹 + 用户信息 + 登录设备 + 登录类型 + 租户id - + - 获取FileStreamResult文件流 + 写入用户token到缓存 - 文件数组 - 文件名 - + 登录事件参数 + 登录类型 - + - 文件分页查询 + 缓存删除用户token - 查询参数 - 文件列表 + 登录事件参数 + 登录类型 - + - 上传文件到本地返回下载url + 获取用户token列表 - 文件引擎 - 文件 - + 用户ID + token列表 - + - 站内信分类 + 单用户登录通知用户下线 + 用户ID + Token列表 - + - 发送参数 + 权限认证输入 - + - 主题 + 验证码 - + - 分类 + 请求号 - + - 接收人Id + 登录输入参数 - - - 消息详情 + + + 账号 + + superAdmin + + + + 密码 + 04fc514b346f14b23d7cf5e6f64663b030512aa380a9e7d311288ed1e8be7b863ae5ee0bb570df2405fc9daff2b2d1ac627a0fbbd49ef2c6b8fac4fd5e4b9a1b7120999bdc0a8e425aa37abab3aec6f9f3570775ff901f2845e957b0c2d0542e21fbf1bbb65c04 - + - 接收信息类 + 设备类型,默认PC + 0 - + - 接收人ID + 租户ID - + - 接收人姓名 + 登出输入参数 - + - 是否已读 + token - + - 站内信服务 + 获取短信验证码输入 - + - 删除消息 + 手机号 - id列表 - - + - 删除我的消息 + 手机号登录输入 - - - - + - 获取消息详情 + 设备类型,默认PC - 消息ID - 是否是自己 - 消息详情 + 0 - + - 我的消息列表 + 租户ID - - - - + - 分页查询 + 验证码返回 - 查询参数 - - + - 发送站内信 + 验证码图片,Base64 - 站内信信息 - - + - 获取未读消息数 + 验证码请求号 - - - + - + 登录返回参数 - - - - - - - - - - - - - - - - - - - - - - + - 操作日志分页输入 + 令牌Token - + - 操作日志日志删除输入 + 账号 - + - 操作日志周统计输出 + 姓名 - + - 日期 + 默认模块 - + - 名称 + 模块列表 - + - 数量 + 登录用互信息 - - - 操作日志统计 + + + 头像 - - - 操作日志服务 + + + 签名 - - - 根据分类删除操作日志 + + + 账号 - 分类名称 - - - - 日志详情 + + + 姓名 - id - 日志详情 - - - 操作日志分页查询 + + + 昵称 - 查询参数 - 分页列表 - + - 操作日志周统计 + 手机号 - 天数 - 统计结果 - + - 操作日志总览 + 生日 - 异常日志和操作日志的数量 - + - + 邮箱 - - - 操作日志中文名称 + + + 性别 - - - 异常日志中文名称 + + + 家庭住址 - - - - - - - - - - - - - - - - + - 访问日志分页输入 + 机构信息 - + - 分类 + 机构信息全称 - + - 账号 + 职位信息 - + - 访问日志删除输入 + 角色码集合 - + - 分类 + 按钮码集合 - + - 周统计输出 + 机构及以下机构ID集合 - - - 日期 + + + 默认模块 - + - 登录次数 + 权限校验服务 - + - 登出次数 + 获取图形验证码 + - + - 访问日志总数输出 + 获取登录用户信息 + - + - 类型 + 获取手机短信验证码 + 验证码参数 + 登录类型 + - + - 数量 + 登录 + 登录参数 + 登录类型 + Token信息 - + - 访问日志服务 + 手机号登录 + 登录参数 + 登录端类型 + Token信息 - + - 根据分类删除 + 退出登录 - 分类名称 + token + 登出类型 - + - 访问日志分页查询 + 会话分页查询 - 查询参数 - 日志列表 - - - 根统计N天来登录和登出数量 + + + 账号 - 天使 - 统计信息 - - - 统计登录登出总览 + + + 姓名 - 登录和登出的数量 - - - + + + 最新登录ip - - - - - - - - - - - - - + - 导入预览输入 + Token退出参数 - + - 文件导入通用输出 + token - + - 是否有错误 + 会话输出 - + - 动态表头 + 主键Id - - - 数据 + + + 头像 - - - 动态表头 + + + 账号 - - - 标题 + + + 姓名 - + - 数据源 + 在线状态 - - - 宽度 + + + 最新登录ip - - - 超过宽度将自动省略 + + + 最新登录地点 - - - 是否是日期格式 + + + 最新登录时间 - + - 批量导入结果输入 + 令牌数量 - - + - 数据 + 令牌信息集合 - + - 导入结果输出 + 会话统计结果 - + - 是否成功 + 当前会话总数量 - + - 总数 + 最大签发令牌数 - + - 导入数量 + 在线用户数 - + - 错误数 + BC端会话比例 - + - 数据 + 会话管理服务 - + - 导入基础输入 + 会话统计 + 统计结果 - + - Id + 强退会话 + 用户ID - + - 是否有错误 + 强退token + token列表 - + - 错误详情 + B端会话分页查询 + 查询参数 + B端会话列表 - + - 导入服务 + C端会话分页查询 + 查询参数 + C端会话列表 - + - 导出数据 + - - 数据 - 文件名 - 文件流 - - - 获取本地模板 - - 文件名 - 模板文件夹路径:默认wwwroot下的Template - 文件流 + + - - - 生成模板 - - 实体类 - 文件名 - 文件流 + + - - - 获取导入预览 - - - 文件 - 导入预览结果 + + - + + + + + + + - 获取预计导入结果 + 获取redis中token信息列表 - - 数据 - 成功导入数据 - 预计导入结果 + - + - 导入文件验证 + 获取token剩余时间信息 - 文件 - 文件最大体积(M) - 允许的格式 + token列表 + 登录类型 - + - 模板数据验证 + 通知用户下线 - 模板类实体 - 结果 - 导入预览数据 + - + - + - + - - + + - - + + - + + + + + + + + + + - + - + - + - 获取文件流 + 获取配置 - - - - + - + - 获取文件流 + 检查输入参数 - - - + - + - 获取文件名 + 批量分页查询参数 - - - + - 获取本地模板路径 + 唯一编码 - - + - 日程列表查询参数 + 所属库 - + - 日程日期 + 实体名 - + - 日程日期 + 表名 - + - 日程内容 + 添加批量参数 - + - 日程时间 + 唯一编码 - + - ID + 所属库 - + - 首页服务 + 实体名 - + - 添加日程 + 表名 - 日程参数 - - + - 删除日程 + 表描述 - id列表 - - + - 获取日程列表 + 修改批量参数 - 查询参数 - 日程列表 - + - + Id - - + + + 批量修改输入 + - - - - - - - + - 组织分页查询参数 + 批量编辑Code - + - 父ID + Id列表 - + - 机构列表 + 字段列表 - + - 组织添加参数 + 批量修改DTO - + - 组织修改参数 + 批量服务 - + - Id + 批量分页查询 + 查询参数 + 分页结果 - + - 组织复制参数 + 添加批量 + 添加参数 + - + - 目标ID + 删除批量 + 删除参数 + - + - 组织Id列表 + 获取需要批量修改的表 + - + - 是否包含下级 + 获取批量修改配置 + + - + - 组织导入 + 配置字段 + 字段信息 + - - - 名称 + + + 批量配置字段列表 + 唯一编码 + 列表 - - - 上级组织 + + + 获取字典配置 + 唯一编码 + 字段信息 + SqlSugar对应字典 - - - 分类 + + + 同步字段 + id + - - - 排序码 + + + 文件分页输出 - - - 主管账号 + + + 文件引擎 - + - 组织树查询参数 - 懒加载用 + - + + + + + + + + + + + + + + + + + + + - 父Id + 存储文件 + + - + - 组织架构服务 + 存储本地文件 + + - + - 检查组织是否存在 + 存储到minio - 组织列表 - 组织名称 - 父Id - 组织Id - 是否存在,存在返回组织ID + + + - + - 组织详情 + 获取文件大小 - id参数 - 组织信息 + + - + - 根据组织ID获取 下级 + 判断是否是图片 - 组织ID - 是否包含自己 + 后缀名 - + - 获取所有组织 + 文件管理服务 - 组织列表 - + - 获取机构及下级ID列表 + 删除文件 - - + ID列表 - + - 根据组织Id递归获取上级 + 文件下载 - 组织列表 - 组织Id - 是否包含自己 + 文件iD + 文件流 + + + + 获取FileStreamResult文件流 + + 路径 + 文件名 + 路径是否是文件夹 - + - 获取组织信息 + 获取FileStreamResult文件流 - 组织id - 组织信息 + 文件数组 + 文件名 + - + - 组织分页查询 + 文件分页查询 查询参数 - 分页信息 + 文件列表 - + - 根据ID列表获取组织列表 + 上传文件到本地返回下载url - + 文件引擎 + 文件 - + - 添加组织 + 站内信分类 - 添加参数 - 名称 - - + - 复制组织 + 发送参数 - 机构复制参数 - - + - 编辑组织 + 主题 - 编辑参数 - 名称 - - + - 删除组织 + 分类 - 删除参数 - 名称 - - + - 构建组织树形结构 + 接收人Id - 组织列表 - 父ID - 树型结构 - + - 刷新缓存 + 消息Id - - + - 获取组织树型结构 + 消息详情输入参数 - 机构ID列表 - 组织选择器(懒加载用) - 组织树列表 - - - - - + + + 是否显示接收信息 + - - + + + 是否已读 + - - + + + 已读输入参数 + - - + + + 分类 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 检查输入参数 - - - - - - - 根据组织Id列表获取所有父级组织 - - - - - - - - 获取组织所有下级 - - - - - - - - 获取组织下级(懒加载) - - - - - - - - 赋值组织的所有下级 - - 组织列表 - 父Id - 新父Id - - - - - 重新生成组织实体 - - - - - - 获取全称 - - 组织列表 - 父Id - 组织名称 - - - - 职位分页查询 - - - - - 组织ID - - - + - 职位列表 + 用户Id - + - 分类 + 消息Id - + - 职位新增参数 + 消息详情 - + - 组织ID + 未读消息数量输出 - + - 名称 + 未读消息数量 - + 分类 - + - 机构编辑参数 + 站内信服务 - + - Id + 删除消息 + id列表 + - + - 机构选择器参数 + 删除我的消息 + + + - + - 职位服务 + 获取消息详情 + 输入参数 + 消息详情 - + - 添加职位 + 我的消息列表 - 添加参数 - 名称 + + - + - 删除职位 + 分页查询 - id列表 - 名称 + 查询参数 - + - 编辑职位 + 获取未读消息数 - 编辑参数 - 名称 + 用户Id - - - 获取职位列表 - - 职位列表 - - + - 获取职位信息 + 最新未读 - 职位ID - 职位信息 + + - + - 职位分页查询 + 标记已读 - 查询参数 - 分页列表 + + - + - 职位选择器 + 删除消息 - 查询参数 + - + - 刷新缓存 + 新增 + - + - 根据id集合获取职位集合 + 编辑 - + - + - + - + - - + + - + - - + + - + - + - + - + - + + + + + + + - 检查输入参数 + 检查输入 - - 名称 + - + - 关系服务 + 导入预览输入 - + - 根据分类获取关系表信息 + 文件导入通用输出 - 分类名称 - 关系表 - + - 通过对象ID和分类获取关系列表 + 是否有错误 - 对象ID - 分类 - - + - 通过对象ID列表和分类获取关系列表 + 动态表头 - 对象ID - 分类 - - + - 通过目标ID和分类获取关系列表 + 数据 - 目标ID - 分类 - - + - 通过目标ID列表和分类获取关系列表 + 动态表头 - - - - + - 获取关系表用户工作台 + 标题 - 用户ID - 关系表数据 - + - 更新缓存 + 数据源 - 分类 - - + - 保存关系 + 宽度 - 分类 - 对象ID - 目标ID - 拓展信息 - 是否清除老的数据 - 是否刷新缓存 - - + - 批量保存关系 + 超过宽度将自动省略 - 分类 - 对象ID - 目标ID列表 - 拓展信息列表 - 是否清除老的数据 - - - + + + 是否是日期格式 + + + + + 批量导入结果输入 + + + + + + 数据 + + + + + 导入结果输出 + + + + + 是否成功 + + + + + 总数 + + + + + 导入数量 + + + + + 错误数 + + + + + 数据 + + + + + 导入基础输入 + + + + + Id + + + + + 是否有错误 + + + + + 错误详情 + + + + + 导入服务 + + + + + 导出数据 + + + 数据 + 文件名 + 文件流 + + + + 获取本地模板 + + 文件名 + 模板文件夹路径:默认wwwroot下的Template + 文件流 + + + + 生成模板 + + 实体类 + 文件名 + 文件流 + + + + 获取导入预览 + + + 文件 + 导入预览结果 + + + + 获取预计导入结果 + + + 数据 + 成功导入数据 + 预计导入结果 + + + + 导入文件验证 + + 文件 + 文件最大体积(M) + 允许的格式 + + + + 模板数据验证 + + 模板类实体 + 结果 + 导入预览数据 + + + + + - + - + - + - + - + - + - + + + 获取文件流 + + + + + + + + + 获取文件流 + + + + + + + + 获取文件名 + + + + + + + 获取本地模板路径 + + + + + + 日程列表查询参数 + + + + + 日程日期 + + + + + 日程日期 + + + + + 日程内容 + + + + + 日程时间 + + + + + ID + + + + + 首页服务 + + + + + 添加日程 + + 日程参数 + + + + + 删除日程 + + id列表 + + + + + 获取日程列表 + + 查询参数 + 日程列表 + + + + + + + - + - + @@ -4093,7 +3850,10 @@ - + + + + @@ -4151,7 +3911,7 @@ - + 删除按钮 @@ -4172,6 +3932,13 @@ 查询条件 按钮分页列表 + + + 按钮详情 + + + + 菜单树查询参数 @@ -4269,7 +4036,7 @@ id 详细信息 - + 构建菜单树形结构 @@ -4277,11 +4044,12 @@ 父ID 菜单形结构 - + 获取菜单树 菜单树查询参数 + 是否显示禁用的 菜单树列表 @@ -4291,7 +4059,7 @@ 菜单编辑参数 - + 删除菜单 @@ -4305,15 +4073,25 @@ 改变菜单模块参数 - + - + 快捷方式菜单树 + 资源列表 + - + + + + + + - + + + + @@ -4322,7 +4100,7 @@ - + @@ -4369,7 +4147,7 @@ 添加参数 - + 删除模块 @@ -4390,6 +4168,19 @@ 分页参数 + + + 模块详情 + + + + + + + 模块列表 + + + @@ -4404,7 +4195,13 @@ - + + + + + + + @@ -4413,1753 +4210,3388 @@ - + - 角色授权资源树输出 + 角色查询参数 - + - 模块id + 角色添加参数 - + - 模块名称 + 名称 - + - 模块图标 + 角色编辑参数 - + - 模块下菜单集合 + Id - + - 授权菜单类 + 角色授权资源参数 - + - 菜单id + 角色Id - + - 父id + 授权资源信息 - + - 父名称 + 是否代码生成 - + - 模块名称 + 角色授权资源参数 - + - 模块id + 角色Id - + - 菜单下按钮集合 + 授权权限信息 - + - 按钮id + 角色授权用户参数 - + - 标题 + Id - + - 接口描述 + 授权权限信息 - + - 路由名称 + 角色选择器参数 - + - 权限名称 + 组织ID - + - 资源服务 + 机构ID列表 - + - 获取所有的菜单和模块以及单页面列表,并按分类和排序码排序 + 角色名称 - 所有的菜单和模块以及单页面列表 - + - 根据资源ID获取所有下级资源 + 机构ID列表 - 资源ID - 是否包含自己 - 资源列表 - + - 根据资源ID获取所有下级资源 + 角色拥有的资源输出 - 资源列表 - 资源ID - 是否包含自己 - 资源列表 - + - 获取ID获取Code列表 + Id - id列表 - 分类 - Code列表 - + - 获取资源列表 + 已授权资源信息 - 资源分类列表 - - + - 根据分类获取资源列表 + 角色拥有权限输出 - 分类名称 - 资源列表 - + - 根据菜单ID获取菜单 + 角色Id - 菜单id列表 - 菜单列表 - + - 获取权限授权树 + 已授权资源信息 - 路由列表 - - + - 刷新缓存 + 角色树输出参数 - 分类名称 - - + - 角色授权资源树 + 职位Id - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - 获取路由地址名称 + 名称 - 控制器地址 - 路由名称 - - + - 获取资源所有下级 + 是否是职位 - 资源列表 - 父ID - - + - 获取上级 + 子项 - - - - + - 获取授权菜单 + 角色服务 - 模块ID - - + - 获取授权菜单类菜单名称 + 获取所有角色 - 菜单列表 - 当前菜单 - + - 单页输入参数 + 根据用户ID获取用户角色集合 + 用户ID + - + - 菜单类型 + 获取角色拥有权限 + 角色ID + - + - 单页输入参数 + 角色拥有资源 + 角色id + 资源类型 + 角色拥有资源信息 - + - 标题 + 获取角色下的用户 + 角色ID + - + - 菜单类型 + 分页查询角色 + 查询参数 + - + - 路径 + 获取角色授权权限选择器 + 角色ID + - + - 图标 + 角色选择器 + + - + - 单页修改参数 + 根据id集合获取角色集合 + + - + - ID + 获取角色树 + 角色树 + - + - 单页服务 + 角色详情 + 角色Id + - + - 添加单页 + 添加角色 添加参数 - + - 删除单页 + 编辑角色 - 删除参数 + 编辑参数 - + - 编辑单页 + 给角色授权权限 - 编辑参数 + 授权信息 - + - 分页查询 + 给角色授权 - + 授权参数 - + - + 给角色授权用户 + 授权信息 + - + + + 刷新缓存 + + + + + + 删除角色 + + 删除参数 + + + + + + + + 获取所有 + + + + - + + + + + + + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 检查输入参数 - + - + - 角色查询参数 + 单页输入参数 - + - 角色添加参数 + 菜单类型 - + - 名称 + 单页输入参数 - + - 分类 + 标题 - + - 角色编辑参数 + 菜单类型 - + - Id + 路径 - + - 角色授权资源参数 + 图标 - + - 角色Id + 单页修改参数 - + - 授权资源信息 + ID - + - 是否代码生成 + 单页服务 - + - 角色授权资源参数 + 添加单页 + 添加参数 + - + - 角色Id + 删除单页 + 删除参数 + - + - 授权权限信息 + 编辑单页 + 编辑参数 + - + - 角色授权用户参数 + 分页查询 + + - + - Id + 详情 + + - + - 授权权限信息 + - + + + + + + + + + + + + + + + + - 角色选择器参数 + 检查输入参数 + - + - 组织ID + 操作日志分页输入 - + - 机构ID列表 + 操作日志日志删除输入 - + - 关键字 + 操作日志周统计输出 - + - 角色分类 + 日期 - + - 角色拥有的资源输出 + 名称 - + - Id + 数量 - + - 已授权资源信息 + 操作日志统计 - + - 角色拥有权限输出 + 操作日志服务 - + - 角色Id + 根据分类删除操作日志 + 分类名称 + - + - 已授权资源信息 + 日志详情 + id + 日志详情 - + - 角色服务 + 操作日志分页查询 + 查询参数 + 分页列表 - + - 获取所有角色 + 操作日志周统计 - + 天数 + 统计结果 - + - 添加角色 + 操作日志总览 - 添加参数 - + 异常日志和操作日志的数量 - + - 删除角色 + - 删除参数 - - + - 编辑角色 + 操作日志中文名称 - 编辑参数 - - + - 根据用户ID获取用户角色集合 + 异常日志中文名称 - 用户ID - - + - 给角色授权权限 + 分表最多查近多少年的数据 - 授权信息 - - + + + + + + + + + + + + + + + + - 给角色授权 + 访问日志分页输入 - 授权参数 - - + - 给角色授权用户 + 分类 - 授权信息 - - + - 获取角色拥有权限 + 账号 - 角色ID - - + - 角色拥有资源 + 访问日志删除输入 - 角色id - 资源类型 - 角色拥有资源信息 - + - 获取角色下的用户 + 分类 - 角色ID - - + - 分页查询角色 + 周统计输出 - 查询参数 - - + - 刷新缓存 + 日期 - - + - 获取角色授权权限选择器 + 登录次数 - 角色ID - - + - 角色选择器 + 登出次数 - - - + - 根据id集合获取角色集合 + 访问日志总数输出 - - - - + + + 类型 + - - + + + 数量 + - - + + + 访问日志服务 + - - + + + 根据分类删除 + + 分类名称 + - - + + + 访问日志分页查询 + + 查询参数 + 日志列表 - - + + + 根统计N天来登录和登出数量 + + 天使 + 统计信息 - - + + + 统计登录登出总览 + + 登录和登出的数量 - - + + + + - - + + + 分表最多查近多少年的数据 + - + - + - + - + - - + + + mqtt认证参数 + - - + + + 用户ID + - - + + + 账号 + - - + + + 密码 + - + - 检查输入参数 + 客户端ID - - + - 编辑个人信息参数 + mqtt登录参数输出 - + - 姓名 + 地址 - + - 签名图片 + 用户名 - + - 更新个人工作台 + 密码 - + - 工作台数据 + 客户端ID - + - 更新个人密码 + 主题列表 - + - 密码 + mqtt认证输出 - + - 新密码 + 结果 "allow" | "deny" | "ignore", // Default `"ignore"` - + - 我的机构数样式 + 是否超级管理员 - + + + Mqtt服务 + + + - Id + mqtt登录http认证 + 认证参数 + 用户Id + 认证结果 - + - 名称 + 获取mqtt登录web端参数 + 登录参数 - + - 父ID + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - 子节点 + 刷新缓存 + 分类 + - + - 样式 + 检查输入参数 + - + - 我的机构样式 + 配置分页参数 - + - 背景色 + 添加配置参数 - + - 字体颜色 + 配置键 - + - 个人信息中心服务 + 配置值 - + - 获取个人菜单 + 编辑配置参数 - - + - 获取个人工作台 + ID - - + - 获取组织架构 + 删除配置参数 - 组织架构 - + - 获取登录用户的站内信分页 + 批量修改输入参数 - 查询参数 - 站内信列表 - + - 读取登录用户站内信详情 + 分类 - 消息ID - 消息详情 - + - 获取未读消息数量 + 系统配置服务 - 未读消息数量 - + - 更新个人信息 + 根据分类和配置键获配置 - 信息参数 - + 分类 + 配置键 + 配置信息 - + - 更新签名 + 根据分类获取配置列表 - 签名图片 - + 分类名称 + 配置列表 - + - 编辑个人工作台 + 分页查询其他配置 + + 查询参数 + 其他配置列表 + + + + 获取系统配置列表,不包含业务的 - 工作台字符串 - + - 删除我的消息 + 是否是多租户模式 - 消息Id - + - 修改个人密码 + 新增配置 - 密码信息 + 新增参数 - + - 修改头像 + 修改配置 - 头像文件 + 修改参数 - - + + + 批量编辑 + + 配置列表 + - - + + + 删除配置 + + 删除 + - - + + + + - + - + - + - + - - + + + 获取全部 + + - + - + - + - + - + - - - 获取父菜单集合 - - 所有菜单列表 - 我的菜单列表 - + + - + - 获取我的模块集合 + 刷新缓存 - - - - - + - 构建Meta + 检查输入参数 - 我的菜单集合 - 第一个单页面ID + - + - 构建机构树 + 获取字典所有下级 - 机构列表 + 字典列表 父ID - 用户ID - + - 用户选择器参数 + 字典查询参数 - + - 组织ID + 字典树参数 - + - 机构ID列表 + 字典分类 - + - 关键字 + 字典查询参数 - - - 用户分页查询参数 + + + 父id - + + + 分类 + + + - 所属组织 + 添加字典参数 - + - 动态查询条件 + 父ID - + - 用户状态 + 字典名称 - + - 添加用户参数 + 字典值 - + - 账号 + 编辑字典参数 - + - 姓名 + ID - + - 组织id + 删除字典参数 - + - 职位id + 字典服务 - + - 编辑用户参数 + 添加字典 + 输入参数 + - + - Id + 构建字典树形结构 + 字典列表 + 父ID + 字典树形结构 - + - 用户授权角色参数 + 删除字典 + 删除参数 + - + - Id + 编辑字典 + 输入参数 + - + - 授权权限信息 + 获取字典 + 字典 + - + - 默认数据权限 + 获取所有 + 字典列表 - + - 用户导入 + 根据字典DictValue获取字典值列表 + 字典值 + 字典列表 + 字典值列表 - + - 账号 + 根据字典DictValue列表获取对应字典值列表 + 字典值列表 + - - - 姓名 + + + 字典分页查询 + 查询参数 + 字典分页列表 - - - 性别 + + + 获取字典树形结构 + 查询参数 + 字典树形结构 - - - 昵称 + + + 根据字典值获取子级字典 + 字典值 + - - - 手机 - 这里使用了SM4自动加密解密 + + + 组织分页查询参数 - - - 邮箱 + + + 父ID - + - 所属机构 + 名称 - + - 职位 + 编码 - - - 出生日期 + + + 分类 - - - 民族 + + + 状态 - - - 籍贯 + + + 组织添加参数 - - - 家庭住址 + + + 组织修改参数 - - - 通信地址 + + + Id - - - 证件类型 + + + 组织复制参数 - - - 证件号码 + + + 目标ID - - - 文化程度 + + + 组织Id列表 - - - 政治面貌 + + + 是否包含下级 - - - 毕业院校 + + + 是否包含职位 - - - 学历 + + + 组织导入 - + - 学制 + 名称 - + - 学位 + 上级组织 - + - 家庭电话 + 分类 - + - 办公电话 + 排序码 - + - 紧急联系人 + 主管账号 - - - 紧急联系人电话 + + + 组织树查询参数 + 懒加载用 - - - 紧急联系人地址 + + + 父Id - - - 员工编号 + + + 组织架构服务 - - - 入职日期 + + + 检查组织是否存在 + 组织列表 + 组织名称 + 父Id + 组织Id + 是否存在,存在返回组织ID - + - 部门Id + 组织详情 + id参数 + 组织信息 - + - 职位Id + 根据组织ID获取 下级 + 组织ID + 是否包含自己 + 组织列表 + - + - 选择用户输出参数 + 获取所有组织 + 是否显示禁用的 + - + - Id + 获取机构及下级ID列表 + + + 组织列表 + - + - 组织ID + 根据组织Id递归获取上级 + 组织列表 + 组织Id + 是否包含自己 + - + - 账号 + 获取组织信息 + 组织id + 组织信息 - + - 姓名 + 组织分页查询 + 查询参数 + 分页信息 - - - 性别 + + + 根据ID列表获取组织列表 + + - + - 组织名称 + 获取租户列表 + - + - 职位名称 + 根据组织ID获取租户ID + 组织id + 租户id + - + - 头像 + 添加组织 + 添加参数 + 名称 + - + - 用户信息输出 + 复制组织 + 机构复制参数 + - + - 用户信息 + 编辑组织 + 编辑参数 + 名称 + - - - 账号 + + + 删除组织 + 删除参数 + 名称 + - - - 姓名 + + + 构建组织树形结构 + 组织列表 + 父ID + 树型结构 - - - 昵称 + + + 刷新缓存 + - - - 性别 + + + 获取组织树型结构 + 机构ID列表 + 组织选择器(懒加载用) + 组织树列表 - - - 手机 - 这里使用了SM4自动加密解密 - + + - - - 邮箱 - + + - - - 所属机构 - + + - - - 职位 - + + - - - 出生日期 - + + - - - 民族 - + + - - - 籍贯 - + + - - - 家庭住址 - + + - - - 通信地址 - + + - - - 证件类型 - + + - - - 证件号码 - + + - - - 文化程度 - + + - - - 政治面貌 - + + - - - 毕业院校 - + + - - - 学历 - + + - - - 学制 - + + - - - 学位 - + + - + + + + + + + + + 检查输入参数 + + + + + + + 根据组织Id列表获取所有父级组织 + + + + + + + + 获取组织所有下级 + + + + + + + + 获取组织下级(懒加载) + + + + + + + + 赋值组织的所有下级 + + 组织列表 + 父Id + 新父Id + + + + + + + 重新生成组织实体 + + + + + + 获取全称 + + 组织列表 + 父Id + 组织名称 + 组织全称 + 组织父Id列表 + + + + 职位分页查询 + + + + + 组织ID + + + + + 职位列表 + + + + + 分类 + + + + + 状态 + + + + + 职位新增参数 + + + + + 组织ID + + + + + 名称 + + + + + 分类 + + + + + 机构编辑参数 + + + + + Id + + + + + 机构选择器参数 + + + + + 机构树形选择器参数 + + + + + 机构ID列表 + + + + + 组织树输出参数 + + + + + 职位Id + + + + + 名称 + + + + + 是否是职位 + + + + + 子项 + + + + + 组织选择器输出参数 + + + + + 组织Id或者职位Id + + + + + 名称 + + + + + 子项 + + + + + 职位服务 + + + + + 获取职位列表 + + 职位列表 + + + + 获取职位信息 + + 职位ID + 职位信息 + + + + 职位分页查询 + + 查询参数 + 分页列表 + + + + 职位选择器 + + 查询参数 + + + + + 根据id集合获取职位集合 + + + + + + + 职位树形结构 + + + + + + + 职位详情 + + + + + + + 编辑职位 + + 编辑参数 + 名称 + + + + + 刷新缓存 + + + + + + 添加职位 + + 添加参数 + 名称 + + + + + 删除职位 + + id列表 + 名称 + + + + + + + + + + 获取全部 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 检查输入参数 + + + 名称 + + + + 构建职位选择器 + + 组织列表 + 职位列表 + 父Id + + + + + 用户选择器参数 + + + + + 组织ID + + + + + 机构ID列表 + + + + + 机构ID + + + + + 角色ID + + + + + 关键字 + + + + + 用户分页查询参数 + + + + + 所属组织 + + + + + 动态查询条件 + + + + + 用户状态 + + + + + 添加用户参数 + + + + + 账号 + + + + + 姓名 + + + + + 组织id + + + + + 职位id + + + + + 编辑用户参数 + + + + + Id + + + + + 用户授权角色参数 + + + + + Id + + + + + 授权权限信息 + + + + + 默认数据权限 + + + + + 用户导入 + + + + + 账号 + + + + + 姓名 + + + + + 性别 + + + + + 昵称 + + + + + 手机 + 这里使用了SM4自动加密解密 + + + + + 邮箱 + + + + + 所属机构 + + + + + 职位 + + + + + 出生日期 + + + + + 民族 + + + + + 籍贯 + + + + + 家庭住址 + + + + + 通信地址 + + + + + 证件类型 + + + + + 证件号码 + + + + + 文化程度 + + + + + 政治面貌 + + + + + 毕业院校 + + + + + 学历 + + + + + 学制 + + + + + 学位 + + + + + 家庭电话 + + + + + 办公电话 + + + + + 紧急联系人 + + + + + 紧急联系人电话 + + + + + 紧急联系人地址 + + + + + 员工编号 + + + + + 入职日期 + + + + + 部门Id + + + + + 职位Id + + + + + 选择用户输出参数 + + + + + Id + + + + + 组织ID + + + + + 账号 + + + + + 姓名 + + + + + 性别 + + + + + 用户信息输出 + + + + + 用户信息 + + + + + 账号 + + + + + 姓名 + + + + + 昵称 + + + + + 性别 + + + + + 手机 + 这里使用了SM4自动加密解密 + + + + + 邮箱 + + + + + 所属机构 + + + + + 职位 + + + + + 出生日期 + + + + + 民族 + + + + + 籍贯 + + + + + 家庭住址 + + + + + 通信地址 + + + + + 证件类型 + + + + + 证件号码 + + + + + 文化程度 + + + + + 政治面貌 + + + + + 毕业院校 + + + + + 学历 + + + + + 学制 + + + + + 学位 + + + 家庭电话 - - - 办公电话 + + + 办公电话 + + + + + 紧急联系人 + + + + + 紧急联系人电话 + + + + + 紧急联系人地址 + + + + + 员工编号 + + + + + 入职日期 + + + + + 职级 + + + + + Id + + + + + 组织ID + + + + + 角色名称 + + + + + 角色编码 + + + + + 用户服务 + + + + + 根据用户ID获取按钮ID集合 + + + + + + + 根据账号获取用户信息 + + 用户名 + 租户ID + 用户信息 + + + + 根据用户ID和机构ID获取角色权限 + + + + + + + + 根据手机号获取用户账号 + + 手机号 + 租户ID + 用户账号名称 + + + + 用户选择器 + + 查询参数 + + + + + 用户分页查询 + + 查询参数 + 用户分页列表 + + + + 用户列表 + + 查询 + + + + + 根据用户Id获取用户信息 + + 用户ID + 用户信息 + + + + 根据用户Id获取用户信息 + + 用户ID + 转换的实体 + + + + + 根据用户账号获取用户ID + + 用户账号 + 租户id + + + + + 根据用户手机获取用户信息 + + 手机号 + 租户Id + 用户信息 + + + + 获取用户拥有角色 + + 用户ID + + + + + 获取用户拥有的资源 + + 用户id + 资源列表 + + + + 获取用户拥有的权限 + + 用户id + 权限列表 + + + + 用户权限树选择 + + 用户id + 权限列表 + + + + 根据id集合获取用户集合 + + Id集合 + + + + + 用户详情 + + + + + + + 获取用户头像 + + 用户id + base64头像 + + + + 获取当前API用户的数据范围 + null:代表拥有全部数据权限 + [xx,xx]:代表拥有部分机构的权限 + []:代表仅自己权限 + + 机构列表 + + + + 检查用户是否有机构的数据权限 + + 机构id + 创建者id + 错误提示:不为空则直接抛出异常 + 是否有权限 + + + + 检查用户是否有机构的数据权限 + + 机构id列表 + 创建者id列表 + 错误提示:不为空则直接抛出异常 + + + + + 添加用户 + + 添加参数 + + + + + 编辑 + + 编辑参数 + + + + + 启用用户 + + 用户Id + + + + + 禁用用户 + + 用户Id + + + + + 重置密码 + + 用户Id + + + + + 给用户授权角色 + + 授权参数 + + + + + 给用户授权资源 + + 授权参数 + + + + + 给用户授权权限 + + + + + + + 设置用户默认值 + + + + + + + 批量编辑 + + 批量编辑信息 + + + + + 删除用户 + + Id列表 + + + + + 从redis中删除用户信息 + + 用户ID列表 + + + + 从redis中删除用户信息 + + 用户ID + + + + 导出用户 + + + + + + + 导入模板下载 + + 模板 + + + + 导入预览 + + 预览参数 + 预览结果 + + + + 用户导入 + + + + + + + 检查导入数据 + + 数据 + 是否初始化错误 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 获取默认密码 + + + + + + 检查输入参数 + + + + + + 检查是否为自己 + + + 操作名称 + + + + 根据日期计算年龄 + + + + + + + 获取SqlSugar的ISugarQueryable + + + + + + + 数据库获取用户信息 + + 用户ID + + + + + 关系服务 + + + + + 根据分类获取关系表信息 + + 分类名称 + 关系表 + + + + 通过对象ID和分类获取关系列表 + + 对象ID + 分类 + + + + + 通过对象ID列表和分类获取关系列表 + + 对象ID + 分类 + + + + + 通过目标ID和分类获取关系列表 + + 目标ID + 分类 + + + + + 通过目标ID列表和分类获取关系列表 + + + + + + + + 获取关系表用户工作台 + + 用户ID + 关系表数据 + + + + 更新缓存 + + 分类 + + + + + 保存关系 + + 分类 + 对象ID + 目标ID + 拓展信息 + 是否清除老的数据 + 是否刷新缓存 + + + + + 批量保存关系 + + 分类 + 对象ID + 目标ID列表 + 拓展信息列表 + 是否清除老的数据 + + + + + 获取用户模块ID + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 资源输入 + + + + + 资源分类 + + + + + 是否包含按钮 + + + + + 角色授权资源树输出 + + + + + 模块id + + + + + 模块名称 + + + + + 模块图标 + + + + + 模块下菜单集合 + + + + + 授权菜单类 + + + + + 菜单id + + + + + 父id + + + + + 父名称 + + + + + 模块名称 + + + + + 模块id + + + + + 菜单下按钮集合 + + + + + 角色授权资源按钮信息 + + + + + 按钮id + + + + + 标题 + + + + + 权限树选择器输出 + + + + + 接口描述 - - - 紧急联系人 + + + 路由名称 - - - 紧急联系人电话 + + + 权限名称 - - - 紧急联系人地址 + + + 资源服务 - - - 员工编号 + + + 获取所有的菜单和模块以及单页面列表,并按分类和排序码排序 + 所有的菜单和模块以及单页面列表 - - - 入职日期 + + + 根据模块ID获取菜单和单页面列表 + + - - - 职级 + + + 根据资源ID获取所有下级资源 + 资源ID + 是否包含自己 + 资源列表 - + - 用户服务 + 根据资源ID获取所有下级资源 + 资源列表 + 资源ID + 是否包含自己 + 资源列表 - + - 根据用户ID获取按钮ID集合 + 获取ID获取Code列表 - + id列表 + 分类 + Code列表 + + + + 获取资源列表 + + 资源分类列表 - + - 根据账号获取用户信息 + 根据分类获取资源列表 - 用户名 - 用户信息 + 分类名称 + 资源列表 - + - 根据用户ID和机构ID获取角色权限 + 根据菜单ID获取菜单 - - + id列表 + 分类 - + - 根据手机号获取用户账号 + 获取权限授权树 - 手机号 - 用户账号名称 + 路由列表 + - + - 用户选择器 + 刷新缓存 - 查询参数 + 分类名称 - + - 用户分页查询 + 角色授权资源树 - 查询参数 - 用户分页列表 + - + - 用户列表 + 获取上级 - 查询 + + - + - 根据用户Id获取用户信息 + 获取授权菜单类菜单名称 - 用户ID - 用户信息 + 菜单列表 + 当前菜单 + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - 根据用户Id获取用户信息 + 获取路由地址名称 - 用户ID - 转换的实体 + 控制器地址 + 路由名称 - - - 根据用户账号获取用户ID - - 用户账号 - - - + - 根据用户手机获取用户信息 + 获取资源所有下级 - 手机号 - 用户信息 + 资源列表 + 父ID + - + - 获取用户拥有角色 + 获取授权菜单 - 用户ID + 模块ID - - - 获取当前API用户的数据范围 - null:代表拥有全部数据权限 - [xx,xx]:代表拥有部分机构的权限 - []:代表仅自己权限 - - 机构列表 + + - + - 获取用户拥有的资源 + 编辑个人信息参数 - 用户id - 资源列表 - + + + 姓名 + + + + + 签名图片 + + + + + 更新个人工作台 + + + + + 工作台数据 + + + + + 更新个人密码 + + + + + 密码 + + + + + 新密码 + + + + + 设置默认模块输入 + + + + + 模块Id + + + + + 是否默认 + + + + + 我的机构数样式 + + + + + Id + + + + + 名称 + + + + + 父ID + + + - 获取用户拥有的权限 + 子节点 - 用户id - 权限列表 - + - 用户权限树选择 + 样式 - 用户id - 权限列表 - + - 根据id集合获取用户集合 + 我的机构样式 - Id集合 - - + - 用户详情 + 背景色 - - - + - 添加用户 + 字体颜色 - 添加参数 - - + - 编辑 + 个人信息中心服务 - 编辑参数 - - + - 启用用户 + 获取登录用户菜单 - 用户Id + - + - 禁用用户 + 获取个人工作台 - 用户Id - + - 重置密码 + 获取组织架构 - 用户Id - + 组织架构 - + - 给用户授权角色 + 获取快捷菜单树 - 授权参数 - + - 给用户授权资源 + 更新个人信息 - 授权参数 + 信息参数 - + - 给用户授权权限 + 更新签名 - + 签名图片 - + - 设置用户默认值 + 编辑个人工作台 - + 工作台字符串 - + - 批量编辑 + 删除我的消息 - 批量编辑信息 + 消息Id - + - 删除用户 + 修改个人密码 - Id列表 + 密码信息 - + - 从redis中删除用户信息 + 修改头像 - 用户ID列表 + 头像文件 + - + - 从redis中删除用户信息 + 修改默认模块 - 用户ID + 默认模块输入参数 + - + - 导出用户 + 获取登录用户的站内信分页 - - + 查询参数 + 站内信列表 - + - 导入模板下载 + 读取登录用户站内信详情 - 模板 + 消息ID + 消息详情 - + - 导入预览 + 获取未读消息数量 - 预览参数 - 预览结果 + 未读消息数量 - + - 用户导入 + 最新未读消息 - - + - 检查导入数据 + 设置已读 - 数据 - 是否初始化错误 + - + - + 删除我的消息 + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - + - + - + - - + + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - + - 获取默认密码 + 获取父菜单集合 + 所有菜单列表 + 我的菜单列表 - - - 检查输入参数 - - - - - - 检查是否为自己 - - - 操作名称 - - + - 根据日期计算年龄 + 构建Meta - - - - - - 获取Sqlsugar的ISugarQueryable - - - + 我的菜单集合 - + - 数据库获取用户信息 + 构建机构树 - 用户ID + 机构列表 + 父ID + 用户ID diff --git a/api/SimpleAdmin/SimpleAdmin.System/Startup.cs b/api/SimpleAdmin/SimpleAdmin.System/Startup.cs index ec898232563fdac46163ff6b6fa12615c1430af6..3e2d3ccbe2603fb009a7b70acc2223f6026d06b5 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Startup.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Startup.cs @@ -1,5 +1,15 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using IP2Region.Net.Abstractions; +using IP2Region.Net.XDB; namespace SimpleAdmin.System; @@ -16,6 +26,9 @@ public class Startup : AppStartup /// public void ConfigureServices(IServiceCollection services) { + // 配置ip2region + services.AddSingleton(new Searcher(CachePolicy.Content, Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ip2region.xdb"))); + //系统配置转实体 services.AddConfigurableOptions(); //事件总线 @@ -29,6 +42,15 @@ public class Startup : AppStartup var fullName = Assembly.GetExecutingAssembly().FullName;//获取程序集全名 //通过 App.GetOptions 获取选项 var settings = App.GetOptions(); + if (settings.UseMessageCenter) + { + //通过 App.GetOptions 获取选项 + var cacheSettings = App.GetOptions(); + if (!cacheSettings.UseRedis) + { + throw Oops.Oh("启用通知中心必须使用Redis缓存"); + } + } CodeFirstUtils.CodeFirst(settings, fullName);//CodeFirst } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/System.Development.json b/api/SimpleAdmin/SimpleAdmin.System/System.Development.json index 80d8915db28739e0d6185c0461b0e54578af2e4e..68f71beee1c0918ba9c7afc04ac737d8025efc8b 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/System.Development.json +++ b/api/SimpleAdmin/SimpleAdmin.System/System.Development.json @@ -20,7 +20,9 @@ }, //系统层设置 "SystemSettings": { - "InitTable": true, //是否初始化表结构 - "InitSeedData": true, //是否初始化种子数据 + "InitTable": false, //是否初始化表结构 + "InitSeedData": false, //是否初始化种子数据 + "SuperAdminViewAllData": true, //是否超级管理员可以查看所有数据 + "UseMessageCenter": true, //是否启用通知中心 } } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/System.Production.json b/api/SimpleAdmin/SimpleAdmin.System/System.Production.json index e7579eaf1b880d5badd2f0be70bb05aef99a2e44..5f93ce60e1207d267252871e1d74dd2c30cd2712 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/System.Production.json +++ b/api/SimpleAdmin/SimpleAdmin.System/System.Production.json @@ -1,26 +1,28 @@ { - //swagger - "[openapi:System]": { - "Order": 99, //int ͣԽǰ棬Ĭ 0 - "Title": "RBACȨģ", //÷⣬string - "Description": " .NET 򵥣ͨãС", - "Version": "1.0.0", //÷汾Ĭ 1.0 - "TermsOfService": "https://www.cnblogs.com/huguodong/", //ӵַUri + //swagger分组设置 + "[openapi:Default]": { + "Order": 99, //分组排序,int 类型,数字越大排前面,默认 0 + "Title": "RBAC权限模块", //配置分组标题,string 类型 + "Description": "让 .NET 开发更简单,更通用,更流行。", + "Version": "1.0.0", //配置分组版本,默认 1.0 + "TermsOfService": "https://www.cnblogs.com/huguodong/", //配置相关链接地址,Uri 类型 "Contact": { - //ϵʽ - "Name": "פɽ´", + //配置联系方式 + "Name": "少林寺驻北固山办事处大神父王喇嘛", "Url": "https://gitee.com/huguodong520", "Email": "531035580@qq.com" }, "License": { - //Э飬OpenApiLicense + //配置协议,OpenApiLicense 类型 "Name": "Apache-2.0", "Url": "https://gitee.com/huguodong520/SimpleAdmin/blob/master/LICENSE" } }, - //ϵͳ + //系统层设置 "SystemSettings": { - "InitTable": false, //Ƿʼṹ - "InitSeedData": false, //Ƿʼ + "InitTable": false, //是否初始化表结构 + "InitSeedData": false, //是否初始化种子数据 + "SuperAdminViewAllData": false, //是否超级管理员可以查看所有数据 + "UseMessageCenter": false, //是否启用通知中心 } } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/UserManager/UserManager.cs b/api/SimpleAdmin/SimpleAdmin.System/UserManager/UserManager.cs index 60224ddc2be19224c1cdc2de43ea1986ce9b5938..97bdd0a04f3bcb20c880a3ed9fb5d130f13b639f 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/UserManager/UserManager.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/UserManager/UserManager.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.System; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 当前登录用户信息 @@ -8,25 +18,64 @@ public class UserManager /// /// 当前用户Id /// - public static long UserId => (App.User?.FindFirst(ClaimConst.UserId)?.Value).ToLong(); + public static long UserId + { + get + { + return (App.User?.FindFirst(ClaimConst.USER_ID)?.Value).ToLong(); + } + } /// /// 当前用户账号 /// - public static string UserAccount => App.User?.FindFirst(ClaimConst.Account)?.Value; + public static string UserAccount + { + get + { + return App.User?.FindFirst(ClaimConst.ACCOUNT)?.Value; + } + } /// /// 当前用户昵称 /// - public static string Name => App.User?.FindFirst(ClaimConst.Name)?.Value; + public static string Name + { + get + { + return App.User?.FindFirst(ClaimConst.NAME)?.Value; + } + } /// /// 是否超级管理员 /// - public static bool SuperAdmin => (App.User?.FindFirst(ClaimConst.IsSuperAdmin)?.Value).ToBoolean(); + public static bool SuperAdmin + { + get + { + return (App.User?.FindFirst(ClaimConst.IS_SUPER_ADMIN)?.Value).ToBoolean(); + } + } /// /// 机构ID /// - public static long OrgId => (App.User?.FindFirst(ClaimConst.OrgId)?.Value).ToLong(); -} \ No newline at end of file + public static long OrgId + { + get + { + return (App.User?.FindFirst(ClaimConst.ORG_ID)?.Value).ToLong(); + } + } + + public static long? TenantId + { + get + { + //如果有租户ID则返回租户ID,否则返回null + return (App.User?.FindFirst(ClaimConst.TENANT_ID)?.Value).ToLong(); + } + } +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Entry/ip2region.db b/api/SimpleAdmin/SimpleAdmin.System/ip2region.xdb similarity index 42% rename from api/SimpleAdmin/SimpleAdmin.Web.Entry/ip2region.db rename to api/SimpleAdmin/SimpleAdmin.System/ip2region.xdb index 6cf58efb2ebc43c42fcba5cfe92ad986a999bf5b..c78b792844dbbe2a3cd5aa1919dd75772ae7aa6e 100644 Binary files a/api/SimpleAdmin/SimpleAdmin.Web.Entry/ip2region.db and b/api/SimpleAdmin/SimpleAdmin.System/ip2region.xdb differ diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/AuthComponent.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/AuthComponent.cs index 2e20f4b414a80e9fce23aba7d2af3e18b66a07a0..23fe9c0c69875653a598d7b999ae32692dfc329e 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/AuthComponent.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/AuthComponent.cs @@ -1,4 +1,14 @@ -using Microsoft.AspNetCore.Authentication.JwtBearer; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using Microsoft.AspNetCore.Authentication.JwtBearer; namespace SimpleAdmin.Web.Core; @@ -21,8 +31,7 @@ public sealed class AuthComponent : IServiceComponent // If the request is for our hub... var path = context.HttpContext.Request.Path; - if (!string.IsNullOrEmpty(accessToken) && - (path.StartsWithSegments("/hubs"))) + if (!string.IsNullOrEmpty(accessToken) && path.StartsWithSegments("/hubs")) { // Read the token out of the query string context.Token = accessToken; @@ -37,4 +46,4 @@ public sealed class AuthComponent : IServiceComponent //注册自定义授权筛选器 services.AddMvcFilter(); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/LoggingMonitorComponent.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/LoggingMonitorComponent.cs index 54148ad6202531c8228d8914ca23c22c86939551..c2119e4e27c0b1c1782ee3b330e6b5e657e7b02a 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/LoggingMonitorComponent.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/LoggingMonitorComponent.cs @@ -1,4 +1,14 @@ -using UAParser; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using UAParser; namespace SimpleAdmin.Web.Core; @@ -11,38 +21,38 @@ public sealed class LoggingMonitorComponent : IServiceComponent { //Monitor日志配置 services.AddMonitorLogging(options => - { - options.JsonIndented = true;// 是否美化 JSON - options.GlobalEnabled = true;//全局启用 - options.ConfigureLogger((logger, logContext, context) => - { - var httpContext = context.HttpContext;//获取httpContext - //获取头 - var userAgent = httpContext.Request.Headers["User-Agent"]; - if (string.IsNullOrEmpty(userAgent)) userAgent = "Other";//如果没有这个头就指定一个 - //获取客户端信息 - var client = Parser.GetDefault().Parse(userAgent); - // 获取控制器/操作描述器 - var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor; - //操作名称默认是控制器名加方法名,自定义操作名称要在action上加Description特性 - //var option = $"{controllerActionDescriptor.ControllerName}/{controllerActionDescriptor.ActionName}"; - ////获取特性 - //var monitor = controllerActionDescriptor.MethodInfo.GetCustomAttribute(); - //if (monitor != null)//如果有LoggingMonitor特性 - // option = monitor.Description;//则将操作名称赋值为控制器上写的title - //logContext.Set(LoggingConst.Operation, option);//传操作名称 - logContext.Set(LoggingConst.Client, client);//客户端信息 - logContext.Set(LoggingConst.Path, httpContext.Request.Path.Value);//请求地址 - logContext.Set(LoggingConst.Method, httpContext.Request.Method);//请求方法 - }); - }); + { + options.JsonIndented = true;// 是否美化 JSON + options.GlobalEnabled = true;//全局启用 + options.ConfigureLogger((logger, logContext, context) => + { + var httpContext = context.HttpContext;//获取httpContext + //获取头 + var userAgent = httpContext.Request.Headers["User-Agent"]; + if (string.IsNullOrEmpty(userAgent)) userAgent = "Other";//如果没有这个头就指定一个 + //获取客户端信息 + var client = Parser.GetDefault().Parse(userAgent); + // 获取控制器/操作描述器 + // var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor; + //操作名称默认是控制器名加方法名,自定义操作名称要在action上加Description特性 + //var option = $"{controllerActionDescriptor.ControllerName}/{controllerActionDescriptor.ActionName}"; + ////获取特性 + //var monitor = controllerActionDescriptor.MethodInfo.GetCustomAttribute(); + //if (monitor != null)//如果有LoggingMonitor特性 + // option = monitor.Description;//则将操作名称赋值为控制器上写的title + //logContext.Set(LoggingConst.Operation, option);//传操作名称 + logContext.Set(LoggingConst.CLIENT, client);//客户端信息 + logContext.Set(LoggingConst.PATH, httpContext.Request.Path.Value);//请求地址 + logContext.Set(LoggingConst.METHOD, httpContext.Request.Method);//请求方法 + }); + }); //日志写入数据库配置 services.AddDatabaseLogging(options => { - options.WriteFilter = (logMsg) => + options.WriteFilter = logMsg => { return logMsg.LogName == "System.Logging.LoggingMonitor";//只写入LoggingMonitor日志 }; }); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/PluginSettingComponent.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/PluginSettingComponent.cs deleted file mode 100644 index 2d32f18be614c026641df064eb7c343f211448bd..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/PluginSettingComponent.cs +++ /dev/null @@ -1,37 +0,0 @@ -using SimpleAdmin.Plugin.Mqtt; -using SimpleAdmin.Plugin.SignalR; - -namespace SimpleAdmin.Web.Core; - -/// -/// 插件设置组件 -/// 模拟 ConfigureService -/// -public sealed class PluginSettingComponent : IServiceComponent -{ - public void Load(IServiceCollection services, ComponentContext componentContext) - { - //插件设置配置转实体 - services.AddConfigurableOptions(); - //获取插件配置 - var pluginSettings = App.GetConfig("PluginSettings"); - if (pluginSettings.UseSignalR)//如果使用signalr则启用signalr插件 - services.AddComponent(); - if (pluginSettings.UseMqtt)//如果使用mqtt则启用mqtt插件 - services.AddComponent(); - } -} - -/// -/// 插件设置组件 -/// 模拟 Configure -/// -public sealed class PluginSettingsApplicationComponent : IApplicationComponent -{ - public void Load(IApplicationBuilder app, IWebHostEnvironment env, ComponentContext componentContext) - { - //通过 App.GetOptions 获取选项 - var pluginSettings = App.GetOptions(); - if (pluginSettings.UseMqtt) app.UseComponent(env); - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/WebSettingsComponent.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/WebSettingsComponent.cs index 62599e964f9941988cae4503dc129e92b889688f..0ed245af9558cda333a21269c525711a130cbed5 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/WebSettingsComponent.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/WebSettingsComponent.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// Web设置组件 @@ -28,4 +38,4 @@ public sealed class WebSettingsApplicationComponent : IApplicationComponent public void Load(IApplicationBuilder app, IWebHostEnvironment env, ComponentContext componentContext) { } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/GenTestController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/GenTestController.cs deleted file mode 100644 index 773ab8a2f27a0d95a8e524418f2d8687c32226d8..0000000000000000000000000000000000000000 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/GenTestController.cs +++ /dev/null @@ -1,167 +0,0 @@ -using Microsoft.AspNetCore.Mvc; -using System.ComponentModel; -using Furion.DynamicApiController; -using SimpleAdmin.Application; - -namespace SimpleAdmin.Web.Core; - -/// -/// 测试控制器 -/// -[ApiDescriptionSettings("Application", Tag = "测试")] -[Route("/biz/test")] -public class GenTestController: IDynamicApiController -{ - private readonly IGenTestService _genTestService; - private readonly ISysOrgService _sysOrgService; - public GenTestController(IGenTestService genTestService - ,ISysOrgService sysOrgService - ) - { - this._genTestService = genTestService; - _sysOrgService = sysOrgService; - } - #region Get请求 - - /// - /// 测试分页查询 - /// - /// - /// - [HttpGet("page")] - [DisplayName("测试分页查询")] - public async Task Page([FromQuery] GenTestPageInput input) - { - return await _genTestService.Page(input); - } - - /// - /// 测试列表查询 - /// - /// - /// - [HttpGet("list")] - [DisplayName("测试列表查询")] - public async Task List([FromQuery] GenTestPageInput input) - { - return await _genTestService.List(input); - } - - /// - /// 测试详情 - /// - /// - /// - [HttpGet("detail")] - [DisplayName("测试详情")] - public async Task Detail([FromQuery] BaseIdInput input) - { - return await _genTestService.Detail(input); - } - - - /// - /// 获取组织树选择器 - /// - /// - [HttpGet("orgTreeSelector")] - [DisplayName("组织树查询")] - public async Task OrgTreeSelector() - { - return await _sysOrgService.Tree(); - } - - /// - /// 测试导入预览 - /// - /// - /// - [HttpPost("preview")] - [DisableRequestSizeLimit] - [SuppressMonitor] - [DisplayName("测试导入预览")] - public async Task Preview([FromForm] ImportPreviewInput input) - { - return await _genTestService.Preview(input); - } - - /// - /// 测试导入模板下载 - /// - /// - [HttpGet("template")] - [SuppressMonitor] - public async Task Template() - { - return await _genTestService.Template(); - } - - - #endregion - - - #region Post请求 - - /// - /// 添加测试 - /// - /// - /// - [HttpPost("add")] - [DisplayName("添加测试")] - public async Task Add([FromBody] GenTestAddInput input) - { - await _genTestService.Add(input); - } - - /// - /// 修改测试 - /// - /// - /// - [HttpPost("edit")] - [DisplayName("修改测试")] - public async Task Edit([FromBody] GenTestEditInput input) - { - await _genTestService.Edit(input); - } - - /// - /// 删除测试 - /// - /// - /// - [HttpPost("delete")] - [DisplayName("删除测试")] - public async Task Delete([FromBody] List input) - { - await _genTestService.Delete(input); - } - - /// - /// 测试导入 - /// - /// - /// - [HttpPost("import")] - [DisplayName("测试导入")] - public async Task Import([SuppressMonitor][FromBody] ImportResultInput input) - { - return await _genTestService.Import(input); - } - - /// - /// 测试导出 - /// - /// - /// - [HttpPost("export")] - [DisplayName("测试导出")] - public async Task Export([FromBody] GenTestPageInput input) - { - return await _genTestService.Export(input); - } - - #endregion -} - diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizOrgController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/Organization/BizOrgController.cs similarity index 73% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizOrgController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/Organization/BizOrgController.cs index 90863d5073c0301788b983b4f859017721b2bb75..ca72ecebccdaf9a31a8d80ace69f33823b4b70df 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizOrgController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/Organization/BizOrgController.cs @@ -1,10 +1,20 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 机构管理控制器 /// [ApiDescriptionSettings("Application", Tag = "机构管理")] -[Route("/biz/org")] +[Route("biz/organization/org")] [RolePermission] public class BizOrgController : IDynamicApiController { @@ -17,6 +27,8 @@ public class BizOrgController : IDynamicApiController _userService = userService; } + #region Get请求 + /// /// 获取机构树 /// @@ -40,6 +52,44 @@ public class BizOrgController : IDynamicApiController return await _orgService.Page(input); } + /// + /// 获取机构树选择器 + /// + /// + [HttpGet("orgTreeSelector")] + [DisplayName("机构树选择器")] + public async Task OrgTreeSelector() + { + return await _orgService.Tree(); + } + + /// + /// 获取人员选择器 + /// + /// + [HttpGet("userSelector")] + [DisplayName("人员选择器")] + public async Task UserSelector([FromQuery] UserSelectorInput input) + { + return await _userService.Selector(input); + } + + /// + /// 机构详情 + /// + /// + /// + [HttpGet("detail")] + [DisplayName("机构详情")] + public async Task Detail([FromQuery] BaseIdInput input) + { + return await _orgService.Detail(input); + } + + #endregion + + #region Post请求 + /// /// 添加机构 /// @@ -83,42 +133,10 @@ public class BizOrgController : IDynamicApiController /// [HttpPost("delete")] [DisplayName("删除机构")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _orgService.Delete(input); } - /// - /// 获取机构树选择器 - /// - /// - [HttpGet("orgTreeSelector")] - [DisplayName("机构树选择器")] - public async Task OrgTreeSelector() - { - return await _orgService.Tree(); - } - - /// - /// 获取人员选择器 - /// - /// - [HttpGet("userSelector")] - [DisplayName("人员选择器")] - public async Task UserSelector([FromQuery] UserSelectorInput input) - { - return await _userService.UserSelector(input); - } - - /// - /// 测试详情 - /// - /// - /// - [HttpGet("detail")] - [DisplayName("机构详情")] - public async Task Detail([FromQuery] BaseIdInput input) - { - return await _orgService.Detail(input); - } -} \ No newline at end of file + #endregion +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizPositionController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/Organization/BizPositionController.cs similarity index 52% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizPositionController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/Organization/BizPositionController.cs index 7f53f394cb967358dbc43fd02c65d25fb02b361a..7885515cb5e3238622fb323a2ffce1d77c27e2f1 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizPositionController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/Organization/BizPositionController.cs @@ -1,10 +1,20 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 岗位管理控制器 /// [ApiDescriptionSettings("Application", Tag = "岗位管理")] -[Route("/biz/position")] +[Route("biz/organization/position")] [RolePermission] public class BizPositionController { @@ -15,6 +25,19 @@ public class BizPositionController _positionService = positionService; } + #region Get请求 + + /// + /// 获取职位树 + /// + /// + [HttpGet("tree")] + [DisplayName("获取职位树")] + public async Task Tree([FromQuery] PositionTreeInput input) + { + return await _positionService.Tree(input); + } + /// /// 岗位分页查询 /// @@ -27,6 +50,34 @@ public class BizPositionController return await _positionService.Page(input); } + /// + /// 岗位详情 + /// + /// + /// + [HttpGet("detail")] + [DisplayName("岗位详情")] + public async Task Detail([FromQuery] BaseIdInput input) + { + return await _positionService.Detail(input); + } + + /// + /// 岗位选择器 + /// + /// + /// + [HttpGet("selector")] + [DisplayName("岗位选择器")] + public async Task Selector([FromQuery] PositionSelectorInput input) + { + return await _positionService.Selector(input); + } + + #endregion + + #region Post请求 + /// /// 添加岗位 /// @@ -58,20 +109,10 @@ public class BizPositionController /// [HttpPost("delete")] [DisplayName("删除岗位")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _positionService.Delete(input); } - /// - /// 测试详情 - /// - /// - /// - [HttpGet("detail")] - [DisplayName("岗位详情")] - public async Task Detail([FromQuery] BaseIdInput input) - { - return await _positionService.Detail(input); - } -} \ No newline at end of file + #endregion +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/RoleController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/Organization/BizRoleController.cs similarity index 61% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/RoleController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/Organization/BizRoleController.cs index 9f2247996bc1cee313410c2b498ebaccd9e082ac..9ddca12c478b31122a7fd3edfb12a5b8cc7c8aa7 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/RoleController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/Organization/BizRoleController.cs @@ -1,22 +1,31 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// -/// 角色管理控制器 +/// 业务角色管理控制器 /// [ApiDescriptionSettings(Tag = "角色管理")] -public class RoleController : BaseController +[Route("biz/organization/role")] +[RolePermission] +public class BizRoleController : IDynamicApiController { - private readonly IRoleService _roleService; private readonly IResourceService _resourceService; - private readonly ISysOrgService _sysOrgService; + private readonly IRoleService _roleService; private readonly ISysUserService _sysUserService; - public RoleController(IRoleService roleService, IResourceService resourceService, ISysOrgService sysOrgService, - ISysUserService sysUserService) + public BizRoleController(IResourceService resourceService, IRoleService roleService, ISysUserService sysUserService) { - _roleService = roleService; _resourceService = resourceService; - _sysOrgService = sysOrgService; + _roleService = roleService; _sysUserService = sysUserService; } @@ -26,6 +35,7 @@ public class RoleController : BaseController /// /// [HttpGet("page")] + [DisplayName("角色分页查询")] public async Task Page([FromQuery] RolePageInput input) { return await _roleService.Page(input); @@ -62,7 +72,7 @@ public class RoleController : BaseController /// [HttpPost("delete")] [DisplayName("删除角色")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _roleService.Delete(input); } @@ -72,9 +82,10 @@ public class RoleController : BaseController /// /// [HttpGet("resourceTreeSelector")] + [DisplayName("获取角色授权资源树")] public async Task ResourceTreeSelector() { - return await _resourceService.ResourceTreeSelector(); + return await _roleService.ResourceTreeSelector(); } /// @@ -83,9 +94,10 @@ public class RoleController : BaseController /// /// [HttpGet("ownResource")] + [DisplayName("获取角色拥有资源")] public async Task OwnResource([FromQuery] BaseIdInput input) { - return await _roleService.OwnResource(input, CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE); + return await _roleService.OwnResource(input, CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE); } /// @@ -101,78 +113,61 @@ public class RoleController : BaseController } /// - /// 获取权限授权树 - /// - /// - [HttpGet("permissionTreeSelector")] - public async Task PermissionTreeSelector([FromQuery] BaseIdInput input) - { - return await _roleService.RolePermissionTreeSelector(input); - } - - /// - /// 获取角色拥有权限 + /// 获取角色下的用户 /// /// /// - [HttpGet("ownPermission")] - public async Task OwnPermission([FromQuery] BaseIdInput input) + [HttpGet("ownUser")] + [DisplayName("获取角色下的用户")] + public async Task OwnUser([FromQuery] BaseIdInput input) { - return await _roleService.OwnPermission(input); + return await _roleService.OwnUser(input); } /// - /// 给角色授权权限 + /// 给角色授权用户 /// /// /// - [HttpPost("grantPermission")] - [DisplayName("角色授权权限")] - public async Task GrantPermission([FromBody] GrantPermissionInput input) + [HttpPost("grantUser")] + [DisplayName("角色授权")] + public async Task GrantUser([FromBody] GrantUserInput input) { - await _roleService.GrantPermission(input); + await _roleService.GrantUser(input); } /// - /// 获取组织树选择器 + /// 获取角色树 /// /// - [HttpGet("orgTreeSelector")] - public async Task OrgTreeSelector() + [HttpGet("tree")] + [DisplayName("获取角色树")] + public async Task Tree([FromQuery] RoleTreeInput input) { - return await _sysOrgService.Tree(); + return await _roleService.Tree(input); } - /// - /// 获取用户选择器 - /// - /// - [HttpGet("userSelector")] - public async Task UserSelector([FromQuery] UserSelectorInput input) - { - return await _sysUserService.UserSelector(input); - } /// - /// 获取角色下的用户 + /// 获取角色详情 /// /// /// - [HttpGet("ownUser")] - public async Task OwnUser([FromQuery] BaseIdInput input) + [HttpGet("detail")] + [DisplayName("获取角色详情")] + public async Task Detail([FromQuery] BaseIdInput input) { - return await _roleService.OwnUser(input); + return await _roleService.Detail(input); } /// - /// 给角色授权用户 + /// 获取角色选择器 /// - /// /// - [HttpPost("grantUser")] - [DisplayName("角色授权")] - public async Task GrantUser([FromBody] GrantUserInput input) + [HttpGet("roleSelector")] + [DisplayName("获取角色选择器")] + public async Task RoleSelector([FromQuery] RoleSelectorInput input) { - await _roleService.GrantUser(input); + return await _roleService.RoleSelector(input); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizUserController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/Organization/BizUserController.cs similarity index 81% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizUserController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/Organization/BizUserController.cs index f70005cbd19affd056b7e993904947b672d09dc6..cfbe28337fc4ff5e569da9663c82989768356c46 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizUserController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/Organization/BizUserController.cs @@ -1,10 +1,20 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 人员管理控制器 /// [ApiDescriptionSettings("Application", Tag = "人员管理")] -[Route("/biz/user")] +[Route("biz/organization/user")] [RolePermission] public class BizUserController : IDynamicApiController { @@ -46,16 +56,6 @@ public class BizUserController : IDynamicApiController return await _userService.Template(); } - /// - /// 获取组织树选择器 - /// - /// - [HttpGet("orgTreeSelector")] - [DisplayName("机构树查询")] - public async Task OrgTreeSelector() - { - return await _orgService.Tree(); - } /// /// 人员分页查询 @@ -73,23 +73,11 @@ public class BizUserController : IDynamicApiController /// 获取人员选择器 /// /// - [HttpGet("userSelector")] + [HttpGet("selector")] [DisplayName("人员选择器")] - public async Task UserSelector([FromQuery] UserSelectorInput input) + public async Task Selector([FromQuery] UserSelectorInput input) { - return await _userService.UserSelector(input); - } - - /// - /// 岗位选择器 - /// - /// - /// - [HttpGet("positionSelector")] - [DisplayName("岗位选择器")] - public async Task PositionSelector([FromQuery] PositionSelectorInput input) - { - return await _positionService.PositionSelector(input); + return await _userService.Selector(input); } /// @@ -104,18 +92,6 @@ public class BizUserController : IDynamicApiController return await _userService.OwnRole(input); } - /// - /// 获取角色选择器 - /// - /// - [HttpGet("roleSelector")] - [DisplayName("角色选择器")] - public async Task RoleSelector([FromQuery] RoleSelectorInput input) - { - return await _userService.RoleSelector(input); - } - - /// /// 人员详情 /// @@ -175,7 +151,7 @@ public class BizUserController : IDynamicApiController /// [HttpPost("delete")] [DisplayName("删除人员")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _userService.Delete(input); } @@ -253,4 +229,4 @@ public class BizUserController : IDynamicApiController } #endregion Post请求 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/AuthBController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/AuthBController.cs index 7c6a6c68fda8c467e5824ed05b355d33cc9429b0..2e5ee05cf67dab4377532bc868e690b111ed8a77 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/AuthBController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/AuthBController.cs @@ -1,11 +1,21 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// B端登录控制器 /// [ApiDescriptionSettings(Tag = "B端权限校验")] -[Route("auth/b")] -public class AuthBController : IDynamicApiController +[Route("sys/auth/b")] +public class AuthBController : BaseController { private readonly IAuthService _authService; @@ -44,7 +54,7 @@ public class AuthBController : IDynamicApiController /// [AllowAnonymous] [HttpPost("login")] - [DisplayName(EventSubscriberConst.LoginB)] + [DisplayName(EventSubscriberConst.LOGIN_B)] public async Task Login(LoginInput input) { return await _authService.Login(input, LoginClientTypeEnum.B); @@ -66,9 +76,9 @@ public class AuthBController : IDynamicApiController /// 登出 /// /// - [HttpPost("loginOut")] - [DisplayName(EventSubscriberConst.LoginOutB)] - public async Task LoginOut(LoginOutIput input) + [HttpPost("logout")] + [DisplayName(EventSubscriberConst.LOGIN_OUT_B)] + public async Task LoginOut([FromBody] LoginOutInput input) { await _authService.LoginOut(input.Token, LoginClientTypeEnum.B); } @@ -82,4 +92,4 @@ public class AuthBController : IDynamicApiController { return await _authService.GetLoginUser(); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/SessionController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/SessionController.cs index 4efde3c3284e14aef2fd4433f202d9af9bf8edf1..a196813242d61e17dcc9f1abd15e78f425b645ea 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/SessionController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/SessionController.cs @@ -1,12 +1,22 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 会话管理控制器 /// [ApiDescriptionSettings(Tag = "会话管理")] -[Route("auth/[controller]")] +[Route("sys/auth/[controller]")] [SuperAdmin] -public class SessionController +public class SessionController : BaseController { private readonly ISessionService _sessionService; @@ -90,4 +100,4 @@ public class SessionController { await _sessionService.ExitToken(input); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/BaseController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/BaseController.cs index a9aceda0441372e99a9c37116db04998356d0c63..35de4eda7f5182d4f5082ebfc0baf692b28114df 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/BaseController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/BaseController.cs @@ -1,10 +1,19 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 基础控制器 /// [Route("sys/[controller]")] -[SuperAdmin] public class BaseController : IDynamicApiController { -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/BatchEdit/BatchEditController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/BatchEdit/BatchEditController.cs index f2f5f6de1f816c33ffbe51537c59ee64849544e1..3b9ff7d48a047e26da3b3b1074156f20ef7b3e19 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/BatchEdit/BatchEditController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/BatchEdit/BatchEditController.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 批量控制器 @@ -93,7 +103,7 @@ public class BatchEditController : BaseController /// [HttpPost("delete")] [DisplayName("删除批量更新")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _batchEditService.Delete(input); } @@ -111,4 +121,4 @@ public class BatchEditController : BaseController } #endregion Post请求 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/CommonController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/CommonController.cs new file mode 100644 index 0000000000000000000000000000000000000000..3517b9c0d54fe5be10c71b9d130e559aebd0fb1f --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/CommonController.cs @@ -0,0 +1,84 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; + +/// +/// 系统通用控制器,一般是一些公共的接口 +/// +[Route("sys")] +public class CommonController : BaseController +{ + private readonly ISysOrgService _sysOrgService; + private readonly IConfigService _configService; + + public CommonController(IConfigService configService, ISysOrgService sysOrgService) + { + _sysOrgService = sysOrgService; + _configService = configService; + } + + + /// + /// 获取系统基础配置 + /// + /// + [HttpGet("ico")] + [AllowAnonymous] + [NonUnify] + public async Task Ico() + { + return await _configService.GetIco(); + } + + /// + /// 获取系统基础配置 + /// + /// + [HttpGet("sysInfo")] + [AllowAnonymous] + public async Task SysInfo() + { + var sysBase = await _configService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_BASE); + //排除掉一些不需要的配置 + var configKeys = new List() + { + SysConfigConst.SYS_ICO, + SysConfigConst.SYS_WEB_STATUS, + SysConfigConst.SYS_WEB_CLOSE_PROMPT, + SysConfigConst.SYS_DEFAULT_WORKBENCH_DATA + }; + sysBase = sysBase.Where(x => !configKeys.Contains(x.ConfigKey)).ToList(); + return sysBase; + } + + /// + /// 获取系统基础配置 + /// + /// + [HttpGet("loginPolicy")] + [AllowAnonymous] + public async Task LoginPolicy() + { + var loginPolicy = await _configService.GetConfigsByCategory(CateGoryConst.CONFIG_LOGIN_POLICY);//登录策略 + return loginPolicy; + } + + /// + /// 获取租户列表 + /// + /// + [HttpGet("tenantList")] + [AllowAnonymous] + public async Task TenantList() + { + return await _sysOrgService.GetTenantList(); + } +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/FileController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/FileController.cs index 2e7ea921366473f986d0b7332a5a8c519e35aa2d..039ae81c0420112b590a8d72cd28bdf596ab0ef9 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/FileController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/FileController.cs @@ -1,10 +1,20 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 文件管理控制器 /// [ApiDescriptionSettings(Tag = "文件管理")] -[Route("dev/[controller]")] +[Route("sys/dev/[controller]")] public class FileController : BaseController { private readonly IFileService _fileService; @@ -28,27 +38,27 @@ public class FileController : BaseController /// /// 上传本地文件 /// - /// + /// /// [HttpPost("uploadLocal")] [DisplayName("上传本地文件")] [DisableRequestSizeLimit] - public async Task UploadLocal([FromForm] IFormFile File) + public async Task UploadLocal([FromForm] IFormFile file) { - return await _fileService.UploadFile(DevDictConst.FILE_ENGINE_LOCAL, File); + return await _fileService.UploadFile(SysDictConst.FILE_ENGINE_LOCAL, file); } /// /// 上传MINIO文件 /// - /// + /// /// [HttpPost("uploadMinio")] [DisplayName("上传MINIO文件")] [DisableRequestSizeLimit] - public async Task UploadMinio([FromForm] IFormFile File) + public async Task UploadMinio([FromForm] IFormFile file) { - return await _fileService.UploadFile(DevDictConst.FILE_ENGINE_MINIO, File); + return await _fileService.UploadFile(SysDictConst.FILE_ENGINE_MINIO, file); } /// @@ -58,7 +68,7 @@ public class FileController : BaseController /// [HttpPost("delete")] [DisplayName("删除文件")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _fileService.Delete(input); } @@ -74,4 +84,4 @@ public class FileController : BaseController { return await _fileService.Download(input); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/MessageController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/MessageController.cs index 7869ea1f1045d72cc9ac7c1091f69a992cd88aa6..8966e4b2b21a4d65da3f887a1f602d14e6a1c172 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/MessageController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/MessageController.cs @@ -1,10 +1,20 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 站内信控制器 /// [ApiDescriptionSettings(Tag = "站内信")] -[Route("dev/[controller]")] +[Route("sys/dev/[controller]")] public class MessageController : BaseController { private readonly IMessageService _messageService; @@ -24,17 +34,28 @@ public class MessageController : BaseController { return await _messageService.Page(input); } + /// - /// 发送站内信 + /// 添加站内信 /// /// - /// - [HttpPost("send")] - [DisplayName("发送站内信")] - public async Task Send([FromBody] MessageSendInput input) + [HttpPost("add")] + [DisplayName("添加站内信")] + public async Task Add([FromBody] MessageSendInput input) + { + await _messageService.Add(input); + } + + /// + /// 编辑站内信 + /// + /// + [HttpPost("edit")] + [DisplayName("编辑站内信")] + public async Task Edit([FromBody] MessageSendUpdateInput input) { - await _messageService.Send(input); + await _messageService.Edit(input); } /// @@ -43,7 +64,7 @@ public class MessageController : BaseController /// /// [HttpGet("detail")] - public async Task Detail([FromQuery] BaseIdInput input) + public async Task Detail([FromQuery] MessageDetailInput input) { return await _messageService.Detail(input); } @@ -55,8 +76,8 @@ public class MessageController : BaseController /// [HttpPost("delete")] [DisplayName("删除站内信")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _messageService.Delete(input); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Index/IndexController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Index/IndexController.cs index 61a94481076cffdf74f7836b226ea32c6189754f..661969d18cb0054be31dfe16058353fec42071a3 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Index/IndexController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Index/IndexController.cs @@ -1,11 +1,22 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 系统首页控制器 /// [ApiDescriptionSettings(Tag = "系统首页")] -[Route("sys/[controller]")] -public class IndexController : IDynamicApiController +[Route("home/index")] +[RolePermission] +public class IndexController : BaseController { private readonly IVisitLogService _visitLogService; private readonly IOperateLogService _operateLogService; @@ -13,17 +24,17 @@ public class IndexController : IDynamicApiController public IndexController(IVisitLogService visitLogService, IOperateLogService operateLogService, IIndexService indexService) { - this._visitLogService = visitLogService; - this._operateLogService = operateLogService; - this._indexService = indexService; + _visitLogService = visitLogService; + _operateLogService = operateLogService; + _indexService = indexService; } /// /// 获取当前用户访问日志列表 /// /// - [HttpGet("visLog/list")] + [DisplayName("访问日志")] public async Task VisLogList() { return await _visitLogService.Page(new VisitLogPageInput { Account = UserManager.UserAccount }); @@ -34,6 +45,7 @@ public class IndexController : IDynamicApiController /// /// [HttpGet("opLog/list")] + [DisplayName("操作日志")] public async Task OpLogList() { return await _operateLogService.Page(new OperateLogPageInput { Account = UserManager.UserAccount }); @@ -44,6 +56,7 @@ public class IndexController : IDynamicApiController /// /// [HttpGet("message/list")] + [DisplayName("站内信列表")] public async Task MessageList() { return new string[] { }; @@ -54,6 +67,7 @@ public class IndexController : IDynamicApiController /// /// [HttpGet("schedule/list")] + [DisplayName("日程列表")] public async Task ScheduleList([FromQuery] ScheduleListInput input) { return await _indexService.ScheduleList(input); @@ -78,8 +92,8 @@ public class IndexController : IDynamicApiController /// [HttpPost("schedule/deleteSchedule")] [DisplayName("删除日程")] - public async Task DeleteSchedule([FromBody] List input) + public async Task DeleteSchedule([FromBody] BaseIdListInput input) { await _indexService.DeleteSchedule(input); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/ButtonController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/ButtonController.cs similarity index 58% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/ButtonController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/ButtonController.cs index e3c7ba77e3f1cb096deed8d3a4d66559e88ae0b4..65ce668b340235994a327edbd6f056009fe0ba5b 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/ButtonController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/ButtonController.cs @@ -1,9 +1,21 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 权限按钮控制器 /// [ApiDescriptionSettings(Tag = "权限按钮")] +[Route("sys/limit/[controller]")] +[SuperAdmin] public class ButtonController : BaseController { private readonly IButtonService _buttonService; @@ -55,7 +67,7 @@ public class ButtonController : BaseController /// [HttpPost("delete")] [DisplayName("删除按钮")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _buttonService.Delete(input); } @@ -71,4 +83,15 @@ public class ButtonController : BaseController { await _buttonService.AddBatch(input); } -} \ No newline at end of file + + /// + /// 获取按钮详情 + /// + /// + /// + [HttpGet("detail")] + public async Task Detail([FromQuery] BaseIdInput input) + { + return await _buttonService.Detail(input); + } +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/MenuController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/MenuController.cs similarity index 65% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/MenuController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/MenuController.cs index 212dc42c2efa7f1c8cb2d9f64a587e399783b373..033e262210093302197e335b1abe1e9048a3170e 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/MenuController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/MenuController.cs @@ -1,9 +1,21 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 菜单管理控制器 /// [ApiDescriptionSettings(Tag = "菜单管理")] +[Route("sys/limit/[controller]")] +[SuperAdmin] public class MenuController : BaseController { private readonly IMenuService _menuService; @@ -22,7 +34,7 @@ public class MenuController : BaseController [HttpGet("moduleSelector")] public async Task ModuleSelector() { - return await _resourceService.GetListByCategory(CateGoryConst.Resource_MODULE); + return await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_MODULE); } /// @@ -32,7 +44,7 @@ public class MenuController : BaseController [HttpGet("tree")] public async Task Tree([FromQuery] MenuTreeInput input) { - return await _menuService.Tree(input); ; + return await _menuService.Tree(input); } /// @@ -42,7 +54,14 @@ public class MenuController : BaseController [HttpGet("menuTreeSelector")] public async Task MenuTreeSelector([FromQuery] MenuTreeInput input) { - return await _menuService.Tree(input); ; + if (input.Module != null) + { + return await _menuService.Tree(input, false); + } + else + { + return await _menuService.ShortcutTree(); + } } /// @@ -76,7 +95,8 @@ public class MenuController : BaseController [HttpGet("detail")] public async Task Detail([FromQuery] BaseIdInput input) { - return await _menuService.Detail(input); ; + return await _menuService.Detail(input); + ; } /// @@ -86,7 +106,7 @@ public class MenuController : BaseController /// [HttpPost("delete")] [DisplayName("删除菜单")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _menuService.Delete(input); } @@ -102,4 +122,4 @@ public class MenuController : BaseController { await _menuService.ChangeModule(input); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/ModuleController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/ModuleController.cs similarity index 50% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/ModuleController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/ModuleController.cs index 2ee164b78a1991fa247b30d83cfce69cdc8213b2..ac53c7f58206247373d1664ec2cf92d723c123ef 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/ModuleController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/ModuleController.cs @@ -1,9 +1,21 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 模块管理控制器 /// [ApiDescriptionSettings(Tag = "模块管理")] +[Route("sys/limit/[controller]")] +[SuperAdmin] public class ModuleController : BaseController { private readonly IModuleService _moduleService; @@ -53,11 +65,31 @@ public class ModuleController : BaseController /// /// /// - [HttpPost("delete")] [DisplayName("删除模块")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _moduleService.Delete(input); } -} \ No newline at end of file + + /// + /// 获取模块详情 + /// + /// + /// + [HttpGet("detail")] + public async Task Detail([FromQuery] BaseIdInput input) + { + return await _moduleService.Detail(input); + } + + /// + /// 模块列表 + /// + /// + [HttpGet("list")] + public async Task List() + { + return await _moduleService.List(); + } +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/RoleController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/RoleController.cs new file mode 100644 index 0000000000000000000000000000000000000000..c8c3ceb6ee1ac1ac450d0617aff0658bf95d1cff --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/RoleController.cs @@ -0,0 +1,199 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; + +/// +/// 角色管理控制器 +/// +[ApiDescriptionSettings(Tag = "角色管理")] +[Route("sys/limit/[controller]")] +[SuperAdmin] +public class RoleController : BaseController +{ + private readonly ISysRoleService _sysRoleService; + private readonly IResourceService _resourceService; + + public RoleController(ISysRoleService sysRoleService, IResourceService resourceService) + { + _sysRoleService = sysRoleService; + _resourceService = resourceService; + } + + /// + /// 角色分页查询 + /// + /// + /// + [HttpGet("page")] + public async Task Page([FromQuery] RolePageInput input) + { + return await _sysRoleService.Page(input); + } + + /// + /// 添加角色 + /// + /// + /// + [HttpPost("add")] + [DisplayName("添加角色")] + public async Task Add([FromBody] RoleAddInput input) + { + await _sysRoleService.Add(input); + } + + /// + /// 修改角色 + /// + /// + /// + [HttpPost("edit")] + [DisplayName("修改角色")] + public async Task Edit([FromBody] RoleEditInput input) + { + await _sysRoleService.Edit(input); + } + + /// + /// 删除角色 + /// + /// + /// + [HttpPost("delete")] + [DisplayName("删除角色")] + public async Task Delete([FromBody] BaseIdListInput input) + { + await _sysRoleService.Delete(input); + } + + /// + /// 获取角色授权资源树 + /// + /// + [HttpGet("resourceTreeSelector")] + public async Task ResourceTreeSelector() + { + return await _resourceService.ResourceTreeSelector(); + } + + /// + /// 获取角色拥有资源 + /// + /// + /// + [HttpGet("ownResource")] + public async Task OwnResource([FromQuery] BaseIdInput input) + { + return await _sysRoleService.OwnResource(input, CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE); + } + + /// + /// 给角色授权资源 + /// + /// + /// + [HttpPost("grantResource")] + [DisplayName("角色授权资源")] + public async Task GrantResource([FromBody] GrantResourceInput input) + { + await _sysRoleService.GrantResource(input); + } + + /// + /// 获取权限授权树 + /// + /// + [HttpGet("permissionTreeSelector")] + public async Task PermissionTreeSelector([FromQuery] BaseIdInput input) + { + return await _sysRoleService.RolePermissionTreeSelector(input); + } + + /// + /// 获取角色拥有权限 + /// + /// + /// + [HttpGet("ownPermission")] + public async Task OwnPermission([FromQuery] BaseIdInput input) + { + return await _sysRoleService.OwnPermission(input); + } + + /// + /// 给角色授权权限 + /// + /// + /// + [HttpPost("grantPermission")] + [DisplayName("角色授权权限")] + public async Task GrantPermission([FromBody] GrantPermissionInput input) + { + await _sysRoleService.GrantPermission(input); + } + + + /// + /// 获取角色下的用户 + /// + /// + /// + [HttpGet("ownUser")] + public async Task OwnUser([FromQuery] BaseIdInput input) + { + return await _sysRoleService.OwnUser(input); + } + + /// + /// 给角色授权用户 + /// + /// + /// + [HttpPost("grantUser")] + [DisplayName("角色授权")] + public async Task GrantUser([FromBody] GrantUserInput input) + { + await _sysRoleService.GrantUser(input); + } + + /// + /// 获取角色树 + /// + /// + [HttpGet("tree")] + [DisplayName("获取角色树")] + public async Task Tree([FromQuery] RoleTreeInput input) + { + return await _sysRoleService.Tree(input); + } + + + /// + /// 获取角色详情 + /// + /// + /// + [HttpGet("detail")] + public async Task Detail([FromQuery] BaseIdInput input) + { + return await _sysRoleService.Detail(input); + } + + /// + /// 获取角色选择器 + /// + /// + [HttpGet("roleSelector")] + public async Task RoleSelector([FromQuery] RoleSelectorInput input) + { + return await _sysRoleService.RoleSelector(input); + } +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/SpaController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/SpaController.cs similarity index 53% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/SpaController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/SpaController.cs index c3d395f5827f9b50a1a4f4a7a8e1de0f5a353b0b..9051a3b14f4542ffb75cbeb6e08e36385e539076 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/SpaController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/SpaController.cs @@ -1,9 +1,21 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 单页管理控制器 /// [ApiDescriptionSettings(Tag = "单页管理")] +[Route("sys/limit/[controller]")] +[SuperAdmin] public class SpaController : BaseController { private readonly ISpaService _spaService; @@ -53,11 +65,21 @@ public class SpaController : BaseController /// /// /// - [HttpPost("delete")] [DisplayName("删除单页")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _spaService.Delete(input); } -} \ No newline at end of file + + /// + /// 获取单页详情 + /// + /// + /// + [HttpGet("detail")] + public async Task Detail([FromQuery] BaseIdInput input) + { + return await _spaService.Detail(input); + } +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/LogOperateController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogOperateController.cs similarity index 63% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/LogOperateController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogOperateController.cs index 5da256355ceaa13b5fcd773c352deb17045b14a7..d9e38aa6c2ccf35ee0fbc8614334bde9a17cf10d 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/LogOperateController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogOperateController.cs @@ -1,10 +1,21 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 操作日志控制器 /// [ApiDescriptionSettings(Tag = "操作日志")] -[Route("dev/[controller]")] +[Route("sys/audit/[controller]")] +[SuperAdmin] public class LogOperateController : BaseController { private readonly IOperateLogService _operateLogService; @@ -15,7 +26,7 @@ public class LogOperateController : BaseController } /// - /// 字典分页查询 + /// 操作日志分页查询 /// /// /// @@ -29,7 +40,7 @@ public class LogOperateController : BaseController /// 操作日志周统计柱状图图 /// /// - [HttpGet("barChartData")] + [HttpGet("columnChartData")] public async Task BarChartData() { return await _operateLogService.StatisticsByDay(7); @@ -66,4 +77,4 @@ public class LogOperateController : BaseController { return await _operateLogService.Detail(input); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/LogVisitController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogVisitController.cs similarity index 60% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/LogVisitController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogVisitController.cs index 03dc286cbd49a05b44c594676a3d1afc6339868d..b15b6a774b80ded40d702264ad12f8a18a4bcbc5 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/LogVisitController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogVisitController.cs @@ -1,10 +1,21 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 访问日志控制器 /// [ApiDescriptionSettings(Tag = "访问日志")] -[Route("dev/[controller]")] +[Route("sys/audit/[controller]")] +[SuperAdmin] public class LogVisitController : BaseController { private readonly IVisitLogService _visitLogService; @@ -15,7 +26,7 @@ public class LogVisitController : BaseController } /// - /// 字典分页查询 + /// 访问日志分页查询 /// /// /// @@ -55,4 +66,4 @@ public class LogVisitController : BaseController { await _visitLogService.Delete(input.Category); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Controller/MqttController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Mqtt/MqttController.cs similarity index 91% rename from api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Controller/MqttController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Mqtt/MqttController.cs index 7397b3587d4d87570cea4f2a6a1efad6ee1358ce..eae03a44ff439032fa37cf08a47f42a902ec982a 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Controller/MqttController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Mqtt/MqttController.cs @@ -1,8 +1,4 @@ - - -using Furion.DynamicApiController; - -namespace SimpleAdmin.Plugin.Mqtt; +namespace SimpleAdmin.Web.Core; /// /// mqtt服务控制器 @@ -38,7 +34,6 @@ public class MqttController : IDynamicApiController [NonUnify] public async Task Auth([FromBody] MqttAuthInput input) { - return await _mqttService.Auth(input); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/ConfigController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Ops/ConfigController.cs similarity index 60% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/ConfigController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Ops/ConfigController.cs index 5ad1cb0d74813faa03f03d1e845469cee7b05e15..5ec1dee2a203c55c443549813d419ae33bc6a7c3 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/ConfigController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Ops/ConfigController.cs @@ -1,10 +1,21 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 系统配置控制器 /// [ApiDescriptionSettings(Tag = "系统配置")] -[Route("dev/[controller]")] +[Route("sys/ops/[controller]")] +[SuperAdmin] public class ConfigController : BaseController { private readonly IConfigService _configService;//系统配置服务 @@ -14,29 +25,28 @@ public class ConfigController : BaseController _configService = configService; } + /// /// 获取系统基础配置 /// /// [HttpGet("sysBaseList")] - [AllowAnonymous] - public async Task> SysBaseList() + public async Task SysBaseList() { - var sysBase = await _configService.GetListByCategory(CateGoryConst.Config_SYS_BASE);//系统基础 - var loginPolicy = await _configService.GetListByCategory(CateGoryConst.Config_LOGIN_POLICY);//登录策略 + var sysBase = await _configService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_BASE);//系统基础 + var loginPolicy = await _configService.GetConfigsByCategory(CateGoryConst.CONFIG_LOGIN_POLICY);//登录策略 sysBase.AddRange(loginPolicy);//合并登录策略 return sysBase; } /// - /// 获取配置列表 + /// 获取系统配置列表 /// - /// 分类 /// [HttpGet("list")] - public async Task List(string category) + public async Task List() { - return await _configService.GetListByCategory(category); + return await _configService.GetSysConfigList(); } /// @@ -92,8 +102,8 @@ public class ConfigController : BaseController /// [HttpPost("editBatch")] [DisplayName("修改配置")] - public async Task EditBatch([FromBody] List devConfigs) + public async Task EditBatch([FromBody] List devConfigs) { await _configService.EditBatch(devConfigs); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/DictController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Ops/DictController.cs similarity index 66% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/DictController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Ops/DictController.cs index 87da51e46c7179b0d63813f208bce67f677c3445..35d55f763e573351d59c560bf33707498293ae80 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/DictController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Ops/DictController.cs @@ -1,10 +1,21 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 系统字典控制器 /// [ApiDescriptionSettings(Tag = "系统字典")] -[Route("dev/[controller]")] +[Route("sys/ops/[controller]")] +[SuperAdmin] public class DictController : BaseController { private readonly IDictService _dictService; @@ -65,11 +76,10 @@ public class DictController : BaseController /// /// /// - [HttpPost("delete")] [DisplayName("删除字典")] public async Task Delete([FromBody] DictDeleteInput input) { await _dictService.Delete(input); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/OrgController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Organization/OrgController.cs similarity index 71% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/OrgController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Organization/OrgController.cs index f805340351a19f226a5c567a431f111364e25f39..8a8bd09974cc7397859231242f448dd3763af237 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/OrgController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Organization/OrgController.cs @@ -1,9 +1,21 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 组织管理控制器 /// [ApiDescriptionSettings(Tag = "组织管理")] +[Route("sys/organization/[controller]")] +[SuperAdmin] public class OrgController : BaseController { private readonly ISysOrgService _sysOrgService; @@ -12,7 +24,7 @@ public class OrgController : BaseController public OrgController(ISysOrgService sysOrgService, ISysUserService sysUserService) { _sysOrgService = sysOrgService; - this._sysUserService = sysUserService; + _sysUserService = sysUserService; } #region Get @@ -52,10 +64,10 @@ public class OrgController : BaseController /// 获取用户选择器 /// /// - [HttpGet("userSelector")] + [HttpGet("selector")] public async Task UserSelector([FromQuery] UserSelectorInput input) { - return await _sysUserService.UserSelector(input); + return await _sysUserService.Selector(input); } /// @@ -66,7 +78,7 @@ public class OrgController : BaseController [HttpGet("detail")] public async Task Detail([FromQuery] BaseIdInput input) { - return await _sysOrgService.Detail(input); ; + return await _sysOrgService.Detail(input); } #endregion Get @@ -114,13 +126,12 @@ public class OrgController : BaseController /// /// /// - [HttpPost("delete")] [DisplayName("删除组织")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _sysOrgService.Delete(input); } #endregion Post -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/PositionController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Organization/PositionController.cs similarity index 42% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/PositionController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Organization/PositionController.cs index cf2b752877de7db4da02296c2f0b1c78843e8738..a04398211b06eda8ecbec7a48c49a8374ee3480b 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/PositionController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Organization/PositionController.cs @@ -1,18 +1,32 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 职位管理控制器 /// [ApiDescriptionSettings(Tag = "职位管理")] +[Route("sys/organization/[controller]")] +[SuperAdmin] public class PositionController : BaseController { private readonly ISysPositionService _sysPositionService; public PositionController(ISysPositionService sysPositionService) { - this._sysPositionService = sysPositionService; + _sysPositionService = sysPositionService; } + #region Get + /// /// 职位分页查询 /// @@ -25,6 +39,44 @@ public class PositionController : BaseController return await _sysPositionService.Page(input); } + /// + /// 获取职位树 + /// + /// + [HttpGet("tree")] + [DisplayName("获取职位树")] + public async Task Tree([FromQuery] PositionTreeInput input) + { + return await _sysPositionService.Tree(input); + } + + /// + /// 职位选择器 + /// + /// + /// + [HttpGet("selector")] + public async Task Selector([FromQuery] PositionSelectorInput input) + { + return await _sysPositionService.Selector(input); + } + + /// + /// 获取职位详情 + /// + /// + /// + [HttpGet("detail")] + [DisplayName("获取职位详情")] + public async Task Detail([FromQuery] BaseIdInput input) + { + return await _sysPositionService.Detail(input); + } + + #endregion + + #region Post + /// /// 添加职位 /// @@ -54,11 +106,12 @@ public class PositionController : BaseController /// /// /// - [HttpPost("delete")] [DisplayName("删除职位")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _sysPositionService.Delete(input); } -} \ No newline at end of file + + #endregion +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Organization/UserController.cs similarity index 85% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Organization/UserController.cs index b670fc2fa347c17abfe4272beb77c373ec92735c..57da598a4f80c5d6dd2bd231b10ae449be9348c4 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Organization/UserController.cs @@ -1,47 +1,39 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 用户管理控制器 /// [ApiDescriptionSettings(Tag = "用户管理")] +[Route("sys/organization/[controller]")] +[SuperAdmin] public class UserController : BaseController { private readonly ISysUserService _sysUserService; private readonly ISysOrgService _sysOrgService; private readonly ISysPositionService _sysPositionService; - private readonly IRoleService _roleService; + private readonly ISysRoleService _sysRoleService; public UserController(ISysUserService sysUserService, ISysOrgService sysOrgService, ISysPositionService sysPositionService, - IRoleService roleService) + ISysRoleService sysRoleService) { _sysUserService = sysUserService; _sysOrgService = sysOrgService; _sysPositionService = sysPositionService; - _roleService = roleService; + _sysRoleService = sysRoleService; } #region Get请求 - /// - /// 获取组织树选择器 - /// - /// - [HttpGet("orgTreeSelector")] - public async Task OrgTreeSelector() - { - return await _sysOrgService.Tree(); - } - - /// - /// 获取角色选择器 - /// - /// - [HttpGet("roleSelector")] - public async Task RoleSelector([FromQuery] RoleSelectorInput input) - { - return await _roleService.RoleSelector(input); - } - /// /// 用户分页查询 /// @@ -58,21 +50,10 @@ public class UserController : BaseController /// /// /// - [HttpGet("userSelector")] - public async Task UserSelector([FromQuery] UserSelectorInput input) - { - return await _sysUserService.UserSelector(input); - } - - /// - /// 职位选择器 - /// - /// - /// - [HttpGet("positionSelector")] - public async Task PositionSelector([FromQuery] PositionSelectorInput input) + [HttpGet("selector")] + public async Task Selector([FromQuery] UserSelectorInput input) { - return await _sysPositionService.PositionSelector(input); + return await _sysUserService.Selector(input); } /// @@ -201,7 +182,7 @@ public class UserController : BaseController /// [HttpPost("delete")] [DisplayName("删除用户")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _sysUserService.Delete(input); } @@ -303,4 +284,4 @@ public class UserController : BaseController } #endregion Post请求 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Upload/UploadController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Upload/UploadController.cs new file mode 100644 index 0000000000000000000000000000000000000000..8b3249a2ca19cff97abd4c5ac021c65a60b68c25 --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Upload/UploadController.cs @@ -0,0 +1,36 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; + +[ApiDescriptionSettings(Tag = "文件上传控制器")] +public class UploadController : BaseController +{ + private readonly IFileService _fileService; + + public UploadController(IFileService fileService) + { + _fileService = fileService; + } + + /// 1 + /// 上传图片 + /// + /// + /// + [HttpPost("uploadImg")] + [DisplayName("上传图片")] + [DisableRequestSizeLimit] + public async Task UploadImg([FromForm] IFormFile file) + { + //先上传到本地,后面优化 + return await _fileService.UploadFile(SysDictConst.FILE_ENGINE_LOCAL, file); + } +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserCenterController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/UserCenter/UserCenterController.cs similarity index 59% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserCenterController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/UserCenter/UserCenterController.cs index 8297efe9521ebc4eafd18b20e505072d6493f5cd..acf9f22dc1fcb7817d013c4adcc6d5c71b930bf2 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserCenterController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/UserCenter/UserCenterController.cs @@ -1,36 +1,41 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 用户个人信息控制器 /// [ApiDescriptionSettings(Tag = "用户个人信息控制器")] -[Route("sys/[controller]")] -public class UserCenterController : IDynamicApiController +[Route("userCenter")] +public class UserCenterController : BaseController { - private readonly IRoleService _roleService; private readonly IUserCenterService _userCenterService; - private readonly ISysUserService _sysUserService; - private readonly ISysPositionService _sysPositionService; - private readonly ISysOrgService _sysOrgService; - public UserCenterController(IUserCenterService userCenterService, ISysUserService sysUserService, ISysPositionService sysPositionService, - ISysOrgService sysOrgService, IRoleService roleService) + public UserCenterController(IUserCenterService userCenterService) { _userCenterService = userCenterService; - _sysUserService = sysUserService; - _sysPositionService = sysPositionService; - _sysOrgService = sysOrgService; - _roleService = roleService; } + + + #region Get + /// /// 获取个人菜单 /// /// [HttpGet("loginMenu")] - public async Task LoginMenu() + public async Task LoginMenu([FromQuery] BaseIdInput input) { - return await _userCenterService.GetOwnMenu(); + return await _userCenterService.GetLoginMenu(input); } /// @@ -43,158 +48,187 @@ public class UserCenterController : IDynamicApiController return await _userCenterService.GetLoginWorkbench(); } + /// - /// 编辑个人信息 + /// 获取组织架构 /// - /// /// - [HttpPost("updateUserInfo")] - [DisplayName("编辑个人信息")] - public async Task UpdateUserInfo([FromBody] UpdateInfoInput input) + [HttpGet("loginOrgTree")] + public async Task LoginOrgTree() { - await _userCenterService.UpdateUserInfo(input); + return await _userCenterService.LoginOrgTree(); } + /// - /// 更新签名 + /// 修改密码 /// /// /// - [HttpPost("updateSignature")] - [DisplayName("更新签名")] - public async Task UpdateSignature([FromBody] UpdateSignatureInput input) + [HttpPost("updatePassword")] + [DisplayName("修改密码")] + public async Task UpdatePassword([FromBody] UpdatePasswordInput input) { - await _userCenterService.UpdateSignature(input); + await _userCenterService.UpdatePassword(input); } /// - /// 获取组织架构 + /// 修改头像 /// + /// /// - [HttpGet("loginOrgTree")] - public async Task LoginOrgTree() + [HttpPost("updateAvatar")] + [DisplayName("修改头像")] + public async Task UpdateAvatar([FromForm] BaseFileInput input) { - return await _userCenterService.LoginOrgTree(); + return await _userCenterService.UpdateAvatar(input); } + /// - /// 编辑工作台 + /// 修改默认模块 /// /// - /// - [HttpPost("updateUserWorkbench")] - [DisplayName("编辑工作台")] - public async Task UpdateUserWorkbench([FromBody] UpdateWorkbenchInput input) + [HttpPost("setDefaultModule")] + public async Task SetDefaultModule([FromBody] SetDefaultModuleInput input) { - await _userCenterService.UpdateWorkbench(input); + await _userCenterService.SetDefaultModule(input); } + /// - /// 获取登录用户的站内信分页 + /// 快捷方式菜单树 /// /// /// - [HttpGet("loginUnreadMessagePage")] - public async Task LoginUnreadMessagePage([FromQuery] MessagePageInput input) + [HttpGet("shortcutTree")] + public async Task ShortcutTree() { - return await _userCenterService.LoginMessagePage(input); + return await _userCenterService.ShortcutTree(); } + #endregion + + #region Post + /// - /// 读取登录用户站内信详情 + /// 编辑个人信息 /// /// /// - [HttpGet("loginUnreadMessageDetail")] - public async Task LoginUnreadMessageDetail([FromQuery] BaseIdInput input) + [HttpPost("updateUserInfo")] + [DisplayName("编辑个人信息")] + public async Task UpdateUserInfo([FromBody] UpdateInfoInput input) { - return await _userCenterService.LoginMessageDetail(input); + await _userCenterService.UpdateUserInfo(input); } /// - /// 未读消息数 + /// 更新签名 /// + /// /// - [HttpGet("UnReadCount")] - public async Task UnReadCount() + [HttpPost("updateSignature")] + [DisplayName("更新签名")] + public async Task UpdateSignature([FromBody] UpdateSignatureInput input) { - return await _userCenterService.UnReadCount(); + await _userCenterService.UpdateSignature(input); } + + /// - /// 删除我的消息 + /// 编辑工作台 /// /// /// - [HttpPost("deleteMessage")] - [DisplayName("删除个人消息")] - public async Task DeleteMessage([FromBody] BaseIdInput input) + [HttpPost("updateUserWorkbench")] + [DisplayName("编辑工作台")] + public async Task UpdateUserWorkbench([FromBody] UpdateWorkbenchInput input) { - await _userCenterService.DeleteMyMessage(input); + await _userCenterService.UpdateWorkbench(input); } + #endregion + + #region 我的消息 + /// - /// 修改密码 + /// 获取登录用户的站内信分页 /// /// /// - [HttpPost("updatePassword")] - [DisplayName("修改密码")] - public async Task UpdatePassword([FromBody] UpdatePasswordInput input) + [HttpGet("myMessagePage")] + public async Task MyMessagePage([FromQuery] MessagePageInput input) { - await _userCenterService.UpdatePassword(input); + return await _userCenterService.MyMessagePage(input); } /// - /// 修改头像 + /// 读取登录用户站内信详情 /// /// /// - [HttpPost("updateAvatar")] - [DisplayName("修改头像")] - public async Task UpdateAvatar([FromForm] BaseFileInput input) + [HttpGet("myMessageDetail")] + public async Task MyMessageDetail([FromQuery] BaseIdInput input) { - return await _userCenterService.UpdateAvatar(input); + return await _userCenterService.MyMessageDetail(input); } + /// + /// 未读消息数 + /// + /// + [HttpGet("UnReadCount")] + public async Task UnReadCount() + { + return await _userCenterService.UnReadCount(); + } /// - /// 根据id集合获取用户集合 + /// 最新未读消息 /// - /// - [HttpPost("getUserListByIdList")] - public async Task GetUserListByIdList([FromBody] IdListInput input) + /// + [HttpGet("newUnRead")] + public async Task NewUnRead() { - return await _sysUserService.GetUserListByIdList(input); + return await _userCenterService.NewUnRead(); } /// - /// 根据id集合获取职位集合 + /// 删除我的消息 /// /// - [HttpPost("getPositionListByIdList")] - public async Task GetPositionListByIdList([FromBody] IdListInput input) + /// + [HttpPost("deleteMessage")] + [DisplayName("删除个人消息")] + public async Task DeleteMessage([FromBody] BaseIdInput input) { - return await _sysPositionService.GetPositionListByIdList(input); + await _userCenterService.DeleteMyMessage(input); } /// - /// 根据id集合获取组织集合 + /// 设置已读 /// - /// - [HttpPost("getOrgListByIdList")] - public async Task GetOrgListByIdList([FromBody] IdListInput input) + /// + [HttpPost("setRead")] + public async Task SetRead([FromBody] MessageReadInput input) { - return await _sysOrgService.GetOrgListByIdList(input); + input.Id = UserManager.UserId; + return await _userCenterService.SetRead(input); } /// - /// 根据id集合获取角色集合 + /// 设置未读 /// /// - [HttpPost("getRoleListByIdList")] - public async Task GetRoleListByIdList([FromBody] IdListInput input) + /// + [HttpPost("setDelete")] + public async Task SetDelete([FromBody] MessageReadInput input) { - return await _roleService.GetRoleListByIdList(input); + input.Id = UserManager.UserId; + return await _userCenterService.SetDelete(input); } -} \ No newline at end of file + + #endregion +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyActionFilter.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyActionFilter.cs index 131a52684db7ab9688ac010b337560ddfd36413f..21934e3b99055a9e88c4611aa6d85ce724bc31e9 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyActionFilter.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyActionFilter.cs @@ -1,4 +1,14 @@ -using Furion.FriendlyException; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using MoYu.FriendlyException; namespace SimpleAdmin.Web.Core; @@ -22,15 +32,14 @@ public class MyActionFilter : IAsyncActionFilter var httpContext = context.HttpContext; var httpRequest = httpContext.Request; //拦截白名单 - var whiteAction = new string[] { "loginOut", "auth", "preview" }; + var whiteAction = new[] { "loginOut", "auth", "preview" }; //只拦截post方法并且不是 if (httpRequest.Method == "POST" && !whiteAction.Contains(actionDescriptor.ActionName)) { // 是否匿名访问 - var allowAnonymouse = context.Filters.Any(u => u is IAllowAnonymousFilter) - || controllerType.IsDefined(typeof(AllowAnonymousAttribute), true) - || method.IsDefined(typeof(AllowAnonymousAttribute), true); - if (!allowAnonymouse) + var allowAnonymous = context.Filters.Any(u => u is IAllowAnonymousFilter) + || controllerType.IsDefined(typeof(AllowAnonymousAttribute), true) || method.IsDefined(typeof(AllowAnonymousAttribute), true); + if (!allowAnonymous) { //如果不是匿名访问,抛出 throw Oops.Bah("演示环境,禁止操作"); @@ -38,4 +47,4 @@ public class MyActionFilter : IAsyncActionFilter } await next(); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyAuthorizationFilter.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyAuthorizationFilter.cs index 5dcd703309c66d5cc2228188bf43486be95d392c..af8dcde89347bf6c2d71b4d84f0dc469250d7991 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyAuthorizationFilter.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyAuthorizationFilter.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 自定义授权筛选器 @@ -16,12 +26,11 @@ public class MyAuthorizationFilter : IAsyncAuthorizationFilter // 获取 Action 类型 var methodType = actionDescriptor.MethodInfo; // 是否匿名访问 - var allowAnonymouse = context.Filters.Any(u => u is IAllowAnonymousFilter) - || controllerType.IsDefined(typeof(AllowAnonymousAttribute), true) - || methodType.IsDefined(typeof(AllowAnonymousAttribute), true); + var allowAnonymous = context.Filters.Any(u => u is IAllowAnonymousFilter) || controllerType.IsDefined(typeof(AllowAnonymousAttribute), true) + || methodType.IsDefined(typeof(AllowAnonymousAttribute), true); // 不是匿名才处理权限检查 - if (!allowAnonymouse) + if (!allowAnonymous) { // 获取 HttpContext 和 HttpRequest 对象 var httpContext = context.HttpContext; @@ -31,6 +40,6 @@ public class MyAuthorizationFilter : IAsyncAuthorizationFilter context.Result = new UnauthorizedResult(); } } - else await Task.CompletedTask; // 否则直接跳过处理 + else await Task.CompletedTask;// 否则直接跳过处理 } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/GlobalUsing.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/GlobalUsing.cs index 31b10794c20694aa81cd45939c06b0dea0fd93ab..6e518a55e56c6cdefbc3871d8b1a491a98f5cc41 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/GlobalUsing.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/GlobalUsing.cs @@ -1,6 +1,16 @@ -global using Furion; -global using Furion.DynamicApiController; -global using Furion.Logging; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +global using MoYu; +global using MoYu.DynamicApiController; +global using MoYu.Logging; global using Microsoft.AspNetCore.Authorization; global using Microsoft.AspNetCore.Builder; global using Microsoft.AspNetCore.Hosting; @@ -11,13 +21,21 @@ global using Microsoft.AspNetCore.Mvc.Controllers; global using Microsoft.AspNetCore.Mvc.Filters; global using Microsoft.Extensions.DependencyInjection; global using SimpleAdmin.Application; -global using SimpleAdmin.Core; global using SimpleAdmin.Cache; -global using SimpleAdmin.Plugin.Core; +global using SimpleAdmin.Core; global using SimpleAdmin.SqlSugar; global using SimpleAdmin.System; global using System; global using System.Collections.Generic; global using System.ComponentModel; global using System.Linq; -global using System.Threading.Tasks; \ No newline at end of file +global using System.Threading.Tasks; +global using Microsoft.AspNetCore.HttpOverrides; +global using Microsoft.Extensions.FileProviders; +global using Microsoft.Extensions.Hosting; +global using Newtonsoft.Json; +global using Newtonsoft.Json.Serialization; +global using Microsoft.AspNetCore.Builder; +global using Microsoft.AspNetCore.Hosting; +global using IP2Region.Net.Abstractions; +global using IP2Region.Net.XDB; diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/JwtHandler.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/JwtHandler.cs index c4ea36b651421443f2cb1e1bb7e886255cb886cb..f9b2db8a6b550b4eb78cca5f67426db8efb94fca 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/JwtHandler.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/JwtHandler.cs @@ -1,7 +1,17 @@ -using System.Security.Claims; -using Furion.Authorization; -using Furion.DataEncryption; -using Furion.Logging.Extensions; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using MoYu.Authorization; +using MoYu.DataEncryption; +using MoYu.Logging.Extensions; +using System.Security.Claims; namespace SimpleAdmin.Web.Core; @@ -11,10 +21,11 @@ public class JwtHandler : AppAuthorizeHandler /// 重写 Handler 添加自动刷新 /// /// + /// /// - public override async Task HandleAsync(AuthorizationHandlerContext context) + public override async Task HandleAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext) { - var expire = App.GetConfig("JWTSettings:ExpiredTime"); //获取过期时间(分钟) + var expire = App.GetConfig("JWTSettings:ExpiredTime");//获取过期时间(分钟) var currentHttpContext = context.GetCurrentHttpContext(); //自动刷新Token if (JWTEncryption.AutoRefreshToken(context, currentHttpContext, expire, expire * 2)) @@ -26,12 +37,12 @@ public class JwtHandler : AppAuthorizeHandler } else { - currentHttpContext.Response.StatusCode = 401; //返回401给授权筛选器用 + currentHttpContext.Response.StatusCode = 401;//返回401给授权筛选器用 } } else { - context.Fail(); // 授权失败 + context.Fail();// 授权失败 if (currentHttpContext == null) return; currentHttpContext.SignoutToSwagger(); @@ -46,27 +57,26 @@ public class JwtHandler : AppAuthorizeHandler /// private bool CheckTokenFromRedis(DefaultHttpContext context, int expire) { - var token = JWTEncryption.GetJwtBearerToken(context); //获取当前token - var userId = App.User?.FindFirstValue(ClaimConst.UserId); //获取用户ID - var _simpleCacheService = App.GetService(); //获取redis实例 - var tokenInfos = - _simpleCacheService.HashGetOne>(CacheConst.Cache_UserToken, userId); //获取token信息 - if (tokenInfos == null) //如果还是空 + var token = JWTEncryption.GetJwtBearerToken(context);//获取当前token + var userId = App.User?.FindFirstValue(ClaimConst.USER_ID);//获取用户ID + var simpleCacheService = App.GetService();//获取redis实例 + var tokenInfos = simpleCacheService.HashGetOne>(CacheConst.CACHE_USER_TOKEN, userId);//获取token信息 + if (tokenInfos == null)//如果还是空 { return false; } - var tokenInfo = tokenInfos.Where(it => it.Token == token).FirstOrDefault(); //获取redis中token值是当前token的对象 + var tokenInfo = tokenInfos.Where(it => it.Token == token).FirstOrDefault();//获取redis中token值是当前token的对象 if (tokenInfo != null) { // 自动刷新token返回新的Token var accessToken = context.Response.Headers["access-token"].ToString(); - if (!string.IsNullOrEmpty(accessToken)) //如果有新的刷新token + if (!string.IsNullOrEmpty(accessToken))//如果有新的刷新token { "返回新的刷新token".LogDebug(); - tokenInfo.Token = accessToken; //新的token - tokenInfo.TokenTimeout = DateTime.Now.AddMinutes(expire); //新的过期时间 - _simpleCacheService.HashAdd(CacheConst.Cache_UserToken, userId, tokenInfos); //更新tokne信息到redis + tokenInfo.Token = accessToken;//新的token + tokenInfo.TokenTimeout = DateTime.Now.AddMinutes(expire);//新的过期时间 + simpleCacheService.HashAdd(CacheConst.CACHE_USER_TOKEN, userId, tokenInfos);//更新token信息到redis } } else @@ -101,13 +111,13 @@ public class JwtHandler : AppAuthorizeHandler //超级管理员都能访问 if (UserManager.SuperAdmin) return true; // 获取超级管理员特性 - var isSpuerAdmin = httpContext.GetMetadata(); - if (isSpuerAdmin != null) //如果是超级管理员才能访问的接口 + var isSuperAdmin = httpContext.GetMetadata(); + if (isSuperAdmin != null)//如果是超级管理员才能访问的接口 { //获取忽略超级管理员特性 - var ignoreSpuerAdmin = httpContext.GetMetadata(); - if (ignoreSpuerAdmin == null && !UserManager.SuperAdmin) //如果只能超级管理员访问并且用户不是超级管理员 - return false; //直接没权限 + var ignoreSuperAdmin = httpContext.GetMetadata(); + if (ignoreSuperAdmin == null && !UserManager.SuperAdmin)//如果只能超级管理员访问并且用户不是超级管理员 + return false;//直接没权限 } //获取角色授权特性 @@ -122,18 +132,11 @@ public class JwtHandler : AppAuthorizeHandler var routeName = httpContext.Request.Path.Value; //获取用户信息 var userInfo = await App.GetService().GetUserById(UserManager.UserId); - if (userInfo != null) - { - if (!userInfo.PermissionCodeList.Contains(routeName)) //如果当前路由信息不包含在角色授权路由列表中则认证失败 - return false; - } - else - { - return false; //没有用户信息则返回认证失败 - } + if (!userInfo.PermissionCodeList.Contains(routeName))//如果当前路由信息不包含在角色授权路由列表中则认证失败 + return false; } } return true; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/LogExceptionHandler.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/LogExceptionHandler.cs index 1f76e33afb1b89eeaf35bcbc361169a281755df1..449f4b4c9645a81b366e563373f5c5d5eb9a7248 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/LogExceptionHandler.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/LogExceptionHandler.cs @@ -1,6 +1,15 @@ -using DnsClient.Internal; -using Furion.DependencyInjection; -using Furion.FriendlyException; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using MoYu.DependencyInjection; +using MoYu.FriendlyException; using Microsoft.Extensions.Logging; namespace SimpleAdmin.Web.Core; @@ -14,7 +23,7 @@ public class LogExceptionHandler : IGlobalExceptionHandler, ISingleton public LogExceptionHandler(ILogger logger) { - this._logger = logger; + _logger = logger; } public async Task OnExceptionAsync(ExceptionContext context) @@ -29,4 +38,4 @@ public class LogExceptionHandler : IGlobalExceptionHandler, ISingleton } await Task.CompletedTask; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/DatabaseLoggingWriter.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/DatabaseLoggingWriter.cs index 5d3afc45c7d2092553f30667e1e7ba1007896dc1..ce895e1bb249f2e0ecfe09500ef631c2bb61e580 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/DatabaseLoggingWriter.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/DatabaseLoggingWriter.cs @@ -1,4 +1,13 @@ -using IPTools.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + using Masuit.Tools; using Microsoft.Extensions.Logging; using NewLife.Serialization; @@ -13,16 +22,18 @@ namespace SimpleAdmin.Web.Core; /// public class DatabaseLoggingWriter : IDatabaseLoggingWriter { + private readonly ISearcher _searcher; private readonly SqlSugarScope _db; private readonly ILogger _logger; - public DatabaseLoggingWriter(ILogger logger) + public DatabaseLoggingWriter(ILogger logger, ISearcher searcher) { - _db = DbContext.Db; + _db = DbContext.DB; _logger = logger; + _searcher = searcher; } - public async void Write(LogMessage logMsg, bool flush) + public async Task WriteAsync(LogMessage logMsg, bool flush) { //获取请求json字符串 var jsonString = logMsg.Context.Get("loggingMonitor").ToString(); @@ -36,11 +47,11 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter { //获取操作名称 var operation = loggingMonitor.DisplayTitle; - var client = (ClientInfo)logMsg.Context.Get(LoggingConst.Client);//获取客户端信息 - var path = logMsg.Context.Get(LoggingConst.Path).ToString();//获取操作名称 - var method = logMsg.Context.Get(LoggingConst.Method).ToString();//获取方法 + var client = (ClientInfo)logMsg.Context.Get(LoggingConst.CLIENT);//获取客户端信息 + var path = logMsg.Context.Get(LoggingConst.PATH).ToString();//获取操作名称 + var method = logMsg.Context.Get(LoggingConst.METHOD).ToString();//获取方法 //表示访问日志 - if (operation == EventSubscriberConst.LoginB || operation == EventSubscriberConst.LoginOutB) + if (operation == EventSubscriberConst.LOGIN_B || operation == EventSubscriberConst.LOGIN_OUT_B) { //如果没有异常信息 if (loggingMonitor.Exception == null) @@ -73,9 +84,9 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter /// 客户端信息 private async Task CreateVisitLog(string operation, LoggingMonitorJson loggingMonitor, ClientInfo clientInfo) { - var name = "";//用户姓名 - var opAccount = "";//用户账号 - if (operation == EventSubscriberConst.LoginB) + string name;//用户姓名 + string opAccount;//用户账号 + if (operation == EventSubscriberConst.LOGIN_B) { //如果是登录,用户信息就从返回值里拿 var result = loggingMonitor.ReturnInformation.Value.ToJson();//返回值转json @@ -86,15 +97,15 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter else { //如果是登录出,用户信息就从AuthorizationClaims里拿 - name = loggingMonitor.AuthorizationClaims.Where(it => it.Type == ClaimConst.Name).Select(it => it.Value).FirstOrDefault(); - opAccount = loggingMonitor.AuthorizationClaims.Where(it => it.Type == ClaimConst.Account).Select(it => it.Value).FirstOrDefault(); + name = loggingMonitor.AuthorizationClaims.Where(it => it.Type == ClaimConst.NAME).Select(it => it.Value).FirstOrDefault(); + opAccount = loggingMonitor.AuthorizationClaims.Where(it => it.Type == ClaimConst.ACCOUNT).Select(it => it.Value).FirstOrDefault(); } //日志表实体 - var devLogVisit = new DevLogVisit + var devLogVisit = new SysLogVisit { Name = operation, - Category = operation == EventSubscriberConst.LoginB ? CateGoryConst.Log_LOGIN : CateGoryConst.Log_LOGOUT, - ExeStatus = DevLogConst.SUCCESS, + Category = operation == EventSubscriberConst.LOGIN_B ? CateGoryConst.LOG_LOGIN : CateGoryConst.LOG_LOGOUT, + ExeStatus = SysLogConst.SUCCESS, OpAddress = GetLoginAddress(loggingMonitor.RemoteIPv4), OpIp = loggingMonitor.RemoteIPv4, OpBrowser = clientInfo.UA.Family + clientInfo.UA.Major, @@ -103,7 +114,7 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter OpUser = name, OpAccount = opAccount }; - await _db.InsertableWithAttr(devLogVisit).IgnoreColumns(true).ExecuteCommandAsync();//入库 + await _db.CopyNew().InsertableWithAttr(devLogVisit).IgnoreColumns(true).SplitTable().ExecuteCommandAsync();//入库 } /// @@ -114,15 +125,18 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter /// loggingMonitor /// 客户端信息 /// - private async Task CreateOperationLog(string operation, string path, LoggingMonitorJson loggingMonitor, ClientInfo clientInfo) + private async Task CreateOperationLog(string operation, string path, LoggingMonitorJson loggingMonitor, + ClientInfo clientInfo) { //用户名称 - var name = loggingMonitor.AuthorizationClaims?.Where(it => it.Type == ClaimConst.Name).Select(it => it.Value).FirstOrDefault(); + var name = loggingMonitor.AuthorizationClaims?.Where(it => it.Type == ClaimConst.NAME).Select(it => it.Value).FirstOrDefault(); //账号 - var opAccount = loggingMonitor.AuthorizationClaims?.Where(it => it.Type == ClaimConst.Account).Select(it => it.Value).FirstOrDefault(); + var opAccount = loggingMonitor.AuthorizationClaims?.Where(it => it.Type == ClaimConst.ACCOUNT).Select(it => it.Value).FirstOrDefault(); //获取参数json字符串, - var paramJson = loggingMonitor.Parameters == null || loggingMonitor.Parameters.Count == 0 ? null : loggingMonitor.Parameters[0].Value.ToJsonString(); + var paramJson = loggingMonitor.Parameters == null || loggingMonitor.Parameters.Count == 0 + ? null + : loggingMonitor.Parameters[0].Value.ToJsonString(); //获取结果json字符串 var resultJson = string.Empty; @@ -130,18 +144,20 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter { if (loggingMonitor.ReturnInformation.Value != null)//如果返回值不为空 { - var time = loggingMonitor.ReturnInformation.Value.Time != null ? DateTime.Parse(loggingMonitor.ReturnInformation.Value.Time) : DateTime.Now;//转成时间 + var time = loggingMonitor.ReturnInformation.Value.Time != null + ? DateTime.Parse(loggingMonitor.ReturnInformation.Value.Time) + : DateTime.Now;//转成时间 loggingMonitor.ReturnInformation.Value.Time = time.ToString(CultureInfo.CurrentCulture);//转成字符串 resultJson = loggingMonitor.ReturnInformation.Value.ToJsonString(); } } //操作日志表实体 - var devLogOperate = new DevLogOperate + var devLogOperate = new SysLogOperate { Name = operation, - Category = CateGoryConst.Log_OPERATE, - ExeStatus = DevLogConst.SUCCESS, + Category = CateGoryConst.LOG_OPERATE, + ExeStatus = SysLogConst.SUCCESS, OpAddress = GetLoginAddress(loggingMonitor.RemoteIPv4), OpIp = loggingMonitor.RemoteIPv4, OpBrowser = clientInfo.UA.Family + clientInfo.UA.Major, @@ -159,11 +175,12 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter //如果异常不为空 if (loggingMonitor.Exception != null) { - devLogOperate.Category = CateGoryConst.Log_EXCEPTION;//操作类型为异常 - devLogOperate.ExeStatus = DevLogConst.FAIL;//操作状态为失败 - devLogOperate.ExeMessage = loggingMonitor.Exception.Type + ":" + loggingMonitor.Exception.Message + "\n" + loggingMonitor.Exception.StackTrace; + devLogOperate.Category = CateGoryConst.LOG_EXCEPTION;//操作类型为异常 + devLogOperate.ExeStatus = SysLogConst.FAIL;//操作状态为失败 + devLogOperate.ExeMessage = loggingMonitor.Exception.Type + ":" + loggingMonitor.Exception.Message + "\n" + + loggingMonitor.Exception.StackTrace; } - await _db.InsertableWithAttr(devLogOperate).IgnoreColumns(true).ExecuteCommandAsync();//入库 + await _db.CopyNew().InsertableWithAttr(devLogOperate).IgnoreColumns(true).SplitTable().ExecuteCommandAsync();//入库 } /// @@ -173,23 +190,16 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter /// private string GetLoginAddress(string ip) { - var LoginAddress = "未知"; + var loginAddress = "未知"; try { - var ipInfo = IpTool.Search(ip);//解析IP信息 - var LoginAddressList = new List() - { - ipInfo.Country, - ipInfo.Province, - ipInfo.City, - ipInfo.NetworkOperator - };//定义登录地址列表 - LoginAddress = string.Join("|", LoginAddressList.Where(it => it != "0").ToList());//过滤掉0的信息并用|连接成字符串 + var ipInfo = _searcher.Search(ip);//解析ip + loginAddress = ipInfo?.Replace("0|", "");//去掉前面的0| } catch (global::System.Exception ex) { _logger.LogError("IP解析错误" + ex, ex); } - return LoginAddress; + return loginAddress; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingConst.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingConst.cs index 3ee3d3bf5b5b973d29715eb44147ede926677a7f..2880308a9b640813332b824b706286147deb0f0b 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingConst.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 日志常量 @@ -8,20 +18,20 @@ public class LoggingConst /// /// 操作名称 /// - public const string Operation = "Operation"; + public const string OPERATION = "Operation"; /// /// 客户端信息 /// - public const string Client = "Client"; + public const string CLIENT = "Client"; /// /// 请求地址 /// - public const string Path = "Path"; + public const string PATH = "Path"; /// /// 请求方法:POST/GET /// - public const string Method = "Method"; -} \ No newline at end of file + public const string METHOD = "Method"; +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingMonitorJson.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingMonitorJson.cs index 87e7c3ab2862c34aa78dd2c0704901b112ea8cb1..c5eac18f64559b99e1de1abf63d907d9159c10f6 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingMonitorJson.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingMonitorJson.cs @@ -1,4 +1,14 @@ -namespace SimpleAdmin.Web.Core; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 请求信息格式化 @@ -141,9 +151,9 @@ public class ReturnInformation /// /// 返回值 /// - public RetrunValue Value { get; set; } + public ReturnValue Value { get; set; } - public class RetrunValue + public class ReturnValue { /// /// 返回码 @@ -158,7 +168,7 @@ public class ReturnInformation /// /// 额外信息 /// - public object extras { get; set; } + public object Extras { get; set; } /// /// 内如 @@ -212,4 +222,4 @@ public class Validation /// 错误详情 /// public string Message { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Middleware/WebStatusMiddleware.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Middleware/WebStatusMiddleware.cs new file mode 100644 index 0000000000000000000000000000000000000000..e2f4bb566cae8dd203960cd62047bff135ba6d02 --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Middleware/WebStatusMiddleware.cs @@ -0,0 +1,55 @@ +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; + +/// +/// 网站开启状态 状态中间件 +/// +public class WebStatusMiddleware +{ + private readonly RequestDelegate _next; + + public WebStatusMiddleware(RequestDelegate next) + { + _next = next; + } + + public async Task InvokeAsync(HttpContext context) + { + var path = context.Request.Path.Value;//获取请求路径 + // 检查请求路径是否以 "/biz" 开头 + if (path.Length > 1 && !path.Contains('.') && !path.StartsWith("/sys", StringComparison.OrdinalIgnoreCase)) + { + // 通过 context.RequestServices 解析 + var configService = context.RequestServices.GetService(); + // 获取网站状态 + var webStatus = await configService.GetByConfigKey(CateGoryConst.CONFIG_SYS_BASE, SysConfigConst.SYS_WEB_STATUS); + // 如果网站状态为禁用,则返回 443 状态码 + if (webStatus.ConfigValue == CommonStatusConst.DISABLED) + { + context.Response.StatusCode = 423; + return; + } + } + await _next(context); + } +} + +/// +/// 中间件拓展类 +/// +public static class WebStatusMiddlewareExtensions +{ + public static IApplicationBuilder UseWebStatus(this IApplicationBuilder builder) + { + return builder.UseMiddleware(); + } +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Options/WebSettingsOptions.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Options/WebSettingsOptions.cs index c54187a3d0a4196811f01278bbfeabdca28726d5..315798be351a85f6f1bb0a90bdf90928f906c349 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Options/WebSettingsOptions.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Options/WebSettingsOptions.cs @@ -1,4 +1,14 @@ -using Furion.ConfigurableOptions; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using MoYu.ConfigurableOptions; namespace SimpleAdmin.Web.Core; @@ -16,4 +26,4 @@ public class WebSettingsOptions : IConfigurableOptions /// 是否清除Redis缓存 /// public bool ClearRedis { get; set; } = false; -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.csproj b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.csproj index 5075ad1b03c9a57f5079b3c7646ebd36dcd5f331..69304745f4ccd53bbd9fc8b05686ab48c5d23495 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.csproj +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.csproj @@ -1,30 +1,16 @@  + + + - - net7.0;net6.0 - 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 - SimpleAdmin.Web.Core.xml - enable - + + + PreserveNewest + + + PreserveNewest + + - - - - - - - - - - - - - - PreserveNewest - - - PreserveNewest - - diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml index b6a8864276f2e790bfac7fbd872738d6ed1dcba9..5851ad37c2aa3a032135ebda2900673d8a8713f2 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml @@ -14,18 +14,6 @@ LoggingMonitor操作日志写入数据库插件 - - - 插件设置组件 - 模拟 ConfigureService - - - - - 插件设置组件 - 模拟 Configure - - Web设置组件 @@ -56,6 +44,25 @@ + + + 获取机构树选择器 + + + + + + 获取人员选择器 + + + + + + 机构详情 + + + + 添加机构 @@ -77,40 +84,41 @@ - + 删除机构 - + - 获取机构树选择器 + 岗位管理控制器 - - + - 获取人员选择器 + 获取职位树 - + - 测试详情 + 岗位分页查询 - + - 岗位管理控制器 + 岗位详情 + + - + - 岗位分页查询 + 岗位选择器 @@ -129,230 +137,210 @@ - + 删除岗位 - - - 测试详情 - - - - - + - 人员管理控制器 + 业务角色管理控制器 - + - 导入预览 + 角色分页查询 - + - 模板下载 + 添加角色 + - + - 获取组织树选择器 + 修改角色 + - + - 人员分页查询 + 删除角色 - + - 获取人员选择器 + 获取角色授权资源树 - + - 岗位选择器 + 获取角色拥有资源 - + - 获取人员拥有角色 + 给角色授权资源 - + - 获取角色选择器 - - - - - - 人员详情 + 获取角色下的用户 - + - 添加人员 + 给角色授权用户 - + - 修改人员 + 获取角色树 - - + - 批量修改人员 + 获取角色详情 - + - 删除人员 + 获取角色选择器 - - + - 禁用人员 + 人员管理控制器 - - - + - 启用人员 + 导入预览 - + - 重置密码 + 模板下载 - - + - 给人员授权角色 + 人员分页查询 - + - 人员导入 + 获取人员选择器 - - + - 人员导出 + 获取人员拥有角色 - - - 测试控制器 - - - + - 测试分页查询 + 人员详情 - + - 测试列表查询 + 添加人员 - + - 测试详情 + 修改人员 - + - 获取组织树选择器 + 批量修改人员 + - + - 测试导入预览 + 删除人员 - + - 测试导入模板下载 + 禁用人员 + - + - 添加测试 + 启用人员 - + - 修改测试 + 重置密码 - + - 删除测试 + 给人员授权角色 - + - 测试导入 + 人员导入 - + - 测试导出 + 人员导出 @@ -389,7 +377,7 @@ - + 登出 @@ -499,7 +487,7 @@ - + 删除批量 @@ -513,95 +501,33 @@ - + - 系统配置控制器 + 系统通用控制器,一般是一些公共的接口 - + 获取系统基础配置 - - - 获取配置列表 - - 分类 - - - - - 配置分页 - - - - - - - 添加配置 - - - - - - - 修改配置 - - - - - - - 删除配置 - - - - - - - 配置批量更新 - - - - + - 系统字典控制器 - - - - - 获取字典树 - - - - - - 字典分页查询 - - - - - - - 添加字典 + 获取系统基础配置 - - + - 修改字典 + 获取系统基础配置 - - + - 删除字典 + 获取租户列表 - @@ -620,17 +546,17 @@ 上传本地文件 - + 上传MINIO文件 - + - + 删除文件 @@ -644,75 +570,6 @@ - - - 操作日志控制器 - - - - - 字典分页查询 - - - - - - - 操作日志周统计柱状图图 - - - - - - 操作日志数量总览饼图 - - - - - - 清空日志 - - - - - - - 日志详情 - - - - - - - 访问日志控制器 - - - - - 字典分页查询 - - - - - - - 访问日志周统计折线图 - - - - - - 访问日志总览饼图 - - - - - - 清空日志 - - - - 站内信控制器 @@ -725,21 +582,26 @@ - + - 发送站内信 + 添加站内信 + + + + + + 编辑站内信 - - + 消息详情 - + 删除站内信 @@ -782,7 +644,7 @@ - + 删除日程 @@ -815,7 +677,7 @@ - + 删除按钮 @@ -829,6 +691,13 @@ + + + 获取按钮详情 + + + + 菜单管理控制器 @@ -872,7 +741,7 @@ - + 删除菜单 @@ -912,368 +781,471 @@ - + 删除模块 - + - 组织管理控制器 + 获取模块详情 + + - + - 获取组织树 + 模块列表 - + - 获取组织树选择器 + 角色管理控制器 + + + + + 角色分页查询 + - + - 组织分页查询 + 添加角色 - + - 获取用户选择器 + 修改角色 + - + - 获取组织详情 + 删除角色 - + - 复制组织 + 获取角色授权资源树 + + + + + + 获取角色拥有资源 - + - 添加组织 + 给角色授权资源 - + - 修改组织 + 获取权限授权树 + + + + + + 获取角色拥有权限 - + - 删除组织 + 给角色授权权限 - + - 职位管理控制器 + 获取角色下的用户 + + - + - 职位分页查询 + 给角色授权用户 - + - 添加职位 + 获取角色树 + + + + + + 获取角色详情 - + - 修改职位 + 获取角色选择器 + + + + + + 单页管理控制器 + + + + + 单页分页查询 - + - 删除职位 + 添加单页 - + - 角色管理控制器 + 修改单页 + + - + - 角色分页查询 + 删除单页 - + - 添加角色 + 获取单页详情 - + - 修改角色 + 操作日志控制器 + + + + + 操作日志分页查询 + + + + + + + 操作日志周统计柱状图图 + + + + + + 操作日志数量总览饼图 + + + + + + 清空日志 + + + + + + + 日志详情 + + + + + + + 访问日志控制器 + + + + + 访问日志分页查询 + + + + + + + 访问日志周统计折线图 + + + + + + 访问日志总览饼图 + + + + + + 清空日志 - + - 删除角色 + mqtt服务控制器 - - - + - 获取角色授权资源树 + 获取mqtt登录参数 - + - 获取角色拥有资源 + mqtt认证 - + - 给角色授权资源 + 系统配置控制器 - - - + - 获取权限授权树 + 获取系统基础配置 - + - 获取角色拥有权限 + 获取系统配置列表 - - + - 给角色授权权限 + 配置分页 - + - 获取组织树选择器 + 添加配置 + - + - 获取用户选择器 + 修改配置 + - + - 获取角色下的用户 + 删除配置 - + - 给角色授权用户 + 配置批量更新 - - + - 单页管理控制器 + 系统字典控制器 - + - 单页分页查询 + 获取字典树 - - + - 添加单页 + 字典分页查询 - + - 修改单页 + 添加字典 - + - 删除单页 + 修改字典 - + - 用户个人信息控制器 + 删除字典 + + - + - 获取个人菜单 + 组织管理控制器 - - + - 获取个人工作台 + 获取组织树 - + - 编辑个人信息 + 获取组织树选择器 - - + - 更新签名 + 组织分页查询 - + - 获取组织架构 + 获取用户选择器 - + - 编辑工作台 + 获取组织详情 - + - 获取登录用户的站内信分页 + 复制组织 - + - 读取登录用户站内信详情 + 添加组织 - + - 未读消息数 + 修改组织 + - + - 删除我的消息 + 删除组织 - + - 修改密码 + 职位管理控制器 - - - + - 修改头像 + 职位分页查询 - + - 根据id集合获取用户集合 + 获取职位树 - + - + - 根据id集合获取职位集合 + 职位选择器 + - + - 根据id集合获取组织集合 + 获取职位详情 + - + - 根据id集合获取角色集合 + 添加职位 + - + - 用户管理控制器 + 修改职位 + + - + - 获取组织树选择器 + 删除职位 + - + - 获取角色选择器 + 用户管理控制器 - @@ -1282,20 +1254,13 @@ - + 获取用户选择器 - - - 职位选择器 - - - - 获取用户拥有角色 @@ -1364,7 +1329,7 @@ - + 删除用户 @@ -1427,6 +1392,130 @@ + + 1 + 上传图片 + + + + + + + 用户个人信息控制器 + + + + + 获取个人菜单 + + + + + + 获取个人工作台 + + + + + + 获取组织架构 + + + + + + 修改密码 + + + + + + + 修改头像 + + + + + + + 修改默认模块 + + + + + + 快捷方式菜单树 + + + + + + + 编辑个人信息 + + + + + + + 更新签名 + + + + + + + 编辑工作台 + + + + + + + 获取登录用户的站内信分页 + + + + + + + 读取登录用户站内信详情 + + + + + + + 未读消息数 + + + + + + 最新未读消息 + + + + + + 删除我的消息 + + + + + + + 设置已读 + + + + + + 设置未读 + + + + 操作筛选器 @@ -1437,11 +1526,12 @@ 自定义授权筛选器 - + 重写 Handler 添加自动刷新 + @@ -1507,22 +1597,22 @@ 日志常量 - + 操作名称 - + 客户端信息 - + 请求地址 - + 请求方法:POST/GET @@ -1667,27 +1757,27 @@ 返回值 - + 返回码 - + 消息 - + 额外信息 - + 内如 - + 时间 @@ -1722,6 +1812,16 @@ 错误详情 + + + 网站开启状态 状态中间件 + + + + + 中间件拓展类 + + 系统配置选项 diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Startup.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Startup.cs index 6dcc04af9baab7f06375748938435339793c404f..bd535424160cc3284eb9ff99d958580d4b4fd0f0 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Startup.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Startup.cs @@ -1,8 +1,12 @@ -using Microsoft.AspNetCore.HttpOverrides; -using Microsoft.Extensions.FileProviders; -using Microsoft.Extensions.Hosting; -using Newtonsoft.Json; -using Newtonsoft.Json.Serialization; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Web.Core; @@ -21,15 +25,12 @@ public class Startup : AppStartup services.AddComponent(); //启动Web设置ConfigureServices组件 services.AddComponent(); - //启动插件设置ConfigureServices组件 - services.AddComponent(); //gip压缩 services.AddComponent(); //定时任务 //services.AddSchedule(); //添加控制器相关 - services.AddControllers() - .AddNewtonsoftJson(options => //配置json + services.AddControllers().AddNewtonsoftJson(options => //配置json { options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();// 首字母小写(驼峰样式) options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";// 时间格式化 @@ -50,9 +51,7 @@ public class Startup : AppStartup public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { //启动Web设置Configure组件 - //app.UseComponent(env); - //启动插件设置Configure组件 - app.UseComponent(env); + app.UseComponent(env); if (env.IsDevelopment()) { @@ -69,50 +68,30 @@ public class Startup : AppStartup // 添加状态码拦截中间件 app.UseUnifyResultStatusCodes(); - app.UseStaticFiles(new StaticFileOptions() - { - ServeUnknownFileTypes = true, - FileProvider = new PhysicalFileProvider( - Path.Combine(Directory.GetCurrentDirectory(), "wwwroot")),//wwwroot相当于真实目录 - OnPrepareResponse = (c) => - { - c.Context.Response.Headers.Add("Access-Control-Allow-Origin", "*"); - c.Context.Response.Headers.Append("Cache-Control", $"public, max-age=604800"); - }, - RequestPath = new PathString("/images")//src相当于别名,为了安全 - }); - app.UseRouting(); - - //跨域设置 - // app.UseCorsAccessor(builder => - // builder.SetIsOriginAllowed(_ => true).AllowAnyMethod().AllowAnyHeader().AllowCredentials() - - //); - app.UseCorsAccessor(); - - app.UseAuthentication(); - app.UseAuthorization(); + app.UseStaticFiles();//静态文件访问配置 + //静态文件访问配置,暂时不开启 + // app.UseStaticFiles(new StaticFileOptions + // { + // ServeUnknownFileTypes = true, + // FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot")),//wwwroot相当于真实目录 + // OnPrepareResponse = c => + // { + // c.Context.Response.Headers.Add("Access-Control-Allow-Origin", "*"); + // c.Context.Response.Headers.Append("Cache-Control", "public, max-age=604800"); + // }, + // RequestPath = new PathString("/files")//src相当于别名,为了安全 + // }); + app.UseRouting();//路由配置 + app.UseCorsAccessor();//跨域配置 + app.UseWebStatus();//网站开启状态 + app.UseAuthentication();//认证 + app.UseAuthorization();//授权 app.UseInject(string.Empty); - - ////定时任务Dashboard - //app.UseScheduleUI(options => - //{ - // options.DisableOnProduction = true;//配置生产环境关闭 - //}); app.UseForwardedHeaders();//Nginx代理的话获取真实IP app.UseEndpoints(endpoints => { - // 获取插件选项 - var pluginsOptions = App.GetOptions(); - //如果通知类型是Signalr - if (pluginsOptions.UseSignalR) - { - // 注册集线器 - endpoints.MapHubs(); - } - endpoints.MapControllers(); }); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Web.Development.json b/api/SimpleAdmin/SimpleAdmin.Web.Core/Web.Development.json index c69d804daa9d06debf1158ec60aa65849cfb047c..3948bcfa911811c80045b831ea63eda36c148b7e 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Web.Development.json +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Web.Development.json @@ -3,12 +3,6 @@ "WebSettings": { "EnvPoc": false, //是否演示环境 }, - //插件设置 - "PluginSettings": { - "UseSignalR": true, // 是否开启Signalr - "UseMqtt": false, // 是否开启mqtt - "NoticeComponent": "SignalR" //默认通知组件类型SignalR/Mqtt - }, //jwt设置 "JWTSettings": { "ValidateIssuerSigningKey": true, // 是否验证密钥,bool 类型,默认true diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Web.Production.json b/api/SimpleAdmin/SimpleAdmin.Web.Core/Web.Production.json index 4484a6919625d07344c44f841aa4c896e16e6849..3948bcfa911811c80045b831ea63eda36c148b7e 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Web.Production.json +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Web.Production.json @@ -3,12 +3,6 @@ "WebSettings": { "EnvPoc": false, //是否演示环境 }, - //插件设置 - "PluginSettings": { - "UseSignalR": true, // 是否开启Signalr - "UseMqtt": false, // 是否开启mqtt - "NoticeComponent": "SignalR" //默认通知类型SignalR/Mqtt - }, //jwt设置 "JWTSettings": { "ValidateIssuerSigningKey": true, // 是否验证密钥,bool 类型,默认true diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Entry/Program.cs b/api/SimpleAdmin/SimpleAdmin.Web.Entry/Program.cs index 0d14181d7fd1c853347d3a569c4377b5e964fc40..f167648611519e548baa87020ac23d9ed38e47b6 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Entry/Program.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Entry/Program.cs @@ -1,11 +1,19 @@ -using System.Drawing; +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin +// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 -Console.WriteLine(@"Դַ: https://gitee.com/zxzyjs/SimpleAdmin"); -Console.WriteLine(@"ʾַ: http://153.101.199.83:12802/login"); -Console.WriteLine(@"QQ:531035580"); -Console.WriteLine("ûлڣֻм򵥡ȶЧ"); -Colorful.Console.WriteAsciiAlternating("SimpleAdmin", new Colorful.FrequencyBasedColorAlternator(3, Color.Yellow, Color.GreenYellow)); +Console.WriteLine("源码地址: https://gitee.com/dotnetmoyu/SimpleAdmin"); +Console.WriteLine("ts演示地址: http://153.101.199.83:12802/login"); +Console.WriteLine("js演示地址: http://153.101.199.83:12801/login"); +Console.WriteLine("QQ:531035580"); +Console.WriteLine("简单之名,非凡之质——稳定、灵活、高效,实力不需夸耀。"); Serve.Run(RunOptions.Default.ConfigureBuilder(builder => { builder.WebHost.UseUrls(builder.Configuration["AppSettings:Urls"]); -})); \ No newline at end of file +})); diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.Web.Entry.csproj b/api/SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.Web.Entry.csproj index 610e6048f355712b195f9d77313b044880008ac4..7fbfafd09e40cd77614a946bb078b2a4b7c6d54e 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.Web.Entry.csproj +++ b/api/SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.Web.Entry.csproj @@ -1,12 +1,4 @@  - - - net7.0;net6.0 - enable - en-US - - - PreserveNewest @@ -14,7 +6,9 @@ - + + + diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.Web.Entry.xml b/api/SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.Web.Entry.xml new file mode 100644 index 0000000000000000000000000000000000000000..d3fd2c1681462780565e82a7e7575a7bdef1255e --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.Web.Entry.xml @@ -0,0 +1,8 @@ + + + + SimpleAdmin.Web.Entry + + + + diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.db-journal b/api/SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.db-journal new file mode 100644 index 0000000000000000000000000000000000000000..1432c592087a117fb2c6fa052574565d6e3fa0a7 Binary files /dev/null and b/api/SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.db-journal differ diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Entry/wwwroot/mobile/swiper/swiper1.jpeg b/api/SimpleAdmin/SimpleAdmin.Web.Entry/wwwroot/mobile/swiper/swiper1.jpeg deleted file mode 100644 index 402d337e6a6d4f52c6cb38d984f5e15024ba9ab4..0000000000000000000000000000000000000000 Binary files a/api/SimpleAdmin/SimpleAdmin.Web.Entry/wwwroot/mobile/swiper/swiper1.jpeg and /dev/null differ diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Entry/wwwroot/mobile/swiper/swiper2.jpg b/api/SimpleAdmin/SimpleAdmin.Web.Entry/wwwroot/mobile/swiper/swiper2.jpg deleted file mode 100644 index 0b59e5ccf0de4de887032a49e51dae80735201d3..0000000000000000000000000000000000000000 Binary files a/api/SimpleAdmin/SimpleAdmin.Web.Entry/wwwroot/mobile/swiper/swiper2.jpg and /dev/null differ diff --git a/api/SimpleAdmin/SimpleAdmin.sln b/api/SimpleAdmin/SimpleAdmin.sln index f4303f997105583085adc30b4dc8273af972ff31..6a454cf804917fe5f51d33f620c0b86cf6045e30 100644 --- a/api/SimpleAdmin/SimpleAdmin.sln +++ b/api/SimpleAdmin/SimpleAdmin.sln @@ -13,8 +13,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleAdmin.Web.Entry", "Si EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleAdmin.System", "SimpleAdmin.System\SimpleAdmin.System.csproj", "{CB1C48E3-78AA-488E-8DA5-724804C53A6D}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleAdmin.Background", "SimpleAdmin.Background\SimpleAdmin.Background.csproj", "{4944A2F3-C380-4B8A-B58E-47F7B19F47A1}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "架构核心", "架构核心", "{88EF0885-575A-4E7A-BBC7-77F762E31A0E}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "业务模块", "业务模块", "{7F48AE48-DFA2-4B69-BD0F-8D961FD294D0}" @@ -27,23 +25,19 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "后台服务", "后台服 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "系统插件", "系统插件", "{D3630025-B2A9-4B83-99CF-2DD99289D628}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleAdmin.Plugin.Mqtt", "SimpleAdmin.Plugin\SimpleAdmin.Plugin.Mqtt\SimpleAdmin.Plugin.Mqtt.csproj", "{7A2AFE93-99B6-4578-AB2C-217B09731E0B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleAdmin.Plugin.SignalR", "SimpleAdmin.Plugin\SimpleAdmin.Plugin.SignalR\SimpleAdmin.Plugin.SignalR.csproj", "{861B10C0-98C3-4CC7-AB5F-9D381E2EE2C1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleAdmin.Plugin.Core", "SimpleAdmin.Plugin\SimpleAdmin.Plugin.Core\SimpleAdmin.Plugin.Core.csproj", "{4E618FB6-9BE6-4F52-9D97-1EB50FAFB5EC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleAdmin.Plugin.Gen", "SimpleAdmin.Plugin\SimpleAdmin.Plugin.Gen\SimpleAdmin.Plugin.Gen.csproj", "{E77A2C65-E977-43F0-BEB7-C315EDBF3C7C}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "核心插件", "核心插件", "{9EB00985-8989-4020-B0BA-536C90BEDEBC}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "系统模块", "系统模块", "{3B049767-E6E3-4E89-B45B-9066448E0573}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleAdmin.Plugin.Aop", "SimpleAdmin.Plugin\SimpleAdmin.Plugin.Aop\SimpleAdmin.Plugin.Aop.csproj", "{8D130807-5AD8-4894-A694-6EBECBF89A5A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleAdmin.SqlSugar", "SimpleAdmin.SqlSugar\SimpleAdmin.SqlSugar.csproj", "{AA783B66-6F91-4164-86D4-6D053E5A549C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleAdmin.SqlSugar", "SimpleAdmin.SqlSugar\SimpleAdmin.SqlSugar.csproj", "{AA783B66-6F91-4164-86D4-6D053E5A549C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleAdmin.Cache", "SimpleAdmin.Cache\SimpleAdmin.Cache.csproj", "{B34C3A3E-EE0E-4D4F-9A3C-AADA575FA977}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleAdmin.Plugin.Notice", "SimpleAdmin.Plugin\SimpleAdmin.Plugin.Notice\SimpleAdmin.Plugin.Notice.csproj", "{2673ADC7-AFE5-4CA6-818C-7914CA1B81DF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleAdmin.Cache", "SimpleAdmin.Cache\SimpleAdmin.Cache.csproj", "{B34C3A3E-EE0E-4D4F-9A3C-AADA575FA977}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleAdmin.MessageCenter", "SimpleAdmin.MessageCenter\SimpleAdmin.MessageCenter.csproj", "{DD0E936C-958B-4203-8566-1A17C1FAA477}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -71,26 +65,6 @@ Global {CB1C48E3-78AA-488E-8DA5-724804C53A6D}.Debug|Any CPU.Build.0 = Debug|Any CPU {CB1C48E3-78AA-488E-8DA5-724804C53A6D}.Release|Any CPU.ActiveCfg = Release|Any CPU {CB1C48E3-78AA-488E-8DA5-724804C53A6D}.Release|Any CPU.Build.0 = Release|Any CPU - {4944A2F3-C380-4B8A-B58E-47F7B19F47A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4944A2F3-C380-4B8A-B58E-47F7B19F47A1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4944A2F3-C380-4B8A-B58E-47F7B19F47A1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4944A2F3-C380-4B8A-B58E-47F7B19F47A1}.Release|Any CPU.Build.0 = Release|Any CPU - {7A2AFE93-99B6-4578-AB2C-217B09731E0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7A2AFE93-99B6-4578-AB2C-217B09731E0B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7A2AFE93-99B6-4578-AB2C-217B09731E0B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7A2AFE93-99B6-4578-AB2C-217B09731E0B}.Release|Any CPU.Build.0 = Release|Any CPU - {861B10C0-98C3-4CC7-AB5F-9D381E2EE2C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {861B10C0-98C3-4CC7-AB5F-9D381E2EE2C1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {861B10C0-98C3-4CC7-AB5F-9D381E2EE2C1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {861B10C0-98C3-4CC7-AB5F-9D381E2EE2C1}.Release|Any CPU.Build.0 = Release|Any CPU - {4E618FB6-9BE6-4F52-9D97-1EB50FAFB5EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4E618FB6-9BE6-4F52-9D97-1EB50FAFB5EC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4E618FB6-9BE6-4F52-9D97-1EB50FAFB5EC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4E618FB6-9BE6-4F52-9D97-1EB50FAFB5EC}.Release|Any CPU.Build.0 = Release|Any CPU - {E77A2C65-E977-43F0-BEB7-C315EDBF3C7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E77A2C65-E977-43F0-BEB7-C315EDBF3C7C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E77A2C65-E977-43F0-BEB7-C315EDBF3C7C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E77A2C65-E977-43F0-BEB7-C315EDBF3C7C}.Release|Any CPU.Build.0 = Release|Any CPU {8D130807-5AD8-4894-A694-6EBECBF89A5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8D130807-5AD8-4894-A694-6EBECBF89A5A}.Debug|Any CPU.Build.0 = Debug|Any CPU {8D130807-5AD8-4894-A694-6EBECBF89A5A}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -103,6 +77,14 @@ Global {B34C3A3E-EE0E-4D4F-9A3C-AADA575FA977}.Debug|Any CPU.Build.0 = Debug|Any CPU {B34C3A3E-EE0E-4D4F-9A3C-AADA575FA977}.Release|Any CPU.ActiveCfg = Release|Any CPU {B34C3A3E-EE0E-4D4F-9A3C-AADA575FA977}.Release|Any CPU.Build.0 = Release|Any CPU + {2673ADC7-AFE5-4CA6-818C-7914CA1B81DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2673ADC7-AFE5-4CA6-818C-7914CA1B81DF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2673ADC7-AFE5-4CA6-818C-7914CA1B81DF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2673ADC7-AFE5-4CA6-818C-7914CA1B81DF}.Release|Any CPU.Build.0 = Release|Any CPU + {DD0E936C-958B-4203-8566-1A17C1FAA477}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DD0E936C-958B-4203-8566-1A17C1FAA477}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DD0E936C-958B-4203-8566-1A17C1FAA477}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DD0E936C-958B-4203-8566-1A17C1FAA477}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -113,18 +95,15 @@ Global {01642438-048E-4CF2-AD62-6232043E41DA} = {006F2845-2905-4EDD-8492-86C6E31282EE} {8469DE55-A79F-4F63-A11A-AC193B69B81C} = {006F2845-2905-4EDD-8492-86C6E31282EE} {CB1C48E3-78AA-488E-8DA5-724804C53A6D} = {7F48AE48-DFA2-4B69-BD0F-8D961FD294D0} - {4944A2F3-C380-4B8A-B58E-47F7B19F47A1} = {C6B98084-8431-4073-9311-A3508C31DF7F} {006F2845-2905-4EDD-8492-86C6E31282EE} = {9C44B2B9-3FA1-4723-AF75-C4883B0D03A7} {C6B98084-8431-4073-9311-A3508C31DF7F} = {9C44B2B9-3FA1-4723-AF75-C4883B0D03A7} - {7A2AFE93-99B6-4578-AB2C-217B09731E0B} = {3B049767-E6E3-4E89-B45B-9066448E0573} - {861B10C0-98C3-4CC7-AB5F-9D381E2EE2C1} = {3B049767-E6E3-4E89-B45B-9066448E0573} - {4E618FB6-9BE6-4F52-9D97-1EB50FAFB5EC} = {9EB00985-8989-4020-B0BA-536C90BEDEBC} - {E77A2C65-E977-43F0-BEB7-C315EDBF3C7C} = {3B049767-E6E3-4E89-B45B-9066448E0573} {9EB00985-8989-4020-B0BA-536C90BEDEBC} = {D3630025-B2A9-4B83-99CF-2DD99289D628} {3B049767-E6E3-4E89-B45B-9066448E0573} = {D3630025-B2A9-4B83-99CF-2DD99289D628} {8D130807-5AD8-4894-A694-6EBECBF89A5A} = {9EB00985-8989-4020-B0BA-536C90BEDEBC} {AA783B66-6F91-4164-86D4-6D053E5A549C} = {88EF0885-575A-4E7A-BBC7-77F762E31A0E} {B34C3A3E-EE0E-4D4F-9A3C-AADA575FA977} = {88EF0885-575A-4E7A-BBC7-77F762E31A0E} + {2673ADC7-AFE5-4CA6-818C-7914CA1B81DF} = {3B049767-E6E3-4E89-B45B-9066448E0573} + {DD0E936C-958B-4203-8566-1A17C1FAA477} = {C6B98084-8431-4073-9311-A3508C31DF7F} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {409A4605-C03F-4838-9B22-C8C2AA82EB23} diff --git a/doc/Image/ikun.png b/doc/Image/ikun.png deleted file mode 100644 index 108abcb3193f2452362f7491afe0e07312a8c0c1..0000000000000000000000000000000000000000 Binary files a/doc/Image/ikun.png and /dev/null differ diff --git a/doc/Image/redis1.png b/doc/Image/redis1.png deleted file mode 100644 index 286ef46ba0a9841580f810074d272f6508d29329..0000000000000000000000000000000000000000 Binary files a/doc/Image/redis1.png and /dev/null differ diff --git a/doc/Image/redis2.png b/doc/Image/redis2.png deleted file mode 100644 index 6827ef7049a02ea03d5eab6d7bd638926137849c..0000000000000000000000000000000000000000 Binary files a/doc/Image/redis2.png and /dev/null differ diff --git a/doc/Image/wendang.png b/doc/Image/wendang.png deleted file mode 100644 index c564620e6b2d387755616d3fb90ab8e7a6a094c2..0000000000000000000000000000000000000000 Binary files a/doc/Image/wendang.png and /dev/null differ diff --git "a/doc/Image/\345\276\256\344\277\241.jpg" "b/doc/Image/\345\276\256\344\277\241.jpg" deleted file mode 100644 index 1a328643388274e9dbd76ae9d668e4508df27a48..0000000000000000000000000000000000000000 Binary files "a/doc/Image/\345\276\256\344\277\241.jpg" and /dev/null differ diff --git "a/doc/Image/\346\236\266\346\236\204.png" "b/doc/Image/\346\236\266\346\236\204.png" deleted file mode 100644 index 4c99743460db7a792614bb3d0d2e97b53daedd0e..0000000000000000000000000000000000000000 Binary files "a/doc/Image/\346\236\266\346\236\204.png" and /dev/null differ diff --git a/web/SimpleAdmin.conf b/nginx/SimpleAdmin.conf similarity index 100% rename from web/SimpleAdmin.conf rename to nginx/SimpleAdmin.conf diff --git a/web/.editorconfig b/web/.editorconfig new file mode 100644 index 0000000000000000000000000000000000000000..aa721d092c88b0a1ace88b0421b2d3c7572b59fc --- /dev/null +++ b/web/.editorconfig @@ -0,0 +1,15 @@ +# @see: http://editorconfig.org + +root = true + +[*] # 表示所有文件适用 +charset = utf-8 # 设置文件字符集为 utf-8 +end_of_line = lf # 控制换行类型(lf | cr | crlf) +insert_final_newline = true # 始终在文件末尾插入一个新行 +indent_style = space # 缩进风格(tab | space) +indent_size = 2 # 缩进大小 +max_line_length = 130 # 最大行长度 + +[*.md] # 表示仅对 md 文件适用以下规则 +max_line_length = off # 关闭最大行长度限制 +trim_trailing_whitespace = false # 关闭末尾空格修剪 diff --git a/web/.env b/web/.env new file mode 100644 index 0000000000000000000000000000000000000000..3f4514a8860fe25b1c163f9856d6bd9a9c8b8825 --- /dev/null +++ b/web/.env @@ -0,0 +1,17 @@ +# title +VITE_GLOB_APP_TITLE = SimpleAdmin + +# 本地运行端口号 +VITE_PORT = 8848 + +# 启动时自动打开浏览器 +VITE_OPEN = true + +# 开启 devTools 调试 +VITE_DEVTOOLS = false + +# 打包后是否生成包分析文件 +VITE_REPORT = false + +# 开启 CodeInspector 调试 +VITE_CODEINSPECTOR = false diff --git a/web/.env.development b/web/.env.development new file mode 100644 index 0000000000000000000000000000000000000000..f95b7114438e1f098d17e30c9584fd53747381b7 --- /dev/null +++ b/web/.env.development @@ -0,0 +1,27 @@ +# 本地环境 +VITE_USER_NODE_ENV = development + +# 公共基础路径 +VITE_PUBLIC_PATH = / + +# 路由模式 +# Optional: hash | history +VITE_ROUTER_MODE = hash + +# 打包时是否删除 console +VITE_DROP_CONSOLE = true + +# 是否开启 VitePWA +VITE_PWA = false + +# 开发环境接口地址 +VITE_API_URL = http://127.0.0.1:5566 + +# 否开启代理 +VITE_HTTP_PROXY = true + +# 开发环境跨域代理,支持配置多个 +VITE_PROXY = [["/api","http://127.0.0.1:5566"]] + +#是否启用mqtt +VITE_MQTT = true diff --git a/web/.env.production b/web/.env.production new file mode 100644 index 0000000000000000000000000000000000000000..ca6345c390172169d1141623e74440585e9e4a50 --- /dev/null +++ b/web/.env.production @@ -0,0 +1,34 @@ +# 线上环境 +VITE_USER_NODE_ENV = production + +# 公共基础路径 +VITE_PUBLIC_PATH = / + +# 路由模式 +# Optional: hash | history +VITE_ROUTER_MODE = hash + +# 是否启用 gzip 或 brotli 压缩打包,如果需要多个压缩规则,可以使用 “,” 分隔 +# Optional: gzip | brotli | none +VITE_BUILD_COMPRESS = none + +# 打包压缩后是否删除源文件 +VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false + +# 打包时是否删除 console +VITE_DROP_CONSOLE = true + +# 是否开启 VitePWA +VITE_PWA = true + +# 否开启代理 +VITE_HTTP_PROXY = true + +# 线上环境接口地址 +VITE_API_URL = http://127.0.0.1:5566 + +# 开发环境跨域代理,支持配置多个 +VITE_PROXY = [["/api","http://127.0.0.1:5566"]] + +#是否启用mqtt +VITE_MQTT = true diff --git a/web/.env.test b/web/.env.test new file mode 100644 index 0000000000000000000000000000000000000000..41a39018751a19cb0a9e91d166ab96d3d0d935eb --- /dev/null +++ b/web/.env.test @@ -0,0 +1,25 @@ +# 测试环境 +VITE_USER_NODE_ENV = test + +# 公共基础路径 +VITE_PUBLIC_PATH = / + +# 路由模式 +# Optional: hash | history +VITE_ROUTER_MODE = hash + +# 是否启用 gzip 或 brotli 压缩打包,如果需要多个压缩规则,可以使用 “,” 分隔 +# Optional: gzip | brotli | none +VITE_BUILD_COMPRESS = none + +# 打包压缩后是否删除源文件 +VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false + +# 打包时是否删除 console +VITE_DROP_CONSOLE = true + +# 是否开启 VitePWA +VITE_PWA = false + +# 测试环境接口地址 +VITE_API_URL = http://127.0.0.1:5566 diff --git a/web/.eslintignore b/web/.eslintignore new file mode 100644 index 0000000000000000000000000000000000000000..2debdc3f69f7571aa66e5cd57336eb671f4763cc --- /dev/null +++ b/web/.eslintignore @@ -0,0 +1,15 @@ +*.sh +node_modules +*.md +*.woff +*.ttf +.vscode +.idea +dist +/public +/docs +.husky +.local +/bin +/src/mock/* +stats.html diff --git a/web/.eslintrc.cjs b/web/.eslintrc.cjs new file mode 100644 index 0000000000000000000000000000000000000000..ae7f641cfaff66951d9da1399c65c72ba19a85ca --- /dev/null +++ b/web/.eslintrc.cjs @@ -0,0 +1,61 @@ +// @see: http://eslint.cn + +module.exports = { + root: true, + env: { + browser: true, + node: true, + es6: true + }, + // 指定如何解析语法 + parser: "vue-eslint-parser", + // 优先级低于 parse 的语法解析配置 + parserOptions: { + parser: "@typescript-eslint/parser", + ecmaVersion: 2020, + sourceType: "module", + jsxPragma: "React", + ecmaFeatures: { + jsx: true + } + }, + // 继承某些已有的规则 + extends: ["plugin:vue/vue3-recommended", "plugin:@typescript-eslint/recommended", "plugin:prettier/recommended"], + /** + * "off" 或 0 ==> 关闭规则 + * "warn" 或 1 ==> 打开的规则作为警告(不影响代码执行) + * "error" 或 2 ==> 规则作为一个错误(代码不能执行,界面报错) + */ + rules: { + // eslint (http://eslint.cn/docs/rules) + "no-var": "error", // 要求使用 let 或 const 而不是 var + "no-multiple-empty-lines": ["error", { max: 1 }], // 不允许多个空行 + "prefer-const": "off", // 使用 let 关键字声明但在初始分配后从未重新分配的变量,要求使用 const + "no-use-before-define": "off", // 禁止在 函数/类/变量 定义之前使用它们 + + // typeScript (https://typescript-eslint.io/rules) + "@typescript-eslint/no-unused-vars": "error", // 禁止定义未使用的变量 + "@typescript-eslint/prefer-ts-expect-error": "error", // 禁止使用 @ts-ignore + "@typescript-eslint/no-empty-function": "error", // 禁止空函数 + "@typescript-eslint/ban-ts-comment": "error", // 禁止 @ts- 使用注释或要求在指令后进行描述 + "@typescript-eslint/no-inferrable-types": "off", // 可以轻松推断的显式类型可能会增加不必要的冗长 + "@typescript-eslint/no-namespace": "off", // 禁止使用自定义 TypeScript 模块和命名空间 + "@typescript-eslint/no-explicit-any": "off", // 禁止使用 any 类型 + "@typescript-eslint/ban-types": "off", // 禁止使用特定类型 + "@typescript-eslint/no-var-requires": "off", // 允许使用 require() 函数导入模块 + "@typescript-eslint/no-non-null-assertion": "off", // 不允许使用后缀运算符的非空断言(!) + + // vue (https://eslint.vuejs.org/rules) + "vue/script-setup-uses-vars": "error", // 防止 + + + diff --git a/web/lint-staged.config.cjs b/web/lint-staged.config.cjs new file mode 100644 index 0000000000000000000000000000000000000000..04d1d409fd68319bea977f94997384857be7fdf8 --- /dev/null +++ b/web/lint-staged.config.cjs @@ -0,0 +1,8 @@ +module.exports = { + "*.{js,jsx,ts,tsx}": ["eslint --fix", "prettier --write"], + "{!(package)*.json,*.code-snippets,.!(browserslist)*rc}": ["prettier --write--parser json"], + "package.json": ["prettier --write"], + "*.vue": ["eslint --fix", "prettier --write", "stylelint --fix"], + "*.{scss,less,styl,html}": ["stylelint --fix", "prettier --write"], + "*.md": ["prettier --write"] +}; diff --git a/web/package.json b/web/package.json new file mode 100644 index 0000000000000000000000000000000000000000..89b7e20e9d7eb07e5ea663e968c68ddf9867f48f --- /dev/null +++ b/web/package.json @@ -0,0 +1,136 @@ +{ + "name": "simple-admin", + "private": true, + "version": "1.0.0", + "type": "module", + "description": "SimpleAdmin是ElementUI最好看的开源通用业务型后台管理系统", + "author": { + "name": "huguodong", + "email": "531035580@qq.com", + "url": "https://gitee.com/dotnetmoyu" + }, + "license": "MIT", + "homepage": "https://gitee.com/dotnetmoyu/SimpleAdmin", + "repository": { + "type": "git", + "url": "git@gitee.com:dotnetmoyu/SimpleAdmin.git" + }, + "bugs": { + "url": "https://gitee.com/dotnetmoyu/SimpleAdmin/issues" + }, + "scripts": { + "dev": "vite", + "serve": "vite", + "build:dev": "vue-tsc && vite build --mode development", + "build:test": "vue-tsc && vite build --mode test", + "build:pro": "vue-tsc && vite build --mode production", + "type:check": "vue-tsc --noEmit --skipLibCheck", + "preview": "pnpm run build:dev && vite preview", + "lint:eslint": "eslint --fix --ext .js,.ts,.vue ./src", + "lint:prettier": "prettier --write \"src/**/*.{js,ts,json,tsx,css,less,scss,vue,html,md}\"", + "lint:stylelint": "stylelint --cache --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/", + "lint:lint-staged": "lint-staged", + "prepare": "husky install", + "release": "standard-version", + "commit": "git add -A && czg && git push" + }, + "dependencies": { + "@antv/g2plot": "^2.4.32", + "@element-plus/icons-vue": "^2.3.1", + "@highlightjs/vue-plugin": "^2.1.0", + "@iconify/vue": "^4.1.2", + "@vueuse/core": "^11.0.3", + "axios": "^1.7.7", + "dayjs": "^1.11.13", + "default-passive-events": "^2.0.0", + "echarts": "^5.5.1", + "element-plus": "^2.7.6", + "highlight.js": "^11.10.0", + "md5": "^2.3.0", + "mitt": "^3.0.1", + "mqtt": "^5.10.1", + "nprogress": "^0.2.0", + "pinia": "^2.2.2", + "pinia-plugin-persistedstate": "^3.2.1", + "print-js": "^1.6.0", + "qs": "^6.13.0", + "screenfull": "^6.0.2", + "sortablejs": "^1.15.3", + "vue": "^3.5.5", + "vue-cropper": "^1.1.1", + "vue-router": "^4.4.5" + }, + "devDependencies": { + "@commitlint/cli": "^19.5.0", + "@commitlint/config-conventional": "^19.5.0", + "@iconify/json": "^2.2.247", + "@types/md5": "^2.3.5", + "@types/nprogress": "^0.2.3", + "@types/qs": "^6.9.15", + "@types/sm-crypto": "^0.3.4", + "@types/sortablejs": "^1.15.8", + "@typescript-eslint/eslint-plugin": "^7.14.1", + "@typescript-eslint/parser": "^7.14.1", + "@vitejs/plugin-vue": "^5.1.3", + "@vitejs/plugin-vue-jsx": "^4.0.1", + "autoprefixer": "^10.4.20", + "code-inspector-plugin": "^0.16.1", + "cz-git": "^1.9.4", + "czg": "^1.9.4", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-vue": "^9.26.0", + "husky": "^9.0.11", + "lint-staged": "^15.2.10", + "naive-ui": "^2.39.0", + "postcss": "^8.4.45", + "postcss-html": "^1.7.0", + "prettier": "^3.3.3", + "rollup-plugin-visualizer": "^5.12.0", + "sass": "^1.78.0", + "sm-crypto": "^0.3.13", + "standard-version": "^9.5.0", + "stylelint": "^16.9.0", + "stylelint-config-html": "^1.1.0", + "stylelint-config-recess-order": "^5.1.0", + "stylelint-config-recommended-scss": "^14.1.0", + "stylelint-config-recommended-vue": "^1.5.0", + "stylelint-config-standard": "^36.0.1", + "stylelint-config-standard-scss": "^13.1.0", + "typescript": "^5.5.2", + "unocss": "^0.62.3", + "unplugin-auto-import": "^0.18.3", + "unplugin-icons": "^0.19.3", + "unplugin-vue-components": "^0.27.4", + "unplugin-vue-setup-extend-plus": "^1.0.1", + "vite": "^5.4.5", + "vite-plugin-compression": "^0.5.1", + "vite-plugin-eslint": "^1.8.1", + "vite-plugin-html": "^3.2.2", + "vite-plugin-pwa": "^0.20.5", + "vite-plugin-svg-icons": "^2.0.1", + "vite-plugin-vue-devtools": "^7.3.5", + "vue-tsc": "^2.1.6" + }, + "engines": { + "node": ">=16.0.0" + }, + "browserslist": { + "production": [ + "> 1%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "config": { + "commitizen": { + "path": "node_modules/cz-git" + } + } +} diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml new file mode 100644 index 0000000000000000000000000000000000000000..522f7e954688aa709a3b098396e0c4917e54476e --- /dev/null +++ b/web/pnpm-lock.yaml @@ -0,0 +1,10397 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@antv/g2plot': + specifier: ^2.4.32 + version: 2.4.32 + '@element-plus/icons-vue': + specifier: ^2.3.1 + version: 2.3.1(vue@3.5.5) + '@highlightjs/vue-plugin': + specifier: ^2.1.0 + version: 2.1.0(highlight.js@11.10.0)(vue@3.5.5) + '@iconify/vue': + specifier: ^4.1.2 + version: 4.1.2(vue@3.5.5) + '@vueuse/core': + specifier: ^11.0.3 + version: 11.0.3(vue@3.5.5) + axios: + specifier: ^1.7.7 + version: 1.7.7 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + default-passive-events: + specifier: ^2.0.0 + version: 2.0.0 + echarts: + specifier: ^5.5.1 + version: 5.5.1 + element-plus: + specifier: ^2.7.6 + version: 2.7.6(vue@3.5.5) + highlight.js: + specifier: ^11.10.0 + version: 11.10.0 + md5: + specifier: ^2.3.0 + version: 2.3.0 + mitt: + specifier: ^3.0.1 + version: 3.0.1 + mqtt: + specifier: ^5.10.1 + version: 5.10.1 + nprogress: + specifier: ^0.2.0 + version: 0.2.0 + pinia: + specifier: ^2.2.2 + version: 2.2.2(typescript@5.5.2)(vue@3.5.5) + pinia-plugin-persistedstate: + specifier: ^3.2.1 + version: 3.2.1(pinia@2.2.2) + print-js: + specifier: ^1.6.0 + version: 1.6.0 + qs: + specifier: ^6.13.0 + version: 6.13.0 + screenfull: + specifier: ^6.0.2 + version: 6.0.2 + sortablejs: + specifier: ^1.15.3 + version: 1.15.3 + vue: + specifier: ^3.5.5 + version: 3.5.5(typescript@5.5.2) + vue-cropper: + specifier: ^1.1.1 + version: 1.1.1 + vue-router: + specifier: ^4.4.5 + version: 4.4.5(vue@3.5.5) + +devDependencies: + '@commitlint/cli': + specifier: ^19.5.0 + version: 19.5.0(@types/node@22.9.0)(typescript@5.5.2) + '@commitlint/config-conventional': + specifier: ^19.5.0 + version: 19.5.0 + '@iconify/json': + specifier: ^2.2.247 + version: 2.2.247 + '@types/md5': + specifier: ^2.3.5 + version: 2.3.5 + '@types/nprogress': + specifier: ^0.2.3 + version: 0.2.3 + '@types/qs': + specifier: ^6.9.15 + version: 6.9.15 + '@types/sm-crypto': + specifier: ^0.3.4 + version: 0.3.4 + '@types/sortablejs': + specifier: ^1.15.8 + version: 1.15.8 + '@typescript-eslint/eslint-plugin': + specifier: ^7.14.1 + version: 7.14.1(@typescript-eslint/parser@7.14.1)(eslint@8.57.0)(typescript@5.5.2) + '@typescript-eslint/parser': + specifier: ^7.14.1 + version: 7.14.1(eslint@8.57.0)(typescript@5.5.2) + '@vitejs/plugin-vue': + specifier: ^5.1.3 + version: 5.1.3(vite@5.4.5)(vue@3.5.5) + '@vitejs/plugin-vue-jsx': + specifier: ^4.0.1 + version: 4.0.1(vite@5.4.5)(vue@3.5.5) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.45) + code-inspector-plugin: + specifier: ^0.16.1 + version: 0.16.1 + cz-git: + specifier: ^1.9.4 + version: 1.9.4 + czg: + specifier: ^1.9.4 + version: 1.9.4 + eslint: + specifier: ^8.57.0 + version: 8.57.0 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.57.0) + eslint-plugin-prettier: + specifier: ^5.1.3 + version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.3.3) + eslint-plugin-vue: + specifier: ^9.26.0 + version: 9.26.0(eslint@8.57.0) + husky: + specifier: ^9.0.11 + version: 9.0.11 + lint-staged: + specifier: ^15.2.10 + version: 15.2.10 + naive-ui: + specifier: ^2.39.0 + version: 2.39.0(vue@3.5.5) + postcss: + specifier: ^8.4.45 + version: 8.4.45 + postcss-html: + specifier: ^1.7.0 + version: 1.7.0 + prettier: + specifier: ^3.3.3 + version: 3.3.3 + rollup-plugin-visualizer: + specifier: ^5.12.0 + version: 5.12.0(rollup@2.79.2) + sass: + specifier: ^1.78.0 + version: 1.78.0 + sm-crypto: + specifier: ^0.3.13 + version: 0.3.13 + standard-version: + specifier: ^9.5.0 + version: 9.5.0 + stylelint: + specifier: ^16.9.0 + version: 16.9.0(typescript@5.5.2) + stylelint-config-html: + specifier: ^1.1.0 + version: 1.1.0(postcss-html@1.7.0)(stylelint@16.9.0) + stylelint-config-recess-order: + specifier: ^5.1.0 + version: 5.1.0(stylelint@16.9.0) + stylelint-config-recommended-scss: + specifier: ^14.1.0 + version: 14.1.0(postcss@8.4.45)(stylelint@16.9.0) + stylelint-config-recommended-vue: + specifier: ^1.5.0 + version: 1.5.0(postcss-html@1.7.0)(stylelint@16.9.0) + stylelint-config-standard: + specifier: ^36.0.1 + version: 36.0.1(stylelint@16.9.0) + stylelint-config-standard-scss: + specifier: ^13.1.0 + version: 13.1.0(postcss@8.4.45)(stylelint@16.9.0) + typescript: + specifier: ^5.5.2 + version: 5.5.2 + unocss: + specifier: ^0.62.3 + version: 0.62.3(postcss@8.4.45)(rollup@2.79.2)(vite@5.4.5) + unplugin-auto-import: + specifier: ^0.18.3 + version: 0.18.3(@vueuse/core@11.0.3)(rollup@2.79.2) + unplugin-icons: + specifier: ^0.19.3 + version: 0.19.3 + unplugin-vue-components: + specifier: ^0.27.4 + version: 0.27.4(rollup@2.79.2)(vue@3.5.5) + unplugin-vue-setup-extend-plus: + specifier: ^1.0.1 + version: 1.0.1 + vite: + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.9.0)(sass@1.78.0) + vite-plugin-compression: + specifier: ^0.5.1 + version: 0.5.1(vite@5.4.5) + vite-plugin-eslint: + specifier: ^1.8.1 + version: 1.8.1(eslint@8.57.0)(vite@5.4.5) + vite-plugin-html: + specifier: ^3.2.2 + version: 3.2.2(vite@5.4.5) + vite-plugin-pwa: + specifier: ^0.20.5 + version: 0.20.5(vite@5.4.5)(workbox-build@7.3.0)(workbox-window@7.3.0) + vite-plugin-svg-icons: + specifier: ^2.0.1 + version: 2.0.1(vite@5.4.5) + vite-plugin-vue-devtools: + specifier: ^7.3.5 + version: 7.3.5(rollup@2.79.2)(vite@5.4.5)(vue@3.5.5) + vue-tsc: + specifier: ^2.1.6 + version: 2.1.6(typescript@5.5.2) + +packages: + + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + + /@antfu/install-pkg@0.4.1: + resolution: {integrity: sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==} + dependencies: + package-manager-detector: 0.2.2 + tinyexec: 0.3.1 + dev: true + + /@antfu/utils@0.7.10: + resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + dev: true + + /@antv/adjust@0.2.5: + resolution: {integrity: sha512-MfWZOkD9CqXRES6MBGRNe27Q577a72EIwyMnE29wIlPliFvJfWwsrONddpGU7lilMpVKecS3WAzOoip3RfPTRQ==} + dependencies: + '@antv/util': 2.0.17 + tslib: 1.14.1 + dev: false + + /@antv/attr@0.3.5: + resolution: {integrity: sha512-wuj2gUo6C8Q2ASSMrVBuTcb5LcV+Tc0Egiy6bC42D0vxcQ+ta13CLxgMmHz8mjD0FxTPJDXSciyszRSC5TdLsg==} + dependencies: + '@antv/color-util': 2.0.6 + '@antv/scale': 0.3.18 + '@antv/util': 2.0.17 + tslib: 2.8.1 + dev: false + + /@antv/color-util@2.0.6: + resolution: {integrity: sha512-KnPEaAH+XNJMjax9U35W67nzPI+QQ2x27pYlzmSIWrbj4/k8PGrARXfzDTjwoozHJY8qG62Z+Ww6Alhu2FctXQ==} + dependencies: + '@antv/util': 2.0.17 + tslib: 2.8.1 + dev: false + + /@antv/component@0.8.35: + resolution: {integrity: sha512-VnRa5X77nBPI952o2xePEEMSNZ6g2mcUDrQY8mVL2kino/8TFhqDq5fTRmDXZyWyIYd4ulJTz5zgeSwAnX/INQ==} + dependencies: + '@antv/color-util': 2.0.6 + '@antv/dom-util': 2.0.4 + '@antv/g-base': 0.5.16 + '@antv/matrix-util': 3.1.0-beta.3 + '@antv/path-util': 2.0.15 + '@antv/scale': 0.3.18 + '@antv/util': 2.0.17 + fecha: 4.2.3 + tslib: 2.8.1 + dev: false + + /@antv/coord@0.3.1: + resolution: {integrity: sha512-rFE94C8Xzbx4xmZnHh2AnlB3Qm1n5x0VT3OROy257IH6Rm4cuzv1+tZaUBATviwZd99S+rOY9telw/+6C9GbRw==} + dependencies: + '@antv/matrix-util': 3.1.0-beta.3 + '@antv/util': 2.0.17 + tslib: 2.8.1 + dev: false + + /@antv/dom-util@2.0.4: + resolution: {integrity: sha512-2shXUl504fKwt82T3GkuT4Uoc6p9qjCKnJ8gXGLSW4T1W37dqf9AV28aCfoVPHp2BUXpSsB+PAJX2rG/jLHsLQ==} + dependencies: + tslib: 2.8.1 + dev: false + + /@antv/event-emitter@0.1.3: + resolution: {integrity: sha512-4ddpsiHN9Pd4UIlWuKVK1C4IiZIdbwQvy9i7DUSI3xNJ89FPUFt8lxDYj8GzzfdllV0NkJTRxnG+FvLk0llidg==} + dev: false + + /@antv/g-base@0.5.16: + resolution: {integrity: sha512-jP06wggTubDPHXoKwFg3/f1lyxBX9ywwN3E/HG74Nd7DXqOXQis8tsIWW+O6dS/h9vyuXLd1/wDWkMMm3ZzXdg==} + dependencies: + '@antv/event-emitter': 0.1.3 + '@antv/g-math': 0.1.9 + '@antv/matrix-util': 3.1.0-beta.3 + '@antv/path-util': 2.0.15 + '@antv/util': 2.0.17 + '@types/d3-timer': 2.0.3 + d3-ease: 1.0.7 + d3-interpolate: 3.0.1 + d3-timer: 1.0.10 + detect-browser: 5.3.0 + tslib: 2.8.1 + dev: false + + /@antv/g-canvas@0.5.17: + resolution: {integrity: sha512-sXYJMWTOlb/Ycb6sTKu00LcJqInXJY4t99+kSM40u2OfqrXYmaXDjHR7D2V0roMkbK/QWiWS9UnEidCR1VtMOA==} + dependencies: + '@antv/g-base': 0.5.16 + '@antv/g-math': 0.1.9 + '@antv/matrix-util': 3.1.0-beta.3 + '@antv/path-util': 2.0.15 + '@antv/util': 2.0.17 + gl-matrix: 3.4.3 + tslib: 2.8.1 + dev: false + + /@antv/g-math@0.1.9: + resolution: {integrity: sha512-KHMSfPfZ5XHM1PZnG42Q2gxXfOitYveNTA7L61lR6mhZ8Y/aExsYmHqaKBsSarU0z+6WLrl9C07PQJZaw0uljQ==} + dependencies: + '@antv/util': 2.0.17 + gl-matrix: 3.4.3 + dev: false + + /@antv/g-svg@0.5.7: + resolution: {integrity: sha512-jUbWoPgr4YNsOat2Y/rGAouNQYGpw4R0cvlN0YafwOyacFFYy2zC8RslNd6KkPhhR3XHNSqJOuCYZj/YmLUwYw==} + dependencies: + '@antv/g-base': 0.5.16 + '@antv/g-math': 0.1.9 + '@antv/util': 2.0.17 + detect-browser: 5.3.0 + tslib: 2.8.1 + dev: false + + /@antv/g2@4.2.11: + resolution: {integrity: sha512-QiqxLLYDWkv9c4oTcXscs6NMxBuWZ1JCarHPZ27J43IN2BV+qUKw8yce0A8CBR8fCILEFqQAfS00Szqpye036Q==} + dependencies: + '@antv/adjust': 0.2.5 + '@antv/attr': 0.3.5 + '@antv/color-util': 2.0.6 + '@antv/component': 0.8.35 + '@antv/coord': 0.3.1 + '@antv/dom-util': 2.0.4 + '@antv/event-emitter': 0.1.3 + '@antv/g-base': 0.5.16 + '@antv/g-canvas': 0.5.17 + '@antv/g-svg': 0.5.7 + '@antv/matrix-util': 3.1.0-beta.3 + '@antv/path-util': 2.0.15 + '@antv/scale': 0.3.18 + '@antv/util': 2.0.17 + tslib: 2.8.1 + dev: false + + /@antv/g2plot@2.4.32: + resolution: {integrity: sha512-HTBuAMa+PJ6DqY1XCX1GBNTGz/IBmn9lx2xu18NQSHtgXAIHWSF+WYs7Aj8iaujcapM8g+IPgjS6ObO1u9CbFg==} + dependencies: + '@antv/color-util': 2.0.6 + '@antv/event-emitter': 0.1.3 + '@antv/g-base': 0.5.16 + '@antv/g2': 4.2.11 + '@antv/matrix-util': 3.1.0-beta.3 + '@antv/path-util': 3.0.1 + '@antv/scale': 0.3.18 + '@antv/util': 2.0.17 + d3-hierarchy: 2.0.0 + d3-regression: 1.3.10 + fmin: 0.0.2 + pdfast: 0.2.0 + size-sensor: 1.0.2 + tslib: 2.8.1 + dev: false + + /@antv/matrix-util@3.0.4: + resolution: {integrity: sha512-BAPyu6dUliHcQ7fm9hZSGKqkwcjEDVLVAstlHULLvcMZvANHeLXgHEgV7JqcAV/GIhIz8aZChIlzM1ZboiXpYQ==} + dependencies: + '@antv/util': 2.0.17 + gl-matrix: 3.4.3 + tslib: 2.8.1 + dev: false + + /@antv/matrix-util@3.1.0-beta.3: + resolution: {integrity: sha512-W2R6Za3A6CmG51Y/4jZUM/tFgYSq7vTqJL1VD9dKrvwxS4sE0ZcXINtkp55CdyBwJ6Cwm8pfoRpnD4FnHahN0A==} + dependencies: + '@antv/util': 2.0.17 + gl-matrix: 3.4.3 + tslib: 2.8.1 + dev: false + + /@antv/path-util@2.0.15: + resolution: {integrity: sha512-R2VLZ5C8PLPtr3VciNyxtjKqJ0XlANzpFb5sE9GE61UQqSRuSVSzIakMxjEPrpqbgc+s+y8i+fmc89Snu7qbNw==} + dependencies: + '@antv/matrix-util': 3.0.4 + '@antv/util': 2.0.17 + tslib: 2.8.1 + dev: false + + /@antv/path-util@3.0.1: + resolution: {integrity: sha512-tpvAzMpF9Qm6ik2YSMqICNU5tco5POOW7S4XoxZAI/B0L26adU+Md/SmO0BBo2SpuywKvzPH3hPT3xmoyhr04Q==} + dependencies: + gl-matrix: 3.4.3 + lodash-es: 4.17.21 + tslib: 2.8.1 + dev: false + + /@antv/scale@0.3.18: + resolution: {integrity: sha512-GHwE6Lo7S/Q5fgaLPaCsW+CH+3zl4aXpnN1skOiEY0Ue9/u+s2EySv6aDXYkAqs//i0uilMDD/0/4n8caX9U9w==} + dependencies: + '@antv/util': 2.0.17 + fecha: 4.2.3 + tslib: 2.8.1 + dev: false + + /@antv/util@2.0.17: + resolution: {integrity: sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==} + dependencies: + csstype: 3.1.3 + tslib: 2.8.1 + dev: false + + /@apideck/better-ajv-errors@0.3.6(ajv@8.17.1): + resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} + engines: {node: '>=10'} + peerDependencies: + ajv: '>=8' + dependencies: + ajv: 8.17.1 + json-schema: 0.4.0 + jsonpointer: 5.0.1 + leven: 3.1.0 + dev: true + + /@babel/code-frame@7.26.2: + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + dev: true + + /@babel/compat-data@7.26.2: + resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.26.0: + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + convert-source-map: 2.0.0 + debug: 4.3.7 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.26.2: + resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.0.2 + dev: true + + /@babel/helper-annotate-as-pure@7.25.9: + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.26.0 + dev: true + + /@babel/helper-builder-binary-assignment-operator-visitor@7.25.9: + resolution: {integrity: sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-compilation-targets@7.25.9: + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.2 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.25.9 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-create-regexp-features-plugin@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + regexpu-core: 6.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.26.0): + resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + debug: 4.3.7 + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-member-expression-to-functions@7.25.9: + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-module-imports@7.25.9: + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0): + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-optimise-call-expression@7.25.9: + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.26.0 + dev: true + + /@babel/helper-plugin-utils@7.25.9: + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-wrap-function': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-simple-access@7.25.9: + resolution: {integrity: sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-skip-transparent-expression-wrappers@7.25.9: + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-string-parser@7.25.9: + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.25.9: + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.25.9: + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-wrap-function@7.25.9: + resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helpers@7.26.0: + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + dev: true + + /@babel/parser@7.26.2: + resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.26.0 + + /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-decorators@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-decorators': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + dev: true + + /@babel/plugin-syntax-decorators@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0): + resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0): + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.0): + resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.25.9 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/template': 7.25.9 + dev: true + + /@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-exponentiation-operator@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-commonjs@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-simple-access': 7.25.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) + dev: true + + /@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + regenerator-transform: 0.15.2 + dev: true + + /@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.0): + resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-typescript@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.0): + resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + dev: true + + /@babel/preset-env@7.26.0(@babel/core@7.26.0): + resolution: {integrity: sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0) + '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.0) + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoped-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-exponentiation-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-typeof-symbol': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.0) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.26.0) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.26.0) + core-js-compat: 3.39.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0): + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/types': 7.26.0 + esutils: 2.0.3 + dev: true + + /@babel/preset-typescript@7.26.0(@babel/core@7.26.0): + resolution: {integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-typescript': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/runtime@7.26.0: + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + + /@babel/template@7.25.9: + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + dev: true + + /@babel/traverse@7.25.9: + resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + debug: 4.3.7 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.26.0: + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + /@commitlint/cli@19.5.0(@types/node@22.9.0)(typescript@5.5.2): + resolution: {integrity: sha512-gaGqSliGwB86MDmAAKAtV9SV1SHdmN8pnGq4EJU4+hLisQ7IFfx4jvU4s+pk6tl0+9bv6yT+CaZkufOinkSJIQ==} + engines: {node: '>=v18'} + hasBin: true + dependencies: + '@commitlint/format': 19.5.0 + '@commitlint/lint': 19.5.0 + '@commitlint/load': 19.5.0(@types/node@22.9.0)(typescript@5.5.2) + '@commitlint/read': 19.5.0 + '@commitlint/types': 19.5.0 + tinyexec: 0.3.1 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - typescript + dev: true + + /@commitlint/config-conventional@19.5.0: + resolution: {integrity: sha512-OBhdtJyHNPryZKg0fFpZNOBM1ZDbntMvqMuSmpfyP86XSfwzGw4CaoYRG4RutUPg0BTK07VMRIkNJT6wi2zthg==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 19.5.0 + conventional-changelog-conventionalcommits: 7.0.2 + dev: true + + /@commitlint/config-validator@19.5.0: + resolution: {integrity: sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 19.5.0 + ajv: 8.17.1 + dev: true + + /@commitlint/ensure@19.5.0: + resolution: {integrity: sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 19.5.0 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + dev: true + + /@commitlint/execute-rule@19.5.0: + resolution: {integrity: sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==} + engines: {node: '>=v18'} + dev: true + + /@commitlint/format@19.5.0: + resolution: {integrity: sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 19.5.0 + chalk: 5.3.0 + dev: true + + /@commitlint/is-ignored@19.5.0: + resolution: {integrity: sha512-0XQ7Llsf9iL/ANtwyZ6G0NGp5Y3EQ8eDQSxv/SRcfJ0awlBY4tHFAvwWbw66FVUaWICH7iE5en+FD9TQsokZ5w==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 19.5.0 + semver: 7.6.3 + dev: true + + /@commitlint/lint@19.5.0: + resolution: {integrity: sha512-cAAQwJcRtiBxQWO0eprrAbOurtJz8U6MgYqLz+p9kLElirzSCc0vGMcyCaA1O7AqBuxo11l1XsY3FhOFowLAAg==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/is-ignored': 19.5.0 + '@commitlint/parse': 19.5.0 + '@commitlint/rules': 19.5.0 + '@commitlint/types': 19.5.0 + dev: true + + /@commitlint/load@19.5.0(@types/node@22.9.0)(typescript@5.5.2): + resolution: {integrity: sha512-INOUhkL/qaKqwcTUvCE8iIUf5XHsEPCLY9looJ/ipzi7jtGhgmtH7OOFiNvwYgH7mA8osUWOUDV8t4E2HAi4xA==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/config-validator': 19.5.0 + '@commitlint/execute-rule': 19.5.0 + '@commitlint/resolve-extends': 19.5.0 + '@commitlint/types': 19.5.0 + chalk: 5.3.0 + cosmiconfig: 9.0.0(typescript@5.5.2) + cosmiconfig-typescript-loader: 5.1.0(@types/node@22.9.0)(cosmiconfig@9.0.0)(typescript@5.5.2) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + transitivePeerDependencies: + - '@types/node' + - typescript + dev: true + + /@commitlint/message@19.5.0: + resolution: {integrity: sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==} + engines: {node: '>=v18'} + dev: true + + /@commitlint/parse@19.5.0: + resolution: {integrity: sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 19.5.0 + conventional-changelog-angular: 7.0.0 + conventional-commits-parser: 5.0.0 + dev: true + + /@commitlint/read@19.5.0: + resolution: {integrity: sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/top-level': 19.5.0 + '@commitlint/types': 19.5.0 + git-raw-commits: 4.0.0 + minimist: 1.2.8 + tinyexec: 0.3.1 + dev: true + + /@commitlint/resolve-extends@19.5.0: + resolution: {integrity: sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/config-validator': 19.5.0 + '@commitlint/types': 19.5.0 + global-directory: 4.0.1 + import-meta-resolve: 4.1.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + dev: true + + /@commitlint/rules@19.5.0: + resolution: {integrity: sha512-hDW5TPyf/h1/EufSHEKSp6Hs+YVsDMHazfJ2azIk9tHPXS6UqSz1dIRs1gpqS3eMXgtkT7JH6TW4IShdqOwhAw==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/ensure': 19.5.0 + '@commitlint/message': 19.5.0 + '@commitlint/to-lines': 19.5.0 + '@commitlint/types': 19.5.0 + dev: true + + /@commitlint/to-lines@19.5.0: + resolution: {integrity: sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==} + engines: {node: '>=v18'} + dev: true + + /@commitlint/top-level@19.5.0: + resolution: {integrity: sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==} + engines: {node: '>=v18'} + dependencies: + find-up: 7.0.0 + dev: true + + /@commitlint/types@19.5.0: + resolution: {integrity: sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==} + engines: {node: '>=v18'} + dependencies: + '@types/conventional-commits-parser': 5.0.0 + chalk: 5.3.0 + dev: true + + /@css-render/plugin-bem@0.15.14(css-render@0.15.14): + resolution: {integrity: sha512-QK513CJ7yEQxm/P3EwsI+d+ha8kSOcjGvD6SevM41neEMxdULE+18iuQK6tEChAWMOQNQPLG/Rw3Khb69r5neg==} + peerDependencies: + css-render: ~0.15.14 + dependencies: + css-render: 0.15.14 + dev: true + + /@css-render/vue3-ssr@0.15.14(vue@3.5.5): + resolution: {integrity: sha512-//8027GSbxE9n3QlD73xFY6z4ZbHbvrOVB7AO6hsmrEzGbg+h2A09HboUyDgu+xsmj7JnvJD39Irt+2D0+iV8g==} + peerDependencies: + vue: ^3.0.11 + dependencies: + vue: 3.5.5(typescript@5.5.2) + dev: true + + /@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3): + resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.3 + dependencies: + '@csstools/css-tokenizer': 3.0.3 + dev: true + + /@csstools/css-tokenizer@3.0.3: + resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} + engines: {node: '>=18'} + dev: true + + /@csstools/media-query-list-parser@3.0.1(@csstools/css-parser-algorithms@3.0.4)(@csstools/css-tokenizer@3.0.3): + resolution: {integrity: sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.1 + '@csstools/css-tokenizer': ^3.0.1 + dependencies: + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 + dev: true + + /@csstools/selector-specificity@4.0.0(postcss-selector-parser@6.1.2): + resolution: {integrity: sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==} + engines: {node: '>=18'} + peerDependencies: + postcss-selector-parser: ^6.1.0 + dependencies: + postcss-selector-parser: 6.1.2 + dev: true + + /@ctrl/tinycolor@3.6.1: + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + dev: false + + /@dual-bundle/import-meta-resolve@4.1.0: + resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==} + dev: true + + /@element-plus/icons-vue@2.3.1(vue@3.5.5): + resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==} + peerDependencies: + vue: ^3.2.0 + dependencies: + vue: 3.5.5(typescript@5.5.2) + dev: false + + /@emotion/hash@0.8.0: + resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} + dev: true + + /@esbuild/aix-ppc64@0.21.5: + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/aix-ppc64@0.23.1: + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.21.5: + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.23.1: + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.21.5: + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.23.1: + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.21.5: + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.23.1: + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.21.5: + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.23.1: + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.21.5: + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.23.1: + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.21.5: + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.23.1: + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.21.5: + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.23.1: + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.21.5: + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.23.1: + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.21.5: + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.23.1: + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.21.5: + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.23.1: + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.21.5: + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.23.1: + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.21.5: + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.23.1: + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.21.5: + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.23.1: + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.21.5: + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.23.1: + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.21.5: + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.23.1: + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.21.5: + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.23.1: + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.21.5: + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.23.1: + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-arm64@0.23.1: + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.21.5: + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.23.1: + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.21.5: + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.23.1: + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.21.5: + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.23.1: + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.21.5: + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.23.1: + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.21.5: + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.23.1: + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.1(eslint@8.57.0): + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.12.1: + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.7 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.57.0: + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@floating-ui/core@1.6.8: + resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} + dependencies: + '@floating-ui/utils': 0.2.8 + dev: false + + /@floating-ui/dom@1.6.12: + resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==} + dependencies: + '@floating-ui/core': 1.6.8 + '@floating-ui/utils': 0.2.8 + dev: false + + /@floating-ui/utils@0.2.8: + resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + dev: false + + /@highlightjs/vue-plugin@2.1.0(highlight.js@11.10.0)(vue@3.5.5): + resolution: {integrity: sha512-E+bmk4ncca+hBEYRV2a+1aIzIV0VSY/e5ArjpuSN9IO7wBJrzUE2u4ESCwrbQD7sAy+jWQjkV5qCCWgc+pu7CQ==} + peerDependencies: + highlight.js: ^11.0.1 + vue: ^3 + dependencies: + highlight.js: 11.10.0 + vue: 3.5.5(typescript@5.5.2) + dev: false + + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.7 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + dev: true + + /@hutson/parse-repository-url@3.0.2: + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} + engines: {node: '>=6.9.0'} + dev: true + + /@iconify/json@2.2.247: + resolution: {integrity: sha512-i3Vm3VDAxtw0KxUR56o2zlNJcfmy4KDddSptxEw17Ze1O6FWA/JMNMI3em7FoaAqJLfcHMycWpzWx0Sbl/NUsA==} + dependencies: + '@iconify/types': 2.0.0 + pathe: 1.1.2 + dev: true + + /@iconify/types@2.0.0: + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + /@iconify/utils@2.1.33: + resolution: {integrity: sha512-jP9h6v/g0BIZx0p7XGJJVtkVnydtbgTgt9mVNcGDYwaa7UhdHdI9dvoq+gKj9sijMSJKxUPEG2JyjsgXjxL7Kw==} + dependencies: + '@antfu/install-pkg': 0.4.1 + '@antfu/utils': 0.7.10 + '@iconify/types': 2.0.0 + debug: 4.3.7 + kolorist: 1.8.0 + local-pkg: 0.5.0 + mlly: 1.7.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@iconify/vue@4.1.2(vue@3.5.5): + resolution: {integrity: sha512-CQnYqLiQD5LOAaXhBrmj1mdL2/NCJvwcC4jtW2Z8ukhThiFkLDkutarTOV2trfc9EXqUqRs0KqXOL9pZ/IyysA==} + peerDependencies: + vue: '>=3' + dependencies: + '@iconify/types': 2.0.0 + vue: 3.5.5(typescript@5.5.2) + dev: false + + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/source-map@0.3.6: + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + + /@jridgewell/sourcemap-codec@1.5.0: + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + dev: true + + /@juggle/resize-observer@3.4.0: + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + dev: true + + /@ljharb/resumer@0.0.1: + resolution: {integrity: sha512-skQiAOrCfO7vRTq53cxznMpks7wS1va95UCidALlOVWqvBAzwPVErwizDwoMqNVMEn1mDq0utxZd02eIrvF1lw==} + engines: {node: '>= 0.4'} + dependencies: + '@ljharb/through': 2.3.13 + dev: false + + /@ljharb/through@2.3.13: + resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + dev: true + + /@pkgr/core@0.1.1: + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dev: true + + /@polka/url@1.0.0-next.28: + resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + dev: true + + /@rollup/plugin-babel@5.3.1(@babel/core@7.26.0)(rollup@2.79.2): + resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} + engines: {node: '>= 10.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@rollup/pluginutils': 3.1.0(rollup@2.79.2) + rollup: 2.79.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@rollup/plugin-node-resolve@15.3.0(rollup@2.79.2): + resolution: {integrity: sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.1.3(rollup@2.79.2) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.8 + rollup: 2.79.2 + dev: true + + /@rollup/plugin-replace@2.4.2(rollup@2.79.2): + resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.2) + magic-string: 0.25.9 + rollup: 2.79.2 + dev: true + + /@rollup/plugin-terser@0.4.4(rollup@2.79.2): + resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + rollup: 2.79.2 + serialize-javascript: 6.0.2 + smob: 1.5.0 + terser: 5.36.0 + dev: true + + /@rollup/pluginutils@3.1.0(rollup@2.79.2): + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 2.79.2 + dev: true + + /@rollup/pluginutils@4.2.1: + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + + /@rollup/pluginutils@5.1.3(rollup@2.79.2): + resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 4.0.2 + rollup: 2.79.2 + dev: true + + /@rollup/rollup-android-arm-eabi@4.24.4: + resolution: {integrity: sha512-jfUJrFct/hTA0XDM5p/htWKoNNTbDLY0KRwEt6pyOA6k2fmk0WVwl65PdUdJZgzGEHWx+49LilkcSaumQRyNQw==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.24.4: + resolution: {integrity: sha512-j4nrEO6nHU1nZUuCfRKoCcvh7PIywQPUCBa2UsootTHvTHIoIu2BzueInGJhhvQO/2FTRdNYpf63xsgEqH9IhA==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.24.4: + resolution: {integrity: sha512-GmU/QgGtBTeraKyldC7cDVVvAJEOr3dFLKneez/n7BvX57UdhOqDsVwzU7UOnYA7AAOt+Xb26lk79PldDHgMIQ==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.24.4: + resolution: {integrity: sha512-N6oDBiZCBKlwYcsEPXGDE4g9RoxZLK6vT98M8111cW7VsVJFpNEqvJeIPfsCzbf0XEakPslh72X0gnlMi4Ddgg==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-freebsd-arm64@4.24.4: + resolution: {integrity: sha512-py5oNShCCjCyjWXCZNrRGRpjWsF0ic8f4ieBNra5buQz0O/U6mMXCpC1LvrHuhJsNPgRt36tSYMidGzZiJF6mw==} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-freebsd-x64@4.24.4: + resolution: {integrity: sha512-L7VVVW9FCnTTp4i7KrmHeDsDvjB4++KOBENYtNYAiYl96jeBThFfhP6HVxL74v4SiZEVDH/1ILscR5U9S4ms4g==} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.24.4: + resolution: {integrity: sha512-10ICosOwYChROdQoQo589N5idQIisxjaFE/PAnX2i0Zr84mY0k9zul1ArH0rnJ/fpgiqfu13TFZR5A5YJLOYZA==} + cpu: [arm] + os: [linux] + libc: [glibc] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-musleabihf@4.24.4: + resolution: {integrity: sha512-ySAfWs69LYC7QhRDZNKqNhz2UKN8LDfbKSMAEtoEI0jitwfAG2iZwVqGACJT+kfYvvz3/JgsLlcBP+WWoKCLcw==} + cpu: [arm] + os: [linux] + libc: [musl] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.24.4: + resolution: {integrity: sha512-uHYJ0HNOI6pGEeZ/5mgm5arNVTI0nLlmrbdph+pGXpC9tFHFDQmDMOEqkmUObRfosJqpU8RliYoGz06qSdtcjg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.24.4: + resolution: {integrity: sha512-38yiWLemQf7aLHDgTg85fh3hW9stJ0Muk7+s6tIkSUOMmi4Xbv5pH/5Bofnsb6spIwD5FJiR+jg71f0CH5OzoA==} + cpu: [arm64] + os: [linux] + libc: [musl] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-powerpc64le-gnu@4.24.4: + resolution: {integrity: sha512-q73XUPnkwt9ZNF2xRS4fvneSuaHw2BXuV5rI4cw0fWYVIWIBeDZX7c7FWhFQPNTnE24172K30I+dViWRVD9TwA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.24.4: + resolution: {integrity: sha512-Aie/TbmQi6UXokJqDZdmTJuZBCU3QBDA8oTKRGtd4ABi/nHgXICulfg1KI6n9/koDsiDbvHAiQO3YAUNa/7BCw==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-s390x-gnu@4.24.4: + resolution: {integrity: sha512-P8MPErVO/y8ohWSP9JY7lLQ8+YMHfTI4bAdtCi3pC2hTeqFJco2jYspzOzTUB8hwUWIIu1xwOrJE11nP+0JFAQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.24.4: + resolution: {integrity: sha512-K03TljaaoPK5FOyNMZAAEmhlyO49LaE4qCsr0lYHUKyb6QacTNF9pnfPpXnFlFD3TXuFbFbz7tJ51FujUXkXYA==} + cpu: [x64] + os: [linux] + libc: [glibc] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.24.4: + resolution: {integrity: sha512-VJYl4xSl/wqG2D5xTYncVWW+26ICV4wubwN9Gs5NrqhJtayikwCXzPL8GDsLnaLU3WwhQ8W02IinYSFJfyo34Q==} + cpu: [x64] + os: [linux] + libc: [musl] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.24.4: + resolution: {integrity: sha512-ku2GvtPwQfCqoPFIJCqZ8o7bJcj+Y54cZSr43hHca6jLwAiCbZdBUOrqE6y29QFajNAzzpIOwsckaTFmN6/8TA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.24.4: + resolution: {integrity: sha512-V3nCe+eTt/W6UYNr/wGvO1fLpHUrnlirlypZfKCT1fG6hWfqhPgQV/K/mRBXBpxc0eKLIF18pIOFVPh0mqHjlg==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.24.4: + resolution: {integrity: sha512-LTw1Dfd0mBIEqUVCxbvTE/LLo+9ZxVC9k99v1v4ahg9Aak6FpqOfNu5kRkeTAn0wphoC4JU7No1/rL+bBCEwhg==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@surma/rollup-plugin-off-main-thread@2.2.3: + resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + dependencies: + ejs: 3.1.10 + json5: 2.2.3 + magic-string: 0.25.9 + string.prototype.matchall: 4.0.11 + dev: true + + /@sxzz/popperjs-es@2.11.7: + resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==} + dev: false + + /@trysound/sax@0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + dev: true + + /@types/bigi@1.4.5: + resolution: {integrity: sha512-fb5MUzazrD2GRnwlStm91HVu3cZbvolX9kJruqpUBdc24eHBWrLLfyt8XN1/C5JpI0stP/MbaFQp+cJh5WOFfw==} + dev: true + + /@types/conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} + dependencies: + '@types/node': 22.9.0 + dev: true + + /@types/d3-timer@2.0.3: + resolution: {integrity: sha512-jhAJzaanK5LqyLQ50jJNIrB8fjL9gwWZTgYjevPvkDLMU+kTAZkYsobI59nYoeSrH1PucuyJEi247Pb90t6XUg==} + dev: false + + /@types/eslint@8.56.12: + resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} + dependencies: + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + dev: true + + /@types/estree@0.0.39: + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + dev: true + + /@types/estree@1.0.6: + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + dev: true + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true + + /@types/katex@0.16.7: + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + dev: true + + /@types/lodash-es@4.17.12: + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + dependencies: + '@types/lodash': 4.17.13 + + /@types/lodash@4.17.13: + resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} + + /@types/md5@2.3.5: + resolution: {integrity: sha512-/i42wjYNgE6wf0j2bcTX6kuowmdL/6PE4IVitMpm2eYKBUuYCprdcWVK+xEF0gcV6ufMCRhtxmReGfc6hIK7Jw==} + dev: true + + /@types/minimist@1.2.5: + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + dev: true + + /@types/node@22.9.0: + resolution: {integrity: sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==} + dependencies: + undici-types: 6.19.8 + + /@types/normalize-package-data@2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + dev: true + + /@types/nprogress@0.2.3: + resolution: {integrity: sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==} + dev: true + + /@types/qs@6.9.15: + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + dev: true + + /@types/readable-stream@4.0.18: + resolution: {integrity: sha512-21jK/1j+Wg+7jVw1xnSwy/2Q1VgVjWuFssbYGTREPUBeZ+rqVFl2udq0IkxzPC0ZhOzVceUbyIACFZKLqKEBlA==} + dependencies: + '@types/node': 22.9.0 + safe-buffer: 5.1.2 + dev: false + + /@types/resolve@1.20.2: + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + dev: true + + /@types/sm-crypto@0.3.4: + resolution: {integrity: sha512-tp+KWAawUkwUWSpA3sHymerfy9P0utSyfdh7D60FJ4Aj1rhBZ2Q/nDvARUmmfQeIZZD1FKg9oAcDqecCux0npw==} + dependencies: + '@types/bigi': 1.4.5 + dev: true + + /@types/sortablejs@1.15.8: + resolution: {integrity: sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg==} + dev: true + + /@types/svgo@2.6.4: + resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==} + dependencies: + '@types/node': 22.9.0 + dev: true + + /@types/trusted-types@2.0.7: + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + dev: true + + /@types/web-bluetooth@0.0.16: + resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} + dev: false + + /@types/web-bluetooth@0.0.20: + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + + /@types/ws@8.5.13: + resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==} + dependencies: + '@types/node': 22.9.0 + dev: false + + /@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1)(eslint@8.57.0)(typescript@5.5.2): + resolution: {integrity: sha512-aAJd6bIf2vvQRjUG3ZkNXkmBpN+J7Wd0mfQiiVCJMu9Z5GcZZdcc0j8XwN/BM97Fl7e3SkTXODSk4VehUv7CGw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 7.14.1(eslint@8.57.0)(typescript@5.5.2) + '@typescript-eslint/scope-manager': 7.14.1 + '@typescript-eslint/type-utils': 7.14.1(eslint@8.57.0)(typescript@5.5.2) + '@typescript-eslint/utils': 7.14.1(eslint@8.57.0)(typescript@5.5.2) + '@typescript-eslint/visitor-keys': 7.14.1 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.0(typescript@5.5.2) + typescript: 5.5.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.5.2): + resolution: {integrity: sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 7.14.1 + '@typescript-eslint/types': 7.14.1 + '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.2) + '@typescript-eslint/visitor-keys': 7.14.1 + debug: 4.3.7 + eslint: 8.57.0 + typescript: 5.5.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@7.14.1: + resolution: {integrity: sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA==} + engines: {node: ^18.18.0 || >=20.0.0} + dependencies: + '@typescript-eslint/types': 7.14.1 + '@typescript-eslint/visitor-keys': 7.14.1 + dev: true + + /@typescript-eslint/type-utils@7.14.1(eslint@8.57.0)(typescript@5.5.2): + resolution: {integrity: sha512-/MzmgNd3nnbDbOi3LfasXWWe292+iuo+umJ0bCCMCPc1jLO/z2BQmWUUUXvXLbrQey/JgzdF/OV+I5bzEGwJkQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.2) + '@typescript-eslint/utils': 7.14.1(eslint@8.57.0)(typescript@5.5.2) + debug: 4.3.7 + eslint: 8.57.0 + ts-api-utils: 1.4.0(typescript@5.5.2) + typescript: 5.5.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@7.14.1: + resolution: {integrity: sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==} + engines: {node: ^18.18.0 || >=20.0.0} + dev: true + + /@typescript-eslint/typescript-estree@7.14.1(typescript@5.5.2): + resolution: {integrity: sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 7.14.1 + '@typescript-eslint/visitor-keys': 7.14.1 + debug: 4.3.7 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.4.0(typescript@5.5.2) + typescript: 5.5.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@7.14.1(eslint@8.57.0)(typescript@5.5.2): + resolution: {integrity: sha512-CMmVVELns3nak3cpJhZosDkm63n+DwBlDX8g0k4QUa9BMnF+lH2lr3d130M1Zt1xxmB3LLk3NV7KQCq86ZBBhQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.0) + '@typescript-eslint/scope-manager': 7.14.1 + '@typescript-eslint/types': 7.14.1 + '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.2) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@7.14.1: + resolution: {integrity: sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA==} + engines: {node: ^18.18.0 || >=20.0.0} + dependencies: + '@typescript-eslint/types': 7.14.1 + eslint-visitor-keys: 3.4.3 + dev: true + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + + /@unocss/astro@0.62.3(rollup@2.79.2)(vite@5.4.5): + resolution: {integrity: sha512-C6ZdyLbLDS0LebwmgwVItLNAOSkL/tvVWNRd1i3Jy5uj1vPxlrw+3lIYiHjEofn0GFpBiwlv5+OCvO1Xpq5MqA==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 + peerDependenciesMeta: + vite: + optional: true + dependencies: + '@unocss/core': 0.62.3 + '@unocss/reset': 0.62.3 + '@unocss/vite': 0.62.3(rollup@2.79.2)(vite@5.4.5) + vite: 5.4.5(@types/node@22.9.0)(sass@1.78.0) + transitivePeerDependencies: + - rollup + - supports-color + dev: true + + /@unocss/cli@0.62.3(rollup@2.79.2): + resolution: {integrity: sha512-yEl1iNKkBVpo8+i8gzveM5/0/vOVe6m8+FmuSDuKeSPJnYMhI1mAn+OCKFb/I+qEeLbRPXebbJUUB1xZNzya+w==} + engines: {node: '>=14'} + hasBin: true + dependencies: + '@ampproject/remapping': 2.3.0 + '@rollup/pluginutils': 5.1.3(rollup@2.79.2) + '@unocss/config': 0.62.3 + '@unocss/core': 0.62.3 + '@unocss/preset-uno': 0.62.3 + cac: 6.7.14 + chokidar: 3.6.0 + colorette: 2.0.20 + consola: 3.2.3 + magic-string: 0.30.12 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + tinyglobby: 0.2.10 + transitivePeerDependencies: + - rollup + - supports-color + dev: true + + /@unocss/config@0.62.3: + resolution: {integrity: sha512-zYOvFE0HfGIbnP/AvsbAlJpPRx9CQyXzL11m/8zgsHW5SGlJIYxuTll83l/xu026G5mPiksy7quoEOEgCLslqw==} + engines: {node: '>=14'} + dependencies: + '@unocss/core': 0.62.3 + unconfig: 0.5.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@unocss/core@0.62.3: + resolution: {integrity: sha512-Pfyrj8S7jq9K1QXD6Z5BCeiQavaHpbMN5q958/kmdbNGp57hOg1e346fMJAvgPjLBR+lE/hgZEsDrijtRiZXnw==} + dev: true + + /@unocss/extractor-arbitrary-variants@0.62.3: + resolution: {integrity: sha512-9ZscWyXEwDZif+b56xZyJFHwJOjdMXmj+6x96jOsnRNBzwT9eW7YcGCErP1ih/q1S6KmuRrHM/JOXMBQ6H4qlw==} + dependencies: + '@unocss/core': 0.62.3 + dev: true + + /@unocss/inspector@0.62.3: + resolution: {integrity: sha512-nTSXOf7YimFPxEYJo5VfP5wlMgYOCjlv3c5Ub/0fynCJXZNb89SFeU05ABXkEgg/FfiobVBTscikLc6guW8eHQ==} + dependencies: + '@unocss/core': 0.62.3 + '@unocss/rule-utils': 0.62.3 + gzip-size: 6.0.0 + sirv: 2.0.4 + dev: true + + /@unocss/postcss@0.62.3(postcss@8.4.45): + resolution: {integrity: sha512-CwL378ef0QazduXqlaGcWgKJAzemBUxdhapWWiRqI8sXC/eXht5xK6nS1JxqADDuxosgqsGdvcCGmP8ZFrEyiA==} + engines: {node: '>=14'} + peerDependencies: + postcss: ^8.4.21 + dependencies: + '@unocss/config': 0.62.3 + '@unocss/core': 0.62.3 + '@unocss/rule-utils': 0.62.3 + css-tree: 2.3.1 + magic-string: 0.30.12 + postcss: 8.4.45 + tinyglobby: 0.2.10 + transitivePeerDependencies: + - supports-color + dev: true + + /@unocss/preset-attributify@0.62.3: + resolution: {integrity: sha512-ORNwyLobGTwnn/tK5yHnMabdJU6Mr/C4LyFH7G8VSLit/aVS0fFa795kJXwxfbqQoQ7Gw0Zxs9oE5RXI0/0y7g==} + dependencies: + '@unocss/core': 0.62.3 + dev: true + + /@unocss/preset-icons@0.62.3: + resolution: {integrity: sha512-Ie+5RTyac1Q5CNB/s/4aB4VTHAQgQqsI5hshMNLkJ0Jj1lWxodUdEbCRKjXDalRjAXOS9vsLjfJ35ozJ1RSTIQ==} + dependencies: + '@iconify/utils': 2.1.33 + '@unocss/core': 0.62.3 + ofetch: 1.4.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@unocss/preset-mini@0.62.3: + resolution: {integrity: sha512-dn/8ubeW2ry/ZF3iKxdQHnS0l3EBibt0rIOE/XVwx24ub6pRzclU4r7xHnXeqvAFOO9PoiKDGgFR92m6R2MxyQ==} + dependencies: + '@unocss/core': 0.62.3 + '@unocss/extractor-arbitrary-variants': 0.62.3 + '@unocss/rule-utils': 0.62.3 + dev: true + + /@unocss/preset-tagify@0.62.3: + resolution: {integrity: sha512-8BpUCZ5sjOZOzBKtu7ecfhRggwwPF78IqeqeNjI+XYRs8r7TBBcUVeF6zUkwhlX/TbtREkw2OZj0Iusa9CBO+A==} + dependencies: + '@unocss/core': 0.62.3 + dev: true + + /@unocss/preset-typography@0.62.3: + resolution: {integrity: sha512-GjtDgQ1Jec/5RNmnyGMWMgyPdStWcFG/S+NUfOuroRsGSI8PDxihVOwFu5CwvOB2J2r6mRNLeUYMluE05jW3sw==} + dependencies: + '@unocss/core': 0.62.3 + '@unocss/preset-mini': 0.62.3 + dev: true + + /@unocss/preset-uno@0.62.3: + resolution: {integrity: sha512-RlsrMlpEzoZqB0lr5VvlkHGpEgr0Vp6z4Q/7DjW5t7mi20Z2i8olaLGWM0TO1wKoRi8bxc6HP0RHUS7pHtZxBA==} + dependencies: + '@unocss/core': 0.62.3 + '@unocss/preset-mini': 0.62.3 + '@unocss/preset-wind': 0.62.3 + '@unocss/rule-utils': 0.62.3 + dev: true + + /@unocss/preset-web-fonts@0.62.3: + resolution: {integrity: sha512-rGEouncGFwcUY1cjkQ/ZoSmEzOeSi3Yk4YAfHGyS0ff5zKuTDWZgivB8hh/mTtvRzZunIL+FW1+1z5G9rUwjgQ==} + dependencies: + '@unocss/core': 0.62.3 + ofetch: 1.4.1 + dev: true + + /@unocss/preset-wind@0.62.3: + resolution: {integrity: sha512-6+VNce1he1U5EXKlXRwTIPn8KeK6bZ2jAEgcCxk8mFy8SzOlLeYzXCI9lcdiWRTjIeIiK5iSaUqmsQFtKdTyQg==} + dependencies: + '@unocss/core': 0.62.3 + '@unocss/preset-mini': 0.62.3 + '@unocss/rule-utils': 0.62.3 + dev: true + + /@unocss/reset@0.62.3: + resolution: {integrity: sha512-XVKPkbm8y9SGzRaG3x+HygGZURm50MvKLVHXsbxi67RbIir9Ouyt9hQTV6Xs3RicRZFWOpJx3wMRb8iKUOe5Zw==} + dev: true + + /@unocss/rule-utils@0.62.3: + resolution: {integrity: sha512-qI37jHH//XzyR5Y2aN3Kpo4lQrQO+CaiXpqPSwMLYh2bIypc2RQVpqGVtU736x0eA6IIx41XEkKzUW+VtvJvmg==} + engines: {node: '>=14'} + dependencies: + '@unocss/core': 0.62.3 + magic-string: 0.30.12 + dev: true + + /@unocss/scope@0.62.3: + resolution: {integrity: sha512-TJGmFfsMrTo8DBJ7CJupIqObpgij+w4jCHMBf1uu0/9jbm63dH6WGcrl3zf5mm6UBTeLmB0RwJ8K4hs7LtrBDQ==} + dev: true + + /@unocss/transformer-attributify-jsx-babel@0.62.3: + resolution: {integrity: sha512-3yFZPSoN8VLiAGUAFIyfDRv9HQYTKFGKawDdMM9ATZmSEYOecJnYjS2HayT1P9kzGwBwuKoFjcX50JH1PuNokg==} + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) + '@unocss/core': 0.62.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@unocss/transformer-attributify-jsx@0.62.3: + resolution: {integrity: sha512-AutidZj26QW1vLQzuW/aQigC/5ZnIeqGYIBeb/O+FKKt0bU411tHrHnA1iV4CoxIdWJTkw2sGAl6z6YvwAYG6w==} + dependencies: + '@unocss/core': 0.62.3 + dev: true + + /@unocss/transformer-compile-class@0.62.3: + resolution: {integrity: sha512-1hf+99wJXzQXQPz9xR0AiTB3vBXT5RiEyugIX95HFx7EvSE/P17RP90yKEKZtDZRUwGiz2vIyySlxcKTFak9Vg==} + dependencies: + '@unocss/core': 0.62.3 + dev: true + + /@unocss/transformer-directives@0.62.3: + resolution: {integrity: sha512-HqHwFOA7DfxD/A1ROZIp8Dr8iZcE0z4w3VQtViWPQ89Fqmb7p2wCPGekk+8yW5PAltpynvHE4ahJEto5xjdg6w==} + dependencies: + '@unocss/core': 0.62.3 + '@unocss/rule-utils': 0.62.3 + css-tree: 2.3.1 + dev: true + + /@unocss/transformer-variant-group@0.62.3: + resolution: {integrity: sha512-oNX1SdfWemz0GWGSXACu8NevM0t2l44j2ancnooNkNz3l1+z1nbn4vFwfsJCOqOaoVm4ZqxaiQ8HIx81ZSiU1A==} + dependencies: + '@unocss/core': 0.62.3 + dev: true + + /@unocss/vite@0.62.3(rollup@2.79.2)(vite@5.4.5): + resolution: {integrity: sha512-RrqF6Go8s0BGpwRfkOiLuO+n3CUE/CXxGqb0ipbUARhmNWJlekE3YPfayqImSEnCcImpaPgtVGv6Y0u3kLGG/w==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 + dependencies: + '@ampproject/remapping': 2.3.0 + '@rollup/pluginutils': 5.1.3(rollup@2.79.2) + '@unocss/config': 0.62.3 + '@unocss/core': 0.62.3 + '@unocss/inspector': 0.62.3 + '@unocss/scope': 0.62.3 + '@unocss/transformer-directives': 0.62.3 + chokidar: 3.6.0 + magic-string: 0.30.12 + tinyglobby: 0.2.10 + vite: 5.4.5(@types/node@22.9.0)(sass@1.78.0) + transitivePeerDependencies: + - rollup + - supports-color + dev: true + + /@vitejs/plugin-vue-jsx@4.0.1(vite@5.4.5)(vue@3.5.5): + resolution: {integrity: sha512-7mg9HFGnFHMEwCdB6AY83cVK4A6sCqnrjFYF4WIlebYAQVVJ/sC/CiTruVdrRlhrFoeZ8rlMxY9wYpPTIRhhAg==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 + vue: ^3.0.0 + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-transform-typescript': 7.25.9(@babel/core@7.26.0) + '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.0) + vite: 5.4.5(@types/node@22.9.0)(sass@1.78.0) + vue: 3.5.5(typescript@5.5.2) + transitivePeerDependencies: + - supports-color + dev: true + + /@vitejs/plugin-vue@5.1.3(vite@5.4.5)(vue@3.5.5): + resolution: {integrity: sha512-3xbWsKEKXYlmX82aOHufFQVnkbMC/v8fLpWwh6hWOUrK5fbbtBh9Q/WWse27BFgSy2/e2c0fz5Scgya9h2GLhw==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 + vue: ^3.2.25 + dependencies: + vite: 5.4.5(@types/node@22.9.0)(sass@1.78.0) + vue: 3.5.5(typescript@5.5.2) + dev: true + + /@volar/language-core@2.4.9: + resolution: {integrity: sha512-t++GIrUeQnKCieZdY9e+Uar2VmTqOE4Z9KcEcdSHKmKZPuqpbbWow1YKe1i3HpU2s1JqLRVM8y/n87WKXyxJAg==} + dependencies: + '@volar/source-map': 2.4.9 + dev: true + + /@volar/source-map@2.4.9: + resolution: {integrity: sha512-UGE+WgJwk64OcfBwBOBKIzmF+uNx4dC5GzOvaVsHbTBp/IVqeTVsGiO5CwBAt6l3vVXYbMuddG2DU8FEnBRxTg==} + dev: true + + /@volar/typescript@2.4.9: + resolution: {integrity: sha512-Zmh3Bq8CFD6OANKYsi4vs/l7togwfjFH0kgrT12uAsDff2AJQjbEUKTVUnxmHbnbH2B9ja7Lb6Mu/Wj9wBuJlg==} + dependencies: + '@volar/language-core': 2.4.9 + path-browserify: 1.0.1 + vscode-uri: 3.0.8 + dev: true + + /@vue/babel-helper-vue-transform-on@1.2.5: + resolution: {integrity: sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==} + dev: true + + /@vue/babel-plugin-jsx@1.2.5(@babel/core@7.26.0): + resolution: {integrity: sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + '@vue/babel-helper-vue-transform-on': 1.2.5 + '@vue/babel-plugin-resolve-type': 1.2.5(@babel/core@7.26.0) + html-tags: 3.3.1 + svg-tags: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@vue/babel-plugin-resolve-type@1.2.5(@babel/core@7.26.0): + resolution: {integrity: sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/parser': 7.26.2 + '@vue/compiler-sfc': 3.5.12 + transitivePeerDependencies: + - supports-color + dev: true + + /@vue/compiler-core@3.5.12: + resolution: {integrity: sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==} + dependencies: + '@babel/parser': 7.26.2 + '@vue/shared': 3.5.12 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + dev: true + + /@vue/compiler-core@3.5.5: + resolution: {integrity: sha512-ZrxcY8JMoV+kgDrmRwlDufz0SjDZ7jfoNZiIBluAACMBmgr55o/jTbxnyrccH6VSJXnFaDI4Ik1UFCiq9r8i7w==} + dependencies: + '@babel/parser': 7.26.2 + '@vue/shared': 3.5.5 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + /@vue/compiler-dom@3.5.12: + resolution: {integrity: sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==} + dependencies: + '@vue/compiler-core': 3.5.12 + '@vue/shared': 3.5.12 + dev: true + + /@vue/compiler-dom@3.5.5: + resolution: {integrity: sha512-HSvK5q1gmBbxRse3S0Wt34RcKuOyjDJKDDMuF3i7NC+QkDFrbAqw8NnrEm/z7zFDxWZa4/5eUwsBOMQzm1RHBA==} + dependencies: + '@vue/compiler-core': 3.5.5 + '@vue/shared': 3.5.5 + + /@vue/compiler-sfc@3.5.12: + resolution: {integrity: sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==} + dependencies: + '@babel/parser': 7.26.2 + '@vue/compiler-core': 3.5.12 + '@vue/compiler-dom': 3.5.12 + '@vue/compiler-ssr': 3.5.12 + '@vue/shared': 3.5.12 + estree-walker: 2.0.2 + magic-string: 0.30.12 + postcss: 8.4.47 + source-map-js: 1.2.1 + dev: true + + /@vue/compiler-sfc@3.5.5: + resolution: {integrity: sha512-MzBHDxwZhgQPHrwJ5tj92gdTYRCuPDSZr8PY3+JFv8cv2UD5/WayH5yo0kKCkKfrtJhc39jNSMityHrkMSbfnA==} + dependencies: + '@babel/parser': 7.26.2 + '@vue/compiler-core': 3.5.5 + '@vue/compiler-dom': 3.5.5 + '@vue/compiler-ssr': 3.5.5 + '@vue/shared': 3.5.5 + estree-walker: 2.0.2 + magic-string: 0.30.12 + postcss: 8.4.45 + source-map-js: 1.2.1 + + /@vue/compiler-ssr@3.5.12: + resolution: {integrity: sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==} + dependencies: + '@vue/compiler-dom': 3.5.12 + '@vue/shared': 3.5.12 + dev: true + + /@vue/compiler-ssr@3.5.5: + resolution: {integrity: sha512-oFasHnpv/upubjJEmqiTKQYb4qS3ziJddf4UVWuFw6ebk/QTrTUc+AUoTJdo39x9g+AOQBzhOU0ICCRuUjvkmw==} + dependencies: + '@vue/compiler-dom': 3.5.5 + '@vue/shared': 3.5.5 + + /@vue/compiler-vue2@2.7.16: + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + dev: true + + /@vue/devtools-api@6.6.4: + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + dev: false + + /@vue/devtools-core@7.6.3(vite@5.4.5)(vue@3.5.5): + resolution: {integrity: sha512-C7FOuh3Z+EmXXzDU9eRjHQL7zW7/CFovM6yCNNpUb+zXxhrn4fiqTum+a3gNau9DuzYfEtQXwZ9F7MeK0JKYVw==} + peerDependencies: + vue: ^3.0.0 + dependencies: + '@vue/devtools-kit': 7.6.3 + '@vue/devtools-shared': 7.6.3 + mitt: 3.0.1 + nanoid: 3.3.7 + pathe: 1.1.2 + vite-hot-client: 0.2.3(vite@5.4.5) + vue: 3.5.5(typescript@5.5.2) + transitivePeerDependencies: + - vite + dev: true + + /@vue/devtools-kit@7.6.3: + resolution: {integrity: sha512-ETsFc8GlOp04rSFN79tB2TpVloWfsSx9BoCSElV3w3CaJTSBfz42KsIi5Ka+dNTJs1jY7QVLTDeoBmUGgA9h2A==} + dependencies: + '@vue/devtools-shared': 7.6.3 + birpc: 0.2.19 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.1 + dev: true + + /@vue/devtools-shared@7.6.3: + resolution: {integrity: sha512-wJW5QF27i16+sNQIaes8QoEZg1eqEgF83GkiPUlEQe9k7ZoHXHV7PRrnrxOKem42sIHPU813J2V/ZK1uqTJe6g==} + dependencies: + rfdc: 1.4.1 + dev: true + + /@vue/language-core@2.1.6(typescript@5.5.2): + resolution: {integrity: sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@volar/language-core': 2.4.9 + '@vue/compiler-dom': 3.5.12 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.12 + computeds: 0.0.1 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + typescript: 5.5.2 + dev: true + + /@vue/reactivity@3.5.5: + resolution: {integrity: sha512-V4tTWElZQhT73PSK3Wnax9R9m4qvMX+LeKHnfylZc6SLh4Jc5/BPakp6e3zEhKWi5AN8TDzRkGnLkp8OqycYng==} + dependencies: + '@vue/shared': 3.5.5 + + /@vue/runtime-core@3.5.5: + resolution: {integrity: sha512-2/CFaRN17jgsXy4MpigWFBCAMmLkXPb4CjaHrndglwYSra7ajvkH2cat21dscuXaH91G8fXAeg5gCyxWJ+wCRA==} + dependencies: + '@vue/reactivity': 3.5.5 + '@vue/shared': 3.5.5 + + /@vue/runtime-dom@3.5.5: + resolution: {integrity: sha512-0bQGgCuL+4Muz5PsCLgF4Ata9BTdhHi5VjsxtTDyI0Wy4MgoSvBGaA6bDc7W7CGgZOyirf9LNeetMYHQ05pgpw==} + dependencies: + '@vue/reactivity': 3.5.5 + '@vue/runtime-core': 3.5.5 + '@vue/shared': 3.5.5 + csstype: 3.1.3 + + /@vue/server-renderer@3.5.5(vue@3.5.5): + resolution: {integrity: sha512-XjRamLIq5f47cxgy+hiX7zUIY+4RHdPDVrPvvMDAUTdW5RJWX/S0ji/rCbm3LWTT/9Co9bvQME8ZI15ahL4/Qw==} + peerDependencies: + vue: 3.5.5 + dependencies: + '@vue/compiler-ssr': 3.5.5 + '@vue/shared': 3.5.5 + vue: 3.5.5(typescript@5.5.2) + + /@vue/shared@3.5.12: + resolution: {integrity: sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==} + dev: true + + /@vue/shared@3.5.5: + resolution: {integrity: sha512-0KyMXyEgnmFAs6rNUL+6eUHtUCqCaNrVd+AW3MX3LyA0Yry5SA0Km03CDKiOua1x1WWnIr+W9+S0GMFoSDWERQ==} + + /@vueuse/core@11.0.3(vue@3.5.5): + resolution: {integrity: sha512-RENlh64+SYA9XMExmmH1a3TPqeIuJBNNB/63GT35MZI+zpru3oMRUA6cEFr9HmGqEgUisurwGwnIieF6qu3aXw==} + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 11.0.3 + '@vueuse/shared': 11.0.3(vue@3.5.5) + vue-demi: 0.14.10(vue@3.5.5) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + /@vueuse/core@9.13.0(vue@3.5.5): + resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} + dependencies: + '@types/web-bluetooth': 0.0.16 + '@vueuse/metadata': 9.13.0 + '@vueuse/shared': 9.13.0(vue@3.5.5) + vue-demi: 0.14.10(vue@3.5.5) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /@vueuse/metadata@11.0.3: + resolution: {integrity: sha512-+FtbO4SD5WpsOcQTcC0hAhNlOid6QNLzqedtquTtQ+CRNBoAt9GuV07c6KNHK1wCmlq8DFPwgiLF2rXwgSHX5Q==} + + /@vueuse/metadata@9.13.0: + resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} + dev: false + + /@vueuse/shared@11.0.3(vue@3.5.5): + resolution: {integrity: sha512-0rY2m6HS5t27n/Vp5cTDsKTlNnimCqsbh/fmT2LgE+aaU42EMfXo8+bNX91W9I7DDmxfuACXMmrd7d79JxkqWA==} + dependencies: + vue-demi: 0.14.10(vue@3.5.5) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + /@vueuse/shared@9.13.0(vue@3.5.5): + resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} + dependencies: + vue-demi: 0.14.10(vue@3.5.5) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: true + + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: false + + /acorn-jsx@5.3.2(acorn@8.14.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.14.0 + dev: true + + /acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /add-stream@1.0.0: + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + dev: true + + /align-text@0.1.4: + resolution: {integrity: sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + longest: 1.0.1 + repeat-string: 1.6.1 + dev: false + + /amdefine@1.0.1: + resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} + engines: {node: '>=0.4.2'} + dev: false + + /ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + dependencies: + environment: 1.1.0 + dev: true + + /ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + dev: true + + /array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + + /array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + dev: true + + /arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + dev: true + + /astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + dev: true + + /async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + + /async@2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + dependencies: + lodash: 4.17.21 + dev: true + + /async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + dev: true + + /autoprefixer@10.4.20(postcss@8.4.45): + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.24.2 + caniuse-lite: 1.0.30001677 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.4.45 + postcss-value-parser: 4.2.0 + dev: true + + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.0.0 + + /axios@1.7.7: + resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.1 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.26.0): + resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.26.0): + resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) + core-js-compat: 3.39.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.26.0): + resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /balanced-match@2.0.0: + resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + dev: true + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.1 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + dev: true + + /big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + dev: true + + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + dev: true + + /birpc@0.2.19: + resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==} + dev: true + + /bl@6.0.16: + resolution: {integrity: sha512-V/kz+z2Mx5/6qDfRCilmrukUXcXuCoXKg3/3hDvzKKoSUx8CJKudfIoT29XZc3UE9xBvxs5qictiHdprwtteEg==} + dependencies: + '@types/readable-stream': 4.0.18 + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 4.5.2 + dev: false + + /bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + dev: true + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 + dev: true + + /browserslist@4.24.2: + resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001677 + electron-to-chromium: 1.5.52 + node-releases: 2.0.18 + update-browserslist-db: 1.1.1(browserslist@4.24.2) + dev: true + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + dependencies: + run-applescript: 7.0.0 + dev: true + + /bundle-require@5.0.0(esbuild@0.23.1): + resolution: {integrity: sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + dependencies: + esbuild: 0.23.1 + load-tsconfig: 0.2.5 + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.1 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + dev: true + + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + dependencies: + pascal-case: 3.1.2 + tslib: 2.8.1 + dev: true + + /camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase@1.2.1: + resolution: {integrity: sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==} + engines: {node: '>=0.10.0'} + dev: false + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /caniuse-lite@1.0.30001677: + resolution: {integrity: sha512-fmfjsOlJUpMWu+mAAtZZZHz7UEwsUxIIvu1TJfO1HqFQvB/B+ii0xr9B5HpbZY/mC4XZ8SvjHJqtAY6pDPQEog==} + dev: true + + /center-align@0.1.3: + resolution: {integrity: sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==} + engines: {node: '>=0.10.0'} + dependencies: + align-text: 0.1.4 + lazy-cache: 1.0.4 + dev: false + + /chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk@4.1.1: + resolution: {integrity: sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + dev: false + + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + dev: true + + /clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + dependencies: + source-map: 0.6.1 + dev: true + + /cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + dependencies: + restore-cursor: 5.1.0 + dev: true + + /cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + dev: true + + /cliui@2.1.0: + resolution: {integrity: sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==} + dependencies: + center-align: 0.1.3 + right-align: 0.1.3 + wordwrap: 0.0.2 + dev: false + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + dev: true + + /code-inspector-core@0.16.1: + resolution: {integrity: sha512-rZlgRy7hp98X3uX9EfLw/BudkcASiaeXQJbTnSmfNSgWyY3EntSmhr2Ek4DsSnDcOaD2405zFHBCP9dPPdh/ZQ==} + dependencies: + '@vue/compiler-dom': 3.5.12 + chalk: 4.1.1 + portfinder: 1.0.32 + transitivePeerDependencies: + - supports-color + dev: true + + /code-inspector-plugin@0.16.1: + resolution: {integrity: sha512-/oV9RO2dij1s9pm6E6F9n0hwJjq9H+ATOi6YamjTFihaiP0Gp0sv8kJGeljqe9PAkue4lxwFghSR9tEtfZn1Ow==} + dependencies: + chalk: 4.1.1 + code-inspector-core: 0.16.1 + esbuild-code-inspector-plugin: 0.16.1 + vite-code-inspector-plugin: 0.16.1 + webpack-code-inspector-plugin: 0.16.1 + transitivePeerDependencies: + - supports-color + dev: true + + /collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + dev: true + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + dev: true + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: true + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + dev: true + + /commist@3.2.0: + resolution: {integrity: sha512-4PIMoPniho+LqXmpS5d3NuGYncG6XWlkBSVGiWycL22dd42OYdUGil2CWuzklaJoNxyxUSpO4MKIBU94viWNAw==} + dev: false + + /common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + dev: true + + /compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: true + + /component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + dev: true + + /computeds@0.0.1: + resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + + /confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + dev: true + + /connect-history-api-fallback@1.6.0: + resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} + engines: {node: '>=0.8'} + dev: true + + /consola@2.15.3: + resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + dev: true + + /consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + dev: true + + /contour_plot@0.0.1: + resolution: {integrity: sha512-Nil2HI76Xux6sVGORvhSS8v66m+/h5CwFkBJDO+U5vWaMdNC0yXNCsGDPbzPhvqOEU5koebhdEvD372LI+IyLw==} + dev: false + + /conventional-changelog-angular@5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + dev: true + + /conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + dependencies: + compare-func: 2.0.0 + dev: true + + /conventional-changelog-atom@2.0.8: + resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-codemirror@2.0.8: + resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-config-spec@2.1.0: + resolution: {integrity: sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==} + dev: true + + /conventional-changelog-conventionalcommits@4.6.3: + resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + lodash: 4.17.21 + q: 1.5.1 + dev: true + + /conventional-changelog-conventionalcommits@7.0.2: + resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} + engines: {node: '>=16'} + dependencies: + compare-func: 2.0.0 + dev: true + + /conventional-changelog-core@4.2.4: + resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} + engines: {node: '>=10'} + dependencies: + add-stream: 1.0.0 + conventional-changelog-writer: 5.0.1 + conventional-commits-parser: 3.2.4 + dateformat: 3.0.3 + get-pkg-repo: 4.2.1 + git-raw-commits: 2.0.11 + git-remote-origin-url: 2.0.0 + git-semver-tags: 4.1.1 + lodash: 4.17.21 + normalize-package-data: 3.0.3 + q: 1.5.1 + read-pkg: 3.0.0 + read-pkg-up: 3.0.0 + through2: 4.0.2 + dev: true + + /conventional-changelog-ember@2.0.9: + resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-eslint@3.0.9: + resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-express@2.0.6: + resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-jquery@3.0.11: + resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-jshint@2.0.9: + resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + dev: true + + /conventional-changelog-preset-loader@2.3.4: + resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} + engines: {node: '>=10'} + dev: true + + /conventional-changelog-writer@5.0.1: + resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + conventional-commits-filter: 2.0.7 + dateformat: 3.0.3 + handlebars: 4.7.8 + json-stringify-safe: 5.0.1 + lodash: 4.17.21 + meow: 8.1.2 + semver: 6.3.1 + split: 1.0.1 + through2: 4.0.2 + dev: true + + /conventional-changelog@3.1.25: + resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} + engines: {node: '>=10'} + dependencies: + conventional-changelog-angular: 5.0.13 + conventional-changelog-atom: 2.0.8 + conventional-changelog-codemirror: 2.0.8 + conventional-changelog-conventionalcommits: 4.6.3 + conventional-changelog-core: 4.2.4 + conventional-changelog-ember: 2.0.9 + conventional-changelog-eslint: 3.0.9 + conventional-changelog-express: 2.0.6 + conventional-changelog-jquery: 3.0.11 + conventional-changelog-jshint: 2.0.9 + conventional-changelog-preset-loader: 2.3.4 + dev: true + + /conventional-commits-filter@2.0.7: + resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} + engines: {node: '>=10'} + dependencies: + lodash.ismatch: 4.4.0 + modify-values: 1.0.1 + dev: true + + /conventional-commits-parser@3.2.4: + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 2.0.0 + meow: 12.1.1 + split2: 4.2.0 + dev: true + + /conventional-recommended-bump@6.1.0: + resolution: {integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + concat-stream: 2.0.0 + conventional-changelog-preset-loader: 2.3.4 + conventional-commits-filter: 2.0.7 + conventional-commits-parser: 3.2.4 + git-raw-commits: 2.0.11 + git-semver-tags: 4.1.1 + meow: 8.1.2 + q: 1.5.1 + dev: true + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + dependencies: + is-what: 4.1.16 + dev: true + + /copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + dev: true + + /core-js-compat@3.39.0: + resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==} + dependencies: + browserslist: 4.24.2 + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: true + + /cosmiconfig-typescript-loader@5.1.0(@types/node@22.9.0)(cosmiconfig@9.0.0)(typescript@5.5.2): + resolution: {integrity: sha512-7PtBB+6FdsOvZyJtlF3hEPpACq7RQX6BVGsgC7/lfVXnKMvNCu/XY3ykreqG5w/rBNdu2z8LCIKoF3kpHHdHlA==} + engines: {node: '>=v16'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=8.2' + typescript: '>=4' + dependencies: + '@types/node': 22.9.0 + cosmiconfig: 9.0.0(typescript@5.5.2) + jiti: 1.21.6 + typescript: 5.5.2 + dev: true + + /cosmiconfig@9.0.0(typescript@5.5.2): + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + typescript: 5.5.2 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + dev: false + + /crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + dev: true + + /css-functions-list@3.2.3: + resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==} + engines: {node: '>=12 || >=16'} + dev: true + + /css-render@0.15.14: + resolution: {integrity: sha512-9nF4PdUle+5ta4W5SyZdLCCmFd37uVimSjg1evcTqKJCyvCEEj12WKzOSBNak6r4im4J4iYXKH1OWpUV5LBYFg==} + dependencies: + '@emotion/hash': 0.8.0 + csstype: 3.0.11 + dev: true + + /css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + dev: true + + /css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + dev: true + + /css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + dev: true + + /css-tree@3.0.1: + resolution: {integrity: sha512-8Fxxv+tGhORlshCdCwnNJytvlvq46sOLSYEx2ZIGurahWvMucSRnyjPA3AmrMq4VPRYbHVpWj5VkiVasrM2H4Q==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + dependencies: + mdn-data: 2.12.1 + source-map-js: 1.2.1 + dev: true + + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: true + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + dependencies: + css-tree: 1.1.3 + dev: true + + /csstype@3.0.11: + resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==} + dev: true + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + /cz-git@1.9.4: + resolution: {integrity: sha512-VntWcIEFfW8+7RgwYaRn1r10NhUkl8/8ZdJQRupEdqE7QXBCSjNP8hKSk9zhSLzYAsdXfGEAwiAYJM1T2Qsh8w==} + engines: {node: '>=v12.20.0'} + dev: true + + /czg@1.9.4: + resolution: {integrity: sha512-x9V/FXA3XUmK6PMvP2WC3WPTA4xAUCcjFcL6HxJSLUAn4gKshMHWLkIfWSCsEqmenn5IIX0/L7NuBJ7/luDqCA==} + engines: {node: '>=v12.20.0'} + hasBin: true + dev: true + + /d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + dev: false + + /d3-ease@1.0.7: + resolution: {integrity: sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==} + dev: false + + /d3-hierarchy@2.0.0: + resolution: {integrity: sha512-SwIdqM3HxQX2214EG9GTjgmCc/mbSx4mQBn+DuEETubhOw6/U3fmnji4uCVrmzOydMHSO1nZle5gh6HB/wdOzw==} + dev: false + + /d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + dependencies: + d3-color: 3.1.0 + dev: false + + /d3-regression@1.3.10: + resolution: {integrity: sha512-PF8GWEL70cHHWpx2jUQXc68r1pyPHIA+St16muk/XRokETzlegj5LriNKg7o4LR0TySug4nHYPJNNRz/W+/Niw==} + dev: false + + /d3-timer@1.0.10: + resolution: {integrity: sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==} + dev: false + + /dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + dev: true + + /dargs@8.1.0: + resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} + engines: {node: '>=12'} + dev: true + + /data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + /data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + /data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + /date-fns-tz@2.0.1(date-fns@2.30.0): + resolution: {integrity: sha512-fJCG3Pwx8HUoLhkepdsP7Z5RsucUi+ZBOxyM5d0ZZ6c4SdYustq0VMmOu6Wf7bli+yS/Jwp91TOCqn9jMcVrUA==} + peerDependencies: + date-fns: 2.x + dependencies: + date-fns: 2.30.0 + dev: true + + /date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + dependencies: + '@babel/runtime': 7.26.0 + dev: true + + /dateformat@3.0.3: + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + dev: true + + /dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + dev: false + + /de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + dev: true + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + /decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + dev: true + + /deep-equal@1.1.2: + resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==} + engines: {node: '>= 0.4'} + dependencies: + is-arguments: 1.1.1 + is-date-object: 1.0.5 + is-regex: 1.1.4 + object-is: 1.1.6 + object-keys: 1.1.1 + regexp.prototype.flags: 1.5.3 + dev: false + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: true + + /default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + dev: true + + /default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + dev: true + + /default-passive-events@2.0.0: + resolution: {integrity: sha512-eMtt76GpDVngZQ3ocgvRcNCklUMwID1PaNbCNxfpDXuiOXttSh0HzBbda1HU9SIUsDc02vb7g9+3I5tlqe/qMQ==} + dev: false + + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true + + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: true + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + /define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 0.1.7 + dev: true + + /define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.3 + dev: true + + /define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.3 + isobject: 3.0.1 + dev: true + + /defined@1.0.1: + resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} + dev: false + + /defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + dev: true + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /destr@2.0.3: + resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + dev: true + + /detect-browser@5.3.0: + resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} + dev: false + + /detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: true + + /detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dom-serializer@0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 + dev: true + + /dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + dev: true + + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: true + + /domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + dev: true + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domhandler@2.4.2: + resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} + dependencies: + domelementtype: 1.3.1 + dev: true + + /domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils@1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + dependencies: + dom-serializer: 0.2.2 + domelementtype: 1.3.1 + dev: true + + /domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dev: true + + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: true + + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + dev: true + + /dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: true + + /dotenv-expand@8.0.3: + resolution: {integrity: sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==} + engines: {node: '>=12'} + dev: true + + /dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + dev: true + + /dotgitignore@2.1.0: + resolution: {integrity: sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==} + engines: {node: '>=6'} + dependencies: + find-up: 3.0.0 + minimatch: 3.1.2 + dev: true + + /dotignore@0.1.2: + resolution: {integrity: sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==} + hasBin: true + dependencies: + minimatch: 3.1.2 + dev: false + + /duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true + + /echarts@5.5.1: + resolution: {integrity: sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==} + dependencies: + tslib: 2.3.0 + zrender: 5.6.0 + dev: false + + /ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + jake: 10.9.2 + dev: true + + /electron-to-chromium@1.5.52: + resolution: {integrity: sha512-xtoijJTZ+qeucLBDNztDOuQBE1ksqjvNjvqFoST3nGC7fSpqJ+X6BdTBaY5BHG+IhWWmpc6b/KfpeuEDupEPOQ==} + dev: true + + /element-plus@2.7.6(vue@3.5.5): + resolution: {integrity: sha512-36sw1K23hYjgeooR10U6CiCaCp2wvOqwoFurADZVlekeQ9v5U1FhJCFGEXO6i/kZBBMwsE1c9fxjLs9LENw2Rg==} + peerDependencies: + vue: ^3.2.0 + dependencies: + '@ctrl/tinycolor': 3.6.1 + '@element-plus/icons-vue': 2.3.1(vue@3.5.5) + '@floating-ui/dom': 1.6.12 + '@popperjs/core': /@sxzz/popperjs-es@2.11.7 + '@types/lodash': 4.17.13 + '@types/lodash-es': 4.17.12 + '@vueuse/core': 9.13.0(vue@3.5.5) + async-validator: 4.2.5 + dayjs: 1.11.13 + escape-html: 1.0.3 + lodash: 4.17.21 + lodash-es: 4.17.21 + lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21) + memoize-one: 6.0.0 + normalize-wheel-es: 1.2.0 + vue: 3.5.5(typescript@5.5.2) + transitivePeerDependencies: + - '@vue/composition-api' + dev: false + + /emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + dev: true + + /entities@1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + dev: true + + /entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + dev: true + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + /env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: true + + /environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /error-stack-parser-es@0.1.5: + resolution: {integrity: sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==} + dev: true + + /es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.2 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.3 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + /es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + + /es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + /esbuild-code-inspector-plugin@0.16.1: + resolution: {integrity: sha512-BgewNP7lWxkTW7snW0tr/L9wRECH3EqvCqxrCVpiCVbAOn9R468URhTXUi3sMZwbuk0D87VpUmLugOjbL4THtg==} + dependencies: + code-inspector-core: 0.16.1 + transitivePeerDependencies: + - supports-color + dev: true + + /esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + dev: true + + /esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + dev: true + + /escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + dev: true + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: true + + /eslint-config-prettier@9.1.0(eslint@8.57.0): + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.57.0 + dev: true + + /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.3.3): + resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.57.0 + eslint-config-prettier: 9.1.0(eslint@8.57.0) + prettier: 3.3.3 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.8 + dev: true + + /eslint-plugin-vue@9.26.0(eslint@8.57.0): + resolution: {integrity: sha512-eTvlxXgd4ijE1cdur850G6KalZqk65k1JKoOI2d1kT3hr8sPD07j1q98FRFdNnpxBELGPWxZmInxeHGF/GxtqQ==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.0) + eslint: 8.57.0 + globals: 13.24.0 + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.1.2 + semver: 7.6.3 + vue-eslint-parser: 9.4.3(eslint@8.57.0) + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.0) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.7 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 3.4.3 + dev: true + + /esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /estree-walker@1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.6 + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: true + + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: false + + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: true + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: false + + /evtd@0.2.4: + resolution: {integrity: sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==} + dev: true + + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: true + + /expand-brackets@2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: true + + /extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + dev: true + + /extglob@2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fast-unique-numbers@8.0.13: + resolution: {integrity: sha512-7OnTFAVPefgw2eBJ1xj2PGGR9FwYzSUso9decayHgCDX4sJkHLdcsYTytTg+tYv+wKF3U8gJuSBz2jJpQV4u/g==} + engines: {node: '>=16.1.0'} + dependencies: + '@babel/runtime': 7.26.0 + tslib: 2.8.1 + dev: false + + /fast-uri@3.0.3: + resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} + dev: true + + /fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + dev: true + + /fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + dependencies: + reusify: 1.0.4 + dev: true + + /fdir@6.4.2(picomatch@4.0.2): + resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + dependencies: + picomatch: 4.0.2 + dev: true + + /fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + dev: false + + /figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + dev: true + + /file-entry-cache@9.1.0: + resolution: {integrity: sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==} + engines: {node: '>=18'} + dependencies: + flat-cache: 5.0.0 + dev: true + + /filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + dependencies: + minimatch: 5.1.6 + dev: true + + /fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + dev: true + + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + dependencies: + locate-path: 2.0.0 + dev: true + + /find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + dependencies: + locate-path: 3.0.0 + dev: true + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 + dev: true + + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flat-cache@5.0.0: + resolution: {integrity: sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==} + engines: {node: '>=18'} + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + dev: true + + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + dev: true + + /fmin@0.0.2: + resolution: {integrity: sha512-sSi6DzInhl9d8yqssDfGZejChO8d2bAGIpysPsvYsxFe898z89XhCZg6CPNV3nhUhFefeC/AXZK2bAJxlBjN6A==} + dependencies: + contour_plot: 0.0.1 + json2module: 0.0.3 + rollup: 0.25.8 + tape: 4.17.0 + uglify-js: 2.8.29 + dev: false + + /follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + + /for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + dev: true + + /form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: true + + /fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + dependencies: + map-cache: 0.2.2 + dev: true + + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: true + + /fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + functions-have-names: 1.2.3 + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-east-asian-width@1.3.0: + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + engines: {node: '>=18'} + dev: true + + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + /get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + dev: true + + /get-pkg-repo@4.2.1: + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} + hasBin: true + dependencies: + '@hutson/parse-repository-url': 3.0.2 + hosted-git-info: 4.1.0 + through2: 2.0.5 + yargs: 16.2.0 + dev: true + + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true + + /get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + + /get-tsconfig@4.8.1: + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + + /get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + dev: true + + /git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /git-raw-commits@4.0.0: + resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} + engines: {node: '>=16'} + hasBin: true + dependencies: + dargs: 8.1.0 + meow: 12.1.1 + split2: 4.2.0 + dev: true + + /git-remote-origin-url@2.0.0: + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} + dependencies: + gitconfiglocal: 1.0.0 + pify: 2.3.0 + dev: true + + /git-semver-tags@4.1.1: + resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + meow: 8.1.2 + semver: 6.3.1 + dev: true + + /gitconfiglocal@1.0.0: + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + dependencies: + ini: 1.3.8 + dev: true + + /gl-matrix@3.4.3: + resolution: {integrity: sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + dependencies: + ini: 4.1.1 + dev: true + + /global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + dependencies: + global-prefix: 3.0.0 + dev: true + + /global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + gopd: 1.0.1 + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globjoin@0.1.4: + resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.4 + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + dependencies: + duplexer: 0.1.2 + dev: true + + /handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + dev: true + + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + /has-flag@1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.0 + + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + + /has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + dev: true + + /has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + dev: true + + /has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + dev: true + + /has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + dev: true + + /has@1.0.4: + resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} + engines: {node: '>= 0.4.0'} + dev: false + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + dev: false + + /highlight.js@11.10.0: + resolution: {integrity: sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==} + engines: {node: '>=12.0.0'} + + /hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + dev: true + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /html-minifier-terser@6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 8.3.0 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.36.0 + dev: true + + /html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + dev: true + + /htmlparser2@3.10.1: + resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} + dependencies: + domelementtype: 1.3.1 + domhandler: 2.4.2 + domutils: 1.7.0 + entities: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + dev: true + + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: true + + /husky@9.0.11: + resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} + engines: {node: '>=18'} + hasBin: true + dev: true + + /idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + dev: true + + /image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dev: true + + /immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + dev: true + + /importx@0.4.4: + resolution: {integrity: sha512-Lo1pukzAREqrBnnHC+tj+lreMTAvyxtkKsMxLY8H15M/bvLl54p3YuoTI70Tz7Il0AsgSlD7Lrk/FaApRcBL7w==} + dependencies: + bundle-require: 5.0.0(esbuild@0.23.1) + debug: 4.3.7 + esbuild: 0.23.1 + jiti: 2.0.0-beta.3 + jiti-v1: /jiti@1.21.6 + pathe: 1.1.2 + tsx: 4.19.2 + transitivePeerDependencies: + - supports-color + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + + /is-accessor-descriptor@1.0.1: + resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} + engines: {node: '>= 0.10'} + dependencies: + hasown: 2.0.2 + dev: true + + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: false + + /is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.3.0 + dev: true + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + /is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + /is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + + /is-data-descriptor@1.0.1: + resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + dev: true + + /is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + dependencies: + is-typed-array: 1.1.13 + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + + /is-descriptor@0.1.7: + resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} + engines: {node: '>= 0.4'} + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + dev: true + + /is-descriptor@1.0.3: + resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} + engines: {node: '>= 0.4'} + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + dev: true + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: true + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: true + + /is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + dependencies: + is-plain-object: 2.0.4 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + dependencies: + get-east-asian-width: 1.3.0 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: true + + /is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + dev: true + + /is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + + /is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: true + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + /is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + dev: true + + /is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + + /is-text-path@1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + dependencies: + text-extensions: 1.9.0 + dev: true + + /is-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} + dependencies: + text-extensions: 2.4.0 + dev: true + + /is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.15 + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.7 + + /is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + dev: true + + /is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + + /is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + dependencies: + is-inside-container: 1.0.0 + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + dependencies: + isarray: 1.0.0 + dev: true + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + + /jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + dev: true + + /jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + dev: true + + /jiti@2.0.0-beta.3: + resolution: {integrity: sha512-pmfRbVRs/7khFrSAYnSiJ8C0D5GvzkE4Ey2pAvUcJsw1ly/p+7ut27jbJrjY79BpAJQJ4gXYFtK6d1Aub+9baQ==} + hasBin: true + dev: true + + /js-base64@2.6.4: + resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} + dev: true + + /js-sdsl@4.3.0: + resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /js-tokens@9.0.0: + resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + dev: true + + /jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: true + + /json2module@0.0.3: + resolution: {integrity: sha512-qYGxqrRrt4GbB8IEOy1jJGypkNsjWoIMlZt4bAsmUScCA507Hbc2p1JOhBzqn45u3PWafUgH2OnzyNU7udO/GA==} + hasBin: true + dependencies: + rw: 1.3.3 + dev: false + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: true + + /jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + dev: true + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + + /kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of@5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} + dev: true + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /known-css-properties@0.34.0: + resolution: {integrity: sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==} + dev: true + + /kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + dev: true + + /lazy-cache@1.0.4: + resolution: {integrity: sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==} + engines: {node: '>=0.10.0'} + dev: false + + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /lint-staged@15.2.10: + resolution: {integrity: sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==} + engines: {node: '>=18.12.0'} + hasBin: true + dependencies: + chalk: 5.3.0 + commander: 12.1.0 + debug: 4.3.7 + execa: 8.0.1 + lilconfig: 3.1.2 + listr2: 8.2.5 + micromatch: 4.0.8 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.5.1 + transitivePeerDependencies: + - supports-color + dev: true + + /listr2@8.2.5: + resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} + engines: {node: '>=18.0.0'} + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 + dev: true + + /load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + + /load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /loader-utils@1.4.2: + resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} + engines: {node: '>=4.0.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 1.0.2 + dev: true + + /local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + dependencies: + mlly: 1.7.2 + pkg-types: 1.2.1 + dev: true + + /locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-locate: 6.0.0 + dev: true + + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + /lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21): + resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==} + peerDependencies: + '@types/lodash-es': '*' + lodash: '*' + lodash-es: '*' + dependencies: + '@types/lodash-es': 4.17.12 + lodash: 4.17.21 + lodash-es: 4.17.21 + dev: false + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true + + /lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: true + + /lodash.ismatch@4.4.0: + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + dev: true + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: true + + /lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + dev: true + + /lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + dev: true + + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: true + + /lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + dev: true + + /lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + dev: true + + /lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: true + + /lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + dependencies: + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + dev: true + + /longest@1.0.1: + resolution: {integrity: sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==} + engines: {node: '>=0.10.0'} + dev: false + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.8.1 + dev: true + + /lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + dev: false + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /magic-string@0.26.7: + resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} + engines: {node: '>=12'} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /magic-string@0.30.12: + resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + /map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + dependencies: + object-visit: 1.0.1 + dev: true + + /mathml-tag-names@2.1.3: + resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} + dev: true + + /md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + dev: false + + /mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + dev: true + + /mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + dev: true + + /mdn-data@2.12.1: + resolution: {integrity: sha512-rsfnCbOHjqrhWxwt5/wtSLzpoKTzW7OXdT5lLOIH1OTYhWu9rRJveGq0sKvDZODABH7RX+uoR+DYcpFnq4Tf6Q==} + dev: true + + /mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + dev: true + + /memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + dev: false + + /meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + dev: true + + /meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} + dev: true + + /meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /merge-options@1.0.1: + resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==} + engines: {node: '>=4'} + dependencies: + is-plain-obj: 1.1.0 + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch@3.1.0: + resolution: {integrity: sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 1.0.0 + extend-shallow: 2.0.1 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 5.1.0 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + dev: true + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + /mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + dev: true + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /mlly@1.7.2: + resolution: {integrity: sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==} + dependencies: + acorn: 8.14.0 + pathe: 1.1.2 + pkg-types: 1.2.1 + ufo: 1.5.4 + dev: true + + /mock-property@1.0.3: + resolution: {integrity: sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + functions-have-names: 1.2.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + hasown: 2.0.2 + isarray: 2.0.5 + dev: false + + /modify-values@1.0.1: + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} + dev: true + + /mqtt-packet@9.0.0: + resolution: {integrity: sha512-8v+HkX+fwbodsWAZIZTI074XIoxVBOmPeggQuDFCGg1SqNcC+uoRMWu7J6QlJPqIUIJXmjNYYHxBBLr1Y/Df4w==} + dependencies: + bl: 6.0.16 + debug: 4.3.7 + process-nextick-args: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /mqtt@5.10.1: + resolution: {integrity: sha512-hXCOki8sANoQ7w+2OzJzg6qMBxTtrH9RlnVNV8panLZgnl+Gh0J/t4k6r8Az8+C7y3KAcyXtn0mmLixyUom8Sw==} + engines: {node: '>=16.0.0'} + hasBin: true + dependencies: + '@types/readable-stream': 4.0.18 + '@types/ws': 8.5.13 + commist: 3.2.0 + concat-stream: 2.0.0 + debug: 4.3.7 + help-me: 5.0.0 + lru-cache: 10.4.3 + minimist: 1.2.8 + mqtt-packet: 9.0.0 + number-allocator: 1.0.14 + readable-stream: 4.5.2 + reinterval: 1.1.0 + rfdc: 1.4.1 + split2: 4.2.0 + worker-timers: 7.1.8 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /mrmime@2.0.0: + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + engines: {node: '>=10'} + dev: true + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + dev: true + + /naive-ui@2.39.0(vue@3.5.5): + resolution: {integrity: sha512-5oUJzRG+rtLSH8eRU+fJvVYiQids2BxF9jp+fwGoAqHOptEINrBlgBu9uy+95RHE5FLJ7Q/z41o+qkoGnUrKxQ==} + peerDependencies: + vue: ^3.0.0 + dependencies: + '@css-render/plugin-bem': 0.15.14(css-render@0.15.14) + '@css-render/vue3-ssr': 0.15.14(vue@3.5.5) + '@types/katex': 0.16.7 + '@types/lodash': 4.17.13 + '@types/lodash-es': 4.17.12 + async-validator: 4.2.5 + css-render: 0.15.14 + csstype: 3.1.3 + date-fns: 2.30.0 + date-fns-tz: 2.0.1(date-fns@2.30.0) + evtd: 0.2.4 + highlight.js: 11.10.0 + lodash: 4.17.21 + lodash-es: 4.17.21 + seemly: 0.3.9 + treemate: 0.3.11 + vdirs: 0.1.8(vue@3.5.5) + vooks: 0.2.12(vue@3.5.5) + vue: 3.5.5(typescript@5.5.2) + vueuc: 0.4.64(vue@3.5.5) + dev: true + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /nanomatch@1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + dev: true + + /node-fetch-native@1.6.4: + resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + dev: true + + /node-html-parser@5.4.2: + resolution: {integrity: sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==} + dependencies: + css-select: 4.3.0 + he: 1.2.0 + dev: true + + /node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + dev: true + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.15.1 + semver: 7.6.3 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-wheel-es@1.2.0: + resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==} + dev: false + + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + dev: false + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + + /number-allocator@1.0.14: + resolution: {integrity: sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==} + dependencies: + debug: 4.3.7 + js-sdsl: 4.3.0 + transitivePeerDependencies: + - supports-color + dev: false + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + dev: true + + /object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: false + + /object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + + /object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + dev: false + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + /object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + /object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /ofetch@1.4.1: + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + dependencies: + destr: 2.0.3 + node-fetch-native: 1.6.4 + ufo: 1.5.4 + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + dependencies: + mimic-function: 5.0.1 + dev: true + + /open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + dev: true + + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + + /optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + dev: true + + /p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + dependencies: + p-try: 1.0.0 + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.1.1 + dev: true + + /p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + dependencies: + p-limit: 1.3.0 + dev: true + + /p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-limit: 4.0.0 + dev: true + + /p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /package-manager-detector@0.2.2: + resolution: {integrity: sha512-VgXbyrSNsml4eHWIvxxG/nTL4wgybMTXCV2Un/+yEc3aDKKU6nQBZjbeP3Pl3qm9Qg92X/1ng4ffvCeD/zwHgg==} + dev: true + + /param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + dev: true + + /pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + dev: true + + /path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: true + + /path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathe@0.2.0: + resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} + dev: true + + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + dev: true + + /pdfast@0.2.0: + resolution: {integrity: sha512-cq6TTu6qKSFUHwEahi68k/kqN2mfepjkGrG9Un70cgdRRKLKY6Rf8P8uvP2NvZktaQZNF3YE7agEkLj0vGK9bA==} + dev: false + + /perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + dev: true + + /picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + dev: true + + /pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: true + + /pinia-plugin-persistedstate@3.2.1(pinia@2.2.2): + resolution: {integrity: sha512-MK++8LRUsGF7r45PjBFES82ISnPzyO6IZx3CH5vyPseFLZCk1g2kgx6l/nW8pEBKxxd4do0P6bJw+mUSZIEZUQ==} + peerDependencies: + pinia: ^2.0.0 + dependencies: + pinia: 2.2.2(typescript@5.5.2)(vue@3.5.5) + dev: false + + /pinia@2.2.2(typescript@5.5.2)(vue@3.5.5): + resolution: {integrity: sha512-ja2XqFWZC36mupU4z1ZzxeTApV7DOw44cV4dhQ9sGwun+N89v/XP7+j7q6TanS1u1tdbK4r+1BUx7heMaIdagA==} + peerDependencies: + '@vue/composition-api': ^1.4.0 + typescript: '>=4.4.4' + vue: ^2.6.14 || ^3.3.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + typescript: + optional: true + dependencies: + '@vue/devtools-api': 6.6.4 + typescript: 5.5.2 + vue: 3.5.5(typescript@5.5.2) + vue-demi: 0.14.10(vue@3.5.5) + dev: false + + /pkg-types@1.2.1: + resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} + dependencies: + confbox: 0.1.8 + mlly: 1.7.2 + pathe: 1.1.2 + dev: true + + /portfinder@1.0.32: + resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} + engines: {node: '>= 0.12.0'} + dependencies: + async: 2.6.4 + debug: 3.2.7 + mkdirp: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + /posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + dev: true + + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + /postcss-html@1.7.0: + resolution: {integrity: sha512-MfcMpSUIaR/nNgeVS8AyvyDugXlADjN9AcV7e5rDfrF1wduIAGSkL4q2+wgrZgA3sHVAHLDO9FuauHhZYW2nBw==} + engines: {node: ^12 || >=14} + dependencies: + htmlparser2: 8.0.2 + js-tokens: 9.0.0 + postcss: 8.4.45 + postcss-safe-parser: 6.0.0(postcss@8.4.45) + dev: true + + /postcss-media-query-parser@0.2.3: + resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} + dev: true + + /postcss-prefix-selector@1.16.1(postcss@5.2.18): + resolution: {integrity: sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==} + peerDependencies: + postcss: '>4 <9' + dependencies: + postcss: 5.2.18 + dev: true + + /postcss-resolve-nested-selector@0.1.6: + resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} + dev: true + + /postcss-safe-parser@6.0.0(postcss@8.4.45): + resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.3.3 + dependencies: + postcss: 8.4.45 + dev: true + + /postcss-safe-parser@7.0.1(postcss@8.4.45): + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.45 + dev: true + + /postcss-scss@4.0.9(postcss@8.4.45): + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.4.29 + dependencies: + postcss: 8.4.45 + dev: true + + /postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-sorting@8.0.2(postcss@8.4.45): + resolution: {integrity: sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==} + peerDependencies: + postcss: ^8.4.20 + dependencies: + postcss: 8.4.45 + dev: true + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + + /postcss@5.2.18: + resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==} + engines: {node: '>=0.12'} + dependencies: + chalk: 1.1.3 + js-base64: 2.6.4 + source-map: 0.5.7 + supports-color: 3.2.3 + dev: true + + /postcss@8.4.45: + resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + /postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.1 + source-map-js: 1.2.1 + dev: true + + /posthtml-parser@0.2.1: + resolution: {integrity: sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==} + dependencies: + htmlparser2: 3.10.1 + isobject: 2.1.0 + dev: true + + /posthtml-rename-id@1.0.12: + resolution: {integrity: sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /posthtml-render@1.4.0: + resolution: {integrity: sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==} + engines: {node: '>=10'} + dev: true + + /posthtml-svg-mode@1.0.3: + resolution: {integrity: sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==} + dependencies: + merge-options: 1.0.1 + posthtml: 0.9.2 + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + dev: true + + /posthtml@0.9.2: + resolution: {integrity: sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==} + engines: {node: '>=0.10.0'} + dependencies: + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: true + + /prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + dev: true + + /pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} + dev: true + + /print-js@1.6.0: + resolution: {integrity: sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg==} + dev: false + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + + /q@1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + deprecated: |- + You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. + + (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) + dev: true + + /qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.6 + dev: false + + /query-string@4.3.4: + resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==} + engines: {node: '>=0.10.0'} + dependencies: + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /read-pkg-up@3.0.0: + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} + dependencies: + find-up: 2.1.0 + read-pkg: 3.0.0 + dev: true + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + /readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /regenerate-unicode-properties@10.2.0: + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: true + + /regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: true + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + /regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + dependencies: + '@babel/runtime': 7.26.0 + dev: true + + /regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + dev: true + + /regexp.prototype.flags@1.5.3: + resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + + /regexpu-core@6.1.1: + resolution: {integrity: sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.0 + regjsgen: 0.8.0 + regjsparser: 0.11.2 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.0 + dev: true + + /regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + dev: true + + /regjsparser@0.11.2: + resolution: {integrity: sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==} + hasBin: true + dependencies: + jsesc: 3.0.2 + dev: true + + /reinterval@1.1.0: + resolution: {integrity: sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==} + dev: false + + /relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + dev: true + + /repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + dev: true + + /repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + + /resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + dev: true + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.15.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + dev: true + + /ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + /right-align@0.1.3: + resolution: {integrity: sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==} + engines: {node: '>=0.10.0'} + dependencies: + align-text: 0.1.4 + dev: false + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup-plugin-visualizer@5.12.0(rollup@2.79.2): + resolution: {integrity: sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rollup: + optional: true + dependencies: + open: 8.4.2 + picomatch: 2.3.1 + rollup: 2.79.2 + source-map: 0.7.4 + yargs: 17.7.2 + dev: true + + /rollup@0.25.8: + resolution: {integrity: sha512-a2S4Bh3bgrdO4BhKr2E4nZkjTvrJ2m2bWjMTzVYtoqSCn0HnuxosXnaJUHrMEziOWr3CzL9GjilQQKcyCQpJoA==} + hasBin: true + dependencies: + chalk: 1.1.3 + minimist: 1.2.8 + source-map-support: 0.3.3 + dev: false + + /rollup@2.79.2: + resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /rollup@4.24.4: + resolution: {integrity: sha512-vGorVWIsWfX3xbcyAS+I047kFKapHYivmkaT63Smj77XwvLSJos6M1xGqZnBPFQFBRZDOcG1QnYEIxAvTr/HjA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.24.4 + '@rollup/rollup-android-arm64': 4.24.4 + '@rollup/rollup-darwin-arm64': 4.24.4 + '@rollup/rollup-darwin-x64': 4.24.4 + '@rollup/rollup-freebsd-arm64': 4.24.4 + '@rollup/rollup-freebsd-x64': 4.24.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.24.4 + '@rollup/rollup-linux-arm-musleabihf': 4.24.4 + '@rollup/rollup-linux-arm64-gnu': 4.24.4 + '@rollup/rollup-linux-arm64-musl': 4.24.4 + '@rollup/rollup-linux-powerpc64le-gnu': 4.24.4 + '@rollup/rollup-linux-riscv64-gnu': 4.24.4 + '@rollup/rollup-linux-s390x-gnu': 4.24.4 + '@rollup/rollup-linux-x64-gnu': 4.24.4 + '@rollup/rollup-linux-x64-musl': 4.24.4 + '@rollup/rollup-win32-arm64-msvc': 4.24.4 + '@rollup/rollup-win32-ia32-msvc': 4.24.4 + '@rollup/rollup-win32-x64-msvc': 4.24.4 + fsevents: 2.3.3 + dev: true + + /run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + dev: false + + /safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + + /safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + dependencies: + ret: 0.1.15 + dev: true + + /sass@1.78.0: + resolution: {integrity: sha512-AaIqGSrjo5lA2Yg7RvFZrlXDBCp3nV4XP73GrLGvdRWWwk+8H3l0SDvq/5bA4eF+0RFPLuWUk3E+P1U/YqnpsQ==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + chokidar: 3.6.0 + immutable: 4.3.7 + source-map-js: 1.2.1 + dev: true + + /screenfull@6.0.2: + resolution: {integrity: sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==} + engines: {node: ^14.13.1 || >=16.0.0} + dev: false + + /scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + dev: true + + /seemly@0.3.9: + resolution: {integrity: sha512-bMLcaEqhIViiPbaumjLN8t1y+JpD/N8SiyYOyp0i0W6RgdyLWboIsUWAbZojF//JyerxPZR5Tgda+x3Pdne75A==} + dev: true + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + dependencies: + randombytes: 2.1.0 + dev: true + + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + /set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + + /sirv@2.0.4: + resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} + engines: {node: '>= 10'} + dependencies: + '@polka/url': 1.0.0-next.28 + mrmime: 2.0.0 + totalist: 3.0.1 + dev: true + + /size-sensor@1.0.2: + resolution: {integrity: sha512-2NCmWxY7A9pYKGXNBfteo4hy14gWu47rg5692peVMst6lQLPKrVjhY+UTEsPI5ceFRJSl3gVgMYaUi/hKuaiKw==} + dev: false + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + dev: true + + /sm-crypto@0.3.13: + resolution: {integrity: sha512-ztNF+pZq6viCPMA1A6KKu3bgpkmYti5avykRHbcFIdSipFdkVmfUw2CnpM2kBJyppIalqvczLNM3wR8OQ0pT5w==} + dependencies: + jsbn: 1.1.0 + dev: true + + /smob@1.5.0: + resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + dev: true + + /snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + dev: true + + /snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /snapdragon@0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /sortablejs@1.15.3: + resolution: {integrity: sha512-zdK3/kwwAK1cJgy1rwl1YtNTbRmc8qW/+vgXf75A7NHag5of4pyI6uK86ktmQETyWRH7IGaE73uZOOBcGxgqZg==} + dev: false + + /source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + /source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + dev: true + + /source-map-support@0.3.3: + resolution: {integrity: sha512-9O4+y9n64RewmFoKUZ/5Tx9IHIcXM6Q+RTSw6ehnqybUz4a7iwR3Eaw80uLtqqQ5D0C+5H03D4KKGo9PdP33Gg==} + dependencies: + source-map: 0.1.32 + dev: false + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + dev: true + + /source-map@0.1.32: + resolution: {integrity: sha512-htQyLrrRLkQ87Zfrir4/yN+vAUd6DNjVayEjTSHXu29AYQJw57I4/xEL/M6p6E/woPNJwvZt6rVlzc7gFEJccQ==} + engines: {node: '>=0.8.0'} + dependencies: + amdefine: 1.0.1 + dev: false + + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true + + /source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + dependencies: + whatwg-url: 7.1.0 + dev: true + + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: true + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.20 + dev: true + + /spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.20 + dev: true + + /spdx-license-ids@3.0.20: + resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} + dev: true + + /speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + dev: true + + /split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + dev: true + + /split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + dependencies: + readable-stream: 3.6.2 + dev: true + + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + /split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + dependencies: + through: 2.3.8 + dev: true + + /stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + dev: true + + /standard-version@9.5.0: + resolution: {integrity: sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==} + engines: {node: '>=10'} + hasBin: true + dependencies: + chalk: 2.4.2 + conventional-changelog: 3.1.25 + conventional-changelog-config-spec: 2.1.0 + conventional-changelog-conventionalcommits: 4.6.3 + conventional-recommended-bump: 6.1.0 + detect-indent: 6.1.0 + detect-newline: 3.1.0 + dotgitignore: 2.1.0 + figures: 3.2.0 + find-up: 5.0.0 + git-semver-tags: 4.1.1 + semver: 7.6.3 + stringify-package: 1.0.1 + yargs: 16.2.0 + dev: true + + /static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + dev: true + + /strict-uri-encode@1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: '>=0.10.0'} + dev: true + + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.0 + dev: true + + /string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.3 + set-function-name: 2.0.2 + side-channel: 1.0.6 + dev: true + + /string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + /string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + + /stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + dev: true + + /stringify-package@1.0.1: + resolution: {integrity: sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==} + deprecated: This module is not used anymore, and has been replaced by @npmcli/package-json + dev: true + + /strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.1.0 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-comments@2.0.1: + resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} + engines: {node: '>=10'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /strip-literal@2.1.0: + resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + dependencies: + js-tokens: 9.0.0 + dev: true + + /stylelint-config-html@1.1.0(postcss-html@1.7.0)(stylelint@16.9.0): + resolution: {integrity: sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==} + engines: {node: ^12 || >=14} + peerDependencies: + postcss-html: ^1.0.0 + stylelint: '>=14.0.0' + dependencies: + postcss-html: 1.7.0 + stylelint: 16.9.0(typescript@5.5.2) + dev: true + + /stylelint-config-recess-order@5.1.0(stylelint@16.9.0): + resolution: {integrity: sha512-ddapCF6B/kEtQYIFhQFReQ0dvK1ZdgJDM/SGFtIyeooYDbqaJqcOlGkRRGaVErCQYJY/bPSPsLRS2LdQtLJUVQ==} + peerDependencies: + stylelint: '>=16' + dependencies: + stylelint: 16.9.0(typescript@5.5.2) + stylelint-order: 6.0.4(stylelint@16.9.0) + dev: true + + /stylelint-config-recommended-scss@14.1.0(postcss@8.4.45)(stylelint@16.9.0): + resolution: {integrity: sha512-bhaMhh1u5dQqSsf6ri2GVWWQW5iUjBYgcHkh7SgDDn92ijoItC/cfO/W+fpXshgTQWhwFkP1rVcewcv4jaftRg==} + engines: {node: '>=18.12.0'} + peerDependencies: + postcss: ^8.3.3 + stylelint: ^16.6.1 + peerDependenciesMeta: + postcss: + optional: true + dependencies: + postcss: 8.4.45 + postcss-scss: 4.0.9(postcss@8.4.45) + stylelint: 16.9.0(typescript@5.5.2) + stylelint-config-recommended: 14.0.1(stylelint@16.9.0) + stylelint-scss: 6.8.1(stylelint@16.9.0) + dev: true + + /stylelint-config-recommended-vue@1.5.0(postcss-html@1.7.0)(stylelint@16.9.0): + resolution: {integrity: sha512-65TAK/clUqkNtkZLcuytoxU0URQYlml+30Nhop7sRkCZ/mtWdXt7T+spPSB3KMKlb+82aEVJ4OrcstyDBdbosg==} + engines: {node: ^12 || >=14} + peerDependencies: + postcss-html: ^1.0.0 + stylelint: '>=14.0.0' + dependencies: + postcss-html: 1.7.0 + semver: 7.6.3 + stylelint: 16.9.0(typescript@5.5.2) + stylelint-config-html: 1.1.0(postcss-html@1.7.0)(stylelint@16.9.0) + stylelint-config-recommended: 14.0.1(stylelint@16.9.0) + dev: true + + /stylelint-config-recommended@14.0.1(stylelint@16.9.0): + resolution: {integrity: sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.1.0 + dependencies: + stylelint: 16.9.0(typescript@5.5.2) + dev: true + + /stylelint-config-standard-scss@13.1.0(postcss@8.4.45)(stylelint@16.9.0): + resolution: {integrity: sha512-Eo5w7/XvwGHWkeGLtdm2FZLOMYoZl1omP2/jgFCXyl2x5yNz7/8vv4Tj6slHvMSSUNTaGoam/GAZ0ZhukvalfA==} + engines: {node: '>=18.12.0'} + peerDependencies: + postcss: ^8.3.3 + stylelint: ^16.3.1 + peerDependenciesMeta: + postcss: + optional: true + dependencies: + postcss: 8.4.45 + stylelint: 16.9.0(typescript@5.5.2) + stylelint-config-recommended-scss: 14.1.0(postcss@8.4.45)(stylelint@16.9.0) + stylelint-config-standard: 36.0.1(stylelint@16.9.0) + dev: true + + /stylelint-config-standard@36.0.1(stylelint@16.9.0): + resolution: {integrity: sha512-8aX8mTzJ6cuO8mmD5yon61CWuIM4UD8Q5aBcWKGSf6kg+EC3uhB+iOywpTK4ca6ZL7B49en8yanOFtUW0qNzyw==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.1.0 + dependencies: + stylelint: 16.9.0(typescript@5.5.2) + stylelint-config-recommended: 14.0.1(stylelint@16.9.0) + dev: true + + /stylelint-order@6.0.4(stylelint@16.9.0): + resolution: {integrity: sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==} + peerDependencies: + stylelint: ^14.0.0 || ^15.0.0 || ^16.0.1 + dependencies: + postcss: 8.4.45 + postcss-sorting: 8.0.2(postcss@8.4.45) + stylelint: 16.9.0(typescript@5.5.2) + dev: true + + /stylelint-scss@6.8.1(stylelint@16.9.0): + resolution: {integrity: sha512-al+5eRb72bKrFyVAY+CLWKUMX+k+wsDCgyooSfhISJA2exqnJq1PX1iIIpdrvhu3GtJgNJZl9/BIW6EVSMCxdg==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.0.2 + dependencies: + css-tree: 3.0.1 + is-plain-object: 5.0.0 + known-css-properties: 0.34.0 + mdn-data: 2.12.2 + postcss-media-query-parser: 0.2.3 + postcss-resolve-nested-selector: 0.1.6 + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + stylelint: 16.9.0(typescript@5.5.2) + dev: true + + /stylelint@16.9.0(typescript@5.5.2): + resolution: {integrity: sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==} + engines: {node: '>=18.12.0'} + hasBin: true + dependencies: + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 + '@csstools/media-query-list-parser': 3.0.1(@csstools/css-parser-algorithms@3.0.4)(@csstools/css-tokenizer@3.0.3) + '@csstools/selector-specificity': 4.0.0(postcss-selector-parser@6.1.2) + '@dual-bundle/import-meta-resolve': 4.1.0 + balanced-match: 2.0.0 + colord: 2.9.3 + cosmiconfig: 9.0.0(typescript@5.5.2) + css-functions-list: 3.2.3 + css-tree: 2.3.1 + debug: 4.3.7 + fast-glob: 3.3.2 + fastest-levenshtein: 1.0.16 + file-entry-cache: 9.1.0 + global-modules: 2.0.0 + globby: 11.1.0 + globjoin: 0.1.4 + html-tags: 3.3.1 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-plain-object: 5.0.0 + known-css-properties: 0.34.0 + mathml-tag-names: 2.1.3 + meow: 13.2.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + picocolors: 1.1.1 + postcss: 8.4.45 + postcss-resolve-nested-selector: 0.1.6 + postcss-safe-parser: 7.0.1(postcss@8.4.45) + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + resolve-from: 5.0.0 + string-width: 4.2.3 + strip-ansi: 7.1.0 + supports-hyperlinks: 3.1.0 + svg-tags: 1.0.0 + table: 6.8.2 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /superjson@2.2.1: + resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} + engines: {node: '>=16'} + dependencies: + copy-anything: 3.0.5 + dev: true + + /supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + + /supports-color@3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} + dependencies: + has-flag: 1.0.0 + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-hyperlinks@3.1.0: + resolution: {integrity: sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==} + engines: {node: '>=14.18'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /svg-baker@1.7.0: + resolution: {integrity: sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==} + dependencies: + bluebird: 3.7.2 + clone: 2.1.2 + he: 1.2.0 + image-size: 0.5.5 + loader-utils: 1.4.2 + merge-options: 1.0.1 + micromatch: 3.1.0 + postcss: 5.2.18 + postcss-prefix-selector: 1.16.1(postcss@5.2.18) + posthtml-rename-id: 1.0.12 + posthtml-svg-mode: 1.0.3 + query-string: 4.3.4 + traverse: 0.6.10 + transitivePeerDependencies: + - supports-color + dev: true + + /svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + dev: true + + /svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.1.1 + stable: 0.1.8 + dev: true + + /synckit@0.8.8: + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.8.1 + dev: true + + /table@6.8.2: + resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} + engines: {node: '>=10.0.0'} + dependencies: + ajv: 8.17.1 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /tape@4.17.0: + resolution: {integrity: sha512-KCuXjYxCZ3ru40dmND+oCLsXyuA8hoseu2SS404Px5ouyS0A99v8X/mdiLqsR5MTAyamMBN7PRwt2Dv3+xGIxw==} + hasBin: true + dependencies: + '@ljharb/resumer': 0.0.1 + '@ljharb/through': 2.3.13 + call-bind: 1.0.7 + deep-equal: 1.1.2 + defined: 1.0.1 + dotignore: 0.1.2 + for-each: 0.3.3 + glob: 7.2.3 + has: 1.0.4 + inherits: 2.0.4 + is-regex: 1.1.4 + minimist: 1.2.8 + mock-property: 1.0.3 + object-inspect: 1.12.3 + resolve: 1.22.8 + string.prototype.trim: 1.2.9 + dev: false + + /temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + dev: true + + /tempy@0.6.0: + resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} + engines: {node: '>=10'} + dependencies: + is-stream: 2.0.1 + temp-dir: 2.0.0 + type-fest: 0.16.0 + unique-string: 2.0.0 + dev: true + + /terser@5.36.0: + resolution: {integrity: sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.0 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + + /text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + dev: true + + /text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} + dev: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + dev: true + + /through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + dependencies: + readable-stream: 3.6.2 + dev: true + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + + /tinyexec@0.3.1: + resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} + dev: true + + /tinyglobby@0.2.10: + resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + engines: {node: '>=12.0.0'} + dependencies: + fdir: 6.4.2(picomatch@4.0.2) + picomatch: 4.0.2 + dev: true + + /to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + dev: true + + /totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + dev: true + + /tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + dependencies: + punycode: 2.3.1 + dev: true + + /traverse@0.6.10: + resolution: {integrity: sha512-hN4uFRxbK+PX56DxYiGHsTn2dME3TVr9vbNqlQGcGcPhJAn+tdP126iA+TArMpI4YSgnTkMWyoLl5bf81Hi5TA==} + engines: {node: '>= 0.4'} + dependencies: + gopd: 1.0.1 + typedarray.prototype.slice: 1.0.3 + which-typed-array: 1.1.15 + dev: true + + /treemate@0.3.11: + resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==} + dev: true + + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /ts-api-utils@1.4.0(typescript@5.5.2): + resolution: {integrity: sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.5.2 + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: false + + /tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + dev: false + + /tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + /tsx@4.19.2: + resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + esbuild: 0.23.1 + get-tsconfig: 4.8.1 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest@0.16.0: + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + + /typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + /typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + /typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + + /typedarray.prototype.slice@1.0.3: + resolution: {integrity: sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + typed-array-buffer: 1.0.2 + typed-array-byte-offset: 1.0.2 + dev: true + + /typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + /typescript@5.5.2: + resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==} + engines: {node: '>=14.17'} + hasBin: true + + /ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + dev: true + + /uglify-js@2.8.29: + resolution: {integrity: sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==} + engines: {node: '>=0.8.0'} + hasBin: true + dependencies: + source-map: 0.5.7 + yargs: 3.10.0 + optionalDependencies: + uglify-to-browserify: 1.0.2 + dev: false + + /uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /uglify-to-browserify@1.0.2: + resolution: {integrity: sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==} + requiresBuild: true + dev: false + optional: true + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + /unconfig@0.5.5: + resolution: {integrity: sha512-VQZ5PT9HDX+qag0XdgQi8tJepPhXiR/yVOkn707gJDKo31lGjRilPREiQJ9Z6zd/Ugpv6ZvO5VxVIcatldYcNQ==} + dependencies: + '@antfu/utils': 0.7.10 + defu: 6.1.4 + importx: 0.4.4 + transitivePeerDependencies: + - supports-color + dev: true + + /undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + /unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + dev: true + + /unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.1.0 + dev: true + + /unicode-match-property-value-ecmascript@2.2.0: + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + engines: {node: '>=4'} + dev: true + + /unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + dev: true + + /unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + dev: true + + /unimport@3.13.1(rollup@2.79.2): + resolution: {integrity: sha512-nNrVzcs93yrZQOW77qnyOVHtb68LegvhYFwxFMfuuWScmwQmyVCG/NBuN8tYsaGzgQUVYv34E/af+Cc9u4og4A==} + dependencies: + '@rollup/pluginutils': 5.1.3(rollup@2.79.2) + acorn: 8.14.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + fast-glob: 3.3.2 + local-pkg: 0.5.0 + magic-string: 0.30.12 + mlly: 1.7.2 + pathe: 1.1.2 + pkg-types: 1.2.1 + scule: 1.3.0 + strip-literal: 2.1.0 + unplugin: 1.15.0 + transitivePeerDependencies: + - rollup + - webpack-sources + dev: true + + /union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + dev: true + + /unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + dependencies: + crypto-random-string: 2.0.0 + dev: true + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: true + + /unocss@0.62.3(postcss@8.4.45)(rollup@2.79.2)(vite@5.4.5): + resolution: {integrity: sha512-CLS6+JIlBobe/iPTz07pehyGDP8VqGJsiE+ZZ3Xkgib3hw76nCqAQF/4mJ8jVoV4C8KvGyVxmHaSSCFOkWmmZg==} + engines: {node: '>=14'} + peerDependencies: + '@unocss/webpack': 0.62.3 + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 + peerDependenciesMeta: + '@unocss/webpack': + optional: true + vite: + optional: true + dependencies: + '@unocss/astro': 0.62.3(rollup@2.79.2)(vite@5.4.5) + '@unocss/cli': 0.62.3(rollup@2.79.2) + '@unocss/core': 0.62.3 + '@unocss/extractor-arbitrary-variants': 0.62.3 + '@unocss/postcss': 0.62.3(postcss@8.4.45) + '@unocss/preset-attributify': 0.62.3 + '@unocss/preset-icons': 0.62.3 + '@unocss/preset-mini': 0.62.3 + '@unocss/preset-tagify': 0.62.3 + '@unocss/preset-typography': 0.62.3 + '@unocss/preset-uno': 0.62.3 + '@unocss/preset-web-fonts': 0.62.3 + '@unocss/preset-wind': 0.62.3 + '@unocss/reset': 0.62.3 + '@unocss/transformer-attributify-jsx': 0.62.3 + '@unocss/transformer-attributify-jsx-babel': 0.62.3 + '@unocss/transformer-compile-class': 0.62.3 + '@unocss/transformer-directives': 0.62.3 + '@unocss/transformer-variant-group': 0.62.3 + '@unocss/vite': 0.62.3(rollup@2.79.2)(vite@5.4.5) + vite: 5.4.5(@types/node@22.9.0)(sass@1.78.0) + transitivePeerDependencies: + - postcss + - rollup + - supports-color + dev: true + + /unplugin-auto-import@0.18.3(@vueuse/core@11.0.3)(rollup@2.79.2): + resolution: {integrity: sha512-q3FUtGQjYA2e+kb1WumyiQMjHM27MrTQ05QfVwtLRVhyYe+KF6TblBYaEX9L6Z0EibsqaXAiW+RFfkcQpfaXzg==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': ^3.2.2 + '@vueuse/core': '*' + peerDependenciesMeta: + '@nuxt/kit': + optional: true + '@vueuse/core': + optional: true + dependencies: + '@antfu/utils': 0.7.10 + '@rollup/pluginutils': 5.1.3(rollup@2.79.2) + '@vueuse/core': 11.0.3(vue@3.5.5) + fast-glob: 3.3.2 + local-pkg: 0.5.0 + magic-string: 0.30.12 + minimatch: 9.0.5 + unimport: 3.13.1(rollup@2.79.2) + unplugin: 1.15.0 + transitivePeerDependencies: + - rollup + - webpack-sources + dev: true + + /unplugin-icons@0.19.3: + resolution: {integrity: sha512-EUegRmsAI6+rrYr0vXjFlIP+lg4fSC4zb62zAZKx8FGXlWAGgEGBCa3JDe27aRAXhistObLPbBPhwa/0jYLFkQ==} + peerDependencies: + '@svgr/core': '>=7.0.0' + '@svgx/core': ^1.0.1 + '@vue/compiler-sfc': ^3.0.2 || ^2.7.0 + vue-template-compiler: ^2.6.12 + vue-template-es2015-compiler: ^1.9.0 + peerDependenciesMeta: + '@svgr/core': + optional: true + '@svgx/core': + optional: true + '@vue/compiler-sfc': + optional: true + vue-template-compiler: + optional: true + vue-template-es2015-compiler: + optional: true + dependencies: + '@antfu/install-pkg': 0.4.1 + '@antfu/utils': 0.7.10 + '@iconify/utils': 2.1.33 + debug: 4.3.7 + kolorist: 1.8.0 + local-pkg: 0.5.0 + unplugin: 1.15.0 + transitivePeerDependencies: + - supports-color + - webpack-sources + dev: true + + /unplugin-vue-components@0.27.4(rollup@2.79.2)(vue@3.5.5): + resolution: {integrity: sha512-1XVl5iXG7P1UrOMnaj2ogYa5YTq8aoh5jwDPQhemwO/OrXW+lPQKDXd1hMz15qxQPxgb/XXlbgo3HQ2rLEbmXQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/parser': ^7.15.8 + '@nuxt/kit': ^3.2.2 + vue: 2 || 3 + peerDependenciesMeta: + '@babel/parser': + optional: true + '@nuxt/kit': + optional: true + dependencies: + '@antfu/utils': 0.7.10 + '@rollup/pluginutils': 5.1.3(rollup@2.79.2) + chokidar: 3.6.0 + debug: 4.3.7 + fast-glob: 3.3.2 + local-pkg: 0.5.0 + magic-string: 0.30.12 + minimatch: 9.0.5 + mlly: 1.7.2 + unplugin: 1.15.0 + vue: 3.5.5(typescript@5.5.2) + transitivePeerDependencies: + - rollup + - supports-color + - webpack-sources + dev: true + + /unplugin-vue-setup-extend-plus@1.0.1: + resolution: {integrity: sha512-mW2IzkyJITyspAV/LEdnEyE1CJip9jB5fCeaVv7Q6X0oJyDrOxXoB+jyet0q5pRJNjErbjQx950/8NPTvbqLTQ==} + dependencies: + '@vue/compiler-sfc': 3.5.12 + magic-string: 0.26.7 + unplugin: 1.15.0 + transitivePeerDependencies: + - webpack-sources + dev: true + + /unplugin@1.15.0: + resolution: {integrity: sha512-jTPIs63W+DUEDW207ztbaoO7cQ4p5aVaB823LSlxpsFEU3Mykwxf3ZGC/wzxFJeZlASZYgVrWeo7LgOrqJZ8RA==} + engines: {node: '>=14.0.0'} + peerDependencies: + webpack-sources: ^3 + peerDependenciesMeta: + webpack-sources: + optional: true + dependencies: + acorn: 8.14.0 + webpack-virtual-modules: 0.6.2 + dev: true + + /unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + dev: true + + /upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + dev: true + + /update-browserslist-db@1.1.1(browserslist@4.24.2): + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.24.2 + escalade: 3.2.0 + picocolors: 1.1.1 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: true + + /urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + dev: true + + /use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: true + + /vdirs@0.1.8(vue@3.5.5): + resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==} + peerDependencies: + vue: ^3.0.11 + dependencies: + evtd: 0.2.4 + vue: 3.5.5(typescript@5.5.2) + dev: true + + /vite-code-inspector-plugin@0.16.1: + resolution: {integrity: sha512-SFV6UjWmgn9h3G4jzWuB1zEbBqC8Vuh+gTNCmVz2HsOB4keLjpEr/4+gAsNhVUyjYdRD1SoEVs5n0q260/si+g==} + dependencies: + code-inspector-core: 0.16.1 + transitivePeerDependencies: + - supports-color + dev: true + + /vite-hot-client@0.2.3(vite@5.4.5): + resolution: {integrity: sha512-rOGAV7rUlUHX89fP2p2v0A2WWvV3QMX2UYq0fRqsWSvFvev4atHWqjwGoKaZT1VTKyLGk533ecu3eyd0o59CAg==} + peerDependencies: + vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 + dependencies: + vite: 5.4.5(@types/node@22.9.0)(sass@1.78.0) + dev: true + + /vite-plugin-compression@0.5.1(vite@5.4.5): + resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==} + peerDependencies: + vite: '>=2.0.0' + dependencies: + chalk: 4.1.2 + debug: 4.3.7 + fs-extra: 10.1.0 + vite: 5.4.5(@types/node@22.9.0)(sass@1.78.0) + transitivePeerDependencies: + - supports-color + dev: true + + /vite-plugin-eslint@1.8.1(eslint@8.57.0)(vite@5.4.5): + resolution: {integrity: sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang==} + peerDependencies: + eslint: '>=7' + vite: '>=2' + dependencies: + '@rollup/pluginutils': 4.2.1 + '@types/eslint': 8.56.12 + eslint: 8.57.0 + rollup: 2.79.2 + vite: 5.4.5(@types/node@22.9.0)(sass@1.78.0) + dev: true + + /vite-plugin-html@3.2.2(vite@5.4.5): + resolution: {integrity: sha512-vb9C9kcdzcIo/Oc3CLZVS03dL5pDlOFuhGlZYDCJ840BhWl/0nGeZWf3Qy7NlOayscY4Cm/QRgULCQkEZige5Q==} + peerDependencies: + vite: '>=2.0.0' + dependencies: + '@rollup/pluginutils': 4.2.1 + colorette: 2.0.20 + connect-history-api-fallback: 1.6.0 + consola: 2.15.3 + dotenv: 16.4.5 + dotenv-expand: 8.0.3 + ejs: 3.1.10 + fast-glob: 3.3.2 + fs-extra: 10.1.0 + html-minifier-terser: 6.1.0 + node-html-parser: 5.4.2 + pathe: 0.2.0 + vite: 5.4.5(@types/node@22.9.0)(sass@1.78.0) + dev: true + + /vite-plugin-inspect@0.8.7(rollup@2.79.2)(vite@5.4.5): + resolution: {integrity: sha512-/XXou3MVc13A5O9/2Nd6xczjrUwt7ZyI9h8pTnUMkr5SshLcb0PJUOVq2V+XVkdeU4njsqAtmK87THZuO2coGA==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': '*' + vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0 + peerDependenciesMeta: + '@nuxt/kit': + optional: true + dependencies: + '@antfu/utils': 0.7.10 + '@rollup/pluginutils': 5.1.3(rollup@2.79.2) + debug: 4.3.7 + error-stack-parser-es: 0.1.5 + fs-extra: 11.2.0 + open: 10.1.0 + perfect-debounce: 1.0.0 + picocolors: 1.1.1 + sirv: 2.0.4 + vite: 5.4.5(@types/node@22.9.0)(sass@1.78.0) + transitivePeerDependencies: + - rollup + - supports-color + dev: true + + /vite-plugin-pwa@0.20.5(vite@5.4.5)(workbox-build@7.3.0)(workbox-window@7.3.0): + resolution: {integrity: sha512-aweuI/6G6n4C5Inn0vwHumElU/UEpNuO+9iZzwPZGTCH87TeZ6YFMrEY6ZUBQdIHHlhTsbMDryFARcSuOdsz9Q==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@vite-pwa/assets-generator': ^0.2.6 + vite: ^3.1.0 || ^4.0.0 || ^5.0.0 + workbox-build: ^7.1.0 + workbox-window: ^7.1.0 + peerDependenciesMeta: + '@vite-pwa/assets-generator': + optional: true + dependencies: + debug: 4.3.7 + pretty-bytes: 6.1.1 + tinyglobby: 0.2.10 + vite: 5.4.5(@types/node@22.9.0)(sass@1.78.0) + workbox-build: 7.3.0 + workbox-window: 7.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /vite-plugin-svg-icons@2.0.1(vite@5.4.5): + resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==} + peerDependencies: + vite: '>=2.0.0' + dependencies: + '@types/svgo': 2.6.4 + cors: 2.8.5 + debug: 4.3.7 + etag: 1.8.1 + fs-extra: 10.1.0 + pathe: 0.2.0 + svg-baker: 1.7.0 + svgo: 2.8.0 + vite: 5.4.5(@types/node@22.9.0)(sass@1.78.0) + transitivePeerDependencies: + - supports-color + dev: true + + /vite-plugin-vue-devtools@7.3.5(rollup@2.79.2)(vite@5.4.5)(vue@3.5.5): + resolution: {integrity: sha512-6omLXTfYu0bmSmncPSbj4mdMPB3t5dAZkUyriJikahGEnvv5gynHlydDsJShHT6l/5dCkvmSesSji/2a6FfutQ==} + engines: {node: '>=v14.21.3'} + peerDependencies: + vite: ^3.1.0 || ^4.0.0-0 || ^5.0.0-0 + dependencies: + '@vue/devtools-core': 7.6.3(vite@5.4.5)(vue@3.5.5) + '@vue/devtools-kit': 7.6.3 + '@vue/devtools-shared': 7.6.3 + execa: 8.0.1 + sirv: 2.0.4 + vite: 5.4.5(@types/node@22.9.0)(sass@1.78.0) + vite-plugin-inspect: 0.8.7(rollup@2.79.2)(vite@5.4.5) + vite-plugin-vue-inspector: 5.2.0(vite@5.4.5) + transitivePeerDependencies: + - '@nuxt/kit' + - rollup + - supports-color + - vue + dev: true + + /vite-plugin-vue-inspector@5.2.0(vite@5.4.5): + resolution: {integrity: sha512-wWxyb9XAtaIvV/Lr7cqB1HIzmHZFVUJsTNm3yAxkS87dgh/Ky4qr2wDEWNxF23fdhVa3jQ8MZREpr4XyiuaRqA==} + peerDependencies: + vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-transform-typescript': 7.25.9(@babel/core@7.26.0) + '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.0) + '@vue/compiler-dom': 3.5.12 + kolorist: 1.8.0 + magic-string: 0.30.12 + vite: 5.4.5(@types/node@22.9.0)(sass@1.78.0) + transitivePeerDependencies: + - supports-color + dev: true + + /vite@5.4.5(@types/node@22.9.0)(sass@1.78.0): + resolution: {integrity: sha512-pXqR0qtb2bTwLkev4SE3r4abCNioP3GkjvIDLlzziPpXtHgiJIjuKl+1GN6ESOT3wMjG3JTeARopj2SwYaHTOA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 22.9.0 + esbuild: 0.21.5 + postcss: 8.4.45 + rollup: 4.24.4 + sass: 1.78.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vooks@0.2.12(vue@3.5.5): + resolution: {integrity: sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==} + peerDependencies: + vue: ^3.0.0 + dependencies: + evtd: 0.2.4 + vue: 3.5.5(typescript@5.5.2) + dev: true + + /vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + dev: true + + /vue-cropper@1.1.1: + resolution: {integrity: sha512-WsqKMpaBf9Osi1LQlE/5AKdD0nHWOy1asLXocaG8NomOWO07jiZi968+/PbMmnD0QbPJOumDQaGuGa13qys85A==} + dev: false + + /vue-demi@0.14.10(vue@3.5.5): + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: 3.5.5(typescript@5.5.2) + + /vue-eslint-parser@9.4.3(eslint@8.57.0): + resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + debug: 4.3.7 + eslint: 8.57.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + lodash: 4.17.21 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + dev: true + + /vue-router@4.4.5(vue@3.5.5): + resolution: {integrity: sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==} + peerDependencies: + vue: ^3.2.0 + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.5(typescript@5.5.2) + dev: false + + /vue-tsc@2.1.6(typescript@5.5.2): + resolution: {integrity: sha512-f98dyZp5FOukcYmbFpuSCJ4Z0vHSOSmxGttZJCsFeX0M4w/Rsq0s4uKXjcSRsZqsRgQa6z7SfuO+y0HVICE57Q==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + dependencies: + '@volar/typescript': 2.4.9 + '@vue/language-core': 2.1.6(typescript@5.5.2) + semver: 7.6.3 + typescript: 5.5.2 + dev: true + + /vue@3.5.5(typescript@5.5.2): + resolution: {integrity: sha512-ybC+xn67K4+df1yVeov4UjBGyVcXM0a1g7JVZr+pWVUX3xF6ntXU0wIjkTkduZBUIpxTlsftJSxz2kwhsT7dgA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@vue/compiler-dom': 3.5.5 + '@vue/compiler-sfc': 3.5.5 + '@vue/runtime-dom': 3.5.5 + '@vue/server-renderer': 3.5.5(vue@3.5.5) + '@vue/shared': 3.5.5 + typescript: 5.5.2 + + /vueuc@0.4.64(vue@3.5.5): + resolution: {integrity: sha512-wlJQj7fIwKK2pOEoOq4Aro8JdPOGpX8aWQhV8YkTW9OgWD2uj2O8ANzvSsIGjx7LTOc7QbS7sXdxHi6XvRnHPA==} + peerDependencies: + vue: ^3.0.11 + dependencies: + '@css-render/vue3-ssr': 0.15.14(vue@3.5.5) + '@juggle/resize-observer': 3.4.0 + css-render: 0.15.14 + evtd: 0.2.4 + seemly: 0.3.9 + vdirs: 0.1.8(vue@3.5.5) + vooks: 0.2.12(vue@3.5.5) + vue: 3.5.5(typescript@5.5.2) + dev: true + + /webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + dev: true + + /webpack-code-inspector-plugin@0.16.1: + resolution: {integrity: sha512-KCZ9sx4ei3WledsrhPZQ1eN6A/ZhNv1DH06I6yoUEEFl9KstbHAZ6Zm5hjBagY7MXqGfqepdz+j3XYT3Ep/Wwg==} + dependencies: + code-inspector-core: 0.16.1 + transitivePeerDependencies: + - supports-color + dev: true + + /webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + dev: true + + /whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: true + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /window-size@0.1.0: + resolution: {integrity: sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==} + engines: {node: '>= 0.8.0'} + dev: false + + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /wordwrap@0.0.2: + resolution: {integrity: sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==} + engines: {node: '>=0.4.0'} + dev: false + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: true + + /workbox-background-sync@7.3.0: + resolution: {integrity: sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg==} + dependencies: + idb: 7.1.1 + workbox-core: 7.3.0 + dev: true + + /workbox-broadcast-update@7.3.0: + resolution: {integrity: sha512-T9/F5VEdJVhwmrIAE+E/kq5at2OY6+OXXgOWQevnubal6sO92Gjo24v6dCVwQiclAF5NS3hlmsifRrpQzZCdUA==} + dependencies: + workbox-core: 7.3.0 + dev: true + + /workbox-build@7.3.0: + resolution: {integrity: sha512-JGL6vZTPlxnlqZRhR/K/msqg3wKP+m0wfEUVosK7gsYzSgeIxvZLi1ViJJzVL7CEeI8r7rGFV973RiEqkP3lWQ==} + engines: {node: '>=16.0.0'} + dependencies: + '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1) + '@babel/core': 7.26.0 + '@babel/preset-env': 7.26.0(@babel/core@7.26.0) + '@babel/runtime': 7.26.0 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.26.0)(rollup@2.79.2) + '@rollup/plugin-node-resolve': 15.3.0(rollup@2.79.2) + '@rollup/plugin-replace': 2.4.2(rollup@2.79.2) + '@rollup/plugin-terser': 0.4.4(rollup@2.79.2) + '@surma/rollup-plugin-off-main-thread': 2.2.3 + ajv: 8.17.1 + common-tags: 1.8.2 + fast-json-stable-stringify: 2.1.0 + fs-extra: 9.1.0 + glob: 7.2.3 + lodash: 4.17.21 + pretty-bytes: 5.6.0 + rollup: 2.79.2 + source-map: 0.8.0-beta.0 + stringify-object: 3.3.0 + strip-comments: 2.0.1 + tempy: 0.6.0 + upath: 1.2.0 + workbox-background-sync: 7.3.0 + workbox-broadcast-update: 7.3.0 + workbox-cacheable-response: 7.3.0 + workbox-core: 7.3.0 + workbox-expiration: 7.3.0 + workbox-google-analytics: 7.3.0 + workbox-navigation-preload: 7.3.0 + workbox-precaching: 7.3.0 + workbox-range-requests: 7.3.0 + workbox-recipes: 7.3.0 + workbox-routing: 7.3.0 + workbox-strategies: 7.3.0 + workbox-streams: 7.3.0 + workbox-sw: 7.3.0 + workbox-window: 7.3.0 + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + dev: true + + /workbox-cacheable-response@7.3.0: + resolution: {integrity: sha512-eAFERIg6J2LuyELhLlmeRcJFa5e16Mj8kL2yCDbhWE+HUun9skRQrGIFVUagqWj4DMaaPSMWfAolM7XZZxNmxA==} + dependencies: + workbox-core: 7.3.0 + dev: true + + /workbox-core@7.3.0: + resolution: {integrity: sha512-Z+mYrErfh4t3zi7NVTvOuACB0A/jA3bgxUN3PwtAVHvfEsZxV9Iju580VEETug3zYJRc0Dmii/aixI/Uxj8fmw==} + dev: true + + /workbox-expiration@7.3.0: + resolution: {integrity: sha512-lpnSSLp2BM+K6bgFCWc5bS1LR5pAwDWbcKt1iL87/eTSJRdLdAwGQznZE+1czLgn/X05YChsrEegTNxjM067vQ==} + dependencies: + idb: 7.1.1 + workbox-core: 7.3.0 + dev: true + + /workbox-google-analytics@7.3.0: + resolution: {integrity: sha512-ii/tSfFdhjLHZ2BrYgFNTrb/yk04pw2hasgbM70jpZfLk0vdJAXgaiMAWsoE+wfJDNWoZmBYY0hMVI0v5wWDbg==} + dependencies: + workbox-background-sync: 7.3.0 + workbox-core: 7.3.0 + workbox-routing: 7.3.0 + workbox-strategies: 7.3.0 + dev: true + + /workbox-navigation-preload@7.3.0: + resolution: {integrity: sha512-fTJzogmFaTv4bShZ6aA7Bfj4Cewaq5rp30qcxl2iYM45YD79rKIhvzNHiFj1P+u5ZZldroqhASXwwoyusnr2cg==} + dependencies: + workbox-core: 7.3.0 + dev: true + + /workbox-precaching@7.3.0: + resolution: {integrity: sha512-ckp/3t0msgXclVAYaNndAGeAoWQUv7Rwc4fdhWL69CCAb2UHo3Cef0KIUctqfQj1p8h6aGyz3w8Cy3Ihq9OmIw==} + dependencies: + workbox-core: 7.3.0 + workbox-routing: 7.3.0 + workbox-strategies: 7.3.0 + dev: true + + /workbox-range-requests@7.3.0: + resolution: {integrity: sha512-EyFmM1KpDzzAouNF3+EWa15yDEenwxoeXu9bgxOEYnFfCxns7eAxA9WSSaVd8kujFFt3eIbShNqa4hLQNFvmVQ==} + dependencies: + workbox-core: 7.3.0 + dev: true + + /workbox-recipes@7.3.0: + resolution: {integrity: sha512-BJro/MpuW35I/zjZQBcoxsctgeB+kyb2JAP5EB3EYzePg8wDGoQuUdyYQS+CheTb+GhqJeWmVs3QxLI8EBP1sg==} + dependencies: + workbox-cacheable-response: 7.3.0 + workbox-core: 7.3.0 + workbox-expiration: 7.3.0 + workbox-precaching: 7.3.0 + workbox-routing: 7.3.0 + workbox-strategies: 7.3.0 + dev: true + + /workbox-routing@7.3.0: + resolution: {integrity: sha512-ZUlysUVn5ZUzMOmQN3bqu+gK98vNfgX/gSTZ127izJg/pMMy4LryAthnYtjuqcjkN4HEAx1mdgxNiKJMZQM76A==} + dependencies: + workbox-core: 7.3.0 + dev: true + + /workbox-strategies@7.3.0: + resolution: {integrity: sha512-tmZydug+qzDFATwX7QiEL5Hdf7FrkhjaF9db1CbB39sDmEZJg3l9ayDvPxy8Y18C3Y66Nrr9kkN1f/RlkDgllg==} + dependencies: + workbox-core: 7.3.0 + dev: true + + /workbox-streams@7.3.0: + resolution: {integrity: sha512-SZnXucyg8x2Y61VGtDjKPO5EgPUG5NDn/v86WYHX+9ZqvAsGOytP0Jxp1bl663YUuMoXSAtsGLL+byHzEuMRpw==} + dependencies: + workbox-core: 7.3.0 + workbox-routing: 7.3.0 + dev: true + + /workbox-sw@7.3.0: + resolution: {integrity: sha512-aCUyoAZU9IZtH05mn0ACUpyHzPs0lMeJimAYkQkBsOWiqaJLgusfDCR+yllkPkFRxWpZKF8vSvgHYeG7LwhlmA==} + dev: true + + /workbox-window@7.3.0: + resolution: {integrity: sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==} + dependencies: + '@types/trusted-types': 2.0.7 + workbox-core: 7.3.0 + dev: true + + /worker-timers-broker@6.1.8: + resolution: {integrity: sha512-FUCJu9jlK3A8WqLTKXM9E6kAmI/dR1vAJ8dHYLMisLNB/n3GuaFIjJ7pn16ZcD1zCOf7P6H62lWIEBi+yz/zQQ==} + dependencies: + '@babel/runtime': 7.26.0 + fast-unique-numbers: 8.0.13 + tslib: 2.8.1 + worker-timers-worker: 7.0.71 + dev: false + + /worker-timers-worker@7.0.71: + resolution: {integrity: sha512-ks/5YKwZsto1c2vmljroppOKCivB/ma97g9y77MAAz2TBBjPPgpoOiS1qYQKIgvGTr2QYPT3XhJWIB6Rj2MVPQ==} + dependencies: + '@babel/runtime': 7.26.0 + tslib: 2.8.1 + dev: false + + /worker-timers@7.1.8: + resolution: {integrity: sha512-R54psRKYVLuzff7c1OTFcq/4Hue5Vlz4bFtNEIarpSiCYhpifHU3aIQI29S84o1j87ePCYqbmEJPqwBTf+3sfw==} + dependencies: + '@babel/runtime': 7.26.0 + tslib: 2.8.1 + worker-timers-broker: 6.1.8 + worker-timers-worker: 7.0.71 + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + dev: true + + /ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + + /xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + dev: true + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yaml@2.5.1: + resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} + engines: {node: '>= 14'} + hasBin: true + dev: true + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yargs@3.10.0: + resolution: {integrity: sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==} + dependencies: + camelcase: 1.2.1 + cliui: 2.1.0 + decamelize: 1.2.0 + window-size: 0.1.0 + dev: false + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + dev: true + + /zrender@5.6.0: + resolution: {integrity: sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==} + dependencies: + tslib: 2.3.0 + dev: false diff --git a/web/postcss.config.cjs b/web/postcss.config.cjs new file mode 100644 index 0000000000000000000000000000000000000000..5bfb8f62848e704d55379d060cf74ae6415bdf9d --- /dev/null +++ b/web/postcss.config.cjs @@ -0,0 +1,5 @@ +module.exports = { + plugins: { + autoprefixer: {} + } +}; diff --git a/web/public/favicon.ico b/web/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0ba1cdeb6913308fe6fe4f904202c10c983813ac Binary files /dev/null and b/web/public/favicon.ico differ diff --git a/web/public/logo.png b/web/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9b1e33c88ff2db16b0e576aaa70542c281544faa Binary files /dev/null and b/web/public/logo.png differ diff --git a/web/src/App.vue b/web/src/App.vue new file mode 100644 index 0000000000000000000000000000000000000000..94537b65df14c0d3ad8c0de267c435025424048b --- /dev/null +++ b/web/src/App.vue @@ -0,0 +1,23 @@ + + + diff --git a/web/src/api/helper/axiosCancel.ts b/web/src/api/helper/axiosCancel.ts new file mode 100644 index 0000000000000000000000000000000000000000..84ce1ebbee0aed0462225ef751b928d5eed969b6 --- /dev/null +++ b/web/src/api/helper/axiosCancel.ts @@ -0,0 +1,69 @@ +/** + * @description axios取消请求 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +import { CustomAxiosRequestConfig } from "../request/instance"; +import qs from "qs"; + +// 声明一个 Map 用于存储每个请求的标识 和 取消函数 +let pendingMap = new Map(); + +// 序列化参数,确保对象属性顺序一致 +const sortedStringify = (obj: any) => { + return qs.stringify(obj, { arrayFormat: "repeat", sort: (a, b) => a.localeCompare(b) }); +}; + +// 获取请求的唯一标识 +export const getPendingUrl = (config: CustomAxiosRequestConfig) => { + return [config.baseURL, config.method, config.url, sortedStringify(config.data), sortedStringify(config.params)].join("&"); +}; + +export class AxiosCanceler { + /** + * @description: 添加请求 + * @param {Object} config + * @return void + */ + addPending(config: CustomAxiosRequestConfig) { + // 在请求开始前,对之前的请求做检查取消操作 + this.removePending(config); + const url = getPendingUrl(config); + const controller = new AbortController(); + config.signal = controller.signal; + pendingMap.set(url, controller); + } + + /** + * @description: 移除请求 + * @param {Object} config + */ + removePending(config: CustomAxiosRequestConfig) { + const url = getPendingUrl(config); + // 如果在 pending 中存在当前请求标识,需要取消当前请求并删除条目 + const controller = pendingMap.get(url); + if (controller) { + controller.abort(); + pendingMap.delete(url); + } + } + + /** + * @description: 清空所有pending + */ + removeAllPending() { + pendingMap.forEach(controller => { + controller && controller.abort(); + }); + pendingMap.clear(); + } +} diff --git a/web/src/api/helper/checkStatus.ts b/web/src/api/helper/checkStatus.ts new file mode 100644 index 0000000000000000000000000000000000000000..8930aa637c1be18d4231af7d3b53f3f8fcf26e37 --- /dev/null +++ b/web/src/api/helper/checkStatus.ts @@ -0,0 +1,61 @@ +/** + * @description 校验网络请求状态码 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ +import { useConfigStore } from "@/stores/modules"; +import { ElMessage } from "element-plus"; + +/** + * @description: 校验网络请求状态码 + * @param {Number} status + * @return void + */ +export const checkStatus = (status: number) => { + switch (status) { + case 400: + ElMessage.error("请求失败!请您稍后重试"); + break; + case 401: + ElMessage.error("登录失效!请您重新登录"); + break; + case 403: + ElMessage.error("当前账号无权限访问!"); + break; + case 404: + ElMessage.error("你所访问的资源不存在!"); + break; + case 405: + ElMessage.error("请求方式错误!请您稍后重试"); + break; + case 408: + ElMessage.error("请求超时!请您稍后重试"); + break; + case 423: + const configStore = useConfigStore(); + ElMessage.error(configStore.sysBaseInfoGet.SYS_WEB_CLOSE_PROMPT); + break; + case 500: + ElMessage.error("服务异常!"); + break; + case 502: + ElMessage.error("网关错误!"); + break; + case 503: + ElMessage.error("服务不可用!"); + break; + case 504: + ElMessage.error("网关超时!"); + break; + default: + ElMessage.error("请求失败!"); + } +}; diff --git a/web/src/api/index.ts b/web/src/api/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..447189da74fa8b821af9dfc1f81f6fd14a21c94a --- /dev/null +++ b/web/src/api/index.ts @@ -0,0 +1,16 @@ +/** + * @description + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +export * from "./modules"; +export * from "./interface"; diff --git a/web/src/api/interface/index.ts b/web/src/api/interface/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..f1fbd3d57f8f8cee1a680bf5e6cd75bab863590d --- /dev/null +++ b/web/src/api/interface/index.ts @@ -0,0 +1,55 @@ +/** + * @description 接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +// 请求响应参数(不包含data) +export interface Result { + code: string; + msg: string; +} + +// 请求响应参数(包含data) +export interface ResultData extends Result { + data: T; +} + +// 分页响应参数 +export interface ResPage { + list: T[]; + pageNum: number; + pageSize: number; + total: number; +} + +// 分页请求参数 +export interface ReqPage { + /** 页码 */ + pageNum: number; + /** 数量 */ + pageSize: number; + /** 排序字段 */ + sortField?: string; + /** 排序方式 */ + sortOrder?: string; + /** 关键字 */ + searchKey?: string; +} + +/** id请求参数 */ +export interface ReqId { + /** id */ + id: number | string; +} + +export * from "./sys"; diff --git a/web/src/api/interface/sys/audit/index.ts b/web/src/api/interface/sys/audit/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..819d3ffcd89bc8a3e5e32176aa33ffec64345b03 --- /dev/null +++ b/web/src/api/interface/sys/audit/index.ts @@ -0,0 +1,17 @@ +/** + * @description + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +export * from "./visLog"; +export * from "./opLog"; diff --git a/web/src/api/interface/sys/audit/opLog.ts b/web/src/api/interface/sys/audit/opLog.ts new file mode 100644 index 0000000000000000000000000000000000000000..e994b0b5008b17ed1e2fbacfe857c158c42dfd82 --- /dev/null +++ b/web/src/api/interface/sys/audit/opLog.ts @@ -0,0 +1,63 @@ +/** + * @description 操作日志接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +import { ReqPage, VisLog } from "@/api"; +/** + * @Description: 操作日志接口 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +export namespace OpLog { + /** 操作日志分页查询 */ + export interface Page extends ReqPage { + /** 操作日志分类 */ + category: string; + } + + /** 操作日志信息 */ + export interface OpLogInfo extends VisLog.VisLogInfo { + /** 具体消息 */ + exeMessage: null; + /** 类名称 */ + className: string; + /** 方法名称 */ + methodName: string; + /** 请求方式 */ + reqMethod: string; + /** 请求地址 */ + reqUrl: string; + /** 请求参数 */ + paramJson: string | null; + /** 返回结果 */ + resultJson: string | null; + } + + /** 折线图 */ + export interface ColumnChart { + /** 日期 */ + date: string; + /** 日志类型 */ + name: string; + /** 数量 */ + count: number; + } + + /** 饼图 */ + export interface PineChart { + /** 类型 */ + type: string; + /** 数量 */ + value: number; + } +} diff --git a/web/src/api/interface/sys/audit/visLog.ts b/web/src/api/interface/sys/audit/visLog.ts new file mode 100644 index 0000000000000000000000000000000000000000..0c6f1ac648f207be1e232664f7299ea872467c39 --- /dev/null +++ b/web/src/api/interface/sys/audit/visLog.ts @@ -0,0 +1,74 @@ +/** + * @description 访问日志接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +import { ReqPage } from "@/api"; + +/** + * @Description: 操作日志接口 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +export namespace VisLog { + /** 访问日志分页查询 */ + export interface Page extends ReqPage { + /** 访问日志分类 */ + category: string; + } + + /** 访问日志详情 */ + export interface VisLogInfo { + /** id */ + id: number; + /** 访问日志分类 */ + category: string; + /** 访问日志标题 */ + name: string; + /** 执行状态 */ + exeStatus: string; + /** 操作Ip */ + opIp: string; + /** 操作地址 */ + opAddress: string; + /** 操作浏览器 */ + opBrowser: string; + /** 操作系统 */ + opOs: string; + /** 操作时间 */ + opTime: string; + /** 操作人 */ + opUser: string; + /** 操作账号 */ + opAccount: string; + /** 操作时间 */ + createTime: string; + } + + /** 折线图 */ + export interface LineChart { + /** 日期 */ + date: string; + /** 登入量 */ + loginCount: number; + /** 登出量 */ + logoutCount: number; + } + + /** 饼图 */ + export interface PineChart { + /** 类型 */ + type: string; + /** 数量 */ + value: number; + } +} diff --git a/web/src/api/interface/sys/auth/index.ts b/web/src/api/interface/sys/auth/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..070b49daeb8530f933481aee36c25a75fc9593a9 --- /dev/null +++ b/web/src/api/interface/sys/auth/index.ts @@ -0,0 +1,15 @@ +/** + * @description + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +export * from "./login"; diff --git a/web/src/api/interface/sys/auth/login.ts b/web/src/api/interface/sys/auth/login.ts new file mode 100644 index 0000000000000000000000000000000000000000..fab2414a31c9e74a25304b7017134ec5dc90061b --- /dev/null +++ b/web/src/api/interface/sys/auth/login.ts @@ -0,0 +1,133 @@ +/** + * @description 登录模块接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +/** + * @Description: + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +export namespace Login { + /** 模块信息 */ + export type ModuleInfo = { + id: number | string; + title: string; + code: string; + icon: string; + description: string; + }; + + /** + * 验证码 + */ + interface ValidCode { + /** 验证码 */ + validCode: string; + /** 验证码请求号 */ + validCodeReqNo: string; + } + + /** + * 账号密码登录表单 + */ + export interface LoginForm extends ValidCode { + account: string; + password: string; + tenantId?: number | string; + } + + /** + * 手机号登录表单 + */ + export interface PhoneLoginForm extends ValidCode { + /** 手机号 */ + phone: string; + /** 租户Id */ + tenantId?: number | string; + } + + /** 获取手机验证码请求 */ + export interface ReqPhoneValidCode extends ValidCode { + /** 手机号 */ + phone: string; + } + + /** + * 注销表单 + */ + export interface Logout { + token: string; + } + + // 登录返回 + export interface Login { + /** token */ + token: string; + /** 默认模块 */ + defaultModule: string; + /** 模块列表 */ + moduleList: ModuleInfo[]; + } + + /** + * 验证码返回 + */ + export interface ReqValidCode { + /** 验证码 */ + validCodeBase64: string; + /** 验证码请求号 */ + validCodeReqNo: string; + } + + /** 用户信息 */ + export interface LoginUserInfo { + /** 用户id */ + id: string | number; + /** 用户名 */ + account: string; + /** 用户姓名 */ + name: string; + /** 用户昵称 */ + nickname: string; + /** 用户头像 */ + avatar: string; + /** 用户性别 */ + gender: string; + /** 民族 */ + nation: string; + /** 出生日期 */ + birthday: string; + /** 家庭住址 */ + homeAddress: string; + /** 电话号码 */ + phone: string; + /** 邮箱 */ + email: string; + /** 用户签名 */ + signature: string; + /** 默认模块 */ + defaultModule: number | string; + /** 模块列表 */ + moduleList: ModuleInfo[]; + /** 组织全程 */ + orgNames: string; + /** 职位名称 */ + positionName: string; + /** 按钮码集合 */ + buttonCodeList: string[]; + /** 权限码集合 */ + permissionCodeList: string[]; + /** 角色码集合 */ + roleCodeList: string[]; + } +} diff --git a/web/src/api/interface/sys/dev/index.ts b/web/src/api/interface/sys/dev/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..41c51eb5447e800bf7f0df758785ee0845af1a3a --- /dev/null +++ b/web/src/api/interface/sys/dev/index.ts @@ -0,0 +1,17 @@ +/** + * @description 基础工具接口 + * @license Apache License Version 2.0 +2022 +, + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +export * from "./message"; diff --git a/web/src/api/interface/sys/dev/message.ts b/web/src/api/interface/sys/dev/message.ts new file mode 100644 index 0000000000000000000000000000000000000000..282b41f889ea223fc05f616cda1b6f2b2fc9a9fe --- /dev/null +++ b/web/src/api/interface/sys/dev/message.ts @@ -0,0 +1,72 @@ +/** + * @description 站内消息接口 + * @license Apache License Version 2.0 +2022 +, + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +import { ReqPage } from "@/api/interface"; +import { MessageTypeDictEnum, MessageSendWayDictEnum } from "@/enums"; +import { SysUser, SysRole } from "@/api"; +/** + * @Description: 站内消息接口 + * @Author: huguodong + * @Date: 2024-11-08 15:54:07 + */ +export namespace SysMessage { + /** 消息类型 */ + export type MessageType = MessageTypeDictEnum.INFORM | MessageTypeDictEnum.NOTICE | MessageTypeDictEnum.MESSAGE; + + /** 消息信息 */ + export interface SysMessageInfo { + /** 消息ID */ + id: number | string; + /** 消息类型 */ + category: string; + /** 消息标题 */ + subject: string; + /** 消息内容 */ + content: string; + /** 消息接收者 */ + receiverType: string; + /** 是否已读 */ + read: boolean; + /** 创建时间 */ + createTime: string; + /** 接受者Id列表 */ + receiverInfo: SysUser.SysUserInfo[] | SysRole.SysRoleInfo[]; + /**发送方式 */ + sendWay: MessageSendWayDictEnum; + /**发送时间 */ + sendTime: string; + /**发送时间格式化 */ + sendTimeFormat: string; + /**延迟时间 */ + delayTime: number; + /**发送状态 */ + status: string; + /**接收详情 */ + receiverDetail: receiverDetail[]; //接收者详情 + } + + /** 消息信息 */ + export interface receiverDetail { + /** 消息ID */ + id: number | string; + /** 名称 */ + name: string; + /** 是否已读 */ + read: boolean; + } + /** 消息分页查询 */ + export interface Page extends ReqPage {} +} diff --git a/web/src/api/interface/sys/im/index.ts b/web/src/api/interface/sys/im/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..c93166b0acee545180c49c8ac072a0887df886b0 --- /dev/null +++ b/web/src/api/interface/sys/im/index.ts @@ -0,0 +1,17 @@ +/** + * @description 即时通讯接口 + * @license Apache License Version 2.0 +2022 +, + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +export * from "./mqtt"; diff --git a/web/src/api/interface/sys/im/mqtt.ts b/web/src/api/interface/sys/im/mqtt.ts new file mode 100644 index 0000000000000000000000000000000000000000..9c302a0be001cb6ebc816258e7e4dc4c84f72379 --- /dev/null +++ b/web/src/api/interface/sys/im/mqtt.ts @@ -0,0 +1,36 @@ +/** + * @description mqtt 接口 + * @license Apache License Version 2.0 +2022 +, + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +/** + * @Description: 角色管理接口 + * @Author: huguodong + * @Date: 2024-11-08 15:53:56 + */ +export namespace Mqtt { + /** mqtt参数 */ + export interface MqttParameter { + /** 服务器地址 */ + url: string; + /** 用户名 */ + username: string; + /** 密码 */ + password: string; + /** 客户端ID */ + clientId: string; + /** 主题 */ + topics: string[]; + } +} diff --git a/web/src/api/interface/sys/index.ts b/web/src/api/interface/sys/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..61b1dde81a4a7d41a212be116fbc6e8e2e6611c0 --- /dev/null +++ b/web/src/api/interface/sys/index.ts @@ -0,0 +1,23 @@ +/** + * @description sys模块接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +export * from "./upload"; +export * from "./userCenter"; +export * from "./limit"; +export * from "./ops"; +export * from "./audit"; +export * from "./organization"; +export * from "./auth"; +export * from "./im"; +export * from "./dev"; diff --git a/web/src/api/interface/sys/limit/button.ts b/web/src/api/interface/sys/limit/button.ts new file mode 100644 index 0000000000000000000000000000000000000000..d4384a2a991557589d39b399aee1b9ddde85ee8b --- /dev/null +++ b/web/src/api/interface/sys/limit/button.ts @@ -0,0 +1,53 @@ +/** + * @description 按钮管理接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +import { ReqPage } from "@/api"; +/** + * @Description: 权限按钮接口 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +export namespace Button { + /**按钮分页查询 */ + export interface Page extends ReqPage { + /** 菜单Id */ + parentId: number | string; + } + + /** 按钮信息 */ + export interface ButtonInfo { + /** id */ + id: number | string; + /** 上级菜单 */ + parentId: number | string; + /** 按钮名称 */ + title: string; + /** 按钮码 */ + code: string; + /** 按钮排序*/ + sortCode: number; + /** 按钮描述 */ + description: string; + } + + /** 按钮信息 */ + export interface Batch { + /** 上级菜单 */ + parentId: number | string; + /** 按钮名称 */ + title: string; + /** 按钮码 */ + code: string; + } +} diff --git a/web/src/api/interface/sys/limit/index.ts b/web/src/api/interface/sys/limit/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..1ba8a87689d1fed546b1ff79d61fc7df1df7f787 --- /dev/null +++ b/web/src/api/interface/sys/limit/index.ts @@ -0,0 +1,19 @@ +/** + * @description 资源管理接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +export * from "./spa"; +export * from "./menu"; +export * from "./module"; +export * from "./button"; +export * from "./role"; diff --git a/web/src/api/interface/sys/limit/menu.ts b/web/src/api/interface/sys/limit/menu.ts new file mode 100644 index 0000000000000000000000000000000000000000..ce95d12f1aab340c03c5c7822e131af0ff932a8b --- /dev/null +++ b/web/src/api/interface/sys/limit/menu.ts @@ -0,0 +1,62 @@ +/** + * @description 菜单管理接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ +import { Spa } from "@/api/interface"; +import { MenuTypeDictEnum } from "@/enums"; +/** + * @Description: 菜单管理接口 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +export namespace Menu { + /** 菜单类型 */ + export type MenuType = MenuTypeDictEnum.MENU | MenuTypeDictEnum.CATALOG | MenuTypeDictEnum.LINK; + + /**菜单分页查询 */ + export interface Tree { + /** 菜单名称 */ + menuType?: MenuType; + /** 所属模块名称 */ + module: number | string; + } + + /** 菜单信息 */ + export interface MenuInfo extends Spa.SpaInfo { + /** 所属模块 */ + module: number | string; + /** 上级菜单 */ + parentId: number | string; + /** 子菜单 */ + children?: MenuInfo[]; + } + + /** 菜单树信息 */ + export interface MenuTreeInfo { + /** id */ + id: number | string; + /** 菜单名称 */ + title: string; + /** 上级菜单Id */ + parentId: number | string; + /** 菜单路由 */ + path?: string; + /** 子菜单 */ + children?: MenuTreeInfo[]; + } + + /** 菜单树选择器输入参数 */ + export interface MenuTreeSelectorReq { + /** 所属模块 */ + module?: number | string; + } +} diff --git a/web/src/api/interface/sys/limit/module.ts b/web/src/api/interface/sys/limit/module.ts new file mode 100644 index 0000000000000000000000000000000000000000..a70380301e3b2ddbd50518b16caed66b2c415689 --- /dev/null +++ b/web/src/api/interface/sys/limit/module.ts @@ -0,0 +1,43 @@ +/** + * @description 模块管理接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ +import { ReqPage } from "@/api/interface"; +/** + * @Description: 模块管理接口 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +export namespace Module { + /**模块分页查询 */ + export interface Page extends ReqPage { + title: string; + } + + /** 单页信息 */ + export interface ModuleInfo { + /** id */ + id: number | string; + /** 菜单名称 */ + title: string; + /** 菜单描述 */ + description: string; + /** 菜单图标 */ + icon: string; + /** 状态 */ + status: string; + /** 排序 */ + sortCode: number; + /** 创建时间 */ + createTime: string; + } +} diff --git a/web/src/api/interface/sys/limit/role.ts b/web/src/api/interface/sys/limit/role.ts new file mode 100644 index 0000000000000000000000000000000000000000..34f1e575db6eaf0a2034f9be1f10330c04d210e8 --- /dev/null +++ b/web/src/api/interface/sys/limit/role.ts @@ -0,0 +1,235 @@ +/** + * @description 角色管理接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ +import { ReqPage } from "@/api/interface"; +import { ReqId, SysUser } from "@/api/interface"; +/** + * @Description: 角色管理接口 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +export namespace SysRole { + /** 角色分页查询 */ + export interface Page extends ReqPage {} + + /** 角色信息 */ + export interface SysRoleInfo { + /** 角色id */ + id: number | string; + /** 机构ID */ + orgId: number | string; + /** 角色名称 */ + name: string; + /** 角色编码 */ + code: string; + /** 角色分类 */ + category: string; + /** 默认数据范围 */ + defaultDataScope: DefaultDataScope; + /** 状态 */ + status: string; + /** 排序码 */ + sortCode: number; + /** 用户信息 */ + userList: SysUser.SysUserInfo[]; + } + + /** 默认数据范围 */ + export interface DefaultDataScope { + /** 权重 */ + level: number; + /** 标题 */ + title: string; + /** 范围分类 */ + scopeCategory: DataScopeEnum; + /** 机构ID列表 */ + scopeDefineOrgIdList: string[] | number[]; + /** 是否被选中 */ + check?: boolean; + test?: string; + } + + /** 角色树 */ + export interface SysRoleTree { + /** id */ + id: number | string; + /** 名称 */ + name: string; + /** 是否是角色 */ + isRole: boolean; + /** 子集 */ + children: SysRoleTree[]; + } + + /** 数据范围枚举 */ + export enum DataScopeEnum { + /** 全部 */ + SCOPE_ALL = "SCOPE_ALL", + /** 所属组织及以下 */ + SCOPE_ORG_CHILD = "SCOPE_ORG_CHILD", + /** 所属组织 */ + SCOPE_ORG = "SCOPE_ORG", + /** 仅自己 */ + SCOPE_SELF = "SCOPE_SELF", + /** 自定义 */ + SCOPE_ORG_DEFINE = "SCOPE_ORG_DEFINE" + } + + /** 数据范围数组 */ + export const dataScopeOptions: DefaultDataScope[] = [ + { + level: 5, + title: "全部", + scopeCategory: DataScopeEnum.SCOPE_ALL, + scopeDefineOrgIdList: [] + }, + { + level: 4, + title: "所属组织及以下", + scopeCategory: DataScopeEnum.SCOPE_ORG_CHILD, + scopeDefineOrgIdList: [] + }, + { + level: 2, + title: "所属组织", + scopeCategory: DataScopeEnum.SCOPE_ORG, + scopeDefineOrgIdList: [] + }, + { + level: 1, + title: "仅自己", + scopeCategory: DataScopeEnum.SCOPE_SELF, + scopeDefineOrgIdList: [] + }, + { + level: 3, + title: "自定义", + scopeCategory: DataScopeEnum.SCOPE_ORG_DEFINE, + scopeDefineOrgIdList: [] + } + ]; + + /** 角色授权资源树 */ + export interface ResTreeSelector { + /** 模块id */ + id: number | string; + /** 模块名称 */ + title: string; + /** 图标 */ + icon: string; + /** 模块下菜单集合 */ + menu: RoleGrantResourceMenu[]; + } + + /** 角色授权资源菜单信息 */ + export interface RoleGrantResourceMenu { + /** 菜单id */ + id: number | string; + /** 父id */ + parentId: number | string; + /** 父名称 */ + parentName: string; + /** 模块名称 */ + title: string; + /** 模块id */ + module: number; + /** 菜单下按钮集合 */ + button: RoleGrantResourceButton[]; + /** 父级是否选中 */ + parentCheck: boolean; + /** 是否选中 */ + nameCheck: boolean; + } + + /** 角色授权资源按钮信息 */ + export interface RoleGrantResourceButton { + /** 按钮id */ + id: number | string; + /** 名称 */ + title: string; + /** 是否被选中 */ + check: boolean; + } + + /** 角色拥有资源 */ + export interface RoleOwnResource { + /** id */ + id: number | string; + /** 已授权资源信息 */ + grantInfoList: RelationRoleResource[]; + } + + /** 角色有哪些资源 */ + export interface RelationRoleResource { + /** 菜单id */ + menuId: number | string; + /** 按钮信息 */ + buttonInfo: number[] | string[]; + } + + /** 角色权限关系扩展 */ + export interface RelationRolePermission { + /** 数据范围 */ + scopeCategory: string; + /** 自定义机构范围列表 */ + scopeDefineOrgIdList: string[] | number[]; + /** 接口Url */ + apiUrl: string; + } + + /** 角色拥有权限 */ + export interface RoleOwnPermission { + /** id */ + id: number | string; + /** 已授权权限信息 */ + grantInfoList: RelationRolePermission[]; + } + + /** 角色授权资源请求参数 */ + export interface GrantResourceReq extends ReqId { + /** 授权资源信息 */ + grantInfoList: RelationRoleResource[]; + /** 默认数据范围,给用户授权资源用的 */ + defaultDataScope?: DefaultDataScope; + } + + /** 角色授权资源请求参数 */ + export interface GrantPermissionReq extends ReqId { + /** 授权资源信息 */ + grantInfoList: RelationRolePermission[]; + } + + /** 角色授权权限信息 */ + export interface RoleGrantPermission { + /** api地址 */ + api: string; + /** 是否被选中 */ + check: boolean; + /** 数据范围 */ + dataScope: DefaultDataScope; + } + + /** 角色授权用户请求参数 */ + export interface GrantUserReq extends ReqId { + /** 授权资源信息 */ + grantInfoList: number[] | string[]; + } + + /** 角色选择器请求参数 */ + export interface RoleSelectorReq { + /** 角色名称 */ + account?: string; + /** 组织id */ + orgId: string | number; + } +} diff --git a/web/src/api/interface/sys/limit/spa.ts b/web/src/api/interface/sys/limit/spa.ts new file mode 100644 index 0000000000000000000000000000000000000000..abd6535b8ee084c3b0a96b9357c639a1bfa58624 --- /dev/null +++ b/web/src/api/interface/sys/limit/spa.ts @@ -0,0 +1,67 @@ +/** + * @description 单页管理接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ +import { ReqPage } from "@/api/interface"; +import { MenuTypeDictEnum } from "@/enums"; +/** + * @Description: 单页管理接口 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +export namespace Spa { + /** 单页类型 */ + export type SpaType = MenuTypeDictEnum.MENU | MenuTypeDictEnum.LINK; + + /**单页分页查询 */ + export interface Page extends ReqPage { + menuType: SpaType; + } + + /** 单页信息 */ + export interface SpaInfo { + /** id */ + id: number | string; + /** 菜单名称 */ + title: string; + /** 组件名称 */ + name: string; + /** 菜单描述 */ + description: string; + /** 菜单类型 */ + menuType: string; + /** 菜单图标 */ + icon: string; + /** 菜单路径 */ + path: string; + /** 状态 */ + status: string; + /** 菜单组件 */ + component: string; + /** 需要高亮的 path (通常用作详情页高亮父级菜单) */ + activeMenu: string; + /** 是否首页 */ + isHome: boolean; + /** 排序 */ + sortCode: number; + /** 是否隐藏 */ + isHide: boolean; + /** 是否缓存 */ + isKeepAlive: boolean; + /** 是否全屏 */ + isAffix: boolean; + /** 是否全屏 */ + isFull: boolean; + /** 外链地址 */ + isLink: string; + } +} diff --git a/web/src/api/interface/sys/ops/config.ts b/web/src/api/interface/sys/ops/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..81d7ee21e80608ae48d7de21bb4af3853236cc8b --- /dev/null +++ b/web/src/api/interface/sys/ops/config.ts @@ -0,0 +1,128 @@ +/** + * @description 系统配置请求接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +import { SysConfigTypeEnum, TenantEnum } from "@/enums"; + +/** + * @Description: 系统配置请求接口 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +export namespace SysConfig { + /** 系统配置返回 */ + export interface ConfigInfo { + /** id */ + id: number | string; + /** 分类 */ + category: SysConfigTypeEnum; + /** key */ + configKey: string; + /** value */ + configValue: string; + /** 描述 */ + remark?: string; + /** 排序 */ + sortCode?: number; + } + + /** 工作台 */ + export interface WorkBenchData { + /** 快捷方式 */ + shortcut: number[] | string[]; + } + + // 超链接接口 + export interface FooterLinkProps { + /** 标题 */ + name: string; + /** 地址 */ + url: string; + /** 排序 */ + sortCode: number; + } + + /** 系统配置接口 */ + export interface SysBaseConfig { + /** 系统logo */ + SYS_LOGO: string; + /** 系统ICO文件 */ + SYS_ICO?: string; + /** 系统名称 */ + SYS_NAME: string; + /** 系统版本 */ + SYS_VERSION: string; + /** 系统版权 */ + SYS_COPYRIGHT: string; + /** 系统版权链接地址 */ + SYS_COPYRIGHT_URL: string; + /** 系统默认工作台数据 */ + SYS_DEFAULT_WORKBENCH_DATA?: WorkBenchData; + /** 网站状态 */ + SYS_WEB_STATUS?: string; + /** 网站关闭提示 */ + SYS_WEB_CLOSE_PROMPT?: string; + /** 多租户选项 */ + SYS_TENANT_OPTIONS: TenantEnum; + /** 底部超链接 */ + SYS_FOOTER_LINKS: FooterLinkProps[]; + } + + /** 登录配置接口 */ + export interface LoginPolicyConfig { + /** 单用户登录开关 */ + LOGIN_SINGLE_OPEN: string; + /** 登录验证码开关 */ + LOGIN_CAPTCHA_OPEN: string; + /** 登录验证码类型 */ + LOGIN_CAPTCHA_TYPE: string; + /** 登录错误次数 */ + LOGIN_ERROR_COUNT: number; + /** 登录重置时间 */ + LOGIN_ERROR_RESET_TIME: number; + /** 登录错误锁定时间 */ + LOGIN_ERROR_LOCK: number; + } + + /** 密码配置接口 */ + export interface PwdPolicyConfig { + /** 默认密码 */ + PWD_DEFAULT_PASSWORD: string; + /** 密码定期提醒更新 */ + PWD_REMIND: string; + /** 密码提醒时间 */ + PWD_REMIND_DAY: number; + /** 修改初始密码提醒 */ + PWD_UPDATE_DEFAULT: string; + /** 密码最小长度 */ + PWD_MIN_LENGTH: number; + /** 包含数字 */ + PWD_CONTAIN_NUM: string; + /** 包含小写字母 */ + PWD_CONTAIN_LOWER: string; + /** 包含大写字母 */ + PWD_CONTAIN_UPPER: string; + /** 包含特殊字符 */ + PWD_CONTAIN_CHARACTER: string; + } + + /** mqtt配置接口 */ + export interface MqttPolicyConfig { + /** MQTT服务端地址 */ + MQTT_PARAM_URL: string; + /** MQTT用户名 */ + MQTT_PARAM_USERNAME: string; + /** MQTT密码 */ + MQTT_PARAM_PASSWORD: string; + } +} diff --git a/web/src/api/interface/sys/ops/dict.ts b/web/src/api/interface/sys/ops/dict.ts new file mode 100644 index 0000000000000000000000000000000000000000..c152180c5b72e83d288da6221cf088901ab8b1e6 --- /dev/null +++ b/web/src/api/interface/sys/ops/dict.ts @@ -0,0 +1,53 @@ +/** + * @description 字典接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +import { ReqPage } from "@/api"; +/** + * @Description: 字典接口 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +export namespace SysDict { + /* 字典信息 */ + export interface DictTree { + /** 字典值 */ + dictValue: string; + /** 字典标签 */ + dictLabel: string; + /** 状态 */ + status: string; + /** 子集 */ + children: DictTree[]; + } + + /** 字典分页查询 */ + export interface Page extends ReqPage { + /** 所属模块名称 */ + parentId: number | string; + /** 字典分类 */ + category: string; + } + + /** 字典信息 */ + export interface DictInfo extends DictTree { + /** 字典id */ + id: number | string; + /** 父Id */ + parentId: number | string; + /** 字典分类 */ + category: string; + /** 字典排序 */ + sortCode: number; + } +} diff --git a/web/src/api/interface/sys/ops/index.ts b/web/src/api/interface/sys/ops/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..7ad287059905f8e65e417a603bdc853081405bc9 --- /dev/null +++ b/web/src/api/interface/sys/ops/index.ts @@ -0,0 +1,16 @@ +/** + * @description + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +export * from "./config"; +export * from "./dict"; diff --git a/web/src/api/interface/sys/organization/index.ts b/web/src/api/interface/sys/organization/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..f1c092a710622a2041180cea92136a3d838f23e4 --- /dev/null +++ b/web/src/api/interface/sys/organization/index.ts @@ -0,0 +1,17 @@ +/** + * @description + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +export * from "./org"; +export * from "./user"; +export * from "./position"; diff --git a/web/src/api/interface/sys/organization/org.ts b/web/src/api/interface/sys/organization/org.ts new file mode 100644 index 0000000000000000000000000000000000000000..b8d229b055d46fe90815cc1894e2c0b1e63975b2 --- /dev/null +++ b/web/src/api/interface/sys/organization/org.ts @@ -0,0 +1,65 @@ +import { SysUser } from "@/api"; +/** + * @description 组织管理接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +import { ReqPage } from "@/api"; +/** + * @Description: 组织管理接口 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +export namespace SysOrg { + /** 组织分页查询 */ + export interface Page extends ReqPage {} + + /** 组织树查询 */ + export interface ReqTree { + parentId?: number | string; + } + + /** 组织信息 */ + export interface SysOrgInfo { + /** 组织id */ + id: number | string; + /** 父ID */ + parentId: number | string; + /** 主管Id */ + directorId: number | string | null; + /** 组织名称 */ + name: string; + /** 组织全称 */ + names: string; + /** 组织编码 */ + code: string; + /** 组织分类 */ + category: string; + /** 状态 */ + status: string; + /** 排序码 */ + sortCode: number; + /** 主管信息 */ + directorInfo: SysUser.SysUserInfo | null; + } + /** 组织树 */ + export interface SysOrgTree { + /** 组织id */ + id: number | string; + /** 父ID */ + parentId: number | string; + /** 组织名称 */ + name: string; + /** 子集 */ + children: SysOrgTree[]; + } +} diff --git a/web/src/api/interface/sys/organization/position.ts b/web/src/api/interface/sys/organization/position.ts new file mode 100644 index 0000000000000000000000000000000000000000..c9a3afee5e8103c631b6c6fdc73c5a2b340fd8c2 --- /dev/null +++ b/web/src/api/interface/sys/organization/position.ts @@ -0,0 +1,66 @@ +/** + * @description 职位管理接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +import { ReqPage } from "@/api"; +import { CascaderOption } from "element-plus"; +/** + * @Description: 职位管理接口 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +export namespace SysPosition { + /** 职位分页查询 */ + export interface Page extends ReqPage {} + + /** 职位信息 */ + export interface SysPositionInfo { + /** 职位id */ + id: number | string; + /** 职位ID */ + orgId: number | string; + /** 职位名称 */ + name: string; + /** 职位编码 */ + code: string; + /** 职位分类 */ + category: string; + /** 状态 */ + status: string; + /** 排序码 */ + sortCode: number; + } + /** 职位树 */ + export interface SysPositionTree { + /** id */ + id: number | string; + /** 名称 */ + name: string; + /** 是否是职位 */ + isPosition: boolean; + /** 子集 */ + children: SysPositionTree[]; + } + + /** 职位选择器 */ + export interface SysPositionSelector extends CascaderOption { + /** id */ + id: string | number; + /** 名称 */ + name: string; + /** 组织Id */ + orgId: number | string; + /** 子集 */ + children: SysPositionSelector[]; + } +} diff --git a/web/src/api/interface/sys/organization/user.ts b/web/src/api/interface/sys/organization/user.ts new file mode 100644 index 0000000000000000000000000000000000000000..60f94db0cb9e7c88080cad4d30b013b91819b2a7 --- /dev/null +++ b/web/src/api/interface/sys/organization/user.ts @@ -0,0 +1,124 @@ +/** + * @description 用户管理接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +import { ReqId, ReqPage } from "@/api"; +/** + * @Description: 用户管理接口 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +export namespace SysUser { + /** 用户分页查询 */ + export interface Page extends ReqPage { + /** 用户状态 */ + status?: string; + } + + /** 用户信息 */ + export interface SysUserInfo { + id: number | string; + /** 头像 */ + avatar?: string; + /** 签名 */ + signature?: string; + /** 账号 */ + account: string; + /** 姓名 */ + name?: string; + /** 昵称 */ + nickname?: string; + /** 性别 */ + gender?: string; + /** 出生日期 */ + birthday?: string; + /** 民族 */ + nation?: string; + /** 籍贯 */ + nativePlace?: string; + /** 家庭住址 */ + homeAddress?: string; + /** 通信地址 */ + mailingAddress?: string; + /** 证件类型 */ + idCardType?: string; + /** 证件号码 */ + idCardNumber?: string; + /** 文化程度 */ + cultureLevel?: string; + /** 政治面貌 */ + politicalOutlook?: string; + /** 毕业院校 */ + college?: string; + /** 学历 */ + education?: string; + /** 学制 */ + eduLength?: string; + /** 学位 */ + degree?: string; + /** 手机 */ + phone?: string; + /** 邮箱 */ + email?: string; + /** 家庭电话 */ + homeTel?: string; + /** 办公电话 */ + officeTel?: string; + /** 紧急联系人 */ + emergencyContact?: string; + /** 紧急联系人电话 */ + emergencyPhone?: string; + /** 紧急联系人地址 */ + emergencyAddress?: string; + /** 员工编号 */ + empNo?: string; + /** 入职日期 */ + entryDate?: string; + /** 机构id */ + orgId: number; + /** 职位id */ + positionId: number; + /** 职级 */ + positionLevel?: string; + /** 主管id */ + directorId?: number | string | null; + /** 主管id */ + orgAndPosIdList: number[] | string[]; + /** 主管id */ + directorInfo?: SysUser.SysUserInfo | null; + /** 用户状态 */ + status?: string; + /** 排序码 */ + sortCode?: number; + /** 默认模块 */ + defaultModule?: number | string; + /** 机构信息 */ + orgName?: string; + /** 机构信息全称 */ + orgNames?: string; + } + + /** 用户分页查询 */ + export interface UserSelector extends ReqPage { + /** 用户账号 */ + account?: string; + /** 组织id */ + orgId: string | number; + } + + /** 用户授权角色请求参数 */ + export interface GrantRoleReq extends ReqId { + /** 授权资源信息 */ + roleIdList: number[] | string[]; + } +} diff --git a/web/src/api/interface/sys/upload.ts b/web/src/api/interface/sys/upload.ts new file mode 100644 index 0000000000000000000000000000000000000000..77368976a9fbaa49afc4d97f495da23ab8f183ac --- /dev/null +++ b/web/src/api/interface/sys/upload.ts @@ -0,0 +1,20 @@ +/** + * @description + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +export namespace Upload { + // 文件上传返回 + export interface ResFileUrl { + fileUrl: string; // 文件地址 + } +} diff --git a/web/src/api/interface/sys/userCenter.ts b/web/src/api/interface/sys/userCenter.ts new file mode 100644 index 0000000000000000000000000000000000000000..3565b8ccd80b7814fadf0a3ea6f293766ca36705 --- /dev/null +++ b/web/src/api/interface/sys/userCenter.ts @@ -0,0 +1,72 @@ +/** + * @description 用户个人中心接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import { ReqId } from "@/api/interface"; +/** + * @Description: 用户个人中心接口 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + + */ +export namespace UserCenter { + /** 设置默认模块 */ + export interface ResModuleDefault extends ReqId { + /** 是否默认 */ + ifDefault: boolean; + } + + /** 修改用户密码 */ + export interface ReqUpdatePassword { + /** 旧密码 */ + password: string; + /** 新密码 */ + newPassword: string; + } + + /** 更新快捷方式 */ + export interface ResUpdateUserWorkbench { + /** 快捷方式 */ + WorkbenchData: string; + } + + /** 未读消息数量 */ + export interface ResUnReadCount { + /** 分类 */ + category: string; + /** 数量 */ + unReadCount: number; + } + /** 消息详情 */ + export interface ResSysMessageDetail { + /** 消息id */ + id: number | string; + /** 消息类型 */ + category: string; + /** 消息标题 */ + subject: string; + /** 消息内容 */ + content: string; + /** 是否已读 */ + read: boolean; + /**发送时间 */ + sendTime: string; + /**发送时间格式化 */ + sendTimeFormat: string; + } + + export interface ReqMyMessagePage { + category?: string; //消息分类 + searchKey?: string; //关键字 + } +} diff --git a/web/src/api/modules/biz/index.ts b/web/src/api/modules/biz/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..4004100895c47faa7464238d641eadf5bd7fccee --- /dev/null +++ b/web/src/api/modules/biz/index.ts @@ -0,0 +1,16 @@ +/** + * @description + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +export * from "./organization"; diff --git a/web/src/api/modules/biz/organization/index.ts b/web/src/api/modules/biz/organization/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..9d823b0ddb6b650d466e00332e7493d59e266e8d --- /dev/null +++ b/web/src/api/modules/biz/organization/index.ts @@ -0,0 +1,18 @@ +/** + * @description + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +export * from "./org"; +export * from "./user"; +export * from "./position"; +export * from "./role"; diff --git a/web/src/api/modules/biz/organization/org.ts b/web/src/api/modules/biz/organization/org.ts new file mode 100644 index 0000000000000000000000000000000000000000..c6ab392243d733a6b40cdab5638126c041b8d851 --- /dev/null +++ b/web/src/api/modules/biz/organization/org.ts @@ -0,0 +1,70 @@ +/** + * @description 机构管理 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +import { ReqId, ResPage, SysOrg } from "@/api"; +import { moduleRequest } from "@/api/request"; +const http = moduleRequest("/biz/organization/org/"); + +/** + * @Description: 机构管理 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +const bizOrgApi = { + /** 获取机构分页 */ + page(params: SysOrg.Page) { + return http.get>("page", params); + }, + /** 获取机构树 */ + tree() { + return http.get("tree"); + }, + /** 获取机构详情 */ + detail(params: ReqId) { + return http.get("detail", params); + }, + /** 提交表单 edit为true时为编辑,默认为新增 */ + submitForm(params = {}, edit: boolean = false) { + return http.post(edit ? "edit" : "add", params); + }, + /** 删除机构 */ + delete(params: ReqId[]) { + return http.post("delete", params); + }, + /** 复制机构 */ + copy(params = {}) { + return http.post("copy", params); + } +}; + +/** + * @Description: 机构管理按钮权限码 + * @Author: huguodong + * @Date: 2024-02-20 09:51:15 + */ +const bizOrgButtonCode = { + /** 新增机构 */ + add: "bizOrgAdd", + /** 编辑机构 */ + edit: "bizOrgEdit", + /** 删除机构 */ + delete: "bizOrgDelete", + /** 批量删除机构 */ + batchDelete: "bizOrgBatchDelete", + /** 复制机构 */ + copy: "bizOrgCopy" +}; + +export { bizOrgApi, bizOrgButtonCode }; diff --git a/web/src/api/modules/biz/organization/position.ts b/web/src/api/modules/biz/organization/position.ts new file mode 100644 index 0000000000000000000000000000000000000000..e6388ba854adcbb8bd4f0c38bf8a76fb5c8de830 --- /dev/null +++ b/web/src/api/modules/biz/organization/position.ts @@ -0,0 +1,68 @@ +/** + * @description 岗位管理 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +import { ReqId, ResPage, SysPosition } from "@/api"; +import { moduleRequest } from "@/api/request"; +const http = moduleRequest("/biz/organization/position/"); + +/** + * @Description: 岗位管理 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +const bizPositionApi = { + /** 获取岗位分页 */ + page(params: SysPosition.Page) { + return http.get>("page", params); + }, + /** 获取岗位树 */ + tree() { + return http.get("tree", {}, { loading: false }); + }, + /** 获取岗位详情 */ + detail(params: ReqId) { + return http.get("detail", params); + }, + /** 提交表单 edit为true时为编辑,默认为新增 */ + submitForm(params = {}, edit: boolean = false) { + return http.post(edit ? "edit" : "add", params); + }, + /** 删除岗位 */ + delete(params: ReqId[]) { + return http.post("delete", params); + }, + /** 岗位选择器 */ + selector() { + return http.get("selector", {}, { loading: false }); + } +}; + +/** + * @Description: 岗位管理按钮权限码 + * @Author: huguodong + * @Date: 2024-02-20 09:51:15 + */ +const bizPositionButtonCode = { + /** 新增岗位 */ + add: "bizPositionAdd", + /** 编辑岗位 */ + edit: "bizPositionEdit", + /** 删除岗位 */ + delete: "bizPositionDelete", + /** 批量删除岗位 */ + batchDelete: "bizPositionBatchDelete" +}; + +export { bizPositionApi, bizPositionButtonCode }; diff --git a/web/src/api/modules/biz/organization/role.ts b/web/src/api/modules/biz/organization/role.ts new file mode 100644 index 0000000000000000000000000000000000000000..8bd901dc19fde63c98f689c3dcd106f1fc3ffe19 --- /dev/null +++ b/web/src/api/modules/biz/organization/role.ts @@ -0,0 +1,103 @@ +/** + * @description 角色管理 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +import { ReqId, ResPage, SysRole, SysUser } from "@/api"; +import { moduleRequest } from "@/api/request"; +const http = moduleRequest("/biz/organization/role/"); + +/** + * @Description: 角色管理 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +const bizRoleApi = { + /** 获取角色分页 */ + page(params: SysRole.Page) { + return http.get>("page", params); + }, + /** 获取角色树 */ + tree() { + return http.get("tree", {}, { loading: false }); + }, + /** 获取角色详情 */ + detail(params: ReqId) { + return http.get("detail", params); + }, + /** 提交表单 edit为true时为编辑,默认为新增 */ + submitForm(params = {}, edit: boolean = false) { + return http.post(edit ? "edit" : "add", params); + }, + /** 删除角色 */ + delete(params: ReqId[]) { + return http.post("delete", params); + }, + /** 获取资源授权树 */ + resourceTreeSelector() { + return http.get("resourceTreeSelector", {}, { loading: false }); + }, + /** 获取权限授权树 */ + permissionTreeSelector(params: ReqId) { + return http.get("permissionTreeSelector", params, { loading: false }); + }, + /** 获取角色拥有资源 */ + ownResource(params: ReqId) { + return http.get("ownResource", params, { loading: false }); + }, + /** 给角色授权资源 */ + grantResource(params: SysRole.GrantResourceReq) { + return http.post("grantResource", params); + }, + /** 获取角色拥有权限 */ + ownPermission(params: ReqId) { + return http.get("ownPermission", params, { loading: false }); + }, + /** 给角色授权权限 */ + grantPermission(params: SysRole.GrantPermissionReq) { + return http.post("grantPermission", params); + }, + /** 获取角色下的用户 */ + ownUser(params: ReqId) { + return http.get("ownUser", params, { loading: false }); + }, + /** 给角色授权用户 */ + grantUser(params: SysRole.GrantUserReq) { + return http.post("grantUser", params); + }, + /** 获取角色选择器 */ + roleSelector(params: SysRole.RoleSelectorReq) { + return http.get("roleSelector", params, { loading: false }); + } +}; + +/** + * @Description: 角色管理按钮权限码 + * @Author: huguodong + * @Date: 2024-02-20 09:51:15 + */ +const bizRoleButtonCode = { + /** 新增角色 */ + add: "bizRoleAdd", + /** 编辑角色 */ + edit: "bizRoleEdit", + /** 删除角色 */ + delete: "bizRoleDelete", + /** 批量删除角色 */ + batchDelete: "bizRoleBatchDelete", + /** 授权资源 */ + grantResource: "bizRoleGrantResource", + /** 授权用户 */ + grantUser: "bizRoleGrantUser" +}; +export { bizRoleApi, bizRoleButtonCode }; diff --git a/web/src/api/modules/biz/organization/user.ts b/web/src/api/modules/biz/organization/user.ts new file mode 100644 index 0000000000000000000000000000000000000000..e25f9de852917604e4a5f69077019fffd1ab269b --- /dev/null +++ b/web/src/api/modules/biz/organization/user.ts @@ -0,0 +1,107 @@ +import { CommonStatusEnum } from "@/enums"; +/** + * @description 人员管理 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +import { ReqId, ResPage, SysRole, SysUser } from "@/api"; +import { moduleRequest } from "@/api/request"; +const http = moduleRequest("/biz/organization/user/"); + +/** + * @Description: 人员管理 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +const bizUserApi = { + /** 人员分页 */ + page(params: SysUser.Page) { + return http.get>("page", params); + }, + /** 人员选择器 */ + selector(params: any) { + return http.get>("selector", params); + }, + /** 获取人员详情 */ + detail(params: ReqId) { + return http.get("detail", params); + }, + /** 提交表单 edit为true时为编辑,默认为新增 */ + submitForm(params = {}, edit: boolean = false) { + return http.post(edit ? "edit" : "add", params); + }, + /** 删除人员 */ + delete(params: ReqId[]) { + return http.post("delete", params); + }, + /** 修改人员状态 */ + updateStatus(params: ReqId, operation: CommonStatusEnum) { + return http.post(operation === CommonStatusEnum.DISABLE ? "disableUser" : "enableUser", params); + }, + /** 重置人员密码 */ + resetPassword(params: ReqId) { + return http.post("resetPassword", params); + }, + /** 获取人员拥有角色 */ + ownRole(params: ReqId) { + return http.get("ownRole", params); + }, + /** 给人员授权角色 */ + grantRole(params: SysUser.GrantRoleReq) { + return http.post("grantRole", params); + }, + // 获取权限授权树 + permissionTreeSelector(params: ReqId) { + return http.get("permissionTreeSelector", params, { loading: false }); + }, + // 获取人员拥有资源 + ownResource(params: ReqId) { + return http.get("ownResource", params, { loading: false }); + }, + /** 给人员授权资源 */ + grantResource(params: SysRole.GrantResourceReq) { + return http.post("grantResource", params); + }, + /** 获取人员拥有权限 */ + ownPermission(params: ReqId) { + return http.get("ownPermission", params, { loading: false }); + }, + /** 获取人员拥有权限 */ + grantPermission(params: SysRole.GrantPermissionReq) { + return http.post("grantPermission", params); + } +}; + +/** + * @Description: 人员管理按钮权限码 + * @Author: huguodong + * @Date: 2024-02-20 09:51:15 + */ +const bizUserButtonCode = { + /** 新增人员 */ + add: "bizUserAdd", + /** 编辑人员 */ + edit: "bizUserEdit", + /** 删除人员 */ + delete: "bizUserDelete", + /** 批量删除人员 */ + batchDelete: "bizUserBatchDelete", + /** 授权角色 */ + grantRole: "bizUserGrantRole", + /** 重置密码 */ + pwdReset: "bizUserPwdReset", + /** 启用禁用 */ + UpdateStatus: "bizUserUpdateStatus" +}; + +export { bizUserApi, bizUserButtonCode }; diff --git a/web/src/api/modules/index.ts b/web/src/api/modules/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..5348392a51c347f968470118a19085ec1d7a1ba4 --- /dev/null +++ b/web/src/api/modules/index.ts @@ -0,0 +1,17 @@ +/** + * @description + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +export * from "./sys"; +export * from "./biz"; diff --git a/web/src/api/modules/sys/audit/index.ts b/web/src/api/modules/sys/audit/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..9bced83a270c58213adbb72275282ab7909f8f4c --- /dev/null +++ b/web/src/api/modules/sys/audit/index.ts @@ -0,0 +1,16 @@ +/** + * @description + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +export * from "./visLog"; +export * from "./opLog"; diff --git a/web/src/api/modules/sys/audit/opLog.ts b/web/src/api/modules/sys/audit/opLog.ts new file mode 100644 index 0000000000000000000000000000000000000000..7ea863246ae9df7d0e01101d63044c357d18e548 --- /dev/null +++ b/web/src/api/modules/sys/audit/opLog.ts @@ -0,0 +1,48 @@ +/** + * @description 操作日志 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +import { ResPage, OpLog, ReqId } from "@/api/interface"; +import { moduleRequest } from "@/api/request"; +const http = moduleRequest("/sys/audit/logOperate/"); + +/** + * @Description: 操作日志 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +const opLogApi = { + /** 获取操作日志分页 */ + page(params: OpLog.Page) { + return http.get>("page", params); + }, + /** 获取操作日志柱状图数据 */ + columnChart() { + return http.get("columnChartData", {}, { loading: false }); + }, + /** 获取操作日志饼状图数据 */ + pieChart() { + return http.get("pieChartData", {}, { loading: false }); + }, + /** 获取操作日志详情 */ + detail(params: ReqId) { + return http.get("detail", params, { loading: false }); + }, + /** 清空操作日志 */ + delete(category: string) { + return http.post("delete", { category }); + } +}; + +export { opLogApi }; diff --git a/web/src/api/modules/sys/audit/visLog.ts b/web/src/api/modules/sys/audit/visLog.ts new file mode 100644 index 0000000000000000000000000000000000000000..09593031d0aa04289269c3a5960c83499d569df0 --- /dev/null +++ b/web/src/api/modules/sys/audit/visLog.ts @@ -0,0 +1,44 @@ +/** + * @description 访问日志 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +import { ResPage, VisLog } from "@/api/interface"; +import { moduleRequest } from "@/api/request"; +const http = moduleRequest("/sys/audit/logVisit/"); + +/** + * @Description: 访问日志 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +const visLogApi = { + /** 获取访问日志分页 */ + page(params: VisLog.Page) { + return http.get>("page", params); + }, + /** 获取访问日志折线图数据 */ + lineChart() { + return http.get("lineChartData", {}, { loading: false }); + }, + /** 获取访问日志饼状图数据 */ + pieChart() { + return http.get("pieChartData", {}, { loading: false }); + }, + /** 清空访问日志 */ + delete(category: string) { + return http.post("delete", { category }); + } +}; + +export { visLogApi }; diff --git a/web/src/api/modules/sys/auth/index.ts b/web/src/api/modules/sys/auth/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..070b49daeb8530f933481aee36c25a75fc9593a9 --- /dev/null +++ b/web/src/api/modules/sys/auth/index.ts @@ -0,0 +1,15 @@ +/** + * @description + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +export * from "./login"; diff --git a/web/src/api/modules/sys/auth/login.ts b/web/src/api/modules/sys/auth/login.ts new file mode 100644 index 0000000000000000000000000000000000000000..3bd0a7ce1d7d2c75f6f273d7d2c44def6ebfc6b7 --- /dev/null +++ b/web/src/api/modules/sys/auth/login.ts @@ -0,0 +1,51 @@ +/** + * @description 登录模块接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import { Login } from "@/api/interface"; +import { moduleRequest } from "@/api/request"; +const http = moduleRequest("/sys/auth/b/"); + +/** + * @Description: + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +const loginApi = { + /** 用户登录 */ + login(params: Login.LoginForm) { + return http.post("login", params, { loading: false }); // 正常 post json 请求 = application/json + }, + /** 获取验证码 */ + picCaptcha() { + return http.get("getPicCaptcha", {}, { loading: false }); + }, + /** 用户退出登录 */ + logout(params: Login.Logout) { + return http.post("logout", params); + }, + /** 获取用户信息 */ + getLoginUser() { + return http.get("getLoginUser", {}, { loading: false }); + }, + /** 获取短信验证码 */ + getPhoneValidCode(params: Login.ReqPhoneValidCode) { + return http.get("getPhoneValidCode", params, { loading: false }); + }, + /** 手机号登录 */ + loginByPhone(params: Login.PhoneLoginForm) { + return http.post("loginByPhone", params, { loading: false }); + } +}; + +export { loginApi }; diff --git a/web/src/api/modules/sys/common/index.ts b/web/src/api/modules/sys/common/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..99f3b5a48141efdd2a469c9de4cf2bb0083919b4 --- /dev/null +++ b/web/src/api/modules/sys/common/index.ts @@ -0,0 +1,56 @@ +/** + * @description 通用接口 + * @license Apache License Version 2.0 +2022 +, + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +/** + * @description 通用接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import { SysConfig, SysOrg } from "@/api/interface"; +import { moduleRequest } from "@/api/request"; +const http = moduleRequest("/sys/"); + +/** + * @Description: 通用接口 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + + */ +const commonApi = { + /** 获取系统配置 */ + sysInfo() { + return http.get("sysInfo", {}, { loading: false, cancel: false }); + }, + /** 获取登录策略 */ + loginPolicy() { + return http.get("loginPolicy", {}, { loading: false, cancel: false }); + }, + /** 获取租户列表 */ + tenantList() { + return http.get("tenantList", {}, { loading: false, cancel: false }); + } +}; + +export { commonApi }; diff --git a/web/src/api/modules/sys/dev/index.ts b/web/src/api/modules/sys/dev/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..9e8ac03150465cc760be860139d90b24875cddee --- /dev/null +++ b/web/src/api/modules/sys/dev/index.ts @@ -0,0 +1,17 @@ +/** + * @description 基础工具 + * @license Apache License Version 2.0 +2022 +, + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +export * from "./message"; diff --git a/web/src/api/modules/sys/dev/message.ts b/web/src/api/modules/sys/dev/message.ts new file mode 100644 index 0000000000000000000000000000000000000000..f4daf83ffa91e665fb9e08d79b898f5f8059038e --- /dev/null +++ b/web/src/api/modules/sys/dev/message.ts @@ -0,0 +1,43 @@ +/** + * @description 站内消息 + * @license Apache License Version 2.0 +2022 +, + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +import { moduleRequest } from "@/api/request"; +import { ReqId, ResPage, SysMessage } from "@/api"; +const http = moduleRequest("/sys/dev/message/"); +const messageApi = { + /** 获取消息分页 */ + page(params: any) { + return http.get>("page", params); + }, + /** 获取消息详情 */ + detail(params = {}) { + return http.get("detail", params); + }, + /** 获取已读未读详情 */ + readDetail(params = {}) { + return http.get("readDetail", params); + }, + /** 提交表单 edit为true时为编辑,默认为新增 */ + submitForm(params = {}, edit: boolean = false) { + return http.post(edit ? "edit" : "add", params); + }, + /** 删除单页 */ + delete(params: ReqId[]) { + return http.post("delete", params); + } +}; + +export { messageApi }; diff --git a/web/src/api/modules/sys/im/index.ts b/web/src/api/modules/sys/im/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..76dc9571cdd11dcbde0d1209e304a19ccf6ffeea --- /dev/null +++ b/web/src/api/modules/sys/im/index.ts @@ -0,0 +1,16 @@ +/** + * @description 即时通讯 + * @license Apache License Version 2.0 +2022 +, + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ +export * from "./mqtt"; diff --git a/web/src/api/modules/sys/im/mqtt.ts b/web/src/api/modules/sys/im/mqtt.ts new file mode 100644 index 0000000000000000000000000000000000000000..e99f3043dd303219a7727c2373489be4cd27a647 --- /dev/null +++ b/web/src/api/modules/sys/im/mqtt.ts @@ -0,0 +1,28 @@ +/** + * @description mqtt 接口 + * @license Apache License Version 2.0 +2022 +, + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +import { Mqtt } from "@/api"; +import { moduleRequest } from "@/api/request"; +const http = moduleRequest("/mqtt/"); +const mqttApi = { + /** + * @description 获取mqtt配置 + * @returns + */ + getMqttParameter: () => http.get("getParameter", {}, { loading: false, cancel: false }) +}; + +export { mqttApi }; diff --git a/web/src/api/modules/sys/index.ts b/web/src/api/modules/sys/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..f49b3ab63d78a0762ffcdedf79e24726a5b9e197 --- /dev/null +++ b/web/src/api/modules/sys/index.ts @@ -0,0 +1,25 @@ +/** + * @description + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +export * from "./auth"; +export * from "./userCenter"; +export * from "./limit"; +export * from "./ops"; +export * from "./audit"; +export * from "./organization"; +export * from "./upload"; +export * from "./common"; +export * from "./im"; +export * from "./dev"; diff --git a/web/src/api/modules/sys/limit/button.ts b/web/src/api/modules/sys/limit/button.ts new file mode 100644 index 0000000000000000000000000000000000000000..3860dec8451f1193005a3ddc029397a3af12f850 --- /dev/null +++ b/web/src/api/modules/sys/limit/button.ts @@ -0,0 +1,48 @@ +/** + * @description 权限按钮 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +import { moduleRequest } from "@/api/request"; +import { ReqId, ResPage, Button } from "@/api/interface"; +const http = moduleRequest("/sys/limit/button/"); + +/** + * @Description: 权限按钮 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +const buttonApi = { + /** 获取单页分页 */ + page(params: Button.Page) { + return http.get>("page", params); + }, + /** 获取单页详情 */ + detail(params: ReqId) { + return http.get("detail", params); + }, + /** 提交表单 edit为true时为编辑,默认为新增 */ + submitForm(params = {}, edit: boolean = false) { + return http.post(edit ? "edit" : "add", params); + }, + /** 删除单页 */ + delete(params: ReqId[]) { + return http.post("delete", params); + }, + /** 删除单页 */ + batch(params: Button.Batch) { + return http.post("batch", params); + } +}; + +export { buttonApi }; diff --git a/web/src/api/modules/sys/limit/index.ts b/web/src/api/modules/sys/limit/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..350f72b5209a10fd94ee6739fd5a6eda265f2bdf --- /dev/null +++ b/web/src/api/modules/sys/limit/index.ts @@ -0,0 +1,19 @@ +/** + * @description 资源管理接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +export * from "./spa"; +export * from "./module"; +export * from "./menu"; +export * from "./button"; +export * from "./role"; diff --git a/web/src/api/modules/sys/limit/menu.ts b/web/src/api/modules/sys/limit/menu.ts new file mode 100644 index 0000000000000000000000000000000000000000..efe835de67887ee1f5d5b6e470c96c6df1dfcda0 --- /dev/null +++ b/web/src/api/modules/sys/limit/menu.ts @@ -0,0 +1,52 @@ +/** + * @description 系统菜单 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +import { moduleRequest } from "@/api/request"; +import { ReqId, Spa, Menu } from "@/api/interface"; +const http = moduleRequest("/sys/limit/menu/"); + +/** + * @Description: 系统菜单 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +const menuApi = { + /** 获取菜单树 */ + tree(params: Menu.Tree) { + return http.get("tree", params); + }, + /** 获取菜单树选择器 */ + menuTreeSelector(params: Menu.MenuTreeSelectorReq) { + return http.get("menuTreeSelector", params); + }, + /** 获取菜单详情 */ + detail(params: ReqId) { + return http.get("detail", params); + }, + /** 提交表单 edit为true时为编辑,默认为新增 */ + submitForm(params = {}, edit: boolean = false) { + return http.post(edit ? "edit" : "add", params); + }, + /** 删除菜单 */ + delete(params: ReqId[]) { + return http.post("delete", params); + }, + /** 修改模块菜单 */ + changeModule(params: { id: number | string; module: number | string }) { + return http.post("changeModule", params); + } +}; + +export { menuApi }; diff --git a/web/src/api/modules/sys/limit/module.ts b/web/src/api/modules/sys/limit/module.ts new file mode 100644 index 0000000000000000000000000000000000000000..5aec8a7ab54f5fc397bf73f43189778366f96b49 --- /dev/null +++ b/web/src/api/modules/sys/limit/module.ts @@ -0,0 +1,48 @@ +/** + * @description 应用模块 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +import { moduleRequest } from "@/api/request"; +import { ReqId, ResPage, Spa } from "@/api/interface"; +const http = moduleRequest("/sys/limit/module/"); + +/** + * @Description: 应用模块 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +const moduleApi = { + /** 获取模块分页 */ + page(params: Spa.Page) { + return http.get>("page", params); + }, + /** 获取模块详情 */ + detail(params: ReqId) { + return http.get("detail", params); + }, + /** 提交表单 edit为true时为编辑,默认为新增 */ + submitForm(params = {}, edit: boolean = false) { + return http.post(edit ? "edit" : "add", params); + }, + /** 删除模块 */ + delete(params: ReqId[]) { + return http.post("delete", params); + }, + /** 获取模块列表 */ + list() { + return http.get("list"); + } +}; + +export { moduleApi }; diff --git a/web/src/api/modules/sys/limit/role.ts b/web/src/api/modules/sys/limit/role.ts new file mode 100644 index 0000000000000000000000000000000000000000..c4ce79e4348b2e15d5a03c2e0a0ebda5c74be542 --- /dev/null +++ b/web/src/api/modules/sys/limit/role.ts @@ -0,0 +1,84 @@ +/** + * @description 角色管理 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +import { ReqId, ResPage, SysRole, SysUser } from "@/api"; +import { moduleRequest } from "@/api/request"; +const http = moduleRequest("/sys/limit/role/"); + +/** + * @Description: 角色管理 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +const sysRoleApi = { + /** 获取角色分页 */ + page(params: SysRole.Page) { + return http.get>("page", params); + }, + /** 获取角色树 */ + tree() { + return http.get("tree", {}, { loading: false }); + }, + /** 获取角色详情 */ + detail(params: ReqId) { + return http.get("detail", params); + }, + /** 提交表单 edit为true时为编辑,默认为新增 */ + submitForm(params = {}, edit: boolean = false) { + return http.post(edit ? "edit" : "add", params); + }, + /** 删除角色 */ + delete(params: ReqId[]) { + return http.post("delete", params); + }, + /** 获取资源授权树 */ + resourceTreeSelector() { + return http.get("resourceTreeSelector", {}, { loading: false }); + }, + /** 获取权限授权树 */ + permissionTreeSelector(params: ReqId) { + return http.get("permissionTreeSelector", params, { loading: false }); + }, + /** 获取角色拥有资源 */ + ownResource(params: ReqId) { + return http.get("ownResource", params, { loading: false }); + }, + /** 给角色授权资源 */ + grantResource(params: SysRole.GrantResourceReq) { + return http.post("grantResource", params); + }, + /** 获取角色拥有权限 */ + ownPermission(params: ReqId) { + return http.get("ownPermission", params, { loading: false }); + }, + /** 给角色授权权限 */ + grantPermission(params: SysRole.GrantPermissionReq) { + return http.post("grantPermission", params); + }, + /** 获取角色下的用户 */ + ownUser(params: ReqId) { + return http.get("ownUser", params, { loading: false }); + }, + /** 给角色授权用户 */ + grantUser(params: SysRole.GrantUserReq) { + return http.post("grantUser", params); + }, + /** 获取角色选择器 */ + roleSelector(params: SysRole.RoleSelectorReq) { + return http.get("roleSelector", params, { loading: false }); + } +}; + +export { sysRoleApi }; diff --git a/web/src/api/modules/sys/limit/spa.ts b/web/src/api/modules/sys/limit/spa.ts new file mode 100644 index 0000000000000000000000000000000000000000..adcc6b4c701a3dbf479d5a68282f9e29cb926aa0 --- /dev/null +++ b/web/src/api/modules/sys/limit/spa.ts @@ -0,0 +1,43 @@ +/** + * @description 单页管理接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import { moduleRequest } from "@/api/request"; +import { ReqId, ResPage, Spa } from "@/api/interface"; +const http = moduleRequest("/sys/limit/spa/"); + +/** + * @Description: 单页管理 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +const spaApi = { + /** 获取单页分页 */ + page(params: Spa.Page) { + return http.get>("page", params); + }, + /** 获取单页详情 */ + detail(params: ReqId) { + return http.get("detail", params); + }, + /** 提交表单 edit为true时为编辑,默认为新增 */ + submitForm(params = {}, edit: boolean = false) { + return http.post(edit ? "edit" : "add", params); + }, + /** 删除单页 */ + delete(params: ReqId[]) { + return http.post("delete", params); + } +}; + +export { spaApi }; diff --git a/web/src/api/modules/sys/ops/config.ts b/web/src/api/modules/sys/ops/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..5598c2499b762103d4216931fb04b60e9178abcf --- /dev/null +++ b/web/src/api/modules/sys/ops/config.ts @@ -0,0 +1,52 @@ +/** + * @description 系统配置模块 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import { ReqId, ReqPage, ResPage, SysConfig } from "@/api"; +import { moduleRequest } from "@/api/request"; +const http = moduleRequest("/sys/ops/config/"); + +/** + * @Description: 系统配置 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + + */ +const sysConfigApi = { + /** 获取系统配置 */ + sysBaseList() { + return http.get("sysBaseList", {}, { loading: false }); + }, + /** 获取配置列表 */ + list() { + return http.get("list", {}, { loading: false, cancel: false }); + }, + // 配置批量更新 + configEditForm(params: SysConfig.ConfigInfo[]) { + return http.post("editBatch", params); + }, + /** 分页获取其他配置 */ + page(params: ReqPage) { + return http.get>("page", params); + }, + /** 删除配置 */ + delete(params: ReqId[]) { + return http.post("delete", params); + }, + /** 提交表单 edit为true时为编辑,默认为新增 */ + submitForm(params = {}, edit: boolean = false) { + return http.post(edit ? "edit" : "add", params); + } +}; + +export { sysConfigApi }; diff --git a/web/src/api/modules/sys/ops/dict.ts b/web/src/api/modules/sys/ops/dict.ts new file mode 100644 index 0000000000000000000000000000000000000000..8b4e6c94941536502e643debdc0869464bb67c8e --- /dev/null +++ b/web/src/api/modules/sys/ops/dict.ts @@ -0,0 +1,48 @@ +/** + * @description 系统字典 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +import { SysDict, ReqId, ResPage } from "@/api"; +import { moduleRequest } from "@/api/request"; +const http = moduleRequest("/sys/ops/dict/"); + +/** + * @Description: 系统字典 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +const sysDictApi = { + /** 获取字典树 */ + tree() { + return http.get("tree", {}, { loading: false }); + }, + /** 获取字典分页 */ + page(params: SysDict.Page) { + return http.get>("page", params); + }, + /** 获取单页详情 */ + detail(params: ReqId) { + return http.get("detail", params); + }, + /** 提交表单 edit为true时为编辑,默认为新增 */ + submitForm(params = {}, edit: boolean = false) { + return http.post(edit ? "edit" : "add", params); + }, + /** 删除单页 */ + delete(params: ReqId[]) { + return http.post("delete", params); + } +}; + +export { sysDictApi }; diff --git a/web/src/api/modules/sys/ops/index.ts b/web/src/api/modules/sys/ops/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..7ad287059905f8e65e417a603bdc853081405bc9 --- /dev/null +++ b/web/src/api/modules/sys/ops/index.ts @@ -0,0 +1,16 @@ +/** + * @description + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +export * from "./config"; +export * from "./dict"; diff --git a/web/src/api/modules/sys/organization/index.ts b/web/src/api/modules/sys/organization/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..f1c092a710622a2041180cea92136a3d838f23e4 --- /dev/null +++ b/web/src/api/modules/sys/organization/index.ts @@ -0,0 +1,17 @@ +/** + * @description + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +export * from "./org"; +export * from "./user"; +export * from "./position"; diff --git a/web/src/api/modules/sys/organization/org.ts b/web/src/api/modules/sys/organization/org.ts new file mode 100644 index 0000000000000000000000000000000000000000..9ef2039792e64c86d0016abe3fde99cb8d9e99e5 --- /dev/null +++ b/web/src/api/modules/sys/organization/org.ts @@ -0,0 +1,52 @@ +/** + * @description 组织管理 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +import { ReqId, ResPage, SysOrg } from "@/api"; +import { moduleRequest } from "@/api/request"; +const http = moduleRequest("/sys/organization/org/"); + +/** + * @Description: 组织管理 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +const sysOrgApi = { + /** 获取组织分页 */ + page(params: SysOrg.Page) { + return http.get>("page", params); + }, + /** 获取组织树 */ + tree() { + return http.get("tree"); + }, + /** 获取组织详情 */ + detail(params: ReqId) { + return http.get("detail", params); + }, + /** 提交表单 edit为true时为编辑,默认为新增 */ + submitForm(params = {}, edit: boolean = false) { + return http.post(edit ? "edit" : "add", params); + }, + /** 删除组织 */ + delete(params: ReqId[]) { + return http.post("delete", params); + }, + /** 复制组织 */ + copy(params = {}) { + return http.post("copy", params); + } +}; + +export { sysOrgApi }; diff --git a/web/src/api/modules/sys/organization/position.ts b/web/src/api/modules/sys/organization/position.ts new file mode 100644 index 0000000000000000000000000000000000000000..17a3b6ff7032dd4600a65a5955b112f1a1f2e63c --- /dev/null +++ b/web/src/api/modules/sys/organization/position.ts @@ -0,0 +1,52 @@ +/** + * @description 职位管理 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +import { ReqId, ResPage, SysPosition } from "@/api"; +import { moduleRequest } from "@/api/request"; +const http = moduleRequest("/sys/organization/position/"); + +/** + * @Description: 职位管理 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +const sysPositionApi = { + /** 获取职位分页 */ + page(params: SysPosition.Page) { + return http.get>("page", params); + }, + /** 获取职位树 */ + tree() { + return http.get("tree", {}, { loading: false }); + }, + /** 获取职位详情 */ + detail(params: ReqId) { + return http.get("detail", params); + }, + /** 提交表单 edit为true时为编辑,默认为新增 */ + submitForm(params = {}, edit: boolean = false) { + return http.post(edit ? "edit" : "add", params); + }, + /** 删除职位 */ + delete(params: ReqId[]) { + return http.post("delete", params); + }, + /** 职位选择器 */ + selector() { + return http.get("selector", {}, { loading: false }); + } +}; + +export { sysPositionApi }; diff --git a/web/src/api/modules/sys/organization/user.ts b/web/src/api/modules/sys/organization/user.ts new file mode 100644 index 0000000000000000000000000000000000000000..c92255e9b5af83d3fe683c100fd929479d8c1f43 --- /dev/null +++ b/web/src/api/modules/sys/organization/user.ts @@ -0,0 +1,85 @@ +import { CommonStatusEnum } from "@/enums"; +/** + * @description 用户管理 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +import { ReqId, ResPage, SysRole, SysUser } from "@/api"; +import { moduleRequest } from "@/api/request"; +const http = moduleRequest("/sys/organization/user/"); + +/** + * @Description: 用户管理 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + */ +const sysUserApi = { + /** 用户分页 */ + page(params: SysUser.Page) { + return http.get>("page", params); + }, + /** 用户选择器 */ + selector(params: any) { + return http.get>("selector", params); + }, + /** 获取用户详情 */ + detail(params: ReqId) { + return http.get("detail", params); + }, + /** 提交表单 edit为true时为编辑,默认为新增 */ + submitForm(params = {}, edit: boolean = false) { + return http.post(edit ? "edit" : "add", params); + }, + /** 删除用户 */ + delete(params: ReqId[]) { + return http.post("delete", params); + }, + /** 修改用户状态 */ + updateStatus(params: ReqId, operation: CommonStatusEnum) { + return http.post(operation === CommonStatusEnum.DISABLE ? "disableUser" : "enableUser", params); + }, + /** 重置用户密码 */ + resetPassword(params: ReqId) { + return http.post("resetPassword", params); + }, + /** 获取用户拥有角色 */ + ownRole(params: ReqId) { + return http.get("ownRole", params); + }, + /** 给用户授权角色 */ + grantRole(params: SysUser.GrantRoleReq) { + return http.post("grantRole", params); + }, + // 获取权限授权树 + permissionTreeSelector(params: ReqId) { + return http.get("permissionTreeSelector", params, { loading: false }); + }, + // 获取用户拥有资源 + ownResource(params: ReqId) { + return http.get("ownResource", params, { loading: false }); + }, + /** 给用户授权资源 */ + grantResource(params: SysRole.GrantResourceReq) { + return http.post("grantResource", params); + }, + /** 获取用户拥有权限 */ + ownPermission(params: ReqId) { + return http.get("ownPermission", params, { loading: false }); + }, + /** 获取用户拥有权限 */ + grantPermission(params: SysRole.GrantPermissionReq) { + return http.post("grantPermission", params); + } +}; + +export { sysUserApi }; diff --git a/web/src/api/modules/sys/upload/index.ts b/web/src/api/modules/sys/upload/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..3cc8f34ea6b23c0a2fbaf58e93ec270960556a27 --- /dev/null +++ b/web/src/api/modules/sys/upload/index.ts @@ -0,0 +1,33 @@ +/** + * @description 文件上传 + * @license Apache License Version 2.0 +2022 +, + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +import { moduleRequest } from "@/api/request"; + +const http = moduleRequest("/sys/upload/"); + +/** + * @Description: 文件上传 + * @Author: huguodong + * @Date: 2024-01-23 15:10:43 + */ +const uploadApi = { + /** 上传图片 */ + uploadImg(params: FormData) { + return http.get("uploadImg", params, { loading: false }); + } +}; + +export { uploadApi }; diff --git a/web/src/api/modules/sys/userCenter/index.ts b/web/src/api/modules/sys/userCenter/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..ba128dbc877c7bd182a815f0e733d61ee6121428 --- /dev/null +++ b/web/src/api/modules/sys/userCenter/index.ts @@ -0,0 +1,16 @@ +/** + * @description 用户中心接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +export * from "./userCenter"; diff --git a/web/src/api/modules/sys/userCenter/userCenter.ts b/web/src/api/modules/sys/userCenter/userCenter.ts new file mode 100644 index 0000000000000000000000000000000000000000..1782d1fce05fadb5ba1aeb0eec1bb6136d5ae589 --- /dev/null +++ b/web/src/api/modules/sys/userCenter/userCenter.ts @@ -0,0 +1,96 @@ +/** + * @description 用户个人中心 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import { moduleRequest } from "@/api/request"; +import { ReqId, UserCenter, Login, Menu, SysMessage } from "@/api"; +const http = moduleRequest("/userCenter/"); + +/** + * @Description: 用户个人中心 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + + */ +const userCenterApi = { + /** 获取用户菜单 */ + getAuthMenuList(params: ReqId) { + return http.get("loginMenu", params, { loading: false }); + }, + /** 设置默认模块 */ + setDefaultModule(params: UserCenter.ResModuleDefault) { + http.post("setDefaultModule", params, { loading: false }); + }, + /** 修改用户密码 */ + updatePassword(params: UserCenter.ReqUpdatePassword) { + return http.post("updatePassword", params); + }, + /** 更新签名 */ + updateSignature(params: { signature: string }) { + return http.post("updateSignature", params, { loading: false }); + }, + /** 更新头像 */ + updateAvatar(params: any) { + return http.post("updateAvatar", params, { loading: false }); + }, + /** 更新用户信息 */ + updateUserInfo(params: Login.LoginUserInfo) { + return http.post("updateUserInfo", params, { loading: false }); + }, + /** 更新快捷方式 */ + updateUserWorkbench(params: UserCenter.ResUpdateUserWorkbench) { + return http.post("updateUserWorkbench", params, { loading: false }); + }, + /** 获取用户快捷方式 */ + loginWorkbench() { + return http.get("loginWorkbench", {}, { loading: false }); + }, + /** 获取快捷方式菜单树 */ + shortcutTree() { + return http.get("shortcutTree", {}, { loading: false }); + }, + /** 获取未读shu*/ + unReadCount() { + return http.get("unReadCount", {}, { loading: false }); + }, + /** 获取最新未读*/ + newUnRead() { + return http.get("newUnRead", {}, { loading: false }); + }, + /** 我的消息分页*/ + myMessagePage(params: UserCenter.ReqMyMessagePage) { + return http.get("myMessagePage", params, { loading: false }); + }, + /** 消息详情*/ + myMessageDetail(params: ReqId) { + return http.get("myMessageDetail", params); + }, + /** 标记已读*/ + setRead(params: { ids: string[] | number[] }) { + return http.post("setRead", params); + }, + /** 全部已读*/ + allRead(params: { category: string }) { + return http.post("setRead", params); + }, + /** 全部删除*/ + allDelete(params: { category: string }) { + return http.post("setDelete", params); + }, + /** 标记删除*/ + setDelete(params: ReqId[]) { + return http.post("setDelete", params); + } +}; + +export { userCenterApi }; diff --git a/web/src/api/request/index.ts b/web/src/api/request/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..6f9d8f3ced77aeec736754826fcbb78af4f0a437 --- /dev/null +++ b/web/src/api/request/index.ts @@ -0,0 +1,34 @@ +/** + * @description + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import { ResultEnum } from "@/enums/httpEnum"; +import { createRequest } from "./request"; + +const isHttpProxy = import.meta.env.VITE_HTTP_PROXY === "true"; // 是否使用代理 +const url = import.meta.env.VITE_API_URL as string; // 请求地址 + +/** + * @description 模块内的请求, 会自动加上模块的前缀 + * @param moduleUrl 模块地址 + * @param prefix 前缀 + */ +export const moduleRequest = (moduleUrl: string, prefix: string = "/api") => + createRequest({ + //请求地址,可在 .env.** 文件中修改 + baseURL: isHttpProxy ? prefix + moduleUrl : url + prefix + moduleUrl, + // 设置超时时间 + timeout: ResultEnum.TIMEOUT as number, + // 跨域时候允许携带凭证 + withCredentials: true + }); diff --git a/web/src/api/request/instance.ts b/web/src/api/request/instance.ts new file mode 100644 index 0000000000000000000000000000000000000000..d739d3700f876e0c9ec05d6f103d833f61eee1bb --- /dev/null +++ b/web/src/api/request/instance.ts @@ -0,0 +1,253 @@ +/** + * @description 封装 axios 请求类 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import axios, { AxiosInstance, AxiosError, AxiosRequestConfig, InternalAxiosRequestConfig, AxiosResponse } from "axios"; +import { showFullScreenLoading, tryHideFullScreenLoading } from "@/components/Loading/fullScreen"; +import { LOGIN_URL } from "@/config"; +import { ElMessage } from "element-plus"; +import { ResultData } from "@/api/interface"; +import { ResultEnum, TokenEnum } from "@/enums"; +import { checkStatus } from "../helper/checkStatus"; +import { useUserStore } from "@/stores/modules"; +import { AxiosCanceler } from "../helper/axiosCancel"; +import router from "@/routers"; + +// 自定义 AxiosRequestConfig 接口,增加 noLoading 属性 +export interface CustomAxiosRequestConfig extends InternalAxiosRequestConfig { + loading?: boolean; + cancel?: boolean; +} +const axiosCanceler = new AxiosCanceler(); + +/** + * @Description: http请求 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + + */ +export default class RequestHttp { + service: AxiosInstance; + /** + * @description 构造函数 + * @param config axios 配置 + */ + public constructor(config: AxiosRequestConfig) { + // axios 实例化 + this.service = axios.create(config); + // 设置请求拦截器 + this.setInterceptor(); + } + /** 指定方法提示 */ + apiNameArray = ["add", "edit", "grant", "batch", "update"]; + /** 指定方法不提示 */ + noMessageApiNameArray: string[] = []; + /** + * @description 设置请求拦截器 + */ + setInterceptor() { + /** + * @description 请求拦截器 + * 客户端发送请求 -> [请求拦截器] -> 服务器 + * token校验(JWT) : 接受服务器返回的 token,存储到 vuex/pinia/本地储存当中 + */ + this.service.interceptors.request.use( + (config: CustomAxiosRequestConfig) => { + const userStore = useUserStore(); + // 重复请求不需要取消,在 api 服务中通过指定的第三个参数: { cancel: false } 来控制 + config.cancel ??= true; + config.cancel && axiosCanceler.addPending(config); + // 当前请求不需要显示 loading,在 api 服务中通过指定的第三个参数: { loading: false } 来控制 + config.loading ??= true; + config.loading && showFullScreenLoading(); + //检查 config.headers 对象是否存在以及是否具有 set 方法 + if (config.headers && typeof config.headers.set === "function") { + const { accessToken, refreshToken } = userStore; + if (accessToken) { + config.headers.set(TokenEnum.TOKEN_NAME, TokenEnum.TOKEN_PREFIX + accessToken); + // 判断 accessToken 是否过期 + const jwt = this.decryptJWT(accessToken); + const exp = this.getJWTDate(jwt.exp); + // token 已经过期 + if (new Date() >= exp) { + // 获取刷新 token + const refreshAccessToken = refreshToken; + // 携带刷新 token + if (refreshAccessToken) { + config.headers.set("X-" + TokenEnum.TOKEN_NAME, TokenEnum.TOKEN_PREFIX + refreshAccessToken); + } + } + } + } + // get请求加时间戳 + if (config.method === "get") { + config.params = { + ...config.params, + _t: new Date().getTime() + }; + } + return config; + }, + (error: AxiosError) => { + return Promise.reject(error); + } + ); + + /** + * @description 响应拦截器 + * 服务器换返回信息 -> [拦截统一处理] -> 客户端JS获取到信息 + */ + this.service.interceptors.response.use( + (response: AxiosResponse & { config: CustomAxiosRequestConfig }) => { + // 检查并存储授权信息 + this.checkAndStoreAuthentication(response); + const { data, config } = response; + const userStore = useUserStore(); + axiosCanceler.removePending(config); + config.loading && tryHideFullScreenLoading(); + // 登录失效 + if (data.code == ResultEnum.OVERDUE) { + userStore.clearUserStore(); + router.replace(LOGIN_URL); + ElMessage.error(data.msg); + return Promise.reject(data); + } + // 全局错误信息拦截(防止下载文件的时候返回数据流,没有 code 直接报错) + if (data.code && data.code !== ResultEnum.SUCCESS) { + ElMessage.error(data.msg); + return Promise.reject(data); + } else { + // 统一成功提示 + const responseUrl: string = response.config.url || ""; //获取请求地址 + this.apiNameArray.forEach(apiName => { + let responseApiArray = responseUrl.split("/"); //分割 + let method = responseApiArray[responseApiArray.length - 1]; //取最后一个 + let result = this.noMessageApiNameArray.includes(method); //判断是否在不提示的数组中 + if (!result && responseUrl.includes(apiName)) { + //如果不在不提示的数组中并且请求地址包含指定的方法 + ElMessage.success(data.msg); + } + }); + } + // 成功请求(在页面上除非特殊情况,否则不用处理失败逻辑) + return data; + }, + async (error: AxiosError) => { + const { response } = error; + tryHideFullScreenLoading(); + // 请求超时 && 网络错误单独判断,没有 response + if (error.message.indexOf("timeout") !== -1) ElMessage.error("请求超时!请您稍后重试"); + if (error.message.indexOf("Network Error") !== -1) ElMessage.error("网络错误!请您稍后重试"); + // 根据服务器响应的错误状态码,做不同的处理 + if (response) checkStatus(response.status); + // 服务器结果都没有返回(可能服务器错误可能客户端断网),断网处理:可以跳转到断网页面 + if (!window.navigator.onLine) router.replace("/500"); + return Promise.reject(error); + } + ); + } + + /** + * @description get 请求 + * @param url 请求地址 + * @param params 请求参数 + * @param _object axios 配置 + * @returns Promise> + */ + get(url: string, params?: object, _object = {}): Promise> { + return this.service.get(url, { params, ..._object }); + } + + /** + * @description post 请求 + * @param url 请求地址 + * @param params 请求参数 + * @param _object axios 配置 + * @returns Promise> + */ + post(url: string, params?: object | string, _object = {}): Promise> { + return this.service.post(url, params, _object); + } + + /** + * @description put 请求 + * @param url 请求地址 + * @param params 请求参数 + * @param _object axios 配置 + * @returns Promise> + */ + put(url: string, params?: object, _object = {}): Promise> { + return this.service.put(url, params, _object); + } + + /** + * @description delete 请求 + * @param url 请求地址 + * @param params 请求参数 + * @param _object axios 配置 + * @returns Promise> + */ + delete(url: string, params?: any, _object = {}): Promise> { + return this.service.delete(url, { params, ..._object }); + } + + /** + * @description 下载文件 + * @param url 请求地址 + * @param params 请求参数 + * @param _object axios 配置 + * @returns Promise + */ + download(url: string, params?: object, _object = {}): Promise { + return this.service.post(url, params, { ..._object, responseType: "blob" }); + } + + /** + * @description 解密 JWT token 的信息 + * @param token jwt token 字符串 + * @returns object + */ + decryptJWT(token: string) { + token = token.replace(/_/g, "/").replace(/-/g, "+"); + const json = decodeURIComponent(escape(window.atob(token.split(".")[1]))); + return JSON.parse(json); + } + + /** + * @description 将 JWT 时间戳转换成 Date,主要针对 `exp`,`iat`,`nbf` + * @param timestamp 时间戳 + * @returns Date 对象 + */ + getJWTDate(timestamp: number) { + return new Date(timestamp * 1000); + } + + /** + * 检查并存储授权信息 + * @param res 响应对象 + */ + checkAndStoreAuthentication(res: AxiosResponse) { + // 读取响应报文头 token 信息 + let accessToken = res.headers[TokenEnum.ACCESS_TOKEN_KEY]; + let refreshAccessToken = res.headers[TokenEnum.REFRESH_TOKEN_KEY]; + const userStore = useUserStore(); + // 判断是否是无效 token + if (accessToken === "invalid_token") { + userStore.clearToken(); // 清除 token + } + // 判断是否存在刷新 token,如果存在则存储在本地 + else if (refreshAccessToken && accessToken && accessToken !== "invalid_token") { + userStore.setToken(accessToken, refreshAccessToken); + } + } +} diff --git a/web/src/api/request/request.ts b/web/src/api/request/request.ts new file mode 100644 index 0000000000000000000000000000000000000000..581fd4ad77e7bb58d17a23d174c57d9cc6633742 --- /dev/null +++ b/web/src/api/request/request.ts @@ -0,0 +1,79 @@ +/** + * @description + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import type { AxiosRequestConfig } from "axios"; +import RequestHttp from "./instance"; + +/** + * @description 创建请求实例 + * @param axiosConfig axios 配置 + */ +export function createRequest(axiosConfig: AxiosRequestConfig) { + const customInstance = new RequestHttp(axiosConfig); + + /** + * get请求 + * @param url - 请求地址 + * @param config - axios配置 + */ + async function get(url: string, params?: object, _object = {}) { + return customInstance.get(url, params, _object); + } + + /** + * post请求 + * @param url - 请求地址 + * @param data - 请求的body的data + * @param config - axios配置 + */ + async function post(url: string, params?: any, _object = {}) { + return customInstance.post(url, params, _object); + } + /** + * put请求 + * @param url - 请求地址 + * @param data - 请求的body的data + * @param config - axios配置 + */ + async function put(url: string, params?: any, _object = {}) { + return customInstance.put(url, params, _object); + } + + /** + * delete请求 + * @param url - 请求地址 + * @param config - axios配置 + */ + async function handleDelete(url: string, params?: any, _object = {}) { + return customInstance.delete(url, params, _object); + } + + /** + * + * 下载 + * @param url - 请求地址 + * @param config - axios配置 + */ + async function download(url: string, params?: object, _object = {}): Promise { + return customInstance.download(url, params, { ..._object, responseType: "blob" }); + } + + return { + get, + post, + put, + delete: handleDelete, + download + }; +} diff --git a/web/src/assets/fonts/DIN.otf b/web/src/assets/fonts/DIN.otf new file mode 100644 index 0000000000000000000000000000000000000000..3296d1ea7b33a481e682017496ac38c26d7df5a4 Binary files /dev/null and b/web/src/assets/fonts/DIN.otf differ diff --git a/web/src/assets/fonts/MetroDF.ttf b/web/src/assets/fonts/MetroDF.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9d31af4977002c65bad9cbc521764401d5035890 Binary files /dev/null and b/web/src/assets/fonts/MetroDF.ttf differ diff --git a/web/src/assets/fonts/YouSheBiaoTiHei.ttf b/web/src/assets/fonts/YouSheBiaoTiHei.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3729151a2b56f7229c9870df997415351c298213 Binary files /dev/null and b/web/src/assets/fonts/YouSheBiaoTiHei.ttf differ diff --git a/web/src/assets/fonts/font.scss b/web/src/assets/fonts/font.scss new file mode 100644 index 0000000000000000000000000000000000000000..00b993c365e0f89e1593005b25a4784ad8351532 --- /dev/null +++ b/web/src/assets/fonts/font.scss @@ -0,0 +1,14 @@ +@font-face { + font-family: YouSheBiaoTiHei; + src: url("./YouSheBiaoTiHei.ttf"); +} + +@font-face { + font-family: MetroDF; + src: url("./MetroDF.ttf"); +} + +@font-face { + font-family: DIN; + src: url("./DIN.otf"); +} diff --git a/web/src/assets/iconfont/iconfont.scss b/web/src/assets/iconfont/iconfont.scss new file mode 100644 index 0000000000000000000000000000000000000000..e7f88ae79eb34b527fbf928ae8b8d2bf8c94043c --- /dev/null +++ b/web/src/assets/iconfont/iconfont.scss @@ -0,0 +1,51 @@ +@font-face { + font-family: iconfont; /* Project id 2667653 */ + src: url("iconfont.ttf?t=1719667796161") format("truetype"); +} +.iconfont { + font-family: iconfont !important; + font-size: 20px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + cursor: pointer; +} +.icon-yiwen::before { + font-size: 15px; + content: "\e693"; +} +.icon-xiala::before { + content: "\e62b"; +} +.icon-tuichu::before { + content: "\e645"; +} +.icon-xiaoxi::before { + font-size: 21.2px; + content: "\e61f"; +} +.icon-zhuti::before { + font-size: 22.4px; + content: "\e638"; +} +.icon-sousuo::before { + content: "\e611"; +} +.icon-contentright::before { + content: "\e8c9"; +} +.icon-contentleft::before { + content: "\e8ca"; +} +.icon-fangda::before { + content: "\e826"; +} +.icon-suoxiao::before { + content: "\e641"; +} +.icon-zhongyingwen::before { + content: "\e8cb"; +} +.icon-huiche::before { + content: "\e637"; +} diff --git a/web/src/assets/iconfont/iconfont.ttf b/web/src/assets/iconfont/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..844bb48e9faa58a2c7c36e8354d9b793512b9849 Binary files /dev/null and b/web/src/assets/iconfont/iconfont.ttf differ diff --git a/web/src/assets/iconfontPlus/iconfont.scss b/web/src/assets/iconfontPlus/iconfont.scss new file mode 100644 index 0000000000000000000000000000000000000000..ef1775bfd83d49a8463d12e73d93808bba715377 --- /dev/null +++ b/web/src/assets/iconfontPlus/iconfont.scss @@ -0,0 +1,17 @@ +@font-face { + font-family: iconfont; + + /* Project id 4211568 */ + src: url("iconfont.ttf?t=1692085050888") format("truetype"); +} +.iconfontPlus { + font-family: iconfont !important; + font-size: 20px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + cursor: pointer; +} +.icon-change::before { + content: "\e60c"; +} diff --git a/web/src/assets/iconfontPlus/iconfont.ttf b/web/src/assets/iconfontPlus/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5cf86bae045ffa93fbb3efc2ad472f87ac72db0d Binary files /dev/null and b/web/src/assets/iconfontPlus/iconfont.ttf differ diff --git a/web/src/assets/icons/userDetail.svg b/web/src/assets/icons/userDetail.svg new file mode 100644 index 0000000000000000000000000000000000000000..4caec7f816e008feffb56b56fa2236c8f1698f6f --- /dev/null +++ b/web/src/assets/icons/userDetail.svg @@ -0,0 +1,47 @@ + + + + Artboard + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/icons/xianxingdaoyu.svg b/web/src/assets/icons/xianxingdaoyu.svg new file mode 100644 index 0000000000000000000000000000000000000000..edfac8da86110d6a559fe64b348ac7f9927023d5 --- /dev/null +++ b/web/src/assets/icons/xianxingdaoyu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/xianxingdiqiu.svg b/web/src/assets/icons/xianxingdiqiu.svg new file mode 100644 index 0000000000000000000000000000000000000000..e13cb00c52b262afebf8de84e66fa3863d9be458 --- /dev/null +++ b/web/src/assets/icons/xianxingdiqiu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/xianxingditu.svg b/web/src/assets/icons/xianxingditu.svg new file mode 100644 index 0000000000000000000000000000000000000000..ef1bdda73c8c39d89cd32adb37555bbedcd427ac --- /dev/null +++ b/web/src/assets/icons/xianxingditu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/xianxingfanchuan.svg b/web/src/assets/icons/xianxingfanchuan.svg new file mode 100644 index 0000000000000000000000000000000000000000..2c2da2827ff3d920c0e3c7e0c4aa99de9ce4bc1d --- /dev/null +++ b/web/src/assets/icons/xianxingfanchuan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/xianxingfeiji.svg b/web/src/assets/icons/xianxingfeiji.svg new file mode 100644 index 0000000000000000000000000000000000000000..e4d9a873c7798bbaefa676a3d84e660678d65dc4 --- /dev/null +++ b/web/src/assets/icons/xianxingfeiji.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/xianxinglvhangriji.svg b/web/src/assets/icons/xianxinglvhangriji.svg new file mode 100644 index 0000000000000000000000000000000000000000..2e1e47d19f4886dc0cac426f35363323b1c1678f --- /dev/null +++ b/web/src/assets/icons/xianxinglvhangriji.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/xianxingtianqiyubao.svg b/web/src/assets/icons/xianxingtianqiyubao.svg new file mode 100644 index 0000000000000000000000000000000000000000..32835808e11a35192729d59a294cca4611609249 --- /dev/null +++ b/web/src/assets/icons/xianxingtianqiyubao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/xianxingxiangjipaizhao.svg b/web/src/assets/icons/xianxingxiangjipaizhao.svg new file mode 100644 index 0000000000000000000000000000000000000000..93ff9f510135bfdc0e627296f64137d6558b0217 --- /dev/null +++ b/web/src/assets/icons/xianxingxiangjipaizhao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/xianxingxiarilengyin.svg b/web/src/assets/icons/xianxingxiarilengyin.svg new file mode 100644 index 0000000000000000000000000000000000000000..87132d1af82db1402755fe94ad2c2df071f07671 --- /dev/null +++ b/web/src/assets/icons/xianxingxiarilengyin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/xianxingyoulun.svg b/web/src/assets/icons/xianxingyoulun.svg new file mode 100644 index 0000000000000000000000000000000000000000..487e1ee553fab587a6ecfde9c3285dd5a2db5d91 --- /dev/null +++ b/web/src/assets/icons/xianxingyoulun.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/xianxingzijiayou.svg b/web/src/assets/icons/xianxingzijiayou.svg new file mode 100644 index 0000000000000000000000000000000000000000..449c610dd6d1a0b29ff8cbe4ef7f303df7240e70 --- /dev/null +++ b/web/src/assets/icons/xianxingzijiayou.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/images/403.png b/web/src/assets/images/403.png new file mode 100644 index 0000000000000000000000000000000000000000..0c5ec7c7c6fc51e7118b2857d5c2322b0433ab81 Binary files /dev/null and b/web/src/assets/images/403.png differ diff --git a/web/src/assets/images/404.png b/web/src/assets/images/404.png new file mode 100644 index 0000000000000000000000000000000000000000..2333586e41590ab1684dfb8ff71927ad96f8d3a5 Binary files /dev/null and b/web/src/assets/images/404.png differ diff --git a/web/src/assets/images/500.png b/web/src/assets/images/500.png new file mode 100644 index 0000000000000000000000000000000000000000..6f3b6bff9f7e7b58520a092378327135fd419d6b Binary files /dev/null and b/web/src/assets/images/500.png differ diff --git a/web/src/assets/images/avatar.gif b/web/src/assets/images/avatar.gif new file mode 100644 index 0000000000000000000000000000000000000000..fdbd32c675f85af4ed57021ac0638a21a3c6cad3 Binary files /dev/null and b/web/src/assets/images/avatar.gif differ diff --git a/web/src/assets/images/login_bg.svg b/web/src/assets/images/login_bg.svg new file mode 100644 index 0000000000000000000000000000000000000000..0a9514b58eae52126a2f62da9abb2ed9897b259e --- /dev/null +++ b/web/src/assets/images/login_bg.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/login_left.png b/web/src/assets/images/login_left.png new file mode 100644 index 0000000000000000000000000000000000000000..e9ebc1163e49e562efda757fe7c2509bec735b5f Binary files /dev/null and b/web/src/assets/images/login_left.png differ diff --git a/web/src/assets/images/login_left1.png b/web/src/assets/images/login_left1.png new file mode 100644 index 0000000000000000000000000000000000000000..eaaf3ab00ba5cea52f43451c7d411a2ed7ded8ca Binary files /dev/null and b/web/src/assets/images/login_left1.png differ diff --git a/web/src/assets/images/login_left2.png b/web/src/assets/images/login_left2.png new file mode 100644 index 0000000000000000000000000000000000000000..03980533d0334f24ba979a4b68d20dad29136bd2 Binary files /dev/null and b/web/src/assets/images/login_left2.png differ diff --git a/web/src/assets/images/login_left3.png b/web/src/assets/images/login_left3.png new file mode 100644 index 0000000000000000000000000000000000000000..58e6e74e554e750bcd6a86156b695cb8316159eb Binary files /dev/null and b/web/src/assets/images/login_left3.png differ diff --git a/web/src/assets/images/login_left4.png b/web/src/assets/images/login_left4.png new file mode 100644 index 0000000000000000000000000000000000000000..051299df8a0668736d6aa1dd49fbfb2ec7c0e0fc Binary files /dev/null and b/web/src/assets/images/login_left4.png differ diff --git a/web/src/assets/images/login_left5.png b/web/src/assets/images/login_left5.png new file mode 100644 index 0000000000000000000000000000000000000000..7d9d430aa68e0e64ebf8dd81372f72afbf9f201f Binary files /dev/null and b/web/src/assets/images/login_left5.png differ diff --git a/web/src/assets/images/logo.png b/web/src/assets/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9b1e33c88ff2db16b0e576aaa70542c281544faa Binary files /dev/null and b/web/src/assets/images/logo.png differ diff --git a/web/src/assets/images/logo.svg b/web/src/assets/images/logo.svg new file mode 100644 index 0000000000000000000000000000000000000000..7565660356e5b3723c9c33d508b830c9cfbea29f --- /dev/null +++ b/web/src/assets/images/logo.svg @@ -0,0 +1 @@ + diff --git a/web/src/assets/images/msg01.png b/web/src/assets/images/msg01.png new file mode 100644 index 0000000000000000000000000000000000000000..6ecca0d7b66c8c1f1bc0b11be7decfa1b05d5d60 Binary files /dev/null and b/web/src/assets/images/msg01.png differ diff --git a/web/src/assets/images/msg02.png b/web/src/assets/images/msg02.png new file mode 100644 index 0000000000000000000000000000000000000000..52c890a6685e83055e0c827c93a2029cbbecf02e Binary files /dev/null and b/web/src/assets/images/msg02.png differ diff --git a/web/src/assets/images/msg03.png b/web/src/assets/images/msg03.png new file mode 100644 index 0000000000000000000000000000000000000000..389512fbefa5589a6a87beda798770cfac022329 Binary files /dev/null and b/web/src/assets/images/msg03.png differ diff --git a/web/src/assets/images/msg04.png b/web/src/assets/images/msg04.png new file mode 100644 index 0000000000000000000000000000000000000000..6868f74a40656e97dd4619f0e2797403d215a234 Binary files /dev/null and b/web/src/assets/images/msg04.png differ diff --git a/web/src/assets/images/msg05.png b/web/src/assets/images/msg05.png new file mode 100644 index 0000000000000000000000000000000000000000..f375ab0b176f7095db13542022a152cbe371693f Binary files /dev/null and b/web/src/assets/images/msg05.png differ diff --git a/web/src/assets/images/notData.png b/web/src/assets/images/notData.png new file mode 100644 index 0000000000000000000000000000000000000000..c579a788fcdc39a742a8223f344926dfc5e6231b Binary files /dev/null and b/web/src/assets/images/notData.png differ diff --git a/web/src/assets/images/welcome.png b/web/src/assets/images/welcome.png new file mode 100644 index 0000000000000000000000000000000000000000..df138ab86e0d096d2a65d6292abbe068b3312a2c Binary files /dev/null and b/web/src/assets/images/welcome.png differ diff --git a/web/src/assets/svg/ikun.svg b/web/src/assets/svg/ikun.svg new file mode 100644 index 0000000000000000000000000000000000000000..c0dda1055659c5c36663bbfabf71a460c1ee68d1 --- /dev/null +++ b/web/src/assets/svg/ikun.svg @@ -0,0 +1,1898 @@ + + + + diff --git a/web/src/assets/svg/logo.svg b/web/src/assets/svg/logo.svg new file mode 100644 index 0000000000000000000000000000000000000000..7565660356e5b3723c9c33d508b830c9cfbea29f --- /dev/null +++ b/web/src/assets/svg/logo.svg @@ -0,0 +1 @@ + diff --git a/web/src/auto-import.d.ts b/web/src/auto-import.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..e2067167781167a829724d46039f242901b91aa4 --- /dev/null +++ b/web/src/auto-import.d.ts @@ -0,0 +1,92 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// noinspection JSUnusedGlobalSymbols +// Generated by unplugin-auto-import +// biome-ignore lint: disable +export {} +declare global { + const EffectScope: (typeof import("vue"))["EffectScope"]; + const ElMessage: (typeof import("element-plus/es"))["ElMessage"]; + const computed: (typeof import("vue"))["computed"]; + const createApp: (typeof import("vue"))["createApp"]; + const customRef: (typeof import("vue"))["customRef"]; + const defineAsyncComponent: (typeof import("vue"))["defineAsyncComponent"]; + const defineComponent: (typeof import("vue"))["defineComponent"]; + const effectScope: (typeof import("vue"))["effectScope"]; + const getCurrentInstance: (typeof import("vue"))["getCurrentInstance"]; + const getCurrentScope: (typeof import("vue"))["getCurrentScope"]; + const h: (typeof import("vue"))["h"]; + const inject: (typeof import("vue"))["inject"]; + const isProxy: (typeof import("vue"))["isProxy"]; + const isReactive: (typeof import("vue"))["isReactive"]; + const isReadonly: (typeof import("vue"))["isReadonly"]; + const isRef: (typeof import("vue"))["isRef"]; + const markRaw: (typeof import("vue"))["markRaw"]; + const nextTick: (typeof import("vue"))["nextTick"]; + const onActivated: (typeof import("vue"))["onActivated"]; + const onBeforeMount: (typeof import("vue"))["onBeforeMount"]; + const onBeforeRouteLeave: (typeof import("vue-router"))["onBeforeRouteLeave"]; + const onBeforeRouteUpdate: (typeof import("vue-router"))["onBeforeRouteUpdate"]; + const onBeforeUnmount: (typeof import("vue"))["onBeforeUnmount"]; + const onBeforeUpdate: (typeof import("vue"))["onBeforeUpdate"]; + const onDeactivated: (typeof import("vue"))["onDeactivated"]; + const onErrorCaptured: (typeof import("vue"))["onErrorCaptured"]; + const onMounted: (typeof import("vue"))["onMounted"]; + const onRenderTracked: (typeof import("vue"))["onRenderTracked"]; + const onRenderTriggered: (typeof import("vue"))["onRenderTriggered"]; + const onScopeDispose: (typeof import("vue"))["onScopeDispose"]; + const onServerPrefetch: (typeof import("vue"))["onServerPrefetch"]; + const onUnmounted: (typeof import("vue"))["onUnmounted"]; + const onUpdated: (typeof import("vue"))["onUpdated"]; + const onWatcherCleanup: (typeof import("vue"))["onWatcherCleanup"]; + const provide: (typeof import("vue"))["provide"]; + const reactive: (typeof import("vue"))["reactive"]; + const readonly: (typeof import("vue"))["readonly"]; + const ref: (typeof import("vue"))["ref"]; + const resolveComponent: (typeof import("vue"))["resolveComponent"]; + const shallowReactive: (typeof import("vue"))["shallowReactive"]; + const shallowReadonly: (typeof import("vue"))["shallowReadonly"]; + const shallowRef: (typeof import("vue"))["shallowRef"]; + const toRaw: (typeof import("vue"))["toRaw"]; + const toRef: (typeof import("vue"))["toRef"]; + const toRefs: (typeof import("vue"))["toRefs"]; + const toValue: (typeof import("vue"))["toValue"]; + const triggerRef: (typeof import("vue"))["triggerRef"]; + const unref: (typeof import("vue"))["unref"]; + const useAttrs: (typeof import("vue"))["useAttrs"]; + const useCssModule: (typeof import("vue"))["useCssModule"]; + const useCssVars: (typeof import("vue"))["useCssVars"]; + const useId: (typeof import("vue"))["useId"]; + const useLink: (typeof import("vue-router"))["useLink"]; + const useModel: (typeof import("vue"))["useModel"]; + const useRoute: (typeof import("vue-router"))["useRoute"]; + const useRouter: (typeof import("vue-router"))["useRouter"]; + const useSlots: (typeof import("vue"))["useSlots"]; + const useTemplateRef: (typeof import("vue"))["useTemplateRef"]; + const watch: (typeof import("vue"))["watch"]; + const watchEffect: (typeof import("vue"))["watchEffect"]; + const watchPostEffect: (typeof import("vue"))["watchPostEffect"]; + const watchSyncEffect: (typeof import("vue"))["watchSyncEffect"]; +} +// for type re-export +declare global { + // @ts-ignore + export type { + Component, + ComponentPublicInstance, + ComputedRef, + DirectiveBinding, + ExtractDefaultPropTypes, + ExtractPropTypes, + ExtractPublicPropTypes, + InjectionKey, + PropType, + Ref, + MaybeRef, + MaybeRefOrGetter, + VNode, + WritableComputedRef + } from "vue"; + import("vue"); +} diff --git a/web/src/components/CheckCard/checkCard.d.ts b/web/src/components/CheckCard/checkCard.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..5b81996cbceb88ebc7a5ac6b2d163399ce876474 --- /dev/null +++ b/web/src/components/CheckCard/checkCard.d.ts @@ -0,0 +1,28 @@ +/** + * @description 接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +declare namespace CheckCard { + export interface OptionsConfig { + /** 标题 */ + title?: string; + /** 描述 */ + description?: string; + /** id */ + id: number | string; + /** 头像 */ + icon?: string; + /** 是否禁用 */ + disabled?: boolean; + } +} diff --git a/web/src/components/CheckCard/index.vue b/web/src/components/CheckCard/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..a2df9137a11ab57cc4d4f49b8b926a715bcb129e --- /dev/null +++ b/web/src/components/CheckCard/index.vue @@ -0,0 +1,132 @@ + + + + + + diff --git a/web/src/components/CheckCard/props.ts b/web/src/components/CheckCard/props.ts new file mode 100644 index 0000000000000000000000000000000000000000..c92876b29677277fb1ce56da8a5857049a1ce15a --- /dev/null +++ b/web/src/components/CheckCard/props.ts @@ -0,0 +1,47 @@ +/** + * @description props + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +// 从Vue库中导入PropType类型 +import type { PropType as VuePropType } from "vue"; +// 从本地types文件中导入OptionsConfig类型 + +// 定义一个新类型PropType,它是VuePropType的别名 +declare type PropType = VuePropType; + +// 定义一个包含CheckModule组件props的对象 +export const basicProps = { + value: { + type: Array as PropType // value prop的类型是数字或字符串的数组 + }, + width: { + type: [Number, String], // width prop的类型是数字或字符串 + default: 320 // width prop的默认值是320 + }, + multiple: { + type: Boolean, // multiple prop的类型是布尔值 + default: false // multiple prop的默认值是false + }, + hoverable: { + type: Boolean, // hoverable prop的类型是布尔值 + default: false // hoverable prop的默认值是false + }, + bordered: { + type: Boolean, // bordered prop的类型是布尔值 + default: true // bordered prop的默认值是true + }, + options: { + type: Array as PropType, // options prop的类型是OptionsConfig对象的数组 + default: () => [] // options prop的默认值是一个空数组 + } +}; diff --git a/web/src/components/ChooseModule/index.vue b/web/src/components/ChooseModule/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..00fc46e395f1ae1a46529f2bf7f23ef82091a781 --- /dev/null +++ b/web/src/components/ChooseModule/index.vue @@ -0,0 +1,96 @@ + + + + + + diff --git a/web/src/components/CodeHighLight/index.vue b/web/src/components/CodeHighLight/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..339907d65c5b8705e979fdbb652f4b8b1dee342f --- /dev/null +++ b/web/src/components/CodeHighLight/index.vue @@ -0,0 +1,56 @@ + + + + + + diff --git a/web/src/components/CropUpload/index.vue b/web/src/components/CropUpload/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..ccfb12a4181fb2b0d11c61c16437563e6990a61f --- /dev/null +++ b/web/src/components/CropUpload/index.vue @@ -0,0 +1,181 @@ + + + + + + diff --git a/web/src/components/CropUpload/interface.ts b/web/src/components/CropUpload/interface.ts new file mode 100644 index 0000000000000000000000000000000000000000..9ef5c49dbdbbdb376f3c83e8627e87bedda73c70 --- /dev/null +++ b/web/src/components/CropUpload/interface.ts @@ -0,0 +1,80 @@ +/** + * @description 接口 + * @license Apache License Version 2.0 +2022 +, + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ +import CropUpload from "./index.vue"; + +/** + * 裁剪上传组件的属性 + */ +export interface CropUploadOptions { + /** 预览地址 */ + previewUrl: string; + /** 文件名 */ + fileName: string; +} + +/** 裁剪图片的格式 */ +export enum OutputType { + jpeg = "jpeg", + png = "png", + webp = "webp" +} + +/** VueCropper属性 */ +export interface VueCropperProps { + /** 裁剪图片的地址,url 地址, base64, blob */ + img: string; + /** 裁剪生成图片的质量 */ + outputSize: number; + /** 是否输boolean出原图比例的截图 */ + full: false; + /** 裁剪生成图片的格式 */ + outputType: OutputType; + /** 是否可以移动图片 */ + canMove: boolean; + /** 固定截图框大小 */ + fixedBox: boolean; + /** 上传图片按照原始比例渲染 */ + original: boolean; + /** 截图框能否拖动 */ + canMoveBox: boolean; + /** 是否默认生成截图框 */ + autoCrop: boolean; + /** 默认生成截图框宽度 */ + autoCropWidth: number; + /** 默认生成截图框高度 */ + autoCropHeight: number; + /** 截图框是否被限制在图片里面 */ + centerBox: boolean; + /** 是否按照设备的dpr 输出等比例图片 */ + high: boolean; + /** 截图数据 */ + cropData: object; + /** 图片根据截图框输出比例倍数 */ + enlarge: number; + /** 图片默认渲染方式 */ + mode: "contain"; + /** 限制图片最大宽度和高度 */ + maxImgSize: number; + /** true 为展示真实输出图片宽高 false 展示看到的截图框宽高 */ + infoTrue: boolean; + /** limitMinSize */ + limitMinSize: number[]; +} + +/** + * @description 角色选择器实例类型 + */ +export type CropUploadInstance = Omit, keyof ComponentPublicInstance | keyof CropUploadOptions>; diff --git a/web/src/components/ECharts/config/index.ts b/web/src/components/ECharts/config/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..bbcb0a838a76678c5666a13490d1d43dce0e9147 --- /dev/null +++ b/web/src/components/ECharts/config/index.ts @@ -0,0 +1,67 @@ +import * as echarts from "echarts/core"; +import { BarChart, LineChart, LinesChart, PieChart, ScatterChart, RadarChart, GaugeChart } from "echarts/charts"; +import { + TitleComponent, + TooltipComponent, + GridComponent, + DatasetComponent, + TransformComponent, + LegendComponent, + PolarComponent, + GeoComponent, + ToolboxComponent, + DataZoomComponent +} from "echarts/components"; +import { LabelLayout, UniversalTransition } from "echarts/features"; +import { CanvasRenderer } from "echarts/renderers"; +import type { + BarSeriesOption, + LineSeriesOption, + LinesSeriesOption, + PieSeriesOption, + ScatterSeriesOption, + RadarSeriesOption, + GaugeSeriesOption +} from "echarts/charts"; +import type { TitleComponentOption, TooltipComponentOption, GridComponentOption, DatasetComponentOption } from "echarts/components"; +import type { ComposeOption } from "echarts/core"; +import "echarts-liquidfill"; + +export type ECOption = ComposeOption< + | BarSeriesOption + | LineSeriesOption + | LinesSeriesOption + | PieSeriesOption + | RadarSeriesOption + | GaugeSeriesOption + | TitleComponentOption + | TooltipComponentOption + | GridComponentOption + | DatasetComponentOption + | ScatterSeriesOption +>; + +echarts.use([ + TitleComponent, + TooltipComponent, + GridComponent, + DatasetComponent, + TransformComponent, + LegendComponent, + PolarComponent, + GeoComponent, + ToolboxComponent, + DataZoomComponent, + BarChart, + LineChart, + LinesChart, + PieChart, + ScatterChart, + RadarChart, + GaugeChart, + LabelLayout, + UniversalTransition, + CanvasRenderer +]); + +export default echarts; diff --git a/web/src/components/ECharts/index.vue b/web/src/components/ECharts/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..0bfeb93309d70ea7edd63da39206a9d2bf38cc2b --- /dev/null +++ b/web/src/components/ECharts/index.vue @@ -0,0 +1,102 @@ + + + diff --git a/web/src/components/ESign/index.vue b/web/src/components/ESign/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..1136c5f45f170aa791e5e9a59c3d7bcbc62b3cd5 --- /dev/null +++ b/web/src/components/ESign/index.vue @@ -0,0 +1,305 @@ + + + + + + diff --git a/web/src/components/ESign/interface.ts b/web/src/components/ESign/interface.ts new file mode 100644 index 0000000000000000000000000000000000000000..b7f43be514b4499e6a13940e3d422662cb13c63a --- /dev/null +++ b/web/src/components/ESign/interface.ts @@ -0,0 +1,51 @@ +/** + * @description 电子签名组件接口 + * @license Apache License Version 2.0 +2022 +, + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ +import ESign from "./index.vue"; + +/** 电子签名组件属性接口 */ +export interface ESignProps { + /** 画布宽度,即导出图片的宽度 */ + width: number; + /** 画布高度,即导出图片的高度 */ + height: number; + /** 画笔粗细 */ + lineWidth: number; + /** 画笔颜色 */ + lineColor: string; + /** 背景颜色画布背景色,为空时画布背景透明,支持多种格式 '#ccc','#E5A1A1','rgb(229, 161, 161)','rgba(0,0,0,.6)','red' */ + bgColor: string; + /** 是否裁剪,在画布设定尺寸基础上裁掉四周空白部分 */ + isCrop: boolean; + /** 清空画布时(reset)是否同时清空设置的背景色(bgColor) */ + isClearBgColor?: boolean; + /** 生成图片格式 image/jpeg(jpg格式下生成的图片透明背景会变黑色请慎用或指定背景色)、 image/webp */ + format?: string; + /** 生成图片质量;在指定图片格式为 image/jpeg 或 image/webp的情况下,可以从 0 到 1 的区间内选择图片的质量。如果超出取值范围,将会使用默认值 0.92。其他参数会被忽略。 */ + quality?: number; + /** 前面图片 */ + image: string; +} + +/** 电子签名组件点位坐标接口 */ +export interface Points { + x: number; + y: number; +} + +/** + * @description 角色选择器实例类型 + */ +export type ESignInstance = Omit, keyof ComponentPublicInstance | keyof ESignProps>; diff --git a/web/src/components/ErrorMessage/403.vue b/web/src/components/ErrorMessage/403.vue new file mode 100644 index 0000000000000000000000000000000000000000..73783ec24195ab07116dad24d5a41c1b8dcce2fe --- /dev/null +++ b/web/src/components/ErrorMessage/403.vue @@ -0,0 +1,19 @@ + + + + + diff --git a/web/src/components/ErrorMessage/404.vue b/web/src/components/ErrorMessage/404.vue new file mode 100644 index 0000000000000000000000000000000000000000..831a1e95d243829c9c2374bd345f3a3daba2760c --- /dev/null +++ b/web/src/components/ErrorMessage/404.vue @@ -0,0 +1,19 @@ + + + + + diff --git a/web/src/components/ErrorMessage/500.vue b/web/src/components/ErrorMessage/500.vue new file mode 100644 index 0000000000000000000000000000000000000000..14baedc39fc1567ff88e943c544f50994a79ea2f --- /dev/null +++ b/web/src/components/ErrorMessage/500.vue @@ -0,0 +1,19 @@ + + + + + diff --git a/web/src/components/ErrorMessage/index.scss b/web/src/components/ErrorMessage/index.scss new file mode 100644 index 0000000000000000000000000000000000000000..7a788b4f259f967d3aee4db7139e1f32b03d1621 --- /dev/null +++ b/web/src/components/ErrorMessage/index.scss @@ -0,0 +1,32 @@ +.not-container { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + .not-img { + margin-right: 120px; + } + .not-detail { + display: flex; + flex-direction: column; + h2, + h4 { + padding: 0; + margin: 0; + } + h2 { + font-size: 60px; + color: var(--el-text-color-primary); + } + h4 { + margin: 30px 0 20px; + font-size: 19px; + font-weight: normal; + color: var(--el-text-color-regular); + } + .el-button { + width: 100px; + } + } +} diff --git a/web/src/components/Form/DatePicker/index.vue b/web/src/components/Form/DatePicker/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..427339777d40cc1136eebfd23b0dcffc05ee945c --- /dev/null +++ b/web/src/components/Form/DatePicker/index.vue @@ -0,0 +1,108 @@ + + + + + + diff --git a/web/src/components/Form/FormContainer/index.vue b/web/src/components/Form/FormContainer/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..9c845ceb51ab968b20cd288cf6accca2d4ad00b5 --- /dev/null +++ b/web/src/components/Form/FormContainer/index.vue @@ -0,0 +1,44 @@ + + + + + + diff --git a/web/src/components/Form/SButton/index.vue b/web/src/components/Form/SButton/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..fe8a93df78e063cbb0910ba69f6a7051df149866 --- /dev/null +++ b/web/src/components/Form/SButton/index.vue @@ -0,0 +1,66 @@ + + + + + + diff --git a/web/src/components/Form/SCheckboxGroup/index.vue b/web/src/components/Form/SCheckboxGroup/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..ffcfcdacd0727f72d1ef9daf72a8b851fbc571c9 --- /dev/null +++ b/web/src/components/Form/SCheckboxGroup/index.vue @@ -0,0 +1,34 @@ + + + + + + diff --git a/web/src/components/Form/SCheckboxGroup/interface.ts b/web/src/components/Form/SCheckboxGroup/interface.ts new file mode 100644 index 0000000000000000000000000000000000000000..4e17c6631011a23cc6f46552d4d96105274b7a73 --- /dev/null +++ b/web/src/components/Form/SCheckboxGroup/interface.ts @@ -0,0 +1,33 @@ +/** + * @description 接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +/** + * @Description: 多选框组件属性 + * @Author: huguodong + * @Date: 2023-12-15 15:34:54 + + */ +export interface SCheckboxGroupProps { + /** 选项数组 */ + options: any[]; + /** 选项显示标签 */ + label?: string; + /** 选项值 */ + value?: string; + /** 是否为按钮 */ + button?: boolean; + /** 是否多选框组 */ + group?: boolean; +} diff --git a/web/src/components/Form/SFormItem/index.vue b/web/src/components/Form/SFormItem/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..04d1495030965b0535d3439a67eeb6c83eaa8af1 --- /dev/null +++ b/web/src/components/Form/SFormItem/index.vue @@ -0,0 +1,103 @@ + + + + + + diff --git a/web/src/components/Form/SInput/index.vue b/web/src/components/Form/SInput/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..72ccf99a38f3a8cf0a5dba7387a518d4d3090520 --- /dev/null +++ b/web/src/components/Form/SInput/index.vue @@ -0,0 +1,20 @@ + + + + + + diff --git a/web/src/components/Form/SRadioGroup/index.vue b/web/src/components/Form/SRadioGroup/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..4f3bbc4d9d53fef3f501f2c6d017c1b5bd963181 --- /dev/null +++ b/web/src/components/Form/SRadioGroup/index.vue @@ -0,0 +1,29 @@ + + + + + + diff --git a/web/src/components/Form/SRadioGroup/interface.ts b/web/src/components/Form/SRadioGroup/interface.ts new file mode 100644 index 0000000000000000000000000000000000000000..c6e6ba1855e70218da9d8d71dde7e56af4155573 --- /dev/null +++ b/web/src/components/Form/SRadioGroup/interface.ts @@ -0,0 +1,26 @@ +/** + * @description 单选框组件接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +/** 单选框组件属性 */ +export interface SRadioGroupProps { + /** 选项数组 */ + options: any[]; + /** 选项显示标签 */ + labelKey?: string; + /** 选项值 */ + valueKey?: string; + /** 是否为按钮 */ + button?: boolean; +} diff --git a/web/src/components/Form/SSelect/index.vue b/web/src/components/Form/SSelect/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..bb6c5f8ee11d6abd7b98b5315cedea9b991de3f7 --- /dev/null +++ b/web/src/components/Form/SSelect/index.vue @@ -0,0 +1,31 @@ + + + + + + diff --git a/web/src/components/Form/SSelect/interface.ts b/web/src/components/Form/SSelect/interface.ts new file mode 100644 index 0000000000000000000000000000000000000000..cab77e7e80a8703deda8434d9622a680bbc5b291 --- /dev/null +++ b/web/src/components/Form/SSelect/interface.ts @@ -0,0 +1,24 @@ +/** + * @description 选择框组件接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +/** 选择框组件属性 */ +export interface SSelectProps { + /** 选项数组 */ + options: any[]; + /** 选项显示标签 */ + label?: string; + /** 选项值 */ + value?: string; +} diff --git a/web/src/components/Grid/components/GridItem.vue b/web/src/components/Grid/components/GridItem.vue new file mode 100644 index 0000000000000000000000000000000000000000..468a982a4ecfb17d896a8de01d55e4641b873d9c --- /dev/null +++ b/web/src/components/Grid/components/GridItem.vue @@ -0,0 +1,66 @@ + + diff --git a/web/src/components/Grid/index.vue b/web/src/components/Grid/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..38200f432426bf00616d258f6eb7f7c43cba100a --- /dev/null +++ b/web/src/components/Grid/index.vue @@ -0,0 +1,167 @@ + + + diff --git a/web/src/components/Grid/interface/index.ts b/web/src/components/Grid/interface/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..a0beff2cb94f939e8565ff8089a41c2ab531ba48 --- /dev/null +++ b/web/src/components/Grid/interface/index.ts @@ -0,0 +1,6 @@ +export type BreakPoint = "xs" | "sm" | "md" | "lg" | "xl"; + +export type Responsive = { + span?: number; + offset?: number; +}; diff --git a/web/src/components/Loading/fullScreen.ts b/web/src/components/Loading/fullScreen.ts new file mode 100644 index 0000000000000000000000000000000000000000..c005892d4d647cd1b28d254f6755ff86bfd85182 --- /dev/null +++ b/web/src/components/Loading/fullScreen.ts @@ -0,0 +1,49 @@ +import { ElLoading } from "element-plus"; + +/* 全局请求 loading */ +let loadingInstance: ReturnType; + +/** + * @description 开启 Loading + * */ +const startLoading = () => { + loadingInstance = ElLoading.service({ + fullscreen: true, + lock: true, + text: "Loading", + background: "rgba(0, 0, 0, 0.7)" + }); +}; + +/** + * @description 结束 Loading + * */ +const endLoading = () => { + loadingInstance.close(); +}; + +/** + * @description 显示全屏加载 + * */ +let needLoadingRequestCount = 0; +export const showFullScreenLoading = () => { + // 如果需要加载请求数量为0,则开始加载动画 + if (needLoadingRequestCount === 0) { + startLoading(); + } + // 加载请求数量加1 + needLoadingRequestCount++; +}; +/** + * @description 隐藏全屏加载 + * */ +export const tryHideFullScreenLoading = () => { + // 如果需要加载请求次数小于等于0,则直接返回 + if (needLoadingRequestCount <= 0) return; + // 将需要加载请求次数减1 + needLoadingRequestCount--; + // 如果需要加载请求次数等于0,则结束加载 + if (needLoadingRequestCount === 0) { + endLoading(); + } +}; diff --git a/web/src/components/Loading/index.scss b/web/src/components/Loading/index.scss new file mode 100644 index 0000000000000000000000000000000000000000..f1a71253ad4b094d53caf1daca923c83e5c511b3 --- /dev/null +++ b/web/src/components/Loading/index.scss @@ -0,0 +1,67 @@ +.loading-box { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + .loading-wrap { + display: flex; + align-items: center; + justify-content: center; + padding: 98px; + } +} +.dot { + position: relative; + box-sizing: border-box; + display: inline-block; + width: 32px; + height: 32px; + font-size: 32px; + transform: rotate(45deg); + animation: ant-rotate 1.2s infinite linear; +} +.dot i { + position: absolute; + display: block; + width: 14px; + height: 14px; + background-color: var(--el-color-primary); + border-radius: 100%; + opacity: 0.3; + transform: scale(0.75); + transform-origin: 50% 50%; + animation: ant-spin-move 1s infinite linear alternate; +} +.dot i:nth-child(1) { + top: 0; + left: 0; +} +.dot i:nth-child(2) { + top: 0; + right: 0; + animation-delay: 0.4s; +} +.dot i:nth-child(3) { + right: 0; + bottom: 0; + animation-delay: 0.8s; +} +.dot i:nth-child(4) { + bottom: 0; + left: 0; + animation-delay: 1.2s; +} + +@keyframes ant-rotate { + to { + transform: rotate(405deg); + } +} + +@keyframes ant-spin-move { + to { + opacity: 1; + } +} diff --git a/web/src/components/Loading/index.vue b/web/src/components/Loading/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..5b209a5dfec96667b68182c512389476b4b8501a --- /dev/null +++ b/web/src/components/Loading/index.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/web/src/components/ProTable/components/ColSetting.vue b/web/src/components/ProTable/components/ColSetting.vue new file mode 100644 index 0000000000000000000000000000000000000000..e312eecd824d33bca6b35de539da3647be37ccf7 --- /dev/null +++ b/web/src/components/ProTable/components/ColSetting.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/web/src/components/ProTable/components/Pagination.vue b/web/src/components/ProTable/components/Pagination.vue new file mode 100644 index 0000000000000000000000000000000000000000..7faa64253e1bc0e168d2a24574e667a0f39af06b --- /dev/null +++ b/web/src/components/ProTable/components/Pagination.vue @@ -0,0 +1,35 @@ + + + diff --git a/web/src/components/ProTable/components/TableColumn.vue b/web/src/components/ProTable/components/TableColumn.vue new file mode 100644 index 0000000000000000000000000000000000000000..6df3f7141a52f737ec341d4e266f03adb5bb3fde --- /dev/null +++ b/web/src/components/ProTable/components/TableColumn.vue @@ -0,0 +1,52 @@ + + + diff --git a/web/src/components/ProTable/index.vue b/web/src/components/ProTable/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..397467c5e04abae5e7032f2b72fb3a28cdf5206b --- /dev/null +++ b/web/src/components/ProTable/index.vue @@ -0,0 +1,320 @@ + + + + + diff --git a/web/src/components/ProTable/interface/index.ts b/web/src/components/ProTable/interface/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..58c57f8711011ef85655e0b06aea4055d06525e2 --- /dev/null +++ b/web/src/components/ProTable/interface/index.ts @@ -0,0 +1,85 @@ +import { VNode, ComponentPublicInstance, Ref } from "vue"; +import { BreakPoint, Responsive } from "@/components/Grid/interface"; +import { TableColumnCtx } from "element-plus/es/components/table/src/table-column/defaults"; +import { ProTableProps } from "@/components/ProTable/index.vue"; +import ProTable from "@/components/ProTable/index.vue"; + +export interface EnumProps { + label?: string; // 选项框显示的文字 + value?: string | number | boolean | any[]; // 选项框值 + disabled?: boolean; // 是否禁用此选项 + tagType?: string; // 当 tag 为 true 时,此选择会指定 tag 显示类型 + children?: EnumProps[]; // 为树形选择时,可以通过 children 属性指定子选项 + [key: string]: any; +} + +export type TypeProps = "index" | "selection" | "radio" | "expand" | "sort"; + +export type SearchType = + | "input" + | "input-number" + | "select" + | "select-v2" + | "tree-select" + | "cascader" + | "date-picker" + | "time-picker" + | "time-select" + | "switch" + | "slider"; + +export type SearchRenderScope = { + searchParam: { [key: string]: any }; + placeholder: string; + clearable: boolean; + options: EnumProps[]; + data: EnumProps[]; +}; + +export type SearchProps = { + el?: SearchType; // 当前项搜索框的类型 + label?: string; // 当前项搜索框的 label + props?: any; // 搜索项参数,根据 element plus 官方文档来传递,该属性所有值会透传到组件 + key?: string; // 当搜索项 key 不为 prop 属性时,可通过 key 指定 + tooltip?: string; // 搜索提示 + order?: number; // 搜索项排序(从大到小) + span?: number; // 搜索项所占用的列数,默认为 1 列 + offset?: number; // 搜索字段左侧偏移列数 + defaultValue?: string | number | boolean | any[] | Ref; // 搜索项默认值 + render?: (scope: SearchRenderScope) => VNode; // 自定义搜索内容渲染(tsx语法) +} & Partial>; + +export type FieldNamesProps = { + label: string; + value: string; + children?: string; +}; + +export type RenderScope = { + row: T; + $index: number; + column: TableColumnCtx; + [key: string]: any; +}; + +export type HeaderRenderScope = { + $index: number; + column: TableColumnCtx; + [key: string]: any; +}; + +export interface ColumnProps extends Partial, "type" | "children" | "renderCell" | "renderHeader">> { + type?: TypeProps; // 列类型 + tag?: boolean | Ref; // 是否是标签展示 + isShow?: boolean | Ref; // 是否显示在表格当中 + isSetting?: boolean | Ref; // 是否在 ColSetting 中可配置 + search?: SearchProps | undefined; // 搜索项配置 + enum?: EnumProps[] | Ref | ((params?: any) => Promise); // 枚举字典 + isFilterEnum?: boolean | Ref; // 当前单元格值是否根据 enum 格式化(示例:enum 只作为搜索项数据) + fieldNames?: FieldNamesProps; // 指定 label && value && children 的 key 值 + headerRender?: (scope: HeaderRenderScope) => VNode; // 自定义表头内容渲染(tsx语法) + render?: (scope: RenderScope) => VNode | string; // 自定义单元格内容渲染(tsx语法) + _children?: ColumnProps[]; // 多级表头 +} + +export type ProTableInstance = Omit, keyof ComponentPublicInstance | keyof ProTableProps>; diff --git a/web/src/components/SearchForm/components/SearchFormItem.vue b/web/src/components/SearchForm/components/SearchFormItem.vue new file mode 100644 index 0000000000000000000000000000000000000000..608dec573ac405ae44b89832c0356effdcadb1c0 --- /dev/null +++ b/web/src/components/SearchForm/components/SearchFormItem.vue @@ -0,0 +1,97 @@ + + + diff --git a/web/src/components/SearchForm/index.vue b/web/src/components/SearchForm/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..b961824c55414c6404327df59fd7dc8a82090b3b --- /dev/null +++ b/web/src/components/SearchForm/index.vue @@ -0,0 +1,94 @@ + + diff --git a/web/src/components/SelectFilter/index.scss b/web/src/components/SelectFilter/index.scss new file mode 100644 index 0000000000000000000000000000000000000000..bb2e8090333597c7df9afebaa8c45e48232720c0 --- /dev/null +++ b/web/src/components/SelectFilter/index.scss @@ -0,0 +1,63 @@ +.select-filter { + width: 100%; + .select-filter-item { + display: flex; + align-items: center; + border-bottom: 1px dashed var(--el-border-color-light); + &:last-child { + border-bottom: none; + } + .select-filter-item-title { + margin-top: -2px; + span { + font-size: 14px; + color: var(--el-text-color-regular); + white-space: nowrap; + } + } + .select-filter-notData { + margin: 18px 0; + font-size: 14px; + color: var(--el-text-color-regular); + } + .select-filter-list { + display: flex; + flex: 1; + padding: 0; + margin: 13px 0; + li { + display: flex; + align-items: center; + padding: 5px 15px; + margin-right: 16px; + font-size: 13px; + color: var(--el-color-primary); + list-style: none; + cursor: pointer; + background: var(--el-color-primary-light-9); + border: 1px solid var(--el-color-primary-light-5); + border-radius: 32px; + &:hover { + color: #ffffff; + background: var(--el-color-primary); + border-color: var(--el-color-primary); + transition: 0.1s; + } + &.active { + font-weight: bold; + color: #ffffff; + background: var(--el-color-primary); + border-color: var(--el-color-primary); + } + .el-icon { + margin-right: 4px; + font-size: 16px; + font-weight: bold; + } + span { + white-space: nowrap; + } + } + } + } +} diff --git a/web/src/components/SelectFilter/index.vue b/web/src/components/SelectFilter/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..ff7a50750aa8b5e405b9d56be627559472eee5ec --- /dev/null +++ b/web/src/components/SelectFilter/index.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/web/src/components/SelectIcon/index.scss b/web/src/components/SelectIcon/index.scss new file mode 100644 index 0000000000000000000000000000000000000000..dbceb6443f69d01c3360d198e9564f5dbe3ab1cf --- /dev/null +++ b/web/src/components/SelectIcon/index.scss @@ -0,0 +1,39 @@ +.icon-box { + width: 100%; + .el-button { + display: flex; + align-items: center; + justify-content: center; + font-size: 18px; + color: var(--el-text-color-regular); + } + :deep(.el-dialog__body) { + padding: 25px 20px 20px; + .el-input { + margin-bottom: 10px; + } + .icon-list { + display: grid; + grid-template-columns: repeat(auto-fill, 115px); + justify-content: space-evenly; + max-height: 70vh; + .icon-item { + display: flex; + flex-direction: column; + align-items: center; + width: 42px; + padding: 20px 30px; + cursor: pointer; + transition: all 0.2s; + &:hover { + transform: scale(1.3); + } + span { + margin-top: 5px; + line-height: 20px; + text-align: center; + } + } + } + } +} diff --git a/web/src/components/SelectIcon/index.vue b/web/src/components/SelectIcon/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..f45b6e6e4962c247ed16558faebfc75d313f6149 --- /dev/null +++ b/web/src/components/SelectIcon/index.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/web/src/components/SelectIconPlus/index.scss b/web/src/components/SelectIconPlus/index.scss new file mode 100644 index 0000000000000000000000000000000000000000..dc4d0f3496b52f0c275f5655f13b394ef4cf338c --- /dev/null +++ b/web/src/components/SelectIconPlus/index.scss @@ -0,0 +1,39 @@ +.icon-box { + width: 100%; + .el-button { + display: flex; + align-items: center; + justify-content: center; + font-size: 18px; + color: var(--el-text-color-regular); + } + :deep(.el-dialog__body) { + padding: 25px 20px 20px; + .el-input { + margin-bottom: 10px; + } + .icon-list { + display: grid; + grid-template-columns: repeat(auto-fill, 120px); + justify-content: space-evenly; + max-height: 70vh; + .icon-item { + display: flex; + flex-direction: column; + align-items: center; + width: 42px; + padding: 20px 30px; + cursor: pointer; + transition: all 0.2s; + &:hover { + transform: scale(1.3); + } + span { + margin-top: 5px; + line-height: 20px; + text-align: center; + } + } + } + } +} diff --git a/web/src/components/SelectIconPlus/index.vue b/web/src/components/SelectIconPlus/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..f224fe64d0de1b93c3fea01cf9a7bcd13e9af6ed --- /dev/null +++ b/web/src/components/SelectIconPlus/index.vue @@ -0,0 +1,188 @@ + + + + + + diff --git a/web/src/components/SelectIconPlus/interface.ts b/web/src/components/SelectIconPlus/interface.ts new file mode 100644 index 0000000000000000000000000000000000000000..e27b864040f6b6f44ed4693b5eca30aa36dabe65 --- /dev/null +++ b/web/src/components/SelectIconPlus/interface.ts @@ -0,0 +1,43 @@ +/** + * @description 接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +export type IconPrefixType = "ep" | "local" | "ant-design" | "et" | "flat-color-icons" | "eva" | "zondicons" | "uiw" | "line-md"; + +/** 图标选择器属性 */ +export interface SelectIconProps { + /** 图标对应的值 */ + iconValue: string; + /** 图标选择器标题 */ + title?: string; + /** 是否可清除 */ + clearable?: boolean; + /** 图标选择器占位符 */ + placeholder?: string; +} + +/** 图标列表信息 */ +export interface SelectIconIconsInfo { + /** 图标前缀 */ + prefix: string; + /** 图标名称列表 */ + icons: string[]; +} + +/** 图标选择器tabs信息 */ +export interface SelectIconTabs { + /** tab标题 */ + label: string; + /** 图标前缀 */ + prefix: IconPrefixType; +} diff --git a/web/src/components/Selectors/MenuSelector/index.vue b/web/src/components/Selectors/MenuSelector/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..cd907a623399911923228313831f591441026791 --- /dev/null +++ b/web/src/components/Selectors/MenuSelector/index.vue @@ -0,0 +1,139 @@ + + + + + + diff --git a/web/src/components/Selectors/MenuSelector/interface.ts b/web/src/components/Selectors/MenuSelector/interface.ts new file mode 100644 index 0000000000000000000000000000000000000000..e5512629d57fe2d57eb9c70227666dee026840c1 --- /dev/null +++ b/web/src/components/Selectors/MenuSelector/interface.ts @@ -0,0 +1,36 @@ +/** + * @description 菜单选择器接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +/** 菜单选择器属性 */ +export interface MenuSelectProps { + /** 菜单对应的值 */ + menuValue: any; + /** 是否可清除 */ + clearable?: boolean; + /** 菜单选择器占位符 */ + placeholder?: string; + /** 是否多选 */ + multiple?: boolean; + /** 是否严格模式,为true则只能选择子节点 */ + checkStrictly?: boolean; + /** 是否显示全部选项,默认为 false */ + showAll?: boolean; + /** 组织树api */ + menuTreeApi?: (data?: any) => Promise; + /** 菜单树数据 */ + menuTreeData?: any; + /** 只有目录可以选择 */ + onlyCatalog?: boolean; +} diff --git a/web/src/components/Selectors/OrgSelector/index.vue b/web/src/components/Selectors/OrgSelector/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..be7e8505a4056157e0e41ffe2d26db8905727994 --- /dev/null +++ b/web/src/components/Selectors/OrgSelector/index.vue @@ -0,0 +1,89 @@ + + + + + + diff --git a/web/src/components/Selectors/OrgSelector/interface.ts b/web/src/components/Selectors/OrgSelector/interface.ts new file mode 100644 index 0000000000000000000000000000000000000000..ec0a5d6c505121b7f8253af66dd0a469897b7983 --- /dev/null +++ b/web/src/components/Selectors/OrgSelector/interface.ts @@ -0,0 +1,28 @@ +/** + * @description 组织选择器接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +/** 组织选择器属性 */ +export interface OrgSelectProps { + /** 组织对应的值 */ + orgValue: number | string; + /** 是否可清除 */ + clearable?: boolean; + /** 组织选择器占位符 */ + placeholder?: string; + /** 是否显示全部选项,默认为 true */ + showAll?: boolean; + /** 组织树api */ + orgTreeApi?: (data?: any) => Promise; +} diff --git a/web/src/components/Selectors/PositionSelector/index.vue b/web/src/components/Selectors/PositionSelector/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..84c366718b3a4eb419c4ecd940baf2a638157b77 --- /dev/null +++ b/web/src/components/Selectors/PositionSelector/index.vue @@ -0,0 +1,39 @@ + + + + + + diff --git a/web/src/components/Selectors/PositionSelector/interface.ts b/web/src/components/Selectors/PositionSelector/interface.ts new file mode 100644 index 0000000000000000000000000000000000000000..cbcc9e3c53c1eccca19eabb6d6c27b6fd5b2f15f --- /dev/null +++ b/web/src/components/Selectors/PositionSelector/interface.ts @@ -0,0 +1,20 @@ +/** + * @description 职位选择器接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +/** 职位选择器属性 */ +export interface PositionSelectProps { + /** 组织树api */ + selectorApi?: (data?: any) => Promise; +} diff --git a/web/src/components/Selectors/RoleSelector/index.vue b/web/src/components/Selectors/RoleSelector/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..e0408a0cc49fd95ec6a89b75878648aa753cac9c --- /dev/null +++ b/web/src/components/Selectors/RoleSelector/index.vue @@ -0,0 +1,183 @@ + + + + + + diff --git a/web/src/components/Selectors/RoleSelector/interface.ts b/web/src/components/Selectors/RoleSelector/interface.ts new file mode 100644 index 0000000000000000000000000000000000000000..f7d135c6fa54849df10dec03601a928814096a35 --- /dev/null +++ b/web/src/components/Selectors/RoleSelector/interface.ts @@ -0,0 +1,41 @@ +/** + * @description 接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +import RoleSelector from "./index.vue"; + +/** 角色选择器属性 */ +export interface RoleSelectProps { + /** 组织树api列表 */ + orgTreeApi: (data?: any) => Promise; + /** 角色选择api列表 */ + roleSelectorApi: (data?: any) => Promise; + /** 是否可带数据权限 */ + permission?: boolean; + /** 是否多选 */ + multiple?: boolean; + /** 最大角色数 */ + maxCount?: number; +} + +/** 角色选择器表格初始化参数 */ +export interface RoleSelectTableInitParams { + /** 组织ID */ + orgId?: number | string | null; +} + +/** + * @description 角色选择器实例类型 + */ +export type RoleSelectorInstance = Omit, keyof ComponentPublicInstance | keyof RoleSelectProps>; diff --git a/web/src/components/Selectors/UserSelector/index.vue b/web/src/components/Selectors/UserSelector/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..8aff0052ff8a809ffb325bdacd075230ae207527 --- /dev/null +++ b/web/src/components/Selectors/UserSelector/index.vue @@ -0,0 +1,246 @@ + + + + + + diff --git a/web/src/components/Selectors/UserSelector/interface.ts b/web/src/components/Selectors/UserSelector/interface.ts new file mode 100644 index 0000000000000000000000000000000000000000..2c0132b7bf82ab3f7f26479004d7f3a2573f20b8 --- /dev/null +++ b/web/src/components/Selectors/UserSelector/interface.ts @@ -0,0 +1,48 @@ +/** + * @description 用户选择器接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import UserSelector from "./index.vue"; + +/** 用户选择器属性 */ +export interface UserSelectProps { + /** 组织树api */ + orgTreeApi: (data?: any) => Promise; + /** 职位选择api */ + positionTreeApi?: (data?: any) => Promise; + /** 角色选择api */ + roleTreeApi?: (data?: any) => Promise; + /** 用户选择api */ + userSelectorApi: (data?: any) => Promise; + /** 是否多选 */ + multiple?: boolean; + /** 最大用户数 */ + maxCount?: number; + /** 是否是业务 */ + biz?: boolean; +} + +/** 用户选择器表格初始化参数 */ +export interface UserSelectTableInitParams { + /** 组织ID */ + orgId?: number | string | null; + /** 职位ID */ + positionId?: number | string | null; + /** 角色ID */ + roleId?: number | string | null; +} + +/** + * @description 用户选择器实例类型 + */ +export type UserSelectorInstance = Omit, keyof ComponentPublicInstance | keyof UserSelectProps>; diff --git a/web/src/components/SvgIcon/index.vue b/web/src/components/SvgIcon/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..2603b85c5b1b1086d787952d1f668524a0dca390 --- /dev/null +++ b/web/src/components/SvgIcon/index.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/web/src/components/SwitchDark/index.vue b/web/src/components/SwitchDark/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..a4ee0d73b024a3df562a670252e672f9dace253c --- /dev/null +++ b/web/src/components/SwitchDark/index.vue @@ -0,0 +1,12 @@ + + + diff --git a/web/src/components/TreeFilter/index.scss b/web/src/components/TreeFilter/index.scss new file mode 100644 index 0000000000000000000000000000000000000000..fe7ace6cebd5607f386605bc6f5511419d83d140 --- /dev/null +++ b/web/src/components/TreeFilter/index.scss @@ -0,0 +1,44 @@ +.filter { + box-sizing: border-box; + width: 220px; + height: 100%; + padding: 18px; + margin-right: 10px; + .title { + margin: 0 0 15px; + font-size: 18px; + font-weight: bold; + color: var(--el-color-info-dark-2); + letter-spacing: 0.5px; + } + .search { + display: flex; + align-items: center; + margin: 0 0 15px; + .el-icon { + cursor: pointer; + transform: rotate(90deg) translateY(-8px); + } + } + .el-scrollbar { + :deep(.el-tree) { + height: 80%; + overflow: auto; + .el-tree-node__content { + height: 33px; + } + } + :deep(.el-tree--highlight-current) { + .el-tree-node.is-current > .el-tree-node__content { + background-color: var(--el-color-primary); + .el-tree-node__label, + .el-tree-node__expand-icon { + color: white; + } + .is-leaf { + color: transparent; + } + } + } + } +} diff --git a/web/src/components/TreeFilter/index.vue b/web/src/components/TreeFilter/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..d01a1c690cf4c928d8aa11e4569773debcbcc854 --- /dev/null +++ b/web/src/components/TreeFilter/index.vue @@ -0,0 +1,215 @@ + + + + + diff --git a/web/src/components/Upload/UploadImg.vue b/web/src/components/Upload/UploadImg.vue new file mode 100644 index 0000000000000000000000000000000000000000..be510e78f6aa9a25415792072b759c2724ae9a10 --- /dev/null +++ b/web/src/components/Upload/UploadImg.vue @@ -0,0 +1,327 @@ + + + + + diff --git a/web/src/components/Upload/UploadImgs.vue b/web/src/components/Upload/UploadImgs.vue new file mode 100644 index 0000000000000000000000000000000000000000..bba2448aa9578a77dca392188bd32b91152b95b4 --- /dev/null +++ b/web/src/components/Upload/UploadImgs.vue @@ -0,0 +1,316 @@ + + + + + diff --git a/web/src/config/index.ts b/web/src/config/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..f1c477cddfe21d690491073d6836dd3282980d62 --- /dev/null +++ b/web/src/config/index.ts @@ -0,0 +1,35 @@ +/** + * @description 全局默认配置项 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +// 首页地址(默认) +export const HOME_URL: string = "/home/index"; + +// 登录页地址(默认) +export const LOGIN_URL: string = "/login"; + +// 个人中心页地址 +export const USER_CENTER_URL: string = "/userCenter"; + +// 默认主题颜色 +export const DEFAULT_PRIMARY: string = "#409EFF"; + +// 路由白名单地址(本地存在的路由 staticRouter.ts 中) +export const ROUTER_WHITE_LIST: string[] = ["/500"]; + +// 高德地图 key +export const AMAP_MAP_KEY: string = ""; + +// 百度地图 key +export const BAIDU_MAP_KEY: string = ""; diff --git a/web/src/config/nprogress.ts b/web/src/config/nprogress.ts new file mode 100644 index 0000000000000000000000000000000000000000..a7ef6826ed5ac70720f6cc3cabf0ce71bafcc9a6 --- /dev/null +++ b/web/src/config/nprogress.ts @@ -0,0 +1,27 @@ +/** + * @description 加载进度条配置 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +import NProgress from "nprogress"; +import "nprogress/nprogress.css"; + +NProgress.configure({ + easing: "ease", // 动画方式 + speed: 500, // 递增进度条的速度 + showSpinner: true, // 是否显示加载ico + trickleSpeed: 200, // 自动递增间隔 + minimum: 0.3 // 初始化时的最小百分比 +}); + +export default NProgress; diff --git a/web/src/directives/index.ts b/web/src/directives/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..a90d275b8f36e1760fa6591a042570f670599eaf --- /dev/null +++ b/web/src/directives/index.ts @@ -0,0 +1,30 @@ +/** + * @description 全局指令注册 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import { App, Directive } from "vue"; +import auth from "./modules/auth"; + +const directivesList: { [key: string]: Directive } = { + auth +}; + +const directives = { + install: function (app: App) { + Object.keys(directivesList).forEach(key => { + app.directive(key, directivesList[key]); + }); + } +}; + +export default directives; diff --git a/web/src/directives/modules/auth.ts b/web/src/directives/modules/auth.ts new file mode 100644 index 0000000000000000000000000000000000000000..796003df2f2ccf4b7ed84ef18145d062e7149044 --- /dev/null +++ b/web/src/directives/modules/auth.ts @@ -0,0 +1,50 @@ +/** + * @description 按钮权限指令 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import { useAuthStore } from "@/stores/modules/auth"; +import type { Directive, DirectiveBinding } from "vue"; + +/** + * @description 按钮权限指令 + * 通过传入的权限码判断当前用户是否有权限,如果没有权限则移除该元素 + * @param value {string | string[]} - 权限码 + * @example + * + * + * + * + */ +const auth: Directive = { + // 当指令挂载时调用 + mounted(el: HTMLElement, binding: DirectiveBinding) { + // 获取传入的值和参数 + const { value, arg } = binding; + // 获取authStore + const authStore = useAuthStore(); + // 获取用户权限按钮列表 + const currentPageRoles = authStore.authButtonListGet ?? []; + // 如果传入的值是数组,并且数组的长度大于0 + if (value instanceof Array && value.length) { + const fn = binding.modifiers.and || arg === "and" ? "every" : "some"; //some表示只要有一个权限通过即可,every表示必须每个权限都通过 + const hasPermission = value[fn](item => currentPageRoles.includes(item)); // 判断传入的权限码是否在当前页面的权限列表中 + // 如果不包含,则移除该元素 + if (!hasPermission) el.remove(); + } else { + // 如果传入的值不包含当前页面的角色,则移除该元素 + if (!currentPageRoles.includes(value)) el.remove(); + } + } +}; + +export default auth; diff --git a/web/src/enums/configEnum.ts b/web/src/enums/configEnum.ts new file mode 100644 index 0000000000000000000000000000000000000000..04cc662c2a2b40e8b338d5ae031f5238c2661cb0 --- /dev/null +++ b/web/src/enums/configEnum.ts @@ -0,0 +1,39 @@ +/** + * @description 系统配置枚举 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +/** + * @description:系统配置 + */ +export enum SysBaseEnum { + /** 验证码开关 */ + LOGIN_CAPTCHA_OPEN = "LOGIN_CAPTCHA_OPEN", + /** 系统默认工作台数据 */ + SYS_DEFAULT_WORKBENCH_DATA = "SYS_DEFAULT_WORKBENCH_DATA", + /** 超链接 */ + SYS_FOOTER_LINKS = "SYS_FOOTER_LINKS" +} + +export enum SysConfigTypeEnum { + /** 基本配置 */ + SYS_BASE = "SYS_BASE", + /** 登录配置 */ + LOGIN_POLICY = "LOGIN_POLICY", + /** mqtt配置 */ + MQTT_POLICY = "MQTT_BASE", + /** 密码配置 */ + PWD_POLICY = "PWD_POLICY", + /** 业务其他配置 */ + BIZ_DEFINE = "BIZ_DEFINE" +} diff --git a/web/src/enums/dictEnum.ts b/web/src/enums/dictEnum.ts new file mode 100644 index 0000000000000000000000000000000000000000..1cbb64b0fe1c0e4f95a83666ca5f5fbed731fd7d --- /dev/null +++ b/web/src/enums/dictEnum.ts @@ -0,0 +1,143 @@ +/** + * @description 字典枚举 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +export enum SysDictEnum { + /** 菜单类型 */ + MENU_TYPE = "MENU_TYPE", + /** 用户性别类型 */ + GENDER = "GENDER", + /** 系统通用状态 */ + COMMON_STATUS = "COMMON_STATUS", + /** 系统角色分类 */ + ROLE_CATEGORY = "ROLE_CATEGORY", + /** 系统机构分类 */ + ORG_CATEGORY = "ORG_CATEGORY", + /** 系统职位分类 */ + POSITION_CATEGORY = "POSITION_CATEGORY", + /** 用户民族类型 */ + NATION = "NATION", + /** 登录设备类型 */ + AUTH_DEVICE_TYPE = "AUTH_DEVICE_TYPE", + /** 系统字典分类 */ + DICT_CATEGORY = "DICT_CATEGORY", + /** 文件上传引擎 */ + FILE_ENGINE = "FILE_ENGINE", + /** 系统通用开关 */ + COMMON_SWITCH = "COMMON_SWITCH", + /** 用户证件类型 */ + IDCARD_TYPE = "IDCARD_TYPE", + /** 通用文化程度 */ + CULTURE_LEVEL = "CULTURE_LEVEL", + /** 系统消息类型 */ + MESSAGE_CATEGORY = "MESSAGE_CATEGORY", + /** 系统消息接受者类型 */ + RECEIVER_TYPE = "RECEIVER_TYPE", + /** 系统消息接受者类型 */ + MESSAGE_WAY = "MESSAGE_WAY", + /** 系统消息接受者类型 */ + MESSAGE_STATUS = "MESSAGE_STATUS", + /** 用户在线状态 */ + ONLINE_STATUS = "ONLINE_STATUS", + /** 是否 */ + YES_NO = "YES_NO", + /** 多租户选项 */ + TENANT_OPTIONS = "TENANT_OPTIONS", + /** 验证码类型 */ + CAPTCHA_TYPE = "CAPTCHA_TYPE" +} + +/** 菜单类型 */ +export enum MenuTypeDictEnum { + /** 目录 */ + CATALOG = "CATALOG", + /** 菜单 */ + MENU = "MENU", + /** 按钮 */ + BUTTON = "BUTTON", + /** 子页 */ + SUBSET = "SUBSET", + /** 外链 */ + LINK = "LINK" +} + +export enum CommonStatusEnum { + /** 正常 */ + ENABLE = "ENABLE", + /** 禁用 */ + DISABLE = "DISABLED" +} + +/** 字典类型枚举 */ +export enum DictCategoryEnum { + /** 系统 */ + FRM = "FRM", + /** 业务 */ + BIZ = "BIZ" +} + +/** 角色类型枚举 */ +export enum OrgCategoryEnum { + /** 全局 */ + GLOBAL = "GLOBAL", + /** 机构 */ + ORG = "ORG" +} + +/** 多租户选项枚举 */ +export enum TenantEnum { + /** 手动 */ + CHOSE = "CHOSE", + /** 关闭 */ + CLOSE = "CLOSE", + /** 根据域名 */ + DOMAIN = "DOMAIN" +} + +/** 消息类型 */ +export enum MessageTypeDictEnum { + /** 通知 */ + INFORM = "INFORM", + /** 公告 */ + NOTICE = "NOTICE", + /** 消息 */ + MESSAGE = "MESSAGE" +} + +/** 消息通知者类型 */ +export enum MessageReceiverTypeDictEnum { + /** 全部 */ + ALL = "ALL", + /** 角色 */ + ROLE = "ROLE", + /** 指定 */ + APPOINT = "APPOINT" +} + +/** 消息发送方式 */ +export enum MessageSendWayDictEnum { + /** 立即 */ + NOW = "NOW", + /** 延迟 */ + DELAY = "DELAY", + /** 指定 */ + SCHEDULE = "SCHEDULE" +} + +/**消息状态 */ +export enum MessageStatusDictEnum { + /** 等待 */ + READY = "READY", + /** 延迟 */ + ALREADY = "ALREADY" +} diff --git a/web/src/enums/formEnum.ts b/web/src/enums/formEnum.ts new file mode 100644 index 0000000000000000000000000000000000000000..68792e35d3c3b5eaaafa30221f746379a51446ed --- /dev/null +++ b/web/src/enums/formEnum.ts @@ -0,0 +1,26 @@ +/** + * @description 表单枚举 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +/** 表单操作类型枚举 */ +export enum FormOptEnum { + /** 新增 */ + ADD = "新增", + /** 编辑 */ + EDIT = "编辑", + /** 查看 */ + VIEW = "查看", + /** 删除 */ + DELETE = "删除" +} diff --git a/web/src/enums/httpEnum.ts b/web/src/enums/httpEnum.ts new file mode 100644 index 0000000000000000000000000000000000000000..9b3f505406bf99271032836271392e756dc8a9cd --- /dev/null +++ b/web/src/enums/httpEnum.ts @@ -0,0 +1,64 @@ +/** + * @description http请求枚举 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +/** + * @description:请求配置 + */ +export enum ResultEnum { + SUCCESS = 200, + ERROR = 500, + OVERDUE = 401, + TIMEOUT = 30000, + TYPE = "success" +} + +/** + * @description:请求方法 + */ +export enum RequestEnum { + GET = "GET", + POST = "POST", + PATCH = "PATCH", + PUT = "PUT", + DELETE = "DELETE" +} + +/** + * @description:常用的 contentTyp 类型 + */ +export enum ContentTypeEnum { + // json + JSON = "application/json;charset=UTF-8", + // text + TEXT = "text/plain;charset=UTF-8", + // form-data 一般配合qs + FORM_URLENCODED = "application/x-www-form-urlencoded;charset=UTF-8", + // form-data 上传 + FORM_DATA = "multipart/form-data;charset=UTF-8" +} + +/* + * @description:Token配置 + */ +export enum TokenEnum { + //请求的token + ACCESS_TOKEN_KEY = "access-token", + //刷新的token + REFRESH_TOKEN_KEY = "x-access-token", + //TokenName + TOKEN_NAME = "Authorization", + // Token前缀,注意最后有个空格,如不需要需设置空字符串 // Bearer + TOKEN_PREFIX = "Bearer " +} diff --git a/web/src/enums/index.ts b/web/src/enums/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..ef2a79265dd8026d9354c48a8fcaaa3e76fc77ea --- /dev/null +++ b/web/src/enums/index.ts @@ -0,0 +1,19 @@ +/** + * @description 枚举模块 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +export * from "./configEnum"; +export * from "./httpEnum"; +export * from "./dictEnum"; +export * from "./formEnum"; diff --git a/web/src/hooks/index.ts b/web/src/hooks/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..c399922d6fe71522f5a0d817e7ea7cd41357e48a --- /dev/null +++ b/web/src/hooks/index.ts @@ -0,0 +1,22 @@ +/** + * @description hooks + * @license Apache License Version 2.0 +2022 +, + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +export * from "./useAuthButtons"; +export * from "./useHandleData"; +export * from "./useTheme"; +export * from "./useSelection"; +export * from "./useTable"; +export * from "./useTheme"; diff --git a/web/src/hooks/interface/index.ts b/web/src/hooks/interface/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..68573360edd90889936ba5fa30410cd9ef04f54f --- /dev/null +++ b/web/src/hooks/interface/index.ts @@ -0,0 +1,46 @@ +/** + * @description hooks 全局接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +export namespace Table { + export interface Pageable { + pageNum: number; + pageSize: number; + total: number; + } + export interface StateProps { + tableData: any[]; + pageable: Pageable; + searchParam: { + [key: string]: any; + }; + searchInitParam: { + [key: string]: any; + }; + totalParam: { + [key: string]: any; + }; + icon?: { + [key: string]: any; + }; + } +} + +export namespace HandleData { + export type MessageType = "" | "success" | "warning" | "info" | "error"; +} + +export namespace Theme { + export type ThemeType = "light" | "inverted" | "dark"; + export type GreyOrWeakType = "grey" | "weak"; +} diff --git a/web/src/hooks/useAuthButtons.ts b/web/src/hooks/useAuthButtons.ts new file mode 100644 index 0000000000000000000000000000000000000000..712d679e0264497fea2a7eda6eefe5f758e446e9 --- /dev/null +++ b/web/src/hooks/useAuthButtons.ts @@ -0,0 +1,46 @@ +/** + * @description 权限判断 hooks + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +import { useAuthStore } from "@/stores/modules"; +import { isArray } from "@/utils/is"; + +export const useAuthButtons = () => { + const authStore = useAuthStore(); + const authButtons = authStore.authButtonListGet; // 权限按钮列表 + + /** + * @func hasPermission + * @desc 权限判断是否能看到这个按钮,同时后端也做了校验,前端只是显示与不显示 + * @param {} permission 按钮的权限码,可以是单个字符串,也可以是数组 + * @param {} and 是否完全匹配,默认false,即只要有一个权限码通过则通过,如果为 true,则必须每个权限码都通过 + * 使用方法: + * 例如 buttonCodeList 的数据为: ['button1', 'button2', 'button3'] + * 想要判断 button1 的权限,可以写成:hasPerm('button1') + * 想要判断 button1 或 button2 的权限,可以写成:hasPerm(['button1', 'button2' ]) + * 想要判断 button1 与 button2 的权限,可以写成:hasPerm(['button1', 'button2' ], true) + * @return {} + */ + const hasPerm = (permission: string[] | string, and: boolean = false) => { + //如果是数组,则需要判断数组中的每一项权限 + if (isArray(permission)) { + const fn = and ? "every" : "some"; //some表示只要有一个权限通过即可,every表示必须每个权限都通过 + return permission[fn](item => authButtons.includes(item)); //多个权限 + } else { + return authButtons.includes(permission); //单个权限 + } + }; + + return { hasPerm }; +}; diff --git a/web/src/hooks/useHandleData.ts b/web/src/hooks/useHandleData.ts new file mode 100644 index 0000000000000000000000000000000000000000..8b13a5fb606d6a9f19752c070f5523cec3e373a9 --- /dev/null +++ b/web/src/hooks/useHandleData.ts @@ -0,0 +1,53 @@ +/** + * @description 操作单条数据信息 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +import { ElMessageBox, ElMessage } from "element-plus"; +import { HandleData } from "./interface"; + +/** + * @description 操作单条数据信息 (二次确认【删除、禁用、启用、重置密码】) + * @param {Function} api 操作数据接口的api方法 (必传) + * @param {Object} params 携带的操作数据参数 {id,params} (必传) + * @param {String} message 提示信息 (必传) + * @param {String} confirmType icon类型 (不必传,默认为 warning) + * @returns {Promise} + */ +export const useHandleData = ( + api: (params: any) => Promise, + params: any = {}, + message: string, + confirmType: HandleData.MessageType = "warning" +) => { + return new Promise((resolve, reject) => { + ElMessageBox.confirm(`是否${message}?`, "温馨提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: confirmType, + draggable: true + }) + .then(async () => { + const res = await api(params); + if (!res) return reject(false); + ElMessage({ + type: "success", + message: `${message}成功!` + }); + resolve(res); + }) + .catch(() => { + //啥也不干 + }); + }); +}; diff --git a/web/src/hooks/useSelection.ts b/web/src/hooks/useSelection.ts new file mode 100644 index 0000000000000000000000000000000000000000..5cdce57de35a1101dde1f81ea4d06a6be2090eba --- /dev/null +++ b/web/src/hooks/useSelection.ts @@ -0,0 +1,34 @@ +import { ref, computed } from "vue"; + +/** + * @description 表格多选数据操作 + * @param {String} rowKey 当表格可以多选时,所指定的 id + * */ +export const useSelection = (rowKey: string = "id") => { + const isSelected = ref(false); + const selectedList = ref<{ [key: string]: any }[]>([]); + + // 当前选中的所有 ids 数组 + const selectedListIds = computed((): string[] => { + let ids: string[] = []; + selectedList.value.forEach(item => ids.push(item[rowKey])); + return ids; + }); + + /** + * @description 多选操作 + * @param {Array} rowArr 当前选择的所有数据 + * @return void + */ + const selectionChange = (rowArr: { [key: string]: any }[]) => { + rowArr.length ? (isSelected.value = true) : (isSelected.value = false); + selectedList.value = rowArr; + }; + + return { + isSelected, + selectedList, + selectedListIds, + selectionChange + }; +}; diff --git a/web/src/hooks/useTable.ts b/web/src/hooks/useTable.ts new file mode 100644 index 0000000000000000000000000000000000000000..971815848e70d33e8a61446c847a6afbfd57dee2 --- /dev/null +++ b/web/src/hooks/useTable.ts @@ -0,0 +1,144 @@ +import { Table } from "./interface"; +import { reactive, computed, toRefs } from "vue"; + +/** + * @description table 页面操作方法封装 + * @param {Function} api 获取表格数据 api 方法 (必传) + * @param {Object} initParam 获取数据初始化参数 (非必传,默认为{}) + * @param {Boolean} isPageable 是否有分页 (非必传,默认为true) + * @param {Function} dataCallBack 对后台返回的数据进行处理的方法 (非必传) + * */ +export const useTable = ( + api?: (params: any) => Promise, + initParam: object = {}, + isPageable: boolean = true, + dataCallBack?: (data: any) => any, + requestError?: (error: any) => void +) => { + const state = reactive({ + // 表格数据 + tableData: [], + // 分页数据 + pageable: { + // 当前页数 + pageNum: 1, + // 每页显示条数 + pageSize: 10, + // 总条数 + total: 0 + }, + // 查询参数(只包括查询) + searchParam: {}, + // 初始化默认的查询参数 + searchInitParam: {}, + // 总参数(包含分页和查询参数) + totalParam: {} + }); + + /** + * @description 分页查询参数(只包括分页和表格字段排序,其他排序方式可自行配置) + * */ + const pageParam = computed({ + get: () => { + return { + pageNum: state.pageable.pageNum, + pageSize: state.pageable.pageSize + }; + }, + set: (newVal: any) => { + console.log("我是分页更新之后的值", newVal); + } + }); + + /** + * @description 获取表格数据 + * @return void + * */ + const getTableList = async () => { + if (!api) return; + try { + // 先把初始化参数和分页参数放到总参数里面 + Object.assign(state.totalParam, initParam, isPageable ? pageParam.value : {}); + let { data } = await api({ ...state.searchInitParam, ...state.totalParam }); + if (dataCallBack) dataCallBack(data); + state.tableData = isPageable ? data.list : data; + // 解构后台返回的分页数据 (如果有分页更新分页信息) + if (isPageable) { + state.pageable.total = data.total; + } + } catch (error) { + if (requestError) requestError(error); + } + }; + + /** + * @description 更新查询参数 + * @return void + * */ + const updatedTotalParam = () => { + state.totalParam = {}; + // 处理查询参数,可以给查询参数加自定义前缀操作 + let nowSearchParam: Table.StateProps["searchParam"] = {}; + // 防止手动清空输入框携带参数(这里可以自定义查询参数前缀) + for (let key in state.searchParam) { + // 某些情况下参数为 false/0 也应该携带参数 + if (state.searchParam[key] || state.searchParam[key] === false || state.searchParam[key] === 0) { + nowSearchParam[key] = state.searchParam[key]; + } + } + Object.assign(state.totalParam, nowSearchParam); + }; + + /** + * @description 表格数据查询 + * @return void + * */ + const search = () => { + state.pageable.pageNum = 1; + updatedTotalParam(); + getTableList(); + }; + + /** + * @description 表格数据重置 + * @return void + * */ + const reset = () => { + state.pageable.pageNum = 1; + // 重置搜索表单的时,如果有默认搜索参数,则重置默认的搜索参数 + state.searchParam = { ...state.searchInitParam }; + updatedTotalParam(); + getTableList(); + }; + + /** + * @description 每页条数改变 + * @param {Number} val 当前条数 + * @return void + * */ + const handleSizeChange = (val: number) => { + state.pageable.pageNum = 1; + state.pageable.pageSize = val; + getTableList(); + }; + + /** + * @description 当前页改变 + * @param {Number} val 当前页 + * @return void + * */ + const handleCurrentChange = (val: number) => { + state.pageable.pageNum = val; + getTableList(); + }; + + return { + ...toRefs(state), + getTableList, + search, + reset, + handleSizeChange, + handleCurrentChange, + updatedTotalParam + }; +}; diff --git a/web/src/hooks/useTheme.ts b/web/src/hooks/useTheme.ts new file mode 100644 index 0000000000000000000000000000000000000000..42a090f01b1978589dbc21ba86dcf381931070d7 --- /dev/null +++ b/web/src/hooks/useTheme.ts @@ -0,0 +1,125 @@ +/** + * @description 全局主题 hooks + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import { storeToRefs } from "pinia"; +import { Theme } from "./interface"; +import { ElMessage } from "element-plus"; +import { DEFAULT_PRIMARY } from "@/config"; +import { useGlobalStore } from "@/stores/modules/global"; +import { getLightColor, getDarkColor } from "@/utils/color"; +import { menuTheme } from "@/styles/theme/menu"; +import { asideTheme } from "@/styles/theme/aside"; +import { headerTheme } from "@/styles/theme/header"; + +/** + * @description 全局主题 hooks + * */ +export const useTheme = () => { + const globalStore = useGlobalStore(); + const { primary, isDark, isGrey, isWeak, layout, asideInverted, headerInverted } = storeToRefs(globalStore); + + // 切换暗黑模式 ==> 同时修改主题颜色、侧边栏、头部颜色 + const switchDark = () => { + const html = document.documentElement as HTMLElement; + if (isDark.value) html.setAttribute("class", "dark"); + else html.setAttribute("class", ""); + changePrimary(primary.value); + setAsideTheme(); + setHeaderTheme(); + }; + + // 修改主题颜色 + const changePrimary = (val: string | null) => { + if (!val) { + val = DEFAULT_PRIMARY; + ElMessage({ type: "success", message: `主题颜色已重置为 ${DEFAULT_PRIMARY}` }); + } + // 计算主题颜色变化 + document.documentElement.style.setProperty("--el-color-primary", val); + document.documentElement.style.setProperty( + "--el-color-primary-dark-2", + isDark.value ? `${getLightColor(val, 0.2)}` : `${getDarkColor(val, 0.3)}` + ); + for (let i = 1; i <= 9; i++) { + const primaryColor = isDark.value ? `${getDarkColor(val, i / 10)}` : `${getLightColor(val, i / 10)}`; + document.documentElement.style.setProperty(`--el-color-primary-light-${i}`, primaryColor); + } + globalStore.setGlobalState("primary", val); + }; + + // 灰色和弱色切换 + const changeGreyOrWeak = (type: Theme.GreyOrWeakType, value: boolean) => { + const body = document.body as HTMLElement; + if (!value) return body.removeAttribute("style"); + const styles: Record = { + grey: "filter: grayscale(1)", + weak: "filter: invert(80%)" + }; + body.setAttribute("style", styles[type]); + const propName = type === "grey" ? "isWeak" : "isGrey"; + globalStore.setGlobalState(propName, false); + }; + + // 设置菜单样式 + const setMenuTheme = () => { + let type: Theme.ThemeType = "light"; + if (layout.value === "transverse" && headerInverted.value) type = "inverted"; + if (layout.value !== "transverse" && asideInverted.value) type = "inverted"; + if (isDark.value) type = "dark"; + const theme = menuTheme[type!]; + for (const [key, value] of Object.entries(theme)) { + document.documentElement.style.setProperty(key, value); + } + }; + + // 设置侧边栏样式 + const setAsideTheme = () => { + let type: Theme.ThemeType = "light"; + if (asideInverted.value) type = "inverted"; + if (isDark.value) type = "dark"; + const theme = asideTheme[type!]; + for (const [key, value] of Object.entries(theme)) { + document.documentElement.style.setProperty(key, value); + } + setMenuTheme(); + }; + + // 设置头部样式 + const setHeaderTheme = () => { + let type: Theme.ThemeType = "light"; + if (headerInverted.value) type = "inverted"; + if (isDark.value) type = "dark"; + const theme = headerTheme[type!]; + for (const [key, value] of Object.entries(theme)) { + document.documentElement.style.setProperty(key, value); + } + setMenuTheme(); + }; + + // init theme + const initTheme = () => { + switchDark(); + if (isGrey.value) changeGreyOrWeak("grey", true); + if (isWeak.value) changeGreyOrWeak("weak", true); + }; + + return { + initTheme, + switchDark, + changePrimary, + changeGreyOrWeak, + setAsideTheme, + setHeaderTheme + }; +}; diff --git a/web/src/layouts/LayoutClassic/index.scss b/web/src/layouts/LayoutClassic/index.scss new file mode 100644 index 0000000000000000000000000000000000000000..c84c631445acebed87c579b857c0629dd5eed925 --- /dev/null +++ b/web/src/layouts/LayoutClassic/index.scss @@ -0,0 +1,62 @@ +.el-container { + width: 100%; + height: 100%; + :deep(.el-header) { + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: space-between; + height: 55px; + padding: 0 15px 0 0; + background-color: var(--el-header-bg-color); + border-bottom: 1px solid var(--el-header-border-color); + .header-lf { + display: flex; + align-items: center; + overflow: hidden; + white-space: nowrap; + .logo { + flex-shrink: 0; + width: 210px; + margin-right: 16px; + .logo-img { + width: 28px; + object-fit: contain; + } + .logo-text { + margin-right: 6px; + overflow: hidden; /* 隐藏超出父容器的内容 */ + font-size: 21px; // font-size: 1vw;自动适配 + font-weight: bold; + color: var(--el-header-logo-text-color); + text-overflow: ellipsis; /* 超出部分显示省略号 */ + white-space: nowrap; /* 不进行换行 */ + } + } + } + } + .classic-content { + display: flex; + height: calc(100% - 55px); + :deep(.el-aside) { + width: auto; + background-color: var(--el-menu-bg-color); + border-right: 1px solid var(--el-aside-border-color); + .aside-box { + display: flex; + flex-direction: column; + height: 100%; + transition: width 0.3s ease; + .el-menu { + width: 100%; + overflow-x: hidden; + border-right: none; + } + } + } + .classic-main { + display: flex; + flex-direction: column; + } + } +} diff --git a/web/src/layouts/LayoutClassic/index.vue b/web/src/layouts/LayoutClassic/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..1bf7261e7b288c12db024b1b4e05e1b53a9cdd8f --- /dev/null +++ b/web/src/layouts/LayoutClassic/index.vue @@ -0,0 +1,56 @@ + + + + + + diff --git a/web/src/layouts/LayoutColumns/index.scss b/web/src/layouts/LayoutColumns/index.scss new file mode 100644 index 0000000000000000000000000000000000000000..91755387391ca7bb7af9a459a9f8439f73e37b50 --- /dev/null +++ b/web/src/layouts/LayoutColumns/index.scss @@ -0,0 +1,95 @@ +.el-container { + width: 100%; + height: 100%; + .aside-split { + display: flex; + flex-direction: column; + flex-shrink: 0; + width: 70px; + height: 100%; + background-color: var(--el-menu-bg-color); + border-right: 1px solid var(--el-aside-border-color); + .logo { + box-sizing: border-box; + height: 55px; + .logo-img { + width: 32px; + object-fit: contain; + } + } + .el-scrollbar { + height: calc(100% - 55px); + .split-list { + flex: 1; + .split-item { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 70px; + cursor: pointer; + transition: all 0.3s ease; + .el-icon { + font-size: 20px; + } + .title { + margin-top: 6px; + font-size: 12px; + } + .el-icon, + .title { + color: var(--el-menu-text-color); + } + } + .split-active { + background-color: var(--el-color-primary) !important; + .el-icon, + .title { + color: #ffffff !important; + } + } + } + } + } + .not-aside { + width: 0 !important; + border-right: none !important; + } + .el-aside { + display: flex; + flex-direction: column; + height: 100%; + overflow: hidden; + background-color: var(--el-menu-bg-color); + border-right: 1px solid var(--el-aside-border-color); + transition: width 0.3s ease; + .el-scrollbar { + height: calc(100% - 55px); + .el-menu { + width: 100%; + overflow-x: hidden; + border-right: none; + } + } + .logo { + box-sizing: border-box; + height: 55px; + .logo-text { + font-size: 24px; + font-weight: bold; + color: var(--el-aside-logo-text-color); + white-space: nowrap; + } + } + } + .el-header { + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: space-between; + height: 55px; + padding: 0 15px; + background-color: var(--el-header-bg-color); + border-bottom: 1px solid var(--el-border-color-light); + } +} diff --git a/web/src/layouts/LayoutColumns/index.vue b/web/src/layouts/LayoutColumns/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..a498718a505e6862b7fd03ab9145f372ef38a8cf --- /dev/null +++ b/web/src/layouts/LayoutColumns/index.vue @@ -0,0 +1,97 @@ + + + + + + diff --git a/web/src/layouts/LayoutTransverse/index.scss b/web/src/layouts/LayoutTransverse/index.scss new file mode 100644 index 0000000000000000000000000000000000000000..7ffa6ffa28c9a746661de94eb05520e49ecd1aea --- /dev/null +++ b/web/src/layouts/LayoutTransverse/index.scss @@ -0,0 +1,60 @@ +.el-container { + width: 100%; + height: 100%; + :deep(.el-header) { + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: space-between; + height: 55px; + padding: 0 15px 0 0; + background-color: var(--el-header-bg-color); + border-bottom: 1px solid var(--el-header-border-color); + .logo { + width: 210px; + margin-right: 30px; + .logo-img { + width: 28px; + object-fit: contain; + } + .logo-text { + margin-right: 6px; + font-size: 21.5px; + font-weight: bold; + color: var(--el-header-logo-text-color); + white-space: nowrap; + } + } + .el-menu { + flex: 1; + height: 100%; + overflow: hidden; + border-bottom: none; + .el-sub-menu__hide-arrow { + width: 65px; + height: 55px; + } + .el-menu-item.is-active { + color: #ffffff !important; + } + .is-active { + background-color: var(--el-color-primary) !important; + border-bottom-color: var(--el-color-primary) !important; + &::before { + width: 0; + } + .el-sub-menu__title { + color: #ffffff !important; + background-color: var(--el-color-primary) !important; + border-bottom-color: var(--el-color-primary) !important; + } + } + } + } + + @media screen and (width <= 730px) { + .logo { + display: none !important; + } + } +} diff --git a/web/src/layouts/LayoutTransverse/index.vue b/web/src/layouts/LayoutTransverse/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..60865779f5ce33db288017aad72897412276c96c --- /dev/null +++ b/web/src/layouts/LayoutTransverse/index.vue @@ -0,0 +1,56 @@ + + + + + + diff --git a/web/src/layouts/LayoutVertical/index.scss b/web/src/layouts/LayoutVertical/index.scss new file mode 100644 index 0000000000000000000000000000000000000000..3e2a773d235df4c6b74ae15c9df1331f8de671a2 --- /dev/null +++ b/web/src/layouts/LayoutVertical/index.scss @@ -0,0 +1,48 @@ +.el-container { + width: 100%; + height: 100%; + :deep(.el-aside) { + width: auto; + background-color: var(--el-menu-bg-color); + border-right: 1px solid var(--el-aside-border-color); + .aside-box { + display: flex; + flex-direction: column; + height: 100%; + transition: width 0.3s ease; + .el-scrollbar { + height: calc(100% - 55px); + .el-menu { + width: 100%; + overflow-x: hidden; + border-right: none; + } + } + .logo { + box-sizing: border-box; + height: 55px; + .logo-img { + width: 28px; + object-fit: contain; + } + .logo-text { + margin-right: 6px; + font-size: 21.5px; + font-weight: bold; + color: var(--el-aside-logo-text-color); + white-space: nowrap; + } + } + } + } + .el-header { + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: space-between; + height: 55px; + padding: 0 15px; + background-color: var(--el-header-bg-color); + border-bottom: 1px solid var(--el-header-border-color); + } +} diff --git a/web/src/layouts/LayoutVertical/index.vue b/web/src/layouts/LayoutVertical/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..8efd1e678457083f2f7f1e2afbdc2167a66a23cb --- /dev/null +++ b/web/src/layouts/LayoutVertical/index.vue @@ -0,0 +1,49 @@ + + + + + + diff --git a/web/src/layouts/components/Footer/index.scss b/web/src/layouts/components/Footer/index.scss new file mode 100644 index 0000000000000000000000000000000000000000..912823c97cc855f6efd6ed8a5779af7731f3d101 --- /dev/null +++ b/web/src/layouts/components/Footer/index.scss @@ -0,0 +1,11 @@ +.footer { + height: 30px; + background-color: var(--el-bg-color); + border-top: 1px solid var(--el-border-color-light); + a { + font-size: 14px; + color: var(--el-text-color-secondary); + text-decoration: none; + letter-spacing: 0.5px; + } +} diff --git a/web/src/layouts/components/Footer/index.vue b/web/src/layouts/components/Footer/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..565b87c30381b3e3e99a4a626016f41a83004ab5 --- /dev/null +++ b/web/src/layouts/components/Footer/index.vue @@ -0,0 +1,39 @@ + + + diff --git a/web/src/layouts/components/Header/ToolBarLeft.vue b/web/src/layouts/components/Header/ToolBarLeft.vue new file mode 100644 index 0000000000000000000000000000000000000000..17af7ca5171741fc2302c8bee945ea615ecc899a --- /dev/null +++ b/web/src/layouts/components/Header/ToolBarLeft.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/web/src/layouts/components/Header/ToolBarRight.vue b/web/src/layouts/components/Header/ToolBarRight.vue new file mode 100644 index 0000000000000000000000000000000000000000..4b1031622bdde099c4580388dc4e079dabcd3901 --- /dev/null +++ b/web/src/layouts/components/Header/ToolBarRight.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/web/src/layouts/components/Header/components/AssemblySize.vue b/web/src/layouts/components/Header/components/AssemblySize.vue new file mode 100644 index 0000000000000000000000000000000000000000..2c4693a7061c9820ad5be36f75030bdd81af7fec --- /dev/null +++ b/web/src/layouts/components/Header/components/AssemblySize.vue @@ -0,0 +1,34 @@ + + + diff --git a/web/src/layouts/components/Header/components/Avatar.vue b/web/src/layouts/components/Header/components/Avatar.vue new file mode 100644 index 0000000000000000000000000000000000000000..df29ae4c7f7b3b55e74f9b1aa1554735ef3cbced --- /dev/null +++ b/web/src/layouts/components/Header/components/Avatar.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/web/src/layouts/components/Header/components/Breadcrumb.vue b/web/src/layouts/components/Header/components/Breadcrumb.vue new file mode 100644 index 0000000000000000000000000000000000000000..b112c50717c824f4e03857df9186d09c328faf5b --- /dev/null +++ b/web/src/layouts/components/Header/components/Breadcrumb.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/web/src/layouts/components/Header/components/ChangeModule.vue b/web/src/layouts/components/Header/components/ChangeModule.vue new file mode 100644 index 0000000000000000000000000000000000000000..50dbc4abf15335089cbac0dfa1802acd5435d4ff --- /dev/null +++ b/web/src/layouts/components/Header/components/ChangeModule.vue @@ -0,0 +1,18 @@ + + + diff --git a/web/src/layouts/components/Header/components/CollapseIcon.vue b/web/src/layouts/components/Header/components/CollapseIcon.vue new file mode 100644 index 0000000000000000000000000000000000000000..81cde808241517dbfd3af74eb7c2abd9f8680972 --- /dev/null +++ b/web/src/layouts/components/Header/components/CollapseIcon.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/web/src/layouts/components/Header/components/Fullscreen.vue b/web/src/layouts/components/Header/components/Fullscreen.vue new file mode 100644 index 0000000000000000000000000000000000000000..c757393592c9f21ca4171a6ff0bd082e0a124bdc --- /dev/null +++ b/web/src/layouts/components/Header/components/Fullscreen.vue @@ -0,0 +1,27 @@ + + + diff --git a/web/src/layouts/components/Header/components/InfoDialog.vue b/web/src/layouts/components/Header/components/InfoDialog.vue new file mode 100644 index 0000000000000000000000000000000000000000..e2ad84bab9159313ec472c65ff4938c4649a24c9 --- /dev/null +++ b/web/src/layouts/components/Header/components/InfoDialog.vue @@ -0,0 +1,22 @@ + + + diff --git a/web/src/layouts/components/Header/components/Message.vue b/web/src/layouts/components/Header/components/Message.vue new file mode 100644 index 0000000000000000000000000000000000000000..036e2b4bf0a12c57e9eff21b85a5e717a8df8b1d --- /dev/null +++ b/web/src/layouts/components/Header/components/Message.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/web/src/layouts/components/Header/components/PasswordDialog.vue b/web/src/layouts/components/Header/components/PasswordDialog.vue new file mode 100644 index 0000000000000000000000000000000000000000..bf30bb33376ce393e8f0844093db72babe382578 --- /dev/null +++ b/web/src/layouts/components/Header/components/PasswordDialog.vue @@ -0,0 +1,22 @@ + + + diff --git a/web/src/layouts/components/Header/components/SearchMenu.vue b/web/src/layouts/components/Header/components/SearchMenu.vue new file mode 100644 index 0000000000000000000000000000000000000000..165e5776c01af54642b9104d5f183977ba67efc6 --- /dev/null +++ b/web/src/layouts/components/Header/components/SearchMenu.vue @@ -0,0 +1,183 @@ + + + + + diff --git a/web/src/layouts/components/Header/components/ThemeSetting.vue b/web/src/layouts/components/Header/components/ThemeSetting.vue new file mode 100644 index 0000000000000000000000000000000000000000..3f1b0b0e2057964d62d1ef516dc69abdfa1a7eea --- /dev/null +++ b/web/src/layouts/components/Header/components/ThemeSetting.vue @@ -0,0 +1,14 @@ + + + diff --git a/web/src/layouts/components/Main/components/Maximize.vue b/web/src/layouts/components/Main/components/Maximize.vue new file mode 100644 index 0000000000000000000000000000000000000000..ce3d446bdf7fb4900de67e28dff010bf4afedf54 --- /dev/null +++ b/web/src/layouts/components/Main/components/Maximize.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/web/src/layouts/components/Main/index.scss b/web/src/layouts/components/Main/index.scss new file mode 100644 index 0000000000000000000000000000000000000000..fd4f175aa22aa8eceb0a2aeca1e15edd2810f04b --- /dev/null +++ b/web/src/layouts/components/Main/index.scss @@ -0,0 +1,10 @@ +.el-main { + box-sizing: border-box; + padding: 10px 12px; + overflow-x: hidden; + background-color: var(--el-bg-color-page); +} +.el-footer { + height: auto; + padding: 0; +} diff --git a/web/src/layouts/components/Main/index.vue b/web/src/layouts/components/Main/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..cd10ee894d3ee1a08722f052f6ac4198eb5d5405 --- /dev/null +++ b/web/src/layouts/components/Main/index.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/web/src/layouts/components/Menu/SubMenu.vue b/web/src/layouts/components/Menu/SubMenu.vue new file mode 100644 index 0000000000000000000000000000000000000000..bfaff8f4cd88868d1a32331f904d83efb7dc09aa --- /dev/null +++ b/web/src/layouts/components/Menu/SubMenu.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/web/src/layouts/components/Tabs/components/MoreButton.vue b/web/src/layouts/components/Tabs/components/MoreButton.vue new file mode 100644 index 0000000000000000000000000000000000000000..b16ea92d309c077da9573c3898df45f93bb2bb43 --- /dev/null +++ b/web/src/layouts/components/Tabs/components/MoreButton.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/web/src/layouts/components/Tabs/index.scss b/web/src/layouts/components/Tabs/index.scss new file mode 100644 index 0000000000000000000000000000000000000000..8f52d74102306b7c14cbf74e94781303f336a622 --- /dev/null +++ b/web/src/layouts/components/Tabs/index.scss @@ -0,0 +1,69 @@ +.tabs-box { + background-color: var(--el-bg-color); + .tabs-menu { + position: relative; + width: 100%; + .el-dropdown { + position: absolute; + top: 0; + right: 0; + bottom: 0; + .more-button { + display: flex; + align-items: center; + justify-content: center; + width: 43px; + cursor: pointer; + border-left: 1px solid var(--el-border-color-light); + transition: all 0.3s; + &:hover { + background-color: var(--el-color-info-light-9); + } + .iconfont { + font-size: 12.5px; + } + } + } + :deep(.el-tabs) { + .el-tabs__header { + box-sizing: border-box; + height: 40px; + padding: 0 10px; + margin: 0; + .el-tabs__nav-wrap { + position: absolute; + width: calc(100% - 70px); + .el-tabs__nav { + display: flex; + border: none; + .el-tabs__item { + display: flex; + align-items: center; + justify-content: center; + color: #afafaf; + border: none; + .tabs-icon { + margin: 1.5px 4px 0 0; + font-size: 15px; + } + .is-icon-close { + margin-top: 1px; + } + &.is-active { + color: var(--el-color-primary); + &::before { + position: absolute; + bottom: 0; + width: 100%; + height: 0; + content: ""; + border-bottom: 2px solid var(--el-color-primary) !important; + } + } + } + } + } + } + } + } +} diff --git a/web/src/layouts/components/Tabs/index.vue b/web/src/layouts/components/Tabs/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..b48fed628f064db511a7807907f4b415f097d08b --- /dev/null +++ b/web/src/layouts/components/Tabs/index.vue @@ -0,0 +1,106 @@ + + + + + diff --git a/web/src/layouts/components/ThemeDrawer/index.scss b/web/src/layouts/components/ThemeDrawer/index.scss new file mode 100644 index 0000000000000000000000000000000000000000..c82209cee93b33ab201bc424a9539969e3dff100 --- /dev/null +++ b/web/src/layouts/components/ThemeDrawer/index.scss @@ -0,0 +1,137 @@ +.divider { + margin-top: 15px; + .el-icon { + position: relative; + top: 2px; + right: 5px; + font-size: 15px; + } +} +.theme-item { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 5px; + margin: 14px 0; + span { + display: flex; + align-items: center; + font-size: 14px; + .el-icon { + margin-left: 3px; + font-size: 15px; + color: var(--el-text-color-regular); + cursor: pointer; + } + } +} +.layout-box { + position: relative; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + padding: 15px 7px 0; + .layout-item { + position: relative; + box-sizing: border-box; + width: 100px; + height: 70px; + padding: 6px; + cursor: pointer; + border-radius: 5px; + box-shadow: 0 0 5px 1px var(--el-border-color-dark); + transition: all 0.2s; + .layout-dark { + background-color: var(--el-color-primary); + border-radius: 3px; + } + .layout-light { + background-color: var(--el-color-primary-light-5); + border-radius: 3px; + } + .layout-content { + background-color: var(--el-color-primary-light-8); + border: 1px dashed var(--el-color-primary); + border-radius: 3px; + } + .el-icon { + position: absolute; + right: 10px; + bottom: 10px; + color: var(--el-color-primary); + transition: all 0.2s; + } + &:hover { + box-shadow: 0 0 5px 1px var(--el-text-color-secondary); + } + } + .is-active { + box-shadow: 0 0 0 2px var(--el-color-primary) !important; + } + .layout-vertical { + display: flex; + justify-content: space-between; + margin-bottom: 20px; + .layout-dark { + width: 20%; + } + .layout-container { + display: flex; + flex-direction: column; + justify-content: space-between; + width: 72%; + .layout-light { + height: 20%; + } + .layout-content { + height: 67%; + } + } + } + .layout-classic { + display: flex; + flex-direction: column; + justify-content: space-between; + margin-bottom: 20px; + .layout-dark { + height: 22%; + } + .layout-container { + display: flex; + justify-content: space-between; + height: 70%; + .layout-light { + width: 20%; + } + .layout-content { + width: 70%; + } + } + } + .layout-transverse { + display: flex; + flex-direction: column; + justify-content: space-between; + margin-bottom: 15px; + .layout-dark { + height: 20%; + } + .layout-content { + height: 67%; + } + } + .layout-columns { + display: flex; + justify-content: space-between; + margin-bottom: 15px; + .layout-dark { + width: 14%; + } + .layout-light { + width: 17%; + } + .layout-content { + width: 55%; + } + } +} diff --git a/web/src/layouts/components/ThemeDrawer/index.vue b/web/src/layouts/components/ThemeDrawer/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..7fd529b49423c63df8e4738ff8a5dc05b25c2fd9 --- /dev/null +++ b/web/src/layouts/components/ThemeDrawer/index.vue @@ -0,0 +1,185 @@ + + + + + diff --git a/web/src/layouts/index.vue b/web/src/layouts/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..4d7cf5337ab0d778626ed770247fa404a94069f1 --- /dev/null +++ b/web/src/layouts/index.vue @@ -0,0 +1,62 @@ + + + + + + diff --git a/web/src/layouts/indexAsync.vue b/web/src/layouts/indexAsync.vue new file mode 100644 index 0000000000000000000000000000000000000000..ec7b95165b80c31f16598cab02ad3c5534359292 --- /dev/null +++ b/web/src/layouts/indexAsync.vue @@ -0,0 +1,46 @@ + + + + + + diff --git a/web/src/main.ts b/web/src/main.ts new file mode 100644 index 0000000000000000000000000000000000000000..8311fd1adbbf68609a9d98b8e14a3efd916a9ee5 --- /dev/null +++ b/web/src/main.ts @@ -0,0 +1,55 @@ +import { createApp } from "vue"; +import App from "./App.vue"; +// reset style sheet +import "@/styles/reset.scss"; +// CSS common style sheet +import "@/styles/common.scss"; +// iconfont css +import "@/assets/iconfont/iconfont.scss"; +// iconfontPlus css +import "@/assets/iconfontPlus/iconfont.scss"; +// font css +import "@/assets/fonts/font.scss"; +// element css +import "element-plus/dist/index.css"; +// element dark css +import "element-plus/theme-chalk/dark/css-vars.css"; +// custom element dark css +import "@/styles/element-dark.scss"; +// custom element css +import "@/styles/element.scss"; +// svg icons +import "virtual:svg-icons-register"; +// element plus +import ElementPlus from "element-plus"; +// element icons +import * as Icons from "@element-plus/icons-vue"; +// custom directives +import directives from "@/directives/index"; +// vue Router +import router from "@/routers"; +// pinia store +import pinia from "@/stores"; +// errorHandler +import errorHandler from "@/utils/errorHandler"; +// uno.css +import "virtual:uno.css"; +// highlight 的样式,依赖包,组件 +import "highlight.js/styles/atom-one-dark.css"; +import hljsCommon from "highlight.js/lib/common"; +import hljsVuePlugin from "@highlightjs/vue-plugin"; +//解决谷歌浏览器 Added non-passive event listener to a scroll-blocking 'touchstart' event. Consider markin... +import "default-passive-events"; +const app = createApp(App); + +app.config.errorHandler = errorHandler; + +// register the element Icons component +Object.keys(Icons).forEach(key => { + app.component(key, Icons[key as keyof typeof Icons]); +}); + +// 注意:解决Vue使用highlight.js build打包发布后样式消失问题,原因是webpack在打包的时候没有把未被使用的代码打包进去,因此,在此处引用一下,看似无意义实则有用 +hljsCommon.highlightAuto("

Highlight.js has been registered successfully!

").value; + +app.use(ElementPlus).use(directives).use(router).use(pinia).use(hljsVuePlugin).mount("#app"); diff --git a/web/src/routers/index.ts b/web/src/routers/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..c361d7fba166e353633386b22eb8d869a660479e --- /dev/null +++ b/web/src/routers/index.ts @@ -0,0 +1,122 @@ +/** + * @description 路由拦截 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import { createRouter, createWebHashHistory, createWebHistory } from "vue-router"; +import { useUserStore } from "@/stores/modules/user"; +import { useAuthStore } from "@/stores/modules/auth"; +import { LOGIN_URL, ROUTER_WHITE_LIST } from "@/config"; +import { initDynamicRouter } from "@/routers/modules/dynamicRouter"; +import { staticRouter, errorRouter } from "@/routers/modules/staticRouter"; +import NProgress from "@/config/nprogress"; + +const mode = import.meta.env.VITE_ROUTER_MODE; + +const routerMode = { + hash: () => createWebHashHistory(), + history: () => createWebHistory() +}; + +/** + * @description 📚 路由参数配置简介 + * @param path ==> 路由菜单访问路径 + * @param name ==> 路由 name (对应页面组件 name, 可用作 KeepAlive 缓存标识 && 按钮权限筛选) + * @param redirect ==> 路由重定向地址 + * @param component ==> 视图文件路径 + * @param meta ==> 路由菜单元信息 + * @param meta.icon ==> 菜单和面包屑对应的图标 + * @param meta.title ==> 路由标题 (用作 document.title || 菜单的名称) + * @param meta.activeMenu ==> 当前路由为详情页时,需要高亮的菜单 + * @param meta.isLink ==> 路由外链时填写的访问地址 + * @param meta.isHide ==> 是否在菜单中隐藏 (通常列表详情页需要隐藏) + * @param meta.isFull ==> 菜单是否全屏 (示例:数据大屏页面) + * @param meta.isAffix ==> 菜单是否固定在标签页中 (首页通常是固定项) + * @param meta.isKeepAlive ==> 当前路由是否缓存 + * */ +const router = createRouter({ + history: routerMode[mode](), + routes: [...staticRouter, ...errorRouter], + strict: false, + scrollBehavior: () => ({ left: 0, top: 0 }) +}); + +/** + * @description 路由拦截 beforeEach + * */ +router.beforeEach(async (to, from, next) => { + const userStore = useUserStore(); + const authStore = useAuthStore(); + + // 1.NProgress 开始 + NProgress.start(); + + // 2.动态设置标题 + const title = import.meta.env.VITE_GLOB_APP_TITLE; + document.title = to.meta.title ? `${to.meta.title} - ${title}` : title; + + // 3.判断是访问登陆页,有 Token 就在当前页面,没有 Token 重置路由到登陆页 + if (to.path.toLocaleLowerCase() === LOGIN_URL) { + if (userStore.accessToken) { + return next(from.fullPath); + } + resetRouter(); + return next(); + } + + // 4.判断访问页面是否在路由白名单地址(静态路由)中,如果存在直接放行 + if (ROUTER_WHITE_LIST.includes(to.path)) { + return next(); + } + + // 5.判断是否有 Token,没有重定向到 login 页面 + if (!userStore.accessToken) { + return next({ path: LOGIN_URL, replace: true }); + } + + // 6.如果没有菜单列表,就重新请求菜单列表并添加动态路由 + if (!authStore.authMenuListGet.length) { + await initDynamicRouter(); + return next({ ...to, replace: true }); + } + + // 8.正常访问页面 + next(); +}); + +/** + * @description 重置路由 + * */ +export const resetRouter = () => { + const authStore = useAuthStore(); + authStore.flatMenuListGet.forEach(route => { + const { name } = route; + if (name && router.hasRoute(name)) router.removeRoute(name); + }); +}; + +/** + * @description 路由跳转错误 + * */ +router.onError(error => { + NProgress.done(); + console.warn("路由错误", error.message); +}); + +/** + * @description 路由跳转结束 + * */ +router.afterEach(() => { + NProgress.done(); +}); + +export default router; diff --git a/web/src/routers/modules/dynamicRouter.ts b/web/src/routers/modules/dynamicRouter.ts new file mode 100644 index 0000000000000000000000000000000000000000..1f8dd635b38f1fd6dc459babef5ea4ae79588228 --- /dev/null +++ b/web/src/routers/modules/dynamicRouter.ts @@ -0,0 +1,94 @@ +/** + * @description 动态路由 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import { LOGIN_URL, HOME_URL } from "@/config"; +import { RouteRecordRaw } from "vue-router"; +import { ElNotification } from "element-plus"; +import { useUserStore, useAuthStore, useDictStore, useConfigStore } from "@/stores/modules"; +import router from "@/routers"; + +// 引入 views 文件夹下所有 vue 文件 +const modules = import.meta.glob("@/views/**/*.vue"); + +/** + * @description 初始化动态路由 + */ +export const initDynamicRouter = async () => { + const userStore = useUserStore(); + const authStore = useAuthStore(); + const dictStore = useDictStore(); + const configStore = useConfigStore(); + /** 路由初始化错误 */ + const routerError = (isNotice: boolean = true, title: string = "无权限访问", message: string = "当前账号无任何菜单权限,请联系系统管理员!") => { + if (!isNotice) { + ElNotification({ + title: title, + message: message, + type: "warning", + duration: 3000 + }); + } + userStore.clearToken(); + router.replace(LOGIN_URL); + return Promise.reject("No permission"); + }; + try { + const chooseModule = userStore.chooseModuleGet; // 获取当前选择模块 + let homePath: string = HOME_URL; // 首页路径 + const data = await userStore.getUserInfo(); // 获取用户信息 + if (chooseModule && data?.moduleList.find((item: { id: string | number }) => item.id === chooseModule)) { + authStore.SetModuleList(data.moduleList); // 设置模块列表 + // 1.获取菜单列表 && 按钮权限列表 + await authStore.getAuthMenuList(chooseModule); + await authStore.getAuthButtonList(); + // 2.判断当前用户有没有菜单权限 + if (!authStore.authMenuListGet.length) { + return routerError(); + } + await dictStore.setDictTree(); // 设置字典树 + await configStore.setSysBaseInfo(); // 设置系统基础信息 + const home = authStore.authMenuListGet.filter(item => item.isHome === true); // 获取首页 + if (home.length > 0) { + homePath = home[0].path; // 设置第一个首页项作为首页路径 + } else { + //如果不存在首页设置第一个菜单为首页 + let firstMenu = authStore.authMenuListGet[0].children; + if (firstMenu && firstMenu.length > 0) { + homePath = firstMenu[0].path as string; + } + } + } else { + return routerError(false); // 如果当前选择模块不存在 + } + + // 3.添加动态路由 + authStore.flatMenuListGet.forEach(item => { + item.children && delete item.children; + if (item.component && typeof item.component == "string") { + item.component = modules["/src/views/" + item.component + ".vue"]; + } + if (item.meta.isFull) { + router.addRoute(item as unknown as RouteRecordRaw); + } else { + router.addRoute("layout", item as unknown as RouteRecordRaw); + } + }); + return Promise.resolve(homePath); + } catch (error) { + // 当按钮 || 菜单请求出错时,重定向到登陆页 + userStore.clearToken(); + router.replace(LOGIN_URL); + return Promise.reject(error); + } +}; diff --git a/web/src/routers/modules/staticRouter.ts b/web/src/routers/modules/staticRouter.ts new file mode 100644 index 0000000000000000000000000000000000000000..15b8bff937ca45e75d77f5895eb1759817c210e2 --- /dev/null +++ b/web/src/routers/modules/staticRouter.ts @@ -0,0 +1,77 @@ +/** + * @description 静态路由 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import { RouteRecordRaw } from "vue-router"; +import { HOME_URL, LOGIN_URL } from "@/config"; + +/** + * staticRouter (静态路由) + */ +export const staticRouter: RouteRecordRaw[] = [ + { + path: "/", + redirect: HOME_URL + }, + { + path: LOGIN_URL, + name: "login", + component: () => import("@/views/login/index.vue"), + meta: { + title: "登录" + } + }, + { + path: "/layout", + name: "layout", + component: () => import("@/layouts/index.vue"), + // component: () => import("@/layouts/indexAsync.vue"), + redirect: HOME_URL, + children: [] + } +]; + +/** + * errorRouter (错误页面路由) + */ +export const errorRouter = [ + { + path: "/403", + name: "403", + component: () => import("@/components/ErrorMessage/403.vue"), + meta: { + title: "403页面" + } + }, + { + path: "/404", + name: "404", + component: () => import("@/components/ErrorMessage/404.vue"), + meta: { + title: "404页面" + } + }, + { + path: "/500", + name: "500", + component: () => import("@/components/ErrorMessage/500.vue"), + meta: { + title: "500页面" + } + }, + // Resolve refresh page, route warnings + { + path: "/:pathMatch(.*)*", + component: () => import("@/components/ErrorMessage/404.vue") + } +]; diff --git a/web/src/stores/helper/persist.ts b/web/src/stores/helper/persist.ts new file mode 100644 index 0000000000000000000000000000000000000000..53a27a7bc11d81d269b6adf440a5f2d8dcc9703d --- /dev/null +++ b/web/src/stores/helper/persist.ts @@ -0,0 +1,19 @@ +import { PersistedStateOptions } from "pinia-plugin-persistedstate"; + +/** + * @description pinia 持久化参数配置 + * @param {String} key 存储到持久化的 name + * @param {Array} paths 需要持久化的 state name + * @return persist + * */ +const piniaPersistConfig = (key: string, paths?: string[]) => { + const persist: PersistedStateOptions = { + key, + storage: localStorage, + // storage: sessionStorage, + paths + }; + return persist; +}; + +export default piniaPersistConfig; diff --git a/web/src/stores/index.ts b/web/src/stores/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..de15ba1464a42d742e71f2b1035cbbadd893a852 --- /dev/null +++ b/web/src/stores/index.ts @@ -0,0 +1,22 @@ +/** + * @description Pinia store + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import { createPinia } from "pinia"; +import piniaPluginPersistedstate from "pinia-plugin-persistedstate"; + +// pinia persist +const pinia = createPinia(); +pinia.use(piniaPluginPersistedstate); + +export default pinia; diff --git a/web/src/stores/interface/index.ts b/web/src/stores/interface/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..3f02143b8cb2ce88933e1e675db99ab907fc75ea --- /dev/null +++ b/web/src/stores/interface/index.ts @@ -0,0 +1,59 @@ +/** + * @description 接口 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +export type LayoutType = "vertical" | "classic" | "transverse" | "columns"; + +export type AssemblySizeType = "large" | "default" | "small"; + +/* GlobalState */ +export interface GlobalState { + layout: LayoutType; + assemblySize: AssemblySizeType; + maximize: boolean; + primary: string; + isDark: boolean; + isGrey: boolean; + isWeak: boolean; + asideInverted: boolean; + headerInverted: boolean; + isCollapse: boolean; + accordion: boolean; + breadcrumb: boolean; + breadcrumbIcon: boolean; + tabs: boolean; + tabsIcon: boolean; + footer: boolean; + drawerForm: boolean; + watermark: boolean; +} + +/* tabsMenuProps */ +export interface TabsMenuProps { + icon: string; + title: string; + path: string; + name: string; + close: boolean; + isKeepAlive: boolean; +} + +/* TabsState */ +export interface TabsState { + tabsMenuList: TabsMenuProps[]; +} + +/* KeepAliveState */ +export interface KeepAliveState { + keepAliveName: string[]; +} diff --git a/web/src/stores/interface/mqtt.ts b/web/src/stores/interface/mqtt.ts new file mode 100644 index 0000000000000000000000000000000000000000..3ff9eb1064ccf05a75c9d17136c77bc0baaee6fe --- /dev/null +++ b/web/src/stores/interface/mqtt.ts @@ -0,0 +1,44 @@ +/** + * @description mqtt消息接口 + * @license Apache License Version 2.0 +2022 +, + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +export type MsgType = "NewMessage" | "LoginOut" | "UpdatePassword"; + +export enum MsgTypeEnum { + /** 新消息 */ + NewMessage = "NewMessage", + /** 退出登录 */ + LoginOut = "LoginOut", + /** 修改密码 */ + UpdatePassword = "UpdatePassword" +} + +/**mqtt消息**/ +export interface MqttMessage { + /** 消息类型 */ + MsgType: MsgTypeEnum; + /** 消息内容 */ + Data: MqttData; + /** 发送时间 */ + DetTime: string; +} + +/**mqtt消息内容**/ +export interface MqttData { + /** 主题 */ + Subject: string; + /** 内容 */ + Content: string; +} diff --git a/web/src/stores/modules/auth.ts b/web/src/stores/modules/auth.ts new file mode 100644 index 0000000000000000000000000000000000000000..91415350644a9611c0725ca500035f4d949263a9 --- /dev/null +++ b/web/src/stores/modules/auth.ts @@ -0,0 +1,185 @@ +/** + * @description 认证模块 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import { defineStore } from "pinia"; +import { getFlatMenuList, getShowMenuList, getAllBreadcrumbList } from "@/utils"; +import { Login, UserCenter } from "@/api/interface"; +import { loginApi, userCenterApi } from "@/api"; +import { useUserStore } from "./user"; +import { useTabsStore } from "./tabs"; +import { useMessageStore } from "./message"; +import { useKeepAliveStore } from "./keepAlive"; +import { useConfigStore } from "./config"; +import { initDynamicRouter } from "@/routers/modules/dynamicRouter"; +import { ElNotification } from "element-plus"; +import { getTimeState } from "@/utils"; +import router from "@/routers"; + +const name = "simple-auth"; // 定义模块名称 + +/* AuthState */ +export interface AuthState { + /** 登录的加载状态 */ + loginLoading: boolean; + /** 是否开启选择模块 */ + showChooseModule: boolean; + /** 模块列表 */ + moduleList: Login.ModuleInfo[]; + /** 菜单权限列表 */ + authButtonList: string[]; + /** 菜单权限列表 */ + authMenuList: Menu.MenuOptions[]; +} + +/** 认证模块 */ +export const useAuthStore = defineStore({ + id: name, + state: (): AuthState => ({ + loginLoading: false, + showChooseModule: false, + moduleList: [], + authButtonList: [], + authMenuList: [] + }), + getters: { + // 按钮权限列表 + authButtonListGet: state => state.authButtonList, + // 菜单权限列表 ==> 这里的菜单没有经过任何处理 + authMenuListGet: state => state.authMenuList, + // 菜单权限列表 ==> 左侧菜单栏渲染,需要剔除 isHide == true + showMenuListGet: state => getShowMenuList(state.authMenuList), + // 菜单权限列表 ==> 扁平化之后的一维数组菜单,主要用来添加动态路由 + flatMenuListGet: state => getFlatMenuList(state.authMenuList), + // 递归处理后的所有面包屑导航列表 + breadcrumbListGet: state => getAllBreadcrumbList(state.authMenuList) + }, + actions: { + /** 设置模块列表 */ + SetModuleList(moduleList: Login.ModuleInfo[]) { + this.moduleList = moduleList; + }, + /** 选择应用模块 */ + async chooseModule(config: UserCenter.ResModuleDefault) { + const userStore = useUserStore(); + userStore.setModule(config.id); //存储选择的模块 + await userCenterApi.setDefaultModule(config); //设置默认模块 + this.showChooseModule = false; //选择模块状态为关闭 + }, + /** 获取按钮列表 */ + async getAuthButtonList() { + const userStore = useUserStore(); + const { userInfo } = userStore; + this.authButtonList = userInfo?.buttonCodeList || []; + }, + /** 获取菜单列表 */ + async getAuthMenuList(moduleId: number | string) { + const { data } = await userCenterApi.getAuthMenuList({ id: moduleId }); + this.authMenuList = data; + }, + /** 账号密码登录 */ + async loginPwd(model: Login.LoginForm) { + this.loginLoading = true; + this.setTenantId(model); // 存储租户id + // 登录接口 + await loginApi + .login(model) + .then(res => { + if (res.data) { + this.loginSuccess(res.data); //登录成功 + } + }) + .catch(err => { + return Promise.reject(err); + }) + .finally(() => { + this.loginLoading = false; + }); + }, + /** 账号密码登录 */ + async loginPhone(model: Login.PhoneLoginForm) { + this.loginLoading = true; + this.setTenantId(model); // 存储租户id + // 登录接口 + await loginApi + .loginByPhone(model) + .then(res => { + if (res.data) { + this.loginSuccess(res.data); //登录成功 + } + }) + .catch(err => { + return Promise.reject(err); + }) + .finally(() => { + this.loginLoading = false; + }); + }, + /** 登录成功后的操作 */ + async handleActionAfterLogin() { + await initDynamicRouter() + .then(path => { + // 初始化动态路由 + const tabsStore = useTabsStore(); + const keepAliveStore = useKeepAliveStore(); + const messageStore = useMessageStore(); + // 3.清空 tabs、keepAlive 数据 + tabsStore.setTabs([]); + keepAliveStore.setKeepAliveName([]); + messageStore.reSet(); + // 4.跳转到首页 + router.push(path); + ElNotification({ + title: getTimeState(), + message: "欢迎回来 SimpleAdmin", + type: "success", + duration: 3000 + }); + }) + .catch(err => { + console.log("[ err ] >", err); + ElNotification({ + title: "系统错误", + message: "系统错误,请联系系统管理员!", + type: "warning", + duration: 3000 + }); + }); + }, + /** 存储租户id供下次登录自动选择 */ + setTenantId(model: Login.LoginForm | Login.PhoneLoginForm) { + // 如果是租户登录,存储id + if (model.tenantId) { + const configStore = useConfigStore(); + configStore.setTenantId(model.tenantId); + } + }, + /** 登录请求成功 */ + loginSuccess(data: Login.Login) { + const { defaultModule, moduleList } = data; + const userStore = useUserStore(); + this.SetModuleList(moduleList); // 设置模块列表 + if (moduleList.length === 1) { + // 如果只有一个模块,直接登录 + userStore.setModule(moduleList[0].id); //存储选择的模块 + this.handleActionAfterLogin(); //登录成功后的操作 + return; + } else if (defaultModule && moduleList.find(item => item.id === defaultModule)) { + userStore.setModule(defaultModule); //存储选择的模块为默认模块 + this.handleActionAfterLogin(); //登录成功后的操作 + } else { + this.showChooseModule = true; //开启选择模块 + } + } + } +}); diff --git a/web/src/stores/modules/config.ts b/web/src/stores/modules/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..38a38aa9d0dc3995ae3c92dadeb47ce98c2d8d7f --- /dev/null +++ b/web/src/stores/modules/config.ts @@ -0,0 +1,103 @@ +/** + * @description 系统配置 + * @license Apache License Version 2.0 +2022 +, + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +import { defineStore } from "pinia"; +import piniaPersistConfig from "@/stores/helper/persist"; +import { SysConfig, SysOrg, commonApi } from "@/api"; +import { SysBaseEnum, TenantEnum } from "@/enums"; + +const name = "simple-config"; // 定义模块名称 +/** DictState */ +export interface SysConfigState { + /** 系统基本信息 */ + sysInfo: SysConfig.SysBaseConfig; + /** 租户列表 */ + tenantList: SysOrg.SysOrgInfo[]; + /** 租户id,用来下次登录自动选择租户 */ + tenantId?: number | string; +} + +/** 配置模块 */ +export const useConfigStore = defineStore({ + id: name, + state: (): SysConfigState => ({ + sysInfo: { + SYS_NAME: "", + SYS_LOGO: "", + SYS_ICO: "", + SYS_VERSION: "", + SYS_COPYRIGHT: "", + SYS_COPYRIGHT_URL: "", + SYS_FOOTER_LINKS: [], + SYS_TENANT_OPTIONS: TenantEnum.CHOSE + }, + tenantList: [], + tenantId: undefined + }), + getters: { + sysBaseInfoGet: state => state.sysInfo, + tenantIdGet: state => state.tenantId, + tenantListGet: state => state.tenantList + }, + actions: { + /** 设置系统基本信息 */ + async setSysBaseInfo() { + /** 获取系统基本信息 */ + const { data } = await commonApi.sysInfo(); + if (data) { + //sysConfigProps赋值 + data.forEach((item: SysConfig.ConfigInfo) => { + //如果是对象类型的属性就转成对象 + if (item.configKey == SysBaseEnum.SYS_DEFAULT_WORKBENCH_DATA) { + const workBenchData: SysConfig.WorkBenchData = JSON.parse(item.configValue); + this.sysInfo.SYS_DEFAULT_WORKBENCH_DATA = workBenchData; + } else if (item.configKey == SysBaseEnum.SYS_FOOTER_LINKS) { + const footerLinks: SysConfig.FooterLinkProps[] = JSON.parse(item.configValue); + this.sysInfo.SYS_FOOTER_LINKS = footerLinks; + } else { + // 其他属性直接赋值 + (this.sysInfo[item.configKey as keyof SysConfig.SysBaseConfig] as string) = item.configValue; + } + }); + } + return this.sysInfo; + }, + /** 获取系统基本信息 */ + async getSysBaseInfo() { + if (this.sysInfo.SYS_NAME != "") { + return this.sysInfo; + } else { + return await this.setSysBaseInfo(); + } + }, + /** 获取租户列表 */ + async setTenantList() { + const { data } = await commonApi.tenantList(); + this.tenantList = data; + return data; + }, + /** 设置租户ID */ + setTenantId(tenantId: number | string) { + this.tenantId = tenantId; + }, + /** 删除租户ID */ + delTenantId() { + this.tenantId = null; + this.tenantList = []; + } + }, + persist: piniaPersistConfig(name) +}); diff --git a/web/src/stores/modules/dict.ts b/web/src/stores/modules/dict.ts new file mode 100644 index 0000000000000000000000000000000000000000..43dad9d8d31dd78ab6ae79bf51c2a86a2c92fc92 --- /dev/null +++ b/web/src/stores/modules/dict.ts @@ -0,0 +1,94 @@ +/** + * @description 字典模块 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +import { defineStore } from "pinia"; +import piniaPersistConfig from "@/stores/helper/persist"; +import { sysDictApi, SysDict } from "@/api"; +import { ElNotification } from "element-plus"; +import { SysDictEnum, CommonStatusEnum } from "@/enums"; + +const name = "simple-dict"; // 定义模块名称 + +/** 字典值约束 */ +type dictValue = string | SysDictEnum; + +/** DictState */ +export interface DictState { + /** 字典信息 */ + dictInfo: SysDict.DictTree[]; +} + +/** 字典模块 */ +export const useDictStore = defineStore({ + id: name, + state: (): DictState => ({ + dictInfo: [] + }), + getters: { + dictInfoGet: state => state.dictInfo + }, + actions: { + /** 设置字典信息 */ + async setDictTree() { + /** 获取字典信息 */ + const { data } = await sysDictApi.tree(); + if (data) { + this.dictInfo = data; + } else { + ElNotification({ + title: "系统错误", + message: "获取系统字典信息失败,请联系系统管理员!", + type: "warning", + duration: 3000 + }); + } + }, + /** 字典翻译 */ + dictTranslation(dictValue: dictValue, value: string) { + const tree = this.dictInfo.find((item: { dictValue: string }) => item.dictValue === dictValue); // 通过字典值找到字典 + //如果没有找到字典,返回无此字典 + if (!tree) { + return "无此字典"; + } + // 通过传的值找到字典的子项 + const dict = tree.children.find((item: { dictValue: string }) => item.dictValue === value); + return dict?.dictLabel || "无此字典"; + }, + /** 获取某个code下字典的列表,多用于字典下拉框 */ + getDictList(dictValue: dictValue, isBool?: boolean) { + const tree = this.dictInfo.find((item: { dictValue: string }) => item.dictValue === dictValue); + if (tree) { + //过滤停用的子项 + tree.children = tree.children.filter((item: { status: CommonStatusEnum }) => item.status === CommonStatusEnum.ENABLE); + return tree.children.map((item: { [x: string]: any }) => { + //是和否要特殊处理 + if (isBool) { + return { + value: item["dictValue"] === "true" ? true : false, + label: item["dictLabel"] + }; + } else { + return { + value: item["dictValue"], + label: item["dictLabel"] + }; + } + }); + } + return []; + } + }, + persist: piniaPersistConfig(name) +}); diff --git a/web/src/stores/modules/global.ts b/web/src/stores/modules/global.ts new file mode 100644 index 0000000000000000000000000000000000000000..fa5bda176054956304f43439dd69fb6e328908fe --- /dev/null +++ b/web/src/stores/modules/global.ts @@ -0,0 +1,72 @@ +/** + * @description + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import { defineStore } from "pinia"; +import { GlobalState } from "@/stores/interface"; +import { DEFAULT_PRIMARY } from "@/config"; +import piniaPersistConfig from "@/stores/helper/persist"; + +const name = "simple-global"; // 定义模块名称 + +/** 全局 */ +export const useGlobalStore = defineStore({ + id: name, + // 修改默认值之后,需清除 localStorage 数据 + state: (): GlobalState => ({ + // 布局模式 (纵向:vertical | 经典:classic | 横向:transverse | 分栏:columns) + layout: "vertical", + // element 组件大小 + assemblySize: "default", + // 当前页面是否全屏 + maximize: false, + // 主题颜色 + primary: DEFAULT_PRIMARY, + // 深色模式 + isDark: false, + // 灰色模式 + isGrey: false, + // 色弱模式 + isWeak: false, + // 侧边栏反转 + asideInverted: false, + // 头部反转 + headerInverted: false, + // 折叠菜单 + isCollapse: false, + // 菜单手风琴 + accordion: true, + // 面包屑导航 + breadcrumb: true, + // 面包屑导航图标 + breadcrumbIcon: true, + // 标签页 + tabs: true, + // 标签页图标 + tabsIcon: true, + // 页脚 + footer: true, + // 抽屉表单 + drawerForm: false, + //页面水印 + watermark: false + }), + getters: {}, + actions: { + // Set GlobalState + setGlobalState(...args: ObjToKeyValArray) { + this.$patch({ [args[0]]: args[1] }); + } + }, + persist: piniaPersistConfig(name) +}); diff --git a/web/src/stores/modules/index.ts b/web/src/stores/modules/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..7a18558254e2342787d4b3fcaea6d6322318bc2e --- /dev/null +++ b/web/src/stores/modules/index.ts @@ -0,0 +1,10 @@ +export * from "./auth"; +export * from "./global"; +export * from "./keepAlive"; +export * from "./tabs"; +export * from "./user"; +export * from "./dict"; +export * from "./config"; +export * from "./mqtt"; +export * from "./message"; +export * from "./userCenter"; diff --git a/web/src/stores/modules/keepAlive.ts b/web/src/stores/modules/keepAlive.ts new file mode 100644 index 0000000000000000000000000000000000000000..e1b7115f8160ec160b479be64d7b1f93fe072a10 --- /dev/null +++ b/web/src/stores/modules/keepAlive.ts @@ -0,0 +1,40 @@ +/** + * @description + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import { defineStore } from "pinia"; +import { KeepAliveState } from "@/stores/interface"; + +const name = "simple-keepAlive"; // 定义模块名称 + +/** KeepAlive模块 */ +export const useKeepAliveStore = defineStore({ + id: name, + state: (): KeepAliveState => ({ + keepAliveName: [] + }), + actions: { + // Add KeepAliveName + async addKeepAliveName(name: string) { + !this.keepAliveName.includes(name) && this.keepAliveName.push(name); + }, + // Remove KeepAliveName + async removeKeepAliveName(name: string) { + this.keepAliveName = this.keepAliveName.filter((item: string) => item !== name); + }, + // Set KeepAliveName + async setKeepAliveName(keepAliveName: string[] = []) { + this.keepAliveName = keepAliveName; + } + } +}); diff --git a/web/src/stores/modules/message.ts b/web/src/stores/modules/message.ts new file mode 100644 index 0000000000000000000000000000000000000000..1fe6dd52b70ac0ed83c209e34e053cdb65a71096 --- /dev/null +++ b/web/src/stores/modules/message.ts @@ -0,0 +1,124 @@ +/** + * @description 系统消息 + * @license Apache License Version 2.0 +2022 +, + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +import { defineStore } from "pinia"; +import { userCenterApi, UserCenter, SysMessage } from "@/api"; +import { ElNotification } from "element-plus"; +import { Message } from "@element-plus/icons-vue"; + +const name = "simple-message"; // 定义模块名称 + +/* MqttState */ +export interface MessageState { + /** 未读消息信息 */ + unReadInfo: any; + /** 未读消息数 */ + unReadCount: number; + /** 新未读消息 */ + newUnRead: SysMessage.SysMessageInfo[]; +} + +/** Mqtt模块 */ +export const useMessageStore = defineStore({ + id: name, + state: (): MessageState => ({ + unReadInfo: {}, + unReadCount: 0, + newUnRead: [] + }), + getters: { + unReadCountGet: state => state.unReadCount, + unReadInfoGet: state => state.unReadInfo + }, + actions: { + /** 显示更多 */ + setShowMore(state: boolean) { + this.showMore = state; + }, + /** 增加未读消息数 */ + unReadCountAdd(value: number) { + this.unReadCount += value; + }, + /** 减少未读消息数 */ + unReadCountSubtract(value: number) { + this.unReadCount -= value; + }, + /** 设置未读消息数 */ + unReadCountSet(value: number) { + this.unReadCount = value; + }, + /** 获取未读消息数 */ + async getUnReadInfo(notice: boolean = false) { + await userCenterApi.unReadCount().then(res => { + if (res.data.length > 0) { + //未读消息信息数量转换 + this.unReadInfo = res.data.reduce((acc, item) => { + acc[item.category] = item.unReadCount; + return acc; + }, {}); + //遍历未读消息信息,获取未读消息总数 + let count = 0; + res.data.map((item: UserCenter.ResUnReadCount) => { + count += item.unReadCount; + }); + //如果未读消息总数大于当前未读消息总数,则获取最新未读消息 + if (count > this.unReadCount) { + this.getNewMessage(notice); + } + this.unReadCountSet(count); + } else { + this.unReadCountSet(0); + } + }); + }, + /** 获取最新未读消息 */ + async getNewUnRead() { + await userCenterApi.newUnRead().then(res => { + if (res.data.length > 0) { + this.newUnRead = res.data; + } + }); + }, + /** 获取未读消息数 */ + getUnReadCount(category: string) { + return this.unReadInfo[category] || 0; + }, + /**提示有新消息 */ + getNewMessage(notice: boolean = false, message: string = "您有一条新消息,请注意查收!") { + this.getNewUnRead(); + if (notice) { + ElNotification({ + title: "收到一条新消息", + message: message, + icon: Message, + offset: 40 + }); + } + }, + /**定时刷新最新消息*/ + async getNewMessageInterval() { + setInterval(() => { + this.getUnReadInfo(true); + }, 10000); + }, + /* 重置未读消息数 */ + reSet() { + this.unReadCount = 0; + this.unReadInfo = {}; + this.newUnRead = []; + } + } +}); diff --git a/web/src/stores/modules/mqtt.ts b/web/src/stores/modules/mqtt.ts new file mode 100644 index 0000000000000000000000000000000000000000..417bdbe84a5280a1ddb6da5feca2577611ed9e0a --- /dev/null +++ b/web/src/stores/modules/mqtt.ts @@ -0,0 +1,180 @@ +/** + * @description mqtt 消息订阅 + * @license Apache License Version 2.0 +2022 +, + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ +import mqtt from "mqtt"; +import { defineStore } from "pinia"; +import { mqttApi } from "@/api"; +import { useMessageStore } from "@/stores/modules"; +import { MqttMessage, MsgTypeEnum } from "../interface/mqtt"; + +const name = "simple-mqtt"; // 定义模块名称 + +/* MqttState */ +export interface MqttState { + /** 服务端地址 */ + url: string | undefined; + /** 是否清除 */ + clean: boolean; + /** 客户端 */ + client: any; + /** 客户端id */ + clientId: string; + /** 订阅主题列表 */ + topics: string[]; + /** 订阅主题的集合,key为topic, value为接收到该topic时需要执行的回调 */ + subscribeMembers: [{ string: any }] | undefined; +} + +/** 订阅参数 */ +export interface subscribeParams { + /** 订阅主题 */ + topic: string; + /** 订阅回调 */ + callback: number; + /** 订阅选项 */ + subscribeOption: any; +} + +/** Mqtt模块 */ +export const useMqttStore = defineStore({ + id: name, + state: (): MqttState => ({ + url: undefined, + client: undefined, + clientId: "", + clean: true, + topics: [], + subscribeMembers: undefined + }), + getters: {}, + actions: { + /** 获取mqtt参数 */ + async getMqttParameter() { + return await mqttApi.getMqttParameter().then(res => { + console.log("[ res ] >", res); + this.clientId = res.data.clientId; + this.url = res.data.url; + this.topics = res.data.topics; + return res.data; + }); + }, + /** 初始化mqtt客户端 */ + async initMqttClient() { + console.log("[ mqtt初始化 ] >"); + if (this.client) { + this.disconnect(); + } + await this.getMqttParameter().then(res => { + const url = this.url; + const options = { + username: res.userName, + password: res.password, + clientId: this.clientId, + clean: true, // true: 清除会话, false: 保留会话 + connectTimeout: 4000, // 超时时间 + keepAlive: 60 // 心跳时间 + }; + console.log("[ options ] >", options); + // return; + if (url) { + this.client = mqtt.connect(url, options); + this.client.on("connect", e => { + this.onConnect(e); + }); + this.client.on("reconnect", err => { + this.onReconnect(err); + }); + this.client.on("error", err => { + this.onError(err); + }); + this.client.on("message", (topic, message) => { + this.onMessage(topic, message); + }); + } + }); + }, + /** 断开连接 */ + disconnect() { + this.client.end(); + this.client = undefined; + this.subscribeMembers = {}; + }, + /** 订阅 */ + subscribe(topics: string[]) { + topics.forEach((item: string) => { + this.client.subscribe(item, {}, (err, res) => { + if (err) { + console.log(`客户端: ${this.clientId}, 订阅主题: ${item}失败: `, err); + } else { + console.log(`客户端: ${this.clientId}, 订阅主题: ${item}成功,${JSON.stringify(res)}`); + } + }); + }); + }, + /** 订阅带回调函数 */ + subscribeCallback(params: subscribeParams) { + const { topic, callback, subscribeOption } = params; + this.client.subscribe(topic, subscribeOption, (err, res) => { + if (err) { + console.log(`客户端: ${this.clientId}, 订阅主题: ${topic}失败: `, err); + } else { + console.log(`客户端: ${this.clientId}, 订阅主题: ${topic}成功,${res}`); + } + }); + this.subscribeMembers.push({ topic, callback }); + }, + /** 取消订阅 */ + unsubscribe(topic: string) { + if (!this.client) return; + this.client.unsubscribe(topic, {}, (err, res) => { + if (err) { + console.log(`客户端: ${this.clientId}, 取消订阅主题: ${topic}失败: `, err); + } else { + console.log(`客户端: ${this.clientId}, 取消订阅主题: ${topic}成功,${res}`); + } + }); + this.subscribeMembers = this.subscribeMembers.filter((item: any) => item.topic !== topic); + }, + /** 连接事件 */ + onConnect(e: any) { + console.log(`客户端: ${this.clientId}, 连接mqtt服务器成功:`, e); + this.subscribe(this.topics); + }, + /** 重连事件 */ + onReconnect(err: any) { + console.log(`客户端: ${this.clientId}, 正在重连mqtt服务器...`, err); + }, + /** 错误事件 */ + onError(err: any) { + console.log(`客户端: ${this.clientId}, 连接mqtt服务器失败:`, err); + }, + /** 消息事件 */ + onMessage(topic: string, message: any) { + console.log(message.toString()); + const messageStore = useMessageStore(); + const msg = JSON.parse(message.toString()) as MqttMessage; + console.log(`客户端: ${this.clientId}, 接收到消息:`, topic, msg); + switch (msg.MsgType) { + case MsgTypeEnum.NewMessage: + messageStore.getNewMessage(true, msg.Data.Subject); + break; + case MsgTypeEnum.LoginOut: + break; + case MsgTypeEnum.UpdatePassword: + break; + } + } + } +}); diff --git a/web/src/stores/modules/tabs.ts b/web/src/stores/modules/tabs.ts new file mode 100644 index 0000000000000000000000000000000000000000..a2448da17b1785a5eea52a8a39621aba6dfd2f22 --- /dev/null +++ b/web/src/stores/modules/tabs.ts @@ -0,0 +1,98 @@ +/** + * @description + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import router from "@/routers"; +import { defineStore } from "pinia"; +import { getUrlWithParams } from "@/utils"; +import { useKeepAliveStore } from "./keepAlive"; +import { TabsState, TabsMenuProps } from "@/stores/interface"; +import piniaPersistConfig from "@/stores/helper/persist"; + +const name = "simple-tabs"; // 定义模块名称 + +/** 标签页 */ +export const useTabsStore = defineStore({ + id: name, + state: (): TabsState => ({ + tabsMenuList: [] + }), + actions: { + // Add Tabs + async addTabs(tabItem: TabsMenuProps) { + const keepAliveStore = useKeepAliveStore(); + if (this.tabsMenuList.every((item: { path: string }) => item.path !== tabItem.path)) { + // 如果tabItem的路径不等于当前tabsMenuList的路径,则添加tabItem + this.tabsMenuList.push(tabItem); + } + // 如果tabItem的name不包含在keepAliveStore的keepAliveName中,并且tabItem的isKeepAlive为true,则添加keepAliveStore的keepAliveName + if (!keepAliveStore.keepAliveName.includes(tabItem.name) && tabItem.isKeepAlive) { + keepAliveStore.addKeepAliveName(tabItem.path); + } + }, + // Remove Tabs + async removeTabs(tabPath: string, isCurrent: boolean = true) { + const keepAliveStore = useKeepAliveStore(); + if (isCurrent) { + this.tabsMenuList.forEach((item: { path: string }, index: number) => { + if (item.path !== tabPath) return; + const nextTab = this.tabsMenuList[index + 1] || this.tabsMenuList[index - 1]; + if (!nextTab) return; + router.push(nextTab.path); + }); + } + this.tabsMenuList = this.tabsMenuList.filter((item: { path: string }) => item.path !== tabPath); + // remove keepalive + const tabItem = this.tabsMenuList.find((item: { path: string }) => item.path === tabPath); + tabItem?.isKeepAlive && keepAliveStore.removeKeepAliveName(tabItem.path); + // set tabs + this.tabsMenuList = this.tabsMenuList.filter((item: { path: string }) => item.path !== tabPath); + }, + + // Close Tabs On Side + async closeTabsOnSide(path: string, type: "left" | "right") { + const keepAliveStore = useKeepAliveStore(); + const currentIndex = this.tabsMenuList.findIndex((item: { path: string }) => item.path === path); + if (currentIndex !== -1) { + const range = type === "left" ? [0, currentIndex] : [currentIndex + 1, this.tabsMenuList.length]; + this.tabsMenuList = this.tabsMenuList.filter((item: { close: any }, index: number) => { + return index < range[0] || index >= range[1] || !item.close; + }); + } + // set keepalive + const KeepAliveList = this.tabsMenuList.filter((item: { isKeepAlive: any }) => item.isKeepAlive); + keepAliveStore.setKeepAliveName(KeepAliveList.map((item: { path: any }) => item.path)); + }, + // Close MultipleTab + async closeMultipleTab(tabsMenuValue?: string) { + const keepAliveStore = useKeepAliveStore(); + this.tabsMenuList = this.tabsMenuList.filter((item: { path: string | undefined; close: any }) => { + return item.path === tabsMenuValue || !item.close; + }); + // set keepalive + const KeepAliveList = this.tabsMenuList.filter((item: { isKeepAlive: any }) => item.isKeepAlive); + keepAliveStore.setKeepAliveName(KeepAliveList.map((item: { path: any }) => item.path)); + }, + // Set Tabs + async setTabs(tabsMenuList: TabsMenuProps[]) { + this.tabsMenuList = tabsMenuList; + }, + // Set Tabs Title + async setTabsTitle(title: string) { + this.tabsMenuList.forEach((item: { path: string; title: string }) => { + if (item.path == getUrlWithParams()) item.title = title; + }); + } + }, + persist: piniaPersistConfig(name) +}); diff --git a/web/src/stores/modules/user.ts b/web/src/stores/modules/user.ts new file mode 100644 index 0000000000000000000000000000000000000000..bed1de75fadbc546b1d9b7ebe7c92493caae772c --- /dev/null +++ b/web/src/stores/modules/user.ts @@ -0,0 +1,107 @@ +/** + * @description 用户模块 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import { defineStore } from "pinia"; +import { Login } from "@/api/interface"; +import piniaPersistConfig from "@/stores/helper/persist"; +import { loginApi } from "@/api"; +import { ElNotification } from "element-plus"; + +const name = "simple-user"; // 定义模块名称 + +/* UserState */ +export interface UserState { + /** token */ + accessToken: string; + /** 刷新token */ + refreshToken: string; + /** 用户信息 */ + userInfo: Login.LoginUserInfo | null; + /** 默认模块 */ + defaultModule: number | string | null; + /** 选择模块 */ + chooseModule: number | string | null; + /** 模块列表 */ + moduleList: Login.ModuleInfo[]; +} + +/** 用户模块 */ +export const useUserStore = defineStore({ + id: name, + state: (): UserState => ({ + accessToken: "", + refreshToken: "", + userInfo: null, + defaultModule: null, + chooseModule: null, + moduleList: [] + }), + getters: { + userInfoGet: state => state.userInfo, + chooseModuleGet: state => state.chooseModule + }, + actions: { + // Set Token + setToken(token: string, refreshToken: string) { + this.accessToken = token; + this.refreshToken = refreshToken; + }, + async getUserInfo() { + /** 获取用户信息 */ + const { data } = await loginApi.getLoginUser(); + if (data) { + this.setUserInfo(data); + } else { + ElNotification({ + title: "系统错误", + message: "获取个人信息失败,请联系系统管理员!", + type: "warning", + duration: 3000 + }); + } + return this.userInfo; + }, + /** 设置用户信息 */ + setUserInfo(userInfo: Login.LoginUserInfo) { + this.userInfo = userInfo; + this.defaultModule = userInfo.defaultModule; + this.moduleList = userInfo.moduleList; + }, + /** 设置用户签名 */ + setSignature(signature: string) { + this.userInfo.signature = signature; + }, + /** 设置用户单个属性 */ + setUserInfoItem(key: string, value: any) { + this.userInfo[key] = value; + }, + /** 清除token */ + clearToken() { + this.accessToken = ""; + this.refreshToken = ""; + }, + /** 清理用户信息 */ + clearUserStore() { + this.clearToken(); + this.userInfo = null; + this.defaultModule = null; + this.moduleList = []; + }, + /** 选择模块 */ + setModule(moduleId: number | string | null) { + this.chooseModule = moduleId; + } + }, + persist: piniaPersistConfig(name) +}); diff --git a/web/src/stores/modules/userCenter.ts b/web/src/stores/modules/userCenter.ts new file mode 100644 index 0000000000000000000000000000000000000000..64392e729b288358c7f3dc07b82252d803bd59c3 --- /dev/null +++ b/web/src/stores/modules/userCenter.ts @@ -0,0 +1,63 @@ +/** + * @description 用户中心 + * @license Apache License Version 2.0 +2022 +, + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + */ + +import { defineStore } from "pinia"; + +const name = "simple-userCenter"; // 定义模块名称 + +const accountBasic = "accountBasic"; +const file = "file"; +const message = "message"; +const short = "short"; +/* MqttState */ +export interface UserCenterState { + /** 当前标签页 */ + tab: string; + accountBasic: string; + file: string; + message: string; + short: string; +} + +/** Mqtt模块 */ +export const useCenterStore = defineStore({ + id: name, + state: (): UserCenterState => ({ + tab: accountBasic, + accountBasic: accountBasic, + file: file, + message: message, + short: short + }), + getters: { + getTab: state => state.tab, + getAccountBasic: state => state.accountBasic, + getFile: state => state.file, + getMessage: state => state.message, + getShort: state => state.short + }, + actions: { + setTab(tab: string) { + this.tab = tab; + }, + resetTab() { + this.tab = accountBasic; + }, + setMessage() { + this.tab = "message"; + } + } +}); diff --git a/web/src/styles/common.scss b/web/src/styles/common.scss new file mode 100644 index 0000000000000000000000000000000000000000..e94465cbca6dc2f449069a55e2e3736c1a350578 --- /dev/null +++ b/web/src/styles/common.scss @@ -0,0 +1,123 @@ +/* flex */ +.flx-center { + display: flex; + align-items: center; + justify-content: center; +} +.flx-justify-between { + display: flex; + align-items: center; + justify-content: space-between; +} +.flx-align-center { + display: flex; + align-items: center; +} + +/* clearfix */ +.clearfix::after { + display: block; + height: 0; + overflow: hidden; + clear: both; + content: ""; +} + +/* 文字单行省略号 */ +.sle { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* 文字多行省略号 */ +.mle { + display: -webkit-box; + overflow: hidden; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} + +/* 文字多了自动換行 */ +.break-word { + word-break: break-all; + word-wrap: break-word; +} + +/* fade-transform */ +.fade-transform-leave-active, +.fade-transform-enter-active { + transition: all 0.2s; +} +.fade-transform-enter-from { + opacity: 0; + transition: all 0.2s; + transform: translateX(-30px); +} +.fade-transform-leave-to { + opacity: 0; + transition: all 0.2s; + transform: translateX(30px); +} + +/* breadcrumb-transform */ +.breadcrumb-enter-active { + transition: all 0.2s; +} +.breadcrumb-enter-from, +.breadcrumb-leave-active { + opacity: 0; + transform: translateX(10px); +} + +/* scroll bar */ +::-webkit-scrollbar { + width: 6px; + height: 6px; +} +::-webkit-scrollbar-thumb { + background-color: var(--el-border-color-darker); + border-radius: 20px; +} + +/* nprogress */ +#nprogress .bar { + background: var(--el-color-primary) !important; +} +#nprogress .spinner-icon { + border-top-color: var(--el-color-primary) !important; + border-left-color: var(--el-color-primary) !important; +} +#nprogress .peg { + box-shadow: + 0 0 10px var(--el-color-primary), + 0 0 5px var(--el-color-primary) !important; +} + +/* 外边距、内边距全局样式 */ +@for $i from 0 through 100 { + .mt#{$i} { + margin-top: #{$i}px !important; + } + .mr#{$i} { + margin-right: #{$i}px !important; + } + .mb#{$i} { + margin-bottom: #{$i}px !important; + } + .ml#{$i} { + margin-left: #{$i}px !important; + } + .pt#{$i} { + padding-top: #{$i}px !important; + } + .pr#{$i} { + padding-right: #{$i}px !important; + } + .pb#{$i} { + padding-bottom: #{$i}px !important; + } + .pl#{$i} { + padding-left: #{$i}px !important; + } +} diff --git a/web/src/styles/element-dark.scss b/web/src/styles/element-dark.scss new file mode 100644 index 0000000000000000000000000000000000000000..633cea46e87140d7fd8c352cac8f5f8c19080546 --- /dev/null +++ b/web/src/styles/element-dark.scss @@ -0,0 +1,28 @@ +/* 自定义 element 暗黑模式 */ +html.dark { + /* wangEditor */ + --w-e-toolbar-color: #eeeeee; + --w-e-toolbar-bg-color: #141414; + --w-e-textarea-bg-color: #141414; + --w-e-textarea-color: #eeeeee; + --w-e-toolbar-active-bg-color: #464646; + --w-e-toolbar-border-color: var(--el-border-color-darker); + .w-e-bar-item button:hover, + .w-e-menu-tooltip-v5::before { + color: #eeeeee; + } + + /* login */ + .login-container { + background-color: #191919 !important; + .login-box { + background-color: rgb(0 0 0 / 80%) !important; + .login-form { + box-shadow: rgb(255 255 255 / 12%) 0 2px 10px 2px !important; + .logo-text { + color: var(--el-text-color-primary) !important; + } + } + } + } +} diff --git a/web/src/styles/element.scss b/web/src/styles/element.scss new file mode 100644 index 0000000000000000000000000000000000000000..8c12dd1aeeb5f35a30e6f1d370e87d09e35e1495 --- /dev/null +++ b/web/src/styles/element.scss @@ -0,0 +1,279 @@ +// /* 设置 notification、message 层级在 loading 之上 */ +// .el-message, +// .el-notification { +// z-index: 9999 !important; +// } + +/* el-alert */ +.el-alert { + border: 1px solid; +} + +/* 当前页面最大化 css */ +.main-maximize { + .aside-split, + .el-aside, + .el-header, + .el-footer, + .tabs-box { + display: none !important; + } +} + +/* mask image */ +.mask-image { + padding-right: 50px; + mask-image: linear-gradient(90deg, #000000 0%, #000000 calc(100% - 50px), transparent); +} + +/* custom card */ +.card { + box-sizing: border-box; + padding: 20px; + overflow-x: hidden; + background-color: var(--el-bg-color); + border: 1px solid var(--el-border-color-light); + border-radius: 6px; + box-shadow: 0 0 12px rgb(0 0 0 / 5%); +} + +/* ProTable 不需要 card 样式(在组件内使用 ProTable 会使用到) */ +.no-card { + .card { + padding: 0; + background-color: transparent; + border: none; + border-radius: 0; + box-shadow: none; + } + .table-search { + padding: 18px 0 0 !important; + margin-bottom: 0 !important; + } +} + +/* content-box (常用内容盒子) */ +.content-box { + display: flex; + flex-direction: column; + align-items: center; + height: 100%; + .text { + margin: 20px 0 30px; + font-size: 23px; + font-weight: bold; + color: var(--el-text-color-regular); + } + .el-descriptions { + width: 100%; + padding: 40px 0 0; + .el-descriptions__title { + font-size: 18px; + } + .el-descriptions__label { + width: 200px; + } + } +} + +/* main-box (树形表格 treeFilter 页面会使用,左右布局 flex) */ +.main-box { + display: flex; + width: 100%; + height: 100%; + .table-box { + // 这里减去的 230px 是 treeFilter 组件宽度 + // width: calc(100% - 230px); + overflow: hidden; + } +} + +/* proTable */ +.table-box, +.table-main { + display: flex; + flex: 1; + flex-direction: column; + width: 100%; + height: 100%; + + // table-search 表格搜索样式 + .table-search { + padding: 18px 18px 0; + margin-bottom: 10px; + .el-form { + .el-form-item__content > * { + width: 100%; + } + + // 去除时间选择器上下 padding + .el-range-editor.el-input__wrapper { + padding: 0 10px; + } + } + .operation { + display: flex; + align-items: center; + justify-content: flex-end; + margin-bottom: 18px; + } + } + + // 表格 header 样式 + .table-header { + .header-button-lf, + .header-button-ri { + display: flex; + flex-wrap: wrap; + gap: 15px 12px; + margin-bottom: 15px; + .el-button:not(.el-input .el-button) { + margin-left: 0; + } + } + .header-button-lf { + float: left; + } + .header-button-ri { + float: right; + } + } + + // el-table 表格样式 + .el-table { + flex: 1; + + // 修复 safari 浏览器表格错位 https://github.com/HalseySpicy/Geeker-Admin/issues/83 + table { + width: 100%; + } + .el-table__header th { + height: 45px; + font-size: 15px; + font-weight: bold; + color: var(--el-text-color-primary); + background: var(--el-fill-color-light); + } + .el-table__row { + height: 45px; + font-size: 14px; + .move { + cursor: move; + .el-icon { + cursor: move; + } + } + } + + // 设置 el-table 中 header 文字不换行,并省略 + .el-table__header .el-table__cell > .cell { + // white-space: nowrap; + white-space: wrap; + } + + // 解决表格数据为空时样式不居中问题(仅在element-plus中) + .el-table__empty-block { + position: absolute; + width: 200px; + .table-empty { + line-height: 30px; + img { + display: inline-flex; + } + } + } + + // table 中 image 图片样式 + .table-image { + width: 50px; + height: 50px; + border-radius: 50%; + } + } + + // 表格 pagination 样式 + .el-pagination { + display: flex; + justify-content: flex-end; + margin-top: 20px; + } +} + +/* el-table 组件大小 */ +.el-table--small { + .el-table__header th { + height: 40px !important; + font-size: 14px !important; + } + .el-table__row { + height: 40px !important; + font-size: 13px !important; + } +} +.el-table--large { + .el-table__header th { + height: 50px !important; + font-size: 16px !important; + } + .el-table__row { + height: 50px !important; + font-size: 15px !important; + } +} + +/* el-drawer */ +.el-drawer { + .el-drawer__header { + padding: 16px 20px; + margin-bottom: 0; + border-bottom: 1px solid var(--el-border-color-lighter); + span { + font-size: 17px; + line-height: 17px; + color: var(--el-text-color-primary) !important; + } + } + .el-drawer__footer { + border-top: 1px solid var(--el-border-color-lighter); + } + + // select 样式 + .el-select { + width: 100%; + } + + // drawer-form 中存在两列 form-item 样式 + .drawer-multiColumn-form { + display: flex; + flex-wrap: wrap; + .el-form-item { + width: 47%; + &:nth-child(2n-1) { + margin-right: 5%; + } + } + } +} + +/* el-dialog */ +.el-dialog { + padding: 0; + .el-dialog__header { + padding: 15px 20px; + margin: 0; + border-bottom: 1px solid var(--el-border-color-lighter); + .el-dialog__title { + font-size: 17px; + } + } +} +.el-dialog__body, +.el-dialog__footer { + padding: 15px 20px; + margin-top: 5px; +} + +// 解决在table的header中使用复合型输入框右侧按钮导致输入框很大的问题 +.el-input-button { + margin-bottom: 0 !important; +} diff --git a/web/src/styles/reset.scss b/web/src/styles/reset.scss new file mode 100644 index 0000000000000000000000000000000000000000..4462142b6d95d5c9fa2d1c27ea52e1cb43f8cda3 --- /dev/null +++ b/web/src/styles/reset.scss @@ -0,0 +1,143 @@ +/* Reset style sheet */ + +/* 目前项目中使用富文本编辑器需要注释,如果你项目中没有使用富文本编辑器,可以取消注释 */ +// html, +// body, +// div, +// span, +// applet, +// object, +// iframe, +// h1, +// h2, +// h3, +// h4, +// h5, +// h6, +// p, +// blockquote, +// pre, +// a, +// abbr, +// acronym, +// address, +// big, +// cite, +// code, +// del, +// dfn, +// em, +// img, +// ins, +// kbd, +// q, +// s, +// samp, +// small, +// strike, +// strong, +// sub, +// sup, +// tt, +// var, +// b, +// u, +// i, +// center, +// dl, +// dt, +// dd, +// ol, +// ul, +// li, +// fieldset, +// form, +// label, +// legend, +// table, +// caption, +// tbody, +// tfoot, +// thead, +// tr, +// th, +// td, +// article, +// aside, +// canvas, +// details, +// embed, +// figure, +// figcaption, +// footer, +// header, +// hgroup, +// menu, +// nav, +// output, +// ruby, +// section, +// summary, +// time, +// mark, +// audio, +// video { +// padding: 0; +// margin: 0; +// font: inherit; +// font-size: 100%; +// vertical-align: baseline; +// border: 0; +// } + +// /* HTML5 display-role reset for older browsers */ +// article, +// aside, +// details, +// figcaption, +// figure, +// footer, +// header, +// hgroup, +// menu, +// nav, +// section { +// display: block; +// } +// body { +// padding: 0; +// margin: 0; +// } +// ol, +// ul { +// list-style: none; +// } +// blockquote, +// q { +// quotes: none; +// } +// blockquote::before, +// blockquote::after, +// q::before, +// q::after { +// content: ""; +// content: none; +// } +// table { +// border-spacing: 0; +// border-collapse: collapse; +// } +html, +body, +#app, +#watermark { + width: 100%; + height: 100%; + padding: 0; + margin: 0; +} + +/* 解决 h1 标签在 webkit 内核浏览器中文字大小失效问题 */ +:-webkit-any(article, aside, nav, section) h1 { + font-size: 2em; +} diff --git a/web/src/styles/theme/aside.ts b/web/src/styles/theme/aside.ts new file mode 100644 index 0000000000000000000000000000000000000000..53cce734a7357e34a1696f53e17e2dd40ad31075 --- /dev/null +++ b/web/src/styles/theme/aside.ts @@ -0,0 +1,16 @@ +import { Theme } from "@/hooks/interface"; + +export const asideTheme: Record = { + light: { + "--el-aside-logo-text-color": "#303133", + "--el-aside-border-color": "#e4e7ed" + }, + inverted: { + "--el-aside-logo-text-color": "#dadada", + "--el-aside-border-color": "#414243" + }, + dark: { + "--el-aside-logo-text-color": "#dadada", + "--el-aside-border-color": "#414243" + } +}; diff --git a/web/src/styles/theme/header.ts b/web/src/styles/theme/header.ts new file mode 100644 index 0000000000000000000000000000000000000000..d2ba505ccd921a99db1509c8d98e8cbbafd62513 --- /dev/null +++ b/web/src/styles/theme/header.ts @@ -0,0 +1,25 @@ +import { Theme } from "@/hooks/interface"; + +export const headerTheme: Record = { + light: { + "--el-header-logo-text-color": "#303133", + "--el-header-bg-color": "#ffffff", + "--el-header-text-color": "#303133", + "--el-header-text-color-regular": "#606266", + "--el-header-border-color": "#e4e7ed" + }, + inverted: { + "--el-header-logo-text-color": "#dadada", + "--el-header-bg-color": "#191a20", + "--el-header-text-color": "#e5eaf3", + "--el-header-text-color-regular": "#cfd3dc", + "--el-header-border-color": "#414243" + }, + dark: { + "--el-header-logo-text-color": "#dadada", + "--el-header-bg-color": "#141414", + "--el-header-text-color": "#e5eaf3", + "--el-header-text-color-regular": "#cfd3dc", + "--el-header-border-color": "#414243" + } +}; diff --git a/web/src/styles/theme/menu.ts b/web/src/styles/theme/menu.ts new file mode 100644 index 0000000000000000000000000000000000000000..32b02bad76a64eaeff90681c6627f743a6e4c472 --- /dev/null +++ b/web/src/styles/theme/menu.ts @@ -0,0 +1,31 @@ +import { Theme } from "@/hooks/interface"; + +export const menuTheme: Record = { + light: { + "--el-menu-bg-color": "#ffffff", + "--el-menu-hover-bg-color": "#cccccc", + "--el-menu-active-bg-color": "var(--el-color-primary-light-9)", + "--el-menu-text-color": "#333333", + "--el-menu-active-color": "var(--el-color-primary)", + "--el-menu-hover-text-color": "#333333", + "--el-menu-horizontal-sub-item-height": "50px" + }, + inverted: { + "--el-menu-bg-color": "#191a20", + "--el-menu-hover-bg-color": "#000000", + "--el-menu-active-bg-color": "#000000", + "--el-menu-text-color": "#bdbdc0", + "--el-menu-active-color": "#ffffff", + "--el-menu-hover-text-color": "#ffffff", + "--el-menu-horizontal-sub-item-height": "50px" + }, + dark: { + "--el-menu-bg-color": "#141414", + "--el-menu-hover-bg-color": "#000000", + "--el-menu-active-bg-color": "#000000", + "--el-menu-text-color": "#bdbdc0", + "--el-menu-active-color": "#ffffff", + "--el-menu-hover-text-color": "#ffffff", + "--el-menu-horizontal-sub-item-height": "50px" + } +}; diff --git a/web/src/styles/var.scss b/web/src/styles/var.scss new file mode 100644 index 0000000000000000000000000000000000000000..bdc1cb2eb73f5e41dedfccbccd9a4fd7e23e497a --- /dev/null +++ b/web/src/styles/var.scss @@ -0,0 +1,2 @@ +/* global css variable */ +$primary-color: var(--el-color-primary); diff --git a/web/src/typings/global.d.ts b/web/src/typings/global.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..b24e95584781c4a6200243dcd22f4e1b0c92009e --- /dev/null +++ b/web/src/typings/global.d.ts @@ -0,0 +1,89 @@ +/** + * @description 全局类型定义 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +/* 菜单 */ +declare namespace Menu { + interface MenuOptions { + path: string; + name: string; + component?: string | (() => Promise); + redirect?: string; + meta: MetaProps; + isHome: boolean; + children?: MenuOptions[]; + } + interface MetaProps { + icon: string; + title: string; + activeMenu?: string; + isLink?: string; + isHide: boolean; + isFull: boolean; + isAffix: boolean; + isKeepAlive: boolean; + } +} + +/* FileType */ +declare namespace File { + type ImageMimeType = + | "image/apng" + | "image/bmp" + | "image/gif" + | "image/jpeg" + | "image/pjpeg" + | "image/png" + | "image/svg+xml" + | "image/tiff" + | "image/webp" + | "image/x-icon"; + + type ExcelMimeType = "application/vnd.ms-excel" | "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; +} + +/* Vite */ +declare type Recordable = Record; + +declare interface ViteEnv { + VITE_USER_NODE_ENV: "development" | "production" | "test"; + VITE_GLOB_APP_TITLE: string; + VITE_PORT: number; + VITE_OPEN: boolean; + VITE_REPORT: boolean; + VITE_ROUTER_MODE: "hash" | "history"; + VITE_BUILD_COMPRESS: "gzip" | "brotli" | "gzip,brotli" | "none"; + VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE: boolean; + VITE_DROP_CONSOLE: boolean; + VITE_PWA: boolean; + VITE_DEVTOOLS: boolean; + VITE_PUBLIC_PATH: string; + VITE_API_URL: string; + VITE_PROXY: [string, string][]; + VITE_CODEINSPECTOR: boolean; +} + +interface ImportMetaEnv extends ViteEnv { + __: unknown; +} + +/* __APP_INFO__ */ +declare const __APP_INFO__: { + pkg: { + name: string; + version: string; + dependencies: Recordable; + devDependencies: Recordable; + }; + lastBuildTime: string; +}; diff --git a/web/src/typings/props.d.ts b/web/src/typings/props.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..684a88265ea2afea1581f1e27d2c7257d9ed10f5 --- /dev/null +++ b/web/src/typings/props.d.ts @@ -0,0 +1,33 @@ +/** + * @description props类型定义 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +/** 表单props属性 */ +declare namespace FormProps { + // 表单基础props属性 + interface Base { + /** 操作类型 */ + opt: string; + /** id数据 */ + id?: string | number; + /** 当前行数据 */ + record: Partial; + /** 是否禁止操作 */ + disabled?: boolean; + /** 行内表单模式 */ + inline?: boolean; + /** 表单布局 */ + successful?: () => void; + } +} diff --git a/web/src/typings/utils.d.ts b/web/src/typings/utils.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..e6b3ffdc5a8f686c94e7aab0326832ce569aee64 --- /dev/null +++ b/web/src/typings/utils.d.ts @@ -0,0 +1,31 @@ +/** + * @description + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +type ObjToKeyValUnion = { + [K in keyof T]: { key: K; value: T[K] }; +}[keyof T]; + +type ObjToKeyValArray = { + [K in keyof T]: [K, T[K]]; +}[keyof T]; + +type ObjToSelectedValueUnion = { + [K in keyof T]: T[K]; +}[keyof T]; + +type Optional = Omit & Partial>; + +type GetOptional = { + [P in keyof T as T[P] extends Required[P] ? never : P]: T[P]; +}; diff --git a/web/src/typings/window.d.ts b/web/src/typings/window.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..99f2253deb8d79058d8da66b873017408a4da3f4 --- /dev/null +++ b/web/src/typings/window.d.ts @@ -0,0 +1,22 @@ +/** + * @description window 全局类型声明 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +declare global { + interface Navigator { + msSaveOrOpenBlob: (blob: Blob, fileName: string) => void; + browserLanguage: string; + } +} + +export {}; diff --git a/web/src/utils/calculate.ts b/web/src/utils/calculate.ts new file mode 100644 index 0000000000000000000000000000000000000000..7f23d355825d3303fc22443c0f42113491ab11ce --- /dev/null +++ b/web/src/utils/calculate.ts @@ -0,0 +1,23 @@ +/** + * @description 计算 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +import { isNumber, isString } from "./is"; + +/** + * 处理css单位 + * */ +export function cssUnit(value: string | number, unit = "px") { + return isNumber(value) || (isString(value) && value.indexOf(unit as string) === -1) ? `${value}${unit}` : value; +} diff --git a/web/src/utils/color.ts b/web/src/utils/color.ts new file mode 100644 index 0000000000000000000000000000000000000000..dc1b02d7ad990a0e7d987ee7f60b8f765fb4cffb --- /dev/null +++ b/web/src/utils/color.ts @@ -0,0 +1,73 @@ +/** + * @description 颜色相关工具函数 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import { ElMessage } from "element-plus"; + +/** + * @description hex颜色转rgb颜色 + * @param {String} str 颜色值字符串 + * @returns {String} 返回处理后的颜色值 + */ +export function hexToRgb(str: any) { + let hexs: any = ""; + let reg = /^\#?[0-9A-Fa-f]{6}$/; + if (!reg.test(str)) return ElMessage.warning("输入错误的hex"); + str = str.replace("#", ""); + hexs = str.match(/../g); + for (let i = 0; i < 3; i++) hexs[i] = parseInt(hexs[i], 16); + return hexs; +} + +/** + * @description rgb颜色转Hex颜色 + * @param {*} r 代表红色 + * @param {*} g 代表绿色 + * @param {*} b 代表蓝色 + * @returns {String} 返回处理后的颜色值 + */ +export function rgbToHex(r: any, g: any, b: any) { + let reg = /^\d{1,3}$/; + if (!reg.test(r) || !reg.test(g) || !reg.test(b)) return ElMessage.warning("输入错误的rgb颜色值"); + let hexs = [r.toString(16), g.toString(16), b.toString(16)]; + for (let i = 0; i < 3; i++) if (hexs[i].length == 1) hexs[i] = `0${hexs[i]}`; + return `#${hexs.join("")}`; +} + +/** + * @description 加深颜色值 + * @param {String} color 颜色值字符串 + * @param {Number} level 加深的程度,限0-1之间 + * @returns {String} 返回处理后的颜色值 + */ +export function getDarkColor(color: string, level: number) { + let reg = /^\#?[0-9A-Fa-f]{6}$/; + if (!reg.test(color)) return ElMessage.warning("输入错误的hex颜色值"); + let rgb = hexToRgb(color); + for (let i = 0; i < 3; i++) rgb[i] = Math.round(20.5 * level + rgb[i] * (1 - level)); + return rgbToHex(rgb[0], rgb[1], rgb[2]); +} + +/** + * @description 变浅颜色值 + * @param {String} color 颜色值字符串 + * @param {Number} level 加深的程度,限0-1之间 + * @returns {String} 返回处理后的颜色值 + */ +export function getLightColor(color: string, level: number) { + let reg = /^\#?[0-9A-Fa-f]{6}$/; + if (!reg.test(color)) return ElMessage.warning("输入错误的hex颜色值"); + let rgb = hexToRgb(color); + for (let i = 0; i < 3; i++) rgb[i] = Math.round(255 * level + rgb[i] * (1 - level)); + return rgbToHex(rgb[0], rgb[1], rgb[2]); +} diff --git a/web/src/utils/eleValidate.ts b/web/src/utils/eleValidate.ts new file mode 100644 index 0000000000000000000000000000000000000000..2bfb7ffd56e7b065b1da128fe39b10361b8d4a08 --- /dev/null +++ b/web/src/utils/eleValidate.ts @@ -0,0 +1,27 @@ +/** + * @description Element 常用表单校验规则 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +/** + * @rule 手机号 + */ +export function checkPhoneNumber(rule: any, value: any, callback: any) { + const regexp = /^(((13[0-9]{1})|(15[0-9]{1})|(16[0-9]{1})|(17[3-8]{1})|(18[0-9]{1})|(19[0-9]{1})|(14[5-7]{1}))+\d{8})$/; + if (value === "") callback("请输入手机号码"); + if (!regexp.test(value)) { + callback(new Error("请输入正确的手机号码")); + } else { + return callback(); + } +} diff --git a/web/src/utils/errorHandler.ts b/web/src/utils/errorHandler.ts new file mode 100644 index 0000000000000000000000000000000000000000..45409e64fd4cd43da2c8904e0c9f632fa7cce536 --- /dev/null +++ b/web/src/utils/errorHandler.ts @@ -0,0 +1,42 @@ +/** + * @description 全局代码错误捕捉 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import { ElNotification } from "element-plus"; + +/** + * @description 全局代码错误捕捉 + * */ +const errorHandler = (error: any) => { + // 过滤 HTTP 请求错误 + if (error.status || error.status == 0) return false; + let errorMap: { [key: string]: string } = { + InternalError: "Javascript引擎内部错误", + ReferenceError: "未找到对象", + TypeError: "使用了错误的类型或对象", + RangeError: "使用内置对象时,参数超范围", + SyntaxError: "语法错误", + EvalError: "错误的使用了Eval", + URIError: "URI错误" + }; + let errorName = errorMap[error.name] || "未知错误"; + ElNotification({ + title: errorName, + message: error, + type: "error", + duration: 3000 + }); + console.log("[ error ] >", error); +}; + +export default errorHandler; diff --git a/web/src/utils/formRules.ts b/web/src/utils/formRules.ts new file mode 100644 index 0000000000000000000000000000000000000000..ffc762dba1c37ed846609a924fecc0cc6fe189f7 --- /dev/null +++ b/web/src/utils/formRules.ts @@ -0,0 +1,20 @@ +/** + * @description 表单验证规则 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +/** 必填 */ +export const required = (message: string, trigger = ["blur", "change"]) => ({ + required: true, + message, + trigger +}); diff --git a/web/src/utils/index.ts b/web/src/utils/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..5419e1acdfcf1c8d85931fc6afebbbc74f490e06 --- /dev/null +++ b/web/src/utils/index.ts @@ -0,0 +1,325 @@ +/** + * @description utils + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ +import { isArray } from "@/utils/is"; +import { FieldNamesProps } from "@/components/ProTable/interface"; + +const mode = import.meta.env.VITE_ROUTER_MODE; + +/** + * @description 获取localStorage + * @param {String} key Storage名称 + * @returns {String} + */ +export function localGet(key: string) { + const value = window.localStorage.getItem(key); + try { + return JSON.parse(window.localStorage.getItem(key) as string); + } catch (error) { + return value; + } +} + +/** + * @description 存储localStorage + * @param {String} key Storage名称 + * @param {*} value Storage值 + * @returns {void} + */ +export function localSet(key: string, value: any) { + window.localStorage.setItem(key, JSON.stringify(value)); +} + +/** + * @description 清除localStorage + * @param {String} key Storage名称 + * @returns {void} + */ +export function localRemove(key: string) { + window.localStorage.removeItem(key); +} + +/** + * @description 清除所有localStorage + * @returns {void} + */ +export function localClear() { + window.localStorage.clear(); +} + +/** + * @description 判断数据类型 + * @param {*} val 需要判断类型的数据 + * @returns {String} + */ +export function isType(val: any) { + if (val === null) return "null"; + if (typeof val !== "object") return typeof val; + else return Object.prototype.toString.call(val).slice(8, -1).toLocaleLowerCase(); +} + +/** + * @description 生成唯一 uuid + * @returns {String} + */ +export function generateUUID() { + let uuid = ""; + for (let i = 0; i < 32; i++) { + let random = (Math.random() * 16) | 0; + if (i === 8 || i === 12 || i === 16 || i === 20) uuid += "-"; + uuid += (i === 12 ? 4 : i === 16 ? (random & 3) | 8 : random).toString(16); + } + return uuid; +} + +/** + * 判断两个对象是否相同 + * @param {Object} a 要比较的对象一 + * @param {Object} b 要比较的对象二 + * @returns {Boolean} 相同返回 true,反之 false + */ +export function isObjectValueEqual(a: { [key: string]: any }, b: { [key: string]: any }) { + if (!a || !b) return false; + let aProps = Object.getOwnPropertyNames(a); + let bProps = Object.getOwnPropertyNames(b); + if (aProps.length != bProps.length) return false; + for (let i = 0; i < aProps.length; i++) { + let propName = aProps[i]; + let propA = a[propName]; + let propB = b[propName]; + if (!b.hasOwnProperty(propName)) return false; + if (propA instanceof Object) { + if (!isObjectValueEqual(propA, propB)) return false; + } else if (propA !== propB) { + return false; + } + } + return true; +} + +/** + * @description 生成随机数 + * @param {Number} min 最小值 + * @param {Number} max 最大值 + * @returns {Number} + */ +export function randomNum(min: number, max: number): number { + let num = Math.floor(Math.random() * (min - max) + max); + return num; +} + +/** + * @description 获取当前时间对应的提示语 + * @returns {String} + */ +export function getTimeState() { + let timeNow = new Date(); + let hours = timeNow.getHours(); + if (hours >= 6 && hours <= 10) return `早上好 ⛅`; + if (hours >= 10 && hours <= 14) return `中午好 🌞`; + if (hours >= 14 && hours <= 18) return `下午好 🌞`; + if (hours >= 18 && hours <= 24) return `晚上好 🌛`; + if (hours >= 0 && hours <= 6) return `凌晨好 🌛`; +} + +/** + * @description 获取浏览器默认语言 + * @returns {String} + */ +export function getBrowserLang() { + let browserLang = navigator.language ? navigator.language : navigator.browserLanguage; + let defaultBrowserLang = ""; + if (["cn", "zh", "zh-cn"].includes(browserLang.toLowerCase())) { + defaultBrowserLang = "zh"; + } else { + defaultBrowserLang = "en"; + } + return defaultBrowserLang; +} + +/** + * @description 获取不同路由模式所对应的 url + params + * @returns {String} + */ +export function getUrlWithParams() { + const url = { + hash: location.hash.substring(1), + history: location.pathname + location.search + }; + return url[mode]; +} + +/** + * @description 使用递归扁平化菜单,方便添加动态路由 + * @param {Array} menuList 菜单列表 + * @returns {Array} + */ +export function getFlatMenuList(menuList: Menu.MenuOptions[]): Menu.MenuOptions[] { + let newMenuList: Menu.MenuOptions[] = JSON.parse(JSON.stringify(menuList)); + return newMenuList.flatMap(item => [item, ...(item.children ? getFlatMenuList(item.children) : [])]); +} + +/** + * @description 使用递归过滤出需要渲染在左侧菜单的列表 (需剔除 isHide == true 的菜单) + * @param {Array} menuList 菜单列表 + * @returns {Array} + * */ +export function getShowMenuList(menuList: Menu.MenuOptions[]) { + let newMenuList: Menu.MenuOptions[] = JSON.parse(JSON.stringify(menuList)); + return newMenuList.filter(item => { + item.children?.length && (item.children = getShowMenuList(item.children)); + return !item.meta?.isHide; + }); +} + +/** + * @description 使用递归找出所有面包屑存储到 pinia/vuex 中 + * @param {Array} menuList 菜单列表 + * @param {Array} parent 父级菜单 + * @param {Object} result 处理后的结果 + * @returns {Object} + */ +export const getAllBreadcrumbList = (menuList: Menu.MenuOptions[], parent = [], result: { [key: string]: any } = {}) => { + for (const item of menuList) { + result[item.path] = [...parent, item]; + if (item.children) getAllBreadcrumbList(item.children, result[item.path], result); + } + return result; +}; + +/** + * @description 使用递归处理路由菜单 path,生成一维数组 (第一版本地路由鉴权会用到,该函数暂未使用) + * @param {Array} menuList 所有菜单列表 + * @param {Array} menuPathArr 菜单地址的一维数组 ['**','**'] + * @returns {Array} + */ +export function getMenuListPath(menuList: Menu.MenuOptions[], menuPathArr: string[] = []): string[] { + for (const item of menuList) { + if (typeof item === "object" && item.path) menuPathArr.push(item.path); + if (item.children?.length) getMenuListPath(item.children, menuPathArr); + } + return menuPathArr; +} + +/** + * @description 递归查询当前 path 所对应的菜单对象 (该函数暂未使用) + * @param {Array} menuList 菜单列表 + * @param {String} path 当前访问地址 + * @returns {Object | null} + */ +export function findMenuByPath(menuList: Menu.MenuOptions[], path: string): Menu.MenuOptions | null { + for (const item of menuList) { + if (item.path === path) return item; + if (item.children) { + const res = findMenuByPath(item.children, path); + if (res) return res; + } + } + return null; +} + +/** + * @description 使用递归过滤需要缓存的菜单 name (该函数暂未使用) + * @param {Array} menuList 所有菜单列表 + * @param {Array} keepAliveNameArr 缓存的菜单 name ['**','**'] + * @returns {Array} + * */ +export function getKeepAliveRouterName(menuList: Menu.MenuOptions[], keepAliveNameArr: string[] = []) { + menuList.forEach(item => { + item.meta.isKeepAlive && item.name && keepAliveNameArr.push(item.name); + item.children?.length && getKeepAliveRouterName(item.children, keepAliveNameArr); + }); + return keepAliveNameArr; +} + +/** + * @description 格式化表格单元格默认值 (el-table-column) + * @param {Number} row 行 + * @param {Number} col 列 + * @param {*} callValue 当前单元格值 + * @returns {String} + * */ +export function formatTableColumn(row: number, col: number, callValue: any) { + // 如果当前值为数组,使用 / 拼接(根据需求自定义) + if (isArray(callValue)) return callValue.length ? callValue.join(" / ") : "--"; + return callValue ?? "--"; +} + +/** + * @description 处理 ProTable 值为数组 || 无数据 + * @param {*} callValue 需要处理的值 + * @returns {String} + * */ +export function formatValue(callValue: any) { + // 如果当前值为数组,使用 / 拼接(根据需求自定义) + if (isArray(callValue)) return callValue.length ? callValue.join(" / ") : "--"; + return callValue ?? "--"; +} + +/** + * @description 处理 prop 为多级嵌套的情况,返回的数据 (列如: prop: user.name) + * @param {Object} row 当前行数据 + * @param {String} prop 当前 prop + * @returns {*} + * */ +export function handleRowAccordingToProp(row: { [key: string]: any }, prop: string) { + if (!prop.includes(".")) return row[prop] ?? "--"; + prop.split(".").forEach(item => (row = row[item] ?? "--")); + return row; +} + +/** + * @description 处理 prop,当 prop 为多级嵌套时 ==> 返回最后一级 prop + * @param {String} prop 当前 prop + * @returns {String} + * */ +export function handleProp(prop: string) { + const propArr = prop.split("."); + if (propArr.length == 1) return prop; + return propArr[propArr.length - 1]; +} + +/** + * @description 根据枚举列表查询当需要的数据(如果指定了 label 和 value 的 key值,会自动识别格式化) + * @param {String} callValue 当前单元格值 + * @param {Array} enumData 字典列表 + * @param {Array} fieldNames label && value && children 的 key 值 + * @param {String} type 过滤类型(目前只有 tag) + * @returns {String} + * */ +export function filterEnum(callValue: any, enumData?: any, fieldNames?: FieldNamesProps, type?: "tag") { + const value = fieldNames?.value ?? "value"; + const label = fieldNames?.label ?? "label"; + const children = fieldNames?.children ?? "children"; + let filterData: { [key: string]: any } = {}; + // 判断 enumData 是否为数组 + if (Array.isArray(enumData)) filterData = findItemNested(enumData, callValue, value, children); + // 判断是否输出的结果为 tag 类型 + if (type == "tag") { + return filterData?.tagType ? filterData.tagType : ""; + } else { + return filterData ? filterData[label] : "--"; + } +} + +/** + * @description 递归查找 callValue 对应的 enum 值 + * */ +export function findItemNested(enumData: any, callValue: any, value: string, children: string) { + return enumData.reduce((accumulator: any, current: any) => { + if (accumulator) return accumulator; + if (current[value] === callValue) return current; + if (current[children]) return findItemNested(current[children], callValue, value, children); + }, null); +} diff --git a/web/src/utils/is/index.ts b/web/src/utils/is/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..5678491b549ec93ee1afbadaeee39963fc03b6f7 --- /dev/null +++ b/web/src/utils/is/index.ts @@ -0,0 +1,125 @@ +/** + * @description: 判断值是否未某个类型 + */ +export function is(val: unknown, type: string) { + return Object.prototype.toString.call(val) === `[object ${type}]`; +} + +/** + * @description: 是否为函数 + */ +export function isFunction(val: unknown): val is T { + return is(val, "Function"); +} + +/** + * @description: 是否已定义 + */ +export const isDef = (val?: T): val is T => { + return typeof val !== "undefined"; +}; + +/** + * @description: 是否未定义 + */ +export const isUnDef = (val?: T): val is T => { + return !isDef(val); +}; + +/** + * @description: 是否为对象 + */ +export const isObject = (val: any): val is Record => { + return val !== null && is(val, "Object"); +}; + +/** + * @description: 是否为时间 + */ +export function isDate(val: unknown): val is Date { + return is(val, "Date"); +} + +/** + * @description: 是否为数值 + */ +export function isNumber(val: unknown): val is number { + return is(val, "Number"); +} + +/** + * @description: 是否为AsyncFunction + */ +export function isAsyncFunction(val: unknown): val is Promise { + return is(val, "AsyncFunction"); +} + +/** + * @description: 是否为promise + */ +export function isPromise(val: unknown): val is Promise { + return is(val, "Promise") && isObject(val) && isFunction(val.then) && isFunction(val.catch); +} + +/** + * @description: 是否为字符串 + */ +export function isString(val: unknown): val is string { + return is(val, "String"); +} + +/** + * @description: 是否为boolean类型 + */ +export function isBoolean(val: unknown): val is boolean { + return is(val, "Boolean"); +} + +/** + * @description: 是否为数组 + */ +export function isArray(val: any): val is Array { + return val && Array.isArray(val); +} + +/** + * @description: 是否客户端 + */ +export const isClient = () => { + return typeof window !== "undefined"; +}; + +/** + * @description: 是否为浏览器 + */ +export const isWindow = (val: any): val is Window => { + return typeof window !== "undefined" && is(val, "Window"); +}; + +/** + * @description: 是否为 element 元素 + */ +export const isElement = (val: unknown): val is Element => { + return isObject(val) && !!val.tagName; +}; + +/** + * @description: 是否为 null + */ +export function isNull(val: unknown): val is null { + return val === null; +} + +/** + * @description: 是否为 null || undefined + */ +export function isNullOrUnDef(val: unknown): val is null | undefined { + return isUnDef(val) || isNull(val); +} + +/** + * @description: 是否为 16 进制颜色 + */ +export const isHexColor = (str: string) => { + return /^#?([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/.test(str); +}; diff --git a/web/src/utils/mittBus.ts b/web/src/utils/mittBus.ts new file mode 100644 index 0000000000000000000000000000000000000000..1ab1228d9e5d4640caa46762c87b57a28ba924d9 --- /dev/null +++ b/web/src/utils/mittBus.ts @@ -0,0 +1,5 @@ +import mitt from "mitt"; + +const mittBus = mitt(); + +export default mittBus; diff --git a/web/src/utils/serviceDict.ts b/web/src/utils/serviceDict.ts new file mode 100644 index 0000000000000000000000000000000000000000..a9d88942b7017568a66080693ce00cf43407f499 --- /dev/null +++ b/web/src/utils/serviceDict.ts @@ -0,0 +1,17 @@ +// ? 系统全局字典 + +/** + * @description:用户性别 + */ +export const genderType = [ + { label: "男", value: 1 }, + { label: "女", value: 2 } +]; + +/** + * @description:用户状态 + */ +export const userStatus = [ + { label: "启用", value: 1 }, + { label: "禁用", value: 0 } +]; diff --git a/web/src/utils/smCrypto.ts b/web/src/utils/smCrypto.ts new file mode 100644 index 0000000000000000000000000000000000000000..2c04f77b3891e90f37da9a5741c0b24abb562b50 --- /dev/null +++ b/web/src/utils/smCrypto.ts @@ -0,0 +1,30 @@ +/** + * @description smCrypto 加密解密工具 + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +import smCrypto from "sm-crypto"; +const { sm2 } = smCrypto; +const cipherMode = 0; // 1 - C1C3C2,0 - C1C2C3,默认为1 +const publicKey = + "04BD62406DF6789B1FBE8C457AECAE6D7C806CDB39316F190519905C24DF395E8952C47798D76ADECF8CA28C935702AFCDD9B17DE77121FA6448F0EDEFBD8365D6"; + +/** + * 国密加解密工具类 + */ +export default { + // SM2加密 + doSm2Encrypt(msgString: string) { + return sm2.doEncrypt(msgString, publicKey, cipherMode); + } +}; diff --git a/web/src/utils/svg.ts b/web/src/utils/svg.ts new file mode 100644 index 0000000000000000000000000000000000000000..c4d92c326cb99ad1d1c0613ff1e8fad929ea1c03 --- /dev/null +++ b/web/src/utils/svg.ts @@ -0,0 +1,26 @@ +/** + * @description Svg + * @license Apache License Version 2.0 + * @Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/dotnetmoyu/SimpleAdmin + */ + +/** Loading Svg */ +export const loadingSvg = ` + +`; diff --git a/web/src/views/about/index.vue b/web/src/views/about/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..fe41e7202f392dfd9cb64d514c513a6e17d93bc9 --- /dev/null +++ b/web/src/views/about/index.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/web/src/views/biz/organization/org/components/copy.vue b/web/src/views/biz/organization/org/components/copy.vue new file mode 100644 index 0000000000000000000000000000000000000000..bb9a5f7d168568f3fbfbf1f6547d6cc20a98e5a1 --- /dev/null +++ b/web/src/views/biz/organization/org/components/copy.vue @@ -0,0 +1,104 @@ + + + + + + diff --git a/web/src/views/biz/organization/org/components/form.vue b/web/src/views/biz/organization/org/components/form.vue new file mode 100644 index 0000000000000000000000000000000000000000..1bfb682eca1b1f85042da2624ab3d12b61dacbcc --- /dev/null +++ b/web/src/views/biz/organization/org/components/form.vue @@ -0,0 +1,157 @@ + + + + + + diff --git a/web/src/views/biz/organization/org/index.vue b/web/src/views/biz/organization/org/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..0fed2afb5f63ac2b975a4804a4d156db372e2163 --- /dev/null +++ b/web/src/views/biz/organization/org/index.vue @@ -0,0 +1,162 @@ + + + + + + diff --git a/web/src/views/biz/organization/position/components/form.vue b/web/src/views/biz/organization/position/components/form.vue new file mode 100644 index 0000000000000000000000000000000000000000..5beeeeade29f5ba9619aa5e49b86a012f3f300bd --- /dev/null +++ b/web/src/views/biz/organization/position/components/form.vue @@ -0,0 +1,122 @@ + + + + + + diff --git a/web/src/views/biz/organization/position/index.vue b/web/src/views/biz/organization/position/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..35568ecb517a6b172013f82304db09e5a12fcc44 --- /dev/null +++ b/web/src/views/biz/organization/position/index.vue @@ -0,0 +1,141 @@ + + + + + + diff --git a/web/src/views/biz/organization/role/components/dataScopeSelector.vue b/web/src/views/biz/organization/role/components/dataScopeSelector.vue new file mode 100644 index 0000000000000000000000000000000000000000..42120e63ab89a7998c737a23ae82772d6354861d --- /dev/null +++ b/web/src/views/biz/organization/role/components/dataScopeSelector.vue @@ -0,0 +1,118 @@ + + + + + + diff --git a/web/src/views/biz/organization/role/components/form.vue b/web/src/views/biz/organization/role/components/form.vue new file mode 100644 index 0000000000000000000000000000000000000000..c2c8fd625f8e885b2f87de7b97b55acd0d4919d4 --- /dev/null +++ b/web/src/views/biz/organization/role/components/form.vue @@ -0,0 +1,118 @@ + + + + + + diff --git a/web/src/views/biz/organization/role/components/grantResource.vue b/web/src/views/biz/organization/role/components/grantResource.vue new file mode 100644 index 0000000000000000000000000000000000000000..fcd39b68c75223545262a471d2eb6d386641bbc2 --- /dev/null +++ b/web/src/views/biz/organization/role/components/grantResource.vue @@ -0,0 +1,414 @@ + + + + + + diff --git a/web/src/views/biz/organization/role/index.vue b/web/src/views/biz/organization/role/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..7b826035b9cbd4183c05f69a12d2e3318b4782cd --- /dev/null +++ b/web/src/views/biz/organization/role/index.vue @@ -0,0 +1,222 @@ + + + + + + diff --git a/web/src/views/biz/organization/user/components/form/form_basic.vue b/web/src/views/biz/organization/user/components/form/form_basic.vue new file mode 100644 index 0000000000000000000000000000000000000000..d9132934e03339a42a317f11633ed4096ab6a3ca --- /dev/null +++ b/web/src/views/biz/organization/user/components/form/form_basic.vue @@ -0,0 +1,169 @@ + + + + + + diff --git a/web/src/views/biz/organization/user/components/form/form_more.vue b/web/src/views/biz/organization/user/components/form/form_more.vue new file mode 100644 index 0000000000000000000000000000000000000000..8d4944cbb2047f058588063a37eb09578e521f31 --- /dev/null +++ b/web/src/views/biz/organization/user/components/form/form_more.vue @@ -0,0 +1,145 @@ + + + + + + diff --git a/web/src/views/biz/organization/user/components/form/index.vue b/web/src/views/biz/organization/user/components/form/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..d0b7cf03d5179aa2ee1ef309ef90b31c5b1c1c75 --- /dev/null +++ b/web/src/views/biz/organization/user/components/form/index.vue @@ -0,0 +1,111 @@ + + + + + + diff --git a/web/src/views/biz/organization/user/index.vue b/web/src/views/biz/organization/user/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..45022c32f42080465d99acea7c78ab0dd6c9776f --- /dev/null +++ b/web/src/views/biz/organization/user/index.vue @@ -0,0 +1,249 @@ + + + + + + diff --git a/web/src/views/home/index.scss b/web/src/views/home/index.scss new file mode 100644 index 0000000000000000000000000000000000000000..2507187b4072424a48919c3599f3f600617d232c --- /dev/null +++ b/web/src/views/home/index.scss @@ -0,0 +1,12 @@ +.home { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + .home-bg { + width: 70%; + max-width: 1200px; + margin-bottom: 20px; + } +} diff --git a/web/src/views/home/index.vue b/web/src/views/home/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..2dfcda97df650de0be88878847a47f9587017596 --- /dev/null +++ b/web/src/views/home/index.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/web/src/views/link/gitee/index.scss b/web/src/views/link/gitee/index.scss new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/web/src/views/link/gitee/index.vue b/web/src/views/link/gitee/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..230013664060dc023673bf77a994f091b1b62332 --- /dev/null +++ b/web/src/views/link/gitee/index.vue @@ -0,0 +1,14 @@ + + + + + diff --git a/web/src/views/login/components/phone-login/index.vue b/web/src/views/login/components/phone-login/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..6866b8769861108bbc1577386d3a22a4d1374954 --- /dev/null +++ b/web/src/views/login/components/phone-login/index.vue @@ -0,0 +1,224 @@ + + + + + diff --git a/web/src/views/login/components/pwd-login/index.vue b/web/src/views/login/components/pwd-login/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..92520390c090875db01c8904f4bd6b61d88f22a7 --- /dev/null +++ b/web/src/views/login/components/pwd-login/index.vue @@ -0,0 +1,168 @@ + + + + + + diff --git a/web/src/views/login/index.scss b/web/src/views/login/index.scss new file mode 100644 index 0000000000000000000000000000000000000000..d25383110ccb548b04600992ec94d2b79032fea7 --- /dev/null +++ b/web/src/views/login/index.scss @@ -0,0 +1,93 @@ +.login-container { + height: 100%; + min-height: 550px; + background-color: #eeeeee; + background-image: url("@/assets/images/login_bg.svg"); + background-size: 100% 100%; + background-size: cover; + .login-box { + position: relative; + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: space-around; + width: 96.5%; + height: 94%; + padding: 0 50px; + background-color: rgb(255 255 255 / 80%); + border-radius: 10px; + .dark { + position: absolute; + top: 13px; + right: 18px; + } + .login-left { + width: 800px; + margin-right: 10px; + .login-left-img { + width: 100%; + height: 100%; + } + } + .login-form { + position: relative; + width: 420px; + padding: 50px 40px 45px; + background-color: var(--el-bg-color); + border-radius: 10px; + box-shadow: rgb(0 0 0 / 10%) 0 2px 10px 2px; + .login-logo { + display: flex; + align-items: center; + justify-content: left; + margin-bottom: 15px; + .login-icon { + width: 60px; + height: 52px; + } + .logo-text { + padding: 0 0 0 25px; + margin: 0; + font-size: 42px; + font-weight: bold; + color: #34495e; + white-space: nowrap; + } + } + .el-form-item { + margin-bottom: 20px; + } + .login-btn { + display: flex; + justify-content: space-between; + width: 100%; + margin-top: 30px; + white-space: nowrap; + .el-button { + width: 185px; + } + } + + /* 这是需要固定在右下角的元素的样式 */ + .fixed-corner { + position: absolute; + right: 0; + bottom: 0; + + /* 其余样式... */ + } + } + } +} + +@media screen and (width <= 1250px) { + .login-left { + display: none; + } +} + +@media screen and (width <= 600px) { + .login-form { + width: 97% !important; + } +} diff --git a/web/src/views/login/index.vue b/web/src/views/login/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..8a2d7e9a3fe073fcb2c24f5b92af6051a973dec0 --- /dev/null +++ b/web/src/views/login/index.vue @@ -0,0 +1,116 @@ + + + + + + diff --git a/web/src/views/sys/audit/oplog/components/columnChat.vue b/web/src/views/sys/audit/oplog/components/columnChat.vue new file mode 100644 index 0000000000000000000000000000000000000000..6feadc66f97762c78b5f330d971c41607068327e --- /dev/null +++ b/web/src/views/sys/audit/oplog/components/columnChat.vue @@ -0,0 +1,53 @@ + + + + + + diff --git a/web/src/views/sys/audit/oplog/components/detail.vue b/web/src/views/sys/audit/oplog/components/detail.vue new file mode 100644 index 0000000000000000000000000000000000000000..0ba52b8daeef3510a0f9170c6bb2ad83edce217f --- /dev/null +++ b/web/src/views/sys/audit/oplog/components/detail.vue @@ -0,0 +1,99 @@ + + + + + + diff --git a/web/src/views/sys/audit/oplog/components/pieChat.vue b/web/src/views/sys/audit/oplog/components/pieChat.vue new file mode 100644 index 0000000000000000000000000000000000000000..333eea88814ccc000e5ab83b62c1069b4e08db47 --- /dev/null +++ b/web/src/views/sys/audit/oplog/components/pieChat.vue @@ -0,0 +1,47 @@ + + + + + + diff --git a/web/src/views/sys/audit/oplog/index.vue b/web/src/views/sys/audit/oplog/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..546d8b503a3bc1f662318bf3da6000a19187bfc8 --- /dev/null +++ b/web/src/views/sys/audit/oplog/index.vue @@ -0,0 +1,127 @@ + + + + + + diff --git a/web/src/views/sys/audit/vislog/components/detail.vue b/web/src/views/sys/audit/vislog/components/detail.vue new file mode 100644 index 0000000000000000000000000000000000000000..dd4671f2c6fde35525f8bc3014f26c20abb864de --- /dev/null +++ b/web/src/views/sys/audit/vislog/components/detail.vue @@ -0,0 +1,65 @@ + + + + + + diff --git a/web/src/views/sys/audit/vislog/components/lineChat.vue b/web/src/views/sys/audit/vislog/components/lineChat.vue new file mode 100644 index 0000000000000000000000000000000000000000..d4287b72232e15dc06fb6a9d2d8946474d89306a --- /dev/null +++ b/web/src/views/sys/audit/vislog/components/lineChat.vue @@ -0,0 +1,74 @@ + + + + + + diff --git a/web/src/views/sys/audit/vislog/components/pieChat.vue b/web/src/views/sys/audit/vislog/components/pieChat.vue new file mode 100644 index 0000000000000000000000000000000000000000..de501cc2ff1dad66cfc99004d4abc4676015f885 --- /dev/null +++ b/web/src/views/sys/audit/vislog/components/pieChat.vue @@ -0,0 +1,47 @@ + + + + + + diff --git a/web/src/views/sys/audit/vislog/index.vue b/web/src/views/sys/audit/vislog/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..305672e8271719c40adfd3c60e5b97abb551bf21 --- /dev/null +++ b/web/src/views/sys/audit/vislog/index.vue @@ -0,0 +1,127 @@ + + + + + + diff --git a/web/src/views/sys/dev/message/components/detail.vue b/web/src/views/sys/dev/message/components/detail.vue new file mode 100644 index 0000000000000000000000000000000000000000..af063b4bceb0e05a94a141d932ccd7f44be4042e --- /dev/null +++ b/web/src/views/sys/dev/message/components/detail.vue @@ -0,0 +1,127 @@ + + + + + + diff --git a/web/src/views/sys/dev/message/components/form.vue b/web/src/views/sys/dev/message/components/form.vue new file mode 100644 index 0000000000000000000000000000000000000000..2336d0ac5e60c02182fe41cd1f1971cacdc9e44a --- /dev/null +++ b/web/src/views/sys/dev/message/components/form.vue @@ -0,0 +1,242 @@ + + + + + diff --git a/web/src/views/sys/dev/message/index.vue b/web/src/views/sys/dev/message/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..d0317d398f07bf7d024581bd4a4ee04d4db79348 --- /dev/null +++ b/web/src/views/sys/dev/message/index.vue @@ -0,0 +1,143 @@ + + + + + + diff --git a/web/src/views/sys/limit/button/components/batch.vue b/web/src/views/sys/limit/button/components/batch.vue new file mode 100644 index 0000000000000000000000000000000000000000..30959388dc53ca8994d11006f6ff5660b3b9b8c0 --- /dev/null +++ b/web/src/views/sys/limit/button/components/batch.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/web/src/views/sys/limit/button/components/form.vue b/web/src/views/sys/limit/button/components/form.vue new file mode 100644 index 0000000000000000000000000000000000000000..db9601773fdcf8df66ef5a057d47ef29e59a4083 --- /dev/null +++ b/web/src/views/sys/limit/button/components/form.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/web/src/views/sys/limit/button/index.vue b/web/src/views/sys/limit/button/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..c9dcf501cd9325f72042c14efbb03499c6cdf7e7 --- /dev/null +++ b/web/src/views/sys/limit/button/index.vue @@ -0,0 +1,142 @@ + + + + + + diff --git a/web/src/views/sys/limit/menu/components/changeModule.vue b/web/src/views/sys/limit/menu/components/changeModule.vue new file mode 100644 index 0000000000000000000000000000000000000000..8ae9e7396c3bd6c0b0594de4730f969800eaa7ab --- /dev/null +++ b/web/src/views/sys/limit/menu/components/changeModule.vue @@ -0,0 +1,94 @@ + + + + + + diff --git a/web/src/views/sys/limit/menu/components/form.vue b/web/src/views/sys/limit/menu/components/form.vue new file mode 100644 index 0000000000000000000000000000000000000000..cf54ce625ce04304cca1887ac5bfd5106bbfc85f --- /dev/null +++ b/web/src/views/sys/limit/menu/components/form.vue @@ -0,0 +1,219 @@ + + + + + + diff --git a/web/src/views/sys/limit/menu/index.vue b/web/src/views/sys/limit/menu/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..f355783c12214159b26494a484ed2a848af50528 --- /dev/null +++ b/web/src/views/sys/limit/menu/index.vue @@ -0,0 +1,219 @@ + + + + + + diff --git a/web/src/views/sys/limit/module/components/form.vue b/web/src/views/sys/limit/module/components/form.vue new file mode 100644 index 0000000000000000000000000000000000000000..e9ffd3dba98f8332de7edea86e296202b52668ac --- /dev/null +++ b/web/src/views/sys/limit/module/components/form.vue @@ -0,0 +1,122 @@ + + + + + diff --git a/web/src/views/sys/limit/module/index.vue b/web/src/views/sys/limit/module/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..3d0bdbc739d93a878ce57b98cb7276ebbcb15fe4 --- /dev/null +++ b/web/src/views/sys/limit/module/index.vue @@ -0,0 +1,103 @@ + + + + + + diff --git a/web/src/views/sys/limit/role/components/dataScopeSelector.vue b/web/src/views/sys/limit/role/components/dataScopeSelector.vue new file mode 100644 index 0000000000000000000000000000000000000000..c8791a94cc1045f2e31ec437be4c30512572a281 --- /dev/null +++ b/web/src/views/sys/limit/role/components/dataScopeSelector.vue @@ -0,0 +1,118 @@ + + + + + + diff --git a/web/src/views/sys/limit/role/components/form.vue b/web/src/views/sys/limit/role/components/form.vue new file mode 100644 index 0000000000000000000000000000000000000000..7bbd7d4877ea9d197e83a294b7e37f87bf6b0721 --- /dev/null +++ b/web/src/views/sys/limit/role/components/form.vue @@ -0,0 +1,125 @@ + + + + + + diff --git a/web/src/views/sys/limit/role/components/grantPermission.vue b/web/src/views/sys/limit/role/components/grantPermission.vue new file mode 100644 index 0000000000000000000000000000000000000000..97c356c21e1276b2897803b0a2df1b199b7b9c38 --- /dev/null +++ b/web/src/views/sys/limit/role/components/grantPermission.vue @@ -0,0 +1,239 @@ + + + + + + diff --git a/web/src/views/sys/limit/role/components/grantResource.vue b/web/src/views/sys/limit/role/components/grantResource.vue new file mode 100644 index 0000000000000000000000000000000000000000..ac3c3518929f438bae37517143a1489a55e66412 --- /dev/null +++ b/web/src/views/sys/limit/role/components/grantResource.vue @@ -0,0 +1,414 @@ + + + + + + diff --git a/web/src/views/sys/limit/role/index.vue b/web/src/views/sys/limit/role/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..2f070452788727d5e19716876192287bc484a723 --- /dev/null +++ b/web/src/views/sys/limit/role/index.vue @@ -0,0 +1,229 @@ + + + + + + diff --git a/web/src/views/sys/limit/spa/components/form.vue b/web/src/views/sys/limit/spa/components/form.vue new file mode 100644 index 0000000000000000000000000000000000000000..a5e9b13c451d534a3425c5b384bcc451d718ee72 --- /dev/null +++ b/web/src/views/sys/limit/spa/components/form.vue @@ -0,0 +1,183 @@ + + + + + diff --git a/web/src/views/sys/limit/spa/index.vue b/web/src/views/sys/limit/spa/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..2f7006d77da28f79bbb4d8487c4089215f085792 --- /dev/null +++ b/web/src/views/sys/limit/spa/index.vue @@ -0,0 +1,118 @@ + + + + + + diff --git a/web/src/views/sys/ops/config/components/mqttConfig/baseForm.vue b/web/src/views/sys/ops/config/components/mqttConfig/baseForm.vue new file mode 100644 index 0000000000000000000000000000000000000000..33169519c890fded65597730a7e825e2ec6d5144 --- /dev/null +++ b/web/src/views/sys/ops/config/components/mqttConfig/baseForm.vue @@ -0,0 +1,93 @@ + + + + + + diff --git a/web/src/views/sys/ops/config/components/mqttConfig/index.vue b/web/src/views/sys/ops/config/components/mqttConfig/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..0b4fdf47681446443fb4d81c443cd7535330dfc0 --- /dev/null +++ b/web/src/views/sys/ops/config/components/mqttConfig/index.vue @@ -0,0 +1,46 @@ + + + + + + diff --git a/web/src/views/sys/ops/config/components/otherConfig/form.vue b/web/src/views/sys/ops/config/components/otherConfig/form.vue new file mode 100644 index 0000000000000000000000000000000000000000..b0074105f8d51c70cdb13e6cb229f5e4190b5d65 --- /dev/null +++ b/web/src/views/sys/ops/config/components/otherConfig/form.vue @@ -0,0 +1,104 @@ + + + + + + diff --git a/web/src/views/sys/ops/config/components/otherConfig/index.vue b/web/src/views/sys/ops/config/components/otherConfig/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..e3b8bc16967300825bfd32eb2a749d10ae32761f --- /dev/null +++ b/web/src/views/sys/ops/config/components/otherConfig/index.vue @@ -0,0 +1,80 @@ + + + + + + diff --git a/web/src/views/sys/ops/config/components/safetyConfig/index.vue b/web/src/views/sys/ops/config/components/safetyConfig/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..bcc7814cc5aa039fe489837ed6f52517d2852d89 --- /dev/null +++ b/web/src/views/sys/ops/config/components/safetyConfig/index.vue @@ -0,0 +1,50 @@ + + + + + + diff --git a/web/src/views/sys/ops/config/components/safetyConfig/loginForm.vue b/web/src/views/sys/ops/config/components/safetyConfig/loginForm.vue new file mode 100644 index 0000000000000000000000000000000000000000..42020260c80c6edf773efbbb27c6e50d8fdc3e31 --- /dev/null +++ b/web/src/views/sys/ops/config/components/safetyConfig/loginForm.vue @@ -0,0 +1,119 @@ + + + + + + diff --git a/web/src/views/sys/ops/config/components/safetyConfig/pwdForm.vue b/web/src/views/sys/ops/config/components/safetyConfig/pwdForm.vue new file mode 100644 index 0000000000000000000000000000000000000000..74391819ee08614a211beb9ecccf9592d342dcb6 --- /dev/null +++ b/web/src/views/sys/ops/config/components/safetyConfig/pwdForm.vue @@ -0,0 +1,143 @@ + + + + + + diff --git a/web/src/views/sys/ops/config/components/sysBaseConfig.vue b/web/src/views/sys/ops/config/components/sysBaseConfig.vue new file mode 100644 index 0000000000000000000000000000000000000000..ffcdea6c3a6da6d935cd57a77f94f439d04920e4 --- /dev/null +++ b/web/src/views/sys/ops/config/components/sysBaseConfig.vue @@ -0,0 +1,307 @@ + + + + + + diff --git a/web/src/views/sys/ops/config/index.vue b/web/src/views/sys/ops/config/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..dc5a8ab26fba94aa41fef3851e3e4ec2b334277e --- /dev/null +++ b/web/src/views/sys/ops/config/index.vue @@ -0,0 +1,50 @@ + + + + + + diff --git a/web/src/views/sys/ops/dict/components/form.vue b/web/src/views/sys/ops/dict/components/form.vue new file mode 100644 index 0000000000000000000000000000000000000000..888b142a5d72b108f803b71fb30a45c1b1ed3860 --- /dev/null +++ b/web/src/views/sys/ops/dict/components/form.vue @@ -0,0 +1,117 @@ + + + + + + diff --git a/web/src/views/sys/ops/dict/index.vue b/web/src/views/sys/ops/dict/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..95a61fad247afd5de6e0813d5df85a47d23547fb --- /dev/null +++ b/web/src/views/sys/ops/dict/index.vue @@ -0,0 +1,216 @@ + + + + + + diff --git a/web/src/views/sys/organization/org/components/copy.vue b/web/src/views/sys/organization/org/components/copy.vue new file mode 100644 index 0000000000000000000000000000000000000000..a17a5fb58fe678ad16411d55896e86c89aebc1d8 --- /dev/null +++ b/web/src/views/sys/organization/org/components/copy.vue @@ -0,0 +1,105 @@ + + + + + + diff --git a/web/src/views/sys/organization/org/components/form.vue b/web/src/views/sys/organization/org/components/form.vue new file mode 100644 index 0000000000000000000000000000000000000000..faf767c59d4ff57a60f89ea990e61862e9b3feb8 --- /dev/null +++ b/web/src/views/sys/organization/org/components/form.vue @@ -0,0 +1,161 @@ + + + + + + diff --git a/web/src/views/sys/organization/org/index.vue b/web/src/views/sys/organization/org/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..1e040b76459bd733c1b536ceebdc90604e941191 --- /dev/null +++ b/web/src/views/sys/organization/org/index.vue @@ -0,0 +1,152 @@ + + + + + + diff --git a/web/src/views/sys/organization/position/components/form.vue b/web/src/views/sys/organization/position/components/form.vue new file mode 100644 index 0000000000000000000000000000000000000000..58f0a895502341efd7eaffc406ca95a48f3602a4 --- /dev/null +++ b/web/src/views/sys/organization/position/components/form.vue @@ -0,0 +1,125 @@ + + + + + + diff --git a/web/src/views/sys/organization/position/index.vue b/web/src/views/sys/organization/position/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..2897cf8f84d95cfa77777211485396969c362617 --- /dev/null +++ b/web/src/views/sys/organization/position/index.vue @@ -0,0 +1,134 @@ + + + + + + diff --git a/web/src/views/sys/organization/user/components/form/form_basic.vue b/web/src/views/sys/organization/user/components/form/form_basic.vue new file mode 100644 index 0000000000000000000000000000000000000000..cb73e784071fc449d8f88c03acb59b722220ccc6 --- /dev/null +++ b/web/src/views/sys/organization/user/components/form/form_basic.vue @@ -0,0 +1,167 @@ + + + + + + diff --git a/web/src/views/sys/organization/user/components/form/form_more.vue b/web/src/views/sys/organization/user/components/form/form_more.vue new file mode 100644 index 0000000000000000000000000000000000000000..399901c1c29cecc84fb22b01da9dbbf58f50d252 --- /dev/null +++ b/web/src/views/sys/organization/user/components/form/form_more.vue @@ -0,0 +1,145 @@ + + + + + + diff --git a/web/src/views/sys/organization/user/components/form/index.vue b/web/src/views/sys/organization/user/components/form/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..1d3c80402ddfaea93531fb1683e234babafb9d36 --- /dev/null +++ b/web/src/views/sys/organization/user/components/form/index.vue @@ -0,0 +1,111 @@ + + + + + + diff --git a/web/src/views/sys/organization/user/index.vue b/web/src/views/sys/organization/user/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..bbd87b0c7a294298e207c37c1b1f6c0b5c63b9a8 --- /dev/null +++ b/web/src/views/sys/organization/user/index.vue @@ -0,0 +1,251 @@ + + + + + + diff --git a/web/src/views/userCenter/components/accountBasic.vue b/web/src/views/userCenter/components/accountBasic.vue new file mode 100644 index 0000000000000000000000000000000000000000..27870c9c27cf72cafcf4f1f0b0e024861568ef74 --- /dev/null +++ b/web/src/views/userCenter/components/accountBasic.vue @@ -0,0 +1,94 @@ + + + + + + diff --git a/web/src/views/userCenter/components/accountBind.vue b/web/src/views/userCenter/components/accountBind.vue new file mode 100644 index 0000000000000000000000000000000000000000..d11c0b36947b51b784e517a1ef05ef177f9d19b5 --- /dev/null +++ b/web/src/views/userCenter/components/accountBind.vue @@ -0,0 +1,138 @@ + + + + + + diff --git a/web/src/views/userCenter/components/myMessage.vue b/web/src/views/userCenter/components/myMessage.vue new file mode 100644 index 0000000000000000000000000000000000000000..afafef1f64594bc0a8c1791708ae66d50412bb5c --- /dev/null +++ b/web/src/views/userCenter/components/myMessage.vue @@ -0,0 +1,190 @@ + + + + + + diff --git a/web/src/views/userCenter/components/myMessageDetail.vue b/web/src/views/userCenter/components/myMessageDetail.vue new file mode 100644 index 0000000000000000000000000000000000000000..c3ef6a9a20244e6411c000dfc7437c0449cd63cf --- /dev/null +++ b/web/src/views/userCenter/components/myMessageDetail.vue @@ -0,0 +1,68 @@ + + + + + + diff --git a/web/src/views/userCenter/components/shortcutSetting.vue b/web/src/views/userCenter/components/shortcutSetting.vue new file mode 100644 index 0000000000000000000000000000000000000000..c8f575276889f6edf6d518db3e71c03b678bc192 --- /dev/null +++ b/web/src/views/userCenter/components/shortcutSetting.vue @@ -0,0 +1,45 @@ + + + + + + diff --git a/web/src/views/userCenter/components/signName.vue b/web/src/views/userCenter/components/signName.vue new file mode 100644 index 0000000000000000000000000000000000000000..657c1a7678c0b5098638779bf3615c35403b21ff --- /dev/null +++ b/web/src/views/userCenter/components/signName.vue @@ -0,0 +1,119 @@ + + + + + + diff --git a/web/src/views/userCenter/components/updatePassword.vue b/web/src/views/userCenter/components/updatePassword.vue new file mode 100644 index 0000000000000000000000000000000000000000..6ee2bfea0945ba73a67ba21a5d7edce62fb55688 --- /dev/null +++ b/web/src/views/userCenter/components/updatePassword.vue @@ -0,0 +1,96 @@ + + + + + + diff --git a/web/src/views/userCenter/index.vue b/web/src/views/userCenter/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..896b6bad2ebfad519c23040d8af0d4725c54bbec --- /dev/null +++ b/web/src/views/userCenter/index.vue @@ -0,0 +1,237 @@ + + + + + + diff --git a/web/src/vite-env.d.ts b/web/src/vite-env.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..4af4bfd4ab7d2d26d71f88f15a46fbcddbe2c623 --- /dev/null +++ b/web/src/vite-env.d.ts @@ -0,0 +1,8 @@ +/// + +declare module "*.vue" { + import type { DefineComponent } from "vue"; + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types + const component: DefineComponent<{}, {}, any>; + export default component; +} diff --git a/web/tsconfig.json b/web/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..2b6a5d4abc60adfbb0dcd6d203b28d1c200b9e9f --- /dev/null +++ b/web/tsconfig.json @@ -0,0 +1,43 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Node", + "types": ["vite/client", "element-plus/global"], + + /* Strict Type-Checking Options */ + "strict": true /* Enable all strict type-checking options. */, + "noImplicitAny": false /* Raise error on expressions and declarations with an implied 'any' type. */, + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + "noImplicitThis": false /* Raise error on 'this' expressions with an implied 'any' type. */, + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + "jsx": "preserve", + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ESNext", "DOM"], + "skipLibCheck": true, + "noEmit": true, + "baseUrl": "./", + "paths": { + "@": ["src"], + "@/*": ["src/*"] + } + }, + "include": [ + "src/**/*.ts", + "src/**/*.d.ts", + "src/**/*.tsx", + "src/**/*.vue", + "build/**/*.ts", + "build/**/*.d.ts", + "vite.config.ts", + "components.d.ts" + ], + "exclude": ["node_modules", "dist", "**/*.js"] +} diff --git a/web/uno.config.ts b/web/uno.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..4c6a2aa0f4aad402153477db254342839a8d5c8b --- /dev/null +++ b/web/uno.config.ts @@ -0,0 +1,81 @@ +import { defineConfig, presetUno, transformerDirectives } from "unocss"; + +export default defineConfig({ + content: { + pipeline: { + exclude: ["node_modules", "dist", ".git", ".husky", ".vscode", "public", "build"] + } + }, + presets: [presetUno({ dark: "class" })], + transformers: [transformerDirectives()], + shortcuts: { + "wh-full": "w-full h-full", + "flex-center": "flex justify-center items-center", + "flex-col-center": "flex-center flex-col", + "flex-x-center": "flex justify-center", + "flex-y-center": "flex items-center", + "i-flex-center": "inline-flex justify-center items-center", + "i-flex-x-center": "inline-flex justify-center", + "i-flex-y-center": "inline-flex items-center", + "flex-col": "flex flex-col", + "flex-col-stretch": "flex-col items-stretch", + "i-flex-col": "inline-flex flex-col", + "i-flex-col-stretch": "i-flex-col items-stretch", + "flex-1-hidden": "flex-1 overflow-hidden", + "absolute-lt": "absolute left-0 top-0", + "absolute-lb": "absolute left-0 bottom-0", + "absolute-rt": "absolute right-0 top-0", + "absolute-rb": "absolute right-0 bottom-0", + "absolute-tl": "absolute-lt", + "absolute-tr": "absolute-rt", + "absolute-bl": "absolute-lb", + "absolute-br": "absolute-rb", + "absolute-center": "absolute-lt flex-center wh-full", + "fixed-lt": "fixed left-0 top-0", + "fixed-lb": "fixed left-0 bottom-0", + "fixed-rt": "fixed right-0 top-0", + "fixed-rb": "fixed right-0 bottom-0", + "fixed-tl": "fixed-lt", + "fixed-tr": "fixed-rt", + "fixed-bl": "fixed-lb", + "fixed-br": "fixed-rb", + "fixed-center": "fixed-lt flex-center wh-full", + "nowrap-hidden": "whitespace-nowrap overflow-hidden", + "ellipsis-text": "nowrap-hidden text-ellipsis", + "transition-base": "transition-all duration-300 ease-in-out" + }, + theme: { + colors: { + primary: "rgb(var(--primary-color))", + primary_hover: "rgb(var(--primary-color-hover))", + primary_pressed: "rgb(var(--primary-color-pressed))", + primary_active: "rgba(var(--primary-color-active),0.1)", + primary_1: "rgb(var(--primary-color1))", + primary_2: "rgb(var(--primary-color2))", + primary_3: "rgb(var(--primary-color3))", + primary_4: "rgb(var(--primary-color4))", + primary_5: "rgb(var(--primary-color5))", + primary_6: "rgb(var(--primary-color6))", + primary_7: "rgb(var(--primary-color7))", + primary_8: "rgb(var(--primary-color8))", + primary_9: "rgb(var(--primary-color9))", + info: "rgb(var(--info-color))", + info_hover: "rgb(var(--info-color-hover))", + info_pressed: "rgb(var(--info-color-pressed))", + info_active: "rgb(var(--info-color-active),0.1)", + success: "rgb(var(--success-color))", + success_hover: "rgb(var(--success-color-hover))", + success_pressed: "rgb(var(--success-color-pressed))", + success_active: "rgb(var(--success-color-active),0.1)", + warning: "rgb(var(--warning-color))", + warning_hover: "rgb(var(--warning-color-hover))", + warning_pressed: "rgb(var(--warning-color-pressed))", + warning_active: "rgb(var(--warning-color-active),0.1)", + error: "rgb(var(--error-color))", + error_hover: "rgb(var(--error-color-hover))", + error_pressed: "rgb(var(--error-color-pressed))", + error_active: "rgb(var(--error-color-active),0.1)", + dark: "#141414" + } + } +}); diff --git a/web/vite.config.ts b/web/vite.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..d5a739d0d2e4837563febf192136267d5abce631 --- /dev/null +++ b/web/vite.config.ts @@ -0,0 +1,79 @@ +import { defineConfig, loadEnv, ConfigEnv, UserConfig } from "vite"; +import { resolve } from "path"; +import { wrapperEnv } from "./build/getEnv"; +import { createProxy } from "./build/proxy"; +import { createVitePlugins } from "./build/plugins"; +import pkg from "./package.json"; +import dayjs from "dayjs"; + +const { dependencies, devDependencies, name, version } = pkg; +const __APP_INFO__ = { + pkg: { dependencies, devDependencies, name, version }, + lastBuildTime: dayjs().format("YYYY-MM-DD HH:mm:ss") +}; + +// @see: https://vitejs.dev/config/ +export default defineConfig(({ mode }: ConfigEnv): UserConfig => { + const root = process.cwd(); + const env = loadEnv(mode, root); + const viteEnv = wrapperEnv(env); + + return { + base: viteEnv.VITE_PUBLIC_PATH, + root, + resolve: { + alias: { + "@": resolve(__dirname, "./src"), + "vue-i18n": "vue-i18n/dist/vue-i18n.cjs.js" + } + }, + define: { + __APP_INFO__: JSON.stringify(__APP_INFO__) + }, + css: { + preprocessorOptions: { + scss: { + additionalData: `@import "@/styles/var.scss";`, + api: "modern-compiler" // or "modern" + } + } + }, + server: { + host: "0.0.0.0", + port: viteEnv.VITE_PORT, + open: viteEnv.VITE_OPEN, + cors: true, + // Load proxy configuration from .env.development + proxy: createProxy(viteEnv.VITE_PROXY) + }, + plugins: createVitePlugins(viteEnv), + esbuild: { + pure: viteEnv.VITE_DROP_CONSOLE ? ["console.log", "debugger"] : [] + }, + build: { + outDir: "dist", + minify: "esbuild", + // esbuild 打包更快,但是不能去除 console.log,terser打包慢,但能去除 console.log + // minify: "terser", + // terserOptions: { + // compress: { + // drop_console: viteEnv.VITE_DROP_CONSOLE, + // drop_debugger: true + // } + // }, + sourcemap: false, + // 禁用 gzip 压缩大小报告,可略微减少打包时间 + reportCompressedSize: false, + // 规定触发警告的 chunk 大小 + chunkSizeWarningLimit: 2000, + rollupOptions: { + output: { + // Static resource classification and packaging + chunkFileNames: "assets/js/[name]-[hash].js", + entryFileNames: "assets/js/[name]-[hash].js", + assetFileNames: "assets/[ext]/[name]-[hash].[ext]" + } + } + } + }; +});