diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..d6aac6c3 --- /dev/null +++ b/LICENSE @@ -0,0 +1,53 @@ +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: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and +You must cause any modified files to carry prominent notices stating that You changed the files; and +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 +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 \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..7a7d48ea --- /dev/null +++ b/README.md @@ -0,0 +1,147 @@ +
+

+ logo +

+
+ +## 框架介绍 + +Snowy(SnowyAdmin)是国内首个国产化前后端分离快速开发平台,集成国密加解密插件, +软件层面完全符合等保测评要求,同时实现国产化机型、中间件、数据库适配,是您的不二之选! +技术框架与密码结合,让更多的人认识密码,使用密码;更是让前后分离“密”不可分。 + + +采用SpringBoot+MybatisPlus+AntDesignVue+Vite 等更多优秀组件及前沿技术开发,注释丰富,代码简洁,开箱即用! + + +Snowy谐音“小诺”,恰应小诺团队名称;意思为”下雪的、纯洁的“,寓意框架追求简洁至上,大道至简。 + +

+

+ + Gitee star + + + Gitee fork + + + bootstrap + + + spring-boot + + + bootstrap + + + spring-boot + + + mybatis-plus + + + license Apache 2.0 + +

+

+ +## 快速链接 + +下载地址:https://gitee.com/xiaonuobase/snowy + +演示地址:https://snowy.xiaonuo.vip + +## 支撑组件及启动 + +全栈工程师推荐idea + +### 前端支撑 +| 插件 | 版本 | 用途 | +|--- | ----- | ----- | +| node.js | 最新版 | JavaScript运行环境 | + +#### 启动前端 + +``` +npm install +``` +``` +npm run dev +``` +### 后端支撑 +| 插件 | 版本 | 用途 | +| --- | ----- | ----- | +| jdk | 8.0 |java环境 | +| maven | 最新版 |包管理工具 | +| redis | 最新版 | 缓存库 | +| mysql | 5.7 / 8.0 | 数据库 | + +#### 启动后端 +开发工具内配置好maven并在代码中配置数据库即可启动 + +## 代码结构 + + +## 效果图:fire: + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +## 密码分步:fire: + +| 功能 | 算法类型 | +| ---------------------- | ------------- | +| 登录 | SM2前端加密,后端解密 | +| 登录登出日志 | SM2对登录登出日志做签名完整性保护存储 | +| 操作日志 | SM2对操作日志做签名完整性保护存储 | +| 用户密码 | SM3完整性保护存储,登录时做完整性校验 | +| 用户手机号 | SM4(cbc模式)加解密使用字段脱敏 | + + +## 原理图解 + +## 团队成员 + +| 成员 | 技术 | 昵称 | +| :---: | :---: | :---: | +| 俞宝山 | 全栈 | 俞宝山 | +| 徐玉祥 | 全栈 | 就是那个锅 | +| 董夏雨 | 全栈 | 阿董 | + +## 曾获荣誉 + +

+ +

+ +## 版权说明 + +- Snowy生态技术框架全系版本采用 Apache License2.0协议 +- 代码可用于个人项目等接私活或企业项目脚手架使用,Snowy全系开源版完全免费 +- 二次开发如于开源竞品请先联系群主沟通合作 +- 请不要删除和修改Snowy源码头部的版权与作者声明及出处 diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..157d47ac --- /dev/null +++ b/pom.xml @@ -0,0 +1,79 @@ + + + 4.0.0 + + vip.xiaonuo + snowy + snowy + 2.0.0 + snowy快速开发平台 + pom + + + org.springframework.boot + spring-boot-starter-parent + 2.5.4 + + + + 1.8 + UTF-8 + UTF-8 + + + + + snowy-common + + + snowy-plugin + + + snowy-plugin-api + + + snowy-web-app + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-source-plugin + 3.0.1 + + true + + + + compile + + jar + + + + + + + + src/main/resources + + + src/main/java + + **/*.xml + + + + + diff --git a/snowy-admin-web/.editorconfig b/snowy-admin-web/.editorconfig new file mode 100644 index 00000000..4e1edd14 --- /dev/null +++ b/snowy-admin-web/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = tab +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false diff --git a/snowy-admin-web/.env.development b/snowy-admin-web/.env.development new file mode 100644 index 00000000..75bd9e0d --- /dev/null +++ b/snowy-admin-web/.env.development @@ -0,0 +1,11 @@ +# 本地环境 +NODE_ENV = development + +# 标题 +VITE_TITLE = Snowy + +# 接口地址 +VITE_API_BASEURL = http://127.0.0.1:82 + +# 本地端口 +VITE_PORT = 81 diff --git a/snowy-admin-web/.env.production b/snowy-admin-web/.env.production new file mode 100644 index 00000000..ace0d813 --- /dev/null +++ b/snowy-admin-web/.env.production @@ -0,0 +1,11 @@ +# 生产环境 +NODE_ENV = production + +# 标题 +VITE_TITLE = Snowy + +# 接口地址 +VITE_API_BASEURL = http://127.0.0.1:82 + +# 本地端口 +VITE_PORT = 81 diff --git a/snowy-admin-web/.eslintrc.js b/snowy-admin-web/.eslintrc.js new file mode 100644 index 00000000..556567e0 --- /dev/null +++ b/snowy-admin-web/.eslintrc.js @@ -0,0 +1,38 @@ +module.exports = { + root: true, + env: { + browser: true, + node: true, + es6: true, + 'vue/setup-compiler-macros': true + }, + parser: 'vue-eslint-parser', + extends: ['plugin:vue/vue3-recommended', 'eslint:recommended', 'plugin:prettier/recommended'], + parserOptions: { + ecmaVersion: 2020, + sourceType: 'module', + jsxPragma: 'React', + ecmaFeatures: { + jsx: true + } + }, + rules: { + 'no-unused-vars': 'off', + 'no-undef': 'off', + 'vue/script-setup-uses-vars': 'error', + 'vue/custom-event-name-casing': 'off', + 'no-use-before-define': 'off', + 'space-before-function-paren': 'off', + 'vue/attributes-order': 'off', + 'vue/one-component-per-file': 'off', + 'vue/html-closing-bracket-newline': 'off', + 'vue/max-attributes-per-line': 'off', + 'vue/multiline-html-element-content-newline': 'off', + 'vue/singleline-html-element-content-newline': 'off', + 'vue/attribute-hyphenation': 'off', + 'vue/require-default-prop': 'off', + 'vue/html-self-closing': 'off', + 'vue/v-on-event-hyphenation': 'off', + 'vue/multi-word-component-names': 'off' + } +} diff --git a/snowy-admin-web/.gitignore b/snowy-admin-web/.gitignore new file mode 100644 index 00000000..65cbc4df --- /dev/null +++ b/snowy-admin-web/.gitignore @@ -0,0 +1,24 @@ +.DS_Store +node_modules +/dist + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +package-lock.json + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/snowy-admin-web/LICENSE b/snowy-admin-web/LICENSE new file mode 100644 index 00000000..d6aac6c3 --- /dev/null +++ b/snowy-admin-web/LICENSE @@ -0,0 +1,53 @@ +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: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and +You must cause any modified files to carry prominent notices stating that You changed the files; and +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 +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 \ No newline at end of file diff --git a/snowy-admin-web/README.md b/snowy-admin-web/README.md new file mode 100644 index 00000000..069bea98 --- /dev/null +++ b/snowy-admin-web/README.md @@ -0,0 +1,14 @@ + +## 安装依赖 + +``` +npm install +``` + +## 启动项目(开发模式) + +``` +npm run serve +``` + +启动完成后浏览器访问 http://localhost:81 diff --git a/snowy-admin-web/antd.js b/snowy-admin-web/antd.js new file mode 100644 index 00000000..39b32672 --- /dev/null +++ b/snowy-admin-web/antd.js @@ -0,0 +1,299 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +function kebabCase(value) { + return value + .replace(/([A-Z])/g, ' $1') + .trim() + .split(' ') + .join('-') + .toLowerCase() +} +const antComponents = [ + 'Affix', + 'Alert', + 'Anchor', + 'AnchorLink', + 'AutoComplete', + 'AutoCompleteOptGroup', + 'AutoCompleteOption', + 'Avatar', + 'AvatarGroup', + 'BackTop', + 'Badge', + 'BadgeRibbon', + 'Breadcrumb', + 'BreadcrumbItem', + 'BreadcrumbSeparator', + 'Button', + 'ButtonGroup', + 'Calendar', + 'Card', + 'CardGrid', + 'CardMeta', + 'Carousel', + 'Cascader', + 'CheckableTag', + 'Checkbox', + 'CheckboxGroup', + 'Col', + 'Collapse', + 'CollapsePanel', + 'Comment', + 'ConfigProvider', + 'DatePicker', + 'Descriptions', + 'DescriptionsItem', + 'DirectoryTree', + 'Divider', + 'Drawer', + 'Dropdown', + 'DropdownButton', + 'Empty', + 'Form', + 'FormItem', + 'FormItemRest', + 'Image', + 'ImagePreviewGroup', + 'Input', + 'InputGroup', + 'InputNumber', + 'InputPassword', + 'InputSearch', + 'Layout', + 'LayoutContent', + 'LayoutFooter', + 'LayoutHeader', + 'LayoutSider', + 'List', + 'ListItem', + 'ListItemMeta', + 'LocaleProvider', + 'Mentions', + 'MentionsOption', + 'Menu', + 'MenuDivider', + 'MenuItem', + 'MenuItemGroup', + 'Modal', + 'MonthPicker', + 'PageHeader', + 'Pagination', + 'Popconfirm', + 'Popover', + 'Progress', + 'QuarterPicker', + 'Radio', + 'RadioButton', + 'RadioGroup', + 'RangePicker', + 'Rate', + 'Result', + 'Row', + 'Select', + 'SelectOptGroup', + 'SelectOption', + 'Skeleton', + 'SkeletonAvatar', + 'SkeletonButton', + 'SkeletonImage', + 'SkeletonInput', + 'Slider', + 'Space', + 'Spin', + 'Statistic', + 'StatisticCountdown', + 'Step', + 'Steps', + 'SubMenu', + 'Switch', + 'TabPane', + 'Table', + 'TableColumn', + 'TableColumnGroup', + 'TableSummary', + 'TableSummaryCell', + 'TableSummaryRow', + 'Tabs', + 'Tag', + 'Textarea', + 'TimePicker', + 'TimeRangePicker', + 'Timeline', + 'TimelineItem', + 'Tooltip', + 'Transfer', + 'Tree', + 'TreeNode', + 'TreeSelect', + 'TreeSelectNode', + 'Typography', + 'TypographyLink', + 'TypographyParagraph', + 'TypographyText', + 'TypographyTitle', + 'Upload', + 'UploadDragger', + 'WeekPicker' +] +const matchComponents = [ + { + pattern: /^Avatar/, + styleDir: 'avatar' + }, + { + pattern: /^AutoComplete/, + styleDir: 'auto-complete' + }, + { + pattern: /^Anchor/, + styleDir: 'anchor' + }, + { + pattern: /^Badge/, + styleDir: 'badge' + }, + { + pattern: /^Breadcrumb/, + styleDir: 'breadcrumb' + }, + { + pattern: /^Button/, + styleDir: 'button' + }, + { + pattern: /^Checkbox/, + styleDir: 'checkbox' + }, + { + pattern: /^Card/, + styleDir: 'card' + }, + { + pattern: /^Collapse/, + styleDir: 'collapse' + }, + { + pattern: /^Descriptions/, + styleDir: 'descriptions' + }, + { + pattern: /^RangePicker|^WeekPicker|^MonthPicker|^QuarterPicker/, + styleDir: 'date-picker' + }, + { + pattern: /^TimeRangePicker/, + styleDir: 'time-picker' + }, + { + pattern: /^Dropdown/, + styleDir: 'dropdown' + }, + { + pattern: /^Form/, + styleDir: 'form' + }, + { + pattern: /^InputNumber/, + styleDir: 'input-number' + }, + { + pattern: /^Input|^Textarea/, + styleDir: 'input' + }, + { + pattern: /^Statistic/, + styleDir: 'statistic' + }, + { + pattern: /^CheckableTag/, + styleDir: 'tag' + }, + { + pattern: /^Layout/, + styleDir: 'layout' + }, + { + pattern: /^Menu|^SubMenu/, + styleDir: 'menu' + }, + { + pattern: /^Table/, + styleDir: 'table' + }, + { + pattern: /^Radio/, + styleDir: 'radio' + }, + { + pattern: /^Image/, + styleDir: 'image' + }, + { + pattern: /^List/, + styleDir: 'list' + }, + { + pattern: /^Tab/, + styleDir: 'tabs' + }, + { + pattern: /^Mentions/, + styleDir: 'mentions' + }, + { + pattern: /^Step/, + styleDir: 'steps' + }, + { + pattern: /^Skeleton/, + styleDir: 'skeleton' + }, + { + pattern: /^Select/, + styleDir: 'select' + }, + { + pattern: /^TreeSelect/, + styleDir: 'tree-select' + }, + { + pattern: /^Tree|^DirectoryTree/, + styleDir: 'tree' + }, + { + pattern: /^Typography/, + styleDir: 'typography' + }, + { + pattern: /^Timeline/, + styleDir: 'timeline' + }, + { + pattern: /^Upload/, + styleDir: 'upload' + } +] +const antStyleDeps = Array.from( + new Set( + antComponents.map((name) => { + for (let i = 0; i < matchComponents.length; i++) { + if (name.match(matchComponents[i].pattern)) { + return matchComponents[i].styleDir + } + } + return kebabCase(name) + }) + ) +).map((name) => { + return `ant-design-vue/es/${name}/style` +}) + +export default antStyleDeps diff --git a/snowy-admin-web/index.html b/snowy-admin-web/index.html new file mode 100644 index 00000000..0c18338d --- /dev/null +++ b/snowy-admin-web/index.html @@ -0,0 +1,42 @@ + + + + + + + + Snowy + + + + + +
+
+ +
+
Snowy
+
+
+ + + diff --git a/snowy-admin-web/jsconfig.json b/snowy-admin-web/jsconfig.json new file mode 100644 index 00000000..1bd0da4c --- /dev/null +++ b/snowy-admin-web/jsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "target": "es6", + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + }, + "exclude": ["node_modules", "dist"], + "include": ["src/**/*"] +} diff --git a/snowy-admin-web/package.json b/snowy-admin-web/package.json new file mode 100644 index 00000000..820a916e --- /dev/null +++ b/snowy-admin-web/package.json @@ -0,0 +1,82 @@ +{ + "name": "snowy-admin-web", + "version": "1.0.0", + "private": true, + "description": "小诺团队旗下Snowy前端,基于Antdv3.2+Vue3.2+Vite2.8", + "repository": { + "type": "git", + "url": "https://www.gitee.com/xiaonuobase/snowy" + }, + "license": "Apache-2.0", + "author": "yubaoshan", + "scripts": { + "serve": "vite", + "dev": "vite --mode development", + "preview": "vite preview", + "build": "vite build --mode production", + "prod": "vite --mode production" + }, + "dependencies": { + "@ant-design/colors": "4.0.1", + "@ant-design/icons-vue": "^6.0.1", + "@antv/g2plot": "^2.4.10", + "@chenfengyuan/vue-qrcode": "2", + "@highlightjs/vue-plugin": "^2.1.0", + "@tinymce/tinymce-vue": "4.0.5", + "ant-design-vue": "3.2.10", + "axios": "0.24.0", + "cropperjs": "1.5.12", + "dayjs": "^1.11.5", + "echarts": "5.2.2", + "echarts-stat": "^1.2.0", + "enquire.js": "^2.1.6", + "highlight.js": "^11.6.0", + "lodash-es": "^4.17.21", + "nprogress": "0.2.0", + "screenfull": "^6.0.2", + "sm-crypto": "^0.3.11", + "snowflake-id": "^1.1.0", + "sortablejs": "1.14.0", + "tinymce": "5.10.2", + "vue": "3.2.31", + "vue-cropper": "^1.0.1", + "vue-i18n": "^9.1.10", + "vue-router": "4.0.12", + "vue3-colorpicker": "^2.0.4", + "vue3-tree-org": "^3.1.6", + "vuedraggable-es": "4.1.0", + "vuex": "4.0.2" + }, + "devDependencies": { + "@antfu/eslint-config": "^0.18.3", + "@vitejs/plugin-legacy": "^1.6.4", + "@vitejs/plugin-vue": "^2.1.0", + "@vitejs/plugin-vue-jsx": "^1.3.8", + "@vue/compiler-sfc": "^3.2.31", + "@vue/eslint-config-standard": "^4.0.0", + "antd-dayjs-vite-plugin": "^1.2.0", + "antd-less-to-css-variable": "^1.0.5", + "autoprefixer": "^10.4.2", + "babel-eslint": "10.1.0", + "eslint": "^7.11.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-vue": "^9.1.1", + "less": "^4.1.2", + "postcss": "^8.4.7", + "prettier": "^2.4.1", + "rollup-plugin-visualizer": "^5.7.1", + "tailwindcss": "^3.0.23", + "typescript": "^4.5.5", + "unplugin-auto-import": "^0.11.1", + "unplugin-vue-components": "^0.17.14", + "vite": "2.8.6", + "vite-plugin-vue-setup-extend": "^0.4.0", + "vue-eslint-parser": "^9.0.3" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not dead" + ] +} diff --git a/snowy-admin-web/postcss.config.js b/snowy-admin-web/postcss.config.js new file mode 100644 index 00000000..179e9927 --- /dev/null +++ b/snowy-admin-web/postcss.config.js @@ -0,0 +1,16 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {} + } +} diff --git a/snowy-admin-web/prettier.config.js b/snowy-admin-web/prettier.config.js new file mode 100644 index 00000000..ab63fda6 --- /dev/null +++ b/snowy-admin-web/prettier.config.js @@ -0,0 +1,49 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +module.exports = { + // 一行最多 180 字符 + printWidth: 120, + // 使用 2 个tab缩进 + tabWidth: 2, + // 使用tab符缩进,false为空格缩进 + useTabs: true, + // 行尾不需要分号 + semi: false, + // 使用单引号 + singleQuote: true, + // 对象的 key 仅在必要时用引号 + quoteProps: 'as-needed', + // jsx 不使用单引号,而使用双引号 + jsxSingleQuote: false, + // 末尾不需要逗号 + trailingComma: 'none', + // 大括号内的首尾需要空格 + bracketSpacing: true, + // jsx 标签的反尖括号不需要换行 + jsxBracketSameLine: true, + // 箭头函数,只有一个参数的时候,也需要括号 + arrowParens: 'always', + // 每个文件格式化的范围是文件的全部内容 + rangeStart: 0, + rangeEnd: Infinity, + // 不需要写文件开头的 @prettier + requirePragma: false, + // 不需要自动在文件开头插入 @prettier + insertPragma: false, + // 使用默认的折行标准 + proseWrap: 'preserve', + // 根据显示样式决定 html 要不要折行 + htmlWhitespaceSensitivity: 'css', + // 换行符使用 lf + endOfLine: 'lf', + // 缩进js跟css + vueIndentScriptAndStyle: true +} diff --git a/snowy-admin-web/public/favicon.ico b/snowy-admin-web/public/favicon.ico new file mode 100644 index 00000000..9e3ed92f Binary files /dev/null and b/snowy-admin-web/public/favicon.ico differ diff --git a/snowy-admin-web/public/img/login_background.png b/snowy-admin-web/public/img/login_background.png new file mode 100644 index 00000000..8e03f8ef Binary files /dev/null and b/snowy-admin-web/public/img/login_background.png differ diff --git a/snowy-admin-web/public/img/login_background_front.png b/snowy-admin-web/public/img/login_background_front.png new file mode 100644 index 00000000..877ace17 Binary files /dev/null and b/snowy-admin-web/public/img/login_background_front.png differ diff --git a/snowy-admin-web/public/img/loginbg.svg b/snowy-admin-web/public/img/loginbg.svg new file mode 100644 index 00000000..5f81c5b2 --- /dev/null +++ b/snowy-admin-web/public/img/loginbg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/snowy-admin-web/public/img/logo.png b/snowy-admin-web/public/img/logo.png new file mode 100644 index 00000000..4d1a1df3 Binary files /dev/null and b/snowy-admin-web/public/img/logo.png differ diff --git a/snowy-admin-web/public/img/no-widgets.svg b/snowy-admin-web/public/img/no-widgets.svg new file mode 100644 index 00000000..ec8b3ae5 --- /dev/null +++ b/snowy-admin-web/public/img/no-widgets.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/snowy-admin-web/public/img/shanghai.json b/snowy-admin-web/public/img/shanghai.json new file mode 100644 index 00000000..e7786cd4 --- /dev/null +++ b/snowy-admin-web/public/img/shanghai.json @@ -0,0 +1 @@ +{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"adcode":310101,"name":"黄浦区","center":[121.490317,31.222771],"centroid":[121.483572,31.215946],"childrenNum":0,"level":"district","parent":{"adcode":310000},"subFeatureIndex":0,"acroutes":[100000,310000]},"geometry":{"type":"MultiPolygon","coordinates":[[[[121.457689,31.220196],[121.460707,31.213488],[121.461555,31.210194],[121.462264,31.203173],[121.466449,31.204395],[121.46745,31.203065],[121.469605,31.196404],[121.470383,31.191276],[121.474944,31.189886],[121.475987,31.187885],[121.490752,31.191467],[121.494631,31.192857],[121.498066,31.195601],[121.501319,31.199747],[121.508368,31.210158],[121.509911,31.214506],[121.509397,31.218459],[121.506741,31.223119],[121.502014,31.228018],[121.495744,31.232977],[121.493491,31.23615],[121.493491,31.240163],[121.494826,31.24221],[121.487805,31.244186],[121.485969,31.244091],[121.482994,31.241923],[121.47892,31.240294],[121.474847,31.24142],[121.469563,31.239216],[121.462973,31.241396],[121.466129,31.234917],[121.467658,31.225634],[121.467464,31.223862],[121.456758,31.223898],[121.457689,31.220196]]]]}},{"type":"Feature","properties":{"adcode":310104,"name":"徐汇区","center":[121.43752,31.179973],"centroid":[121.439405,31.162992],"childrenNum":0,"level":"district","parent":{"adcode":310000},"subFeatureIndex":1,"acroutes":[100000,310000]},"geometry":{"type":"MultiPolygon","coordinates":[[[[121.457689,31.220196],[121.452184,31.217429],[121.44697,31.215812],[121.439462,31.214482],[121.43746,31.211535],[121.435235,31.21114],[121.437933,31.203976],[121.433025,31.20128],[121.423793,31.197314],[121.421638,31.19535],[121.422027,31.192294],[121.419719,31.190796],[121.412572,31.19112],[121.41356,31.18683],[121.415256,31.187357],[121.415158,31.183391],[121.41146,31.182037],[121.400101,31.178813],[121.398349,31.179904],[121.398071,31.178226],[121.394442,31.177879],[121.395415,31.174595],[121.39269,31.173085],[121.394053,31.169489],[121.391508,31.168686],[121.394567,31.159601],[121.402645,31.162226],[121.404578,31.157588],[121.401867,31.157528],[121.395874,31.15585],[121.396931,31.152685],[121.401449,31.153776],[121.400977,31.155214],[121.404953,31.156689],[121.411293,31.14174],[121.41381,31.13728],[121.418398,31.131669],[121.421526,31.127137],[121.436445,31.129043],[121.43853,31.121729],[121.438836,31.119103],[121.435736,31.113539],[121.438002,31.1121],[121.441547,31.112568],[121.445788,31.114954],[121.446706,31.114282],[121.450807,31.115398],[121.450154,31.112819],[121.452364,31.108586],[121.447623,31.107423],[121.446275,31.105744],[121.451878,31.103849],[121.452629,31.101234],[121.455423,31.100755],[121.462862,31.101954],[121.463237,31.108586],[121.465211,31.1121],[121.469299,31.118731],[121.469674,31.124859],[121.468729,31.127868],[121.462431,31.134463],[121.457453,31.142232],[121.457453,31.146451],[121.460387,31.150276],[121.46574,31.155118],[121.468354,31.158091],[121.469369,31.162298],[121.468159,31.167092],[121.464905,31.17541],[121.464905,31.178022],[121.466254,31.18109],[121.468729,31.184122],[121.475987,31.187885],[121.474944,31.189886],[121.470383,31.191276],[121.469605,31.196404],[121.46745,31.203065],[121.466449,31.204395],[121.462264,31.203173],[121.461555,31.210194],[121.460707,31.213488],[121.457689,31.220196]]]]}},{"type":"Feature","properties":{"adcode":310105,"name":"长宁区","center":[121.4222,31.218123],"centroid":[121.380949,31.20737],"childrenNum":0,"level":"district","parent":{"adcode":310000},"subFeatureIndex":2,"acroutes":[100000,310000]},"geometry":{"type":"MultiPolygon","coordinates":[[[[121.439462,31.214482],[121.436167,31.220675],[121.435416,31.225071],[121.434304,31.225886],[121.429034,31.223095],[121.427713,31.224221],[121.427519,31.229288],[121.423334,31.228114],[121.419941,31.225191],[121.415617,31.228581],[121.414853,31.228054],[121.415965,31.224473],[121.414157,31.223359],[121.408707,31.222364],[121.403799,31.22058],[121.400462,31.220807],[121.399712,31.218711],[121.388658,31.218639],[121.37691,31.220687],[121.373197,31.220089],[121.371404,31.222508],[121.366691,31.224065],[121.366065,31.226006],[121.362102,31.22597],[121.359071,31.229827],[121.354177,31.237121],[121.352856,31.238342],[121.348741,31.239372],[121.350131,31.241839],[121.348922,31.243863],[121.347281,31.243192],[121.346822,31.241037],[121.344612,31.243552],[121.345585,31.239887],[121.340872,31.239947],[121.338355,31.237528],[121.343513,31.234306],[121.345376,31.23039],[121.345362,31.227886],[121.341581,31.226293],[121.340997,31.224269],[121.345627,31.223526],[121.343096,31.223071],[121.342457,31.217789],[121.33937,31.216615],[121.339996,31.212278],[121.338508,31.212182],[121.338438,31.20666],[121.338925,31.196644],[121.33734,31.195817],[121.338049,31.192618],[121.331806,31.189622],[121.338341,31.180108],[121.341414,31.179436],[121.351424,31.183499],[121.353301,31.181629],[121.356958,31.182768],[121.358321,31.186015],[121.360253,31.185296],[121.365954,31.185572],[121.38001,31.190065],[121.391425,31.191911],[121.412572,31.19112],[121.419719,31.190796],[121.422027,31.192294],[121.421638,31.19535],[121.423793,31.197314],[121.433025,31.20128],[121.437933,31.203976],[121.435235,31.21114],[121.43746,31.211535],[121.439462,31.214482]]]]}},{"type":"Feature","properties":{"adcode":310106,"name":"静安区","center":[121.448224,31.229003],"centroid":[121.450659,31.270821],"childrenNum":0,"level":"district","parent":{"adcode":310000},"subFeatureIndex":3,"acroutes":[100000,310000]},"geometry":{"type":"MultiPolygon","coordinates":[[[[121.457689,31.220196],[121.456758,31.223898],[121.467464,31.223862],[121.467658,31.225634],[121.466129,31.234917],[121.462973,31.241396],[121.469563,31.239216],[121.474847,31.24142],[121.47892,31.240294],[121.482994,31.241923],[121.481228,31.247959],[121.479588,31.249815],[121.481673,31.250689],[121.479629,31.253383],[121.480589,31.255239],[121.480491,31.258568],[121.474124,31.263453],[121.469605,31.267799],[121.464627,31.274396],[121.462834,31.275389],[121.461457,31.278921],[121.461805,31.284691],[121.460081,31.289778],[121.462445,31.292747],[121.46453,31.297989],[121.463529,31.306008],[121.467672,31.306307],[121.468312,31.316036],[121.468145,31.32032],[121.465378,31.321397],[121.457133,31.321002],[121.4547,31.319243],[121.447887,31.317101],[121.44672,31.319817],[121.436765,31.319662],[121.436459,31.32087],[121.433595,31.32087],[121.432468,31.318669],[121.434623,31.312303],[121.432163,31.31168],[121.431676,31.309478],[121.432441,31.305912],[121.431287,31.303638],[121.426434,31.303207],[121.426935,31.298528],[121.42364,31.297259],[121.420039,31.296912],[121.418648,31.292256],[121.419691,31.291071],[121.423806,31.291011],[121.422833,31.28426],[121.424432,31.280238],[121.424571,31.27193],[121.425252,31.270661],[121.429841,31.274923],[121.432413,31.271942],[121.437098,31.269439],[121.442952,31.267117],[121.451044,31.256269],[121.44932,31.252928],[121.451461,31.251994],[121.450404,31.247743],[121.448318,31.245216],[121.449987,31.2433],[121.445774,31.241348],[121.435166,31.235252],[121.431009,31.235108],[121.427908,31.231144],[121.427519,31.229288],[121.427713,31.224221],[121.429034,31.223095],[121.434304,31.225886],[121.435416,31.225071],[121.436167,31.220675],[121.439462,31.214482],[121.44697,31.215812],[121.452184,31.217429],[121.457689,31.220196]]]]}},{"type":"Feature","properties":{"adcode":310107,"name":"普陀区","center":[121.392499,31.241701],"centroid":[121.392042,31.257895],"childrenNum":0,"level":"district","parent":{"adcode":310000},"subFeatureIndex":4,"acroutes":[100000,310000]},"geometry":{"type":"MultiPolygon","coordinates":[[[[121.354177,31.237121],[121.359071,31.229827],[121.362102,31.22597],[121.366065,31.226006],[121.366691,31.224065],[121.371404,31.222508],[121.373197,31.220089],[121.37691,31.220687],[121.388658,31.218639],[121.399712,31.218711],[121.400462,31.220807],[121.403799,31.22058],[121.408707,31.222364],[121.414157,31.223359],[121.415965,31.224473],[121.414853,31.228054],[121.415617,31.228581],[121.419941,31.225191],[121.423334,31.228114],[121.427519,31.229288],[121.427908,31.231144],[121.431009,31.235108],[121.435166,31.235252],[121.445774,31.241348],[121.449987,31.2433],[121.448318,31.245216],[121.450404,31.247743],[121.451461,31.251994],[121.44932,31.252928],[121.451044,31.256269],[121.442952,31.267117],[121.437098,31.269439],[121.432413,31.271942],[121.429841,31.274923],[121.425252,31.270661],[121.419496,31.265237],[121.41577,31.265896],[121.41527,31.26914],[121.410598,31.270373],[121.41096,31.273175],[121.40544,31.273067],[121.406496,31.276862],[121.404564,31.276227],[121.400087,31.278071],[121.404453,31.286223],[121.400379,31.286115],[121.398446,31.287145],[121.399559,31.288904],[121.39789,31.29052],[121.393483,31.291274],[121.394762,31.294674],[121.388394,31.29526],[121.384765,31.294446],[121.381623,31.292711],[121.38154,31.289431],[121.376242,31.290592],[121.374838,31.289096],[121.370153,31.290329],[121.369666,31.28912],[121.363785,31.291334],[121.363785,31.292028],[121.358585,31.293465],[121.360295,31.294674],[121.363534,31.302741],[121.360309,31.302717],[121.354803,31.299808],[121.352954,31.301663],[121.348894,31.299246],[121.349659,31.297582],[121.346892,31.296349],[121.34685,31.297654],[121.340927,31.297439],[121.341011,31.293716],[121.338675,31.293225],[121.336506,31.294901],[121.332224,31.292998],[121.332821,31.290915],[121.326384,31.288928],[121.327316,31.285182],[121.328998,31.284595],[121.332738,31.286067],[121.335004,31.279711],[121.336061,31.280046],[121.336228,31.275461],[121.338883,31.275006],[121.338272,31.272839],[121.343541,31.271439],[121.344723,31.273917],[121.35732,31.271415],[121.358918,31.268793],[121.361268,31.27084],[121.367441,31.269631],[121.366996,31.266662],[121.362227,31.26756],[121.35985,31.266997],[121.358918,31.263609],[121.361783,31.259945],[121.366023,31.259358],[121.365884,31.257682],[121.374574,31.257059],[121.375158,31.25949],[121.377508,31.259478],[121.380886,31.257766],[121.377216,31.247719],[121.375686,31.244486],[121.3731,31.245683],[121.372349,31.243755],[121.368387,31.247384],[121.366718,31.246342],[121.363117,31.240091],[121.36067,31.238642],[121.360086,31.240498],[121.356068,31.240151],[121.356054,31.237803],[121.354177,31.237121]]]]}},{"type":"Feature","properties":{"adcode":310109,"name":"虹口区","center":[121.491832,31.26097],"centroid":[121.485443,31.276649],"childrenNum":0,"level":"district","parent":{"adcode":310000},"subFeatureIndex":5,"acroutes":[100000,310000]},"geometry":{"type":"MultiPolygon","coordinates":[[[[121.485413,31.311573],[121.485372,31.314636],[121.479171,31.314696],[121.472956,31.315797],[121.468312,31.316036],[121.467672,31.306307],[121.463529,31.306008],[121.46453,31.297989],[121.462445,31.292747],[121.460081,31.289778],[121.461805,31.284691],[121.461457,31.278921],[121.462834,31.275389],[121.464627,31.274396],[121.469605,31.267799],[121.474124,31.263453],[121.480491,31.258568],[121.480589,31.255239],[121.479629,31.253383],[121.481673,31.250689],[121.479588,31.249815],[121.481228,31.247959],[121.482994,31.241923],[121.485969,31.244091],[121.487805,31.244186],[121.494826,31.24221],[121.500012,31.244989],[121.50688,31.246474],[121.516488,31.246953],[121.516001,31.251599],[121.517642,31.251862],[121.514569,31.256317],[121.508479,31.262639],[121.50631,31.266746],[121.506505,31.270589],[121.499915,31.275904],[121.496564,31.276407],[121.496049,31.282991],[121.498149,31.286259],[121.502709,31.289658],[121.500652,31.295488],[121.493644,31.293884],[121.490168,31.292603],[121.485664,31.303483],[121.485413,31.311573]]]]}},{"type":"Feature","properties":{"adcode":310110,"name":"杨浦区","center":[121.522797,31.270755],"centroid":[121.529302,31.29835],"childrenNum":0,"level":"district","parent":{"adcode":310000},"subFeatureIndex":6,"acroutes":[100000,310000]},"geometry":{"type":"MultiPolygon","coordinates":[[[[121.516488,31.246953],[121.527555,31.247252],[121.536384,31.249623],[121.541542,31.251826],[121.559074,31.264219],[121.563537,31.268805],[121.568515,31.275701],[121.56953,31.279567],[121.569141,31.285254],[121.565456,31.294135],[121.562523,31.29976],[121.561758,31.303339],[121.561883,31.321158],[121.560493,31.32781],[121.558574,31.331256],[121.555779,31.333948],[121.549398,31.337789],[121.525483,31.346797],[121.522883,31.342885],[121.520256,31.344033],[121.517628,31.340779],[121.50556,31.345732],[121.493575,31.330299],[121.497593,31.328109],[121.498928,31.325322],[121.496216,31.323347],[121.496717,31.311489],[121.485413,31.311573],[121.485664,31.303483],[121.490168,31.292603],[121.493644,31.293884],[121.500652,31.295488],[121.502709,31.289658],[121.498149,31.286259],[121.496049,31.282991],[121.496564,31.276407],[121.499915,31.275904],[121.506505,31.270589],[121.50631,31.266746],[121.508479,31.262639],[121.514569,31.256317],[121.517642,31.251862],[121.516001,31.251599],[121.516488,31.246953]]]]}},{"type":"Feature","properties":{"adcode":310112,"name":"闵行区","center":[121.375972,31.111658],"centroid":[121.418901,31.087213],"childrenNum":0,"level":"district","parent":{"adcode":310000},"subFeatureIndex":7,"acroutes":[100000,310000]},"geometry":{"type":"MultiPolygon","coordinates":[[[[121.35871,30.97786],[121.375227,30.982832],[121.394261,30.988247],[121.409333,30.990229],[121.413184,30.991069],[121.423973,30.994515],[121.431426,30.999174],[121.433636,31.001779],[121.436834,31.00406],[121.440811,31.005789],[121.448305,31.007458],[121.459942,31.007398],[121.465587,31.008755],[121.47144,31.011948],[121.476362,31.01334],[121.485872,31.014073],[121.489153,31.014949],[121.492879,31.012752],[121.491948,31.010039],[121.495924,30.998297],[121.498872,30.998213],[121.49883,30.999426],[121.503057,31.002716],[121.507881,31.004745],[121.510412,31.004553],[121.517002,31.007626],[121.520853,31.004445],[121.522105,31.002199],[121.520089,31.00256],[121.520325,30.999354],[121.522897,30.99981],[121.528612,30.99592],[121.531962,30.994815],[121.534507,30.995848],[121.537774,30.994683],[121.538233,30.993146],[121.543294,30.994203],[121.54613,30.99305],[121.549537,30.988307],[121.55279,30.98886],[121.553304,30.993026],[121.556224,30.993374],[121.555918,30.995152],[121.561494,30.995644],[121.570475,30.998345],[121.567959,31.000879],[121.570712,31.002295],[121.570253,31.004565],[121.571463,31.005633],[121.569725,31.010603],[121.568181,31.010063],[121.565859,31.011912],[121.569822,31.012452],[121.571018,31.016426],[121.574674,31.018634],[121.574758,31.020951],[121.572325,31.026677],[121.56839,31.025284],[121.569057,31.024396],[121.564302,31.021191],[121.56027,31.024132],[121.558699,31.020255],[121.556474,31.020255],[121.556516,31.01873],[121.554139,31.01861],[121.552262,31.020915],[121.552804,31.023268],[121.555765,31.022908],[121.558407,31.024528],[121.558254,31.029533],[121.559505,31.030278],[121.559464,31.041391],[121.562119,31.043635],[121.559811,31.044812],[121.557031,31.04798],[121.556127,31.047632],[121.554737,31.050824],[121.552693,31.0493],[121.550538,31.049396],[121.54955,31.047908],[121.547799,31.048544],[121.54588,31.047044],[121.541472,31.046396],[121.542307,31.049072],[121.540791,31.052528],[121.54328,31.054016],[121.543308,31.055696],[121.548383,31.056896],[121.547201,31.061647],[121.548549,31.063639],[121.551094,31.063795],[121.551789,31.065643],[121.556753,31.06737],[121.55279,31.069506],[121.555599,31.071689],[121.559033,31.072169],[121.557531,31.073357],[121.562675,31.074305],[121.56262,31.075121],[121.567639,31.0762],[121.575272,31.080063],[121.572658,31.081323],[121.571643,31.080063],[121.569766,31.081611],[121.563579,31.082486],[121.561563,31.08365],[121.557031,31.082702],[121.556405,31.081059],[121.553555,31.080303],[121.550565,31.082834],[121.548549,31.086889],[121.551539,31.088148],[121.551608,31.090128],[121.559088,31.091951],[121.561563,31.09357],[121.561855,31.091867],[121.564358,31.091891],[121.567264,31.09363],[121.566819,31.096569],[121.563315,31.098955],[121.562064,31.101258],[121.563649,31.101858],[121.561132,31.105264],[121.561396,31.106224],[121.557851,31.109797],[121.559867,31.111896],[121.556697,31.113083],[121.555279,31.114882],[121.553332,31.112688],[121.552317,31.113899],[121.549217,31.113419],[121.550426,31.11162],[121.547687,31.109653],[121.544225,31.111464],[121.542251,31.116153],[121.539526,31.115626],[121.537885,31.113983],[121.535341,31.117976],[121.532254,31.117208],[121.53142,31.11842],[121.525289,31.116741],[121.522869,31.115242],[121.521424,31.116309],[121.514513,31.115278],[121.513749,31.118012],[121.511343,31.12119],[121.50549,31.120002],[121.503863,31.118324],[121.505295,31.115494],[121.501583,31.114666],[121.498538,31.121501],[121.49281,31.118719],[121.490266,31.124283],[121.485969,31.124523],[121.485705,31.121933],[121.48191,31.120086],[121.481256,31.118024],[121.477446,31.117328],[121.481353,31.110697],[121.477321,31.110853],[121.474137,31.114354],[121.473984,31.112915],[121.470286,31.110937],[121.465211,31.1121],[121.463237,31.108586],[121.462862,31.101954],[121.455423,31.100755],[121.452629,31.101234],[121.451878,31.103849],[121.446275,31.105744],[121.447623,31.107423],[121.452364,31.108586],[121.450154,31.112819],[121.450807,31.115398],[121.446706,31.114282],[121.445788,31.114954],[121.441547,31.112568],[121.438002,31.1121],[121.435736,31.113539],[121.438836,31.119103],[121.43853,31.121729],[121.436445,31.129043],[121.421526,31.127137],[121.418398,31.131669],[121.41381,31.13728],[121.411293,31.14174],[121.404953,31.156689],[121.400977,31.155214],[121.401449,31.153776],[121.396931,31.152685],[121.395874,31.15585],[121.401867,31.157528],[121.404578,31.157588],[121.402645,31.162226],[121.394567,31.159601],[121.391508,31.168686],[121.394053,31.169489],[121.39269,31.173085],[121.395415,31.174595],[121.394442,31.177879],[121.398071,31.178226],[121.398349,31.179904],[121.400101,31.178813],[121.41146,31.182037],[121.415158,31.183391],[121.415256,31.187357],[121.41356,31.18683],[121.412572,31.19112],[121.391425,31.191911],[121.38001,31.190065],[121.365954,31.185572],[121.360253,31.185296],[121.358321,31.186015],[121.356958,31.182768],[121.353301,31.181629],[121.351424,31.183499],[121.341414,31.179436],[121.338341,31.180108],[121.331806,31.189622],[121.338049,31.192618],[121.33734,31.195817],[121.338925,31.196644],[121.338438,31.20666],[121.338508,31.212182],[121.339996,31.212278],[121.33937,31.216615],[121.342457,31.217789],[121.343096,31.223071],[121.345627,31.223526],[121.340997,31.224269],[121.341581,31.226293],[121.345362,31.227886],[121.345376,31.23039],[121.343513,31.234306],[121.338355,31.237528],[121.334935,31.235887],[121.333878,31.232006],[121.32612,31.229575],[121.322853,31.229623],[121.315386,31.227204],[121.302998,31.230605],[121.296922,31.231048],[121.29264,31.232761],[121.288538,31.238198],[121.287301,31.243276],[121.283742,31.245192],[121.28142,31.248174],[121.284228,31.251838],[121.280363,31.251886],[121.275302,31.253527],[121.271284,31.252258],[121.264444,31.256496],[121.263985,31.259155],[121.260217,31.258328],[121.254405,31.259634],[121.254183,31.258688],[121.247314,31.253287],[121.24591,31.248821],[121.241683,31.247348],[121.239932,31.241061],[121.241391,31.240222],[121.247912,31.240917],[121.249692,31.236534],[121.251082,31.238198],[121.252792,31.236965],[121.254155,31.23312],[121.257158,31.230701],[121.258006,31.226868],[121.256588,31.226329],[121.258215,31.222772],[121.25745,31.220208],[121.259675,31.218148],[121.261218,31.215081],[121.259397,31.212769],[121.263846,31.208912],[121.26468,31.206731],[121.263053,31.205701],[121.264777,31.203317],[121.266724,31.203257],[121.271701,31.198309],[121.277388,31.193576],[121.284034,31.194391],[121.287329,31.196332],[121.292126,31.200621],[121.292431,31.202514],[121.294837,31.203077],[121.297506,31.201412],[121.300565,31.197027],[121.30856,31.188388],[121.310784,31.18423],[121.316304,31.176836],[121.318042,31.173624],[121.318584,31.170256],[121.323854,31.162933],[121.327218,31.156856],[121.328775,31.156665],[121.331528,31.15205],[121.331292,31.149772],[121.333711,31.148765],[121.335477,31.143862],[121.336728,31.14355],[121.338814,31.14017],[121.33677,31.138971],[121.342095,31.134655],[121.344681,31.130338],[121.344014,31.129451],[121.346002,31.126202],[121.34489,31.12577],[121.347545,31.121969],[121.346753,31.121657],[121.349589,31.117748],[121.353065,31.117604],[121.35066,31.115554],[121.353774,31.111512],[121.356026,31.112532],[121.357014,31.110529],[121.352217,31.106487],[121.351675,31.107735],[121.348532,31.106655],[121.351341,31.099255],[121.35839,31.100791],[121.359085,31.098931],[121.362756,31.099771],[121.368289,31.088976],[121.372016,31.079871],[121.370625,31.078372],[121.368804,31.079127],[121.365481,31.077892],[121.364341,31.073705],[121.362116,31.072601],[121.364424,31.069878],[121.363743,31.068354],[121.357278,31.066758],[121.358195,31.064047],[121.35344,31.061287],[121.343444,31.059139],[121.341456,31.062763],[121.335338,31.060435],[121.335102,31.04564],[121.33367,31.040695],[121.334017,31.031922],[121.333308,31.030686],[121.333892,31.026917],[121.333725,31.015657],[121.333072,31.01334],[121.339898,31.013857],[121.34279,31.014817],[121.34425,31.013941],[121.339829,31.010267],[121.33823,31.006197],[121.330347,30.996905],[121.327482,30.995896],[121.326773,30.994479],[121.326898,30.989964],[121.3258,30.9833],[121.327371,30.980658],[121.329554,30.981318],[121.334406,30.980694],[121.34375,30.976599],[121.351258,30.975986],[121.35871,30.97786]]]]}},{"type":"Feature","properties":{"adcode":310113,"name":"宝山区","center":[121.489934,31.398896],"centroid":[121.404861,31.392111],"childrenNum":0,"level":"district","parent":{"adcode":310000},"subFeatureIndex":8,"acroutes":[100000,310000]},"geometry":{"type":"MultiPolygon","coordinates":[[[[121.425252,31.270661],[121.424571,31.27193],[121.424432,31.280238],[121.422833,31.28426],[121.423806,31.291011],[121.419691,31.291071],[121.418648,31.292256],[121.420039,31.296912],[121.42364,31.297259],[121.426935,31.298528],[121.426434,31.303207],[121.431287,31.303638],[121.432441,31.305912],[121.431676,31.309478],[121.432163,31.31168],[121.434623,31.312303],[121.432468,31.318669],[121.433595,31.32087],[121.436459,31.32087],[121.436765,31.319662],[121.44672,31.319817],[121.447887,31.317101],[121.4547,31.319243],[121.457133,31.321002],[121.465378,31.321397],[121.468145,31.32032],[121.468312,31.316036],[121.472956,31.315797],[121.479171,31.314696],[121.485372,31.314636],[121.485413,31.311573],[121.496717,31.311489],[121.496216,31.323347],[121.498928,31.325322],[121.497593,31.328109],[121.493575,31.330299],[121.50556,31.345732],[121.517628,31.340779],[121.520256,31.344033],[121.522883,31.342885],[121.525483,31.346797],[121.514903,31.352],[121.508424,31.357251],[121.503835,31.36493],[121.50346,31.369403],[121.503835,31.373744],[121.507284,31.379102],[121.512372,31.385858],[121.521229,31.39479],[121.507353,31.405933],[121.509425,31.408288],[121.516585,31.405287],[121.517239,31.406303],[121.510801,31.409973],[121.502362,31.413404],[121.501319,31.411982],[121.507228,31.409722],[121.505991,31.407021],[121.49427,31.417851],[121.481339,31.427294],[121.463696,31.438277],[121.446024,31.450717],[121.434276,31.458496],[121.41869,31.470682],[121.409694,31.476321],[121.404328,31.479212],[121.403966,31.481494],[121.406288,31.485388],[121.405426,31.487215],[121.376298,31.501106],[121.362255,31.50679],[121.357751,31.508259],[121.343499,31.512057],[121.335838,31.508295],[121.329512,31.504247],[121.327218,31.504247],[121.323131,31.502288],[121.323701,31.499649],[121.319905,31.49972],[121.32003,31.502993],[121.321879,31.503399],[121.320169,31.505883],[121.316652,31.505775],[121.315345,31.501273],[121.311938,31.502909],[121.310353,31.505919],[121.305529,31.505333],[121.305876,31.503435],[121.302595,31.502599],[121.299926,31.499756],[121.300857,31.496747],[121.304667,31.495779],[121.306544,31.493307],[121.309171,31.492495],[121.31027,31.489735],[121.308629,31.488649],[121.310214,31.487311],[121.313342,31.480598],[121.315956,31.481219],[121.318807,31.475055],[121.31426,31.472474],[121.317958,31.468472],[121.320572,31.469058],[121.320058,31.466728],[121.317277,31.466262],[121.317778,31.460109],[121.320531,31.457289],[121.318654,31.456895],[121.319794,31.454876],[121.324132,31.455007],[121.327399,31.448829],[121.326106,31.448041],[121.328261,31.441098],[121.331236,31.439652],[121.333656,31.440118],[121.336603,31.432254],[121.336645,31.429493],[121.335143,31.429158],[121.336422,31.424999],[121.336561,31.419058],[121.33239,31.416943],[121.334101,31.413655],[121.332488,31.413117],[121.333141,31.410739],[121.330444,31.410308],[121.32847,31.411958],[121.314316,31.4072],[121.317375,31.403661],[121.315637,31.402729],[121.314747,31.398365],[121.317444,31.39742],[121.321476,31.397576],[121.323145,31.395866],[121.323339,31.393331],[121.320419,31.389123],[121.323061,31.388489],[121.326607,31.381063],[121.330527,31.381135],[121.331306,31.378456],[121.328734,31.377344],[121.331389,31.37433],[121.334003,31.37262],[121.333336,31.371281],[121.335991,31.370097],[121.335018,31.366963],[121.337576,31.364189],[121.338911,31.360995],[121.340329,31.360517],[121.341428,31.357802],[121.337118,31.356019],[121.337743,31.3534],[121.334643,31.3509],[121.332251,31.351307],[121.332502,31.347084],[121.336464,31.346821],[121.337521,31.344536],[121.338925,31.344775],[121.342401,31.341306],[121.344347,31.341928],[121.34628,31.336329],[121.342846,31.336066],[121.341692,31.33329],[121.342318,31.331005],[121.345932,31.32513],[121.347517,31.324077],[121.344848,31.323335],[121.345585,31.320835],[121.3492,31.321313],[121.347782,31.319542],[121.347698,31.316706],[121.343458,31.317185],[121.340357,31.311525],[121.338981,31.310101],[121.335686,31.303339],[121.331306,31.301436],[121.334198,31.296122],[121.33588,31.297044],[121.336506,31.294901],[121.338675,31.293225],[121.341011,31.293716],[121.340927,31.297439],[121.34685,31.297654],[121.346892,31.296349],[121.349659,31.297582],[121.348894,31.299246],[121.352954,31.301663],[121.354803,31.299808],[121.360309,31.302717],[121.363534,31.302741],[121.360295,31.294674],[121.358585,31.293465],[121.363785,31.292028],[121.363785,31.291334],[121.369666,31.28912],[121.370153,31.290329],[121.374838,31.289096],[121.376242,31.290592],[121.38154,31.289431],[121.381623,31.292711],[121.384765,31.294446],[121.388394,31.29526],[121.394762,31.294674],[121.393483,31.291274],[121.39789,31.29052],[121.399559,31.288904],[121.398446,31.287145],[121.400379,31.286115],[121.404453,31.286223],[121.400087,31.278071],[121.404564,31.276227],[121.406496,31.276862],[121.40544,31.273067],[121.41096,31.273175],[121.410598,31.270373],[121.41527,31.26914],[121.41577,31.265896],[121.419496,31.265237],[121.425252,31.270661]]]]}},{"type":"Feature","properties":{"adcode":310114,"name":"嘉定区","center":[121.250333,31.383524],"centroid":[121.24439,31.358138],"childrenNum":0,"level":"district","parent":{"adcode":310000},"subFeatureIndex":9,"acroutes":[100000,310000]},"geometry":{"type":"MultiPolygon","coordinates":[[[[121.153743,31.276646],[121.153924,31.272061],[121.151783,31.267632],[121.155537,31.266147],[121.157845,31.270541],[121.161057,31.26762],[121.162614,31.269176],[121.167661,31.263944],[121.168036,31.259622],[121.170386,31.259119],[121.16894,31.256197],[121.171415,31.254928],[121.174251,31.256856],[121.176768,31.254605],[121.178798,31.255862],[121.17934,31.253419],[121.181537,31.254413],[121.183928,31.252246],[121.186444,31.252329],[121.188377,31.25476],[121.193021,31.253623],[121.193368,31.251455],[121.19626,31.251228],[121.19608,31.253395],[121.199848,31.255239],[121.203143,31.255814],[121.202865,31.257131],[121.206368,31.260065],[121.208482,31.25749],[121.209816,31.258017],[121.209761,31.260831],[121.212625,31.259837],[121.214182,31.254353],[121.221273,31.256293],[121.220216,31.257406],[121.223859,31.259035],[121.223539,31.260532],[121.229198,31.261717],[121.229087,31.262711],[121.235177,31.262699],[121.237693,31.262088],[121.242253,31.25937],[121.246577,31.259801],[121.246758,31.258448],[121.254183,31.258688],[121.254405,31.259634],[121.260217,31.258328],[121.263985,31.259155],[121.264444,31.256496],[121.271284,31.252258],[121.275302,31.253527],[121.280363,31.251886],[121.284228,31.251838],[121.28142,31.248174],[121.283742,31.245192],[121.287301,31.243276],[121.288538,31.238198],[121.29264,31.232761],[121.296922,31.231048],[121.302998,31.230605],[121.315386,31.227204],[121.322853,31.229623],[121.32612,31.229575],[121.333878,31.232006],[121.334935,31.235887],[121.338355,31.237528],[121.340872,31.239947],[121.345585,31.239887],[121.344612,31.243552],[121.346822,31.241037],[121.347281,31.243192],[121.348922,31.243863],[121.350131,31.241839],[121.348741,31.239372],[121.352856,31.238342],[121.354177,31.237121],[121.356054,31.237803],[121.356068,31.240151],[121.360086,31.240498],[121.36067,31.238642],[121.363117,31.240091],[121.366718,31.246342],[121.368387,31.247384],[121.372349,31.243755],[121.3731,31.245683],[121.375686,31.244486],[121.377216,31.247719],[121.380886,31.257766],[121.377508,31.259478],[121.375158,31.25949],[121.374574,31.257059],[121.365884,31.257682],[121.366023,31.259358],[121.361783,31.259945],[121.358918,31.263609],[121.35985,31.266997],[121.362227,31.26756],[121.366996,31.266662],[121.367441,31.269631],[121.361268,31.27084],[121.358918,31.268793],[121.35732,31.271415],[121.344723,31.273917],[121.343541,31.271439],[121.338272,31.272839],[121.338883,31.275006],[121.336228,31.275461],[121.336061,31.280046],[121.335004,31.279711],[121.332738,31.286067],[121.328998,31.284595],[121.327316,31.285182],[121.326384,31.288928],[121.332821,31.290915],[121.332224,31.292998],[121.336506,31.294901],[121.33588,31.297044],[121.334198,31.296122],[121.331306,31.301436],[121.335686,31.303339],[121.338981,31.310101],[121.340357,31.311525],[121.343458,31.317185],[121.347698,31.316706],[121.347782,31.319542],[121.3492,31.321313],[121.345585,31.320835],[121.344848,31.323335],[121.347517,31.324077],[121.345932,31.32513],[121.342318,31.331005],[121.341692,31.33329],[121.342846,31.336066],[121.34628,31.336329],[121.344347,31.341928],[121.342401,31.341306],[121.338925,31.344775],[121.337521,31.344536],[121.336464,31.346821],[121.332502,31.347084],[121.332251,31.351307],[121.334643,31.3509],[121.337743,31.3534],[121.337118,31.356019],[121.341428,31.357802],[121.340329,31.360517],[121.338911,31.360995],[121.337576,31.364189],[121.335018,31.366963],[121.335991,31.370097],[121.333336,31.371281],[121.334003,31.37262],[121.331389,31.37433],[121.328734,31.377344],[121.331306,31.378456],[121.330527,31.381135],[121.326607,31.381063],[121.323061,31.388489],[121.320419,31.389123],[121.323339,31.393331],[121.323145,31.395866],[121.321476,31.397576],[121.317444,31.39742],[121.314747,31.398365],[121.315637,31.402729],[121.317375,31.403661],[121.314316,31.4072],[121.32847,31.411958],[121.330444,31.410308],[121.333141,31.410739],[121.332488,31.413117],[121.334101,31.413655],[121.33239,31.416943],[121.336561,31.419058],[121.336422,31.424999],[121.335143,31.429158],[121.336645,31.429493],[121.336603,31.432254],[121.333656,31.440118],[121.331236,31.439652],[121.328261,31.441098],[121.326106,31.448041],[121.327399,31.448829],[121.324132,31.455007],[121.319794,31.454876],[121.318654,31.456895],[121.320531,31.457289],[121.317778,31.460109],[121.317277,31.466262],[121.320058,31.466728],[121.320572,31.469058],[121.317958,31.468472],[121.31426,31.472474],[121.318807,31.475055],[121.315956,31.481219],[121.313342,31.480598],[121.310214,31.487311],[121.308629,31.488649],[121.31027,31.489735],[121.309171,31.492495],[121.306544,31.493307],[121.304667,31.495779],[121.300857,31.496747],[121.300496,31.494537],[121.298563,31.493713],[121.298605,31.491515],[121.293488,31.489807],[121.29061,31.491694],[121.289387,31.489031],[121.285355,31.490679],[121.283686,31.489795],[121.279696,31.490404],[121.280321,31.488672],[121.276442,31.486654],[121.27622,31.485376],[121.272049,31.484337],[121.268879,31.487466],[121.267322,31.486224],[121.267433,31.483357],[121.265153,31.48313],[121.261732,31.480777],[121.261454,31.478854],[121.254794,31.477635],[121.255643,31.483632],[121.253627,31.483082],[121.253362,31.479809],[121.251221,31.479606],[121.249692,31.477623],[121.247064,31.477062],[121.245813,31.479881],[121.248176,31.481876],[121.244409,31.481183],[121.243797,31.487311],[121.241141,31.490906],[121.240877,31.493701],[121.237234,31.491957],[121.234746,31.492686],[121.235413,31.488099],[121.232994,31.487896],[121.22867,31.482127],[121.230839,31.481111],[121.230352,31.477432],[121.226209,31.477683],[121.225361,31.476022],[121.220731,31.47607],[121.219062,31.475222],[121.21364,31.475939],[121.21503,31.477528],[121.214377,31.479128],[121.206368,31.474995],[121.203421,31.472331],[121.202906,31.469356],[121.195051,31.467827],[121.186055,31.460814],[121.185457,31.457468],[121.186055,31.454362],[121.180814,31.451458],[121.174974,31.449295],[121.16983,31.450024],[121.16773,31.448315],[121.166048,31.450168],[121.163045,31.448865],[121.160917,31.449678],[121.147348,31.44393],[121.146569,31.439006],[121.14782,31.436186],[121.152492,31.433604],[121.158484,31.432254],[121.162711,31.432218],[121.16253,31.429565],[121.16431,31.427222],[121.162002,31.427951],[121.161362,31.425776],[121.155273,31.42574],[121.151157,31.421796],[121.146249,31.421078],[121.146208,31.419704],[121.149266,31.41913],[121.148905,31.415867],[121.153493,31.413679],[121.155523,31.413835],[121.154508,31.411575],[121.15886,31.410117],[121.157887,31.407893],[121.153104,31.405837],[121.153896,31.403685],[121.15049,31.402215],[121.149586,31.399381],[121.152742,31.398174],[121.147653,31.397325],[121.149475,31.394503],[121.14383,31.392327],[121.147097,31.3899],[121.148988,31.38691],[121.148432,31.385404],[121.141425,31.38355],[121.141049,31.384531],[121.137518,31.382785],[121.138408,31.381147],[121.131762,31.378815],[121.131247,31.379664],[121.124268,31.376722],[121.12328,31.37848],[121.118206,31.375837],[121.113757,31.37445],[121.11523,31.371137],[121.119082,31.370563],[121.120208,31.368674],[121.113173,31.36688],[121.112853,31.365133],[121.10928,31.364703],[121.10889,31.366509],[121.106958,31.366593],[121.106749,31.364535],[121.108251,31.360457],[121.107361,31.354763],[121.108418,31.354034],[121.10832,31.350649],[121.111157,31.351534],[121.111838,31.350517],[121.117246,31.351689],[121.120194,31.347562],[121.11733,31.34712],[121.117969,31.343447],[121.123948,31.342753],[121.130441,31.344213],[121.130816,31.341509],[121.130121,31.334702],[121.13115,31.332106],[121.132582,31.331962],[121.133305,31.325585],[121.131539,31.325441],[121.131637,31.32324],[121.127257,31.319315],[121.127076,31.316934],[121.128633,31.314265],[121.127966,31.311884],[121.129773,31.308306],[121.129134,31.307528],[121.129954,31.302597],[121.133778,31.30207],[121.139645,31.302992],[121.13895,31.305625],[121.143774,31.309706],[121.146903,31.305936],[121.150782,31.299018],[121.148933,31.298875],[121.152714,31.294075],[121.151282,31.291933],[121.154689,31.290053],[121.156399,31.287408],[121.159305,31.28766],[121.161293,31.283985],[121.159402,31.281579],[121.155537,31.280765],[121.155481,31.278442],[121.153743,31.276646]]]]}},{"type":"Feature","properties":{"adcode":310115,"name":"浦东新区","center":[121.567706,31.245944],"centroid":[121.742177,31.083823],"childrenNum":0,"level":"district","parent":{"adcode":310000},"subFeatureIndex":10,"acroutes":[100000,310000]},"geometry":{"type":"MultiPolygon","coordinates":[[[[121.570475,30.998345],[121.576746,30.999474],[121.582933,30.999498],[121.584309,31.000819],[121.594682,31.000699],[121.595585,31.002043],[121.604066,31.001131],[121.614717,31.001251],[121.61772,30.995692],[121.62057,30.992678],[121.646695,30.99335],[121.654536,30.993254],[121.663115,30.992714],[121.669525,30.991609],[121.673348,30.989832],[121.674558,30.991802],[121.683595,30.989808],[121.688086,30.990145],[121.69298,30.98934],[121.699459,30.987419],[121.705507,30.984981],[121.712792,30.980934],[121.73191,30.967784],[121.733954,30.964469],[121.737916,30.960637],[121.73686,30.958703],[121.739988,30.956721],[121.743742,30.956589],[121.747857,30.951893],[121.749234,30.953046],[121.751987,30.952721],[121.759286,30.949154],[121.761024,30.947604],[121.760927,30.944613],[121.764542,30.941766],[121.761677,30.940132],[121.761469,30.938414],[121.764277,30.938522],[121.763846,30.936852],[121.766432,30.936539],[121.76799,30.93833],[121.769769,30.935278],[121.773023,30.933932],[121.77337,30.931553],[121.777806,30.931025],[121.777653,30.926723],[121.781115,30.917567],[121.780239,30.911811],[121.77896,30.910116],[121.778334,30.903807],[121.778987,30.899468],[121.778807,30.894588],[121.776012,30.886426],[121.776679,30.881005],[121.773134,30.880596],[121.772481,30.875703],[121.771605,30.875427],[121.768143,30.863272],[121.769338,30.85043],[121.793767,30.816862],[121.904467,30.814155],[121.915284,30.812892],[121.9246,30.8066],[121.943689,30.777096],[121.969703,30.789202],[121.955466,30.817138],[121.954326,30.821409],[121.954715,30.825811],[121.970732,30.839077],[121.985372,30.850694],[121.993951,30.863055],[121.996982,30.874898],[121.998497,30.899961],[121.996231,30.935458],[121.990934,30.968432],[121.977558,31.016101],[121.962682,31.047284],[121.94679,31.065883],[121.889465,31.121705],[121.884029,31.130638],[121.853358,31.155346],[121.809812,31.196907],[121.743742,31.283207],[121.729101,31.298288],[121.722511,31.303518],[121.712431,31.309407],[121.689448,31.322462],[121.610559,31.368195],[121.603038,31.372656],[121.593708,31.376411],[121.559811,31.38361],[121.538011,31.388489],[121.521229,31.39479],[121.512372,31.385858],[121.507284,31.379102],[121.503835,31.373744],[121.50346,31.369403],[121.503835,31.36493],[121.508424,31.357251],[121.514903,31.352],[121.525483,31.346797],[121.549398,31.337789],[121.555779,31.333948],[121.558574,31.331256],[121.560493,31.32781],[121.561883,31.321158],[121.561758,31.303339],[121.562523,31.29976],[121.565456,31.294135],[121.569141,31.285254],[121.56953,31.279567],[121.568515,31.275701],[121.563537,31.268805],[121.559074,31.264219],[121.541542,31.251826],[121.536384,31.249623],[121.527555,31.247252],[121.516488,31.246953],[121.50688,31.246474],[121.500012,31.244989],[121.494826,31.24221],[121.493491,31.240163],[121.493491,31.23615],[121.495744,31.232977],[121.502014,31.228018],[121.506741,31.223119],[121.509397,31.218459],[121.509911,31.214506],[121.508368,31.210158],[121.501319,31.199747],[121.498066,31.195601],[121.494631,31.192857],[121.490752,31.191467],[121.475987,31.187885],[121.468729,31.184122],[121.466254,31.18109],[121.464905,31.178022],[121.464905,31.17541],[121.468159,31.167092],[121.469369,31.162298],[121.468354,31.158091],[121.46574,31.155118],[121.460387,31.150276],[121.457453,31.146451],[121.457453,31.142232],[121.462431,31.134463],[121.468729,31.127868],[121.469674,31.124859],[121.469299,31.118731],[121.465211,31.1121],[121.470286,31.110937],[121.473984,31.112915],[121.474137,31.114354],[121.477321,31.110853],[121.481353,31.110697],[121.477446,31.117328],[121.481256,31.118024],[121.48191,31.120086],[121.485705,31.121933],[121.485969,31.124523],[121.490266,31.124283],[121.49281,31.118719],[121.498538,31.121501],[121.501583,31.114666],[121.505295,31.115494],[121.503863,31.118324],[121.50549,31.120002],[121.511343,31.12119],[121.513749,31.118012],[121.514513,31.115278],[121.521424,31.116309],[121.522869,31.115242],[121.525289,31.116741],[121.53142,31.11842],[121.532254,31.117208],[121.535341,31.117976],[121.537885,31.113983],[121.539526,31.115626],[121.542251,31.116153],[121.544225,31.111464],[121.547687,31.109653],[121.550426,31.11162],[121.549217,31.113419],[121.552317,31.113899],[121.553332,31.112688],[121.555279,31.114882],[121.556697,31.113083],[121.559867,31.111896],[121.557851,31.109797],[121.561396,31.106224],[121.561132,31.105264],[121.563649,31.101858],[121.562064,31.101258],[121.563315,31.098955],[121.566819,31.096569],[121.567264,31.09363],[121.564358,31.091891],[121.561855,31.091867],[121.561563,31.09357],[121.559088,31.091951],[121.551608,31.090128],[121.551539,31.088148],[121.548549,31.086889],[121.550565,31.082834],[121.553555,31.080303],[121.556405,31.081059],[121.557031,31.082702],[121.561563,31.08365],[121.563579,31.082486],[121.569766,31.081611],[121.571643,31.080063],[121.572658,31.081323],[121.575272,31.080063],[121.567639,31.0762],[121.56262,31.075121],[121.562675,31.074305],[121.557531,31.073357],[121.559033,31.072169],[121.555599,31.071689],[121.55279,31.069506],[121.556753,31.06737],[121.551789,31.065643],[121.551094,31.063795],[121.548549,31.063639],[121.547201,31.061647],[121.548383,31.056896],[121.543308,31.055696],[121.54328,31.054016],[121.540791,31.052528],[121.542307,31.049072],[121.541472,31.046396],[121.54588,31.047044],[121.547799,31.048544],[121.54955,31.047908],[121.550538,31.049396],[121.552693,31.0493],[121.554737,31.050824],[121.556127,31.047632],[121.557031,31.04798],[121.559811,31.044812],[121.562119,31.043635],[121.559464,31.041391],[121.559505,31.030278],[121.558254,31.029533],[121.558407,31.024528],[121.555765,31.022908],[121.552804,31.023268],[121.552262,31.020915],[121.554139,31.01861],[121.556516,31.01873],[121.556474,31.020255],[121.558699,31.020255],[121.56027,31.024132],[121.564302,31.021191],[121.569057,31.024396],[121.56839,31.025284],[121.572325,31.026677],[121.574758,31.020951],[121.574674,31.018634],[121.571018,31.016426],[121.569822,31.012452],[121.565859,31.011912],[121.568181,31.010063],[121.569725,31.010603],[121.571463,31.005633],[121.570253,31.004565],[121.570712,31.002295],[121.567959,31.000879],[121.570475,30.998345]]],[[[121.943244,31.215465],[121.941826,31.207678],[121.942619,31.198465],[121.944843,31.186878],[121.948027,31.176405],[121.952629,31.1672],[121.959637,31.159278],[121.965685,31.15754],[121.970773,31.157552],[121.975862,31.158834],[121.99573,31.1608],[121.999554,31.165079],[122.010593,31.188004],[122.012011,31.192043],[122.012609,31.210002],[122.011038,31.217405],[122.008563,31.220987],[121.989655,31.224521],[121.980659,31.22809],[121.969188,31.230282],[121.957259,31.230414],[121.951044,31.228821],[121.946595,31.224365],[121.943244,31.215465]]],[[[121.882625,31.240857],[121.880873,31.23633],[121.882541,31.225611],[121.885155,31.22052],[121.889271,31.214997],[121.901645,31.20146],[121.908777,31.195266],[121.913852,31.19384],[121.918788,31.194319],[121.922445,31.196859],[121.925448,31.205438],[121.927519,31.224017],[121.926727,31.229731],[121.923557,31.233863],[121.915451,31.236558],[121.897363,31.242115],[121.88991,31.242594],[121.882625,31.240857]]]]}},{"type":"Feature","properties":{"adcode":310116,"name":"金山区","center":[121.330736,30.724697],"centroid":[121.255144,30.818932],"childrenNum":0,"level":"district","parent":{"adcode":310000},"subFeatureIndex":11,"acroutes":[100000,310000]},"geometry":{"type":"MultiPolygon","coordinates":[[[[120.99673,30.950307],[120.996813,30.944625],[120.995673,30.944336],[120.997481,30.941141],[121.000818,30.937729],[121.000025,30.934701],[120.999622,30.91395],[120.998982,30.909527],[121.004572,30.909299],[121.004516,30.906955],[121.00257,30.904852],[120.998704,30.905946],[120.998635,30.903386],[120.995715,30.903723],[120.992809,30.90216],[120.992656,30.899732],[120.99046,30.89579],[120.992907,30.893915],[120.993824,30.88966],[121.005017,30.888794],[121.00852,30.888121],[121.008298,30.882964],[121.011092,30.882219],[121.017474,30.882724],[121.0186,30.880716],[121.021465,30.878793],[121.019421,30.876665],[121.021896,30.875162],[121.019796,30.873996],[121.020463,30.87188],[121.01778,30.873359],[121.014819,30.871027],[121.01778,30.86938],[121.013971,30.86439],[121.016265,30.862851],[121.015403,30.86053],[121.010981,30.856033],[121.015013,30.853604],[121.013359,30.851692],[121.010133,30.853135],[121.008006,30.850574],[121.006463,30.850454],[121.003974,30.846101],[121.000985,30.845632],[120.9999,30.843335],[120.997759,30.84408],[120.995659,30.838572],[120.992865,30.838392],[120.989987,30.834724],[120.989125,30.832318],[120.992462,30.831572],[120.989153,30.828698],[120.992754,30.825691],[120.990918,30.822708],[120.994603,30.821493],[121.00054,30.829431],[121.003446,30.826304],[121.006935,30.830779],[121.010898,30.834615],[121.014402,30.835818],[121.014874,30.833954],[121.030057,30.828553],[121.036647,30.818449],[121.037912,30.81389],[121.044976,30.815526],[121.043752,30.820013],[121.03908,30.818582],[121.03769,30.820266],[121.039192,30.820867],[121.040276,30.82438],[121.04175,30.825378],[121.039956,30.827218],[121.043516,30.828157],[121.045101,30.825907],[121.048896,30.825186],[121.046755,30.831091],[121.056335,30.835602],[121.062049,30.83779],[121.060228,30.842793],[121.061674,30.843383],[121.06052,30.845187],[121.066999,30.84877],[121.080471,30.848746],[121.097712,30.857103],[121.097684,30.854927],[121.102272,30.850261],[121.104789,30.849335],[121.110906,30.851416],[121.113159,30.854049],[121.114744,30.851476],[121.120055,30.849119],[121.121153,30.850165],[121.123545,30.847267],[121.12025,30.843299],[121.119832,30.83773],[121.117747,30.835301],[121.120639,30.836335],[121.127688,30.83565],[121.129982,30.834892],[121.131609,30.83601],[121.134612,30.833028],[121.132916,30.831608],[121.134264,30.828505],[121.136239,30.827868],[121.13742,30.829985],[121.13742,30.825029],[121.132373,30.819279],[121.130218,30.815574],[121.128202,30.810221],[121.126047,30.79304],[121.126576,30.788998],[121.125255,30.788179],[121.120041,30.788552],[121.117219,30.786073],[121.12342,30.77895],[121.127521,30.778673],[121.131817,30.777313],[121.13603,30.777337],[121.1387,30.77842],[121.140618,30.776928],[121.144122,30.779479],[121.152687,30.778974],[121.155815,30.777205],[121.160681,30.776579],[121.160737,30.773221],[121.163434,30.775279],[121.168968,30.775953],[121.170789,30.777084],[121.170984,30.774677],[121.174668,30.772018],[121.179965,30.774376],[121.183441,30.775038],[121.185791,30.776651],[121.186361,30.779034],[121.189517,30.778974],[121.190963,30.781092],[121.191839,30.778853],[121.196956,30.773354],[121.20032,30.773618],[121.199166,30.780755],[121.200098,30.783294],[121.205534,30.785905],[121.213723,30.785929],[121.217992,30.784954],[121.2234,30.775977],[121.224624,30.776976],[121.226209,30.775087],[121.226918,30.770826],[121.229115,30.767974],[121.230686,30.763737],[121.232298,30.755817],[121.23729,30.752651],[121.243102,30.750533],[121.244756,30.749185],[121.256393,30.743948],[121.261343,30.738217],[121.266835,30.733498],[121.26817,30.734931],[121.271451,30.73227],[121.269755,30.730729],[121.271451,30.726948],[121.270339,30.725864],[121.272035,30.723252],[121.270102,30.72047],[121.270339,30.716894],[121.267057,30.715039],[121.268448,30.712149],[121.265862,30.709488],[121.266668,30.706296],[121.268031,30.706103],[121.268656,30.702129],[121.270672,30.701563],[121.270422,30.69807],[121.271604,30.69689],[121.274649,30.6774],[121.291041,30.678328],[121.326718,30.67593],[121.346642,30.675593],[121.35433,30.676991],[121.361894,30.67952],[121.406997,30.718086],[121.426365,30.730283],[121.478767,30.756347],[121.465072,30.776483],[121.451711,30.798323],[121.44672,30.805577],[121.445427,30.804868],[121.441645,30.806829],[121.437029,30.818101],[121.425989,30.81869],[121.420525,30.819797],[121.419288,30.81602],[121.415131,30.815803],[121.41552,30.819941],[121.414171,30.821757],[121.41235,30.821505],[121.404786,30.823081],[121.400991,30.827399],[121.400685,30.830105],[121.403632,30.829877],[121.404202,30.833797],[121.399712,30.834182],[121.397376,30.833292],[121.396986,30.827988],[121.392051,30.82782],[121.391717,30.829913],[121.387588,30.829864],[121.387588,30.832799],[121.383764,30.833906],[121.379259,30.840112],[121.379065,30.843238],[121.385446,30.843178],[121.384918,30.848073],[121.383722,30.851765],[121.384376,30.856238],[121.383472,30.859232],[121.384001,30.863488],[121.381929,30.863765],[121.381873,30.867324],[121.38286,30.869043],[121.382791,30.874489],[121.381498,30.876605],[121.382207,30.878961],[121.377535,30.879983],[121.371751,30.883698],[121.370166,30.883914],[121.367233,30.886667],[121.36327,30.886955],[121.361185,30.892977],[121.360476,30.897785],[121.358418,30.900598],[121.35668,30.908614],[121.351814,30.913217],[121.350604,30.911402],[121.347573,30.913145],[121.343819,30.909119],[121.340162,30.908554],[121.336631,30.906739],[121.334657,30.907737],[121.331097,30.907508],[121.327635,30.91014],[121.325939,30.908962],[121.321518,30.908986],[121.320127,30.91109],[121.314608,30.909143],[121.313829,30.910717],[121.306808,30.910212],[121.306502,30.912123],[121.303721,30.912099],[121.303443,30.909287],[121.301775,30.908458],[121.29848,30.909744],[121.296269,30.914959],[121.294809,30.914947],[121.294948,30.918504],[121.288844,30.916894],[121.288705,30.909912],[121.290068,30.909804],[121.291013,30.902677],[121.290151,30.900021],[121.288719,30.899961],[121.288413,30.896066],[121.285799,30.895429],[121.285257,30.896631],[121.28231,30.896571],[121.282073,30.894804],[121.27964,30.894456],[121.279098,30.897112],[121.274663,30.896078],[121.27298,30.900405],[121.270422,30.900165],[121.269046,30.901679],[121.266168,30.901715],[121.266932,30.906258],[121.262525,30.906835],[121.262122,30.908097],[121.258952,30.907208],[121.255893,30.907977],[121.255226,30.909551],[121.246619,30.9099],[121.243686,30.917855],[121.245507,30.917074],[121.244589,30.920307],[121.242935,30.91991],[121.240655,30.925149],[121.238166,30.924861],[121.234773,30.925978],[121.234495,30.928562],[121.227335,30.926783],[121.222997,30.930748],[121.218145,30.927684],[121.211026,30.92128],[121.207522,30.919886],[121.194828,30.917314],[121.187765,30.916593],[121.186472,30.915404],[121.174654,30.915115],[121.171262,30.914683],[121.16691,30.916978],[121.164616,30.919934],[121.158206,30.920295],[121.156746,30.918961],[121.156288,30.912616],[121.156649,30.909972],[121.152895,30.9102],[121.149836,30.912616],[121.142162,30.915596],[121.143246,30.918108],[121.139061,30.91961],[121.13742,30.913349],[121.14009,30.910332],[121.139673,30.907388],[121.14098,30.904984],[121.141258,30.901331],[121.134417,30.901812],[121.131706,30.899732],[121.130163,30.902593],[121.123545,30.902857],[121.122224,30.901114],[121.118164,30.901487],[121.113451,30.897425],[121.111087,30.899228],[121.110851,30.90103],[121.113506,30.903602],[121.117802,30.910705],[121.119346,30.911991],[121.121445,30.919958],[121.114591,30.921676],[121.110962,30.921749],[121.105122,30.920138],[121.104358,30.922758],[121.100395,30.926459],[121.091358,30.916185],[121.089022,30.915296],[121.089092,30.911979],[121.093805,30.909708],[121.096196,30.910332],[121.098782,30.906607],[121.097128,30.903206],[121.09425,30.902545],[121.094347,30.904804],[121.091664,30.90341],[121.083725,30.905285],[121.081806,30.904251],[121.080833,30.905946],[121.072421,30.904924],[121.072491,30.903182],[121.068973,30.902124],[121.067944,30.904504],[121.056529,30.90335],[121.053026,30.903374],[121.045184,30.901896],[121.04232,30.899408],[121.040874,30.900706],[121.040332,30.904504],[121.038788,30.902148],[121.034395,30.902737],[121.034659,30.90615],[121.025288,30.909059],[121.024885,30.911618],[121.025872,30.91675],[121.028319,30.922602],[121.028694,30.92754],[121.031503,30.936083],[121.031851,30.939771],[121.029612,30.941874],[121.02989,30.944457],[121.028041,30.94394],[121.019462,30.941165],[121.016932,30.941333],[121.017697,30.939219],[121.015291,30.940288],[121.013831,30.944168],[121.011607,30.943604],[121.011079,30.947184],[121.013345,30.946811],[121.015361,30.948169],[121.010175,30.950727],[121.00763,30.947628],[121.002653,30.947015],[121.002055,30.95104],[120.99673,30.950307]]],[[[121.426671,30.682183],[121.426796,30.680315],[121.428589,30.681749],[121.426671,30.682183]]],[[[121.422458,30.691482],[121.419469,30.691626],[121.419482,30.689856],[121.425364,30.687374],[121.428909,30.689109],[121.426615,30.691277],[121.422458,30.691482]]],[[[121.406775,30.704995],[121.406622,30.703093],[121.409291,30.704514],[121.406775,30.704995]]]]}},{"type":"Feature","properties":{"adcode":310117,"name":"松江区","center":[121.223543,31.03047],"centroid":[121.220231,31.015194],"childrenNum":0,"level":"district","parent":{"adcode":310000},"subFeatureIndex":12,"acroutes":[100000,310000]},"geometry":{"type":"MultiPolygon","coordinates":[[[[121.323854,31.162933],[121.322491,31.162394],[121.320934,31.158487],[121.318056,31.157564],[121.316221,31.160189],[121.301441,31.15549],[121.295435,31.15392],[121.287134,31.152313],[121.285438,31.153452],[121.28313,31.152158],[121.283825,31.150839],[121.28028,31.150539],[121.277763,31.152265],[121.278723,31.14825],[121.276415,31.145852],[121.277012,31.144174],[121.279293,31.145708],[121.281781,31.142016],[121.284173,31.142627],[121.287482,31.139954],[121.280989,31.133252],[121.265737,31.136393],[121.26557,31.134787],[121.263623,31.135422],[121.26062,31.132269],[121.261607,31.127173],[121.257965,31.127077],[121.258048,31.132353],[121.25378,31.13264],[121.246995,31.134163],[121.245479,31.130758],[121.239348,31.129955],[121.245326,31.129295],[121.244534,31.125398],[121.239848,31.126238],[121.236831,31.125698],[121.235816,31.118959],[121.233884,31.117316],[121.224095,31.115146],[121.221301,31.115074],[121.221732,31.119931],[121.223581,31.126442],[121.226765,31.134139],[121.227988,31.139091],[121.22055,31.138383],[121.208287,31.135686],[121.206174,31.138299],[121.200348,31.137832],[121.201627,31.140937],[121.199653,31.139582],[121.194717,31.138179],[121.181968,31.143478],[121.181662,31.131777],[121.179868,31.131873],[121.180341,31.127425],[121.181842,31.126957],[121.181815,31.124295],[121.183858,31.124295],[121.183817,31.118695],[121.178839,31.117149],[121.17642,31.119007],[121.174321,31.117868],[121.17521,31.115242],[121.172986,31.114091],[121.174487,31.108538],[121.170497,31.109054],[121.170567,31.107819],[121.166451,31.10831],[121.166799,31.104293],[121.1652,31.104269],[121.165492,31.101438],[121.159569,31.100539],[121.154397,31.101846],[121.154341,31.098884],[121.156788,31.098943],[121.156733,31.09315],[121.155384,31.093162],[121.155161,31.090475],[121.153465,31.09014],[121.152867,31.092035],[121.151157,31.091651],[121.149461,31.095297],[121.14586,31.093954],[121.144483,31.097456],[121.141897,31.096893],[121.141605,31.09868],[121.135766,31.09808],[121.133319,31.099075],[121.131942,31.10205],[121.130691,31.100527],[121.127688,31.103309],[121.125505,31.103369],[121.120959,31.107747],[121.117733,31.108874],[121.11612,31.110973],[121.114368,31.109797],[121.112589,31.111932],[121.108751,31.107159],[121.103551,31.102638],[121.103843,31.100539],[121.100618,31.098428],[121.097976,31.099339],[121.099853,31.096593],[121.099519,31.094158],[121.097601,31.093534],[121.10084,31.088688],[121.099408,31.085941],[121.100687,31.080939],[121.102912,31.080219],[121.107264,31.082115],[121.112603,31.077628],[121.117121,31.075624],[121.118386,31.075948],[121.121543,31.07019],[121.122238,31.067178],[121.126228,31.06665],[121.126395,31.059811],[121.127757,31.059751],[121.12588,31.057376],[121.120708,31.057268],[121.117997,31.058407],[121.118206,31.056068],[121.10864,31.05662],[121.10839,31.057939],[121.101813,31.05728],[121.101146,31.053644],[121.098337,31.05662],[121.094639,31.056332],[121.093012,31.058443],[121.094542,31.061899],[121.092929,31.064539],[121.088202,31.064671],[121.085935,31.062847],[121.086519,31.061167],[121.08442,31.058779],[121.080972,31.056896],[121.082404,31.054208],[121.085866,31.050224],[121.087159,31.052948],[121.089926,31.05194],[121.090259,31.048136],[121.09621,31.044812],[121.09311,31.040719],[121.095863,31.040479],[121.097767,31.038871],[121.100284,31.03341],[121.099936,31.031202],[121.096975,31.031454],[121.096405,31.026437],[121.091177,31.025933],[121.089509,31.027901],[121.085532,31.0255],[121.093026,31.020207],[121.10205,31.011756],[121.104205,31.007998],[121.104107,30.99508],[121.100145,30.994935],[121.099227,30.981979],[121.099686,30.980994],[121.099172,30.973068],[121.095557,30.974245],[121.095779,30.968408],[121.097489,30.965634],[121.093555,30.964673],[121.088035,30.964168],[121.088174,30.962151],[121.081236,30.962283],[121.080736,30.960181],[121.078539,30.960025],[121.079109,30.958283],[121.076634,30.957574],[121.076495,30.955809],[121.07231,30.955088],[121.065344,30.95516],[121.060339,30.956517],[121.059505,30.959184],[121.056891,30.96191],[121.05735,30.965346],[121.053262,30.964445],[121.051024,30.969369],[121.047409,30.969033],[121.0467,30.970246],[121.043112,30.969429],[121.045949,30.963448],[121.042626,30.960433],[121.043516,30.957514],[121.040401,30.956493],[121.036258,30.957094],[121.034659,30.952974],[121.033213,30.947111],[121.027902,30.945826],[121.028041,30.94394],[121.02989,30.944457],[121.029612,30.941874],[121.031851,30.939771],[121.031503,30.936083],[121.028694,30.92754],[121.028319,30.922602],[121.025872,30.91675],[121.024885,30.911618],[121.025288,30.909059],[121.034659,30.90615],[121.034395,30.902737],[121.038788,30.902148],[121.040332,30.904504],[121.040874,30.900706],[121.04232,30.899408],[121.045184,30.901896],[121.053026,30.903374],[121.056529,30.90335],[121.067944,30.904504],[121.068973,30.902124],[121.072491,30.903182],[121.072421,30.904924],[121.080833,30.905946],[121.081806,30.904251],[121.083725,30.905285],[121.091664,30.90341],[121.094347,30.904804],[121.09425,30.902545],[121.097128,30.903206],[121.098782,30.906607],[121.096196,30.910332],[121.093805,30.909708],[121.089092,30.911979],[121.089022,30.915296],[121.091358,30.916185],[121.100395,30.926459],[121.104358,30.922758],[121.105122,30.920138],[121.110962,30.921749],[121.114591,30.921676],[121.121445,30.919958],[121.119346,30.911991],[121.117802,30.910705],[121.113506,30.903602],[121.110851,30.90103],[121.111087,30.899228],[121.113451,30.897425],[121.118164,30.901487],[121.122224,30.901114],[121.123545,30.902857],[121.130163,30.902593],[121.131706,30.899732],[121.134417,30.901812],[121.141258,30.901331],[121.14098,30.904984],[121.139673,30.907388],[121.14009,30.910332],[121.13742,30.913349],[121.139061,30.91961],[121.143246,30.918108],[121.142162,30.915596],[121.149836,30.912616],[121.152895,30.9102],[121.156649,30.909972],[121.156288,30.912616],[121.156746,30.918961],[121.158206,30.920295],[121.164616,30.919934],[121.16691,30.916978],[121.171262,30.914683],[121.174654,30.915115],[121.186472,30.915404],[121.187765,30.916593],[121.194828,30.917314],[121.207522,30.919886],[121.211026,30.92128],[121.218145,30.927684],[121.222997,30.930748],[121.227335,30.926783],[121.234495,30.928562],[121.234773,30.925978],[121.238166,30.924861],[121.240655,30.925149],[121.242935,30.91991],[121.244589,30.920307],[121.245507,30.917074],[121.243686,30.917855],[121.246619,30.9099],[121.255226,30.909551],[121.255893,30.907977],[121.258952,30.907208],[121.262122,30.908097],[121.262525,30.906835],[121.266932,30.906258],[121.266168,30.901715],[121.269046,30.901679],[121.270422,30.900165],[121.27298,30.900405],[121.274663,30.896078],[121.279098,30.897112],[121.27964,30.894456],[121.282073,30.894804],[121.28231,30.896571],[121.285257,30.896631],[121.285799,30.895429],[121.288413,30.896066],[121.288719,30.899961],[121.290151,30.900021],[121.291013,30.902677],[121.290068,30.909804],[121.288705,30.909912],[121.288844,30.916894],[121.294948,30.918504],[121.294809,30.914947],[121.296269,30.914959],[121.29848,30.909744],[121.301775,30.908458],[121.303443,30.909287],[121.303721,30.912099],[121.306502,30.912123],[121.306808,30.910212],[121.313829,30.910717],[121.314608,30.909143],[121.320127,30.91109],[121.321518,30.908986],[121.325939,30.908962],[121.327635,30.91014],[121.331097,30.907508],[121.334657,30.907737],[121.336631,30.906739],[121.340162,30.908554],[121.343819,30.909119],[121.347573,30.913145],[121.350604,30.911402],[121.351814,30.913217],[121.355081,30.916341],[121.356054,30.919742],[121.355373,30.921388],[121.352161,30.923803],[121.352203,30.928213],[121.35116,30.930628],[121.355679,30.932058],[121.354706,30.933512],[121.357361,30.933632],[121.359336,30.935086],[121.362658,30.934761],[121.362408,30.939122],[121.361129,30.944048],[121.363868,30.945165],[121.365467,30.947232],[121.362478,30.948901],[121.362255,30.9517],[121.363117,30.956109],[121.362853,30.959544],[121.36099,30.965574],[121.361435,30.970438],[121.359961,30.976251],[121.35871,30.97786],[121.351258,30.975986],[121.34375,30.976599],[121.334406,30.980694],[121.329554,30.981318],[121.327371,30.980658],[121.3258,30.9833],[121.326898,30.989964],[121.326773,30.994479],[121.327482,30.995896],[121.330347,30.996905],[121.33823,31.006197],[121.339829,31.010267],[121.34425,31.013941],[121.34279,31.014817],[121.339898,31.013857],[121.333072,31.01334],[121.333725,31.015657],[121.333892,31.026917],[121.333308,31.030686],[121.334017,31.031922],[121.33367,31.040695],[121.335102,31.04564],[121.335338,31.060435],[121.341456,31.062763],[121.343444,31.059139],[121.35344,31.061287],[121.358195,31.064047],[121.357278,31.066758],[121.363743,31.068354],[121.364424,31.069878],[121.362116,31.072601],[121.364341,31.073705],[121.365481,31.077892],[121.368804,31.079127],[121.370625,31.078372],[121.372016,31.079871],[121.368289,31.088976],[121.362756,31.099771],[121.359085,31.098931],[121.35839,31.100791],[121.351341,31.099255],[121.348532,31.106655],[121.351675,31.107735],[121.352217,31.106487],[121.357014,31.110529],[121.356026,31.112532],[121.353774,31.111512],[121.35066,31.115554],[121.353065,31.117604],[121.349589,31.117748],[121.346753,31.121657],[121.347545,31.121969],[121.34489,31.12577],[121.346002,31.126202],[121.344014,31.129451],[121.344681,31.130338],[121.342095,31.134655],[121.33677,31.138971],[121.338814,31.14017],[121.336728,31.14355],[121.335477,31.143862],[121.333711,31.148765],[121.331292,31.149772],[121.331528,31.15205],[121.328775,31.156665],[121.327218,31.156856],[121.323854,31.162933]]]]}},{"type":"Feature","properties":{"adcode":310118,"name":"青浦区","center":[121.113021,31.151209],"centroid":[121.085188,31.124681],"childrenNum":0,"level":"district","parent":{"adcode":310000},"subFeatureIndex":13,"acroutes":[100000,310000]},"geometry":{"type":"MultiPolygon","coordinates":[[[[121.153743,31.276646],[121.150392,31.275437],[121.142996,31.275473],[121.142885,31.277664],[121.141161,31.276742],[121.137601,31.277592],[121.138032,31.278753],[121.131678,31.281363],[121.131053,31.280106],[121.127215,31.281207],[121.124323,31.283111],[121.125018,31.284404],[121.120361,31.286151],[121.11929,31.285122],[121.114994,31.285265],[121.111115,31.281746],[121.106666,31.276706],[121.103829,31.27533],[121.105442,31.273654],[121.09881,31.276251],[121.095404,31.287001],[121.093096,31.28821],[121.090134,31.291909],[121.086909,31.291717],[121.087326,31.290664],[121.084698,31.2876],[121.081361,31.277257],[121.084545,31.275713],[121.082154,31.271535],[121.080416,31.270158],[121.072741,31.26914],[121.068695,31.268098],[121.063245,31.267907],[121.061952,31.257945],[121.060979,31.246486],[121.057669,31.246749],[121.061646,31.24524],[121.064343,31.246138],[121.063565,31.242222],[121.063898,31.238438],[121.061243,31.237827],[121.062605,31.234689],[121.06458,31.232965],[121.067388,31.232929],[121.06718,31.230917],[121.064649,31.230785],[121.064719,31.227275],[121.0628,31.226964],[121.062633,31.224664],[121.065608,31.211871],[121.067805,31.201005],[121.069209,31.196524],[121.066609,31.197183],[121.06679,31.194966],[121.069599,31.195314],[121.070113,31.193612],[121.072185,31.193169],[121.07256,31.191527],[121.070614,31.1913],[121.07035,31.188735],[121.071684,31.185955],[121.068751,31.184889],[121.069474,31.182888],[121.074993,31.184386],[121.075591,31.182852],[121.071225,31.181462],[121.071406,31.179472],[121.074229,31.176225],[121.075424,31.173444],[121.072532,31.172701],[121.072379,31.169609],[121.075466,31.170316],[121.077371,31.16454],[121.07313,31.163257],[121.0737,31.161711],[121.076787,31.162622],[121.07605,31.160536],[121.077023,31.158451],[121.073839,31.157072],[121.072046,31.153512],[121.067777,31.152289],[121.069126,31.148705],[121.06572,31.148597],[121.066067,31.150947],[121.064135,31.150839],[121.062564,31.153129],[121.057378,31.152781],[121.055834,31.150659],[121.050273,31.150719],[121.049133,31.154615],[121.04542,31.154028],[121.045254,31.151582],[121.041472,31.14982],[121.041541,31.146931],[121.044781,31.145528],[121.041819,31.138899],[121.038649,31.136909],[121.036258,31.137376],[121.036119,31.140325],[121.033088,31.142208],[121.028778,31.141249],[121.028375,31.143874],[121.02672,31.143766],[121.025677,31.140769],[121.022271,31.140457],[121.022813,31.138311],[121.018489,31.134103],[121.007269,31.13342],[120.991252,31.13318],[120.983911,31.131705],[120.952642,31.138251],[120.93034,31.141404],[120.916923,31.136189],[120.905397,31.134211],[120.89921,31.136057],[120.881289,31.134727],[120.876422,31.131489],[120.872349,31.127161],[120.871014,31.123804],[120.870597,31.119715],[120.865967,31.11475],[120.862241,31.112508],[120.860225,31.10933],[120.857917,31.108526],[120.856804,31.102829],[120.859766,31.100287],[120.863993,31.100299],[120.865744,31.097624],[120.869582,31.097216],[120.869818,31.098943],[120.872543,31.098884],[120.873169,31.100323],[120.876631,31.099939],[120.876005,31.097864],[120.878967,31.09838],[120.878077,31.095753],[120.887476,31.094074],[120.891021,31.094302],[120.891216,31.09718],[120.892842,31.096533],[120.892175,31.094194],[120.895415,31.090703],[120.896694,31.086649],[120.899294,31.086937],[120.902116,31.085653],[120.901671,31.084094],[120.90473,31.080495],[120.904619,31.078528],[120.899614,31.07836],[120.898863,31.070514],[120.895915,31.063075],[120.894622,31.058659],[120.894567,31.053896],[120.895442,31.050332],[120.897208,31.04822],[120.897027,31.04558],[120.899739,31.039603],[120.901977,31.037647],[120.901338,31.0255],[120.900559,31.020423],[120.901365,31.017494],[120.910055,31.016942],[120.909944,31.012644],[120.911014,31.010555],[120.918105,31.012788],[120.926155,31.010423],[120.92699,31.012068],[120.931383,31.01178],[120.933789,31.010027],[120.938085,31.009007],[120.940087,31.010027],[120.935749,31.015381],[120.936305,31.01711],[120.949972,31.017638],[120.951168,31.024012],[120.948735,31.025068],[120.949124,31.029953],[120.951085,31.029077],[120.952197,31.030254],[120.958301,31.028573],[120.960483,31.021659],[120.964293,31.020771],[120.964849,31.019751],[120.963209,31.016594],[120.970202,31.016149],[120.982993,31.016089],[120.983855,31.014445],[120.989514,31.014397],[120.989987,31.010495],[120.991933,31.008154],[120.991057,31.00747],[120.992086,31.003424],[120.992045,30.997109],[120.989834,30.996664],[120.990515,30.994551],[120.994839,30.99526],[120.994603,30.991922],[120.997133,30.989232],[120.999344,30.980106],[121.000832,30.980466],[121.002361,30.97762],[121.000567,30.977007],[121.000512,30.973933],[120.99737,30.972444],[120.993143,30.972119],[120.991433,30.968372],[120.993699,30.964024],[120.992601,30.962835],[120.994756,30.958703],[120.991683,30.958211],[120.992531,30.955028],[120.994797,30.954824],[120.995368,30.950367],[120.99673,30.950307],[121.002055,30.95104],[121.002653,30.947015],[121.00763,30.947628],[121.010175,30.950727],[121.015361,30.948169],[121.013345,30.946811],[121.011079,30.947184],[121.011607,30.943604],[121.013831,30.944168],[121.015291,30.940288],[121.017697,30.939219],[121.016932,30.941333],[121.019462,30.941165],[121.028041,30.94394],[121.027902,30.945826],[121.033213,30.947111],[121.034659,30.952974],[121.036258,30.957094],[121.040401,30.956493],[121.043516,30.957514],[121.042626,30.960433],[121.045949,30.963448],[121.043112,30.969429],[121.0467,30.970246],[121.047409,30.969033],[121.051024,30.969369],[121.053262,30.964445],[121.05735,30.965346],[121.056891,30.96191],[121.059505,30.959184],[121.060339,30.956517],[121.065344,30.95516],[121.07231,30.955088],[121.076495,30.955809],[121.076634,30.957574],[121.079109,30.958283],[121.078539,30.960025],[121.080736,30.960181],[121.081236,30.962283],[121.088174,30.962151],[121.088035,30.964168],[121.093555,30.964673],[121.097489,30.965634],[121.095779,30.968408],[121.095557,30.974245],[121.099172,30.973068],[121.099686,30.980994],[121.099227,30.981979],[121.100145,30.994935],[121.104107,30.99508],[121.104205,31.007998],[121.10205,31.011756],[121.093026,31.020207],[121.085532,31.0255],[121.089509,31.027901],[121.091177,31.025933],[121.096405,31.026437],[121.096975,31.031454],[121.099936,31.031202],[121.100284,31.03341],[121.097767,31.038871],[121.095863,31.040479],[121.09311,31.040719],[121.09621,31.044812],[121.090259,31.048136],[121.089926,31.05194],[121.087159,31.052948],[121.085866,31.050224],[121.082404,31.054208],[121.080972,31.056896],[121.08442,31.058779],[121.086519,31.061167],[121.085935,31.062847],[121.088202,31.064671],[121.092929,31.064539],[121.094542,31.061899],[121.093012,31.058443],[121.094639,31.056332],[121.098337,31.05662],[121.101146,31.053644],[121.101813,31.05728],[121.10839,31.057939],[121.10864,31.05662],[121.118206,31.056068],[121.117997,31.058407],[121.120708,31.057268],[121.12588,31.057376],[121.127757,31.059751],[121.126395,31.059811],[121.126228,31.06665],[121.122238,31.067178],[121.121543,31.07019],[121.118386,31.075948],[121.117121,31.075624],[121.112603,31.077628],[121.107264,31.082115],[121.102912,31.080219],[121.100687,31.080939],[121.099408,31.085941],[121.10084,31.088688],[121.097601,31.093534],[121.099519,31.094158],[121.099853,31.096593],[121.097976,31.099339],[121.100618,31.098428],[121.103843,31.100539],[121.103551,31.102638],[121.108751,31.107159],[121.112589,31.111932],[121.114368,31.109797],[121.11612,31.110973],[121.117733,31.108874],[121.120959,31.107747],[121.125505,31.103369],[121.127688,31.103309],[121.130691,31.100527],[121.131942,31.10205],[121.133319,31.099075],[121.135766,31.09808],[121.141605,31.09868],[121.141897,31.096893],[121.144483,31.097456],[121.14586,31.093954],[121.149461,31.095297],[121.151157,31.091651],[121.152867,31.092035],[121.153465,31.09014],[121.155161,31.090475],[121.155384,31.093162],[121.156733,31.09315],[121.156788,31.098943],[121.154341,31.098884],[121.154397,31.101846],[121.159569,31.100539],[121.165492,31.101438],[121.1652,31.104269],[121.166799,31.104293],[121.166451,31.10831],[121.170567,31.107819],[121.170497,31.109054],[121.174487,31.108538],[121.172986,31.114091],[121.17521,31.115242],[121.174321,31.117868],[121.17642,31.119007],[121.178839,31.117149],[121.183817,31.118695],[121.183858,31.124295],[121.181815,31.124295],[121.181842,31.126957],[121.180341,31.127425],[121.179868,31.131873],[121.181662,31.131777],[121.181968,31.143478],[121.194717,31.138179],[121.199653,31.139582],[121.201627,31.140937],[121.200348,31.137832],[121.206174,31.138299],[121.208287,31.135686],[121.22055,31.138383],[121.227988,31.139091],[121.226765,31.134139],[121.223581,31.126442],[121.221732,31.119931],[121.221301,31.115074],[121.224095,31.115146],[121.233884,31.117316],[121.235816,31.118959],[121.236831,31.125698],[121.239848,31.126238],[121.244534,31.125398],[121.245326,31.129295],[121.239348,31.129955],[121.245479,31.130758],[121.246995,31.134163],[121.25378,31.13264],[121.258048,31.132353],[121.257965,31.127077],[121.261607,31.127173],[121.26062,31.132269],[121.263623,31.135422],[121.26557,31.134787],[121.265737,31.136393],[121.280989,31.133252],[121.287482,31.139954],[121.284173,31.142627],[121.281781,31.142016],[121.279293,31.145708],[121.277012,31.144174],[121.276415,31.145852],[121.278723,31.14825],[121.277763,31.152265],[121.28028,31.150539],[121.283825,31.150839],[121.28313,31.152158],[121.285438,31.153452],[121.287134,31.152313],[121.295435,31.15392],[121.301441,31.15549],[121.316221,31.160189],[121.318056,31.157564],[121.320934,31.158487],[121.322491,31.162394],[121.323854,31.162933],[121.318584,31.170256],[121.318042,31.173624],[121.316304,31.176836],[121.310784,31.18423],[121.30856,31.188388],[121.300565,31.197027],[121.297506,31.201412],[121.294837,31.203077],[121.292431,31.202514],[121.292126,31.200621],[121.287329,31.196332],[121.284034,31.194391],[121.277388,31.193576],[121.271701,31.198309],[121.266724,31.203257],[121.264777,31.203317],[121.263053,31.205701],[121.26468,31.206731],[121.263846,31.208912],[121.259397,31.212769],[121.261218,31.215081],[121.259675,31.218148],[121.25745,31.220208],[121.258215,31.222772],[121.256588,31.226329],[121.258006,31.226868],[121.257158,31.230701],[121.254155,31.23312],[121.252792,31.236965],[121.251082,31.238198],[121.249692,31.236534],[121.247912,31.240917],[121.241391,31.240222],[121.239932,31.241061],[121.241683,31.247348],[121.24591,31.248821],[121.247314,31.253287],[121.254183,31.258688],[121.246758,31.258448],[121.246577,31.259801],[121.242253,31.25937],[121.237693,31.262088],[121.235177,31.262699],[121.229087,31.262711],[121.229198,31.261717],[121.223539,31.260532],[121.223859,31.259035],[121.220216,31.257406],[121.221273,31.256293],[121.214182,31.254353],[121.212625,31.259837],[121.209761,31.260831],[121.209816,31.258017],[121.208482,31.25749],[121.206368,31.260065],[121.202865,31.257131],[121.203143,31.255814],[121.199848,31.255239],[121.19608,31.253395],[121.19626,31.251228],[121.193368,31.251455],[121.193021,31.253623],[121.188377,31.25476],[121.186444,31.252329],[121.183928,31.252246],[121.181537,31.254413],[121.17934,31.253419],[121.178798,31.255862],[121.176768,31.254605],[121.174251,31.256856],[121.171415,31.254928],[121.16894,31.256197],[121.170386,31.259119],[121.168036,31.259622],[121.167661,31.263944],[121.162614,31.269176],[121.161057,31.26762],[121.157845,31.270541],[121.155537,31.266147],[121.151783,31.267632],[121.153924,31.272061],[121.153743,31.276646]]]]}},{"type":"Feature","properties":{"adcode":310120,"name":"奉贤区","center":[121.458472,30.912345],"centroid":[121.56251,30.897998],"childrenNum":0,"level":"district","parent":{"adcode":310000},"subFeatureIndex":14,"acroutes":[100000,310000]},"geometry":{"type":"MultiPolygon","coordinates":[[[[121.570475,30.998345],[121.561494,30.995644],[121.555918,30.995152],[121.556224,30.993374],[121.553304,30.993026],[121.55279,30.98886],[121.549537,30.988307],[121.54613,30.99305],[121.543294,30.994203],[121.538233,30.993146],[121.537774,30.994683],[121.534507,30.995848],[121.531962,30.994815],[121.528612,30.99592],[121.522897,30.99981],[121.520325,30.999354],[121.520089,31.00256],[121.522105,31.002199],[121.520853,31.004445],[121.517002,31.007626],[121.510412,31.004553],[121.507881,31.004745],[121.503057,31.002716],[121.49883,30.999426],[121.498872,30.998213],[121.495924,30.998297],[121.491948,31.010039],[121.492879,31.012752],[121.489153,31.014949],[121.485872,31.014073],[121.476362,31.01334],[121.47144,31.011948],[121.465587,31.008755],[121.459942,31.007398],[121.448305,31.007458],[121.440811,31.005789],[121.436834,31.00406],[121.433636,31.001779],[121.431426,30.999174],[121.423973,30.994515],[121.413184,30.991069],[121.409333,30.990229],[121.394261,30.988247],[121.375227,30.982832],[121.35871,30.97786],[121.359961,30.976251],[121.361435,30.970438],[121.36099,30.965574],[121.362853,30.959544],[121.363117,30.956109],[121.362255,30.9517],[121.362478,30.948901],[121.365467,30.947232],[121.363868,30.945165],[121.361129,30.944048],[121.362408,30.939122],[121.362658,30.934761],[121.359336,30.935086],[121.357361,30.933632],[121.354706,30.933512],[121.355679,30.932058],[121.35116,30.930628],[121.352203,30.928213],[121.352161,30.923803],[121.355373,30.921388],[121.356054,30.919742],[121.355081,30.916341],[121.351814,30.913217],[121.35668,30.908614],[121.358418,30.900598],[121.360476,30.897785],[121.361185,30.892977],[121.36327,30.886955],[121.367233,30.886667],[121.370166,30.883914],[121.371751,30.883698],[121.377535,30.879983],[121.382207,30.878961],[121.381498,30.876605],[121.382791,30.874489],[121.38286,30.869043],[121.381873,30.867324],[121.381929,30.863765],[121.384001,30.863488],[121.383472,30.859232],[121.384376,30.856238],[121.383722,30.851765],[121.384918,30.848073],[121.385446,30.843178],[121.379065,30.843238],[121.379259,30.840112],[121.383764,30.833906],[121.387588,30.832799],[121.387588,30.829864],[121.391717,30.829913],[121.392051,30.82782],[121.396986,30.827988],[121.397376,30.833292],[121.399712,30.834182],[121.404202,30.833797],[121.403632,30.829877],[121.400685,30.830105],[121.400991,30.827399],[121.404786,30.823081],[121.41235,30.821505],[121.414171,30.821757],[121.41552,30.819941],[121.415131,30.815803],[121.419288,30.81602],[121.420525,30.819797],[121.425989,30.81869],[121.437029,30.818101],[121.441645,30.806829],[121.445427,30.804868],[121.44672,30.805577],[121.451711,30.798323],[121.465072,30.776483],[121.478767,30.756347],[121.517197,30.775387],[121.552832,30.789395],[121.601327,30.805084],[121.648419,30.8162],[121.68119,30.818401],[121.727071,30.817716],[121.77914,30.817222],[121.793767,30.816862],[121.769338,30.85043],[121.768143,30.863272],[121.771605,30.875427],[121.772481,30.875703],[121.773134,30.880596],[121.776679,30.881005],[121.776012,30.886426],[121.778807,30.894588],[121.778987,30.899468],[121.778334,30.903807],[121.77896,30.910116],[121.780239,30.911811],[121.781115,30.917567],[121.777653,30.926723],[121.777806,30.931025],[121.77337,30.931553],[121.773023,30.933932],[121.769769,30.935278],[121.76799,30.93833],[121.766432,30.936539],[121.763846,30.936852],[121.764277,30.938522],[121.761469,30.938414],[121.761677,30.940132],[121.764542,30.941766],[121.760927,30.944613],[121.761024,30.947604],[121.759286,30.949154],[121.751987,30.952721],[121.749234,30.953046],[121.747857,30.951893],[121.743742,30.956589],[121.739988,30.956721],[121.73686,30.958703],[121.737916,30.960637],[121.733954,30.964469],[121.73191,30.967784],[121.712792,30.980934],[121.705507,30.984981],[121.699459,30.987419],[121.69298,30.98934],[121.688086,30.990145],[121.683595,30.989808],[121.674558,30.991802],[121.673348,30.989832],[121.669525,30.991609],[121.663115,30.992714],[121.654536,30.993254],[121.646695,30.99335],[121.62057,30.992678],[121.61772,30.995692],[121.614717,31.001251],[121.604066,31.001131],[121.595585,31.002043],[121.594682,31.000699],[121.584309,31.000819],[121.582933,30.999498],[121.576746,30.999474],[121.570475,30.998345]]]]}},{"type":"Feature","properties":{"adcode":310151,"name":"崇明区","center":[121.397516,31.626946],"centroid":[121.568484,31.635916],"childrenNum":0,"level":"district","parent":{"adcode":310000},"subFeatureIndex":15,"acroutes":[100000,310000]},"geometry":{"type":"MultiPolygon","coordinates":[[[[121.975181,31.617034],[121.887616,31.63638],[121.817806,31.652025],[121.715267,31.673842],[121.642649,31.697454],[121.633278,31.696167],[121.627341,31.697776],[121.611755,31.704283],[121.602746,31.70694],[121.60091,31.707],[121.599659,31.703115],[121.593249,31.705379],[121.592262,31.706487],[121.578539,31.710527],[121.565025,31.716711],[121.551386,31.727386],[121.549509,31.726969],[121.540124,31.733307],[121.539429,31.735499],[121.528361,31.738347],[121.526693,31.740217],[121.514986,31.742873],[121.51304,31.743695],[121.498566,31.75326],[121.487749,31.753415],[121.476807,31.756142],[121.464141,31.757142],[121.455576,31.759346],[121.449751,31.761668],[121.445385,31.7643],[121.431481,31.769266],[121.425781,31.774267],[121.420915,31.779602],[121.410904,31.79558],[121.416312,31.79764],[121.411488,31.806341],[121.405468,31.809841],[121.399142,31.817483],[121.395388,31.821291],[121.385043,31.833525],[121.376381,31.838571],[121.369291,31.843283],[121.323061,31.868529],[121.315859,31.871479],[121.310367,31.872502],[121.3019,31.872716],[121.291166,31.870992],[121.281336,31.869041],[121.265584,31.864128],[121.252111,31.857727],[121.242073,31.853397],[121.225305,31.847043],[121.200334,31.835144],[121.181509,31.820411],[121.149225,31.787294],[121.118498,31.759084],[121.142064,31.755308],[121.145332,31.753927],[121.179868,31.720774],[121.289109,31.616283],[121.345585,31.571685],[121.37221,31.55321],[121.395457,31.585444],[121.403521,31.590002],[121.414797,31.591076],[121.43422,31.590336],[121.471176,31.57443],[121.547673,31.531125],[121.608794,31.50691],[121.617678,31.503673],[121.625784,31.501775],[121.638645,31.49972],[121.670609,31.494214],[121.682858,31.491061],[121.72988,31.471973],[121.763443,31.458233],[121.819183,31.438206],[121.834212,31.433975],[121.845377,31.431895],[121.857807,31.430043],[121.87299,31.429338],[121.882096,31.428656],[121.89055,31.428788],[121.901144,31.430126],[121.918051,31.434692],[121.934304,31.442364],[121.967284,31.456656],[121.981813,31.4641],[121.991698,31.476763],[121.995716,31.493104],[121.993867,31.51189],[121.98825,31.529597],[121.975181,31.617034]]],[[[121.778862,31.310196],[121.785494,31.311058],[121.791042,31.308353],[121.796701,31.30736],[121.798772,31.310352],[121.795866,31.329976],[121.796478,31.33542],[121.796005,31.345624],[121.793002,31.355074],[121.792377,31.363304],[121.790875,31.367059],[121.787886,31.37164],[121.780572,31.380154],[121.774135,31.386982],[121.76938,31.390749],[121.760857,31.395185],[121.753725,31.400362],[121.742185,31.407212],[121.737485,31.408814],[121.729296,31.410356],[121.723707,31.412364],[121.708316,31.419728],[121.697193,31.423995],[121.688294,31.425883],[121.673835,31.427748],[121.621752,31.444145],[121.606319,31.449403],[121.599812,31.450681],[121.585561,31.454672],[121.58303,31.456262],[121.575828,31.463813],[121.572811,31.469452],[121.567347,31.4835],[121.562356,31.486367],[121.549926,31.489747],[121.521132,31.493976],[121.516933,31.494298],[121.513457,31.493355],[121.509355,31.489795],[121.509105,31.485352],[121.510134,31.482581],[121.516849,31.477313],[121.529515,31.471172],[121.537413,31.466704],[121.54328,31.462403],[121.549773,31.457062],[121.558463,31.448793],[121.572255,31.436066],[121.590371,31.427545],[121.601425,31.421855],[121.641036,31.401115],[121.686682,31.376591],[121.727933,31.354799],[121.740766,31.346486],[121.744659,31.343675],[121.751166,31.337801],[121.76076,31.320344],[121.76425,31.315306],[121.770951,31.31168],[121.778862,31.310196]]],[[[122.242018,31.419082],[122.243562,31.417839],[122.247149,31.419333],[122.245369,31.421318],[122.242018,31.419082]]],[[[121.801775,31.356976],[121.802693,31.342789],[121.803152,31.332106],[121.80375,31.328445],[121.806642,31.324173],[121.81319,31.316228],[121.822617,31.307372],[121.832043,31.301711],[121.833601,31.299653],[121.840566,31.29544],[121.852885,31.292364],[121.856681,31.292818],[121.860782,31.294949],[121.865968,31.294937],[121.88959,31.292028],[121.900755,31.291167],[121.932261,31.283147],[121.975779,31.279998],[122.016447,31.282285],[122.072005,31.266829],[122.087285,31.257538],[122.097769,31.255658],[122.105207,31.262136],[122.122684,31.307205],[122.121975,31.315438],[122.116678,31.321229],[122.078012,31.323527],[122.04107,31.323814],[122.001556,31.329246],[121.951726,31.337274],[121.913074,31.350445],[121.870376,31.366007],[121.858516,31.369379],[121.852885,31.371376],[121.845586,31.374582],[121.831752,31.375526],[121.828401,31.376447],[121.824744,31.378588],[121.817445,31.380585],[121.803458,31.381219],[121.796756,31.381075],[121.793864,31.380477],[121.792808,31.377571],[121.797674,31.369642],[121.800566,31.363997],[121.801775,31.356976]]],[[[121.627049,31.444993],[121.631512,31.445101],[121.634001,31.445937],[121.636295,31.449881],[121.635044,31.452988],[121.631609,31.456823],[121.625172,31.462212],[121.61366,31.471339],[121.608571,31.474446],[121.602134,31.476835],[121.595293,31.478292],[121.586896,31.479535],[121.577149,31.479343],[121.575814,31.478197],[121.57612,31.474768],[121.577886,31.472486],[121.58627,31.464076],[121.594153,31.458568],[121.613855,31.447885],[121.616872,31.446643],[121.627049,31.444993]]]]}}]} \ No newline at end of file diff --git a/snowy-admin-web/public/img/ver.svg b/snowy-admin-web/public/img/ver.svg new file mode 100644 index 00000000..34fd73b8 --- /dev/null +++ b/snowy-admin-web/public/img/ver.svg @@ -0,0 +1,236 @@ + + + + +升级中 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/snowy-admin-web/public/tinymce/langs/zh_CN.js b/snowy-admin-web/public/tinymce/langs/zh_CN.js new file mode 100644 index 00000000..89b106c2 --- /dev/null +++ b/snowy-admin-web/public/tinymce/langs/zh_CN.js @@ -0,0 +1,419 @@ +tinymce.addI18n('zh_CN',{ +"Redo": "\u91cd\u505a", +"Undo": "\u64a4\u9500", +"Cut": "\u526a\u5207", +"Copy": "\u590d\u5236", +"Paste": "\u7c98\u8d34", +"Select all": "\u5168\u9009", +"New document": "\u65b0\u6587\u4ef6", +"Ok": "\u786e\u5b9a", +"Cancel": "\u53d6\u6d88", +"Visual aids": "\u7f51\u683c\u7ebf", +"Bold": "\u7c97\u4f53", +"Italic": "\u659c\u4f53", +"Underline": "\u4e0b\u5212\u7ebf", +"Strikethrough": "\u5220\u9664\u7ebf", +"Superscript": "\u4e0a\u6807", +"Subscript": "\u4e0b\u6807", +"Clear formatting": "\u6e05\u9664\u683c\u5f0f", +"Align left": "\u5de6\u8fb9\u5bf9\u9f50", +"Align center": "\u4e2d\u95f4\u5bf9\u9f50", +"Align right": "\u53f3\u8fb9\u5bf9\u9f50", +"Justify": "\u4e24\u7aef\u5bf9\u9f50", +"Bullet list": "\u9879\u76ee\u7b26\u53f7", +"Numbered list": "\u7f16\u53f7\u5217\u8868", +"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb", +"Increase indent": "\u589e\u52a0\u7f29\u8fdb", +"Close": "\u5173\u95ed", +"Formats": "\u683c\u5f0f", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u6253\u5f00\u526a\u8d34\u677f\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u7b49\u5feb\u6377\u952e\u3002", +"Headers": "\u6807\u9898", +"Header 1": "\u6807\u98981", +"Header 2": "\u6807\u98982", +"Header 3": "\u6807\u98983", +"Header 4": "\u6807\u98984", +"Header 5": "\u6807\u98985", +"Header 6": "\u6807\u98986", +"Headings": "\u6807\u9898", +"Heading 1": "\u6807\u98981", +"Heading 2": "\u6807\u98982", +"Heading 3": "\u6807\u98983", +"Heading 4": "\u6807\u98984", +"Heading 5": "\u6807\u98985", +"Heading 6": "\u6807\u98986", +"Preformatted": "\u9884\u5148\u683c\u5f0f\u5316\u7684", +"Div": "Div", +"Pre": "Pre", +"Code": "\u4ee3\u7801", +"Paragraph": "\u6bb5\u843d", +"Blockquote": "\u5f15\u6587\u533a\u5757", +"Inline": "\u6587\u672c", +"Blocks": "\u57fa\u5757", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002", +"Fonts": "\u5b57\u4f53", +"Font Sizes": "\u5b57\u53f7", +"Class": "\u7c7b\u578b", +"Browse for an image": "\u6d4f\u89c8\u56fe\u50cf", +"OR": "\u6216", +"Drop an image here": "\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64", +"Upload": "\u4e0a\u4f20", +"Block": "\u5757", +"Align": "\u5bf9\u9f50", +"Default": "\u9ed8\u8ba4", +"Circle": "\u7a7a\u5fc3\u5706", +"Disc": "\u5b9e\u5fc3\u5706", +"Square": "\u65b9\u5757", +"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd", +"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd", +"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd", +"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd", +"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd", +"Anchor...": "\u951a\u70b9...", +"Name": "\u540d\u79f0", +"Id": "\u6807\u8bc6\u7b26", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002", +"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f", +"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f", +"Special character...": "\u7279\u6b8a\u5b57\u7b26...", +"Source code": "\u6e90\u4ee3\u7801", +"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b", +"Language": "\u8bed\u8a00", +"Code sample...": "\u793a\u4f8b\u4ee3\u7801...", +"Color Picker": "\u9009\u8272\u5668", +"R": "R", +"G": "G", +"B": "B", +"Left to right": "\u4ece\u5de6\u5230\u53f3", +"Right to left": "\u4ece\u53f3\u5230\u5de6", +"Emoticons...": "\u8868\u60c5\u7b26\u53f7...", +"Metadata and Document Properties": "\u5143\u6570\u636e\u548c\u6587\u6863\u5c5e\u6027", +"Title": "\u6807\u9898", +"Keywords": "\u5173\u952e\u8bcd", +"Description": "\u63cf\u8ff0", +"Robots": "\u673a\u5668\u4eba", +"Author": "\u4f5c\u8005", +"Encoding": "\u7f16\u7801", +"Fullscreen": "\u5168\u5c4f", +"Action": "\u64cd\u4f5c", +"Shortcut": "\u5feb\u6377\u952e", +"Help": "\u5e2e\u52a9", +"Address": "\u5730\u5740", +"Focus to menubar": "\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f", +"Focus to toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f", +"Focus to element path": "\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84", +"Focus to contextual toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355", +"Insert link (if link plugin activated)": "\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Save (if save plugin activated)": "\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Find (if searchreplace plugin activated)": "\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Plugins installed ({0}):": "\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):", +"Premium plugins:": "\u4f18\u79c0\u63d2\u4ef6\uff1a", +"Learn more...": "\u4e86\u89e3\u66f4\u591a...", +"You are using {0}": "\u4f60\u6b63\u5728\u4f7f\u7528 {0}", +"Plugins": "\u63d2\u4ef6", +"Handy Shortcuts": "\u5feb\u6377\u952e", +"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf", +"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247", +"Image description": "\u56fe\u7247\u63cf\u8ff0", +"Source": "\u5730\u5740", +"Dimensions": "\u5927\u5c0f", +"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4", +"General": "\u666e\u901a", +"Advanced": "\u9ad8\u7ea7", +"Style": "\u6837\u5f0f", +"Vertical space": "\u5782\u76f4\u8fb9\u8ddd", +"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd", +"Border": "\u8fb9\u6846", +"Insert image": "\u63d2\u5165\u56fe\u7247", +"Image...": "\u56fe\u7247...", +"Image list": "\u56fe\u7247\u5217\u8868", +"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c", +"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c", +"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c", +"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c", +"Edit image": "\u7f16\u8f91\u56fe\u7247", +"Image options": "\u56fe\u7247\u9009\u9879", +"Zoom in": "\u653e\u5927", +"Zoom out": "\u7f29\u5c0f", +"Crop": "\u88c1\u526a", +"Resize": "\u8c03\u6574\u5927\u5c0f", +"Orientation": "\u65b9\u5411", +"Brightness": "\u4eae\u5ea6", +"Sharpen": "\u9510\u5316", +"Contrast": "\u5bf9\u6bd4\u5ea6", +"Color levels": "\u989c\u8272\u5c42\u6b21", +"Gamma": "\u4f3d\u9a6c\u503c", +"Invert": "\u53cd\u8f6c", +"Apply": "\u5e94\u7528", +"Back": "\u540e\u9000", +"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4", +"Date\/time": "\u65e5\u671f\/\u65f6\u95f4", +"Insert\/Edit Link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", +"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", +"Text to display": "\u663e\u793a\u6587\u5b57", +"Url": "\u5730\u5740", +"Open link in...": "\u94fe\u63a5\u6253\u5f00\u4f4d\u7f6e...", +"Current window": "\u5f53\u524d\u7a97\u53e3", +"None": "\u65e0", +"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00", +"Remove link": "\u5220\u9664\u94fe\u63a5", +"Anchors": "\u951a\u70b9", +"Link...": "\u94fe\u63a5...", +"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f", +"Link list": "\u94fe\u63a5\u5217\u8868", +"Insert video": "\u63d2\u5165\u89c6\u9891", +"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891", +"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53", +"Alternative source": "\u955c\u50cf", +"Alternative source URL": "\u66ff\u4ee3\u6765\u6e90\u7f51\u5740", +"Media poster (Image URL)": "\u5c01\u9762(\u56fe\u7247\u5730\u5740)", +"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:", +"Embed": "\u5185\u5d4c", +"Media...": "\u591a\u5a92\u4f53...", +"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c", +"Page break": "\u5206\u9875\u7b26", +"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c", +"Preview": "\u9884\u89c8", +"Print...": "\u6253\u5370...", +"Save": "\u4fdd\u5b58", +"Find": "\u67e5\u627e", +"Replace with": "\u66ff\u6362\u4e3a", +"Replace": "\u66ff\u6362", +"Replace all": "\u5168\u90e8\u66ff\u6362", +"Previous": "\u4e0a\u4e00\u4e2a", +"Next": "\u4e0b\u4e00\u4e2a", +"Find and replace...": "\u67e5\u627e\u5e76\u66ff\u6362...", +"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.", +"Match case": "\u533a\u5206\u5927\u5c0f\u5199", +"Find whole words only": "\u5168\u5b57\u5339\u914d", +"Spell check": "\u62fc\u5199\u68c0\u67e5", +"Ignore": "\u5ffd\u7565", +"Ignore all": "\u5168\u90e8\u5ffd\u7565", +"Finish": "\u5b8c\u6210", +"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178", +"Insert table": "\u63d2\u5165\u8868\u683c", +"Table properties": "\u8868\u683c\u5c5e\u6027", +"Delete table": "\u5220\u9664\u8868\u683c", +"Cell": "\u5355\u5143\u683c", +"Row": "\u884c", +"Column": "\u5217", +"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027", +"Merge cells": "\u5408\u5e76\u5355\u5143\u683c", +"Split cell": "\u62c6\u5206\u5355\u5143\u683c", +"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165", +"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165", +"Delete row": "\u5220\u9664\u884c", +"Row properties": "\u884c\u5c5e\u6027", +"Cut row": "\u526a\u5207\u884c", +"Copy row": "\u590d\u5236\u884c", +"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9", +"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9", +"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165", +"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165", +"Delete column": "\u5220\u9664\u5217", +"Cols": "\u5217", +"Rows": "\u884c", +"Width": "\u5bbd", +"Height": "\u9ad8", +"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd", +"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd", +"Show caption": "\u663e\u793a\u6807\u9898", +"Left": "\u5de6\u5bf9\u9f50", +"Center": "\u5c45\u4e2d", +"Right": "\u53f3\u5bf9\u9f50", +"Cell type": "\u5355\u5143\u683c\u7c7b\u578b", +"Scope": "\u8303\u56f4", +"Alignment": "\u5bf9\u9f50\u65b9\u5f0f", +"H Align": "\u6c34\u5e73\u5bf9\u9f50", +"V Align": "\u5782\u76f4\u5bf9\u9f50", +"Top": "\u9876\u90e8\u5bf9\u9f50", +"Middle": "\u5782\u76f4\u5c45\u4e2d", +"Bottom": "\u5e95\u90e8\u5bf9\u9f50", +"Header cell": "\u8868\u5934\u5355\u5143\u683c", +"Row group": "\u884c\u7ec4", +"Column group": "\u5217\u7ec4", +"Row type": "\u884c\u7c7b\u578b", +"Header": "\u8868\u5934", +"Body": "\u8868\u4f53", +"Footer": "\u8868\u5c3e", +"Border color": "\u8fb9\u6846\u989c\u8272", +"Insert template...": "\u63d2\u5165\u6a21\u677f...", +"Templates": "\u6a21\u677f", +"Template": "\u6a21\u677f", +"Text color": "\u6587\u5b57\u989c\u8272", +"Background color": "\u80cc\u666f\u8272", +"Custom...": "\u81ea\u5b9a\u4e49...", +"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272", +"No color": "\u65e0", +"Remove color": "\u79fb\u9664\u989c\u8272", +"Table of Contents": "\u5185\u5bb9\u5217\u8868", +"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846", +"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26", +"Word count": "\u5b57\u6570", +"Count": "\u8ba1\u6570", +"Document": "\u6587\u6863", +"Selection": "\u9009\u62e9", +"Words": "\u5355\u8bcd", +"Words: {0}": "\u5b57\u6570\uff1a{0}", +"{0} words": "{0} \u5b57", +"File": "\u6587\u4ef6", +"Edit": "\u7f16\u8f91", +"Insert": "\u63d2\u5165", +"View": "\u89c6\u56fe", +"Format": "\u683c\u5f0f", +"Table": "\u8868\u683c", +"Tools": "\u5de5\u5177", +"Powered by {0}": "\u7531{0}\u9a71\u52a8", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9", +"Image title": "\u56fe\u7247\u6807\u9898", +"Border width": "\u8fb9\u6846\u5bbd\u5ea6", +"Border style": "\u8fb9\u6846\u6837\u5f0f", +"Error": "\u9519\u8bef", +"Warn": "\u8b66\u544a", +"Valid": "\u6709\u6548", +"To open the popup, press Shift+Enter": "\u6309Shitf+Enter\u952e\u6253\u5f00\u5bf9\u8bdd\u6846", +"Rich Text Area. Press ALT-0 for help.": "\u7f16\u8f91\u533a\u3002\u6309Alt+0\u952e\u6253\u5f00\u5e2e\u52a9\u3002", +"System Font": "\u7cfb\u7edf\u5b57\u4f53", +"Failed to upload image: {0}": "\u56fe\u7247\u4e0a\u4f20\u5931\u8d25: {0}", +"Failed to load plugin: {0} from url {1}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25: {0} \u6765\u81ea\u94fe\u63a5 {1}", +"Failed to load plugin url: {0}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25 \u94fe\u63a5: {0}", +"Failed to initialize plugin: {0}": "\u63d2\u4ef6\u521d\u59cb\u5316\u5931\u8d25: {0}", +"example": "\u793a\u4f8b", +"Search": "\u641c\u7d22", +"All": "\u5168\u90e8", +"Currency": "\u8d27\u5e01", +"Text": "\u6587\u5b57", +"Quotations": "\u5f15\u7528", +"Mathematical": "\u6570\u5b66", +"Extended Latin": "\u62c9\u4e01\u8bed\u6269\u5145", +"Symbols": "\u7b26\u53f7", +"Arrows": "\u7bad\u5934", +"User Defined": "\u81ea\u5b9a\u4e49", +"dollar sign": "\u7f8e\u5143\u7b26\u53f7", +"currency sign": "\u8d27\u5e01\u7b26\u53f7", +"euro-currency sign": "\u6b27\u5143\u7b26\u53f7", +"colon sign": "\u5192\u53f7", +"cruzeiro sign": "\u514b\u9c81\u8d5b\u7f57\u5e01\u7b26\u53f7", +"french franc sign": "\u6cd5\u90ce\u7b26\u53f7", +"lira sign": "\u91cc\u62c9\u7b26\u53f7", +"mill sign": "\u5bc6\u5c14\u7b26\u53f7", +"naira sign": "\u5948\u62c9\u7b26\u53f7", +"peseta sign": "\u6bd4\u585e\u5854\u7b26\u53f7", +"rupee sign": "\u5362\u6bd4\u7b26\u53f7", +"won sign": "\u97e9\u5143\u7b26\u53f7", +"new sheqel sign": "\u65b0\u8c22\u514b\u5c14\u7b26\u53f7", +"dong sign": "\u8d8a\u5357\u76fe\u7b26\u53f7", +"kip sign": "\u8001\u631d\u57fa\u666e\u7b26\u53f7", +"tugrik sign": "\u56fe\u683c\u91cc\u514b\u7b26\u53f7", +"drachma sign": "\u5fb7\u62c9\u514b\u9a6c\u7b26\u53f7", +"german penny symbol": "\u5fb7\u56fd\u4fbf\u58eb\u7b26\u53f7", +"peso sign": "\u6bd4\u7d22\u7b26\u53f7", +"guarani sign": "\u74dc\u62c9\u5c3c\u7b26\u53f7", +"austral sign": "\u6fb3\u5143\u7b26\u53f7", +"hryvnia sign": "\u683c\u91cc\u592b\u5c3c\u4e9a\u7b26\u53f7", +"cedi sign": "\u585e\u5730\u7b26\u53f7", +"livre tournois sign": "\u91cc\u5f17\u5f17\u5c14\u7b26\u53f7", +"spesmilo sign": "spesmilo\u7b26\u53f7", +"tenge sign": "\u575a\u6208\u7b26\u53f7", +"indian rupee sign": "\u5370\u5ea6\u5362\u6bd4", +"turkish lira sign": "\u571f\u8033\u5176\u91cc\u62c9", +"nordic mark sign": "\u5317\u6b27\u9a6c\u514b", +"manat sign": "\u9a6c\u7eb3\u7279\u7b26\u53f7", +"ruble sign": "\u5362\u5e03\u7b26\u53f7", +"yen character": "\u65e5\u5143\u5b57\u6837", +"yuan character": "\u4eba\u6c11\u5e01\u5143\u5b57\u6837", +"yuan character, in hong kong and taiwan": "\u5143\u5b57\u6837\uff08\u6e2f\u53f0\u5730\u533a\uff09", +"yen\/yuan character variant one": "\u5143\u5b57\u6837\uff08\u5927\u5199\uff09", +"Loading emoticons...": "\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7...", +"Could not load emoticons": "\u4e0d\u80fd\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7", +"People": "\u4eba\u7c7b", +"Animals and Nature": "\u52a8\u7269\u548c\u81ea\u7136", +"Food and Drink": "\u98df\u7269\u548c\u996e\u54c1", +"Activity": "\u6d3b\u52a8", +"Travel and Places": "\u65c5\u6e38\u548c\u5730\u70b9", +"Objects": "\u7269\u4ef6", +"Flags": "\u65d7\u5e1c", +"Characters": "\u5b57\u7b26", +"Characters (no spaces)": "\u5b57\u7b26(\u65e0\u7a7a\u683c)", +"{0} characters": "{0} \u4e2a\u5b57\u7b26", +"Error: Form submit field collision.": "\u9519\u8bef: \u8868\u5355\u63d0\u4ea4\u5b57\u6bb5\u51b2\u7a81\u3002", +"Error: No form element found.": "\u9519\u8bef: \u6ca1\u6709\u8868\u5355\u63a7\u4ef6\u3002", +"Update": "\u66f4\u65b0", +"Color swatch": "\u989c\u8272\u6837\u672c", +"Turquoise": "\u9752\u7eff\u8272", +"Green": "\u7eff\u8272", +"Blue": "\u84dd\u8272", +"Purple": "\u7d2b\u8272", +"Navy Blue": "\u6d77\u519b\u84dd", +"Dark Turquoise": "\u6df1\u84dd\u7eff\u8272", +"Dark Green": "\u6df1\u7eff\u8272", +"Medium Blue": "\u4e2d\u84dd\u8272", +"Medium Purple": "\u4e2d\u7d2b\u8272", +"Midnight Blue": "\u6df1\u84dd\u8272", +"Yellow": "\u9ec4\u8272", +"Orange": "\u6a59\u8272", +"Red": "\u7ea2\u8272", +"Light Gray": "\u6d45\u7070\u8272", +"Gray": "\u7070\u8272", +"Dark Yellow": "\u6697\u9ec4\u8272", +"Dark Orange": "\u6df1\u6a59\u8272", +"Dark Red": "\u6df1\u7ea2\u8272", +"Medium Gray": "\u4e2d\u7070\u8272", +"Dark Gray": "\u6df1\u7070\u8272", +"Light Green": "\u6d45\u7eff\u8272", +"Light Yellow": "\u6d45\u9ec4\u8272", +"Light Red": "\u6d45\u7ea2\u8272", +"Light Purple": "\u6d45\u7d2b\u8272", +"Light Blue": "\u6d45\u84dd\u8272", +"Dark Purple": "\u6df1\u7d2b\u8272", +"Dark Blue": "\u6df1\u84dd\u8272", +"Black": "\u9ed1\u8272", +"White": "\u767d\u8272", +"Switch to or from fullscreen mode": "\u5207\u6362\u5168\u5c4f\u6a21\u5f0f", +"Open help dialog": "\u6253\u5f00\u5e2e\u52a9\u5bf9\u8bdd\u6846", +"history": "\u5386\u53f2", +"styles": "\u6837\u5f0f", +"formatting": "\u683c\u5f0f\u5316", +"alignment": "\u5bf9\u9f50", +"indentation": "\u7f29\u8fdb", +"permanent pen": "\u8bb0\u53f7\u7b14", +"comments": "\u5907\u6ce8", +"Format Painter": "\u683c\u5f0f\u5237", +"Insert\/edit iframe": "\u63d2\u5165\/\u7f16\u8f91\u6846\u67b6", +"Capitalization": "\u5927\u5199", +"lowercase": "\u5c0f\u5199", +"UPPERCASE": "\u5927\u5199", +"Title Case": "\u9996\u5b57\u6bcd\u5927\u5199", +"Permanent Pen Properties": "\u6c38\u4e45\u7b14\u5c5e\u6027", +"Permanent pen properties...": "\u6c38\u4e45\u7b14\u5c5e\u6027...", +"Font": "\u5b57\u4f53", +"Size": "\u5b57\u53f7", +"More...": "\u66f4\u591a...", +"Spellcheck Language": "\u62fc\u5199\u68c0\u67e5\u8bed\u8a00", +"Select...": "\u9009\u62e9...", +"Preferences": "\u9996\u9009\u9879", +"Yes": "\u662f", +"No": "\u5426", +"Keyboard Navigation": "\u952e\u76d8\u6307\u5f15", +"Version": "\u7248\u672c", +"Anchor": "\u951a\u70b9", +"Special character": "\u7279\u6b8a\u7b26\u53f7", +"Code sample": "\u4ee3\u7801\u793a\u4f8b", +"Color": "\u989c\u8272", +"Emoticons": "\u8868\u60c5", +"Document properties": "\u6587\u6863\u5c5e\u6027", +"Image": "\u56fe\u7247", +"Insert link": "\u63d2\u5165\u94fe\u63a5", +"Target": "\u6253\u5f00\u65b9\u5f0f", +"Link": "\u94fe\u63a5", +"Poster": "\u5c01\u9762", +"Media": "\u5a92\u4f53", +"Print": "\u6253\u5370", +"Prev": "\u4e0a\u4e00\u4e2a", +"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362", +"Whole words": "\u5168\u5b57\u5339\u914d", +"Spellcheck": "\u62fc\u5199\u68c0\u67e5", +"Caption": "\u6807\u9898", +"Insert template": "\u63d2\u5165\u6a21\u677f" +}); \ No newline at end of file diff --git a/snowy-admin-web/public/tinymce/skins/content/dark/content.css b/snowy-admin-web/public/tinymce/skins/content/dark/content.css new file mode 100644 index 00000000..bae7923f --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/content/dark/content.css @@ -0,0 +1,72 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +body { + background-color: #2f3742; + color: #dfe0e4; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + line-height: 1.4; + margin: 1rem; +} +a { + color: #4099ff; +} +table { + border-collapse: collapse; +} +/* Apply a default padding if legacy cellpadding attribute is missing */ +table:not([cellpadding]) th, +table:not([cellpadding]) td { + padding: 0.4rem; +} +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border="0"]):not([style*="border-width"]) th, +table[border]:not([border="0"]):not([style*="border-width"]) td { + border-width: 1px; +} +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border="0"]):not([style*="border-style"]) th, +table[border]:not([border="0"]):not([style*="border-style"]) td { + border-style: solid; +} +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border="0"]):not([style*="border-color"]) th, +table[border]:not([border="0"]):not([style*="border-color"]) td { + border-color: #6d737b; +} +figure { + display: table; + margin: 1rem auto; +} +figure figcaption { + color: #8a8f97; + display: block; + margin-top: 0.25rem; + text-align: center; +} +hr { + border-color: #6d737b; + border-style: solid; + border-width: 1px 0 0 0; +} +code { + background-color: #6d737b; + border-radius: 3px; + padding: 0.1rem 0.2rem; +} +.mce-content-body:not([dir=rtl]) blockquote { + border-left: 2px solid #6d737b; + margin-left: 1.5rem; + padding-left: 1rem; +} +.mce-content-body[dir=rtl] blockquote { + border-right: 2px solid #6d737b; + margin-right: 1.5rem; + padding-right: 1rem; +} diff --git a/snowy-admin-web/public/tinymce/skins/content/dark/content.min.css b/snowy-admin-web/public/tinymce/skins/content/dark/content.min.css new file mode 100644 index 00000000..07d40c26 --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/content/dark/content.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +body{background-color:#2f3742;color:#dfe0e4;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}a{color:#4099ff}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#6d737b}figure{display:table;margin:1rem auto}figure figcaption{color:#8a8f97;display:block;margin-top:.25rem;text-align:center}hr{border-color:#6d737b;border-style:solid;border-width:1px 0 0 0}code{background-color:#6d737b;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #6d737b;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #6d737b;margin-right:1.5rem;padding-right:1rem} diff --git a/snowy-admin-web/public/tinymce/skins/content/default/content.css b/snowy-admin-web/public/tinymce/skins/content/default/content.css new file mode 100644 index 00000000..dd6a5c1c --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/content/default/content.css @@ -0,0 +1,67 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + line-height: 1.4; + margin: 1rem; +} +table { + border-collapse: collapse; +} +/* Apply a default padding if legacy cellpadding attribute is missing */ +table:not([cellpadding]) th, +table:not([cellpadding]) td { + padding: 0.4rem; +} +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border="0"]):not([style*="border-width"]) th, +table[border]:not([border="0"]):not([style*="border-width"]) td { + border-width: 1px; +} +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border="0"]):not([style*="border-style"]) th, +table[border]:not([border="0"]):not([style*="border-style"]) td { + border-style: solid; +} +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border="0"]):not([style*="border-color"]) th, +table[border]:not([border="0"]):not([style*="border-color"]) td { + border-color: #ccc; +} +figure { + display: table; + margin: 1rem auto; +} +figure figcaption { + color: #999; + display: block; + margin-top: 0.25rem; + text-align: center; +} +hr { + border-color: #ccc; + border-style: solid; + border-width: 1px 0 0 0; +} +code { + background-color: #e8e8e8; + border-radius: 3px; + padding: 0.1rem 0.2rem; +} +.mce-content-body:not([dir=rtl]) blockquote { + border-left: 2px solid #ccc; + margin-left: 1.5rem; + padding-left: 1rem; +} +.mce-content-body[dir=rtl] blockquote { + border-right: 2px solid #ccc; + margin-right: 1.5rem; + padding-right: 1rem; +} diff --git a/snowy-admin-web/public/tinymce/skins/content/default/content.min.css b/snowy-admin-web/public/tinymce/skins/content/default/content.min.css new file mode 100644 index 00000000..29cd987e --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/content/default/content.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem} diff --git a/snowy-admin-web/public/tinymce/skins/content/document/content.css b/snowy-admin-web/public/tinymce/skins/content/document/content.css new file mode 100644 index 00000000..75f637a1 --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/content/document/content.css @@ -0,0 +1,72 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +@media screen { + html { + background: #f4f4f4; + min-height: 100%; + } +} +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; +} +@media screen { + body { + background-color: #fff; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.15); + box-sizing: border-box; + margin: 1rem auto 0; + max-width: 820px; + min-height: calc(100vh - 1rem); + padding: 4rem 6rem 6rem 6rem; + } +} +table { + border-collapse: collapse; +} +/* Apply a default padding if legacy cellpadding attribute is missing */ +table:not([cellpadding]) th, +table:not([cellpadding]) td { + padding: 0.4rem; +} +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border="0"]):not([style*="border-width"]) th, +table[border]:not([border="0"]):not([style*="border-width"]) td { + border-width: 1px; +} +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border="0"]):not([style*="border-style"]) th, +table[border]:not([border="0"]):not([style*="border-style"]) td { + border-style: solid; +} +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border="0"]):not([style*="border-color"]) th, +table[border]:not([border="0"]):not([style*="border-color"]) td { + border-color: #ccc; +} +figure figcaption { + color: #999; + margin-top: 0.25rem; + text-align: center; +} +hr { + border-color: #ccc; + border-style: solid; + border-width: 1px 0 0 0; +} +.mce-content-body:not([dir=rtl]) blockquote { + border-left: 2px solid #ccc; + margin-left: 1.5rem; + padding-left: 1rem; +} +.mce-content-body[dir=rtl] blockquote { + border-right: 2px solid #ccc; + margin-right: 1.5rem; + padding-right: 1rem; +} diff --git a/snowy-admin-web/public/tinymce/skins/content/document/content.min.css b/snowy-admin-web/public/tinymce/skins/content/document/content.min.css new file mode 100644 index 00000000..a1feef4c --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/content/document/content.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +@media screen{html{background:#f4f4f4;min-height:100%}}body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif}@media screen{body{background-color:#fff;box-shadow:0 0 4px rgba(0,0,0,.15);box-sizing:border-box;margin:1rem auto 0;max-width:820px;min-height:calc(100vh - 1rem);padding:4rem 6rem 6rem 6rem}}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure figcaption{color:#999;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem} diff --git a/snowy-admin-web/public/tinymce/skins/content/writer/content.css b/snowy-admin-web/public/tinymce/skins/content/writer/content.css new file mode 100644 index 00000000..ceee3599 --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/content/writer/content.css @@ -0,0 +1,68 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + line-height: 1.4; + margin: 1rem auto; + max-width: 900px; +} +table { + border-collapse: collapse; +} +/* Apply a default padding if legacy cellpadding attribute is missing */ +table:not([cellpadding]) th, +table:not([cellpadding]) td { + padding: 0.4rem; +} +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border="0"]):not([style*="border-width"]) th, +table[border]:not([border="0"]):not([style*="border-width"]) td { + border-width: 1px; +} +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border="0"]):not([style*="border-style"]) th, +table[border]:not([border="0"]):not([style*="border-style"]) td { + border-style: solid; +} +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border="0"]):not([style*="border-color"]) th, +table[border]:not([border="0"]):not([style*="border-color"]) td { + border-color: #ccc; +} +figure { + display: table; + margin: 1rem auto; +} +figure figcaption { + color: #999; + display: block; + margin-top: 0.25rem; + text-align: center; +} +hr { + border-color: #ccc; + border-style: solid; + border-width: 1px 0 0 0; +} +code { + background-color: #e8e8e8; + border-radius: 3px; + padding: 0.1rem 0.2rem; +} +.mce-content-body:not([dir=rtl]) blockquote { + border-left: 2px solid #ccc; + margin-left: 1.5rem; + padding-left: 1rem; +} +.mce-content-body[dir=rtl] blockquote { + border-right: 2px solid #ccc; + margin-right: 1.5rem; + padding-right: 1rem; +} diff --git a/snowy-admin-web/public/tinymce/skins/content/writer/content.min.css b/snowy-admin-web/public/tinymce/skins/content/writer/content.min.css new file mode 100644 index 00000000..0d8f5d34 --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/content/writer/content.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem auto;max-width:900px}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/content.css b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/content.css new file mode 100644 index 00000000..a6871c8c --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/content.css @@ -0,0 +1,714 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.mce-content-body .mce-item-anchor { + background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center; + cursor: default; + display: inline-block; + height: 12px !important; + padding: 0 2px; + -webkit-user-modify: read-only; + -moz-user-modify: read-only; + -webkit-user-select: all; + -moz-user-select: all; + -ms-user-select: all; + user-select: all; + width: 8px !important; +} +.mce-content-body .mce-item-anchor[data-mce-selected] { + outline-offset: 1px; +} +.tox-comments-visible .tox-comment { + background-color: #fff0b7; +} +.tox-comments-visible .tox-comment--active { + background-color: #ffe168; +} +.tox-checklist > li:not(.tox-checklist--hidden) { + list-style: none; + margin: 0.25em 0; +} +.tox-checklist > li:not(.tox-checklist--hidden)::before { + content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%236d737b%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A"); + cursor: pointer; + height: 1em; + margin-left: -1.5em; + margin-top: 0.125em; + position: absolute; + width: 1em; +} +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before { + content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A"); +} +[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before { + margin-left: 0; + margin-right: -1.5em; +} +/* stylelint-disable */ +/* http://prismjs.com/ */ +/** + * Dracula Theme originally by Zeno Rocha [@zenorocha] + * https://draculatheme.com/ + * + * Ported for PrismJS by Albert Vallverdu [@byverdu] + */ +code[class*="language-"], +pre[class*="language-"] { + color: #f8f8f2; + background: none; + text-shadow: 0 1px rgba(0, 0, 0, 0.3); + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; + border-radius: 0.3em; +} +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #282a36; +} +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: #6272a4; +} +.token.punctuation { + color: #f8f8f2; +} +.namespace { + opacity: 0.7; +} +.token.property, +.token.tag, +.token.constant, +.token.symbol, +.token.deleted { + color: #ff79c6; +} +.token.boolean, +.token.number { + color: #bd93f9; +} +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #50fa7b; +} +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string, +.token.variable { + color: #f8f8f2; +} +.token.atrule, +.token.attr-value, +.token.function, +.token.class-name { + color: #f1fa8c; +} +.token.keyword { + color: #8be9fd; +} +.token.regex, +.token.important { + color: #ffb86c; +} +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} +.token.entity { + cursor: help; +} +/* stylelint-enable */ +.mce-content-body { + overflow-wrap: break-word; + word-wrap: break-word; +} +.mce-content-body .mce-visual-caret { + background-color: black; + background-color: currentColor; + position: absolute; +} +.mce-content-body .mce-visual-caret-hidden { + display: none; +} +.mce-content-body *[data-mce-caret] { + left: -1000px; + margin: 0; + padding: 0; + position: absolute; + right: auto; + top: 0; +} +.mce-content-body .mce-offscreen-selection { + left: -2000000px; + max-width: 1000000px; + position: absolute; +} +.mce-content-body *[contentEditable=false] { + cursor: default; +} +.mce-content-body *[contentEditable=true] { + cursor: text; +} +.tox-cursor-format-painter { + cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"), default; +} +.mce-content-body figure.align-left { + float: left; +} +.mce-content-body figure.align-right { + float: right; +} +.mce-content-body figure.image.align-center { + display: table; + margin-left: auto; + margin-right: auto; +} +.mce-preview-object { + border: 1px solid gray; + display: inline-block; + line-height: 0; + margin: 0 2px 0 2px; + position: relative; +} +.mce-preview-object .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-preview-object[data-mce-selected="2"] .mce-shim { + display: none; +} +.mce-object { + background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center; + border: 1px dashed #aaa; +} +.mce-pagebreak { + border: 1px dashed #aaa; + cursor: default; + display: block; + height: 5px; + margin-top: 15px; + page-break-before: always; + width: 100%; +} +@media print { + .mce-pagebreak { + border: 0; + } +} +.tiny-pageembed .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.tiny-pageembed[data-mce-selected="2"] .mce-shim { + display: none; +} +.tiny-pageembed { + display: inline-block; + position: relative; +} +.tiny-pageembed--21by9, +.tiny-pageembed--16by9, +.tiny-pageembed--4by3, +.tiny-pageembed--1by1 { + display: block; + overflow: hidden; + padding: 0; + position: relative; + width: 100%; +} +.tiny-pageembed--21by9 { + padding-top: 42.857143%; +} +.tiny-pageembed--16by9 { + padding-top: 56.25%; +} +.tiny-pageembed--4by3 { + padding-top: 75%; +} +.tiny-pageembed--1by1 { + padding-top: 100%; +} +.tiny-pageembed--21by9 iframe, +.tiny-pageembed--16by9 iframe, +.tiny-pageembed--4by3 iframe, +.tiny-pageembed--1by1 iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-content-body[data-mce-placeholder] { + position: relative; +} +.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before { + color: rgba(34, 47, 62, 0.7); + content: attr(data-mce-placeholder); + position: absolute; +} +.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before { + left: 1px; +} +.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before { + right: 1px; +} +.mce-content-body div.mce-resizehandle { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + height: 10px; + position: absolute; + width: 10px; + z-index: 10000; +} +.mce-content-body div.mce-resizehandle:hover { + background-color: #4099ff; +} +.mce-content-body div.mce-resizehandle:nth-of-type(1) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(2) { + cursor: nesw-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(3) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(4) { + cursor: nesw-resize; +} +.mce-content-body .mce-resize-backdrop { + z-index: 10000; +} +.mce-content-body .mce-clonedresizable { + cursor: default; + opacity: 0.5; + outline: 1px dashed black; + position: absolute; + z-index: 10001; +} +.mce-content-body .mce-clonedresizable.mce-resizetable-columns th, +.mce-content-body .mce-clonedresizable.mce-resizetable-columns td { + border: 0; +} +.mce-content-body .mce-resize-helper { + background: #555; + background: rgba(0, 0, 0, 0.75); + border: 1px; + border-radius: 3px; + color: white; + display: none; + font-family: sans-serif; + font-size: 12px; + line-height: 14px; + margin: 5px 10px; + padding: 5px; + position: absolute; + white-space: nowrap; + z-index: 10002; +} +.tox-rtc-user-selection { + position: relative; +} +.tox-rtc-user-cursor { + bottom: 0; + cursor: default; + position: absolute; + top: 0; + width: 2px; +} +.tox-rtc-user-cursor::before { + background-color: inherit; + border-radius: 50%; + content: ''; + display: block; + height: 8px; + position: absolute; + right: -3px; + top: -3px; + width: 8px; +} +.tox-rtc-user-cursor:hover::after { + background-color: inherit; + border-radius: 100px; + box-sizing: border-box; + color: #fff; + content: attr(data-user); + display: block; + font-size: 12px; + font-weight: bold; + left: -5px; + min-height: 8px; + min-width: 8px; + padding: 0 12px; + position: absolute; + top: -11px; + white-space: nowrap; + z-index: 1000; +} +.tox-rtc-user-selection--1 .tox-rtc-user-cursor { + background-color: #2dc26b; +} +.tox-rtc-user-selection--2 .tox-rtc-user-cursor { + background-color: #e03e2d; +} +.tox-rtc-user-selection--3 .tox-rtc-user-cursor { + background-color: #f1c40f; +} +.tox-rtc-user-selection--4 .tox-rtc-user-cursor { + background-color: #3598db; +} +.tox-rtc-user-selection--5 .tox-rtc-user-cursor { + background-color: #b96ad9; +} +.tox-rtc-user-selection--6 .tox-rtc-user-cursor { + background-color: #e67e23; +} +.tox-rtc-user-selection--7 .tox-rtc-user-cursor { + background-color: #aaa69d; +} +.tox-rtc-user-selection--8 .tox-rtc-user-cursor { + background-color: #f368e0; +} +.tox-rtc-remote-image { + background: #eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center; + border: 1px solid #ccc; + min-height: 240px; + min-width: 320px; +} +.mce-match-marker { + background: #aaa; + color: #fff; +} +.mce-match-marker-selected { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::-moz-selection { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::selection { + background: #39f; + color: #fff; +} +.mce-content-body img[data-mce-selected], +.mce-content-body video[data-mce-selected], +.mce-content-body audio[data-mce-selected], +.mce-content-body object[data-mce-selected], +.mce-content-body embed[data-mce-selected], +.mce-content-body table[data-mce-selected] { + outline: 3px solid #4099ff; +} +.mce-content-body hr[data-mce-selected] { + outline: 3px solid #4099ff; + outline-offset: 1px; +} +.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus { + outline: 3px solid #4099ff; +} +.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover { + outline: 3px solid #4099ff; +} +.mce-content-body *[contentEditable=false][data-mce-selected] { + cursor: not-allowed; + outline: 3px solid #4099ff; +} +.mce-content-body.mce-content-readonly *[contentEditable=true]:focus, +.mce-content-body.mce-content-readonly *[contentEditable=true]:hover { + outline: none; +} +.mce-content-body *[data-mce-selected="inline-boundary"] { + background-color: #4099ff; +} +.mce-content-body .mce-edit-focus { + outline: 3px solid #4099ff; +} +.mce-content-body td[data-mce-selected], +.mce-content-body th[data-mce-selected] { + position: relative; +} +.mce-content-body td[data-mce-selected]::-moz-selection, +.mce-content-body th[data-mce-selected]::-moz-selection { + background: none; +} +.mce-content-body td[data-mce-selected]::selection, +.mce-content-body th[data-mce-selected]::selection { + background: none; +} +.mce-content-body td[data-mce-selected] *, +.mce-content-body th[data-mce-selected] * { + outline: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.mce-content-body td[data-mce-selected]::after, +.mce-content-body th[data-mce-selected]::after { + background-color: rgba(180, 215, 255, 0.7); + border: 1px solid transparent; + bottom: -1px; + content: ''; + left: -1px; + mix-blend-mode: lighten; + position: absolute; + right: -1px; + top: -1px; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .mce-content-body td[data-mce-selected]::after, + .mce-content-body th[data-mce-selected]::after { + border-color: rgba(0, 84, 180, 0.7); + } +} +.mce-content-body img::-moz-selection { + background: none; +} +.mce-content-body img::selection { + background: none; +} +.ephox-snooker-resizer-bar { + background-color: #4099ff; + opacity: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.ephox-snooker-resizer-cols { + cursor: col-resize; +} +.ephox-snooker-resizer-rows { + cursor: row-resize; +} +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging { + opacity: 1; +} +.mce-spellchecker-word { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; + height: 2rem; +} +.mce-spellchecker-grammar { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; +} +.mce-toc { + border: 1px solid gray; +} +.mce-toc h2 { + margin: 4px; +} +.mce-toc li { + list-style-type: none; +} +table[style*="border-width: 0px"], +.mce-item-table:not([border]), +.mce-item-table[border="0"], +table[style*="border-width: 0px"] td, +.mce-item-table:not([border]) td, +.mce-item-table[border="0"] td, +table[style*="border-width: 0px"] th, +.mce-item-table:not([border]) th, +.mce-item-table[border="0"] th, +table[style*="border-width: 0px"] caption, +.mce-item-table:not([border]) caption, +.mce-item-table[border="0"] caption { + border: 1px dashed #bbb; +} +.mce-visualblocks p, +.mce-visualblocks h1, +.mce-visualblocks h2, +.mce-visualblocks h3, +.mce-visualblocks h4, +.mce-visualblocks h5, +.mce-visualblocks h6, +.mce-visualblocks div:not([data-mce-bogus]), +.mce-visualblocks section, +.mce-visualblocks article, +.mce-visualblocks blockquote, +.mce-visualblocks address, +.mce-visualblocks pre, +.mce-visualblocks figure, +.mce-visualblocks figcaption, +.mce-visualblocks hgroup, +.mce-visualblocks aside, +.mce-visualblocks ul, +.mce-visualblocks ol, +.mce-visualblocks dl { + background-repeat: no-repeat; + border: 1px dashed #bbb; + margin-left: 3px; + padding-top: 10px; +} +.mce-visualblocks p { + background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); +} +.mce-visualblocks h1 { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); +} +.mce-visualblocks h2 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); +} +.mce-visualblocks h3 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); +} +.mce-visualblocks h4 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); +} +.mce-visualblocks h5 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); +} +.mce-visualblocks h6 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); +} +.mce-visualblocks div:not([data-mce-bogus]) { + background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); +} +.mce-visualblocks section { + background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); +} +.mce-visualblocks article { + background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); +} +.mce-visualblocks blockquote { + background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); +} +.mce-visualblocks address { + background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); +} +.mce-visualblocks pre { + background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); +} +.mce-visualblocks figure { + background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); +} +.mce-visualblocks figcaption { + border: 1px dashed #bbb; +} +.mce-visualblocks hgroup { + background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); +} +.mce-visualblocks aside { + background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); +} +.mce-visualblocks ul { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); +} +.mce-visualblocks ol { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); +} +.mce-visualblocks dl { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); +} +.mce-visualblocks:not([dir=rtl]) p, +.mce-visualblocks:not([dir=rtl]) h1, +.mce-visualblocks:not([dir=rtl]) h2, +.mce-visualblocks:not([dir=rtl]) h3, +.mce-visualblocks:not([dir=rtl]) h4, +.mce-visualblocks:not([dir=rtl]) h5, +.mce-visualblocks:not([dir=rtl]) h6, +.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]), +.mce-visualblocks:not([dir=rtl]) section, +.mce-visualblocks:not([dir=rtl]) article, +.mce-visualblocks:not([dir=rtl]) blockquote, +.mce-visualblocks:not([dir=rtl]) address, +.mce-visualblocks:not([dir=rtl]) pre, +.mce-visualblocks:not([dir=rtl]) figure, +.mce-visualblocks:not([dir=rtl]) figcaption, +.mce-visualblocks:not([dir=rtl]) hgroup, +.mce-visualblocks:not([dir=rtl]) aside, +.mce-visualblocks:not([dir=rtl]) ul, +.mce-visualblocks:not([dir=rtl]) ol, +.mce-visualblocks:not([dir=rtl]) dl { + margin-left: 3px; +} +.mce-visualblocks[dir=rtl] p, +.mce-visualblocks[dir=rtl] h1, +.mce-visualblocks[dir=rtl] h2, +.mce-visualblocks[dir=rtl] h3, +.mce-visualblocks[dir=rtl] h4, +.mce-visualblocks[dir=rtl] h5, +.mce-visualblocks[dir=rtl] h6, +.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]), +.mce-visualblocks[dir=rtl] section, +.mce-visualblocks[dir=rtl] article, +.mce-visualblocks[dir=rtl] blockquote, +.mce-visualblocks[dir=rtl] address, +.mce-visualblocks[dir=rtl] pre, +.mce-visualblocks[dir=rtl] figure, +.mce-visualblocks[dir=rtl] figcaption, +.mce-visualblocks[dir=rtl] hgroup, +.mce-visualblocks[dir=rtl] aside, +.mce-visualblocks[dir=rtl] ul, +.mce-visualblocks[dir=rtl] ol, +.mce-visualblocks[dir=rtl] dl { + background-position-x: right; + margin-right: 3px; +} +.mce-nbsp, +.mce-shy { + background: #aaa; +} +.mce-shy::after { + content: '-'; +} +body { + font-family: sans-serif; +} +table { + border-collapse: collapse; +} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/content.inline.css b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/content.inline.css new file mode 100644 index 00000000..df6ed08b --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/content.inline.css @@ -0,0 +1,726 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.mce-content-body .mce-item-anchor { + background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center; + cursor: default; + display: inline-block; + height: 12px !important; + padding: 0 2px; + -webkit-user-modify: read-only; + -moz-user-modify: read-only; + -webkit-user-select: all; + -moz-user-select: all; + -ms-user-select: all; + user-select: all; + width: 8px !important; +} +.mce-content-body .mce-item-anchor[data-mce-selected] { + outline-offset: 1px; +} +.tox-comments-visible .tox-comment { + background-color: #fff0b7; +} +.tox-comments-visible .tox-comment--active { + background-color: #ffe168; +} +.tox-checklist > li:not(.tox-checklist--hidden) { + list-style: none; + margin: 0.25em 0; +} +.tox-checklist > li:not(.tox-checklist--hidden)::before { + content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A"); + cursor: pointer; + height: 1em; + margin-left: -1.5em; + margin-top: 0.125em; + position: absolute; + width: 1em; +} +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before { + content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A"); +} +[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before { + margin-left: 0; + margin-right: -1.5em; +} +/* stylelint-disable */ +/* http://prismjs.com/ */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} +pre[class*="language-"]::-moz-selection, +pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, +code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} +pre[class*="language-"]::selection, +pre[class*="language-"] ::selection, +code[class*="language-"]::selection, +code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} +@media print { + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; +} +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} +.token.punctuation { + color: #999; +} +.namespace { + opacity: 0.7; +} +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + background: hsla(0, 0%, 100%, 0.5); +} +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} +.token.function, +.token.class-name { + color: #DD4A68; +} +.token.regex, +.token.important, +.token.variable { + color: #e90; +} +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} +.token.entity { + cursor: help; +} +/* stylelint-enable */ +.mce-content-body { + overflow-wrap: break-word; + word-wrap: break-word; +} +.mce-content-body .mce-visual-caret { + background-color: black; + background-color: currentColor; + position: absolute; +} +.mce-content-body .mce-visual-caret-hidden { + display: none; +} +.mce-content-body *[data-mce-caret] { + left: -1000px; + margin: 0; + padding: 0; + position: absolute; + right: auto; + top: 0; +} +.mce-content-body .mce-offscreen-selection { + left: -2000000px; + max-width: 1000000px; + position: absolute; +} +.mce-content-body *[contentEditable=false] { + cursor: default; +} +.mce-content-body *[contentEditable=true] { + cursor: text; +} +.tox-cursor-format-painter { + cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"), default; +} +.mce-content-body figure.align-left { + float: left; +} +.mce-content-body figure.align-right { + float: right; +} +.mce-content-body figure.image.align-center { + display: table; + margin-left: auto; + margin-right: auto; +} +.mce-preview-object { + border: 1px solid gray; + display: inline-block; + line-height: 0; + margin: 0 2px 0 2px; + position: relative; +} +.mce-preview-object .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-preview-object[data-mce-selected="2"] .mce-shim { + display: none; +} +.mce-object { + background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center; + border: 1px dashed #aaa; +} +.mce-pagebreak { + border: 1px dashed #aaa; + cursor: default; + display: block; + height: 5px; + margin-top: 15px; + page-break-before: always; + width: 100%; +} +@media print { + .mce-pagebreak { + border: 0; + } +} +.tiny-pageembed .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.tiny-pageembed[data-mce-selected="2"] .mce-shim { + display: none; +} +.tiny-pageembed { + display: inline-block; + position: relative; +} +.tiny-pageembed--21by9, +.tiny-pageembed--16by9, +.tiny-pageembed--4by3, +.tiny-pageembed--1by1 { + display: block; + overflow: hidden; + padding: 0; + position: relative; + width: 100%; +} +.tiny-pageembed--21by9 { + padding-top: 42.857143%; +} +.tiny-pageembed--16by9 { + padding-top: 56.25%; +} +.tiny-pageembed--4by3 { + padding-top: 75%; +} +.tiny-pageembed--1by1 { + padding-top: 100%; +} +.tiny-pageembed--21by9 iframe, +.tiny-pageembed--16by9 iframe, +.tiny-pageembed--4by3 iframe, +.tiny-pageembed--1by1 iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-content-body[data-mce-placeholder] { + position: relative; +} +.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before { + color: rgba(34, 47, 62, 0.7); + content: attr(data-mce-placeholder); + position: absolute; +} +.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before { + left: 1px; +} +.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before { + right: 1px; +} +.mce-content-body div.mce-resizehandle { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + height: 10px; + position: absolute; + width: 10px; + z-index: 10000; +} +.mce-content-body div.mce-resizehandle:hover { + background-color: #4099ff; +} +.mce-content-body div.mce-resizehandle:nth-of-type(1) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(2) { + cursor: nesw-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(3) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(4) { + cursor: nesw-resize; +} +.mce-content-body .mce-resize-backdrop { + z-index: 10000; +} +.mce-content-body .mce-clonedresizable { + cursor: default; + opacity: 0.5; + outline: 1px dashed black; + position: absolute; + z-index: 10001; +} +.mce-content-body .mce-clonedresizable.mce-resizetable-columns th, +.mce-content-body .mce-clonedresizable.mce-resizetable-columns td { + border: 0; +} +.mce-content-body .mce-resize-helper { + background: #555; + background: rgba(0, 0, 0, 0.75); + border: 1px; + border-radius: 3px; + color: white; + display: none; + font-family: sans-serif; + font-size: 12px; + line-height: 14px; + margin: 5px 10px; + padding: 5px; + position: absolute; + white-space: nowrap; + z-index: 10002; +} +.tox-rtc-user-selection { + position: relative; +} +.tox-rtc-user-cursor { + bottom: 0; + cursor: default; + position: absolute; + top: 0; + width: 2px; +} +.tox-rtc-user-cursor::before { + background-color: inherit; + border-radius: 50%; + content: ''; + display: block; + height: 8px; + position: absolute; + right: -3px; + top: -3px; + width: 8px; +} +.tox-rtc-user-cursor:hover::after { + background-color: inherit; + border-radius: 100px; + box-sizing: border-box; + color: #fff; + content: attr(data-user); + display: block; + font-size: 12px; + font-weight: bold; + left: -5px; + min-height: 8px; + min-width: 8px; + padding: 0 12px; + position: absolute; + top: -11px; + white-space: nowrap; + z-index: 1000; +} +.tox-rtc-user-selection--1 .tox-rtc-user-cursor { + background-color: #2dc26b; +} +.tox-rtc-user-selection--2 .tox-rtc-user-cursor { + background-color: #e03e2d; +} +.tox-rtc-user-selection--3 .tox-rtc-user-cursor { + background-color: #f1c40f; +} +.tox-rtc-user-selection--4 .tox-rtc-user-cursor { + background-color: #3598db; +} +.tox-rtc-user-selection--5 .tox-rtc-user-cursor { + background-color: #b96ad9; +} +.tox-rtc-user-selection--6 .tox-rtc-user-cursor { + background-color: #e67e23; +} +.tox-rtc-user-selection--7 .tox-rtc-user-cursor { + background-color: #aaa69d; +} +.tox-rtc-user-selection--8 .tox-rtc-user-cursor { + background-color: #f368e0; +} +.tox-rtc-remote-image { + background: #eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center; + border: 1px solid #ccc; + min-height: 240px; + min-width: 320px; +} +.mce-match-marker { + background: #aaa; + color: #fff; +} +.mce-match-marker-selected { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::-moz-selection { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::selection { + background: #39f; + color: #fff; +} +.mce-content-body img[data-mce-selected], +.mce-content-body video[data-mce-selected], +.mce-content-body audio[data-mce-selected], +.mce-content-body object[data-mce-selected], +.mce-content-body embed[data-mce-selected], +.mce-content-body table[data-mce-selected] { + outline: 3px solid #b4d7ff; +} +.mce-content-body hr[data-mce-selected] { + outline: 3px solid #b4d7ff; + outline-offset: 1px; +} +.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover { + outline: 3px solid #b4d7ff; +} +.mce-content-body *[contentEditable=false][data-mce-selected] { + cursor: not-allowed; + outline: 3px solid #b4d7ff; +} +.mce-content-body.mce-content-readonly *[contentEditable=true]:focus, +.mce-content-body.mce-content-readonly *[contentEditable=true]:hover { + outline: none; +} +.mce-content-body *[data-mce-selected="inline-boundary"] { + background-color: #b4d7ff; +} +.mce-content-body .mce-edit-focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body td[data-mce-selected], +.mce-content-body th[data-mce-selected] { + position: relative; +} +.mce-content-body td[data-mce-selected]::-moz-selection, +.mce-content-body th[data-mce-selected]::-moz-selection { + background: none; +} +.mce-content-body td[data-mce-selected]::selection, +.mce-content-body th[data-mce-selected]::selection { + background: none; +} +.mce-content-body td[data-mce-selected] *, +.mce-content-body th[data-mce-selected] * { + outline: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.mce-content-body td[data-mce-selected]::after, +.mce-content-body th[data-mce-selected]::after { + background-color: rgba(180, 215, 255, 0.7); + border: 1px solid rgba(180, 215, 255, 0.7); + bottom: -1px; + content: ''; + left: -1px; + mix-blend-mode: multiply; + position: absolute; + right: -1px; + top: -1px; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .mce-content-body td[data-mce-selected]::after, + .mce-content-body th[data-mce-selected]::after { + border-color: rgba(0, 84, 180, 0.7); + } +} +.mce-content-body img::-moz-selection { + background: none; +} +.mce-content-body img::selection { + background: none; +} +.ephox-snooker-resizer-bar { + background-color: #b4d7ff; + opacity: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.ephox-snooker-resizer-cols { + cursor: col-resize; +} +.ephox-snooker-resizer-rows { + cursor: row-resize; +} +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging { + opacity: 1; +} +.mce-spellchecker-word { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; + height: 2rem; +} +.mce-spellchecker-grammar { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; +} +.mce-toc { + border: 1px solid gray; +} +.mce-toc h2 { + margin: 4px; +} +.mce-toc li { + list-style-type: none; +} +table[style*="border-width: 0px"], +.mce-item-table:not([border]), +.mce-item-table[border="0"], +table[style*="border-width: 0px"] td, +.mce-item-table:not([border]) td, +.mce-item-table[border="0"] td, +table[style*="border-width: 0px"] th, +.mce-item-table:not([border]) th, +.mce-item-table[border="0"] th, +table[style*="border-width: 0px"] caption, +.mce-item-table:not([border]) caption, +.mce-item-table[border="0"] caption { + border: 1px dashed #bbb; +} +.mce-visualblocks p, +.mce-visualblocks h1, +.mce-visualblocks h2, +.mce-visualblocks h3, +.mce-visualblocks h4, +.mce-visualblocks h5, +.mce-visualblocks h6, +.mce-visualblocks div:not([data-mce-bogus]), +.mce-visualblocks section, +.mce-visualblocks article, +.mce-visualblocks blockquote, +.mce-visualblocks address, +.mce-visualblocks pre, +.mce-visualblocks figure, +.mce-visualblocks figcaption, +.mce-visualblocks hgroup, +.mce-visualblocks aside, +.mce-visualblocks ul, +.mce-visualblocks ol, +.mce-visualblocks dl { + background-repeat: no-repeat; + border: 1px dashed #bbb; + margin-left: 3px; + padding-top: 10px; +} +.mce-visualblocks p { + background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); +} +.mce-visualblocks h1 { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); +} +.mce-visualblocks h2 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); +} +.mce-visualblocks h3 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); +} +.mce-visualblocks h4 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); +} +.mce-visualblocks h5 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); +} +.mce-visualblocks h6 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); +} +.mce-visualblocks div:not([data-mce-bogus]) { + background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); +} +.mce-visualblocks section { + background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); +} +.mce-visualblocks article { + background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); +} +.mce-visualblocks blockquote { + background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); +} +.mce-visualblocks address { + background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); +} +.mce-visualblocks pre { + background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); +} +.mce-visualblocks figure { + background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); +} +.mce-visualblocks figcaption { + border: 1px dashed #bbb; +} +.mce-visualblocks hgroup { + background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); +} +.mce-visualblocks aside { + background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); +} +.mce-visualblocks ul { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); +} +.mce-visualblocks ol { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); +} +.mce-visualblocks dl { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); +} +.mce-visualblocks:not([dir=rtl]) p, +.mce-visualblocks:not([dir=rtl]) h1, +.mce-visualblocks:not([dir=rtl]) h2, +.mce-visualblocks:not([dir=rtl]) h3, +.mce-visualblocks:not([dir=rtl]) h4, +.mce-visualblocks:not([dir=rtl]) h5, +.mce-visualblocks:not([dir=rtl]) h6, +.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]), +.mce-visualblocks:not([dir=rtl]) section, +.mce-visualblocks:not([dir=rtl]) article, +.mce-visualblocks:not([dir=rtl]) blockquote, +.mce-visualblocks:not([dir=rtl]) address, +.mce-visualblocks:not([dir=rtl]) pre, +.mce-visualblocks:not([dir=rtl]) figure, +.mce-visualblocks:not([dir=rtl]) figcaption, +.mce-visualblocks:not([dir=rtl]) hgroup, +.mce-visualblocks:not([dir=rtl]) aside, +.mce-visualblocks:not([dir=rtl]) ul, +.mce-visualblocks:not([dir=rtl]) ol, +.mce-visualblocks:not([dir=rtl]) dl { + margin-left: 3px; +} +.mce-visualblocks[dir=rtl] p, +.mce-visualblocks[dir=rtl] h1, +.mce-visualblocks[dir=rtl] h2, +.mce-visualblocks[dir=rtl] h3, +.mce-visualblocks[dir=rtl] h4, +.mce-visualblocks[dir=rtl] h5, +.mce-visualblocks[dir=rtl] h6, +.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]), +.mce-visualblocks[dir=rtl] section, +.mce-visualblocks[dir=rtl] article, +.mce-visualblocks[dir=rtl] blockquote, +.mce-visualblocks[dir=rtl] address, +.mce-visualblocks[dir=rtl] pre, +.mce-visualblocks[dir=rtl] figure, +.mce-visualblocks[dir=rtl] figcaption, +.mce-visualblocks[dir=rtl] hgroup, +.mce-visualblocks[dir=rtl] aside, +.mce-visualblocks[dir=rtl] ul, +.mce-visualblocks[dir=rtl] ol, +.mce-visualblocks[dir=rtl] dl { + background-position-x: right; + margin-right: 3px; +} +.mce-nbsp, +.mce-shy { + background: #aaa; +} +.mce-shy::after { + content: '-'; +} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/content.inline.min.css b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/content.inline.min.css new file mode 100644 index 00000000..0a3d965c --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/content.inline.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:10000}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/content.min.css b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/content.min.css new file mode 100644 index 00000000..07067404 --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/content.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%236d737b%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:0 0;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#282a36}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6272a4}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#ff79c6}.token.boolean,.token.number{color:#bd93f9}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#50fa7b}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#f1fa8c}.token.keyword{color:#8be9fd}.token.important,.token.regex{color:#ffb86c}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:10000}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #4099ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #4099ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #4099ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #4099ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #4099ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#4099ff}.mce-content-body .mce-edit-focus{outline:3px solid #4099ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid transparent;bottom:-1px;content:'';left:-1px;mix-blend-mode:lighten;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#4099ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}body{font-family:sans-serif}table{border-collapse:collapse} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/content.mobile.css b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/content.mobile.css new file mode 100644 index 00000000..4bdb8bab --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/content.mobile.css @@ -0,0 +1,29 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection { + /* Note: this file is used inside the content, so isn't part of theming */ + background-color: green; + display: inline-block; + opacity: 0.5; + position: absolute; +} +body { + -webkit-text-size-adjust: none; +} +body img { + /* this is related to the content margin */ + max-width: 96vw; +} +body table img { + max-width: 95%; +} +body { + font-family: sans-serif; +} +table { + border-collapse: collapse; +} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/content.mobile.min.css b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/content.mobile.min.css new file mode 100644 index 00000000..35f7dc08 --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/content.mobile.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff new file mode 100644 index 00000000..1e3be038 Binary files /dev/null and b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff differ diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/skin.css b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/skin.css new file mode 100644 index 00000000..769655f3 --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/skin.css @@ -0,0 +1,3034 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tox { + box-shadow: none; + box-sizing: content-box; + color: #2A3746; + cursor: auto; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 16px; + font-style: normal; + font-weight: normal; + line-height: normal; + -webkit-tap-highlight-color: transparent; + text-decoration: none; + text-shadow: none; + text-transform: none; + vertical-align: initial; + white-space: normal; +} +.tox *:not(svg):not(rect) { + box-sizing: inherit; + color: inherit; + cursor: inherit; + direction: inherit; + font-family: inherit; + font-size: inherit; + font-style: inherit; + font-weight: inherit; + line-height: inherit; + -webkit-tap-highlight-color: inherit; + text-align: inherit; + text-decoration: inherit; + text-shadow: inherit; + text-transform: inherit; + vertical-align: inherit; + white-space: inherit; +} +.tox *:not(svg):not(rect) { + /* stylelint-disable-line no-duplicate-selectors */ + background: transparent; + border: 0; + box-shadow: none; + float: none; + height: auto; + margin: 0; + max-width: none; + outline: 0; + padding: 0; + position: static; + width: auto; +} +.tox:not([dir=rtl]) { + direction: ltr; + text-align: left; +} +.tox[dir=rtl] { + direction: rtl; + text-align: right; +} +.tox-tinymce { + border: 1px solid #000000; + border-radius: 0; + box-shadow: none; + box-sizing: border-box; + display: flex; + flex-direction: column; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + overflow: hidden; + position: relative; + visibility: inherit !important; +} +.tox-tinymce-inline { + border: none; + box-shadow: none; +} +.tox-tinymce-inline .tox-editor-header { + background-color: transparent; + border: 1px solid #000000; + border-radius: 0; + box-shadow: none; +} +.tox-tinymce-aux { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + z-index: 1300; +} +.tox-tinymce *:focus, +.tox-tinymce-aux *:focus { + outline: none; +} +button::-moz-focus-inner { + border: 0; +} +.tox .accessibility-issue__header { + align-items: center; + display: flex; + margin-bottom: 4px; +} +.tox .accessibility-issue__description { + align-items: stretch; + border: 1px solid #000000; + border-radius: 3px; + display: flex; + justify-content: space-between; +} +.tox .accessibility-issue__description > div { + padding-bottom: 4px; +} +.tox .accessibility-issue__description > div > div { + align-items: center; + display: flex; + margin-bottom: 4px; +} +.tox .accessibility-issue__description > *:last-child:not(:only-child) { + border-color: #000000; + border-style: solid; +} +.tox .accessibility-issue__repair { + margin-top: 16px; +} +.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description { + background-color: rgba(32, 122, 183, 0.5); + border-color: #207ab7; + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description > *:last-child { + border-color: #207ab7; +} +.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2 { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg { + fill: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description { + background-color: rgba(255, 165, 0, 0.5); + border-color: rgba(255, 165, 0, 0.8); + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description > *:last-child { + border-color: rgba(255, 165, 0, 0.8); +} +.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2 { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg { + fill: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description { + background-color: rgba(204, 0, 0, 0.5); + border-color: rgba(204, 0, 0, 0.8); + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description > *:last-child { + border-color: rgba(204, 0, 0, 0.8); +} +.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2 { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg { + fill: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description { + background-color: rgba(120, 171, 70, 0.5); + border-color: rgba(120, 171, 70, 0.8); + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description > *:last-child { + border-color: rgba(120, 171, 70, 0.8); +} +.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2 { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg { + fill: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue__header h1, +.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2 { + margin-top: 0; +} +.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button { + margin-left: 4px; +} +.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) { + margin-left: auto; +} +.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description { + padding: 4px 4px 4px 8px; +} +.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description > *:last-child { + border-left-width: 1px; + padding-left: 4px; +} +.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button { + margin-right: 4px; +} +.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) { + margin-right: auto; +} +.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description { + padding: 4px 8px 4px 4px; +} +.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description > *:last-child { + border-right-width: 1px; + padding-right: 4px; +} +.tox .tox-anchorbar { + display: flex; + flex: 0 0 auto; +} +.tox .tox-bar { + display: flex; + flex: 0 0 auto; +} +.tox .tox-button { + background-color: #207ab7; + background-image: none; + background-position: 0 0; + background-repeat: repeat; + border-color: #207ab7; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #fff; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 14px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + line-height: 24px; + margin: 0; + outline: none; + padding: 4px 16px; + text-align: center; + text-decoration: none; + text-transform: none; + white-space: nowrap; +} +.tox .tox-button[disabled] { + background-color: #207ab7; + background-image: none; + border-color: #207ab7; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} +.tox .tox-button:focus:not(:disabled) { + background-color: #1c6ca1; + background-image: none; + border-color: #1c6ca1; + box-shadow: none; + color: #fff; +} +.tox .tox-button:hover:not(:disabled) { + background-color: #1c6ca1; + background-image: none; + border-color: #1c6ca1; + box-shadow: none; + color: #fff; +} +.tox .tox-button:active:not(:disabled) { + background-color: #185d8c; + background-image: none; + border-color: #185d8c; + box-shadow: none; + color: #fff; +} +.tox .tox-button--secondary { + background-color: #3d546f; + background-image: none; + background-position: 0 0; + background-repeat: repeat; + border-color: #3d546f; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + color: #fff; + font-size: 14px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + outline: none; + padding: 4px 16px; + text-decoration: none; + text-transform: none; +} +.tox .tox-button--secondary[disabled] { + background-color: #3d546f; + background-image: none; + border-color: #3d546f; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); +} +.tox .tox-button--secondary:focus:not(:disabled) { + background-color: #34485f; + background-image: none; + border-color: #34485f; + box-shadow: none; + color: #fff; +} +.tox .tox-button--secondary:hover:not(:disabled) { + background-color: #34485f; + background-image: none; + border-color: #34485f; + box-shadow: none; + color: #fff; +} +.tox .tox-button--secondary:active:not(:disabled) { + background-color: #2b3b4e; + background-image: none; + border-color: #2b3b4e; + box-shadow: none; + color: #fff; +} +.tox .tox-button--icon, +.tox .tox-button.tox-button--icon, +.tox .tox-button.tox-button--secondary.tox-button--icon { + padding: 4px; +} +.tox .tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg { + display: block; + fill: currentColor; +} +.tox .tox-button-link { + background: 0; + border: none; + box-sizing: border-box; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 16px; + font-weight: normal; + line-height: 1.3; + margin: 0; + padding: 0; + white-space: nowrap; +} +.tox .tox-button-link--sm { + font-size: 14px; +} +.tox .tox-button--naked { + background-color: transparent; + border-color: transparent; + box-shadow: unset; + color: #fff; +} +.tox .tox-button--naked[disabled] { + background-color: #3d546f; + border-color: #3d546f; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); +} +.tox .tox-button--naked:hover:not(:disabled) { + background-color: #34485f; + border-color: #34485f; + box-shadow: none; + color: #fff; +} +.tox .tox-button--naked:focus:not(:disabled) { + background-color: #34485f; + border-color: #34485f; + box-shadow: none; + color: #fff; +} +.tox .tox-button--naked:active:not(:disabled) { + background-color: #2b3b4e; + border-color: #2b3b4e; + box-shadow: none; + color: #fff; +} +.tox .tox-button--naked .tox-icon svg { + fill: currentColor; +} +.tox .tox-button--naked.tox-button--icon:hover:not(:disabled) { + color: #fff; +} +.tox .tox-checkbox { + align-items: center; + border-radius: 3px; + cursor: pointer; + display: flex; + height: 36px; + min-width: 36px; +} +.tox .tox-checkbox__input { + /* Hide from view but visible to screen readers */ + height: 1px; + overflow: hidden; + position: absolute; + top: auto; + width: 1px; +} +.tox .tox-checkbox__icons { + align-items: center; + border-radius: 3px; + box-shadow: 0 0 0 2px transparent; + box-sizing: content-box; + display: flex; + height: 24px; + justify-content: center; + padding: calc(4px - 1px); + width: 24px; +} +.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: block; + fill: rgba(255, 255, 255, 0.2); +} +.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: none; + fill: #207ab7; +} +.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: none; + fill: #207ab7; +} +.tox .tox-checkbox--disabled { + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg { + fill: rgba(255, 255, 255, 0.5); +} +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + fill: rgba(255, 255, 255, 0.5); +} +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + fill: rgba(255, 255, 255, 0.5); +} +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: block; +} +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: block; +} +.tox input.tox-checkbox__input:focus + .tox-checkbox__icons { + border-radius: 3px; + box-shadow: inset 0 0 0 1px #207ab7; + padding: calc(4px - 1px); +} +.tox:not([dir=rtl]) .tox-checkbox__label { + margin-left: 4px; +} +.tox:not([dir=rtl]) .tox-checkbox__input { + left: -10000px; +} +.tox:not([dir=rtl]) .tox-bar .tox-checkbox { + margin-left: 4px; +} +.tox[dir=rtl] .tox-checkbox__label { + margin-right: 4px; +} +.tox[dir=rtl] .tox-checkbox__input { + right: -10000px; +} +.tox[dir=rtl] .tox-bar .tox-checkbox { + margin-right: 4px; +} +.tox { + /* stylelint-disable-next-line no-descending-specificity */ +} +.tox .tox-collection--toolbar .tox-collection__group { + display: flex; + padding: 0; +} +.tox .tox-collection--grid .tox-collection__group { + display: flex; + flex-wrap: wrap; + max-height: 208px; + overflow-x: hidden; + overflow-y: auto; + padding: 0; +} +.tox .tox-collection--list .tox-collection__group { + border-bottom-width: 0; + border-color: #1a1a1a; + border-left-width: 0; + border-right-width: 0; + border-style: solid; + border-top-width: 1px; + padding: 4px 0; +} +.tox .tox-collection--list .tox-collection__group:first-child { + border-top-width: 0; +} +.tox .tox-collection__group-heading { + background-color: #333333; + color: #fff; + cursor: default; + font-size: 12px; + font-style: normal; + font-weight: normal; + margin-bottom: 4px; + margin-top: -4px; + padding: 4px 8px; + text-transform: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.tox .tox-collection__item { + align-items: center; + color: #fff; + cursor: pointer; + display: flex; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.tox .tox-collection--list .tox-collection__item { + padding: 4px 8px; +} +.tox .tox-collection--toolbar .tox-collection__item { + border-radius: 3px; + padding: 4px; +} +.tox .tox-collection--grid .tox-collection__item { + border-radius: 3px; + padding: 4px; +} +.tox .tox-collection--list .tox-collection__item--enabled { + background-color: #2b3b4e; + color: #fff; +} +.tox .tox-collection--list .tox-collection__item--active { + background-color: #4a5562; +} +.tox .tox-collection--toolbar .tox-collection__item--enabled { + background-color: #757d87; + color: #fff; +} +.tox .tox-collection--toolbar .tox-collection__item--active { + background-color: #4a5562; +} +.tox .tox-collection--grid .tox-collection__item--enabled { + background-color: #757d87; + color: #fff; +} +.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + background-color: #4a5562; + color: #fff; +} +.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + color: #fff; +} +.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + color: #fff; +} +.tox .tox-collection__item--state-disabled { + background-color: transparent; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} +.tox .tox-collection__item-icon, +.tox .tox-collection__item-checkmark { + align-items: center; + display: flex; + height: 24px; + justify-content: center; + width: 24px; +} +.tox .tox-collection__item-icon svg, +.tox .tox-collection__item-checkmark svg { + fill: currentColor; +} +.tox .tox-collection--toolbar-lg .tox-collection__item-icon { + height: 48px; + width: 48px; +} +.tox .tox-collection__item-label { + color: currentColor; + display: inline-block; + flex: 1; + -ms-flex-preferred-size: auto; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 24px; + text-transform: none; + word-break: break-all; +} +.tox .tox-collection__item-accessory { + color: rgba(255, 255, 255, 0.5); + display: inline-block; + font-size: 14px; + height: 24px; + line-height: 24px; + text-transform: none; +} +.tox .tox-collection__item-caret { + align-items: center; + display: flex; + min-height: 24px; +} +.tox .tox-collection__item-caret::after { + content: ''; + font-size: 0; + min-height: inherit; +} +.tox .tox-collection__item-caret svg { + fill: #fff; +} +.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg { + display: none; +} +.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory + .tox-collection__item-checkmark { + display: none; +} +.tox .tox-collection--horizontal { + background-color: #2b3b4e; + border: 1px solid #1a1a1a; + border-radius: 3px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: nowrap; + margin-bottom: 0; + overflow-x: auto; + padding: 0; +} +.tox .tox-collection--horizontal .tox-collection__group { + align-items: center; + display: flex; + flex-wrap: nowrap; + margin: 0; + padding: 0 4px; +} +.tox .tox-collection--horizontal .tox-collection__item { + height: 34px; + margin: 2px 0 3px 0; + padding: 0 4px; +} +.tox .tox-collection--horizontal .tox-collection__item-label { + white-space: nowrap; +} +.tox .tox-collection--horizontal .tox-collection__item-caret { + margin-left: 4px; +} +.tox .tox-collection__item-container { + display: flex; +} +.tox .tox-collection__item-container--row { + align-items: center; + flex: 1 1 auto; + flex-direction: row; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--align-left { + margin-right: auto; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--align-right { + justify-content: flex-end; + margin-left: auto; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top { + align-items: flex-start; + margin-bottom: auto; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle { + align-items: center; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom { + align-items: flex-end; + margin-top: auto; +} +.tox .tox-collection__item-container--column { + -ms-grid-row-align: center; + align-self: center; + flex: 1 1 auto; + flex-direction: column; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--align-left { + align-items: flex-start; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--align-right { + align-items: flex-end; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top { + align-self: flex-start; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle { + -ms-grid-row-align: center; + align-self: center; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom { + align-self: flex-end; +} +.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type) { + border-right: 1px solid #000000; +} +.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item > *:not(:first-child) { + margin-left: 8px; +} +.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child { + margin-left: 4px; +} +.tox:not([dir=rtl]) .tox-collection__item-accessory { + margin-left: 16px; + text-align: right; +} +.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret { + margin-left: 16px; +} +.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type) { + border-left: 1px solid #000000; +} +.tox[dir=rtl] .tox-collection--list .tox-collection__item > *:not(:first-child) { + margin-right: 8px; +} +.tox[dir=rtl] .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child { + margin-right: 4px; +} +.tox[dir=rtl] .tox-collection__item-icon-rtl { + /* stylelint-disable-next-line no-descending-specificity */ +} +.tox[dir=rtl] .tox-collection__item-icon-rtl .tox-collection__item-icon svg { + transform: rotateY(180deg); +} +.tox[dir=rtl] .tox-collection__item-accessory { + margin-right: 16px; + text-align: left; +} +.tox[dir=rtl] .tox-collection .tox-collection__item-caret { + margin-right: 16px; + transform: rotateY(180deg); +} +.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret { + margin-right: 4px; +} +.tox .tox-color-picker-container { + display: flex; + flex-direction: row; + height: 225px; + margin: 0; +} +.tox .tox-sv-palette { + box-sizing: border-box; + display: flex; + height: 100%; +} +.tox .tox-sv-palette-spectrum { + height: 100%; +} +.tox .tox-sv-palette, +.tox .tox-sv-palette-spectrum { + width: 225px; +} +.tox .tox-sv-palette-thumb { + background: none; + border: 1px solid black; + border-radius: 50%; + box-sizing: content-box; + height: 12px; + position: absolute; + width: 12px; +} +.tox .tox-sv-palette-inner-thumb { + border: 1px solid white; + border-radius: 50%; + height: 10px; + position: absolute; + width: 10px; +} +.tox .tox-hue-slider { + box-sizing: border-box; + height: 100%; + width: 25px; +} +.tox .tox-hue-slider-spectrum { + background: linear-gradient(to bottom, #f00, #ff0080, #f0f, #8000ff, #00f, #0080ff, #0ff, #00ff80, #0f0, #80ff00, #ff0, #ff8000, #f00); + height: 100%; + width: 100%; +} +.tox .tox-hue-slider, +.tox .tox-hue-slider-spectrum { + width: 20px; +} +.tox .tox-hue-slider-thumb { + background: white; + border: 1px solid black; + box-sizing: content-box; + height: 4px; + width: 100%; +} +.tox .tox-rgb-form { + display: flex; + flex-direction: column; + justify-content: space-between; +} +.tox .tox-rgb-form div { + align-items: center; + display: flex; + justify-content: space-between; + margin-bottom: 5px; + width: inherit; +} +.tox .tox-rgb-form input { + width: 6em; +} +.tox .tox-rgb-form input.tox-invalid { + /* Need !important to override Chrome's focus styling unfortunately */ + border: 1px solid red !important; +} +.tox .tox-rgb-form .tox-rgba-preview { + border: 1px solid black; + flex-grow: 2; + margin-bottom: 0; +} +.tox:not([dir=rtl]) .tox-sv-palette { + margin-right: 15px; +} +.tox:not([dir=rtl]) .tox-hue-slider { + margin-right: 15px; +} +.tox:not([dir=rtl]) .tox-hue-slider-thumb { + margin-left: -1px; +} +.tox:not([dir=rtl]) .tox-rgb-form label { + margin-right: 0.5em; +} +.tox[dir=rtl] .tox-sv-palette { + margin-left: 15px; +} +.tox[dir=rtl] .tox-hue-slider { + margin-left: 15px; +} +.tox[dir=rtl] .tox-hue-slider-thumb { + margin-right: -1px; +} +.tox[dir=rtl] .tox-rgb-form label { + margin-left: 0.5em; +} +.tox .tox-toolbar .tox-swatches, +.tox .tox-toolbar__primary .tox-swatches, +.tox .tox-toolbar__overflow .tox-swatches { + margin: 2px 0 3px 4px; +} +.tox .tox-collection--list .tox-collection__group .tox-swatches-menu { + border: 0; + margin: -4px 0; +} +.tox .tox-swatches__row { + display: flex; +} +.tox .tox-swatch { + height: 30px; + transition: transform 0.15s, box-shadow 0.15s; + width: 30px; +} +.tox .tox-swatch:hover, +.tox .tox-swatch:focus { + box-shadow: 0 0 0 1px rgba(127, 127, 127, 0.3) inset; + transform: scale(0.8); +} +.tox .tox-swatch--remove { + align-items: center; + display: flex; + justify-content: center; +} +.tox .tox-swatch--remove svg path { + stroke: #e74c3c; +} +.tox .tox-swatches__picker-btn { + align-items: center; + background-color: transparent; + border: 0; + cursor: pointer; + display: flex; + height: 30px; + justify-content: center; + outline: none; + padding: 0; + width: 30px; +} +.tox .tox-swatches__picker-btn svg { + height: 24px; + width: 24px; +} +.tox .tox-swatches__picker-btn:hover { + background: #4a5562; +} +.tox:not([dir=rtl]) .tox-swatches__picker-btn { + margin-left: auto; +} +.tox[dir=rtl] .tox-swatches__picker-btn { + margin-right: auto; +} +.tox .tox-comment-thread { + background: #2b3b4e; + position: relative; +} +.tox .tox-comment-thread > *:not(:first-child) { + margin-top: 8px; +} +.tox .tox-comment { + background: #2b3b4e; + border: 1px solid #000000; + border-radius: 3px; + box-shadow: 0 4px 8px 0 rgba(42, 55, 70, 0.1); + padding: 8px 8px 16px 8px; + position: relative; +} +.tox .tox-comment__header { + align-items: center; + color: #fff; + display: flex; + justify-content: space-between; +} +.tox .tox-comment__date { + color: rgba(255, 255, 255, 0.5); + font-size: 12px; +} +.tox .tox-comment__body { + color: #fff; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + margin-top: 8px; + position: relative; + text-transform: initial; +} +.tox .tox-comment__body textarea { + resize: none; + white-space: normal; + width: 100%; +} +.tox .tox-comment__expander { + padding-top: 8px; +} +.tox .tox-comment__expander p { + color: rgba(255, 255, 255, 0.5); + font-size: 14px; + font-style: normal; +} +.tox .tox-comment__body p { + margin: 0; +} +.tox .tox-comment__buttonspacing { + padding-top: 16px; + text-align: center; +} +.tox .tox-comment-thread__overlay::after { + background: #2b3b4e; + bottom: 0; + content: ""; + display: flex; + left: 0; + opacity: 0.9; + position: absolute; + right: 0; + top: 0; + z-index: 5; +} +.tox .tox-comment__reply { + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + justify-content: flex-end; + margin-top: 8px; +} +.tox .tox-comment__reply > *:first-child { + margin-bottom: 8px; + width: 100%; +} +.tox .tox-comment__edit { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + margin-top: 16px; +} +.tox .tox-comment__gradient::after { + background: linear-gradient(rgba(43, 59, 78, 0), #2b3b4e); + bottom: 0; + content: ""; + display: block; + height: 5em; + margin-top: -40px; + position: absolute; + width: 100%; +} +.tox .tox-comment__overlay { + background: #2b3b4e; + bottom: 0; + display: flex; + flex-direction: column; + flex-grow: 1; + left: 0; + opacity: 0.9; + position: absolute; + right: 0; + text-align: center; + top: 0; + z-index: 5; +} +.tox .tox-comment__loading-text { + align-items: center; + color: #fff; + display: flex; + flex-direction: column; + position: relative; +} +.tox .tox-comment__loading-text > div { + padding-bottom: 16px; +} +.tox .tox-comment__overlaytext { + bottom: 0; + flex-direction: column; + font-size: 14px; + left: 0; + padding: 1em; + position: absolute; + right: 0; + top: 0; + z-index: 10; +} +.tox .tox-comment__overlaytext p { + background-color: #2b3b4e; + box-shadow: 0 0 8px 8px #2b3b4e; + color: #fff; + text-align: center; +} +.tox .tox-comment__overlaytext div:nth-of-type(2) { + font-size: 0.8em; +} +.tox .tox-comment__busy-spinner { + align-items: center; + background-color: #2b3b4e; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 20; +} +.tox .tox-comment__scroll { + display: flex; + flex-direction: column; + flex-shrink: 1; + overflow: auto; +} +.tox .tox-conversations { + margin: 8px; +} +.tox:not([dir=rtl]) .tox-comment__edit { + margin-left: 8px; +} +.tox:not([dir=rtl]) .tox-comment__buttonspacing > *:last-child, +.tox:not([dir=rtl]) .tox-comment__edit > *:last-child, +.tox:not([dir=rtl]) .tox-comment__reply > *:last-child { + margin-left: 8px; +} +.tox[dir=rtl] .tox-comment__edit { + margin-right: 8px; +} +.tox[dir=rtl] .tox-comment__buttonspacing > *:last-child, +.tox[dir=rtl] .tox-comment__edit > *:last-child, +.tox[dir=rtl] .tox-comment__reply > *:last-child { + margin-right: 8px; +} +.tox .tox-user { + align-items: center; + display: flex; +} +.tox .tox-user__avatar svg { + fill: rgba(255, 255, 255, 0.5); +} +.tox .tox-user__name { + color: rgba(255, 255, 255, 0.5); + font-size: 12px; + font-style: normal; + font-weight: bold; + text-transform: uppercase; +} +.tox:not([dir=rtl]) .tox-user__avatar svg { + margin-right: 8px; +} +.tox:not([dir=rtl]) .tox-user__avatar + .tox-user__name { + margin-left: 8px; +} +.tox[dir=rtl] .tox-user__avatar svg { + margin-left: 8px; +} +.tox[dir=rtl] .tox-user__avatar + .tox-user__name { + margin-right: 8px; +} +.tox .tox-dialog-wrap { + align-items: center; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: fixed; + right: 0; + top: 0; + z-index: 1100; +} +.tox .tox-dialog-wrap__backdrop { + background-color: rgba(34, 47, 62, 0.75); + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 1; +} +.tox .tox-dialog-wrap__backdrop--opaque { + background-color: #222f3e; +} +.tox .tox-dialog { + background-color: #2b3b4e; + border-color: #000000; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: 0 16px 16px -10px rgba(42, 55, 70, 0.15), 0 0 40px 1px rgba(42, 55, 70, 0.15); + display: flex; + flex-direction: column; + max-height: 100%; + max-width: 480px; + overflow: hidden; + position: relative; + width: 95vw; + z-index: 2; +} +@media only screen and (max-width:767px) { + body:not(.tox-force-desktop) .tox .tox-dialog { + align-self: flex-start; + margin: 8px auto; + width: calc(100vw - 16px); + } +} +.tox .tox-dialog-inline { + z-index: 1100; +} +.tox .tox-dialog__header { + align-items: center; + background-color: #2b3b4e; + border-bottom: none; + color: #fff; + display: flex; + font-size: 16px; + justify-content: space-between; + padding: 8px 16px 0 16px; + position: relative; +} +.tox .tox-dialog__header .tox-button { + z-index: 1; +} +.tox .tox-dialog__draghandle { + cursor: grab; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.tox .tox-dialog__draghandle:active { + cursor: grabbing; +} +.tox .tox-dialog__dismiss { + margin-left: auto; +} +.tox .tox-dialog__title { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 20px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + margin: 0; + text-transform: none; +} +.tox .tox-dialog__body { + color: #fff; + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; + font-size: 16px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + min-width: 0; + text-align: left; + text-transform: none; +} +@media only screen and (max-width:767px) { + body:not(.tox-force-desktop) .tox .tox-dialog__body { + flex-direction: column; + } +} +.tox .tox-dialog__body-nav { + align-items: flex-start; + display: flex; + flex-direction: column; + padding: 16px 16px; +} +@media only screen and (max-width:767px) { + body:not(.tox-force-desktop) .tox .tox-dialog__body-nav { + flex-direction: row; + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding-bottom: 0; + } +} +.tox .tox-dialog__body-nav-item { + border-bottom: 2px solid transparent; + color: rgba(255, 255, 255, 0.5); + display: inline-block; + font-size: 14px; + line-height: 1.3; + margin-bottom: 8px; + text-decoration: none; + white-space: nowrap; +} +.tox .tox-dialog__body-nav-item:focus { + background-color: rgba(32, 122, 183, 0.1); +} +.tox .tox-dialog__body-nav-item--active { + border-bottom: 2px solid #207ab7; + color: #207ab7; +} +.tox .tox-dialog__body-content { + box-sizing: border-box; + display: flex; + flex: 1; + flex-direction: column; + -ms-flex-preferred-size: auto; + max-height: 650px; + overflow: auto; + -webkit-overflow-scrolling: touch; + padding: 16px 16px; +} +.tox .tox-dialog__body-content > * { + margin-bottom: 0; + margin-top: 16px; +} +.tox .tox-dialog__body-content > *:first-child { + margin-top: 0; +} +.tox .tox-dialog__body-content > *:last-child { + margin-bottom: 0; +} +.tox .tox-dialog__body-content > *:only-child { + margin-bottom: 0; + margin-top: 0; +} +.tox .tox-dialog__body-content a { + color: #207ab7; + cursor: pointer; + text-decoration: none; +} +.tox .tox-dialog__body-content a:hover, +.tox .tox-dialog__body-content a:focus { + color: #185d8c; + text-decoration: none; +} +.tox .tox-dialog__body-content a:active { + color: #185d8c; + text-decoration: none; +} +.tox .tox-dialog__body-content svg { + fill: #fff; +} +.tox .tox-dialog__body-content ul { + display: block; + list-style-type: disc; + margin-bottom: 16px; + -webkit-margin-end: 0; + margin-inline-end: 0; + -webkit-margin-start: 0; + margin-inline-start: 0; + -webkit-padding-start: 2.5rem; + padding-inline-start: 2.5rem; +} +.tox .tox-dialog__body-content .tox-form__group h1 { + color: #fff; + font-size: 20px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + margin-bottom: 16px; + margin-top: 2rem; + text-transform: none; +} +.tox .tox-dialog__body-content .tox-form__group h2 { + color: #fff; + font-size: 16px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + margin-bottom: 16px; + margin-top: 2rem; + text-transform: none; +} +.tox .tox-dialog__body-content .tox-form__group p { + margin-bottom: 16px; +} +.tox .tox-dialog__body-content .tox-form__group h1:first-child, +.tox .tox-dialog__body-content .tox-form__group h2:first-child, +.tox .tox-dialog__body-content .tox-form__group p:first-child { + margin-top: 0; +} +.tox .tox-dialog__body-content .tox-form__group h1:last-child, +.tox .tox-dialog__body-content .tox-form__group h2:last-child, +.tox .tox-dialog__body-content .tox-form__group p:last-child { + margin-bottom: 0; +} +.tox .tox-dialog__body-content .tox-form__group h1:only-child, +.tox .tox-dialog__body-content .tox-form__group h2:only-child, +.tox .tox-dialog__body-content .tox-form__group p:only-child { + margin-bottom: 0; + margin-top: 0; +} +.tox .tox-dialog--width-lg { + height: 650px; + max-width: 1200px; +} +.tox .tox-dialog--width-md { + max-width: 800px; +} +.tox .tox-dialog--width-md .tox-dialog__body-content { + overflow: auto; +} +.tox .tox-dialog__body-content--centered { + text-align: center; +} +.tox .tox-dialog__footer { + align-items: center; + background-color: #2b3b4e; + border-top: 1px solid #000000; + display: flex; + justify-content: space-between; + padding: 8px 16px; +} +.tox .tox-dialog__footer-start, +.tox .tox-dialog__footer-end { + display: flex; +} +.tox .tox-dialog__busy-spinner { + align-items: center; + background-color: rgba(34, 47, 62, 0.75); + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 3; +} +.tox .tox-dialog__table { + border-collapse: collapse; + width: 100%; +} +.tox .tox-dialog__table thead th { + font-weight: bold; + padding-bottom: 8px; +} +.tox .tox-dialog__table tbody tr { + border-bottom: 1px solid #000000; +} +.tox .tox-dialog__table tbody tr:last-child { + border-bottom: none; +} +.tox .tox-dialog__table td { + padding-bottom: 8px; + padding-top: 8px; +} +.tox .tox-dialog__popups { + position: absolute; + width: 100%; + z-index: 1100; +} +.tox .tox-dialog__body-iframe { + display: flex; + flex: 1; + flex-direction: column; + -ms-flex-preferred-size: auto; +} +.tox .tox-dialog__body-iframe .tox-navobj { + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2) { + flex: 1; + -ms-flex-preferred-size: auto; + height: 100%; +} +.tox .tox-dialog-dock-fadeout { + opacity: 0; + visibility: hidden; +} +.tox .tox-dialog-dock-fadein { + opacity: 1; + visibility: visible; +} +.tox .tox-dialog-dock-transition { + transition: visibility 0s linear 0.3s, opacity 0.3s ease; +} +.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein { + transition-delay: 0s; +} +.tox.tox-platform-ie { + /* IE11 CSS styles go here */ +} +.tox.tox-platform-ie .tox-dialog-wrap { + position: -ms-device-fixed; +} +@media only screen and (max-width:767px) { + body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav { + margin-right: 0; + } +} +@media only screen and (max-width:767px) { + body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child) { + margin-left: 8px; + } +} +.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start > *, +.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end > * { + margin-left: 8px; +} +.tox[dir=rtl] .tox-dialog__body { + text-align: right; +} +@media only screen and (max-width:767px) { + body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav { + margin-left: 0; + } +} +@media only screen and (max-width:767px) { + body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child) { + margin-right: 8px; + } +} +.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start > *, +.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end > * { + margin-right: 8px; +} +body.tox-dialog__disable-scroll { + overflow: hidden; +} +.tox .tox-dropzone-container { + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-dropzone { + align-items: center; + background: #fff; + border: 2px dashed #000000; + box-sizing: border-box; + display: flex; + flex-direction: column; + flex-grow: 1; + justify-content: center; + min-height: 100px; + padding: 10px; +} +.tox .tox-dropzone p { + color: rgba(255, 255, 255, 0.5); + margin: 0 0 16px 0; +} +.tox .tox-edit-area { + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; + overflow: hidden; + position: relative; +} +.tox .tox-edit-area__iframe { + background-color: #fff; + border: 0; + box-sizing: border-box; + flex: 1; + -ms-flex-preferred-size: auto; + height: 100%; + position: absolute; + width: 100%; +} +.tox.tox-inline-edit-area { + border: 1px dotted #000000; +} +.tox .tox-editor-container { + display: flex; + flex: 1 1 auto; + flex-direction: column; + overflow: hidden; +} +.tox .tox-editor-header { + z-index: 1; +} +.tox:not(.tox-tinymce-inline) .tox-editor-header { + box-shadow: none; + transition: box-shadow 0.5s; +} +.tox.tox-tinymce--toolbar-bottom .tox-editor-header, +.tox.tox-tinymce-inline .tox-editor-header { + margin-bottom: -1px; +} +.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header { + background-color: transparent; + box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25); +} +.tox-editor-dock-fadeout { + opacity: 0; + visibility: hidden; +} +.tox-editor-dock-fadein { + opacity: 1; + visibility: visible; +} +.tox-editor-dock-transition { + transition: visibility 0s linear 0.25s, opacity 0.25s ease; +} +.tox-editor-dock-transition.tox-editor-dock-fadein { + transition-delay: 0s; +} +.tox .tox-control-wrap { + flex: 1; + position: relative; +} +.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid, +.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown, +.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid { + display: none; +} +.tox .tox-control-wrap svg { + display: block; +} +.tox .tox-control-wrap__status-icon-wrap { + position: absolute; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-control-wrap__status-icon-invalid svg { + fill: #c00; +} +.tox .tox-control-wrap__status-icon-unknown svg { + fill: orange; +} +.tox .tox-control-wrap__status-icon-valid svg { + fill: green; +} +.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield, +.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield, +.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield { + padding-right: 32px; +} +.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap { + right: 4px; +} +.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield, +.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield, +.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield { + padding-left: 32px; +} +.tox[dir=rtl] .tox-control-wrap__status-icon-wrap { + left: 4px; +} +.tox .tox-autocompleter { + max-width: 25em; +} +.tox .tox-autocompleter .tox-menu { + max-width: 25em; +} +.tox .tox-autocompleter .tox-autocompleter-highlight { + font-weight: bold; +} +.tox .tox-color-input { + display: flex; + position: relative; + z-index: 1; +} +.tox .tox-color-input .tox-textfield { + z-index: -1; +} +.tox .tox-color-input span { + border-color: rgba(42, 55, 70, 0.2); + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + height: 24px; + position: absolute; + top: 6px; + width: 24px; +} +.tox .tox-color-input span:hover:not([aria-disabled=true]), +.tox .tox-color-input span:focus:not([aria-disabled=true]) { + border-color: #207ab7; + cursor: pointer; +} +.tox .tox-color-input span::before { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.25) 25%, transparent 25%), linear-gradient(-45deg, rgba(255, 255, 255, 0.25) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, rgba(255, 255, 255, 0.25) 75%), linear-gradient(-45deg, transparent 75%, rgba(255, 255, 255, 0.25) 75%); + background-position: 0 0, 0 6px, 6px -6px, -6px 0; + background-size: 12px 12px; + border: 1px solid #2b3b4e; + border-radius: 3px; + box-sizing: border-box; + content: ''; + height: 24px; + left: -1px; + position: absolute; + top: -1px; + width: 24px; + z-index: -1; +} +.tox .tox-color-input span[aria-disabled=true] { + cursor: not-allowed; +} +.tox:not([dir=rtl]) .tox-color-input { + /* stylelint-disable-next-line no-descending-specificity */ +} +.tox:not([dir=rtl]) .tox-color-input .tox-textfield { + padding-left: 36px; +} +.tox:not([dir=rtl]) .tox-color-input span { + left: 6px; +} +.tox[dir="rtl"] .tox-color-input { + /* stylelint-disable-next-line no-descending-specificity */ +} +.tox[dir="rtl"] .tox-color-input .tox-textfield { + padding-right: 36px; +} +.tox[dir="rtl"] .tox-color-input span { + right: 6px; +} +.tox .tox-label, +.tox .tox-toolbar-label { + color: rgba(255, 255, 255, 0.5); + display: block; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + padding: 0 8px 0 0; + text-transform: none; + white-space: nowrap; +} +.tox .tox-toolbar-label { + padding: 0 8px; +} +.tox[dir=rtl] .tox-label { + padding: 0 0 0 8px; +} +.tox .tox-form { + display: flex; + flex: 1; + flex-direction: column; + -ms-flex-preferred-size: auto; +} +.tox .tox-form__group { + box-sizing: border-box; + margin-bottom: 4px; +} +.tox .tox-form-group--maximize { + flex: 1; +} +.tox .tox-form__group--error { + color: #c00; +} +.tox .tox-form__group--collection { + display: flex; +} +.tox .tox-form__grid { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-between; +} +.tox .tox-form__grid--2col > .tox-form__group { + width: calc(50% - (8px / 2)); +} +.tox .tox-form__grid--3col > .tox-form__group { + width: calc(100% / 3 - (8px / 2)); +} +.tox .tox-form__grid--4col > .tox-form__group { + width: calc(25% - (8px / 2)); +} +.tox .tox-form__controls-h-stack { + align-items: center; + display: flex; +} +.tox .tox-form__group--inline { + align-items: center; + display: flex; +} +.tox .tox-form__group--stretched { + display: flex; + flex: 1; + flex-direction: column; + -ms-flex-preferred-size: auto; +} +.tox .tox-form__group--stretched .tox-textarea { + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-form__group--stretched .tox-navobj { + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-form__group--stretched .tox-navobj :nth-child(2) { + flex: 1; + -ms-flex-preferred-size: auto; + height: 100%; +} +.tox:not([dir=rtl]) .tox-form__controls-h-stack > *:not(:first-child) { + margin-left: 4px; +} +.tox[dir=rtl] .tox-form__controls-h-stack > *:not(:first-child) { + margin-right: 4px; +} +.tox .tox-lock.tox-locked .tox-lock-icon__unlock, +.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock { + display: none; +} +.tox .tox-textfield, +.tox .tox-toolbar-textfield, +.tox .tox-listboxfield .tox-listbox--select, +.tox .tox-textarea { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #2b3b4e; + border-color: #000000; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #fff; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 16px; + line-height: 24px; + margin: 0; + min-height: 34px; + outline: none; + padding: 5px 4.75px; + resize: none; + width: 100%; +} +.tox .tox-textfield[disabled], +.tox .tox-textarea[disabled] { + background-color: #222f3e; + color: rgba(255, 255, 255, 0.85); + cursor: not-allowed; +} +.tox .tox-textfield:focus, +.tox .tox-listboxfield .tox-listbox--select:focus, +.tox .tox-textarea:focus { + background-color: #2b3b4e; + border-color: #207ab7; + box-shadow: none; + outline: none; +} +.tox .tox-toolbar-textfield { + border-width: 0; + margin-bottom: 3px; + margin-top: 2px; + max-width: 250px; +} +.tox .tox-naked-btn { + background-color: transparent; + border: 0; + border-color: transparent; + box-shadow: unset; + color: #207ab7; + cursor: pointer; + display: block; + margin: 0; + padding: 0; +} +.tox .tox-naked-btn svg { + display: block; + fill: #fff; +} +.tox:not([dir=rtl]) .tox-toolbar-textfield + * { + margin-left: 4px; +} +.tox[dir=rtl] .tox-toolbar-textfield + * { + margin-right: 4px; +} +.tox .tox-listboxfield { + cursor: pointer; + position: relative; +} +.tox .tox-listboxfield .tox-listbox--select[disabled] { + background-color: #19232e; + color: rgba(255, 255, 255, 0.85); + cursor: not-allowed; +} +.tox .tox-listbox__select-label { + cursor: default; + flex: 1; + margin: 0 4px; +} +.tox .tox-listbox__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; +} +.tox .tox-listbox__select-chevron svg { + fill: #fff; +} +.tox .tox-listboxfield .tox-listbox--select { + align-items: center; + display: flex; +} +.tox:not([dir=rtl]) .tox-listboxfield svg { + right: 8px; +} +.tox[dir=rtl] .tox-listboxfield svg { + left: 8px; +} +.tox .tox-selectfield { + cursor: pointer; + position: relative; +} +.tox .tox-selectfield select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #2b3b4e; + border-color: #000000; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #fff; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 16px; + line-height: 24px; + margin: 0; + min-height: 34px; + outline: none; + padding: 5px 4.75px; + resize: none; + width: 100%; +} +.tox .tox-selectfield select[disabled] { + background-color: #19232e; + color: rgba(255, 255, 255, 0.85); + cursor: not-allowed; +} +.tox .tox-selectfield select::-ms-expand { + display: none; +} +.tox .tox-selectfield select:focus { + background-color: #2b3b4e; + border-color: #207ab7; + box-shadow: none; + outline: none; +} +.tox .tox-selectfield svg { + pointer-events: none; + position: absolute; + top: 50%; + transform: translateY(-50%); +} +.tox:not([dir=rtl]) .tox-selectfield select[size="0"], +.tox:not([dir=rtl]) .tox-selectfield select[size="1"] { + padding-right: 24px; +} +.tox:not([dir=rtl]) .tox-selectfield svg { + right: 8px; +} +.tox[dir=rtl] .tox-selectfield select[size="0"], +.tox[dir=rtl] .tox-selectfield select[size="1"] { + padding-left: 24px; +} +.tox[dir=rtl] .tox-selectfield svg { + left: 8px; +} +.tox .tox-textarea { + -webkit-appearance: textarea; + -moz-appearance: textarea; + appearance: textarea; + white-space: pre-wrap; +} +.tox-fullscreen { + border: 0; + height: 100%; + left: 0; + margin: 0; + overflow: hidden; + -ms-scroll-chaining: none; + overscroll-behavior: none; + padding: 0; + position: fixed; + top: 0; + touch-action: pinch-zoom; + width: 100%; +} +.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle { + display: none; +} +.tox.tox-tinymce.tox-fullscreen { + background-color: transparent; + z-index: 1200; +} +.tox-shadowhost.tox-fullscreen { + z-index: 1200; +} +.tox-fullscreen .tox.tox-tinymce-aux, +.tox-fullscreen ~ .tox.tox-tinymce-aux { + z-index: 1201; +} +.tox .tox-help__more-link { + list-style: none; + margin-top: 1em; +} +.tox .tox-image-tools { + width: 100%; +} +.tox .tox-image-tools__toolbar { + align-items: center; + display: flex; + justify-content: center; +} +.tox .tox-image-tools__image { + background-color: #666; + height: 380px; + overflow: auto; + position: relative; + width: 100%; +} +.tox .tox-image-tools__image, +.tox .tox-image-tools__image + .tox-image-tools__toolbar { + margin-top: 8px; +} +.tox .tox-image-tools__image-bg { + background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==); +} +.tox .tox-image-tools__toolbar > .tox-spacer { + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-croprect-block { + background: black; + filter: alpha(opacity=50); + opacity: 0.5; + position: absolute; + zoom: 1; +} +.tox .tox-croprect-handle { + border: 2px solid white; + height: 20px; + left: 0; + position: absolute; + top: 0; + width: 20px; +} +.tox .tox-croprect-handle-move { + border: 0; + cursor: move; + position: absolute; +} +.tox .tox-croprect-handle-nw { + border-width: 2px 0 0 2px; + cursor: nw-resize; + left: 100px; + margin: -2px 0 0 -2px; + top: 100px; +} +.tox .tox-croprect-handle-ne { + border-width: 2px 2px 0 0; + cursor: ne-resize; + left: 200px; + margin: -2px 0 0 -20px; + top: 100px; +} +.tox .tox-croprect-handle-sw { + border-width: 0 0 2px 2px; + cursor: sw-resize; + left: 100px; + margin: -20px 2px 0 -2px; + top: 200px; +} +.tox .tox-croprect-handle-se { + border-width: 0 2px 2px 0; + cursor: se-resize; + left: 200px; + margin: -20px 0 0 -20px; + top: 200px; +} +.tox:not([dir=rtl]) .tox-image-tools__toolbar > .tox-slider:not(:first-of-type) { + margin-left: 8px; +} +.tox:not([dir=rtl]) .tox-image-tools__toolbar > .tox-button + .tox-slider { + margin-left: 32px; +} +.tox:not([dir=rtl]) .tox-image-tools__toolbar > .tox-slider + .tox-button { + margin-left: 32px; +} +.tox[dir=rtl] .tox-image-tools__toolbar > .tox-slider:not(:first-of-type) { + margin-right: 8px; +} +.tox[dir=rtl] .tox-image-tools__toolbar > .tox-button + .tox-slider { + margin-right: 32px; +} +.tox[dir=rtl] .tox-image-tools__toolbar > .tox-slider + .tox-button { + margin-right: 32px; +} +.tox .tox-insert-table-picker { + display: flex; + flex-wrap: wrap; + width: 170px; +} +.tox .tox-insert-table-picker > div { + border-color: #000000; + border-style: solid; + border-width: 0 1px 1px 0; + box-sizing: border-box; + height: 17px; + width: 17px; +} +.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker { + margin: -4px 0; +} +.tox .tox-insert-table-picker .tox-insert-table-picker__selected { + background-color: rgba(32, 122, 183, 0.5); + border-color: rgba(32, 122, 183, 0.5); +} +.tox .tox-insert-table-picker__label { + color: #fff; + display: block; + font-size: 14px; + padding: 4px; + text-align: center; + width: 100%; +} +.tox:not([dir=rtl]) { + /* stylelint-disable-next-line no-descending-specificity */ +} +.tox:not([dir=rtl]) .tox-insert-table-picker > div:nth-child(10n) { + border-right: 0; +} +.tox[dir=rtl] { + /* stylelint-disable-next-line no-descending-specificity */ +} +.tox[dir=rtl] .tox-insert-table-picker > div:nth-child(10n+1) { + border-right: 0; +} +.tox { + /* stylelint-disable */ + /* stylelint-enable */ +} +.tox .tox-menu { + background-color: #2b3b4e; + border: 1px solid #000000; + border-radius: 3px; + box-shadow: 0 4px 8px 0 rgba(42, 55, 70, 0.1); + display: inline-block; + overflow: hidden; + vertical-align: top; + z-index: 1150; +} +.tox .tox-menu.tox-collection.tox-collection--list { + padding: 0; +} +.tox .tox-menu.tox-collection.tox-collection--toolbar { + padding: 4px; +} +.tox .tox-menu.tox-collection.tox-collection--grid { + padding: 4px; +} +.tox .tox-menu__label h1, +.tox .tox-menu__label h2, +.tox .tox-menu__label h3, +.tox .tox-menu__label h4, +.tox .tox-menu__label h5, +.tox .tox-menu__label h6, +.tox .tox-menu__label p, +.tox .tox-menu__label blockquote, +.tox .tox-menu__label code { + margin: 0; +} +.tox .tox-menubar { + background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e; + background-color: #222f3e; + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + padding: 0 4px 0 4px; +} +.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar { + border-top: 1px solid #000000; +} +/* Deprecated. Remove in next major release */ +.tox .tox-mbtn { + align-items: center; + background: transparent; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #fff; + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-style: normal; + font-weight: normal; + height: 34px; + justify-content: center; + margin: 2px 0 3px 0; + outline: none; + overflow: hidden; + padding: 0 4px; + text-transform: none; + width: auto; +} +.tox .tox-mbtn[disabled] { + background-color: transparent; + border: 0; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} +.tox .tox-mbtn:focus:not(:disabled) { + background: #4a5562; + border: 0; + box-shadow: none; + color: #fff; +} +.tox .tox-mbtn--active { + background: #757d87; + border: 0; + box-shadow: none; + color: #fff; +} +.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active) { + background: #4a5562; + border: 0; + box-shadow: none; + color: #fff; +} +.tox .tox-mbtn__select-label { + cursor: default; + font-weight: normal; + margin: 0 4px; +} +.tox .tox-mbtn[disabled] .tox-mbtn__select-label { + cursor: not-allowed; +} +.tox .tox-mbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; + display: none; +} +.tox .tox-notification { + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + display: -ms-grid; + display: grid; + font-size: 14px; + font-weight: normal; + -ms-grid-columns: minmax(40px, 1fr) auto minmax(40px, 1fr); + grid-template-columns: minmax(40px, 1fr) auto minmax(40px, 1fr); + margin-top: 4px; + opacity: 0; + padding: 4px; + transition: transform 100ms ease-in, opacity 150ms ease-in; +} +.tox .tox-notification p { + font-size: 14px; + font-weight: normal; +} +.tox .tox-notification a { + text-decoration: underline; +} +.tox .tox-notification--in { + opacity: 1; +} +.tox .tox-notification--success { + background-color: #e4eeda; + border-color: #d7e6c8; + color: #fff; +} +.tox .tox-notification--success p { + color: #fff; +} +.tox .tox-notification--success a { + color: #547831; +} +.tox .tox-notification--success svg { + fill: #fff; +} +.tox .tox-notification--error { + background-color: #f8dede; + border-color: #f2bfbf; + color: #fff; +} +.tox .tox-notification--error p { + color: #fff; +} +.tox .tox-notification--error a { + color: #c00; +} +.tox .tox-notification--error svg { + fill: #fff; +} +.tox .tox-notification--warn, +.tox .tox-notification--warning { + background-color: #fffaea; + border-color: #ffe89d; + color: #fff; +} +.tox .tox-notification--warn p, +.tox .tox-notification--warning p { + color: #fff; +} +.tox .tox-notification--warn a, +.tox .tox-notification--warning a { + color: #fff; +} +.tox .tox-notification--warn svg, +.tox .tox-notification--warning svg { + fill: #fff; +} +.tox .tox-notification--info { + background-color: #d9edf7; + border-color: #779ecb; + color: #fff; +} +.tox .tox-notification--info p { + color: #fff; +} +.tox .tox-notification--info a { + color: #fff; +} +.tox .tox-notification--info svg { + fill: #fff; +} +.tox .tox-notification__body { + -ms-grid-row-align: center; + align-self: center; + color: #fff; + font-size: 14px; + -ms-grid-column-span: 1; + grid-column-end: 3; + -ms-grid-column: 2; + grid-column-start: 2; + -ms-grid-row-span: 1; + grid-row-end: 2; + -ms-grid-row: 1; + grid-row-start: 1; + text-align: center; + white-space: normal; + word-break: break-all; + word-break: break-word; +} +.tox .tox-notification__body > * { + margin: 0; +} +.tox .tox-notification__body > * + * { + margin-top: 1rem; +} +.tox .tox-notification__icon { + -ms-grid-row-align: center; + align-self: center; + -ms-grid-column-span: 1; + grid-column-end: 2; + -ms-grid-column: 1; + grid-column-start: 1; + -ms-grid-row-span: 1; + grid-row-end: 2; + -ms-grid-row: 1; + grid-row-start: 1; + -ms-grid-column-align: end; + justify-self: end; +} +.tox .tox-notification__icon svg { + display: block; +} +.tox .tox-notification__dismiss { + -ms-grid-row-align: start; + align-self: start; + -ms-grid-column-span: 1; + grid-column-end: 4; + -ms-grid-column: 3; + grid-column-start: 3; + -ms-grid-row-span: 1; + grid-row-end: 2; + -ms-grid-row: 1; + grid-row-start: 1; + -ms-grid-column-align: end; + justify-self: end; +} +.tox .tox-notification .tox-progress-bar { + -ms-grid-column-span: 3; + grid-column-end: 4; + -ms-grid-column: 1; + grid-column-start: 1; + -ms-grid-row-span: 1; + grid-row-end: 3; + -ms-grid-row: 2; + grid-row-start: 2; + -ms-grid-column-align: center; + justify-self: center; +} +.tox .tox-pop { + display: inline-block; + position: relative; +} +.tox .tox-pop--resizing { + transition: width 0.1s ease; +} +.tox .tox-pop--resizing .tox-toolbar { + flex-wrap: nowrap; +} +.tox .tox-pop__dialog { + background-color: #222f3e; + border: 1px solid #000000; + border-radius: 3px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); + min-width: 0; + overflow: hidden; +} +.tox .tox-pop__dialog > *:not(.tox-toolbar) { + margin: 4px 4px 4px 8px; +} +.tox .tox-pop__dialog .tox-toolbar { + background-color: transparent; + margin-bottom: -1px; +} +.tox .tox-pop::before, +.tox .tox-pop::after { + border-style: solid; + content: ''; + display: block; + height: 0; + position: absolute; + width: 0; +} +.tox .tox-pop.tox-pop--bottom::before, +.tox .tox-pop.tox-pop--bottom::after { + left: 50%; + top: 100%; +} +.tox .tox-pop.tox-pop--bottom::after { + border-color: #222f3e transparent transparent transparent; + border-width: 8px; + margin-left: -8px; + margin-top: -1px; +} +.tox .tox-pop.tox-pop--bottom::before { + border-color: #000000 transparent transparent transparent; + border-width: 9px; + margin-left: -9px; +} +.tox .tox-pop.tox-pop--top::before, +.tox .tox-pop.tox-pop--top::after { + left: 50%; + top: 0; + transform: translateY(-100%); +} +.tox .tox-pop.tox-pop--top::after { + border-color: transparent transparent #222f3e transparent; + border-width: 8px; + margin-left: -8px; + margin-top: 1px; +} +.tox .tox-pop.tox-pop--top::before { + border-color: transparent transparent #000000 transparent; + border-width: 9px; + margin-left: -9px; +} +.tox .tox-pop.tox-pop--left::before, +.tox .tox-pop.tox-pop--left::after { + left: 0; + top: calc(50% - 1px); + transform: translateY(-50%); +} +.tox .tox-pop.tox-pop--left::after { + border-color: transparent #222f3e transparent transparent; + border-width: 8px; + margin-left: -15px; +} +.tox .tox-pop.tox-pop--left::before { + border-color: transparent #000000 transparent transparent; + border-width: 10px; + margin-left: -19px; +} +.tox .tox-pop.tox-pop--right::before, +.tox .tox-pop.tox-pop--right::after { + left: 100%; + top: calc(50% + 1px); + transform: translateY(-50%); +} +.tox .tox-pop.tox-pop--right::after { + border-color: transparent transparent transparent #222f3e; + border-width: 8px; + margin-left: -1px; +} +.tox .tox-pop.tox-pop--right::before { + border-color: transparent transparent transparent #000000; + border-width: 10px; + margin-left: -1px; +} +.tox .tox-pop.tox-pop--align-left::before, +.tox .tox-pop.tox-pop--align-left::after { + left: 20px; +} +.tox .tox-pop.tox-pop--align-right::before, +.tox .tox-pop.tox-pop--align-right::after { + left: calc(100% - 20px); +} +.tox .tox-sidebar-wrap { + display: flex; + flex-direction: row; + flex-grow: 1; + -ms-flex-preferred-size: 0; + min-height: 0; +} +.tox .tox-sidebar { + background-color: #222f3e; + display: flex; + flex-direction: row; + justify-content: flex-end; +} +.tox .tox-sidebar__slider { + display: flex; + overflow: hidden; +} +.tox .tox-sidebar__pane-container { + display: flex; +} +.tox .tox-sidebar__pane { + display: flex; +} +.tox .tox-sidebar--sliding-closed { + opacity: 0; +} +.tox .tox-sidebar--sliding-open { + opacity: 1; +} +.tox .tox-sidebar--sliding-growing, +.tox .tox-sidebar--sliding-shrinking { + transition: width 0.5s ease, opacity 0.5s ease; +} +.tox .tox-selector { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + display: inline-block; + height: 10px; + position: absolute; + width: 10px; +} +.tox.tox-platform-touch .tox-selector { + height: 12px; + width: 12px; +} +.tox .tox-slider { + align-items: center; + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; + height: 24px; + justify-content: center; + position: relative; +} +.tox .tox-slider__rail { + background-color: transparent; + border: 1px solid #000000; + border-radius: 3px; + height: 10px; + min-width: 120px; + width: 100%; +} +.tox .tox-slider__handle { + background-color: #207ab7; + border: 2px solid #185d8c; + border-radius: 3px; + box-shadow: none; + height: 24px; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%); + width: 14px; +} +.tox .tox-source-code { + overflow: auto; +} +.tox .tox-spinner { + display: flex; +} +.tox .tox-spinner > div { + animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both; + background-color: rgba(255, 255, 255, 0.5); + border-radius: 100%; + height: 8px; + width: 8px; +} +.tox .tox-spinner > div:nth-child(1) { + animation-delay: -0.32s; +} +.tox .tox-spinner > div:nth-child(2) { + animation-delay: -0.16s; +} +@keyframes tam-bouncing-dots { + 0%, + 80%, + 100% { + transform: scale(0); + } + 40% { + transform: scale(1); + } +} +.tox:not([dir=rtl]) .tox-spinner > div:not(:first-child) { + margin-left: 4px; +} +.tox[dir=rtl] .tox-spinner > div:not(:first-child) { + margin-right: 4px; +} +.tox .tox-statusbar { + align-items: center; + background-color: #222f3e; + border-top: 1px solid #000000; + color: #fff; + display: flex; + flex: 0 0 auto; + font-size: 12px; + font-weight: normal; + height: 18px; + overflow: hidden; + padding: 0 8px; + position: relative; + text-transform: uppercase; +} +.tox .tox-statusbar__text-container { + display: flex; + flex: 1 1 auto; + justify-content: flex-end; + overflow: hidden; +} +.tox .tox-statusbar__path { + display: flex; + flex: 1 1 auto; + margin-right: auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.tox .tox-statusbar__path > * { + display: inline; + white-space: nowrap; +} +.tox .tox-statusbar__wordcount { + flex: 0 0 auto; + margin-left: 1ch; +} +.tox .tox-statusbar a, +.tox .tox-statusbar__path-item, +.tox .tox-statusbar__wordcount { + color: #fff; + text-decoration: none; +} +.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]), +.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]), +.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]), +.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]), +.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]), +.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]) { + cursor: pointer; + text-decoration: underline; +} +.tox .tox-statusbar__resize-handle { + align-items: flex-end; + align-self: stretch; + cursor: nwse-resize; + display: flex; + flex: 0 0 auto; + justify-content: flex-end; + margin-left: auto; + margin-right: -8px; + padding-left: 1ch; +} +.tox .tox-statusbar__resize-handle svg { + display: block; + fill: #fff; +} +.tox .tox-statusbar__resize-handle:focus svg { + background-color: #4a5562; + border-radius: 1px; + box-shadow: 0 0 0 2px #4a5562; +} +.tox:not([dir=rtl]) .tox-statusbar__path > * { + margin-right: 4px; +} +.tox:not([dir=rtl]) .tox-statusbar__branding { + margin-left: 1ch; +} +.tox[dir=rtl] .tox-statusbar { + flex-direction: row-reverse; +} +.tox[dir=rtl] .tox-statusbar__path > * { + margin-left: 4px; +} +.tox .tox-throbber { + z-index: 1299; +} +.tox .tox-throbber__busy-spinner { + align-items: center; + background-color: rgba(34, 47, 62, 0.6); + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; +} +.tox .tox-tbtn { + align-items: center; + background: transparent; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #fff; + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-style: normal; + font-weight: normal; + height: 34px; + justify-content: center; + margin: 2px 0 3px 0; + outline: none; + overflow: hidden; + padding: 0; + text-transform: none; + width: 34px; +} +.tox .tox-tbtn svg { + display: block; + fill: #fff; +} +.tox .tox-tbtn.tox-tbtn-more { + padding-left: 5px; + padding-right: 5px; + width: inherit; +} +.tox .tox-tbtn:focus { + background: #4a5562; + border: 0; + box-shadow: none; +} +.tox .tox-tbtn:hover { + background: #4a5562; + border: 0; + box-shadow: none; + color: #fff; +} +.tox .tox-tbtn:hover svg { + fill: #fff; +} +.tox .tox-tbtn:active { + background: #757d87; + border: 0; + box-shadow: none; + color: #fff; +} +.tox .tox-tbtn:active svg { + fill: #fff; +} +.tox .tox-tbtn--disabled, +.tox .tox-tbtn--disabled:hover, +.tox .tox-tbtn:disabled, +.tox .tox-tbtn:disabled:hover { + background: transparent; + border: 0; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} +.tox .tox-tbtn--disabled svg, +.tox .tox-tbtn--disabled:hover svg, +.tox .tox-tbtn:disabled svg, +.tox .tox-tbtn:disabled:hover svg { + /* stylelint-disable-line no-descending-specificity */ + fill: rgba(255, 255, 255, 0.5); +} +.tox .tox-tbtn--enabled, +.tox .tox-tbtn--enabled:hover { + background: #757d87; + border: 0; + box-shadow: none; + color: #fff; +} +.tox .tox-tbtn--enabled > *, +.tox .tox-tbtn--enabled:hover > * { + transform: none; +} +.tox .tox-tbtn--enabled svg, +.tox .tox-tbtn--enabled:hover svg { + /* stylelint-disable-line no-descending-specificity */ + fill: #fff; +} +.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) { + color: #fff; +} +.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg { + fill: #fff; +} +.tox .tox-tbtn:active > * { + transform: none; +} +.tox .tox-tbtn--md { + height: 51px; + width: 51px; +} +.tox .tox-tbtn--lg { + flex-direction: column; + height: 68px; + width: 68px; +} +.tox .tox-tbtn--return { + -ms-grid-row-align: stretch; + align-self: stretch; + height: unset; + width: 16px; +} +.tox .tox-tbtn--labeled { + padding: 0 4px; + width: unset; +} +.tox .tox-tbtn__vlabel { + display: block; + font-size: 10px; + font-weight: normal; + letter-spacing: -0.025em; + margin-bottom: 4px; + white-space: nowrap; +} +.tox .tox-tbtn--select { + margin: 2px 0 3px 0; + padding: 0 4px; + width: auto; +} +.tox .tox-tbtn__select-label { + cursor: default; + font-weight: normal; + margin: 0 4px; +} +.tox .tox-tbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; +} +.tox .tox-tbtn__select-chevron svg { + fill: rgba(255, 255, 255, 0.5); +} +.tox .tox-tbtn--bespoke .tox-tbtn__select-label { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 7em; +} +.tox .tox-split-button { + border: 0; + border-radius: 3px; + box-sizing: border-box; + display: flex; + margin: 2px 0 3px 0; + overflow: hidden; +} +.tox .tox-split-button:hover { + box-shadow: 0 0 0 1px #4a5562 inset; +} +.tox .tox-split-button:focus { + background: #4a5562; + box-shadow: none; + color: #fff; +} +.tox .tox-split-button > * { + border-radius: 0; +} +.tox .tox-split-button__chevron { + width: 16px; +} +.tox .tox-split-button__chevron svg { + fill: rgba(255, 255, 255, 0.5); +} +.tox .tox-split-button .tox-tbtn { + margin: 0; +} +.tox.tox-platform-touch .tox-split-button .tox-tbtn:first-child { + width: 30px; +} +.tox.tox-platform-touch .tox-split-button__chevron { + width: 20px; +} +.tox .tox-split-button.tox-tbtn--disabled:hover, +.tox .tox-split-button.tox-tbtn--disabled:focus, +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover, +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus { + background: transparent; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); +} +.tox .tox-toolbar-overlord { + background-color: #222f3e; +} +.tox .tox-toolbar, +.tox .tox-toolbar__primary, +.tox .tox-toolbar__overflow { + background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e; + background-color: #222f3e; + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + padding: 0 0; +} +.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed { + height: 0; + opacity: 0; + padding-bottom: 0; + padding-top: 0; + visibility: hidden; +} +.tox .tox-toolbar__overflow--growing { + transition: height 0.3s ease, opacity 0.2s linear 0.1s; +} +.tox .tox-toolbar__overflow--shrinking { + transition: opacity 0.3s ease, height 0.2s linear 0.1s, visibility 0s linear 0.3s; +} +.tox .tox-menubar + .tox-toolbar, +.tox .tox-menubar + .tox-toolbar-overlord .tox-toolbar__primary { + border-top: 1px solid #000000; + margin-top: -1px; +} +.tox .tox-toolbar--scrolling { + flex-wrap: nowrap; + overflow-x: auto; +} +.tox .tox-pop .tox-toolbar { + border-width: 0; +} +.tox .tox-toolbar--no-divider { + background-image: none; +} +.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child, +.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary { + border-top: 1px solid #000000; +} +.tox.tox-tinymce-aux .tox-toolbar__overflow { + background-color: #222f3e; + border: 1px solid #000000; + border-radius: 3px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); +} +.tox[dir=rtl] .tox-tbtn__icon-rtl svg { + transform: rotateY(180deg); +} +.tox .tox-toolbar__group { + align-items: center; + display: flex; + flex-wrap: wrap; + margin: 0 0; + padding: 0 4px 0 4px; +} +.tox .tox-toolbar__group--pull-right { + margin-left: auto; +} +.tox .tox-toolbar--scrolling .tox-toolbar__group { + flex-shrink: 0; + flex-wrap: nowrap; +} +.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type) { + border-right: 1px solid #000000; +} +.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type) { + border-left: 1px solid #000000; +} +.tox .tox-tooltip { + display: inline-block; + padding: 8px; + position: relative; +} +.tox .tox-tooltip__body { + background-color: #3d546f; + border-radius: 3px; + box-shadow: 0 2px 4px rgba(42, 55, 70, 0.3); + color: rgba(255, 255, 255, 0.75); + font-size: 14px; + font-style: normal; + font-weight: normal; + padding: 4px 8px; + text-transform: none; +} +.tox .tox-tooltip__arrow { + position: absolute; +} +.tox .tox-tooltip--down .tox-tooltip__arrow { + border-left: 8px solid transparent; + border-right: 8px solid transparent; + border-top: 8px solid #3d546f; + bottom: 0; + left: 50%; + position: absolute; + transform: translateX(-50%); +} +.tox .tox-tooltip--up .tox-tooltip__arrow { + border-bottom: 8px solid #3d546f; + border-left: 8px solid transparent; + border-right: 8px solid transparent; + left: 50%; + position: absolute; + top: 0; + transform: translateX(-50%); +} +.tox .tox-tooltip--right .tox-tooltip__arrow { + border-bottom: 8px solid transparent; + border-left: 8px solid #3d546f; + border-top: 8px solid transparent; + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-tooltip--left .tox-tooltip__arrow { + border-bottom: 8px solid transparent; + border-right: 8px solid #3d546f; + border-top: 8px solid transparent; + left: 0; + position: absolute; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-well { + border: 1px solid #000000; + border-radius: 3px; + padding: 8px; + width: 100%; +} +.tox .tox-well > *:first-child { + margin-top: 0; +} +.tox .tox-well > *:last-child { + margin-bottom: 0; +} +.tox .tox-well > *:only-child { + margin: 0; +} +.tox .tox-custom-editor { + border: 1px solid #000000; + border-radius: 3px; + display: flex; + flex: 1; + position: relative; +} +/* stylelint-disable */ +.tox { + /* stylelint-enable */ +} +.tox .tox-dialog-loading::before { + background-color: rgba(0, 0, 0, 0.5); + content: ""; + height: 100%; + position: absolute; + width: 100%; + z-index: 1000; +} +.tox .tox-tab { + cursor: pointer; +} +.tox .tox-dialog__content-js { + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-dialog__body-content .tox-collection { + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-image-tools-edit-panel { + height: 60px; +} +.tox .tox-image-tools__sidebar { + height: 60px; +} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/skin.min.css b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/skin.min.css new file mode 100644 index 00000000..8d4e9ec9 --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/skin.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tox{box-shadow:none;box-sizing:content-box;color:#2a3746;cursor:auto;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:normal;-webkit-tap-highlight-color:transparent;text-decoration:none;text-shadow:none;text-transform:none;vertical-align:initial;white-space:normal}.tox :not(svg):not(rect){box-sizing:inherit;color:inherit;cursor:inherit;direction:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;-webkit-tap-highlight-color:inherit;text-align:inherit;text-decoration:inherit;text-shadow:inherit;text-transform:inherit;vertical-align:inherit;white-space:inherit}.tox :not(svg):not(rect){background:0 0;border:0;box-shadow:none;float:none;height:auto;margin:0;max-width:none;outline:0;padding:0;position:static;width:auto}.tox:not([dir=rtl]){direction:ltr;text-align:left}.tox[dir=rtl]{direction:rtl;text-align:right}.tox-tinymce{border:1px solid #000;border-radius:0;box-shadow:none;box-sizing:border-box;display:flex;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;overflow:hidden;position:relative;visibility:inherit!important}.tox-tinymce-inline{border:none;box-shadow:none}.tox-tinymce-inline .tox-editor-header{background-color:transparent;border:1px solid #000;border-radius:0;box-shadow:none}.tox-tinymce-aux{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;z-index:1300}.tox-tinymce :focus,.tox-tinymce-aux :focus{outline:0}button::-moz-focus-inner{border:0}.tox .accessibility-issue__header{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description{align-items:stretch;border:1px solid #000;border-radius:3px;display:flex;justify-content:space-between}.tox .accessibility-issue__description>div{padding-bottom:4px}.tox .accessibility-issue__description>div>div{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description>:last-child:not(:only-child){border-color:#000;border-style:solid}.tox .accessibility-issue__repair{margin-top:16px}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description{background-color:rgba(32,122,183,.5);border-color:#207ab7;color:#fff}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description>:last-child{border-color:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description{background-color:rgba(255,165,0,.5);border-color:rgba(255,165,0,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description>:last-child{border-color:rgba(255,165,0,.8)}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description{background-color:rgba(204,0,0,.5);border-color:rgba(204,0,0,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description>:last-child{border-color:rgba(204,0,0,.8)}.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description{background-color:rgba(120,171,70,.5);border-color:rgba(120,171,70,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description>:last-child{border-color:rgba(120,171,70,.8)}.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue__header h1,.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2{margin-top:0}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-left:4px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-left:auto}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description{padding:4px 4px 4px 8px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description>:last-child{border-left-width:1px;padding-left:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-right:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-right:auto}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description{padding:4px 8px 4px 4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description>:last-child{border-right-width:1px;padding-right:4px}.tox .tox-anchorbar{display:flex;flex:0 0 auto}.tox .tox-bar{display:flex;flex:0 0 auto}.tox .tox-button{background-color:#207ab7;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#207ab7;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;line-height:24px;margin:0;outline:0;padding:4px 16px;text-align:center;text-decoration:none;text-transform:none;white-space:nowrap}.tox .tox-button[disabled]{background-color:#207ab7;background-image:none;border-color:#207ab7;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-button:focus:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:hover:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:active:not(:disabled){background-color:#185d8c;background-image:none;border-color:#185d8c;box-shadow:none;color:#fff}.tox .tox-button--secondary{background-color:#3d546f;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#3d546f;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;color:#fff;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;outline:0;padding:4px 16px;text-decoration:none;text-transform:none}.tox .tox-button--secondary[disabled]{background-color:#3d546f;background-image:none;border-color:#3d546f;box-shadow:none;color:rgba(255,255,255,.5)}.tox .tox-button--secondary:focus:not(:disabled){background-color:#34485f;background-image:none;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--secondary:hover:not(:disabled){background-color:#34485f;background-image:none;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--secondary:active:not(:disabled){background-color:#2b3b4e;background-image:none;border-color:#2b3b4e;box-shadow:none;color:#fff}.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding:4px}.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display:block;fill:currentColor}.tox .tox-button-link{background:0;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-weight:400;line-height:1.3;margin:0;padding:0;white-space:nowrap}.tox .tox-button-link--sm{font-size:14px}.tox .tox-button--naked{background-color:transparent;border-color:transparent;box-shadow:unset;color:#fff}.tox .tox-button--naked[disabled]{background-color:#3d546f;border-color:#3d546f;box-shadow:none;color:rgba(255,255,255,.5)}.tox .tox-button--naked:hover:not(:disabled){background-color:#34485f;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--naked:focus:not(:disabled){background-color:#34485f;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--naked:active:not(:disabled){background-color:#2b3b4e;border-color:#2b3b4e;box-shadow:none;color:#fff}.tox .tox-button--naked .tox-icon svg{fill:currentColor}.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color:#fff}.tox .tox-checkbox{align-items:center;border-radius:3px;cursor:pointer;display:flex;height:36px;min-width:36px}.tox .tox-checkbox__input{height:1px;overflow:hidden;position:absolute;top:auto;width:1px}.tox .tox-checkbox__icons{align-items:center;border-radius:3px;box-shadow:0 0 0 2px transparent;box-sizing:content-box;display:flex;height:24px;justify-content:center;padding:calc(4px - 1px);width:24px}.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:block;fill:rgba(255,255,255,.2)}.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:none;fill:#207ab7}.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg{display:none;fill:#207ab7}.tox .tox-checkbox--disabled{color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg{fill:rgba(255,255,255,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{fill:rgba(255,255,255,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{fill:rgba(255,255,255,.5)}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display:block}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:block}.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{border-radius:3px;box-shadow:inset 0 0 0 1px #207ab7;padding:calc(4px - 1px)}.tox:not([dir=rtl]) .tox-checkbox__label{margin-left:4px}.tox:not([dir=rtl]) .tox-checkbox__input{left:-10000px}.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left:4px}.tox[dir=rtl] .tox-checkbox__label{margin-right:4px}.tox[dir=rtl] .tox-checkbox__input{right:-10000px}.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right:4px}.tox .tox-collection--toolbar .tox-collection__group{display:flex;padding:0}.tox .tox-collection--grid .tox-collection__group{display:flex;flex-wrap:wrap;max-height:208px;overflow-x:hidden;overflow-y:auto;padding:0}.tox .tox-collection--list .tox-collection__group{border-bottom-width:0;border-color:#1a1a1a;border-left-width:0;border-right-width:0;border-style:solid;border-top-width:1px;padding:4px 0}.tox .tox-collection--list .tox-collection__group:first-child{border-top-width:0}.tox .tox-collection__group-heading{background-color:#333;color:#fff;cursor:default;font-size:12px;font-style:normal;font-weight:400;margin-bottom:4px;margin-top:-4px;padding:4px 8px;text-transform:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection__item{align-items:center;color:#fff;cursor:pointer;display:flex;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection--list .tox-collection__item{padding:4px 8px}.tox .tox-collection--toolbar .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--grid .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--list .tox-collection__item--enabled{background-color:#2b3b4e;color:#fff}.tox .tox-collection--list .tox-collection__item--active{background-color:#4a5562}.tox .tox-collection--toolbar .tox-collection__item--enabled{background-color:#757d87;color:#fff}.tox .tox-collection--toolbar .tox-collection__item--active{background-color:#4a5562}.tox .tox-collection--grid .tox-collection__item--enabled{background-color:#757d87;color:#fff}.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){background-color:#4a5562;color:#fff}.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#fff}.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#fff}.tox .tox-collection__item--state-disabled{background-color:transparent;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-collection__item-checkmark,.tox .tox-collection__item-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.tox .tox-collection__item-checkmark svg,.tox .tox-collection__item-icon svg{fill:currentColor}.tox .tox-collection--toolbar-lg .tox-collection__item-icon{height:48px;width:48px}.tox .tox-collection__item-label{color:currentColor;display:inline-block;flex:1;-ms-flex-preferred-size:auto;font-size:14px;font-style:normal;font-weight:400;line-height:24px;text-transform:none;word-break:break-all}.tox .tox-collection__item-accessory{color:rgba(255,255,255,.5);display:inline-block;font-size:14px;height:24px;line-height:24px;text-transform:none}.tox .tox-collection__item-caret{align-items:center;display:flex;min-height:24px}.tox .tox-collection__item-caret::after{content:'';font-size:0;min-height:inherit}.tox .tox-collection__item-caret svg{fill:#fff}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display:none}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory+.tox-collection__item-checkmark{display:none}.tox .tox-collection--horizontal{background-color:#2b3b4e;border:1px solid #1a1a1a;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:nowrap;margin-bottom:0;overflow-x:auto;padding:0}.tox .tox-collection--horizontal .tox-collection__group{align-items:center;display:flex;flex-wrap:nowrap;margin:0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item{height:34px;margin:2px 0 3px 0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item-label{white-space:nowrap}.tox .tox-collection--horizontal .tox-collection__item-caret{margin-left:4px}.tox .tox-collection__item-container{display:flex}.tox .tox-collection__item-container--row{align-items:center;flex:1 1 auto;flex-direction:row}.tox .tox-collection__item-container--row.tox-collection__item-container--align-left{margin-right:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--align-right{justify-content:flex-end;margin-left:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top{align-items:flex-start;margin-bottom:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle{align-items:center}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom{align-items:flex-end;margin-top:auto}.tox .tox-collection__item-container--column{-ms-grid-row-align:center;align-self:center;flex:1 1 auto;flex-direction:column}.tox .tox-collection__item-container--column.tox-collection__item-container--align-left{align-items:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--align-right{align-items:flex-end}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top{align-self:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle{-ms-grid-row-align:center;align-self:center}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom{align-self:flex-end}.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-right:1px solid #000}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left:8px}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-left:4px}.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left:16px;text-align:right}.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret{margin-left:16px}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-left:1px solid #000}.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right:8px}.tox[dir=rtl] .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-right:4px}.tox[dir=rtl] .tox-collection__item-icon-rtl .tox-collection__item-icon svg{transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection__item-accessory{margin-right:16px;text-align:left}.tox[dir=rtl] .tox-collection .tox-collection__item-caret{margin-right:16px;transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret{margin-right:4px}.tox .tox-color-picker-container{display:flex;flex-direction:row;height:225px;margin:0}.tox .tox-sv-palette{box-sizing:border-box;display:flex;height:100%}.tox .tox-sv-palette-spectrum{height:100%}.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width:225px}.tox .tox-sv-palette-thumb{background:0 0;border:1px solid #000;border-radius:50%;box-sizing:content-box;height:12px;position:absolute;width:12px}.tox .tox-sv-palette-inner-thumb{border:1px solid #fff;border-radius:50%;height:10px;position:absolute;width:10px}.tox .tox-hue-slider{box-sizing:border-box;height:100%;width:25px}.tox .tox-hue-slider-spectrum{background:linear-gradient(to bottom,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);height:100%;width:100%}.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width:20px}.tox .tox-hue-slider-thumb{background:#fff;border:1px solid #000;box-sizing:content-box;height:4px;width:100%}.tox .tox-rgb-form{display:flex;flex-direction:column;justify-content:space-between}.tox .tox-rgb-form div{align-items:center;display:flex;justify-content:space-between;margin-bottom:5px;width:inherit}.tox .tox-rgb-form input{width:6em}.tox .tox-rgb-form input.tox-invalid{border:1px solid red!important}.tox .tox-rgb-form .tox-rgba-preview{border:1px solid #000;flex-grow:2;margin-bottom:0}.tox:not([dir=rtl]) .tox-sv-palette{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left:-1px}.tox:not([dir=rtl]) .tox-rgb-form label{margin-right:.5em}.tox[dir=rtl] .tox-sv-palette{margin-left:15px}.tox[dir=rtl] .tox-hue-slider{margin-left:15px}.tox[dir=rtl] .tox-hue-slider-thumb{margin-right:-1px}.tox[dir=rtl] .tox-rgb-form label{margin-left:.5em}.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin:2px 0 3px 4px}.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{border:0;margin:-4px 0}.tox .tox-swatches__row{display:flex}.tox .tox-swatch{height:30px;transition:transform .15s,box-shadow .15s;width:30px}.tox .tox-swatch:focus,.tox .tox-swatch:hover{box-shadow:0 0 0 1px rgba(127,127,127,.3) inset;transform:scale(.8)}.tox .tox-swatch--remove{align-items:center;display:flex;justify-content:center}.tox .tox-swatch--remove svg path{stroke:#e74c3c}.tox .tox-swatches__picker-btn{align-items:center;background-color:transparent;border:0;cursor:pointer;display:flex;height:30px;justify-content:center;outline:0;padding:0;width:30px}.tox .tox-swatches__picker-btn svg{height:24px;width:24px}.tox .tox-swatches__picker-btn:hover{background:#4a5562}.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left:auto}.tox[dir=rtl] .tox-swatches__picker-btn{margin-right:auto}.tox .tox-comment-thread{background:#2b3b4e;position:relative}.tox .tox-comment-thread>:not(:first-child){margin-top:8px}.tox .tox-comment{background:#2b3b4e;border:1px solid #000;border-radius:3px;box-shadow:0 4px 8px 0 rgba(42,55,70,.1);padding:8px 8px 16px 8px;position:relative}.tox .tox-comment__header{align-items:center;color:#fff;display:flex;justify-content:space-between}.tox .tox-comment__date{color:rgba(255,255,255,.5);font-size:12px}.tox .tox-comment__body{color:#fff;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;margin-top:8px;position:relative;text-transform:initial}.tox .tox-comment__body textarea{resize:none;white-space:normal;width:100%}.tox .tox-comment__expander{padding-top:8px}.tox .tox-comment__expander p{color:rgba(255,255,255,.5);font-size:14px;font-style:normal}.tox .tox-comment__body p{margin:0}.tox .tox-comment__buttonspacing{padding-top:16px;text-align:center}.tox .tox-comment-thread__overlay::after{background:#2b3b4e;bottom:0;content:"";display:flex;left:0;opacity:.9;position:absolute;right:0;top:0;z-index:5}.tox .tox-comment__reply{display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;margin-top:8px}.tox .tox-comment__reply>:first-child{margin-bottom:8px;width:100%}.tox .tox-comment__edit{display:flex;flex-wrap:wrap;justify-content:flex-end;margin-top:16px}.tox .tox-comment__gradient::after{background:linear-gradient(rgba(43,59,78,0),#2b3b4e);bottom:0;content:"";display:block;height:5em;margin-top:-40px;position:absolute;width:100%}.tox .tox-comment__overlay{background:#2b3b4e;bottom:0;display:flex;flex-direction:column;flex-grow:1;left:0;opacity:.9;position:absolute;right:0;text-align:center;top:0;z-index:5}.tox .tox-comment__loading-text{align-items:center;color:#fff;display:flex;flex-direction:column;position:relative}.tox .tox-comment__loading-text>div{padding-bottom:16px}.tox .tox-comment__overlaytext{bottom:0;flex-direction:column;font-size:14px;left:0;padding:1em;position:absolute;right:0;top:0;z-index:10}.tox .tox-comment__overlaytext p{background-color:#2b3b4e;box-shadow:0 0 8px 8px #2b3b4e;color:#fff;text-align:center}.tox .tox-comment__overlaytext div:nth-of-type(2){font-size:.8em}.tox .tox-comment__busy-spinner{align-items:center;background-color:#2b3b4e;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:20}.tox .tox-comment__scroll{display:flex;flex-direction:column;flex-shrink:1;overflow:auto}.tox .tox-conversations{margin:8px}.tox:not([dir=rtl]) .tox-comment__edit{margin-left:8px}.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left:8px}.tox[dir=rtl] .tox-comment__edit{margin-right:8px}.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right:8px}.tox .tox-user{align-items:center;display:flex}.tox .tox-user__avatar svg{fill:rgba(255,255,255,.5)}.tox .tox-user__name{color:rgba(255,255,255,.5);font-size:12px;font-style:normal;font-weight:700;text-transform:uppercase}.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right:8px}.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name{margin-left:8px}.tox[dir=rtl] .tox-user__avatar svg{margin-left:8px}.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right:8px}.tox .tox-dialog-wrap{align-items:center;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1100}.tox .tox-dialog-wrap__backdrop{background-color:rgba(34,47,62,.75);bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.tox .tox-dialog-wrap__backdrop--opaque{background-color:#222f3e}.tox .tox-dialog{background-color:#2b3b4e;border-color:#000;border-radius:3px;border-style:solid;border-width:1px;box-shadow:0 16px 16px -10px rgba(42,55,70,.15),0 0 40px 1px rgba(42,55,70,.15);display:flex;flex-direction:column;max-height:100%;max-width:480px;overflow:hidden;position:relative;width:95vw;z-index:2}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog{align-self:flex-start;margin:8px auto;width:calc(100vw - 16px)}}.tox .tox-dialog-inline{z-index:1100}.tox .tox-dialog__header{align-items:center;background-color:#2b3b4e;border-bottom:none;color:#fff;display:flex;font-size:16px;justify-content:space-between;padding:8px 16px 0 16px;position:relative}.tox .tox-dialog__header .tox-button{z-index:1}.tox .tox-dialog__draghandle{cursor:grab;height:100%;left:0;position:absolute;top:0;width:100%}.tox .tox-dialog__draghandle:active{cursor:grabbing}.tox .tox-dialog__dismiss{margin-left:auto}.tox .tox-dialog__title{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:20px;font-style:normal;font-weight:400;line-height:1.3;margin:0;text-transform:none}.tox .tox-dialog__body{color:#fff;display:flex;flex:1;-ms-flex-preferred-size:auto;font-size:16px;font-style:normal;font-weight:400;line-height:1.3;min-width:0;text-align:left;text-transform:none}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body{flex-direction:column}}.tox .tox-dialog__body-nav{align-items:flex-start;display:flex;flex-direction:column;padding:16px 16px}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body-nav{flex-direction:row;-webkit-overflow-scrolling:touch;overflow-x:auto;padding-bottom:0}}.tox .tox-dialog__body-nav-item{border-bottom:2px solid transparent;color:rgba(255,255,255,.5);display:inline-block;font-size:14px;line-height:1.3;margin-bottom:8px;text-decoration:none;white-space:nowrap}.tox .tox-dialog__body-nav-item:focus{background-color:rgba(32,122,183,.1)}.tox .tox-dialog__body-nav-item--active{border-bottom:2px solid #207ab7;color:#207ab7}.tox .tox-dialog__body-content{box-sizing:border-box;display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto;max-height:650px;overflow:auto;-webkit-overflow-scrolling:touch;padding:16px 16px}.tox .tox-dialog__body-content>*{margin-bottom:0;margin-top:16px}.tox .tox-dialog__body-content>:first-child{margin-top:0}.tox .tox-dialog__body-content>:last-child{margin-bottom:0}.tox .tox-dialog__body-content>:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog__body-content a{color:#207ab7;cursor:pointer;text-decoration:none}.tox .tox-dialog__body-content a:focus,.tox .tox-dialog__body-content a:hover{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content a:active{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content svg{fill:#fff}.tox .tox-dialog__body-content ul{display:block;list-style-type:disc;margin-bottom:16px;-webkit-margin-end:0;margin-inline-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-padding-start:2.5rem;padding-inline-start:2.5rem}.tox .tox-dialog__body-content .tox-form__group h1{color:#fff;font-size:20px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group h2{color:#fff;font-size:16px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group p{margin-bottom:16px}.tox .tox-dialog__body-content .tox-form__group h1:first-child,.tox .tox-dialog__body-content .tox-form__group h2:first-child,.tox .tox-dialog__body-content .tox-form__group p:first-child{margin-top:0}.tox .tox-dialog__body-content .tox-form__group h1:last-child,.tox .tox-dialog__body-content .tox-form__group h2:last-child,.tox .tox-dialog__body-content .tox-form__group p:last-child{margin-bottom:0}.tox .tox-dialog__body-content .tox-form__group h1:only-child,.tox .tox-dialog__body-content .tox-form__group h2:only-child,.tox .tox-dialog__body-content .tox-form__group p:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog--width-lg{height:650px;max-width:1200px}.tox .tox-dialog--width-md{max-width:800px}.tox .tox-dialog--width-md .tox-dialog__body-content{overflow:auto}.tox .tox-dialog__body-content--centered{text-align:center}.tox .tox-dialog__footer{align-items:center;background-color:#2b3b4e;border-top:1px solid #000;display:flex;justify-content:space-between;padding:8px 16px}.tox .tox-dialog__footer-end,.tox .tox-dialog__footer-start{display:flex}.tox .tox-dialog__busy-spinner{align-items:center;background-color:rgba(34,47,62,.75);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:3}.tox .tox-dialog__table{border-collapse:collapse;width:100%}.tox .tox-dialog__table thead th{font-weight:700;padding-bottom:8px}.tox .tox-dialog__table tbody tr{border-bottom:1px solid #000}.tox .tox-dialog__table tbody tr:last-child{border-bottom:none}.tox .tox-dialog__table td{padding-bottom:8px;padding-top:8px}.tox .tox-dialog__popups{position:absolute;width:100%;z-index:1100}.tox .tox-dialog__body-iframe{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox .tox-dialog-dock-fadeout{opacity:0;visibility:hidden}.tox .tox-dialog-dock-fadein{opacity:1;visibility:visible}.tox .tox-dialog-dock-transition{transition:visibility 0s linear .3s,opacity .3s ease}.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein{transition-delay:0s}.tox.tox-platform-ie .tox-dialog-wrap{position:-ms-device-fixed}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child){margin-left:8px}}.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left:8px}.tox[dir=rtl] .tox-dialog__body{text-align:right}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav{margin-left:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child){margin-right:8px}}.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right:8px}body.tox-dialog__disable-scroll{overflow:hidden}.tox .tox-dropzone-container{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dropzone{align-items:center;background:#fff;border:2px dashed #000;box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;min-height:100px;padding:10px}.tox .tox-dropzone p{color:rgba(255,255,255,.5);margin:0 0 16px 0}.tox .tox-edit-area{display:flex;flex:1;-ms-flex-preferred-size:auto;overflow:hidden;position:relative}.tox .tox-edit-area__iframe{background-color:#fff;border:0;box-sizing:border-box;flex:1;-ms-flex-preferred-size:auto;height:100%;position:absolute;width:100%}.tox.tox-inline-edit-area{border:1px dotted #000}.tox .tox-editor-container{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.tox .tox-editor-header{z-index:1}.tox:not(.tox-tinymce-inline) .tox-editor-header{box-shadow:none;transition:box-shadow .5s}.tox.tox-tinymce--toolbar-bottom .tox-editor-header,.tox.tox-tinymce-inline .tox-editor-header{margin-bottom:-1px}.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header{background-color:transparent;box-shadow:0 4px 4px -3px rgba(0,0,0,.25)}.tox-editor-dock-fadeout{opacity:0;visibility:hidden}.tox-editor-dock-fadein{opacity:1;visibility:visible}.tox-editor-dock-transition{transition:visibility 0s linear .25s,opacity .25s ease}.tox-editor-dock-transition.tox-editor-dock-fadein{transition-delay:0s}.tox .tox-control-wrap{flex:1;position:relative}.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display:none}.tox .tox-control-wrap svg{display:block}.tox .tox-control-wrap__status-icon-wrap{position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-control-wrap__status-icon-invalid svg{fill:#c00}.tox .tox-control-wrap__status-icon-unknown svg{fill:orange}.tox .tox-control-wrap__status-icon-valid svg{fill:green}.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right:32px}.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right:4px}.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left:32px}.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left:4px}.tox .tox-autocompleter{max-width:25em}.tox .tox-autocompleter .tox-menu{max-width:25em}.tox .tox-autocompleter .tox-autocompleter-highlight{font-weight:700}.tox .tox-color-input{display:flex;position:relative;z-index:1}.tox .tox-color-input .tox-textfield{z-index:-1}.tox .tox-color-input span{border-color:rgba(42,55,70,.2);border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;height:24px;position:absolute;top:6px;width:24px}.tox .tox-color-input span:focus:not([aria-disabled=true]),.tox .tox-color-input span:hover:not([aria-disabled=true]){border-color:#207ab7;cursor:pointer}.tox .tox-color-input span::before{background-image:linear-gradient(45deg,rgba(255,255,255,.25) 25%,transparent 25%),linear-gradient(-45deg,rgba(255,255,255,.25) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(255,255,255,.25) 75%),linear-gradient(-45deg,transparent 75%,rgba(255,255,255,.25) 75%);background-position:0 0,0 6px,6px -6px,-6px 0;background-size:12px 12px;border:1px solid #2b3b4e;border-radius:3px;box-sizing:border-box;content:'';height:24px;left:-1px;position:absolute;top:-1px;width:24px;z-index:-1}.tox .tox-color-input span[aria-disabled=true]{cursor:not-allowed}.tox:not([dir=rtl]) .tox-color-input .tox-textfield{padding-left:36px}.tox:not([dir=rtl]) .tox-color-input span{left:6px}.tox[dir=rtl] .tox-color-input .tox-textfield{padding-right:36px}.tox[dir=rtl] .tox-color-input span{right:6px}.tox .tox-label,.tox .tox-toolbar-label{color:rgba(255,255,255,.5);display:block;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;padding:0 8px 0 0;text-transform:none;white-space:nowrap}.tox .tox-toolbar-label{padding:0 8px}.tox[dir=rtl] .tox-label{padding:0 0 0 8px}.tox .tox-form{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group{box-sizing:border-box;margin-bottom:4px}.tox .tox-form-group--maximize{flex:1}.tox .tox-form__group--error{color:#c00}.tox .tox-form__group--collection{display:flex}.tox .tox-form__grid{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}.tox .tox-form__grid--2col>.tox-form__group{width:calc(50% - (8px / 2))}.tox .tox-form__grid--3col>.tox-form__group{width:calc(100% / 3 - (8px / 2))}.tox .tox-form__grid--4col>.tox-form__group{width:calc(25% - (8px / 2))}.tox .tox-form__controls-h-stack{align-items:center;display:flex}.tox .tox-form__group--inline{align-items:center;display:flex}.tox .tox-form__group--stretched{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-textarea{flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right:4px}.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display:none}.tox .tox-listboxfield .tox-listbox--select,.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#2b3b4e;border-color:#000;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-textarea[disabled],.tox .tox-textfield[disabled]{background-color:#222f3e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-listboxfield .tox-listbox--select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{background-color:#2b3b4e;border-color:#207ab7;box-shadow:none;outline:0}.tox .tox-toolbar-textfield{border-width:0;margin-bottom:3px;margin-top:2px;max-width:250px}.tox .tox-naked-btn{background-color:transparent;border:0;border-color:transparent;box-shadow:unset;color:#207ab7;cursor:pointer;display:block;margin:0;padding:0}.tox .tox-naked-btn svg{display:block;fill:#fff}.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left:4px}.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right:4px}.tox .tox-listboxfield{cursor:pointer;position:relative}.tox .tox-listboxfield .tox-listbox--select[disabled]{background-color:#19232e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-listbox__select-label{cursor:default;flex:1;margin:0 4px}.tox .tox-listbox__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-listbox__select-chevron svg{fill:#fff}.tox .tox-listboxfield .tox-listbox--select{align-items:center;display:flex}.tox:not([dir=rtl]) .tox-listboxfield svg{right:8px}.tox[dir=rtl] .tox-listboxfield svg{left:8px}.tox .tox-selectfield{cursor:pointer;position:relative}.tox .tox-selectfield select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#2b3b4e;border-color:#000;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-selectfield select[disabled]{background-color:#19232e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-selectfield select::-ms-expand{display:none}.tox .tox-selectfield select:focus{background-color:#2b3b4e;border-color:#207ab7;box-shadow:none;outline:0}.tox .tox-selectfield svg{pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.tox:not([dir=rtl]) .tox-selectfield select[size="0"],.tox:not([dir=rtl]) .tox-selectfield select[size="1"]{padding-right:24px}.tox:not([dir=rtl]) .tox-selectfield svg{right:8px}.tox[dir=rtl] .tox-selectfield select[size="0"],.tox[dir=rtl] .tox-selectfield select[size="1"]{padding-left:24px}.tox[dir=rtl] .tox-selectfield svg{left:8px}.tox .tox-textarea{-webkit-appearance:textarea;-moz-appearance:textarea;appearance:textarea;white-space:pre-wrap}.tox-fullscreen{border:0;height:100%;left:0;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;position:fixed;top:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox.tox-tinymce.tox-fullscreen{background-color:transparent;z-index:1200}.tox-shadowhost.tox-fullscreen{z-index:1200}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}.tox .tox-help__more-link{list-style:none;margin-top:1em}.tox .tox-image-tools{width:100%}.tox .tox-image-tools__toolbar{align-items:center;display:flex;justify-content:center}.tox .tox-image-tools__image{background-color:#666;height:380px;overflow:auto;position:relative;width:100%}.tox .tox-image-tools__image,.tox .tox-image-tools__image+.tox-image-tools__toolbar{margin-top:8px}.tox .tox-image-tools__image-bg{background:url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==)}.tox .tox-image-tools__toolbar>.tox-spacer{flex:1;-ms-flex-preferred-size:auto}.tox .tox-croprect-block{background:#000;opacity:.5;position:absolute;zoom:1}.tox .tox-croprect-handle{border:2px solid #fff;height:20px;left:0;position:absolute;top:0;width:20px}.tox .tox-croprect-handle-move{border:0;cursor:move;position:absolute}.tox .tox-croprect-handle-nw{border-width:2px 0 0 2px;cursor:nw-resize;left:100px;margin:-2px 0 0 -2px;top:100px}.tox .tox-croprect-handle-ne{border-width:2px 2px 0 0;cursor:ne-resize;left:200px;margin:-2px 0 0 -20px;top:100px}.tox .tox-croprect-handle-sw{border-width:0 0 2px 2px;cursor:sw-resize;left:100px;margin:-20px 2px 0 -2px;top:200px}.tox .tox-croprect-handle-se{border-width:0 2px 2px 0;cursor:se-resize;left:200px;margin:-20px 0 0 -20px;top:200px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-left:8px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-left:32px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-left:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-right:8px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-right:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-right:32px}.tox .tox-insert-table-picker{display:flex;flex-wrap:wrap;width:170px}.tox .tox-insert-table-picker>div{border-color:#000;border-style:solid;border-width:0 1px 1px 0;box-sizing:border-box;height:17px;width:17px}.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin:-4px 0}.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color:rgba(32,122,183,.5);border-color:rgba(32,122,183,.5)}.tox .tox-insert-table-picker__label{color:#fff;display:block;font-size:14px;padding:4px;text-align:center;width:100%}.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right:0}.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right:0}.tox .tox-menu{background-color:#2b3b4e;border:1px solid #000;border-radius:3px;box-shadow:0 4px 8px 0 rgba(42,55,70,.1);display:inline-block;overflow:hidden;vertical-align:top;z-index:1150}.tox .tox-menu.tox-collection.tox-collection--list{padding:0}.tox .tox-menu.tox-collection.tox-collection--toolbar{padding:4px}.tox .tox-menu.tox-collection.tox-collection--grid{padding:4px}.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin:0}.tox .tox-menubar{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e;background-color:#222f3e;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 4px 0 4px}.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar{border-top:1px solid #000}.tox .tox-mbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#fff;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0 4px;text-transform:none;width:auto}.tox .tox-mbtn[disabled]{background-color:transparent;border:0;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-mbtn:focus:not(:disabled){background:#4a5562;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn--active{background:#757d87;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active){background:#4a5562;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor:not-allowed}.tox .tox-mbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px;display:none}.tox .tox-notification{border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;display:-ms-grid;display:grid;font-size:14px;font-weight:400;-ms-grid-columns:minmax(40px,1fr) auto minmax(40px,1fr);grid-template-columns:minmax(40px,1fr) auto minmax(40px,1fr);margin-top:4px;opacity:0;padding:4px;transition:transform .1s ease-in,opacity 150ms ease-in}.tox .tox-notification p{font-size:14px;font-weight:400}.tox .tox-notification a{text-decoration:underline}.tox .tox-notification--in{opacity:1}.tox .tox-notification--success{background-color:#e4eeda;border-color:#d7e6c8;color:#fff}.tox .tox-notification--success p{color:#fff}.tox .tox-notification--success a{color:#547831}.tox .tox-notification--success svg{fill:#fff}.tox .tox-notification--error{background-color:#f8dede;border-color:#f2bfbf;color:#fff}.tox .tox-notification--error p{color:#fff}.tox .tox-notification--error a{color:#c00}.tox .tox-notification--error svg{fill:#fff}.tox .tox-notification--warn,.tox .tox-notification--warning{background-color:#fffaea;border-color:#ffe89d;color:#fff}.tox .tox-notification--warn p,.tox .tox-notification--warning p{color:#fff}.tox .tox-notification--warn a,.tox .tox-notification--warning a{color:#fff}.tox .tox-notification--warn svg,.tox .tox-notification--warning svg{fill:#fff}.tox .tox-notification--info{background-color:#d9edf7;border-color:#779ecb;color:#fff}.tox .tox-notification--info p{color:#fff}.tox .tox-notification--info a{color:#fff}.tox .tox-notification--info svg{fill:#fff}.tox .tox-notification__body{-ms-grid-row-align:center;align-self:center;color:#fff;font-size:14px;-ms-grid-column-span:1;grid-column-end:3;-ms-grid-column:2;grid-column-start:2;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;text-align:center;white-space:normal;word-break:break-all;word-break:break-word}.tox .tox-notification__body>*{margin:0}.tox .tox-notification__body>*+*{margin-top:1rem}.tox .tox-notification__icon{-ms-grid-row-align:center;align-self:center;-ms-grid-column-span:1;grid-column-end:2;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification__icon svg{display:block}.tox .tox-notification__dismiss{-ms-grid-row-align:start;align-self:start;-ms-grid-column-span:1;grid-column-end:4;-ms-grid-column:3;grid-column-start:3;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification .tox-progress-bar{-ms-grid-column-span:3;grid-column-end:4;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:3;-ms-grid-row:2;grid-row-start:2;-ms-grid-column-align:center;justify-self:center}.tox .tox-pop{display:inline-block;position:relative}.tox .tox-pop--resizing{transition:width .1s ease}.tox .tox-pop--resizing .tox-toolbar{flex-wrap:nowrap}.tox .tox-pop__dialog{background-color:#222f3e;border:1px solid #000;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);min-width:0;overflow:hidden}.tox .tox-pop__dialog>:not(.tox-toolbar){margin:4px 4px 4px 8px}.tox .tox-pop__dialog .tox-toolbar{background-color:transparent;margin-bottom:-1px}.tox .tox-pop::after,.tox .tox-pop::before{border-style:solid;content:'';display:block;height:0;position:absolute;width:0}.tox .tox-pop.tox-pop--bottom::after,.tox .tox-pop.tox-pop--bottom::before{left:50%;top:100%}.tox .tox-pop.tox-pop--bottom::after{border-color:#222f3e transparent transparent transparent;border-width:8px;margin-left:-8px;margin-top:-1px}.tox .tox-pop.tox-pop--bottom::before{border-color:#000 transparent transparent transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--top::after,.tox .tox-pop.tox-pop--top::before{left:50%;top:0;transform:translateY(-100%)}.tox .tox-pop.tox-pop--top::after{border-color:transparent transparent #222f3e transparent;border-width:8px;margin-left:-8px;margin-top:1px}.tox .tox-pop.tox-pop--top::before{border-color:transparent transparent #000 transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--left::after,.tox .tox-pop.tox-pop--left::before{left:0;top:calc(50% - 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--left::after{border-color:transparent #222f3e transparent transparent;border-width:8px;margin-left:-15px}.tox .tox-pop.tox-pop--left::before{border-color:transparent #000 transparent transparent;border-width:10px;margin-left:-19px}.tox .tox-pop.tox-pop--right::after,.tox .tox-pop.tox-pop--right::before{left:100%;top:calc(50% + 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--right::after{border-color:transparent transparent transparent #222f3e;border-width:8px;margin-left:-1px}.tox .tox-pop.tox-pop--right::before{border-color:transparent transparent transparent #000;border-width:10px;margin-left:-1px}.tox .tox-pop.tox-pop--align-left::after,.tox .tox-pop.tox-pop--align-left::before{left:20px}.tox .tox-pop.tox-pop--align-right::after,.tox .tox-pop.tox-pop--align-right::before{left:calc(100% - 20px)}.tox .tox-sidebar-wrap{display:flex;flex-direction:row;flex-grow:1;-ms-flex-preferred-size:0;min-height:0}.tox .tox-sidebar{background-color:#222f3e;display:flex;flex-direction:row;justify-content:flex-end}.tox .tox-sidebar__slider{display:flex;overflow:hidden}.tox .tox-sidebar__pane-container{display:flex}.tox .tox-sidebar__pane{display:flex}.tox .tox-sidebar--sliding-closed{opacity:0}.tox .tox-sidebar--sliding-open{opacity:1}.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition:width .5s ease,opacity .5s ease}.tox .tox-selector{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;display:inline-block;height:10px;position:absolute;width:10px}.tox.tox-platform-touch .tox-selector{height:12px;width:12px}.tox .tox-slider{align-items:center;display:flex;flex:1;-ms-flex-preferred-size:auto;height:24px;justify-content:center;position:relative}.tox .tox-slider__rail{background-color:transparent;border:1px solid #000;border-radius:3px;height:10px;min-width:120px;width:100%}.tox .tox-slider__handle{background-color:#207ab7;border:2px solid #185d8c;border-radius:3px;box-shadow:none;height:24px;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:14px}.tox .tox-source-code{overflow:auto}.tox .tox-spinner{display:flex}.tox .tox-spinner>div{animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;background-color:rgba(255,255,255,.5);border-radius:100%;height:8px;width:8px}.tox .tox-spinner>div:nth-child(1){animation-delay:-.32s}.tox .tox-spinner>div:nth-child(2){animation-delay:-.16s}@keyframes tam-bouncing-dots{0%,100%,80%{transform:scale(0)}40%{transform:scale(1)}}.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right:4px}.tox .tox-statusbar{align-items:center;background-color:#222f3e;border-top:1px solid #000;color:#fff;display:flex;flex:0 0 auto;font-size:12px;font-weight:400;height:18px;overflow:hidden;padding:0 8px;position:relative;text-transform:uppercase}.tox .tox-statusbar__text-container{display:flex;flex:1 1 auto;justify-content:flex-end;overflow:hidden}.tox .tox-statusbar__path{display:flex;flex:1 1 auto;margin-right:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tox .tox-statusbar__path>*{display:inline;white-space:nowrap}.tox .tox-statusbar__wordcount{flex:0 0 auto;margin-left:1ch}.tox .tox-statusbar a,.tox .tox-statusbar__path-item,.tox .tox-statusbar__wordcount{color:#fff;text-decoration:none}.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]){cursor:pointer;text-decoration:underline}.tox .tox-statusbar__resize-handle{align-items:flex-end;align-self:stretch;cursor:nwse-resize;display:flex;flex:0 0 auto;justify-content:flex-end;margin-left:auto;margin-right:-8px;padding-left:1ch}.tox .tox-statusbar__resize-handle svg{display:block;fill:#fff}.tox .tox-statusbar__resize-handle:focus svg{background-color:#4a5562;border-radius:1px;box-shadow:0 0 0 2px #4a5562}.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right:4px}.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left:1ch}.tox[dir=rtl] .tox-statusbar{flex-direction:row-reverse}.tox[dir=rtl] .tox-statusbar__path>*{margin-left:4px}.tox .tox-throbber{z-index:1299}.tox .tox-throbber__busy-spinner{align-items:center;background-color:rgba(34,47,62,.6);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0}.tox .tox-tbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#fff;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0;text-transform:none;width:34px}.tox .tox-tbtn svg{display:block;fill:#fff}.tox .tox-tbtn.tox-tbtn-more{padding-left:5px;padding-right:5px;width:inherit}.tox .tox-tbtn:focus{background:#4a5562;border:0;box-shadow:none}.tox .tox-tbtn:hover{background:#4a5562;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn:hover svg{fill:#fff}.tox .tox-tbtn:active{background:#757d87;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn:active svg{fill:#fff}.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{background:0 0;border:0;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-tbtn--disabled svg,.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn:disabled svg,.tox .tox-tbtn:disabled:hover svg{fill:rgba(255,255,255,.5)}.tox .tox-tbtn--enabled,.tox .tox-tbtn--enabled:hover{background:#757d87;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn--enabled:hover>*,.tox .tox-tbtn--enabled>*{transform:none}.tox .tox-tbtn--enabled svg,.tox .tox-tbtn--enabled:hover svg{fill:#fff}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled){color:#fff}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg{fill:#fff}.tox .tox-tbtn:active>*{transform:none}.tox .tox-tbtn--md{height:51px;width:51px}.tox .tox-tbtn--lg{flex-direction:column;height:68px;width:68px}.tox .tox-tbtn--return{-ms-grid-row-align:stretch;align-self:stretch;height:unset;width:16px}.tox .tox-tbtn--labeled{padding:0 4px;width:unset}.tox .tox-tbtn__vlabel{display:block;font-size:10px;font-weight:400;letter-spacing:-.025em;margin-bottom:4px;white-space:nowrap}.tox .tox-tbtn--select{margin:2px 0 3px 0;padding:0 4px;width:auto}.tox .tox-tbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-tbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-tbtn__select-chevron svg{fill:rgba(255,255,255,.5)}.tox .tox-tbtn--bespoke .tox-tbtn__select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:7em}.tox .tox-split-button{border:0;border-radius:3px;box-sizing:border-box;display:flex;margin:2px 0 3px 0;overflow:hidden}.tox .tox-split-button:hover{box-shadow:0 0 0 1px #4a5562 inset}.tox .tox-split-button:focus{background:#4a5562;box-shadow:none;color:#fff}.tox .tox-split-button>*{border-radius:0}.tox .tox-split-button__chevron{width:16px}.tox .tox-split-button__chevron svg{fill:rgba(255,255,255,.5)}.tox .tox-split-button .tox-tbtn{margin:0}.tox.tox-platform-touch .tox-split-button .tox-tbtn:first-child{width:30px}.tox.tox-platform-touch .tox-split-button__chevron{width:20px}.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{background:0 0;box-shadow:none;color:rgba(255,255,255,.5)}.tox .tox-toolbar-overlord{background-color:#222f3e}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e;background-color:#222f3e;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 0}.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height:0;opacity:0;padding-bottom:0;padding-top:0;visibility:hidden}.tox .tox-toolbar__overflow--growing{transition:height .3s ease,opacity .2s linear .1s}.tox .tox-toolbar__overflow--shrinking{transition:opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s}.tox .tox-menubar+.tox-toolbar,.tox .tox-menubar+.tox-toolbar-overlord .tox-toolbar__primary{border-top:1px solid #000;margin-top:-1px}.tox .tox-toolbar--scrolling{flex-wrap:nowrap;overflow-x:auto}.tox .tox-pop .tox-toolbar{border-width:0}.tox .tox-toolbar--no-divider{background-image:none}.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary,.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child{border-top:1px solid #000}.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color:#222f3e;border:1px solid #000;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15)}.tox[dir=rtl] .tox-tbtn__icon-rtl svg{transform:rotateY(180deg)}.tox .tox-toolbar__group{align-items:center;display:flex;flex-wrap:wrap;margin:0 0;padding:0 4px 0 4px}.tox .tox-toolbar__group--pull-right{margin-left:auto}.tox .tox-toolbar--scrolling .tox-toolbar__group{flex-shrink:0;flex-wrap:nowrap}.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right:1px solid #000}.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left:1px solid #000}.tox .tox-tooltip{display:inline-block;padding:8px;position:relative}.tox .tox-tooltip__body{background-color:#3d546f;border-radius:3px;box-shadow:0 2px 4px rgba(42,55,70,.3);color:rgba(255,255,255,.75);font-size:14px;font-style:normal;font-weight:400;padding:4px 8px;text-transform:none}.tox .tox-tooltip__arrow{position:absolute}.tox .tox-tooltip--down .tox-tooltip__arrow{border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #3d546f;bottom:0;left:50%;position:absolute;transform:translateX(-50%)}.tox .tox-tooltip--up .tox-tooltip__arrow{border-bottom:8px solid #3d546f;border-left:8px solid transparent;border-right:8px solid transparent;left:50%;position:absolute;top:0;transform:translateX(-50%)}.tox .tox-tooltip--right .tox-tooltip__arrow{border-bottom:8px solid transparent;border-left:8px solid #3d546f;border-top:8px solid transparent;position:absolute;right:0;top:50%;transform:translateY(-50%)}.tox .tox-tooltip--left .tox-tooltip__arrow{border-bottom:8px solid transparent;border-right:8px solid #3d546f;border-top:8px solid transparent;left:0;position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-well{border:1px solid #000;border-radius:3px;padding:8px;width:100%}.tox .tox-well>:first-child{margin-top:0}.tox .tox-well>:last-child{margin-bottom:0}.tox .tox-well>:only-child{margin:0}.tox .tox-custom-editor{border:1px solid #000;border-radius:3px;display:flex;flex:1;position:relative}.tox .tox-dialog-loading::before{background-color:rgba(0,0,0,.5);content:"";height:100%;position:absolute;width:100%;z-index:1000}.tox .tox-tab{cursor:pointer}.tox .tox-dialog__content-js{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-content .tox-collection{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-image-tools-edit-panel{height:60px}.tox .tox-image-tools__sidebar{height:60px} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/skin.mobile.css b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/skin.mobile.css new file mode 100644 index 00000000..875721a2 --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/skin.mobile.css @@ -0,0 +1,673 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +/* RESET all the things! */ +.tinymce-mobile-outer-container { + all: initial; + display: block; +} +.tinymce-mobile-outer-container * { + border: 0; + box-sizing: initial; + cursor: inherit; + float: none; + line-height: 1; + margin: 0; + outline: 0; + padding: 0; + -webkit-tap-highlight-color: transparent; + /* TBIO-3691, stop the gray flicker on touch. */ + text-shadow: none; + white-space: nowrap; +} +.tinymce-mobile-icon-arrow-back::before { + content: "\e5cd"; +} +.tinymce-mobile-icon-image::before { + content: "\e412"; +} +.tinymce-mobile-icon-cancel-circle::before { + content: "\e5c9"; +} +.tinymce-mobile-icon-full-dot::before { + content: "\e061"; +} +.tinymce-mobile-icon-align-center::before { + content: "\e234"; +} +.tinymce-mobile-icon-align-left::before { + content: "\e236"; +} +.tinymce-mobile-icon-align-right::before { + content: "\e237"; +} +.tinymce-mobile-icon-bold::before { + content: "\e238"; +} +.tinymce-mobile-icon-italic::before { + content: "\e23f"; +} +.tinymce-mobile-icon-unordered-list::before { + content: "\e241"; +} +.tinymce-mobile-icon-ordered-list::before { + content: "\e242"; +} +.tinymce-mobile-icon-font-size::before { + content: "\e245"; +} +.tinymce-mobile-icon-underline::before { + content: "\e249"; +} +.tinymce-mobile-icon-link::before { + content: "\e157"; +} +.tinymce-mobile-icon-unlink::before { + content: "\eca2"; +} +.tinymce-mobile-icon-color::before { + content: "\e891"; +} +.tinymce-mobile-icon-previous::before { + content: "\e314"; +} +.tinymce-mobile-icon-next::before { + content: "\e315"; +} +.tinymce-mobile-icon-large-font::before, +.tinymce-mobile-icon-style-formats::before { + content: "\e264"; +} +.tinymce-mobile-icon-undo::before { + content: "\e166"; +} +.tinymce-mobile-icon-redo::before { + content: "\e15a"; +} +.tinymce-mobile-icon-removeformat::before { + content: "\e239"; +} +.tinymce-mobile-icon-small-font::before { + content: "\e906"; +} +.tinymce-mobile-icon-readonly-back::before, +.tinymce-mobile-format-matches::after { + content: "\e5ca"; +} +.tinymce-mobile-icon-small-heading::before { + content: "small"; +} +.tinymce-mobile-icon-large-heading::before { + content: "large"; +} +.tinymce-mobile-icon-small-heading::before, +.tinymce-mobile-icon-large-heading::before { + font-family: sans-serif; + font-size: 80%; +} +.tinymce-mobile-mask-edit-icon::before { + content: "\e254"; +} +.tinymce-mobile-icon-back::before { + content: "\e5c4"; +} +.tinymce-mobile-icon-heading::before { + /* TODO: Translate */ + content: "Headings"; + font-family: sans-serif; + font-size: 80%; + font-weight: bold; +} +.tinymce-mobile-icon-h1::before { + content: "H1"; + font-weight: bold; +} +.tinymce-mobile-icon-h2::before { + content: "H2"; + font-weight: bold; +} +.tinymce-mobile-icon-h3::before { + content: "H3"; + font-weight: bold; +} +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask { + align-items: center; + display: flex; + justify-content: center; + background: rgba(51, 51, 51, 0.5); + height: 100%; + position: absolute; + top: 0; + width: 100%; +} +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container { + align-items: center; + border-radius: 50%; + display: flex; + flex-direction: column; + font-family: sans-serif; + font-size: 1em; + justify-content: space-between; +} +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item { + align-items: center; + display: flex; + justify-content: center; + border-radius: 50%; + height: 2.1em; + width: 2.1em; +} +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section { + align-items: center; + display: flex; + justify-content: center; + flex-direction: column; + font-size: 1em; +} +@media only screen and (min-device-width:700px) { + .tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section { + font-size: 1.2em; + } +} +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon { + align-items: center; + display: flex; + justify-content: center; + border-radius: 50%; + height: 2.1em; + width: 2.1em; + background-color: white; + color: #207ab7; +} +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before { + content: "\e900"; + font-family: 'tinymce-mobile', sans-serif; +} +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon { + z-index: 2; +} +.tinymce-mobile-android-container.tinymce-mobile-android-maximized { + background: #ffffff; + border: none; + bottom: 0; + display: flex; + flex-direction: column; + left: 0; + position: fixed; + right: 0; + top: 0; +} +.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized) { + position: relative; +} +.tinymce-mobile-android-container .tinymce-mobile-editor-socket { + display: flex; + flex-grow: 1; +} +.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe { + display: flex !important; + flex-grow: 1; + height: auto !important; +} +.tinymce-mobile-android-scroll-reload { + overflow: hidden; +} +:not(.tinymce-mobile-readonly-mode) > .tinymce-mobile-android-selection-context-toolbar { + margin-top: 23px; +} +.tinymce-mobile-toolstrip { + background: #fff; + display: flex; + flex: 0 0 auto; + z-index: 1; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar { + align-items: center; + background-color: #fff; + border-bottom: 1px solid #cccccc; + display: flex; + flex: 1; + height: 2.5em; + width: 100%; + /* Make it no larger than the toolstrip, so that it needs to scroll */ +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group { + align-items: center; + display: flex; + height: 100%; + flex-shrink: 1; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group > div { + align-items: center; + display: flex; + height: 100%; + flex: 1; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container { + background: #f44336; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group { + flex-grow: 1; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item { + padding-left: 0.5em; + padding-right: 0.5em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button { + align-items: center; + display: flex; + height: 80%; + margin-left: 2px; + margin-right: 2px; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected { + background: #c8cbcf; + color: #cccccc; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type, +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type { + background: #207ab7; + color: #eceff1; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar { + /* Note, this file is imported inside .tinymce-mobile-context-toolbar, so that prefix is on everything here. */ +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group { + align-items: center; + display: flex; + height: 100%; + flex: 1; + padding-bottom: 0.4em; + padding-top: 0.4em; + /* Make any buttons appearing on the left and right display in the centre (e.g. color edges) */ + /* For widgets like the colour picker, use the whole height */ +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog { + display: flex; + min-height: 1.5em; + overflow: hidden; + padding-left: 0; + padding-right: 0; + position: relative; + width: 100%; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain { + display: flex; + height: 100%; + transition: left cubic-bezier(0.4, 0, 1, 1) 0.15s; + width: 100%; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen { + display: flex; + flex: 0 0 auto; + justify-content: space-between; + width: 100%; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input { + font-family: Sans-serif; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container { + display: flex; + flex-grow: 1; + position: relative; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x { + -ms-grid-row-align: center; + align-self: center; + background: inherit; + border: none; + border-radius: 50%; + color: #888; + font-size: 0.6em; + font-weight: bold; + height: 100%; + padding-right: 2px; + position: absolute; + right: 0; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x { + display: none; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous, +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next { + align-items: center; + display: flex; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous::before, +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before { + align-items: center; + display: flex; + font-weight: bold; + height: 100%; + padding-left: 0.5em; + padding-right: 0.5em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous.tinymce-mobile-toolbar-navigation-disabled::before, +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before { + visibility: hidden; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item { + color: #cccccc; + font-size: 10px; + line-height: 10px; + margin: 0 2px; + padding-top: 3px; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active { + color: #c8cbcf; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before, +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before { + margin-left: 0.5em; + margin-right: 0.9em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before, +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before { + margin-left: 0.9em; + margin-right: 0.5em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider { + display: flex; + flex: 1; + margin-left: 0; + margin-right: 0; + padding: 0.28em 0; + position: relative; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container { + align-items: center; + display: flex; + flex-grow: 1; + height: 100%; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line { + background: #cccccc; + display: flex; + flex: 1; + height: 0.2em; + margin-bottom: 0.3em; + margin-top: 0.3em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container { + padding-left: 2em; + padding-right: 2em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container { + align-items: center; + display: flex; + flex-grow: 1; + height: 100%; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient { + background: linear-gradient(to right, hsl(0, 100%, 50%) 0%, hsl(60, 100%, 50%) 17%, hsl(120, 100%, 50%) 33%, hsl(180, 100%, 50%) 50%, hsl(240, 100%, 50%) 67%, hsl(300, 100%, 50%) 83%, hsl(0, 100%, 50%) 100%); + display: flex; + flex: 1; + height: 0.2em; + margin-bottom: 0.3em; + margin-top: 0.3em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black { + /* Not part of theming */ + background: black; + height: 0.2em; + margin-bottom: 0.3em; + margin-top: 0.3em; + width: 1.2em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white { + /* Not part of theming */ + background: white; + height: 0.2em; + margin-bottom: 0.3em; + margin-top: 0.3em; + width: 1.2em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb { + /* vertically centering trick (margin: auto, top: 0, bottom: 0). On iOS and Safari, if you leave + * out these values, then it shows the thumb at the top of the spectrum. This is probably because it is + * absolutely positioned with only a left value, and not a top. Note, on Chrome it seems to be fine without + * this approach. + */ + align-items: center; + background-clip: padding-box; + background-color: #455a64; + border: 0.5em solid rgba(136, 136, 136, 0); + border-radius: 3em; + bottom: 0; + color: #fff; + display: flex; + height: 0.5em; + justify-content: center; + left: -10px; + margin: auto; + position: absolute; + top: 0; + transition: border 120ms cubic-bezier(0.39, 0.58, 0.57, 1); + width: 0.5em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active { + border: 0.5em solid rgba(136, 136, 136, 0.39); +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper, +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group > div { + align-items: center; + display: flex; + height: 100%; + flex: 1; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper { + flex-direction: column; + justify-content: center; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item { + align-items: center; + display: flex; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog) { + height: 100%; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container { + display: flex; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input { + background: #ffffff; + border: none; + border-radius: 0; + color: #455a64; + flex-grow: 1; + font-size: 0.85em; + padding-bottom: 0.1em; + padding-left: 5px; + padding-top: 0.1em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder { + /* WebKit, Blink, Edge */ + color: #888; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder { + /* WebKit, Blink, Edge */ + color: #888; +} +/* dropup */ +.tinymce-mobile-dropup { + background: white; + display: flex; + overflow: hidden; + width: 100%; +} +.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking { + transition: height 0.3s ease-out; +} +.tinymce-mobile-dropup.tinymce-mobile-dropup-growing { + transition: height 0.3s ease-in; +} +.tinymce-mobile-dropup.tinymce-mobile-dropup-closed { + flex-grow: 0; +} +.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing) { + flex-grow: 1; +} +/* TODO min-height for device size and orientation */ +.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) { + min-height: 200px; +} +@media only screen and (orientation: landscape) { + .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) { + min-height: 200px; + } +} +@media only screen and (min-device-width : 320px) and (max-device-width : 568px) and (orientation : landscape) { + .tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) { + min-height: 150px; + } +} +/* styles menu */ +.tinymce-mobile-styles-menu { + font-family: sans-serif; + outline: 4px solid black; + overflow: hidden; + position: relative; + width: 100%; +} +.tinymce-mobile-styles-menu [role="menu"] { + display: flex; + flex-direction: column; + height: 100%; + position: absolute; + width: 100%; +} +.tinymce-mobile-styles-menu [role="menu"].transitioning { + transition: transform 0.5s ease-in-out; +} +.tinymce-mobile-styles-menu .tinymce-mobile-styles-item { + border-bottom: 1px solid #ddd; + color: #455a64; + cursor: pointer; + display: flex; + padding: 1em 1em; + position: relative; +} +.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before { + color: #455a64; + content: "\e314"; + font-family: 'tinymce-mobile', sans-serif; +} +.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after { + color: #455a64; + content: "\e315"; + font-family: 'tinymce-mobile', sans-serif; + padding-left: 1em; + padding-right: 1em; + position: absolute; + right: 0; +} +.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after { + font-family: 'tinymce-mobile', sans-serif; + padding-left: 1em; + padding-right: 1em; + position: absolute; + right: 0; +} +.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator, +.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser { + align-items: center; + background: #fff; + border-top: #455a64; + color: #455a64; + display: flex; + min-height: 2.5em; + padding-left: 1em; + padding-right: 1em; +} +.tinymce-mobile-styles-menu [data-transitioning-destination="before"][data-transitioning-state], +.tinymce-mobile-styles-menu [data-transitioning-state="before"] { + transform: translate(-100%); +} +.tinymce-mobile-styles-menu [data-transitioning-destination="current"][data-transitioning-state], +.tinymce-mobile-styles-menu [data-transitioning-state="current"] { + transform: translate(0%); +} +.tinymce-mobile-styles-menu [data-transitioning-destination="after"][data-transitioning-state], +.tinymce-mobile-styles-menu [data-transitioning-state="after"] { + transform: translate(100%); +} +@font-face { + font-family: 'tinymce-mobile'; + font-style: normal; + font-weight: normal; + src: url('fonts/tinymce-mobile.woff?8x92w3') format('woff'); +} +@media (min-device-width: 700px) { + .tinymce-mobile-outer-container, + .tinymce-mobile-outer-container input { + font-size: 25px; + } +} +@media (max-device-width: 700px) { + .tinymce-mobile-outer-container, + .tinymce-mobile-outer-container input { + font-size: 18px; + } +} +.tinymce-mobile-icon { + font-family: 'tinymce-mobile', sans-serif; +} +.mixin-flex-and-centre { + align-items: center; + display: flex; + justify-content: center; +} +.mixin-flex-bar { + align-items: center; + display: flex; + height: 100%; +} +.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe { + background-color: #fff; + width: 100%; +} +.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon { + /* Note, on the iPod touch in landscape, this isn't visible when the navbar appears */ + background-color: #207ab7; + border-radius: 50%; + bottom: 1em; + color: white; + font-size: 1em; + height: 2.1em; + position: fixed; + right: 2em; + width: 2.1em; + align-items: center; + display: flex; + justify-content: center; +} +@media only screen and (min-device-width:700px) { + .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon { + font-size: 1.2em; + } +} +.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket { + height: 300px; + overflow: hidden; +} +.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe { + height: 100%; +} +.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip { + display: none; +} +/* + Note, that if you don't include this (::-webkit-file-upload-button), the toolbar width gets + increased and the whole body becomes scrollable. It's important! + */ +input[type="file"]::-webkit-file-upload-button { + display: none; +} +@media only screen and (min-device-width : 320px) and (max-device-width : 568px) and (orientation : landscape) { + .tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon { + bottom: 50%; + } +} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/skin.mobile.min.css b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/skin.mobile.min.css new file mode 100644 index 00000000..3a45cacf --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/skin.mobile.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tinymce-mobile-outer-container{all:initial;display:block}.tinymce-mobile-outer-container *{border:0;box-sizing:initial;cursor:inherit;float:none;line-height:1;margin:0;outline:0;padding:0;-webkit-tap-highlight-color:transparent;text-shadow:none;white-space:nowrap}.tinymce-mobile-icon-arrow-back::before{content:"\e5cd"}.tinymce-mobile-icon-image::before{content:"\e412"}.tinymce-mobile-icon-cancel-circle::before{content:"\e5c9"}.tinymce-mobile-icon-full-dot::before{content:"\e061"}.tinymce-mobile-icon-align-center::before{content:"\e234"}.tinymce-mobile-icon-align-left::before{content:"\e236"}.tinymce-mobile-icon-align-right::before{content:"\e237"}.tinymce-mobile-icon-bold::before{content:"\e238"}.tinymce-mobile-icon-italic::before{content:"\e23f"}.tinymce-mobile-icon-unordered-list::before{content:"\e241"}.tinymce-mobile-icon-ordered-list::before{content:"\e242"}.tinymce-mobile-icon-font-size::before{content:"\e245"}.tinymce-mobile-icon-underline::before{content:"\e249"}.tinymce-mobile-icon-link::before{content:"\e157"}.tinymce-mobile-icon-unlink::before{content:"\eca2"}.tinymce-mobile-icon-color::before{content:"\e891"}.tinymce-mobile-icon-previous::before{content:"\e314"}.tinymce-mobile-icon-next::before{content:"\e315"}.tinymce-mobile-icon-large-font::before,.tinymce-mobile-icon-style-formats::before{content:"\e264"}.tinymce-mobile-icon-undo::before{content:"\e166"}.tinymce-mobile-icon-redo::before{content:"\e15a"}.tinymce-mobile-icon-removeformat::before{content:"\e239"}.tinymce-mobile-icon-small-font::before{content:"\e906"}.tinymce-mobile-format-matches::after,.tinymce-mobile-icon-readonly-back::before{content:"\e5ca"}.tinymce-mobile-icon-small-heading::before{content:"small"}.tinymce-mobile-icon-large-heading::before{content:"large"}.tinymce-mobile-icon-large-heading::before,.tinymce-mobile-icon-small-heading::before{font-family:sans-serif;font-size:80%}.tinymce-mobile-mask-edit-icon::before{content:"\e254"}.tinymce-mobile-icon-back::before{content:"\e5c4"}.tinymce-mobile-icon-heading::before{content:"Headings";font-family:sans-serif;font-size:80%;font-weight:700}.tinymce-mobile-icon-h1::before{content:"H1";font-weight:700}.tinymce-mobile-icon-h2::before{content:"H2";font-weight:700}.tinymce-mobile-icon-h3::before{content:"H3";font-weight:700}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask{align-items:center;display:flex;justify-content:center;background:rgba(51,51,51,.5);height:100%;position:absolute;top:0;width:100%}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container{align-items:center;border-radius:50%;display:flex;flex-direction:column;font-family:sans-serif;font-size:1em;justify-content:space-between}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{align-items:center;display:flex;justify-content:center;flex-direction:column;font-size:1em}@media only screen and (min-device-width:700px){.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{font-size:1.2em}}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em;background-color:#fff;color:#207ab7}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before{content:"\e900";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon{z-index:2}.tinymce-mobile-android-container.tinymce-mobile-android-maximized{background:#fff;border:none;bottom:0;display:flex;flex-direction:column;left:0;position:fixed;right:0;top:0}.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized){position:relative}.tinymce-mobile-android-container .tinymce-mobile-editor-socket{display:flex;flex-grow:1}.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe{display:flex!important;flex-grow:1;height:auto!important}.tinymce-mobile-android-scroll-reload{overflow:hidden}:not(.tinymce-mobile-readonly-mode)>.tinymce-mobile-android-selection-context-toolbar{margin-top:23px}.tinymce-mobile-toolstrip{background:#fff;display:flex;flex:0 0 auto;z-index:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar{align-items:center;background-color:#fff;border-bottom:1px solid #ccc;display:flex;flex:1;height:2.5em;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex-shrink:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container{background:#f44336}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group{flex-grow:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button{align-items:center;display:flex;height:80%;margin-left:2px;margin-right:2px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected{background:#c8cbcf;color:#ccc}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type{background:#207ab7;color:#eceff1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex:1;padding-bottom:.4em;padding-top:.4em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog{display:flex;min-height:1.5em;overflow:hidden;padding-left:0;padding-right:0;position:relative;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain{display:flex;height:100%;transition:left cubic-bezier(.4,0,1,1) .15s;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen{display:flex;flex:0 0 auto;justify-content:space-between;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input{font-family:Sans-serif}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container{display:flex;flex-grow:1;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x{-ms-grid-row-align:center;align-self:center;background:inherit;border:none;border-radius:50%;color:#888;font-size:.6em;font-weight:700;height:100%;padding-right:2px;position:absolute;right:0}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x{display:none}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous::before{align-items:center;display:flex;font-weight:700;height:100%;padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous.tinymce-mobile-toolbar-navigation-disabled::before{visibility:hidden}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item{color:#ccc;font-size:10px;line-height:10px;margin:0 2px;padding-top:3px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active{color:#c8cbcf}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before{margin-left:.5em;margin-right:.9em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before{margin-left:.9em;margin-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider{display:flex;flex:1;margin-left:0;margin-right:0;padding:.28em 0;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line{background:#ccc;display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container{padding-left:2em;padding-right:2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient{background:linear-gradient(to right,red 0,#feff00 17%,#0f0 33%,#00feff 50%,#00f 67%,#ff00fe 83%,red 100%);display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black{background:#000;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white{background:#fff;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb{align-items:center;background-clip:padding-box;background-color:#455a64;border:.5em solid rgba(136,136,136,0);border-radius:3em;bottom:0;color:#fff;display:flex;height:.5em;justify-content:center;left:-10px;margin:auto;position:absolute;top:0;transition:border 120ms cubic-bezier(.39,.58,.57,1);width:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active{border:.5em solid rgba(136,136,136,.39)}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper{flex-direction:column;justify-content:center}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog){height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container{display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input{background:#fff;border:none;border-radius:0;color:#455a64;flex-grow:1;font-size:.85em;padding-bottom:.1em;padding-left:5px;padding-top:.1em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder{color:#888}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder{color:#888}.tinymce-mobile-dropup{background:#fff;display:flex;overflow:hidden;width:100%}.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking{transition:height .3s ease-out}.tinymce-mobile-dropup.tinymce-mobile-dropup-growing{transition:height .3s ease-in}.tinymce-mobile-dropup.tinymce-mobile-dropup-closed{flex-grow:0}.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing){flex-grow:1}.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}@media only screen and (orientation:landscape){.tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:150px}}.tinymce-mobile-styles-menu{font-family:sans-serif;outline:4px solid #000;overflow:hidden;position:relative;width:100%}.tinymce-mobile-styles-menu [role=menu]{display:flex;flex-direction:column;height:100%;position:absolute;width:100%}.tinymce-mobile-styles-menu [role=menu].transitioning{transition:transform .5s ease-in-out}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item{border-bottom:1px solid #ddd;color:#455a64;cursor:pointer;display:flex;padding:1em 1em;position:relative}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before{color:#455a64;content:"\e314";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after{color:#455a64;content:"\e315";font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after{font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser,.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator{align-items:center;background:#fff;border-top:#455a64;color:#455a64;display:flex;min-height:2.5em;padding-left:1em;padding-right:1em}.tinymce-mobile-styles-menu [data-transitioning-destination=before][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=before]{transform:translate(-100%)}.tinymce-mobile-styles-menu [data-transitioning-destination=current][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=current]{transform:translate(0)}.tinymce-mobile-styles-menu [data-transitioning-destination=after][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=after]{transform:translate(100%)}@font-face{font-family:tinymce-mobile;font-style:normal;font-weight:400;src:url(fonts/tinymce-mobile.woff?8x92w3) format('woff')}@media (min-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:25px}}@media (max-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:18px}}.tinymce-mobile-icon{font-family:tinymce-mobile,sans-serif}.mixin-flex-and-centre{align-items:center;display:flex;justify-content:center}.mixin-flex-bar{align-items:center;display:flex;height:100%}.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe{background-color:#fff;width:100%}.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{background-color:#207ab7;border-radius:50%;bottom:1em;color:#fff;font-size:1em;height:2.1em;position:fixed;right:2em;width:2.1em;align-items:center;display:flex;justify-content:center}@media only screen and (min-device-width:700px){.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{font-size:1.2em}}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket{height:300px;overflow:hidden}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe{height:100%}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip{display:none}input[type=file]::-webkit-file-upload-button{display:none}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{bottom:50%}} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.css b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.css new file mode 100644 index 00000000..715978b5 --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.css @@ -0,0 +1,37 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +body.tox-dialog__disable-scroll { + overflow: hidden; +} +.tox-fullscreen { + border: 0; + height: 100%; + left: 0; + margin: 0; + overflow: hidden; + -ms-scroll-chaining: none; + overscroll-behavior: none; + padding: 0; + position: fixed; + top: 0; + touch-action: pinch-zoom; + width: 100%; +} +.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle { + display: none; +} +.tox.tox-tinymce.tox-fullscreen { + background-color: transparent; + z-index: 1200; +} +.tox-shadowhost.tox-fullscreen { + z-index: 1200; +} +.tox-fullscreen .tox.tox-tinymce-aux, +.tox-fullscreen ~ .tox.tox-tinymce-aux { + z-index: 1201; +} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css new file mode 100644 index 00000000..9ba6e02c --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;left:0;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;position:fixed;top:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox.tox-tinymce.tox-fullscreen{background-color:transparent;z-index:1200}.tox-shadowhost.tox-fullscreen{z-index:1200}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide/content.css b/snowy-admin-web/public/tinymce/skins/ui/oxide/content.css new file mode 100644 index 00000000..efae400b --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide/content.css @@ -0,0 +1,732 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.mce-content-body .mce-item-anchor { + background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center; + cursor: default; + display: inline-block; + height: 12px !important; + padding: 0 2px; + -webkit-user-modify: read-only; + -moz-user-modify: read-only; + -webkit-user-select: all; + -moz-user-select: all; + -ms-user-select: all; + user-select: all; + width: 8px !important; +} +.mce-content-body .mce-item-anchor[data-mce-selected] { + outline-offset: 1px; +} +.tox-comments-visible .tox-comment { + background-color: #fff0b7; +} +.tox-comments-visible .tox-comment--active { + background-color: #ffe168; +} +.tox-checklist > li:not(.tox-checklist--hidden) { + list-style: none; + margin: 0.25em 0; +} +.tox-checklist > li:not(.tox-checklist--hidden)::before { + content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A"); + cursor: pointer; + height: 1em; + margin-left: -1.5em; + margin-top: 0.125em; + position: absolute; + width: 1em; +} +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before { + content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A"); +} +[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before { + margin-left: 0; + margin-right: -1.5em; +} +/* stylelint-disable */ +/* http://prismjs.com/ */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} +pre[class*="language-"]::-moz-selection, +pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, +code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} +pre[class*="language-"]::selection, +pre[class*="language-"] ::selection, +code[class*="language-"]::selection, +code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} +@media print { + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; +} +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} +.token.punctuation { + color: #999; +} +.namespace { + opacity: 0.7; +} +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + background: hsla(0, 0%, 100%, 0.5); +} +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} +.token.function, +.token.class-name { + color: #DD4A68; +} +.token.regex, +.token.important, +.token.variable { + color: #e90; +} +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} +.token.entity { + cursor: help; +} +/* stylelint-enable */ +.mce-content-body { + overflow-wrap: break-word; + word-wrap: break-word; +} +.mce-content-body .mce-visual-caret { + background-color: black; + background-color: currentColor; + position: absolute; +} +.mce-content-body .mce-visual-caret-hidden { + display: none; +} +.mce-content-body *[data-mce-caret] { + left: -1000px; + margin: 0; + padding: 0; + position: absolute; + right: auto; + top: 0; +} +.mce-content-body .mce-offscreen-selection { + left: -2000000px; + max-width: 1000000px; + position: absolute; +} +.mce-content-body *[contentEditable=false] { + cursor: default; +} +.mce-content-body *[contentEditable=true] { + cursor: text; +} +.tox-cursor-format-painter { + cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"), default; +} +.mce-content-body figure.align-left { + float: left; +} +.mce-content-body figure.align-right { + float: right; +} +.mce-content-body figure.image.align-center { + display: table; + margin-left: auto; + margin-right: auto; +} +.mce-preview-object { + border: 1px solid gray; + display: inline-block; + line-height: 0; + margin: 0 2px 0 2px; + position: relative; +} +.mce-preview-object .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-preview-object[data-mce-selected="2"] .mce-shim { + display: none; +} +.mce-object { + background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center; + border: 1px dashed #aaa; +} +.mce-pagebreak { + border: 1px dashed #aaa; + cursor: default; + display: block; + height: 5px; + margin-top: 15px; + page-break-before: always; + width: 100%; +} +@media print { + .mce-pagebreak { + border: 0; + } +} +.tiny-pageembed .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.tiny-pageembed[data-mce-selected="2"] .mce-shim { + display: none; +} +.tiny-pageembed { + display: inline-block; + position: relative; +} +.tiny-pageembed--21by9, +.tiny-pageembed--16by9, +.tiny-pageembed--4by3, +.tiny-pageembed--1by1 { + display: block; + overflow: hidden; + padding: 0; + position: relative; + width: 100%; +} +.tiny-pageembed--21by9 { + padding-top: 42.857143%; +} +.tiny-pageembed--16by9 { + padding-top: 56.25%; +} +.tiny-pageembed--4by3 { + padding-top: 75%; +} +.tiny-pageembed--1by1 { + padding-top: 100%; +} +.tiny-pageembed--21by9 iframe, +.tiny-pageembed--16by9 iframe, +.tiny-pageembed--4by3 iframe, +.tiny-pageembed--1by1 iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-content-body[data-mce-placeholder] { + position: relative; +} +.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before { + color: rgba(34, 47, 62, 0.7); + content: attr(data-mce-placeholder); + position: absolute; +} +.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before { + left: 1px; +} +.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before { + right: 1px; +} +.mce-content-body div.mce-resizehandle { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + height: 10px; + position: absolute; + width: 10px; + z-index: 10000; +} +.mce-content-body div.mce-resizehandle:hover { + background-color: #4099ff; +} +.mce-content-body div.mce-resizehandle:nth-of-type(1) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(2) { + cursor: nesw-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(3) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(4) { + cursor: nesw-resize; +} +.mce-content-body .mce-resize-backdrop { + z-index: 10000; +} +.mce-content-body .mce-clonedresizable { + cursor: default; + opacity: 0.5; + outline: 1px dashed black; + position: absolute; + z-index: 10001; +} +.mce-content-body .mce-clonedresizable.mce-resizetable-columns th, +.mce-content-body .mce-clonedresizable.mce-resizetable-columns td { + border: 0; +} +.mce-content-body .mce-resize-helper { + background: #555; + background: rgba(0, 0, 0, 0.75); + border: 1px; + border-radius: 3px; + color: white; + display: none; + font-family: sans-serif; + font-size: 12px; + line-height: 14px; + margin: 5px 10px; + padding: 5px; + position: absolute; + white-space: nowrap; + z-index: 10002; +} +.tox-rtc-user-selection { + position: relative; +} +.tox-rtc-user-cursor { + bottom: 0; + cursor: default; + position: absolute; + top: 0; + width: 2px; +} +.tox-rtc-user-cursor::before { + background-color: inherit; + border-radius: 50%; + content: ''; + display: block; + height: 8px; + position: absolute; + right: -3px; + top: -3px; + width: 8px; +} +.tox-rtc-user-cursor:hover::after { + background-color: inherit; + border-radius: 100px; + box-sizing: border-box; + color: #fff; + content: attr(data-user); + display: block; + font-size: 12px; + font-weight: bold; + left: -5px; + min-height: 8px; + min-width: 8px; + padding: 0 12px; + position: absolute; + top: -11px; + white-space: nowrap; + z-index: 1000; +} +.tox-rtc-user-selection--1 .tox-rtc-user-cursor { + background-color: #2dc26b; +} +.tox-rtc-user-selection--2 .tox-rtc-user-cursor { + background-color: #e03e2d; +} +.tox-rtc-user-selection--3 .tox-rtc-user-cursor { + background-color: #f1c40f; +} +.tox-rtc-user-selection--4 .tox-rtc-user-cursor { + background-color: #3598db; +} +.tox-rtc-user-selection--5 .tox-rtc-user-cursor { + background-color: #b96ad9; +} +.tox-rtc-user-selection--6 .tox-rtc-user-cursor { + background-color: #e67e23; +} +.tox-rtc-user-selection--7 .tox-rtc-user-cursor { + background-color: #aaa69d; +} +.tox-rtc-user-selection--8 .tox-rtc-user-cursor { + background-color: #f368e0; +} +.tox-rtc-remote-image { + background: #eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center; + border: 1px solid #ccc; + min-height: 240px; + min-width: 320px; +} +.mce-match-marker { + background: #aaa; + color: #fff; +} +.mce-match-marker-selected { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::-moz-selection { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::selection { + background: #39f; + color: #fff; +} +.mce-content-body img[data-mce-selected], +.mce-content-body video[data-mce-selected], +.mce-content-body audio[data-mce-selected], +.mce-content-body object[data-mce-selected], +.mce-content-body embed[data-mce-selected], +.mce-content-body table[data-mce-selected] { + outline: 3px solid #b4d7ff; +} +.mce-content-body hr[data-mce-selected] { + outline: 3px solid #b4d7ff; + outline-offset: 1px; +} +.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover { + outline: 3px solid #b4d7ff; +} +.mce-content-body *[contentEditable=false][data-mce-selected] { + cursor: not-allowed; + outline: 3px solid #b4d7ff; +} +.mce-content-body.mce-content-readonly *[contentEditable=true]:focus, +.mce-content-body.mce-content-readonly *[contentEditable=true]:hover { + outline: none; +} +.mce-content-body *[data-mce-selected="inline-boundary"] { + background-color: #b4d7ff; +} +.mce-content-body .mce-edit-focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body td[data-mce-selected], +.mce-content-body th[data-mce-selected] { + position: relative; +} +.mce-content-body td[data-mce-selected]::-moz-selection, +.mce-content-body th[data-mce-selected]::-moz-selection { + background: none; +} +.mce-content-body td[data-mce-selected]::selection, +.mce-content-body th[data-mce-selected]::selection { + background: none; +} +.mce-content-body td[data-mce-selected] *, +.mce-content-body th[data-mce-selected] * { + outline: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.mce-content-body td[data-mce-selected]::after, +.mce-content-body th[data-mce-selected]::after { + background-color: rgba(180, 215, 255, 0.7); + border: 1px solid rgba(180, 215, 255, 0.7); + bottom: -1px; + content: ''; + left: -1px; + mix-blend-mode: multiply; + position: absolute; + right: -1px; + top: -1px; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .mce-content-body td[data-mce-selected]::after, + .mce-content-body th[data-mce-selected]::after { + border-color: rgba(0, 84, 180, 0.7); + } +} +.mce-content-body img::-moz-selection { + background: none; +} +.mce-content-body img::selection { + background: none; +} +.ephox-snooker-resizer-bar { + background-color: #b4d7ff; + opacity: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.ephox-snooker-resizer-cols { + cursor: col-resize; +} +.ephox-snooker-resizer-rows { + cursor: row-resize; +} +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging { + opacity: 1; +} +.mce-spellchecker-word { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; + height: 2rem; +} +.mce-spellchecker-grammar { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; +} +.mce-toc { + border: 1px solid gray; +} +.mce-toc h2 { + margin: 4px; +} +.mce-toc li { + list-style-type: none; +} +table[style*="border-width: 0px"], +.mce-item-table:not([border]), +.mce-item-table[border="0"], +table[style*="border-width: 0px"] td, +.mce-item-table:not([border]) td, +.mce-item-table[border="0"] td, +table[style*="border-width: 0px"] th, +.mce-item-table:not([border]) th, +.mce-item-table[border="0"] th, +table[style*="border-width: 0px"] caption, +.mce-item-table:not([border]) caption, +.mce-item-table[border="0"] caption { + border: 1px dashed #bbb; +} +.mce-visualblocks p, +.mce-visualblocks h1, +.mce-visualblocks h2, +.mce-visualblocks h3, +.mce-visualblocks h4, +.mce-visualblocks h5, +.mce-visualblocks h6, +.mce-visualblocks div:not([data-mce-bogus]), +.mce-visualblocks section, +.mce-visualblocks article, +.mce-visualblocks blockquote, +.mce-visualblocks address, +.mce-visualblocks pre, +.mce-visualblocks figure, +.mce-visualblocks figcaption, +.mce-visualblocks hgroup, +.mce-visualblocks aside, +.mce-visualblocks ul, +.mce-visualblocks ol, +.mce-visualblocks dl { + background-repeat: no-repeat; + border: 1px dashed #bbb; + margin-left: 3px; + padding-top: 10px; +} +.mce-visualblocks p { + background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); +} +.mce-visualblocks h1 { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); +} +.mce-visualblocks h2 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); +} +.mce-visualblocks h3 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); +} +.mce-visualblocks h4 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); +} +.mce-visualblocks h5 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); +} +.mce-visualblocks h6 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); +} +.mce-visualblocks div:not([data-mce-bogus]) { + background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); +} +.mce-visualblocks section { + background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); +} +.mce-visualblocks article { + background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); +} +.mce-visualblocks blockquote { + background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); +} +.mce-visualblocks address { + background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); +} +.mce-visualblocks pre { + background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); +} +.mce-visualblocks figure { + background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); +} +.mce-visualblocks figcaption { + border: 1px dashed #bbb; +} +.mce-visualblocks hgroup { + background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); +} +.mce-visualblocks aside { + background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); +} +.mce-visualblocks ul { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); +} +.mce-visualblocks ol { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); +} +.mce-visualblocks dl { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); +} +.mce-visualblocks:not([dir=rtl]) p, +.mce-visualblocks:not([dir=rtl]) h1, +.mce-visualblocks:not([dir=rtl]) h2, +.mce-visualblocks:not([dir=rtl]) h3, +.mce-visualblocks:not([dir=rtl]) h4, +.mce-visualblocks:not([dir=rtl]) h5, +.mce-visualblocks:not([dir=rtl]) h6, +.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]), +.mce-visualblocks:not([dir=rtl]) section, +.mce-visualblocks:not([dir=rtl]) article, +.mce-visualblocks:not([dir=rtl]) blockquote, +.mce-visualblocks:not([dir=rtl]) address, +.mce-visualblocks:not([dir=rtl]) pre, +.mce-visualblocks:not([dir=rtl]) figure, +.mce-visualblocks:not([dir=rtl]) figcaption, +.mce-visualblocks:not([dir=rtl]) hgroup, +.mce-visualblocks:not([dir=rtl]) aside, +.mce-visualblocks:not([dir=rtl]) ul, +.mce-visualblocks:not([dir=rtl]) ol, +.mce-visualblocks:not([dir=rtl]) dl { + margin-left: 3px; +} +.mce-visualblocks[dir=rtl] p, +.mce-visualblocks[dir=rtl] h1, +.mce-visualblocks[dir=rtl] h2, +.mce-visualblocks[dir=rtl] h3, +.mce-visualblocks[dir=rtl] h4, +.mce-visualblocks[dir=rtl] h5, +.mce-visualblocks[dir=rtl] h6, +.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]), +.mce-visualblocks[dir=rtl] section, +.mce-visualblocks[dir=rtl] article, +.mce-visualblocks[dir=rtl] blockquote, +.mce-visualblocks[dir=rtl] address, +.mce-visualblocks[dir=rtl] pre, +.mce-visualblocks[dir=rtl] figure, +.mce-visualblocks[dir=rtl] figcaption, +.mce-visualblocks[dir=rtl] hgroup, +.mce-visualblocks[dir=rtl] aside, +.mce-visualblocks[dir=rtl] ul, +.mce-visualblocks[dir=rtl] ol, +.mce-visualblocks[dir=rtl] dl { + background-position-x: right; + margin-right: 3px; +} +.mce-nbsp, +.mce-shy { + background: #aaa; +} +.mce-shy::after { + content: '-'; +} +body { + font-family: sans-serif; +} +table { + border-collapse: collapse; +} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide/content.inline.css b/snowy-admin-web/public/tinymce/skins/ui/oxide/content.inline.css new file mode 100644 index 00000000..df6ed08b --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide/content.inline.css @@ -0,0 +1,726 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.mce-content-body .mce-item-anchor { + background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center; + cursor: default; + display: inline-block; + height: 12px !important; + padding: 0 2px; + -webkit-user-modify: read-only; + -moz-user-modify: read-only; + -webkit-user-select: all; + -moz-user-select: all; + -ms-user-select: all; + user-select: all; + width: 8px !important; +} +.mce-content-body .mce-item-anchor[data-mce-selected] { + outline-offset: 1px; +} +.tox-comments-visible .tox-comment { + background-color: #fff0b7; +} +.tox-comments-visible .tox-comment--active { + background-color: #ffe168; +} +.tox-checklist > li:not(.tox-checklist--hidden) { + list-style: none; + margin: 0.25em 0; +} +.tox-checklist > li:not(.tox-checklist--hidden)::before { + content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A"); + cursor: pointer; + height: 1em; + margin-left: -1.5em; + margin-top: 0.125em; + position: absolute; + width: 1em; +} +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before { + content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A"); +} +[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before { + margin-left: 0; + margin-right: -1.5em; +} +/* stylelint-disable */ +/* http://prismjs.com/ */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} +pre[class*="language-"]::-moz-selection, +pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, +code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} +pre[class*="language-"]::selection, +pre[class*="language-"] ::selection, +code[class*="language-"]::selection, +code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} +@media print { + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; +} +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} +.token.punctuation { + color: #999; +} +.namespace { + opacity: 0.7; +} +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + background: hsla(0, 0%, 100%, 0.5); +} +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} +.token.function, +.token.class-name { + color: #DD4A68; +} +.token.regex, +.token.important, +.token.variable { + color: #e90; +} +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} +.token.entity { + cursor: help; +} +/* stylelint-enable */ +.mce-content-body { + overflow-wrap: break-word; + word-wrap: break-word; +} +.mce-content-body .mce-visual-caret { + background-color: black; + background-color: currentColor; + position: absolute; +} +.mce-content-body .mce-visual-caret-hidden { + display: none; +} +.mce-content-body *[data-mce-caret] { + left: -1000px; + margin: 0; + padding: 0; + position: absolute; + right: auto; + top: 0; +} +.mce-content-body .mce-offscreen-selection { + left: -2000000px; + max-width: 1000000px; + position: absolute; +} +.mce-content-body *[contentEditable=false] { + cursor: default; +} +.mce-content-body *[contentEditable=true] { + cursor: text; +} +.tox-cursor-format-painter { + cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"), default; +} +.mce-content-body figure.align-left { + float: left; +} +.mce-content-body figure.align-right { + float: right; +} +.mce-content-body figure.image.align-center { + display: table; + margin-left: auto; + margin-right: auto; +} +.mce-preview-object { + border: 1px solid gray; + display: inline-block; + line-height: 0; + margin: 0 2px 0 2px; + position: relative; +} +.mce-preview-object .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-preview-object[data-mce-selected="2"] .mce-shim { + display: none; +} +.mce-object { + background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center; + border: 1px dashed #aaa; +} +.mce-pagebreak { + border: 1px dashed #aaa; + cursor: default; + display: block; + height: 5px; + margin-top: 15px; + page-break-before: always; + width: 100%; +} +@media print { + .mce-pagebreak { + border: 0; + } +} +.tiny-pageembed .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.tiny-pageembed[data-mce-selected="2"] .mce-shim { + display: none; +} +.tiny-pageembed { + display: inline-block; + position: relative; +} +.tiny-pageembed--21by9, +.tiny-pageembed--16by9, +.tiny-pageembed--4by3, +.tiny-pageembed--1by1 { + display: block; + overflow: hidden; + padding: 0; + position: relative; + width: 100%; +} +.tiny-pageembed--21by9 { + padding-top: 42.857143%; +} +.tiny-pageembed--16by9 { + padding-top: 56.25%; +} +.tiny-pageembed--4by3 { + padding-top: 75%; +} +.tiny-pageembed--1by1 { + padding-top: 100%; +} +.tiny-pageembed--21by9 iframe, +.tiny-pageembed--16by9 iframe, +.tiny-pageembed--4by3 iframe, +.tiny-pageembed--1by1 iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-content-body[data-mce-placeholder] { + position: relative; +} +.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before { + color: rgba(34, 47, 62, 0.7); + content: attr(data-mce-placeholder); + position: absolute; +} +.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before { + left: 1px; +} +.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before { + right: 1px; +} +.mce-content-body div.mce-resizehandle { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + height: 10px; + position: absolute; + width: 10px; + z-index: 10000; +} +.mce-content-body div.mce-resizehandle:hover { + background-color: #4099ff; +} +.mce-content-body div.mce-resizehandle:nth-of-type(1) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(2) { + cursor: nesw-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(3) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(4) { + cursor: nesw-resize; +} +.mce-content-body .mce-resize-backdrop { + z-index: 10000; +} +.mce-content-body .mce-clonedresizable { + cursor: default; + opacity: 0.5; + outline: 1px dashed black; + position: absolute; + z-index: 10001; +} +.mce-content-body .mce-clonedresizable.mce-resizetable-columns th, +.mce-content-body .mce-clonedresizable.mce-resizetable-columns td { + border: 0; +} +.mce-content-body .mce-resize-helper { + background: #555; + background: rgba(0, 0, 0, 0.75); + border: 1px; + border-radius: 3px; + color: white; + display: none; + font-family: sans-serif; + font-size: 12px; + line-height: 14px; + margin: 5px 10px; + padding: 5px; + position: absolute; + white-space: nowrap; + z-index: 10002; +} +.tox-rtc-user-selection { + position: relative; +} +.tox-rtc-user-cursor { + bottom: 0; + cursor: default; + position: absolute; + top: 0; + width: 2px; +} +.tox-rtc-user-cursor::before { + background-color: inherit; + border-radius: 50%; + content: ''; + display: block; + height: 8px; + position: absolute; + right: -3px; + top: -3px; + width: 8px; +} +.tox-rtc-user-cursor:hover::after { + background-color: inherit; + border-radius: 100px; + box-sizing: border-box; + color: #fff; + content: attr(data-user); + display: block; + font-size: 12px; + font-weight: bold; + left: -5px; + min-height: 8px; + min-width: 8px; + padding: 0 12px; + position: absolute; + top: -11px; + white-space: nowrap; + z-index: 1000; +} +.tox-rtc-user-selection--1 .tox-rtc-user-cursor { + background-color: #2dc26b; +} +.tox-rtc-user-selection--2 .tox-rtc-user-cursor { + background-color: #e03e2d; +} +.tox-rtc-user-selection--3 .tox-rtc-user-cursor { + background-color: #f1c40f; +} +.tox-rtc-user-selection--4 .tox-rtc-user-cursor { + background-color: #3598db; +} +.tox-rtc-user-selection--5 .tox-rtc-user-cursor { + background-color: #b96ad9; +} +.tox-rtc-user-selection--6 .tox-rtc-user-cursor { + background-color: #e67e23; +} +.tox-rtc-user-selection--7 .tox-rtc-user-cursor { + background-color: #aaa69d; +} +.tox-rtc-user-selection--8 .tox-rtc-user-cursor { + background-color: #f368e0; +} +.tox-rtc-remote-image { + background: #eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center; + border: 1px solid #ccc; + min-height: 240px; + min-width: 320px; +} +.mce-match-marker { + background: #aaa; + color: #fff; +} +.mce-match-marker-selected { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::-moz-selection { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::selection { + background: #39f; + color: #fff; +} +.mce-content-body img[data-mce-selected], +.mce-content-body video[data-mce-selected], +.mce-content-body audio[data-mce-selected], +.mce-content-body object[data-mce-selected], +.mce-content-body embed[data-mce-selected], +.mce-content-body table[data-mce-selected] { + outline: 3px solid #b4d7ff; +} +.mce-content-body hr[data-mce-selected] { + outline: 3px solid #b4d7ff; + outline-offset: 1px; +} +.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover { + outline: 3px solid #b4d7ff; +} +.mce-content-body *[contentEditable=false][data-mce-selected] { + cursor: not-allowed; + outline: 3px solid #b4d7ff; +} +.mce-content-body.mce-content-readonly *[contentEditable=true]:focus, +.mce-content-body.mce-content-readonly *[contentEditable=true]:hover { + outline: none; +} +.mce-content-body *[data-mce-selected="inline-boundary"] { + background-color: #b4d7ff; +} +.mce-content-body .mce-edit-focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body td[data-mce-selected], +.mce-content-body th[data-mce-selected] { + position: relative; +} +.mce-content-body td[data-mce-selected]::-moz-selection, +.mce-content-body th[data-mce-selected]::-moz-selection { + background: none; +} +.mce-content-body td[data-mce-selected]::selection, +.mce-content-body th[data-mce-selected]::selection { + background: none; +} +.mce-content-body td[data-mce-selected] *, +.mce-content-body th[data-mce-selected] * { + outline: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.mce-content-body td[data-mce-selected]::after, +.mce-content-body th[data-mce-selected]::after { + background-color: rgba(180, 215, 255, 0.7); + border: 1px solid rgba(180, 215, 255, 0.7); + bottom: -1px; + content: ''; + left: -1px; + mix-blend-mode: multiply; + position: absolute; + right: -1px; + top: -1px; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .mce-content-body td[data-mce-selected]::after, + .mce-content-body th[data-mce-selected]::after { + border-color: rgba(0, 84, 180, 0.7); + } +} +.mce-content-body img::-moz-selection { + background: none; +} +.mce-content-body img::selection { + background: none; +} +.ephox-snooker-resizer-bar { + background-color: #b4d7ff; + opacity: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.ephox-snooker-resizer-cols { + cursor: col-resize; +} +.ephox-snooker-resizer-rows { + cursor: row-resize; +} +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging { + opacity: 1; +} +.mce-spellchecker-word { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; + height: 2rem; +} +.mce-spellchecker-grammar { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; +} +.mce-toc { + border: 1px solid gray; +} +.mce-toc h2 { + margin: 4px; +} +.mce-toc li { + list-style-type: none; +} +table[style*="border-width: 0px"], +.mce-item-table:not([border]), +.mce-item-table[border="0"], +table[style*="border-width: 0px"] td, +.mce-item-table:not([border]) td, +.mce-item-table[border="0"] td, +table[style*="border-width: 0px"] th, +.mce-item-table:not([border]) th, +.mce-item-table[border="0"] th, +table[style*="border-width: 0px"] caption, +.mce-item-table:not([border]) caption, +.mce-item-table[border="0"] caption { + border: 1px dashed #bbb; +} +.mce-visualblocks p, +.mce-visualblocks h1, +.mce-visualblocks h2, +.mce-visualblocks h3, +.mce-visualblocks h4, +.mce-visualblocks h5, +.mce-visualblocks h6, +.mce-visualblocks div:not([data-mce-bogus]), +.mce-visualblocks section, +.mce-visualblocks article, +.mce-visualblocks blockquote, +.mce-visualblocks address, +.mce-visualblocks pre, +.mce-visualblocks figure, +.mce-visualblocks figcaption, +.mce-visualblocks hgroup, +.mce-visualblocks aside, +.mce-visualblocks ul, +.mce-visualblocks ol, +.mce-visualblocks dl { + background-repeat: no-repeat; + border: 1px dashed #bbb; + margin-left: 3px; + padding-top: 10px; +} +.mce-visualblocks p { + background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); +} +.mce-visualblocks h1 { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); +} +.mce-visualblocks h2 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); +} +.mce-visualblocks h3 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); +} +.mce-visualblocks h4 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); +} +.mce-visualblocks h5 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); +} +.mce-visualblocks h6 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); +} +.mce-visualblocks div:not([data-mce-bogus]) { + background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); +} +.mce-visualblocks section { + background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); +} +.mce-visualblocks article { + background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); +} +.mce-visualblocks blockquote { + background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); +} +.mce-visualblocks address { + background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); +} +.mce-visualblocks pre { + background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); +} +.mce-visualblocks figure { + background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); +} +.mce-visualblocks figcaption { + border: 1px dashed #bbb; +} +.mce-visualblocks hgroup { + background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); +} +.mce-visualblocks aside { + background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); +} +.mce-visualblocks ul { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); +} +.mce-visualblocks ol { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); +} +.mce-visualblocks dl { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); +} +.mce-visualblocks:not([dir=rtl]) p, +.mce-visualblocks:not([dir=rtl]) h1, +.mce-visualblocks:not([dir=rtl]) h2, +.mce-visualblocks:not([dir=rtl]) h3, +.mce-visualblocks:not([dir=rtl]) h4, +.mce-visualblocks:not([dir=rtl]) h5, +.mce-visualblocks:not([dir=rtl]) h6, +.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]), +.mce-visualblocks:not([dir=rtl]) section, +.mce-visualblocks:not([dir=rtl]) article, +.mce-visualblocks:not([dir=rtl]) blockquote, +.mce-visualblocks:not([dir=rtl]) address, +.mce-visualblocks:not([dir=rtl]) pre, +.mce-visualblocks:not([dir=rtl]) figure, +.mce-visualblocks:not([dir=rtl]) figcaption, +.mce-visualblocks:not([dir=rtl]) hgroup, +.mce-visualblocks:not([dir=rtl]) aside, +.mce-visualblocks:not([dir=rtl]) ul, +.mce-visualblocks:not([dir=rtl]) ol, +.mce-visualblocks:not([dir=rtl]) dl { + margin-left: 3px; +} +.mce-visualblocks[dir=rtl] p, +.mce-visualblocks[dir=rtl] h1, +.mce-visualblocks[dir=rtl] h2, +.mce-visualblocks[dir=rtl] h3, +.mce-visualblocks[dir=rtl] h4, +.mce-visualblocks[dir=rtl] h5, +.mce-visualblocks[dir=rtl] h6, +.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]), +.mce-visualblocks[dir=rtl] section, +.mce-visualblocks[dir=rtl] article, +.mce-visualblocks[dir=rtl] blockquote, +.mce-visualblocks[dir=rtl] address, +.mce-visualblocks[dir=rtl] pre, +.mce-visualblocks[dir=rtl] figure, +.mce-visualblocks[dir=rtl] figcaption, +.mce-visualblocks[dir=rtl] hgroup, +.mce-visualblocks[dir=rtl] aside, +.mce-visualblocks[dir=rtl] ul, +.mce-visualblocks[dir=rtl] ol, +.mce-visualblocks[dir=rtl] dl { + background-position-x: right; + margin-right: 3px; +} +.mce-nbsp, +.mce-shy { + background: #aaa; +} +.mce-shy::after { + content: '-'; +} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide/content.inline.min.css b/snowy-admin-web/public/tinymce/skins/ui/oxide/content.inline.min.css new file mode 100644 index 00000000..0a3d965c --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide/content.inline.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:10000}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide/content.min.css b/snowy-admin-web/public/tinymce/skins/ui/oxide/content.min.css new file mode 100644 index 00000000..40b3378d --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide/content.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:10000}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}body{font-family:sans-serif}table{border-collapse:collapse} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide/content.mobile.css b/snowy-admin-web/public/tinymce/skins/ui/oxide/content.mobile.css new file mode 100644 index 00000000..4bdb8bab --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide/content.mobile.css @@ -0,0 +1,29 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection { + /* Note: this file is used inside the content, so isn't part of theming */ + background-color: green; + display: inline-block; + opacity: 0.5; + position: absolute; +} +body { + -webkit-text-size-adjust: none; +} +body img { + /* this is related to the content margin */ + max-width: 96vw; +} +body table img { + max-width: 95%; +} +body { + font-family: sans-serif; +} +table { + border-collapse: collapse; +} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide/content.mobile.min.css b/snowy-admin-web/public/tinymce/skins/ui/oxide/content.mobile.min.css new file mode 100644 index 00000000..35f7dc08 --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide/content.mobile.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff b/snowy-admin-web/public/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff new file mode 100644 index 00000000..1e3be038 Binary files /dev/null and b/snowy-admin-web/public/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff differ diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide/skin.css b/snowy-admin-web/public/tinymce/skins/ui/oxide/skin.css new file mode 100644 index 00000000..4b47a758 --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide/skin.css @@ -0,0 +1,3034 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tox { + box-shadow: none; + box-sizing: content-box; + color: #222f3e; + cursor: auto; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 16px; + font-style: normal; + font-weight: normal; + line-height: normal; + -webkit-tap-highlight-color: transparent; + text-decoration: none; + text-shadow: none; + text-transform: none; + vertical-align: initial; + white-space: normal; +} +.tox *:not(svg):not(rect) { + box-sizing: inherit; + color: inherit; + cursor: inherit; + direction: inherit; + font-family: inherit; + font-size: inherit; + font-style: inherit; + font-weight: inherit; + line-height: inherit; + -webkit-tap-highlight-color: inherit; + text-align: inherit; + text-decoration: inherit; + text-shadow: inherit; + text-transform: inherit; + vertical-align: inherit; + white-space: inherit; +} +.tox *:not(svg):not(rect) { + /* stylelint-disable-line no-duplicate-selectors */ + background: transparent; + border: 0; + box-shadow: none; + float: none; + height: auto; + margin: 0; + max-width: none; + outline: 0; + padding: 0; + position: static; + width: auto; +} +.tox:not([dir=rtl]) { + direction: ltr; + text-align: left; +} +.tox[dir=rtl] { + direction: rtl; + text-align: right; +} +.tox-tinymce { + border: 1px solid #cccccc; + border-radius: 0; + box-shadow: none; + box-sizing: border-box; + display: flex; + flex-direction: column; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + overflow: hidden; + position: relative; + visibility: inherit !important; +} +.tox-tinymce-inline { + border: none; + box-shadow: none; +} +.tox-tinymce-inline .tox-editor-header { + background-color: transparent; + border: 1px solid #cccccc; + border-radius: 0; + box-shadow: none; +} +.tox-tinymce-aux { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + z-index: 1300; +} +.tox-tinymce *:focus, +.tox-tinymce-aux *:focus { + outline: none; +} +button::-moz-focus-inner { + border: 0; +} +.tox .accessibility-issue__header { + align-items: center; + display: flex; + margin-bottom: 4px; +} +.tox .accessibility-issue__description { + align-items: stretch; + border: 1px solid #cccccc; + border-radius: 3px; + display: flex; + justify-content: space-between; +} +.tox .accessibility-issue__description > div { + padding-bottom: 4px; +} +.tox .accessibility-issue__description > div > div { + align-items: center; + display: flex; + margin-bottom: 4px; +} +.tox .accessibility-issue__description > *:last-child:not(:only-child) { + border-color: #cccccc; + border-style: solid; +} +.tox .accessibility-issue__repair { + margin-top: 16px; +} +.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description { + background-color: rgba(32, 122, 183, 0.1); + border-color: rgba(32, 122, 183, 0.4); + color: #222f3e; +} +.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description > *:last-child { + border-color: rgba(32, 122, 183, 0.4); +} +.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2 { + color: #207ab7; +} +.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg { + fill: #207ab7; +} +.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon { + color: #207ab7; +} +.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description { + background-color: rgba(255, 165, 0, 0.1); + border-color: rgba(255, 165, 0, 0.5); + color: #222f3e; +} +.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description > *:last-child { + border-color: rgba(255, 165, 0, 0.5); +} +.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2 { + color: #cc8500; +} +.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg { + fill: #cc8500; +} +.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon { + color: #cc8500; +} +.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description { + background-color: rgba(204, 0, 0, 0.1); + border-color: rgba(204, 0, 0, 0.4); + color: #222f3e; +} +.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description > *:last-child { + border-color: rgba(204, 0, 0, 0.4); +} +.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2 { + color: #c00; +} +.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg { + fill: #c00; +} +.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon { + color: #c00; +} +.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description { + background-color: rgba(120, 171, 70, 0.1); + border-color: rgba(120, 171, 70, 0.4); + color: #222f3e; +} +.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description > *:last-child { + border-color: rgba(120, 171, 70, 0.4); +} +.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2 { + color: #78AB46; +} +.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg { + fill: #78AB46; +} +.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon { + color: #78AB46; +} +.tox .tox-dialog__body-content .accessibility-issue__header h1, +.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2 { + margin-top: 0; +} +.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button { + margin-left: 4px; +} +.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) { + margin-left: auto; +} +.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description { + padding: 4px 4px 4px 8px; +} +.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description > *:last-child { + border-left-width: 1px; + padding-left: 4px; +} +.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button { + margin-right: 4px; +} +.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) { + margin-right: auto; +} +.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description { + padding: 4px 8px 4px 4px; +} +.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description > *:last-child { + border-right-width: 1px; + padding-right: 4px; +} +.tox .tox-anchorbar { + display: flex; + flex: 0 0 auto; +} +.tox .tox-bar { + display: flex; + flex: 0 0 auto; +} +.tox .tox-button { + background-color: #207ab7; + background-image: none; + background-position: 0 0; + background-repeat: repeat; + border-color: #207ab7; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #fff; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 14px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + line-height: 24px; + margin: 0; + outline: none; + padding: 4px 16px; + text-align: center; + text-decoration: none; + text-transform: none; + white-space: nowrap; +} +.tox .tox-button[disabled] { + background-color: #207ab7; + background-image: none; + border-color: #207ab7; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} +.tox .tox-button:focus:not(:disabled) { + background-color: #1c6ca1; + background-image: none; + border-color: #1c6ca1; + box-shadow: none; + color: #fff; +} +.tox .tox-button:hover:not(:disabled) { + background-color: #1c6ca1; + background-image: none; + border-color: #1c6ca1; + box-shadow: none; + color: #fff; +} +.tox .tox-button:active:not(:disabled) { + background-color: #185d8c; + background-image: none; + border-color: #185d8c; + box-shadow: none; + color: #fff; +} +.tox .tox-button--secondary { + background-color: #f0f0f0; + background-image: none; + background-position: 0 0; + background-repeat: repeat; + border-color: #f0f0f0; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + color: #222f3e; + font-size: 14px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + outline: none; + padding: 4px 16px; + text-decoration: none; + text-transform: none; +} +.tox .tox-button--secondary[disabled] { + background-color: #f0f0f0; + background-image: none; + border-color: #f0f0f0; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); +} +.tox .tox-button--secondary:focus:not(:disabled) { + background-color: #e3e3e3; + background-image: none; + border-color: #e3e3e3; + box-shadow: none; + color: #222f3e; +} +.tox .tox-button--secondary:hover:not(:disabled) { + background-color: #e3e3e3; + background-image: none; + border-color: #e3e3e3; + box-shadow: none; + color: #222f3e; +} +.tox .tox-button--secondary:active:not(:disabled) { + background-color: #d6d6d6; + background-image: none; + border-color: #d6d6d6; + box-shadow: none; + color: #222f3e; +} +.tox .tox-button--icon, +.tox .tox-button.tox-button--icon, +.tox .tox-button.tox-button--secondary.tox-button--icon { + padding: 4px; +} +.tox .tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg { + display: block; + fill: currentColor; +} +.tox .tox-button-link { + background: 0; + border: none; + box-sizing: border-box; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 16px; + font-weight: normal; + line-height: 1.3; + margin: 0; + padding: 0; + white-space: nowrap; +} +.tox .tox-button-link--sm { + font-size: 14px; +} +.tox .tox-button--naked { + background-color: transparent; + border-color: transparent; + box-shadow: unset; + color: #222f3e; +} +.tox .tox-button--naked[disabled] { + background-color: #f0f0f0; + border-color: #f0f0f0; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); +} +.tox .tox-button--naked:hover:not(:disabled) { + background-color: #e3e3e3; + border-color: #e3e3e3; + box-shadow: none; + color: #222f3e; +} +.tox .tox-button--naked:focus:not(:disabled) { + background-color: #e3e3e3; + border-color: #e3e3e3; + box-shadow: none; + color: #222f3e; +} +.tox .tox-button--naked:active:not(:disabled) { + background-color: #d6d6d6; + border-color: #d6d6d6; + box-shadow: none; + color: #222f3e; +} +.tox .tox-button--naked .tox-icon svg { + fill: currentColor; +} +.tox .tox-button--naked.tox-button--icon:hover:not(:disabled) { + color: #222f3e; +} +.tox .tox-checkbox { + align-items: center; + border-radius: 3px; + cursor: pointer; + display: flex; + height: 36px; + min-width: 36px; +} +.tox .tox-checkbox__input { + /* Hide from view but visible to screen readers */ + height: 1px; + overflow: hidden; + position: absolute; + top: auto; + width: 1px; +} +.tox .tox-checkbox__icons { + align-items: center; + border-radius: 3px; + box-shadow: 0 0 0 2px transparent; + box-sizing: content-box; + display: flex; + height: 24px; + justify-content: center; + padding: calc(4px - 1px); + width: 24px; +} +.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: block; + fill: rgba(34, 47, 62, 0.3); +} +.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: none; + fill: #207ab7; +} +.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: none; + fill: #207ab7; +} +.tox .tox-checkbox--disabled { + color: rgba(34, 47, 62, 0.5); + cursor: not-allowed; +} +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg { + fill: rgba(34, 47, 62, 0.5); +} +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + fill: rgba(34, 47, 62, 0.5); +} +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + fill: rgba(34, 47, 62, 0.5); +} +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: block; +} +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: block; +} +.tox input.tox-checkbox__input:focus + .tox-checkbox__icons { + border-radius: 3px; + box-shadow: inset 0 0 0 1px #207ab7; + padding: calc(4px - 1px); +} +.tox:not([dir=rtl]) .tox-checkbox__label { + margin-left: 4px; +} +.tox:not([dir=rtl]) .tox-checkbox__input { + left: -10000px; +} +.tox:not([dir=rtl]) .tox-bar .tox-checkbox { + margin-left: 4px; +} +.tox[dir=rtl] .tox-checkbox__label { + margin-right: 4px; +} +.tox[dir=rtl] .tox-checkbox__input { + right: -10000px; +} +.tox[dir=rtl] .tox-bar .tox-checkbox { + margin-right: 4px; +} +.tox { + /* stylelint-disable-next-line no-descending-specificity */ +} +.tox .tox-collection--toolbar .tox-collection__group { + display: flex; + padding: 0; +} +.tox .tox-collection--grid .tox-collection__group { + display: flex; + flex-wrap: wrap; + max-height: 208px; + overflow-x: hidden; + overflow-y: auto; + padding: 0; +} +.tox .tox-collection--list .tox-collection__group { + border-bottom-width: 0; + border-color: #cccccc; + border-left-width: 0; + border-right-width: 0; + border-style: solid; + border-top-width: 1px; + padding: 4px 0; +} +.tox .tox-collection--list .tox-collection__group:first-child { + border-top-width: 0; +} +.tox .tox-collection__group-heading { + background-color: #e6e6e6; + color: rgba(34, 47, 62, 0.7); + cursor: default; + font-size: 12px; + font-style: normal; + font-weight: normal; + margin-bottom: 4px; + margin-top: -4px; + padding: 4px 8px; + text-transform: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.tox .tox-collection__item { + align-items: center; + color: #222f3e; + cursor: pointer; + display: flex; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.tox .tox-collection--list .tox-collection__item { + padding: 4px 8px; +} +.tox .tox-collection--toolbar .tox-collection__item { + border-radius: 3px; + padding: 4px; +} +.tox .tox-collection--grid .tox-collection__item { + border-radius: 3px; + padding: 4px; +} +.tox .tox-collection--list .tox-collection__item--enabled { + background-color: #fff; + color: #222f3e; +} +.tox .tox-collection--list .tox-collection__item--active { + background-color: #dee0e2; +} +.tox .tox-collection--toolbar .tox-collection__item--enabled { + background-color: #c8cbcf; + color: #222f3e; +} +.tox .tox-collection--toolbar .tox-collection__item--active { + background-color: #dee0e2; +} +.tox .tox-collection--grid .tox-collection__item--enabled { + background-color: #c8cbcf; + color: #222f3e; +} +.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + background-color: #dee0e2; + color: #222f3e; +} +.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + color: #222f3e; +} +.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + color: #222f3e; +} +.tox .tox-collection__item--state-disabled { + background-color: transparent; + color: rgba(34, 47, 62, 0.5); + cursor: not-allowed; +} +.tox .tox-collection__item-icon, +.tox .tox-collection__item-checkmark { + align-items: center; + display: flex; + height: 24px; + justify-content: center; + width: 24px; +} +.tox .tox-collection__item-icon svg, +.tox .tox-collection__item-checkmark svg { + fill: currentColor; +} +.tox .tox-collection--toolbar-lg .tox-collection__item-icon { + height: 48px; + width: 48px; +} +.tox .tox-collection__item-label { + color: currentColor; + display: inline-block; + flex: 1; + -ms-flex-preferred-size: auto; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 24px; + text-transform: none; + word-break: break-all; +} +.tox .tox-collection__item-accessory { + color: rgba(34, 47, 62, 0.7); + display: inline-block; + font-size: 14px; + height: 24px; + line-height: 24px; + text-transform: none; +} +.tox .tox-collection__item-caret { + align-items: center; + display: flex; + min-height: 24px; +} +.tox .tox-collection__item-caret::after { + content: ''; + font-size: 0; + min-height: inherit; +} +.tox .tox-collection__item-caret svg { + fill: #222f3e; +} +.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg { + display: none; +} +.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory + .tox-collection__item-checkmark { + display: none; +} +.tox .tox-collection--horizontal { + background-color: #fff; + border: 1px solid #cccccc; + border-radius: 3px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: nowrap; + margin-bottom: 0; + overflow-x: auto; + padding: 0; +} +.tox .tox-collection--horizontal .tox-collection__group { + align-items: center; + display: flex; + flex-wrap: nowrap; + margin: 0; + padding: 0 4px; +} +.tox .tox-collection--horizontal .tox-collection__item { + height: 34px; + margin: 2px 0 3px 0; + padding: 0 4px; +} +.tox .tox-collection--horizontal .tox-collection__item-label { + white-space: nowrap; +} +.tox .tox-collection--horizontal .tox-collection__item-caret { + margin-left: 4px; +} +.tox .tox-collection__item-container { + display: flex; +} +.tox .tox-collection__item-container--row { + align-items: center; + flex: 1 1 auto; + flex-direction: row; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--align-left { + margin-right: auto; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--align-right { + justify-content: flex-end; + margin-left: auto; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top { + align-items: flex-start; + margin-bottom: auto; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle { + align-items: center; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom { + align-items: flex-end; + margin-top: auto; +} +.tox .tox-collection__item-container--column { + -ms-grid-row-align: center; + align-self: center; + flex: 1 1 auto; + flex-direction: column; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--align-left { + align-items: flex-start; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--align-right { + align-items: flex-end; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top { + align-self: flex-start; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle { + -ms-grid-row-align: center; + align-self: center; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom { + align-self: flex-end; +} +.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type) { + border-right: 1px solid #cccccc; +} +.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item > *:not(:first-child) { + margin-left: 8px; +} +.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child { + margin-left: 4px; +} +.tox:not([dir=rtl]) .tox-collection__item-accessory { + margin-left: 16px; + text-align: right; +} +.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret { + margin-left: 16px; +} +.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type) { + border-left: 1px solid #cccccc; +} +.tox[dir=rtl] .tox-collection--list .tox-collection__item > *:not(:first-child) { + margin-right: 8px; +} +.tox[dir=rtl] .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child { + margin-right: 4px; +} +.tox[dir=rtl] .tox-collection__item-icon-rtl { + /* stylelint-disable-next-line no-descending-specificity */ +} +.tox[dir=rtl] .tox-collection__item-icon-rtl .tox-collection__item-icon svg { + transform: rotateY(180deg); +} +.tox[dir=rtl] .tox-collection__item-accessory { + margin-right: 16px; + text-align: left; +} +.tox[dir=rtl] .tox-collection .tox-collection__item-caret { + margin-right: 16px; + transform: rotateY(180deg); +} +.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret { + margin-right: 4px; +} +.tox .tox-color-picker-container { + display: flex; + flex-direction: row; + height: 225px; + margin: 0; +} +.tox .tox-sv-palette { + box-sizing: border-box; + display: flex; + height: 100%; +} +.tox .tox-sv-palette-spectrum { + height: 100%; +} +.tox .tox-sv-palette, +.tox .tox-sv-palette-spectrum { + width: 225px; +} +.tox .tox-sv-palette-thumb { + background: none; + border: 1px solid black; + border-radius: 50%; + box-sizing: content-box; + height: 12px; + position: absolute; + width: 12px; +} +.tox .tox-sv-palette-inner-thumb { + border: 1px solid white; + border-radius: 50%; + height: 10px; + position: absolute; + width: 10px; +} +.tox .tox-hue-slider { + box-sizing: border-box; + height: 100%; + width: 25px; +} +.tox .tox-hue-slider-spectrum { + background: linear-gradient(to bottom, #f00, #ff0080, #f0f, #8000ff, #00f, #0080ff, #0ff, #00ff80, #0f0, #80ff00, #ff0, #ff8000, #f00); + height: 100%; + width: 100%; +} +.tox .tox-hue-slider, +.tox .tox-hue-slider-spectrum { + width: 20px; +} +.tox .tox-hue-slider-thumb { + background: white; + border: 1px solid black; + box-sizing: content-box; + height: 4px; + width: 100%; +} +.tox .tox-rgb-form { + display: flex; + flex-direction: column; + justify-content: space-between; +} +.tox .tox-rgb-form div { + align-items: center; + display: flex; + justify-content: space-between; + margin-bottom: 5px; + width: inherit; +} +.tox .tox-rgb-form input { + width: 6em; +} +.tox .tox-rgb-form input.tox-invalid { + /* Need !important to override Chrome's focus styling unfortunately */ + border: 1px solid red !important; +} +.tox .tox-rgb-form .tox-rgba-preview { + border: 1px solid black; + flex-grow: 2; + margin-bottom: 0; +} +.tox:not([dir=rtl]) .tox-sv-palette { + margin-right: 15px; +} +.tox:not([dir=rtl]) .tox-hue-slider { + margin-right: 15px; +} +.tox:not([dir=rtl]) .tox-hue-slider-thumb { + margin-left: -1px; +} +.tox:not([dir=rtl]) .tox-rgb-form label { + margin-right: 0.5em; +} +.tox[dir=rtl] .tox-sv-palette { + margin-left: 15px; +} +.tox[dir=rtl] .tox-hue-slider { + margin-left: 15px; +} +.tox[dir=rtl] .tox-hue-slider-thumb { + margin-right: -1px; +} +.tox[dir=rtl] .tox-rgb-form label { + margin-left: 0.5em; +} +.tox .tox-toolbar .tox-swatches, +.tox .tox-toolbar__primary .tox-swatches, +.tox .tox-toolbar__overflow .tox-swatches { + margin: 2px 0 3px 4px; +} +.tox .tox-collection--list .tox-collection__group .tox-swatches-menu { + border: 0; + margin: -4px 0; +} +.tox .tox-swatches__row { + display: flex; +} +.tox .tox-swatch { + height: 30px; + transition: transform 0.15s, box-shadow 0.15s; + width: 30px; +} +.tox .tox-swatch:hover, +.tox .tox-swatch:focus { + box-shadow: 0 0 0 1px rgba(127, 127, 127, 0.3) inset; + transform: scale(0.8); +} +.tox .tox-swatch--remove { + align-items: center; + display: flex; + justify-content: center; +} +.tox .tox-swatch--remove svg path { + stroke: #e74c3c; +} +.tox .tox-swatches__picker-btn { + align-items: center; + background-color: transparent; + border: 0; + cursor: pointer; + display: flex; + height: 30px; + justify-content: center; + outline: none; + padding: 0; + width: 30px; +} +.tox .tox-swatches__picker-btn svg { + height: 24px; + width: 24px; +} +.tox .tox-swatches__picker-btn:hover { + background: #dee0e2; +} +.tox:not([dir=rtl]) .tox-swatches__picker-btn { + margin-left: auto; +} +.tox[dir=rtl] .tox-swatches__picker-btn { + margin-right: auto; +} +.tox .tox-comment-thread { + background: #fff; + position: relative; +} +.tox .tox-comment-thread > *:not(:first-child) { + margin-top: 8px; +} +.tox .tox-comment { + background: #fff; + border: 1px solid #cccccc; + border-radius: 3px; + box-shadow: 0 4px 8px 0 rgba(34, 47, 62, 0.1); + padding: 8px 8px 16px 8px; + position: relative; +} +.tox .tox-comment__header { + align-items: center; + color: #222f3e; + display: flex; + justify-content: space-between; +} +.tox .tox-comment__date { + color: rgba(34, 47, 62, 0.7); + font-size: 12px; +} +.tox .tox-comment__body { + color: #222f3e; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + margin-top: 8px; + position: relative; + text-transform: initial; +} +.tox .tox-comment__body textarea { + resize: none; + white-space: normal; + width: 100%; +} +.tox .tox-comment__expander { + padding-top: 8px; +} +.tox .tox-comment__expander p { + color: rgba(34, 47, 62, 0.7); + font-size: 14px; + font-style: normal; +} +.tox .tox-comment__body p { + margin: 0; +} +.tox .tox-comment__buttonspacing { + padding-top: 16px; + text-align: center; +} +.tox .tox-comment-thread__overlay::after { + background: #fff; + bottom: 0; + content: ""; + display: flex; + left: 0; + opacity: 0.9; + position: absolute; + right: 0; + top: 0; + z-index: 5; +} +.tox .tox-comment__reply { + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + justify-content: flex-end; + margin-top: 8px; +} +.tox .tox-comment__reply > *:first-child { + margin-bottom: 8px; + width: 100%; +} +.tox .tox-comment__edit { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + margin-top: 16px; +} +.tox .tox-comment__gradient::after { + background: linear-gradient(rgba(255, 255, 255, 0), #fff); + bottom: 0; + content: ""; + display: block; + height: 5em; + margin-top: -40px; + position: absolute; + width: 100%; +} +.tox .tox-comment__overlay { + background: #fff; + bottom: 0; + display: flex; + flex-direction: column; + flex-grow: 1; + left: 0; + opacity: 0.9; + position: absolute; + right: 0; + text-align: center; + top: 0; + z-index: 5; +} +.tox .tox-comment__loading-text { + align-items: center; + color: #222f3e; + display: flex; + flex-direction: column; + position: relative; +} +.tox .tox-comment__loading-text > div { + padding-bottom: 16px; +} +.tox .tox-comment__overlaytext { + bottom: 0; + flex-direction: column; + font-size: 14px; + left: 0; + padding: 1em; + position: absolute; + right: 0; + top: 0; + z-index: 10; +} +.tox .tox-comment__overlaytext p { + background-color: #fff; + box-shadow: 0 0 8px 8px #fff; + color: #222f3e; + text-align: center; +} +.tox .tox-comment__overlaytext div:nth-of-type(2) { + font-size: 0.8em; +} +.tox .tox-comment__busy-spinner { + align-items: center; + background-color: #fff; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 20; +} +.tox .tox-comment__scroll { + display: flex; + flex-direction: column; + flex-shrink: 1; + overflow: auto; +} +.tox .tox-conversations { + margin: 8px; +} +.tox:not([dir=rtl]) .tox-comment__edit { + margin-left: 8px; +} +.tox:not([dir=rtl]) .tox-comment__buttonspacing > *:last-child, +.tox:not([dir=rtl]) .tox-comment__edit > *:last-child, +.tox:not([dir=rtl]) .tox-comment__reply > *:last-child { + margin-left: 8px; +} +.tox[dir=rtl] .tox-comment__edit { + margin-right: 8px; +} +.tox[dir=rtl] .tox-comment__buttonspacing > *:last-child, +.tox[dir=rtl] .tox-comment__edit > *:last-child, +.tox[dir=rtl] .tox-comment__reply > *:last-child { + margin-right: 8px; +} +.tox .tox-user { + align-items: center; + display: flex; +} +.tox .tox-user__avatar svg { + fill: rgba(34, 47, 62, 0.7); +} +.tox .tox-user__name { + color: rgba(34, 47, 62, 0.7); + font-size: 12px; + font-style: normal; + font-weight: bold; + text-transform: uppercase; +} +.tox:not([dir=rtl]) .tox-user__avatar svg { + margin-right: 8px; +} +.tox:not([dir=rtl]) .tox-user__avatar + .tox-user__name { + margin-left: 8px; +} +.tox[dir=rtl] .tox-user__avatar svg { + margin-left: 8px; +} +.tox[dir=rtl] .tox-user__avatar + .tox-user__name { + margin-right: 8px; +} +.tox .tox-dialog-wrap { + align-items: center; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: fixed; + right: 0; + top: 0; + z-index: 1100; +} +.tox .tox-dialog-wrap__backdrop { + background-color: rgba(255, 255, 255, 0.75); + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 1; +} +.tox .tox-dialog-wrap__backdrop--opaque { + background-color: #fff; +} +.tox .tox-dialog { + background-color: #fff; + border-color: #cccccc; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: 0 16px 16px -10px rgba(34, 47, 62, 0.15), 0 0 40px 1px rgba(34, 47, 62, 0.15); + display: flex; + flex-direction: column; + max-height: 100%; + max-width: 480px; + overflow: hidden; + position: relative; + width: 95vw; + z-index: 2; +} +@media only screen and (max-width:767px) { + body:not(.tox-force-desktop) .tox .tox-dialog { + align-self: flex-start; + margin: 8px auto; + width: calc(100vw - 16px); + } +} +.tox .tox-dialog-inline { + z-index: 1100; +} +.tox .tox-dialog__header { + align-items: center; + background-color: #fff; + border-bottom: none; + color: #222f3e; + display: flex; + font-size: 16px; + justify-content: space-between; + padding: 8px 16px 0 16px; + position: relative; +} +.tox .tox-dialog__header .tox-button { + z-index: 1; +} +.tox .tox-dialog__draghandle { + cursor: grab; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.tox .tox-dialog__draghandle:active { + cursor: grabbing; +} +.tox .tox-dialog__dismiss { + margin-left: auto; +} +.tox .tox-dialog__title { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 20px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + margin: 0; + text-transform: none; +} +.tox .tox-dialog__body { + color: #222f3e; + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; + font-size: 16px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + min-width: 0; + text-align: left; + text-transform: none; +} +@media only screen and (max-width:767px) { + body:not(.tox-force-desktop) .tox .tox-dialog__body { + flex-direction: column; + } +} +.tox .tox-dialog__body-nav { + align-items: flex-start; + display: flex; + flex-direction: column; + padding: 16px 16px; +} +@media only screen and (max-width:767px) { + body:not(.tox-force-desktop) .tox .tox-dialog__body-nav { + flex-direction: row; + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding-bottom: 0; + } +} +.tox .tox-dialog__body-nav-item { + border-bottom: 2px solid transparent; + color: rgba(34, 47, 62, 0.7); + display: inline-block; + font-size: 14px; + line-height: 1.3; + margin-bottom: 8px; + text-decoration: none; + white-space: nowrap; +} +.tox .tox-dialog__body-nav-item:focus { + background-color: rgba(32, 122, 183, 0.1); +} +.tox .tox-dialog__body-nav-item--active { + border-bottom: 2px solid #207ab7; + color: #207ab7; +} +.tox .tox-dialog__body-content { + box-sizing: border-box; + display: flex; + flex: 1; + flex-direction: column; + -ms-flex-preferred-size: auto; + max-height: 650px; + overflow: auto; + -webkit-overflow-scrolling: touch; + padding: 16px 16px; +} +.tox .tox-dialog__body-content > * { + margin-bottom: 0; + margin-top: 16px; +} +.tox .tox-dialog__body-content > *:first-child { + margin-top: 0; +} +.tox .tox-dialog__body-content > *:last-child { + margin-bottom: 0; +} +.tox .tox-dialog__body-content > *:only-child { + margin-bottom: 0; + margin-top: 0; +} +.tox .tox-dialog__body-content a { + color: #207ab7; + cursor: pointer; + text-decoration: none; +} +.tox .tox-dialog__body-content a:hover, +.tox .tox-dialog__body-content a:focus { + color: #185d8c; + text-decoration: none; +} +.tox .tox-dialog__body-content a:active { + color: #185d8c; + text-decoration: none; +} +.tox .tox-dialog__body-content svg { + fill: #222f3e; +} +.tox .tox-dialog__body-content ul { + display: block; + list-style-type: disc; + margin-bottom: 16px; + -webkit-margin-end: 0; + margin-inline-end: 0; + -webkit-margin-start: 0; + margin-inline-start: 0; + -webkit-padding-start: 2.5rem; + padding-inline-start: 2.5rem; +} +.tox .tox-dialog__body-content .tox-form__group h1 { + color: #222f3e; + font-size: 20px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + margin-bottom: 16px; + margin-top: 2rem; + text-transform: none; +} +.tox .tox-dialog__body-content .tox-form__group h2 { + color: #222f3e; + font-size: 16px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + margin-bottom: 16px; + margin-top: 2rem; + text-transform: none; +} +.tox .tox-dialog__body-content .tox-form__group p { + margin-bottom: 16px; +} +.tox .tox-dialog__body-content .tox-form__group h1:first-child, +.tox .tox-dialog__body-content .tox-form__group h2:first-child, +.tox .tox-dialog__body-content .tox-form__group p:first-child { + margin-top: 0; +} +.tox .tox-dialog__body-content .tox-form__group h1:last-child, +.tox .tox-dialog__body-content .tox-form__group h2:last-child, +.tox .tox-dialog__body-content .tox-form__group p:last-child { + margin-bottom: 0; +} +.tox .tox-dialog__body-content .tox-form__group h1:only-child, +.tox .tox-dialog__body-content .tox-form__group h2:only-child, +.tox .tox-dialog__body-content .tox-form__group p:only-child { + margin-bottom: 0; + margin-top: 0; +} +.tox .tox-dialog--width-lg { + height: 650px; + max-width: 1200px; +} +.tox .tox-dialog--width-md { + max-width: 800px; +} +.tox .tox-dialog--width-md .tox-dialog__body-content { + overflow: auto; +} +.tox .tox-dialog__body-content--centered { + text-align: center; +} +.tox .tox-dialog__footer { + align-items: center; + background-color: #fff; + border-top: 1px solid #cccccc; + display: flex; + justify-content: space-between; + padding: 8px 16px; +} +.tox .tox-dialog__footer-start, +.tox .tox-dialog__footer-end { + display: flex; +} +.tox .tox-dialog__busy-spinner { + align-items: center; + background-color: rgba(255, 255, 255, 0.75); + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 3; +} +.tox .tox-dialog__table { + border-collapse: collapse; + width: 100%; +} +.tox .tox-dialog__table thead th { + font-weight: bold; + padding-bottom: 8px; +} +.tox .tox-dialog__table tbody tr { + border-bottom: 1px solid #cccccc; +} +.tox .tox-dialog__table tbody tr:last-child { + border-bottom: none; +} +.tox .tox-dialog__table td { + padding-bottom: 8px; + padding-top: 8px; +} +.tox .tox-dialog__popups { + position: absolute; + width: 100%; + z-index: 1100; +} +.tox .tox-dialog__body-iframe { + display: flex; + flex: 1; + flex-direction: column; + -ms-flex-preferred-size: auto; +} +.tox .tox-dialog__body-iframe .tox-navobj { + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2) { + flex: 1; + -ms-flex-preferred-size: auto; + height: 100%; +} +.tox .tox-dialog-dock-fadeout { + opacity: 0; + visibility: hidden; +} +.tox .tox-dialog-dock-fadein { + opacity: 1; + visibility: visible; +} +.tox .tox-dialog-dock-transition { + transition: visibility 0s linear 0.3s, opacity 0.3s ease; +} +.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein { + transition-delay: 0s; +} +.tox.tox-platform-ie { + /* IE11 CSS styles go here */ +} +.tox.tox-platform-ie .tox-dialog-wrap { + position: -ms-device-fixed; +} +@media only screen and (max-width:767px) { + body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav { + margin-right: 0; + } +} +@media only screen and (max-width:767px) { + body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child) { + margin-left: 8px; + } +} +.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start > *, +.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end > * { + margin-left: 8px; +} +.tox[dir=rtl] .tox-dialog__body { + text-align: right; +} +@media only screen and (max-width:767px) { + body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav { + margin-left: 0; + } +} +@media only screen and (max-width:767px) { + body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child) { + margin-right: 8px; + } +} +.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start > *, +.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end > * { + margin-right: 8px; +} +body.tox-dialog__disable-scroll { + overflow: hidden; +} +.tox .tox-dropzone-container { + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-dropzone { + align-items: center; + background: #fff; + border: 2px dashed #cccccc; + box-sizing: border-box; + display: flex; + flex-direction: column; + flex-grow: 1; + justify-content: center; + min-height: 100px; + padding: 10px; +} +.tox .tox-dropzone p { + color: rgba(34, 47, 62, 0.7); + margin: 0 0 16px 0; +} +.tox .tox-edit-area { + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; + overflow: hidden; + position: relative; +} +.tox .tox-edit-area__iframe { + background-color: #fff; + border: 0; + box-sizing: border-box; + flex: 1; + -ms-flex-preferred-size: auto; + height: 100%; + position: absolute; + width: 100%; +} +.tox.tox-inline-edit-area { + border: 1px dotted #cccccc; +} +.tox .tox-editor-container { + display: flex; + flex: 1 1 auto; + flex-direction: column; + overflow: hidden; +} +.tox .tox-editor-header { + z-index: 1; +} +.tox:not(.tox-tinymce-inline) .tox-editor-header { + box-shadow: none; + transition: box-shadow 0.5s; +} +.tox.tox-tinymce--toolbar-bottom .tox-editor-header, +.tox.tox-tinymce-inline .tox-editor-header { + margin-bottom: -1px; +} +.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header { + background-color: transparent; + box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25); +} +.tox-editor-dock-fadeout { + opacity: 0; + visibility: hidden; +} +.tox-editor-dock-fadein { + opacity: 1; + visibility: visible; +} +.tox-editor-dock-transition { + transition: visibility 0s linear 0.25s, opacity 0.25s ease; +} +.tox-editor-dock-transition.tox-editor-dock-fadein { + transition-delay: 0s; +} +.tox .tox-control-wrap { + flex: 1; + position: relative; +} +.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid, +.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown, +.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid { + display: none; +} +.tox .tox-control-wrap svg { + display: block; +} +.tox .tox-control-wrap__status-icon-wrap { + position: absolute; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-control-wrap__status-icon-invalid svg { + fill: #c00; +} +.tox .tox-control-wrap__status-icon-unknown svg { + fill: orange; +} +.tox .tox-control-wrap__status-icon-valid svg { + fill: green; +} +.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield, +.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield, +.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield { + padding-right: 32px; +} +.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap { + right: 4px; +} +.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield, +.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield, +.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield { + padding-left: 32px; +} +.tox[dir=rtl] .tox-control-wrap__status-icon-wrap { + left: 4px; +} +.tox .tox-autocompleter { + max-width: 25em; +} +.tox .tox-autocompleter .tox-menu { + max-width: 25em; +} +.tox .tox-autocompleter .tox-autocompleter-highlight { + font-weight: bold; +} +.tox .tox-color-input { + display: flex; + position: relative; + z-index: 1; +} +.tox .tox-color-input .tox-textfield { + z-index: -1; +} +.tox .tox-color-input span { + border-color: rgba(34, 47, 62, 0.2); + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + height: 24px; + position: absolute; + top: 6px; + width: 24px; +} +.tox .tox-color-input span:hover:not([aria-disabled=true]), +.tox .tox-color-input span:focus:not([aria-disabled=true]) { + border-color: #207ab7; + cursor: pointer; +} +.tox .tox-color-input span::before { + background-image: linear-gradient(45deg, rgba(0, 0, 0, 0.25) 25%, transparent 25%), linear-gradient(-45deg, rgba(0, 0, 0, 0.25) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, rgba(0, 0, 0, 0.25) 75%), linear-gradient(-45deg, transparent 75%, rgba(0, 0, 0, 0.25) 75%); + background-position: 0 0, 0 6px, 6px -6px, -6px 0; + background-size: 12px 12px; + border: 1px solid #fff; + border-radius: 3px; + box-sizing: border-box; + content: ''; + height: 24px; + left: -1px; + position: absolute; + top: -1px; + width: 24px; + z-index: -1; +} +.tox .tox-color-input span[aria-disabled=true] { + cursor: not-allowed; +} +.tox:not([dir=rtl]) .tox-color-input { + /* stylelint-disable-next-line no-descending-specificity */ +} +.tox:not([dir=rtl]) .tox-color-input .tox-textfield { + padding-left: 36px; +} +.tox:not([dir=rtl]) .tox-color-input span { + left: 6px; +} +.tox[dir="rtl"] .tox-color-input { + /* stylelint-disable-next-line no-descending-specificity */ +} +.tox[dir="rtl"] .tox-color-input .tox-textfield { + padding-right: 36px; +} +.tox[dir="rtl"] .tox-color-input span { + right: 6px; +} +.tox .tox-label, +.tox .tox-toolbar-label { + color: rgba(34, 47, 62, 0.7); + display: block; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + padding: 0 8px 0 0; + text-transform: none; + white-space: nowrap; +} +.tox .tox-toolbar-label { + padding: 0 8px; +} +.tox[dir=rtl] .tox-label { + padding: 0 0 0 8px; +} +.tox .tox-form { + display: flex; + flex: 1; + flex-direction: column; + -ms-flex-preferred-size: auto; +} +.tox .tox-form__group { + box-sizing: border-box; + margin-bottom: 4px; +} +.tox .tox-form-group--maximize { + flex: 1; +} +.tox .tox-form__group--error { + color: #c00; +} +.tox .tox-form__group--collection { + display: flex; +} +.tox .tox-form__grid { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-between; +} +.tox .tox-form__grid--2col > .tox-form__group { + width: calc(50% - (8px / 2)); +} +.tox .tox-form__grid--3col > .tox-form__group { + width: calc(100% / 3 - (8px / 2)); +} +.tox .tox-form__grid--4col > .tox-form__group { + width: calc(25% - (8px / 2)); +} +.tox .tox-form__controls-h-stack { + align-items: center; + display: flex; +} +.tox .tox-form__group--inline { + align-items: center; + display: flex; +} +.tox .tox-form__group--stretched { + display: flex; + flex: 1; + flex-direction: column; + -ms-flex-preferred-size: auto; +} +.tox .tox-form__group--stretched .tox-textarea { + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-form__group--stretched .tox-navobj { + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-form__group--stretched .tox-navobj :nth-child(2) { + flex: 1; + -ms-flex-preferred-size: auto; + height: 100%; +} +.tox:not([dir=rtl]) .tox-form__controls-h-stack > *:not(:first-child) { + margin-left: 4px; +} +.tox[dir=rtl] .tox-form__controls-h-stack > *:not(:first-child) { + margin-right: 4px; +} +.tox .tox-lock.tox-locked .tox-lock-icon__unlock, +.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock { + display: none; +} +.tox .tox-textfield, +.tox .tox-toolbar-textfield, +.tox .tox-listboxfield .tox-listbox--select, +.tox .tox-textarea { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #fff; + border-color: #cccccc; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #222f3e; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 16px; + line-height: 24px; + margin: 0; + min-height: 34px; + outline: none; + padding: 5px 4.75px; + resize: none; + width: 100%; +} +.tox .tox-textfield[disabled], +.tox .tox-textarea[disabled] { + background-color: #f2f2f2; + color: rgba(34, 47, 62, 0.85); + cursor: not-allowed; +} +.tox .tox-textfield:focus, +.tox .tox-listboxfield .tox-listbox--select:focus, +.tox .tox-textarea:focus { + background-color: #fff; + border-color: #207ab7; + box-shadow: none; + outline: none; +} +.tox .tox-toolbar-textfield { + border-width: 0; + margin-bottom: 3px; + margin-top: 2px; + max-width: 250px; +} +.tox .tox-naked-btn { + background-color: transparent; + border: 0; + border-color: transparent; + box-shadow: unset; + color: #207ab7; + cursor: pointer; + display: block; + margin: 0; + padding: 0; +} +.tox .tox-naked-btn svg { + display: block; + fill: #222f3e; +} +.tox:not([dir=rtl]) .tox-toolbar-textfield + * { + margin-left: 4px; +} +.tox[dir=rtl] .tox-toolbar-textfield + * { + margin-right: 4px; +} +.tox .tox-listboxfield { + cursor: pointer; + position: relative; +} +.tox .tox-listboxfield .tox-listbox--select[disabled] { + background-color: #f2f2f2; + color: rgba(34, 47, 62, 0.85); + cursor: not-allowed; +} +.tox .tox-listbox__select-label { + cursor: default; + flex: 1; + margin: 0 4px; +} +.tox .tox-listbox__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; +} +.tox .tox-listbox__select-chevron svg { + fill: #222f3e; +} +.tox .tox-listboxfield .tox-listbox--select { + align-items: center; + display: flex; +} +.tox:not([dir=rtl]) .tox-listboxfield svg { + right: 8px; +} +.tox[dir=rtl] .tox-listboxfield svg { + left: 8px; +} +.tox .tox-selectfield { + cursor: pointer; + position: relative; +} +.tox .tox-selectfield select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #fff; + border-color: #cccccc; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #222f3e; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 16px; + line-height: 24px; + margin: 0; + min-height: 34px; + outline: none; + padding: 5px 4.75px; + resize: none; + width: 100%; +} +.tox .tox-selectfield select[disabled] { + background-color: #f2f2f2; + color: rgba(34, 47, 62, 0.85); + cursor: not-allowed; +} +.tox .tox-selectfield select::-ms-expand { + display: none; +} +.tox .tox-selectfield select:focus { + background-color: #fff; + border-color: #207ab7; + box-shadow: none; + outline: none; +} +.tox .tox-selectfield svg { + pointer-events: none; + position: absolute; + top: 50%; + transform: translateY(-50%); +} +.tox:not([dir=rtl]) .tox-selectfield select[size="0"], +.tox:not([dir=rtl]) .tox-selectfield select[size="1"] { + padding-right: 24px; +} +.tox:not([dir=rtl]) .tox-selectfield svg { + right: 8px; +} +.tox[dir=rtl] .tox-selectfield select[size="0"], +.tox[dir=rtl] .tox-selectfield select[size="1"] { + padding-left: 24px; +} +.tox[dir=rtl] .tox-selectfield svg { + left: 8px; +} +.tox .tox-textarea { + -webkit-appearance: textarea; + -moz-appearance: textarea; + appearance: textarea; + white-space: pre-wrap; +} +.tox-fullscreen { + border: 0; + height: 100%; + left: 0; + margin: 0; + overflow: hidden; + -ms-scroll-chaining: none; + overscroll-behavior: none; + padding: 0; + position: fixed; + top: 0; + touch-action: pinch-zoom; + width: 100%; +} +.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle { + display: none; +} +.tox.tox-tinymce.tox-fullscreen { + background-color: transparent; + z-index: 1200; +} +.tox-shadowhost.tox-fullscreen { + z-index: 1200; +} +.tox-fullscreen .tox.tox-tinymce-aux, +.tox-fullscreen ~ .tox.tox-tinymce-aux { + z-index: 1201; +} +.tox .tox-help__more-link { + list-style: none; + margin-top: 1em; +} +.tox .tox-image-tools { + width: 100%; +} +.tox .tox-image-tools__toolbar { + align-items: center; + display: flex; + justify-content: center; +} +.tox .tox-image-tools__image { + background-color: #666; + height: 380px; + overflow: auto; + position: relative; + width: 100%; +} +.tox .tox-image-tools__image, +.tox .tox-image-tools__image + .tox-image-tools__toolbar { + margin-top: 8px; +} +.tox .tox-image-tools__image-bg { + background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==); +} +.tox .tox-image-tools__toolbar > .tox-spacer { + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-croprect-block { + background: black; + filter: alpha(opacity=50); + opacity: 0.5; + position: absolute; + zoom: 1; +} +.tox .tox-croprect-handle { + border: 2px solid white; + height: 20px; + left: 0; + position: absolute; + top: 0; + width: 20px; +} +.tox .tox-croprect-handle-move { + border: 0; + cursor: move; + position: absolute; +} +.tox .tox-croprect-handle-nw { + border-width: 2px 0 0 2px; + cursor: nw-resize; + left: 100px; + margin: -2px 0 0 -2px; + top: 100px; +} +.tox .tox-croprect-handle-ne { + border-width: 2px 2px 0 0; + cursor: ne-resize; + left: 200px; + margin: -2px 0 0 -20px; + top: 100px; +} +.tox .tox-croprect-handle-sw { + border-width: 0 0 2px 2px; + cursor: sw-resize; + left: 100px; + margin: -20px 2px 0 -2px; + top: 200px; +} +.tox .tox-croprect-handle-se { + border-width: 0 2px 2px 0; + cursor: se-resize; + left: 200px; + margin: -20px 0 0 -20px; + top: 200px; +} +.tox:not([dir=rtl]) .tox-image-tools__toolbar > .tox-slider:not(:first-of-type) { + margin-left: 8px; +} +.tox:not([dir=rtl]) .tox-image-tools__toolbar > .tox-button + .tox-slider { + margin-left: 32px; +} +.tox:not([dir=rtl]) .tox-image-tools__toolbar > .tox-slider + .tox-button { + margin-left: 32px; +} +.tox[dir=rtl] .tox-image-tools__toolbar > .tox-slider:not(:first-of-type) { + margin-right: 8px; +} +.tox[dir=rtl] .tox-image-tools__toolbar > .tox-button + .tox-slider { + margin-right: 32px; +} +.tox[dir=rtl] .tox-image-tools__toolbar > .tox-slider + .tox-button { + margin-right: 32px; +} +.tox .tox-insert-table-picker { + display: flex; + flex-wrap: wrap; + width: 170px; +} +.tox .tox-insert-table-picker > div { + border-color: #cccccc; + border-style: solid; + border-width: 0 1px 1px 0; + box-sizing: border-box; + height: 17px; + width: 17px; +} +.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker { + margin: -4px 0; +} +.tox .tox-insert-table-picker .tox-insert-table-picker__selected { + background-color: rgba(32, 122, 183, 0.5); + border-color: rgba(32, 122, 183, 0.5); +} +.tox .tox-insert-table-picker__label { + color: rgba(34, 47, 62, 0.7); + display: block; + font-size: 14px; + padding: 4px; + text-align: center; + width: 100%; +} +.tox:not([dir=rtl]) { + /* stylelint-disable-next-line no-descending-specificity */ +} +.tox:not([dir=rtl]) .tox-insert-table-picker > div:nth-child(10n) { + border-right: 0; +} +.tox[dir=rtl] { + /* stylelint-disable-next-line no-descending-specificity */ +} +.tox[dir=rtl] .tox-insert-table-picker > div:nth-child(10n+1) { + border-right: 0; +} +.tox { + /* stylelint-disable */ + /* stylelint-enable */ +} +.tox .tox-menu { + background-color: #fff; + border: 1px solid #cccccc; + border-radius: 3px; + box-shadow: 0 4px 8px 0 rgba(34, 47, 62, 0.1); + display: inline-block; + overflow: hidden; + vertical-align: top; + z-index: 1150; +} +.tox .tox-menu.tox-collection.tox-collection--list { + padding: 0; +} +.tox .tox-menu.tox-collection.tox-collection--toolbar { + padding: 4px; +} +.tox .tox-menu.tox-collection.tox-collection--grid { + padding: 4px; +} +.tox .tox-menu__label h1, +.tox .tox-menu__label h2, +.tox .tox-menu__label h3, +.tox .tox-menu__label h4, +.tox .tox-menu__label h5, +.tox .tox-menu__label h6, +.tox .tox-menu__label p, +.tox .tox-menu__label blockquote, +.tox .tox-menu__label code { + margin: 0; +} +.tox .tox-menubar { + background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff; + background-color: #fff; + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + padding: 0 4px 0 4px; +} +.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar { + border-top: 1px solid #cccccc; +} +/* Deprecated. Remove in next major release */ +.tox .tox-mbtn { + align-items: center; + background: transparent; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #222f3e; + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-style: normal; + font-weight: normal; + height: 34px; + justify-content: center; + margin: 2px 0 3px 0; + outline: none; + overflow: hidden; + padding: 0 4px; + text-transform: none; + width: auto; +} +.tox .tox-mbtn[disabled] { + background-color: transparent; + border: 0; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); + cursor: not-allowed; +} +.tox .tox-mbtn:focus:not(:disabled) { + background: #dee0e2; + border: 0; + box-shadow: none; + color: #222f3e; +} +.tox .tox-mbtn--active { + background: #c8cbcf; + border: 0; + box-shadow: none; + color: #222f3e; +} +.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active) { + background: #dee0e2; + border: 0; + box-shadow: none; + color: #222f3e; +} +.tox .tox-mbtn__select-label { + cursor: default; + font-weight: normal; + margin: 0 4px; +} +.tox .tox-mbtn[disabled] .tox-mbtn__select-label { + cursor: not-allowed; +} +.tox .tox-mbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; + display: none; +} +.tox .tox-notification { + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + display: -ms-grid; + display: grid; + font-size: 14px; + font-weight: normal; + -ms-grid-columns: minmax(40px, 1fr) auto minmax(40px, 1fr); + grid-template-columns: minmax(40px, 1fr) auto minmax(40px, 1fr); + margin-top: 4px; + opacity: 0; + padding: 4px; + transition: transform 100ms ease-in, opacity 150ms ease-in; +} +.tox .tox-notification p { + font-size: 14px; + font-weight: normal; +} +.tox .tox-notification a { + text-decoration: underline; +} +.tox .tox-notification--in { + opacity: 1; +} +.tox .tox-notification--success { + background-color: #e4eeda; + border-color: #d7e6c8; + color: #222f3e; +} +.tox .tox-notification--success p { + color: #222f3e; +} +.tox .tox-notification--success a { + color: #547831; +} +.tox .tox-notification--success svg { + fill: #222f3e; +} +.tox .tox-notification--error { + background-color: #f8dede; + border-color: #f2bfbf; + color: #222f3e; +} +.tox .tox-notification--error p { + color: #222f3e; +} +.tox .tox-notification--error a { + color: #c00; +} +.tox .tox-notification--error svg { + fill: #222f3e; +} +.tox .tox-notification--warn, +.tox .tox-notification--warning { + background-color: #fffaea; + border-color: #ffe89d; + color: #222f3e; +} +.tox .tox-notification--warn p, +.tox .tox-notification--warning p { + color: #222f3e; +} +.tox .tox-notification--warn a, +.tox .tox-notification--warning a { + color: #222f3e; +} +.tox .tox-notification--warn svg, +.tox .tox-notification--warning svg { + fill: #222f3e; +} +.tox .tox-notification--info { + background-color: #d9edf7; + border-color: #779ecb; + color: #222f3e; +} +.tox .tox-notification--info p { + color: #222f3e; +} +.tox .tox-notification--info a { + color: #222f3e; +} +.tox .tox-notification--info svg { + fill: #222f3e; +} +.tox .tox-notification__body { + -ms-grid-row-align: center; + align-self: center; + color: #222f3e; + font-size: 14px; + -ms-grid-column-span: 1; + grid-column-end: 3; + -ms-grid-column: 2; + grid-column-start: 2; + -ms-grid-row-span: 1; + grid-row-end: 2; + -ms-grid-row: 1; + grid-row-start: 1; + text-align: center; + white-space: normal; + word-break: break-all; + word-break: break-word; +} +.tox .tox-notification__body > * { + margin: 0; +} +.tox .tox-notification__body > * + * { + margin-top: 1rem; +} +.tox .tox-notification__icon { + -ms-grid-row-align: center; + align-self: center; + -ms-grid-column-span: 1; + grid-column-end: 2; + -ms-grid-column: 1; + grid-column-start: 1; + -ms-grid-row-span: 1; + grid-row-end: 2; + -ms-grid-row: 1; + grid-row-start: 1; + -ms-grid-column-align: end; + justify-self: end; +} +.tox .tox-notification__icon svg { + display: block; +} +.tox .tox-notification__dismiss { + -ms-grid-row-align: start; + align-self: start; + -ms-grid-column-span: 1; + grid-column-end: 4; + -ms-grid-column: 3; + grid-column-start: 3; + -ms-grid-row-span: 1; + grid-row-end: 2; + -ms-grid-row: 1; + grid-row-start: 1; + -ms-grid-column-align: end; + justify-self: end; +} +.tox .tox-notification .tox-progress-bar { + -ms-grid-column-span: 3; + grid-column-end: 4; + -ms-grid-column: 1; + grid-column-start: 1; + -ms-grid-row-span: 1; + grid-row-end: 3; + -ms-grid-row: 2; + grid-row-start: 2; + -ms-grid-column-align: center; + justify-self: center; +} +.tox .tox-pop { + display: inline-block; + position: relative; +} +.tox .tox-pop--resizing { + transition: width 0.1s ease; +} +.tox .tox-pop--resizing .tox-toolbar { + flex-wrap: nowrap; +} +.tox .tox-pop__dialog { + background-color: #fff; + border: 1px solid #cccccc; + border-radius: 3px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); + min-width: 0; + overflow: hidden; +} +.tox .tox-pop__dialog > *:not(.tox-toolbar) { + margin: 4px 4px 4px 8px; +} +.tox .tox-pop__dialog .tox-toolbar { + background-color: transparent; + margin-bottom: -1px; +} +.tox .tox-pop::before, +.tox .tox-pop::after { + border-style: solid; + content: ''; + display: block; + height: 0; + position: absolute; + width: 0; +} +.tox .tox-pop.tox-pop--bottom::before, +.tox .tox-pop.tox-pop--bottom::after { + left: 50%; + top: 100%; +} +.tox .tox-pop.tox-pop--bottom::after { + border-color: #fff transparent transparent transparent; + border-width: 8px; + margin-left: -8px; + margin-top: -1px; +} +.tox .tox-pop.tox-pop--bottom::before { + border-color: #cccccc transparent transparent transparent; + border-width: 9px; + margin-left: -9px; +} +.tox .tox-pop.tox-pop--top::before, +.tox .tox-pop.tox-pop--top::after { + left: 50%; + top: 0; + transform: translateY(-100%); +} +.tox .tox-pop.tox-pop--top::after { + border-color: transparent transparent #fff transparent; + border-width: 8px; + margin-left: -8px; + margin-top: 1px; +} +.tox .tox-pop.tox-pop--top::before { + border-color: transparent transparent #cccccc transparent; + border-width: 9px; + margin-left: -9px; +} +.tox .tox-pop.tox-pop--left::before, +.tox .tox-pop.tox-pop--left::after { + left: 0; + top: calc(50% - 1px); + transform: translateY(-50%); +} +.tox .tox-pop.tox-pop--left::after { + border-color: transparent #fff transparent transparent; + border-width: 8px; + margin-left: -15px; +} +.tox .tox-pop.tox-pop--left::before { + border-color: transparent #cccccc transparent transparent; + border-width: 10px; + margin-left: -19px; +} +.tox .tox-pop.tox-pop--right::before, +.tox .tox-pop.tox-pop--right::after { + left: 100%; + top: calc(50% + 1px); + transform: translateY(-50%); +} +.tox .tox-pop.tox-pop--right::after { + border-color: transparent transparent transparent #fff; + border-width: 8px; + margin-left: -1px; +} +.tox .tox-pop.tox-pop--right::before { + border-color: transparent transparent transparent #cccccc; + border-width: 10px; + margin-left: -1px; +} +.tox .tox-pop.tox-pop--align-left::before, +.tox .tox-pop.tox-pop--align-left::after { + left: 20px; +} +.tox .tox-pop.tox-pop--align-right::before, +.tox .tox-pop.tox-pop--align-right::after { + left: calc(100% - 20px); +} +.tox .tox-sidebar-wrap { + display: flex; + flex-direction: row; + flex-grow: 1; + -ms-flex-preferred-size: 0; + min-height: 0; +} +.tox .tox-sidebar { + background-color: #fff; + display: flex; + flex-direction: row; + justify-content: flex-end; +} +.tox .tox-sidebar__slider { + display: flex; + overflow: hidden; +} +.tox .tox-sidebar__pane-container { + display: flex; +} +.tox .tox-sidebar__pane { + display: flex; +} +.tox .tox-sidebar--sliding-closed { + opacity: 0; +} +.tox .tox-sidebar--sliding-open { + opacity: 1; +} +.tox .tox-sidebar--sliding-growing, +.tox .tox-sidebar--sliding-shrinking { + transition: width 0.5s ease, opacity 0.5s ease; +} +.tox .tox-selector { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + display: inline-block; + height: 10px; + position: absolute; + width: 10px; +} +.tox.tox-platform-touch .tox-selector { + height: 12px; + width: 12px; +} +.tox .tox-slider { + align-items: center; + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; + height: 24px; + justify-content: center; + position: relative; +} +.tox .tox-slider__rail { + background-color: transparent; + border: 1px solid #cccccc; + border-radius: 3px; + height: 10px; + min-width: 120px; + width: 100%; +} +.tox .tox-slider__handle { + background-color: #207ab7; + border: 2px solid #185d8c; + border-radius: 3px; + box-shadow: none; + height: 24px; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%); + width: 14px; +} +.tox .tox-source-code { + overflow: auto; +} +.tox .tox-spinner { + display: flex; +} +.tox .tox-spinner > div { + animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both; + background-color: rgba(34, 47, 62, 0.7); + border-radius: 100%; + height: 8px; + width: 8px; +} +.tox .tox-spinner > div:nth-child(1) { + animation-delay: -0.32s; +} +.tox .tox-spinner > div:nth-child(2) { + animation-delay: -0.16s; +} +@keyframes tam-bouncing-dots { + 0%, + 80%, + 100% { + transform: scale(0); + } + 40% { + transform: scale(1); + } +} +.tox:not([dir=rtl]) .tox-spinner > div:not(:first-child) { + margin-left: 4px; +} +.tox[dir=rtl] .tox-spinner > div:not(:first-child) { + margin-right: 4px; +} +.tox .tox-statusbar { + align-items: center; + background-color: #fff; + border-top: 1px solid #cccccc; + color: rgba(34, 47, 62, 0.7); + display: flex; + flex: 0 0 auto; + font-size: 12px; + font-weight: normal; + height: 18px; + overflow: hidden; + padding: 0 8px; + position: relative; + text-transform: uppercase; +} +.tox .tox-statusbar__text-container { + display: flex; + flex: 1 1 auto; + justify-content: flex-end; + overflow: hidden; +} +.tox .tox-statusbar__path { + display: flex; + flex: 1 1 auto; + margin-right: auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.tox .tox-statusbar__path > * { + display: inline; + white-space: nowrap; +} +.tox .tox-statusbar__wordcount { + flex: 0 0 auto; + margin-left: 1ch; +} +.tox .tox-statusbar a, +.tox .tox-statusbar__path-item, +.tox .tox-statusbar__wordcount { + color: rgba(34, 47, 62, 0.7); + text-decoration: none; +} +.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]), +.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]), +.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]), +.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]), +.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]), +.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]) { + cursor: pointer; + text-decoration: underline; +} +.tox .tox-statusbar__resize-handle { + align-items: flex-end; + align-self: stretch; + cursor: nwse-resize; + display: flex; + flex: 0 0 auto; + justify-content: flex-end; + margin-left: auto; + margin-right: -8px; + padding-left: 1ch; +} +.tox .tox-statusbar__resize-handle svg { + display: block; + fill: rgba(34, 47, 62, 0.7); +} +.tox .tox-statusbar__resize-handle:focus svg { + background-color: #dee0e2; + border-radius: 1px; + box-shadow: 0 0 0 2px #dee0e2; +} +.tox:not([dir=rtl]) .tox-statusbar__path > * { + margin-right: 4px; +} +.tox:not([dir=rtl]) .tox-statusbar__branding { + margin-left: 1ch; +} +.tox[dir=rtl] .tox-statusbar { + flex-direction: row-reverse; +} +.tox[dir=rtl] .tox-statusbar__path > * { + margin-left: 4px; +} +.tox .tox-throbber { + z-index: 1299; +} +.tox .tox-throbber__busy-spinner { + align-items: center; + background-color: rgba(255, 255, 255, 0.6); + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; +} +.tox .tox-tbtn { + align-items: center; + background: transparent; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #222f3e; + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-style: normal; + font-weight: normal; + height: 34px; + justify-content: center; + margin: 2px 0 3px 0; + outline: none; + overflow: hidden; + padding: 0; + text-transform: none; + width: 34px; +} +.tox .tox-tbtn svg { + display: block; + fill: #222f3e; +} +.tox .tox-tbtn.tox-tbtn-more { + padding-left: 5px; + padding-right: 5px; + width: inherit; +} +.tox .tox-tbtn:focus { + background: #dee0e2; + border: 0; + box-shadow: none; +} +.tox .tox-tbtn:hover { + background: #dee0e2; + border: 0; + box-shadow: none; + color: #222f3e; +} +.tox .tox-tbtn:hover svg { + fill: #222f3e; +} +.tox .tox-tbtn:active { + background: #c8cbcf; + border: 0; + box-shadow: none; + color: #222f3e; +} +.tox .tox-tbtn:active svg { + fill: #222f3e; +} +.tox .tox-tbtn--disabled, +.tox .tox-tbtn--disabled:hover, +.tox .tox-tbtn:disabled, +.tox .tox-tbtn:disabled:hover { + background: transparent; + border: 0; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); + cursor: not-allowed; +} +.tox .tox-tbtn--disabled svg, +.tox .tox-tbtn--disabled:hover svg, +.tox .tox-tbtn:disabled svg, +.tox .tox-tbtn:disabled:hover svg { + /* stylelint-disable-line no-descending-specificity */ + fill: rgba(34, 47, 62, 0.5); +} +.tox .tox-tbtn--enabled, +.tox .tox-tbtn--enabled:hover { + background: #c8cbcf; + border: 0; + box-shadow: none; + color: #222f3e; +} +.tox .tox-tbtn--enabled > *, +.tox .tox-tbtn--enabled:hover > * { + transform: none; +} +.tox .tox-tbtn--enabled svg, +.tox .tox-tbtn--enabled:hover svg { + /* stylelint-disable-line no-descending-specificity */ + fill: #222f3e; +} +.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) { + color: #222f3e; +} +.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg { + fill: #222f3e; +} +.tox .tox-tbtn:active > * { + transform: none; +} +.tox .tox-tbtn--md { + height: 51px; + width: 51px; +} +.tox .tox-tbtn--lg { + flex-direction: column; + height: 68px; + width: 68px; +} +.tox .tox-tbtn--return { + -ms-grid-row-align: stretch; + align-self: stretch; + height: unset; + width: 16px; +} +.tox .tox-tbtn--labeled { + padding: 0 4px; + width: unset; +} +.tox .tox-tbtn__vlabel { + display: block; + font-size: 10px; + font-weight: normal; + letter-spacing: -0.025em; + margin-bottom: 4px; + white-space: nowrap; +} +.tox .tox-tbtn--select { + margin: 2px 0 3px 0; + padding: 0 4px; + width: auto; +} +.tox .tox-tbtn__select-label { + cursor: default; + font-weight: normal; + margin: 0 4px; +} +.tox .tox-tbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; +} +.tox .tox-tbtn__select-chevron svg { + fill: rgba(34, 47, 62, 0.5); +} +.tox .tox-tbtn--bespoke .tox-tbtn__select-label { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 7em; +} +.tox .tox-split-button { + border: 0; + border-radius: 3px; + box-sizing: border-box; + display: flex; + margin: 2px 0 3px 0; + overflow: hidden; +} +.tox .tox-split-button:hover { + box-shadow: 0 0 0 1px #dee0e2 inset; +} +.tox .tox-split-button:focus { + background: #dee0e2; + box-shadow: none; + color: #222f3e; +} +.tox .tox-split-button > * { + border-radius: 0; +} +.tox .tox-split-button__chevron { + width: 16px; +} +.tox .tox-split-button__chevron svg { + fill: rgba(34, 47, 62, 0.5); +} +.tox .tox-split-button .tox-tbtn { + margin: 0; +} +.tox.tox-platform-touch .tox-split-button .tox-tbtn:first-child { + width: 30px; +} +.tox.tox-platform-touch .tox-split-button__chevron { + width: 20px; +} +.tox .tox-split-button.tox-tbtn--disabled:hover, +.tox .tox-split-button.tox-tbtn--disabled:focus, +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover, +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus { + background: transparent; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); +} +.tox .tox-toolbar-overlord { + background-color: #fff; +} +.tox .tox-toolbar, +.tox .tox-toolbar__primary, +.tox .tox-toolbar__overflow { + background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff; + background-color: #fff; + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + padding: 0 0; +} +.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed { + height: 0; + opacity: 0; + padding-bottom: 0; + padding-top: 0; + visibility: hidden; +} +.tox .tox-toolbar__overflow--growing { + transition: height 0.3s ease, opacity 0.2s linear 0.1s; +} +.tox .tox-toolbar__overflow--shrinking { + transition: opacity 0.3s ease, height 0.2s linear 0.1s, visibility 0s linear 0.3s; +} +.tox .tox-menubar + .tox-toolbar, +.tox .tox-menubar + .tox-toolbar-overlord .tox-toolbar__primary { + border-top: 1px solid #cccccc; + margin-top: -1px; +} +.tox .tox-toolbar--scrolling { + flex-wrap: nowrap; + overflow-x: auto; +} +.tox .tox-pop .tox-toolbar { + border-width: 0; +} +.tox .tox-toolbar--no-divider { + background-image: none; +} +.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child, +.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary { + border-top: 1px solid #cccccc; +} +.tox.tox-tinymce-aux .tox-toolbar__overflow { + background-color: #fff; + border: 1px solid #cccccc; + border-radius: 3px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); +} +.tox[dir=rtl] .tox-tbtn__icon-rtl svg { + transform: rotateY(180deg); +} +.tox .tox-toolbar__group { + align-items: center; + display: flex; + flex-wrap: wrap; + margin: 0 0; + padding: 0 4px 0 4px; +} +.tox .tox-toolbar__group--pull-right { + margin-left: auto; +} +.tox .tox-toolbar--scrolling .tox-toolbar__group { + flex-shrink: 0; + flex-wrap: nowrap; +} +.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type) { + border-right: 1px solid #cccccc; +} +.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type) { + border-left: 1px solid #cccccc; +} +.tox .tox-tooltip { + display: inline-block; + padding: 8px; + position: relative; +} +.tox .tox-tooltip__body { + background-color: #222f3e; + border-radius: 3px; + box-shadow: 0 2px 4px rgba(34, 47, 62, 0.3); + color: rgba(255, 255, 255, 0.75); + font-size: 14px; + font-style: normal; + font-weight: normal; + padding: 4px 8px; + text-transform: none; +} +.tox .tox-tooltip__arrow { + position: absolute; +} +.tox .tox-tooltip--down .tox-tooltip__arrow { + border-left: 8px solid transparent; + border-right: 8px solid transparent; + border-top: 8px solid #222f3e; + bottom: 0; + left: 50%; + position: absolute; + transform: translateX(-50%); +} +.tox .tox-tooltip--up .tox-tooltip__arrow { + border-bottom: 8px solid #222f3e; + border-left: 8px solid transparent; + border-right: 8px solid transparent; + left: 50%; + position: absolute; + top: 0; + transform: translateX(-50%); +} +.tox .tox-tooltip--right .tox-tooltip__arrow { + border-bottom: 8px solid transparent; + border-left: 8px solid #222f3e; + border-top: 8px solid transparent; + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-tooltip--left .tox-tooltip__arrow { + border-bottom: 8px solid transparent; + border-right: 8px solid #222f3e; + border-top: 8px solid transparent; + left: 0; + position: absolute; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-well { + border: 1px solid #cccccc; + border-radius: 3px; + padding: 8px; + width: 100%; +} +.tox .tox-well > *:first-child { + margin-top: 0; +} +.tox .tox-well > *:last-child { + margin-bottom: 0; +} +.tox .tox-well > *:only-child { + margin: 0; +} +.tox .tox-custom-editor { + border: 1px solid #cccccc; + border-radius: 3px; + display: flex; + flex: 1; + position: relative; +} +/* stylelint-disable */ +.tox { + /* stylelint-enable */ +} +.tox .tox-dialog-loading::before { + background-color: rgba(0, 0, 0, 0.5); + content: ""; + height: 100%; + position: absolute; + width: 100%; + z-index: 1000; +} +.tox .tox-tab { + cursor: pointer; +} +.tox .tox-dialog__content-js { + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-dialog__body-content .tox-collection { + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-image-tools-edit-panel { + height: 60px; +} +.tox .tox-image-tools__sidebar { + height: 60px; +} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide/skin.min.css b/snowy-admin-web/public/tinymce/skins/ui/oxide/skin.min.css new file mode 100644 index 00000000..2a00fac8 --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide/skin.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tox{box-shadow:none;box-sizing:content-box;color:#222f3e;cursor:auto;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:normal;-webkit-tap-highlight-color:transparent;text-decoration:none;text-shadow:none;text-transform:none;vertical-align:initial;white-space:normal}.tox :not(svg):not(rect){box-sizing:inherit;color:inherit;cursor:inherit;direction:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;-webkit-tap-highlight-color:inherit;text-align:inherit;text-decoration:inherit;text-shadow:inherit;text-transform:inherit;vertical-align:inherit;white-space:inherit}.tox :not(svg):not(rect){background:0 0;border:0;box-shadow:none;float:none;height:auto;margin:0;max-width:none;outline:0;padding:0;position:static;width:auto}.tox:not([dir=rtl]){direction:ltr;text-align:left}.tox[dir=rtl]{direction:rtl;text-align:right}.tox-tinymce{border:1px solid #ccc;border-radius:0;box-shadow:none;box-sizing:border-box;display:flex;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;overflow:hidden;position:relative;visibility:inherit!important}.tox-tinymce-inline{border:none;box-shadow:none}.tox-tinymce-inline .tox-editor-header{background-color:transparent;border:1px solid #ccc;border-radius:0;box-shadow:none}.tox-tinymce-aux{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;z-index:1300}.tox-tinymce :focus,.tox-tinymce-aux :focus{outline:0}button::-moz-focus-inner{border:0}.tox .accessibility-issue__header{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description{align-items:stretch;border:1px solid #ccc;border-radius:3px;display:flex;justify-content:space-between}.tox .accessibility-issue__description>div{padding-bottom:4px}.tox .accessibility-issue__description>div>div{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description>:last-child:not(:only-child){border-color:#ccc;border-style:solid}.tox .accessibility-issue__repair{margin-top:16px}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description{background-color:rgba(32,122,183,.1);border-color:rgba(32,122,183,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description>:last-child{border-color:rgba(32,122,183,.4)}.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2{color:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg{fill:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon{color:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description{background-color:rgba(255,165,0,.1);border-color:rgba(255,165,0,.5);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description>:last-child{border-color:rgba(255,165,0,.5)}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg{fill:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description{background-color:rgba(204,0,0,.1);border-color:rgba(204,0,0,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description>:last-child{border-color:rgba(204,0,0,.4)}.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg{fill:#c00}.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description{background-color:rgba(120,171,70,.1);border-color:rgba(120,171,70,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description>:last-child{border-color:rgba(120,171,70,.4)}.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg{fill:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue__header h1,.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2{margin-top:0}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-left:4px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-left:auto}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description{padding:4px 4px 4px 8px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description>:last-child{border-left-width:1px;padding-left:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-right:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-right:auto}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description{padding:4px 8px 4px 4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description>:last-child{border-right-width:1px;padding-right:4px}.tox .tox-anchorbar{display:flex;flex:0 0 auto}.tox .tox-bar{display:flex;flex:0 0 auto}.tox .tox-button{background-color:#207ab7;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#207ab7;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;line-height:24px;margin:0;outline:0;padding:4px 16px;text-align:center;text-decoration:none;text-transform:none;white-space:nowrap}.tox .tox-button[disabled]{background-color:#207ab7;background-image:none;border-color:#207ab7;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-button:focus:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:hover:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:active:not(:disabled){background-color:#185d8c;background-image:none;border-color:#185d8c;box-shadow:none;color:#fff}.tox .tox-button--secondary{background-color:#f0f0f0;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#f0f0f0;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;color:#222f3e;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;outline:0;padding:4px 16px;text-decoration:none;text-transform:none}.tox .tox-button--secondary[disabled]{background-color:#f0f0f0;background-image:none;border-color:#f0f0f0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-button--secondary:focus:not(:disabled){background-color:#e3e3e3;background-image:none;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--secondary:hover:not(:disabled){background-color:#e3e3e3;background-image:none;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--secondary:active:not(:disabled){background-color:#d6d6d6;background-image:none;border-color:#d6d6d6;box-shadow:none;color:#222f3e}.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding:4px}.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display:block;fill:currentColor}.tox .tox-button-link{background:0;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-weight:400;line-height:1.3;margin:0;padding:0;white-space:nowrap}.tox .tox-button-link--sm{font-size:14px}.tox .tox-button--naked{background-color:transparent;border-color:transparent;box-shadow:unset;color:#222f3e}.tox .tox-button--naked[disabled]{background-color:#f0f0f0;border-color:#f0f0f0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-button--naked:hover:not(:disabled){background-color:#e3e3e3;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--naked:focus:not(:disabled){background-color:#e3e3e3;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--naked:active:not(:disabled){background-color:#d6d6d6;border-color:#d6d6d6;box-shadow:none;color:#222f3e}.tox .tox-button--naked .tox-icon svg{fill:currentColor}.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color:#222f3e}.tox .tox-checkbox{align-items:center;border-radius:3px;cursor:pointer;display:flex;height:36px;min-width:36px}.tox .tox-checkbox__input{height:1px;overflow:hidden;position:absolute;top:auto;width:1px}.tox .tox-checkbox__icons{align-items:center;border-radius:3px;box-shadow:0 0 0 2px transparent;box-sizing:content-box;display:flex;height:24px;justify-content:center;padding:calc(4px - 1px);width:24px}.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:block;fill:rgba(34,47,62,.3)}.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:none;fill:#207ab7}.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg{display:none;fill:#207ab7}.tox .tox-checkbox--disabled{color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg{fill:rgba(34,47,62,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{fill:rgba(34,47,62,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{fill:rgba(34,47,62,.5)}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display:block}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:block}.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{border-radius:3px;box-shadow:inset 0 0 0 1px #207ab7;padding:calc(4px - 1px)}.tox:not([dir=rtl]) .tox-checkbox__label{margin-left:4px}.tox:not([dir=rtl]) .tox-checkbox__input{left:-10000px}.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left:4px}.tox[dir=rtl] .tox-checkbox__label{margin-right:4px}.tox[dir=rtl] .tox-checkbox__input{right:-10000px}.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right:4px}.tox .tox-collection--toolbar .tox-collection__group{display:flex;padding:0}.tox .tox-collection--grid .tox-collection__group{display:flex;flex-wrap:wrap;max-height:208px;overflow-x:hidden;overflow-y:auto;padding:0}.tox .tox-collection--list .tox-collection__group{border-bottom-width:0;border-color:#ccc;border-left-width:0;border-right-width:0;border-style:solid;border-top-width:1px;padding:4px 0}.tox .tox-collection--list .tox-collection__group:first-child{border-top-width:0}.tox .tox-collection__group-heading{background-color:#e6e6e6;color:rgba(34,47,62,.7);cursor:default;font-size:12px;font-style:normal;font-weight:400;margin-bottom:4px;margin-top:-4px;padding:4px 8px;text-transform:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection__item{align-items:center;color:#222f3e;cursor:pointer;display:flex;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection--list .tox-collection__item{padding:4px 8px}.tox .tox-collection--toolbar .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--grid .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--list .tox-collection__item--enabled{background-color:#fff;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active{background-color:#dee0e2}.tox .tox-collection--toolbar .tox-collection__item--enabled{background-color:#c8cbcf;color:#222f3e}.tox .tox-collection--toolbar .tox-collection__item--active{background-color:#dee0e2}.tox .tox-collection--grid .tox-collection__item--enabled{background-color:#c8cbcf;color:#222f3e}.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){background-color:#dee0e2;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#222f3e}.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#222f3e}.tox .tox-collection__item--state-disabled{background-color:transparent;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-collection__item-checkmark,.tox .tox-collection__item-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.tox .tox-collection__item-checkmark svg,.tox .tox-collection__item-icon svg{fill:currentColor}.tox .tox-collection--toolbar-lg .tox-collection__item-icon{height:48px;width:48px}.tox .tox-collection__item-label{color:currentColor;display:inline-block;flex:1;-ms-flex-preferred-size:auto;font-size:14px;font-style:normal;font-weight:400;line-height:24px;text-transform:none;word-break:break-all}.tox .tox-collection__item-accessory{color:rgba(34,47,62,.7);display:inline-block;font-size:14px;height:24px;line-height:24px;text-transform:none}.tox .tox-collection__item-caret{align-items:center;display:flex;min-height:24px}.tox .tox-collection__item-caret::after{content:'';font-size:0;min-height:inherit}.tox .tox-collection__item-caret svg{fill:#222f3e}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display:none}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory+.tox-collection__item-checkmark{display:none}.tox .tox-collection--horizontal{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:nowrap;margin-bottom:0;overflow-x:auto;padding:0}.tox .tox-collection--horizontal .tox-collection__group{align-items:center;display:flex;flex-wrap:nowrap;margin:0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item{height:34px;margin:2px 0 3px 0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item-label{white-space:nowrap}.tox .tox-collection--horizontal .tox-collection__item-caret{margin-left:4px}.tox .tox-collection__item-container{display:flex}.tox .tox-collection__item-container--row{align-items:center;flex:1 1 auto;flex-direction:row}.tox .tox-collection__item-container--row.tox-collection__item-container--align-left{margin-right:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--align-right{justify-content:flex-end;margin-left:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top{align-items:flex-start;margin-bottom:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle{align-items:center}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom{align-items:flex-end;margin-top:auto}.tox .tox-collection__item-container--column{-ms-grid-row-align:center;align-self:center;flex:1 1 auto;flex-direction:column}.tox .tox-collection__item-container--column.tox-collection__item-container--align-left{align-items:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--align-right{align-items:flex-end}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top{align-self:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle{-ms-grid-row-align:center;align-self:center}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom{align-self:flex-end}.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-right:1px solid #ccc}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left:8px}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-left:4px}.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left:16px;text-align:right}.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret{margin-left:16px}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-left:1px solid #ccc}.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right:8px}.tox[dir=rtl] .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-right:4px}.tox[dir=rtl] .tox-collection__item-icon-rtl .tox-collection__item-icon svg{transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection__item-accessory{margin-right:16px;text-align:left}.tox[dir=rtl] .tox-collection .tox-collection__item-caret{margin-right:16px;transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret{margin-right:4px}.tox .tox-color-picker-container{display:flex;flex-direction:row;height:225px;margin:0}.tox .tox-sv-palette{box-sizing:border-box;display:flex;height:100%}.tox .tox-sv-palette-spectrum{height:100%}.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width:225px}.tox .tox-sv-palette-thumb{background:0 0;border:1px solid #000;border-radius:50%;box-sizing:content-box;height:12px;position:absolute;width:12px}.tox .tox-sv-palette-inner-thumb{border:1px solid #fff;border-radius:50%;height:10px;position:absolute;width:10px}.tox .tox-hue-slider{box-sizing:border-box;height:100%;width:25px}.tox .tox-hue-slider-spectrum{background:linear-gradient(to bottom,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);height:100%;width:100%}.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width:20px}.tox .tox-hue-slider-thumb{background:#fff;border:1px solid #000;box-sizing:content-box;height:4px;width:100%}.tox .tox-rgb-form{display:flex;flex-direction:column;justify-content:space-between}.tox .tox-rgb-form div{align-items:center;display:flex;justify-content:space-between;margin-bottom:5px;width:inherit}.tox .tox-rgb-form input{width:6em}.tox .tox-rgb-form input.tox-invalid{border:1px solid red!important}.tox .tox-rgb-form .tox-rgba-preview{border:1px solid #000;flex-grow:2;margin-bottom:0}.tox:not([dir=rtl]) .tox-sv-palette{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left:-1px}.tox:not([dir=rtl]) .tox-rgb-form label{margin-right:.5em}.tox[dir=rtl] .tox-sv-palette{margin-left:15px}.tox[dir=rtl] .tox-hue-slider{margin-left:15px}.tox[dir=rtl] .tox-hue-slider-thumb{margin-right:-1px}.tox[dir=rtl] .tox-rgb-form label{margin-left:.5em}.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin:2px 0 3px 4px}.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{border:0;margin:-4px 0}.tox .tox-swatches__row{display:flex}.tox .tox-swatch{height:30px;transition:transform .15s,box-shadow .15s;width:30px}.tox .tox-swatch:focus,.tox .tox-swatch:hover{box-shadow:0 0 0 1px rgba(127,127,127,.3) inset;transform:scale(.8)}.tox .tox-swatch--remove{align-items:center;display:flex;justify-content:center}.tox .tox-swatch--remove svg path{stroke:#e74c3c}.tox .tox-swatches__picker-btn{align-items:center;background-color:transparent;border:0;cursor:pointer;display:flex;height:30px;justify-content:center;outline:0;padding:0;width:30px}.tox .tox-swatches__picker-btn svg{height:24px;width:24px}.tox .tox-swatches__picker-btn:hover{background:#dee0e2}.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left:auto}.tox[dir=rtl] .tox-swatches__picker-btn{margin-right:auto}.tox .tox-comment-thread{background:#fff;position:relative}.tox .tox-comment-thread>:not(:first-child){margin-top:8px}.tox .tox-comment{background:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 4px 8px 0 rgba(34,47,62,.1);padding:8px 8px 16px 8px;position:relative}.tox .tox-comment__header{align-items:center;color:#222f3e;display:flex;justify-content:space-between}.tox .tox-comment__date{color:rgba(34,47,62,.7);font-size:12px}.tox .tox-comment__body{color:#222f3e;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;margin-top:8px;position:relative;text-transform:initial}.tox .tox-comment__body textarea{resize:none;white-space:normal;width:100%}.tox .tox-comment__expander{padding-top:8px}.tox .tox-comment__expander p{color:rgba(34,47,62,.7);font-size:14px;font-style:normal}.tox .tox-comment__body p{margin:0}.tox .tox-comment__buttonspacing{padding-top:16px;text-align:center}.tox .tox-comment-thread__overlay::after{background:#fff;bottom:0;content:"";display:flex;left:0;opacity:.9;position:absolute;right:0;top:0;z-index:5}.tox .tox-comment__reply{display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;margin-top:8px}.tox .tox-comment__reply>:first-child{margin-bottom:8px;width:100%}.tox .tox-comment__edit{display:flex;flex-wrap:wrap;justify-content:flex-end;margin-top:16px}.tox .tox-comment__gradient::after{background:linear-gradient(rgba(255,255,255,0),#fff);bottom:0;content:"";display:block;height:5em;margin-top:-40px;position:absolute;width:100%}.tox .tox-comment__overlay{background:#fff;bottom:0;display:flex;flex-direction:column;flex-grow:1;left:0;opacity:.9;position:absolute;right:0;text-align:center;top:0;z-index:5}.tox .tox-comment__loading-text{align-items:center;color:#222f3e;display:flex;flex-direction:column;position:relative}.tox .tox-comment__loading-text>div{padding-bottom:16px}.tox .tox-comment__overlaytext{bottom:0;flex-direction:column;font-size:14px;left:0;padding:1em;position:absolute;right:0;top:0;z-index:10}.tox .tox-comment__overlaytext p{background-color:#fff;box-shadow:0 0 8px 8px #fff;color:#222f3e;text-align:center}.tox .tox-comment__overlaytext div:nth-of-type(2){font-size:.8em}.tox .tox-comment__busy-spinner{align-items:center;background-color:#fff;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:20}.tox .tox-comment__scroll{display:flex;flex-direction:column;flex-shrink:1;overflow:auto}.tox .tox-conversations{margin:8px}.tox:not([dir=rtl]) .tox-comment__edit{margin-left:8px}.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left:8px}.tox[dir=rtl] .tox-comment__edit{margin-right:8px}.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right:8px}.tox .tox-user{align-items:center;display:flex}.tox .tox-user__avatar svg{fill:rgba(34,47,62,.7)}.tox .tox-user__name{color:rgba(34,47,62,.7);font-size:12px;font-style:normal;font-weight:700;text-transform:uppercase}.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right:8px}.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name{margin-left:8px}.tox[dir=rtl] .tox-user__avatar svg{margin-left:8px}.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right:8px}.tox .tox-dialog-wrap{align-items:center;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1100}.tox .tox-dialog-wrap__backdrop{background-color:rgba(255,255,255,.75);bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.tox .tox-dialog-wrap__backdrop--opaque{background-color:#fff}.tox .tox-dialog{background-color:#fff;border-color:#ccc;border-radius:3px;border-style:solid;border-width:1px;box-shadow:0 16px 16px -10px rgba(34,47,62,.15),0 0 40px 1px rgba(34,47,62,.15);display:flex;flex-direction:column;max-height:100%;max-width:480px;overflow:hidden;position:relative;width:95vw;z-index:2}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog{align-self:flex-start;margin:8px auto;width:calc(100vw - 16px)}}.tox .tox-dialog-inline{z-index:1100}.tox .tox-dialog__header{align-items:center;background-color:#fff;border-bottom:none;color:#222f3e;display:flex;font-size:16px;justify-content:space-between;padding:8px 16px 0 16px;position:relative}.tox .tox-dialog__header .tox-button{z-index:1}.tox .tox-dialog__draghandle{cursor:grab;height:100%;left:0;position:absolute;top:0;width:100%}.tox .tox-dialog__draghandle:active{cursor:grabbing}.tox .tox-dialog__dismiss{margin-left:auto}.tox .tox-dialog__title{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:20px;font-style:normal;font-weight:400;line-height:1.3;margin:0;text-transform:none}.tox .tox-dialog__body{color:#222f3e;display:flex;flex:1;-ms-flex-preferred-size:auto;font-size:16px;font-style:normal;font-weight:400;line-height:1.3;min-width:0;text-align:left;text-transform:none}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body{flex-direction:column}}.tox .tox-dialog__body-nav{align-items:flex-start;display:flex;flex-direction:column;padding:16px 16px}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body-nav{flex-direction:row;-webkit-overflow-scrolling:touch;overflow-x:auto;padding-bottom:0}}.tox .tox-dialog__body-nav-item{border-bottom:2px solid transparent;color:rgba(34,47,62,.7);display:inline-block;font-size:14px;line-height:1.3;margin-bottom:8px;text-decoration:none;white-space:nowrap}.tox .tox-dialog__body-nav-item:focus{background-color:rgba(32,122,183,.1)}.tox .tox-dialog__body-nav-item--active{border-bottom:2px solid #207ab7;color:#207ab7}.tox .tox-dialog__body-content{box-sizing:border-box;display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto;max-height:650px;overflow:auto;-webkit-overflow-scrolling:touch;padding:16px 16px}.tox .tox-dialog__body-content>*{margin-bottom:0;margin-top:16px}.tox .tox-dialog__body-content>:first-child{margin-top:0}.tox .tox-dialog__body-content>:last-child{margin-bottom:0}.tox .tox-dialog__body-content>:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog__body-content a{color:#207ab7;cursor:pointer;text-decoration:none}.tox .tox-dialog__body-content a:focus,.tox .tox-dialog__body-content a:hover{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content a:active{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content svg{fill:#222f3e}.tox .tox-dialog__body-content ul{display:block;list-style-type:disc;margin-bottom:16px;-webkit-margin-end:0;margin-inline-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-padding-start:2.5rem;padding-inline-start:2.5rem}.tox .tox-dialog__body-content .tox-form__group h1{color:#222f3e;font-size:20px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group h2{color:#222f3e;font-size:16px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group p{margin-bottom:16px}.tox .tox-dialog__body-content .tox-form__group h1:first-child,.tox .tox-dialog__body-content .tox-form__group h2:first-child,.tox .tox-dialog__body-content .tox-form__group p:first-child{margin-top:0}.tox .tox-dialog__body-content .tox-form__group h1:last-child,.tox .tox-dialog__body-content .tox-form__group h2:last-child,.tox .tox-dialog__body-content .tox-form__group p:last-child{margin-bottom:0}.tox .tox-dialog__body-content .tox-form__group h1:only-child,.tox .tox-dialog__body-content .tox-form__group h2:only-child,.tox .tox-dialog__body-content .tox-form__group p:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog--width-lg{height:650px;max-width:1200px}.tox .tox-dialog--width-md{max-width:800px}.tox .tox-dialog--width-md .tox-dialog__body-content{overflow:auto}.tox .tox-dialog__body-content--centered{text-align:center}.tox .tox-dialog__footer{align-items:center;background-color:#fff;border-top:1px solid #ccc;display:flex;justify-content:space-between;padding:8px 16px}.tox .tox-dialog__footer-end,.tox .tox-dialog__footer-start{display:flex}.tox .tox-dialog__busy-spinner{align-items:center;background-color:rgba(255,255,255,.75);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:3}.tox .tox-dialog__table{border-collapse:collapse;width:100%}.tox .tox-dialog__table thead th{font-weight:700;padding-bottom:8px}.tox .tox-dialog__table tbody tr{border-bottom:1px solid #ccc}.tox .tox-dialog__table tbody tr:last-child{border-bottom:none}.tox .tox-dialog__table td{padding-bottom:8px;padding-top:8px}.tox .tox-dialog__popups{position:absolute;width:100%;z-index:1100}.tox .tox-dialog__body-iframe{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox .tox-dialog-dock-fadeout{opacity:0;visibility:hidden}.tox .tox-dialog-dock-fadein{opacity:1;visibility:visible}.tox .tox-dialog-dock-transition{transition:visibility 0s linear .3s,opacity .3s ease}.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein{transition-delay:0s}.tox.tox-platform-ie .tox-dialog-wrap{position:-ms-device-fixed}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child){margin-left:8px}}.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left:8px}.tox[dir=rtl] .tox-dialog__body{text-align:right}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav{margin-left:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child){margin-right:8px}}.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right:8px}body.tox-dialog__disable-scroll{overflow:hidden}.tox .tox-dropzone-container{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dropzone{align-items:center;background:#fff;border:2px dashed #ccc;box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;min-height:100px;padding:10px}.tox .tox-dropzone p{color:rgba(34,47,62,.7);margin:0 0 16px 0}.tox .tox-edit-area{display:flex;flex:1;-ms-flex-preferred-size:auto;overflow:hidden;position:relative}.tox .tox-edit-area__iframe{background-color:#fff;border:0;box-sizing:border-box;flex:1;-ms-flex-preferred-size:auto;height:100%;position:absolute;width:100%}.tox.tox-inline-edit-area{border:1px dotted #ccc}.tox .tox-editor-container{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.tox .tox-editor-header{z-index:1}.tox:not(.tox-tinymce-inline) .tox-editor-header{box-shadow:none;transition:box-shadow .5s}.tox.tox-tinymce--toolbar-bottom .tox-editor-header,.tox.tox-tinymce-inline .tox-editor-header{margin-bottom:-1px}.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header{background-color:transparent;box-shadow:0 4px 4px -3px rgba(0,0,0,.25)}.tox-editor-dock-fadeout{opacity:0;visibility:hidden}.tox-editor-dock-fadein{opacity:1;visibility:visible}.tox-editor-dock-transition{transition:visibility 0s linear .25s,opacity .25s ease}.tox-editor-dock-transition.tox-editor-dock-fadein{transition-delay:0s}.tox .tox-control-wrap{flex:1;position:relative}.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display:none}.tox .tox-control-wrap svg{display:block}.tox .tox-control-wrap__status-icon-wrap{position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-control-wrap__status-icon-invalid svg{fill:#c00}.tox .tox-control-wrap__status-icon-unknown svg{fill:orange}.tox .tox-control-wrap__status-icon-valid svg{fill:green}.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right:32px}.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right:4px}.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left:32px}.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left:4px}.tox .tox-autocompleter{max-width:25em}.tox .tox-autocompleter .tox-menu{max-width:25em}.tox .tox-autocompleter .tox-autocompleter-highlight{font-weight:700}.tox .tox-color-input{display:flex;position:relative;z-index:1}.tox .tox-color-input .tox-textfield{z-index:-1}.tox .tox-color-input span{border-color:rgba(34,47,62,.2);border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;height:24px;position:absolute;top:6px;width:24px}.tox .tox-color-input span:focus:not([aria-disabled=true]),.tox .tox-color-input span:hover:not([aria-disabled=true]){border-color:#207ab7;cursor:pointer}.tox .tox-color-input span::before{background-image:linear-gradient(45deg,rgba(0,0,0,.25) 25%,transparent 25%),linear-gradient(-45deg,rgba(0,0,0,.25) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(0,0,0,.25) 75%),linear-gradient(-45deg,transparent 75%,rgba(0,0,0,.25) 75%);background-position:0 0,0 6px,6px -6px,-6px 0;background-size:12px 12px;border:1px solid #fff;border-radius:3px;box-sizing:border-box;content:'';height:24px;left:-1px;position:absolute;top:-1px;width:24px;z-index:-1}.tox .tox-color-input span[aria-disabled=true]{cursor:not-allowed}.tox:not([dir=rtl]) .tox-color-input .tox-textfield{padding-left:36px}.tox:not([dir=rtl]) .tox-color-input span{left:6px}.tox[dir=rtl] .tox-color-input .tox-textfield{padding-right:36px}.tox[dir=rtl] .tox-color-input span{right:6px}.tox .tox-label,.tox .tox-toolbar-label{color:rgba(34,47,62,.7);display:block;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;padding:0 8px 0 0;text-transform:none;white-space:nowrap}.tox .tox-toolbar-label{padding:0 8px}.tox[dir=rtl] .tox-label{padding:0 0 0 8px}.tox .tox-form{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group{box-sizing:border-box;margin-bottom:4px}.tox .tox-form-group--maximize{flex:1}.tox .tox-form__group--error{color:#c00}.tox .tox-form__group--collection{display:flex}.tox .tox-form__grid{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}.tox .tox-form__grid--2col>.tox-form__group{width:calc(50% - (8px / 2))}.tox .tox-form__grid--3col>.tox-form__group{width:calc(100% / 3 - (8px / 2))}.tox .tox-form__grid--4col>.tox-form__group{width:calc(25% - (8px / 2))}.tox .tox-form__controls-h-stack{align-items:center;display:flex}.tox .tox-form__group--inline{align-items:center;display:flex}.tox .tox-form__group--stretched{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-textarea{flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right:4px}.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display:none}.tox .tox-listboxfield .tox-listbox--select,.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#ccc;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-textarea[disabled],.tox .tox-textfield[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listboxfield .tox-listbox--select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{background-color:#fff;border-color:#207ab7;box-shadow:none;outline:0}.tox .tox-toolbar-textfield{border-width:0;margin-bottom:3px;margin-top:2px;max-width:250px}.tox .tox-naked-btn{background-color:transparent;border:0;border-color:transparent;box-shadow:unset;color:#207ab7;cursor:pointer;display:block;margin:0;padding:0}.tox .tox-naked-btn svg{display:block;fill:#222f3e}.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left:4px}.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right:4px}.tox .tox-listboxfield{cursor:pointer;position:relative}.tox .tox-listboxfield .tox-listbox--select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listbox__select-label{cursor:default;flex:1;margin:0 4px}.tox .tox-listbox__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-listbox__select-chevron svg{fill:#222f3e}.tox .tox-listboxfield .tox-listbox--select{align-items:center;display:flex}.tox:not([dir=rtl]) .tox-listboxfield svg{right:8px}.tox[dir=rtl] .tox-listboxfield svg{left:8px}.tox .tox-selectfield{cursor:pointer;position:relative}.tox .tox-selectfield select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#ccc;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-selectfield select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-selectfield select::-ms-expand{display:none}.tox .tox-selectfield select:focus{background-color:#fff;border-color:#207ab7;box-shadow:none;outline:0}.tox .tox-selectfield svg{pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.tox:not([dir=rtl]) .tox-selectfield select[size="0"],.tox:not([dir=rtl]) .tox-selectfield select[size="1"]{padding-right:24px}.tox:not([dir=rtl]) .tox-selectfield svg{right:8px}.tox[dir=rtl] .tox-selectfield select[size="0"],.tox[dir=rtl] .tox-selectfield select[size="1"]{padding-left:24px}.tox[dir=rtl] .tox-selectfield svg{left:8px}.tox .tox-textarea{-webkit-appearance:textarea;-moz-appearance:textarea;appearance:textarea;white-space:pre-wrap}.tox-fullscreen{border:0;height:100%;left:0;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;position:fixed;top:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox.tox-tinymce.tox-fullscreen{background-color:transparent;z-index:1200}.tox-shadowhost.tox-fullscreen{z-index:1200}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}.tox .tox-help__more-link{list-style:none;margin-top:1em}.tox .tox-image-tools{width:100%}.tox .tox-image-tools__toolbar{align-items:center;display:flex;justify-content:center}.tox .tox-image-tools__image{background-color:#666;height:380px;overflow:auto;position:relative;width:100%}.tox .tox-image-tools__image,.tox .tox-image-tools__image+.tox-image-tools__toolbar{margin-top:8px}.tox .tox-image-tools__image-bg{background:url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==)}.tox .tox-image-tools__toolbar>.tox-spacer{flex:1;-ms-flex-preferred-size:auto}.tox .tox-croprect-block{background:#000;opacity:.5;position:absolute;zoom:1}.tox .tox-croprect-handle{border:2px solid #fff;height:20px;left:0;position:absolute;top:0;width:20px}.tox .tox-croprect-handle-move{border:0;cursor:move;position:absolute}.tox .tox-croprect-handle-nw{border-width:2px 0 0 2px;cursor:nw-resize;left:100px;margin:-2px 0 0 -2px;top:100px}.tox .tox-croprect-handle-ne{border-width:2px 2px 0 0;cursor:ne-resize;left:200px;margin:-2px 0 0 -20px;top:100px}.tox .tox-croprect-handle-sw{border-width:0 0 2px 2px;cursor:sw-resize;left:100px;margin:-20px 2px 0 -2px;top:200px}.tox .tox-croprect-handle-se{border-width:0 2px 2px 0;cursor:se-resize;left:200px;margin:-20px 0 0 -20px;top:200px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-left:8px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-left:32px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-left:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-right:8px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-right:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-right:32px}.tox .tox-insert-table-picker{display:flex;flex-wrap:wrap;width:170px}.tox .tox-insert-table-picker>div{border-color:#ccc;border-style:solid;border-width:0 1px 1px 0;box-sizing:border-box;height:17px;width:17px}.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin:-4px 0}.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color:rgba(32,122,183,.5);border-color:rgba(32,122,183,.5)}.tox .tox-insert-table-picker__label{color:rgba(34,47,62,.7);display:block;font-size:14px;padding:4px;text-align:center;width:100%}.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right:0}.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right:0}.tox .tox-menu{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 4px 8px 0 rgba(34,47,62,.1);display:inline-block;overflow:hidden;vertical-align:top;z-index:1150}.tox .tox-menu.tox-collection.tox-collection--list{padding:0}.tox .tox-menu.tox-collection.tox-collection--toolbar{padding:4px}.tox .tox-menu.tox-collection.tox-collection--grid{padding:4px}.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin:0}.tox .tox-menubar{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color:#fff;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 4px 0 4px}.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar{border-top:1px solid #ccc}.tox .tox-mbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#222f3e;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0 4px;text-transform:none;width:auto}.tox .tox-mbtn[disabled]{background-color:transparent;border:0;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-mbtn:focus:not(:disabled){background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn--active{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active){background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor:not-allowed}.tox .tox-mbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px;display:none}.tox .tox-notification{border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;display:-ms-grid;display:grid;font-size:14px;font-weight:400;-ms-grid-columns:minmax(40px,1fr) auto minmax(40px,1fr);grid-template-columns:minmax(40px,1fr) auto minmax(40px,1fr);margin-top:4px;opacity:0;padding:4px;transition:transform .1s ease-in,opacity 150ms ease-in}.tox .tox-notification p{font-size:14px;font-weight:400}.tox .tox-notification a{text-decoration:underline}.tox .tox-notification--in{opacity:1}.tox .tox-notification--success{background-color:#e4eeda;border-color:#d7e6c8;color:#222f3e}.tox .tox-notification--success p{color:#222f3e}.tox .tox-notification--success a{color:#547831}.tox .tox-notification--success svg{fill:#222f3e}.tox .tox-notification--error{background-color:#f8dede;border-color:#f2bfbf;color:#222f3e}.tox .tox-notification--error p{color:#222f3e}.tox .tox-notification--error a{color:#c00}.tox .tox-notification--error svg{fill:#222f3e}.tox .tox-notification--warn,.tox .tox-notification--warning{background-color:#fffaea;border-color:#ffe89d;color:#222f3e}.tox .tox-notification--warn p,.tox .tox-notification--warning p{color:#222f3e}.tox .tox-notification--warn a,.tox .tox-notification--warning a{color:#222f3e}.tox .tox-notification--warn svg,.tox .tox-notification--warning svg{fill:#222f3e}.tox .tox-notification--info{background-color:#d9edf7;border-color:#779ecb;color:#222f3e}.tox .tox-notification--info p{color:#222f3e}.tox .tox-notification--info a{color:#222f3e}.tox .tox-notification--info svg{fill:#222f3e}.tox .tox-notification__body{-ms-grid-row-align:center;align-self:center;color:#222f3e;font-size:14px;-ms-grid-column-span:1;grid-column-end:3;-ms-grid-column:2;grid-column-start:2;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;text-align:center;white-space:normal;word-break:break-all;word-break:break-word}.tox .tox-notification__body>*{margin:0}.tox .tox-notification__body>*+*{margin-top:1rem}.tox .tox-notification__icon{-ms-grid-row-align:center;align-self:center;-ms-grid-column-span:1;grid-column-end:2;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification__icon svg{display:block}.tox .tox-notification__dismiss{-ms-grid-row-align:start;align-self:start;-ms-grid-column-span:1;grid-column-end:4;-ms-grid-column:3;grid-column-start:3;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification .tox-progress-bar{-ms-grid-column-span:3;grid-column-end:4;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:3;-ms-grid-row:2;grid-row-start:2;-ms-grid-column-align:center;justify-self:center}.tox .tox-pop{display:inline-block;position:relative}.tox .tox-pop--resizing{transition:width .1s ease}.tox .tox-pop--resizing .tox-toolbar{flex-wrap:nowrap}.tox .tox-pop__dialog{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);min-width:0;overflow:hidden}.tox .tox-pop__dialog>:not(.tox-toolbar){margin:4px 4px 4px 8px}.tox .tox-pop__dialog .tox-toolbar{background-color:transparent;margin-bottom:-1px}.tox .tox-pop::after,.tox .tox-pop::before{border-style:solid;content:'';display:block;height:0;position:absolute;width:0}.tox .tox-pop.tox-pop--bottom::after,.tox .tox-pop.tox-pop--bottom::before{left:50%;top:100%}.tox .tox-pop.tox-pop--bottom::after{border-color:#fff transparent transparent transparent;border-width:8px;margin-left:-8px;margin-top:-1px}.tox .tox-pop.tox-pop--bottom::before{border-color:#ccc transparent transparent transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--top::after,.tox .tox-pop.tox-pop--top::before{left:50%;top:0;transform:translateY(-100%)}.tox .tox-pop.tox-pop--top::after{border-color:transparent transparent #fff transparent;border-width:8px;margin-left:-8px;margin-top:1px}.tox .tox-pop.tox-pop--top::before{border-color:transparent transparent #ccc transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--left::after,.tox .tox-pop.tox-pop--left::before{left:0;top:calc(50% - 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--left::after{border-color:transparent #fff transparent transparent;border-width:8px;margin-left:-15px}.tox .tox-pop.tox-pop--left::before{border-color:transparent #ccc transparent transparent;border-width:10px;margin-left:-19px}.tox .tox-pop.tox-pop--right::after,.tox .tox-pop.tox-pop--right::before{left:100%;top:calc(50% + 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--right::after{border-color:transparent transparent transparent #fff;border-width:8px;margin-left:-1px}.tox .tox-pop.tox-pop--right::before{border-color:transparent transparent transparent #ccc;border-width:10px;margin-left:-1px}.tox .tox-pop.tox-pop--align-left::after,.tox .tox-pop.tox-pop--align-left::before{left:20px}.tox .tox-pop.tox-pop--align-right::after,.tox .tox-pop.tox-pop--align-right::before{left:calc(100% - 20px)}.tox .tox-sidebar-wrap{display:flex;flex-direction:row;flex-grow:1;-ms-flex-preferred-size:0;min-height:0}.tox .tox-sidebar{background-color:#fff;display:flex;flex-direction:row;justify-content:flex-end}.tox .tox-sidebar__slider{display:flex;overflow:hidden}.tox .tox-sidebar__pane-container{display:flex}.tox .tox-sidebar__pane{display:flex}.tox .tox-sidebar--sliding-closed{opacity:0}.tox .tox-sidebar--sliding-open{opacity:1}.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition:width .5s ease,opacity .5s ease}.tox .tox-selector{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;display:inline-block;height:10px;position:absolute;width:10px}.tox.tox-platform-touch .tox-selector{height:12px;width:12px}.tox .tox-slider{align-items:center;display:flex;flex:1;-ms-flex-preferred-size:auto;height:24px;justify-content:center;position:relative}.tox .tox-slider__rail{background-color:transparent;border:1px solid #ccc;border-radius:3px;height:10px;min-width:120px;width:100%}.tox .tox-slider__handle{background-color:#207ab7;border:2px solid #185d8c;border-radius:3px;box-shadow:none;height:24px;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:14px}.tox .tox-source-code{overflow:auto}.tox .tox-spinner{display:flex}.tox .tox-spinner>div{animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;background-color:rgba(34,47,62,.7);border-radius:100%;height:8px;width:8px}.tox .tox-spinner>div:nth-child(1){animation-delay:-.32s}.tox .tox-spinner>div:nth-child(2){animation-delay:-.16s}@keyframes tam-bouncing-dots{0%,100%,80%{transform:scale(0)}40%{transform:scale(1)}}.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right:4px}.tox .tox-statusbar{align-items:center;background-color:#fff;border-top:1px solid #ccc;color:rgba(34,47,62,.7);display:flex;flex:0 0 auto;font-size:12px;font-weight:400;height:18px;overflow:hidden;padding:0 8px;position:relative;text-transform:uppercase}.tox .tox-statusbar__text-container{display:flex;flex:1 1 auto;justify-content:flex-end;overflow:hidden}.tox .tox-statusbar__path{display:flex;flex:1 1 auto;margin-right:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tox .tox-statusbar__path>*{display:inline;white-space:nowrap}.tox .tox-statusbar__wordcount{flex:0 0 auto;margin-left:1ch}.tox .tox-statusbar a,.tox .tox-statusbar__path-item,.tox .tox-statusbar__wordcount{color:rgba(34,47,62,.7);text-decoration:none}.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]){cursor:pointer;text-decoration:underline}.tox .tox-statusbar__resize-handle{align-items:flex-end;align-self:stretch;cursor:nwse-resize;display:flex;flex:0 0 auto;justify-content:flex-end;margin-left:auto;margin-right:-8px;padding-left:1ch}.tox .tox-statusbar__resize-handle svg{display:block;fill:rgba(34,47,62,.7)}.tox .tox-statusbar__resize-handle:focus svg{background-color:#dee0e2;border-radius:1px;box-shadow:0 0 0 2px #dee0e2}.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right:4px}.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left:1ch}.tox[dir=rtl] .tox-statusbar{flex-direction:row-reverse}.tox[dir=rtl] .tox-statusbar__path>*{margin-left:4px}.tox .tox-throbber{z-index:1299}.tox .tox-throbber__busy-spinner{align-items:center;background-color:rgba(255,255,255,.6);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0}.tox .tox-tbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#222f3e;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0;text-transform:none;width:34px}.tox .tox-tbtn svg{display:block;fill:#222f3e}.tox .tox-tbtn.tox-tbtn-more{padding-left:5px;padding-right:5px;width:inherit}.tox .tox-tbtn:focus{background:#dee0e2;border:0;box-shadow:none}.tox .tox-tbtn:hover{background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn:hover svg{fill:#222f3e}.tox .tox-tbtn:active{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn:active svg{fill:#222f3e}.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{background:0 0;border:0;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-tbtn--disabled svg,.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn:disabled svg,.tox .tox-tbtn:disabled:hover svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--enabled,.tox .tox-tbtn--enabled:hover{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn--enabled:hover>*,.tox .tox-tbtn--enabled>*{transform:none}.tox .tox-tbtn--enabled svg,.tox .tox-tbtn--enabled:hover svg{fill:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled){color:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg{fill:#222f3e}.tox .tox-tbtn:active>*{transform:none}.tox .tox-tbtn--md{height:51px;width:51px}.tox .tox-tbtn--lg{flex-direction:column;height:68px;width:68px}.tox .tox-tbtn--return{-ms-grid-row-align:stretch;align-self:stretch;height:unset;width:16px}.tox .tox-tbtn--labeled{padding:0 4px;width:unset}.tox .tox-tbtn__vlabel{display:block;font-size:10px;font-weight:400;letter-spacing:-.025em;margin-bottom:4px;white-space:nowrap}.tox .tox-tbtn--select{margin:2px 0 3px 0;padding:0 4px;width:auto}.tox .tox-tbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-tbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-tbtn__select-chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--bespoke .tox-tbtn__select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:7em}.tox .tox-split-button{border:0;border-radius:3px;box-sizing:border-box;display:flex;margin:2px 0 3px 0;overflow:hidden}.tox .tox-split-button:hover{box-shadow:0 0 0 1px #dee0e2 inset}.tox .tox-split-button:focus{background:#dee0e2;box-shadow:none;color:#222f3e}.tox .tox-split-button>*{border-radius:0}.tox .tox-split-button__chevron{width:16px}.tox .tox-split-button__chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-split-button .tox-tbtn{margin:0}.tox.tox-platform-touch .tox-split-button .tox-tbtn:first-child{width:30px}.tox.tox-platform-touch .tox-split-button__chevron{width:20px}.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{background:0 0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-toolbar-overlord{background-color:#fff}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color:#fff;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 0}.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height:0;opacity:0;padding-bottom:0;padding-top:0;visibility:hidden}.tox .tox-toolbar__overflow--growing{transition:height .3s ease,opacity .2s linear .1s}.tox .tox-toolbar__overflow--shrinking{transition:opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s}.tox .tox-menubar+.tox-toolbar,.tox .tox-menubar+.tox-toolbar-overlord .tox-toolbar__primary{border-top:1px solid #ccc;margin-top:-1px}.tox .tox-toolbar--scrolling{flex-wrap:nowrap;overflow-x:auto}.tox .tox-pop .tox-toolbar{border-width:0}.tox .tox-toolbar--no-divider{background-image:none}.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary,.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child{border-top:1px solid #ccc}.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15)}.tox[dir=rtl] .tox-tbtn__icon-rtl svg{transform:rotateY(180deg)}.tox .tox-toolbar__group{align-items:center;display:flex;flex-wrap:wrap;margin:0 0;padding:0 4px 0 4px}.tox .tox-toolbar__group--pull-right{margin-left:auto}.tox .tox-toolbar--scrolling .tox-toolbar__group{flex-shrink:0;flex-wrap:nowrap}.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right:1px solid #ccc}.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left:1px solid #ccc}.tox .tox-tooltip{display:inline-block;padding:8px;position:relative}.tox .tox-tooltip__body{background-color:#222f3e;border-radius:3px;box-shadow:0 2px 4px rgba(34,47,62,.3);color:rgba(255,255,255,.75);font-size:14px;font-style:normal;font-weight:400;padding:4px 8px;text-transform:none}.tox .tox-tooltip__arrow{position:absolute}.tox .tox-tooltip--down .tox-tooltip__arrow{border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #222f3e;bottom:0;left:50%;position:absolute;transform:translateX(-50%)}.tox .tox-tooltip--up .tox-tooltip__arrow{border-bottom:8px solid #222f3e;border-left:8px solid transparent;border-right:8px solid transparent;left:50%;position:absolute;top:0;transform:translateX(-50%)}.tox .tox-tooltip--right .tox-tooltip__arrow{border-bottom:8px solid transparent;border-left:8px solid #222f3e;border-top:8px solid transparent;position:absolute;right:0;top:50%;transform:translateY(-50%)}.tox .tox-tooltip--left .tox-tooltip__arrow{border-bottom:8px solid transparent;border-right:8px solid #222f3e;border-top:8px solid transparent;left:0;position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-well{border:1px solid #ccc;border-radius:3px;padding:8px;width:100%}.tox .tox-well>:first-child{margin-top:0}.tox .tox-well>:last-child{margin-bottom:0}.tox .tox-well>:only-child{margin:0}.tox .tox-custom-editor{border:1px solid #ccc;border-radius:3px;display:flex;flex:1;position:relative}.tox .tox-dialog-loading::before{background-color:rgba(0,0,0,.5);content:"";height:100%;position:absolute;width:100%;z-index:1000}.tox .tox-tab{cursor:pointer}.tox .tox-dialog__content-js{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-content .tox-collection{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-image-tools-edit-panel{height:60px}.tox .tox-image-tools__sidebar{height:60px} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide/skin.mobile.css b/snowy-admin-web/public/tinymce/skins/ui/oxide/skin.mobile.css new file mode 100644 index 00000000..875721a2 --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide/skin.mobile.css @@ -0,0 +1,673 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +/* RESET all the things! */ +.tinymce-mobile-outer-container { + all: initial; + display: block; +} +.tinymce-mobile-outer-container * { + border: 0; + box-sizing: initial; + cursor: inherit; + float: none; + line-height: 1; + margin: 0; + outline: 0; + padding: 0; + -webkit-tap-highlight-color: transparent; + /* TBIO-3691, stop the gray flicker on touch. */ + text-shadow: none; + white-space: nowrap; +} +.tinymce-mobile-icon-arrow-back::before { + content: "\e5cd"; +} +.tinymce-mobile-icon-image::before { + content: "\e412"; +} +.tinymce-mobile-icon-cancel-circle::before { + content: "\e5c9"; +} +.tinymce-mobile-icon-full-dot::before { + content: "\e061"; +} +.tinymce-mobile-icon-align-center::before { + content: "\e234"; +} +.tinymce-mobile-icon-align-left::before { + content: "\e236"; +} +.tinymce-mobile-icon-align-right::before { + content: "\e237"; +} +.tinymce-mobile-icon-bold::before { + content: "\e238"; +} +.tinymce-mobile-icon-italic::before { + content: "\e23f"; +} +.tinymce-mobile-icon-unordered-list::before { + content: "\e241"; +} +.tinymce-mobile-icon-ordered-list::before { + content: "\e242"; +} +.tinymce-mobile-icon-font-size::before { + content: "\e245"; +} +.tinymce-mobile-icon-underline::before { + content: "\e249"; +} +.tinymce-mobile-icon-link::before { + content: "\e157"; +} +.tinymce-mobile-icon-unlink::before { + content: "\eca2"; +} +.tinymce-mobile-icon-color::before { + content: "\e891"; +} +.tinymce-mobile-icon-previous::before { + content: "\e314"; +} +.tinymce-mobile-icon-next::before { + content: "\e315"; +} +.tinymce-mobile-icon-large-font::before, +.tinymce-mobile-icon-style-formats::before { + content: "\e264"; +} +.tinymce-mobile-icon-undo::before { + content: "\e166"; +} +.tinymce-mobile-icon-redo::before { + content: "\e15a"; +} +.tinymce-mobile-icon-removeformat::before { + content: "\e239"; +} +.tinymce-mobile-icon-small-font::before { + content: "\e906"; +} +.tinymce-mobile-icon-readonly-back::before, +.tinymce-mobile-format-matches::after { + content: "\e5ca"; +} +.tinymce-mobile-icon-small-heading::before { + content: "small"; +} +.tinymce-mobile-icon-large-heading::before { + content: "large"; +} +.tinymce-mobile-icon-small-heading::before, +.tinymce-mobile-icon-large-heading::before { + font-family: sans-serif; + font-size: 80%; +} +.tinymce-mobile-mask-edit-icon::before { + content: "\e254"; +} +.tinymce-mobile-icon-back::before { + content: "\e5c4"; +} +.tinymce-mobile-icon-heading::before { + /* TODO: Translate */ + content: "Headings"; + font-family: sans-serif; + font-size: 80%; + font-weight: bold; +} +.tinymce-mobile-icon-h1::before { + content: "H1"; + font-weight: bold; +} +.tinymce-mobile-icon-h2::before { + content: "H2"; + font-weight: bold; +} +.tinymce-mobile-icon-h3::before { + content: "H3"; + font-weight: bold; +} +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask { + align-items: center; + display: flex; + justify-content: center; + background: rgba(51, 51, 51, 0.5); + height: 100%; + position: absolute; + top: 0; + width: 100%; +} +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container { + align-items: center; + border-radius: 50%; + display: flex; + flex-direction: column; + font-family: sans-serif; + font-size: 1em; + justify-content: space-between; +} +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item { + align-items: center; + display: flex; + justify-content: center; + border-radius: 50%; + height: 2.1em; + width: 2.1em; +} +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section { + align-items: center; + display: flex; + justify-content: center; + flex-direction: column; + font-size: 1em; +} +@media only screen and (min-device-width:700px) { + .tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section { + font-size: 1.2em; + } +} +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon { + align-items: center; + display: flex; + justify-content: center; + border-radius: 50%; + height: 2.1em; + width: 2.1em; + background-color: white; + color: #207ab7; +} +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before { + content: "\e900"; + font-family: 'tinymce-mobile', sans-serif; +} +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon { + z-index: 2; +} +.tinymce-mobile-android-container.tinymce-mobile-android-maximized { + background: #ffffff; + border: none; + bottom: 0; + display: flex; + flex-direction: column; + left: 0; + position: fixed; + right: 0; + top: 0; +} +.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized) { + position: relative; +} +.tinymce-mobile-android-container .tinymce-mobile-editor-socket { + display: flex; + flex-grow: 1; +} +.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe { + display: flex !important; + flex-grow: 1; + height: auto !important; +} +.tinymce-mobile-android-scroll-reload { + overflow: hidden; +} +:not(.tinymce-mobile-readonly-mode) > .tinymce-mobile-android-selection-context-toolbar { + margin-top: 23px; +} +.tinymce-mobile-toolstrip { + background: #fff; + display: flex; + flex: 0 0 auto; + z-index: 1; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar { + align-items: center; + background-color: #fff; + border-bottom: 1px solid #cccccc; + display: flex; + flex: 1; + height: 2.5em; + width: 100%; + /* Make it no larger than the toolstrip, so that it needs to scroll */ +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group { + align-items: center; + display: flex; + height: 100%; + flex-shrink: 1; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group > div { + align-items: center; + display: flex; + height: 100%; + flex: 1; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container { + background: #f44336; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group { + flex-grow: 1; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item { + padding-left: 0.5em; + padding-right: 0.5em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button { + align-items: center; + display: flex; + height: 80%; + margin-left: 2px; + margin-right: 2px; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected { + background: #c8cbcf; + color: #cccccc; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type, +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type { + background: #207ab7; + color: #eceff1; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar { + /* Note, this file is imported inside .tinymce-mobile-context-toolbar, so that prefix is on everything here. */ +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group { + align-items: center; + display: flex; + height: 100%; + flex: 1; + padding-bottom: 0.4em; + padding-top: 0.4em; + /* Make any buttons appearing on the left and right display in the centre (e.g. color edges) */ + /* For widgets like the colour picker, use the whole height */ +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog { + display: flex; + min-height: 1.5em; + overflow: hidden; + padding-left: 0; + padding-right: 0; + position: relative; + width: 100%; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain { + display: flex; + height: 100%; + transition: left cubic-bezier(0.4, 0, 1, 1) 0.15s; + width: 100%; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen { + display: flex; + flex: 0 0 auto; + justify-content: space-between; + width: 100%; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input { + font-family: Sans-serif; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container { + display: flex; + flex-grow: 1; + position: relative; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x { + -ms-grid-row-align: center; + align-self: center; + background: inherit; + border: none; + border-radius: 50%; + color: #888; + font-size: 0.6em; + font-weight: bold; + height: 100%; + padding-right: 2px; + position: absolute; + right: 0; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x { + display: none; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous, +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next { + align-items: center; + display: flex; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous::before, +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before { + align-items: center; + display: flex; + font-weight: bold; + height: 100%; + padding-left: 0.5em; + padding-right: 0.5em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous.tinymce-mobile-toolbar-navigation-disabled::before, +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before { + visibility: hidden; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item { + color: #cccccc; + font-size: 10px; + line-height: 10px; + margin: 0 2px; + padding-top: 3px; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active { + color: #c8cbcf; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before, +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before { + margin-left: 0.5em; + margin-right: 0.9em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before, +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before { + margin-left: 0.9em; + margin-right: 0.5em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider { + display: flex; + flex: 1; + margin-left: 0; + margin-right: 0; + padding: 0.28em 0; + position: relative; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container { + align-items: center; + display: flex; + flex-grow: 1; + height: 100%; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line { + background: #cccccc; + display: flex; + flex: 1; + height: 0.2em; + margin-bottom: 0.3em; + margin-top: 0.3em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container { + padding-left: 2em; + padding-right: 2em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container { + align-items: center; + display: flex; + flex-grow: 1; + height: 100%; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient { + background: linear-gradient(to right, hsl(0, 100%, 50%) 0%, hsl(60, 100%, 50%) 17%, hsl(120, 100%, 50%) 33%, hsl(180, 100%, 50%) 50%, hsl(240, 100%, 50%) 67%, hsl(300, 100%, 50%) 83%, hsl(0, 100%, 50%) 100%); + display: flex; + flex: 1; + height: 0.2em; + margin-bottom: 0.3em; + margin-top: 0.3em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black { + /* Not part of theming */ + background: black; + height: 0.2em; + margin-bottom: 0.3em; + margin-top: 0.3em; + width: 1.2em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white { + /* Not part of theming */ + background: white; + height: 0.2em; + margin-bottom: 0.3em; + margin-top: 0.3em; + width: 1.2em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb { + /* vertically centering trick (margin: auto, top: 0, bottom: 0). On iOS and Safari, if you leave + * out these values, then it shows the thumb at the top of the spectrum. This is probably because it is + * absolutely positioned with only a left value, and not a top. Note, on Chrome it seems to be fine without + * this approach. + */ + align-items: center; + background-clip: padding-box; + background-color: #455a64; + border: 0.5em solid rgba(136, 136, 136, 0); + border-radius: 3em; + bottom: 0; + color: #fff; + display: flex; + height: 0.5em; + justify-content: center; + left: -10px; + margin: auto; + position: absolute; + top: 0; + transition: border 120ms cubic-bezier(0.39, 0.58, 0.57, 1); + width: 0.5em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active { + border: 0.5em solid rgba(136, 136, 136, 0.39); +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper, +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group > div { + align-items: center; + display: flex; + height: 100%; + flex: 1; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper { + flex-direction: column; + justify-content: center; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item { + align-items: center; + display: flex; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog) { + height: 100%; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container { + display: flex; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input { + background: #ffffff; + border: none; + border-radius: 0; + color: #455a64; + flex-grow: 1; + font-size: 0.85em; + padding-bottom: 0.1em; + padding-left: 5px; + padding-top: 0.1em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder { + /* WebKit, Blink, Edge */ + color: #888; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder { + /* WebKit, Blink, Edge */ + color: #888; +} +/* dropup */ +.tinymce-mobile-dropup { + background: white; + display: flex; + overflow: hidden; + width: 100%; +} +.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking { + transition: height 0.3s ease-out; +} +.tinymce-mobile-dropup.tinymce-mobile-dropup-growing { + transition: height 0.3s ease-in; +} +.tinymce-mobile-dropup.tinymce-mobile-dropup-closed { + flex-grow: 0; +} +.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing) { + flex-grow: 1; +} +/* TODO min-height for device size and orientation */ +.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) { + min-height: 200px; +} +@media only screen and (orientation: landscape) { + .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) { + min-height: 200px; + } +} +@media only screen and (min-device-width : 320px) and (max-device-width : 568px) and (orientation : landscape) { + .tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) { + min-height: 150px; + } +} +/* styles menu */ +.tinymce-mobile-styles-menu { + font-family: sans-serif; + outline: 4px solid black; + overflow: hidden; + position: relative; + width: 100%; +} +.tinymce-mobile-styles-menu [role="menu"] { + display: flex; + flex-direction: column; + height: 100%; + position: absolute; + width: 100%; +} +.tinymce-mobile-styles-menu [role="menu"].transitioning { + transition: transform 0.5s ease-in-out; +} +.tinymce-mobile-styles-menu .tinymce-mobile-styles-item { + border-bottom: 1px solid #ddd; + color: #455a64; + cursor: pointer; + display: flex; + padding: 1em 1em; + position: relative; +} +.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before { + color: #455a64; + content: "\e314"; + font-family: 'tinymce-mobile', sans-serif; +} +.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after { + color: #455a64; + content: "\e315"; + font-family: 'tinymce-mobile', sans-serif; + padding-left: 1em; + padding-right: 1em; + position: absolute; + right: 0; +} +.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after { + font-family: 'tinymce-mobile', sans-serif; + padding-left: 1em; + padding-right: 1em; + position: absolute; + right: 0; +} +.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator, +.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser { + align-items: center; + background: #fff; + border-top: #455a64; + color: #455a64; + display: flex; + min-height: 2.5em; + padding-left: 1em; + padding-right: 1em; +} +.tinymce-mobile-styles-menu [data-transitioning-destination="before"][data-transitioning-state], +.tinymce-mobile-styles-menu [data-transitioning-state="before"] { + transform: translate(-100%); +} +.tinymce-mobile-styles-menu [data-transitioning-destination="current"][data-transitioning-state], +.tinymce-mobile-styles-menu [data-transitioning-state="current"] { + transform: translate(0%); +} +.tinymce-mobile-styles-menu [data-transitioning-destination="after"][data-transitioning-state], +.tinymce-mobile-styles-menu [data-transitioning-state="after"] { + transform: translate(100%); +} +@font-face { + font-family: 'tinymce-mobile'; + font-style: normal; + font-weight: normal; + src: url('fonts/tinymce-mobile.woff?8x92w3') format('woff'); +} +@media (min-device-width: 700px) { + .tinymce-mobile-outer-container, + .tinymce-mobile-outer-container input { + font-size: 25px; + } +} +@media (max-device-width: 700px) { + .tinymce-mobile-outer-container, + .tinymce-mobile-outer-container input { + font-size: 18px; + } +} +.tinymce-mobile-icon { + font-family: 'tinymce-mobile', sans-serif; +} +.mixin-flex-and-centre { + align-items: center; + display: flex; + justify-content: center; +} +.mixin-flex-bar { + align-items: center; + display: flex; + height: 100%; +} +.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe { + background-color: #fff; + width: 100%; +} +.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon { + /* Note, on the iPod touch in landscape, this isn't visible when the navbar appears */ + background-color: #207ab7; + border-radius: 50%; + bottom: 1em; + color: white; + font-size: 1em; + height: 2.1em; + position: fixed; + right: 2em; + width: 2.1em; + align-items: center; + display: flex; + justify-content: center; +} +@media only screen and (min-device-width:700px) { + .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon { + font-size: 1.2em; + } +} +.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket { + height: 300px; + overflow: hidden; +} +.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe { + height: 100%; +} +.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip { + display: none; +} +/* + Note, that if you don't include this (::-webkit-file-upload-button), the toolbar width gets + increased and the whole body becomes scrollable. It's important! + */ +input[type="file"]::-webkit-file-upload-button { + display: none; +} +@media only screen and (min-device-width : 320px) and (max-device-width : 568px) and (orientation : landscape) { + .tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon { + bottom: 50%; + } +} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide/skin.mobile.min.css b/snowy-admin-web/public/tinymce/skins/ui/oxide/skin.mobile.min.css new file mode 100644 index 00000000..3a45cacf --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide/skin.mobile.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tinymce-mobile-outer-container{all:initial;display:block}.tinymce-mobile-outer-container *{border:0;box-sizing:initial;cursor:inherit;float:none;line-height:1;margin:0;outline:0;padding:0;-webkit-tap-highlight-color:transparent;text-shadow:none;white-space:nowrap}.tinymce-mobile-icon-arrow-back::before{content:"\e5cd"}.tinymce-mobile-icon-image::before{content:"\e412"}.tinymce-mobile-icon-cancel-circle::before{content:"\e5c9"}.tinymce-mobile-icon-full-dot::before{content:"\e061"}.tinymce-mobile-icon-align-center::before{content:"\e234"}.tinymce-mobile-icon-align-left::before{content:"\e236"}.tinymce-mobile-icon-align-right::before{content:"\e237"}.tinymce-mobile-icon-bold::before{content:"\e238"}.tinymce-mobile-icon-italic::before{content:"\e23f"}.tinymce-mobile-icon-unordered-list::before{content:"\e241"}.tinymce-mobile-icon-ordered-list::before{content:"\e242"}.tinymce-mobile-icon-font-size::before{content:"\e245"}.tinymce-mobile-icon-underline::before{content:"\e249"}.tinymce-mobile-icon-link::before{content:"\e157"}.tinymce-mobile-icon-unlink::before{content:"\eca2"}.tinymce-mobile-icon-color::before{content:"\e891"}.tinymce-mobile-icon-previous::before{content:"\e314"}.tinymce-mobile-icon-next::before{content:"\e315"}.tinymce-mobile-icon-large-font::before,.tinymce-mobile-icon-style-formats::before{content:"\e264"}.tinymce-mobile-icon-undo::before{content:"\e166"}.tinymce-mobile-icon-redo::before{content:"\e15a"}.tinymce-mobile-icon-removeformat::before{content:"\e239"}.tinymce-mobile-icon-small-font::before{content:"\e906"}.tinymce-mobile-format-matches::after,.tinymce-mobile-icon-readonly-back::before{content:"\e5ca"}.tinymce-mobile-icon-small-heading::before{content:"small"}.tinymce-mobile-icon-large-heading::before{content:"large"}.tinymce-mobile-icon-large-heading::before,.tinymce-mobile-icon-small-heading::before{font-family:sans-serif;font-size:80%}.tinymce-mobile-mask-edit-icon::before{content:"\e254"}.tinymce-mobile-icon-back::before{content:"\e5c4"}.tinymce-mobile-icon-heading::before{content:"Headings";font-family:sans-serif;font-size:80%;font-weight:700}.tinymce-mobile-icon-h1::before{content:"H1";font-weight:700}.tinymce-mobile-icon-h2::before{content:"H2";font-weight:700}.tinymce-mobile-icon-h3::before{content:"H3";font-weight:700}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask{align-items:center;display:flex;justify-content:center;background:rgba(51,51,51,.5);height:100%;position:absolute;top:0;width:100%}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container{align-items:center;border-radius:50%;display:flex;flex-direction:column;font-family:sans-serif;font-size:1em;justify-content:space-between}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{align-items:center;display:flex;justify-content:center;flex-direction:column;font-size:1em}@media only screen and (min-device-width:700px){.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{font-size:1.2em}}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em;background-color:#fff;color:#207ab7}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before{content:"\e900";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon{z-index:2}.tinymce-mobile-android-container.tinymce-mobile-android-maximized{background:#fff;border:none;bottom:0;display:flex;flex-direction:column;left:0;position:fixed;right:0;top:0}.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized){position:relative}.tinymce-mobile-android-container .tinymce-mobile-editor-socket{display:flex;flex-grow:1}.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe{display:flex!important;flex-grow:1;height:auto!important}.tinymce-mobile-android-scroll-reload{overflow:hidden}:not(.tinymce-mobile-readonly-mode)>.tinymce-mobile-android-selection-context-toolbar{margin-top:23px}.tinymce-mobile-toolstrip{background:#fff;display:flex;flex:0 0 auto;z-index:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar{align-items:center;background-color:#fff;border-bottom:1px solid #ccc;display:flex;flex:1;height:2.5em;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex-shrink:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container{background:#f44336}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group{flex-grow:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button{align-items:center;display:flex;height:80%;margin-left:2px;margin-right:2px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected{background:#c8cbcf;color:#ccc}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type{background:#207ab7;color:#eceff1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex:1;padding-bottom:.4em;padding-top:.4em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog{display:flex;min-height:1.5em;overflow:hidden;padding-left:0;padding-right:0;position:relative;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain{display:flex;height:100%;transition:left cubic-bezier(.4,0,1,1) .15s;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen{display:flex;flex:0 0 auto;justify-content:space-between;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input{font-family:Sans-serif}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container{display:flex;flex-grow:1;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x{-ms-grid-row-align:center;align-self:center;background:inherit;border:none;border-radius:50%;color:#888;font-size:.6em;font-weight:700;height:100%;padding-right:2px;position:absolute;right:0}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x{display:none}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous::before{align-items:center;display:flex;font-weight:700;height:100%;padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous.tinymce-mobile-toolbar-navigation-disabled::before{visibility:hidden}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item{color:#ccc;font-size:10px;line-height:10px;margin:0 2px;padding-top:3px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active{color:#c8cbcf}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before{margin-left:.5em;margin-right:.9em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before{margin-left:.9em;margin-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider{display:flex;flex:1;margin-left:0;margin-right:0;padding:.28em 0;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line{background:#ccc;display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container{padding-left:2em;padding-right:2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient{background:linear-gradient(to right,red 0,#feff00 17%,#0f0 33%,#00feff 50%,#00f 67%,#ff00fe 83%,red 100%);display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black{background:#000;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white{background:#fff;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb{align-items:center;background-clip:padding-box;background-color:#455a64;border:.5em solid rgba(136,136,136,0);border-radius:3em;bottom:0;color:#fff;display:flex;height:.5em;justify-content:center;left:-10px;margin:auto;position:absolute;top:0;transition:border 120ms cubic-bezier(.39,.58,.57,1);width:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active{border:.5em solid rgba(136,136,136,.39)}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper{flex-direction:column;justify-content:center}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog){height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container{display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input{background:#fff;border:none;border-radius:0;color:#455a64;flex-grow:1;font-size:.85em;padding-bottom:.1em;padding-left:5px;padding-top:.1em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder{color:#888}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder{color:#888}.tinymce-mobile-dropup{background:#fff;display:flex;overflow:hidden;width:100%}.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking{transition:height .3s ease-out}.tinymce-mobile-dropup.tinymce-mobile-dropup-growing{transition:height .3s ease-in}.tinymce-mobile-dropup.tinymce-mobile-dropup-closed{flex-grow:0}.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing){flex-grow:1}.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}@media only screen and (orientation:landscape){.tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:150px}}.tinymce-mobile-styles-menu{font-family:sans-serif;outline:4px solid #000;overflow:hidden;position:relative;width:100%}.tinymce-mobile-styles-menu [role=menu]{display:flex;flex-direction:column;height:100%;position:absolute;width:100%}.tinymce-mobile-styles-menu [role=menu].transitioning{transition:transform .5s ease-in-out}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item{border-bottom:1px solid #ddd;color:#455a64;cursor:pointer;display:flex;padding:1em 1em;position:relative}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before{color:#455a64;content:"\e314";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after{color:#455a64;content:"\e315";font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after{font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser,.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator{align-items:center;background:#fff;border-top:#455a64;color:#455a64;display:flex;min-height:2.5em;padding-left:1em;padding-right:1em}.tinymce-mobile-styles-menu [data-transitioning-destination=before][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=before]{transform:translate(-100%)}.tinymce-mobile-styles-menu [data-transitioning-destination=current][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=current]{transform:translate(0)}.tinymce-mobile-styles-menu [data-transitioning-destination=after][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=after]{transform:translate(100%)}@font-face{font-family:tinymce-mobile;font-style:normal;font-weight:400;src:url(fonts/tinymce-mobile.woff?8x92w3) format('woff')}@media (min-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:25px}}@media (max-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:18px}}.tinymce-mobile-icon{font-family:tinymce-mobile,sans-serif}.mixin-flex-and-centre{align-items:center;display:flex;justify-content:center}.mixin-flex-bar{align-items:center;display:flex;height:100%}.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe{background-color:#fff;width:100%}.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{background-color:#207ab7;border-radius:50%;bottom:1em;color:#fff;font-size:1em;height:2.1em;position:fixed;right:2em;width:2.1em;align-items:center;display:flex;justify-content:center}@media only screen and (min-device-width:700px){.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{font-size:1.2em}}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket{height:300px;overflow:hidden}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe{height:100%}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip{display:none}input[type=file]::-webkit-file-upload-button{display:none}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{bottom:50%}} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide/skin.shadowdom.css b/snowy-admin-web/public/tinymce/skins/ui/oxide/skin.shadowdom.css new file mode 100644 index 00000000..715978b5 --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide/skin.shadowdom.css @@ -0,0 +1,37 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +body.tox-dialog__disable-scroll { + overflow: hidden; +} +.tox-fullscreen { + border: 0; + height: 100%; + left: 0; + margin: 0; + overflow: hidden; + -ms-scroll-chaining: none; + overscroll-behavior: none; + padding: 0; + position: fixed; + top: 0; + touch-action: pinch-zoom; + width: 100%; +} +.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle { + display: none; +} +.tox.tox-tinymce.tox-fullscreen { + background-color: transparent; + z-index: 1200; +} +.tox-shadowhost.tox-fullscreen { + z-index: 1200; +} +.tox-fullscreen .tox.tox-tinymce-aux, +.tox-fullscreen ~ .tox.tox-tinymce-aux { + z-index: 1201; +} diff --git a/snowy-admin-web/public/tinymce/skins/ui/oxide/skin.shadowdom.min.css b/snowy-admin-web/public/tinymce/skins/ui/oxide/skin.shadowdom.min.css new file mode 100644 index 00000000..9ba6e02c --- /dev/null +++ b/snowy-admin-web/public/tinymce/skins/ui/oxide/skin.shadowdom.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;left:0;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;position:fixed;top:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox.tox-tinymce.tox-fullscreen{background-color:transparent;z-index:1200}.tox-shadowhost.tox-fullscreen{z-index:1200}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} diff --git a/snowy-admin-web/src/App.vue b/snowy-admin-web/src/App.vue new file mode 100644 index 00000000..91f18bdf --- /dev/null +++ b/snowy-admin-web/src/App.vue @@ -0,0 +1,29 @@ + + + diff --git a/snowy-admin-web/src/api/auth/loginApi.js b/snowy-admin-web/src/api/auth/loginApi.js new file mode 100644 index 00000000..2df7d3a7 --- /dev/null +++ b/snowy-admin-web/src/api/auth/loginApi.js @@ -0,0 +1,45 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/auth/b/${url}`, ...arg) +/** + * 登录 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // B端获取图片验证码 + getPicCaptcha(data) { + return request('getPicCaptcha', data, 'get') + }, + // B端获取手机验证码 + getPhoneValidCode(data) { + return request('getPhoneValidCode', data, 'get') + }, + // B端账号密码登录 + login(data) { + return request('doLogin', data, 'post', false) + }, + // B端手机验证码登录 + loginByPhone(data) { + return request('doLoginByPhone', data, 'post', false) + }, + // 退出 + logout(data) { + return request('doLogout', data, 'get') + }, + // 获取用户信息 + getLoginUser(data) { + return request('getLoginUser', data, 'get') + } +} diff --git a/snowy-admin-web/src/api/auth/monitorApi.js b/snowy-admin-web/src/api/auth/monitorApi.js new file mode 100644 index 00000000..7ac0f8e7 --- /dev/null +++ b/snowy-admin-web/src/api/auth/monitorApi.js @@ -0,0 +1,49 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/auth/${url}`, ...arg) +/** + * 绘画 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 会话统计 + monitorAnalysis(data) { + return request('session/analysis', data, 'get') + }, + // 获取会话分页 + monitorBPage(data) { + return request('session/b/page', data, 'get') + }, + // 获取会话分页 + monitorCPage(data) { + return request('session/c/page', data, 'get') + }, + // 强退B端session + monitorBExit(data) { + return request('session/b/exit', data) + }, + // 强退C端session + monitorCExit(data) { + return request('session/c/exit', data) + }, + // 强退B端token + monitorTokenBExit(data) { + return request('token/b/exit', data) + }, + // 强退C端token + monitorTokenCExit(data) { + return request('token/c/exit', data) + } +} diff --git a/snowy-admin-web/src/api/auth/oauthApi.js b/snowy-admin-web/src/api/auth/oauthApi.js new file mode 100644 index 00000000..2cb98b1c --- /dev/null +++ b/snowy-admin-web/src/api/auth/oauthApi.js @@ -0,0 +1,29 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/auth/third/${url}`, ...arg) +/** + * 三方登录 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 第三方登录页面渲染 + thirdRender(data) { + return request('render', data, 'get') + }, + // 第三方登录授权回调 + thirdCallback(data) { + return request('callback', data, 'get') + } +} diff --git a/snowy-admin-web/src/api/auth/thirdApi.js b/snowy-admin-web/src/api/auth/thirdApi.js new file mode 100644 index 00000000..d1404be7 --- /dev/null +++ b/snowy-admin-web/src/api/auth/thirdApi.js @@ -0,0 +1,33 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/auth/third/${url}`, ...arg) +/** + * 三方用户 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取三方用户分页 + thirdPage(data) { + return request('page', data, 'get') + }, + // 第三方登录页面渲染 + thirdRender(data) { + return request('render', data, 'get') + }, + // 第三方登录授权回调 + thirdCallback(data) { + return request('callback', data, 'get') + } +} diff --git a/snowy-admin-web/src/api/biz/bizOrgApi.js b/snowy-admin-web/src/api/biz/bizOrgApi.js new file mode 100644 index 00000000..e05e2a6a --- /dev/null +++ b/snowy-admin-web/src/api/biz/bizOrgApi.js @@ -0,0 +1,45 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/biz/org/${url}`, ...arg) +/** + * 机构 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取机构分页 + orgPage(data) { + return request('page', data, 'get') + }, + // 获取机构列表 + orgList(data) { + return request('list', data, 'get') + }, + // 获取机构树 + orgTree(data) { + return request('tree', data, 'get') + }, + // 提交表单 edit为true时为编辑,默认为新增 + submitForm(data, edit = false) { + return request(edit ? 'add' : 'edit', data) + }, + // 删除机构 + orgDelete(data) { + return request('delete', data) + }, + // 获取机构详情 + orgDetail(data) { + return request('detail', data, 'get') + } +} diff --git a/snowy-admin-web/src/api/biz/bizPositionApi.js b/snowy-admin-web/src/api/biz/bizPositionApi.js new file mode 100644 index 00000000..a049e554 --- /dev/null +++ b/snowy-admin-web/src/api/biz/bizPositionApi.js @@ -0,0 +1,41 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/biz/position/${url}`, ...arg) +/** + * 岗位 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取岗位分页 + positionPage(data) { + return request('page', data, 'get') + }, + // 获取岗位列表 + positionList(data) { + return request('list', data, 'get') + }, + // 提交表单 edit为true时为编辑,默认为新增 + submitForm(data, edit = false) { + return request(edit ? 'add' : 'edit', data) + }, + // 删除岗位 + positionDelete(data) { + return request('delete', data) + }, + // 获取岗位详情 + positionDetail(data) { + return request('detail', data, 'get') + } +} diff --git a/snowy-admin-web/src/api/biz/bizUserApi.js b/snowy-admin-web/src/api/biz/bizUserApi.js new file mode 100644 index 00000000..eff4af13 --- /dev/null +++ b/snowy-admin-web/src/api/biz/bizUserApi.js @@ -0,0 +1,73 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/biz/user/${url}`, ...arg) +/** + * 人员接口api + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取人员分页 + userPage(data) { + return request('page', data, 'get') + }, + // 提交表单 edit为true时为编辑,默认为新增 + submitForm(data, edit = false) { + return request(edit ? 'add' : 'edit', data) + }, + // 删除人员 + userDelete(data) { + return request('delete', data) + }, + // 获取人员详情 + userDetail(data) { + return request('detail', data, 'get') + }, + // 禁用人员 + userDisableUser(data) { + return request('disableUser', data) + }, + // 启用人员 + userEnableUser(data) { + return request('enableUser', data) + }, + // 重置人员密码 + userResetPassword(data) { + return request('resetPassword', data) + }, + // 获取组织选择器 + userOrgTreeSelector(data) { + return request('orgTreeSelector', data, 'get') + }, + // 获取职位选择器 + userPositionSelector(data) { + return request('positionSelector', data, 'get') + }, + // 获取角色选择器 + userRoleSelector(data) { + return request('roleSelector', data, 'get') + }, + // 获取人员选择器 + userSelector(data) { + return request('userSelector', data, 'get') + }, + // 人员拥有角色 + userOwnRole(data) { + return request('ownRole', data, 'get') + }, + // 给人员授权角色 + grantRole(data) { + return request('grantRole', data) + } +} diff --git a/snowy-admin-web/src/api/components/Selector/orgSelectorPlusApi.js b/snowy-admin-web/src/api/components/Selector/orgSelectorPlusApi.js new file mode 100644 index 00000000..10c70e67 --- /dev/null +++ b/snowy-admin-web/src/api/components/Selector/orgSelectorPlusApi.js @@ -0,0 +1,29 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`${url}`, ...arg) +/** + * 机构选择器 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取机构分页 + orgSelector(url, data = {}) { + return request(url, data, 'get') + }, + // 获取机构树 + treeSelector(url, data = {}) { + return request(url, data, 'get') + } +} diff --git a/snowy-admin-web/src/api/components/Selector/posSelectorPlusApi.js b/snowy-admin-web/src/api/components/Selector/posSelectorPlusApi.js new file mode 100644 index 00000000..181e570e --- /dev/null +++ b/snowy-admin-web/src/api/components/Selector/posSelectorPlusApi.js @@ -0,0 +1,29 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`${url}`, ...arg) +/** + * 职位选择器 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取职位分页 + posSelector(url, data = {}) { + return request(url, data, 'get') + }, + // 获取机构树 + treeSelector(url, data = {}) { + return request(url, data, 'get') + } +} diff --git a/snowy-admin-web/src/api/components/Selector/roleSelectorPlusApi.js b/snowy-admin-web/src/api/components/Selector/roleSelectorPlusApi.js new file mode 100644 index 00000000..c3de6289 --- /dev/null +++ b/snowy-admin-web/src/api/components/Selector/roleSelectorPlusApi.js @@ -0,0 +1,29 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`${url}`, ...arg) +/** + * 角色选择器 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取角色分页 + roleSelector(url, data = {}) { + return request(url, data, 'get') + }, + // 获取机构树分页 + treeSelector(url, data = {}) { + return request(url, data, 'get') + } +} diff --git a/snowy-admin-web/src/api/components/Selector/userSelectorPlusApi.js b/snowy-admin-web/src/api/components/Selector/userSelectorPlusApi.js new file mode 100644 index 00000000..0ac3c90d --- /dev/null +++ b/snowy-admin-web/src/api/components/Selector/userSelectorPlusApi.js @@ -0,0 +1,29 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`${url}`, ...arg) +/** + * 用户选择器 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取用户分页 + userSelector(url, data = {}) { + return request(url, data, 'get') + }, + // 获取机构树 + treeSelector(url, data = {}) { + return request(url, data, 'get') + } +} diff --git a/snowy-admin-web/src/api/dev/configApi.js b/snowy-admin-web/src/api/dev/configApi.js new file mode 100644 index 00000000..05cd3635 --- /dev/null +++ b/snowy-admin-web/src/api/dev/configApi.js @@ -0,0 +1,49 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/dev/config/${url}`, ...arg) +/** + * 配置 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取配置分页 + configPage(data) { + return request('page', data, 'get') + }, + // 获取配置列表 + configList(data) { + return request('list', data, 'get') + }, + // 提交表单 edit为true时为编辑,默认为新增 + submitForm(data, edit = false) { + return request(edit ? 'add' : 'edit', data) + }, + // 删除配置 + configDelete(data) { + return request('delete', data) + }, + // 获取配置详情 + configDetail(data) { + return request('detail', data, 'get') + }, + // 配置批量更新 + configEditForm(data) { + return request('editBatch', data) + }, + // 获取系统基础配置 + configSysBaseList(data) { + return request('sysBaseList', data, 'get') + } +} diff --git a/snowy-admin-web/src/api/dev/dictApi.js b/snowy-admin-web/src/api/dev/dictApi.js new file mode 100644 index 00000000..e5f98909 --- /dev/null +++ b/snowy-admin-web/src/api/dev/dictApi.js @@ -0,0 +1,45 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/dev/dict/${url}`, ...arg) +/** + * 字典 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取字典分页 + dictPage(data) { + return request('page', data, 'get') + }, + // 获取字典列表 + dictList(data) { + return request('list', data, 'get') + }, + // 获取字典树 + dictTree(data) { + return request('tree', data, 'get') + }, + // 提交表单 edit为true时为编辑,默认为新增 + submitForm(data, edit = false) { + return request(edit ? 'add' : 'edit', data) + }, + // 删除字典 + dictDelete(data) { + return request('delete', data) + }, + // 获取字典详情 + dictDetail(data) { + return request('detail', data, 'get') + } +} diff --git a/snowy-admin-web/src/api/dev/emailApi.js b/snowy-admin-web/src/api/dev/emailApi.js new file mode 100644 index 00000000..e385ce74 --- /dev/null +++ b/snowy-admin-web/src/api/dev/emailApi.js @@ -0,0 +1,65 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/dev/email/${url}`, ...arg) +/** + * 邮件 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取邮件分页 + emailPage(data) { + return request('page', data, 'get') + }, + // 发送邮件——本地TXT + emailSendLocalTxt(data) { + return request('sendLocalTxt', data) + }, + // 发送邮件——本地HTML + emailSendLocalHtml(data) { + return request('sendLocalHtml', data) + }, + // 发送邮件——阿里云TXT + emailSendAliyunTxt(data) { + return request('sendAliyunTxt', data) + }, + // 发送邮件——阿里云HTML + emailSendAliyunHtml(data) { + return request('sendAliyunHtml', data) + }, + // 发送邮件——阿里云TMP + emailSendAliyunTmp(data) { + return request('sendAliyunTmp', data) + }, + // 发送邮件——腾讯云TXT + emailSendTencentTxt(data) { + return request('sendTencentTxt', data) + }, + // 发送邮件——腾讯云HTML + emailSendTencentHtml(data) { + return request('sendTencentHtml', data) + }, + // 发送邮件——腾讯云TMP + emailSendTencentTmp(data) { + return request('sendTencentTmp', data) + }, + // 删除邮件 + emailDelete(data) { + return request('delete', data) + }, + // 获取邮件详情 + emailDetail(data) { + return request('detail', data, 'get') + } +} diff --git a/snowy-admin-web/src/api/dev/fileApi.js b/snowy-admin-web/src/api/dev/fileApi.js new file mode 100644 index 00000000..77b18e86 --- /dev/null +++ b/snowy-admin-web/src/api/dev/fileApi.js @@ -0,0 +1,83 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/dev/file/${url}`, ...arg) +/** + * 文件 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 动态上传文件返回id + fileUploadDynamicReturnId(data) { + return request('uploadDynamicReturnId', data) + }, + // 动态上传文件返回url + fileUploadDynamicReturnUrl(data) { + return request('uploadDynamicReturnUrl', data) + }, + // 本地文件上传,返回文件id + fileUploadReturnId(data) { + return request('uploadLocalReturnId', data) + }, + // 阿里云文件上传,返回文件id + fileUploadAliyunReturnId(data) { + return request('uploadAliyunReturnId', data) + }, + // 腾讯云文件上传,返回文件id + fileUploadTencentReturnId(data) { + return request('uploadTencentReturnId', data) + }, + // MINIO文件上传,返回文件id + fileUploadMinioReturnId(data) { + return request('uploadMinioReturnId', data) + }, + // 本地文件上传,返回文件Url + fileUploadLocalReturnUrl(data) { + return request('uploadLocalReturnUrl', data) + }, + // 阿里云文件上传,返回文件Url + fileUploadAliyunReturnUrl(data) { + return request('uploadAliyunReturnUrl', data) + }, + // 腾讯云文件上传,返回文件Url + fileUploadTencentReturnUrl(data) { + return request('uploadTencentReturnUrl', data) + }, + // MINIO文件上传,返回文件Url + fileUploadMinioReturnUrl(data) { + return request('uploadMinioReturnUrl', data) + }, + // 获取文件分页列表 + filePage(data) { + return request('page', data, 'get') + }, + // 获取文件列表 + fileList(data) { + return request('list', data, 'get') + }, + // 下载文件,这里要带上blob类型 + fileDownload(data) { + return request('download', data, 'get', { + responseType: 'blob' + }) + }, + // 获取文件详情 + fileDetail(data) { + return request('detail', data, 'get') + }, + // 删除文件 + fileDelete(data) { + return request('delete', data) + } +} diff --git a/snowy-admin-web/src/api/dev/jobApi.js b/snowy-admin-web/src/api/dev/jobApi.js new file mode 100644 index 00000000..9ab72727 --- /dev/null +++ b/snowy-admin-web/src/api/dev/jobApi.js @@ -0,0 +1,53 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/dev/job/${url}`, ...arg) +/** + * 定时任务 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取定时任务分页 + jobPage(data) { + return request('page', data, 'get') + }, + // 获取定时任务列表 + jobList(data) { + return request('list', data, 'get') + }, + // 提交表单 edit为true时为编辑,默认为新增 + submitForm(data, edit = false) { + return request(edit ? 'add' : 'edit', data) + }, + // 删除定时任务 + jobDelete(data) { + return request('delete', data) + }, + // 获取定时任务详情 + jobDetail(data) { + return request('detail', data, 'get') + }, + // 停止定时任务 + jobStopJob(data) { + return request('stopJob', data) + }, + // 运行定时任务 + jobRunJob(data) { + return request('runJob', data) + }, + // 获取定时任务类 + jobGetActionClass(data) { + return request('getActionClass', data, 'get') + } +} diff --git a/snowy-admin-web/src/api/dev/logApi.js b/snowy-admin-web/src/api/dev/logApi.js new file mode 100644 index 00000000..8083235c --- /dev/null +++ b/snowy-admin-web/src/api/dev/logApi.js @@ -0,0 +1,45 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/dev/log/${url}`, ...arg) +/** + * 日志 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取日志分页 + logPage(data) { + return request('page', data, 'get') + }, + // 获取访问日志折线图数据 + logVisLineChartData(data) { + return request('vis/lineChartData', data, 'get') + }, + // 获取访问日志饼状图数据 + logVisPieChartData(data) { + return request('vis/pieChartData', data, 'get') + }, + // 获取操作日志柱状图数据 + logOpBarChartData(data) { + return request('op/barChartData', data, 'get') + }, + // 获取操作日志饼状图数据 + logOpPieChartData(data) { + return request('op/pieChartData', data, 'get') + }, + // 清空日志 + logDelete(data) { + return request('delete', data) + } +} diff --git a/snowy-admin-web/src/api/dev/messageApi.js b/snowy-admin-web/src/api/dev/messageApi.js new file mode 100644 index 00000000..32ecaa88 --- /dev/null +++ b/snowy-admin-web/src/api/dev/messageApi.js @@ -0,0 +1,37 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/dev/message/${url}`, ...arg) +/** + * 站内信 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取站内信分页 + messagePage(data) { + return request('page', data, 'get') + }, + // 获取站内信分页 + messageSend(data) { + return request('send', data) + }, + // 删除站内信 + messageDelete(data) { + return request('delete', data) + }, + // 获取站内信详情 + messageDetail(data) { + return request('detail', data, 'get') + } +} diff --git a/snowy-admin-web/src/api/dev/monitorApi.js b/snowy-admin-web/src/api/dev/monitorApi.js new file mode 100644 index 00000000..4913242b --- /dev/null +++ b/snowy-admin-web/src/api/dev/monitorApi.js @@ -0,0 +1,25 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/dev/monitor/${url}`, ...arg) +/** + * 监控 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取服务器监控信息 + monitorServerInfo(data) { + return request('serverInfo', data, 'get') + } +} diff --git a/snowy-admin-web/src/api/dev/smsApi.js b/snowy-admin-web/src/api/dev/smsApi.js new file mode 100644 index 00000000..d3843bd3 --- /dev/null +++ b/snowy-admin-web/src/api/dev/smsApi.js @@ -0,0 +1,41 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/dev/sms/${url}`, ...arg) +/** + * 短信 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取短信分页 + smsPage(data) { + return request('page', data, 'get') + }, + // 发送短信——阿里云 + smsSendAliyun(data) { + return request('sendAliyun', data) + }, + // 发送短信——腾讯云 + smsSendTencent(data) { + return request('sendTencent', data) + }, + // 删除短信 + smsDelete(data) { + return request('delete', data) + }, + // 获取短信详情 + smsDetail(data) { + return request('detail', data, 'get') + } +} diff --git a/snowy-admin-web/src/api/sys/indexApi.js b/snowy-admin-web/src/api/sys/indexApi.js new file mode 100644 index 00000000..89b789f3 --- /dev/null +++ b/snowy-admin-web/src/api/sys/indexApi.js @@ -0,0 +1,49 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/sys/index/${url}`, ...arg) +/** + * 系统首页控制器 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 添加当前用户日程 + indexScheduleAdd(data) { + return request('schedule/add', data) + }, + // 删除日程 + indexScheduleDeleteSchedule(data) { + return request('schedule/deleteSchedule', data) + }, + // 获取当前用户日程列表 + indexScheduleList(data) { + return request('schedule/list', data, 'get') + }, + // 获取当前用户站内信列表 + indexMessageList(data) { + return request('message/list', data, 'get') + }, + // 获取站内信详情 + indexMessageDetail(data) { + return request('message/detail', data, 'get') + }, + // 获取当前用户访问日志列表 + indexVisLogList(data) { + return request('visLog/list', data, 'get') + }, + // 获取当前用户操作日志列表 + indexOpLogList(data) { + return request('opLog/list', data, 'get') + } +} diff --git a/snowy-admin-web/src/api/sys/orgApi.js b/snowy-admin-web/src/api/sys/orgApi.js new file mode 100644 index 00000000..6768a9cf --- /dev/null +++ b/snowy-admin-web/src/api/sys/orgApi.js @@ -0,0 +1,45 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/sys/org/${url}`, ...arg) +/** + * 机构 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取组织分页 + orgPage(data) { + return request('page', data, 'get') + }, + // 获取组织列表 + orgList(data) { + return request('list', data, 'get') + }, + // 获取组织树 + orgTree(data) { + return request('tree', data, 'get') + }, + // 提交表单 edit为true时为编辑,默认为新增 + submitForm(data, edit = false) { + return request(edit ? 'add' : 'edit', data) + }, + // 删除组织 + orgDelete(data) { + return request('delete', data) + }, + // 获取组织详情 + orgDetail(data) { + return request('detail', data, 'get') + } +} diff --git a/snowy-admin-web/src/api/sys/positionApi.js b/snowy-admin-web/src/api/sys/positionApi.js new file mode 100644 index 00000000..119d5717 --- /dev/null +++ b/snowy-admin-web/src/api/sys/positionApi.js @@ -0,0 +1,41 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/sys/position/${url}`, ...arg) +/** + * 职位 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取职位分页 + positionPage(data) { + return request('page', data, 'get') + }, + // 获取职位列表 + positionList(data) { + return request('list', data, 'get') + }, + // 提交表单 edit为true时为编辑,默认为新增 + submitForm(data, edit = false) { + return request(edit ? 'add' : 'edit', data) + }, + // 删除职位 + positionDelete(data) { + return request('delete', data) + }, + // 获取职位详情 + positionDetail(data) { + return request('detail', data, 'get') + } +} diff --git a/snowy-admin-web/src/api/sys/resource/buttonApi.js b/snowy-admin-web/src/api/sys/resource/buttonApi.js new file mode 100644 index 00000000..e8ef9596 --- /dev/null +++ b/snowy-admin-web/src/api/sys/resource/buttonApi.js @@ -0,0 +1,37 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/sys/button/${url}`, ...arg) +/** + * 按钮 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取按钮分页 + buttonPage(data) { + return request('page', data, 'get') + }, + // 提交表单 edit为true时为编辑,默认为新增 + submitForm(data, edit = false) { + return request(edit ? 'add' : 'edit', data) + }, + // 删除按钮 + buttonDelete(data) { + return request('delete', data) + }, + // 获取按钮详情 + buttonDetail(data) { + return request('detail', data, 'get') + } +} diff --git a/snowy-admin-web/src/api/sys/resource/fieldApi.js b/snowy-admin-web/src/api/sys/resource/fieldApi.js new file mode 100644 index 00000000..35e03f29 --- /dev/null +++ b/snowy-admin-web/src/api/sys/resource/fieldApi.js @@ -0,0 +1,45 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/sys/field/${url}`, ...arg) +/** + * 字段 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取字段分页 + fieldPage(data) { + return request('page', data, 'get') + }, + // 获取字段树 + fieldTree(data) { + return request('tree', data, 'get') + }, + // 提交表单 edit为true时为编辑,默认为新增 + submitForm(data, edit = false) { + return request(edit ? 'add' : 'edit', data) + }, + // 删除字段 + fieldDelete(data) { + return request('delete', data) + }, + // 获取字段详情 + fieldDetail(data) { + return request('detail', data, 'get') + }, + // 获取菜单树选择器 + fieldMenuTreeSelector(data) { + return request('MenuTreeSelector', data, 'get') + } +} diff --git a/snowy-admin-web/src/api/sys/resource/menuApi.js b/snowy-admin-web/src/api/sys/resource/menuApi.js new file mode 100644 index 00000000..64bcc86f --- /dev/null +++ b/snowy-admin-web/src/api/sys/resource/menuApi.js @@ -0,0 +1,49 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/sys/menu/${url}`, ...arg) +/** + * 菜单 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取菜单树 + menuTree(data) { + return request('tree', data, 'get') + }, + // 提交表单 edit为true时为编辑,默认为新增 + submitForm(data, edit = false) { + return request(edit ? 'add' : 'edit', data) + }, + // 更改菜单所属模块 + menuChangeModule(data) { + return request('changeModule', data) + }, + // 删除菜单 + menuDelete(data) { + return request('delete', data) + }, + // 获取菜单详情 + menuDetail(data) { + return request('detail', data, 'get') + }, + // 获取模块选择器 + menuModuleSelector(data) { + return request('moduleSelector', data, 'get') + }, + // 获取菜单树选择器 + menuTreeSelector(data) { + return request('menuTreeSelector', data, 'get') + } +} diff --git a/snowy-admin-web/src/api/sys/resource/moduleApi.js b/snowy-admin-web/src/api/sys/resource/moduleApi.js new file mode 100644 index 00000000..1aa80118 --- /dev/null +++ b/snowy-admin-web/src/api/sys/resource/moduleApi.js @@ -0,0 +1,37 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/sys/module/${url}`, ...arg) +/** + * 模块 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取模块分页 + modulePage(data) { + return request('page', data, 'get') + }, + // 提交表单 edit为true时为编辑,默认为新增 + submitForm(data, edit = false) { + return request(edit ? 'add' : 'edit', data) + }, + // 删除模块 + moduleDelete(data) { + return request('delete', data) + }, + // 获取模块详情 + moduleDetail(data) { + return request('detail', data, 'get') + } +} diff --git a/snowy-admin-web/src/api/sys/resource/spaApi.js b/snowy-admin-web/src/api/sys/resource/spaApi.js new file mode 100644 index 00000000..b8ce1321 --- /dev/null +++ b/snowy-admin-web/src/api/sys/resource/spaApi.js @@ -0,0 +1,37 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/sys/spa/${url}`, ...arg) +/** + * 单页 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取菜单分页 + spaPage(data) { + return request('page', data, 'get') + }, + // 提交表单 edit为true时为编辑,默认为新增 + submitForm(data, edit = false) { + return request(edit ? 'add' : 'edit', data) + }, + // 删除菜单 + spaDelete(data) { + return request('delete', data) + }, + // 获取菜单详情 + spaDetail(data) { + return request('detail', data, 'get') + } +} diff --git a/snowy-admin-web/src/api/sys/roleApi.js b/snowy-admin-web/src/api/sys/roleApi.js new file mode 100644 index 00000000..e36f77e5 --- /dev/null +++ b/snowy-admin-web/src/api/sys/roleApi.js @@ -0,0 +1,77 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/sys/role/${url}`, ...arg) +/** + * 角色 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取角色分页 + rolePage(data) { + return request('page', data, 'get') + }, + // 获取角色列表 + roleList(data) { + return request('list', data, 'get') + }, + // 提交表单 edit为true时为编辑,默认为新增 + submitForm(data, edit = false) { + return request(edit ? 'add' : 'edit', data) + }, + // 删除角色 + roleDelete(data) { + return request('delete', data) + }, + // 获取角色详情 + roleDetail(data) { + return request('detail', data, 'get') + }, + // 获取角色拥有资源 + roleOwnResource(data) { + return request('ownResource', data, 'get') + }, + // 给角色授权资源 + roleGrantResource(data) { + return request('grantResource', data) + }, + // 获取角色拥有权限 + roleOwnPermission(data) { + return request('ownPermission', data, 'get') + }, + // 给角色授权权限 + roleGrantPermission(data) { + return request('grantPermission', data) + }, + // 获取角色下的用户 + roleOwnUser(data) { + return request('ownUser', data, 'get') + }, + // 给角色授权用户 + roleGrantUser(data) { + return request('grantUser', data) + }, + // 获取机构树 + roleOrgTreeSelector(data) { + return request('orgTreeSelector', data, 'get') + }, + // 获取资源授权树 + roleResourceTreeSelector(data) { + return request('resourceTreeSelector', data, 'get') + }, + // 获取权限授权树 + rolePermissionTreeSelector(data) { + return request('permissionTreeSelector', data, 'get') + } +} diff --git a/snowy-admin-web/src/api/sys/userApi.js b/snowy-admin-web/src/api/sys/userApi.js new file mode 100644 index 00000000..72783100 --- /dev/null +++ b/snowy-admin-web/src/api/sys/userApi.js @@ -0,0 +1,73 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/sys/user/${url}`, ...arg) +/** + * 用户接口api + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取用户分页 + userPage(data) { + return request('page', data, 'get') + }, + // 提交表单 edit为true时为编辑,默认为新增 + submitForm(data, edit = false) { + return request(edit ? 'add' : 'edit', data) + }, + // 删除用户 + userDelete(data) { + return request('delete', data) + }, + // 获取用户详情 + userDetail(data) { + return request('detail', data, 'get') + }, + // 禁用用户 + userDisableUser(data) { + return request('disableUser', data) + }, + // 启用用户 + userEnableUser(data) { + return request('enableUser', data) + }, + // 重置用户密码 + userResetPassword(data) { + return request('resetPassword', data) + }, + // 获取组织选择器 + userOrgTreeSelector(data) { + return request('orgTreeSelector', data, 'get') + }, + // 获取职位选择器 + userPositionSelector(data) { + return request('positionSelector', data, 'get') + }, + // 获取角色选择器 + userRoleSelector(data) { + return request('roleSelector', data, 'get') + }, + // 获取用户选择器 + userSelector(data) { + return request('userSelector', data, 'get') + }, + // 用户拥有角色 + userOwnRole(data) { + return request('ownRole', data, 'get') + }, + // 给用户授权角色 + grantRole(data) { + return request('grantRole', data) + } +} diff --git a/snowy-admin-web/src/api/sys/userCenterApi.js b/snowy-admin-web/src/api/sys/userCenterApi.js new file mode 100644 index 00000000..5e04873e --- /dev/null +++ b/snowy-admin-web/src/api/sys/userCenterApi.js @@ -0,0 +1,85 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/sys/userCenter/${url}`, ...arg) +/** + * 用户个人控制器 + * + * @author yubaoshan + * @date 2022-09-22 22:33:20 + */ +export default { + // 获取图片验证码 + userGetPicCaptcha(data) { + return request('getPicCaptcha', data, 'get') + }, + // 找回密码获取手机验证码 + userFindPasswordGetPhoneValidCode(data) { + return request('findPasswordGetPhoneValidCode', data, 'get') + }, + // 找回密码获取邮箱验证码 + userFindPasswordGetEmailValidCode(data) { + return request('findPasswordGetEmailValidCode', data, 'get') + }, + // 通过手机号找回用户密码 + userFindPasswordByPhone(data) { + return request('findPasswordByPhone', data) + }, + // 通过邮箱找回用户密码 + userFindPasswordByEmail(data) { + return request('findPasswordByEmail', data) + }, + // 修改用户密码 + userUpdatePassword(data) { + return request('updatePassword', data) + }, + // 修改用户头像 + userUpdateAvatar(data) { + return request('updateAvatar', data) + }, + // 修改用户签名图片 + userUpdateSignature(data) { + return request('updateSignature', data) + }, + // 获取登录用户的菜单 + userLoginMenu(data) { + return request('loginMenu', data, 'get') + }, + // 获取登录用户组织树 + userLoginOrgTree(data) { + return request('loginOrgTree', data, 'get') + }, + // 获取登录用户的职位信息 + userLoginPositionInfo(data) { + return request('loginPositionInfo', data, 'get') + }, + // 编辑个人信息 + userUpdateUserInfo(data) { + return request('updateUserInfo', data) + }, + // 编辑个人工作台 + userUpdateUserWorkbench(data) { + return request('updateUserWorkbench', data) + }, + // 获取登录用户的工作台 + userLoginWorkbench(data) { + return request('loginWorkbench', data, 'get') + }, + // 获取登录用户的站内信分页 + userLoginUnreadMessagePage(data) { + return request('loginUnreadMessagePage', data, 'get') + }, + // 读取登录用户站内信详情 + userLoginUnreadMessageDetail(data) { + return request('loginUnreadMessageDetail', data, 'get') + } +} diff --git a/snowy-admin-web/src/assets/icons/GiteeIcon.vue b/snowy-admin-web/src/assets/icons/GiteeIcon.vue new file mode 100644 index 00000000..b1d1b466 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/GiteeIcon.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/snowy-admin-web/src/assets/icons/index.js b/snowy-admin-web/src/assets/icons/index.js new file mode 100644 index 00000000..c0d89c63 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/index.js @@ -0,0 +1,13 @@ +/* + ** 全局注册Icon组件 + * 推荐前往https://icones.js.org下载图标的Vue文件,然后放在src/assets/icons文件夹里面 + * 这个网址有118个图标集,包括antd、bootstrap、eleme等累计140456个图标 + */ +import { defineAsyncComponent } from 'vue' +const components = import.meta.glob('./**/*.vue') // 异步方式 +export default function install(app) { + for (const [key, value] of Object.entries(components)) { + const name = key.slice(key.lastIndexOf('/') + 1, key.lastIndexOf('.')) + app.component(name, defineAsyncComponent(value)) + } +} diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwAdobe.vue b/snowy-admin-web/src/assets/icons/uiw/UiwAdobe.vue new file mode 100644 index 00000000..eeb251ce --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwAdobe.vue @@ -0,0 +1,15 @@ + + + diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwAlipay.vue b/snowy-admin-web/src/assets/icons/uiw/UiwAlipay.vue new file mode 100644 index 00000000..f1302fe0 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwAlipay.vue @@ -0,0 +1,14 @@ + + + diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwAliwangwang.vue b/snowy-admin-web/src/assets/icons/uiw/UiwAliwangwang.vue new file mode 100644 index 00000000..8929ce50 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwAliwangwang.vue @@ -0,0 +1,14 @@ + + + diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwAndroid.vue b/snowy-admin-web/src/assets/icons/uiw/UiwAndroid.vue new file mode 100644 index 00000000..018a0e2c --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwAndroid.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwAndroidO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwAndroidO.vue new file mode 100644 index 00000000..f9bd480c --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwAndroidO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwApple.vue b/snowy-admin-web/src/assets/icons/uiw/UiwApple.vue new file mode 100644 index 00000000..5b79aab3 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwApple.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwAppstore.vue b/snowy-admin-web/src/assets/icons/uiw/UiwAppstore.vue new file mode 100644 index 00000000..8c8e2535 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwAppstore.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwAppstoreO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwAppstoreO.vue new file mode 100644 index 00000000..8530de50 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwAppstoreO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwAreaChart.vue b/snowy-admin-web/src/assets/icons/uiw/UiwAreaChart.vue new file mode 100644 index 00000000..b0e401fe --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwAreaChart.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwArrowDown.vue b/snowy-admin-web/src/assets/icons/uiw/UiwArrowDown.vue new file mode 100644 index 00000000..04615a7c --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwArrowDown.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwArrowLeft.vue b/snowy-admin-web/src/assets/icons/uiw/UiwArrowLeft.vue new file mode 100644 index 00000000..5a66e4c6 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwArrowLeft.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwArrowRight.vue b/snowy-admin-web/src/assets/icons/uiw/UiwArrowRight.vue new file mode 100644 index 00000000..0918899c --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwArrowRight.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwArrowUp.vue b/snowy-admin-web/src/assets/icons/uiw/UiwArrowUp.vue new file mode 100644 index 00000000..0763b8ad --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwArrowUp.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwArrowsAlt.vue b/snowy-admin-web/src/assets/icons/uiw/UiwArrowsAlt.vue new file mode 100644 index 00000000..40f42211 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwArrowsAlt.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwAsterisk.vue b/snowy-admin-web/src/assets/icons/uiw/UiwAsterisk.vue new file mode 100644 index 00000000..507d5bb3 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwAsterisk.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwBackward.vue b/snowy-admin-web/src/assets/icons/uiw/UiwBackward.vue new file mode 100644 index 00000000..b0b34e93 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwBackward.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwBaidu.vue b/snowy-admin-web/src/assets/icons/uiw/UiwBaidu.vue new file mode 100644 index 00000000..a27af05a --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwBaidu.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwBarChart.vue b/snowy-admin-web/src/assets/icons/uiw/UiwBarChart.vue new file mode 100644 index 00000000..6a4e0027 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwBarChart.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwBarcode.vue b/snowy-admin-web/src/assets/icons/uiw/UiwBarcode.vue new file mode 100644 index 00000000..3f2f2723 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwBarcode.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwBell.vue b/snowy-admin-web/src/assets/icons/uiw/UiwBell.vue new file mode 100644 index 00000000..234bce7e --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwBell.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCameraO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCameraO.vue new file mode 100644 index 00000000..1c9b6cf4 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCameraO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCaretDown.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCaretDown.vue new file mode 100644 index 00000000..2be10a99 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCaretDown.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCaretLeft.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCaretLeft.vue new file mode 100644 index 00000000..85015dd5 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCaretLeft.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCaretRight.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCaretRight.vue new file mode 100644 index 00000000..10a02eb5 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCaretRight.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCaretUp.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCaretUp.vue new file mode 100644 index 00000000..6661bbb2 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCaretUp.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCheck.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCheck.vue new file mode 100644 index 00000000..9b2277f0 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCheck.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCheckSquare.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCheckSquare.vue new file mode 100644 index 00000000..fb5d191a --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCheckSquare.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCheckSquareO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCheckSquareO.vue new file mode 100644 index 00000000..f1cb1fcf --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCheckSquareO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwChrome.vue b/snowy-admin-web/src/assets/icons/uiw/UiwChrome.vue new file mode 100644 index 00000000..c458e8a7 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwChrome.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCircleCheck.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCircleCheck.vue new file mode 100644 index 00000000..419ddb5b --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCircleCheck.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCircleCheckO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCircleCheckO.vue new file mode 100644 index 00000000..0238a4a4 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCircleCheckO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCircleClose.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCircleClose.vue new file mode 100644 index 00000000..2fde618d --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCircleClose.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCircleCloseO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCircleCloseO.vue new file mode 100644 index 00000000..751487bc --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCircleCloseO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCircleO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCircleO.vue new file mode 100644 index 00000000..d85fb1c3 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCircleO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwClose.vue b/snowy-admin-web/src/assets/icons/uiw/UiwClose.vue new file mode 100644 index 00000000..b06d661b --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwClose.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCloseSquare.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCloseSquare.vue new file mode 100644 index 00000000..deb736b9 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCloseSquare.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCloseSquareO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCloseSquareO.vue new file mode 100644 index 00000000..6b9768dd --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCloseSquareO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCloudDownload.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCloudDownload.vue new file mode 100644 index 00000000..1b2a1189 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCloudDownload.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCloudDownloadO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCloudDownloadO.vue new file mode 100644 index 00000000..c52b56c7 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCloudDownloadO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCloudUpload.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCloudUpload.vue new file mode 100644 index 00000000..f001bbda --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCloudUpload.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCloudUploadO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCloudUploadO.vue new file mode 100644 index 00000000..2c1c8390 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCloudUploadO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCoffee.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCoffee.vue new file mode 100644 index 00000000..2993f2a4 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCoffee.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwComponent.vue b/snowy-admin-web/src/assets/icons/uiw/UiwComponent.vue new file mode 100644 index 00000000..3ef4f881 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwComponent.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCopy.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCopy.vue new file mode 100644 index 00000000..c139047a --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCopy.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCopyright.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCopyright.vue new file mode 100644 index 00000000..a4edc573 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCopyright.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCss3.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCss3.vue new file mode 100644 index 00000000..831ce0b7 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCss3.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwCut.vue b/snowy-admin-web/src/assets/icons/uiw/UiwCut.vue new file mode 100644 index 00000000..8431803d --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwCut.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwDArrowLeft.vue b/snowy-admin-web/src/assets/icons/uiw/UiwDArrowLeft.vue new file mode 100644 index 00000000..0a56aba2 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwDArrowLeft.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwDArrowRight.vue b/snowy-admin-web/src/assets/icons/uiw/UiwDArrowRight.vue new file mode 100644 index 00000000..726ecc95 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwDArrowRight.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwDCaret.vue b/snowy-admin-web/src/assets/icons/uiw/UiwDCaret.vue new file mode 100644 index 00000000..b5fc3357 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwDCaret.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwDashboard.vue b/snowy-admin-web/src/assets/icons/uiw/UiwDashboard.vue new file mode 100644 index 00000000..28fe35b8 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwDashboard.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwDate.vue b/snowy-admin-web/src/assets/icons/uiw/UiwDate.vue new file mode 100644 index 00000000..fb471e8a --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwDate.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwDelete.vue b/snowy-admin-web/src/assets/icons/uiw/UiwDelete.vue new file mode 100644 index 00000000..d8f27a49 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwDelete.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwDingding.vue b/snowy-admin-web/src/assets/icons/uiw/UiwDingding.vue new file mode 100644 index 00000000..1b7c0d93 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwDingding.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwDislikeO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwDislikeO.vue new file mode 100644 index 00000000..a801e229 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwDislikeO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwDocument.vue b/snowy-admin-web/src/assets/icons/uiw/UiwDocument.vue new file mode 100644 index 00000000..76bb35c4 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwDocument.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwDotChart.vue b/snowy-admin-web/src/assets/icons/uiw/UiwDotChart.vue new file mode 100644 index 00000000..37a0bb70 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwDotChart.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwDown.vue b/snowy-admin-web/src/assets/icons/uiw/UiwDown.vue new file mode 100644 index 00000000..4f355487 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwDown.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwDownCircle.vue b/snowy-admin-web/src/assets/icons/uiw/UiwDownCircle.vue new file mode 100644 index 00000000..5e11567d --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwDownCircle.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwDownCircleO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwDownCircleO.vue new file mode 100644 index 00000000..ce5d1cac --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwDownCircleO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwDownSquare.vue b/snowy-admin-web/src/assets/icons/uiw/UiwDownSquare.vue new file mode 100644 index 00000000..d4101165 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwDownSquare.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwDownSquareO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwDownSquareO.vue new file mode 100644 index 00000000..7bdadbb8 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwDownSquareO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwDownload.vue b/snowy-admin-web/src/assets/icons/uiw/UiwDownload.vue new file mode 100644 index 00000000..f7bf9b6d --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwDownload.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwEdit.vue b/snowy-admin-web/src/assets/icons/uiw/UiwEdit.vue new file mode 100644 index 00000000..51c461a3 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwEdit.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwEnter.vue b/snowy-admin-web/src/assets/icons/uiw/UiwEnter.vue new file mode 100644 index 00000000..083fd97a --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwEnter.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwEnvironment.vue b/snowy-admin-web/src/assets/icons/uiw/UiwEnvironment.vue new file mode 100644 index 00000000..4ec42489 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwEnvironment.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwEnvironmentO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwEnvironmentO.vue new file mode 100644 index 00000000..128610df --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwEnvironmentO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwEye.vue b/snowy-admin-web/src/assets/icons/uiw/UiwEye.vue new file mode 100644 index 00000000..6f6a0274 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwEye.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwEyeO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwEyeO.vue new file mode 100644 index 00000000..ec5aae85 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwEyeO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwFacebook.vue b/snowy-admin-web/src/assets/icons/uiw/UiwFacebook.vue new file mode 100644 index 00000000..3e175867 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwFacebook.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwFileAdd.vue b/snowy-admin-web/src/assets/icons/uiw/UiwFileAdd.vue new file mode 100644 index 00000000..54ad300d --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwFileAdd.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwFileExcel.vue b/snowy-admin-web/src/assets/icons/uiw/UiwFileExcel.vue new file mode 100644 index 00000000..32320208 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwFileExcel.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwFileJpg.vue b/snowy-admin-web/src/assets/icons/uiw/UiwFileJpg.vue new file mode 100644 index 00000000..41311423 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwFileJpg.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwFilePdf.vue b/snowy-admin-web/src/assets/icons/uiw/UiwFilePdf.vue new file mode 100644 index 00000000..c6256dab --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwFilePdf.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwFileText.vue b/snowy-admin-web/src/assets/icons/uiw/UiwFileText.vue new file mode 100644 index 00000000..20f5f85c --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwFileText.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwFileUnknown.vue b/snowy-admin-web/src/assets/icons/uiw/UiwFileUnknown.vue new file mode 100644 index 00000000..83f8f948 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwFileUnknown.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwFilter.vue b/snowy-admin-web/src/assets/icons/uiw/UiwFilter.vue new file mode 100644 index 00000000..462e957c --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwFilter.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwFirefox.vue b/snowy-admin-web/src/assets/icons/uiw/UiwFirefox.vue new file mode 100644 index 00000000..84e6a65e --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwFirefox.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwFolder.vue b/snowy-admin-web/src/assets/icons/uiw/UiwFolder.vue new file mode 100644 index 00000000..517f279f --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwFolder.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwFolderAdd.vue b/snowy-admin-web/src/assets/icons/uiw/UiwFolderAdd.vue new file mode 100644 index 00000000..2a0725f4 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwFolderAdd.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwFolderOpen.vue b/snowy-admin-web/src/assets/icons/uiw/UiwFolderOpen.vue new file mode 100644 index 00000000..b7067f27 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwFolderOpen.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwForward.vue b/snowy-admin-web/src/assets/icons/uiw/UiwForward.vue new file mode 100644 index 00000000..37c450b7 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwForward.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwFoursquare.vue b/snowy-admin-web/src/assets/icons/uiw/UiwFoursquare.vue new file mode 100644 index 00000000..e140ec2a --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwFoursquare.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwFrown.vue b/snowy-admin-web/src/assets/icons/uiw/UiwFrown.vue new file mode 100644 index 00000000..93a5f2d6 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwFrown.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwFrownO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwFrownO.vue new file mode 100644 index 00000000..fdeeb14b --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwFrownO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwGithub.vue b/snowy-admin-web/src/assets/icons/uiw/UiwGithub.vue new file mode 100644 index 00000000..7355bb7a --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwGithub.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwGithubO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwGithubO.vue new file mode 100644 index 00000000..b84067ba --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwGithubO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwGlobal.vue b/snowy-admin-web/src/assets/icons/uiw/UiwGlobal.vue new file mode 100644 index 00000000..c15f2fa6 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwGlobal.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwHeartOff.vue b/snowy-admin-web/src/assets/icons/uiw/UiwHeartOff.vue new file mode 100644 index 00000000..12e21a55 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwHeartOff.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwHeartOn.vue b/snowy-admin-web/src/assets/icons/uiw/UiwHeartOn.vue new file mode 100644 index 00000000..fff274a2 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwHeartOn.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwHome.vue b/snowy-admin-web/src/assets/icons/uiw/UiwHome.vue new file mode 100644 index 00000000..d02254a2 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwHome.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwHtml5.vue b/snowy-admin-web/src/assets/icons/uiw/UiwHtml5.vue new file mode 100644 index 00000000..553f31c1 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwHtml5.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwIe.vue b/snowy-admin-web/src/assets/icons/uiw/UiwIe.vue new file mode 100644 index 00000000..38dffc4e --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwIe.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwInbox.vue b/snowy-admin-web/src/assets/icons/uiw/UiwInbox.vue new file mode 100644 index 00000000..4af31250 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwInbox.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwInformation.vue b/snowy-admin-web/src/assets/icons/uiw/UiwInformation.vue new file mode 100644 index 00000000..ff4b4b52 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwInformation.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwInformationO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwInformationO.vue new file mode 100644 index 00000000..a202497e --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwInformationO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwLaptop.vue b/snowy-admin-web/src/assets/icons/uiw/UiwLaptop.vue new file mode 100644 index 00000000..a65bc1cf --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwLaptop.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwLeft.vue b/snowy-admin-web/src/assets/icons/uiw/UiwLeft.vue new file mode 100644 index 00000000..6f14627f --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwLeft.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwLeftCircle.vue b/snowy-admin-web/src/assets/icons/uiw/UiwLeftCircle.vue new file mode 100644 index 00000000..187a2b22 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwLeftCircle.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwLeftCircleO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwLeftCircleO.vue new file mode 100644 index 00000000..1e53313c --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwLeftCircleO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwLeftSquare.vue b/snowy-admin-web/src/assets/icons/uiw/UiwLeftSquare.vue new file mode 100644 index 00000000..69e752b5 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwLeftSquare.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwLeftSquareO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwLeftSquareO.vue new file mode 100644 index 00000000..eb18ac60 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwLeftSquareO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwLikeO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwLikeO.vue new file mode 100644 index 00000000..f5b27ab3 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwLikeO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwLink.vue b/snowy-admin-web/src/assets/icons/uiw/UiwLink.vue new file mode 100644 index 00000000..85efeff9 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwLink.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwLinkedin.vue b/snowy-admin-web/src/assets/icons/uiw/UiwLinkedin.vue new file mode 100644 index 00000000..2fe04eb9 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwLinkedin.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwLinux.vue b/snowy-admin-web/src/assets/icons/uiw/UiwLinux.vue new file mode 100644 index 00000000..13d9b582 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwLinux.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwLoading.vue b/snowy-admin-web/src/assets/icons/uiw/UiwLoading.vue new file mode 100644 index 00000000..fb9227f3 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwLoading.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwLock.vue b/snowy-admin-web/src/assets/icons/uiw/UiwLock.vue new file mode 100644 index 00000000..28f6dbc3 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwLock.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwLogin.vue b/snowy-admin-web/src/assets/icons/uiw/UiwLogin.vue new file mode 100644 index 00000000..a8980912 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwLogin.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwLogout.vue b/snowy-admin-web/src/assets/icons/uiw/UiwLogout.vue new file mode 100644 index 00000000..1f7a40c8 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwLogout.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwMail.vue b/snowy-admin-web/src/assets/icons/uiw/UiwMail.vue new file mode 100644 index 00000000..fa2ffc46 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwMail.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwMailO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwMailO.vue new file mode 100644 index 00000000..32ec3f7d --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwMailO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwMan.vue b/snowy-admin-web/src/assets/icons/uiw/UiwMan.vue new file mode 100644 index 00000000..13f22b5e --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwMan.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwMap.vue b/snowy-admin-web/src/assets/icons/uiw/UiwMap.vue new file mode 100644 index 00000000..4365d9a0 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwMap.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwMeh.vue b/snowy-admin-web/src/assets/icons/uiw/UiwMeh.vue new file mode 100644 index 00000000..c615aec0 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwMeh.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwMehO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwMehO.vue new file mode 100644 index 00000000..9105467e --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwMehO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwMenu.vue b/snowy-admin-web/src/assets/icons/uiw/UiwMenu.vue new file mode 100644 index 00000000..9f2d21f9 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwMenu.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwMenuFold.vue b/snowy-admin-web/src/assets/icons/uiw/UiwMenuFold.vue new file mode 100644 index 00000000..3aacfea8 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwMenuFold.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwMenuUnfold.vue b/snowy-admin-web/src/assets/icons/uiw/UiwMenuUnfold.vue new file mode 100644 index 00000000..c9c46d36 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwMenuUnfold.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwMessage.vue b/snowy-admin-web/src/assets/icons/uiw/UiwMessage.vue new file mode 100644 index 00000000..84d51c89 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwMessage.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwMinus.vue b/snowy-admin-web/src/assets/icons/uiw/UiwMinus.vue new file mode 100644 index 00000000..c430d032 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwMinus.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwMinusCircle.vue b/snowy-admin-web/src/assets/icons/uiw/UiwMinusCircle.vue new file mode 100644 index 00000000..c782b1ff --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwMinusCircle.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwMinusCircleO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwMinusCircleO.vue new file mode 100644 index 00000000..665cd87d --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwMinusCircleO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwMinusSquare.vue b/snowy-admin-web/src/assets/icons/uiw/UiwMinusSquare.vue new file mode 100644 index 00000000..3a0aed2c --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwMinusSquare.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwMinusSquareO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwMinusSquareO.vue new file mode 100644 index 00000000..228a1e33 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwMinusSquareO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwMobile.vue b/snowy-admin-web/src/assets/icons/uiw/UiwMobile.vue new file mode 100644 index 00000000..95f3306c --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwMobile.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwMore.vue b/snowy-admin-web/src/assets/icons/uiw/UiwMore.vue new file mode 100644 index 00000000..7fe91386 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwMore.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwNotification.vue b/snowy-admin-web/src/assets/icons/uiw/UiwNotification.vue new file mode 100644 index 00000000..22bf4cda --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwNotification.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwOpera.vue b/snowy-admin-web/src/assets/icons/uiw/UiwOpera.vue new file mode 100644 index 00000000..81d1c2b0 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwOpera.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwPaperClip.vue b/snowy-admin-web/src/assets/icons/uiw/UiwPaperClip.vue new file mode 100644 index 00000000..90e1721b --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwPaperClip.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwPause.vue b/snowy-admin-web/src/assets/icons/uiw/UiwPause.vue new file mode 100644 index 00000000..7f545abb --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwPause.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwPauseCircle.vue b/snowy-admin-web/src/assets/icons/uiw/UiwPauseCircle.vue new file mode 100644 index 00000000..ced2cfbc --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwPauseCircle.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwPauseCircleO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwPauseCircleO.vue new file mode 100644 index 00000000..73b76b79 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwPauseCircleO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwPay.vue b/snowy-admin-web/src/assets/icons/uiw/UiwPay.vue new file mode 100644 index 00000000..8c041516 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwPay.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwPayCircleO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwPayCircleO.vue new file mode 100644 index 00000000..c187d658 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwPayCircleO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwPicasa.vue b/snowy-admin-web/src/assets/icons/uiw/UiwPicasa.vue new file mode 100644 index 00000000..d2879fc1 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwPicasa.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwPicture.vue b/snowy-admin-web/src/assets/icons/uiw/UiwPicture.vue new file mode 100644 index 00000000..57392e4d --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwPicture.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwPieChart.vue b/snowy-admin-web/src/assets/icons/uiw/UiwPieChart.vue new file mode 100644 index 00000000..7d4c5f3f --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwPieChart.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwPinterest.vue b/snowy-admin-web/src/assets/icons/uiw/UiwPinterest.vue new file mode 100644 index 00000000..8ff5f67e --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwPinterest.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwPlayCircle.vue b/snowy-admin-web/src/assets/icons/uiw/UiwPlayCircle.vue new file mode 100644 index 00000000..e0fccf60 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwPlayCircle.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwPlayCircleO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwPlayCircleO.vue new file mode 100644 index 00000000..003e0fae --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwPlayCircleO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwPlus.vue b/snowy-admin-web/src/assets/icons/uiw/UiwPlus.vue new file mode 100644 index 00000000..6d880425 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwPlus.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwPlusCircle.vue b/snowy-admin-web/src/assets/icons/uiw/UiwPlusCircle.vue new file mode 100644 index 00000000..a671f615 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwPlusCircle.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwPlusCircleO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwPlusCircleO.vue new file mode 100644 index 00000000..d05b1b46 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwPlusCircleO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwPlusSquare.vue b/snowy-admin-web/src/assets/icons/uiw/UiwPlusSquare.vue new file mode 100644 index 00000000..4e0f869f --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwPlusSquare.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwPlusSquareO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwPlusSquareO.vue new file mode 100644 index 00000000..2f4a2d8e --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwPlusSquareO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwPoweroff.vue b/snowy-admin-web/src/assets/icons/uiw/UiwPoweroff.vue new file mode 100644 index 00000000..76720859 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwPoweroff.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwPrinter.vue b/snowy-admin-web/src/assets/icons/uiw/UiwPrinter.vue new file mode 100644 index 00000000..28bb2c98 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwPrinter.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwQq.vue b/snowy-admin-web/src/assets/icons/uiw/UiwQq.vue new file mode 100644 index 00000000..9cca28ce --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwQq.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwQrcode.vue b/snowy-admin-web/src/assets/icons/uiw/UiwQrcode.vue new file mode 100644 index 00000000..e5d5cea0 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwQrcode.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwQuestionCircle.vue b/snowy-admin-web/src/assets/icons/uiw/UiwQuestionCircle.vue new file mode 100644 index 00000000..c0610607 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwQuestionCircle.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwQuestionCircleO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwQuestionCircleO.vue new file mode 100644 index 00000000..7da56782 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwQuestionCircleO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwReddit.vue b/snowy-admin-web/src/assets/icons/uiw/UiwReddit.vue new file mode 100644 index 00000000..d9c3df77 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwReddit.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwReload.vue b/snowy-admin-web/src/assets/icons/uiw/UiwReload.vue new file mode 100644 index 00000000..ff72db34 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwReload.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwRight.vue b/snowy-admin-web/src/assets/icons/uiw/UiwRight.vue new file mode 100644 index 00000000..e055f651 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwRight.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwRightCircle.vue b/snowy-admin-web/src/assets/icons/uiw/UiwRightCircle.vue new file mode 100644 index 00000000..5decfb02 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwRightCircle.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwRightCircleO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwRightCircleO.vue new file mode 100644 index 00000000..19fca271 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwRightCircleO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwRightSquare.vue b/snowy-admin-web/src/assets/icons/uiw/UiwRightSquare.vue new file mode 100644 index 00000000..7f872868 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwRightSquare.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwRightSquareO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwRightSquareO.vue new file mode 100644 index 00000000..99f16cee --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwRightSquareO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwRollback.vue b/snowy-admin-web/src/assets/icons/uiw/UiwRollback.vue new file mode 100644 index 00000000..87137b00 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwRollback.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwSafari.vue b/snowy-admin-web/src/assets/icons/uiw/UiwSafari.vue new file mode 100644 index 00000000..9bbe4e58 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwSafari.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwSafety.vue b/snowy-admin-web/src/assets/icons/uiw/UiwSafety.vue new file mode 100644 index 00000000..7be65c54 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwSafety.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwSave.vue b/snowy-admin-web/src/assets/icons/uiw/UiwSave.vue new file mode 100644 index 00000000..627fed23 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwSave.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwSearch.vue b/snowy-admin-web/src/assets/icons/uiw/UiwSearch.vue new file mode 100644 index 00000000..62af70a6 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwSearch.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwSetting.vue b/snowy-admin-web/src/assets/icons/uiw/UiwSetting.vue new file mode 100644 index 00000000..097b6959 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwSetting.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwSettingO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwSettingO.vue new file mode 100644 index 00000000..20741a3c --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwSettingO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwShare.vue b/snowy-admin-web/src/assets/icons/uiw/UiwShare.vue new file mode 100644 index 00000000..573e2dc8 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwShare.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwShoppingCart.vue b/snowy-admin-web/src/assets/icons/uiw/UiwShoppingCart.vue new file mode 100644 index 00000000..13d0b61d --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwShoppingCart.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwShrink.vue b/snowy-admin-web/src/assets/icons/uiw/UiwShrink.vue new file mode 100644 index 00000000..a451807a --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwShrink.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwSmile.vue b/snowy-admin-web/src/assets/icons/uiw/UiwSmile.vue new file mode 100644 index 00000000..548500f7 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwSmile.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwSmileO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwSmileO.vue new file mode 100644 index 00000000..248852ba --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwSmileO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwSquareO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwSquareO.vue new file mode 100644 index 00000000..1371e415 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwSquareO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwStarOff.vue b/snowy-admin-web/src/assets/icons/uiw/UiwStarOff.vue new file mode 100644 index 00000000..2a9013fa --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwStarOff.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwStarOn.vue b/snowy-admin-web/src/assets/icons/uiw/UiwStarOn.vue new file mode 100644 index 00000000..3c372c3c --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwStarOn.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwStop.vue b/snowy-admin-web/src/assets/icons/uiw/UiwStop.vue new file mode 100644 index 00000000..7806abf0 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwStop.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwStopO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwStopO.vue new file mode 100644 index 00000000..288ec371 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwStopO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwSwap.vue b/snowy-admin-web/src/assets/icons/uiw/UiwSwap.vue new file mode 100644 index 00000000..8b2a3e32 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwSwap.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwSwapLeft.vue b/snowy-admin-web/src/assets/icons/uiw/UiwSwapLeft.vue new file mode 100644 index 00000000..61205d81 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwSwapLeft.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwSwapRight.vue b/snowy-admin-web/src/assets/icons/uiw/UiwSwapRight.vue new file mode 100644 index 00000000..26e2f9b9 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwSwapRight.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwTable.vue b/snowy-admin-web/src/assets/icons/uiw/UiwTable.vue new file mode 100644 index 00000000..353321d7 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwTable.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwTag.vue b/snowy-admin-web/src/assets/icons/uiw/UiwTag.vue new file mode 100644 index 00000000..679a3640 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwTag.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwTagO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwTagO.vue new file mode 100644 index 00000000..593b1457 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwTagO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwTags.vue b/snowy-admin-web/src/assets/icons/uiw/UiwTags.vue new file mode 100644 index 00000000..a02e393b --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwTags.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwTagsO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwTagsO.vue new file mode 100644 index 00000000..a635ebfb --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwTagsO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwTaobao.vue b/snowy-admin-web/src/assets/icons/uiw/UiwTaobao.vue new file mode 100644 index 00000000..f2d4d786 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwTaobao.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwTime.vue b/snowy-admin-web/src/assets/icons/uiw/UiwTime.vue new file mode 100644 index 00000000..f3ed896d --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwTime.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwTimeO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwTimeO.vue new file mode 100644 index 00000000..f7f9320e --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwTimeO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwTwitter.vue b/snowy-admin-web/src/assets/icons/uiw/UiwTwitter.vue new file mode 100644 index 00000000..f5c42d1b --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwTwitter.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwUiw.vue b/snowy-admin-web/src/assets/icons/uiw/UiwUiw.vue new file mode 100644 index 00000000..8c6afea7 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwUiw.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwUnlock.vue b/snowy-admin-web/src/assets/icons/uiw/UiwUnlock.vue new file mode 100644 index 00000000..2e86e07c --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwUnlock.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwUp.vue b/snowy-admin-web/src/assets/icons/uiw/UiwUp.vue new file mode 100644 index 00000000..e3301688 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwUp.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwUpCircle.vue b/snowy-admin-web/src/assets/icons/uiw/UiwUpCircle.vue new file mode 100644 index 00000000..8862168f --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwUpCircle.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwUpCircleO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwUpCircleO.vue new file mode 100644 index 00000000..2921df35 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwUpCircleO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwUpSquare.vue b/snowy-admin-web/src/assets/icons/uiw/UiwUpSquare.vue new file mode 100644 index 00000000..4370ae68 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwUpSquare.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwUpSquareO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwUpSquareO.vue new file mode 100644 index 00000000..ebb29daf --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwUpSquareO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwUpload.vue b/snowy-admin-web/src/assets/icons/uiw/UiwUpload.vue new file mode 100644 index 00000000..2363302a --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwUpload.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwUser.vue b/snowy-admin-web/src/assets/icons/uiw/UiwUser.vue new file mode 100644 index 00000000..2caa308d --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwUser.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwUserAdd.vue b/snowy-admin-web/src/assets/icons/uiw/UiwUserAdd.vue new file mode 100644 index 00000000..a149a3b9 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwUserAdd.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwUserDelete.vue b/snowy-admin-web/src/assets/icons/uiw/UiwUserDelete.vue new file mode 100644 index 00000000..39a91879 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwUserDelete.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwUsergroupAdd.vue b/snowy-admin-web/src/assets/icons/uiw/UiwUsergroupAdd.vue new file mode 100644 index 00000000..6cbd224e --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwUsergroupAdd.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwUsergroupDelete.vue b/snowy-admin-web/src/assets/icons/uiw/UiwUsergroupDelete.vue new file mode 100644 index 00000000..79c69b20 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwUsergroupDelete.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwVerification.vue b/snowy-admin-web/src/assets/icons/uiw/UiwVerification.vue new file mode 100644 index 00000000..d45c3d6f --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwVerification.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwVerticleLeft.vue b/snowy-admin-web/src/assets/icons/uiw/UiwVerticleLeft.vue new file mode 100644 index 00000000..69e4578a --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwVerticleLeft.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwVerticleRight.vue b/snowy-admin-web/src/assets/icons/uiw/UiwVerticleRight.vue new file mode 100644 index 00000000..65320b79 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwVerticleRight.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwVideoCamera.vue b/snowy-admin-web/src/assets/icons/uiw/UiwVideoCamera.vue new file mode 100644 index 00000000..da015781 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwVideoCamera.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwWarning.vue b/snowy-admin-web/src/assets/icons/uiw/UiwWarning.vue new file mode 100644 index 00000000..e740ba9e --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwWarning.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwWarningO.vue b/snowy-admin-web/src/assets/icons/uiw/UiwWarningO.vue new file mode 100644 index 00000000..b3bd388b --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwWarningO.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwWeibo.vue b/snowy-admin-web/src/assets/icons/uiw/UiwWeibo.vue new file mode 100644 index 00000000..8fe73630 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwWeibo.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwWeixin.vue b/snowy-admin-web/src/assets/icons/uiw/UiwWeixin.vue new file mode 100644 index 00000000..c745892e --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwWeixin.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwWifi.vue b/snowy-admin-web/src/assets/icons/uiw/UiwWifi.vue new file mode 100644 index 00000000..8d5a9770 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwWifi.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwWindows.vue b/snowy-admin-web/src/assets/icons/uiw/UiwWindows.vue new file mode 100644 index 00000000..8217385e --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwWindows.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwWoman.vue b/snowy-admin-web/src/assets/icons/uiw/UiwWoman.vue new file mode 100644 index 00000000..38d88a24 --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwWoman.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwZoomIn.vue b/snowy-admin-web/src/assets/icons/uiw/UiwZoomIn.vue new file mode 100644 index 00000000..fcc4f8bd --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwZoomIn.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/icons/uiw/UiwZoomOut.vue b/snowy-admin-web/src/assets/icons/uiw/UiwZoomOut.vue new file mode 100644 index 00000000..e9a1bfaf --- /dev/null +++ b/snowy-admin-web/src/assets/icons/uiw/UiwZoomOut.vue @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/snowy-admin-web/src/assets/images/fileImg/README.md b/snowy-admin-web/src/assets/images/fileImg/README.md new file mode 100644 index 00000000..2da61149 --- /dev/null +++ b/snowy-admin-web/src/assets/images/fileImg/README.md @@ -0,0 +1 @@ +图标文件来源:https://www.aigei.com/s?q=%E6%96%87%E4%BB%B6&detailTab=file&type=icon_7&page=11#resContainer diff --git a/snowy-admin-web/src/assets/images/fileImg/docx.png b/snowy-admin-web/src/assets/images/fileImg/docx.png new file mode 100644 index 00000000..d7bc3aaa Binary files /dev/null and b/snowy-admin-web/src/assets/images/fileImg/docx.png differ diff --git a/snowy-admin-web/src/assets/images/fileImg/file.png b/snowy-admin-web/src/assets/images/fileImg/file.png new file mode 100644 index 00000000..5731c21e Binary files /dev/null and b/snowy-admin-web/src/assets/images/fileImg/file.png differ diff --git a/snowy-admin-web/src/assets/images/fileImg/gif.png b/snowy-admin-web/src/assets/images/fileImg/gif.png new file mode 100644 index 00000000..f7de5193 Binary files /dev/null and b/snowy-admin-web/src/assets/images/fileImg/gif.png differ diff --git a/snowy-admin-web/src/assets/images/fileImg/html.png b/snowy-admin-web/src/assets/images/fileImg/html.png new file mode 100644 index 00000000..ab826635 Binary files /dev/null and b/snowy-admin-web/src/assets/images/fileImg/html.png differ diff --git a/snowy-admin-web/src/assets/images/fileImg/img.png b/snowy-admin-web/src/assets/images/fileImg/img.png new file mode 100644 index 00000000..04b11185 Binary files /dev/null and b/snowy-admin-web/src/assets/images/fileImg/img.png differ diff --git a/snowy-admin-web/src/assets/images/fileImg/pdf.png b/snowy-admin-web/src/assets/images/fileImg/pdf.png new file mode 100644 index 00000000..1fbb05bb Binary files /dev/null and b/snowy-admin-web/src/assets/images/fileImg/pdf.png differ diff --git a/snowy-admin-web/src/assets/images/fileImg/png.png b/snowy-admin-web/src/assets/images/fileImg/png.png new file mode 100644 index 00000000..58de69ce Binary files /dev/null and b/snowy-admin-web/src/assets/images/fileImg/png.png differ diff --git a/snowy-admin-web/src/assets/images/fileImg/ppt.png b/snowy-admin-web/src/assets/images/fileImg/ppt.png new file mode 100644 index 00000000..c4b2b8d7 Binary files /dev/null and b/snowy-admin-web/src/assets/images/fileImg/ppt.png differ diff --git a/snowy-admin-web/src/assets/images/fileImg/rar.png b/snowy-admin-web/src/assets/images/fileImg/rar.png new file mode 100644 index 00000000..898d9315 Binary files /dev/null and b/snowy-admin-web/src/assets/images/fileImg/rar.png differ diff --git a/snowy-admin-web/src/assets/images/fileImg/txt.png b/snowy-admin-web/src/assets/images/fileImg/txt.png new file mode 100644 index 00000000..46cfd32f Binary files /dev/null and b/snowy-admin-web/src/assets/images/fileImg/txt.png differ diff --git a/snowy-admin-web/src/assets/images/fileImg/xlsx.png b/snowy-admin-web/src/assets/images/fileImg/xlsx.png new file mode 100644 index 00000000..43c079d4 Binary files /dev/null and b/snowy-admin-web/src/assets/images/fileImg/xlsx.png differ diff --git a/snowy-admin-web/src/assets/images/fileImg/zip.png b/snowy-admin-web/src/assets/images/fileImg/zip.png new file mode 100644 index 00000000..410e70f4 Binary files /dev/null and b/snowy-admin-web/src/assets/images/fileImg/zip.png differ diff --git a/snowy-admin-web/src/assets/images/index_001.png b/snowy-admin-web/src/assets/images/index_001.png new file mode 100644 index 00000000..9e6af8d1 Binary files /dev/null and b/snowy-admin-web/src/assets/images/index_001.png differ diff --git a/snowy-admin-web/src/assets/images/index_002.png b/snowy-admin-web/src/assets/images/index_002.png new file mode 100644 index 00000000..d67b31ef Binary files /dev/null and b/snowy-admin-web/src/assets/images/index_002.png differ diff --git a/snowy-admin-web/src/auto-imports.d.ts b/snowy-admin-web/src/auto-imports.d.ts new file mode 100644 index 00000000..12027b71 --- /dev/null +++ b/snowy-admin-web/src/auto-imports.d.ts @@ -0,0 +1,56 @@ +// Generated by 'unplugin-auto-import' +export {} +declare global { + const EffectScope: typeof import('vue')['EffectScope'] + 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 hasPerm: typeof import('./utils/permission/index.js')['hasPerm'] + 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 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 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 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 useSlots: typeof import('vue')['useSlots'] + const watch: typeof import('vue')['watch'] + const watchEffect: typeof import('vue')['watchEffect'] + const watchPostEffect: typeof import('vue')['watchPostEffect'] + const watchSyncEffect: typeof import('vue')['watchSyncEffect'] +} diff --git a/snowy-admin-web/src/components/Chart/eCBingZhuangTu/CustomizedPie.vue b/snowy-admin-web/src/components/Chart/eCBingZhuangTu/CustomizedPie.vue new file mode 100644 index 00000000..8908c739 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCBingZhuangTu/CustomizedPie.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/eCBingZhuangTu/DoughnutChartWithRoundedCorner.vue b/snowy-admin-web/src/components/Chart/eCBingZhuangTu/DoughnutChartWithRoundedCorner.vue new file mode 100644 index 00000000..c895c584 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCBingZhuangTu/DoughnutChartWithRoundedCorner.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/eCBingZhuangTu/NightingaleChart.vue b/snowy-admin-web/src/components/Chart/eCBingZhuangTu/NightingaleChart.vue new file mode 100644 index 00000000..c986d939 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCBingZhuangTu/NightingaleChart.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/eCBingZhuangTu/RefererOfAWebsite.vue b/snowy-admin-web/src/components/Chart/eCBingZhuangTu/RefererOfAWebsite.vue new file mode 100644 index 00000000..0d8242e3 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCBingZhuangTu/RefererOfAWebsite.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/eCKXianTu/BasicCandlestick.vue b/snowy-admin-web/src/components/Chart/eCKXianTu/BasicCandlestick.vue new file mode 100644 index 00000000..8ab3ff43 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCKXianTu/BasicCandlestick.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/eCKXianTu/LargeScaleCandlestick.vue b/snowy-admin-web/src/components/Chart/eCKXianTu/LargeScaleCandlestick.vue new file mode 100644 index 00000000..352057ac --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCKXianTu/LargeScaleCandlestick.vue @@ -0,0 +1,209 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/eCKXianTu/ShangHaiIndex.vue b/snowy-admin-web/src/components/Chart/eCKXianTu/ShangHaiIndex.vue new file mode 100644 index 00000000..b242c573 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCKXianTu/ShangHaiIndex.vue @@ -0,0 +1,326 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/eCLouDouTu/CustomizedFunnel.vue b/snowy-admin-web/src/components/Chart/eCLouDouTu/CustomizedFunnel.vue new file mode 100644 index 00000000..c891e255 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCLouDouTu/CustomizedFunnel.vue @@ -0,0 +1,102 @@ + + + + diff --git a/snowy-admin-web/src/components/Chart/eCLouDouTu/FunnelChart.vue b/snowy-admin-web/src/components/Chart/eCLouDouTu/FunnelChart.vue new file mode 100644 index 00000000..2d315a42 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCLouDouTu/FunnelChart.vue @@ -0,0 +1,83 @@ + + + + diff --git a/snowy-admin-web/src/components/Chart/eCLouDouTu/FunnelCompare.vue b/snowy-admin-web/src/components/Chart/eCLouDouTu/FunnelCompare.vue new file mode 100644 index 00000000..83483e5b --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCLouDouTu/FunnelCompare.vue @@ -0,0 +1,116 @@ + + + + diff --git a/snowy-admin-web/src/components/Chart/eCLouDouTu/MultipleFunnels.vue b/snowy-admin-web/src/components/Chart/eCLouDouTu/MultipleFunnels.vue new file mode 100644 index 00000000..c58c3c9e --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCLouDouTu/MultipleFunnels.vue @@ -0,0 +1,116 @@ + + + + diff --git a/snowy-admin-web/src/components/Chart/eCSanDianTu/BasicScatterChart.vue b/snowy-admin-web/src/components/Chart/eCSanDianTu/BasicScatterChart.vue new file mode 100644 index 00000000..4f8b7846 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCSanDianTu/BasicScatterChart.vue @@ -0,0 +1,53 @@ + + + + diff --git a/snowy-admin-web/src/components/Chart/eCSanDianTu/ClusteringProcess.vue b/snowy-admin-web/src/components/Chart/eCSanDianTu/ClusteringProcess.vue new file mode 100644 index 00000000..c72ed48f --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCSanDianTu/ClusteringProcess.vue @@ -0,0 +1,141 @@ + + + + diff --git a/snowy-admin-web/src/components/Chart/eCSanDianTu/EffectScatterChart.vue b/snowy-admin-web/src/components/Chart/eCSanDianTu/EffectScatterChart.vue new file mode 100644 index 00000000..b6a023fa --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCSanDianTu/EffectScatterChart.vue @@ -0,0 +1,94 @@ + + + + diff --git a/snowy-admin-web/src/components/Chart/eCSanDianTu/ScatterAqiColor.vue b/snowy-admin-web/src/components/Chart/eCSanDianTu/ScatterAqiColor.vue new file mode 100644 index 00000000..5175437f --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCSanDianTu/ScatterAqiColor.vue @@ -0,0 +1,266 @@ + + + + diff --git a/snowy-admin-web/src/components/Chart/eCShuXingTu/TreeWithPolylineEdge.vue b/snowy-admin-web/src/components/Chart/eCShuXingTu/TreeWithPolylineEdge.vue new file mode 100644 index 00000000..191cb2ba --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCShuXingTu/TreeWithPolylineEdge.vue @@ -0,0 +1,184 @@ + + + + diff --git a/snowy-admin-web/src/components/Chart/eCXianXingTu/BasicLineChart.vue b/snowy-admin-web/src/components/Chart/eCXianXingTu/BasicLineChart.vue new file mode 100644 index 00000000..762bd99c --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCXianXingTu/BasicLineChart.vue @@ -0,0 +1,36 @@ + + + + diff --git a/snowy-admin-web/src/components/Chart/eCXianXingTu/StackedAreaChart.vue b/snowy-admin-web/src/components/Chart/eCXianXingTu/StackedAreaChart.vue new file mode 100644 index 00000000..60dd4e74 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCXianXingTu/StackedAreaChart.vue @@ -0,0 +1,117 @@ + + + + diff --git a/snowy-admin-web/src/components/Chart/eCXianXingTu/StackedLineChart.vue b/snowy-admin-web/src/components/Chart/eCXianXingTu/StackedLineChart.vue new file mode 100644 index 00000000..e8f26fa1 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCXianXingTu/StackedLineChart.vue @@ -0,0 +1,83 @@ + + + + diff --git a/snowy-admin-web/src/components/Chart/eCXianXingTu/StepLine.vue b/snowy-admin-web/src/components/Chart/eCXianXingTu/StepLine.vue new file mode 100644 index 00000000..00cca3cb --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCXianXingTu/StepLine.vue @@ -0,0 +1,70 @@ + + + + diff --git a/snowy-admin-web/src/components/Chart/eCYiBiaoTu/GaugeBasicChart.vue b/snowy-admin-web/src/components/Chart/eCYiBiaoTu/GaugeBasicChart.vue new file mode 100644 index 00000000..d543ede5 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCYiBiaoTu/GaugeBasicChart.vue @@ -0,0 +1,39 @@ + + + + diff --git a/snowy-admin-web/src/components/Chart/eCYiBiaoTu/GrogressGauge.vue b/snowy-admin-web/src/components/Chart/eCYiBiaoTu/GrogressGauge.vue new file mode 100644 index 00000000..cb9c2821 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCYiBiaoTu/GrogressGauge.vue @@ -0,0 +1,108 @@ + + + + diff --git a/snowy-admin-web/src/components/Chart/eCYiBiaoTu/StageSpeedGauge.vue b/snowy-admin-web/src/components/Chart/eCYiBiaoTu/StageSpeedGauge.vue new file mode 100644 index 00000000..2715d44f --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCYiBiaoTu/StageSpeedGauge.vue @@ -0,0 +1,85 @@ + + + + diff --git a/snowy-admin-web/src/components/Chart/eCYiBiaoTu/TemperatureGaugeChart.vue b/snowy-admin-web/src/components/Chart/eCYiBiaoTu/TemperatureGaugeChart.vue new file mode 100644 index 00000000..dfb54ee1 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCYiBiaoTu/TemperatureGaugeChart.vue @@ -0,0 +1,149 @@ + + + + diff --git a/snowy-admin-web/src/components/Chart/eCZhuZhuangTu/BarChartWithNegativeValue.vue b/snowy-admin-web/src/components/Chart/eCZhuZhuangTu/BarChartWithNegativeValue.vue new file mode 100644 index 00000000..c007c373 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCZhuZhuangTu/BarChartWithNegativeValue.vue @@ -0,0 +1,79 @@ + + + + diff --git a/snowy-admin-web/src/components/Chart/eCZhuZhuangTu/BarLabelRotation.vue b/snowy-admin-web/src/components/Chart/eCZhuZhuangTu/BarLabelRotation.vue new file mode 100644 index 00000000..b7c9de2f --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCZhuZhuangTu/BarLabelRotation.vue @@ -0,0 +1,134 @@ + + + + diff --git a/snowy-admin-web/src/components/Chart/eCZhuZhuangTu/BasicBar.vue b/snowy-admin-web/src/components/Chart/eCZhuZhuangTu/BasicBar.vue new file mode 100644 index 00000000..7f5af092 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCZhuZhuangTu/BasicBar.vue @@ -0,0 +1,34 @@ + + + + diff --git a/snowy-admin-web/src/components/Chart/eCZhuZhuangTu/WatermarkEChartsDownload.vue b/snowy-admin-web/src/components/Chart/eCZhuZhuangTu/WatermarkEChartsDownload.vue new file mode 100644 index 00000000..670bf02a --- /dev/null +++ b/snowy-admin-web/src/components/Chart/eCZhuZhuangTu/WatermarkEChartsDownload.vue @@ -0,0 +1,251 @@ + + + + diff --git a/snowy-admin-web/src/components/Chart/g2BingZhuangTu/BingZhuangTu01.vue b/snowy-admin-web/src/components/Chart/g2BingZhuangTu/BingZhuangTu01.vue new file mode 100644 index 00000000..8e634cf9 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2BingZhuangTu/BingZhuangTu01.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2BingZhuangTu/BingZhuangTu02.vue b/snowy-admin-web/src/components/Chart/g2BingZhuangTu/BingZhuangTu02.vue new file mode 100644 index 00000000..1ce172d6 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2BingZhuangTu/BingZhuangTu02.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2BingZhuangTu/BingZhuangTu03.vue b/snowy-admin-web/src/components/Chart/g2BingZhuangTu/BingZhuangTu03.vue new file mode 100644 index 00000000..f0d258a4 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2BingZhuangTu/BingZhuangTu03.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2BingZhuangTu/BingZhuangTu04.vue b/snowy-admin-web/src/components/Chart/g2BingZhuangTu/BingZhuangTu04.vue new file mode 100644 index 00000000..50827a2a --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2BingZhuangTu/BingZhuangTu04.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2CiYunTu/CiYunTu01.vue b/snowy-admin-web/src/components/Chart/g2CiYunTu/CiYunTu01.vue new file mode 100644 index 00000000..6f6e9dc4 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2CiYunTu/CiYunTu01.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2CiYunTu/CiYunTu02.vue b/snowy-admin-web/src/components/Chart/g2CiYunTu/CiYunTu02.vue new file mode 100644 index 00000000..f376197c --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2CiYunTu/CiYunTu02.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2JinDuTu/JinDuTu01.vue b/snowy-admin-web/src/components/Chart/g2JinDuTu/JinDuTu01.vue new file mode 100644 index 00000000..78452878 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2JinDuTu/JinDuTu01.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2JinDuTu/JinDuTu02.vue b/snowy-admin-web/src/components/Chart/g2JinDuTu/JinDuTu02.vue new file mode 100644 index 00000000..26388cbe --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2JinDuTu/JinDuTu02.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2JinDuTu/JinDuTu03.vue b/snowy-admin-web/src/components/Chart/g2JinDuTu/JinDuTu03.vue new file mode 100644 index 00000000..aeca3d74 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2JinDuTu/JinDuTu03.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2JinDuTu/JinDuTu04.vue b/snowy-admin-web/src/components/Chart/g2JinDuTu/JinDuTu04.vue new file mode 100644 index 00000000..ab963dd4 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2JinDuTu/JinDuTu04.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2LouDouTu/LouDouTu01.vue b/snowy-admin-web/src/components/Chart/g2LouDouTu/LouDouTu01.vue new file mode 100644 index 00000000..58476a73 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2LouDouTu/LouDouTu01.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2LouDouTu/LouDouTu02.vue b/snowy-admin-web/src/components/Chart/g2LouDouTu/LouDouTu02.vue new file mode 100644 index 00000000..6e871795 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2LouDouTu/LouDouTu02.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2MianJiTu/MianJiTu01.vue b/snowy-admin-web/src/components/Chart/g2MianJiTu/MianJiTu01.vue new file mode 100644 index 00000000..cf28a34d --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2MianJiTu/MianJiTu01.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2MianJiTu/MianJiTu02.vue b/snowy-admin-web/src/components/Chart/g2MianJiTu/MianJiTu02.vue new file mode 100644 index 00000000..067f7a6d --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2MianJiTu/MianJiTu02.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2MianJiTu/MianJiTu03.vue b/snowy-admin-web/src/components/Chart/g2MianJiTu/MianJiTu03.vue new file mode 100644 index 00000000..dc356bcc --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2MianJiTu/MianJiTu03.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2MianJiTu/MianJiTu04.vue b/snowy-admin-web/src/components/Chart/g2MianJiTu/MianJiTu04.vue new file mode 100644 index 00000000..d3881af4 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2MianJiTu/MianJiTu04.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2SanDianTu/SanDianTu01.vue b/snowy-admin-web/src/components/Chart/g2SanDianTu/SanDianTu01.vue new file mode 100644 index 00000000..600b41c7 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2SanDianTu/SanDianTu01.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2SanDianTu/SanDianTu02.vue b/snowy-admin-web/src/components/Chart/g2SanDianTu/SanDianTu02.vue new file mode 100644 index 00000000..f5fa5d0f --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2SanDianTu/SanDianTu02.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2SanDianTu/SanDianTu03.vue b/snowy-admin-web/src/components/Chart/g2SanDianTu/SanDianTu03.vue new file mode 100644 index 00000000..959d6750 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2SanDianTu/SanDianTu03.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2SanDianTu/SanDianTu04.vue b/snowy-admin-web/src/components/Chart/g2SanDianTu/SanDianTu04.vue new file mode 100644 index 00000000..3f3be26b --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2SanDianTu/SanDianTu04.vue @@ -0,0 +1,339 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2TiaoXingTu/TiaoXingTu01.vue b/snowy-admin-web/src/components/Chart/g2TiaoXingTu/TiaoXingTu01.vue new file mode 100644 index 00000000..848f0bc0 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2TiaoXingTu/TiaoXingTu01.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2TiaoXingTu/TiaoXingTu02.vue b/snowy-admin-web/src/components/Chart/g2TiaoXingTu/TiaoXingTu02.vue new file mode 100644 index 00000000..98299d82 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2TiaoXingTu/TiaoXingTu02.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2TiaoXingTu/TiaoXingTu03.vue b/snowy-admin-web/src/components/Chart/g2TiaoXingTu/TiaoXingTu03.vue new file mode 100644 index 00000000..584fb819 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2TiaoXingTu/TiaoXingTu03.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2TiaoXingTu/TiaoXingTu04.vue b/snowy-admin-web/src/components/Chart/g2TiaoXingTu/TiaoXingTu04.vue new file mode 100644 index 00000000..fc1ae58e --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2TiaoXingTu/TiaoXingTu04.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2ZheXianTu/ZheXianTu01.vue b/snowy-admin-web/src/components/Chart/g2ZheXianTu/ZheXianTu01.vue new file mode 100644 index 00000000..02818d97 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2ZheXianTu/ZheXianTu01.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2ZheXianTu/ZheXianTu02.vue b/snowy-admin-web/src/components/Chart/g2ZheXianTu/ZheXianTu02.vue new file mode 100644 index 00000000..9329ed3e --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2ZheXianTu/ZheXianTu02.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2ZheXianTu/ZheXianTu03.vue b/snowy-admin-web/src/components/Chart/g2ZheXianTu/ZheXianTu03.vue new file mode 100644 index 00000000..66a82a35 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2ZheXianTu/ZheXianTu03.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2ZheXianTu/ZheXianTu04.vue b/snowy-admin-web/src/components/Chart/g2ZheXianTu/ZheXianTu04.vue new file mode 100644 index 00000000..3516a39f --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2ZheXianTu/ZheXianTu04.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2ZhuZhuangTu/ZhuZhuangTu01.vue b/snowy-admin-web/src/components/Chart/g2ZhuZhuangTu/ZhuZhuangTu01.vue new file mode 100644 index 00000000..c3824113 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2ZhuZhuangTu/ZhuZhuangTu01.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2ZhuZhuangTu/ZhuZhuangTu02.vue b/snowy-admin-web/src/components/Chart/g2ZhuZhuangTu/ZhuZhuangTu02.vue new file mode 100644 index 00000000..ced47efa --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2ZhuZhuangTu/ZhuZhuangTu02.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2ZhuZhuangTu/ZhuZhuangTu03.vue b/snowy-admin-web/src/components/Chart/g2ZhuZhuangTu/ZhuZhuangTu03.vue new file mode 100644 index 00000000..e8ccad18 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2ZhuZhuangTu/ZhuZhuangTu03.vue @@ -0,0 +1,122 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2ZhuZhuangTu/ZhuZhuangTu04.vue b/snowy-admin-web/src/components/Chart/g2ZhuZhuangTu/ZhuZhuangTu04.vue new file mode 100644 index 00000000..c9699ecd --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2ZhuZhuangTu/ZhuZhuangTu04.vue @@ -0,0 +1,140 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2ZiDanTu/ZiDanTu01.vue b/snowy-admin-web/src/components/Chart/g2ZiDanTu/ZiDanTu01.vue new file mode 100644 index 00000000..30a3cd39 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2ZiDanTu/ZiDanTu01.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/snowy-admin-web/src/components/Chart/g2ZiDanTu/ZiDanTu02.vue b/snowy-admin-web/src/components/Chart/g2ZiDanTu/ZiDanTu02.vue new file mode 100644 index 00000000..f1e2d766 --- /dev/null +++ b/snowy-admin-web/src/components/Chart/g2ZiDanTu/ZiDanTu02.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/snowy-admin-web/src/components/ColorPicker/index.vue b/snowy-admin-web/src/components/ColorPicker/index.vue new file mode 100644 index 00000000..3944c93e --- /dev/null +++ b/snowy-admin-web/src/components/ColorPicker/index.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/snowy-admin-web/src/components/Cron/index.vue b/snowy-admin-web/src/components/Cron/index.vue new file mode 100644 index 00000000..7589e1d2 --- /dev/null +++ b/snowy-admin-web/src/components/Cron/index.vue @@ -0,0 +1,1033 @@ + + + + + diff --git a/snowy-admin-web/src/components/CropUpload/index.vue b/snowy-admin-web/src/components/CropUpload/index.vue new file mode 100644 index 00000000..8138ca4d --- /dev/null +++ b/snowy-admin-web/src/components/CropUpload/index.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/snowy-admin-web/src/components/Editor/index.vue b/snowy-admin-web/src/components/Editor/index.vue new file mode 100644 index 00000000..b7b11cc2 --- /dev/null +++ b/snowy-admin-web/src/components/Editor/index.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/snowy-admin-web/src/components/Ellipsis/index.md b/snowy-admin-web/src/components/Ellipsis/index.md new file mode 100644 index 00000000..ebdc21ed --- /dev/null +++ b/snowy-admin-web/src/components/Ellipsis/index.md @@ -0,0 +1,38 @@ +# Ellipsis 文本自动省略号 + +文本过长自动处理省略号,支持按照文本长度和最大行数两种方式截取。 + + + +引用方式: + +```javascript +import Ellipsis from '@/components/Ellipsis' + +export default { + components: { + Ellipsis + } +} +``` + + + +## 代码演示 [demo](https://snowy.xiaonuo.vip) + +```html + + There were injuries alleged in three cases in 2015, and a + fourth incident in September, according to the safety recall report. After meeting with US regulators in October, the firm decided to issue a voluntary recall. + +``` + + + +## API + + +参数 | 说明 | 类型 | 默认值 +----|------|-----|------ +tooltip | 移动到文本展示完整内容的提示 | boolean | - +length | 在按照长度截取下的文本最大字符数,超过则截取省略 | number | - diff --git a/snowy-admin-web/src/components/Ellipsis/index.vue b/snowy-admin-web/src/components/Ellipsis/index.vue new file mode 100644 index 00000000..31e68000 --- /dev/null +++ b/snowy-admin-web/src/components/Ellipsis/index.vue @@ -0,0 +1,50 @@ + diff --git a/snowy-admin-web/src/components/Ellipsis/util.js b/snowy-admin-web/src/components/Ellipsis/util.js new file mode 100644 index 00000000..b9577bb6 --- /dev/null +++ b/snowy-admin-web/src/components/Ellipsis/util.js @@ -0,0 +1,44 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ + +/** + * 获取字符串长度,英文字符 长度1,中文字符长度2 + * @param {*} str + */ +export const getStrFullLength = (str = '') => + str.split('').reduce((pre, cur) => { + const charCode = cur.charCodeAt(0) + if (charCode >= 0 && charCode <= 128) { + return pre + 1 + } + return pre + 2 + }, 0) + +/** + * 截取字符串,根据 maxLength 截取后返回 + * @param {*} str + * @param {*} maxLength + */ +export const cutStrByFullLength = (str = '', maxLength) => { + let showLength = 0 + return str.split('').reduce((pre, cur) => { + const charCode = cur.charCodeAt(0) + if (charCode >= 0 && charCode <= 128) { + showLength += 1 + } else { + showLength += 2 + } + if (showLength <= maxLength) { + return pre + cur + } + return pre + }, '') +} diff --git a/snowy-admin-web/src/components/NumberInfo/NumberInfo.vue b/snowy-admin-web/src/components/NumberInfo/NumberInfo.vue new file mode 100644 index 00000000..9f8aba37 --- /dev/null +++ b/snowy-admin-web/src/components/NumberInfo/NumberInfo.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/snowy-admin-web/src/components/NumberInfo/index.less b/snowy-admin-web/src/components/NumberInfo/index.less new file mode 100644 index 00000000..18233ae5 --- /dev/null +++ b/snowy-admin-web/src/components/NumberInfo/index.less @@ -0,0 +1,55 @@ +@import "../index.less"; + +@numberInfo-prefix-cls: ~"@{ant-pro-prefix}-number-info"; + +.@{numberInfo-prefix-cls} { + + .ant-pro-number-info-subtitle { + color: @text-color-secondary; + font-size: @font-size-base; + height: 22px; + line-height: 22px; + overflow: hidden; + text-overflow: ellipsis; + word-break: break-all; + white-space: nowrap; + } + + .number-info-value { + margin-top: 4px; + font-size: 0; + overflow: hidden; + text-overflow: ellipsis; + word-break: break-all; + white-space: nowrap; + + & > span { + color: @heading-color; + display: inline-block; + line-height: 32px; + height: 32px; + font-size: 24px; + margin-right: 32px; + } + + .sub-total { + color: @text-color-secondary; + font-size: @font-size-lg; + vertical-align: top; + margin-right: 0; + i { + font-size: 12px; + transform: scale(0.82); + margin-left: 4px; + } + // :global { + // .anticon-caret-up { + // color: @red-6; + // } + // .anticon-caret-down { + // color: @green-6; + // } + // } + } + } +} \ No newline at end of file diff --git a/snowy-admin-web/src/components/Selector/iconSelector.vue b/snowy-admin-web/src/components/Selector/iconSelector.vue new file mode 100644 index 00000000..5d0ecbfb --- /dev/null +++ b/snowy-admin-web/src/components/Selector/iconSelector.vue @@ -0,0 +1,143 @@ + + + + + diff --git a/snowy-admin-web/src/components/Selector/iconSelector_README.md b/snowy-admin-web/src/components/Selector/iconSelector_README.md new file mode 100644 index 00000000..db4d6f62 --- /dev/null +++ b/snowy-admin-web/src/components/Selector/iconSelector_README.md @@ -0,0 +1,54 @@ +iconSelector +==== + +> 图标选择组件,常用于为某一个数据设定一个图标时使用 +> eg: 设定菜单列表时,为每个菜单设定一个图标 + +该组件由 [小诺开源技术](https://www.xiaonuo.vip) 封装 + + + +### 使用方式 + +```vue + + + +``` + + + +### 事件 + +| 名称 | 说明 | 类型 | 默认值 | +| ------------ | -------------------------- | ------ | ------ | +| iconCallBack | 当改变了 `icon` 选中项触发 | String | - | + +### 方法 + +| 名称 | 说明 | 类型 | 默认值 | +| --------- | --------------------------------------- | ------ | ------ | +| showIconModal | 打开选择器Model触发,携带图标时默认选中 | String | - | diff --git a/snowy-admin-web/src/components/Selector/orgSelectorPlus.vue b/snowy-admin-web/src/components/Selector/orgSelectorPlus.vue new file mode 100644 index 00000000..20ce6076 --- /dev/null +++ b/snowy-admin-web/src/components/Selector/orgSelectorPlus.vue @@ -0,0 +1,343 @@ + + + + + diff --git a/snowy-admin-web/src/components/Selector/posSelectorPlus.vue b/snowy-admin-web/src/components/Selector/posSelectorPlus.vue new file mode 100644 index 00000000..3b089483 --- /dev/null +++ b/snowy-admin-web/src/components/Selector/posSelectorPlus.vue @@ -0,0 +1,343 @@ + + + + + diff --git a/snowy-admin-web/src/components/Selector/roleSelectorPlus.vue b/snowy-admin-web/src/components/Selector/roleSelectorPlus.vue new file mode 100644 index 00000000..349fc925 --- /dev/null +++ b/snowy-admin-web/src/components/Selector/roleSelectorPlus.vue @@ -0,0 +1,396 @@ + + + + + diff --git a/snowy-admin-web/src/components/Selector/userSelectorPlus.vue b/snowy-admin-web/src/components/Selector/userSelectorPlus.vue new file mode 100644 index 00000000..f62936f2 --- /dev/null +++ b/snowy-admin-web/src/components/Selector/userSelectorPlus.vue @@ -0,0 +1,343 @@ + + + + + diff --git a/snowy-admin-web/src/components/ShortcutCard/index.vue b/snowy-admin-web/src/components/ShortcutCard/index.vue new file mode 100644 index 00000000..c7d70cd7 --- /dev/null +++ b/snowy-admin-web/src/components/ShortcutCard/index.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/snowy-admin-web/src/components/Table/README.md b/snowy-admin-web/src/components/Table/README.md new file mode 100644 index 00000000..ffedcb95 --- /dev/null +++ b/snowy-admin-web/src/components/Table/README.md @@ -0,0 +1,339 @@ +Table 重封装组件说明 +==== + + +封装说明 +---- + +> 基础的使用方式与 API 与 [官方版(Table)](https://vuecomponent.github.io/ant-design-vue/components/table-cn/) 本一致,在其基础上,封装了加载数据的方法。 +> +> 你无需在你是用表格的页面进行分页逻辑处理,仅需向 Table 组件传递绑定 `:data="Promise"` 对象即可 + +该 `table` 由 [@Saraka](https://github.com/saraka-tsukai) 完成封装 + +由 `小诺技术团队` 完成Vue3升级并二次封装改进 + +例子1 +---- +(基础使用) + +```vue + + + + +``` + + + +例子2 +---- + +(简单的表格,最后一列是各种操作) + +```vue + + + +``` + + + +内置方法 +---- + +通过 `this.$refs.table` 调用 + +`this.$refs.table.refresh(true)` 刷新列表 (用户新增/修改数据后,重载列表数据) + +> 注意:要调用 `refresh(bool)` 需要给表格组件设定 `ref` 值 +> +> `refresh()` 方法可以传一个 `bool` 值,当有传值 或值为 `true` 时,则刷新时会强制刷新到第一页(常用户页面 搜索 按钮进行搜索时,结果从第一页开始分页) + + +内置属性 +---- +> 除去 `a-table` 自带属性外,还而外提供了一些额外属性属性 + + +| 属性 | 说明 | 类型 | 默认值 | +| -------------- | ----------------------------------------------- | ----------------- | ------ | +| alert | 设置是否显示表格信息栏 | [object, boolean] | null | +| showPagination | 显示分页选择器,可传 'auto' \| boolean | [string, boolean] | 'auto' | +| data | 加载数据方法 必须为 `Promise` 对象 **必须绑定** | Promise | - | + + +`alert` 属性对象: + +```javascript +alert: { + show: Boolean, + clear: [Function, Boolean] +} +``` + +注意事项 +---- + +> 你可能需要为了与后端提供的接口返回结果一致而去修改以下代码: +> (需要注意的是,这里的修改是全局性的,意味着整个项目所有使用该 table 组件都需要遵守这个返回结果定义的字段。) +> +> 文档中的结构有可能由于组件 bug 进行修正而改动。实际修改请以当时最新版本为准 + +修改 `@/components/table/index.js` 第 156 行起 + + + +```javascript +result.then(r => { + this.localPagination = this.showPagination && Object.assign({}, this.localPagination, { + current: r.pageNo, // 返回结果中的当前分页数 + total: r.totalCount, // 返回结果中的总记录数 + showSizeChanger: this.showSizeChanger, + pageSize: (pagination && pagination.pageSize) || + this.localPagination.pageSize + }) || false + // 为防止删除数据后导致页面当前页面数据长度为 0 ,自动翻页到上一页 + if (r.data.length === 0 && this.showPagination && this.localPagination.current > 1) { + this.localPagination.current-- + this.loadData() + return + } + + // 这里用于判断接口是否有返回 r.totalCount 且 this.showPagination = true 且 pageNo 和 pageSize 存在 且 totalCount 小于等于 pageNo * pageSize 的大小 + // 当情况满足时,表示数据不满足分页大小,关闭 table 分页功能 + try { + if ((['auto', true].includes(this.showPagination) && r.totalCount <= (r.pageNo * this.localPagination.pageSize))) { + this.localPagination.hideOnSinglePage = true + } + } catch (e) { + this.localPagination = false + } + console.log('loadData -> this.localPagination', this.localPagination) + this.localDataSource = r.data // 返回结果中的数组数据 + this.localLoading = false + }) +``` +返回 JSON 例子: +```json +{ + "message": "", + "result": { + "data": [{ + id: 1, + cover: 'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png', + title: 'Alipay', + description: '那是一种内在的东西, 他们到达不了,也无法触及的', + status: 1, + updatedAt: '2018-07-26 00:00:00' + }, + { + id: 2, + cover: 'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png', + title: 'Angular', + description: '希望是一个好东西,也许是最好的,好东西是不会消亡的', + status: 1, + updatedAt: '2018-07-26 00:00:00' + }, + { + id: 3, + cover: 'https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png', + title: 'Ant Design', + description: '城镇中有那么多的酒馆,她却偏偏走进了我的酒馆', + status: 1, + updatedAt: '2018-07-26 00:00:00' + }, + { + id: 4, + cover: 'https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png', + title: 'Snowy', + description: '那时候我只会想自己想要什么,从不想自己拥有什么', + status: 1, + updatedAt: '2018-07-26 00:00:00' + }, + { + id: 5, + cover: 'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png', + title: 'Bootstrap', + description: '凛冬将至', + status: 1, + updatedAt: '2018-07-26 00:00:00' + }, + { + id: 6, + cover: 'https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png', + title: 'Vue', + description: '生命就像一盒巧克力,结果往往出人意料', + status: 1, + updatedAt: '2018-07-26 00:00:00' + } + ], + "pageSize": 10, + "pageNo": 0, + "totalPage": 6, + "totalCount": 57 + }, + "status": 200, + "timestamp": 1534955098193 +} +``` + + + +更新时间 +---- + +该文档最后更新于: 2019-06-23 PM 17:19 diff --git a/snowy-admin-web/src/components/Table/columnSetting.vue b/snowy-admin-web/src/components/Table/columnSetting.vue new file mode 100644 index 00000000..ea491e9c --- /dev/null +++ b/snowy-admin-web/src/components/Table/columnSetting.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/snowy-admin-web/src/components/Table/index.less b/snowy-admin-web/src/components/Table/index.less new file mode 100644 index 00000000..3c3768e6 --- /dev/null +++ b/snowy-admin-web/src/components/Table/index.less @@ -0,0 +1,57 @@ +.table-wrapper{ +} + +.table-striped td { + background-color: var(--table-row-hover-bg); +} +.s-table-tool{ + display: flex; + margin-bottom: 16px; + .s-table-tool-left{ + flex: 1; + } + .s-table-tool-right{ + .s-tool-item{ + font-size: 16px; + @apply ml-4; + cursor: pointer; + + } + } +} + +.s-tool-column-item{ + display: flex; + align-items: center; + padding: 4px 16px 4px 4px; + .ant-checkbox-wrapper{ + flex: 1; + } + .s-tool-column-handle{ + opacity: .8; + cursor: move; + .anticon-more{ + font-size: 12px; + & + .anticon-more{ + margin: 0px 4px 0 -8px; + } + } + } +} +.s-tool-column-header{ + padding: 5px 16px 10px 24px; + min-width: 180px; +} +.s-tool-column{ + .ant-divider{ + margin: 0; + } + .ant-checkbox-group{ + padding: 4px 0; + display: block; + } +} + +.s-table-column-settings .ant-popover-inner-content{ + padding: 0; +} diff --git a/snowy-admin-web/src/components/Table/index.vue b/snowy-admin-web/src/components/Table/index.vue new file mode 100644 index 00000000..5d11336e --- /dev/null +++ b/snowy-admin-web/src/components/Table/index.vue @@ -0,0 +1,537 @@ + diff --git a/snowy-admin-web/src/components/TreeSelect/menuTreeSelect.vue b/snowy-admin-web/src/components/TreeSelect/menuTreeSelect.vue new file mode 100644 index 00000000..98a0d3d9 --- /dev/null +++ b/snowy-admin-web/src/components/TreeSelect/menuTreeSelect.vue @@ -0,0 +1,113 @@ + + + diff --git a/snowy-admin-web/src/components/Trend/Trend.vue b/snowy-admin-web/src/components/Trend/Trend.vue new file mode 100644 index 00000000..a470942d --- /dev/null +++ b/snowy-admin-web/src/components/Trend/Trend.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/snowy-admin-web/src/components/Trend/index.less b/snowy-admin-web/src/components/Trend/index.less new file mode 100644 index 00000000..8a3d24cf --- /dev/null +++ b/snowy-admin-web/src/components/Trend/index.less @@ -0,0 +1,42 @@ +@import "../index"; + +@trend-prefix-cls: ~"@{ant-pro-prefix}-trend"; + +.@{trend-prefix-cls} { + display: inline-block; + font-size: @font-size-base; + line-height: 22px; + + .up, + .down { + margin-left: 4px; + position: relative; + top: 1px; + + i { + font-size: 12px; + transform: scale(0.83); + } + } + + .item-text { + display: inline-block; + margin-left: 8px; + color: rgba(0,0,0,.85); + } + + .up { + color: @red-6; + } + .down { + color: @green-6; + top: -1px; + } + + &.reverse-color .up { + color: @green-6; + } + &.reverse-color .down { + color: @red-6; + } +} \ No newline at end of file diff --git a/snowy-admin-web/src/components/XnHighlightjs/index.vue b/snowy-admin-web/src/components/XnHighlightjs/index.vue new file mode 100644 index 00000000..c34c3890 --- /dev/null +++ b/snowy-admin-web/src/components/XnHighlightjs/index.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/snowy-admin-web/src/components/XnSignName/README.md b/snowy-admin-web/src/components/XnSignName/README.md new file mode 100644 index 00000000..15cd1598 --- /dev/null +++ b/snowy-admin-web/src/components/XnSignName/README.md @@ -0,0 +1,113 @@ +# vue-esign + +https://github.com/JaimeCheng/vue-esign#readme + +> Canvas 手写签字 电子签名 +![npm](https://img.shields.io/npm/dm/vue-esign) ![GitHub package.json version](https://img.shields.io/github/package-json/v/jaimecheng/vue-esign) + +## 时隔三年的更新!!支持vue3 +- **支持vue3!!!!更新依赖后,仅`bgColor`原来的`.sync`修饰符需改为vue3写法`v-model:bgColor`**; +- 新增属性 `isClearBgColor`,默认值`true`, 清空画布时(reset)是否同时清空设置的背景色(bgColor) ; +- 直接`npm install vue-esign@latest --save`即可,对vue2版本无任何影响; +## 功能 +1. 兼容 PC 和 Mobile; +2. 画布自适应屏幕大小变化(窗口缩放、屏幕旋转时画布无需重置,自动校正坐标); +3. 自定义画布尺寸(导出图尺寸),画笔粗细、颜色,画布背景色; +4. 支持裁剪 (针对需求:有的签字需要裁剪掉四周空白)。 +5. 导出图片格式为 `base64`; +6. [示例demo](https://jaimecheng.github.io/vue-esign/demo/) + +## 安装 + +``` bash +npm install vue-esign --save +``` + +## 使用 +1. 全局使用 、局部 +```js +// 全局 vue2 main.js +import vueEsign from 'vue-esign' +Vue.use(vueEsign) +// 全局vue3 main.js +import { createApp } from 'vue' +import App from './App.vue' +import vueEsign from 'vue-esign' +const app = createApp(App) +app.use(vueEsign) +// 局部 +import vueEsign from 'vue-esign' +components: { vueEsign } +``` +2. 页面中使用 + **必须设置 `ref` ,用来调用组件的两个内置方法 `reset()` 和 `generate()`** + + 无需给组件设置 `style` 的宽高,如果画布的 `width`属性值没超出父元素的样式宽度,则该组件的样式宽度就是画布宽度,超出的话,组件样式宽度则是父元素的100%; 所以只需设置好父元素的宽度即可; +```html + + + + + + + + + +``` +```js +data () { + return { + lineWidth: 6, + lineColor: '#000000', + bgColor: '', + resultImg: '', + isCrop: false + } +}, +methods: { + handleReset () { + this.$refs.esign.reset() + }, + handleGenerate () { + this.$refs.esign.generate().then(res => { + this.resultImg = res + }).catch(err => { + alert(err) // 画布没有签字时会执行这里 'Not Signned' + }) + } +} +``` +3. 说明 + +| 属性 | 类型 | 默认值 | 说明 | +| :-: | :-- | :-: | :-- | +| width | Number | 800 | 画布宽度,即导出图片的宽度 | +| height | Number | 300 | 画布高度,即导出图片的高度 | +| lineWidth | 4 | Number | 画笔粗细 | +| lineColor | String | #000000 | 画笔颜色 | +| bgColor | String | 空 | 画布背景色,为空时画布背景透明,
支持多种格式 '#ccc','#E5A1A1','rgb(229, 161, 161)','rgba(0,0,0,.6)','red' | +| isCrop | Boolean | false | 是否裁剪,在画布设定尺寸基础上裁掉四周空白部分 | +| isClearBgColor | Boolean | true | 清空画布时(reset)是否同时清空设置的背景色(bgColor) | +| format | String | image/png | 生成图片格式 image/jpeg(jpg格式下生成的图片透明背景会变黑色请慎用或指定背景色)、 image/webp | +| quality | Number | 1 | 生成图片质量;在指定图片格式为 image/jpeg 或 image/webp的情况下,可以从 0 到 1 的区间内选择图片的质量。如果超出取值范围,将会使用默认值 0.92。其他参数会被忽略。 | + +两个内置方法,通过给组件设置 `ref` 调用: + +**清空画布** +```js +this.$refs.esign.reset() +``` + +**生成图片** + +```js +// 可选配置参数 ,在未设置format或quality属性时可在生成图片时配置 例如: {format:'image/jpeg', quality: 0.5} +// this.$refs.esign.generate({format:'image/jpeg', quality: 0.5}) +this.$refs.esign.generate().then(res => { + console.log(res) // base64图片 +}).catch(err => { + alert(err) // 画布没有签字时会执行这里 'Not Signned' +}) +``` + +![](./static/demo.gif) diff --git a/snowy-admin-web/src/components/XnSignName/index.vue b/snowy-admin-web/src/components/XnSignName/index.vue new file mode 100644 index 00000000..77130c40 --- /dev/null +++ b/snowy-admin-web/src/components/XnSignName/index.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/snowy-admin-web/src/components/XnSignName/vueEsign.vue b/snowy-admin-web/src/components/XnSignName/vueEsign.vue new file mode 100644 index 00000000..7c27e6b9 --- /dev/null +++ b/snowy-admin-web/src/components/XnSignName/vueEsign.vue @@ -0,0 +1,299 @@ + + + + + + diff --git a/snowy-admin-web/src/components/XnUpload/index.vue b/snowy-admin-web/src/components/XnUpload/index.vue new file mode 100644 index 00000000..9fcfbef6 --- /dev/null +++ b/snowy-admin-web/src/components/XnUpload/index.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/snowy-admin-web/src/components/global.less b/snowy-admin-web/src/components/global.less new file mode 100644 index 00000000..74c17c38 --- /dev/null +++ b/snowy-admin-web/src/components/global.less @@ -0,0 +1,516 @@ +@import './index.less'; + +body { + + +} + +#app { + height: 100%; + + &.colorWeak { + filter: invert(80%); + } + &.userLayout { + overflow: auto; + } +} + +.layout.ant-layout { + height: auto; + overflow-x: hidden; + + &.mobile, + &.tablet { + .ant-layout-content { + .content { + margin: 24px 0 0; + } + } + + /** + * ant-table-wrapper + * 覆盖的表格手机模式样式,如果想修改在手机上表格最低宽度,可以在这里改动 + */ + .ant-table-wrapper { + .ant-table-content { + overflow-y: auto; + } + .ant-table-body { + min-width: 800px; + } + } + .topmenu { + /* 必须为 topmenu 才能启用流式布局 */ + &.content-width-Fluid { + .header-index-wide { + margin-left: 0; + } + } + } + } + + &.mobile { + .sidemenu { + .ant-header-fixedHeader { + &.ant-header-side-opened, + &.ant-header-side-closed { + width: 100%; + } + } + } + } + + &.ant-layout-has-sider { + flex-direction: row; + } + + .trigger { + font-size: 20px; + line-height: 55px; + padding: 0 24px; + cursor: pointer; + transition: color 0.3s; + &:hover { + background: rgba(0, 0, 0, 0.025); + } + } + + .topmenu { + .ant-header-fixedHeader { + position: fixed; + top: 0; + right: 0; + z-index: 9; + width: 100%; + transition: width 0.2s; + + &.ant-header-side-opened { + width: 100%; + } + + &.ant-header-side-closed { + width: 100%; + } + } + /* 必须为 topmenu 才能启用流式布局 */ + &.content-width-Fluid { + .header-index-wide { + max-width: unset; + .header-index-left { + flex: 1 1 1000px; + .logo{ + margin-left: 25px; + } + .ant-menu.ant-menu-horizontal{ + max-width: calc(100vw - 190px - 238px - 25px); + flex: 1 1 calc(100vw - 190px - 238px - 25px); + } + } + .header-index-right{ + margin-right:25px; + } + } + + .page-header-index-wide { + max-width: unset; + } + } + } + + .sidemenu { + .ant-header-fixedHeader { + position: fixed; + top: 0; + right: 0; + z-index: 9; + width: 100%; + transition: width 0.2s; + + &.ant-header-side-opened { + width: calc(100% - 230px); + } + + &.ant-header-side-closed { + width: calc(100% - 80px); + } + } + } + + .header { + height: 55px; + // padding: 0 12px 0 0; + background: #fff; + box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08); + position: relative; + } + + .header, + .top-nav-header-index { + .user-wrapper { + float: right; + height: 100%; + + .action { + line-height: 55px; + cursor: pointer; + padding: 0 12px; + display: inline-block; + transition: all 0.3s; + height: 100%; + color: rgba(0, 0, 0, 0.65); + + &:hover { + background: rgba(0, 0, 0, 0.025); + } + + .avatar { + margin: 15px 8px 15px 0; + color: #1890ff; + background: hsla(0, 0%, 100%, 0.85); + vertical-align: middle; + } + + .icon { + font-size: 16px; + padding: 4px; + } + } + } + + &.dark { + .user-wrapper { + .action { + color: rgba(255, 255, 255, 0.85); + a { + color: rgba(255, 255, 255, 0.85); + } + + &:hover { + background: rgba(255, 255, 255, 0.16); + } + } + } + } + } + + &.mobile, + &.tablet { + .top-nav-header-index { + .header-index-wide { + .header-index-left { + .trigger { + color: rgba(255, 255, 255, 0.85); + padding: 0 12px; + } + + .logo.top-nav-header { + flex: 0 0 56px; + text-align: center; + line-height: 58px; + h1 { + display: none; + } + } + } + } + + &.light { + .header-index-wide { + .header-index-left { + .trigger { + color: rgba(0, 0, 0, 0.65); + } + } + } + } + } + } + + &.tablet { + // overflow: hidden; text-overflow:ellipsis; white-space: nowrap; + .top-nav-header-index { + .header-index-wide { + .header-index-left { + .logo > a { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + .ant-menu.ant-menu-horizontal { + flex: 1 1 auto; + white-space: normal; + } + } + } + } + + .top-nav-header-index { + box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08); + position: relative; + transition: background 0.3s, width 0.2s; + + .header-index-wide { + max-width: 1200px; + margin: auto; + padding-left: 0; + display: flex; + height: 55px; + + .ant-menu.ant-menu-horizontal { + max-width: 835px; + flex: 0 1 835px; + border: none; + height: 55px; + line-height: 55px; + } + + .header-index-left { + flex: 0 1 1000px; + display: flex; + + .logo.top-nav-header { + flex: 0 0 165px; + width: 165px; + height: 55px; + position: relative; + line-height: 55px; + transition: all 0.3s; + overflow: hidden; + + img, + svg { + display: inline-block; + vertical-align: middle; + height: 32px; + width: 32px; + } + + h1 { + color: #fff; + display: inline-block; + vertical-align: top; + font-size: 16px; + margin: 0 0 0 12px; + font-weight: 400; + } + } + } + + .header-index-right { + flex: 0 0 238px; + align-self: flex-end; + height: 55px; + overflow: hidden; + + .content-box { + float: right; + .action { + max-width: 140px; + overflow: hidden; + text-overflow:ellipsis; + white-space:nowrap; + } + } + } + } + + &.light { + background-color: #fff; + + .header-index-wide { + .header-index-left { + .logo { + h1 { + color: #002140; + } + } + } + } + } + } + + // 内容区 + .layout-content { + margin: 24px 24px 0px; + //height: 100%; + //height: 64px; + padding: 0 12px 0 0; + } + + // footer + .ant-layout-footer { + padding: 0; + } +} + +.topmenu { + .page-header-index-wide { + max-width: 1200px; + margin: 0 auto; + } +} + +// drawer-sider 自定义 +.ant-drawer.drawer-sider { + .sider { + box-shadow: none; + } + + &.dark { + .ant-drawer-content { + background-color: rgb(0, 21, 41); + } + } + &.light { + box-shadow: none; + .ant-drawer-content { + background-color: #fff; + } + } + + .ant-drawer-body { + padding: 0; + } +} + +// 菜单样式 +.sider { + box-shadow: 2px 0 6px rgba(0, 21, 41, 0.35); + position: relative; + z-index: @ant-global-sider-zindex; + min-height: 100vh; + + .ant-layout-sider-children { + overflow-y: hidden; + + &:hover { + overflow-y: auto; + } + } + + &.ant-fixed-sidemenu { + position: fixed; + height: 100%; + } + + // logo区域样式 + .logo { + position: relative; + height: 55px; + padding-left: 24px; + overflow: hidden; + line-height: 55px; + background: #002140; + transition: all .3s; + + img, + svg, + h1 { + display: inline-block; + vertical-align: middle; + } + + img, + svg { + height: 32px; + width: 32px; + } + + h1 { + color: #fff; + font-size: 20px; + margin: 0 0 0 12px; + font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif; + font-weight: 600; + vertical-align: middle; + } + } + + &.light { + background-color: #fff; + box-shadow: 2px 0px 8px 0px rgba(29, 35, 41, 0.05); + + .logo { + background: #fff; + box-shadow: 1px 1px 0px 0px #e8e8e8; + + h1 { + color: unset; + } + } + + .ant-menu-light { + border-right-color: transparent; + } + } +} + +// 外置的样式控制 +.user-dropdown-menu { + span { + user-select: none; + } +} +.user-dropdown-menu-wrapper.ant-dropdown-menu { + padding: 4px 0; + + .ant-dropdown-menu-item { + width: 160px; + } + + .ant-dropdown-menu-item > .anticon:first-child, + .ant-dropdown-menu-item > a > .anticon:first-child, + .ant-dropdown-menu-submenu-title > .anticon:first-child .ant-dropdown-menu-submenu-title > a > .anticon:first-child { + min-width: 12px; + margin-right: 8px; + } +} + +// 数据列表 样式 +.table-alert { + margin-bottom: 16px; +} + +.table-page-search-wrapper { + .ant-form-inline { + .ant-form-item { + display: flex; + margin-bottom: 24px; + margin-right: 0; + + .ant-form-item-control-wrapper { + flex: 1 1; + display: inline-block; + vertical-align: middle; + } + + > .ant-form-item-label { + line-height: 32px; + padding-right: 8px; + width: auto; + } + .ant-form-item-control { + height: 32px; + line-height: 32px; + } + } + } + + .table-page-search-submitButtons { + display: block; + margin-bottom: 24px; + white-space: nowrap; + } +} + +.content { + .table-operator { + margin-bottom: 18px; + + button { + margin-right: 8px; + } + } +} diff --git a/snowy-admin-web/src/components/index.less b/snowy-admin-web/src/components/index.less new file mode 100644 index 00000000..25cb2009 --- /dev/null +++ b/snowy-admin-web/src/components/index.less @@ -0,0 +1,6 @@ +@import "ant-design-vue/lib/style/index"; + +// The prefix to use on all css classes from ant-pro. +@ant-pro-prefix : ant-pro; +@ant-global-sider-zindex : 106; +@ant-global-header-zindex : 105; diff --git a/snowy-admin-web/src/config/iconSelect.js b/snowy-admin-web/src/config/iconSelect.js new file mode 100644 index 00000000..4212e5d9 --- /dev/null +++ b/snowy-admin-web/src/config/iconSelect.js @@ -0,0 +1,829 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { defineAsyncComponent } from 'vue' + +/** + * 图标选择器基础数据 + * 推荐前往https://icones.js.org下载图标的Vue文件,然后放在src/assets/icons文件夹里面 + * 这个网址有118个图标集,包括antd、font awesome、bootstrap、eleme等累计140456个图标 + */ +const uiwIconComponentMap = import.meta.glob('../assets/icons/uiw/*.vue') // 异步方式 + +const uiwIcons = Object.keys(uiwIconComponentMap).map((key) => { + return key.slice(key.lastIndexOf('/') + 1, key.lastIndexOf('.')) +}) + +export default { + icons: [ + { + name: '基础', + key: 'default', + iconItem: [ + { + name: '线框风格', + key: 'default', + item: [ + 'step-backward-outlined', + 'step-forward-outlined', + 'fast-backward-outlined', + 'fast-forward-outlined', + 'shrink-outlined', + 'arrows-alt-outlined', + 'down-outlined', + 'up-outlined', + 'left-outlined', + 'right-outlined', + 'caret-up-outlined', + 'caret-down-outlined', + 'caret-left-outlined', + 'caret-right-outlined', + 'up-circle-outlined', + 'down-circle-outlined', + 'left-circle-outlined', + 'right-circle-outlined', + 'double-right-outlined', + 'double-left-outlined', + 'vertical-left-outlined', + 'vertical-right-outlined', + 'vertical-align-top-outlined', + 'vertical-align-middle-outlined', + 'vertical-align-bottom-outlined', + 'forward-outlined', + 'backward-outlined', + 'rollback-outlined', + 'enter-outlined', + 'retweet-outlined', + 'swap-outlined', + 'swap-left-outlined', + 'swap-right-outlined', + 'arrow-up-outlined', + 'arrow-down-outlined', + 'arrow-left-outlined', + 'arrow-right-outlined', + 'play-circle-outlined', + 'up-Square-outlined', + 'down-square-outlined', + 'left-square-outlined', + 'right-square-outlined', + 'login-outlined', + 'logout-outlined', + 'menu-fold-outlined', + 'menu-unfold-outlined', + 'border-bottom-outlined', + 'border-horizontal-outlined', + 'border-inner-outlined', + 'border-outer-outlined', + 'border-left-outlined', + 'border-right-outlined', + 'border-top-outlined', + 'border-verticle-outlined', + 'pic-center-outlined', + 'pic-left-outlined', + 'pic-right-outlined', + 'radius-bottomleft-outlined', + 'radius-bottomright-outlined', + 'radius-upleft-outlined', + 'radius-upright-outlined', + 'fullscreen-outlined', + 'fullscreen-exit-outlined', + 'question-outlined', + 'question-circle-outlined', + 'plus-outlined', + 'plus-circle-outlined', + 'pause-outlined', + 'pause-circle-outlined', + 'minus-outlined', + 'minus-circle-outlined', + 'plus-square-outlined', + 'minus-square-outlined', + 'info-outlined', + 'info-circle-outlined', + 'exclamation-outlined', + 'exclamation-circle-outlined', + 'close-outlined', + 'close-circle-outlined', + 'close-square-outlined', + 'check-outlined', + 'check-circle-outlined', + 'check-square-outlined', + 'clock-circle-outlined', + 'warning-outlined', + 'issues-close-outlined', + 'stop-outlined', + 'edit-outlined', + 'form-outlined', + 'copy-outlined', + 'scissor-outlined', + 'delete-outlined', + 'snippets-outlined', + 'diff-outlined', + 'highlight-outlined', + 'align-center-outlined', + 'align-left-outlined', + 'align-right-outlined', + 'bg-colors-outlined', + 'bold-outlined', + 'italic-outlined', + 'underline-outlined', + 'strikethrough-outlined', + 'redo-outlined', + 'undo-outlined', + 'zoom-in-outlined', + 'zoom-out-outlined', + 'font-colors-outlined', + 'font-size-outlined', + 'line-height-outlined', + 'dash-outlined', + 'small-dash-outlined', + 'sort-ascending-outlined', + 'sort-descending-outlined', + 'drag-outlined', + 'ordered-list-outlined', + 'unordered-list-outlined', + 'radius-setting-outlined', + 'column-width-outlined', + 'column-height-outlined', + 'account-book-outlined', + 'aim-outlined', + 'alert-outlined', + 'apartment-outlined', + 'api-outlined', + 'appstore-add-outlined', + 'appstore-outlined', + 'audio-outlined', + 'audio-muted-outlined', + 'audit-outlined', + 'bank-outlined', + 'barcode-outlined', + 'bars-outlined', + 'bell-outlined', + 'block-outlined', + 'book-outlined', + 'border-outlined', + 'borderless-table-outlined', + 'branches-outlined', + 'bug-outlined', + 'build-outlined', + 'bulb-outlined', + 'calculator-outlined', + 'calendar-outlined', + 'camera-outlined', + 'car-outlined', + 'carry-out-outlined', + 'ci-circle-outlined', + 'ci-outlined', + 'clear-outlined', + 'cloud-download-outlined', + 'cloud-outlined', + 'cloud-server-outlined', + 'cloud-sync-outlined', + 'cloud-upload-outlined', + 'cluster-outlined', + 'code-outlined', + 'coffee-outlined', + 'comment-outlined', + 'compass-outlined', + 'compress-outlined', + 'console-sql-outlined', + 'contacts-outlined', + 'container-outlined', + 'control-outlined', + 'copyright-circle-outlined', + 'copyright-outlined', + 'credit-card-outlined', + 'crown-outlined', + 'customer-service-outlined', + 'dashboard-outlined', + 'database-outlined', + 'delete-column-outlined', + 'delete-row-outlined', + 'delivered-procedure-outlined', + 'deployment-unit-outlined', + 'desktop-outlined', + 'dingtalk-outlined', + 'disconnect-outlined', + 'dislike-outlined', + 'dollar-circle-outlined', + 'dollar-outlined', + 'download-outlined', + 'ellipsis-outlined', + 'environment-outlined', + 'euro-circle-outlined', + 'euro-outlined', + 'exception-outlined', + 'expand-alt-outlined', + 'expand-outlined', + 'experiment-outlined', + 'export-outlined', + 'eye-outlined', + 'eye-invisible-outlined', + 'field-binary-outlined', + 'field-number-outlined', + 'field-string-outlined', + 'field-time-outlined', + 'file-add-outlined', + 'file-done-outlined', + 'file-excel-outlined', + 'file-exclamation-outlined', + 'file-outlined', + 'file-gif-outlined', + 'file-image-outlined', + 'file-jpg-outlined', + 'file-markdown-outlined', + 'file-pdf-outlined', + 'file-ppt-outlined', + 'file-protect-outlined', + 'file-search-outlined', + 'file-sync-outlined', + 'file-text-outlined', + 'file-unknown-outlined', + 'file-word-outlined', + 'file-zip-outlined', + 'filter-outlined', + 'fire-outlined', + 'flag-outlined', + 'folder-add-outlined', + 'folder-outlined', + 'folder-open-outlined', + 'folder-view-outlined', + 'fork-outlined', + 'format-painter-outlined', + 'frown-outlined', + 'function-outlined', + 'fund-projection-screen-outlined', + 'fund-view-outlined', + 'funnel-plot-outlined', + 'gateway-outlined', + 'gif-outlined', + 'gift-outlined', + 'global-outlined', + 'gold-outlined', + 'group-outlined', + 'hdd-outlined', + 'heart-outlined', + 'history-outlined', + 'holder-outlined', + 'home-outlined', + 'hourglass-outlined', + 'idcard-outlined', + 'import-outlined', + 'inbox-outlined', + 'insert-row-above-outlined', + 'insert-row-below-outlined', + 'insert-row-left-outlined', + 'insert-row-right-outlined', + 'insurance-outlined', + 'interaction-outlined', + 'key-outlined', + 'laptop-outlined', + 'layout-outlined', + 'like-outlined', + 'line-outlined', + 'link-outlined', + 'loading3-quarters-outlined', + 'loading-outlined', + 'lock-outlined', + 'mac-command-outlined', + 'mail-outlined', + 'man-outlined', + 'medicine-box-outlined', + 'meh-outlined', + 'menu-outlined', + 'merge-cells-outlined', + 'message-outlined', + 'mobile-outlined', + 'money-collect-outlined', + 'monitor-outlined', + 'more-outlined', + 'node-collapse-outlined', + 'node-expand-outlined', + 'node-index-outlined', + 'notification-outlined', + 'number-outlined', + 'one-to-one-outlined', + 'paper-clip-outlined', + 'partition-outlined', + 'pay-circle-outlined', + 'percentage-outlined', + 'phone-outlined', + 'picture-outlined', + 'play-square-outlined', + 'pound-circle-outlined', + 'pound-outlined', + 'poweroff-outlined', + 'printer-outlined', + 'profile-outlined', + 'project-outlined', + 'property-safety-outlined', + 'pull-request-outlined', + 'pushpin-outlined', + 'qrcode-outlined', + 'read-outlined', + 'reconciliation-outlined', + 'red-envelope-outlined', + 'reload-outlined', + 'rest-outlined', + 'robot-outlined', + 'rocket-outlined', + 'rotate-left-outlined', + 'rotate-right-outlined', + 'safety-certificate-outlined', + 'safety-outlined', + 'save-outlined', + 'scan-outlined', + 'schedule-outlined', + 'search-outlined', + 'security-scan-outlined', + 'select-outlined', + 'send-outlined', + 'setting-outlined', + 'shake-outlined', + 'share-alt-outlined', + 'shop-outlined', + 'shopping-cart-outlined', + 'shopping-outlined', + 'sisternode-outlined', + 'skin-outlined', + 'smile-outlined', + 'solution-outlined', + 'sound-outlined', + 'split-cells-outlined', + 'star-outlined', + 'subnode-outlined', + 'switcher-outlined', + 'sync-outlined', + 'table-outlined', + 'tablet-outlined', + 'tag-outlined', + 'tags-outlined', + 'team-outlined', + 'thunderbolt-outlined', + 'to-top-outlined', + 'tool-outlined', + 'trademark-circle-outlined', + 'trademark-outlined', + 'transaction-outlined', + 'translation-outlined', + 'trophy-outlined', + 'ungroup-outlined', + 'unlock-outlined', + 'upload-outlined', + 'usb-outlined', + 'user-add-outlined', + 'user-delete-outlined', + 'user-outlined', + 'user-switch-outlined', + 'usergroup-add-outlined', + 'usergroup-delete-outlined', + 'verified-outlined', + 'video-camera-add-outlined', + 'video-camera-outlined', + 'wallet-outlined', + 'whats-app-outlined', + 'wifi-outlined', + 'woman-outlined' + ] + }, + { + name: '实底风格', + key: 'filled', + item: [ + 'step-backward-filled', + 'step-forward-filled', + 'fast-backward-filled', + 'fast-forward-filled', + 'caret-up-filled', + 'caret-down-filled', + 'caret-left-filled', + 'caret-right-filled', + 'up-circle-filled', + 'down-circle-filled', + 'left-circle-filled', + 'right-circle-filled', + 'forward-filled', + 'backward-filled', + 'play-circle-filled', + 'up-square-filled', + 'down-square-filled', + 'left-square-filled', + 'right-square-filled', + 'question-circle-filled', + 'plus-circle-filled', + 'pause-circle-filled', + 'minus-circle-filled', + 'plus-square-filled', + 'minus-square-filled', + 'info-circle-filled', + 'exclamation-circle-filled', + 'close-circle-filled', + 'close-square-filled', + 'check-circle-filled', + 'check-square-filled', + 'clock-circle-filled', + 'warning-filled', + 'stop-filled', + 'edit-filled', + 'copy-filled', + 'delete-filled', + 'snippets-filled', + 'diff-filled', + 'highlight-filled', + 'pie-chart-filled', + 'box-plot-filled', + 'fund-filled', + 'sliders-filled', + 'android-filled', + 'apple-filled', + 'windows-filled', + 'chrome-filled', + 'github-filled', + 'aliwangwang-filled', + 'weibo-square-filled', + 'weibo-circle-filled', + 'taobao-circle-filled', + 'html5-filled', + 'wechat-filled', + 'youtube-filled', + 'alipay-circle-filled', + 'skype-filled', + 'gitlab-filled', + 'linkedin-filled', + 'facebook-filled', + 'code-sandbox-circle-filled', + 'codepen-circle-filled', + 'slack-square-filled', + 'behance-square-filled', + 'dribbble-square-filled', + 'instagram-filled', + 'yuque-filled', + 'yahoo-filled', + 'account-book-filled', + 'alert-filled', + 'alipay-square-filled', + 'amazon-circle-filled', + 'amazon-square-filled', + 'api-filled', + 'appstore-filled', + 'audio-filled', + 'bank-filled', + 'behance-circle-filled', + 'bell-filled', + 'book-filled', + 'bug-filled', + 'build-filled', + 'bulb-filled', + 'calculator-filled', + 'calendar-filled', + 'camera-filled', + 'car-filled', + 'carry-out-filled', + 'ci-circle-filled', + 'cloud-filled', + 'code-filled', + 'code-sandbox-square-filled', + 'codepen-square-filled', + 'compass-filled', + 'contacts-filled', + 'container-filled', + 'control-filled', + 'copyright-circle-filled', + 'credit-card-filled', + 'crown-filled', + 'customer-service-filled', + 'dashboard-filled', + 'database-filled', + 'dingtalk-circle-filled', + 'dingtalk-square-filled', + 'dislike-filled', + 'dollar-circle-filled', + 'dribbble-circle-filled', + 'dropbox-circle-filled', + 'dropbox-square-filled', + 'environment-filled', + 'euro-circle-filled', + 'experiment-filled', + 'eye-filled', + 'eye-invisible-filled', + 'file-add-filled', + 'file-excel-filled', + 'file-exclamation-filled', + 'file-filled', + 'file-image-filled', + 'file-markdown-filled', + 'file-pdf-filled', + 'file-ppt-filled', + 'file-text-filled', + 'file-unknown-filled', + 'file-word-filled', + 'file-zip-filled', + 'filter-filled', + 'fire-filled', + 'flag-filled', + 'folder-add-filled', + 'folder-filled', + 'folder-open-filled', + 'format-painter-filled', + 'frown-filled', + 'funnel-plot-filled', + 'gift-filled', + 'gold-filled', + 'golden-filled', + 'google-circle-filled', + 'google-plus-circle-filled', + 'google-plus-square-filled', + 'google-square-filled', + 'hdd-filled', + 'heart-filled', + 'home-filled', + 'hourglass-filled', + 'idcard-filled', + 'ie-circle-filled', + 'ie-square-filled', + 'insurance-filled', + 'interaction-filled', + 'layout-filled', + 'like-filled', + 'lock-filled', + 'mac-command-filled', + 'mail-filled', + 'medicine-box-filled', + 'medium-circle-filled', + 'medium-square-filled', + 'meh-filled', + 'message-filled', + 'mobile-filled', + 'money-collect-filled', + 'notification-filled', + 'pay-circle-filled', + 'phone-filled', + 'picture-filled', + 'play-square-filled', + 'pound-circle-filled', + 'printer-filled', + 'profile-filled', + 'project-filled', + 'property-safety-filled', + 'pushpin-filled', + 'qq-circle-filled', + 'qq-square-filled', + 'read-filled', + 'reconciliation-filled', + 'red-envelope-filled', + 'reddit-circle-filled', + 'reddit-square-filled', + 'rest-filled', + 'robot-filled', + 'rocket-filled', + 'safety-certificate-filled', + 'save-filled', + 'schedule-filled', + 'security-scan-filled', + 'setting-filled', + 'shop-filled', + 'shopping-filled', + 'signal-filled', + 'sketch-circle-filled', + 'sketch-square-filled', + 'skin-filled', + 'slack-circle-filled', + 'smile-filled', + 'sound-filled', + 'star-filled', + 'switcher-filled', + 'tablet-filled', + 'tag-filled', + 'tags-filled', + 'taobao-square-filled', + 'thunderbolt-filled', + 'tool-filled', + 'trademark-circle-filled', + 'trophy-filled', + 'twitter-circle-filled', + 'twitter-square-filled', + 'unlock-filled', + 'usb-filled', + 'video-camera-filled', + 'wallet-filled', + 'zhihu-circle-filled', + 'zhihu-square-filled' + ] + }, + { + name: '双色风格', + key: 'twotone', + item: [ + 'up-circle-two-tone', + 'down-circle-two-tone', + 'left-circle-two-tone', + 'right-circle-two-tone', + 'play-circle-two-tone', + 'up-square-two-tone', + 'down-square-two-tone', + 'left-square-two-tone', + 'right-square-two-tone', + 'question-circle-two-tone', + 'plus-circle-two-tone', + 'pause-circle-two-tone', + 'minus-circle-two-tone', + 'plus-square-two-tone', + 'minus-square-two-tone', + 'info-circle-two-tone', + 'exclamation-circle-two-tone', + 'close-circle-two-tone', + 'close-square-two-tone', + 'check-circle-two-tone', + 'check-square-two-tone', + 'clock-circle-two-tone', + 'warning-two-tone', + 'stop-two-tone', + 'edit-two-tone', + 'copy-two-tone', + 'delete-two-tone', + 'snippets-two-tone', + 'diff-two-tone', + 'highlight-two-tone', + 'pie-chart-two-tone', + 'box-plot-two-tone', + 'fund-two-tone', + 'sliders-two-tone', + 'account-book-two-tone', + 'alert-two-tone', + 'api-two-tone', + 'appstore-two-tone', + 'audio-two-tone', + 'bank-two-tone', + 'bell-two-tone', + 'book-two-tone', + 'bug-two-tone', + 'build-two-tone', + 'bulb-two-tone', + 'calculator-two-tone', + 'calendar-two-tone', + 'camera-two-tone', + 'car-two-tone', + 'carry-out-two-tone', + 'ci-circle-two-tone', + 'ci-two-tone', + 'cloud-two-tone', + 'code-two-tone', + 'compass-two-tone', + 'contacts-two-tone', + 'container-two-tone', + 'control-two-tone', + 'copyright-circle-two-tone', + 'copyright-two-tone', + 'credit-card-two-tone', + 'crown-two-tone', + 'customer-service-two-tone', + 'dashboard-two-tone', + 'database-two-tone', + 'dislike-two-tone', + 'dollar-circle-two-tone', + 'dollar-two-tone', + 'environment-two-tone', + 'euro-circle-two-tone', + 'account-book-two-tone', + 'alert-two-tone', + 'api-two-tone', + 'appstore-two-tone', + 'audio-two-tone', + 'bank-two-tone', + 'bell-two-tone', + 'book-two-tone', + 'bug-two-tone', + 'build-two-tone', + 'bulb-two-tone', + 'calculator-two-tone', + 'calendar-two-tone', + 'camera-two-tone', + 'car-two-tone', + 'carry-out-two-tone', + 'ci-circle-two-tone', + 'ci-two-tone', + 'cloud-two-tone', + 'code-two-tone', + 'compass-two-tone', + 'contacts-two-tone', + 'container-two-tone', + 'control-two-tone', + 'copyright-circle-two-tone', + 'copyright-two-tone', + 'credit-card-two-tone', + 'crown-two-tone', + 'customer-service-two-tone', + 'dashboard-two-tone', + 'database-two-tone', + 'dislike-two-tone', + 'dollar-circle-two-tone', + 'dollar-two-tone', + 'environment-two-tone', + 'euro-circle-two-tone', + 'euro-two-tone', + 'experiment-two-tone', + 'eye-two-tone', + 'eye-invisible-two-tone', + 'file-add-two-tone', + 'file-excel-two-tone', + 'file-exclamation-two-tone', + 'file-two-tone', + 'file-image-two-tone', + 'file-markdown-two-tone', + 'file-pdf-two-tone', + 'file-ppt-two-tone', + 'file-text-two-tone', + 'file-unknown-two-tone', + 'file-word-two-tone', + 'file-zip-two-tone', + 'filter-two-tone', + 'fire-two-tone', + 'flag-two-tone', + 'folder-add-two-tone', + 'folder-two-tone', + 'folder-open-two-tone', + 'frown-two-tone', + 'funnel-plot-two-tone', + 'gift-two-tone', + 'gold-two-tone', + 'hdd-two-tone', + 'heart-two-tone', + 'home-two-tone', + 'hourglass-two-tone', + 'idcard-two-tone', + 'insurance-two-tone', + 'interaction-two-tone', + 'layout-two-tone', + 'like-two-tone', + 'lock-two-tone', + 'mail-two-tone', + 'medicine-box-two-tone', + 'meh-two-tone', + 'message-two-tone', + 'mobile-two-tone', + 'money-collect-two-tone', + 'notification-two-tone', + 'phone-two-tone', + 'picture-two-tone', + 'play-square-two-tone', + 'pound-circle-two-tone', + 'printer-two-tone', + 'profile-two-tone', + 'project-two-tone', + 'property-safety-two-tone', + 'pushpin-two-tone', + 'reconciliation-two-tone', + 'red-envelope-two-tone', + 'rest-two-tone', + 'rocket-two-tone', + 'safety-certificate-two-tone', + 'save-two-tone', + 'schedule-two-tone', + 'security-scan-two-tone', + 'setting-two-tone', + 'shop-two-tone', + 'shopping-two-tone', + 'skin-two-tone', + 'smile-two-tone', + 'sound-two-tone', + 'star-two-tone', + 'switcher-two-tone', + 'tablet-two-tone', + 'tag-two-tone', + 'tags-two-tone', + 'thunderbolt-two-tone', + 'tool-two-tone', + 'trademark-circle-two-tone', + 'trophy-two-tone', + 'unlock-two-tone', + 'usb-two-tone', + 'video-camera-two-tone', + 'wallet-two-tone' + ] + } + ] + }, + { + name: '扩展', + key: 'extend', + iconItem: [ + { + name: '常用', + key: 'default', + item: uiwIcons + }, + { + name: '其他', + key: 'other', + item: ['GiteeIcon'] + } + ] + } + ] +} diff --git a/snowy-admin-web/src/config/index.js b/snowy-admin-web/src/config/index.js new file mode 100644 index 00000000..cefe5647 --- /dev/null +++ b/snowy-admin-web/src/config/index.js @@ -0,0 +1,96 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +const DEFAULT_CONFIG = { + // 首页地址 + DASHBOARD_URL: '/index', + + // 接口地址 + API_URL: import.meta.env.VITE_API_BASEURL, + + // 请求超时 + TIMEOUT: 10000, + + // TokenName // Authorization + TOKEN_NAME: 'token', + + // Token前缀,注意最后有个空格,如不需要需设置空字符串 // Bearer + TOKEN_PREFIX: '', + + // 追加其他头 + HEADERS: {}, + + // 请求是否开启缓存 + REQUEST_CACHE: false, + + // 布局 经典:classical,双排菜单:doublerow + SNOWY_LAYOUT: 'doublerow', + + // 菜单是否折叠 + SNOWY_MENU_COLLAPSE: false, + + // 目录坞 + SNOWY_MODULE_UNFOLD_OPEN: true, + + // 是否开启多标签 + SNOWY_LAYOUT_TAGS_OPEN: true, + + // 是否开启展示面包屑 + SNOWY_BREADCRUMD_OPEN: false, + + // 顶栏是否应用主题色 + SNOWY_TOP_HANDER_THEME_COLOR_OPEN: false, + + // 顶栏主题色通栏 + SNOWY_TOP_HANDER_THEME_COLOR_SPREAD: false, + + // 侧边菜单是否排他展开 + SNOWY_SIDE_UNIQUE_OPEN: true, + + // 语言 + LANG: 'zh-cn', + + // 主题颜色 + COLOR: '#1890FF', + + // 默认整体主题 + SNOWY_THEME: 'dark', + + // 成功色 + success: '#52c41a', + // 警告色 + warning: '#faad14', + // 错误色 + error: '#f5222f', + + // 系统基础配置,这些是数据库中保存起来的 + SYS_BASE_CONFIG: { + // 默认logo + SNOWY_SYS_LOGO: '/img/logo.png', + // 背景图 + SNOWY_SYS_BACK_IMAGE: '', + // 系统名称 + SNOWY_SYS_NAME: 'Snowy', + // 版本 + SNOWY_SYS_VERSION: '2.0', + // 版权 + SNOWY_SYS_COPYRIGHT: 'Snowy ©2022 Created by xiaonuo.vip', + // 版权跳转URL + SNOWY_SYS_COPYRIGHT_URL: 'https://www.xiaonuo.vip', + // 默认文件存储 + SNOWY_SYS_DEFAULT_FILE_ENGINE: 'LOCAL', + // 是否开启验证码 + SNOWY_SYS_DEFAULT_CAPTCHA_OPEN: 'false', + // 默认重置密码 + SNOWY_SYS_DEFAULT_PASSWORD: '123456' + } +} + +export default DEFAULT_CONFIG diff --git a/snowy-admin-web/src/config/route.js b/snowy-admin-web/src/config/route.js new file mode 100644 index 00000000..7478aeef --- /dev/null +++ b/snowy-admin-web/src/config/route.js @@ -0,0 +1,58 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +// 静态路由配置 +const routes = { + // 默认模块,仅限于后端未添加任何单页配置,用此路由 + module: [ + { + id: '01', + name: 'homeModule', + path: '/homeModule', + component: '', + meta: { + title: '默认', + type: 'module', + icon: 'bank-outlined' + }, + children: [] + } + ], + // 默认首页、用户中心 + menu: [ + { + id: '001', + name: 'index', + path: '/index', + component: 'index/index', + meta: { + title: '首页', + type: 'menu', + icon: 'bank-outlined', + affix: true + }, + children: [] + }, + { + id: '002', + name: 'usercenter', + path: '/usercenter12', + component: 'userCenter/index', + meta: { + title: '用户中心', + type: 'menu', + hidden: true + }, + children: [] + } + ] +} + +export default routes diff --git a/snowy-admin-web/src/config/settingConfig.js b/snowy-admin-web/src/config/settingConfig.js new file mode 100644 index 00000000..e17f5926 --- /dev/null +++ b/snowy-admin-web/src/config/settingConfig.js @@ -0,0 +1,64 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +const colorList = [ + { + key: '薄暮', + color: '#F5222D' + }, + { + key: '火山', + color: '#FA541C' + }, + { + key: '胭脂粉', + color: '#EB2F96' + }, + { + key: '日暮', + color: '#FAAD14' + }, + { + key: '明青', + color: '#13C2C2' + }, + { + key: '极光绿', + color: '#52C41A' + }, + { + key: '深绿', + color: '#009688' + }, + { + key: '拂晓蓝(默认)', + color: '#1890FF' + }, + { + key: '极客蓝', + color: '#2F54EB' + }, + { + key: '酱紫', + color: '#722ED1' + }, + { + key: '主题黑', + color: '#001529' + } +] + +const updateColorWeak = (colorWeak) => { + // document.body.className = colorWeak ? 'colorWeak' : ''; + const app = document.body.querySelector('#app') + colorWeak ? app.classList.add('colorWeak') : app.classList.remove('colorWeak') +} + +export { colorList, updateColorWeak } diff --git a/snowy-admin-web/src/config/themeColor.js b/snowy-admin-web/src/config/themeColor.js new file mode 100644 index 00000000..b9f54566 --- /dev/null +++ b/snowy-admin-web/src/config/themeColor.js @@ -0,0 +1,10 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ diff --git a/snowy-admin-web/src/layout/components/NavMenu.vue b/snowy-admin-web/src/layout/components/NavMenu.vue new file mode 100644 index 00000000..ae121e07 --- /dev/null +++ b/snowy-admin-web/src/layout/components/NavMenu.vue @@ -0,0 +1,41 @@ + + + diff --git a/snowy-admin-web/src/layout/components/iframeView.vue b/snowy-admin-web/src/layout/components/iframeView.vue new file mode 100644 index 00000000..210ff2d0 --- /dev/null +++ b/snowy-admin-web/src/layout/components/iframeView.vue @@ -0,0 +1,77 @@ +/* eslint-disable eqeqeq */ + + + + + + + diff --git a/snowy-admin-web/src/layout/components/message.vue b/snowy-admin-web/src/layout/components/message.vue new file mode 100644 index 00000000..a5618546 --- /dev/null +++ b/snowy-admin-web/src/layout/components/message.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/snowy-admin-web/src/layout/components/moduleMenu.vue b/snowy-admin-web/src/layout/components/moduleMenu.vue new file mode 100644 index 00000000..865b63fd --- /dev/null +++ b/snowy-admin-web/src/layout/components/moduleMenu.vue @@ -0,0 +1,131 @@ + + + + + diff --git a/snowy-admin-web/src/layout/components/setting.vue b/snowy-admin-web/src/layout/components/setting.vue new file mode 100644 index 00000000..b39efbc0 --- /dev/null +++ b/snowy-admin-web/src/layout/components/setting.vue @@ -0,0 +1,373 @@ + + + + + diff --git a/snowy-admin-web/src/layout/components/sideM.vue b/snowy-admin-web/src/layout/components/sideM.vue new file mode 100644 index 00000000..5fcf0f01 --- /dev/null +++ b/snowy-admin-web/src/layout/components/sideM.vue @@ -0,0 +1,141 @@ + + + + + diff --git a/snowy-admin-web/src/layout/components/tags.vue b/snowy-admin-web/src/layout/components/tags.vue new file mode 100644 index 00000000..b165c310 --- /dev/null +++ b/snowy-admin-web/src/layout/components/tags.vue @@ -0,0 +1,287 @@ + + + + + diff --git a/snowy-admin-web/src/layout/components/topbar.vue b/snowy-admin-web/src/layout/components/topbar.vue new file mode 100644 index 00000000..4da5b783 --- /dev/null +++ b/snowy-admin-web/src/layout/components/topbar.vue @@ -0,0 +1,41 @@ + + + diff --git a/snowy-admin-web/src/layout/components/updPassword.vue b/snowy-admin-web/src/layout/components/updPassword.vue new file mode 100644 index 00000000..65349361 --- /dev/null +++ b/snowy-admin-web/src/layout/components/updPassword.vue @@ -0,0 +1,41 @@ + + + diff --git a/snowy-admin-web/src/layout/components/userbar.vue b/snowy-admin-web/src/layout/components/userbar.vue new file mode 100644 index 00000000..0bff7481 --- /dev/null +++ b/snowy-admin-web/src/layout/components/userbar.vue @@ -0,0 +1,210 @@ + + + + + diff --git a/snowy-admin-web/src/layout/index.vue b/snowy-admin-web/src/layout/index.vue new file mode 100644 index 00000000..1546f5bf --- /dev/null +++ b/snowy-admin-web/src/layout/index.vue @@ -0,0 +1,502 @@ + + + diff --git a/snowy-admin-web/src/layout/other/403.vue b/snowy-admin-web/src/layout/other/403.vue new file mode 100644 index 00000000..b54ebcfb --- /dev/null +++ b/snowy-admin-web/src/layout/other/403.vue @@ -0,0 +1,3 @@ + diff --git a/snowy-admin-web/src/layout/other/404.vue b/snowy-admin-web/src/layout/other/404.vue new file mode 100644 index 00000000..a2a45d4b --- /dev/null +++ b/snowy-admin-web/src/layout/other/404.vue @@ -0,0 +1,21 @@ + + + diff --git a/snowy-admin-web/src/layout/other/empty.vue b/snowy-admin-web/src/layout/other/empty.vue new file mode 100644 index 00000000..497d4700 --- /dev/null +++ b/snowy-admin-web/src/layout/other/empty.vue @@ -0,0 +1,3 @@ + diff --git a/snowy-admin-web/src/locales/index.js b/snowy-admin-web/src/locales/index.js new file mode 100644 index 00000000..5b327239 --- /dev/null +++ b/snowy-admin-web/src/locales/index.js @@ -0,0 +1,37 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { createI18n } from 'vue-i18n' +import zhCN from 'ant-design-vue/es/locale/zh_CN' +import enGB from 'ant-design-vue/es/locale/en_GB' +import zh_cn from './lang/zh-cn.js' +import en from './lang/en.js' +import tool from '@/utils/tool' +import sysConfig from '@/config/index.js' + +export const messages = { + 'zh-cn': { + lang: zhCN, + ...zh_cn + }, + en: { + lang: enGB, + ...en + } +} + +const i18n = createI18n({ + locale: tool.data.get('APP_LANG') || sysConfig.LANG, + fallbackLocale: 'zh-cn', + globalInjection: true, + messages +}) + +export default i18n diff --git a/snowy-admin-web/src/locales/lang/en.js b/snowy-admin-web/src/locales/lang/en.js new file mode 100644 index 00000000..7e7e22da --- /dev/null +++ b/snowy-admin-web/src/locales/lang/en.js @@ -0,0 +1,54 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +export default { + common: { + searchButton: 'search', + resetButton: 'reset', + addButton: 'add', + editButton: 'edit', + removeButton: 'delete', + batchRemoveButton: 'batch Remove', + detailButton: 'detail' + }, + model: { + user: 'user', + org: 'org', + pos: 'pos', + role: 'role', + bizUser: 'bizUser' + }, + login: { + signInTitle: 'Sign in', + forgetPassword: 'Forget password', + signIn: 'Sign in', + signInOther: 'Sign in with', + accountPlaceholder: 'Please input a user account', + accountError: 'Please input a user account', + PWPlaceholder: 'Please input a password', + PWError: 'Please input a password', + validLaceholder: 'Please input a valid', + validError: 'Please input a valid', + accountPassword: 'Account Password', + phoneSms: 'Phone SMS', + phonePlaceholder: 'Please input a phone', + smsCodePlaceholder: 'Please input a SMS code', + getSmsCode: 'SMS code', + machineValidation: 'Machine Validation', + sendingSmsMessage: 'Sending SMS Message', + newPwdPlaceholder: 'Please input a new password', + backLogin: 'Back Login', + restPassword: 'Rest Password', + emailPlaceholder: 'Please input a email', + emailCodePlaceholder: 'Please input a Email code', + restPhoneType: 'For phone rest', + restEmailType: 'For email rest' + } +} diff --git a/snowy-admin-web/src/locales/lang/zh-cn.js b/snowy-admin-web/src/locales/lang/zh-cn.js new file mode 100644 index 00000000..e0f7fa38 --- /dev/null +++ b/snowy-admin-web/src/locales/lang/zh-cn.js @@ -0,0 +1,56 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import 'dayjs/locale/zh-cn' + +export default { + common: { + searchButton: '查询', + resetButton: '重置', + addButton: '增加', + editButton: '编辑', + removeButton: '删除', + batchRemoveButton: '批量删除', + detailButton: '详情' + }, + model: { + user: '用户', + org: '机构', + pos: '职位', + role: '角色', + bizUser: '人员' + }, + login: { + signInTitle: '用户登录', + forgetPassword: '忘记密码', + signIn: '登录', + signInOther: '其他登录方式', + accountPlaceholder: '请输入账号', + accountError: '请输入账号', + PWPlaceholder: '请输入密码', + PWError: '请输入密码', + validLaceholder: '请输入验证码', + validError: '请输入验证码', + accountPassword: '账号密码', + phoneSms: '手机号登录', + phonePlaceholder: '请输入手机号', + smsCodePlaceholder: '请输入短信验证码', + getSmsCode: '获取验证码', + machineValidation: '机器验证', + sendingSmsMessage: '短信发送中', + newPwdPlaceholder: '请输入新密码', + backLogin: '返回登录', + restPassword: '重置密码', + emailPlaceholder: '请输入邮箱号', + emailCodePlaceholder: '请输入邮件验证码', + restPhoneType: '手机号找回', + restEmailType: '邮箱找回' + } +} diff --git a/snowy-admin-web/src/main.js b/snowy-admin-web/src/main.js new file mode 100644 index 00000000..9166c8a5 --- /dev/null +++ b/snowy-admin-web/src/main.js @@ -0,0 +1,19 @@ +import { createApp } from 'vue' +import Antd from 'ant-design-vue' +import './style/index.less' +import snowy from './snowy' +import i18n from './locales' +import router from './router' +import store from './store' +import App from './App.vue' +import './tailwind.css' + +const app = createApp(App) +app.use(store) +app.use(router) +app.use(Antd) +app.use(i18n) +app.use(snowy) + +// 挂载app +app.mount('#app') diff --git a/snowy-admin-web/src/router/index.js b/snowy-admin-web/src/router/index.js new file mode 100644 index 00000000..0ab01e6e --- /dev/null +++ b/snowy-admin-web/src/router/index.js @@ -0,0 +1,221 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +/* eslint-disable eqeqeq */ +/* eslint-disable camelcase */ +import { createRouter, createWebHistory, createWebHashHistory } from 'vue-router' +import { notification } from 'ant-design-vue' +import config from '@/config' +import NProgress from 'nprogress' +import 'nprogress/nprogress.css' +import systemRouter from './systemRouter' +import { afterEach, beforeEach } from './scrollBehavior' +import whiteListRouters from './whiteList' +import userRoutes from '@/config/route' +import tool from '@/utils/tool' +import { cloneDeep } from 'lodash-es' +const modules = import.meta.glob('/src/views/**/**.vue') +import store from '@/store' +const sysBaseConfig = tool.data.get('SNOWY_SYS_BASE_CONFIG') || store.state.global.sysBaseConfig + +// 进度条配置 +NProgress.configure({ showSpinner: false, speed: 500 }) + +// 系统路由 +const routes = [...systemRouter, ...whiteListRouters] + +// 系统特殊路由 +const routes_404 = { + path: '/:pathMatch(.*)*', + hidden: true, + component: () => import('@/layout/other/404.vue') +} +let routes_404_r = () => {} + +const router = createRouter({ + // 此方式不带 # 号 // createWebHashHistory()带#号 + history: createWebHistory(), + routes +}) + +// 设置标题 +document.title = sysBaseConfig.SNOWY_SYS_NAME + +// 判断是否已加载过动态/静态路由 +let isGetRouter = false + +// 白名单校验 +const exportWhiteListFromRouter = (router) => { + const res = [] + for (const item of router) res.push(item.path) + return res +} +const whiteList = exportWhiteListFromRouter(whiteListRouters) + +// 加载动态/静态路由 +const handleGetRouter = (to) => { + if (!isGetRouter) { + let apiMenu = tool.data.get('MENU') || [] + if (apiMenu.length === 0) { + // 创建默认模块,显示默认菜单 + apiMenu[0] = cloneDeep(userRoutes.module[0]) + const userMenu = userRoutes.menu + const childrenApiMenu = apiMenu[0].children + apiMenu[0].children = [...userMenu, ...childrenApiMenu] + } + + let menuRouter = filterAsyncRouter(apiMenu) + menuRouter = flatAsyncRoutes(menuRouter) + menuRouter.forEach((item) => { + router.addRoute('layout', item) + }) + routes_404_r = router.addRoute(routes_404) + if (to && to.matched.length === 0) { + router.push(to.fullPath) + } + isGetRouter = true + } +} + +router.beforeEach(async (to, from, next) => { + NProgress.start() + // 动态标题 + document.title = to.meta.title + ? `${to.meta.title} - ${sysBaseConfig.SNOWY_SYS_NAME}` + : `${sysBaseConfig.SNOWY_SYS_NAME}` + + // 过滤白名单 + if (whiteList.includes(to.path)) { + next() + // NProgress.done() + return false + } + + const token = tool.data.get('TOKEN') + if (to.path === '/login') { + // 当用户输入了login路由,将其跳转首页即可 + if (token) { + next({ + path: '/' + }) + return false + } + // 删除路由(替换当前layout路由) + router.addRoute(routes[0]) + // 删除路由(404) + routes_404_r() + isGetRouter = false + next() + return false + } + if (!token) { + next({ + path: '/login' + }) + return false + } + // 整页路由处理 + if (to.meta.fullpage) { + to.matched = [to.matched[to.matched.length - 1]] + } + // 加载动态/静态路由 + handleGetRouter(to) + beforeEach(to, from) + next() +}) + +router.afterEach((to, from) => { + afterEach(to, from) + NProgress.done() +}) + +router.onError((error) => { + NProgress.done() + notification.error({ + message: '路由错误', + description: error.message + }) +}) + +// 入侵追加自定义方法、对象 +router.getMenu = () => { + let apiMenu = tool.data.get('MENU') || [] + // 增加固定路由 + if (apiMenu.length === 0) { + // 创建默认模块,显示默认菜单 + apiMenu[0] = cloneDeep(userRoutes.module[0]) + const userMenu = userRoutes.menu + const childrenApiMenu = apiMenu[0].children + apiMenu[0].children = [...userMenu, ...childrenApiMenu] + } + return apiMenu +} + +// 转换 +const filterAsyncRouter = (routerMap) => { + const accessedRouters = [] + routerMap.forEach((item) => { + item.meta = item.meta ? item.meta : {} + // 处理外部链接特殊路由 + if (item.meta.type === 'iframe') { + item.meta.url = item.path + item.path = `/i/${item.name}` + } + // MAP转路由对象 + const route = { + path: item.path, + name: item.name, + meta: item.meta, + redirect: item.redirect, + children: item.children ? filterAsyncRouter(item.children) : null, + component: loadComponent(item.component) + } + accessedRouters.push(route) + }) + return accessedRouters +} +const loadComponent = (component) => { + if (component) { + if (component.includes('/')) { + return modules[`/src/views/${component}.vue`] + } + return modules[`/src/views/${component}/index.vue`] + } else { + return () => import(/* @vite-ignore */ `/src/layout/other/empty.vue`) + } +} + +// 路由扁平化 +const flatAsyncRoutes = (routes, breadcrumb = []) => { + const res = [] + routes.forEach((route) => { + const tmp = { ...route } + if (tmp.children) { + const childrenBreadcrumb = [...breadcrumb] + childrenBreadcrumb.push(route) + const tmpRoute = { ...route } + tmpRoute.meta.breadcrumb = childrenBreadcrumb + delete tmpRoute.children + res.push(tmpRoute) + const childrenRoutes = flatAsyncRoutes(tmp.children, childrenBreadcrumb) + childrenRoutes.map((item) => { + res.push(item) + }) + } else { + const tmpBreadcrumb = [...breadcrumb] + tmpBreadcrumb.push(tmp) + tmp.meta.breadcrumb = tmpBreadcrumb + res.push(tmp) + } + }) + return res +} + +export default router diff --git a/snowy-admin-web/src/router/scrollBehavior.js b/snowy-admin-web/src/router/scrollBehavior.js new file mode 100644 index 00000000..8022c6f4 --- /dev/null +++ b/snowy-admin-web/src/router/scrollBehavior.js @@ -0,0 +1,36 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { nextTick } from 'vue' +import store from '@/store' + +export function beforeEach(to, from) { + const adminMain = document.querySelector('#adminui-main') + if (!adminMain) { + return false + } + store.commit('updateViewTags', { + fullPath: from.fullPath, + scrollTop: adminMain.scrollTop + }) +} + +export function afterEach(to) { + const adminMain = document.querySelector('#adminui-main') + if (!adminMain) { + return false + } + nextTick(() => { + const beforeRoute = store.state.viewTags.viewTags.filter((v) => v.fullPath == to.fullPath)[0] + if (beforeRoute) { + adminMain.scrollTop = beforeRoute.scrollTop || 0 + } + }) +} diff --git a/snowy-admin-web/src/router/systemRouter.js b/snowy-admin-web/src/router/systemRouter.js new file mode 100644 index 00000000..ad8160c5 --- /dev/null +++ b/snowy-admin-web/src/router/systemRouter.js @@ -0,0 +1,46 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import config from '@/config' +import tool from '@/utils/tool' + +// 系统路由 +const routes = [ + { + name: 'layout', + path: '/', + component: () => import('@/layout/index.vue'), + redirect: tool.data.get('MENU') ? tool.data.get('MENU')[0].children[0].path : config.DASHBOARD_URL, + children: [] + }, + { + path: '/login', + component: () => import('@/views/auth/login/login.vue'), + meta: { + title: '登录' + } + }, + { + path: '/findpwd', + component: () => import('@/views/auth/findPwd/index.vue'), + meta: { + title: '找回密码' + } + }, + { + path: '/callback', + component: () => import('@/views/auth/login/callback.vue'), + meta: { + title: '三方登录' + } + } +] + +export default routes diff --git a/snowy-admin-web/src/router/whiteList.js b/snowy-admin-web/src/router/whiteList.js new file mode 100644 index 00000000..7da14bf6 --- /dev/null +++ b/snowy-admin-web/src/router/whiteList.js @@ -0,0 +1,36 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +const constRouters = [ + { + path: '/findpwd' + }, + { + path: '/callback' + }, + { + path: '/other', + name: 'other', + component: () => import('@/views/other/index.vue'), + meta: { + title: '其他' + } + } +] +/** + * 路由白名单(数组形式) + * + * 如果组件像登录一样,那就简单的写一个path,即可实现放开, + * 如果组件不在这边的,需要手动添加组件,就像other一样, + * 因为没登陆你没法拿到后端给你返回的那一坨,当然就找不到component + * + * @author yubaoshan + */ +export default constRouters diff --git a/snowy-admin-web/src/snowy.js b/snowy-admin-web/src/snowy.js new file mode 100644 index 00000000..61a8d09c --- /dev/null +++ b/snowy-admin-web/src/snowy.js @@ -0,0 +1,36 @@ +import * as antdvIcons from '@ant-design/icons-vue' +import config from './config' +import tool from './utils/tool' +import { hasPerm } from './utils/permission/index' +import errorHandler from './utils/errorHandler' +import customIcons from './assets/icons/index.js' +import 'highlight.js/styles/atom-one-dark.css' +import 'highlight.js/lib/common' +import hljsVuePlugin from '@highlightjs/vue-plugin' +import STable from './components/Table/index.vue' +import Ellipsis from './components/Ellipsis/index.vue' + +export default { + install(app) { + // 挂载全局对象 + app.config.globalProperties.$CONFIG = config + app.config.globalProperties.$TOOL = tool + app.config.globalProperties.hasPerm = hasPerm + + // 注册常用组件 + app.component('STable', STable) + app.component('Ellipsis', Ellipsis) + + // 统一注册antdv图标 + for (const icon in antdvIcons) { + app.component(icon, antdvIcons[icon]) + } + // 统一注册自定义全局图标 + app.use(customIcons) + // 注册代码高亮组件 (博客:https://blog.csdn.net/weixin_41897680/article/details/124925222) + app.use(hljsVuePlugin) + + // 全局代码错误捕捉 + app.config.errorHandler = errorHandler + } +} diff --git a/snowy-admin-web/src/store/index.js b/snowy-admin-web/src/store/index.js new file mode 100644 index 00000000..4db72d09 --- /dev/null +++ b/snowy-admin-web/src/store/index.js @@ -0,0 +1,25 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { createStore } from 'vuex' + +import global from './modules/global' +import iframe from './modules/iframe' +import keepAlive from './modules/keepAlive' +import viewTags from './modules/viewTags' +// 自动import导入所有 vuex 模块 +export default createStore({ + modules: { + global, + iframe, + keepAlive, + viewTags + } +}) diff --git a/snowy-admin-web/src/store/modules/global.js b/snowy-admin-web/src/store/modules/global.js new file mode 100644 index 00000000..0f364237 --- /dev/null +++ b/snowy-admin-web/src/store/modules/global.js @@ -0,0 +1,107 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { changeColor, getLocalSetting } from '@/utils/themeUtil' +import config from '@/config' +import { message } from 'ant-design-vue' +import tool from '@/utils/tool' + +const toolDataGet = (key) => { + return tool.data.get(key) +} + +// 获取缓存中的,如果取不到那就用配置的 +const getCacheConfig = (value) => { + const data = toolDataGet(value) + if (data === null) { + return config[value] + } + return data +} +export default { + state: { + // 移动端布局 + ismobile: false, + // 布局 + layout: getCacheConfig('SNOWY_LAYOUT'), + // 菜单是否折叠 toggle + menuIsCollapse: getCacheConfig('SNOWY_MENU_COLLAPSE'), + // 侧边菜单是否排他展开 + sideUniqueOpen: getCacheConfig('SNOWY_SIDE_UNIQUE_OPEN'), + // 多标签栏 + layoutTagsOpen: getCacheConfig('SNOWY_LAYOUT_TAGS_OPEN'), + // 是否展示面包屑 + breadcrumbOpen: getCacheConfig('SNOWY_BREADCRUMD_OPEN'), + // 顶栏是否应用主题色 + topHanderThemeColorOpen: getCacheConfig('SNOWY_TOP_HANDER_THEME_COLOR_OPEN'), + // 顶栏主题色通栏 + topHanderThemeColorSpread: + getCacheConfig('SNOWY_TOP_HANDER_THEME_COLOR_SPREAD'), + // 目录坞 + moduleUnfoldOpen: getCacheConfig('SNOWY_MODULE_UNFOLD_OPEN'), + // 主题 + theme: getCacheConfig('SNOWY_THEME'), + // 主题颜色 + themeColor: toolDataGet('SNOWY_THEME_COLOR') || config.COLOR, + // 用户信息 + userInfo: toolDataGet('USER_INFO') || {}, + // 系统配置 + sysBaseConfig: toolDataGet('SNOWY_SYS_BASE_CONFIG') || config.SYS_BASE_CONFIG + }, + mutations: { + SET_ismobile(state, key) { + state.ismobile = key + }, + SET_layout(state, key) { + state.layout = key + }, + SET_theme(state, key) { + state.theme = key + const closeMessage = message.loading(`加载中...`) + changeColor(state.themeColor, key).then(closeMessage) + }, + SET_themeColor(state, key) { + state.themeColor = key + const closeMessage = message.loading(`加载中...`) + changeColor(key, state.theme).then(closeMessage) + }, + initTheme(state) { + const closeMessage = message.loading(`加载中...`) + changeColor(state.themeColor, state.theme).then(closeMessage) + }, + TOGGLE_menuIsCollapse(state) { + state.menuIsCollapse = !state.menuIsCollapse + }, + TOGGLE_sideUniqueOpen(state) { + state.sideUniqueOpen = !state.sideUniqueOpen + }, + TOGGLE_layoutTagsOpen(state) { + state.layoutTagsOpen = !state.layoutTagsOpen + }, + TOGGLE_breadcrumbOpen(state) { + state.breadcrumbOpen = !state.breadcrumbOpen + }, + TOGGLE_topHanderThemeColorOpen(state) { + state.topHanderThemeColorOpen = !state.topHanderThemeColorOpen + }, + TOGGLE_topHanderThemeColorSpread(state) { + state.topHanderThemeColorSpread = !state.topHanderThemeColorSpread + }, + TOGGLE_moduleUnfoldOpen(state) { + state.moduleUnfoldOpen = !state.moduleUnfoldOpen + }, + SET_userInfo(state, key) { + state.userInfo = key + }, + SET_sysBaseConfig(state, key) { + state.sysBaseConfig = key + } + } +} diff --git a/snowy-admin-web/src/store/modules/iframe.js b/snowy-admin-web/src/store/modules/iframe.js new file mode 100644 index 00000000..97167be8 --- /dev/null +++ b/snowy-admin-web/src/store/modules/iframe.js @@ -0,0 +1,49 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +/* eslint-disable eqeqeq */ +export default { + state: { + iframeList: [] + }, + mutations: { + setIframeList(state, route) { + state.iframeList = [] + state.iframeList.push(route) + }, + pushIframeList(state, route) { + const target = state.iframeList.find((item) => item.path === route.path) + if (!target) { + state.iframeList.push(route) + } + }, + removeIframeList(state, route) { + state.iframeList.forEach((item, index) => { + if (item.path === route.path) { + state.iframeList.splice(index, 1) + } + }) + }, + refreshIframe(state, route) { + state.iframeList.forEach((item) => { + if (item.path === route.path) { + const url = route.meta.url + item.meta.url = '' + setTimeout(() => { + item.meta.url = url + }, 200) + } + }) + }, + clearIframeList(state) { + state.iframeList = [] + } + } +} diff --git a/snowy-admin-web/src/store/modules/keepAlive.js b/snowy-admin-web/src/store/modules/keepAlive.js new file mode 100644 index 00000000..9000e1ad --- /dev/null +++ b/snowy-admin-web/src/store/modules/keepAlive.js @@ -0,0 +1,44 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +export default { + state: { + keepLiveRoute: [], + routeKey: null, + routeShow: true + }, + mutations: { + pushKeepLive(state, component) { + if (!state.keepLiveRoute.includes(component)) { + state.keepLiveRoute.push(component) + } + }, + removeKeepLive(state, component) { + const index = state.keepLiveRoute.indexOf(component) + if (index !== -1) { + state.keepLiveRoute.splice(index, 1) + } + }, + clearKeepLive(state) { + state.keepLiveRoute = [] + }, + setRouteKey(state, key) { + state.routeKey = key + }, + setRouteShow(state, key) { + state.routeShow = key + } + }, + actions: { + setRouteKey({ commit }, key) { + commit('setRouteKey', key) + } + } +} diff --git a/snowy-admin-web/src/store/modules/sysBaseConfig.js b/snowy-admin-web/src/store/modules/sysBaseConfig.js new file mode 100644 index 00000000..33fb2356 --- /dev/null +++ b/snowy-admin-web/src/store/modules/sysBaseConfig.js @@ -0,0 +1,40 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import configApi from '@/api/dev/configApi' +import { message } from 'ant-design-vue' + +const formData = ref({ + SNOWY_SYS_LOGO: '', + SNOWY_SYS_BACK_IMAGE: '', + SNOWY_SYS_NAME: '', + SNOWY_SYS_VERSION: '', + SNOWY_SYS_COPYRIGHT: '', + SNOWY_SYS_COPYRIGHT_URL: '', + SNOWY_SYS_DEFAULT_FILE_ENGINE: 'LOCAL', + SNOWY_SYS_DEFAULT_CAPTCHA_OPEN: false, + SNOWY_SYS_DEFAULT_PASSWORD: '' +}) + +const param = { + category: 'SYS_BASE' +} + +const getSysBaseConfig = () => { + configApi.configList(param).then((data) => { + if (data) { + data.forEach((item) => { + formData.value[item.configKey] = item.configValue ? '' : item.configValue + }) + } else { + message.warning('表单项不存在,请初始化数据库') + } + }) +} diff --git a/snowy-admin-web/src/store/modules/viewTags.js b/snowy-admin-web/src/store/modules/viewTags.js new file mode 100644 index 00000000..8b915e5a --- /dev/null +++ b/snowy-admin-web/src/store/modules/viewTags.js @@ -0,0 +1,50 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +/* eslint-disable eqeqeq */ +export default { + state: { + viewTags: [] + }, + mutations: { + pushViewTags(state, route) { + const target = state.viewTags.find((item) => item.fullPath === route.fullPath) + const isName = route.name + if (!target && isName) { + state.viewTags.push(route) + } + }, + removeViewTags(state, route) { + state.viewTags.forEach((item, index) => { + if (item.fullPath === route.fullPath) { + state.viewTags.splice(index, 1) + } + }) + }, + updateViewTags(state, route) { + state.viewTags.forEach((item) => { + if (item.fullPath == route.fullPath) { + item = Object.assign(item, route) + } + }) + }, + updateViewTagsTitle(state, title = '') { + const nowFullPath = location.hash.substring(1) + state.viewTags.forEach((item) => { + if (item.fullPath == nowFullPath) { + item.meta.title = title + } + }) + }, + clearViewTags(state) { + state.viewTags = [] + } + } +} diff --git a/snowy-admin-web/src/style/default.less b/snowy-admin-web/src/style/default.less new file mode 100644 index 00000000..5a2ed39e --- /dev/null +++ b/snowy-admin-web/src/style/default.less @@ -0,0 +1,398 @@ +@import 'ant-design-vue/es/style/themes/default.less'; + +:root { + --blue-1: #e6f7ff; + --blue-2: #bae7ff; + --blue-3: #91d5ff; + --blue-4: #69c0ff; + --blue-5: #40a9ff; + --blue-6: #1890ff; + --blue-7: #096dd9; + --blue-8: #0050b3; + --blue-9: #003a8c; + --blue-10: #002766; + + --green-1: #f6ffed; + --green-2: #d9f7be; + --green-3: #b7eb8f; + --green-4: #95de64; + --green-5: #73d13d; + --green-6: #52c41a; + --green-7: #389e0d; + --green-8: #237804; + --green-9: #135200; + --green-10: #092b00; + + --red-1: #fff1f0; + --red-2: #ffccc7; + --red-3: #ffa39e; + --red-4: #ff7875; + --red-5: #ff4d4f; + --red-6: #f5222d; + --red-7: #cf1322; + --red-8: #a8071a; + --red-9: #820014; + --red-10: #5c0011; + + --gold-1: #fffbe6; + --gold-2: #fff1b8; + --gold-3: #ffe58f; + --gold-4: #ffd666; + --gold-5: #ffc53d; + --gold-6: #faad14; + --gold-7: #d48806; + --gold-8: #ad6800; + --gold-9: #874d00; + --gold-10: #613400; + + --purple-1: #f9f0ff; + --purple-2: #efdbff; + --purple-3: #d3adf7; + --purple-4: #b37feb; + --purple-5: #9254de; + --purple-6: #722ed1; + --purple-7: #531dab; + --purple-8: #391085; + --purple-9: #22075e; + --purple-10: #120338; + + --cyan-1: #e6fffb; + --cyan-2: #b5f5ec; + --cyan-3: #87e8de; + --cyan-4: #5cdbd3; + --cyan-5: #36cfc9; + --cyan-6: #13c2c2; + --cyan-7: #08979c; + --cyan-8: #006d75; + --cyan-9: #00474f; + --cyan-10: #002329; + + --pink-1: #fff0f6; + --pink-2: #ffd6e7; + --pink-3: #ffadd2; + --pink-4: #ff85c0; + --pink-5: #f759ab; + --pink-6: #eb2f96; + --pink-7: #c41d7f; + --pink-8: #9e1068; + --pink-9: #780650; + --pink-10: #520339; + + --orange-1: #fff7e6; + --orange-2: #ffe7ba; + --orange-3: #ffd591; + --orange-4: #ffc069; + --orange-5: #ffa940; + --orange-6: #fa8c16; + --orange-7: #d46b08; + --orange-8: #ad4e00; + --orange-9: #873800; + --orange-10: #612500; + + --primary-1: var(--blue-1); + --primary-2: var(--blue-2); + --primary-3: var(--blue-3); + --primary-4: var(--blue-4); + --primary-5: var(--blue-5); + --primary-6: var(--blue-6); + --primary-7: var(--blue-7); + --primary-8: var(--blue-8); + --primary-9: var(--blue-9); + --primary-10: var(--blue-10); + + --primary-color: var(--primary-6); + --primary-color-hover: var(--primary-5); + --primary-color-active: var(--primary-7); + --primary-color-outline: var(--primary-2); + + --info-color: var(--primary-color); + --success-color: var(--green-6); + --processing-color: var(--blue-6); + --highlight-color: var(--red-5); + + --warning-color: var(--gold-6); + --warning-color-hover: var(--gold-5); + --warning-color-active: var(--gold-7); + --warning-color-outline: var(--gold-2); + + --error-color: var(--red-5); + --error-color-hover: var(--red-4); + --error-color-active: var(--red-7); + --error-color-outline: var(--red-2); + + --body-background: #fff; + --component-background: #fff; + + --popover-background: @component-background; + --popover-customize-border-color: @border-color-split; + + --text-color: fade(@black, 85%); + --text-color-secondary: fade(@black, 45%); + --text-color-inverse: @white; + --icon-color-hover: fade(@black, 75%); + --heading-color: fade(@black, 85%); + + --item-hover-bg: #f5f5f5; + + // Border color + --border-color-base: hsv(0, 0, 85%); + --border-color-split: hsv(0, 0, 94%); + //--border-color-inverse: @white; + + // + --background-color-light: hsv(0, 0, 98%); + --background-color-base: hsv(0, 0, 96%); + + // Disabled states + --disabled-color: fade(#000, 25%); + --disabled-bg: @background-color-base; + --disabled-color-dark: fade(#fff, 35%); + + // Shadow + --shadow-color: rgba(0, 0, 0, 0.15); + --shadow-color-inverse: @component-background; + --box-shadow-base: @shadow-1-down; + --shadow-1-up: 0 -2px 8px @shadow-color; + --shadow-1-down: 0 2px 8px @shadow-color; + --shadow-1-left: -2px 0 8px @shadow-color; + --shadow-1-right: 2px 0 8px @shadow-color; + --shadow-2: 0 4px 12px @shadow-color; + + // Buttons + --btn-shadow: 0 2px 0 rgba(0, 0, 0, 0.015); + --btn-primary-shadow: 0 2px 0 rgba(0, 0, 0, 0.045); + --btn-text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12); + + --btn-default-bg: @component-background; + + --btn-default-ghost-color: @component-background; + --btn-default-ghost-border: @component-background; + + --btn-text-hover-bg: rgba(0, 0, 0, 0.018); + --btn-text-active-bg: rgba(0, 0, 0, 0.028); + + // Checkbox + --checkbox-check-bg: @checkbox-check-color; + + // Descriptions + --descriptions-bg: #fafafa; + + // Divider + --divider-color: rgba(0, 0, 0, 6%); + + // Dropdown 有两个 + --dropdown-menu-submenu-disabled-bg: @component-background; + + // Radio + --radio-dot-disabled-color: fade(@black, 20%); + --radio-solid-checked-color: @component-background; + + // Radio buttons + --radio-disabled-button-checked-bg: coverTintMixin(@black, 90%); + --radio-disabled-button-checked-color: @disabled-color; + + // Layout + --layout-body-background: #f0f2f5; + --layout-header-background: #001529; + --layout-trigger-background: #002140; + //--layout-sider-background-1: coverTintMixin(#001529, 10%); + + // Dropdown 有两个 + --dropdown-menu-bg: @component-background; + + // Input + --input-placeholder-color: hsv(0, 0, 75%); + --input-icon-color: @input-color; + --input-bg: @component-background; + --input-number-handler-active-bg: #f4f4f4; + --input-icon-hover-color: fade(@black, 85%); + + // Mentions + --mentions-dropdown-bg: @component-background; + + // Select + --select-dropdown-bg: @component-background; + --select-background: @component-background; + --select-clear-background: @select-background; + --select-selection-item-bg: @background-color-base; + --select-selection-item-border-color: @border-color-split; + --select-multiple-disabled-background: @input-disabled-bg; + --select-multiple-item-disabled-color: #bfbfbf; + --select-multiple-item-disabled-border-color: @select-border-color; + + // Cascader + --cascader-bg: @component-background; + --cascader-menu-bg: @component-background; + --cascader-menu-border-color-split: @border-color-split; + + // Tooltip + --tooltip-bg: rgba(0, 0, 0, 0.75); + + // Popover + --popover-bg: @component-background; + + // Modal + --modal-header-bg: @component-background; + --modal-header-border-color-split: @border-color-split; + --modal-content-bg: @component-background; + --modal-footer-border-color-split: @border-color-split; + + // Progress + --progress-steps-item-bg: #f3f3f3; + + // Menu + --menu-popup-bg: @component-background; + --menu-dark-bg: @layout-header-background; + --menu-dark-inline-submenu-bg: #000c17; + + // Table + --table-header-bg: @background-color-light; + --table-header-sort-bg: @background-color-base; + --table-body-sort-bg: #fafafa; + --table-row-hover-bg: @background-color-light; + --table-expanded-row-bg: #fbfbfb; + --table-header-cell-split-color: rgba(0, 0, 0, 0.06); + --table-header-sort-active-bg: rgba(0, 0, 0, 0.04); + --table-header-filter-active-bg: rgba(0, 0, 0, 0.04); + --table-filter-btns-bg: inherit; + --table-filter-dropdown-bg: @component-background; + --table-expand-icon-bg: @component-background; + + // TimePicker + --picker-bg: @component-background; + --picker-basic-cell-disabled-bg: @disabled-bg; + --picker-border-color: @border-color-split; + + // Calendar + --calendar-bg: @component-background; + --calendar-input-bg: @input-bg; + --calendar-border-color: @border-color-inverse; + --calendar-full-bg: @calendar-bg; + + // Badge + --badge-text-color: @component-background; + + // Rate + --rate-star-bg: @border-color-split; + + // Card + --card-actions-background: @component-background; + --card-skeleton-bg: #cfd8dc; + --card-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.16), + 0 3px 6px 0 rgba(0, 0, 0, 0.12), 0 5px 12px 4px rgba(0, 0, 0, 0.09); + + // Comment + --comment-bg: inherit; + --comment-author-time-color: #ccc; + --comment-action-hover-color: #595959; + + // BackTop + --back-top-bg: @text-color-secondary; + --back-top-hover-bg: @text-color; + + // Avatar + --avatar-bg: #ccc; + + // Switch + --switch-bg: @component-background; + + // Pagination + --pagination-item-bg: @component-background; + --pagination-item-bg-active: @component-background; + --pagination-item-link-bg: @component-background; + --pagination-item-disabled-color-active: @white; + --pagination-item-disabled-bg-active: darken(hsv(0, 0, 96%), 10%); + --pagination-item-input-bg: @component-background; + + // PageHeader + --page-header-back-color: #000; + --page-header-ghost-bg: inherit; + + // Slider + --slider-rail-background-color: @background-color-base; + --slider-rail-background-color-hover: #e1e1e1; + --slider-dot-border-color: @border-color-split; + --slider-dot-border-color-active: @primary-4; + + // Tree + --tree-bg: @component-background; + + // Skeleton + --skeleton-to-color: coverShadeMixin(@skeleton-color, 5%); + + // Transfer + --transfer-item-hover-bg: @item-hover-bg; + + // Message + --message-notice-content-bg: @component-background; + + // List + --list-customize-card-bg: @component-background; + + // Drawer + --drawer-bg: @component-background; + + // Timeline + --timeline-color: @border-color-split; + --timeline-dot-color: @primary-color; + + // Image + --image-preview-operation-disabled-color: rgba(255, 255, 255, 0.45); + + // Steps + --steps-nav-arrow-color: fade(@black, 25%); + --steps-background: @component-background; + + // Notification + --notification-bg: @component-background; + + // 侧边栏 + --sidebar-light-shadow: 1px 3px 3px rgba(0, 21, 41, 0.08); + --sidebar-dark-shadow: 0 4px 4px rgba(0, 0, 0, 0.35); + + // 顶栏 + --header-light-shadow: 0 1px 4px rgba(0, 21, 41, 0.08); + --header-dark-shadow: 0 1px 4px rgba(0, 0, 0, 0.1); + --header-tool-hover-bg: rgba(0, 0, 0, 0.025); + --header-dark-tool-hover-bg: rgba(255, 255, 255, 0.05); + --header-color-split: rgba(0, 0, 0, 0.08); + + // logo + --logo-light-shadow: 1px 2px 3px rgba(0, 21, 41, 0.08); + --logo-dark-shadow: 0 3px 4px rgba(0, 0, 0, 0.35); + + // + --gradient-min: fade(#cfd8dc, 20%); + --gradient-max: fade(#cfd8dc, 40%); + + // + --success-fade-20: fade(#52c41a, 20%); + --error-fade-20: fade(#ff4d4f, 20%); + --warning-fade-20: fade(#faad14, 20%); + + //--primary-fade-20: fade(#1890ff, 20%); + --primary-fade-20: var(--primary-2); + //--primary-fade-8: fade(#1890ff, 8%); + + --white--fade--65: rgba(255,255,255,.65); + --menu-dark-highlight-color: #fff; + --btn-primary-color: #fff; + --tooltip-color: #fff; + + // workfolw design + --node-wrap-box-color: rgb(255, 255, 255); + --node-wrap-box-before-color: #FFFFFF; + --node-wrap-box-before-borde-color: rgb(202, 202, 202); + --auto-judge-before-color: @component-background; +} + + +#app .form-designer-container-9136076486841527{ + --form-designer-primary-color: var(--primary-6); + --primary-background-color: @component-background; + --layout-background-color: fade(#9867f7, 12%); + --layout-hover-bg-color: fade(#9867f7, 24%); + + --title-text-color: fade(@white, 85%); + --border-color: var(--border-color-split); +} diff --git a/snowy-admin-web/src/style/index.less b/snowy-admin-web/src/style/index.less new file mode 100644 index 00000000..0b8998e4 --- /dev/null +++ b/snowy-admin-web/src/style/index.less @@ -0,0 +1,452 @@ +@import 'ant-design-vue/dist/antd'; + +@import 'ant-design-vue/es/style/themes/default.less'; +@import './realdark'; +@import './default'; + +/* 全局 */ +/* +#app, body, html { + width: 100%; + height: 100%; + background-color: #f6f8f9; +} +*/ +.body, html { + width: 100%; + height: 100%; + background-color: #f6f8f9; +} + +a, button, input, textarea { + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + box-sizing: border-box; + outline: none !important; + -webkit-appearance: none; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + outline: none; +} + +/* 大布局样式 */ +.aminui { + overflow: hidden; + height: 100%; + display: flex; + flex-flow: column; +} + +.aminui-wrapper { + display: flex; + flex: 1; + overflow: auto; +} + +.adminui-main { + display: flex; + flex-direction: column; + height: 100%; + flex: 1; +} +.main-content-wrapper{ + padding: 11px 11px 0px; + overflow-y: auto; + overflow-x: hidden; +} + +.main-bottom-wrapper { + height: 60px; + margin-top: 25px; + text-align: center; + flex: auto; + display: flex; + align-items: flex-end; + justify-content: center; + padding-bottom: 25px; +} + +/* 双排菜单布局 */ +.snowy-doublerow-layout-menu { + padding-left: 5px; + padding-right: 5px; + line-height: 0; + align-items: center; +} + +.snowy-doublerow-layout-menu-item-fort-div { + overflow: hidden; + text-overflow: ellipsis; + opacity: 1; + display: block; + flex: auto; +} + +.snowy-doublerow-layout-menu-item-fort-div-span { + font-size: 12px; + text-overflow: ellipsis; +} + +.snowy-doublerow-side-top { + border-bottom: 1px solid var(--border-color-split); + height: 50px; + line-height: 50px; + padding-left: 20px; + font-size: 12px +} + +// 应用主题色 +.snowy-doublerow-side-top-primary-color { + background-color: var(--primary-color); + .snowy-title { + color: white; + } +} + +.snowy-title{ + color: var(--text-color); +} +.ant-layout-sider-collapsed{ + .logo-bar>span{ + display: none; + } +} +.ant-layout-sider-dark{ + .snowy-header-logo{ + color: #fff; + } +} + + +/* 设置抽屉样式 */ +.layout-setting { + position: fixed; + width: 40px; + height: 40px; + border-radius: 3px 0 0 3px; + bottom: 50%; + right: 0px; + z-index: 100; + background: @primary-color; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + cursor: pointer; +} + +.layout-setting i { + color: #fff; +} + +/* 头部 */ +.snowy-header { + height: 50px; + display: flex; + justify-content: space-between; + border-bottom: 1px solid var(--border-color-split); + box-shadow: 0 1px 4px rgba(0, 21, 41, .08); + background-color: var(--body-background); +} +// 应用主题色 +.snowy-header-primary-color { + color: white; + background-color: var(--primary-color); + .ant-badge{ + color: white; + } + .ant-breadcrumb-link { + color: white; + } + .ant-breadcrumb-separator { + color: white; + } +} + +.ant-layout-sider-dark { + .snowy-title{ + color: #fff; + } +} + +.snowy-header-left { + display: flex; + align-items: center; + padding-left: 20px; +} + +.snowy-header-left .menu-unfold-outlined { + padding: 0 12px +} + +.snowy-header-right { + display: flex; + align-items: center; +} + +.snowy-header-logo { + height: 49px; + display: flex; + justify-content: space-between; +} + +.snowy-header-logo-primary-color { + color: white; + background-color: var(--primary-color); +} + +.snowy-header-logo .logo-bar { + font-weight: bold; + display: flex; + align-items: center; + font-size: 20px; +} + +.snowy-header-logo .logo-bar .logo { + margin-right: 10px; + width: 35px; + height: 35px; +} + +/* 面包屑 */ +.adminui-topbar { + padding-left: 15px +} + +.adminui-topbar .left-panel { + display: flex; + align-items: center; +} + +.adminui-topbar .right-panel { + display: flex; + align-items: center; +} + +/* 多标签 */ +.snowy-tags { + height: 40px; + background: var(--component-background); +} + +.snowy-tags ul { + display: flex; + overflow: hidden; + padding-left: 0; +} + +.snowy-tags li { + cursor: pointer; + display: inline-block; + float: left; + line-height: 39.5px; + position: relative; + flex-shrink: 0; +} + +.snowy-tags li::after { + content: " "; + width: 1px; + height: 100%; + position: absolute; + right: 0px; + background-image: linear-gradient(#fff, #e6e6e6); +} + +.snowy-tags li a { + padding: 0 10px; + width: 100%; + height: 100%; + text-decoration: none; + display: flex; + align-items: center; +} + +.snowy-tags li i { + margin-left: 10px; + border-radius: 3px; + width: 18px; + height: 18px; + display: flex; + align-items: center; + justify-content: center; +} + +.snowy-tags li i:hover { + background: rgba(0, 0, 0, .2); + color: @body-background; +} + +.snowy-tags li:hover { + background: @body-background; +} + +.snowy-tags li.active { + background: @primary-color; +} + +.snowy-tags li.active a { + color: #fff; +} + +.snowy-tags li.sortable-ghost { + opacity: 0; +} + +.snowy-header-tags-right { + margin-right: 10px; +} +.contextmenu { + position: fixed; + width: 200px; + margin:0; + border-radius: 0px; + background: @body-background; + border: 1px solid var(--border-color-split); + box-shadow: 0 2px 12px 0 rgba(0,0,0,.1); + z-index: 3000; + list-style-type: none; + padding: 10px 0; +} +.contextmenu hr { + margin:5px 0; + border: none; + height: 1px; + font-size: 0px; + background-color: var(--border-color-split) +} +.contextmenu li { + display: flex; + align-items: center; + margin:0; + cursor: pointer; + line-height: 30px; + padding: 0 17px; + color: @text-color; +} +.contextmenu li i { + font-size: 14px; + margin-right: 10px; +} +.contextmenu li:hover { + background-color: @component-background; + color: #66b1ff; +} +.contextmenu li.disabled { + cursor: not-allowed; + color: #bbb; + background: transparent; +} + +/*页面最大化*/ +.aminui.main-maximize { + .main-maximize-exit { + display: block; + } + + .ant-layout-sider, .ant-layout-sider-dark, .layout-setting, .snowy-header { + display: none; + } +} + +/* 最大化后的退出按钮 */ +.main-maximize-exit { + display: none; + position: fixed; + z-index: 3000; + top: -20px; + padding-top: 18px; + left: 50%; + margin-left: -20px; + border-radius: 50%; + width: 40px; + height: 40px; + cursor: pointer; + background: rgba(0, 0, 0, 0.2); + text-align: center; +} + +.main-maximize-exit:hover { + background: rgba(0, 0, 0, 0.4); +} + +.ant-layout-sider{ + overflow: auto; +} + +/* 重写antdv的一些样式,定义到全局 */ +.ant-card-head-title { + padding: 12px 0!important; +} +.ant-tabs-large > .ant-tabs-nav .ant-tabs-tab { + padding: 12px 0!important; +} +.ant-card-extra { + padding: 12px 0!important; +} + +// 滚动条,需要哪里,加哪个class +body, +.ant-drawer-wrapper-body, +.ant-drawer-body, +.aminui, +.ant-modal-wrap, +.ant-transfer-list-content, +.ant-card, +.ant-layout-sider, +.CodeMirror-scroll, +.main-content-wrapper, +.xn-icon-select-list, +.form-user-table, +.scopeDefineOrgTreeDiv, +.user-table, +.role-table, +.org-table, +.pos-table, +.poi-list, +.ant-table-body, +.snowy-orgpos-vis, +.index-message-list, +.ant-picker-time-panel-column, +.timeline-div, + +.adminui-main{ + &::-webkit-scrollbar { + /*滚动条整体样式*/ + width : 0px; /*高宽分别对应横竖滚动条的尺寸*/ + height: 0px; + } + &::-webkit-scrollbar-thumb { + /*滚动条里面小方块*/ + border-radius : 10px; + background-color: @component-background; // skyblue + background-image: -webkit-linear-gradient( + 45deg, + rgba(255, 255, 255, 0.2) 25%, + transparent 25%, + transparent 50%, + rgba(255, 255, 255, 0.2) 50%, + rgba(255, 255, 255, 0.2) 75%, + transparent 75%, + transparent + ); + } + &::-webkit-scrollbar-track { + /*滚动条里面轨道*/ + box-shadow : inset 0 0 2px rgba(0, 0, 0, 0.2); + background : @component-background; + border-radius: 5px; + opacity: 0; + display: none; + } +} + +.json-box-9136076486841527{ + overflow: hidden!important;; + .CodeMirror-scrollbar-filler{ + display: none!important; + } +} diff --git a/snowy-admin-web/src/style/media.less b/snowy-admin-web/src/style/media.less new file mode 100644 index 00000000..052a027c --- /dev/null +++ b/snowy-admin-web/src/style/media.less @@ -0,0 +1,126 @@ +@media (max-width: 992px) { + // 移动端样式覆盖 + .el-form-item { + display: block; + } + + .el-form-item__label { + display: block; + text-align: left; + padding: 0 0 10px; + } + + .el-dialog { + width: 90% !important; + } + + .el-dialog.is-fullscreen { + width: 100% !important; + } + + .el-drawer.rtl { + width: 90% !important; + } + + .el-form-item__content { + margin-left: 0px !important; + } + + .adminui-main { + > .el-container { + display: block; + height: auto; + } + + > .el-container > .el-aside { + width: 100% !important; + border: 0 + } + } + + .scTable { + .el-table, + .el-table__body-wrapper { + display: block !important; + height: auto !important; + } + + .scTable-page { + padding: 0 5px !important; + } + + .el-pagination__total, + .el-pagination__jump, + .scTable-do { + display: none !important; + } + } + + .headerPublic { + height: auto !important; + display: block; + + .left-panel { + overflow: auto; + } + + .left-panel::-webkit-scrollbar { + display: none; + } + + .right-panel { + display: block; + margin-top: 15px; + } + + .right-panel .right-panel-search { + display: block; + } + + .right-panel .right-panel-search > * { + width: 100%; + margin: 0; + margin-top: 15px; + } + } + + .adminui-main > .el-container > *:first-child:not(.el-aside):not(.el-header) { + border: 0; + margin-top: 0; + } + + .adminui-main > .el-container > *:first-child:not(.el-aside):not(.el-header) + .el-aside { + margin-top: 0; + } + + .adminui-main > .el-container > .el-aside { + border-bottom: 1px solid #ebeef5 !important; + } + + .adminui-main > .el-container > .el-container { + border-top: 1px solid #ebeef5; + border-bottom: 1px solid #ebeef5; + margin-top: 15px; + } + + .adminui-main > .el-container > .el-header { + @extend . headerPublic; + border-bottom: 1px solid #ebeef5; + } + + .adminui-main > .el-container > .el-main { + border-top: 1px solid #ebeef5; + border-bottom: 1px solid #ebeef5; + margin-top: 15px; + } + + .adminui-main > .el-container > .el-main + .el-aside { + border-left: 0 !important; + border-top: 1px solid #ebeef5; + margin-top: 15px; + } + + .adminui-main > .el-container > .el-container > .el-header { + @extend . headerPublic + } +} diff --git a/snowy-admin-web/src/style/pages.less b/snowy-admin-web/src/style/pages.less new file mode 100644 index 00000000..850a715f --- /dev/null +++ b/snowy-admin-web/src/style/pages.less @@ -0,0 +1,92 @@ +/* USERCENTER */ +.user-info { + padding: 20px 40px; +} + +.user-info-top { + text-align: center; +} + +.user-info-top h2 { + margin-top: 10px; + font-size: 24px; +} + +.user-info-top p { + color: #999; + margin-top: 5px; +} + +.user-info-top button { + margin-top: 10px; +} + +.user-info-main { + padding: 20px 0; +} + +.user-info-main li { + list-style-type: none; + line-height: 2; + font-size: 14px; +} + +.user-info-main li i { + margin-right: 10px; +} + +.user-info-bottom { + border-top: 1px solid #e6e6e6; +} + +.user-info-bottom h2 { + font-size: 14px; + margin: 15px 0; +} + +/*static-table*/ +.static-table { + border-collapse: collapse; + width: 100%; + font-size: 14px; + margin-bottom: 45px; + line-height: 1.5em; +} + +.static-table th { + text-align: left; + white-space: nowrap; + color: #909399; + font-weight: 400; + border-bottom: 1px solid #dcdfe6; + padding: 15px; + max-width: 250px; +} + +.static-table td { + border-bottom: 1px solid #dcdfe6; + padding: 15px; + max-width: 250px; + color: #606266; +} + +/*header-tabs*/ +.header-tabs { + padding: 0; + display: block; + border: 0 !important; + height: auto; +} + +.header-tabs .el-tabs { + border: 0; + box-shadow: none; +} + +.header-tabs .el-tabs__content { + display: none; +} + +.header-tabs .el-tabs__item { + font-size: 12px; +} diff --git a/snowy-admin-web/src/style/readme.md b/snowy-admin-web/src/style/readme.md new file mode 100644 index 00000000..f368ab58 --- /dev/null +++ b/snowy-admin-web/src/style/readme.md @@ -0,0 +1,7 @@ + +适配暗黑模式的操作 + +直接 var(--primary-color) + +例如:新建个变量,黑的白的在不同的less中设定好,这个时候就会跟着颜色的主题变化 + diff --git a/snowy-admin-web/src/style/realdark.less b/snowy-admin-web/src/style/realdark.less new file mode 100644 index 00000000..74fccfe7 --- /dev/null +++ b/snowy-admin-web/src/style/realdark.less @@ -0,0 +1,431 @@ +[snowy-theme=realdark] { + .ant-btn-primary{ + color: #fff; + &:hover, &:focus{ + color: #fff; + } + } + +} +.fade() { + @functions: ~`(function() { + this.fade = function(color, amount) { + if (String(color).indexOf('var(') === 0) { + /* + (var(--primary-color), 7) -> var(--primary-7) + */ + if (color.indexOf('--primary-color') !== -1 ) { + var m = amount > 10 ? amount/10 :amount + return color.replace('-color)', '-' + m + ')') + } + /* + (var(--error-color), 70%) ===> var(--error-color--fade-7) + */ + return color.replace(')', '--fade--' + parseInt(amount) + ')') + } + return color + } + })()`; +} +.fade(); + +@import 'ant-design-vue/es/style/themes/default.less'; + + +//@import '../themes/default.less'; + +.snowy-theme-dark { + --blue-1: #111d2c; + --blue-2: #112a45; + --blue-3: #15395b; + --blue-4: #164c7e; + --blue-5: #1765ad; + --blue-6: #177ddc; + --blue-7: #3c9ae8; + --blue-8: #65b7f3; + --blue-9: #8dcff8; + --blue-10: #b7e3fa; + + --green-1: #162312; + --green-2: #1d3712; + --green-3: #274916; + --green-4: #306317; + --green-5: #3c8618; + --green-6: #49aa19; + --green-7: #6abe39; + --green-8: #8fd460; + --green-9: #b2e58b; + --green-10: #d5f2bb; + + --red-1: #2a1215; + --red-2: #431418; + --red-3: #58181c; + --red-4: #791a1f; + --red-5: #a61d24; + --red-6: #f5222d; + --red-7: #e84749; + --red-8: #f37370; + --red-9: #f89f9a; + --red-10: #fac8c3; + + --gold-1: #2b2111; + --gold-2: #443111; + --gold-3: #594214; + --gold-4: #7c5914; + --gold-5: #aa7714; + --gold-6: #d89614; + --gold-7: #e8b339; + --gold-8: #f3cc62; + --gold-9: #f8df8b; + --gold-10: #faedb5; + + --purple-1: #1a1325; + --purple-2: #24163a; + --purple-3: #301c4d; + --purple-4: #3e2069; + --purple-5: #51258f; + --purple-6: #642ab5; + --purple-7: #854eca; + --purple-8: #ab7ae0; + --purple-9: #cda8f0; + --purple-10: #ebd7fa; + + --cyan-1: #112123; + --cyan-2: #113536; + --cyan-3: #144848; + --cyan-4: #146262; + --cyan-5: #138585; + --cyan-6: #13a8a8; + --cyan-7: #33bcb7; + --cyan-8: #58d1c9; + --cyan-9: #84e2d8; + --cyan-10: #b2f1e8; + + --pink-1: #291321; + --pink-2: #40162f; + --pink-3: #551c3b; + --pink-4: #75204f; + --pink-5: #a02669; + --pink-6: #cb2b83; + --pink-7: #e0529c; + --pink-8: #f37fb7; + --pink-9: #f8a8cc; + --pink-10: #fad2e3; + + --orange-1: #2b1d11; + --orange-2: #442a11; + --orange-3: #593815; + --orange-4: #7c4a15; + --orange-5: #aa6215; + --orange-6: #d87a16; + --orange-7: #e89a3c; + --orange-8: #f3b765; + --orange-9: #f8cf8d; + --orange-10: #fae3b7; + + --primary-1: var(--blue-1); + --primary-2: var(--blue-2); + --primary-3: var(--blue-3); + --primary-4: var(--blue-4); + --primary-5: var(--blue-5); + --primary-6: var(--blue-6); + --primary-7: var(--blue-7); + --primary-8: var(--blue-8); + --primary-9: var(--blue-9); + --primary-10: var(--blue-10); + + --primary-color: var(--primary-6); + --primary-color-hover: var(--primary-5); + --primary-color-active: var(--primary-7); + --primary-color-outline: var(--primary-2); + + --info-color: var(--primary-color); + --success-color: var(--green-6); + --processing-color: var(--blue-6); + --highlight-color: var(--red-5); + + --warning-color: var(--gold-6); + --warning-color-hover: var(--gold-5); + --warning-color-active: var(--gold-7); + --warning-color-outline: var(--gold-2); + + --error-color: var(--red-5); + --error-color-hover: var(--red-4); + --error-color-active: var(--red-7); + --error-color-outline: var(--red-2); + + --body-background: @black; + --component-background: #141414; + + --popover-background: #1f1f1f; + --popover-customize-border-color: #3a3a3a; + + --text-color: fade(@white, 85%); + --text-color-secondary: fade(@white, 45%); + --text-color-inverse: @white; + --icon-color-hover: fade(@white, 75%); + --heading-color: fade(@white, 85%); + + --item-hover-bg: fade(@white, 8%); + + // Border color + --border-color-base: #434343; + --border-color-split: #303030; + //--border-color-inverse: @black; + + // + --background-color-light: fade(@white, 4%); + --background-color-base: fade(@white, 8%); + + // Disabled states + --disabled-color: fade(@white, 30%); + --disabled-bg: @background-color-base; + --disabled-color-dark: fade(@white, 30%); + + // Shadow + --shadow-color: rgba(0, 0, 0, 0.45); + --shadow-color-inverse: @component-background; + --box-shadow-base: @shadow-2; + --shadow-1-up: 0 -6px 16px -8px rgba(0, 0, 0, 0.32), + 0 -9px 28px 0 rgba(0, 0, 0, 0.2), 0 -12px 48px 16px rgba(0, 0, 0, 0.12); + --shadow-1-down: 0 6px 16px -8px rgba(0, 0, 0, 0.32), + 0 9px 28px 0 rgba(0, 0, 0, 0.2), 0 12px 48px 16px rgba(0, 0, 0, 0.12); + --shadow-1-right: 6px 0 16px -8px rgba(0, 0, 0, 0.32), + 9px 0 28px 0 rgba(0, 0, 0, 0.2), 12px 0 48px 16px rgba(0, 0, 0, 0.12); + --shadow-2: 0 3px 6px -4px rgba(0, 0, 0, 0.48), + 0 6px 16px 0 rgba(0, 0, 0, 0.32), 0 9px 28px 8px rgba(0, 0, 0, 0.2); + + // Buttons + --btn-shadow: 0 2px 0 rgba(0, 0, 0, 0.015); + --btn-primary-shadow: 0 2px 0 rgba(0, 0, 0, 0.045); + --btn-text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12); + + --btn-default-bg: transparent; + + --btn-default-ghost-color: @text-color; + --btn-default-ghost-border: fade(@white, 25%); + + --btn-text-hover-bg: rgba(255, 255, 255, 0.03); + --btn-text-active-bg: rgba(255, 255, 255, 0.04); + + // Checkbox + --checkbox-check-bg: transparent; + + // Descriptions + --descriptions-bg: @background-color-light; + + // Divider + --divider-color: rgba(255, 255, 255, 12%); + + // Dropdown 有两个 + --dropdown-menu-submenu-disabled-bg: transparent; + + // Radio + --radio-dot-disabled-color: fade(@white, 20%); + --radio-solid-checked-color: @white; + + // Radio buttons + --radio-disabled-button-checked-bg: fade(@white, 20%); + --radio-disabled-button-checked-color: @disabled-color; + + // Layout + --layout-body-background: @body-background; + --layout-header-background: @popover-background; + --layout-trigger-background: #262626; + //--layout-sider-background-1: tint(#1f1f1f, 10%); + + // Dropdown 有两个 + --dropdown-menu-bg: @popover-background; + + // Input + --input-placeholder-color: fade(@white, 30%); + --input-icon-color: fade(@white, 30%); + --input-bg: transparent; + --input-number-handler-active-bg: @item-hover-bg; + --input-icon-hover-color: fade(@white, 85%); + + // Mentions + --mentions-dropdown-bg: @popover-background; + + // Select + --select-dropdown-bg: @popover-background; + --select-background: transparent; + --select-clear-background: @component-background; + --select-selection-item-bg: fade(@white, 8); + --select-selection-item-border-color: @border-color-split; + --select-multiple-disabled-background: @component-background; + --select-multiple-item-disabled-color: #595959; + --select-multiple-item-disabled-border-color: @popover-background; + + // Cascader + --cascader-bg: transparent; + --cascader-menu-bg: @popover-background; + --cascader-menu-border-color-split: @border-color-split; + + // Tooltip + --tooltip-bg: #434343; + + // Popover + --popover-bg: @popover-background; + + // Modal + --modal-header-bg: @popover-background; + --modal-header-border-color-split: @border-color-split; + --modal-content-bg: @popover-background; + --modal-footer-border-color-split: @border-color-split; + + // Progress + --progress-steps-item-bg: fade(@white, 8%); + + // Menu + --menu-popup-bg: @popover-background; + --menu-dark-bg: @popover-background; + --menu-dark-inline-submenu-bg: @component-background; + + // Table + --table-header-bg: #1d1d1d; + --table-header-sort-bg: #262626; + --table-body-sort-bg: fade(@white, 1%); + --table-row-hover-bg: #262626; + --table-expanded-row-bg: @table-header-bg; + --table-header-cell-split-color: fade(@white, 8%); + --table-header-sort-active-bg: #303030; + --table-header-filter-active-bg: #434343; + --table-filter-btns-bg: @popover-background; + --table-filter-dropdown-bg: @popover-background; + --table-expand-icon-bg: transparent; + + // TimePicker + --picker-bg: transparent; + --picker-basic-cell-disabled-bg: #303030; + --picker-border-color: @border-color-split; + + // Calendar + --calendar-bg: @popover-background; + --calendar-input-bg: @calendar-bg; + --calendar-border-color: transparent; + --calendar-full-bg: @component-background; + + // Badge + --badge-text-color: @white; + + // Rate + --rate-star-bg: fade(@white, 12%); + + // Card + --card-actions-background: @component-background; + --card-skeleton-bg: #303030; + --card-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.64), + 0 3px 6px 0 rgba(0, 0, 0, 0.48), 0 5px 12px 4px rgba(0, 0, 0, 0.36); + + // Comment + --comment-bg: transparent; + --comment-author-time-color: fade(@white, 30%); + --comment-action-hover-color: fade(@white, 65%); + + // BackTop + --back-top-bg: var(--tooltip-bg); + --back-top-hover-bg: var(--border-color-split); + + // Avatar + --avatar-bg: fade(@white, 30%); + + // Switch + --switch-bg: @white; + + // Pagination + --pagination-item-bg: transparent; + --pagination-item-bg-active: transparent; + --pagination-item-link-bg: transparent; + --pagination-item-disabled-color-active: @black; + --pagination-item-disabled-bg-active: fade(@white, 25%); + --pagination-item-input-bg: @pagination-item-bg; + + // PageHeader + --page-header-back-color: @icon-color; + --page-header-ghost-bg: transparent; + + // Slider + --slider-rail-background-color: #262626; + --slider-rail-background-color-hover: @border-color-base; + --slider-dot-border-color: @border-color-split; + --slider-dot-border-color-active: @primary-4; + + // Tree + --tree-bg: transparent; + + // Skeleton + --skeleton-to-color: fade(@white, 16%); + + // Transfer + --transfer-item-hover-bg: #262626; + + // Message + --message-notice-content-bg: @popover-background; + + // List + --list-customize-card-bg: transparent; + + // Drawer + --drawer-bg: @popover-background; + + // Timeline + --timeline-color: @border-color-split; + --timeline-dot-color: @primary-color; + + // Steps + --steps-nav-arrow-color: fade(@white, 20%); + --steps-background: transparent; + + // Notification + --notification-bg: @popover-background; + + // 侧边栏 + --sidebar-light-shadow: 0 4px 4px rgba(0, 0, 0, 0.6); + --sidebar-dark-shadow: 0 4px 4px rgba(0, 0, 0, 0.6); + + // 顶栏 + --header-light-shadow: 0 1px 4px rgba(0, 0, 0, 0.6); + --header-dark-shadow: 0 1px 4px rgba(0, 0, 0, 0.6); + --header-tool-hover-bg: rgba(255, 255, 255, 0.05); + --header-dark-tool-hover-bg: rgba(255, 255, 255, 0.05); + --header-color-split: rgba(255, 255, 255, 0.15); + + // logo + --logo-light-shadow: 0 3px 4px rgba(0, 0, 0, 0.6); + --logo-dark-shadow: 0 3px 4px rgba(0, 0, 0, 0.6); + + // + --gradient-min: fade(#303030, 20%); + --gradient-max: fade(#303030, 40%); + + // + --primary-fade-20: var(--primary-2); + + --black--fade--85: rgba(255, 255, 255, 0.85); + --switch-shadow-color: 0 2px 4px rgb(0 35 11 / 20%); + + // workfolw design + --node-wrap-box-color: #303030; + --node-wrap-box-before-color: rgba(255, 255, 255, 0.09); // 箭头旁边 + --node-wrap-box-before-borde-color: rgba(255, 255, 255, 0.09); // 箭头 + --auto-judge-before-color: @component-background; // 箭头背景 +} + +// 表单设计器主题覆盖 +.snowy-theme-dark{ + --hint-color: #888; + + .form-designer-container-9136076486841527{ + --form-designer-primary-color: var(--primary-6); + --primary-background-color: @component-background; + --layout-background-color: fade(#9867f7, 12%); + --layout-hover-bg-color: fade(#9867f7, 24%); + + --title-text-color: fade(@black, 85%); + --border-color: var(--border-color-split); + + --component-background: #141414; + + } +} diff --git a/snowy-admin-web/src/tailwind.css b/snowy-admin-web/src/tailwind.css new file mode 100644 index 00000000..2f67a337 --- /dev/null +++ b/snowy-admin-web/src/tailwind.css @@ -0,0 +1,91 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer components { +} + +@layer utilities { +} + +/*默认为row,横向排列*/ +.layout-items-center { + display: flex; + align-items: center; +} + +.layout-items-baseline { + display: flex; + align-items: baseline; +} + +.layout-baseline-between { + display: flex; + align-items: baseline; + justify-content: space-between; +} + +/*左右居中*/ +.layout-center { + display: flex; + justify-content: center; +} + +/*两边排列*/ +.layout-slide { + display: flex; + align-items: center; + justify-content: space-between; +} + +/*左中右排列*/ +.layout-around { + display: flex; + align-items: center; + justify-content: space-around; +} + +/*两边排列, 换行*/ +.layout-slide-wrap { + display: flex; + align-items: center; + justify-content: space-between; + flex-wrap: wrap; +} + +/*上下排列*/ +.layout-col-slide { + display: flex; + flex-direction: column; + justify-content: space-between; +} + +/*左右垂直居中*/ + +.layout-abs-center { + display: flex; + justify-content: center; + align-items: center; +} + +/*横向左右垂直居右*/ +.layout-end { + display: flex; + justify-content: flex-end; + align-items: center; +} + +/*纵向左右垂直居中*/ +.layout-col-center { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.text-color{ + color: var(--text-color); +} + + + diff --git a/snowy-admin-web/src/utils/color.js b/snowy-admin-web/src/utils/color.js new file mode 100644 index 00000000..b32ce8c0 --- /dev/null +++ b/snowy-admin-web/src/utils/color.js @@ -0,0 +1,40 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +/* eslint-disable eqeqeq */ +export default { + // hex颜色转rgb颜色 + HexToRgb(str) { + str = str.replace('#', '') + const hxs = str.match(/../g) + for (let i = 0; i < 3; i++) hxs[i] = parseInt(hxs[i], 16) + return hxs + }, + // rgb颜色转hex颜色 + RgbToHex(a, b, c) { + const hexs = [a.toString(16), b.toString(16), c.toString(16)] + for (let i = 0; i < 3; i++) { + if (hexs[i].length == 1) hexs[i] = `0${hexs[i]}` + } + return `#${hexs.join('')}` + }, + // 加深 + darken(color, level) { + const rgbc = this.HexToRgb(color) + for (let i = 0; i < 3; i++) rgbc[i] = Math.floor(rgbc[i] * (1 - level)) + return this.RgbToHex(rgbc[0], rgbc[1], rgbc[2]) + }, + // 变淡 + lighten(color, level) { + const rgbc = this.HexToRgb(color) + for (let i = 0; i < 3; i++) rgbc[i] = Math.floor((255 - rgbc[i]) * level + rgbc[i]) + return this.RgbToHex(rgbc[0], rgbc[1], rgbc[2]) + } +} diff --git a/snowy-admin-web/src/utils/device.js b/snowy-admin-web/src/utils/device.js new file mode 100644 index 00000000..64d30fc9 --- /dev/null +++ b/snowy-admin-web/src/utils/device.js @@ -0,0 +1,43 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import enquireJs from 'enquire.js' + +export const DEVICE_TYPE = { + DESKTOP: 'desktop', + TABLET: 'tablet', + MOBILE: 'mobile' +} + +export const deviceEnquire = function (callback) { + const matchDesktop = { + match: () => { + callback && callback(DEVICE_TYPE.DESKTOP) + } + } + + const matchTablet = { + match: () => { + callback && callback(DEVICE_TYPE.TABLET) + } + } + + const matchMobile = { + match: () => { + callback && callback(DEVICE_TYPE.MOBILE) + } + } + + // screen and (max-width: 1087.99px) + enquireJs + .register('screen and (max-width: 576px)', matchMobile) + .register('screen and (min-width: 576px) and (max-width: 1199px)', matchTablet) + .register('screen and (min-width: 1200px)', matchDesktop) +} diff --git a/snowy-admin-web/src/utils/enum.js b/snowy-admin-web/src/utils/enum.js new file mode 100644 index 00000000..eec36b2b --- /dev/null +++ b/snowy-admin-web/src/utils/enum.js @@ -0,0 +1,15 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +export const ThemeModeEnum = { + LIGHT: 'light', + DARK: 'dark', + REAL_DARK: 'realDark' +} diff --git a/snowy-admin-web/src/utils/errorHandler.js b/snowy-admin-web/src/utils/errorHandler.js new file mode 100644 index 00000000..29d0ee56 --- /dev/null +++ b/snowy-admin-web/src/utils/errorHandler.js @@ -0,0 +1,39 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +/** + * 全局代码错误捕捉 + * 比如 null.length 就会被捕捉到 + */ +import { notification } from 'ant-design-vue' + +export default (error) => { + // 过滤HTTP请求错误 + if (error.code) { + return false + } + const errorMap = { + InternalError: 'Javascript引擎内部错误', + ReferenceError: '未找到对象', + TypeError: '使用了错误的类型或对象', + RangeError: '使用内置对象时,参数超范围', + SyntaxError: '语法错误', + EvalError: '错误的使用了Eval', + URIError: 'URI错误' + } + const errorName = errorMap[error.name] || '未知错误' + nextTick(() => { + notification.error({ + message: '错误', + description: errorName + }) + console.error(error) + }) +} diff --git a/snowy-admin-web/src/utils/formRules.js b/snowy-admin-web/src/utils/formRules.js new file mode 100644 index 00000000..62508320 --- /dev/null +++ b/snowy-admin-web/src/utils/formRules.js @@ -0,0 +1,46 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +export const required = (text, method = ['blur', 'change']) => ({ + required: true, + message: text, + trigger: method +}) + +// 常用正则规则大全:https://any86.github.io/any-rule/ + +export const rules = { + phone: { + pattern: /^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$/, + message: '请填写符合要求的11位手机号', + trigger: 'blur' + }, + email: { + pattern: /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/, + message: '请填写正确的邮箱号', + trigger: 'blur' + }, + idCard: { + pattern: + /(^\d{8}(0\d|10|11|12)([0-2]\d|30|31)\d{3}$)|(^\d{6}(18|19|20)\d{2}(0[1-9]|10|11|12)([0-2]\d|30|31)\d{3}(\d|X|x)$)/, + message: '请填写符合要求的身份证号', + trigger: 'blur' + }, + lettersNum: { + pattern: /^[A-Za-z0-9]+$/, + message: '填写内容须是字母或数字组成', + trigger: 'blur' + }, + number: { + pattern: /^\d{1,}$/, + message: '填写内容必须是纯数字', + trigger: 'blur' + } +} diff --git a/snowy-admin-web/src/utils/mixin.js b/snowy-admin-web/src/utils/mixin.js new file mode 100644 index 00000000..26f69ca2 --- /dev/null +++ b/snowy-admin-web/src/utils/mixin.js @@ -0,0 +1,85 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { mapState } from 'vuex' +import { DEVICE_TYPE, deviceEnquire } from '@/utils/device' + +// const mixinsComputed = Vue.config.optionMergeStrategies.computed +// const mixinsMethods = Vue.config.optionMergeStrategies.methods + +const mixin = { + computed: { + ...mapState({ + layoutMode: (state) => state.app.layout, + navTheme: (state) => state.app.theme, + primaryColor: (state) => state.app.color, + colorWeak: (state) => state.app.weak, + fixedHeader: (state) => state.app.fixedHeader, + fixSiderbar: (state) => state.app.fixSiderbar, + fixSidebar: (state) => state.app.fixSiderbar, + contentWidth: (state) => state.app.contentWidth, + autoHideHeader: (state) => state.app.autoHideHeader, + sidebarOpened: (state) => state.app.sidebar, + multiTab: (state) => state.app.multiTab + }) + }, + methods: { + isTopMenu() { + return this.layoutMode === 'topmenu' + }, + isSideMenu() { + return !this.isTopMenu() + } + } +} + +const mixinDevice = { + computed: { + ...mapState({ + device: (state) => state.app.device + }) + }, + methods: { + isMobile() { + return this.device === DEVICE_TYPE.MOBILE + }, + isDesktop() { + return this.device === DEVICE_TYPE.DESKTOP + }, + isTablet() { + return this.device === DEVICE_TYPE.TABLET + } + } +} + +const AppDeviceEnquire = { + mounted() { + const { $store } = this + deviceEnquire((deviceType) => { + switch (deviceType) { + case DEVICE_TYPE.DESKTOP: + $store.commit('TOGGLE_DEVICE', 'desktop') + $store.dispatch('setSidebar', true) + break + case DEVICE_TYPE.TABLET: + $store.commit('TOGGLE_DEVICE', 'tablet') + $store.dispatch('setSidebar', false) + break + case DEVICE_TYPE.MOBILE: + default: + $store.commit('TOGGLE_DEVICE', 'mobile') + $store.dispatch('setSidebar', true) + break + } + }) + } +} + +export { mixin, AppDeviceEnquire, mixinDevice } diff --git a/snowy-admin-web/src/utils/permission/index.js b/snowy-admin-web/src/utils/permission/index.js new file mode 100644 index 00000000..0d8b5aed --- /dev/null +++ b/snowy-admin-web/src/utils/permission/index.js @@ -0,0 +1,40 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import tool from '@/utils/tool' + +/** + * 权限判断是否能看到这个按钮,同时后端也做了校验,前端只是显示与不显示 + * @param {string, array} data 按钮的权限点,可以是单个字符串,也可以是数组 + * @param {string} rule or代表或,and代表与 + * 使用方法: + * 例如 buttonCodeList 的数据为: ['button1', 'button2', 'button3'] + * 想要判断 button1 的权限,可以写成:hasPerm('button1') + * 想要判断 button1 或 button2 的权限,可以写成:hasPerm(['button1', 'button2' ]) + * 想要判断 button1 与 button2 的权限,可以写成:hasPerm(['button1', 'button2' ], 'and') + */ +export function hasPerm(data, rule = 'or') { + if (!data) { + return false + } + const userInfo = tool.data.get('USER_INFO') + if (!userInfo) { + return false + } + const { buttonCodeList } = userInfo + if (!buttonCodeList) { + return false + } + if (Array.isArray(data)) { + const fn = rule === 'or' ? 'some' : 'every' + return data[fn]((item) => buttonCodeList.includes(item)) + } + return buttonCodeList.includes(data) +} diff --git a/snowy-admin-web/src/utils/print.js b/snowy-admin-web/src/utils/print.js new file mode 100644 index 00000000..984e804c --- /dev/null +++ b/snowy-admin-web/src/utils/print.js @@ -0,0 +1,156 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +/* eslint-disable */ +// 打印类属性、方法定义 +const Print = function(dom, options) { + if (!(this instanceof Print)) return new Print(dom, options) + + this.options = this.extend({ + noPrint: '.no-print', + }, options) + + if ((typeof dom) === 'string') { + try { + this.dom = document.querySelector(dom) + } + catch { + const createDom = document.createElement('div') + createDom.innerHTML = dom + this.dom = createDom + } + } + else { + this.isDOM(dom) + this.dom = this.isDOM(dom) ? dom : dom.$el + } + + this.init() +} +Print.prototype = { + init() { + const content = this.getStyle() + this.getHtml() + this.writeIframe(content) + }, + extend(obj, obj2) { + for (const k in obj2) { + obj[k] = obj2[k] + } + return obj + }, + + getStyle() { + let str = '' + const styles = document.querySelectorAll('style,link') + for (let i = 0; i < styles.length; i++) { + str += styles[i].outerHTML + } + str += `` + str += '' + return str + }, + + getHtml() { + const inputs = document.querySelectorAll('input') + const textareas = document.querySelectorAll('textarea') + const selects = document.querySelectorAll('select') + + for (let k = 0; k < inputs.length; k++) { + if (inputs[k].type == 'checkbox' || inputs[k].type == 'radio') { + if (inputs[k].checked == true) { + inputs[k].setAttribute('checked', 'checked') + } + else { + inputs[k].removeAttribute('checked') + } + } + else if (inputs[k].type == 'text') { + inputs[k].setAttribute('value', inputs[k].value) + } + else { + inputs[k].setAttribute('value', inputs[k].value) + } + } + + for (let k2 = 0; k2 < textareas.length; k2++) { + if (textareas[k2].type == 'textarea') { + textareas[k2].innerHTML = textareas[k2].value + } + } + + for (let k3 = 0; k3 < selects.length; k3++) { + if (selects[k3].type == 'select-one') { + const child = selects[k3].children + for (const i in child) { + if (child[i].tagName == 'OPTION') { + if (child[i].selected == true) { + child[i].setAttribute('selected', 'selected') + } + else { + child[i].removeAttribute('selected') + } + } + } + } + } + + return this.dom.outerHTML + }, + + writeIframe(content) { + let w; let doc; const iframe = document.createElement('iframe') + const f = document.body.appendChild(iframe) + iframe.id = 'myIframe' + // iframe.style = "position:absolute;width:0;height:0;top:-10px;left:-10px;"; + iframe.setAttribute('style', 'position:absolute;width:0;height:0;top:-10px;left:-10px;') + w = f.contentWindow || f.contentDocument + doc = f.contentDocument || f.contentWindow.document + doc.open() + doc.write(content) + doc.close() + const _this = this + iframe.onload = function() { + _this.toPrint(w) + setTimeout(() => { + document.body.removeChild(iframe) + }, 100) + } + }, + + toPrint(frameWindow) { + try { + setTimeout(() => { + frameWindow.focus() + try { + if (!frameWindow.document.execCommand('print', false, null)) { + frameWindow.print() + } + } + catch (e) { + frameWindow.print() + } + frameWindow.close() + }, 10) + } + catch (err) { + console.log('err', err) + } + }, + isDOM: (typeof HTMLElement === 'object') + ? function(obj) { + return obj instanceof HTMLElement + } + : function(obj) { + return obj && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string' + }, +} + +export default Print diff --git a/snowy-admin-web/src/utils/request.js b/snowy-admin-web/src/utils/request.js new file mode 100644 index 00000000..498f775e --- /dev/null +++ b/snowy-admin-web/src/utils/request.js @@ -0,0 +1,167 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +// 统一的请求发送 +import axios from 'axios' +import { Modal, message, notification } from 'ant-design-vue' +import sysConfig from '@/config/index' +import tool from '@/utils/tool' + +// 以下这些code需要重新登录 +const reloadCodes = [401, 1011007, 1011008] +const errorCodeMap = { + 400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。', + 401: '用户没有权限(令牌、用户名、密码错误)。', + 403: '用户得到授权,但是访问是被禁止的。', + 404: '发出的请求针对的是不存在的记录,服务器没有进行操作。', + 406: '请求的格式不可得。', + 410: '请求的资源被永久删除,且不会再得到的。', + 422: '当创建一个对象时,发生一个验证错误。', + 500: '服务器发生错误,请检查服务器。', + 502: '网关错误。', + 503: '服务不可用,服务器暂时过载或维护。', + 504: '网关超时。' +} +// 定义一个重新登录弹出窗的变量 +const loginBack = ref(false) +// 创建 axios 实例 +const service = axios.create({ + baseURL: '/api', // api base_url + timeout: sysConfig.TIMEOUT // 请求超时时间 +}) + +// HTTP request 拦截器 +service.interceptors.request.use( + (config) => { + const token = tool.data.get('TOKEN') + if (token) { + config.headers[sysConfig.TOKEN_NAME] = sysConfig.TOKEN_PREFIX + token + } + if (!sysConfig.REQUEST_CACHE && config.method === 'get') { + config.params = config.params || {} + config.params._ = new Date().getTime() + } + Object.assign(config.headers, sysConfig.HEADERS) + return config + }, + (error) => { + return Promise.reject(error) + } +) + +// 保持重新登录Modal的唯一性 +const error = () => { + loginBack.value = true + Modal.error({ + title: '提示:', + okText: '重新登录', + content: '登录已失效, 请重新登录', + onOk: () => { + loginBack.value = false + tool.data.remove('TOKEN') + tool.data.remove('USER_INFO') + tool.data.remove('MENU') + tool.data.remove('PERMISSIONS') + window.location.reload() + } + }) +} + +// HTTP response 拦截器 +service.interceptors.response.use( + (response) => { + // 配置了blob,不处理直接返回文件流 + if (response.config.responseType === 'blob') { + if (response.status === 200) { + return response + } else { + message.warning('文件下载失败或此文件不存在') + return + } + } + const data = response.data + const code = data.code + if (reloadCodes.includes(code)) { + if (!loginBack.value) { + error() + } + return + } + if (code !== 200) { + const customErrorMessage = response.config.customErrorMessage + message.error(customErrorMessage || data.msg) + return Promise.reject(data) + // 自定义错误提示,覆盖后端返回的message + // 使用示例: + // export function customerList (data) { + // return request('list', data, 'get', { + // customErrorMessage: '自定义错误消息提示' + // }); + // } + } else { + // 统一成功提示 + const responseUrl = response.config.url + const apiNameArray = ['add', 'edit', 'delete', 'update', 'grant', 'reset', 'start', 'stop', + 'pass', 'disable', 'enable', 'revoke', 'suspend', 'active', 'turn', 'adjust', 'reject'] + apiNameArray.forEach((apiName) => { + if (responseUrl.includes(apiName)) { + message.success(data.msg) + } + }) + } + return Promise.resolve(data.data) + }, + (error) => { + if (error) { + const status = 503 + const description = errorCodeMap[status] + notification.error({ + message: '请求错误', + description + }) + return Promise.reject(status) + } + } +) + +export const baseRequest = (url, value = {}, method = 'post', options = {}) => { + url = sysConfig.API_URL + url + if (method === 'post') { + return service.post(url, value, options) + } else if (method === 'get') { + return service.get(url, { + params: value, + ...options + }) + } else if (method === 'formdata') { + return service({ + method: 'post', + url, + data: value, + // 转换数据的方法 + transformRequest: [ + function (data) { + let ret = '' + for (const it in data) { + ret += `${encodeURIComponent(it)}=${encodeURIComponent(data[it])}&` + } + ret = ret.substring(0, ret.length - 1) + return ret + } + ], + // 设置请求头 + headers: { + 'Content-Type': 'multipart/form-data' + } + }) + } +} + +export default service diff --git a/snowy-admin-web/src/utils/smCrypto.js b/snowy-admin-web/src/utils/smCrypto.js new file mode 100644 index 00000000..c01b3caf --- /dev/null +++ b/snowy-admin-web/src/utils/smCrypto.js @@ -0,0 +1,68 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +/** + * 加解密的工具类 + * 使用:https://github.com/JuneAndGreen/sm-crypto + * + * @author yubaoshan + */ +import smCrypto from 'sm-crypto' + +const sm2 = smCrypto.sm2 +const sm3 = smCrypto.sm3 +const sm4 = smCrypto.sm4 +const cipherMode = 1 // 1 - C1C3C2,0 - C1C2C3,默认为1 +const publicKey = + '04298364ec840088475eae92a591e01284d1abefcda348b47eb324bb521bb03b0b2a5bc393f6b71dabb8f15c99a0050818b56b23f31743b93df9cf8948f15ddb54' +const privateKey = '3037723d47292171677ec8bd7dc9af696c7472bc5f251b2cec07e65fdef22e25' +const key = '0123456789abcdeffedcba9876543210' + +/** + * 国密加解密工具类 + */ +export default { + // SM2加密 + doSm2Encrypt(msgString) { + return sm2.doEncrypt(msgString, publicKey, cipherMode) + }, + // SM2解密 + doSm2Decrypt(encryptData) { + return sm2.doDecrypt(encryptData, privateKey, cipherMode) + }, + // SM2数组加密 + doSm2ArrayEncrypt(msgString) { + return sm2.doEncrypt(msgString, publicKey, cipherMode) + }, + // SM2数组解密 + doSm2ArrayDecrypt(encryptData) { + return sm2.doDecrypt(encryptData, privateKey, cipherMode, { output: 'array' }) + }, + // SM3哈希 + doSm3Hash(msgString) { + return sm3(msgString) + }, + // SM4 CBC加密 + doSm4Encrypt(msgString) { + return sm4.encrypt(msgString, key) + }, + // SM4 CBC加密 + doSm4CbcEncrypt(msgString) { + return sm4.encrypt(msgString, key, { mode: 'cbc', iv: 'fedcba98765432100123456789abcdef' }) + }, + // SM4 解密 + doSm4Decrypt(encryptData) { + return sm4.decrypt(encryptData, key) + }, + // SM4 CBC解密 + doSm4CbcDecrypt(encryptData) { + return sm4.decrypt(encryptData, key, { mode: 'cbc', iv: 'fedcba98765432100123456789abcdef' }) + } +} diff --git a/snowy-admin-web/src/utils/template.js b/snowy-admin-web/src/utils/template.js new file mode 100644 index 00000000..bba3316f --- /dev/null +++ b/snowy-admin-web/src/utils/template.js @@ -0,0 +1,326 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +/* ! + * template.js v0.7.1 (https://github.com/yanhaijing/template.js) + * API https://github.com/yanhaijing/template.js/blob/master/doc/api.md + * Copyright 2015 yanhaijing. All Rights Reserved + * Licensed under MIT (https://github.com/yanhaijing/template.js/blob/master/MIT-LICENSE.txt) + */ +/* eslint-disable */ +;(function(root, factory) { + var template = factory(root); + if (typeof define === 'function' && define.amd) { + // AMD + define('template', function() { + return template; + }); + } else if (typeof exports === 'object') { + // Node.js + module.exports = template; + } else { + // Browser globals + var _template = root.template; + + template.noConflict = function() { + if (root.template === template) { + root.template = _template; + } + + return template; + }; + root.template = template; + } +}(this, function(root) { + 'use strict'; + var o = { + sTag: '<%',//开始标签 + eTag: '%>',//结束标签 + compress: false,//是否压缩html + escape: true, //默认输出是否进行HTML转义 + error: function (e) {}//错误回调 + }; + var functionMap = {}; //内部函数对象 + //修饰器前缀 + var modifierMap = { + '': function (param) {return nothing(param)}, + 'h': function (param) {return encodeHTML(param)}, + 'u': function (param) {return encodeURI(param)} + }; + + var toString = {}.toString; + var slice = [].slice; + function type(x) { + if(x === null){ + return 'null'; + } + + var t= typeof x; + + if(t !== 'object'){ + return t; + } + + var c = toString.call(x).slice(8, -1).toLowerCase(); + if(c !== 'object'){ + return c; + } + + if(x.constructor==Object){ + return c; + } + + return 'unknown'; + } + + function isObject(obj) { + return type(obj) === 'object'; + } + function isFunction(fn) { + return type(fn) === 'function'; + } + function isString(str) { + return type(str) === 'string'; + } + function extend() { + var target = arguments[0] || {}; + var arrs = slice.call(arguments, 1); + var len = arrs.length; + + for (var i = 0; i < len; i++) { + var arr = arrs[i]; + for (var name in arr) { + target[name] = arr[name]; + } + + } + return target; + } + function clone() { + var args = slice.call(arguments); + return extend.apply(null, [{}].concat(args)); + } + function nothing(param) { + return param; + } + function encodeHTML(source) { + return String(source) + .replace(/&/g,'&') + .replace(//g,'>') + .replace(/\\/g,'\') + .replace(/"/g,'"') + .replace(/'/g,'''); + } + function compress(html) { + return html.replace(/\s+/g, ' ').replace(//g, ''); + } + function consoleAdapter(cmd, msg) { + typeof console !== 'undefined' && console[cmd] && console[cmd](msg); + } + function handelError(e) { + var message = 'template.js error\n\n'; + + for (var key in e) { + message += '<' + key + '>\n' + e[key] + '\n\n'; + } + message += '\n' + e.message + '\n\n'; + consoleAdapter('error', message); + + o.error(e); + function error() { + return 'template.js error'; + } + error.toString = function () { + return '__code__ = "template.js error"'; + } + return error; + } + function parse(tpl, opt) { + var code = ''; + var sTag = opt.sTag; + var eTag = opt.eTag; + var escape = opt.escape; + function parsehtml(line) { + // 单双引号转义,换行符替换为空格 + line = line.replace(/('|")/g, '\\$1'); + var lineList = line.split('\n'); + var code = ''; + for (var i = 0; i < lineList.length; i++) { + code += ';__code__ += ("' + lineList[i] + (i === lineList.length - 1 ? '")\n' : '\\n")\n'); + } + return code; + } + function parsejs(line) { + //var reg = /^(:?)(.*?)=(.*)$/; + var reg = /^(?:=|(:.*?)=)(.*)$/ + var html; + var arr; + var modifier; + + // = := :*= + // :h=123 [':h=123', 'h', '123'] + if (arr = reg.exec(line)) { + html = arr[2]; // 输出 + if (Boolean(arr[1])) { + // :开头 + modifier = arr[1].slice(1); + } else { + // = 开头 + modifier = escape ? 'h' : ''; + } + + return ';__code__ += __modifierMap__["' + modifier + '"](typeof (' + html + ') !== "undefined" ? (' + html + ') : "")\n'; + } + + //原生js + return ';' + line + '\n'; + } + + var tokens = tpl.split(sTag); + + for (var i = 0, len = tokens.length; i < len; i++) { + var token = tokens[i].split(eTag); + + if (token.length === 1) { + code += parsehtml(token[0]); + } else { + code += parsejs(token[0], true); + if (token[1]) { + code += parsehtml(token[1]); + } + } + } + return code; + } + function compiler(tpl, opt) { + var mainCode = parse(tpl, opt); + + var headerCode = '\n' + + ' var html = (function (__data__, __modifierMap__) {\n' + + ' var __str__ = "", __code__ = "";\n' + + ' for(var key in __data__) {\n' + + ' __str__+=("var " + key + "=__data__[\'" + key + "\'];");\n' + + ' }\n' + + ' eval(__str__);\n\n'; + + var footerCode = '\n' + + ' ;return __code__;\n' + + ' }(__data__, __modifierMap__));\n' + + ' return html;\n'; + + var code = headerCode + mainCode + footerCode; + code = code.replace(/[\r]/g, ' '); // ie 7 8 会报错,不知道为什么 + try { + var Render = new Function('__data__', '__modifierMap__', code); + Render.toString = function () { + return mainCode; + } + return Render; + } catch(e) { + e.temp = 'function anonymous(__data__, __modifierMap__) {' + code + '}'; + throw e; + } + } + function compile(tpl, opt) { + opt = clone(o, opt); + + try { + var Render = compiler(tpl, opt); + } catch(e) { + e.name = 'CompileError'; + e.tpl = tpl; + e.render = e.temp; + delete e.temp; + return handelError(e); + } + + function render(data) { + data = clone(functionMap, data); + try { + var html = Render(data, modifierMap); + html = opt.compress ? compress(html) : html; + return html; + } catch(e) { + e.name = 'RenderError'; + e.tpl = tpl; + e.render = Render.toString(); + return handelError(e)(); + } + } + + render.toString = function () { + return Render.toString(); + }; + return render; + } + function template(tpl, data) { + if (typeof tpl !== 'string') { + return ''; + } + + var fn = compile(tpl); + if (!isObject(data)) { + return fn; + } + + return fn(data); + } + + template.config = function (option) { + if (isObject(option)) { + o = extend(o, option); + } + return clone(o); + }; + + template.registerFunction = function(name, fn) { + if (!isString(name)) { + return clone(functionMap); + } + if (!isFunction(fn)) { + return functionMap[name]; + } + + return functionMap[name] = fn; + } + template.unregisterFunction = function (name) { + if (!isString(name)) { + return false; + } + delete functionMap[name]; + return true; + } + + template.registerModifier = function(name, fn) { + if (!isString(name)) { + return clone(modifierMap); + } + if (!isFunction(fn)) { + return modifierMap[name]; + } + + return modifierMap[name] = fn; + } + template.unregisterModifier = function (name) { + if (!isString(name)) { + return false; + } + delete modifierMap[name]; + return true; + } + + template.__encodeHTML = encodeHTML; + template.__compress = compress; + template.__handelError = handelError; + template.__compile = compile; + template.version = '0.7.1'; + return template; +})); diff --git a/snowy-admin-web/src/utils/themeUtil.js b/snowy-admin-web/src/utils/themeUtil.js new file mode 100644 index 00000000..3b130a22 --- /dev/null +++ b/snowy-admin-web/src/utils/themeUtil.js @@ -0,0 +1,81 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import generate from '@ant-design/colors/lib/generate' +import tool from '../utils/tool' +import config from '../config' +import { ThemeModeEnum } from './enum' + +const changeColor = (newPrimaryColor, theme, darkClass = 'snowy-theme-dark') => { + return new Promise((resolve) => { + const themeEleId = 'snowy-theme-var' + const themeEle = document.querySelector(`#${themeEleId}`) + if (themeEle && themeEle.parentNode) { + themeEle.parentNode.removeChild(themeEle) + } + const isRealDark = theme === ThemeModeEnum.REAL_DARK + if (newPrimaryColor) { + const colors = generate(newPrimaryColor, isRealDark ? { theme: 'dark' } : {}) + const rootClass = isRealDark ? `.${darkClass}` : ':root' + const styleElement = document.createElement('style') + styleElement.id = themeEleId + styleElement.setAttribute('type', 'text/css') + styleElement.innerHTML = `${rootClass}{${colors + .map((c, i) => { + return `--primary-${i + 1}:${c};` + }) + .concat([`--primary-color:${newPrimaryColor};`]) + .join('')}}` + document.head.appendChild(styleElement) + } else { + document.body.removeAttribute('snowy-theme') + } + if (isRealDark) { + document.body.classList.add(darkClass) + } else { + document.body.classList.remove(darkClass) + } + resolve() + }) +} + +const loadLocalTheme = (localSetting) => { + if (localSetting) { + let { theme, themeColor } = localSetting + themeColor = themeColor || config.COLOR + theme = theme || config.THEME + changeColor(themeColor, theme) + } +} + +/** + * 获取本地保存的配置 + * @param loadTheme {boolean} 是否加载配置中的主题 + * @returns {Object} + */ +const getLocalSetting = (loadTheme) => { + let localSetting = {} + try { + const theme = tool.data.get('SNOWY_THEME') + const themeColor = tool.data.get('SNOWY_THEME_COLOR') + localSetting = { + theme, + themeColor + } + } catch (e) { + console.error(e) + } + if (loadTheme) { + loadLocalTheme(localSetting) + } + return localSetting +} + +export { loadLocalTheme, getLocalSetting, changeColor } diff --git a/snowy-admin-web/src/utils/tool.js b/snowy-admin-web/src/utils/tool.js new file mode 100644 index 00000000..c1beec0f --- /dev/null +++ b/snowy-admin-web/src/utils/tool.js @@ -0,0 +1,160 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +/* + * @Descripttion: 工具集 + * @version: 1.1 + * @LastEditors: yubaoshan + * @LastEditTime: 2022年4月19日10:58:41 + */ + +const tool = {} + +/** + * localStorage + * + * @author yubaoshan + * @date 2022-05-18 22:59 + */ +tool.data = { + set(table, settings) { + const _set = JSON.stringify(settings) + return localStorage.setItem(table, _set) + }, + get(table) { + let data = localStorage.getItem(table) + try { + data = JSON.parse(data) + } catch (err) { + return null + } + return data + }, + remove(table) { + return localStorage.removeItem(table) + }, + + clear() { + return localStorage.clear() + } +} + +/** + * sessionStorage + * + * @author yubaoshan + * @date 2022-05-18 22:59 + */ +tool.session = { + set(table, settings) { + const _set = JSON.stringify(settings) + return sessionStorage.setItem(table, _set) + }, + get(table) { + let data = sessionStorage.getItem(table) + try { + data = JSON.parse(data) + } catch (err) { + return null + } + return data + }, + remove(table) { + return sessionStorage.removeItem(table) + }, + clear() { + return sessionStorage.clear() + } +} + +/** + * 千分符 + * + * @author yubaoshan + * @date 2022-05-18 22:59 + */ +tool.groupSeparator = (num) => { + num = `${num}` + if (!num.includes('.')) num += '.' + + return num + .replace(/(\d)(?=(\d{3})+\.)/g, ($0, $1) => { + return `${$1},` + }) + .replace(/\.$/, '') +} + +/** + * 获取所有字典数组 + * + * @author yubaoshan + * @date 2022-04-08 01:11 + */ +tool.dictDataAll = () => { + return tool.data.get('DICT_TYPE_TREE_DATA') +} + +/** + * 字典翻译方法 + * 界面插槽使用方法 {{ $TOOL.dictType('sex', record.sex) }} + * + * @author yubaoshan + * @date 2022-04-08 01:11 + */ +// todo 每次都从localStorage获取并重新解析,会有性能问题,应该在内存中做一层缓存,后面需要优化掉 +tool.dictTypeData = (dictValue, value) => { + const dictTypeTree = tool.dictDataAll() + if (!dictTypeTree) { + return '需重新登录' + } + const tree = dictTypeTree.find((item) => item.dictValue === dictValue) + if (!tree) { + return '无此字典' + } + const children = tree.children + const dict = children.find((item) => item.dictValue === value) + return dict?.name || '无此字典' +} + +/** + * 获取某个code下字典的列表,多用于字典下拉框 + * + * @author yubaoshan + * @date 2022-04-08 01:11 + */ +tool.dictTypeList = (dictValue) => { + const dictTypeTree = tool.dictDataAll() + if (!dictTypeTree) { + return [] + } + const tree = dictTypeTree.find((item) => item.dictValue === dictValue) + if (tree && tree.children) { + return tree.children + } + return [] +} + +/** + * 生成UUID + * + * @author yubaoshan + * @date 2022-05-18 22:59 + */ +tool.snowyUuid = () => { + let uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { + let r = (Math.random() * 16) | 0, + v = c === 'x' ? r : (r & 0x3) | 0x8 + return v.toString(16) + }) + // 首字符转换成字母 + return 'xn' + uuid.slice(2) +} + +export default tool diff --git a/snowy-admin-web/src/utils/useTabs.js b/snowy-admin-web/src/utils/useTabs.js new file mode 100644 index 00000000..a170d54e --- /dev/null +++ b/snowy-admin-web/src/utils/useTabs.js @@ -0,0 +1,72 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { nextTick } from 'vue' +import NProgress from 'nprogress' +import 'nprogress/nprogress.css' +import router from '@/router' +import store from '@/store' + +export default { + // 刷新标签 + refresh() { + NProgress.start() + const route = router.currentRoute.value + store.commit('removeKeepLive', route.name) + store.commit('setRouteShow', false) + nextTick(() => { + store.commit('pushKeepLive', route.name) + store.commit('setRouteShow', true) + NProgress.done() + }) + }, + // 关闭标签 + close(tag) { + const route = tag || router.currentRoute.value + store.commit('removeViewTags', route) + store.commit('removeIframeList', route) + store.commit('removeKeepLive', route.name) + const tagList = store.state.viewTags.viewTags + const latestView = tagList.slice(-1)[0] + if (latestView) { + router.push(latestView) + } else { + router.push('/') + } + }, + // 关闭标签后处理 + closeNext(next) { + const route = router.currentRoute.value + store.commit('removeViewTags', route) + store.commit('removeIframeList', route) + store.commit('removeKeepLive', route.name) + if (next) { + const tagList = store.state.viewTags.viewTags + next(tagList) + } + }, + // 关闭其他 + closeOther() { + const route = router.currentRoute.value + const tagList = [...store.state.viewTags.viewTags] + tagList.forEach((tag) => { + // eslint-disable-next-line prettier/prettier + if (tag.meta && tag.meta.affix || route.fullPath == tag.fullPath) { + return true + } else { + this.close(tag) + } + }) + }, + // 设置标题 + setTitle(title) { + store.commit('updateViewTagsTitle', title) + } +} diff --git a/snowy-admin-web/src/utils/watermark.js b/snowy-admin-web/src/utils/watermark.js new file mode 100644 index 00000000..5a088836 --- /dev/null +++ b/snowy-admin-web/src/utils/watermark.js @@ -0,0 +1,86 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import store from '@/store' +export const watermark = { + set: function (text1, text2) { + const canvas = document.createElement('canvas') + canvas.width = 150 + canvas.height = 120 + canvas.style.display = 'none' + const shuiyin = canvas.getContext('2d') + // 控制文字的旋转角度和上下位置 + shuiyin.rotate((-20 * Math.PI) / 180) + shuiyin.translate(-50, 20) + //文字颜色 + shuiyin.fillStyle = '#f5f5f5' + //文字样式 + shuiyin.font = '100 16px Microsoft JhengHei ' + shuiyin.fillText(text1, canvas.width / 3, canvas.height / 2) + shuiyin.fillText(text2, canvas.width / 3, canvas.height / 2 + 20) + /* 新建一个用于填充canvas水印的标签,之所以没有直接在body上添加, + 是因为z-index对个别内容影响,才考虑的不用body */ + const watermark = document.createElement('div') + const styleStr = ` + position:fixed; + top:0; + left:0; + width:100vw; + height:100vh; + z-index:99; + pointer-events:none; + background-repeat:repeat; + mix-blend-mode: multiply; + background-image:url('${canvas.toDataURL('image/png')}')` + watermark.setAttribute('style', styleStr) + watermark.classList.add('watermark') + document.body.appendChild(watermark) + + //此方法是防止用户通过控制台修改样式去除水印效果 + /* MutationObserver 是一个可以监听DOM结构变化的接口。 */ + const observer = new MutationObserver(() => { + const wmInstance = document.querySelector('.watermark') + if ((wmInstance && wmInstance.getAttribute('style') !== styleStr) || !wmInstance) { + //如果标签在,只修改了属性,重新赋值属性 + if (wmInstance) { + // 避免一直触发 + // observer.disconnect(); + // console.log('水印属性修改了'); + wmInstance.setAttribute('style', styleStr) + } else { + /* 此处根据用户登录状态,判断是否终止监听,避免用户退出后登录页面仍然有水印 */ + if (store.getters.token) { + //标签被移除,重新添加标签 + // console.log('水印标签被移除了'); + document.body.appendChild(watermark) + } else { + observer.disconnect() + } + } + } + }) + observer.observe(document.body, { + attributes: true, + subtree: true, + childList: true + }) + }, + close: function () { + /* 关闭页面的水印,即要移除水印标签 */ + let watermark = document.querySelector('.watermark') + document.body.removeChild(watermark) + } +} +// 使用方法 +// import { watermark } from '@/utils/watermark' +// 添加水印 +// watermark.set('Snowy','xiaonuo.vip') +// 移除水印,传 null 移除水印 +// watermark.close() diff --git a/snowy-admin-web/src/views/auth/findPwd/emailFindForm.vue b/snowy-admin-web/src/views/auth/findPwd/emailFindForm.vue new file mode 100644 index 00000000..94aa1517 --- /dev/null +++ b/snowy-admin-web/src/views/auth/findPwd/emailFindForm.vue @@ -0,0 +1,194 @@ + + + + + diff --git a/snowy-admin-web/src/views/auth/findPwd/index.vue b/snowy-admin-web/src/views/auth/findPwd/index.vue new file mode 100644 index 00000000..3a89e15e --- /dev/null +++ b/snowy-admin-web/src/views/auth/findPwd/index.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/snowy-admin-web/src/views/auth/findPwd/phoneFindForm.vue b/snowy-admin-web/src/views/auth/findPwd/phoneFindForm.vue new file mode 100644 index 00000000..194fd253 --- /dev/null +++ b/snowy-admin-web/src/views/auth/findPwd/phoneFindForm.vue @@ -0,0 +1,195 @@ + + + + + diff --git a/snowy-admin-web/src/views/auth/login/callback.vue b/snowy-admin-web/src/views/auth/login/callback.vue new file mode 100644 index 00000000..83b73afc --- /dev/null +++ b/snowy-admin-web/src/views/auth/login/callback.vue @@ -0,0 +1,233 @@ + + + + + diff --git a/snowy-admin-web/src/views/auth/login/login.vue b/snowy-admin-web/src/views/auth/login/login.vue new file mode 100644 index 00000000..524e0bcd --- /dev/null +++ b/snowy-admin-web/src/views/auth/login/login.vue @@ -0,0 +1,401 @@ + + + + + diff --git a/snowy-admin-web/src/views/auth/login/phoneLoginForm.vue b/snowy-admin-web/src/views/auth/login/phoneLoginForm.vue new file mode 100644 index 00000000..cd484c36 --- /dev/null +++ b/snowy-admin-web/src/views/auth/login/phoneLoginForm.vue @@ -0,0 +1,196 @@ + + + + + diff --git a/snowy-admin-web/src/views/auth/login/threeLogin.vue b/snowy-admin-web/src/views/auth/login/threeLogin.vue new file mode 100644 index 00000000..f5878778 --- /dev/null +++ b/snowy-admin-web/src/views/auth/login/threeLogin.vue @@ -0,0 +1,31 @@ + + + + + diff --git a/snowy-admin-web/src/views/auth/monitor/analyse.vue b/snowy-admin-web/src/views/auth/monitor/analyse.vue new file mode 100644 index 00000000..899c2b11 --- /dev/null +++ b/snowy-admin-web/src/views/auth/monitor/analyse.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/snowy-admin-web/src/views/auth/monitor/bTab.vue b/snowy-admin-web/src/views/auth/monitor/bTab.vue new file mode 100644 index 00000000..cfd24c3b --- /dev/null +++ b/snowy-admin-web/src/views/auth/monitor/bTab.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/snowy-admin-web/src/views/auth/monitor/cTab.vue b/snowy-admin-web/src/views/auth/monitor/cTab.vue new file mode 100644 index 00000000..5f6a8ae9 --- /dev/null +++ b/snowy-admin-web/src/views/auth/monitor/cTab.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/snowy-admin-web/src/views/auth/monitor/index.vue b/snowy-admin-web/src/views/auth/monitor/index.vue new file mode 100644 index 00000000..1edf25d0 --- /dev/null +++ b/snowy-admin-web/src/views/auth/monitor/index.vue @@ -0,0 +1,20 @@ + + + diff --git a/snowy-admin-web/src/views/auth/monitor/tokenInfoList.vue b/snowy-admin-web/src/views/auth/monitor/tokenInfoList.vue new file mode 100644 index 00000000..6325afa8 --- /dev/null +++ b/snowy-admin-web/src/views/auth/monitor/tokenInfoList.vue @@ -0,0 +1,190 @@ + + + diff --git a/snowy-admin-web/src/views/auth/third/index.vue b/snowy-admin-web/src/views/auth/third/index.vue new file mode 100644 index 00000000..5243b14b --- /dev/null +++ b/snowy-admin-web/src/views/auth/third/index.vue @@ -0,0 +1,97 @@ + + + diff --git a/snowy-admin-web/src/views/biz/org/form.vue b/snowy-admin-web/src/views/biz/org/form.vue new file mode 100644 index 00000000..99a7bdcf --- /dev/null +++ b/snowy-admin-web/src/views/biz/org/form.vue @@ -0,0 +1,174 @@ + + + + + diff --git a/snowy-admin-web/src/views/biz/org/index.vue b/snowy-admin-web/src/views/biz/org/index.vue new file mode 100644 index 00000000..8339f76f --- /dev/null +++ b/snowy-admin-web/src/views/biz/org/index.vue @@ -0,0 +1,210 @@ + + + + + diff --git a/snowy-admin-web/src/views/biz/position/form.vue b/snowy-admin-web/src/views/biz/position/form.vue new file mode 100644 index 00000000..447cac38 --- /dev/null +++ b/snowy-admin-web/src/views/biz/position/form.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/snowy-admin-web/src/views/biz/position/index.vue b/snowy-admin-web/src/views/biz/position/index.vue new file mode 100644 index 00000000..a3be6428 --- /dev/null +++ b/snowy-admin-web/src/views/biz/position/index.vue @@ -0,0 +1,208 @@ + + + + + diff --git a/snowy-admin-web/src/views/biz/user/form.vue b/snowy-admin-web/src/views/biz/user/form.vue new file mode 100644 index 00000000..97448d2b --- /dev/null +++ b/snowy-admin-web/src/views/biz/user/form.vue @@ -0,0 +1,567 @@ + + + + + diff --git a/snowy-admin-web/src/views/biz/user/index.vue b/snowy-admin-web/src/views/biz/user/index.vue new file mode 100644 index 00000000..530c6313 --- /dev/null +++ b/snowy-admin-web/src/views/biz/user/index.vue @@ -0,0 +1,322 @@ + + + + diff --git a/snowy-admin-web/src/views/dev/config/emailConfig/aliyunEmailForm.vue b/snowy-admin-web/src/views/dev/config/emailConfig/aliyunEmailForm.vue new file mode 100644 index 00000000..5b88f552 --- /dev/null +++ b/snowy-admin-web/src/views/dev/config/emailConfig/aliyunEmailForm.vue @@ -0,0 +1,89 @@ + + + diff --git a/snowy-admin-web/src/views/dev/config/emailConfig/index.vue b/snowy-admin-web/src/views/dev/config/emailConfig/index.vue new file mode 100644 index 00000000..0e291085 --- /dev/null +++ b/snowy-admin-web/src/views/dev/config/emailConfig/index.vue @@ -0,0 +1,20 @@ + + + diff --git a/snowy-admin-web/src/views/dev/config/emailConfig/localEmailForm.vue b/snowy-admin-web/src/views/dev/config/emailConfig/localEmailForm.vue new file mode 100644 index 00000000..e58e614d --- /dev/null +++ b/snowy-admin-web/src/views/dev/config/emailConfig/localEmailForm.vue @@ -0,0 +1,85 @@ + + + diff --git a/snowy-admin-web/src/views/dev/config/emailConfig/tencentEmailForm.vue b/snowy-admin-web/src/views/dev/config/emailConfig/tencentEmailForm.vue new file mode 100644 index 00000000..081c5df1 --- /dev/null +++ b/snowy-admin-web/src/views/dev/config/emailConfig/tencentEmailForm.vue @@ -0,0 +1,90 @@ + + + diff --git a/snowy-admin-web/src/views/dev/config/fileConfig/aliyunFileForm.vue b/snowy-admin-web/src/views/dev/config/fileConfig/aliyunFileForm.vue new file mode 100644 index 00000000..9f594dab --- /dev/null +++ b/snowy-admin-web/src/views/dev/config/fileConfig/aliyunFileForm.vue @@ -0,0 +1,93 @@ + + + diff --git a/snowy-admin-web/src/views/dev/config/fileConfig/index.vue b/snowy-admin-web/src/views/dev/config/fileConfig/index.vue new file mode 100644 index 00000000..6dae9f90 --- /dev/null +++ b/snowy-admin-web/src/views/dev/config/fileConfig/index.vue @@ -0,0 +1,24 @@ + + + diff --git a/snowy-admin-web/src/views/dev/config/fileConfig/localFileForm.vue b/snowy-admin-web/src/views/dev/config/fileConfig/localFileForm.vue new file mode 100644 index 00000000..987f8389 --- /dev/null +++ b/snowy-admin-web/src/views/dev/config/fileConfig/localFileForm.vue @@ -0,0 +1,85 @@ + + + diff --git a/snowy-admin-web/src/views/dev/config/fileConfig/minioFileForm.vue b/snowy-admin-web/src/views/dev/config/fileConfig/minioFileForm.vue new file mode 100644 index 00000000..5b2fbd24 --- /dev/null +++ b/snowy-admin-web/src/views/dev/config/fileConfig/minioFileForm.vue @@ -0,0 +1,93 @@ + + + diff --git a/snowy-admin-web/src/views/dev/config/fileConfig/tencentFileForm.vue b/snowy-admin-web/src/views/dev/config/fileConfig/tencentFileForm.vue new file mode 100644 index 00000000..7b5492e4 --- /dev/null +++ b/snowy-admin-web/src/views/dev/config/fileConfig/tencentFileForm.vue @@ -0,0 +1,93 @@ + + + diff --git a/snowy-admin-web/src/views/dev/config/index.vue b/snowy-admin-web/src/views/dev/config/index.vue new file mode 100644 index 00000000..34a28447 --- /dev/null +++ b/snowy-admin-web/src/views/dev/config/index.vue @@ -0,0 +1,75 @@ + + + diff --git a/snowy-admin-web/src/views/dev/config/otherConfig/form.vue b/snowy-admin-web/src/views/dev/config/otherConfig/form.vue new file mode 100644 index 00000000..aaa3b176 --- /dev/null +++ b/snowy-admin-web/src/views/dev/config/otherConfig/form.vue @@ -0,0 +1,91 @@ + + + diff --git a/snowy-admin-web/src/views/dev/config/otherConfig/index.vue b/snowy-admin-web/src/views/dev/config/otherConfig/index.vue new file mode 100644 index 00000000..b7d7a5d7 --- /dev/null +++ b/snowy-admin-web/src/views/dev/config/otherConfig/index.vue @@ -0,0 +1,94 @@ + + + diff --git a/snowy-admin-web/src/views/dev/config/smsConfig/aliyunSmsForm.vue b/snowy-admin-web/src/views/dev/config/smsConfig/aliyunSmsForm.vue new file mode 100644 index 00000000..766f040a --- /dev/null +++ b/snowy-admin-web/src/views/dev/config/smsConfig/aliyunSmsForm.vue @@ -0,0 +1,93 @@ + + + diff --git a/snowy-admin-web/src/views/dev/config/smsConfig/index.vue b/snowy-admin-web/src/views/dev/config/smsConfig/index.vue new file mode 100644 index 00000000..bfd04a43 --- /dev/null +++ b/snowy-admin-web/src/views/dev/config/smsConfig/index.vue @@ -0,0 +1,16 @@ + + + diff --git a/snowy-admin-web/src/views/dev/config/smsConfig/tencentSmsForm.vue b/snowy-admin-web/src/views/dev/config/smsConfig/tencentSmsForm.vue new file mode 100644 index 00000000..39678ae6 --- /dev/null +++ b/snowy-admin-web/src/views/dev/config/smsConfig/tencentSmsForm.vue @@ -0,0 +1,97 @@ + + + diff --git a/snowy-admin-web/src/views/dev/config/sysConfig.vue b/snowy-admin-web/src/views/dev/config/sysConfig.vue new file mode 100644 index 00000000..5bae343d --- /dev/null +++ b/snowy-admin-web/src/views/dev/config/sysConfig.vue @@ -0,0 +1,230 @@ + + + diff --git a/snowy-admin-web/src/views/dev/config/thirdConfig/giteeThirdForm.vue b/snowy-admin-web/src/views/dev/config/thirdConfig/giteeThirdForm.vue new file mode 100644 index 00000000..3672bfcb --- /dev/null +++ b/snowy-admin-web/src/views/dev/config/thirdConfig/giteeThirdForm.vue @@ -0,0 +1,89 @@ + + + diff --git a/snowy-admin-web/src/views/dev/config/thirdConfig/index.vue b/snowy-admin-web/src/views/dev/config/thirdConfig/index.vue new file mode 100644 index 00000000..fa3b6f8d --- /dev/null +++ b/snowy-admin-web/src/views/dev/config/thirdConfig/index.vue @@ -0,0 +1,16 @@ + + + diff --git a/snowy-admin-web/src/views/dev/config/thirdConfig/wechatThirdForm.vue b/snowy-admin-web/src/views/dev/config/thirdConfig/wechatThirdForm.vue new file mode 100644 index 00000000..f48ee0f0 --- /dev/null +++ b/snowy-admin-web/src/views/dev/config/thirdConfig/wechatThirdForm.vue @@ -0,0 +1,89 @@ + + + diff --git a/snowy-admin-web/src/views/dev/dict/category/bizIndex.vue b/snowy-admin-web/src/views/dev/dict/category/bizIndex.vue new file mode 100644 index 00000000..ec66c976 --- /dev/null +++ b/snowy-admin-web/src/views/dev/dict/category/bizIndex.vue @@ -0,0 +1,164 @@ + + + + + diff --git a/snowy-admin-web/src/views/dev/dict/category/form.vue b/snowy-admin-web/src/views/dev/dict/category/form.vue new file mode 100644 index 00000000..02597ba2 --- /dev/null +++ b/snowy-admin-web/src/views/dev/dict/category/form.vue @@ -0,0 +1,120 @@ + + + diff --git a/snowy-admin-web/src/views/dev/dict/category/frmIndex.vue b/snowy-admin-web/src/views/dev/dict/category/frmIndex.vue new file mode 100644 index 00000000..1f6774fe --- /dev/null +++ b/snowy-admin-web/src/views/dev/dict/category/frmIndex.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/snowy-admin-web/src/views/dev/dict/index.vue b/snowy-admin-web/src/views/dev/dict/index.vue new file mode 100644 index 00000000..a126cd84 --- /dev/null +++ b/snowy-admin-web/src/views/dev/dict/index.vue @@ -0,0 +1,32 @@ + + + diff --git a/snowy-admin-web/src/views/dev/email/detail.vue b/snowy-admin-web/src/views/dev/email/detail.vue new file mode 100644 index 00000000..d71cbb96 --- /dev/null +++ b/snowy-admin-web/src/views/dev/email/detail.vue @@ -0,0 +1,76 @@ + + + diff --git a/snowy-admin-web/src/views/dev/email/form.vue b/snowy-admin-web/src/views/dev/email/form.vue new file mode 100644 index 00000000..b26c54f0 --- /dev/null +++ b/snowy-admin-web/src/views/dev/email/form.vue @@ -0,0 +1,73 @@ + + + diff --git a/snowy-admin-web/src/views/dev/email/index.vue b/snowy-admin-web/src/views/dev/email/index.vue new file mode 100644 index 00000000..8025c50d --- /dev/null +++ b/snowy-admin-web/src/views/dev/email/index.vue @@ -0,0 +1,184 @@ + + + + + diff --git a/snowy-admin-web/src/views/dev/email/send/aliyunEmailSend.vue b/snowy-admin-web/src/views/dev/email/send/aliyunEmailSend.vue new file mode 100644 index 00000000..ea566271 --- /dev/null +++ b/snowy-admin-web/src/views/dev/email/send/aliyunEmailSend.vue @@ -0,0 +1,110 @@ + + + diff --git a/snowy-admin-web/src/views/dev/email/send/localEmailSend.vue b/snowy-admin-web/src/views/dev/email/send/localEmailSend.vue new file mode 100644 index 00000000..ba51ede4 --- /dev/null +++ b/snowy-admin-web/src/views/dev/email/send/localEmailSend.vue @@ -0,0 +1,84 @@ + + + diff --git a/snowy-admin-web/src/views/dev/email/send/tencentEmailSend.vue b/snowy-admin-web/src/views/dev/email/send/tencentEmailSend.vue new file mode 100644 index 00000000..d0b8b06a --- /dev/null +++ b/snowy-admin-web/src/views/dev/email/send/tencentEmailSend.vue @@ -0,0 +1,109 @@ + + + diff --git a/snowy-admin-web/src/views/dev/file/detail.vue b/snowy-admin-web/src/views/dev/file/detail.vue new file mode 100644 index 00000000..c40ccefb --- /dev/null +++ b/snowy-admin-web/src/views/dev/file/detail.vue @@ -0,0 +1,62 @@ + + + diff --git a/snowy-admin-web/src/views/dev/file/index.vue b/snowy-admin-web/src/views/dev/file/index.vue new file mode 100644 index 00000000..98b1a01f --- /dev/null +++ b/snowy-admin-web/src/views/dev/file/index.vue @@ -0,0 +1,219 @@ + + + + + diff --git a/snowy-admin-web/src/views/dev/file/uploadForm.vue b/snowy-admin-web/src/views/dev/file/uploadForm.vue new file mode 100644 index 00000000..e8b78162 --- /dev/null +++ b/snowy-admin-web/src/views/dev/file/uploadForm.vue @@ -0,0 +1,139 @@ + + + diff --git a/snowy-admin-web/src/views/dev/job/form.vue b/snowy-admin-web/src/views/dev/job/form.vue new file mode 100644 index 00000000..2cc8f831 --- /dev/null +++ b/snowy-admin-web/src/views/dev/job/form.vue @@ -0,0 +1,113 @@ + + + diff --git a/snowy-admin-web/src/views/dev/job/index.vue b/snowy-admin-web/src/views/dev/job/index.vue new file mode 100644 index 00000000..27ac8402 --- /dev/null +++ b/snowy-admin-web/src/views/dev/job/index.vue @@ -0,0 +1,212 @@ + + + diff --git a/snowy-admin-web/src/views/dev/log/oplog/columnChart.vue b/snowy-admin-web/src/views/dev/log/oplog/columnChart.vue new file mode 100644 index 00000000..bf526314 --- /dev/null +++ b/snowy-admin-web/src/views/dev/log/oplog/columnChart.vue @@ -0,0 +1,39 @@ + + + diff --git a/snowy-admin-web/src/views/dev/log/oplog/detail.vue b/snowy-admin-web/src/views/dev/log/oplog/detail.vue new file mode 100644 index 00000000..9bc4c8f4 --- /dev/null +++ b/snowy-admin-web/src/views/dev/log/oplog/detail.vue @@ -0,0 +1,68 @@ + + + diff --git a/snowy-admin-web/src/views/dev/log/oplog/index.vue b/snowy-admin-web/src/views/dev/log/oplog/index.vue new file mode 100644 index 00000000..f60c86ee --- /dev/null +++ b/snowy-admin-web/src/views/dev/log/oplog/index.vue @@ -0,0 +1,140 @@ + + + diff --git a/snowy-admin-web/src/views/dev/log/oplog/pieChart.vue b/snowy-admin-web/src/views/dev/log/oplog/pieChart.vue new file mode 100644 index 00000000..b9f29bf4 --- /dev/null +++ b/snowy-admin-web/src/views/dev/log/oplog/pieChart.vue @@ -0,0 +1,33 @@ + + + diff --git a/snowy-admin-web/src/views/dev/log/vislog/detail.vue b/snowy-admin-web/src/views/dev/log/vislog/detail.vue new file mode 100644 index 00000000..c46ec493 --- /dev/null +++ b/snowy-admin-web/src/views/dev/log/vislog/detail.vue @@ -0,0 +1,41 @@ + + + diff --git a/snowy-admin-web/src/views/dev/log/vislog/index.vue b/snowy-admin-web/src/views/dev/log/vislog/index.vue new file mode 100644 index 00000000..1cbe2dd4 --- /dev/null +++ b/snowy-admin-web/src/views/dev/log/vislog/index.vue @@ -0,0 +1,141 @@ + + + diff --git a/snowy-admin-web/src/views/dev/log/vislog/lineChart.vue b/snowy-admin-web/src/views/dev/log/vislog/lineChart.vue new file mode 100644 index 00000000..98698e9e --- /dev/null +++ b/snowy-admin-web/src/views/dev/log/vislog/lineChart.vue @@ -0,0 +1,48 @@ + + + diff --git a/snowy-admin-web/src/views/dev/log/vislog/pieChart.vue b/snowy-admin-web/src/views/dev/log/vislog/pieChart.vue new file mode 100644 index 00000000..5a2bf912 --- /dev/null +++ b/snowy-admin-web/src/views/dev/log/vislog/pieChart.vue @@ -0,0 +1,33 @@ + + + diff --git a/snowy-admin-web/src/views/dev/message/detail.vue b/snowy-admin-web/src/views/dev/message/detail.vue new file mode 100644 index 00000000..2447c898 --- /dev/null +++ b/snowy-admin-web/src/views/dev/message/detail.vue @@ -0,0 +1,93 @@ + + + diff --git a/snowy-admin-web/src/views/dev/message/form.vue b/snowy-admin-web/src/views/dev/message/form.vue new file mode 100644 index 00000000..5311fc25 --- /dev/null +++ b/snowy-admin-web/src/views/dev/message/form.vue @@ -0,0 +1,137 @@ + + + diff --git a/snowy-admin-web/src/views/dev/message/index.vue b/snowy-admin-web/src/views/dev/message/index.vue new file mode 100644 index 00000000..04ed57cd --- /dev/null +++ b/snowy-admin-web/src/views/dev/message/index.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/snowy-admin-web/src/views/dev/monitor/index.vue b/snowy-admin-web/src/views/dev/monitor/index.vue new file mode 100644 index 00000000..dedab363 --- /dev/null +++ b/snowy-admin-web/src/views/dev/monitor/index.vue @@ -0,0 +1,189 @@ + + + + + diff --git a/snowy-admin-web/src/views/dev/sms/detail.vue b/snowy-admin-web/src/views/dev/sms/detail.vue new file mode 100644 index 00000000..5fa2e90f --- /dev/null +++ b/snowy-admin-web/src/views/dev/sms/detail.vue @@ -0,0 +1,65 @@ + + + diff --git a/snowy-admin-web/src/views/dev/sms/form.vue b/snowy-admin-web/src/views/dev/sms/form.vue new file mode 100644 index 00000000..4556e26d --- /dev/null +++ b/snowy-admin-web/src/views/dev/sms/form.vue @@ -0,0 +1,66 @@ + + + diff --git a/snowy-admin-web/src/views/dev/sms/index.vue b/snowy-admin-web/src/views/dev/sms/index.vue new file mode 100644 index 00000000..90295984 --- /dev/null +++ b/snowy-admin-web/src/views/dev/sms/index.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/snowy-admin-web/src/views/dev/sms/send/AliyunSmsSend.vue b/snowy-admin-web/src/views/dev/sms/send/AliyunSmsSend.vue new file mode 100644 index 00000000..bd2bd56f --- /dev/null +++ b/snowy-admin-web/src/views/dev/sms/send/AliyunSmsSend.vue @@ -0,0 +1,70 @@ + + + diff --git a/snowy-admin-web/src/views/dev/sms/send/TencentSmsSend.vue b/snowy-admin-web/src/views/dev/sms/send/TencentSmsSend.vue new file mode 100644 index 00000000..9fe83f25 --- /dev/null +++ b/snowy-admin-web/src/views/dev/sms/send/TencentSmsSend.vue @@ -0,0 +1,74 @@ + + + diff --git a/snowy-admin-web/src/views/exm/chart/eCBingZhuangTu.vue b/snowy-admin-web/src/views/exm/chart/eCBingZhuangTu.vue new file mode 100644 index 00000000..85293296 --- /dev/null +++ b/snowy-admin-web/src/views/exm/chart/eCBingZhuangTu.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/snowy-admin-web/src/views/exm/chart/eCHengTiaoTu.vue b/snowy-admin-web/src/views/exm/chart/eCHengTiaoTu.vue new file mode 100644 index 00000000..7ffdda13 --- /dev/null +++ b/snowy-admin-web/src/views/exm/chart/eCHengTiaoTu.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/snowy-admin-web/src/views/exm/chart/eCKXianTu.vue b/snowy-admin-web/src/views/exm/chart/eCKXianTu.vue new file mode 100644 index 00000000..1d45d109 --- /dev/null +++ b/snowy-admin-web/src/views/exm/chart/eCKXianTu.vue @@ -0,0 +1,22 @@ + + + + + + diff --git a/snowy-admin-web/src/views/exm/chart/eCLouDouTu.vue b/snowy-admin-web/src/views/exm/chart/eCLouDouTu.vue new file mode 100644 index 00000000..1ef490c3 --- /dev/null +++ b/snowy-admin-web/src/views/exm/chart/eCLouDouTu.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/snowy-admin-web/src/views/exm/chart/eCSanDianTu.vue b/snowy-admin-web/src/views/exm/chart/eCSanDianTu.vue new file mode 100644 index 00000000..0107650a --- /dev/null +++ b/snowy-admin-web/src/views/exm/chart/eCSanDianTu.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/snowy-admin-web/src/views/exm/chart/eCShuXingTu.vue b/snowy-admin-web/src/views/exm/chart/eCShuXingTu.vue new file mode 100644 index 00000000..698ddfdc --- /dev/null +++ b/snowy-admin-web/src/views/exm/chart/eCShuXingTu.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/snowy-admin-web/src/views/exm/chart/eCXianXingTu.vue b/snowy-admin-web/src/views/exm/chart/eCXianXingTu.vue new file mode 100644 index 00000000..ae35a2bc --- /dev/null +++ b/snowy-admin-web/src/views/exm/chart/eCXianXingTu.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/snowy-admin-web/src/views/exm/chart/eCYiBiaoTu.vue b/snowy-admin-web/src/views/exm/chart/eCYiBiaoTu.vue new file mode 100644 index 00000000..b65c57f0 --- /dev/null +++ b/snowy-admin-web/src/views/exm/chart/eCYiBiaoTu.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/snowy-admin-web/src/views/exm/chart/eCZheZhuTu.vue b/snowy-admin-web/src/views/exm/chart/eCZheZhuTu.vue new file mode 100644 index 00000000..c4afc182 --- /dev/null +++ b/snowy-admin-web/src/views/exm/chart/eCZheZhuTu.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/snowy-admin-web/src/views/exm/chart/eCZhuZhuangTu.vue b/snowy-admin-web/src/views/exm/chart/eCZhuZhuangTu.vue new file mode 100644 index 00000000..33c837b5 --- /dev/null +++ b/snowy-admin-web/src/views/exm/chart/eCZhuZhuangTu.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/snowy-admin-web/src/views/exm/chart/g2BingZhuangTu.vue b/snowy-admin-web/src/views/exm/chart/g2BingZhuangTu.vue new file mode 100644 index 00000000..f7a31187 --- /dev/null +++ b/snowy-admin-web/src/views/exm/chart/g2BingZhuangTu.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/snowy-admin-web/src/views/exm/chart/g2CiYunTu.vue b/snowy-admin-web/src/views/exm/chart/g2CiYunTu.vue new file mode 100644 index 00000000..fb05744b --- /dev/null +++ b/snowy-admin-web/src/views/exm/chart/g2CiYunTu.vue @@ -0,0 +1,18 @@ + + + + + diff --git a/snowy-admin-web/src/views/exm/chart/g2JinDuTu.vue b/snowy-admin-web/src/views/exm/chart/g2JinDuTu.vue new file mode 100644 index 00000000..d622de9e --- /dev/null +++ b/snowy-admin-web/src/views/exm/chart/g2JinDuTu.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/snowy-admin-web/src/views/exm/chart/g2LouDouTu.vue b/snowy-admin-web/src/views/exm/chart/g2LouDouTu.vue new file mode 100644 index 00000000..5c66acc6 --- /dev/null +++ b/snowy-admin-web/src/views/exm/chart/g2LouDouTu.vue @@ -0,0 +1,18 @@ + + + + + diff --git a/snowy-admin-web/src/views/exm/chart/g2MianJiTu.vue b/snowy-admin-web/src/views/exm/chart/g2MianJiTu.vue new file mode 100644 index 00000000..06cb1426 --- /dev/null +++ b/snowy-admin-web/src/views/exm/chart/g2MianJiTu.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/snowy-admin-web/src/views/exm/chart/g2SanDianTu.vue b/snowy-admin-web/src/views/exm/chart/g2SanDianTu.vue new file mode 100644 index 00000000..f9ba8176 --- /dev/null +++ b/snowy-admin-web/src/views/exm/chart/g2SanDianTu.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/snowy-admin-web/src/views/exm/chart/g2TiaoXingTu.vue b/snowy-admin-web/src/views/exm/chart/g2TiaoXingTu.vue new file mode 100644 index 00000000..98456423 --- /dev/null +++ b/snowy-admin-web/src/views/exm/chart/g2TiaoXingTu.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/snowy-admin-web/src/views/exm/chart/g2ZheXianTu.vue b/snowy-admin-web/src/views/exm/chart/g2ZheXianTu.vue new file mode 100644 index 00000000..e208544e --- /dev/null +++ b/snowy-admin-web/src/views/exm/chart/g2ZheXianTu.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/snowy-admin-web/src/views/exm/chart/g2ZhuZhuangTu.vue b/snowy-admin-web/src/views/exm/chart/g2ZhuZhuangTu.vue new file mode 100644 index 00000000..28d56ad7 --- /dev/null +++ b/snowy-admin-web/src/views/exm/chart/g2ZhuZhuangTu.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/snowy-admin-web/src/views/exm/chart/g2ZiDanTu.vue b/snowy-admin-web/src/views/exm/chart/g2ZiDanTu.vue new file mode 100644 index 00000000..45b9236e --- /dev/null +++ b/snowy-admin-web/src/views/exm/chart/g2ZiDanTu.vue @@ -0,0 +1,18 @@ + + + + + diff --git a/snowy-admin-web/src/views/exm/editor/index.vue b/snowy-admin-web/src/views/exm/editor/index.vue new file mode 100644 index 00000000..4ec42ca5 --- /dev/null +++ b/snowy-admin-web/src/views/exm/editor/index.vue @@ -0,0 +1,10 @@ + + + diff --git a/snowy-admin-web/src/views/exm/iconSelect/index.vue b/snowy-admin-web/src/views/exm/iconSelect/index.vue new file mode 100644 index 00000000..047631ac --- /dev/null +++ b/snowy-admin-web/src/views/exm/iconSelect/index.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/snowy-admin-web/src/views/exm/nestRoutor/index.vue b/snowy-admin-web/src/views/exm/nestRoutor/index.vue new file mode 100644 index 00000000..cf0908d9 --- /dev/null +++ b/snowy-admin-web/src/views/exm/nestRoutor/index.vue @@ -0,0 +1,25 @@ + + + diff --git a/snowy-admin-web/src/views/index/components/carousel.vue b/snowy-admin-web/src/views/index/components/carousel.vue new file mode 100644 index 00000000..fff59f34 --- /dev/null +++ b/snowy-admin-web/src/views/index/components/carousel.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/snowy-admin-web/src/views/index/components/miniMessage.vue b/snowy-admin-web/src/views/index/components/miniMessage.vue new file mode 100644 index 00000000..60fb2146 --- /dev/null +++ b/snowy-admin-web/src/views/index/components/miniMessage.vue @@ -0,0 +1,137 @@ + + + + + diff --git a/snowy-admin-web/src/views/index/components/opLog.vue b/snowy-admin-web/src/views/index/components/opLog.vue new file mode 100644 index 00000000..30e99c5a --- /dev/null +++ b/snowy-admin-web/src/views/index/components/opLog.vue @@ -0,0 +1,58 @@ + + + + diff --git a/snowy-admin-web/src/views/index/components/schedule.vue b/snowy-admin-web/src/views/index/components/schedule.vue new file mode 100644 index 00000000..c48f6ece --- /dev/null +++ b/snowy-admin-web/src/views/index/components/schedule.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/snowy-admin-web/src/views/index/components/shortcut.vue b/snowy-admin-web/src/views/index/components/shortcut.vue new file mode 100644 index 00000000..52c92d05 --- /dev/null +++ b/snowy-admin-web/src/views/index/components/shortcut.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/snowy-admin-web/src/views/index/components/userInfo.vue b/snowy-admin-web/src/views/index/components/userInfo.vue new file mode 100644 index 00000000..8163b08f --- /dev/null +++ b/snowy-admin-web/src/views/index/components/userInfo.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/snowy-admin-web/src/views/index/components/visLog.vue b/snowy-admin-web/src/views/index/components/visLog.vue new file mode 100644 index 00000000..bcf4b8cb --- /dev/null +++ b/snowy-admin-web/src/views/index/components/visLog.vue @@ -0,0 +1,65 @@ + + + + diff --git a/snowy-admin-web/src/views/index/index.vue b/snowy-admin-web/src/views/index/index.vue new file mode 100644 index 00000000..aced998e --- /dev/null +++ b/snowy-admin-web/src/views/index/index.vue @@ -0,0 +1,32 @@ + + + diff --git a/snowy-admin-web/src/views/other/index.vue b/snowy-admin-web/src/views/other/index.vue new file mode 100644 index 00000000..c65f3109 --- /dev/null +++ b/snowy-admin-web/src/views/other/index.vue @@ -0,0 +1,9 @@ + + + diff --git a/snowy-admin-web/src/views/sys/org/form.vue b/snowy-admin-web/src/views/sys/org/form.vue new file mode 100644 index 00000000..a6f53bdb --- /dev/null +++ b/snowy-admin-web/src/views/sys/org/form.vue @@ -0,0 +1,175 @@ + + + diff --git a/snowy-admin-web/src/views/sys/org/index.vue b/snowy-admin-web/src/views/sys/org/index.vue new file mode 100644 index 00000000..4e242ff7 --- /dev/null +++ b/snowy-admin-web/src/views/sys/org/index.vue @@ -0,0 +1,208 @@ + + + + + diff --git a/snowy-admin-web/src/views/sys/position/form.vue b/snowy-admin-web/src/views/sys/position/form.vue new file mode 100644 index 00000000..301df2cc --- /dev/null +++ b/snowy-admin-web/src/views/sys/position/form.vue @@ -0,0 +1,127 @@ + + + diff --git a/snowy-admin-web/src/views/sys/position/index.vue b/snowy-admin-web/src/views/sys/position/index.vue new file mode 100644 index 00000000..c5c05fb0 --- /dev/null +++ b/snowy-admin-web/src/views/sys/position/index.vue @@ -0,0 +1,206 @@ + + + + + diff --git a/snowy-admin-web/src/views/sys/resource/button/form.vue b/snowy-admin-web/src/views/sys/resource/button/form.vue new file mode 100644 index 00000000..8ffab37d --- /dev/null +++ b/snowy-admin-web/src/views/sys/resource/button/form.vue @@ -0,0 +1,80 @@ + + + diff --git a/snowy-admin-web/src/views/sys/resource/button/index.vue b/snowy-admin-web/src/views/sys/resource/button/index.vue new file mode 100644 index 00000000..70a5c36b --- /dev/null +++ b/snowy-admin-web/src/views/sys/resource/button/index.vue @@ -0,0 +1,109 @@ + + + diff --git a/snowy-admin-web/src/views/sys/resource/field/form.vue b/snowy-admin-web/src/views/sys/resource/field/form.vue new file mode 100644 index 00000000..a60aa386 --- /dev/null +++ b/snowy-admin-web/src/views/sys/resource/field/form.vue @@ -0,0 +1,84 @@ + + + diff --git a/snowy-admin-web/src/views/sys/resource/field/index.vue b/snowy-admin-web/src/views/sys/resource/field/index.vue new file mode 100644 index 00000000..6db69d39 --- /dev/null +++ b/snowy-admin-web/src/views/sys/resource/field/index.vue @@ -0,0 +1,108 @@ + + + diff --git a/snowy-admin-web/src/views/sys/resource/menu/changeModuleForm.vue b/snowy-admin-web/src/views/sys/resource/menu/changeModuleForm.vue new file mode 100644 index 00000000..e18a68f1 --- /dev/null +++ b/snowy-admin-web/src/views/sys/resource/menu/changeModuleForm.vue @@ -0,0 +1,93 @@ + + + diff --git a/snowy-admin-web/src/views/sys/resource/menu/form.vue b/snowy-admin-web/src/views/sys/resource/menu/form.vue new file mode 100644 index 00000000..0619ccfe --- /dev/null +++ b/snowy-admin-web/src/views/sys/resource/menu/form.vue @@ -0,0 +1,235 @@ + + + diff --git a/snowy-admin-web/src/views/sys/resource/menu/index.vue b/snowy-admin-web/src/views/sys/resource/menu/index.vue new file mode 100644 index 00000000..da12ee3e --- /dev/null +++ b/snowy-admin-web/src/views/sys/resource/menu/index.vue @@ -0,0 +1,261 @@ + + + + + diff --git a/snowy-admin-web/src/views/sys/resource/module/form.vue b/snowy-admin-web/src/views/sys/resource/module/form.vue new file mode 100644 index 00000000..d69ba477 --- /dev/null +++ b/snowy-admin-web/src/views/sys/resource/module/form.vue @@ -0,0 +1,91 @@ + + + diff --git a/snowy-admin-web/src/views/sys/resource/module/index.vue b/snowy-admin-web/src/views/sys/resource/module/index.vue new file mode 100644 index 00000000..5c456294 --- /dev/null +++ b/snowy-admin-web/src/views/sys/resource/module/index.vue @@ -0,0 +1,139 @@ + + + diff --git a/snowy-admin-web/src/views/sys/resource/spa/form.vue b/snowy-admin-web/src/views/sys/resource/spa/form.vue new file mode 100644 index 00000000..34edfb01 --- /dev/null +++ b/snowy-admin-web/src/views/sys/resource/spa/form.vue @@ -0,0 +1,175 @@ + + + diff --git a/snowy-admin-web/src/views/sys/resource/spa/index.vue b/snowy-admin-web/src/views/sys/resource/spa/index.vue new file mode 100644 index 00000000..afa6a2f4 --- /dev/null +++ b/snowy-admin-web/src/views/sys/resource/spa/index.vue @@ -0,0 +1,196 @@ + + + + + diff --git a/snowy-admin-web/src/views/sys/role/form.vue b/snowy-admin-web/src/views/sys/role/form.vue new file mode 100644 index 00000000..888e0320 --- /dev/null +++ b/snowy-admin-web/src/views/sys/role/form.vue @@ -0,0 +1,124 @@ + + + diff --git a/snowy-admin-web/src/views/sys/role/grantPermissionForm.vue b/snowy-admin-web/src/views/sys/role/grantPermissionForm.vue new file mode 100644 index 00000000..b8f3fcca --- /dev/null +++ b/snowy-admin-web/src/views/sys/role/grantPermissionForm.vue @@ -0,0 +1,337 @@ + + + + + diff --git a/snowy-admin-web/src/views/sys/role/grantResourceForm.vue b/snowy-admin-web/src/views/sys/role/grantResourceForm.vue new file mode 100644 index 00000000..d30171c1 --- /dev/null +++ b/snowy-admin-web/src/views/sys/role/grantResourceForm.vue @@ -0,0 +1,311 @@ + + + + + diff --git a/snowy-admin-web/src/views/sys/role/index.vue b/snowy-admin-web/src/views/sys/role/index.vue new file mode 100644 index 00000000..4255f197 --- /dev/null +++ b/snowy-admin-web/src/views/sys/role/index.vue @@ -0,0 +1,279 @@ + + + + + diff --git a/snowy-admin-web/src/views/sys/role/scopeDefineOrg.vue b/snowy-admin-web/src/views/sys/role/scopeDefineOrg.vue new file mode 100644 index 00000000..1812f983 --- /dev/null +++ b/snowy-admin-web/src/views/sys/role/scopeDefineOrg.vue @@ -0,0 +1,112 @@ + + + + + diff --git a/snowy-admin-web/src/views/sys/user/form.vue b/snowy-admin-web/src/views/sys/user/form.vue new file mode 100644 index 00000000..bff917b4 --- /dev/null +++ b/snowy-admin-web/src/views/sys/user/form.vue @@ -0,0 +1,567 @@ + + + + + diff --git a/snowy-admin-web/src/views/sys/user/index.vue b/snowy-admin-web/src/views/sys/user/index.vue new file mode 100644 index 00000000..607f3dd9 --- /dev/null +++ b/snowy-admin-web/src/views/sys/user/index.vue @@ -0,0 +1,326 @@ + + + + + diff --git a/snowy-admin-web/src/views/sys/user/userCenter.vue b/snowy-admin-web/src/views/sys/user/userCenter.vue new file mode 100644 index 00000000..4f0a7797 --- /dev/null +++ b/snowy-admin-web/src/views/sys/user/userCenter.vue @@ -0,0 +1,234 @@ + + + + + diff --git a/snowy-admin-web/src/views/sys/user/userTab/accountBasic.vue b/snowy-admin-web/src/views/sys/user/userTab/accountBasic.vue new file mode 100644 index 00000000..06363ff4 --- /dev/null +++ b/snowy-admin-web/src/views/sys/user/userTab/accountBasic.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/snowy-admin-web/src/views/sys/user/userTab/accountBind.vue b/snowy-admin-web/src/views/sys/user/userTab/accountBind.vue new file mode 100644 index 00000000..6ca7cff2 --- /dev/null +++ b/snowy-admin-web/src/views/sys/user/userTab/accountBind.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/snowy-admin-web/src/views/sys/user/userTab/bindForm/updatePassword.vue b/snowy-admin-web/src/views/sys/user/userTab/bindForm/updatePassword.vue new file mode 100644 index 00000000..c5f282c9 --- /dev/null +++ b/snowy-admin-web/src/views/sys/user/userTab/bindForm/updatePassword.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/snowy-admin-web/src/views/sys/user/userTab/organizationChart.vue b/snowy-admin-web/src/views/sys/user/userTab/organizationChart.vue new file mode 100644 index 00000000..e604b105 --- /dev/null +++ b/snowy-admin-web/src/views/sys/user/userTab/organizationChart.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/snowy-admin-web/src/views/sys/user/userTab/shortcutSetting.vue b/snowy-admin-web/src/views/sys/user/userTab/shortcutSetting.vue new file mode 100644 index 00000000..18441029 --- /dev/null +++ b/snowy-admin-web/src/views/sys/user/userTab/shortcutSetting.vue @@ -0,0 +1,64 @@ + + + + + diff --git a/snowy-admin-web/src/views/sys/user/userTab/userMessage.vue b/snowy-admin-web/src/views/sys/user/userTab/userMessage.vue new file mode 100644 index 00000000..6e0b63b0 --- /dev/null +++ b/snowy-admin-web/src/views/sys/user/userTab/userMessage.vue @@ -0,0 +1,80 @@ + + + diff --git a/snowy-admin-web/src/views/sys/user/userTab/userMessage/detail.vue b/snowy-admin-web/src/views/sys/user/userTab/userMessage/detail.vue new file mode 100644 index 00000000..eac4dc9e --- /dev/null +++ b/snowy-admin-web/src/views/sys/user/userTab/userMessage/detail.vue @@ -0,0 +1,93 @@ + + + diff --git a/snowy-admin-web/tailwind.config.js b/snowy-admin-web/tailwind.config.js new file mode 100644 index 00000000..6f506f7d --- /dev/null +++ b/snowy-admin-web/tailwind.config.js @@ -0,0 +1,67 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +const generatePrimaryColors = () => { + const result = { + primary: `var(--primary-color)` + } + for (let i = 0; i < 10; i++) { + result[`primary-${i}`] = `var(--primary-${i})` + } + return result +} + +const generateFontSize = () => { + const result = {} + for (let i = 10; i < 32; i++) { + result[i] = `${i}px` + } + return result +} + +const colors = require('tailwindcss/colors') + +module.exports = { + content: ['./src/**/*.vue', './src/**/*.js'], + darkMode: 'class', // or 'media' or 'class' + corePlugins: { + preflight: false + }, + theme: { + extend: {}, + colors: { + transparent: 'transparent', + current: 'currentColor', + black: colors.black, + white: colors.white, + gray: colors.neutral, + indigo: colors.indigo, + red: colors.rose, + yellow: colors.amber, + ...generatePrimaryColors() + }, + fontWeight: { + 1: 100, + 2: 200, + 3: 300, + 4: 400, + 5: 500, + 6: 600, + 7: 700, + 8: 800, + 9: 900 + }, + fontSize: { + ...generateFontSize() + } + }, + variants: {}, + plugins: [] +} diff --git a/snowy-admin-web/vite.config.js b/snowy-admin-web/vite.config.js new file mode 100644 index 00000000..b9b019a5 --- /dev/null +++ b/snowy-admin-web/vite.config.js @@ -0,0 +1,119 @@ +/** + * Copyright [2022] [https://www.xiaonuo.vip] + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +import { resolve } from 'path' +import { defineConfig, loadEnv } from 'vite' +import vue from '@vitejs/plugin-vue' +import Components from 'unplugin-vue-components/vite' +import VueJSX from '@vitejs/plugin-vue-jsx' +import AutoImport from 'unplugin-auto-import/vite' +import vueSetupExtend from 'vite-plugin-vue-setup-extend' +import { visualizer } from 'rollup-plugin-visualizer' +import antdDayjs from 'antd-dayjs-vite-plugin' +import Less2CssVariablePlugin from 'antd-less-to-css-variable' + +export const r = (...args) => resolve(__dirname, '.', ...args) + +const removeModulePreloadPlugin = (keys) => { + if (!keys || !keys.length) { + return + } + return { + name: 'remove-module-preload', + transformIndexHtml: { + enforce: 'after', + transform(html, ctx) { + let result = html + keys.forEach((key) => { + result = result.replace(new RegExp(` { + const envConfig = loadEnv(mode, './') + + const alias = { + '~': `${resolve(__dirname, './')}`, + '@/': `${resolve(__dirname, 'src')}/` + } + + return { + server: { + port: envConfig.VITE_PORT, + proxy: { + '/api': { + target: envConfig.VITE_API_BASEURL, + ws: false, + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, '') + } + } + }, + resolve: { + alias + }, + // 解决警告You are running the esm-bundler build of vue-i18n. + define: { + __VUE_I18N_FULL_INSTALL__: true, + __VUE_I18N_LEGACY_API__: true, + __VUE_I18N_PROD_DEVTOOLS__: true + }, + build: { + // sourcemap: true, + manifest: true, + brotliSize: false, + rollupOptions: { + output: { + manualChunks: { + echarts: ['echarts'], + 'ant-design-vue': ['ant-design-vue'], + vue: ['vue', 'vue-router', 'vuex', 'vue-i18n'] + } + } + }, + chunkSizeWarningLimit: 1000 + }, + plugins: [ + vue({ + script: { + refTransform: true + } + }), + vueSetupExtend(), + VueJSX(), + AutoImport({ + imports: ['vue'], + dirs: ['./src/utils/permission'], + dts: r('src/auto-imports.d.ts') + }), + // 组件按需引入 + Components({ + dirs: [r('src/components')], + dts: false, + resolvers: [] + }), + antdDayjs(), + visualizer() + ], + css: { + preprocessorOptions: { + less: { + javascriptEnabled: true, + plugins: [new Less2CssVariablePlugin()] + } + } + }, + optimizeDeps: {} + } +}) diff --git a/snowy-common/READM.md b/snowy-common/READM.md new file mode 100644 index 00000000..460f7670 --- /dev/null +++ b/snowy-common/READM.md @@ -0,0 +1 @@ +# 基础通用模块 \ No newline at end of file diff --git a/snowy-common/pom.xml b/snowy-common/pom.xml new file mode 100644 index 00000000..0b580dc1 --- /dev/null +++ b/snowy-common/pom.xml @@ -0,0 +1,131 @@ + + + 4.0.0 + + + vip.xiaonuo + snowy + 2.0.0 + + + snowy-common + jar + 基础通用模块 + + + 1.18.22 + 1.2.8 + 3.5.1 + 2.11.1 + 5.7.22 + 2.5.1 + 2.6.3 + 2.0.9 + 4.3.0 + 0.3.2 + + + + + + org.springframework.boot + spring-boot-starter-validation + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-aop + + + + + org.springframework.boot + spring-boot-configuration-processor + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + org.projectlombok + lombok + ${lombok.versin} + + + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis.plus.version} + + + + + org.apache.commons + commons-pool2 + ${commons.pool2.version} + + + + + cn.hutool + hutool-all + ${hutool.version} + + + + + com.belerweb + pinyin4j + ${pinyin.version} + + + + + org.lionsoul + ip2region + ${ip2region.version} + + + + + com.github.xiaoymin + knife4j-spring-boot-starter + ${knife4j.version} + + + + + cn.afterturn + easypoi-spring-boot-starter + ${easypoi.version} + + + + + com.antherd + sm-crypto + ${smcrypto.version} + + + diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/annotation/CommonLog.java b/snowy-common/src/main/java/vip/xiaonuo/common/annotation/CommonLog.java new file mode 100644 index 00000000..eebaa706 --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/annotation/CommonLog.java @@ -0,0 +1,32 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.annotation; + +import java.lang.annotation.*; + +/** + * 自定义日志注解 + * + * @author xuyuxiang + * @date 2022/6/20 14:25 + **/ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface CommonLog { + + /** + * 日志的名称,例如:"修改菜单" + */ + String value() default "未命名"; +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/annotation/CommonNoRepeat.java b/snowy-common/src/main/java/vip/xiaonuo/common/annotation/CommonNoRepeat.java new file mode 100644 index 00000000..704f4ff2 --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/annotation/CommonNoRepeat.java @@ -0,0 +1,32 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.annotation; + +import java.lang.annotation.*; + +/** + * 自定义节流防抖注解 + * + * @author xuyuxiang + * @date 2022/6/20 14:25 + **/ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface CommonNoRepeat { + + /** + * 间隔时间(ms),小于此时间视为重复提交,默认5000ms + */ + int interval() default 5000; +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/annotation/CommonWrapper.java b/snowy-common/src/main/java/vip/xiaonuo/common/annotation/CommonWrapper.java new file mode 100644 index 00000000..6341e0e9 --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/annotation/CommonWrapper.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.annotation; + +import vip.xiaonuo.common.pojo.CommonWrapperInterface; + +import java.lang.annotation.*; + +/** + * 自定义包装注解,对响应结果包装 + * + * @author xuyuxiang + * @date 2022/9/15 21:12 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +@Documented +public @interface CommonWrapper { + + /** + * 具体包装类 + */ + Class>[] value(); +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/cache/CommonCacheOperator.java b/snowy-common/src/main/java/vip/xiaonuo/common/cache/CommonCacheOperator.java new file mode 100644 index 00000000..fa060e55 --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/cache/CommonCacheOperator.java @@ -0,0 +1,86 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.cache; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * 通用Redis缓存操作器 + * + * @author xuyuxiang + * @date 2022/6/21 16:00 + **/ +@Component +public class CommonCacheOperator { + + /** 所有缓存Key的前缀 */ + private static final String CACHE_KEY_PREFIX = "Cache:"; + + @Resource + private RedisTemplate redisTemplate; + + public void put(String key, Object value) { + redisTemplate.boundValueOps(CACHE_KEY_PREFIX + key).set(value); + } + + public void put(String key, Object value, long timeoutSeconds) { + redisTemplate.boundValueOps(CACHE_KEY_PREFIX + key).set(value, timeoutSeconds, TimeUnit.SECONDS); + } + + public Object get(String key) { + return redisTemplate.boundValueOps(CACHE_KEY_PREFIX + key).get(); + } + + public void remove(String... key) { + ArrayList keys = CollectionUtil.toList(key); + List withPrefixKeys = keys.stream().map(i -> CACHE_KEY_PREFIX + i).collect(Collectors.toList()); + redisTemplate.delete(withPrefixKeys); + } + + public Collection getAllKeys() { + Set keys = redisTemplate.keys(CACHE_KEY_PREFIX + "*"); + if (keys != null) { + // 去掉缓存key的common prefix前缀 + return keys.stream().map(key -> StrUtil.removePrefix(key, CACHE_KEY_PREFIX)).collect(Collectors.toSet()); + } else { + return CollectionUtil.newHashSet(); + } + } + + public Collection getAllValues() { + Set keys = redisTemplate.keys(CACHE_KEY_PREFIX + "*"); + if (keys != null) { + return redisTemplate.opsForValue().multiGet(keys); + } else { + return CollectionUtil.newArrayList(); + } + } + + public Map getAllKeyValues() { + Collection allKeys = this.getAllKeys(); + HashMap results = MapUtil.newHashMap(); + for (String key : allKeys) { + results.put(key, this.get(key)); + } + return results; + } +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/enums/CommonDeleteFlagEnum.java b/snowy-common/src/main/java/vip/xiaonuo/common/enums/CommonDeleteFlagEnum.java new file mode 100644 index 00000000..e05890b1 --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/enums/CommonDeleteFlagEnum.java @@ -0,0 +1,31 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.enums; + +import lombok.Getter; + +/** + * 通用删除标志枚举 + * + * @author xuyuxiang + * @date 2021/10/11 14:02 + **/ +@Getter +public enum CommonDeleteFlagEnum { + + /** 未删除 */ + NOT_DELETE, + + /** 已删除 */ + DELETED +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/enums/CommonExceptionEnum.java b/snowy-common/src/main/java/vip/xiaonuo/common/enums/CommonExceptionEnum.java new file mode 100644 index 00000000..50362f55 --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/enums/CommonExceptionEnum.java @@ -0,0 +1,42 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.enums; + +import lombok.Getter; + +/** + * + * + * @author xuyuxiang + * @date 2022/8/15 16:09 + **/ +@Getter +public enum CommonExceptionEnum { + + OK200(200, "请求成功"), + ERROR401(401, "未登录"), + ERROR403(403, "无权限"), + ERROR404(404, "路径不存在"), + ERROR405(405, "请求方法不正确"), + ERROR415(415, "参数传递异常"), + ERROR500(500, "业务异常"); + + private final Integer code; + + private final String message; + + CommonExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/enums/CommonSortOrderEnum.java b/snowy-common/src/main/java/vip/xiaonuo/common/enums/CommonSortOrderEnum.java new file mode 100644 index 00000000..4262d9a5 --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/enums/CommonSortOrderEnum.java @@ -0,0 +1,45 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.enums; + +import lombok.Getter; +import vip.xiaonuo.common.exception.CommonException; + +/** + * 通用排序方式枚举 + * + * @author xuyuxiang + * @date 2022/7/13 17:48 + **/ +@Getter +public enum CommonSortOrderEnum { + + /** 升序 */ + ASC("ASCEND"), + + /** 降序 */ + DESC("DESCEND"); + + private final String value; + + CommonSortOrderEnum(String value) { + this.value = value; + } + + public static void validate(String value) { + boolean flag = ASC.getValue().toLowerCase().equals(value) || DESC.getValue().toLowerCase().equals(value); + if(!flag) { + throw new CommonException("不支持该排序方式:{}", value); + } + } +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/exception/CommonException.java b/snowy-common/src/main/java/vip/xiaonuo/common/exception/CommonException.java new file mode 100644 index 00000000..bfcae0b9 --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/exception/CommonException.java @@ -0,0 +1,50 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.exception; + +import cn.hutool.core.util.StrUtil; +import lombok.Getter; +import lombok.Setter; + +/** + * 通用异常 + * + * @author xuyuxiang + * @date 2020/4/8 15:54 + */ +@Getter +@Setter +public class CommonException extends RuntimeException { + + private Integer code; + + private String msg; + + public CommonException() { + super("服务器异常"); + this.code = 500; + this.msg = "服务器异常"; + } + + public CommonException(String msg, Object... arguments) { + super(StrUtil.format(msg, arguments)); + this.code = 500; + this.msg = StrUtil.format(msg, arguments); + } + + public CommonException(Integer code, String msg, Object... arguments) { + super(StrUtil.format(msg, arguments)); + this.code = code; + this.msg = StrUtil.format(msg, arguments); + } +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/page/CommonPageRequest.java b/snowy-common/src/main/java/vip/xiaonuo/common/page/CommonPageRequest.java new file mode 100644 index 00000000..7bea6ceb --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/page/CommonPageRequest.java @@ -0,0 +1,77 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.page; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import vip.xiaonuo.common.util.CommonServletUtil; + +import java.util.List; + +/** + * 通用分页请求 + * + * @author xuyuxiang + * @date 2021/12/18 14:43 + */ +public class CommonPageRequest { + + private static final String PAGE_SIZE_PARAM_NAME = "size"; + + private static final String PAGE_PARAM_NAME = "current"; + + private static final Integer PAGE_SIZE_MAX_VALUE = 100; + + public static Page defaultPage() { + return defaultPage(null); + } + + public static Page defaultPage(List orderItemList) { + + int size = 20; + + int page = 1; + + //每页条数 + String pageSizeString = CommonServletUtil.getParamFromRequest(PAGE_SIZE_PARAM_NAME); + if (ObjectUtil.isNotEmpty(pageSizeString)) { + try { + size = Convert.toInt(pageSizeString); + if(size > PAGE_SIZE_MAX_VALUE) { + size = PAGE_SIZE_MAX_VALUE; + } + } catch (Exception e) { + e.printStackTrace(); + size = 20; + } + } + + //第几页 + String pageString = CommonServletUtil.getParamFromRequest(PAGE_PARAM_NAME); + if (ObjectUtil.isNotEmpty(pageString)) { + try { + page = Convert.toInt(pageString); + } catch (Exception e) { + e.printStackTrace(); + page = 1; + } + } + Page objectPage = new Page<>(page, size); + if (ObjectUtil.isNotEmpty(orderItemList)) { + objectPage.setOrders(orderItemList); + } + return objectPage; + } +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/pojo/CommonEntity.java b/snowy-common/src/main/java/vip/xiaonuo/common/pojo/CommonEntity.java new file mode 100644 index 00000000..7afdf43c --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/pojo/CommonEntity.java @@ -0,0 +1,63 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.pojo; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableLogic; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 通用基础字段实体:创建时间、创建人、修改时间、修改人,需要此通用字段的实体可继承此类, + * 继承此类要求数据表有对应的字段 + *

+ * + * @author xuyuxiang + * @date 2020/3/10 16:02 + */ +@Getter +@Setter +public class CommonEntity implements Serializable { + + /** 删除标志 */ + @TableLogic + @ApiModelProperty(value = "删除标志", position = 999) + @TableField(fill = FieldFill.INSERT) + private String deleteFlag; + + /** 创建时间 */ + @ApiModelProperty(value = "创建时间", position = 1000) + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** 创建人 */ + @ApiModelProperty(value = "创建人", position = 1001) + @TableField(fill = FieldFill.INSERT) + private String createUser; + + /** 更新时间 */ + @ApiModelProperty(value = "更新时间", position = 1002) + @TableField(fill = FieldFill.UPDATE) + private Date updateTime; + + /** 更新人 */ + @ApiModelProperty(value = "更新人", position = 1003) + @TableField(fill = FieldFill.UPDATE) + private String updateUser; +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/pojo/CommonResult.java b/snowy-common/src/main/java/vip/xiaonuo/common/pojo/CommonResult.java new file mode 100644 index 00000000..80667cac --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/pojo/CommonResult.java @@ -0,0 +1,160 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.pojo; + +import io.swagger.annotations.ApiModelProperty; +import springfox.documentation.builders.ResponseMessageBuilder; +import springfox.documentation.service.ResponseMessage; +import vip.xiaonuo.common.enums.CommonExceptionEnum; + +import java.io.Serializable; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 对Ajax请求返回Json格式数据的简易封装 + * + * @author xuyuxiang + * @date 2022/8/15 16:08 + **/ +public class CommonResult implements Serializable{ + private static final long serialVersionUID = 1L; + public static final int CODE_SUCCESS = 200; + public static final int CODE_ERROR = 500; + + @ApiModelProperty(value = "状态码") + private int code; + + @ApiModelProperty(value = "提示语") + private String msg; + + @ApiModelProperty(value = "返回数据") + private T data; + + public CommonResult() { + } + + public CommonResult(int code, String msg, T data) { + this.setCode(code); + this.setMsg(msg); + this.setData(data); + } + + /** + * 获取code + * @return code + */ + public Integer getCode() { + return this.code; + } + + /** + * 获取msg + * @return msg + */ + public String getMsg() { + return this.msg; + } + /** + * 获取data + * @return data + */ + public T getData() { + return this.data; + } + + /** + * 给code赋值,连缀风格 + * @param code code + * @return 对象自身 + */ + public CommonResult setCode(int code) { + this.code = code; + return this; + } + + /** + * 给msg赋值,连缀风格 + * @param msg msg + * @return 对象自身 + */ + public CommonResult setMsg(String msg) { + this.msg = msg; + return this; + } + + /** + * 给data赋值,连缀风格 + * @param data data + * @return 对象自身 + */ + public CommonResult setData(T data) { + this.data = data; + return this; + } + + + // ============================ 构建 ================================== + + // 构建成功 + public static CommonResult ok() { + return new CommonResult<>(CODE_SUCCESS, "操作成功", null); + } + public static CommonResult ok(String msg) { + return new CommonResult<>(CODE_SUCCESS, msg, null); + } + public static CommonResult code(int code) { + return new CommonResult<>(code, null, null); + } + public static CommonResult data(T data) { + return new CommonResult<>(CODE_SUCCESS, "操作成功", data); + } + + // 构建失败 + public static CommonResult error() { + return new CommonResult<>(CODE_ERROR, "服务器异常", null); + } + public static CommonResult error(String msg) { + return new CommonResult<>(CODE_ERROR, msg, null); + } + + // 构建指定状态码 + public static CommonResult get(int code, String msg, T data) { + return new CommonResult<>(code, msg, data); + } + + /* + * toString() + */ + @Override + public String toString() { + return "{" + + "\"code\": " + this.getCode() + + ", \"msg\": \"" + this.getMsg() + "\"" + + ", \"data\": \"" + this.getData() + "\"" + + "}"; + } + + /** + * 响应状态码集合 + * + * @author xuyuxiang + * @date 2022/7/25 13:36 + **/ + public static List responseList() { + return Arrays.stream(CommonExceptionEnum.values()).map(commonExceptionEnum -> new ResponseMessageBuilder() + .code(commonExceptionEnum.getCode()).message(commonExceptionEnum.getMessage()).build()) + .collect(Collectors.toList()); + } +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/pojo/CommonValidList.java b/snowy-common/src/main/java/vip/xiaonuo/common/pojo/CommonValidList.java new file mode 100644 index 00000000..4a14692a --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/pojo/CommonValidList.java @@ -0,0 +1,146 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.pojo; + +import lombok.Data; + +import javax.validation.Valid; +import java.util.*; + +/** + * 可被校验的通用List + * + * @author xuyuxiang + * @date 2022/7/28 16:08 + **/ +@Data +public class CommonValidList implements List { + + @Valid + private List list = new LinkedList<>(); + + @Override + public int size() { + return list.size(); + } + + @Override + public boolean isEmpty() { + return list.isEmpty(); + } + + @Override + public boolean contains(Object o) { + return list.contains(o); + } + + @Override + public Iterator iterator() { + return list.iterator(); + } + + @Override + public Object[] toArray() { + return list.toArray(); + } + + @Override + public T[] toArray(T[] a) { + return list.toArray(a); + } + + @Override + public boolean add(E e) { + return list.add(e); + } + + @Override + public boolean remove(Object o) { + return list.remove(o); + } + + @Override + public boolean containsAll(Collection c) { + return list.containsAll(c); + } + + @Override + public boolean addAll(Collection c) { + return list.addAll(c); + } + + @Override + public boolean addAll(int index, Collection c) { + return list.addAll(index, c); + } + + @Override + public boolean removeAll(Collection c) { + return list.removeAll(c); + } + + @Override + public boolean retainAll(Collection c) { + return list.retainAll(c); + } + + @Override + public void clear() { + list.clear(); + } + + @Override + public E get(int index) { + return list.get(index); + } + + @Override + public E set(int index, E element) { + return list.set(index, element); + } + + @Override + public void add(int index, E element) { + list.add(index, element); + } + + @Override + public E remove(int index) { + return list.remove(index); + } + + @Override + public int indexOf(Object o) { + return list.indexOf(o); + } + + @Override + public int lastIndexOf(Object o) { + return list.lastIndexOf(o); + } + + @Override + public ListIterator listIterator() { + return list.listIterator(); + } + + @Override + public ListIterator listIterator(int index) { + return list.listIterator(index); + } + + @Override + public List subList(int fromIndex, int toIndex) { + return list.subList(fromIndex, toIndex); + } +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/pojo/CommonWrapperInterface.java b/snowy-common/src/main/java/vip/xiaonuo/common/pojo/CommonWrapperInterface.java new file mode 100644 index 00000000..6eb7fb3f --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/pojo/CommonWrapperInterface.java @@ -0,0 +1,32 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.pojo; + +import cn.hutool.json.JSONObject; + +/** + * 通用包装接口 + * + * @author xuyuxiang + * @date 2022/9/15 21:17 + */ +public interface CommonWrapperInterface { + + /** + * 执行包装 + * + * @author xuyuxiang + * @date 2022/9/15 21:17 + */ + JSONObject doWrap(T wrapperObject); +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/prop/CommonProperties.java b/snowy-common/src/main/java/vip/xiaonuo/common/prop/CommonProperties.java new file mode 100644 index 00000000..a54b2b29 --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/prop/CommonProperties.java @@ -0,0 +1,37 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.prop; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 通用基础配置 + * + * @author xuyuxiang + * @date 2022/1/2 17:03 + */ +@Getter +@Setter +@Component +@ConfigurationProperties(prefix = "snowy.config.common") +public class CommonProperties { + + /** 前端地址 */ + private String frontUrl; + + /** 后端地址 */ + private String backendUrl; +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/timer/CommonTimerTaskRunner.java b/snowy-common/src/main/java/vip/xiaonuo/common/timer/CommonTimerTaskRunner.java new file mode 100644 index 00000000..be2ae505 --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/timer/CommonTimerTaskRunner.java @@ -0,0 +1,30 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.timer; + +/** + * 定时器执行者,定时器都要实现本接口,并需要把实现类加入到spring容器中 + * + * @author xuyuxiang + * @date 2022/8/15 16:09 + **/ +public interface CommonTimerTaskRunner { + + /** + * 任务执行的具体内容 + * + * @author xuyuxiang + * @date 2022/8/15 16:09 + **/ + void action(); +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonAvatarUtil.java b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonAvatarUtil.java new file mode 100644 index 00000000..7a4391d5 --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonAvatarUtil.java @@ -0,0 +1,126 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.util; + +import cn.hutool.core.img.ImgUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; + +import java.awt.*; +import java.awt.image.BufferedImage; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 通用头像工具类,生成文字头像 + * + * @author xuyuxiang + * @date 2022/7/5 17:36 + **/ +public class CommonAvatarUtil { + + /** + * 绘制字体头像,如果是英文名,只显示首字母大写, + * 如果是中文名,只显示最后两个字 + * 返回图片base64 + * + * @author xuyuxiang + * @date 2022/7/5 17:36 + **/ + public static String generateImg(String name) { + int width = 100; + int height = 100; + int nameLength = name.length(); + String nameWritten; + // 如果用户输入的姓名少于等于2个字符,不用截取 + if (nameLength <= 2) { + nameWritten = name; + } else { + // 如果用户输入的姓名大于等于3个字符,截取后面两位 + String first = StrUtil.sub(name, 0, 1); + if (isChinese(first)) { + // 截取倒数两位汉字 + nameWritten = name.substring(nameLength - 2); + } else { + // 截取前面的两个英文字母 + nameWritten = StrUtil.sub(name, 0, 1).toUpperCase(); + } + } + BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + Graphics2D g2 = (Graphics2D) bufferedImage.getGraphics(); + g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + g2.setBackground(getRandomColor()); + g2.clearRect(0, 0, width, height); + g2.setPaint(Color.WHITE); + Font font; + // 两个字及以上 + if(nameWritten.length() >= 2) { + font = new Font("微软雅黑", Font.BOLD, 30); + g2.setFont(font); + String firstWritten = StrUtil.sub(nameWritten, 0, 1); + String secondWritten = StrUtil.sub(nameWritten, 0, 2); + // 两个中文 如 言曌 + if (isChinese(firstWritten) && isChinese(secondWritten)) { + g2.drawString(nameWritten, 20, 60); + } + // 首中次英 如 罗Q + else if (isChinese(firstWritten) && !isChinese(secondWritten)) { + g2.drawString(nameWritten, 27, 60); + // 首英 如 AB + } else { + nameWritten = nameWritten.substring(0,1); + } + } + // 一个字 + if(nameWritten.length() == 1) { + // 中文 + if(isChinese(nameWritten)) { + font = new Font("微软雅黑", Font.PLAIN, 50); + g2.setFont(font); + g2.drawString(nameWritten, 25, 70); + } else { + font = new Font("微软雅黑", Font.PLAIN, 55); + g2.setFont(font); + g2.drawString(nameWritten.toUpperCase(), 33, 67); + } + } + return ImgUtil.toBase64DataUri(bufferedImage, "jpg"); + } + + /** + * 获得随机颜色 + * + * @author xuyuxiang + * @date 2022/7/5 17:41 + **/ + private static Color getRandomColor() { + String[] beautifulColors = + new String[]{"114,101,230", "255,191,0", "0,162,174", "245,106,0", "24,144,255", "96,109,128"}; + String[] color = beautifulColors[RandomUtil.randomInt(beautifulColors.length)].split(StrUtil.COMMA); + return new Color(Integer.parseInt(color[0]), Integer.parseInt(color[1]), + Integer.parseInt(color[2])); + } + + /** + * 判断字符串是否为中文 + * + * @author xuyuxiang + * @date 2022/7/5 17:41 + **/ + private static boolean isChinese(String str) { + String regEx = "[\\u4e00-\\u9fa5]+"; + Pattern p = Pattern.compile(regEx); + Matcher m = p.matcher(str); + return m.find(); + } +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonCryptogramUtil.java b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonCryptogramUtil.java new file mode 100644 index 00000000..7ca23a34 --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonCryptogramUtil.java @@ -0,0 +1,142 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.util; + +import com.antherd.smcrypto.sm2.Sm2; +import com.antherd.smcrypto.sm3.Sm3; +import com.antherd.smcrypto.sm4.Sm4; +import com.antherd.smcrypto.sm4.Sm4Options; +import lombok.extern.slf4j.Slf4j; + +/** + * 加密工具类,本框架目前使用 https://github.com/antherd/sm-crypto 项目中一些加解密方式 + * 使用小伙伴需要过等保密评相关,请在此处更改为自己的加密方法,或加密机,使用加密机同时需要替换公钥,私钥在内部无法导出,提供加密的方法 + * 如果不涉及到加密机方面的内容,请更改公私要为自己重新生成的,生成方式请看集成的sm-crypto主页 + * + * @author yubaoshan + * @date 2022/9/15 21:51 + */ +@Slf4j +public class CommonCryptogramUtil { + + /** 公钥 */ + private static final String PUBLIC_KEY = "04298364ec840088475eae92a591e01284d1abefcda348b47eb324bb521bb03b0b2a5bc393f6b71dabb8f15c99a0050818b56b23f31743b93df9cf8948f15ddb54"; + + /** 私钥 */ + private static final String PRIVATE_KEY = "3037723d47292171677ec8bd7dc9af696c7472bc5f251b2cec07e65fdef22e25"; + + /** SM4的对称秘钥(生产环境需要改成自己使用的) 16 进制字符串,要求为 128 比特 */ + private static final String KEY = "0123456789abcdeffedcba9876543210"; + + /** + * 加密方法(Sm2 的专门针对前后端分离,非对称秘钥对的方式,暴露出去的公钥,对传输过程中的密码加个密) + * + * @author yubaoshan + * @date 2022/9/15 21:51 + * @param str 待加密数据 + * @return 加密后的密文 + */ + public static String doSm2Encrypt(String str) { + return Sm2.doEncrypt(str, PUBLIC_KEY); + } + + /** + * 解密方法 + * 如果采用加密机的方法,用try catch 捕捉异常,返回原文值即可 + * + * @author yubaoshan + * @date 2022/9/15 21:51 + * @param str 密文 + * @return 解密后的明文 + */ + public static String doSm2Decrypt(String str) { + // 解密 + return Sm2.doDecrypt(str, PRIVATE_KEY); + } + + /** + * 加密方法 + * + * @author yubaoshan + * @date 2022/9/15 21:51 + * @param str 待加密数据 + * @return 加密后的密文 + */ + public static String doSm4CbcEncrypt(String str) { + // SM4 加密 cbc模式 + Sm4Options sm4Options4 = new Sm4Options(); + sm4Options4.setMode("cbc"); + sm4Options4.setIv("fedcba98765432100123456789abcdef"); + return Sm4.encrypt(str, KEY, sm4Options4); + } + + /** + * 解密方法 + * 如果采用加密机的方法,用try catch 捕捉异常,返回原文值即可 + * + * @author yubaoshan + * @date 2022/9/15 21:51 + * @param str 密文 + * @return 解密后的明文 + */ + public static String doSm4CbcDecrypt(String str) { + // 解密,cbc 模式,输出 utf8 字符串 + Sm4Options sm4Options8 = new Sm4Options(); + sm4Options8.setMode("cbc"); + sm4Options8.setIv("fedcba98765432100123456789abcdef"); + String docString = Sm4.decrypt(str, KEY, sm4Options8); + if (docString.equals("")) { + log.warn(">>> 字段解密失败,返回原文值:{}", str); + return str; + } else { + return docString; + } + } + + /** + * 纯签名 + * + * @author yubaoshan + * @date 2022/9/15 21:51 + * @param str 待签名数据 + * @return 签名结果 + */ + public static String doSignature(String str) { + return Sm2.doSignature(str, PRIVATE_KEY); + } + + /** + * 验证签名结果 + * + * @author yubaoshan + * @date 2022/9/15 21:51 + * @param originalStr 签名原文数据 + * @param str 签名结果 + * @return 是否通过 + */ + public static boolean doVerifySignature(String originalStr, String str) { + return Sm2.doVerifySignature(originalStr, str, PUBLIC_KEY); + } + + /** + * 通过杂凑算法取得hash值,用于做数据完整性保护 + * + * @author yubaoshan + * @date 2022/9/15 21:51 + * @param str 字符串 + * @return hash 值 + */ + public static String doHashValue(String str) { + return Sm3.sm3(str); + } +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonDownloadUtil.java b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonDownloadUtil.java new file mode 100644 index 00000000..89f38eb6 --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonDownloadUtil.java @@ -0,0 +1,61 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.util; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.URLUtil; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; + +/** + * 文件下载工具类,使用本类前,对参数校验的异常使用CommonResponseUtil.renderError()方法进行渲染 + * + * @author xuyuxiang + * @date 2020/8/5 21:45 + */ +public class CommonDownloadUtil { + + /** + * 下载文件 + * + * @param file 要下载的文件 + * @param response 响应 + * @author xuyuxiang + * @date 2020/8/5 21:46 + */ + public static void download(File file, HttpServletResponse response) { + download(file.getName(), FileUtil.readBytes(file), response); + } + + /** + * 下载文件 + * + * @author xuyuxiang + * @date 2022/7/31 10:57 + */ + public static void download(String fileName, byte[] fileBytes, HttpServletResponse response) { + try { + response.setHeader("Content-Disposition", "attachment;filename=" + URLUtil.encode(fileName)); + response.addHeader("Content-Length", "" + fileBytes.length); + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.setContentType("application/octet-stream;charset=UTF-8"); + IoUtil.write(response.getOutputStream(), true, fileBytes); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonEmailUtil.java b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonEmailUtil.java new file mode 100644 index 00000000..e1877c6d --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonEmailUtil.java @@ -0,0 +1,50 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.util; + +import cn.hutool.core.util.ReUtil; +import cn.hutool.core.util.StrUtil; +import vip.xiaonuo.common.exception.CommonException; + +/** + * 通用邮件工具类 + * + * @author xuyuxiang + * @date 2022/8/25 15:10 + **/ +public class CommonEmailUtil { + + /** + * 判断是否邮箱 + * + * @author xuyuxiang + * @date 2022/8/15 13:32 + **/ + public static boolean isEmail(String email) { + return ReUtil.isMatch("^[A-Za-z0-9\\u4e00-\\u9fa5]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$", email); + } + + /** + * 校验邮箱格式 + * + * @author xuyuxiang + * @date 2022/8/15 13:32 + **/ + public static void validEmail(String emails) { + StrUtil.split(emails, StrUtil.COMMA).forEach(email -> { + if(!ReUtil.isMatch("^[A-Za-z0-9\\u4e00-\\u9fa5]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$", email)) { + throw new CommonException("邮件地址:{}格式错误", email); + } + }); + } +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonFilterExceptionUtil.java b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonFilterExceptionUtil.java new file mode 100644 index 00000000..9bd3b00c --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonFilterExceptionUtil.java @@ -0,0 +1,40 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.util; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +/** + * 过滤器异常工具类,用于处理过滤器中的异常 + * 原理:将异常转发到/errorView进行处理 + * + * @author xuyuxiang + * @date 2022/7/18 18:59 + **/ +public class CommonFilterExceptionUtil { + + /** + * 处理过滤器中的异常 + * + * @author xuyuxiang + * @date 2022/7/18 19:00 + **/ + public static void handleFilterException(ServletRequest request, ServletResponse response, Exception e) { + try { + request.setAttribute("model", e); + request.getRequestDispatcher("/errorView").forward(request, response); + } catch (Exception ignored) { + } + } +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonIpAddressUtil.java b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonIpAddressUtil.java new file mode 100644 index 00000000..2bcf883e --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonIpAddressUtil.java @@ -0,0 +1,108 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.util; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.net.Ipv4Util; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.extra.servlet.ServletUtil; +import lombok.extern.slf4j.Slf4j; +import org.lionsoul.ip2region.xdb.Searcher; +import vip.xiaonuo.common.exception.CommonException; + +import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.io.InputStream; + +/** + * 根据ip地址定位工具类,离线方式 + * 参考地址:https://gitee.com/lionsoul/ip2region/tree/master/binding/java + * + * @author xuyuxiang + * @date 2020/3/16 11:25 + */ +@Slf4j +public class CommonIpAddressUtil { + + private static final String LOCAL_REMOTE_HOST = "0:0:0:0:0:0:0:1"; + + private static final Searcher searcher; + + static { + String fileName = "/ip2region.xdb"; + File existFile = FileUtil.file(FileUtil.getTmpDir() + FileUtil.FILE_SEPARATOR + fileName); + if(!FileUtil.exist(existFile)) { + InputStream resourceAsStream = CommonIpAddressUtil.class.getResourceAsStream(fileName); + if(ObjectUtil.isEmpty(resourceAsStream)) { + throw new CommonException("CommonIpAddressUtil初始化失败,原因:IP地址库数据不存在"); + } + FileUtil.writeFromStream(resourceAsStream, existFile); + } + + String dbPath = existFile.getPath(); + + // 1、从 dbPath 加载整个 xdb 到内存。 + byte[] cBuff; + try { + cBuff = Searcher.loadContentFromFile(dbPath); + } catch (Exception e) { + e.printStackTrace(); + throw new CommonException("CommonIpAddressUtil初始化失败,原因:", e.getMessage()); + } + + // 2、使用上述的 cBuff 创建一个完全基于内存的查询对象。 + try { + searcher = Searcher.newWithBuffer(cBuff); + } catch (Exception e) { + e.printStackTrace(); + throw new CommonException("CommonIpAddressUtil初始化失败,原因:", e.getMessage()); + } + } + + /** + * 获取客户端ip + * + * @author xuyuxiang + * @date 2020/3/19 9:32 + */ + public static String getIp(HttpServletRequest request) { + if (ObjectUtil.isEmpty(request)) { + return Ipv4Util.LOCAL_IP; + } else { + try { + String remoteHost = ServletUtil.getClientIP(request); + return LOCAL_REMOTE_HOST.equals(remoteHost) ? Ipv4Util.LOCAL_IP : remoteHost; + } catch (Exception e) { + e.printStackTrace(); + return Ipv4Util.LOCAL_IP; + } + } + } + + /** + * 根据IP地址离线获取城市 + * + * @author xuyuxiang + * @date 2022/4/27 23:14 + */ + public static String getCityInfo(String ip) { + try { + ip = ip.trim(); + // 3、执行查询 + String region = searcher.searchByStr(ip); + return region.replace("0|", "").replace("|0", ""); + } catch (Exception e) { + return "未知"; + } + } +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonJoinPointUtil.java b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonJoinPointUtil.java new file mode 100644 index 00000000..582fc725 --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonJoinPointUtil.java @@ -0,0 +1,61 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.util; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import org.aspectj.lang.JoinPoint; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * Spring切面工具类 + * + * @author xuyuxiang + * @date 2022/9/2 15:51 + */ +public class CommonJoinPointUtil { + + /** + * 获取切面的参数JSON + * + * @author xuyuxiang + * @date 2022/9/2 15:51 + */ + public static String getArgsJsonString(JoinPoint joinPoint) { + StringBuilder argsJson = new StringBuilder(); + Object[] args = joinPoint.getArgs(); + for (Object arg : args) { + if (!isFilterObject(arg)) { + if (ObjectUtil.isNotNull(arg)) { + argsJson.append(JSONUtil.toJsonStr(arg)).append(" "); + } + } + } + return argsJson.toString().trim(); + } + + /** + * 判断是否需要拼接参数,过滤掉HttpServletRequest,MultipartFile,HttpServletResponse等类型参数 + * + * @author xuyuxiang + * @date 2022/9/2 15:51 + */ + private static boolean isFilterObject(Object arg) { + return arg instanceof MultipartFile || + arg instanceof HttpServletRequest || + arg instanceof HttpServletResponse; + } +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonNetWorkInfoUtil.java b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonNetWorkInfoUtil.java new file mode 100644 index 00000000..6adaad2e --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonNetWorkInfoUtil.java @@ -0,0 +1,126 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.util; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.system.SystemUtil; +import lombok.extern.slf4j.Slf4j; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.*; + +/** + * 通用获取当前网速工具类 + * + * @author xuyuxiang + * @date 2022/9/1 23:45 + */ +@Slf4j +public class CommonNetWorkInfoUtil { + + /** + * 网速测速时间2s + */ + private static final int SLEEP_SECONDS = 2; + + /** + * 获取网络上下行速率,格式{"UP": "123KB/S, "DOWN": "345KB/S"} + * + * @author xuyuxiang + * @date 2022/9/1 23:51 + */ + public static Map getNetworkUpRate() { + Map result = new HashMap<>(); + Process pro = null; + Runtime r = Runtime.getRuntime(); + BufferedReader input = null; + try { + boolean isWindows = SystemUtil.getOsInfo().isWindows(); + String command = isWindows ? "netstat -e" : "ifconfig"; + pro = r.exec(command); + input = new BufferedReader(new InputStreamReader(pro.getInputStream())); + long[] result1 = readInLine(input, isWindows); + Thread.sleep(SLEEP_SECONDS * 1000); + pro.destroy(); + input.close(); + pro = r.exec(command); + input = new BufferedReader(new InputStreamReader(pro.getInputStream())); + long[] result2 = readInLine(input, isWindows); + String upSpeed = FileUtil.readableFileSize(Convert.toLong(NumberUtil + .div(NumberUtil.sub(result2[0], result1[0]), SLEEP_SECONDS))); + String downSpeed = FileUtil.readableFileSize(Convert.toLong(NumberUtil + .div(NumberUtil.sub(result2[1], result1[1]), SLEEP_SECONDS))); + result.put("UP", upSpeed + (upSpeed.endsWith("B")?"/S":"B/S")); + result.put("DOWN", downSpeed + (downSpeed.endsWith("B")?"/S":"B/S")); + } catch (Exception e) { + log.info(">>> 网络测速失败,原因:"); + e.printStackTrace(); + } finally { + if (input != null) { + try { + input.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + Optional.ofNullable(pro).ifPresent(Process::destroy); + } + return result; + } + + private static String formatNumber(double f) { + return new Formatter().format("%.2f", f).toString(); + } + + private static long[] readInLine(BufferedReader input, boolean isWindows) { + long[] arr = new long[2]; + StringTokenizer tokenStat; + try { + if (isWindows) { + // 获取windows环境下的网口上下行速率 + input.readLine(); + input.readLine(); + input.readLine(); + input.readLine(); + tokenStat = new StringTokenizer(input.readLine()); + tokenStat.nextToken(); + arr[0] = Long.parseLong(tokenStat.nextToken()); + arr[1] = Long.parseLong(tokenStat.nextToken()); + } else { + // 获取linux环境下的网口上下行速率 + long rx = 0, tx = 0; + String line = null; + //RX packets:4171603 errors:0 dropped:0 overruns:0 frame:0 + //TX packets:4171603 errors:0 dropped:0 overruns:0 carrier:0 + while ((line = input.readLine()) != null) { + if (line.contains("RX packets")) { + rx += Long.parseLong(line.substring(line.indexOf("RX packets") + 11, line.indexOf(" ", + line.indexOf("RX packets") + 11))); + } else if (line.contains("TX packets")) { + tx += Long.parseLong(line.substring(line.indexOf("TX packets") + 11, line.indexOf(" ", + line.indexOf("TX packets") + 11))); + } + } + arr[0] = rx; + arr[1] = tx; + } + } catch (Exception e) { + e.printStackTrace(); + } + return arr; + } +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonResponseUtil.java b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonResponseUtil.java new file mode 100644 index 00000000..f3c1fd50 --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonResponseUtil.java @@ -0,0 +1,65 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.util; + +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.ContentType; +import cn.hutool.json.JSONUtil; +import vip.xiaonuo.common.pojo.CommonResult; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * 通用响应工具类 + * + * @author xuyuxiang + * @date 2022/8/4 9:40 + **/ +public class CommonResponseUtil { + + /** + * 以流的方式响应错误信息,默认错误消息 + * + * @author xuyuxiang + * @date 2022/8/4 9:41 + **/ + public static void renderError(HttpServletResponse response) throws IOException { + renderError(response, null); + } + + /** + * 以流的方式响应错误信息,指定错误消息 + * + * @author xuyuxiang + * @date 2022/8/4 9:41 + **/ + public static void renderError(HttpServletResponse response, String msg) throws IOException { + response.setCharacterEncoding(CharsetUtil.UTF_8); + response.setContentType(ContentType.JSON.toString()); + response.getWriter().write(JSONUtil.toJsonStr(ObjectUtil.isNotEmpty(msg)?CommonResult.error(msg):CommonResult.error())); + } + + /** + * 以流的方式响应错误信息,指定错误码和错误消息 + * + * @author xuyuxiang + * @date 2022/8/4 9:41 + **/ + public static void renderError(HttpServletResponse response, Integer code, String msg) throws IOException { + response.setCharacterEncoding(CharsetUtil.UTF_8); + response.setContentType(ContentType.JSON.toString()); + response.getWriter().write(JSONUtil.toJsonStr(CommonResult.get(code, msg, null))); + } +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonServletUtil.java b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonServletUtil.java new file mode 100644 index 00000000..0704d8b5 --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonServletUtil.java @@ -0,0 +1,97 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.util; + +import cn.hutool.core.util.ObjectUtil; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import vip.xiaonuo.common.exception.CommonException; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * HttpServlet工具类,获取当前request和response + * + * @author xuyuxiang + * @date 2020/3/30 15:09 + */ +public class CommonServletUtil { + + /** + * 从请求中中获取参数 + * + * @author xuyuxiang + * @date 2021/10/14 10:44 + **/ + public static String getParamFromRequest(String paramName) { + HttpServletRequest request = getRequest(); + + // 1. 尝试从请求体里面读取 + String paramValue = request.getParameter(paramName); + + // 2. 尝试从header里读取 + if (ObjectUtil.isEmpty(paramValue)) { + paramValue = request.getHeader(paramName); + } + // 3. 尝试从cookie里读取 + if (ObjectUtil.isEmpty(paramValue)) { + Cookie[] cookies = request.getCookies(); + if(ObjectUtil.isNotEmpty(cookies)) { + for (Cookie cookie : cookies) { + String cookieName = cookie.getName(); + if (cookieName.equals(paramName)) { + return cookie.getValue(); + } + } + } + } + // 4. 返回 + return paramValue; + } + + public static HttpServletRequest getRequest() { + ServletRequestAttributes servletRequestAttributes; + try { + servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + } catch (Exception e) { + e.printStackTrace(); + throw new CommonException("非Web上下文无法获取Request"); + } + if (servletRequestAttributes == null) { + throw new CommonException("非Web上下文无法获取Request"); + } else { + return servletRequestAttributes.getRequest(); + } + } + + public static HttpServletResponse getResponse() { + ServletRequestAttributes servletRequestAttributes; + try { + servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + } catch (Exception e) { + e.printStackTrace(); + throw new CommonException("非Web上下文无法获取Response"); + } + if (servletRequestAttributes == null) { + throw new CommonException("非Web上下文无法获取Response"); + } else { + return servletRequestAttributes.getResponse(); + } + } + + public static boolean isWeb() { + return RequestContextHolder.getRequestAttributes() != null; + } +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonTimeFormatUtil.java b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonTimeFormatUtil.java new file mode 100644 index 00000000..de1ec4a0 --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonTimeFormatUtil.java @@ -0,0 +1,183 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.util; + +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; + +import java.util.Date; + +/** + * 时间格式化工具类 + * + * @author xuyuxiang + * @date 2022/6/24 15:28 + **/ +public class CommonTimeFormatUtil { + + private static final long ONE_MINUTE_SECONDS = 60; + + private static final int BEFORE_DAWN_HOUR = 6; + + private static final int MORNING_END_HOUR = 12; + + private static final int NOON_END_HOUR = 13; + + private static final int AFTERNOON_END_HOUR = 18; + + private static final int NIGHT_END_HOUR = 24; + + /** + * 将日期格式化为仿微信的日期 + * + * @author xuyuxiang + * @date 2022/6/24 15:28 + **/ + public static String formatWxPastTime(Date date) { + if (DateUtil.between(date, DateUtil.date(), DateUnit.SECOND, false) < 0) { + //今天之后的时间显示年月日时分 + return DateUtil.format(date, DatePattern.NORM_DATETIME_MINUTE_PATTERN); + } else { + //如果是今年 + if (DateUtil.thisYear() == DateUtil.year(date)) { + //如果是今天 + if (DateUtil.isSameDay(date, DateUtil.date())) { + //相差分钟数 + long betweenMinute = DateUtil.between(date, DateUtil.date(), DateUnit.MINUTE); + //如果在1小时之内 + if (betweenMinute < ONE_MINUTE_SECONDS) { + //一分钟之内,显示刚刚 + if (betweenMinute < 1) { + return "刚刚"; + } else { + //一分钟之外,显示xx分钟前 + return betweenMinute + "分钟前"; + } + } else { + //一小时之外,显示时分 + return getTodayHour(date) + " " + DateUtil.format(date, "HH:mm"); + } + } else if (DateUtil.isSameDay(date, DateUtil.yesterday())) { + //如果是昨天,显示昨天时分 + return "昨天 " + DateUtil.format(date, "HH:mm"); + } else if (isThisWeek(date)) { + //如果是本周 + String weekday; + //获取是本周的第几天 + int dayOfWeek = DateUtil.dayOfWeek(date) - 1; + switch (dayOfWeek) { + case 1: + weekday = "周一"; + break; + case 2: + weekday = "周二"; + break; + case 3: + weekday = "周三"; + break; + case 4: + weekday = "周四"; + break; + case 5: + weekday = "周五"; + break; + case 6: + weekday = "周六"; + break; + default: + weekday = "周日"; + break; + } + //显示本周时分 + return weekday + " " + DateUtil.format(date, "HH:mm"); + } else { + //否则显示月日时分 + return DateUtil.format(date, "MM-dd HH:mm"); + } + } else { + //本年之外显示年月日时分 + return DateUtil.format(date, DatePattern.NORM_DATETIME_MINUTE_PATTERN); + } + } + } + + /** + * 将秒数格式化为天时分秒 + * + * @author xuyuxiang + * @date 2022/6/24 15:29 + **/ + public static String formatSeconds(long secondsParam) { + String result; + long days = secondsParam / ( ONE_MINUTE_SECONDS * ONE_MINUTE_SECONDS * NIGHT_END_HOUR); + long hours = (secondsParam % ( ONE_MINUTE_SECONDS * ONE_MINUTE_SECONDS * NIGHT_END_HOUR)) / (ONE_MINUTE_SECONDS * ONE_MINUTE_SECONDS); + long minutes = (secondsParam % ( ONE_MINUTE_SECONDS * ONE_MINUTE_SECONDS)) /ONE_MINUTE_SECONDS; + long seconds = secondsParam % ONE_MINUTE_SECONDS; + if(days > 0) { + result = days + "天" + hours + "小时" + minutes + "分钟" + seconds + "秒"; + }else if(hours > 0) { + result = hours + "小时" + minutes + "分钟" + seconds + "秒"; + }else if(minutes > 0) { + result = minutes + "分钟" + seconds + "秒"; + }else{ + result = seconds + "秒"; + } + return result; + } + + /** + * 判断日期是否是本周 + * + * @param date 要判断的日期 + * @return boolean + * @author xuyuxiang + * @date 2020/8/6 12:10 + **/ + private static boolean isThisWeek(Date date) { + //获取本周开始时间 + DateTime beginOfWeek = DateUtil.beginOfWeek(DateUtil.date()); + //获取与本周开始时间相差的天数 + long betweenBegin = DateUtil.between(date, beginOfWeek, DateUnit.DAY, false) + 1; + //如果是同一天,或相差天数小于0,则是本周 + return DateUtil.isSameDay(date, beginOfWeek) || betweenBegin < 0; + } + + /** + * 根据今天日期获取早中晚 + * + * @author xuyuxiang + * @date 2020/8/6 14:42 + **/ + private static String getTodayHour(Date date) { + String result = ""; + int hour = DateUtil.hour(date, true); + if (hour >= 0 && hour <= BEFORE_DAWN_HOUR) { + result = "凌晨"; + } + if (hour > BEFORE_DAWN_HOUR && hour < MORNING_END_HOUR) { + result = "上午"; + } + if (hour == MORNING_END_HOUR) { + result = "中午"; + } + if (hour >= NOON_END_HOUR && hour <= AFTERNOON_END_HOUR) { + result = "下午"; + } + if (hour > AFTERNOON_END_HOUR && hour <= NIGHT_END_HOUR) { + result = "晚上"; + } + return result; + } +} diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonUaUtil.java b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonUaUtil.java new file mode 100644 index 00000000..ae2bc6e4 --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/util/CommonUaUtil.java @@ -0,0 +1,80 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.util; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.servlet.ServletUtil; +import cn.hutool.http.useragent.Browser; +import cn.hutool.http.useragent.UserAgent; +import cn.hutool.http.useragent.UserAgentUtil; + +import javax.servlet.http.HttpServletRequest; + +/** + * 用户代理工具类 + * + * @author xuyuxiang + * @date 2022/9/2 15:34 + */ +public class CommonUaUtil { + + /** + * 获取客户端浏览器 + * + * @author xuyuxiang + * @date 2020/3/19 14:53 + */ + public static String getBrowser(HttpServletRequest request) { + UserAgent userAgent = getUserAgent(request); + if (ObjectUtil.isEmpty(userAgent)) { + return StrUtil.DASHED; + } else { + String browser = userAgent.getBrowser().toString(); + return "Unknown".equals(browser) ? StrUtil.DASHED : browser; + } + } + + /** + * 获取客户端操作系统 + * + * @author xuyuxiang + * @date 2022/9/2 15:36 + */ + public static String getOs(HttpServletRequest request) { + UserAgent userAgent = getUserAgent(request); + if (ObjectUtil.isEmpty(userAgent)) { + return StrUtil.DASHED; + } else { + String os = userAgent.getOs().toString(); + return "Unknown".equals(os) ? StrUtil.DASHED : os; + } + } + + /** + * 获取请求代理头 + * + * @author xuyuxiang + * @date 2022/9/2 15:36 + */ + private static UserAgent getUserAgent(HttpServletRequest request) { + String userAgentStr = ServletUtil.getHeaderIgnoreCase(request, "User-Agent"); + UserAgent userAgent = UserAgentUtil.parse(userAgentStr); + if (ObjectUtil.isNotEmpty(userAgentStr)) { + if ("Unknown".equals(userAgent.getBrowser().getName())) { + userAgent.setBrowser(new Browser(userAgentStr, null, "")); + } + } + return userAgent; + } +} diff --git a/snowy-common/src/main/resources/ip2region.xdb b/snowy-common/src/main/resources/ip2region.xdb new file mode 100644 index 00000000..31f96a1f Binary files /dev/null and b/snowy-common/src/main/resources/ip2region.xdb differ diff --git a/snowy-plugin-api/README.md b/snowy-plugin-api/README.md new file mode 100644 index 00000000..c0f9d989 --- /dev/null +++ b/snowy-plugin-api/README.md @@ -0,0 +1,11 @@ +# 插件API接口模块 + +####登录鉴权插件api接口: snowy-plugin-auth-api + +####业务功能插件api接口: snowy-plugin-biz-api + +####C端功能插件api接口: snowy-plugin-client-api + +####开发工具插件api接口: snowy-plugin-dev-api + +####系统功能插件api接口: snowy-plugin-sys-api \ No newline at end of file diff --git a/snowy-plugin-api/pom.xml b/snowy-plugin-api/pom.xml new file mode 100644 index 00000000..a30a0961 --- /dev/null +++ b/snowy-plugin-api/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + + vip.xiaonuo + snowy + 2.0.0 + + + snowy-plugin-api + pom + 插件API接口模块 + + + + snowy-plugin-auth-api + + + snowy-plugin-biz-api + + + snowy-plugin-client-api + + + snowy-plugin-dev-api + + + snowy-plugin-sys-api + + diff --git a/snowy-plugin-api/snowy-plugin-auth-api/README.md b/snowy-plugin-api/snowy-plugin-auth-api/README.md new file mode 100644 index 00000000..5ea8ce65 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-auth-api/README.md @@ -0,0 +1 @@ +# 登录鉴权插件api接口 \ No newline at end of file diff --git a/snowy-plugin-api/snowy-plugin-auth-api/pom.xml b/snowy-plugin-api/snowy-plugin-auth-api/pom.xml new file mode 100644 index 00000000..36653bf4 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-auth-api/pom.xml @@ -0,0 +1,36 @@ + + + 4.0.0 + + + vip.xiaonuo + snowy-plugin-api + 2.0.0 + + + snowy-plugin-auth-api + jar + 登录鉴权插件api接口 + + + 1.30.0 + + + + + + vip.xiaonuo + snowy-common + ${project.parent.version} + + + + + cn.dev33 + sa-token-core + ${sa.token.version} + + + \ No newline at end of file diff --git a/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/api/SaBaseLoginUserApi.java b/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/api/SaBaseLoginUserApi.java new file mode 100644 index 00000000..c72fcb81 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/api/SaBaseLoginUserApi.java @@ -0,0 +1,116 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.api; + +import cn.hutool.json.JSONObject; +import vip.xiaonuo.auth.core.pojo.SaBaseClientLoginUser; +import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser; + +import java.util.List; + +/** + * 登录用户API,由其他模块实现 + * + * @author xuyuxiang + * @date 2021/12/23 21:48 + */ +public interface SaBaseLoginUserApi { + + /** + * 根据id获取B端用户信息,查不到则返回null + * + * @author xuyuxiang + * @date 2022/3/10 16:14 + **/ + SaBaseLoginUser getUserById(String id); + + /** + * 根据id获取C端用户信息,查不到则返回null + * + * @author xuyuxiang + * @date 2022/3/10 16:14 + **/ + SaBaseClientLoginUser getClientUserById(String id); + + /** + * 根据账号获取B端用户信息,查不到则返回null + * + * @author xuyuxiang + * @date 2022/3/10 16:14 + **/ + SaBaseLoginUser getUserByAccount(String account); + + /** + * 根据账号获取C端用户信息,查不到则返回null + * + * @author xuyuxiang + * @date 2022/3/10 16:14 + **/ + SaBaseClientLoginUser getClientUserByAccount(String account); + + /** + * 根据手机号获取B端用户信息,查不到则返回null + * + * @author xuyuxiang + * @date 2022/3/10 16:14 + **/ + SaBaseLoginUser getUserByPhone(String phone); + + /** + * 根据手机号获取C端用户信息,查不到则返回null + * + * @author xuyuxiang + * @date 2022/3/10 16:14 + **/ + SaBaseClientLoginUser getClientUserByPhone(String phone); + + /** + * 根据用户id获取用户集合 + * + * @author xuyuxiang + * @date 2022/4/27 22:53 + */ + List listUserByUserIdList(List userIdList); + + /** + * 根据用户id获取角色码集合 + * + * @author xuyuxiang + * @date 2022/4/27 22:53 + */ + List getRoleCodeListByUserId(String userId); + + /** + * 根据用户id获取按钮码集合 + * + * @author xuyuxiang + * @date 2022/4/27 22:54 + */ + List getButtonCodeListListByUserId(String userId); + + /** + * 根据用户id获取权限集合 + * + * @author xuyuxiang + * @date 2022/4/27 22:54 + */ + List getPermissionListByUserId(String userId, String orgId); + + /** + * 更新用户的登录时间和登录ip等信息 + * + * @author xuyuxiang + * @date 2022/4/27 22:57 + */ + void updateUserLoginInfo(String userId, String device); +} diff --git a/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/annotation/SaClientCheckLogin.java b/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/annotation/SaClientCheckLogin.java new file mode 100644 index 00000000..90baad34 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/annotation/SaClientCheckLogin.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.core.annotation; + +import cn.dev33.satoken.annotation.SaCheckLogin; +import vip.xiaonuo.auth.core.util.StpClientUtil; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 登录认证(前台User版):只有登录之后才能进入该方法 + * 可标注在函数、类上(效果等同于标注在此类的所有方法上) + * + * @author xuyuxiang + * @date 2022/3/10 10:39 + **/ +@SaCheckLogin(type = StpClientUtil.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.METHOD, ElementType.TYPE}) +public @interface SaClientCheckLogin { + +} diff --git a/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/annotation/SaClientCheckPermission.java b/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/annotation/SaClientCheckPermission.java new file mode 100644 index 00000000..78274eea --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/annotation/SaClientCheckPermission.java @@ -0,0 +1,51 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.core.annotation; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; +import org.springframework.core.annotation.AliasFor; +import vip.xiaonuo.auth.core.util.StpClientUtil; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 权限认证(前台User版):必须具有指定权限才能进入该方法 + * 可标注在函数、类上(效果等同于标注在此类的所有方法上) + * + * @author xuyuxiang + * @date 2022/3/10 10:40 + **/ +@SaCheckPermission(type = StpClientUtil.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.METHOD, ElementType.TYPE}) +public @interface SaClientCheckPermission { + + /** + * 需要校验的权限码 + * @return 需要校验的权限码 + */ + @AliasFor(annotation = SaCheckPermission.class) + String [] value() default {}; + + /** + * 验证模式:AND | OR,默认AND + * @return 验证模式 + */ + @AliasFor(annotation = SaCheckPermission.class) + SaMode mode() default SaMode.AND; + +} diff --git a/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/annotation/SaClientCheckRole.java b/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/annotation/SaClientCheckRole.java new file mode 100644 index 00000000..8e28582d --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/annotation/SaClientCheckRole.java @@ -0,0 +1,52 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.core.annotation; + + +import cn.dev33.satoken.annotation.SaCheckRole; +import cn.dev33.satoken.annotation.SaMode; +import org.springframework.core.annotation.AliasFor; +import vip.xiaonuo.auth.core.util.StpClientUtil; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 角色认证(前台User版):必须具有指定角色标识才能进入该方法 + * 可标注在函数、类上(效果等同于标注在此类的所有方法上) + * + * @author xuyuxiang + * @date 2022/3/10 10:41 + **/ +@SaCheckRole(type = StpClientUtil.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.METHOD, ElementType.TYPE}) +public @interface SaClientCheckRole { + + /** + * 需要校验的角色标识 + * @return 需要校验的角色标识 + */ + @AliasFor(annotation = SaCheckRole.class) + String [] value() default {}; + + /** + * 验证模式:AND | OR,默认AND + * @return 验证模式 + */ + @AliasFor(annotation = SaCheckRole.class) + SaMode mode() default SaMode.AND; + +} diff --git a/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/enums/SaClientTypeEnum.java b/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/enums/SaClientTypeEnum.java new file mode 100644 index 00000000..90ed0e43 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/enums/SaClientTypeEnum.java @@ -0,0 +1,49 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.core.enums; + +import lombok.Getter; +import vip.xiaonuo.common.exception.CommonException; + +/** + * 登录端类型枚举 + * + * @author xuyuxiang + * @date 2021/10/11 14:02 + **/ +@Getter +public enum SaClientTypeEnum { + + /** + * B端用户 + */ + B("B"), + + /** + * C端用户 + */ + C("C"); + + private final String value; + + SaClientTypeEnum(String value) { + this.value = value; + } + + public static void validate(String value) { + boolean flag = B.getValue().equals(value) || C.getValue().equals(value); + if(!flag) { + throw new CommonException("不支持的登录端类型:{}", value); + } + } +} diff --git a/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/pojo/SaBaseClientLoginUser.java b/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/pojo/SaBaseClientLoginUser.java new file mode 100644 index 00000000..21b03107 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/pojo/SaBaseClientLoginUser.java @@ -0,0 +1,229 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.core.pojo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; +import java.util.List; + +/** + * 基础的C端登录用户对象,可继承此类扩展更多属性 + * + * @author xuyuxiang + * @date 2021/12/23 21:49 + */ +@Getter +@Setter +public abstract class SaBaseClientLoginUser { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 头像 */ + @ApiModelProperty(value = "头像,图片base64", position = 2) + private String avatar; + + /** 签名 */ + @ApiModelProperty(value = "签名,图片base64", position = 3) + private String signature; + + /** 账号 */ + @ApiModelProperty(value = "账号", position = 4) + private String account; + + /** 姓名 */ + @ApiModelProperty(value = "姓名", position = 5) + private String name; + + /** 昵称 */ + @ApiModelProperty(value = "昵称", position = 6) + private String nickname; + + /** 性别 */ + @ApiModelProperty(value = "性别", position = 7) + private String gender; + + /** 年龄 */ + @ApiModelProperty(value = "年龄", position = 8) + private String age; + + /** 出生日期 */ + @ApiModelProperty(value = "出生日期", position = 9) + private String birthday; + + /** 民族 */ + @ApiModelProperty(value = "民族", position = 10) + private String nation; + + /** 籍贯 */ + @ApiModelProperty(value = "籍贯", position = 11) + private String nativePlace; + + /** 家庭住址 */ + @ApiModelProperty(value = "家庭住址", position = 12) + private String homeAddress; + + /** 通信地址 */ + @ApiModelProperty(value = "通信地址", position = 13) + private String mailingAddress; + + /** 证件类型 */ + @ApiModelProperty(value = "证件类型", position = 14) + private String idCardType; + + /** 证件号码 */ + @ApiModelProperty(value = "证件号码", position = 15) + private String idCardNumber; + + /** 文化程度 */ + @ApiModelProperty(value = "文化程度", position = 16) + private String cultureLevel; + + /** 政治面貌 */ + @ApiModelProperty(value = "政治面貌", position = 17) + private String politicalOutlook; + + /** 毕业院校 */ + @ApiModelProperty(value = "毕业院校", position = 18) + private String college; + + /** 学历 */ + @ApiModelProperty(value = "学历", position = 19) + private String education; + + /** 学制 */ + @ApiModelProperty(value = "学制", position = 20) + private String eduLength; + + /** 学位 */ + @ApiModelProperty(value = "学位", position = 21) + private String degree; + + /** 手机 */ + @ApiModelProperty(value = "手机", position = 22) + private String phone; + + /** 邮箱 */ + @ApiModelProperty(value = "邮箱", position = 23) + private String email; + + /** 家庭电话 */ + @ApiModelProperty(value = "家庭电话", position = 24) + private String homeTel; + + /** 办公电话 */ + @ApiModelProperty(value = "办公电话", position = 25) + private String officeTel; + + /** 紧急联系人 */ + @ApiModelProperty(value = "紧急联系人", position = 26) + private String emergencyContact; + + /** 紧急联系人电话 */ + @ApiModelProperty(value = "紧急联系人电话", position = 27) + private String emergencyPhone; + + /** 紧急联系人地址 */ + @ApiModelProperty(value = "紧急联系人地址", position = 28) + private String emergencyAddress; + + /** 上次登录ip */ + @ApiModelProperty(value = "上次登录ip", position = 29) + private String lastLoginIp; + + /** 上次登录地点 */ + @ApiModelProperty(value = "上次登录地点", position = 30) + private String lastLoginAddress; + + /** 上次登录时间 */ + @ApiModelProperty(value = "上次登录时间", position = 31) + private Date lastLoginTime; + + /** 上次登录设备 */ + @ApiModelProperty(value = "上次登录设备", position = 32) + private String lastLoginDevice; + + /** 最新登录ip */ + @ApiModelProperty(value = "最新登录ip", position = 33) + private String latestLoginIp; + + /** 最新登录地点 */ + @ApiModelProperty(value = "最新登录地点", position = 34) + private String latestLoginAddress; + + /** 最新登录时间 */ + @ApiModelProperty(value = "最新登录时间", position = 35) + private Date latestLoginTime; + + /** 最新登录设备 */ + @ApiModelProperty(value = "最新登录设备", position = 36) + private String latestLoginDevice; + + /** 用户状态 */ + @ApiModelProperty(value = "用户状态", position = 37) + private String userStatus; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 38) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 39) + private String extJson; + + /** 按钮码集合 */ + @ApiModelProperty(value = "按钮码集合", position = 40) + private List buttonCodeList; + + /** 权限码集合 */ + @ApiModelProperty(value = "权限码集合", position = 41, hidden = true) + private List permissionCodeList; + + /** 角色码集合 */ + @ApiModelProperty(value = "角色码集合", position = 42, hidden = true) + private List roleCodeList; + + /** 数据范围集合 */ + @ApiModelProperty(value = "数据范围集合", position = 43, hidden = true) + private List dataScopeList; + + /** 用户密码hash值 */ + @ApiModelProperty(value = "用户密码hash值", position = 44) + private String password; + + /** 是否可登录,由继承类实现 */ + public abstract Boolean getEnabled(); + + /** + * 数据范围类 + * + * @author xuyuxiang + * @date 2022/8/15 13:57 + **/ + @Getter + @Setter + public static class DataScope { + + /** API接口 */ + @ApiModelProperty(value = "API接口", position = 1) + private String apiUrl; + + /** 数据范围 */ + @ApiModelProperty(value = "数据范围", position = 2) + private List dataScope; + } +} diff --git a/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/pojo/SaBaseLoginUser.java b/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/pojo/SaBaseLoginUser.java new file mode 100644 index 00000000..89af40e3 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/pojo/SaBaseLoginUser.java @@ -0,0 +1,265 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.core.pojo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; +import java.util.List; + +/** + * 基础的B端登录用户对象,可继承此类扩展更多属性 + * + * @author xuyuxiang + * @date 2021/12/23 21:49 + */ +@Getter +@Setter +public abstract class SaBaseLoginUser { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 头像 */ + @ApiModelProperty(value = "头像", position = 3) + private String avatar; + + /** 签名 */ + @ApiModelProperty(value = "签名", position = 4) + private String signature; + + /** 账号 */ + @ApiModelProperty(value = "账号", position = 5) + private String account; + + /** 姓名 */ + @ApiModelProperty(value = "姓名", position = 6) + private String name; + + /** 昵称 */ + @ApiModelProperty(value = "昵称", position = 7) + private String nickname; + + /** 性别 */ + @ApiModelProperty(value = "性别", position = 8) + private String gender; + + /** 年龄 */ + @ApiModelProperty(value = "年龄", position = 9) + private String age; + + /** 出生日期 */ + @ApiModelProperty(value = "出生日期", position = 10) + private String birthday; + + /** 民族 */ + @ApiModelProperty(value = "民族", position = 11) + private String nation; + + /** 籍贯 */ + @ApiModelProperty(value = "籍贯", position = 12) + private String nativePlace; + + /** 家庭住址 */ + @ApiModelProperty(value = "家庭住址", position = 13) + private String homeAddress; + + /** 通信地址 */ + @ApiModelProperty(value = "通信地址", position = 14) + private String mailingAddress; + + /** 证件类型 */ + @ApiModelProperty(value = "证件类型", position = 15) + private String idCardType; + + /** 证件号码 */ + @ApiModelProperty(value = "证件号码", position = 16) + private String idCardNumber; + + /** 文化程度 */ + @ApiModelProperty(value = "文化程度", position = 17) + private String cultureLevel; + + /** 政治面貌 */ + @ApiModelProperty(value = "政治面貌", position = 18) + private String politicalOutlook; + + /** 毕业院校 */ + @ApiModelProperty(value = "毕业院校", position = 19) + private String college; + + /** 学历 */ + @ApiModelProperty(value = "学历", position = 20) + private String education; + + /** 学制 */ + @ApiModelProperty(value = "学制", position = 21) + private String eduLength; + + /** 学位 */ + @ApiModelProperty(value = "学位", position = 22) + private String degree; + + /** 手机 */ + @ApiModelProperty(value = "手机", position = 23) + private String phone; + + /** 邮箱 */ + @ApiModelProperty(value = "邮箱", position = 24) + private String email; + + /** 家庭电话 */ + @ApiModelProperty(value = "家庭电话", position = 25) + private String homeTel; + + /** 办公电话 */ + @ApiModelProperty(value = "办公电话", position = 26) + private String officeTel; + + /** 紧急联系人 */ + @ApiModelProperty(value = "紧急联系人", position = 27) + private String emergencyContact; + + /** 紧急联系人电话 */ + @ApiModelProperty(value = "紧急联系人电话", position = 28) + private String emergencyPhone; + + /** 紧急联系人地址 */ + @ApiModelProperty(value = "紧急联系人地址", position = 29) + private String emergencyAddress; + + /** 员工编号 */ + @ApiModelProperty(value = "员工编号", position = 30) + private String empNo; + + /** 入职日期 */ + @ApiModelProperty(value = "入职日期", position = 31) + private String entryDate; + + /** 组织id */ + @ApiModelProperty(value = "组织id", position = 32) + private String orgId; + + /** 组织名称 */ + @ApiModelProperty(value = "组织名称", position = 33) + private String orgName; + + /** 职位id */ + @ApiModelProperty(value = "职位id", position = 34) + private String positionId; + + /** 职位名称 */ + @ApiModelProperty(value = "职位名称", position = 35) + private String positionName; + + /** 职级 */ + @ApiModelProperty(value = "职级", position = 36) + private String positionLevel; + + /** 主管id */ + @ApiModelProperty(value = "主管id", position = 37) + private String directorId; + + /** 兼任信息 */ + @ApiModelProperty(value = "兼任信息", position = 38) + private String positionJson; + + /** 上次登录ip */ + @ApiModelProperty(value = "上次登录ip", position = 39) + private String lastLoginIp; + + /** 上次登录地点 */ + @ApiModelProperty(value = "上次登录地点", position = 40) + private String lastLoginAddress; + + /** 上次登录时间 */ + @ApiModelProperty(value = "上次登录时间", position = 41) + private Date lastLoginTime; + + /** 上次登录设备 */ + @ApiModelProperty(value = "上次登录设备", position = 42) + private String lastLoginDevice; + + /** 最新登录ip */ + @ApiModelProperty(value = "最新登录ip", position = 43) + private String latestLoginIp; + + /** 最新登录地点 */ + @ApiModelProperty(value = "最新登录地点", position = 44) + private String latestLoginAddress; + + /** 最新登录时间 */ + @ApiModelProperty(value = "最新登录时间", position = 45) + private Date latestLoginTime; + + /** 最新登录设备 */ + @ApiModelProperty(value = "最新登录设备", position = 46) + private String latestLoginDevice; + + /** 用户状态 */ + @ApiModelProperty(value = "用户状态", position = 47) + private String userStatus; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 48) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 49) + private String extJson; + + /** 按钮码集合 */ + @ApiModelProperty(value = "按钮码集合", position = 50) + private List buttonCodeList; + + /** 权限码集合 */ + @ApiModelProperty(value = "权限码集合", position = 51, hidden = true) + private List permissionCodeList; + + /** 角色码集合 */ + @ApiModelProperty(value = "角色码集合", position = 52, hidden = true) + private List roleCodeList; + + /** 数据范围集合 */ + @ApiModelProperty(value = "数据范围集合", position = 53, hidden = true) + private List dataScopeList; + + /** 用户密码hash值 */ + @ApiModelProperty(value = "用户密码hash值", position = 54) + private String password; + + /** 是否可登录,由继承类实现 */ + public abstract Boolean getEnabled(); + + /** + * 数据范围类 + * + * @author xuyuxiang + * @date 2022/8/15 13:57 + **/ + @Getter + @Setter + public static class DataScope { + + /** API接口 */ + @ApiModelProperty(value = "API接口", position = 1) + private String apiUrl; + + /** 数据范围 */ + @ApiModelProperty(value = "数据范围", position = 2) + private List dataScope; + } +} diff --git a/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/util/StpClientLoginUserUtil.java b/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/util/StpClientLoginUserUtil.java new file mode 100644 index 00000000..5e90b669 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/util/StpClientLoginUserUtil.java @@ -0,0 +1,47 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.core.util; + +import cn.hutool.core.collection.CollectionUtil; +import vip.xiaonuo.auth.core.pojo.SaBaseClientLoginUser; + +import java.util.List; + +/** + * C端登录用户工具类 + * + * @author xuyuxiang + * @date 2022/7/8 10:40 + **/ +public class StpClientLoginUserUtil { + + /** + * 获取当前C端登录用户 + * + * @author xuyuxiang + * @date 2022/7/8 10:41 + **/ + public static SaBaseClientLoginUser getClientLoginUser() { + return (SaBaseClientLoginUser) StpClientUtil.getTokenSession().get("loginUser"); + } + + /** + * 获取当前C端登录用户的当前请求接口的数据范围(暂无数据范围) + * + * @author xuyuxiang + * @date 2022/7/8 10:41 + **/ + public static List getLoginUserDataScope() { + return CollectionUtil.newArrayList(); + } +} diff --git a/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/util/StpClientUtil.java b/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/util/StpClientUtil.java new file mode 100644 index 00000000..bc7b929b --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/util/StpClientUtil.java @@ -0,0 +1,937 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.core.util; + +import cn.dev33.satoken.SaManager; +import cn.dev33.satoken.fun.SaFunction; +import cn.dev33.satoken.session.SaSession; +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.SaTokenInfo; +import cn.dev33.satoken.stp.StpLogic; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.StrUtil; + +import java.util.List; + +/** + * Sa-Token 权限认证工具类 (C端用户版) + * + * @author xuyuxiang + * @date 2022/3/10 10:43 + **/ +public class StpClientUtil { + + /** + * 账号类型标识 + */ + public static final String TYPE = "C"; + + /** + * 底层的 StpLogic 对象,使用匿名子类 重写`stpLogic对象`的一些方法 + */ + public static StpLogic stpLogic = new StpLogic(TYPE) { + + /** + * 重写 StpLogic 类下的 `splicingKeyTokenName` 函数,返回一个与 `StpUtil` 不同的token名称, 防止冲突 + */ + @Override + public String splicingKeyTokenName() { + return super.splicingKeyTokenName() + StrUtil.DASHED + TYPE; + } + + // 此处可以根据需求重写其他方法 + }; + + /** + * 获取当前 StpLogic 的账号类型 + * @return See Note + */ + public static String getLoginType() { + return stpLogic.getLoginType(); + } + + /** + * 重置 StpLogic 对象 + * @param stpLogic / + */ + public static void setStpLogic(StpLogic stpLogic) { + StpUtil.stpLogic = stpLogic; + // 防止自定义 stpLogic 被覆盖 + SaManager.putStpLogic(stpLogic); + } + + + // =================== 获取token 相关 =================== + + /** + * 返回token名称 + * @return 此StpLogic的token名称 + */ + public static String getTokenName() { + return stpLogic.getTokenName(); + } + + /** + * 在当前会话写入当前TokenValue + * @param tokenValue token值 + */ + public static void setTokenValue(String tokenValue) { + stpLogic.setTokenValue(tokenValue); + } + + /** + * 在当前会话写入当前TokenValue + * @param tokenValue token值 + * @param cookieTimeout Cookie存活时间(秒) + */ + public static void setTokenValue(String tokenValue, int cookieTimeout) { + stpLogic.setTokenValue(tokenValue, cookieTimeout); + } + + /** + * 获取当前TokenValue + * @return 当前tokenValue + */ + public static String getTokenValue() { + return stpLogic.getTokenValue(); + } + + /** + * 获取当前TokenValue (不裁剪前缀) + * @return / + */ + public static String getTokenValueNotCut() { + return stpLogic.getTokenValueNotCut(); + } + + /** + * 获取当前会话的Token信息 + * @return token信息 + */ + public static SaTokenInfo getTokenInfo() { + return stpLogic.getTokenInfo(); + } + + + // =================== 登录相关操作 =================== + + // --- 登录 + + /** + * 会话登录 + * @param id 账号id,建议的类型:(long | int | String) + */ + public static void login(Object id) { + stpLogic.login(id); + } + + /** + * 会话登录,并指定登录设备 + * @param id 账号id,建议的类型:(long | int | String) + * @param device 设备标识 + */ + public static void login(Object id, String device) { + stpLogic.login(id, device); + } + + /** + * 会话登录,并指定是否 [记住我] + * @param id 账号id,建议的类型:(long | int | String) + * @param isLastingCookie 是否为持久Cookie + */ + public static void login(Object id, boolean isLastingCookie) { + stpLogic.login(id, isLastingCookie); + } + + /** + * 会话登录,并指定所有登录参数Model + * @param id 登录id,建议的类型:(long | int | String) + * @param loginModel 此次登录的参数Model + */ + public static void login(Object id, SaLoginModel loginModel) { + stpLogic.login(id, loginModel); + } + + /** + * 创建指定账号id的登录会话 + * @param id 登录id,建议的类型:(long | int | String) + * @return 返回会话令牌 + */ + public static String createLoginSession(Object id) { + return stpLogic.createLoginSession(id); + } + + /** + * 创建指定账号id的登录会话 + * @param id 登录id,建议的类型:(long | int | String) + * @param loginModel 此次登录的参数Model + * @return 返回会话令牌 + */ + public static String createLoginSession(Object id, SaLoginModel loginModel) { + return stpLogic.createLoginSession(id, loginModel); + } + + // --- 注销 + + /** + * 会话注销 + */ + public static void logout() { + stpLogic.logout(); + } + + /** + * 会话注销,根据账号id + * @param loginId 账号id + */ + public static void logout(Object loginId) { + stpLogic.logout(loginId); + } + + /** + * 会话注销,根据账号id 和 设备标识 + * + * @param loginId 账号id + * @param device 设备标识 (填null代表所有注销设备) + */ + public static void logout(Object loginId, String device) { + stpLogic.logout(loginId, device); + } + + /** + * 会话注销,根据指定 Token + * + * @param tokenValue 指定token + */ + public static void logoutByTokenValue(String tokenValue) { + stpLogic.logoutByTokenValue(tokenValue); + } + + /** + * 踢人下线,根据账号id + *

当对方再次访问系统时,会抛出NotLoginException异常,场景值=-5

+ * + * @param loginId 账号id + */ + public static void kickout(Object loginId) { + stpLogic.kickout(loginId); + } + + /** + * 踢人下线,根据账号id 和 设备标识 + *

当对方再次访问系统时,会抛出NotLoginException异常,场景值=-5

+ * + * @param loginId 账号id + * @param device 设备标识 (填null代表踢出所有设备) + */ + public static void kickout(Object loginId, String device) { + stpLogic.kickout(loginId, device); + } + + /** + * 踢人下线,根据指定 Token + *

当对方再次访问系统时,会抛出NotLoginException异常,场景值=-5

+ * + * @param tokenValue 指定token + */ + public static void kickoutByTokenValue(String tokenValue) { + stpLogic.kickoutByTokenValue(tokenValue); + } + + /** + * 顶人下线,根据账号id 和 设备标识 + *

当对方再次访问系统时,会抛出NotLoginException异常,场景值=-4

+ * + * @param loginId 账号id + * @param device 设备标识 (填null代表顶替所有设备) + */ + public static void replaced(Object loginId, String device) { + stpLogic.replaced(loginId, device); + } + + + // 查询相关 + + /** + * 当前会话是否已经登录 + * @return 是否已登录 + */ + public static boolean isLogin() { + return stpLogic.isLogin(); + } + + /** + * 检验当前会话是否已经登录,如未登录,则抛出异常 + */ + public static void checkLogin() { + stpLogic.checkLogin(); + } + + /** + * 获取当前会话账号id, 如果未登录,则抛出异常 + * @return 账号id + */ + public static Object getLoginId() { + return stpLogic.getLoginId(); + } + + /** + * 获取当前会话账号id, 如果未登录,则返回默认值 + * @param 返回类型 + * @param defaultValue 默认值 + * @return 登录id + */ + public static T getLoginId(T defaultValue) { + return stpLogic.getLoginId(defaultValue); + } + + /** + * 获取当前会话账号id, 如果未登录,则返回null + * @return 账号id + */ + public static Object getLoginIdDefaultNull() { + return stpLogic.getLoginIdDefaultNull(); + } + + /** + * 获取当前会话账号id, 并转换为String类型 + * @return 账号id + */ + public static String getLoginIdAsString() { + return stpLogic.getLoginIdAsString(); + } + + /** + * 获取当前会话账号id, 并转换为int类型 + * @return 账号id + */ + public static int getLoginIdAsInt() { + return stpLogic.getLoginIdAsInt(); + } + + /** + * 获取当前会话账号id, 并转换为long类型 + * @return 账号id + */ + public static long getLoginIdAsLong() { + return stpLogic.getLoginIdAsLong(); + } + + /** + * 获取指定Token对应的账号id,如果未登录,则返回 null + * @param tokenValue token + * @return 账号id + */ + public static Object getLoginIdByToken(String tokenValue) { + return stpLogic.getLoginIdByToken(tokenValue); + } + + /** + * 获取Token扩展信息(只在jwt模式下有效) + * @param key 键值 + * @return 对应的扩展数据 + */ + public static Object getExtra(String key) { + return stpLogic.getExtra(key); + } + + + // =================== User-Session 相关 =================== + + /** + * 获取指定账号id的Session, 如果Session尚未创建,isCreate=是否新建并返回 + * @param loginId 账号id + * @param isCreate 是否新建 + * @return Session对象 + */ + public static SaSession getSessionByLoginId(Object loginId, boolean isCreate) { + return stpLogic.getSessionByLoginId(loginId, isCreate); + } + + /** + * 获取指定key的Session, 如果Session尚未创建,则返回null + * @param sessionId SessionId + * @return Session对象 + */ + public static SaSession getSessionBySessionId(String sessionId) { + return stpLogic.getSessionBySessionId(sessionId); + } + + /** + * 获取指定账号id的Session,如果Session尚未创建,则新建并返回 + * @param loginId 账号id + * @return Session对象 + */ + public static SaSession getSessionByLoginId(Object loginId) { + return stpLogic.getSessionByLoginId(loginId); + } + + /** + * 获取当前会话的Session, 如果Session尚未创建,isCreate=是否新建并返回 + * @param isCreate 是否新建 + * @return Session对象 + */ + public static SaSession getSession(boolean isCreate) { + return stpLogic.getSession(isCreate); + } + + /** + * 获取当前会话的Session,如果Session尚未创建,则新建并返回 + * @return Session对象 + */ + public static SaSession getSession() { + return stpLogic.getSession(); + } + + + // =================== Token-Session 相关 =================== + + /** + * 获取指定Token-Session,如果Session尚未创建,则新建并返回 + * @param tokenValue Token值 + * @return Session对象 + */ + public static SaSession getTokenSessionByToken(String tokenValue) { + return stpLogic.getTokenSessionByToken(tokenValue); + } + + /** + * 获取当前Token-Session,如果Session尚未创建,则新建并返回 + * @return Session对象 + */ + public static SaSession getTokenSession() { + return stpLogic.getTokenSession(); + } + + + // =================== [临时有效期] 验证相关 =================== + + /** + * 检查当前token 是否已经[临时过期],如果已经过期则抛出异常 + */ + public static void checkActivityTimeout() { + stpLogic.checkActivityTimeout(); + } + + /** + * 续签当前token:(将 [最后操作时间] 更新为当前时间戳) + *

请注意: 即时token已经 [临时过期] 也可续签成功, + * 如果此场景下需要提示续签失败,可在此之前调用 checkActivityTimeout() 强制检查是否过期即可

+ */ + public static void updateLastActivityToNow() { + stpLogic.updateLastActivityToNow(); + } + + + // =================== 过期时间相关 =================== + + /** + * 获取当前登录者的 token 剩余有效时间 (单位: 秒) + * @return token剩余有效时间 + */ + public static long getTokenTimeout() { + return stpLogic.getTokenTimeout(); + } + + /** + * 获取当前登录者的 User-Session 剩余有效时间 (单位: 秒) + * @return token剩余有效时间 + */ + public static long getSessionTimeout() { + return stpLogic.getSessionTimeout(); + } + + /** + * 获取当前 Token-Session 剩余有效时间 (单位: 秒) + * @return token剩余有效时间 + */ + public static long getTokenSessionTimeout() { + return stpLogic.getTokenSessionTimeout(); + } + + /** + * 获取当前 token [临时过期] 剩余有效时间 (单位: 秒) + * @return token [临时过期] 剩余有效时间 + */ + public static long getTokenActivityTimeout() { + return stpLogic.getTokenActivityTimeout(); + } + + /** + * 对当前 Token 的 timeout 值进行续期 + * @param timeout 要修改成为的有效时间 (单位: 秒) + */ + public static void renewTimeout(long timeout) { + stpLogic.renewTimeout(timeout); + } + + /** + * 对指定 Token 的 timeout 值进行续期 + * @param tokenValue 指定token + * @param timeout 要修改成为的有效时间 (单位: 秒) + */ + public static void renewTimeout(String tokenValue, long timeout) { + stpLogic.renewTimeout(tokenValue, timeout); + } + + // =================== 角色验证操作 =================== + + /** + * 获取:当前账号的角色集合 + * @return / + */ + public static List getRoleList() { + return stpLogic.getRoleList(); + } + + /** + * 获取:指定账号的角色集合 + * @param loginId 指定账号id + * @return / + */ + public static List getRoleList(Object loginId) { + return stpLogic.getRoleList(loginId); + } + + /** + * 判断:当前账号是否拥有指定角色, 返回true或false + * @param role 角色标识 + * @return 是否含有指定角色标识 + */ + public static boolean hasRole(String role) { + return stpLogic.hasRole(role); + } + + /** + * 判断:指定账号是否含有指定角色标识, 返回true或false + * @param loginId 账号id + * @param role 角色标识 + * @return 是否含有指定角色标识 + */ + public static boolean hasRole(Object loginId, String role) { + return stpLogic.hasRole(loginId, role); + } + + /** + * 判断:当前账号是否含有指定角色标识 [指定多个,必须全部验证通过] + * @param roleArray 角色标识数组 + * @return true或false + */ + public static boolean hasRoleAnd(String... roleArray) { + return stpLogic.hasRoleAnd(roleArray); + } + + /** + * 判断:当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可] + * @param roleArray 角色标识数组 + * @return true或false + */ + public static boolean hasRoleOr(String... roleArray) { + return stpLogic.hasRoleOr(roleArray); + } + + /** + * 校验:当前账号是否含有指定角色标识, 如果验证未通过,则抛出异常: NotRoleException + * @param role 角色标识 + */ + public static void checkRole(String role) { + stpLogic.checkRole(role); + } + + /** + * 校验:当前账号是否含有指定角色标识 [指定多个,必须全部验证通过] + * @param roleArray 角色标识数组 + */ + public static void checkRoleAnd(String... roleArray) { + stpLogic.checkRoleAnd(roleArray); + } + + /** + * 校验:当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可] + * @param roleArray 角色标识数组 + */ + public static void checkRoleOr(String... roleArray) { + stpLogic.checkRoleOr(roleArray); + } + + + // =================== 权限验证操作 =================== + + /** + * 获取:当前账号的权限码集合 + * @return / + */ + public static List getPermissionList() { + return stpLogic.getPermissionList(); + } + + /** + * 获取:指定账号的权限码集合 + * @param loginId 指定账号id + * @return / + */ + public static List getPermissionList(Object loginId) { + return stpLogic.getPermissionList(loginId); + } + + /** + * 判断:当前账号是否含有指定权限, 返回true或false + * @param permission 权限码 + * @return 是否含有指定权限 + */ + public static boolean hasPermission(String permission) { + return stpLogic.hasPermission(permission); + } + + /** + * 判断:指定账号id是否含有指定权限, 返回true或false + * @param loginId 账号id + * @param permission 权限码 + * @return 是否含有指定权限 + */ + public static boolean hasPermission(Object loginId, String permission) { + return stpLogic.hasPermission(loginId, permission); + } + + /** + * 判断:当前账号是否含有指定权限, [指定多个,必须全部具有] + * @param permissionArray 权限码数组 + * @return true 或 false + */ + public static boolean hasPermissionAnd(String... permissionArray) { + return stpLogic.hasPermissionAnd(permissionArray); + } + + /** + * 判断:当前账号是否含有指定权限 [指定多个,只要其一验证通过即可] + * @param permissionArray 权限码数组 + * @return true 或 false + */ + public static boolean hasPermissionOr(String... permissionArray) { + return stpLogic.hasPermissionOr(permissionArray); + } + + /** + * 校验:当前账号是否含有指定权限, 如果验证未通过,则抛出异常: NotPermissionException + * @param permission 权限码 + */ + public static void checkPermission(String permission) { + stpLogic.checkPermission(permission); + } + + /** + * 校验:当前账号是否含有指定权限 [指定多个,必须全部验证通过] + * @param permissionArray 权限码数组 + */ + public static void checkPermissionAnd(String... permissionArray) { + stpLogic.checkPermissionAnd(permissionArray); + } + + /** + * 校验:当前账号是否含有指定权限 [指定多个,只要其一验证通过即可] + * @param permissionArray 权限码数组 + */ + public static void checkPermissionOr(String... permissionArray) { + stpLogic.checkPermissionOr(permissionArray); + } + + + // =================== id 反查token 相关操作 =================== + + /** + * 获取指定账号id的tokenValue + *

在配置为允许并发登录时,此方法只会返回队列的最后一个token, + * 如果你需要返回此账号id的所有token,请调用 getTokenValueListByLoginId + * @param loginId 账号id + * @return token值 + */ + public static String getTokenValueByLoginId(Object loginId) { + return stpLogic.getTokenValueByLoginId(loginId); + } + + /** + * 获取指定账号id指定设备端的tokenValue + *

在配置为允许并发登录时,此方法只会返回队列的最后一个token, + * 如果你需要返回此账号id的所有token,请调用 getTokenValueListByLoginId + * @param loginId 账号id + * @param device 设备标识 + * @return token值 + */ + public static String getTokenValueByLoginId(Object loginId, String device) { + return stpLogic.getTokenValueByLoginId(loginId, device); + } + + /** + * 获取指定账号id的tokenValue集合 + * @param loginId 账号id + * @return 此loginId的所有相关token + */ + public static List getTokenValueListByLoginId(Object loginId) { + return stpLogic.getTokenValueListByLoginId(loginId); + } + + /** + * 获取指定账号id指定设备端的tokenValue 集合 + * @param loginId 账号id + * @param device 设备标识 + * @return 此loginId的所有相关token + */ + public static List getTokenValueListByLoginId(Object loginId, String device) { + return stpLogic.getTokenValueListByLoginId(loginId, device); + } + + /** + * 返回当前会话的登录设备 + * @return 当前令牌的登录设备 + */ + public static String getLoginDevice() { + return stpLogic.getLoginDevice(); + } + + + // =================== 会话管理 =================== + + /** + * 根据条件查询Token + * @param keyword 关键字 + * @param start 开始处索引 (-1代表查询所有) + * @param size 获取数量 + * @return token集合 + */ + public static List searchTokenValue(String keyword, int start, int size) { + return stpLogic.searchTokenValue(keyword, start, size); + } + + /** + * 根据条件查询SessionId + * @param keyword 关键字 + * @param start 开始处索引 (-1代表查询所有) + * @param size 获取数量 + * @return sessionId集合 + */ + public static List searchSessionId(String keyword, int start, int size) { + return stpLogic.searchSessionId(keyword, start, size); + } + + /** + * 根据条件查询Token专属Session的Id + * @param keyword 关键字 + * @param start 开始处索引 (-1代表查询所有) + * @param size 获取数量 + * @return sessionId集合 + */ + public static List searchTokenSessionId(String keyword, int start, int size) { + return stpLogic.searchTokenSessionId(keyword, start, size); + } + + + // ------------------- 账号封禁 ------------------- + + /** + * 封禁指定账号 + *

此方法不会直接将此账号id踢下线,而是在对方再次登录时抛出`DisableLoginException`异常 + * @param loginId 指定账号id + * @param disableTime 封禁时间, 单位: 秒 (-1=永久封禁) + */ + public static void disable(Object loginId, long disableTime) { + stpLogic.disable(loginId, disableTime); + } + + /** + * 指定账号是否已被封禁 (true=已被封禁, false=未被封禁) + * @param loginId 账号id + * @return see note + */ + public static boolean isDisable(Object loginId) { + return stpLogic.isDisable(loginId); + } + + /** + * 获取指定账号剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁) + * @param loginId 账号id + * @return see note + */ + public static long getDisableTime(Object loginId) { + return stpLogic.getDisableTime(loginId); + } + + /** + * 解封指定账号 + * @param loginId 账号id + */ + public static void untieDisable(Object loginId) { + stpLogic.untieDisable(loginId); + } + + + // =================== 身份切换 =================== + + /** + * 临时切换身份为指定账号id + * @param loginId 指定loginId + */ + public static void switchTo(Object loginId) { + stpLogic.switchTo(loginId); + } + + /** + * 结束临时切换身份 + */ + public static void endSwitch() { + stpLogic.endSwitch(); + } + + /** + * 当前是否正处于[身份临时切换]中 + * @return 是否正处于[身份临时切换]中 + */ + public static boolean isSwitch() { + return stpLogic.isSwitch(); + } + + /** + * 在一个代码段里方法内,临时切换身份为指定账号id + * @param loginId 指定账号id + * @param function 要执行的方法 + */ + public static void switchTo(Object loginId, SaFunction function) { + stpLogic.switchTo(loginId, function); + } + + + // ------------------- 二级认证 ------------------- + + /** + * 在当前会话 开启二级认证 + * @param safeTime 维持时间 (单位: 秒) + */ + public static void openSafe(long safeTime) { + stpLogic.openSafe(safeTime); + } + + /** + * 当前会话 是否处于二级认证时间内 + * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时 + */ + public static boolean isSafe() { + return stpLogic.isSafe(); + } + + /** + * 检查当前会话是否已通过二级认证,如未通过则抛出异常 + */ + public static void checkSafe() { + stpLogic.checkSafe(); + } + + /** + * 获取当前会话的二级认证剩余有效时间 (单位: 秒, 返回-2代表尚未通过二级认证) + * @return 剩余有效时间 + */ + public static long getSafeTime() { + return stpLogic.getSafeTime(); + } + + /** + * 在当前会话 结束二级认证 + */ + public static void closeSafe() { + stpLogic.closeSafe(); + } + + + // =================== 历史API,兼容旧版本 =================== + + /** + *

本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.getLoginType() ,使用方式保持不变

+ * + * 获取当前StpLogin的loginKey + * @return 当前StpLogin的loginKey + */ + @Deprecated + public static String getLoginKey() { + return stpLogic.getLoginType(); + } + + /** + *

本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变

+ * + * 在当前会话上登录id + * @param loginId 登录id,建议的类型:(long | int | String) + */ + @Deprecated + public static void setLoginId(Object loginId) { + stpLogic.login(loginId); + } + + /** + *

本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变

+ * + * 在当前会话上登录id, 并指定登录设备 + * @param loginId 登录id,建议的类型:(long | int | String) + * @param device 设备标识 + */ + @Deprecated + public static void setLoginId(Object loginId, String device) { + stpLogic.login(loginId, device); + } + + /** + *

本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变

+ * + * 在当前会话上登录id, 并指定登录设备 + * @param loginId 登录id,建议的类型:(long | int | String) + * @param isLastingCookie 是否为持久Cookie + */ + @Deprecated + public static void setLoginId(Object loginId, boolean isLastingCookie) { + stpLogic.login(loginId, isLastingCookie); + } + + /** + *

本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变

+ * + * 在当前会话上登录id, 并指定所有登录参数Model + * @param loginId 登录id,建议的类型:(long | int | String) + * @param loginModel 此次登录的参数Model + */ + @Deprecated + public static void setLoginId(Object loginId, SaLoginModel loginModel) { + stpLogic.login(loginId, loginModel); + } + + /** + *

本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.kickout() ,使用方式保持不变

+ * + * 会话注销,根据账号id (踢人下线) + *

当对方再次访问系统时,会抛出NotLoginException异常,场景值=-2 + * @param loginId 账号id + */ + @Deprecated + public static void logoutByLoginId(Object loginId) { + stpLogic.kickout(loginId); + } + + /** + *

本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.kickout() ,使用方式保持不变

+ * + * 会话注销,根据账号id and 设备标识 (踢人下线) + *

当对方再次访问系统时,会抛出NotLoginException异常,场景值=-2

+ * @param loginId 账号id + * @param device 设备标识 (填null代表所有注销设备) + */ + @Deprecated + public static void logoutByLoginId(Object loginId, String device) { + stpLogic.kickout(loginId, device); + } +} diff --git a/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/util/StpLoginUserUtil.java b/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/util/StpLoginUserUtil.java new file mode 100644 index 00000000..dcdb01dd --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/util/StpLoginUserUtil.java @@ -0,0 +1,55 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.core.util; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.collection.CollectionUtil; +import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser; +import vip.xiaonuo.common.util.CommonServletUtil; + +import java.util.List; + +/** + * B端登录用户工具类 + * + * @author xuyuxiang + * @date 2022/7/8 10:40 + **/ +public class StpLoginUserUtil { + + /** + * 获取当前B端登录用户 + * + * @author xuyuxiang + * @date 2022/7/8 10:41 + **/ + public static SaBaseLoginUser getLoginUser() { + return (SaBaseLoginUser) StpUtil.getTokenSession().get("loginUser"); + } + + /** + * 获取当前B端登录用户的当前请求接口的数据范围 + * + * @author xuyuxiang + * @date 2022/7/8 10:41 + **/ + public static List getLoginUserDataScope() { + List resultList = CollectionUtil.newArrayList(); + getLoginUser().getDataScopeList().forEach(dataScope -> { + if(dataScope.getApiUrl().equals(CommonServletUtil.getRequest().getServletPath())) { + resultList.addAll(dataScope.getDataScope()); + } + }); + return resultList; + } +} diff --git a/snowy-plugin-api/snowy-plugin-biz-api/README.md b/snowy-plugin-api/snowy-plugin-biz-api/README.md new file mode 100644 index 00000000..480d29de --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-biz-api/README.md @@ -0,0 +1 @@ +# 业务功能插件api接口 \ No newline at end of file diff --git a/snowy-plugin-api/snowy-plugin-biz-api/pom.xml b/snowy-plugin-api/snowy-plugin-biz-api/pom.xml new file mode 100644 index 00000000..77f13209 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-biz-api/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + + + vip.xiaonuo + snowy-plugin-api + 2.0.0 + + + snowy-plugin-biz-api + jar + 业务功能插件api接口 + + + + + vip.xiaonuo + snowy-common + ${project.parent.version} + + + \ No newline at end of file diff --git a/snowy-plugin-api/snowy-plugin-biz-api/src/main/java/vip/xiaonuo/biz/package-info.java b/snowy-plugin-api/snowy-plugin-biz-api/src/main/java/vip/xiaonuo/biz/package-info.java new file mode 100644 index 00000000..ba79db40 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-biz-api/src/main/java/vip/xiaonuo/biz/package-info.java @@ -0,0 +1,13 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz; \ No newline at end of file diff --git a/snowy-plugin-api/snowy-plugin-client-api/README.md b/snowy-plugin-api/snowy-plugin-client-api/README.md new file mode 100644 index 00000000..7353fbe3 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-client-api/README.md @@ -0,0 +1 @@ +# C端功能插件api接口 \ No newline at end of file diff --git a/snowy-plugin-api/snowy-plugin-client-api/pom.xml b/snowy-plugin-api/snowy-plugin-client-api/pom.xml new file mode 100644 index 00000000..c1a014c1 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-client-api/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + + + vip.xiaonuo + snowy-plugin-api + 2.0.0 + + + snowy-plugin-client-api + jar + C端功能插件api接口 + + + + + vip.xiaonuo + snowy-common + ${project.parent.version} + + + \ No newline at end of file diff --git a/snowy-plugin-api/snowy-plugin-client-api/src/main/java/vip/xiaonuo/client/package-info.java b/snowy-plugin-api/snowy-plugin-client-api/src/main/java/vip/xiaonuo/client/package-info.java new file mode 100644 index 00000000..423f9e67 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-client-api/src/main/java/vip/xiaonuo/client/package-info.java @@ -0,0 +1,13 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.client; \ No newline at end of file diff --git a/snowy-plugin-api/snowy-plugin-dev-api/README.md b/snowy-plugin-api/snowy-plugin-dev-api/README.md new file mode 100644 index 00000000..2d3e03e9 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-dev-api/README.md @@ -0,0 +1 @@ +# 开发工具插件api接口 \ No newline at end of file diff --git a/snowy-plugin-api/snowy-plugin-dev-api/pom.xml b/snowy-plugin-api/snowy-plugin-dev-api/pom.xml new file mode 100644 index 00000000..e9036cbf --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-dev-api/pom.xml @@ -0,0 +1,101 @@ + + + 4.0.0 + + + vip.xiaonuo + snowy-plugin-api + 2.0.0 + + + snowy-plugin-dev-api + jar + 开发工具插件api接口 + + + 5.6.68 + 3.1.455 + 3.1.455 + 3.14.0 + 3.0.12 + 1.6.2 + 3.3.1 + 3.1.0 + 2.0.9 + 6.2.2 + + + + + + vip.xiaonuo + snowy-common + ${project.parent.version} + + + + + com.qcloud + cos_api + ${ten.cos.version} + + + + + com.aliyun.oss + aliyun-sdk-oss + ${ali.oss.version} + + + + + io.minio + minio + ${minio.version} + + + + + com.sun.mail + javax.mail + ${javax.mail.version} + + + + + com.aliyun + aliyun-java-sdk-dm + ${aliyun.sdk.dm.version} + + + + + com.tencentcloudapi + tencentcloud-sdk-java-ses + ${ten.sdk.ses.version} + + + + + com.aliyun + dysmsapi20170525 + ${aliyun.sdk.dysmsapi.version} + + + + + com.tencentcloudapi + tencentcloud-sdk-java-sms + ${ten.sdk.sms.version} + + + + + com.github.oshi + oshi-core + ${oshi.core.version} + + + \ No newline at end of file diff --git a/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevConfigApi.java b/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevConfigApi.java new file mode 100644 index 00000000..5ffc5a2a --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevConfigApi.java @@ -0,0 +1,30 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.api; + +/** + * 配置APi接口 + * + * @author xuyuxiang + * @date 2022/6/17 10:37 + **/ +public interface DevConfigApi { + + /** + * 根据键获取值 + * + * @author xuyuxiang + * @date 2022/6/17 11:11 + **/ + String getValueByKey(String key); +} diff --git a/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevDictApi.java b/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevDictApi.java new file mode 100644 index 00000000..36a9d904 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevDictApi.java @@ -0,0 +1,22 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.api; + +/** + * 字典API + * + * @author xuyuxiang + * @date 2022/9/2 15:58 + */ +public interface DevDictApi { +} diff --git a/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevEmailApi.java b/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevEmailApi.java new file mode 100644 index 00000000..0704bb7d --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevEmailApi.java @@ -0,0 +1,142 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.api; + +import cn.hutool.json.JSONObject; + +import java.io.File; +import java.io.InputStream; +import java.util.List; +import java.util.Map; + +/** + * 邮件API接口 + * + * @author xuyuxiang + * @date 2022/6/22 15:21 + **/ +public interface DevEmailApi { + + /* =========本地邮件========= */ + + /** + * 发送纯文本邮件 + * + * @param tos 收件人邮箱,逗号拼接 + * @param subject 邮件主题 + * @param content 邮件内容 + * @param files 附件列表 + * @author xuyuxiang + * @date 2022/2/7 22:29 + */ + void sendTextEmailLocal(String tos, String subject, String content, List files); + + /** + * 发送HTML邮件 + * + * @param tos 收件人邮箱,逗号拼接 + * @param subject 邮件主题 + * @param content 邮件内容 + * @param imageMap – 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER + * @param files 附件列表 + * @author xuyuxiang + * @date 2022/2/7 22:29 + */ + void sendHtmlEmailLocal(String tos, String subject, String content, Map imageMap, List files); + + /* =========阿里云邮件========= */ + + /** + * 发送纯文本邮件(不使用模板,频率限制100 QPS) + * + * @param from 管理控制台中配置的发信地址,必传且必须正确 + * @param user 发信人昵称,长度小于15个字符,可不传 + * @param tos 目标地址,多个 email 地址可以用逗号分隔,最多100个地址,必传且必须正确 + * @param subject 邮件主题,必传 + * @param content 邮件 txt 正文,限制28K,必传 + * @author xuyuxiang + * @date 2022/2/23 14:24 + **/ + void sendTextEmailAliyun(String from, String user, String tos, String subject, String content); + + /** + * 发送HTML邮件(不使用模板,频率限制100 QPS) + * + * @param from 管理控制台中配置的发信地址,必传且必须正确 + * @param user 发信人昵称,长度小于15个字符,可不传 + * @param tos 目标地址,多个 email 地址可以用逗号分隔,最多100个地址,必传且必须正确 + * @param subject 邮件主题,必传 + * @param content 邮件 html 正文,限制28K,必传 + * @author xuyuxiang + * @date 2022/2/23 14:24 + **/ + void sendHtmlEmailAliyun(String from, String user, String tos, String subject, String content); + + /** + * 使用模板发送邮件,国内频率限制是20/min;海外频率限制是10/min。 + * + * @param from 管理控制台中配置的发信地址,必传且必须正确 + * @param tagName 控制台创建的邮件标签,可不传 + * @param toName 预先创建且上传了收件人的收件人列表名称,必传且必须正确 + * @param templateName 预先创建且通过审核的模板名称,必传且必须正确 + * @author xuyuxiang + * @date 2022/2/23 14:24 + **/ + void sendEmailWithTemplateAliyun(String from, String tagName, String toName, String templateName); + + /* =========腾讯云邮件========= */ + + /** + * 发送纯文本邮件(不使用模板,默认接口请求频率限制:20次/秒。) + * + * @param from 管理控制台中配置的发信地址,必传且必须正确 + * @param user 发信人昵称,可不传 + * @param tos 目标地址,多个 email 地址可以用逗号分隔,最多50个地址,必传且必须正确,非群发邮件请多次调用API发送 + * @param subject 邮件主题,必传 + * @param content 邮件 txt 正文,必传,注意:腾讯云api目前要求请求包大小不得超过8 MB。 + * @param attachmentList 需要发送附件时,填写附件相关参数,格式:[{"FileName": "xxxx", "Content": "xxx"}] + * 支持的格式与说明见:https://cloud.tencent.com/document/api/1288/51053#Attachment + * @author xuyuxiang + * @date 2022/2/23 14:24 + **/ + void sendTextEmailTencent(String from, String user, String tos, String subject, String content, List attachmentList); + + /** + * 发送HTML邮件(不使用模板,默认接口请求频率限制:20次/秒。) + * + * @param from 管理控制台中配置的发信地址,必传且必须正确 + * @param user 发信人昵称,可不传 + * @param tos 目标地址,多个 email 地址可以用逗号分隔,最多50个地址,必传且必须正确,非群发邮件请多次调用API发送 + * @param subject 邮件主题,必传 + * @param content 邮件 txt 正文,必传,注意:腾讯云api目前要求请求包大小不得超过8 MB。 + * @param attachmentList 需要发送附件时,填写附件相关参数,格式:[{"FileName": "xxxx", "Content": "xxx"}] + * 支持的格式与说明见:https://cloud.tencent.com/document/api/1288/51053#Attachment + * @author xuyuxiang + * @date 2022/2/23 14:24 + **/ + void sendHtmlEmailTencent(String from, String user, String tos, String subject, String content, List attachmentList); + + /** + * 使用模板发送邮件,默认接口请求频率限制:20次/秒。 + * + * @param from 管理控制台中配置的发信地址,必传且必须正确 + * @param user 发信人昵称,可不传 + * @param toId 预先创建且上传了收件人的收件人列表id,必传且必须正确 + * @param templateId 预先创建且通过审核的模板Id,必传且必须正确 + * @param templateParam 预先创建且通过审核的模板的参数json,格式{"name":"张三"},可不传 + * @param subject 邮件主题,必传 + * @author xuyuxiang + * @date 2022/2/23 14:24 + **/ + void sendEmailWithTemplateTencent(String from, String user, String toId, String templateId, String templateParam, String subject, List attachmentList); +} diff --git a/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevFileApi.java b/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevFileApi.java new file mode 100644 index 00000000..06a2b6c9 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevFileApi.java @@ -0,0 +1,104 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.api; + +import org.springframework.web.multipart.MultipartFile; + +/** + * 文件API接口,可参考vip.xiaonuo.dev.core.util.file包下的工具类扩展更多需要的方法 + * + * @author xuyuxiang + * @date 2022/6/22 15:21 + **/ +public interface DevFileApi { + + /* =========本地文件========= */ + + /** + * 上传文件返回Url + * + * @param file 文件 + * @author xuyuxiang + * @date 2022/6/22 17:44 + **/ + String storageFileWithReturnUrlLocal(MultipartFile file); + + /** + * 上传文件返回Id + * + * @param file 文件 + * @author xuyuxiang + * @date 2022/6/22 17:44 + **/ + String storageFileWithReturnIdLocal(MultipartFile file); + + /* =========阿里云文件========= */ + + /** + * 上传文件返回Url + * + * @param file 文件 + * @author xuyuxiang + * @date 2022/6/22 17:44 + **/ + String storageFileWithReturnUrlAliyun(MultipartFile file); + + /** + * 上传文件返回Id + * + * @param file 文件 + * @author xuyuxiang + * @date 2022/6/22 17:44 + **/ + String storageFileWithReturnIdAliyun(MultipartFile file); + + /* =========腾讯云件========= */ + + /** + * 上传文件返回Url + * + * @param file 文件 + * @author xuyuxiang + * @date 2022/6/22 17:44 + **/ + String storageFileWithReturnUrlTencent(MultipartFile file); + + /** + * 上传文件返回Id + * + * @param file 文件 + * @author xuyuxiang + * @date 2022/6/22 17:44 + **/ + String storageFileWithReturnIdTencent(MultipartFile file); + + /* =========MINIO件========= */ + + /** + * 上传文件返回Url + * + * @param file 文件 + * @author xuyuxiang + * @date 2022/6/22 17:44 + **/ + String storageFileWithReturnUrlMinio(MultipartFile file); + + /** + * 上传文件返回Id + * + * @param file 文件 + * @author xuyuxiang + * @date 2022/6/22 17:44 + **/ + String storageFileWithReturnIdMinio(MultipartFile file); +} diff --git a/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevJobApi.java b/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevJobApi.java new file mode 100644 index 00000000..b1f85818 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevJobApi.java @@ -0,0 +1,22 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.api; + +/** + * 定时任务API + * + * @author xuyuxiang + * @date 2022/9/2 15:59 + */ +public interface DevJobApi { +} diff --git a/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevLogApi.java b/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevLogApi.java new file mode 100644 index 00000000..2dc7e450 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevLogApi.java @@ -0,0 +1,58 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.api; + +import cn.hutool.json.JSONObject; + +import java.util.List; + +/** + * 日志API + * + * @author xuyuxiang + * @date 2022/9/2 15:59 + */ +public interface DevLogApi { + + /** + * 记录登录日志 + * + * @author xuyuxiang + * @date 2022/9/2 16:03 + */ + void executeLoginLog(String userName); + + /** + * 记录登出日志 + * + * @author xuyuxiang + * @date 2022/9/2 16:03 + */ + void executeLogoutLog(String userName); + + /** + * 获取当前用户的访问日志列表 + * + * @author xuyuxiang + * @date 2022/9/4 15:12 + */ + List currentUserVisLogList(); + + /** + * 获取当前用户的操作日志列表 + * + * @author xuyuxiang + * @date 2022/9/4 15:12 + */ + List currentUserOpLogList(); +} diff --git a/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevMessageApi.java b/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevMessageApi.java new file mode 100644 index 00000000..2ff5b6de --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevMessageApi.java @@ -0,0 +1,95 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.api; + +import cn.hutool.json.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import java.util.List; + +/** + * 站内信API接口 + * + * @author xuyuxiang + * @date 2022/6/22 17:33 + **/ +public interface DevMessageApi { + + /** + * 发送站内信,默认:分类系统通知 + * + * @param receiverIdList 接收的用户id集合 + * @param subject 主题 + * @author xuyuxiang + * @date 2022/6/22 17:35 + **/ + void sendMessage(List receiverIdList, String subject); + + /** + * 发送站内信指定分类 + * + * @param receiverIdList 接收的用户id集合 + * @param subject 主题 + * @author xuyuxiang + * @date 2022/6/22 17:35 + **/ + void sendMessage(List receiverIdList, String category, String subject); + + /** + * 发送站内信带内容,默认:分类系统通知 + * + * @param receiverIdList 接收的用户id集合 + * @param subject 主题 + * @param content 站内信内容 + * @author xuyuxiang + * @date 2022/6/22 17:35 + **/ + void sendMessageWithContent(List receiverIdList, String subject, String content); + + /** + * 发送站内信带内容,指定分类 + * + * @param receiverIdList 接收的用户id集合 + * @param subject 主题 + * @param content 站内信内容 + * @author xuyuxiang + * @date 2022/6/22 17:35 + **/ + void sendMessageWithContent(List receiverIdList, String category, String subject, String content); + + /** + * 获取未读站内信列表 + * + * @author xuyuxiang + * @date 2022/9/2 11:48 + */ + List list(List receiverIdList, Integer limit); + + /** + * 获取站内信分页 + * + * @author xuyuxiang + * @date 2022/9/2 11:48 + */ + Page page(List receiverIdList, String category); + + /** + * 获取站内信详情 + * + * @param id 站内信id + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + JSONObject detail(String id); + +} diff --git a/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevSmsApi.java b/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevSmsApi.java new file mode 100644 index 00000000..29c22a0d --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-dev-api/src/main/java/vip/xiaonuo/dev/api/DevSmsApi.java @@ -0,0 +1,54 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.api; + +/** + * 短信API + * + * @author xuyuxiang + * @date 2022/6/22 15:22 + **/ +public interface DevSmsApi { + + /* =========阿里云邮件========= */ + + /** + * 发送短信 + * + * @param phoneNumbers 手机号码,支持对多个手机号码发送短信,手机号码之间以半角逗号(,)分隔。 + * 上限为1000个手机号码。批量调用相对于单条调用及时性稍有延迟。 + * @param signName 短信服务控制台配置且审核通过的短信签名 + * @param templateCode 短信服务控制台配置且审核通过的模板编码 + * @param templateParam 短信模板变量对应的实际值,JSON格式。支持传入多个参数,示例:{"name":"张三","number":"15038****76"} + * @author xuyuxiang + * @date 2022/2/24 13:42 + **/ + void sendSmsAliyun(String phoneNumbers, String signName, String templateCode, String templateParam); + + /* =========腾讯云邮件========= */ + + /** + * 发送短信 + * + * @param sdkAppId 短信 SdkAppId,在 短信控制台 添加应用后生成的实际 SdkAppId,示例如1400006666。 + * 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看 + * @param phoneNumbers 手机号码,支持对多个手机号码发送短信,手机号码之间以半角逗号(,)分隔。 + * 上限为1000个手机号码。批量调用相对于单条调用及时性稍有延迟。 + * @param signName 短信服务控制台配置且审核通过的短信签名 + * @param templateCode 短信服务控制台配置且审核通过的模板编码 + * @param templateParam 短信模板变量对应的顺序。支持传入多个参数,逗号拼接,示例:"张三,15038****76,进行中"} + * @author xuyuxiang + * @date 2022/2/24 13:42 + **/ + void sendSmsTencent(String sdkAppId, String phoneNumbers, String signName, String templateCode, String templateParam); +} diff --git a/snowy-plugin-api/snowy-plugin-sys-api/README.md b/snowy-plugin-api/snowy-plugin-sys-api/README.md new file mode 100644 index 00000000..f8a5b6e2 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-sys-api/README.md @@ -0,0 +1 @@ +# 系统功能插件api接口 \ No newline at end of file diff --git a/snowy-plugin-api/snowy-plugin-sys-api/pom.xml b/snowy-plugin-api/snowy-plugin-sys-api/pom.xml new file mode 100644 index 00000000..d0a3801a --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-sys-api/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + + + vip.xiaonuo + snowy-plugin-api + 2.0.0 + + + snowy-plugin-sys-api + jar + 系统功能插件api接口 + + + + + vip.xiaonuo + snowy-common + ${project.parent.version} + + + \ No newline at end of file diff --git a/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/README.md b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/README.md new file mode 100644 index 00000000..2f4270be --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/README.md @@ -0,0 +1 @@ +#系统API接口 \ No newline at end of file diff --git a/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysOrgApi.java b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysOrgApi.java new file mode 100644 index 00000000..f745427d --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysOrgApi.java @@ -0,0 +1,59 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.api; + +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.json.JSONObject; + +import java.util.List; + +/** + * 组织API + * + * @author xuyuxiang + * @date 2022/6/6 11:35 + **/ +public interface SysOrgApi { + + /** + * 根据id获取名称 + * + * @author xuyuxiang + * @date 2022/8/4 10:12 + **/ + String getNameById(String orgId); + + /** + * 根据组织id获取部门主管id + * + * @author xuyuxiang + * @date 2022/6/6 14:50 + **/ + String getSupervisorIdByOrgId(String orgId); + + /** + * 获取组织树选择器 + * + * @author xuyuxiang + * @date 2022/7/22 14:46 + **/ + List> orgTreeSelector(); + + /** + * 获取组织列表选择器 + * + * @author xuyuxiang + * @date 2022/7/22 14:45 + **/ + List orgListSelector(String parentId); +} diff --git a/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysPositionApi.java b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysPositionApi.java new file mode 100644 index 00000000..ecd5e7d8 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysPositionApi.java @@ -0,0 +1,42 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.api; + +import cn.hutool.json.JSONObject; + +import java.util.List; + +/** + * 职位API + * + * @author xuyuxiang + * @date 2022/6/6 11:35 + **/ +public interface SysPositionApi { + + /** + * 根据id获取名称 + * + * @author xuyuxiang + * @date 2022/8/4 10:13 + **/ + String getNameById(String positionId); + + /** + * 获取职位选择器 + * + * @author xuyuxiang + * @date 2022/7/22 14:47 + **/ + List positionSelector(String orgId, String searchKey); +} diff --git a/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysRelationApi.java b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysRelationApi.java new file mode 100644 index 00000000..1df91d96 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysRelationApi.java @@ -0,0 +1,32 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.api; + +import java.util.List; + +/** + * 关系API + * + * @author xuyuxiang + * @date 2022/6/6 11:41 + **/ +public interface SysRelationApi { + + /** + * 根据角色id集合获取角色下用户id集合 + * + * @author xuyuxiang + * @date 2022/6/6 11:43 + **/ + List getUserIdListByRoleIdList(List roleIdList); +} diff --git a/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysRoleApi.java b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysRoleApi.java new file mode 100644 index 00000000..5e0e4ed4 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysRoleApi.java @@ -0,0 +1,42 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.api; + +import cn.hutool.json.JSONObject; + +import java.util.List; + +/** + * 角色API + * + * @author xuyuxiang + * @date 2022/6/6 11:36 + **/ +public interface SysRoleApi { + + /** + * 判断组织下是否存在角色 + * + * @author xuyuxiang + * @date 2022/8/2 11:16 + */ + boolean orgHasRole(List orgIdList); + + /** + * 获取角色选择器 + * + * @author xuyuxiang + * @date 2022/7/22 14:49 + **/ + List roleSelector(String orgId, String category, String searchKey); +} diff --git a/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysUserApi.java b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysUserApi.java new file mode 100644 index 00000000..85d60196 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysUserApi.java @@ -0,0 +1,106 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.api; + +import cn.hutool.json.JSONObject; + +import java.util.List; + +/** + * 用户Api + * + * @author xuyuxiang + * @date 2022/6/6 11:33 + **/ +public interface SysUserApi { + + /** + * 根据用户id获取用户对象,没有则返回null + * + * @author xuyuxiang + * @date 2022/6/20 18:19 + **/ + JSONObject getUserByIdWithoutException(String userId); + + /** + * 根据用户id获取用户对象列表,没有的则为空,都没有则返回空集合 + * + * @author xuyuxiang + * @date 2022/6/20 18:19 + **/ + List getUserListByIdListWithoutException(List userIdList); + + /** + * 根据用户id获取用户对象,没有则抛出异常 + * + * @author xuyuxiang + * @date 2022/6/20 18:19 + **/ + JSONObject getUserByIdWithException(String userId); + + /** + * 根据用户id获取用户对象列表,只要有一个没有则抛出异常 + * + * @author xuyuxiang + * @date 2022/6/20 18:19 + **/ + List getUserListByIdWithException(List userIdList); + + /** + * 获取用户拥有角色 + * + * @author xuyuxiang + * @date 2022/5/13 21:00 + */ + List ownRole(String userId); + + /** + * 给用户授权角色 + * + * @author xuyuxiang + * @date 2022/8/1 18:28 + */ + void grantRole(String userId, List roleIdList); + + /** + * 根据组织id集合获取组织下用户id集合 + * + * @author xuyuxiang + * @date 2022/6/6 11:40 + **/ + List getUserIdListByOrgIdList(List orgIdList); + + /** + * 根据职位id集合获取职位下用户id集合 + * + * @author xuyuxiang + * @date 2022/6/6 11:44 + **/ + List getUserIdListByPositionIdList(List positionIdList); + + /** + * 根据用户id和组织id和职位id获取上级主管id + * + * @author xuyuxiang + * @date 2022/6/6 14:50 + **/ + String getSupervisorIdByUserIdAndOrgIdAndPositionId(String userId, String orgId, String positionId); + + /** + * 获取用户选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + List userSelector(String orgId, String searchKey); +} diff --git a/snowy-plugin/README.md b/snowy-plugin/README.md new file mode 100644 index 00000000..1d9cb4bd --- /dev/null +++ b/snowy-plugin/README.md @@ -0,0 +1,11 @@ +# 插件模块 + +####登录鉴权插件: snowy-plugin-auth + +####业务功能插件: snowy-plugin-biz + +####C端功能插件: snowy-plugin-client + +####开发工具插件: snowy-plugin-dev + +####系统功能插件: snowy-plugin-sys \ No newline at end of file diff --git a/snowy-plugin/pom.xml b/snowy-plugin/pom.xml new file mode 100644 index 00000000..92d9db4a --- /dev/null +++ b/snowy-plugin/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + + vip.xiaonuo + snowy + 2.0.0 + + + snowy-plugin + pom + 插件模块 + + + + snowy-plugin-auth + + + snowy-plugin-biz + + + snowy-plugin-client + + + snowy-plugin-dev + + + snowy-plugin-sys + + diff --git a/snowy-plugin/snowy-plugin-auth/README.md b/snowy-plugin/snowy-plugin-auth/README.md new file mode 100644 index 00000000..676168d8 --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/README.md @@ -0,0 +1 @@ +# 登录鉴权插件 \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-auth/pom.xml b/snowy-plugin/snowy-plugin-auth/pom.xml new file mode 100644 index 00000000..f47fe9db --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/pom.xml @@ -0,0 +1,73 @@ + + + 4.0.0 + + + vip.xiaonuo + snowy-plugin + 2.0.0 + + + snowy-plugin-auth + jar + 登录鉴权插件 + + + 1.30.0 + 1.16.5 + + + + + + + vip.xiaonuo + snowy-plugin-auth-api + ${project.parent.version} + + + + + vip.xiaonuo + snowy-plugin-dev-api + ${project.parent.version} + + + + + cn.dev33 + sa-token-spring-boot-starter + ${sa.token.version} + + + + + cn.dev33 + sa-token-dao-redis-jackson + ${sa.token.version} + + + + + cn.dev33 + sa-token-alone-redis + ${sa.token.version} + + + + + cn.dev33 + sa-token-sso + ${sa.token.version} + + + + + me.zhyd.oauth + JustAuth + ${just.auth.version} + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/core/config/AuthConfigure.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/core/config/AuthConfigure.java new file mode 100644 index 00000000..532ba60e --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/core/config/AuthConfigure.java @@ -0,0 +1,140 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.core.config; + +import cn.dev33.satoken.interceptor.SaAnnotationInterceptor; +import cn.dev33.satoken.stp.StpInterface; +import cn.dev33.satoken.stp.StpLogic; +import cn.dev33.satoken.strategy.SaStrategy; +import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver; +import io.swagger.annotations.ApiOperation; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import vip.xiaonuo.auth.core.enums.SaClientTypeEnum; +import vip.xiaonuo.auth.core.util.StpLoginUserUtil; +import vip.xiaonuo.common.pojo.CommonResult; + +import javax.annotation.Resource; +import java.util.List; + +/** + * SaToken鉴权配置 + * + * @author xuyuxiang + * @date 2021/10/9 14:24 + **/ +@Configuration +public class AuthConfigure implements WebMvcConfigurer { + + @Resource + private OpenApiExtensionResolver openApiExtensionResolver; + + /** + * 注册Sa-Token的注解拦截器,打开注解式鉴权功能 + * + * 注解的方式有以下几中,注解既可以加在接口方法上,也可加在Controller类上: + * 1.@SaCheckLogin: 登录认证 —— 只有登录之后才能进入该方法(常用) + * 2.@SaCheckRole("admin"): 角色认证 —— 必须具有指定角色标识才能进入该方法(常用) + * 3.@SaCheckPermission("user:add"): 权限认证 —— 必须具有指定权限才能进入该方法(常用) + * 4.@SaCheckSafe: 二级认证校验 —— 必须二级认证之后才能进入该方法 + * 5.@SaCheckBasic: HttpBasic认证 —— 只有通过 Basic 认证后才能进入该方法 + * + * 在Controller中创建一个接口,默认不需要登录也不需要任何权限都可以访问的,只有加了上述注解才会校验 + **/ + @Override + public void addInterceptors(InterceptorRegistry registry) { + // 注册注解拦截器,并排除不需要注解鉴权的接口地址 (与登录拦截器无关,只是说明哪些接口不需要被拦截器拦截,此处都拦截) + registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**"); + } + + @Bean("stpLogic") + public StpLogic getStpLogic() { + // 重写Sa-Token的StpLogic,默认客户端类型为B + return new StpLogic(SaClientTypeEnum.B.getValue()); + } + + @Bean("stpClientLogic") + public StpLogic getStpClientLogic() { + // 重写Sa-Token的StpLogic,默认客户端类型为C + return new StpLogic(SaClientTypeEnum.C.getValue()); + } + + @Bean + public void rewriteSaStrategy() { + // 重写Sa-Token的注解处理器,增加注解合并功能 + SaStrategy.me.getAnnotation = AnnotatedElementUtils::getMergedAnnotation; + } + + /** + * 权限认证接口实现类,集成权限认证功能 + * + * @author xuyuxiang + * @date 2022/7/7 16:16 + **/ + @Component + public static class StpInterfaceImpl implements StpInterface { + + /** + * 返回一个账号所拥有的权限码集合 + */ + @Override + public List getPermissionList(Object loginId, String loginType) { + return StpLoginUserUtil.getLoginUser().getPermissionCodeList(); + } + + /** + * 返回一个账号所拥有的角色标识集合 + */ + @Override + public List getRoleList(Object loginId, String loginType) { + return StpLoginUserUtil.getLoginUser().getRoleCodeList(); + } + } + + /** + * API文档分组配置 + * + * @author xuyuxiang + * @date 2022/7/7 16:18 + **/ + @Bean(value = "authDocApi") + public Docket authDocApi() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(new ApiInfoBuilder() + .title("登录鉴权AUTH") + .description("登录鉴权AUTH") + .termsOfServiceUrl("https://www.xiaonuo.vip") + .contact(new Contact("SNOWY_TEAM","https://www.xiaonuo.vip", "xuyuxiang29@foxmail.com")) + .version("2.0.0") + .build()) + .globalResponseMessage(RequestMethod.GET, CommonResult.responseList()) + .globalResponseMessage(RequestMethod.POST, CommonResult.responseList()) + .groupName("登录鉴权AUTH") + .select() + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + .apis(RequestHandlerSelectors.basePackage("vip.xiaonuo.auth")) + .paths(PathSelectors.any()) + .build().extensions(openApiExtensionResolver.buildExtensions("登录鉴权AUTH")); + } +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/core/util/AuthExceptionUtil.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/core/util/AuthExceptionUtil.java new file mode 100644 index 00000000..29dfadcc --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/core/util/AuthExceptionUtil.java @@ -0,0 +1,68 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.core.util; + +import cn.dev33.satoken.context.SaHolder; +import cn.dev33.satoken.exception.*; +import cn.hutool.http.HttpStatus; +import lombok.extern.slf4j.Slf4j; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.util.CommonServletUtil; + +@Slf4j +public class AuthExceptionUtil { + + /** + * 根据错误类型获取对应的CommonResult(只处理SaToken相关异常) + * + * @author xuyuxiang + * @date 2021/10/11 15:52 + **/ + public static CommonResult getCommonResult(Exception e) { + CommonResult commonResult; + if (e instanceof NotLoginException) { + + // 如果是未登录异常 401 + NotLoginException notLoginException = (NotLoginException) e; + commonResult = CommonResult.get(HttpStatus.HTTP_UNAUTHORIZED, notLoginException.getMessage(), null); + } else if (e instanceof NotRoleException) { + + // 如果是角色异常 403 + NotRoleException notRoleException = (NotRoleException) e; + commonResult = CommonResult.get(HttpStatus.HTTP_FORBIDDEN, "无此角色:" + notRoleException.getRole() + + ",接口地址:" + CommonServletUtil.getRequest().getServletPath(), null); + } else if (e instanceof NotPermissionException) { + + // 如果是权限异常 403 + NotPermissionException notPermissionException = (NotPermissionException) e; + commonResult = CommonResult.get(HttpStatus.HTTP_FORBIDDEN, "无此权限:" + notPermissionException.getPermission(), null); + } else if (e instanceof DisableLoginException) { + + // 如果是被封禁异常 403 + DisableLoginException disableLoginException = (DisableLoginException) e; + commonResult = CommonResult.get(HttpStatus.HTTP_FORBIDDEN, "账号被封禁:" + disableLoginException.getDisableTime() + "秒后解封", null); + } else if (e instanceof SaTokenException) { + + // 如果是SaToken异常 直接返回 + SaTokenException saTokenException = (SaTokenException) e; + commonResult = CommonResult.error(saTokenException.getMessage()); + } else { + // 未知异常才打印 + e.printStackTrace(); + // 未知异常返回服务器异常(此处不可能执行进入,因为本方法处理的一定是SaToken的异常,此处仅为安全性考虑) + commonResult = CommonResult.error("服务器异常"); + } + log.error(">>> {},请求地址:{}", commonResult.getMsg(), SaHolder.getRequest().getUrl()); + return commonResult; + } +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/controller/AuthClientController.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/controller/AuthClientController.java new file mode 100644 index 00000000..2684f989 --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/controller/AuthClientController.java @@ -0,0 +1,133 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.login.controller; + +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.auth.core.annotation.SaClientCheckLogin; +import vip.xiaonuo.auth.core.enums.SaClientTypeEnum; +import vip.xiaonuo.auth.core.pojo.SaBaseClientLoginUser; +import vip.xiaonuo.auth.core.util.StpClientUtil; +import vip.xiaonuo.auth.modular.login.param.AuthAccountPasswordLoginParam; +import vip.xiaonuo.auth.modular.login.param.AuthGetPhoneValidCodeParam; +import vip.xiaonuo.auth.modular.login.param.AuthPhoneValidCodeLoginParam; +import vip.xiaonuo.auth.modular.login.result.AuthPicValidCodeResult; +import vip.xiaonuo.auth.modular.login.service.AuthService; +import vip.xiaonuo.common.pojo.CommonResult; + +import javax.annotation.Resource; +import javax.validation.Valid; + +/** + * C端登录控制器 + * + * @author xuyuxiang + * @date 2021/12/23 21:50 + */ +@Api(tags = "C端登录控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 1) +@RestController +@Validated +public class AuthClientController { + + @Resource + private AuthService authService; + + /** + * C端获取图片验证码 + * + * @author xuyuxiang + * @date 2022/7/8 9:26 + **/ + @ApiOperationSupport(order = 1) + @ApiOperation("C端获取图片验证码") + @GetMapping("/auth/c/getPicCaptcha") + public CommonResult getPicCaptcha() { + return CommonResult.data(authService.getPicCaptcha(SaClientTypeEnum.B.getValue())); + } + + /** + * C端获取手机验证码 + * + * @author xuyuxiang + * @date 2022/7/8 9:26 + **/ + @ApiOperationSupport(order = 2) + @ApiOperation("C端获取手机验证码") + @GetMapping("/auth/c/getPhoneValidCode") + public CommonResult getPhoneValidCode(@Valid AuthGetPhoneValidCodeParam authGetPhoneValidCodeParam) { + return CommonResult.data(authService.getPhoneValidCode(authGetPhoneValidCodeParam, SaClientTypeEnum.C.getValue())); + } + + /** + * C端账号密码登录 + * + * @author xuyuxiang + * @date 2021/10/15 13:12 + **/ + @ApiOperationSupport(order = 3) + @ApiOperation("C端账号密码登录") + @PostMapping("/auth/c/doLogin") + public CommonResult doLogin(@RequestBody @Valid AuthAccountPasswordLoginParam authAccountPasswordLoginParam) { + return CommonResult.data(authService.doLogin(authAccountPasswordLoginParam, SaClientTypeEnum.C.getValue())); + } + + /** + * C端手机验证码登录 + * + * @author xuyuxiang + * @date 2021/10/15 13:12 + **/ + @ApiOperationSupport(order = 4) + @ApiOperation("C端手机验证码登录") + @PostMapping("/auth/c/doLoginByPhone") + public CommonResult doLoginByPhone(@RequestBody @Valid AuthPhoneValidCodeLoginParam authPhoneValidCodeLoginParam) { + return CommonResult.data(authService.doLoginByPhone(authPhoneValidCodeLoginParam, SaClientTypeEnum.C.getValue())); + } + + /** + * C端退出 + * + * @author xuyuxiang + * @date 2021/10/15 13:12 + **/ + @ApiOperationSupport(order = 5) + @ApiOperation("C端退出") + @SaClientCheckLogin + @GetMapping("/auth/c/doLogout") + public CommonResult doLogout() { + StpClientUtil.logout(); + return CommonResult.ok(); + } + + /** + * C端获取用户信息 + * + * @author xuyuxiang + * @date 2021/10/15 13:12 + **/ + @ApiOperationSupport(order = 6) + @ApiOperation("C端获取用户信息") + @SaClientCheckLogin + @GetMapping("/auth/c/getLoginUser") + public CommonResult getLoginUser() { + return CommonResult.data(authService.getClientLoginUser()); + } +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/controller/AuthController.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/controller/AuthController.java new file mode 100644 index 00000000..f7d6be62 --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/controller/AuthController.java @@ -0,0 +1,133 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.login.controller; + +import cn.dev33.satoken.annotation.SaCheckLogin; +import cn.dev33.satoken.stp.StpUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.auth.core.enums.SaClientTypeEnum; +import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser; +import vip.xiaonuo.auth.modular.login.param.AuthAccountPasswordLoginParam; +import vip.xiaonuo.auth.modular.login.param.AuthGetPhoneValidCodeParam; +import vip.xiaonuo.auth.modular.login.param.AuthPhoneValidCodeLoginParam; +import vip.xiaonuo.auth.modular.login.result.AuthPicValidCodeResult; +import vip.xiaonuo.auth.modular.login.service.AuthService; +import vip.xiaonuo.common.pojo.CommonResult; + +import javax.annotation.Resource; +import javax.validation.Valid; + +/** + * B端登录控制器 + * + * @author xuyuxiang + * @date 2021/12/23 21:50 + */ +@Api(tags = "B端登录控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 2) +@RestController +@Validated +public class AuthController { + + @Resource + private AuthService authService; + + /** + * B端获取图片验证码 + * + * @author xuyuxiang + * @date 2022/7/8 9:26 + **/ + @ApiOperationSupport(order = 1) + @ApiOperation("B端获取图片验证码") + @GetMapping("/auth/b/getPicCaptcha") + public CommonResult getPicCaptcha() { + return CommonResult.data(authService.getPicCaptcha(SaClientTypeEnum.B.getValue())); + } + + /** + * B端获取手机验证码 + * + * @author xuyuxiang + * @date 2022/7/8 9:26 + **/ + @ApiOperationSupport(order = 2) + @ApiOperation("B端获取手机验证码") + @GetMapping("/auth/b/getPhoneValidCode") + public CommonResult getPhoneValidCode(@Valid AuthGetPhoneValidCodeParam authGetPhoneValidCodeParam) { + return CommonResult.data(authService.getPhoneValidCode(authGetPhoneValidCodeParam, SaClientTypeEnum.B.getValue())); + } + + /** + * B端账号密码登录 + * + * @author xuyuxiang + * @date 2021/10/15 13:12 + **/ + @ApiOperationSupport(order = 3) + @ApiOperation("B端账号密码登录") + @PostMapping("/auth/b/doLogin") + public CommonResult doLogin(@RequestBody @Valid AuthAccountPasswordLoginParam authAccountPasswordLoginParam) { + return CommonResult.data(authService.doLogin(authAccountPasswordLoginParam, SaClientTypeEnum.B.getValue())); + } + + /** + * B端手机验证码登录 + * + * @author xuyuxiang + * @date 2021/10/15 13:12 + **/ + @ApiOperationSupport(order = 4) + @ApiOperation("B端手机验证码登录") + @PostMapping("/auth/b/doLoginByPhone") + public CommonResult doLoginByPhone(@RequestBody @Valid AuthPhoneValidCodeLoginParam authPhoneValidCodeLoginParam) { + return CommonResult.data(authService.doLoginByPhone(authPhoneValidCodeLoginParam, SaClientTypeEnum.B.getValue())); + } + + /** + * B端退出 + * + * @author xuyuxiang + * @date 2021/10/15 13:12 + **/ + @ApiOperationSupport(order = 5) + @ApiOperation("B端退出") + @SaCheckLogin + @GetMapping("/auth/b/doLogout") + public CommonResult doLogout() { + StpUtil.logout(); + return CommonResult.ok(); + } + + /** + * B端获取用户信息 + * + * @author xuyuxiang + * @date 2021/10/15 13:12 + **/ + @ApiOperationSupport(order = 6) + @ApiOperation("B端获取用户信息") + @SaCheckLogin + @GetMapping("/auth/b/getLoginUser") + public CommonResult getLoginUser() { + return CommonResult.data(authService.getLoginUser()); + } +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/enums/AuthDeviceTypeEnum.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/enums/AuthDeviceTypeEnum.java new file mode 100644 index 00000000..0815ff2a --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/enums/AuthDeviceTypeEnum.java @@ -0,0 +1,54 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.login.enums; + +import lombok.Getter; +import vip.xiaonuo.common.exception.CommonException; + +/** + * 登录设备类型枚举 + * + * @author xuyuxiang + * @date 2021/10/11 14:02 + **/ +@Getter +public enum AuthDeviceTypeEnum { + + /** + * PC端 + */ + PC("PC"), + + /** + * 移动端 + */ + APP("APP"), + + /** + * 小程序端 + */ + MINI("MINI"); + + private final String value; + + AuthDeviceTypeEnum(String value) { + this.value = value; + } + + public static void validate(String value) { + boolean flag = PC.getValue().equals(value) || APP.getValue().equals(value) || MINI.getValue().equals(value); + if(!flag) { + throw new CommonException("不支持的登录设备类型:{}", value); + } + } +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/enums/AuthExceptionEnum.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/enums/AuthExceptionEnum.java new file mode 100644 index 00000000..dfbfc913 --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/enums/AuthExceptionEnum.java @@ -0,0 +1,86 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.login.enums; + +import lombok.Getter; + +/** + * 登录异常提示语枚举 + * + * @author xuyuxiang + * @date 2021/10/11 14:02 + **/ +@Getter +public enum AuthExceptionEnum { + + /** + * 验证码不能为空 + */ + VALID_CODE_EMPTY("验证码不能为空"), + + /** + * 验证码请求号不能为空 + */ + VALID_CODE_REQ_NO_EMPTY("验证码请求号不能为空"), + + /** + * 验证码错误 + */ + VALID_CODE_ERROR("验证码错误"), + + /** + * 账号错误 + */ + ACCOUNT_ERROR("账号错误"), + + /** + * 账号已停用 + */ + ACCOUNT_DISABLED("账号已停用"), + + /** + * 密码错误 + */ + PWD_ERROR("密码错误"), + + /** + * 手机号格式错误 + */ + PHONE_FORMAT_ERROR("手机号格式错误"), + + /** + * 手机号不存在 + */ + PHONE_ERROR("手机号不存在"), + + /** + * 客户端类型不能为空 + */ + CLIENT_TYPE_EMPTY("客户端类型不能为空"), + + /** + * 客户端类型错误 + */ + CLIENT_TYPE_ERROR("客户端类型错误"), + + /** + * 密码解密失败,请检查前端公钥 + */ + PWD_DECRYPT_ERROR("密码解密失败,请检查前端公钥"); + + private final String value; + + AuthExceptionEnum(String value) { + this.value = value; + } +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/listener/AuthListener.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/listener/AuthListener.java new file mode 100644 index 00000000..d1480b2d --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/listener/AuthListener.java @@ -0,0 +1,112 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.login.listener; + +import cn.dev33.satoken.listener.SaTokenListener; +import cn.dev33.satoken.stp.SaLoginModel; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import org.springframework.stereotype.Component; +import vip.xiaonuo.auth.api.SaBaseLoginUserApi; +import vip.xiaonuo.auth.core.enums.SaClientTypeEnum; +import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser; +import vip.xiaonuo.dev.api.DevLogApi; + +import javax.annotation.Resource; + +/** + * 自定义登录监听器 + * + * @author xuyuxiang + * @date 2021/12/28 11:35 + **/ +@Component +public class AuthListener implements SaTokenListener { + + @Resource(name = "loginUserApi") + private SaBaseLoginUserApi loginUserApi; + + @Resource(name = "clientLoginUserApi") + private SaBaseLoginUserApi clientLoginUserApi; + + @Resource + private DevLogApi devLogApi; + + /** 每次登录时触发 */ + @Override + public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) { + // 更新用户的登录时间和登录ip等信息 + if(SaClientTypeEnum.B.getValue().equals(loginType)) { + loginUserApi.updateUserLoginInfo(Convert.toStr(loginId), loginModel.getDevice()); + // 记录B端登录日志 + SaBaseLoginUser saBaseLoginUser = loginUserApi.getUserById(Convert.toStr(loginId)); + if(ObjectUtil.isNotEmpty(saBaseLoginUser)) { + devLogApi.executeLoginLog(saBaseLoginUser.getName()); + } else { + devLogApi.executeLoginLog(null); + } + } else { + clientLoginUserApi.updateUserLoginInfo(Convert.toStr(loginId), loginModel.getDevice()); + } + } + + /** 每次注销时触发 */ + @Override + public void doLogout(String loginType, Object loginId, String tokenValue) { + if(SaClientTypeEnum.B.getValue().equals(loginType)) { + // 记录B端登出日志 + SaBaseLoginUser saBaseLoginUser = loginUserApi.getUserById(Convert.toStr(loginId)); + if(ObjectUtil.isNotEmpty(saBaseLoginUser)) { + devLogApi.executeLogoutLog(saBaseLoginUser.getName()); + } else { + devLogApi.executeLogoutLog(null); + } + } + } + + /** 每次被踢下线时触发 */ + @Override + public void doKickout(String loginType, Object loginId, String tokenValue) { + // ... + } + + /** 每次被顶下线时触发 */ + @Override + public void doReplaced(String loginType, Object loginId, String tokenValue) { + // ... + } + + /** 每次被封禁时触发 */ + @Override + public void doDisable(String loginType, Object loginId, long disableTime) { + // ... + } + + /** 每次被解封时触发 */ + @Override + public void doUntieDisable(String loginType, Object loginId) { + // ... + } + + /** 每次创建Session时触发 */ + @Override + public void doCreateSession(String id) { + // ... + } + + /** 每次注销Session时触发 */ + @Override + public void doLogoutSession(String id) { + // ... + } +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/param/AuthAccountPasswordLoginParam.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/param/AuthAccountPasswordLoginParam.java new file mode 100644 index 00000000..8a486f9d --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/param/AuthAccountPasswordLoginParam.java @@ -0,0 +1,52 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.login.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 账号密码登录参数 + * + * @author xuyuxiang + * @date 2022/7/7 16:46 + **/ +@Getter +@Setter +public class AuthAccountPasswordLoginParam { + + /** 账号 */ + @ApiModelProperty(value = "账号", required = true, position = 1) + @NotBlank(message = "账号不能为空") + private String account; + + /** 密码 */ + @ApiModelProperty(value = "密码", required = true, position = 2) + @NotBlank(message = "密码不能为空") + private String password; + + /** 设备 */ + @ApiModelProperty(value = "设备", position = 3) + private String device; + + /** 验证码 */ + @ApiModelProperty(value = "验证码", position = 4) + private String validCode; + + /** 验证码请求号 */ + @ApiModelProperty(value = "验证码请求号", position = 5) + private String validCodeReqNo; +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/param/AuthGetPhoneValidCodeParam.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/param/AuthGetPhoneValidCodeParam.java new file mode 100644 index 00000000..d1dab9ae --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/param/AuthGetPhoneValidCodeParam.java @@ -0,0 +1,45 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.login.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 获取手机验证码参数 + * + * @author xuyuxiang + * @date 2022/8/25 13:45 + **/ +@Getter +@Setter +public class AuthGetPhoneValidCodeParam { + + /** 手机号 */ + @ApiModelProperty(value = "手机号", required = true, position = 1) + @NotBlank(message = "手机号不能为空") + private String phone; + + /** 验证码 */ + @ApiModelProperty(value = "验证码", required = true, position = 2) + @NotBlank(message = "验证码不能为空") + private String validCode; + + /** 验证码请求号 */ + @ApiModelProperty(value = "验证码请求号", required = true, position = 3) + @NotBlank(message = "验证码请求号不能为空") + private String validCodeReqNo; +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/param/AuthPhoneValidCodeLoginParam.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/param/AuthPhoneValidCodeLoginParam.java new file mode 100644 index 00000000..51932974 --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/param/AuthPhoneValidCodeLoginParam.java @@ -0,0 +1,49 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.login.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 手机验证码登录参数 + * + * @author xuyuxiang + * @date 2022/7/7 16:46 + **/ +@Getter +@Setter +public class AuthPhoneValidCodeLoginParam { + + /** 手机号 */ + @ApiModelProperty(value = "手机号", required = true, position = 1) + @NotBlank(message = "手机号不能为空") + private String phone; + + /** 验证码 */ + @ApiModelProperty(value = "验证码", required = true, position = 2) + @NotBlank(message = "验证码不能为空") + private String validCode; + + /** 验证码请求号 */ + @ApiModelProperty(value = "验证码请求号", required = true, position = 3) + @NotBlank(message = "验证码请求号不能为空") + private String validCodeReqNo; + + /** 设备 */ + @ApiModelProperty(value = "设备", position = 4) + private String device; +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/result/AuthPicValidCodeResult.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/result/AuthPicValidCodeResult.java new file mode 100644 index 00000000..28c917ef --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/result/AuthPicValidCodeResult.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.login.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 图片验证码结果 + * + * @author xuyuxiang + * @date 2022/7/8 9:28 + **/ +@Getter +@Setter +public class AuthPicValidCodeResult { + + /** 验证码图片,Base64 */ + @ApiModelProperty(value = "验证码图片,Base64", position = 1) + private String validCodeBase64; + + /** 验证码请求号 */ + @ApiModelProperty(value = "验证码请求号", position = 2) + private String validCodeReqNo; +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/service/AuthService.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/service/AuthService.java new file mode 100644 index 00000000..4a6d7ac6 --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/service/AuthService.java @@ -0,0 +1,85 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.login.service; + +import vip.xiaonuo.auth.core.pojo.SaBaseClientLoginUser; +import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser; +import vip.xiaonuo.auth.modular.login.param.AuthAccountPasswordLoginParam; +import vip.xiaonuo.auth.modular.login.param.AuthGetPhoneValidCodeParam; +import vip.xiaonuo.auth.modular.login.param.AuthPhoneValidCodeLoginParam; +import vip.xiaonuo.auth.modular.login.result.AuthPicValidCodeResult; + +/** + * 登录Service接口 + * + * @author xuyuxiang + * @date 2021/12/23 21:51 + */ +public interface AuthService { + + /** + * 获取图片验证码 + * + * @author xuyuxiang + * @date 2021/12/28 14:46 + **/ + AuthPicValidCodeResult getPicCaptcha(String type); + + /** + * 获取手机验证码 + * + * @author xuyuxiang + * @date 2021/12/28 14:46 + **/ + String getPhoneValidCode(AuthGetPhoneValidCodeParam authGetPhoneValidCodeParam, String type); + + /** + * 账号密码登录 + * + * @author xuyuxiang + * @date 2021/12/28 14:46 + **/ + String doLogin(AuthAccountPasswordLoginParam authAccountPasswordLoginParam, String type); + + /** + * 手机验证码登录 + * + * @author xuyuxiang + * @date 2021/12/28 14:46 + **/ + String doLoginByPhone(AuthPhoneValidCodeLoginParam authPhoneValidCodeLoginParam, String type); + + /** + * 获取B端登录用户信息 + * + * @author xuyuxiang + * @date 2021/10/12 15:59 + **/ + SaBaseLoginUser getLoginUser(); + + /** + * 获取C端登录用户信息 + * + * @author xuyuxiang + * @date 2021/10/12 15:59 + **/ + SaBaseClientLoginUser getClientLoginUser(); + + /** + * 根据用户id和客户端类型登录,用于第三方登录 + * + * @author xuyuxiang + * @date 2022/7/9 14:44 + */ + String doLoginById(String userId, String device, String type); +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/service/impl/AuthServiceImpl.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/service/impl/AuthServiceImpl.java new file mode 100644 index 00000000..231c372d --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/service/impl/AuthServiceImpl.java @@ -0,0 +1,379 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.login.service.impl; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.captcha.CaptchaUtil; +import cn.hutool.captcha.CircleCaptcha; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import org.springframework.stereotype.Service; +import vip.xiaonuo.auth.api.SaBaseLoginUserApi; +import vip.xiaonuo.auth.core.enums.SaClientTypeEnum; +import vip.xiaonuo.auth.core.pojo.SaBaseClientLoginUser; +import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser; +import vip.xiaonuo.auth.core.util.StpClientLoginUserUtil; +import vip.xiaonuo.auth.core.util.StpClientUtil; +import vip.xiaonuo.auth.core.util.StpLoginUserUtil; +import vip.xiaonuo.auth.modular.login.enums.AuthDeviceTypeEnum; +import vip.xiaonuo.auth.modular.login.enums.AuthExceptionEnum; +import vip.xiaonuo.auth.modular.login.param.AuthAccountPasswordLoginParam; +import vip.xiaonuo.auth.modular.login.param.AuthGetPhoneValidCodeParam; +import vip.xiaonuo.auth.modular.login.param.AuthPhoneValidCodeLoginParam; +import vip.xiaonuo.auth.modular.login.result.AuthPicValidCodeResult; +import vip.xiaonuo.auth.modular.login.service.AuthService; +import vip.xiaonuo.common.cache.CommonCacheOperator; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.util.CommonCryptogramUtil; +import vip.xiaonuo.dev.api.DevConfigApi; +import vip.xiaonuo.dev.api.DevSmsApi; + +import javax.annotation.Resource; +import java.util.stream.Collectors; + +/** + * 登录Service接口实现类 + * + * @author xuyuxiang + * @date 2021/12/23 21:52 + */ +@Service +public class AuthServiceImpl implements AuthService { + + private static final String SNOWY_SYS_DEFAULT_CAPTCHA_OPEN_KEY = "SNOWY_SYS_DEFAULT_CAPTCHA_OPEN"; + + private static final String AUTH_CACHE_KEY = "auth-validCode:"; + + @Resource(name = "loginUserApi") + private SaBaseLoginUserApi loginUserApi; + + @Resource(name = "clientLoginUserApi") + private SaBaseLoginUserApi clientLoginUserApi; + + @Resource + private DevConfigApi devConfigApi; + + @Resource + private DevSmsApi devSmsApi; + + @Resource + private CommonCacheOperator commonCacheOperator; + + @Override + public AuthPicValidCodeResult getPicCaptcha(String type) { + // 生成验证码,随机4位字符 + CircleCaptcha circleCaptcha = CaptchaUtil.createCircleCaptcha(100, 38, 4, 10); + // 定义返回结果 + AuthPicValidCodeResult authPicValidCodeResult = new AuthPicValidCodeResult(); + // 获取验证码的值 + String validCode = circleCaptcha.getCode(); + // 获取验证码的base64 + String validCodeBase64 = circleCaptcha.getImageBase64Data(); + // 生成请求号 + String validCodeReqNo = IdWorker.getIdStr(); + // 将base64返回前端 + authPicValidCodeResult.setValidCodeBase64(validCodeBase64); + // 将请求号返回前端 + authPicValidCodeResult.setValidCodeReqNo(validCodeReqNo); + // 将请求号作为key,验证码的值作为value放到redis,用于校验,5分钟有效 + commonCacheOperator.put(AUTH_CACHE_KEY + validCodeReqNo, validCode, 5 * 60); + return authPicValidCodeResult; + } + + @Override + public String getPhoneValidCode(AuthGetPhoneValidCodeParam authGetPhoneValidCodeParam, String type) { + // 手机号 + String phone = authGetPhoneValidCodeParam.getPhone(); + // 验证码 + String validCode = authGetPhoneValidCodeParam.getValidCode(); + // 验证码请求号 + String validCodeReqNo = authGetPhoneValidCodeParam.getValidCodeReqNo(); + // 校验参数 + validPhoneValidCodeParam(phone, validCode, validCodeReqNo, type); + // 生成手机验证码的值,随机6为数字 + String phoneValidCode = RandomUtil.randomNumbers(6); + // 生成手机验证码的请求号 + String phoneValidCodeReqNo = IdWorker.getIdStr(); + + // TODO 使用阿里云执行发送验证码,将验证码作为短信内容的参数变量放入, + // TODO 签名不传则使用系统默认配置的签名,支持传入多个参数,示例:{"name":"张三","number":"15038****76"} + //devSmsApi.sendSmsAliyun(phone, null, "验证码模板号", JSONUtil.toJsonStr(JSONUtil.createObj().set("validCode", phoneValidCode))); + + // TODO 使用腾讯云执行发送验证码,将验证码作为短信内容的参数变量放入, + // TODO sdkAppId和签名不传则使用系统默认配置的sdkAppId和签名,支持传入多个参数,逗号拼接,示例:"张三,15038****76,进行中" + devSmsApi.sendSmsTencent("1400522364", phone, "小诺开源技术", "1502357", phoneValidCode); + + // 将请求号作为key,验证码的值作为value放到redis,用于校验,5分钟有效 + commonCacheOperator.put(AUTH_CACHE_KEY + phoneValidCodeReqNo, phoneValidCode, 5 * 60); + // 返回请求号 + return phoneValidCodeReqNo; + } + + /** + * 校验验证码方法 + * + * @author xuyuxiang + * @date 2022/8/25 15:26 + **/ + private void validValidCode(String validCode, String validCodeReqNo) { + // 依据请求号,取出缓存中的验证码进行校验 + Object existValidCode = commonCacheOperator.get(AUTH_CACHE_KEY + validCodeReqNo); + // 为空则直接验证码错误 + if(ObjectUtil.isEmpty(existValidCode)) { + throw new CommonException(AuthExceptionEnum.VALID_CODE_ERROR.getValue()); + } + // 不一致则直接验证码错误 + if(!validCode.equals(Convert.toStr(existValidCode))) { + // 移除该验证码 + commonCacheOperator.remove(AUTH_CACHE_KEY + validCodeReqNo); + throw new CommonException(AuthExceptionEnum.VALID_CODE_ERROR.getValue()); + } + // 移除该验证码 + commonCacheOperator.remove(AUTH_CACHE_KEY + validCodeReqNo); + } + + /** + * 校验手机号与验证码等参数 + * + * @author xuyuxiang + * @date 2022/8/25 14:29 + **/ + private void validPhoneValidCodeParam(String phone, String validCode, String validCodeReqNo, String type) { + // 验证码正确则校验手机号格式 + if(!PhoneUtil.isMobile(phone)) { + throw new CommonException(AuthExceptionEnum.PHONE_FORMAT_ERROR.getValue()); + } + // 执行校验验证码 + validValidCode(validCode, validCodeReqNo); + // 根据手机号获取用户信息,判断用户是否存在,根据B端或C端判断 + if(SaClientTypeEnum.B.getValue().equals(type)) { + if(ObjectUtil.isEmpty(loginUserApi.getUserByPhone(phone))) { + throw new CommonException(AuthExceptionEnum.PHONE_ERROR.getValue()); + } + } else { + if(ObjectUtil.isEmpty(clientLoginUserApi.getClientUserByPhone(phone))) { + throw new CommonException(AuthExceptionEnum.PHONE_ERROR.getValue()); + } + } + } + + @Override + public String doLogin(AuthAccountPasswordLoginParam authAccountPasswordLoginParam, String type) { + // 获取账号 + String account = authAccountPasswordLoginParam.getAccount(); + // 获取密码 + String password = authAccountPasswordLoginParam.getPassword(); + // 获取设备 + String device = authAccountPasswordLoginParam.getDevice(); + // 默认指定为PC,如在小程序跟移动端的情况下,自行指定即可 + if(ObjectUtil.isEmpty(device)) { + device = AuthDeviceTypeEnum.PC.getValue(); + } else { + AuthDeviceTypeEnum.validate(device); + } + // 校验验证码 + String defaultCaptchaOpen = devConfigApi.getValueByKey(SNOWY_SYS_DEFAULT_CAPTCHA_OPEN_KEY); + if(ObjectUtil.isNotEmpty(defaultCaptchaOpen)) { + if(Convert.toBool(defaultCaptchaOpen)) { + // 获取验证码 + String validCode = authAccountPasswordLoginParam.getValidCode(); + // 获取验证码请求号 + String validCodeReqNo = authAccountPasswordLoginParam.getValidCodeReqNo(); + // 开启验证码则必须传入验证码 + if(ObjectUtil.isEmpty(validCode)) { + throw new CommonException(AuthExceptionEnum.VALID_CODE_EMPTY.getValue()); + } + // 开启验证码则必须传入验证码请求号 + if(ObjectUtil.isEmpty(validCodeReqNo)) { + throw new CommonException(AuthExceptionEnum.VALID_CODE_REQ_NO_EMPTY.getValue()); + } + // 执行校验验证码 + validValidCode(validCode, validCodeReqNo); + } + } + // SM2解密并获得前端传来的密码哈希值 + String passwordHash; + try { + // 解密,并做哈希值 + passwordHash = CommonCryptogramUtil.doHashValue(CommonCryptogramUtil.doSm2Decrypt(password)); + } catch (Exception e) { + throw new CommonException(AuthExceptionEnum.PWD_DECRYPT_ERROR.getValue()); + } + // 根据账号获取用户信息,根据B端或C端判断 + if(SaClientTypeEnum.B.getValue().equals(type)) { + SaBaseLoginUser saBaseLoginUser = loginUserApi.getUserByAccount(account); + if(ObjectUtil.isEmpty(saBaseLoginUser)) { + throw new CommonException(AuthExceptionEnum.ACCOUNT_ERROR.getValue()); + } + if (!saBaseLoginUser.getPassword().equals(passwordHash)) { + throw new CommonException(AuthExceptionEnum.PWD_ERROR.getValue()); + } + // 执行B端登录 + return execLoginB(saBaseLoginUser, device); + } else { + SaBaseClientLoginUser saBaseClientLoginUser = clientLoginUserApi.getClientUserByAccount(account); + if(ObjectUtil.isEmpty(saBaseClientLoginUser)) { + throw new CommonException(AuthExceptionEnum.ACCOUNT_ERROR.getValue()); + } + if (!saBaseClientLoginUser.getPassword().equals(passwordHash)) { + throw new CommonException(AuthExceptionEnum.PWD_ERROR.getValue()); + } + // 执行C端登录 + return execLoginC(saBaseClientLoginUser, device); + } + } + + @Override + public String doLoginByPhone(AuthPhoneValidCodeLoginParam authPhoneValidCodeLoginParam, String type) { + // 手机号 + String phone = authPhoneValidCodeLoginParam.getPhone(); + // 校验参数 + validPhoneValidCodeParam(phone, authPhoneValidCodeLoginParam.getValidCode(), authPhoneValidCodeLoginParam.getValidCodeReqNo(), type); + // 设备 + String device = authPhoneValidCodeLoginParam.getDevice(); + // 默认指定为PC,如在小程序跟移动端的情况下,自行指定即可 + if(ObjectUtil.isEmpty(device)) { + device = AuthDeviceTypeEnum.PC.getValue(); + } else { + AuthDeviceTypeEnum.validate(device); + } + // 根据手机号获取用户信息,根据B端或C端判断 + if(SaClientTypeEnum.B.getValue().equals(type)) { + SaBaseLoginUser saBaseLoginUser = loginUserApi.getUserByPhone(phone); + if(ObjectUtil.isEmpty(saBaseLoginUser)) { + throw new CommonException(AuthExceptionEnum.ACCOUNT_ERROR.getValue()); + } + // 执行B端登录 + return execLoginB(saBaseLoginUser, device); + } else { + SaBaseClientLoginUser saBaseClientLoginUser = clientLoginUserApi.getClientUserByPhone(phone); + if(ObjectUtil.isEmpty(saBaseClientLoginUser)) { + throw new CommonException(AuthExceptionEnum.ACCOUNT_ERROR.getValue()); + } + // 执行C端登录 + return execLoginC(saBaseClientLoginUser, device); + } + } + + /** + * 执行B端登录 + * + * @author xuyuxiang + * @date 2022/8/25 14:36 + **/ + private String execLoginB(SaBaseLoginUser saBaseLoginUser, String device) { + // 校验状态 + if(!saBaseLoginUser.getEnabled()) { + throw new CommonException(AuthExceptionEnum.ACCOUNT_DISABLED.getValue()); + } + // 执行登录 + StpUtil.login(saBaseLoginUser.getId(), new SaLoginModel().setDevice(device)); + // 获取按钮码 + saBaseLoginUser.setButtonCodeList(loginUserApi.getButtonCodeListListByUserId(saBaseLoginUser.getId())); + // 获取数据范围 + saBaseLoginUser.setDataScopeList(Convert.toList(SaBaseLoginUser.DataScope.class, + loginUserApi.getPermissionListByUserId(saBaseLoginUser.getId(), saBaseLoginUser.getOrgId()))); + // 获取权限码 + saBaseLoginUser.setPermissionCodeList(saBaseLoginUser.getDataScopeList().stream() + .map(SaBaseLoginUser.DataScope::getApiUrl).collect(Collectors.toList())); + // 获取角色码 + saBaseLoginUser.setRoleCodeList(loginUserApi.getRoleCodeListByUserId(saBaseLoginUser.getId())); + // 缓存用户信息,此处使用TokenSession为了指定时间内无操作则自动下线 + StpUtil.getTokenSession().set("loginUser", saBaseLoginUser); + // 返回token + return StpUtil.getTokenInfo().tokenValue; + } + + /** + * 执行C端登录 + * + * @author xuyuxiang + * @date 2022/8/25 14:37 + **/ + private String execLoginC(SaBaseClientLoginUser saBaseClientLoginUser, String device) { + // 校验状态 + if(!saBaseClientLoginUser.getEnabled()) { + throw new CommonException(AuthExceptionEnum.ACCOUNT_DISABLED.getValue()); + } + // 执行登录 + StpClientUtil.login(saBaseClientLoginUser.getId(), new SaLoginModel().setDevice(device)); + // 获取按钮码 + saBaseClientLoginUser.setButtonCodeList(clientLoginUserApi.getButtonCodeListListByUserId(saBaseClientLoginUser.getId())); + // 获取数据范围 + saBaseClientLoginUser.setDataScopeList(Convert.toList(SaBaseClientLoginUser.DataScope.class, + loginUserApi.getPermissionListByUserId(saBaseClientLoginUser.getId(), null))); + // 获取权限码 + saBaseClientLoginUser.setPermissionCodeList(saBaseClientLoginUser.getDataScopeList().stream() + .map(SaBaseClientLoginUser.DataScope::getApiUrl).collect(Collectors.toList())); + // 获取角色码 + saBaseClientLoginUser.setRoleCodeList(clientLoginUserApi.getRoleCodeListByUserId(saBaseClientLoginUser.getId())); + // 缓存用户信息,此处使用TokenSession为了指定时间内无操作则自动下线 + StpClientUtil.getTokenSession().set("loginUser", saBaseClientLoginUser); + // 返回token + return StpClientUtil.getTokenInfo().tokenValue; + } + + /** + * 获取B端登录用户信息 + * + * @author xuyuxiang + * @date 2021/10/12 15:59 + **/ + @Override + public SaBaseLoginUser getLoginUser() { + SaBaseLoginUser saBaseLoginUser = StpLoginUserUtil.getLoginUser(); + saBaseLoginUser.setPassword(null); + saBaseLoginUser.setPermissionCodeList(null); + saBaseLoginUser.setDataScopeList(null); + return saBaseLoginUser; + } + + /** + * 获取C端登录用户信息 + * + * @author xuyuxiang + * @date 2021/10/12 15:59 + **/ + @Override + public SaBaseClientLoginUser getClientLoginUser() { + SaBaseClientLoginUser saBaseClientLoginUser = StpClientLoginUserUtil.getClientLoginUser(); + saBaseClientLoginUser.setPassword(null); + saBaseClientLoginUser.setPermissionCodeList(null); + saBaseClientLoginUser.setDataScopeList(null); + return StpClientLoginUserUtil.getClientLoginUser(); + } + + @Override + public String doLoginById(String userId, String device, String type) { + // 根据id获取用户信息,根据B端或C端判断 + if(SaClientTypeEnum.B.getValue().equals(type)) { + SaBaseLoginUser saBaseLoginUser = loginUserApi.getUserById(userId); + if (ObjectUtil.isEmpty(saBaseLoginUser)) { + throw new CommonException(AuthExceptionEnum.ACCOUNT_ERROR.getValue()); + } + // 执行B端登录 + return execLoginB(saBaseLoginUser, device); + } else { + SaBaseClientLoginUser saBaseClientLoginUser = clientLoginUserApi.getClientUserById(userId); + if (ObjectUtil.isEmpty(saBaseClientLoginUser)) { + throw new CommonException(AuthExceptionEnum.ACCOUNT_ERROR.getValue()); + } + // 执行C端登录 + return execLoginC(saBaseClientLoginUser, device); + } + } +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/controller/AuthSessionController.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/controller/AuthSessionController.java new file mode 100644 index 00000000..f723ada9 --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/controller/AuthSessionController.java @@ -0,0 +1,156 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.monitor.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.auth.modular.monitor.param.AuthExitSessionParam; +import vip.xiaonuo.auth.modular.monitor.param.AuthExitTokenParam; +import vip.xiaonuo.auth.modular.monitor.param.AuthSessionPageParam; +import vip.xiaonuo.auth.modular.monitor.result.AuthSessionAnalysisResult; +import vip.xiaonuo.auth.modular.monitor.result.AuthSessionPageResult; +import vip.xiaonuo.auth.modular.monitor.service.AuthSessionService; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.pojo.CommonValidList; + +import javax.annotation.Resource; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; + +/** + * 会话治理控制器 + * + * @author xuyuxiang + * @date 2022/6/24 15:20 + **/ +@Api(tags = "会话治理控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 3) +@RestController +@Validated +public class AuthSessionController { + + @Resource + private AuthSessionService authSessionService; + + /** + * 会话统计 + * + * @author xuyuxiang + * @date 2022/6/24 22:28 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("会话统计") + @GetMapping("/auth/session/analysis") + public CommonResult analysis() { + return CommonResult.data(authSessionService.analysis()); + } + + /** + * 查询B端会话 + * + * @author xuyuxiang + * @date 2022/6/24 22:28 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("查询B端会话") + @GetMapping("/auth/session/b/page") + public CommonResult> pageForB(AuthSessionPageParam authSessionPageParam) { + return CommonResult.data(authSessionService.pageForB(authSessionPageParam)); + } + + /** + * 查询C端会话 + * + * @author xuyuxiang + * @date 2022/6/24 22:28 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("查询C端会话") + @GetMapping("/auth/session/c/page") + public CommonResult> pageForC(AuthSessionPageParam authSessionPageParam) { + return CommonResult.data(authSessionService.pageForC(authSessionPageParam)); + } + + /** + * 强退B端会话 + * + * @author xuyuxiang + * @date 2021/10/12 10:25 + **/ + @ApiOperationSupport(order = 4) + @ApiOperation("强退B端会话") + @CommonLog("强退B端会话") + @PostMapping("/auth/session/b/exit") + public CommonResult exitSessionForB(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList authExitSessionParamList) { + authSessionService.exitSessionForB(authExitSessionParamList); + return CommonResult.ok(); + } + + /** + * 强退C端会话 + * + * @author xuyuxiang + * @date 2021/10/12 10:25 + **/ + @ApiOperationSupport(order = 5) + @ApiOperation("强退C端会话") + @CommonLog("强退C端会话") + @PostMapping("/auth/session/c/exit") + public CommonResult exitSessionForC(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList authExitSessionParamList) { + authSessionService.exitSessionForC(authExitSessionParamList); + return CommonResult.ok(); + } + + /** + * 强退B端token + * + * @author xuyuxiang + * @date 2021/10/12 10:25 + **/ + @ApiOperationSupport(order = 6) + @ApiOperation("强退B端token") + @CommonLog("强退B端token") + @PostMapping("/auth/token/b/exit") + public CommonResult exitTokenForB(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList authExitTokenParamList) { + authSessionService.exitTokenForB(authExitTokenParamList); + return CommonResult.ok(); + } + + /** + * 强退C端token + * + * @author xuyuxiang + * @date 2021/10/12 10:25 + **/ + @ApiOperationSupport(order = 7) + @ApiOperation("强退C端token") + @CommonLog("强退C端token") + @PostMapping("/auth/token/c/exit") + public CommonResult exitTokenForC(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList authExitTokenParamList) { + authSessionService.exitTokenForC(authExitTokenParamList); + return CommonResult.ok(); + } +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/param/AuthExitSessionParam.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/param/AuthExitSessionParam.java new file mode 100644 index 00000000..0d55a40e --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/param/AuthExitSessionParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.monitor.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * Session退出参数 + * + * @author xuyuxiang + * @date 2022/6/24 22:28 + */ +@Getter +@Setter +public class AuthExitSessionParam { + + /** 用户id */ + @ApiModelProperty(value = "用户id", required = true) + @NotBlank(message = "userId不能为空") + private String userId; +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/param/AuthExitTokenParam.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/param/AuthExitTokenParam.java new file mode 100644 index 00000000..2796103f --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/param/AuthExitTokenParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.monitor.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * Token退出参数 + * + * @author xuyuxiang + * @date 2022/6/24 22:28 + */ +@Getter +@Setter +public class AuthExitTokenParam { + + /** token值 */ + @ApiModelProperty(value = "token值", required = true) + @NotBlank(message = "tokenValue不能为空") + private String tokenValue; +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/param/AuthSessionPageParam.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/param/AuthSessionPageParam.java new file mode 100644 index 00000000..606b6210 --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/param/AuthSessionPageParam.java @@ -0,0 +1,32 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.monitor.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 会话查询参数 + * + * @author xuyuxiang + * @date 2022/7/28 14:48 + **/ +@Getter +@Setter +public class AuthSessionPageParam { + + /** 用户id */ + @ApiModelProperty(value = "用户id") + private String userId; +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/result/AuthSessionAnalysisResult.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/result/AuthSessionAnalysisResult.java new file mode 100644 index 00000000..55de7c02 --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/result/AuthSessionAnalysisResult.java @@ -0,0 +1,44 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.monitor.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 会话统计结果 + * + * @author xuyuxiang + * @date 2022/7/19 9:29 + **/ +@Getter +@Setter +public class AuthSessionAnalysisResult { + + /** 当前会话总数量 */ + @ApiModelProperty(value = "当前会话总数量", position = 1) + private String currentSessionTotalCount; + + /** 最大签发令牌数 */ + @ApiModelProperty(value = "最大签发令牌数", position = 2) + private String maxTokenCount; + + /** 最近1小时会话数 */ + @ApiModelProperty(value = "最近1小时会话数", position = 3) + private String oneHourNewlyAdded; + + /** BC端会话比例 */ + @ApiModelProperty(value = "BC端会话比例", position = 4) + private String proportionOfBAndC; +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/result/AuthSessionPageResult.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/result/AuthSessionPageResult.java new file mode 100644 index 00000000..68374f83 --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/result/AuthSessionPageResult.java @@ -0,0 +1,126 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.monitor.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; +import java.util.List; + +/** + * B端会话结果集 + * + * @author xuyuxiang + * @date 2022/7/28 14:46 + **/ +@Getter +@Setter +public class AuthSessionPageResult { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 头像 */ + @ApiModelProperty(value = "头像", position = 2) + private String avatar; + + /** 账号 */ + @ApiModelProperty(value = "账号", position = 3) + private String account; + + /** 姓名 */ + @ApiModelProperty(value = "姓名", position = 4) + private String name; + + /** 上次登录ip */ + @ApiModelProperty(value = "上次登录ip", position = 5) + private String lastLoginIp; + + /** 上次登录地点 */ + @ApiModelProperty(value = "上次登录地点", position = 6) + private String lastLoginAddress; + + /** 上次登录时间 */ + @ApiModelProperty(value = "上次登录时间", position = 7) + private Date lastLoginTime; + + /** 上次登录设备 */ + @ApiModelProperty(value = "上次登录设备", position = 8) + private String lastLoginDevice; + + /** 最新登录ip */ + @ApiModelProperty(value = "最新登录ip", position = 9) + private String latestLoginIp; + + /** 最新登录地点 */ + @ApiModelProperty(value = "最新登录地点", position = 10) + private String latestLoginAddress; + + /** 最新登录时间 */ + @ApiModelProperty(value = "最新登录时间", position = 11) + private Date latestLoginTime; + + /** 最新登录设备 */ + @ApiModelProperty(value = "最新登录设备", position = 12) + private String latestLoginDevice; + + /** 会话id */ + @ApiModelProperty(value = "会话id", position = 13) + private String sessionId; + + /** 会话创建时间 */ + @ApiModelProperty(value = "会话创建时间", position = 14) + private Date sessionCreateTime; + + /** 会话剩余有效期 */ + @ApiModelProperty(value = "会话剩余有效期", position = 15) + private String sessionTimeout; + + /** 令牌数量 */ + @ApiModelProperty(value = "令牌数量", position = 16) + private Integer tokenCount; + + /** 令牌信息集合 */ + @ApiModelProperty(value = "令牌信息集合", position = 17) + private List tokenSignList; + + /** + * 令牌信息类 + * + * @author xuyuxiang + * @date 2022/7/28 15:04 + **/ + @Getter + @Setter + public static class TokenSignInfo { + + /** token值 */ + @ApiModelProperty(value = "token值", position = 1) + private String tokenValue; + + /** 登录设备 */ + @ApiModelProperty(value = "登录设备", position = 2) + private String tokenDevice; + + /** token剩余有效期 */ + @ApiModelProperty(value = "token剩余有效期", position = 3) + private String tokenTimeout; + + /** token剩余有效期百分比 */ + @ApiModelProperty(value = "token剩余有效期百分比", position = 4) + private Double tokenTimeoutPercent; + } +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/service/AuthSessionService.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/service/AuthSessionService.java new file mode 100644 index 00000000..5d9fccde --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/service/AuthSessionService.java @@ -0,0 +1,87 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.monitor.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import vip.xiaonuo.auth.modular.monitor.param.AuthExitSessionParam; +import vip.xiaonuo.auth.modular.monitor.param.AuthExitTokenParam; +import vip.xiaonuo.auth.modular.monitor.param.AuthSessionPageParam; +import vip.xiaonuo.auth.modular.monitor.result.AuthSessionAnalysisResult; +import vip.xiaonuo.auth.modular.monitor.result.AuthSessionPageResult; + +import java.util.List; + +/** + * 会话治理Service接口 + * + * @author xuyuxiang + * @date 2022/6/24 15:46S + **/ +public interface AuthSessionService { + + /** + * 会话统计 + * + * @author xuyuxiang + * @date 2022/7/19 9:33 + **/ + AuthSessionAnalysisResult analysis(); + + /** + * 查询B端会话 + * + * @author xuyuxiang + * @date 2022/6/24 22:30 + */ + Page pageForB(AuthSessionPageParam authSessionPageParam); + + /** + * 查询C端会话 + * + * @author xuyuxiang + * @date 2022/6/24 22:30 + */ + Page pageForC(AuthSessionPageParam authSessionPageParam); + + /** + * 强退B端会话 + * + * @author xuyuxiang + * @date 2022/6/29 21:47 + */ + void exitSessionForB(List authExitSessionParamList); + + /** + * 强退C端会话 + * + * @author xuyuxiang + * @date 2022/6/29 21:47 + */ + void exitSessionForC(List authExitSessionParamList); + + /** + * 强退B端token + * + * @author xuyuxiang + * @date 2022/6/29 21:47 + */ + void exitTokenForB(List authExitTokenParamList); + + /** + * 强退C端token + * + * @author xuyuxiang + * @date 2022/6/29 21:47 + */ + void exitTokenForC(List authExitTokenParamList); +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/service/impl/AuthSessionServiceImpl.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/service/impl/AuthSessionServiceImpl.java new file mode 100644 index 00000000..4f40262d --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/service/impl/AuthSessionServiceImpl.java @@ -0,0 +1,239 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.monitor.service.impl; + +import cn.dev33.satoken.SaManager; +import cn.dev33.satoken.session.SaSession; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.stereotype.Service; +import vip.xiaonuo.auth.api.SaBaseLoginUserApi; +import vip.xiaonuo.auth.core.util.StpClientUtil; +import vip.xiaonuo.auth.modular.monitor.param.AuthExitSessionParam; +import vip.xiaonuo.auth.modular.monitor.param.AuthExitTokenParam; +import vip.xiaonuo.auth.modular.monitor.param.AuthSessionPageParam; +import vip.xiaonuo.auth.modular.monitor.result.AuthSessionAnalysisResult; +import vip.xiaonuo.auth.modular.monitor.result.AuthSessionPageResult; +import vip.xiaonuo.auth.modular.monitor.service.AuthSessionService; +import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.common.util.CommonTimeFormatUtil; + +import javax.annotation.Resource; +import java.util.Comparator; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 会话治理Service接口实现类 + * + * @author xuyuxiang + * @date 2022/6/24 22:25 + */ +@Service +public class AuthSessionServiceImpl implements AuthSessionService { + + @Resource(name = "loginUserApi") + private SaBaseLoginUserApi loginUserApi; + + @Resource(name = "clientLoginUserApi") + private SaBaseLoginUserApi clientLoginUserApi; + + @Override + public AuthSessionAnalysisResult analysis() { + AuthSessionAnalysisResult authSessionAnalysisResult = new AuthSessionAnalysisResult(); + List sessionListB = StpUtil.searchSessionId("", -1, -1).stream().map(sessionId -> { + JSONObject jsonObject = JSONUtil.createObj(); + String userId = StrUtil.split(sessionId, StrUtil.COLON).get(3); + SaSession saSession = StpUtil.getSessionByLoginId(userId, false); + int tokenCount = saSession.getTokenSignList().size(); + long createTime = saSession.getCreateTime(); + jsonObject.set("userId", userId); + jsonObject.set("tokenCount", tokenCount); + jsonObject.set("createTime", DateTime.of(createTime)); + return jsonObject; + }).collect(Collectors.toList()); + + List sessionListC = StpClientUtil.searchSessionId("", -1, -1).stream().map(sessionId -> { + JSONObject jsonObject = JSONUtil.createObj(); + String userId = StrUtil.split(sessionId, StrUtil.COLON).get(3); + SaSession saSession = StpClientUtil.getSessionByLoginId(userId, false); + int tokenCount = saSession.getTokenSignList().size(); + long createTime = saSession.getCreateTime(); + jsonObject.set("userId", userId); + jsonObject.set("tokenCount", tokenCount); + jsonObject.set("createTime", DateTime.of(createTime)); + return jsonObject; + }).collect(Collectors.toList()); + + List tokenCountList = CollectionUtil.newArrayList(); + tokenCountList.addAll(sessionListB.stream().map(jsonObject -> jsonObject.getInt("tokenCount")).collect(Collectors.toList())); + tokenCountList.addAll(sessionListC.stream().map(jsonObject -> jsonObject.getInt("tokenCount")).collect(Collectors.toList())); + CollectionUtil.sort(tokenCountList, Comparator.comparingInt(Integer::intValue)); + int currentSessionTotalCount = sessionListB.size() + sessionListC.size(); + authSessionAnalysisResult.setCurrentSessionTotalCount(Convert.toStr(currentSessionTotalCount)); + authSessionAnalysisResult.setMaxTokenCount(Convert.toStr(tokenCountList.get(tokenCountList.size() - 1))); + List sessionCreateTimeList = CollectionUtil.newArrayList(); + sessionCreateTimeList.addAll(sessionListB.stream().map(jsonObject -> jsonObject.getDate("createTime")).collect(Collectors.toList())); + sessionCreateTimeList.addAll(sessionListC.stream().map(jsonObject -> jsonObject.getDate("createTime")).collect(Collectors.toList())); + System.out.println(sessionCreateTimeList); + DateTime oneHourAgo = DateUtil.offset(DateTime.now(), DateField.HOUR, -1); + authSessionAnalysisResult.setOneHourNewlyAdded(Convert.toStr(sessionCreateTimeList.stream().filter(date -> DateUtil.compare(oneHourAgo, date) <= 0).count())); + authSessionAnalysisResult.setProportionOfBAndC(sessionListB.size() + StrUtil.SLASH + sessionListC.size()); + return authSessionAnalysisResult; + } + + @Override + public Page pageForB(AuthSessionPageParam authSessionPageParam) { + Page defaultPage = CommonPageRequest.defaultPage(); + long current = defaultPage.getCurrent(); + int total = StpUtil.searchSessionId("", -1, Convert.toInt(defaultPage.getSize())).size(); + if(ObjectUtil.isNotEmpty(total)) { + defaultPage = new Page<>(current, defaultPage.getSize(), total); + String keyword = ""; + if(ObjectUtil.isNotEmpty(authSessionPageParam.getUserId())) { + keyword = authSessionPageParam.getUserId(); + } + List userIdList = StpUtil.searchSessionId(keyword, + Convert.toInt((current - 1) * defaultPage.getSize()), + Convert.toInt(defaultPage.getSize())).stream().map(sessionId -> + StrUtil.split(sessionId, StrUtil.COLON).get(3)).collect(Collectors.toList()); + if (ObjectUtil.isNotEmpty(userIdList)) { + List authSessionPageResultList = loginUserApi.listUserByUserIdList(userIdList).stream().map(userJsonObject -> { + SaSession saSession = StpUtil.getSessionByLoginId(userJsonObject.getStr("id"), false); + AuthSessionPageResult authSessionPageResult = JSONUtil.toBean(userJsonObject, AuthSessionPageResult.class); + authSessionPageResult.setSessionId(saSession.getId()); + authSessionPageResult.setSessionCreateTime(DateTime.of(saSession.getCreateTime())); + long sessionTimeOut = saSession.getTimeout(); + if(sessionTimeOut == -1) { + authSessionPageResult.setSessionTimeout("永久"); + } else { + authSessionPageResult.setSessionTimeout(CommonTimeFormatUtil.formatSeconds(saSession.getTimeout())); + } + List tokenInfoList = saSession.getTokenSignList().stream().map(tokenSign -> { + AuthSessionPageResult.TokenSignInfo tokenSignInfo = new AuthSessionPageResult.TokenSignInfo(); + tokenSignInfo.setTokenValue(tokenSign.getValue()); + tokenSignInfo.setTokenDevice(tokenSign.getDevice()); + long tokenTimeout = SaManager.getSaTokenDao().getTimeout(StpUtil.stpLogic.splicingKeyTokenValue(tokenSign.getValue())); + long tokenTimeoutConfig = StpUtil.stpLogic.getConfig().getTimeout(); + if(tokenTimeout == -1) { + tokenSignInfo.setTokenTimeout("永久"); + tokenSignInfo.setTokenTimeoutPercent(100d); + } else { + tokenSignInfo.setTokenTimeout(CommonTimeFormatUtil.formatSeconds(SaManager.getSaTokenDao() + .getTimeout(StpUtil.stpLogic.splicingKeyTokenValue(tokenSign.getValue())))); + if(tokenTimeoutConfig == -1) { + tokenSignInfo.setTokenTimeoutPercent(0d); + } else { + tokenSignInfo.setTokenTimeoutPercent(NumberUtil.div(tokenTimeout, tokenTimeoutConfig)); + } + } + return tokenSignInfo; + }).collect(Collectors.toList()); + authSessionPageResult.setTokenCount(tokenInfoList.size()); + authSessionPageResult.setTokenSignList(tokenInfoList); + return authSessionPageResult; + }).collect(Collectors.toList()); + defaultPage.setRecords(authSessionPageResultList); + } + } + return defaultPage; + } + + @Override + public Page pageForC(AuthSessionPageParam authSessionPageParam) { + Page defaultPage = CommonPageRequest.defaultPage(); + long current = defaultPage.getCurrent(); + int total = StpClientUtil.searchSessionId("", -1, Convert.toInt(defaultPage.getSize())).size(); + if(ObjectUtil.isNotEmpty(total)) { + defaultPage = new Page<>(current, defaultPage.getSize(), total); + String keyword = ""; + if(ObjectUtil.isNotEmpty(authSessionPageParam.getUserId())) { + keyword = authSessionPageParam.getUserId(); + } + List userIdList = StpClientUtil.searchSessionId(keyword, + Convert.toInt((current - 1) * defaultPage.getSize()), + Convert.toInt(defaultPage.getSize())).stream().map(sessionId -> + StrUtil.split(sessionId, StrUtil.COLON).get(3)).collect(Collectors.toList()); + if (ObjectUtil.isNotEmpty(userIdList)) { + List authSessionPageResultList = loginUserApi.listUserByUserIdList(userIdList).stream().map(userJsonObject -> { + SaSession saSession = StpClientUtil.getSessionByLoginId(userJsonObject.getStr("id"), false); + AuthSessionPageResult authSessionPageResult = JSONUtil.toBean(userJsonObject, AuthSessionPageResult.class); + authSessionPageResult.setSessionId(saSession.getId()); + authSessionPageResult.setSessionCreateTime(DateTime.of(saSession.getCreateTime())); + long sessionTimeOut = saSession.getTimeout(); + if(sessionTimeOut == -1) { + authSessionPageResult.setSessionTimeout("永久"); + } else { + authSessionPageResult.setSessionTimeout(CommonTimeFormatUtil.formatSeconds(saSession.getTimeout())); + } + List tokenInfoList = saSession.getTokenSignList().stream().map(tokenSign -> { + AuthSessionPageResult.TokenSignInfo tokenSignInfo = new AuthSessionPageResult.TokenSignInfo(); + tokenSignInfo.setTokenValue(tokenSign.getValue()); + tokenSignInfo.setTokenDevice(tokenSign.getDevice()); + long tokenTimeout = SaManager.getSaTokenDao().getTimeout(StpClientUtil.stpLogic.splicingKeyTokenValue(tokenSign.getValue())); + long tokenTimeoutConfig = StpClientUtil.stpLogic.getConfig().getTimeout(); + if(tokenTimeout == -1) { + tokenSignInfo.setTokenTimeout("永久"); + tokenSignInfo.setTokenTimeoutPercent(100d); + } else { + tokenSignInfo.setTokenTimeout(CommonTimeFormatUtil.formatSeconds(SaManager.getSaTokenDao() + .getTimeout(StpClientUtil.stpLogic.splicingKeyTokenValue(tokenSign.getValue())))); + if(tokenTimeoutConfig == -1) { + tokenSignInfo.setTokenTimeoutPercent(0d); + } else { + tokenSignInfo.setTokenTimeoutPercent(NumberUtil.div(tokenTimeout, tokenTimeoutConfig)); + } + } + return tokenSignInfo; + }).collect(Collectors.toList()); + authSessionPageResult.setTokenCount(tokenInfoList.size()); + authSessionPageResult.setTokenSignList(tokenInfoList); + return authSessionPageResult; + }).collect(Collectors.toList()); + defaultPage.setRecords(authSessionPageResultList); + } + } + return defaultPage; + } + + @Override + public void exitSessionForB(List authExitSessionParamList) { + authExitSessionParamList.forEach(authExitSessionParam -> StpUtil.logout(authExitSessionParam.getUserId())); + } + + @Override + public void exitSessionForC(List authExitSessionParamList) { + authExitSessionParamList.forEach(authExitSessionParam -> StpClientUtil.logout(authExitSessionParam.getUserId())); + } + + @Override + public void exitTokenForB(List authExitTokenParamList) { + authExitTokenParamList.forEach(authExitTokenParam -> StpUtil.logoutByTokenValue(authExitTokenParam.getTokenValue())); + } + + @Override + public void exitTokenForC(List authExitTokenParamList) { + authExitTokenParamList.forEach(authExitTokenParam -> StpClientUtil.logoutByTokenValue(authExitTokenParam.getTokenValue())); + } +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/controller/AuthThirdController.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/controller/AuthThirdController.java new file mode 100644 index 00000000..2ac83200 --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/controller/AuthThirdController.java @@ -0,0 +1,88 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.third.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import me.zhyd.oauth.model.AuthCallback; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.auth.modular.third.entity.AuthThirdUser; +import vip.xiaonuo.auth.modular.third.param.AuthThirdCallbackParam; +import vip.xiaonuo.auth.modular.third.param.AuthThirdRenderParam; +import vip.xiaonuo.auth.modular.third.param.AuthThirdUserPageParam; +import vip.xiaonuo.auth.modular.third.result.AuthThirdRenderResult; +import vip.xiaonuo.auth.modular.third.service.AuthThirdService; +import vip.xiaonuo.common.pojo.CommonResult; + +import javax.annotation.Resource; +import javax.validation.Valid; + +/** + * 第三方登录控制器 + * + * @author xuyuxiang + * @date 2022/7/8 16:18 + **/ +@Api(tags = "三方登录控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 5) +@RestController +@Validated +public class AuthThirdController { + + @Resource + private AuthThirdService authThirdService; + + /** + * 第三方登录页面渲染 + * + * @author xuyuxiang + * @date 2022/7/8 16:19 + **/ + @ApiOperationSupport(order = 1) + @ApiOperation("第三方登录页面渲染") + @GetMapping("/auth/third/render") + public CommonResult render(@Valid AuthThirdRenderParam authThirdRenderParam) { + return CommonResult.data(authThirdService.render(authThirdRenderParam)); + } + + /** + * 第三方登录授权回调 + * + * @author xuyuxiang + * @date 2022/7/8 16:42 + **/ + @ApiOperationSupport(order = 2) + @ApiOperation("第三方登录授权回调") + @GetMapping("/auth/third/callback") + public CommonResult callback(@Valid AuthThirdCallbackParam authThirdCallbackParam, AuthCallback authCallback) { + return CommonResult.data(authThirdService.callback(authThirdCallbackParam, authCallback)); + } + + /** + * 获取三方用户分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("获取三方用户分页") + @GetMapping("/auth/third/page") + public CommonResult> page(AuthThirdUserPageParam authThirdUserPageParam) { + return CommonResult.data(authThirdService.page(authThirdUserPageParam)); + } +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/entity/AuthThirdUser.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/entity/AuthThirdUser.java new file mode 100644 index 00000000..1300a35b --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/entity/AuthThirdUser.java @@ -0,0 +1,73 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.third.entity; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import vip.xiaonuo.common.pojo.CommonEntity; + +/** + * 第三放登录实体 + * + * @author xuyuxiang + * @date 2022/7/9 14:29 + */ +@Getter +@Setter +@TableName("AUTH_THIRD_USER") +public class AuthThirdUser extends CommonEntity { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 三方用户id */ + @ApiModelProperty(value = "三方用户id", position = 2) + private String thirdId; + + /** 系统用户id */ + @ApiModelProperty(value = "系统用户id", position = 3) + private String userId; + + /** 头像 */ + @ApiModelProperty(value = "头像", position = 4) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String avatar; + + /** 姓名 */ + @ApiModelProperty(value = "姓名", position = 5) + private String name; + + /** 昵称 */ + @ApiModelProperty(value = "昵称", position = 6) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String nickname; + + /** 性别 */ + @ApiModelProperty(value = "性别", position = 7) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String gender; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 8) + private String category; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 9) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/enums/AuthThirdPlatformEnum.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/enums/AuthThirdPlatformEnum.java new file mode 100644 index 00000000..8d5b609a --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/enums/AuthThirdPlatformEnum.java @@ -0,0 +1,49 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.third.enums; + +import lombok.Getter; +import vip.xiaonuo.common.exception.CommonException; + +/** + * 第三方登录平台枚举 + * + * @author xuyuxiang + * @date 2021/10/11 14:02 + **/ +@Getter +public enum AuthThirdPlatformEnum { + + /** + * GITEE + */ + GITEE("GITEE"), + + /** + * WECHAT + */ + WECHAT("WECHAT"); + + private final String value; + + AuthThirdPlatformEnum(String value) { + this.value = value; + } + + public static void validate(String value) { + boolean flag = GITEE.getValue().equals(value) || WECHAT.getValue().equals(value); + if(!flag) { + throw new CommonException("不支持的第三方平台:{}", value); + } + } +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/mapper/AuthThirdMapper.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/mapper/AuthThirdMapper.java new file mode 100644 index 00000000..e0ccb4dd --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/mapper/AuthThirdMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.third.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.auth.modular.third.entity.AuthThirdUser; + +/** + * 第三方登录Mapper接口 + * + * @author xuyuxiang + * @date 2022/7/9 14:35 + */ +public interface AuthThirdMapper extends BaseMapper { +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/mapper/mapping/AuthThirdMapper.xml b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/mapper/mapping/AuthThirdMapper.xml new file mode 100644 index 00000000..f2716d5a --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/mapper/mapping/AuthThirdMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/param/AuthThirdCallbackParam.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/param/AuthThirdCallbackParam.java new file mode 100644 index 00000000..9503cf4e --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/param/AuthThirdCallbackParam.java @@ -0,0 +1,45 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.third.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 第三方登录回调参数 + * + * @author xuyuxiang + * @date 2022/7/8 20:38 + */ +@Getter +@Setter +public class AuthThirdCallbackParam { + + /** 第三方平台标识 */ + @ApiModelProperty(value = "第三方平台标识", required = true, position = 1) + @NotBlank(message = "platform不能为空") + private String platform; + + /** 第三方回调code */ + @ApiModelProperty(value = "第三方回调code", required = true, position = 2) + @NotBlank(message = "code不能为空") + private String code; + + /** 第三方回调state */ + @ApiModelProperty(value = "第三方回调state", required = true, position = 3) + @NotBlank(message = "state不能为空") + private String state; +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/param/AuthThirdRenderParam.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/param/AuthThirdRenderParam.java new file mode 100644 index 00000000..be833212 --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/param/AuthThirdRenderParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.third.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 第三方登录授权参数 + * + * @author xuyuxiang + * @date 2022/7/8 20:38 + */ +@Getter +@Setter +public class AuthThirdRenderParam { + + /** 第三方平台标识 */ + @ApiModelProperty(value = "第三方平台标识", required = true) + @NotBlank(message = "platform不能为空") + private String platform; +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/param/AuthThirdUserPageParam.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/param/AuthThirdUserPageParam.java new file mode 100644 index 00000000..1178ac60 --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/param/AuthThirdUserPageParam.java @@ -0,0 +1,52 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.third.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 三方用户查询参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class AuthThirdUserPageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 三方用户分类 */ + @ApiModelProperty(value = "分类") + private String category; + + /** 用户名或昵称关键词 */ + @ApiModelProperty(value = "用户名或昵称关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/result/AuthThirdRenderResult.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/result/AuthThirdRenderResult.java new file mode 100644 index 00000000..3a479e2a --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/result/AuthThirdRenderResult.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.third.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 第三方登录授权结果 + * + * @author xuyuxiang + * @date 2022/7/8 20:39 + */ +@Getter +@Setter +public class AuthThirdRenderResult { + + /** 授权地址 */ + @ApiModelProperty(value = "授权地址") + private String authorizeUrl; + + /** 状态码 */ + @ApiModelProperty(value = "状态码") + private String state; +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/service/AuthThirdService.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/service/AuthThirdService.java new file mode 100644 index 00000000..c53f6660 --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/service/AuthThirdService.java @@ -0,0 +1,55 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.third.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import me.zhyd.oauth.model.AuthCallback; +import vip.xiaonuo.auth.modular.third.entity.AuthThirdUser; +import vip.xiaonuo.auth.modular.third.param.AuthThirdCallbackParam; +import vip.xiaonuo.auth.modular.third.param.AuthThirdRenderParam; +import vip.xiaonuo.auth.modular.third.param.AuthThirdUserPageParam; +import vip.xiaonuo.auth.modular.third.result.AuthThirdRenderResult; + +/** + * 第三方登录Service接口 + * + * @author xuyuxiang + * @date 2022/7/8 16:20 + **/ +public interface AuthThirdService extends IService { + + /** + * 第三方登录页面渲染,返回授权结果 + * + * @author xuyuxiang + * @date 2022/7/8 16:37 + **/ + AuthThirdRenderResult render(AuthThirdRenderParam authThirdRenderParam); + + /** + * 第三方登录授权回调,返回登录token + * + * @author xuyuxiang + * @date 2022/7/8 16:42 + **/ + String callback(AuthThirdCallbackParam authThirdCallbackParam, AuthCallback authCallback); + + /** + * 获取三方用户分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + Page page(AuthThirdUserPageParam authThirdUserPageParam); +} diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/service/impl/AuthThirdServiceImpl.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/service/impl/AuthThirdServiceImpl.java new file mode 100644 index 00000000..e43b1668 --- /dev/null +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/third/service/impl/AuthThirdServiceImpl.java @@ -0,0 +1,222 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.auth.modular.third.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.xkcoding.http.HttpUtil; +import com.xkcoding.http.support.hutool.HutoolImpl; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.model.AuthCallback; +import me.zhyd.oauth.model.AuthResponse; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.request.AuthGiteeRequest; +import me.zhyd.oauth.request.AuthRequest; +import me.zhyd.oauth.request.AuthWeChatOpenRequest; +import me.zhyd.oauth.utils.AuthStateUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import vip.xiaonuo.auth.api.SaBaseLoginUserApi; +import vip.xiaonuo.auth.core.enums.SaClientTypeEnum; +import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser; +import vip.xiaonuo.auth.modular.login.enums.AuthDeviceTypeEnum; +import vip.xiaonuo.auth.modular.login.service.AuthService; +import vip.xiaonuo.auth.modular.third.entity.AuthThirdUser; +import vip.xiaonuo.auth.modular.third.enums.AuthThirdPlatformEnum; +import vip.xiaonuo.auth.modular.third.mapper.AuthThirdMapper; +import vip.xiaonuo.auth.modular.third.param.AuthThirdCallbackParam; +import vip.xiaonuo.auth.modular.third.param.AuthThirdRenderParam; +import vip.xiaonuo.auth.modular.third.param.AuthThirdUserPageParam; +import vip.xiaonuo.auth.modular.third.result.AuthThirdRenderResult; +import vip.xiaonuo.auth.modular.third.service.AuthThirdService; +import vip.xiaonuo.common.enums.CommonSortOrderEnum; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.dev.api.DevConfigApi; + +import javax.annotation.Resource; + +/** + * 第三方登录Service接口实现类 + * + * @author xuyuxiang + * @date 2022/7/8 16:20 + **/ +@Service +public class AuthThirdServiceImpl extends ServiceImpl implements AuthThirdService { + + private static final String SNOWY_THIRD_GITEE_CLIENT_ID_KEY = "SNOWY_THIRD_GITEE_CLIENT_ID"; + private static final String SNOWY_THIRD_GITEE_CLIENT_SECRET_KEY = "SNOWY_THIRD_GITEE_CLIENT_SECRET"; + private static final String SNOWY_THIRD_GITEE_REDIRECT_URL_KEY = "SNOWY_THIRD_GITEE_REDIRECT_URL"; + + private static final String SNOWY_THIRD_WECHAT_CLIENT_ID_KEY = "SNOWY_THIRD_WECHAT_CLIENT_ID"; + private static final String SNOWY_THIRD_WECHAT_CLIENT_SECRET_KEY = "SNOWY_THIRD_WECHAT_CLIENT_SECRET"; + private static final String SNOWY_THIRD_WECHAT_REDIRECT_URL_KEY = "SNOWY_THIRD_WECHAT_REDIRECT_URL"; + + @Resource + private DevConfigApi devConfigApi; + + @Resource + private AuthService authService; + + @Resource(name = "loginUserApi") + private SaBaseLoginUserApi loginUserApi; + + @Resource(name = "clientLoginUserApi") + private SaBaseLoginUserApi clientLoginUserApi; + + @Override + public AuthThirdRenderResult render(AuthThirdRenderParam authThirdRenderParam) { + + // 获取请求 + AuthRequest authRequest = this.getAuthRequest(authThirdRenderParam.getPlatform()); + + // 获取状态 + String state = AuthStateUtils.createState(); + + // 构造授权地址 + String authorizeUrl = authRequest.authorize(state); + + // 构造结果 + AuthThirdRenderResult authThirdRenderResult = new AuthThirdRenderResult(); + + // 返回授权地址 + authThirdRenderResult.setAuthorizeUrl(authorizeUrl); + + // 返回状态码 + authThirdRenderResult.setState(state); + return authThirdRenderResult; + } + + @SuppressWarnings("ALL") + @Transactional(rollbackFor = Exception.class) + @Override + public String callback(AuthThirdCallbackParam authThirdCallbackParam, AuthCallback authCallback) { + + // 获取请求 + AuthRequest authRequest = this.getAuthRequest(authThirdCallbackParam.getPlatform()); + + // 执行请求 + AuthResponse authResponse = authRequest.login(authCallback); + if (authResponse.ok()) { + + // 授权的用户信息 + AuthUser authUser = authResponse.getData(); + + // 获取第三方用户id + String uuid = authUser.getUuid(); + + // 获取第三方用户来源 + String source = authUser.getSource(); + + // 根据第三方用户id和用户来源获取用户信息 + AuthThirdUser authThirdUser = this.getOne(new LambdaQueryWrapper().eq(AuthThirdUser::getThirdId, uuid) + .eq(AuthThirdUser::getCategory, source)); + + // 定义系统用户id + String userId; + if(ObjectUtil.isEmpty(authThirdUser)) { + + // 如果用户不存在,则绑定用户并登录 + userId = this.bindUser(authUser); + } else { + // 否则直接获取用户id登录 + userId = authThirdUser.getUserId(); + } + // TODO 此处使用PC端执行B端登录,返回token + return authService.doLoginById(userId, AuthDeviceTypeEnum.PC.getValue(), SaClientTypeEnum.B.getValue()); + } else { + throw new CommonException("第三方登录授权回调失败,原因:{}", authResponse.getMsg()); + } + } + + @Override + public Page page(AuthThirdUserPageParam authThirdUserPageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(ObjectUtil.isNotEmpty(authThirdUserPageParam.getCategory())) { + queryWrapper.lambda().eq(AuthThirdUser::getCategory, authThirdUserPageParam.getCategory()); + } + if(ObjectUtil.isNotEmpty(authThirdUserPageParam.getSearchKey())) { + queryWrapper.and(q -> q.lambda().like(AuthThirdUser::getName, authThirdUserPageParam.getSearchKey()) + .or().like(AuthThirdUser::getNickname, authThirdUserPageParam.getSearchKey())); + } + if(ObjectUtil.isAllNotEmpty(authThirdUserPageParam.getSortField(), authThirdUserPageParam.getSortOrder())) { + CommonSortOrderEnum.validate(authThirdUserPageParam.getSortOrder()); + queryWrapper.orderBy(true, authThirdUserPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), + StrUtil.toUnderlineCase(authThirdUserPageParam.getSortField())); + } else { + queryWrapper.lambda().orderByDesc(AuthThirdUser::getCreateTime); + } + return this.page(CommonPageRequest.defaultPage(), queryWrapper); + } + + /** + * 绑定用户并返回用户id + * + * @author xuyuxiang + * @date 2022/7/9 14:58 + */ + private String bindUser(AuthUser authUser) { + // TODO 此处固定绑定超管 + SaBaseLoginUser saBaseLoginUser = loginUserApi.getUserByAccount("admin"); + if(ObjectUtil.isEmpty(saBaseLoginUser)) { + throw new CommonException("第三方登录失败,无法绑定账号admin,原因:账户admin不存在"); + } + AuthThirdUser authThirdUser = new AuthThirdUser(); + authThirdUser.setThirdId(authUser.getUuid()); + authThirdUser.setUserId(saBaseLoginUser.getId()); + authThirdUser.setAvatar(authUser.getAvatar()); + authThirdUser.setName(authUser.getUsername()); + authThirdUser.setNickname(authUser.getNickname()); + authThirdUser.setGender(authUser.getGender().getDesc()); + authThirdUser.setCategory(authUser.getSource()); + authThirdUser.setExtJson(JSONUtil.toJsonStr(authUser.getRawUserInfo())); + this.save(authThirdUser); + return authThirdUser.getUserId(); + } + + /** + * 创建授权请求 + * + * @author xuyuxiang + * @date 2022/7/8 16:48 + **/ + private AuthRequest getAuthRequest(String source) { + AuthRequest authRequest = null; + source = source.toUpperCase(); + HttpUtil.setHttp(new HutoolImpl()); + AuthThirdPlatformEnum.validate(source); + if (source.equals(AuthThirdPlatformEnum.GITEE.getValue())) { + // GITEE登录 + authRequest = new AuthGiteeRequest(AuthConfig.builder() + .clientId(devConfigApi.getValueByKey(SNOWY_THIRD_GITEE_CLIENT_ID_KEY)) + .clientSecret(devConfigApi.getValueByKey(SNOWY_THIRD_GITEE_CLIENT_SECRET_KEY)) + .redirectUri(devConfigApi.getValueByKey(SNOWY_THIRD_GITEE_REDIRECT_URL_KEY)) + .build()); + } + if(source.equals(AuthThirdPlatformEnum.WECHAT.getValue())){ + // 微信登录 + authRequest = new AuthWeChatOpenRequest(AuthConfig.builder() + .clientId(devConfigApi.getValueByKey(SNOWY_THIRD_WECHAT_CLIENT_ID_KEY)) + .clientSecret(devConfigApi.getValueByKey(SNOWY_THIRD_WECHAT_CLIENT_SECRET_KEY)) + .redirectUri(devConfigApi.getValueByKey(SNOWY_THIRD_WECHAT_REDIRECT_URL_KEY)) + .build()); + } + return authRequest; + } +} diff --git a/snowy-plugin/snowy-plugin-biz/README.md b/snowy-plugin/snowy-plugin-biz/README.md new file mode 100644 index 00000000..a6f09021 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/README.md @@ -0,0 +1 @@ +# 业务功能插件 \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-biz/pom.xml b/snowy-plugin/snowy-plugin-biz/pom.xml new file mode 100644 index 00000000..30b9adce --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + + + vip.xiaonuo + snowy-plugin + 2.0.0 + + + snowy-plugin-biz + jar + 业务功能插件 + + + + + vip.xiaonuo + snowy-plugin-biz-api + ${project.parent.version} + + + + + vip.xiaonuo + snowy-plugin-auth-api + ${project.parent.version} + + + + + vip.xiaonuo + snowy-plugin-sys-api + ${project.parent.version} + + + + + vip.xiaonuo + snowy-plugin-dev-api + ${project.parent.version} + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/core/config/BizConfigure.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/core/config/BizConfigure.java new file mode 100644 index 00000000..778f2660 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/core/config/BizConfigure.java @@ -0,0 +1,67 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.core.config; + +import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver; +import io.swagger.annotations.ApiOperation; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.bind.annotation.RequestMethod; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import vip.xiaonuo.common.pojo.CommonResult; + +import javax.annotation.Resource; + +/** + * 业务相关配置 + * + * @author xuyuxiang + * @date 2022/7/7 16:18 + **/ +@Configuration +public class BizConfigure { + + @Resource + private OpenApiExtensionResolver openApiExtensionResolver; + + /** + * API文档分组配置 + * + * @author xuyuxiang + * @date 2022/7/7 16:18 + **/ + @Bean(value = "bizDocApi") + public Docket bizDocApi() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(new ApiInfoBuilder() + .title("业务功能BIZ") + .description("业务功能BIZ") + .termsOfServiceUrl("https://www.xiaonuo.vip") + .contact(new Contact("SNOWY_TEAM","https://www.xiaonuo.vip", "xuyuxiang29@foxmail.com")) + .version("2.0.0") + .build()) + .globalResponseMessage(RequestMethod.GET, CommonResult.responseList()) + .globalResponseMessage(RequestMethod.POST, CommonResult.responseList()) + .groupName("业务功能BIZ") + .select() + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + .apis(RequestHandlerSelectors.basePackage("vip.xiaonuo.biz")) + .paths(PathSelectors.any()) + .build().extensions(openApiExtensionResolver.buildExtensions("业务功能BIZ")); + } +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/core/enums/BizBuildInEnum.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/core/enums/BizBuildInEnum.java new file mode 100644 index 00000000..363c1039 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/core/enums/BizBuildInEnum.java @@ -0,0 +1,37 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.core.enums; + +import lombok.Getter; + +/** + * 系统内置的不可删除的标识枚举 + * + * @author xuyuxiang + * @date 2022/4/21 19:56 + **/ +@Getter +public enum BizBuildInEnum { + + /** 超管用户账号 */ + BUILD_IN_USER_ACCOUNT("superAdmin", "超管"); + + private final String value; + + private final String name; + + BizBuildInEnum(String value, String name) { + this.value = value; + this.name = name; + } +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/controller/BizOrgController.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/controller/BizOrgController.java new file mode 100644 index 00000000..eda10fbd --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/controller/BizOrgController.java @@ -0,0 +1,175 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.org.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.biz.modular.org.entity.BizOrg; +import vip.xiaonuo.biz.modular.org.param.*; +import vip.xiaonuo.biz.modular.org.service.BizOrgService; +import vip.xiaonuo.biz.modular.user.entity.BizUser; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.pojo.CommonValidList; + +import javax.annotation.Resource; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * 机构控制器 + * + * @author xuyuxiang + * @date 2022/4/24 19:55 + */ +@Api(tags = "机构控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 1) +@RestController +@Validated +public class BizOrgController { + + @Resource + private BizOrgService bizOrgService; + + /** + * 获取机构分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("获取机构分页") + @SaCheckPermission("/biz/org/page") + @GetMapping("/biz/org/page") + public CommonResult> page(BizOrgPageParam bizOrgPageParam) { + return CommonResult.data(bizOrgService.page(bizOrgPageParam)); + } + + /** + * 获取机构树 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("获取机构树") + @SaCheckPermission("/biz/org/tree") + @GetMapping("/biz/org/tree") + public CommonResult>> tree() { + return CommonResult.data(bizOrgService.tree()); + } + + /** + * 添加机构 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("添加机构") + @CommonLog("添加机构") + @SaCheckPermission("/biz/org/add") + @PostMapping("/biz/org/add") + public CommonResult add(@RequestBody @Valid BizOrgAddParam bizOrgAddParam) { + bizOrgService.add(bizOrgAddParam); + return CommonResult.ok(); + } + + /** + * 编辑机构 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 4) + @ApiOperation("编辑机构") + @CommonLog("编辑机构") + @SaCheckPermission("/biz/org/edit") + @PostMapping("/biz/org/edit") + public CommonResult edit(@RequestBody @Valid BizOrgEditParam bizOrgEditParam) { + bizOrgService.edit(bizOrgEditParam); + return CommonResult.ok(); + } + + /** + * 删除机构 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 5) + @ApiOperation("删除机构") + @CommonLog("删除机构") + @SaCheckPermission("/biz/org/delete") + @PostMapping("/biz/org/delete") + public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList bizOrgIdParamList) { + bizOrgService.delete(bizOrgIdParamList); + return CommonResult.ok(); + } + + /** + * 获取机构详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 6) + @ApiOperation("获取机构详情") + @SaCheckPermission("/biz/org/detail") + @GetMapping("/biz/org/detail") + public CommonResult detail(@Valid BizOrgIdParam bizOrgIdParam) { + return CommonResult.data(bizOrgService.detail(bizOrgIdParam)); + } + + /* ====机构部分所需要用到的选择器==== */ + + /** + * 获取机构树选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 7) + @ApiOperation("获取机构树选择器") + @SaCheckPermission("/biz/org/orgTreeSelector") + @GetMapping("/biz/org/orgTreeSelector") + public CommonResult>> orgTreeSelector() { + return CommonResult.data(bizOrgService.orgTreeSelector()); + } + + /** + * 获取人员选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 8) + @ApiOperation("获取人员选择器") + @SaCheckPermission("/biz/org/userSelector") + @GetMapping("/biz/org/userSelector") + public CommonResult> userSelector(BizOrgSelectorUserParam bizOrgSelectorUserParam) { + return CommonResult.data(bizOrgService.userSelector(bizOrgSelectorUserParam)); + } +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/entity/BizOrg.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/entity/BizOrg.java new file mode 100644 index 00000000..c1d27269 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/entity/BizOrg.java @@ -0,0 +1,67 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.org.entity; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import vip.xiaonuo.common.pojo.CommonEntity; + +/** + * 机构实体 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +@TableName("SYS_ORG") +public class BizOrg extends CommonEntity { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 父id */ + @ApiModelProperty(value = "父id", position = 2) + private String parentId; + + /** 主管id */ + @ApiModelProperty(value = "主管id", position = 3) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String directorId; + + /** 名称 */ + @ApiModelProperty(value = "名称", position = 4) + private String name; + + /** 编码 */ + @ApiModelProperty(value = "编码", position = 5) + private String code; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 6) + private String category; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 7) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 8) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/enums/BizOrgCategoryEnum.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/enums/BizOrgCategoryEnum.java new file mode 100644 index 00000000..3fb56b40 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/enums/BizOrgCategoryEnum.java @@ -0,0 +1,45 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.org.enums; + +import lombok.Getter; +import vip.xiaonuo.common.exception.CommonException; + +/** + * 机构分类枚举 + * + * @author xuyuxiang + * @date 2022/4/21 19:56 + **/ +@Getter +public enum BizOrgCategoryEnum { + + /** 公司 */ + COMPANY("COMPANY"), + + /** 部门 */ + DEPT("DEPT"); + + private final String value; + + BizOrgCategoryEnum(String value) { + this.value = value; + } + + public static void validate(String value) { + boolean flag = COMPANY.getValue().equals(value) || DEPT.getValue().equals(value); + if(!flag) { + throw new CommonException("不支持的机构分类:{}", value); + } + } +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/mapper/BizOrgMapper.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/mapper/BizOrgMapper.java new file mode 100644 index 00000000..d5b15288 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/mapper/BizOrgMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.org.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.biz.modular.org.entity.BizOrg; + +/** + * 机构Mapper接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:37 + **/ +public interface BizOrgMapper extends BaseMapper { +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/mapper/mapping/BizOrgMapper.xml b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/mapper/mapping/BizOrgMapper.xml new file mode 100644 index 00000000..ed3f8a5c --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/mapper/mapping/BizOrgMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/param/BizOrgAddParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/param/BizOrgAddParam.java new file mode 100644 index 00000000..7fecbb1a --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/param/BizOrgAddParam.java @@ -0,0 +1,59 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.org.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 机构添加参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class BizOrgAddParam { + + /** 父id */ + @ApiModelProperty(value = "父id", required = true, position = 1) + @NotBlank(message = "parentId不能为空") + private String parentId; + + /** 名称 */ + @ApiModelProperty(value = "名称", required = true, position = 2) + @NotBlank(message = "name不能为空") + private String name; + + /** 分类 */ + @ApiModelProperty(value = "分类", required = true, position = 3) + @NotBlank(message = "category不能为空") + private String category; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", required = true, position = 4) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 主管id */ + @ApiModelProperty(value = "主管id", position = 5) + private String directorId; + + /** 扩展JSON */ + @ApiModelProperty(value = "扩展JSON", position = 6) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/param/BizOrgEditParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/param/BizOrgEditParam.java new file mode 100644 index 00000000..06abed6e --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/param/BizOrgEditParam.java @@ -0,0 +1,64 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.org.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 机构编辑参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class BizOrgEditParam { + + /** id */ + @ApiModelProperty(value = "id", required = true, position = 1) + @NotBlank(message = "id不能为空") + private String id; + + /** 父id */ + @ApiModelProperty(value = "父id", required = true, position = 2) + @NotBlank(message = "parentId不能为空") + private String parentId; + + /** 名称 */ + @ApiModelProperty(value = "名称", required = true, position = 3) + @NotBlank(message = "name不能为空") + private String name; + + /** 分类 */ + @ApiModelProperty(value = "分类", required = true, position = 4) + @NotBlank(message = "category不能为空") + private String category; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", required = true, position = 5) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 主管id */ + @ApiModelProperty(value = "主管id", position = 6) + private String directorId; + + /** 扩展JSON */ + @ApiModelProperty(value = "扩展JSON", position = 7) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/param/BizOrgIdParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/param/BizOrgIdParam.java new file mode 100644 index 00000000..e22cb459 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/param/BizOrgIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.org.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 机构Id参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class BizOrgIdParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/param/BizOrgPageParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/param/BizOrgPageParam.java new file mode 100644 index 00000000..ae6c09e1 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/param/BizOrgPageParam.java @@ -0,0 +1,52 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.org.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 机构查询参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class BizOrgPageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 父id */ + @ApiModelProperty(value = "父id") + private String parentId; + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/param/BizOrgSelectorOrgListParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/param/BizOrgSelectorOrgListParam.java new file mode 100644 index 00000000..7494f7ba --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/param/BizOrgSelectorOrgListParam.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.org.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 机构列表选择器参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class BizOrgSelectorOrgListParam { + + /** 父id */ + @ApiModelProperty(value = "父id") + private String parentId; + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/param/BizOrgSelectorUserParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/param/BizOrgSelectorUserParam.java new file mode 100644 index 00000000..0207633f --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/param/BizOrgSelectorUserParam.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.org.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 人员选择器参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class BizOrgSelectorUserParam { + + /** 机构id */ + @ApiModelProperty(value = "机构id") + private String orgId; + + /** 姓名关键词 */ + @ApiModelProperty(value = "姓名关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/service/BizOrgService.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/service/BizOrgService.java new file mode 100644 index 00000000..853e0c17 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/service/BizOrgService.java @@ -0,0 +1,111 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.org.service; + +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import vip.xiaonuo.biz.modular.org.entity.BizOrg; +import vip.xiaonuo.biz.modular.org.param.*; +import vip.xiaonuo.biz.modular.user.entity.BizUser; + +import java.util.List; + +/** + * 机构Service接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:35 + **/ +public interface BizOrgService extends IService { + + /** + * 获取机构分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + Page page(BizOrgPageParam bizOrgPageParam); + + /** + * 获取机构树 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + List> tree(); + + /** + * 添加机构 + * + * @author xuyuxiang + * @date 2022/4/24 20:48 + */ + void add(BizOrgAddParam bizOrgAddParam); + + /** + * 编辑机构 + * + * @author xuyuxiang + * @date 2022/4/24 21:13 + */ + void edit(BizOrgEditParam bizOrgEditParam); + + /** + * 删除机构 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + void delete(List bizOrgIdParamList); + + /** + * 获取机构详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + BizOrg detail(BizOrgIdParam bizOrgIdParam); + + /** + * 获取机构详情 + * + * @author xuyuxiang + * @date 2022/7/25 19:42 + **/ + BizOrg queryEntity(String id); + + /** + * 获取机构树选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + List> orgTreeSelector(); + + /** + * 获取机构列表选择器 + * + * @author xuyuxiang + * @date 2022/7/22 13:34 + **/ + List orgListSelector(BizOrgSelectorOrgListParam bizOrgSelectorOrgListParam); + + /** + * 获取人员选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + List userSelector(BizOrgSelectorUserParam bizOrgSelectorUserParam); +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/service/impl/BizOrgServiceImpl.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/service/impl/BizOrgServiceImpl.java new file mode 100644 index 00000000..48136779 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/service/impl/BizOrgServiceImpl.java @@ -0,0 +1,365 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.org.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNode; +import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import vip.xiaonuo.auth.core.util.StpLoginUserUtil; +import vip.xiaonuo.biz.modular.org.entity.BizOrg; +import vip.xiaonuo.biz.modular.org.enums.BizOrgCategoryEnum; +import vip.xiaonuo.biz.modular.org.mapper.BizOrgMapper; +import vip.xiaonuo.biz.modular.org.param.*; +import vip.xiaonuo.biz.modular.org.service.BizOrgService; +import vip.xiaonuo.biz.modular.position.entity.BizPosition; +import vip.xiaonuo.biz.modular.position.service.BizPositionService; +import vip.xiaonuo.biz.modular.user.entity.BizUser; +import vip.xiaonuo.biz.modular.user.service.BizUserService; +import vip.xiaonuo.common.enums.CommonSortOrderEnum; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.sys.api.SysRoleApi; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 机构Service接口实现类 + * + * @author xuyuxiang + * @date 2022/2/23 18:43 + **/ +@Service +public class BizOrgServiceImpl extends ServiceImpl implements BizOrgService { + + @Resource + private SysRoleApi sysRoleApi; + + @Resource + private BizPositionService bizPositionService; + + @Resource + private BizUserService bizUserService; + + @Override + public Page page(BizOrgPageParam bizOrgPageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + // 查询部分字段 + queryWrapper.lambda().select(BizOrg::getId, BizOrg::getParentId, BizOrg::getName, + BizOrg::getCategory, BizOrg::getSortCode); + if(ObjectUtil.isNotEmpty(bizOrgPageParam.getParentId())) { + queryWrapper.lambda().eq(BizOrg::getParentId, bizOrgPageParam.getParentId()); + } + if(ObjectUtil.isNotEmpty(bizOrgPageParam.getSearchKey())) { + queryWrapper.lambda().like(BizOrg::getName, bizOrgPageParam.getSearchKey()); + } + if(ObjectUtil.isAllNotEmpty(bizOrgPageParam.getSortField(), bizOrgPageParam.getSortOrder())) { + CommonSortOrderEnum.validate(bizOrgPageParam.getSortOrder()); + queryWrapper.orderBy(true, bizOrgPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), + StrUtil.toUnderlineCase(bizOrgPageParam.getSortField())); + } else { + queryWrapper.lambda().orderByAsc(BizOrg::getSortCode); + } + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + queryWrapper.lambda().in(BizOrg::getId, loginUserDataScope); + } else { + return new Page<>(); + } + return this.page(CommonPageRequest.defaultPage(), queryWrapper); + } + + @Override + public List> tree() { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + lambdaQueryWrapper.in(BizOrg::getId, loginUserDataScope); + } else { + return CollectionUtil.newArrayList(); + } + lambdaQueryWrapper.orderByAsc(BizOrg::getSortCode); + List bizOrgList = this.list(lambdaQueryWrapper); + List> treeNodeList = bizOrgList.stream().map(bizOrg -> + new TreeNode<>(bizOrg.getId(), bizOrg.getParentId(), + bizOrg.getName(), bizOrg.getSortCode()).setExtra(JSONUtil.parseObj(bizOrg))) + .collect(Collectors.toList()); + return TreeUtil.build(treeNodeList, "0"); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void add(BizOrgAddParam bizOrgAddParam) { + BizOrgCategoryEnum.validate(bizOrgAddParam.getCategory()); + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + if(!loginUserDataScope.contains(bizOrgAddParam.getParentId())) { + throw new CommonException("您没有权限在该机构下增加机构,机构id:{}", bizOrgAddParam.getParentId()); + } + } else { + throw new CommonException("您没有权限增加机构"); + } + BizOrg bizOrg = BeanUtil.toBean(bizOrgAddParam, BizOrg.class); + + // 重复名称 + boolean repeatName = this.count(new LambdaQueryWrapper().eq(BizOrg::getParentId, bizOrg.getParentId()) + .eq(BizOrg::getName, bizOrg.getName())) > 0; + if(repeatName) { + throw new CommonException("存在重复的同级机构,名称为:{}", bizOrg.getName()); + } + bizOrg.setCode(RandomUtil.randomString(10)); + this.save(bizOrg); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void edit(BizOrgEditParam bizOrgEditParam) { + BizOrgCategoryEnum.validate(bizOrgEditParam.getCategory()); + BizOrg bizOrg = this.queryEntity(bizOrgEditParam.getId()); + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + if(!loginUserDataScope.contains(bizOrg.getId())) { + throw new CommonException("您没有权限编辑该机构,机构id:{}", bizOrg.getId()); + } + if(!loginUserDataScope.contains(bizOrg.getParentId())) { + throw new CommonException("您没有权限编辑该机构下的机构,机构id:{}", bizOrg.getParentId()); + } + } else { + throw new CommonException("您没有权限编辑该机构,机构id:{}", bizOrg.getId()); + } + BeanUtil.copyProperties(bizOrgEditParam, bizOrg); + boolean repeatName = this.count(new LambdaQueryWrapper().eq(BizOrg::getParentId, bizOrg.getParentId()) + .eq(BizOrg::getName, bizOrg.getName()).ne(BizOrg::getId, bizOrg.getId())) > 0; + if(repeatName) { + throw new CommonException("存在重复的同级机构,名称为:{}", bizOrg.getName()); + } + List originDataList = this.list(); + boolean errorLevel = this.getChildListById(originDataList, bizOrg.getId(), true).stream() + .map(BizOrg::getId).collect(Collectors.toList()).contains(bizOrg.getParentId()); + if(errorLevel) { + throw new CommonException("不可选择上级机构:{}", this.getById(originDataList, bizOrg.getParentId()).getName()); + } + this.updateById(bizOrg); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void delete(List bizOrgIdParamList) { + List orgIdList = CollStreamUtil.toList(bizOrgIdParamList, BizOrgIdParam::getId); + if(ObjectUtil.isNotEmpty(orgIdList)) { + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + if(!loginUserDataScope.containsAll(orgIdList)) { + throw new CommonException("您没有权限删除这些机构,机构id:{}", orgIdList); + } + } else { + throw new CommonException("您没有权限删除这些机构,机构id:{}", orgIdList); + } + List allOrgList = this.list(); + // 获取所有子组织 + List toDeleteOrgIdList = CollectionUtil.newArrayList(); + orgIdList.forEach(orgId -> toDeleteOrgIdList.addAll(this.getChildListById(allOrgList, orgId, true).stream() + .map(BizOrg::getId).collect(Collectors.toList()))); + // 机构下有人不能删除(直属机构) + boolean hasOrgUser = bizUserService.count(new LambdaQueryWrapper().in(BizUser::getOrgId, toDeleteOrgIdList)) > 0; + if(hasOrgUser) { + throw new CommonException("请先删除机构下的人员"); + } + // 机构下有人不能删除(兼任机构) + List positionJsonList = bizUserService.list(new LambdaQueryWrapper() + .isNotNull(BizUser::getPositionJson)).stream().map(BizUser::getPositionJson).collect(Collectors.toList()); + if(ObjectUtil.isNotEmpty(positionJsonList)) { + List positionOrgIdList = CollectionUtil.newArrayList(); + positionJsonList.forEach(positionJson -> JSONUtil.toList(JSONUtil.parseArray(positionJson), JSONObject.class) + .forEach(jsonObject -> positionOrgIdList.add(jsonObject.getStr("orgId")))); + boolean hasPositionUser = CollectionUtil.intersectionDistinct(toDeleteOrgIdList, CollectionUtil.removeNull(positionOrgIdList)).size() > 0; + if(hasPositionUser) { + throw new CommonException("请先删除机构下的人员"); + } + } + // 机构下有角色不能删除 + boolean hasRole = sysRoleApi.orgHasRole(toDeleteOrgIdList); + if(hasRole) { + throw new CommonException("请先删除机构下的角色"); + } + // 机构下有岗位不能删除 + boolean hasPosition = bizPositionService.count(new LambdaQueryWrapper().in(BizPosition::getOrgId, toDeleteOrgIdList)) > 0; + if(hasPosition) { + throw new CommonException("请先删除机构下的岗位"); + } + // 执行删除 + this.removeBatchByIds(toDeleteOrgIdList); + } + } + + @Override + public BizOrg detail(BizOrgIdParam bizOrgIdParam) { + return this.queryEntity(bizOrgIdParam.getId()); + } + + @Override + public BizOrg queryEntity(String id) { + BizOrg bizOrg = this.getById(id); + if(ObjectUtil.isEmpty(bizOrg)) { + throw new CommonException("机构不存在,id值为:{}", id); + } + return bizOrg; + } + + /* ====机构部分所需要用到的选择器==== */ + + @Override + public List> orgTreeSelector() { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + lambdaQueryWrapper.in(BizOrg::getId, loginUserDataScope); + } else { + return CollectionUtil.newArrayList(); + } + lambdaQueryWrapper.orderByAsc(BizOrg::getSortCode); + List bizOrgList = this.list(lambdaQueryWrapper); + List> treeNodeList = bizOrgList.stream().map(bizOrg -> + new TreeNode<>(bizOrg.getId(), bizOrg.getParentId(), bizOrg.getName(), bizOrg.getSortCode())) + .collect(Collectors.toList()); + return TreeUtil.build(treeNodeList, "0"); + } + + @Override + public List orgListSelector(BizOrgSelectorOrgListParam bizOrgSelectorOrgListParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + lambdaQueryWrapper.in(BizOrg::getId, loginUserDataScope); + } else { + return CollectionUtil.newArrayList(); + } + // 查询部分字段 + lambdaQueryWrapper.select(BizOrg::getId, BizOrg::getParentId, BizOrg::getName, + BizOrg::getCategory, BizOrg::getSortCode); + if(ObjectUtil.isNotEmpty(bizOrgSelectorOrgListParam.getParentId())) { + lambdaQueryWrapper.eq(BizOrg::getParentId, bizOrgSelectorOrgListParam.getParentId()); + } + if(ObjectUtil.isNotEmpty(bizOrgSelectorOrgListParam.getSearchKey())) { + lambdaQueryWrapper.like(BizOrg::getName, bizOrgSelectorOrgListParam.getSearchKey()); + } + lambdaQueryWrapper.orderByAsc(BizOrg::getSortCode); + return this.list(lambdaQueryWrapper); + } + + @Override + public List userSelector(BizOrgSelectorUserParam bizOrgSelectorUserParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + lambdaQueryWrapper.in(BizUser::getOrgId, loginUserDataScope); + } else { + return CollectionUtil.newArrayList(); + } + // 只查询部分字段 + lambdaQueryWrapper.select(BizUser::getId, BizUser::getOrgId, BizUser::getAccount, BizUser::getName); + if(ObjectUtil.isNotEmpty(bizOrgSelectorUserParam.getOrgId())) { + lambdaQueryWrapper.eq(BizUser::getOrgId, bizOrgSelectorUserParam.getOrgId()); + } + if(ObjectUtil.isNotEmpty(bizOrgSelectorUserParam.getSearchKey())) { + lambdaQueryWrapper.like(BizUser::getName, bizOrgSelectorUserParam.getSearchKey()); + } + lambdaQueryWrapper.orderByAsc(BizUser::getSortCode); + return bizUserService.list(lambdaQueryWrapper); + } + + /* ====以下为各种递归方法==== */ + + public List getChildListById(List originDataList, String id, boolean includeSelf) { + List resultList = CollectionUtil.newArrayList(); + execRecursionFindChild(originDataList, id, resultList); + if(includeSelf) { + BizOrg self = this.getById(originDataList, id); + if(ObjectUtil.isNotEmpty(self)) { + resultList.add(self); + } + } + return resultList; + } + + public List getParentListById(List originDataList, String id, boolean includeSelf) { + List resultList = CollectionUtil.newArrayList(); + execRecursionFindParent(originDataList, id, resultList); + if(includeSelf) { + BizOrg self = this.getById(originDataList, id); + if(ObjectUtil.isNotEmpty(self)) { + resultList.add(self); + } + } + return resultList; + } + + public void execRecursionFindChild(List originDataList, String id, List resultList) { + originDataList.forEach(item -> { + if(item.getParentId().equals(id)) { + resultList.add(item); + execRecursionFindChild(originDataList, item.getId(), resultList); + } + }); + } + + public void execRecursionFindParent(List originDataList, String id, List resultList) { + originDataList.forEach(item -> { + if(item.getId().equals(id)) { + BizOrg parent = this.getById(originDataList, item.getParentId()); + if(ObjectUtil.isNotEmpty(parent)) { + resultList.add(parent); + } + execRecursionFindParent(originDataList, item.getParentId(), resultList); + } + }); + } + + public BizOrg getById(List originDataList, String id) { + int index = CollStreamUtil.toList(originDataList, BizOrg::getId).indexOf(id); + return index == -1?null:originDataList.get(index); + } + + public BizOrg getParentById(List originDataList, String id) { + BizOrg self = this.getById(originDataList, id); + return ObjectUtil.isNotEmpty(self)?self:this.getById(originDataList, self.getParentId()); + } + + public BizOrg getChildById(List originDataList, String id) { + int index = CollStreamUtil.toList(originDataList, BizOrg::getParentId).indexOf(id); + return index == -1?null:originDataList.get(index); + } +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/controller/BizPositionController.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/controller/BizPositionController.java new file mode 100644 index 00000000..ec3b6889 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/controller/BizPositionController.java @@ -0,0 +1,160 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.position.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.biz.modular.position.entity.BizPosition; +import vip.xiaonuo.biz.modular.position.param.*; +import vip.xiaonuo.biz.modular.position.service.BizPositionService; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.pojo.CommonValidList; + +import javax.annotation.Resource; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * 岗位控制器 + * + * @author xuyuxiang + * @date 2022/4/25 20:40 + */ +@Api(tags = "岗位控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 2) +@RestController +@Validated +public class BizPositionController { + + @Resource + private BizPositionService bizPositionService; + + /** + * 获取岗位分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("获取岗位分页") + @SaCheckPermission("/biz/position/page") + @GetMapping("/biz/position/page") + public CommonResult> page(BizPositionPageParam bizPositionPageParam) { + return CommonResult.data(bizPositionService.page(bizPositionPageParam)); + } + + /** + * 添加岗位 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("添加岗位") + @CommonLog("添加岗位") + @SaCheckPermission("/biz/position/add") + @PostMapping("/biz/position/add") + public CommonResult add(@RequestBody @Valid BizPositionAddParam bizPositionAddParam) { + bizPositionService.add(bizPositionAddParam); + return CommonResult.ok(); + } + + /** + * 编辑岗位 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("编辑岗位") + @CommonLog("编辑岗位") + @SaCheckPermission("/biz/position/edit") + @PostMapping("/biz/position/edit") + public CommonResult edit(@RequestBody @Valid BizPositionEditParam bizPositionEditParam) { + bizPositionService.edit(bizPositionEditParam); + return CommonResult.ok(); + } + + /** + * 删除岗位 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 4) + @ApiOperation("删除岗位") + @CommonLog("删除岗位") + @SaCheckPermission("/biz/position/delete") + @PostMapping("/biz/position/delete") + public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList bizPositionIdParamList) { + bizPositionService.delete(bizPositionIdParamList); + return CommonResult.ok(); + } + + /** + * 获取岗位详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 5) + @ApiOperation("获取岗位详情") + @SaCheckPermission("/biz/position/detail") + @GetMapping("/biz/position/detail") + public CommonResult detail(@Valid BizPositionIdParam bizPositionIdParam) { + return CommonResult.data(bizPositionService.detail(bizPositionIdParam)); + } + + /* ====岗位部分所需要用到的选择器==== */ + + /** + * 获取组织树选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 6) + @ApiOperation("获取组织树选择器") + @SaCheckPermission("/biz/position/orgTreeSelector") + @GetMapping("/biz/position/orgTreeSelector") + public CommonResult>> orgTreeSelector() { + return CommonResult.data(bizPositionService.orgTreeSelector()); + } + + /** + * 获取岗位选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 7) + @ApiOperation("获取岗位选择器") + @SaCheckPermission("/biz/position/positionSelector") + @GetMapping("/biz/position/positionSelector") + public CommonResult> positionSelector(BizPositionSelectorPositionParam bizPositionSelectorPositionParam) { + return CommonResult.data(bizPositionService.positionSelector(bizPositionSelectorPositionParam)); + } +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/entity/BizPosition.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/entity/BizPosition.java new file mode 100644 index 00000000..0eafc87b --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/entity/BizPosition.java @@ -0,0 +1,62 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.position.entity; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import vip.xiaonuo.common.pojo.CommonEntity; + +/** + * 岗位实体 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +@TableName("SYS_POSITION") +public class BizPosition extends CommonEntity { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 机构id */ + @ApiModelProperty(value = "机构id", position = 2) + private String orgId; + + /** 名称 */ + @ApiModelProperty(value = "名称", position = 3) + private String name; + + /** 编码 */ + @ApiModelProperty(value = "编码", position = 4) + private String code; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 5) + private String category; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 6) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 7) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/enums/BizPositionCategoryEnum.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/enums/BizPositionCategoryEnum.java new file mode 100644 index 00000000..8758bafc --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/enums/BizPositionCategoryEnum.java @@ -0,0 +1,48 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.position.enums; + +import lombok.Getter; +import vip.xiaonuo.common.exception.CommonException; + +/** + * 岗位分类枚举 + * + * @author xuyuxiang + * @date 2022/4/21 19:56 + **/ +@Getter +public enum BizPositionCategoryEnum { + + /** 高层 */ + COMPANY("HIGH"), + + /** 中层 */ + DEPT("MIDDLE"), + + /** 基层 */ + LOW("LOW"); + + private final String value; + + BizPositionCategoryEnum(String value) { + this.value = value; + } + + public static void validate(String value) { + boolean flag = COMPANY.getValue().equals(value) || DEPT.getValue().equals(value); + if(!flag) { + throw new CommonException("不支持的岗位分类:{}", value); + } + } +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/mapper/BizPositionMapper.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/mapper/BizPositionMapper.java new file mode 100644 index 00000000..d0cf6d1d --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/mapper/BizPositionMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.position.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.biz.modular.position.entity.BizPosition; + +/** + * 岗位Mapper接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:37 + **/ +public interface BizPositionMapper extends BaseMapper { +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/mapper/mapping/BizPositionMapper.xml b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/mapper/mapping/BizPositionMapper.xml new file mode 100644 index 00000000..c27d5bb5 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/mapper/mapping/BizPositionMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/param/BizPositionAddParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/param/BizPositionAddParam.java new file mode 100644 index 00000000..69d2f882 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/param/BizPositionAddParam.java @@ -0,0 +1,55 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.position.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 岗位添加参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class BizPositionAddParam { + + /** 机构id */ + @ApiModelProperty(value = "机构id", required = true, position = 1) + @NotBlank(message = "orgId不能为空") + private String orgId; + + /** 名称 */ + @ApiModelProperty(value = "名称", required = true, position = 2) + @NotBlank(message = "name不能为空") + private String name; + + /** 分类 */ + @ApiModelProperty(value = "分类", required = true, position = 3) + @NotBlank(message = "category不能为空") + private String category; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", required = true, position = 4) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 扩展JSON */ + @ApiModelProperty(value = "扩展JSON", position = 5) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/param/BizPositionEditParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/param/BizPositionEditParam.java new file mode 100644 index 00000000..3c1df7fe --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/param/BizPositionEditParam.java @@ -0,0 +1,60 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.position.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 岗位编辑参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class BizPositionEditParam { + + /** id */ + @ApiModelProperty(value = "id", required = true, position = 1) + @NotBlank(message = "id不能为空") + private String id; + + /** 机构id */ + @ApiModelProperty(value = "机构id", required = true, position = 2) + @NotBlank(message = "orgId不能为空") + private String orgId; + + /** 名称 */ + @ApiModelProperty(value = "名称", required = true, position = 3) + @NotBlank(message = "name不能为空") + private String name; + + /** 分类 */ + @ApiModelProperty(value = "分类", required = true, position = 4) + @NotBlank(message = "category不能为空") + private String category; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", required = true, position = 5) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 扩展JSON */ + @ApiModelProperty(value = "扩展JSON", position = 6) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/param/BizPositionIdParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/param/BizPositionIdParam.java new file mode 100644 index 00000000..032dbb45 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/param/BizPositionIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.position.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 岗位Id参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class BizPositionIdParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/param/BizPositionPageParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/param/BizPositionPageParam.java new file mode 100644 index 00000000..68b9b500 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/param/BizPositionPageParam.java @@ -0,0 +1,56 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.position.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 岗位查询参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class BizPositionPageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 机构id */ + @ApiModelProperty(value = "机构id") + private String orgId; + + /** 岗位分类 */ + @ApiModelProperty(value = "岗位分类") + private String category; + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/param/BizPositionSelectorPositionParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/param/BizPositionSelectorPositionParam.java new file mode 100644 index 00000000..bbee748c --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/param/BizPositionSelectorPositionParam.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.position.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 岗位选择器参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class BizPositionSelectorPositionParam { + + /** 机构id */ + @ApiModelProperty(value = "机构id") + private String orgId; + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/service/BizPositionService.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/service/BizPositionService.java new file mode 100644 index 00000000..06e7d76d --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/service/BizPositionService.java @@ -0,0 +1,96 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.position.service; + +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import vip.xiaonuo.biz.modular.position.entity.BizPosition; +import vip.xiaonuo.biz.modular.position.param.*; + +import java.util.List; + +/** + * 岗位Service接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:35 + **/ +public interface BizPositionService extends IService { + + /** + * 获取岗位分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + Page page(BizPositionPageParam bizPositionPageParam); + + /** + * 添加岗位 + * + * @author xuyuxiang + * @date 2022/4/24 20:48 + */ + void add(BizPositionAddParam bizPositionAddParam); + + /** + * 编辑岗位 + * + * @author xuyuxiang + * @date 2022/4/24 21:13 + */ + void edit(BizPositionEditParam bizPositionEditParam); + + /** + * 删除岗位 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + void delete(List bizPositionIdParamList); + + /** + * 获取岗位详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + BizPosition detail(BizPositionIdParam bizPositionIdParam); + + /** + * 获取岗位详情 + * + * @author xuyuxiang + * @date 2022/7/25 19:42 + **/ + BizPosition queryEntity(String id); + + /* ====岗位部分所需要用到的选择器==== */ + + /** + * 获取机构树选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + List> orgTreeSelector(); + + /** + * 获取岗位选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + List positionSelector(BizPositionSelectorPositionParam bizPositionSelectorPositionParam); +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/service/impl/BizPositionServiceImpl.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/service/impl/BizPositionServiceImpl.java new file mode 100644 index 00000000..029cb815 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/position/service/impl/BizPositionServiceImpl.java @@ -0,0 +1,238 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.position.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNode; +import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import vip.xiaonuo.auth.core.util.StpLoginUserUtil; +import vip.xiaonuo.biz.modular.org.entity.BizOrg; +import vip.xiaonuo.biz.modular.org.service.BizOrgService; +import vip.xiaonuo.biz.modular.position.entity.BizPosition; +import vip.xiaonuo.biz.modular.position.enums.BizPositionCategoryEnum; +import vip.xiaonuo.biz.modular.position.mapper.BizPositionMapper; +import vip.xiaonuo.biz.modular.position.param.*; +import vip.xiaonuo.biz.modular.position.service.BizPositionService; +import vip.xiaonuo.biz.modular.user.entity.BizUser; +import vip.xiaonuo.biz.modular.user.service.BizUserService; +import vip.xiaonuo.common.enums.CommonSortOrderEnum; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.page.CommonPageRequest; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 岗位Service接口实现类 + * + * @author xuyuxiang + * @date 2022/2/23 18:43 + **/ +@Service +public class BizPositionServiceImpl extends ServiceImpl implements BizPositionService { + + @Resource + private BizOrgService bizOrgService; + + @Resource + private BizUserService bizUserService; + + @Override + public Page page(BizPositionPageParam bizPositionPageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + // 查询部分字段 + queryWrapper.lambda().select(BizPosition::getId, BizPosition::getOrgId, BizPosition::getName, + BizPosition::getCategory, BizPosition::getSortCode); + if(ObjectUtil.isNotEmpty(bizPositionPageParam.getOrgId())) { + queryWrapper.lambda().eq(BizPosition::getOrgId, bizPositionPageParam.getOrgId()); + } + if(ObjectUtil.isNotEmpty(bizPositionPageParam.getCategory())) { + queryWrapper.lambda().eq(BizPosition::getCategory, bizPositionPageParam.getCategory()); + } + if(ObjectUtil.isAllNotEmpty(bizPositionPageParam.getSortField(), bizPositionPageParam.getSortOrder())) { + CommonSortOrderEnum.validate(bizPositionPageParam.getSortOrder()); + queryWrapper.orderBy(true, bizPositionPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), + StrUtil.toUnderlineCase(bizPositionPageParam.getSortField())); + } else { + queryWrapper.lambda().orderByAsc(BizPosition::getSortCode); + } + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + queryWrapper.lambda().in(BizPosition::getOrgId, loginUserDataScope); + } else { + return new Page<>(); + } + return this.page(CommonPageRequest.defaultPage(), queryWrapper); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void add(BizPositionAddParam bizPositionAddParam) { + BizPositionCategoryEnum.validate(bizPositionAddParam.getCategory()); + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + if(!loginUserDataScope.contains(bizPositionAddParam.getOrgId())) { + throw new CommonException("您没有权限在该机构下增加岗位,机构id:{}", bizPositionAddParam.getOrgId()); + } + } else { + throw new CommonException("您没有权限在该机构下增加岗位,机构id:{}", bizPositionAddParam.getOrgId()); + } + BizPosition bizPosition = BeanUtil.toBean(bizPositionAddParam, BizPosition.class); + boolean repeatName = this.count(new LambdaQueryWrapper().eq(BizPosition::getOrgId, bizPosition.getOrgId()) + .eq(BizPosition::getName, bizPosition.getName())) > 0; + if(repeatName) { + throw new CommonException("同机构下存在重复的岗位,名称为:{}", bizPosition.getName()); + } + bizPosition.setCode(RandomUtil.randomString(10)); + this.save(bizPosition); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void edit(BizPositionEditParam bizPositionEditParam) { + BizPositionCategoryEnum.validate(bizPositionEditParam.getCategory()); + BizPosition bizPosition = this.queryEntity(bizPositionEditParam.getId()); + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + if(!loginUserDataScope.contains(bizPositionEditParam.getOrgId())) { + throw new CommonException("您没有权限编辑该机构下的岗位,机构id:{}", bizPositionEditParam.getOrgId()); + } + } else { + if(!bizPositionEditParam.getId().equals(StpUtil.getLoginIdAsString())) { + throw new CommonException("您没有权限编辑该机构下的岗位,机构id:{}", bizPositionEditParam.getOrgId()); + } + } + BeanUtil.copyProperties(bizPositionEditParam, bizPosition); + boolean repeatName = this.count(new LambdaQueryWrapper().eq(BizPosition::getOrgId, bizPosition.getOrgId()) + .eq(BizPosition::getName, bizPosition.getName()).ne(BizPosition::getId, bizPosition.getId())) > 0; + if(repeatName) { + throw new CommonException("同机构下存在重复的岗位,名称为:{}", bizPosition.getName()); + } + this.updateById(bizPosition); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void delete(List bizPositionIdParamList) { + List positionIdList = CollStreamUtil.toList(bizPositionIdParamList, BizPositionIdParam::getId); + if(ObjectUtil.isNotEmpty(positionIdList)) { + // 获取这些岗位的的机构id集合 + Set positionOrgIdList = this.listByIds(positionIdList).stream().map(BizPosition::getOrgId).collect(Collectors.toSet()); + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + if(!loginUserDataScope.containsAll(positionOrgIdList)) { + throw new CommonException("您没有权限删除这些机构下的岗位,机构id:{}", positionOrgIdList); + } + } else { + throw new CommonException("您没有权限删除这些机构下的岗位,机构id:{}", positionOrgIdList); + } + // 岗位下有人不能删除(直属岗位) + boolean hasOrgUser = bizUserService.count(new LambdaQueryWrapper().in(BizUser::getPositionId, positionIdList)) > 0; + if(hasOrgUser) { + throw new CommonException("请先删除岗位下的用户"); + } + // 岗位下有人不能删除(兼任岗位) + List positionJsonList = bizUserService.list(new LambdaQueryWrapper() + .isNotNull(BizUser::getPositionJson)).stream().map(BizUser::getPositionJson).collect(Collectors.toList()); + if(ObjectUtil.isNotEmpty(positionJsonList)) { + List extPositionIdList = CollectionUtil.newArrayList(); + positionJsonList.forEach(positionJson -> JSONUtil.toList(JSONUtil.parseArray(positionJson), JSONObject.class) + .forEach(jsonObject -> extPositionIdList.add(jsonObject.getStr("positionId")))); + boolean hasPositionUser = CollectionUtil.intersectionDistinct(positionIdList, CollectionUtil.removeNull(extPositionIdList)).size() > 0; + if(hasPositionUser) { + throw new CommonException("请先删除岗位下的用户"); + } + } + // 执行删除 + this.removeBatchByIds(positionIdList); + } + } + + @Override + public BizPosition detail(BizPositionIdParam bizPositionIdParam) { + return this.queryEntity(bizPositionIdParam.getId()); + } + + @Override + public BizPosition queryEntity(String id) { + BizPosition bizPosition = this.getById(id); + if(ObjectUtil.isEmpty(bizPosition)) { + throw new CommonException("岗位不存在,id值为:{}", id); + } + return bizPosition; + } + + /* ====岗位部分所需要用到的选择器==== */ + + @Override + public List> orgTreeSelector() { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + lambdaQueryWrapper.in(BizOrg::getId, loginUserDataScope); + } else { + return CollectionUtil.newArrayList(); + } + lambdaQueryWrapper.orderByAsc(BizOrg::getSortCode); + List bizOrgList = bizOrgService.list(lambdaQueryWrapper); + List> treeNodeList = bizOrgList.stream().map(bizOrg -> + new TreeNode<>(bizOrg.getId(), bizOrg.getParentId(), bizOrg.getName(), bizOrg.getSortCode())) + .collect(Collectors.toList()); + return TreeUtil.build(treeNodeList, "0"); + } + + @Override + public List positionSelector(BizPositionSelectorPositionParam bizPositionSelectorPositionParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + lambdaQueryWrapper.in(BizPosition::getOrgId, loginUserDataScope); + } else { + return CollectionUtil.newArrayList(); + } + // 查询部分字段 + lambdaQueryWrapper.select(BizPosition::getId, BizPosition::getOrgId, BizPosition::getName, + BizPosition::getCategory, BizPosition::getSortCode); + if(ObjectUtil.isNotEmpty(bizPositionSelectorPositionParam.getOrgId())) { + lambdaQueryWrapper.eq(BizPosition::getOrgId, bizPositionSelectorPositionParam.getOrgId()); + } + if(ObjectUtil.isNotEmpty(bizPositionSelectorPositionParam.getSearchKey())) { + lambdaQueryWrapper.like(BizPosition::getName, bizPositionSelectorPositionParam.getSearchKey()); + } + lambdaQueryWrapper.orderByAsc(BizPosition::getSortCode); + return this.list(lambdaQueryWrapper); + } +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/controller/BizUserController.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/controller/BizUserController.java new file mode 100644 index 00000000..19e60966 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/controller/BizUserController.java @@ -0,0 +1,322 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.user.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import vip.xiaonuo.biz.modular.org.entity.BizOrg; +import vip.xiaonuo.biz.modular.position.entity.BizPosition; +import vip.xiaonuo.biz.modular.user.entity.BizUser; +import vip.xiaonuo.biz.modular.user.param.*; +import vip.xiaonuo.biz.modular.user.result.BizUserResult; +import vip.xiaonuo.biz.modular.user.result.BizUserRoleResult; +import vip.xiaonuo.biz.modular.user.service.BizUserService; +import vip.xiaonuo.biz.modular.user.wrapper.BizUserResultWrapperImpl; +import vip.xiaonuo.biz.modular.user.wrapper.BizUserWrapperImpl; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.annotation.CommonWrapper; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.pojo.CommonValidList; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import java.io.IOException; +import java.util.List; + +/** + * 人员控制器 + * + * @author xuyuxiang + * @date 2022/4/22 9:34 + **/ +@Api(tags = "人员控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 9) +@RestController +@Validated +public class BizUserController { + + @Resource + private BizUserService bizUserService; + + /** + * 获取人员分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("获取人员分页") + @SaCheckPermission("/biz/user/page") + @CommonWrapper(BizUserResultWrapperImpl.class) + @GetMapping("/biz/user/page") + public CommonResult> page(BizUserPageParam bizUserPageParam) { + return CommonResult.data(bizUserService.page(bizUserPageParam)); + } + + /** + * 添加人员 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("添加人员") + @CommonLog("添加人员") + @SaCheckPermission("/biz/user/add") + @PostMapping("/biz/user/add") + public CommonResult add(@RequestBody @Valid BizUserAddParam bizUserAddParam) { + bizUserService.add(bizUserAddParam); + return CommonResult.ok(); + } + + /** + * 编辑人员 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("编辑人员") + @CommonLog("编辑人员") + @SaCheckPermission("/biz/user/edit") + @PostMapping("/biz/user/edit") + public CommonResult edit(@RequestBody @Valid BizUserEditParam bizUserEditParam) { + bizUserService.edit(bizUserEditParam); + return CommonResult.ok(); + } + + /** + * 删除人员 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 4) + @ApiOperation("删除人员") + @CommonLog("删除人员") + @SaCheckPermission("/biz/user/delete") + @PostMapping("/biz/user/delete") + public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList bizUserIdParamList) { + bizUserService.delete(bizUserIdParamList); + return CommonResult.ok(); + } + + /** + * 获取人员详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 5) + @ApiOperation("获取人员详情") + @SaCheckPermission("/biz/user/detail") + @CommonWrapper(BizUserWrapperImpl.class) + @GetMapping("/biz/user/detail") + public CommonResult detail(@Valid BizUserIdParam bizUserIdParam) { + return CommonResult.data(bizUserService.detail(bizUserIdParam)); + } + + /** + * 禁用人员 + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 6) + @ApiOperation("禁用人员") + @CommonLog("禁用人员") + @SaCheckPermission("/biz/user/disableUser") + @PostMapping("/biz/user/disableUser") + public CommonResult disableUser(@RequestBody BizUserIdParam bizUserIdParam) { + bizUserService.disableUser(bizUserIdParam); + return CommonResult.ok(); + } + + /** + * 启用人员 + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 7) + @ApiOperation("启用人员") + @CommonLog("启用人员") + @SaCheckPermission("/biz/user/enableUser") + @PostMapping("/biz/user/enableUser") + public CommonResult enableUser(@RequestBody @Valid BizUserIdParam bizUserIdParam) { + bizUserService.enableUser(bizUserIdParam); + return CommonResult.ok(); + } + + /** + * 重置人员密码 + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 8) + @ApiOperation("重置人员密码") + @CommonLog("重置人员密码") + @SaCheckPermission("/biz/user/resetPassword") + @PostMapping("/biz/user/resetPassword") + public CommonResult resetPassword(@RequestBody @Valid BizUserIdParam bizUserIdParam) { + bizUserService.resetPassword(bizUserIdParam); + return CommonResult.ok(); + } + + /** + * 用户拥有角色 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 9) + @ApiOperation("获取人员拥有角色") + @SaCheckPermission("/biz/user/ownRole") + @GetMapping("/biz/user/ownRole") + public CommonResult> ownRole(@Valid BizUserIdParam bizUserIdParam) { + return CommonResult.data(bizUserService.ownRole(bizUserIdParam)); + } + + /** + * 给用户授权角色 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 10) + @ApiOperation("给人员授权角色") + @CommonLog("给人员授权角色") + @SaCheckPermission("/biz/user/grantRole") + @PostMapping("/biz/user/grantRole") + public CommonResult grantRole(@RequestBody @Valid BizUserGrantRoleParam bizUserGrantRoleParam) { + bizUserService.grantRole(bizUserGrantRoleParam); + return CommonResult.ok(); + } + + /** + * 人员导入 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 11) + @ApiOperation("人员导入") + @CommonLog("人员导入") + @SaCheckPermission("/biz/user/import") + @PostMapping("/biz/user/import") + public CommonResult importUser(@RequestPart("file") @ApiParam(value="文件", required = true) MultipartFile file) { + bizUserService.importUser(file); + return CommonResult.ok(); + } + + /** + * 人员导出 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 12) + @ApiOperation("人员导出") + @CommonLog("人员导出") + @SaCheckPermission("/biz/user/export") + @GetMapping(value = "/biz/user/export", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) + public void exportUser(BizUserExportParam bizUserExportParam, HttpServletResponse response) throws IOException { + bizUserService.exportUser(bizUserExportParam, response); + } + + /* ====人员部分所需要用到的选择器==== */ + + /** + * 获取机构树选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 13) + @ApiOperation("获取机构树选择器") + @SaCheckPermission("/biz/user/orgTreeSelector") + @GetMapping("/biz/user/orgTreeSelector") + public CommonResult>> orgTreeSelector() { + return CommonResult.data(bizUserService.orgTreeSelector()); + } + + /** + * 获取机构列表选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 14) + @ApiOperation("获取机构列表选择器") + @SaCheckPermission("/biz/user/orgListSelector") + @GetMapping("/biz/user/orgListSelector") + public CommonResult> orgListSelector(BizUserSelectorOrgListParam bizUserSelectorOrgListParam) { + return CommonResult.data(bizUserService.orgListSelector(bizUserSelectorOrgListParam)); + } + + /** + * 获取岗位选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 15) + @ApiOperation("获取岗位选择器") + @SaCheckPermission("/biz/user/positionSelector") + @GetMapping("/biz/user/positionSelector") + public CommonResult> positionSelector(BizUserSelectorPositionParam bizUserSelectorPositionParam) { + return CommonResult.data(bizUserService.positionSelector(bizUserSelectorPositionParam)); + } + + /** + * 获取角色选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 16) + @ApiOperation("获取角色选择器") + @SaCheckPermission("/biz/user/roleSelector") + @GetMapping("/biz/user/roleSelector") + public CommonResult> roleSelector(BizUserSelectorRoleParam bizUserSelectorRoleParam) { + return CommonResult.data(bizUserService.roleSelector(bizUserSelectorRoleParam)); + } + + /** + * 获取人员选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 17) + @ApiOperation("获取人员选择器") + @SaCheckPermission("/biz/user/userSelector") + @GetMapping("/biz/user/userSelector") + public CommonResult> userSelector(BizUserSelectorUserParam bizUserSelectorUserParam) { + return CommonResult.data(bizUserService.userSelector(bizUserSelectorUserParam)); + } +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/entity/BizUser.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/entity/BizUser.java new file mode 100644 index 00000000..0f706293 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/entity/BizUser.java @@ -0,0 +1,256 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.user.entity; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import vip.xiaonuo.common.pojo.CommonEntity; + +import java.util.Date; + +/** + * 人员实体 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +@TableName("SYS_USER") +public class BizUser extends CommonEntity { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 头像 */ + @ApiModelProperty(value = "头像", position = 2) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String avatar; + + /** 签名 */ + @ApiModelProperty(value = "签名", position = 3) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String signature; + + /** 账号 */ + @ApiModelProperty(value = "账号", position = 4) + private String account; + + /** 密码 */ + @ApiModelProperty(value = "密码", position = 5) + private String password; + + /** 姓名 */ + @ApiModelProperty(value = "姓名", position = 6) + private String name; + + /** 昵称 */ + @ApiModelProperty(value = "昵称", position = 7) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String nickname; + + /** 性别 */ + @ApiModelProperty(value = "性别", position = 8) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String gender; + + /** 年龄 */ + @ApiModelProperty(value = "年龄", position = 9) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String age; + + /** 出生日期 */ + @ApiModelProperty(value = "出生日期", position = 10) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String birthday; + + /** 民族 */ + @ApiModelProperty(value = "民族", position = 11) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String nation; + + /** 籍贯 */ + @ApiModelProperty(value = "籍贯", position = 12) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String nativePlace; + + /** 家庭住址 */ + @ApiModelProperty(value = "家庭住址", position = 13) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String homeAddress; + + /** 通信地址 */ + @ApiModelProperty(value = "通信地址", position = 14) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String mailingAddress; + + /** 证件类型 */ + @ApiModelProperty(value = "证件类型", position = 15) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String idCardType; + + /** 证件号码 */ + @ApiModelProperty(value = "证件号码", position = 16) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String idCardNumber; + + /** 文化程度 */ + @ApiModelProperty(value = "文化程度", position = 17) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String cultureLevel; + + /** 政治面貌 */ + @ApiModelProperty(value = "政治面貌", position = 18) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String politicalOutlook; + + /** 毕业院校 */ + @ApiModelProperty(value = "毕业院校", position = 19) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String college; + + /** 学历 */ + @ApiModelProperty(value = "学历", position = 20) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String education; + + /** 学制 */ + @ApiModelProperty(value = "学制", position = 21) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String eduLength; + + /** 学位 */ + @ApiModelProperty(value = "学位", position = 22) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String degree; + + /** 手机 */ + @ApiModelProperty(value = "手机", position = 23) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String phone; + + /** 邮箱 */ + @ApiModelProperty(value = "邮箱", position = 24) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String email; + + /** 家庭电话 */ + @ApiModelProperty(value = "家庭电话", position = 25) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String homeTel; + + /** 办公电话 */ + @ApiModelProperty(value = "办公电话", position = 26) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String officeTel; + + /** 紧急联系人 */ + @ApiModelProperty(value = "紧急联系人", position = 27) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String emergencyContact; + + /** 紧急联系人电话 */ + @ApiModelProperty(value = "紧急联系人电话", position = 28) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String emergencyPhone; + + /** 紧急联系人地址 */ + @ApiModelProperty(value = "紧急联系人地址", position = 29) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String emergencyAddress; + + /** 员工编号 */ + @ApiModelProperty(value = "员工编号", position = 30) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String empNo; + + /** 入职日期 */ + @ApiModelProperty(value = "入职日期", position = 31) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String entryDate; + + /** 机构id */ + @ApiModelProperty(value = "机构id", position = 32) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String orgId; + + /** 岗位id */ + @ApiModelProperty(value = "岗位id", position = 33) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String positionId; + + /** 岗级 */ + @ApiModelProperty(value = "岗级", position = 34) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String positionLevel; + + /** 主管id */ + @ApiModelProperty(value = "主管id", position = 35) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String directorId; + + /** 兼任信息 */ + @ApiModelProperty(value = "兼任信息", position = 36) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String positionJson; + + /** 上次登录ip */ + @ApiModelProperty(value = "上次登录ip", position = 37) + private String lastLoginIp; + + /** 上次登录地点 */ + @ApiModelProperty(value = "上次登录地点", position = 38) + private String lastLoginAddress; + + /** 上次登录时间 */ + @ApiModelProperty(value = "上次登录时间", position = 39) + private Date lastLoginTime; + + /** 上次登录设备 */ + @ApiModelProperty(value = "上次登录设备", position = 40) + private String lastLoginDevice; + + /** 最新登录ip */ + @ApiModelProperty(value = "最新登录ip", position = 41) + private String latestLoginIp; + + /** 最新登录地点 */ + @ApiModelProperty(value = "最新登录地点", position = 42) + private String latestLoginAddress; + + /** 最新登录时间 */ + @ApiModelProperty(value = "最新登录时间", position = 43) + private Date latestLoginTime; + + /** 最新登录设备 */ + @ApiModelProperty(value = "最新登录设备", position = 44) + private String latestLoginDevice; + + /** 用户状态 */ + @ApiModelProperty(value = "用户状态", position = 45) + private String userStatus; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 46) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 47) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/enums/BizUserStatusEnum.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/enums/BizUserStatusEnum.java new file mode 100644 index 00000000..125ca5b5 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/enums/BizUserStatusEnum.java @@ -0,0 +1,49 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.user.enums; + +import lombok.Getter; +import vip.xiaonuo.common.exception.CommonException; + +/** + * 人员状态枚举 + * + * @author xuyuxiang + * @date 2022/4/27 21:47 + */ +@Getter +public enum BizUserStatusEnum { + + /** + * 正常 + */ + ENABLE("ENABLE"), + + /** + * 停用 + */ + DISABLED("DISABLED"); + + private final String value; + + BizUserStatusEnum(String value) { + this.value = value; + } + + public static void validate(String value) { + boolean flag = ENABLE.getValue().equals(value) || DISABLED.getValue().equals(value); + if(!flag) { + throw new CommonException("不支持的人员状态:{}", value); + } + } +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/mapper/BizUserMapper.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/mapper/BizUserMapper.java new file mode 100644 index 00000000..285760f9 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/mapper/BizUserMapper.java @@ -0,0 +1,48 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.user.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import vip.xiaonuo.biz.modular.user.entity.BizUser; +import vip.xiaonuo.biz.modular.user.result.BizUserExportResult; +import vip.xiaonuo.biz.modular.user.result.BizUserResult; + +import java.util.List; + +/** + * 人员Mapper接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:37 + **/ +public interface BizUserMapper extends BaseMapper { + + /** + * 获取人员分页列表 + * + * @author xuyuxiang + * @date 2022/7/8 13:27 + **/ + Page page(@Param("page") Page page, @Param("ew") QueryWrapper queryWrapper); + + /** + * 获取要导出的用户列表 + * + * @author xuyuxiang + * @date 2022/7/8 13:27 + **/ + List exportList(@Param("ew") QueryWrapper queryWrapper); +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/mapper/mapping/BizUserMapper.xml b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/mapper/mapping/BizUserMapper.xml new file mode 100644 index 00000000..b05a9423 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/mapper/mapping/BizUserMapper.xml @@ -0,0 +1,32 @@ + + + + + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserAddParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserAddParam.java new file mode 100644 index 00000000..3277a5e4 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserAddParam.java @@ -0,0 +1,178 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 人员添加参数 + * + * @author xuyuxiang + * @date 2022/7/26 15:36 + **/ +@Getter +@Setter +public class BizUserAddParam { + + /** 账号 */ + @ApiModelProperty(value = "账号", required = true, position = 1) + @NotBlank(message = "account不能为空") + private String account; + + /** 姓名 */ + @ApiModelProperty(value = "姓名", required = true, position = 2) + @NotBlank(message = "name不能为空") + private String name; + + /** 机构id */ + @ApiModelProperty(value = "机构id", required = true, position = 3) + @NotBlank(message = "orgId不能为空") + private String orgId; + + /** 岗位id */ + @ApiModelProperty(value = "岗位id", required = true, position = 4) + @NotBlank(message = "positionId不能为空") + private String positionId; + + /** 岗级 */ + @ApiModelProperty(value = "岗级", position = 5) + private String positionLevel; + + /** 主管id */ + @ApiModelProperty(value = "主管id", position = 6) + private String directorId; + + /** 头像 */ + @ApiModelProperty(value = "头像,图片base64", position = 7) + private String avatar; + + /** 签名 */ + @ApiModelProperty(value = "签名,图片base64", position = 8) + private String signature; + + /** 昵称 */ + @ApiModelProperty(value = "昵称", position = 9) + private String nickname; + + /** 性别 */ + @ApiModelProperty(value = "性别", position = 10) + private String gender; + + /** 年龄 */ + @ApiModelProperty(value = "年龄", position = 11) + private String age; + + /** 出生日期 */ + @ApiModelProperty(value = "出生日期", position = 12) + private String birthday; + + /** 民族 */ + @ApiModelProperty(value = "民族", position = 13) + private String nation; + + /** 籍贯 */ + @ApiModelProperty(value = "籍贯", position = 14) + private String nativePlace; + + /** 家庭住址 */ + @ApiModelProperty(value = "家庭住址", position = 15) + private String homeAddress; + + /** 通信地址 */ + @ApiModelProperty(value = "通信地址", position = 16) + private String mailingAddress; + + /** 证件类型 */ + @ApiModelProperty(value = "证件类型", position = 17) + private String idCardType; + + /** 证件号码 */ + @ApiModelProperty(value = "证件号码", position = 18) + private String idCardNumber; + + /** 文化程度 */ + @ApiModelProperty(value = "文化程度", position = 19) + private String cultureLevel; + + /** 政治面貌 */ + @ApiModelProperty(value = "政治面貌", position = 20) + private String politicalOutlook; + + /** 毕业院校 */ + @ApiModelProperty(value = "毕业院校", position = 21) + private String college; + + /** 学历 */ + @ApiModelProperty(value = "学历", position = 22) + private String education; + + /** 学制 */ + @ApiModelProperty(value = "学制", position = 23) + private String eduLength; + + /** 学位 */ + @ApiModelProperty(value = "学位", position = 24) + private String degree; + + /** 手机 */ + @ApiModelProperty(value = "手机", position = 25) + private String phone; + + /** 邮箱 */ + @ApiModelProperty(value = "邮箱", position = 26) + private String email; + + /** 家庭电话 */ + @ApiModelProperty(value = "家庭电话", position = 27) + private String homeTel; + + /** 办公电话 */ + @ApiModelProperty(value = "办公电话", position = 28) + private String officeTel; + + /** 紧急联系人 */ + @ApiModelProperty(value = "紧急联系人", position = 29) + private String emergencyContact; + + /** 紧急联系人电话 */ + @ApiModelProperty(value = "紧急联系人电话", position = 30) + private String emergencyPhone; + + /** 紧急联系人地址 */ + @ApiModelProperty(value = "紧急联系人地址", position = 31) + private String emergencyAddress; + + /** 员工编号 */ + @ApiModelProperty(value = "员工编号", position = 32) + private String empNo; + + /** 入职日期 */ + @ApiModelProperty(value = "员工编号", position = 33) + private String entryDate; + + /** 兼任信息 */ + @ApiModelProperty(value = "兼任信息", position = 34) + private String positionJson; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 35) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 36) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserEditParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserEditParam.java new file mode 100644 index 00000000..8898da01 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserEditParam.java @@ -0,0 +1,183 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 人员编辑参数 + * + * @author xuyuxiang + * @date 2022/7/26 15:43 + **/ +@Getter +@Setter +public class BizUserEditParam { + + /** id */ + @ApiModelProperty(value = "id", required = true, position = 1) + @NotBlank(message = "id不能为空") + private String id; + + /** 账号 */ + @ApiModelProperty(value = "账号", required = true, position = 2) + @NotBlank(message = "account不能为空") + private String account; + + /** 姓名 */ + @ApiModelProperty(value = "姓名", required = true, position = 3) + @NotBlank(message = "name不能为空") + private String name; + + /** 机构id */ + @ApiModelProperty(value = "机构id", required = true, position = 4) + @NotBlank(message = "orgId不能为空") + private String orgId; + + /** 岗位id */ + @ApiModelProperty(value = "岗位id", required = true, position = 5) + @NotBlank(message = "positionId不能为空") + private String positionId; + + /** 岗级 */ + @ApiModelProperty(value = "岗级", position = 6) + private String positionLevel; + + /** 主管id */ + @ApiModelProperty(value = "主管id", position = 7) + private String directorId; + + /** 头像 */ + @ApiModelProperty(value = "头像,图片base64", position = 8) + private String avatar; + + /** 签名 */ + @ApiModelProperty(value = "签名,图片base64", position = 9) + private String signature; + + /** 昵称 */ + @ApiModelProperty(value = "昵称", position = 10) + private String nickname; + + /** 性别 */ + @ApiModelProperty(value = "性别", position = 11) + private String gender; + + /** 年龄 */ + @ApiModelProperty(value = "年龄", position = 12) + private String age; + + /** 出生日期 */ + @ApiModelProperty(value = "出生日期", position = 13) + private String birthday; + + /** 民族 */ + @ApiModelProperty(value = "民族", position = 14) + private String nation; + + /** 籍贯 */ + @ApiModelProperty(value = "籍贯", position = 15) + private String nativePlace; + + /** 家庭住址 */ + @ApiModelProperty(value = "家庭住址", position = 16) + private String homeAddress; + + /** 通信地址 */ + @ApiModelProperty(value = "通信地址", position = 17) + private String mailingAddress; + + /** 证件类型 */ + @ApiModelProperty(value = "证件类型", position = 18) + private String idCardType; + + /** 证件号码 */ + @ApiModelProperty(value = "证件号码", position = 19) + private String idCardNumber; + + /** 文化程度 */ + @ApiModelProperty(value = "文化程度", position = 20) + private String cultureLevel; + + /** 政治面貌 */ + @ApiModelProperty(value = "政治面貌", position = 21) + private String politicalOutlook; + + /** 毕业院校 */ + @ApiModelProperty(value = "毕业院校", position = 22) + private String college; + + /** 学历 */ + @ApiModelProperty(value = "学历", position = 23) + private String education; + + /** 学制 */ + @ApiModelProperty(value = "学制", position = 24) + private String eduLength; + + /** 学位 */ + @ApiModelProperty(value = "学位", position = 25) + private String degree; + + /** 手机 */ + @ApiModelProperty(value = "手机", position = 26) + private String phone; + + /** 邮箱 */ + @ApiModelProperty(value = "邮箱", position = 27) + private String email; + + /** 家庭电话 */ + @ApiModelProperty(value = "家庭电话", position = 28) + private String homeTel; + + /** 办公电话 */ + @ApiModelProperty(value = "办公电话", position = 29) + private String officeTel; + + /** 紧急联系人 */ + @ApiModelProperty(value = "紧急联系人", position = 30) + private String emergencyContact; + + /** 紧急联系人电话 */ + @ApiModelProperty(value = "紧急联系人电话", position = 31) + private String emergencyPhone; + + /** 紧急联系人地址 */ + @ApiModelProperty(value = "紧急联系人地址", position = 32) + private String emergencyAddress; + + /** 员工编号 */ + @ApiModelProperty(value = "员工编号", position = 33) + private String empNo; + + /** 入职日期 */ + @ApiModelProperty(value = "员工编号", position = 34) + private String entryDate; + + /** 兼任信息 */ + @ApiModelProperty(value = "兼任信息", position = 35) + private String positionJson; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 36) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 37) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserExportParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserExportParam.java new file mode 100644 index 00000000..03bf76b4 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserExportParam.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 用户导出参数 + * + * @author xuyuxiang + * @date 2022/7/26 16:00 + **/ +@Getter +@Setter +public class BizUserExportParam { + + /** 用户状态 */ + @ApiModelProperty(value = "用户状态") + private String userStatus; + + /** 账号、姓名、手机号关键词 */ + @ApiModelProperty(value = "账号、姓名、手机号关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserGrantRoleParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserGrantRoleParam.java new file mode 100644 index 00000000..aaf3519b --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserGrantRoleParam.java @@ -0,0 +1,42 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 人员授权角色参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class BizUserGrantRoleParam { + + /** id */ + @ApiModelProperty(value = "id", required = true, position = 1) + @NotBlank(message = "id不能为空") + private String id; + + /** 角色id集合 */ + @ApiModelProperty(value = "角色id集合", required = true, position = 2) + @NotNull(message = "roleIdList不能为空") + private List roleIdList; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserIdParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserIdParam.java new file mode 100644 index 00000000..67295dea --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 人员Id参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class BizUserIdParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserPageParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserPageParam.java new file mode 100644 index 00000000..507d5d55 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserPageParam.java @@ -0,0 +1,56 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 人员查询参数 + * + * @author xuyuxiang + * @date 2022/7/26 16:00 + **/ +@Getter +@Setter +public class BizUserPageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 姓名关键词 */ + @ApiModelProperty(value = "账号、姓名、手机号关键词") + private String searchKey; + + /** 人员状态 */ + @ApiModelProperty(value = "人员状态") + private String userStatus; + + /** 所属机构 */ + @ApiModelProperty(value = "所属机构") + private String orgId; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserSelectorOrgListParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserSelectorOrgListParam.java new file mode 100644 index 00000000..117200ab --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserSelectorOrgListParam.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 组织列表选择器参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class BizUserSelectorOrgListParam { + + /** 父id */ + @ApiModelProperty(value = "父id") + private String parentId; + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserSelectorPositionParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserSelectorPositionParam.java new file mode 100644 index 00000000..3818a176 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserSelectorPositionParam.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 岗位选择器参数 + * + * @author xuyuxiang + * @date 2022/7/26 15:58 + **/ +@Getter +@Setter +public class BizUserSelectorPositionParam { + + /** 机构id */ + @ApiModelProperty(value = "机构id") + private String orgId; + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserSelectorRoleParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserSelectorRoleParam.java new file mode 100644 index 00000000..c125dae3 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserSelectorRoleParam.java @@ -0,0 +1,40 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 角色选择器参数 + * + * @author xuyuxiang + * @date 2022/7/26 16:02 + **/ +@Getter +@Setter +public class BizUserSelectorRoleParam { + + /** 组织id */ + @ApiModelProperty(value = "组织id", position = 1) + private String orgId; + + /** 角色分类 */ + @ApiModelProperty(value = "角色分类") + private String category; + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserSelectorUserParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserSelectorUserParam.java new file mode 100644 index 00000000..a6c312d1 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserSelectorUserParam.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 用户选择器参数 + * + * @author xuyuxiang + * @date 2022/7/26 16:03 + **/ +@Getter +@Setter +public class BizUserSelectorUserParam { + + /** 组织id */ + @ApiModelProperty(value = "组织id") + private String orgId; + + /** 姓名关键词 */ + @ApiModelProperty(value = "姓名关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/result/BizUserExportResult.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/result/BizUserExportResult.java new file mode 100644 index 00000000..9555a8e4 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/result/BizUserExportResult.java @@ -0,0 +1,197 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.user.result; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +/** + * 用户导出结果集 + * + * @author xuyuxiang + * @date 2022/7/8 13:22 + **/ +@Getter +@Setter +public class BizUserExportResult { + + /** 头像 */ + private String avatar; + + /** 头像字节数组 */ + @Excel(name = "头像", type = 2, imageType = 2) + private byte[] avatarByte; + + /** 账号 */ + @Excel(name = "账号") + private String account; + + /** 姓名 */ + @Excel(name = "姓名") + private String name; + + /** 昵称 */ + @Excel(name = "姓名") + private String nickname; + + /** 性别 */ + @Excel(name = "性别") + private String gender; + + /** 年龄 */ + @Excel(name = "年龄") + private String age; + + /** 出生日期 */ + @Excel(name = "出生日期") + private String birthday; + + /** 民族 */ + @Excel(name = "民族") + private String nation; + + /** 籍贯 */ + @Excel(name = "籍贯") + private String nativePlace; + + /** 家庭住址 */ + @Excel(name = "家庭住址") + private String homeAddress; + + /** 通信地址 */ + @Excel(name = "通信地址") + private String mailingAddress; + + /** 证件类型 */ + @Excel(name = "证件类型") + private String idCardType; + + /** 证件号码 */ + @Excel(name = "证件号码") + private String idCardNumber; + + /** 文化程度 */ + @Excel(name = "文化程度") + private String cultureLevel; + + /** 政治面貌 */ + @Excel(name = "政治面貌") + private String politicalOutlook; + + /** 毕业院校 */ + @Excel(name = "毕业院校") + private String college; + + /** 学历 */ + @Excel(name = "学历") + private String education; + + /** 学制 */ + @Excel(name = "学制") + private String eduLength; + + /** 学位 */ + @Excel(name = "学位") + private String degree; + + /** 手机 */ + @Excel(name = "手机") + private String phone; + + /** 邮箱 */ + @Excel(name = "邮箱") + private String email; + + /** 家庭电话 */ + @Excel(name = "家庭电话") + private String homeTel; + + /** 办公电话 */ + @Excel(name = "办公电话") + private String officeTel; + + /** 紧急联系人 */ + @Excel(name = "紧急联系人") + private String emergencyContact; + + /** 紧急联系人电话 */ + @Excel(name = "紧急联系人电话") + private String emergencyPhone; + + /** 紧急联系人地址 */ + @Excel(name = "紧急联系人地址") + private String emergencyAddress; + + /** 员工编号 */ + @Excel(name = "员工编号") + private String empNo; + + /** 入职日期 */ + @Excel(name = "入职日期") + private String entryDate; + + /** 组织名称 */ + @Excel(name = "组织名称") + private String orgName; + + /** 职位名称 */ + @Excel(name = "职位名称") + private String positionName; + + /** 主管名称 */ + @Excel(name = "主管名称") + private String directorName; + + /** 职级 */ + @Excel(name = "职级") + private String positionLevel; + + /** 上次登录ip */ + @Excel(name = "上次登录ip") + private String lastLoginIp; + + /** 上次登录地点 */ + @Excel(name = "上次登录地点") + private String lastLoginAddress; + + /** 上次登录时间 */ + @Excel(name = "上次登录时间", format = "yyyy-MM-dd HH:mm:ss") + private Date lastLoginTime; + + /** 上次登录设备 */ + @Excel(name = "上次登录设备") + private String lastLoginDevice; + + /** 最新登录ip */ + @Excel(name = "最新登录ip") + private String latestLoginIp; + + /** 最新登录地点 */ + @Excel(name = "最新登录地点") + private String latestLoginAddress; + + /** 最新登录时间 */ + @Excel(name = "最新登录时间", format = "yyyy-MM-dd HH:mm:ss") + private Date latestLoginTime; + + /** 最新登录设备 */ + @Excel(name = "最新登录设备") + private String latestLoginDevice; + + /** 用户状态 */ + @Excel(name = "用户状态", replace = { "正常_ENABLE", "停用_DISABLED" }) + private String userStatus; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/result/BizUserResult.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/result/BizUserResult.java new file mode 100644 index 00000000..69d1bc6f --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/result/BizUserResult.java @@ -0,0 +1,224 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.user.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +/** + * 用户结果集 + * + * @author xuyuxiang + * @date 2022/7/8 13:22 + **/ +@Getter +@Setter +public class BizUserResult { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 头像 */ + @ApiModelProperty(value = "头像", position = 3) + private String avatar; + + /** 签名 */ + @ApiModelProperty(value = "签名", position = 4) + private String signature; + + /** 账号 */ + @ApiModelProperty(value = "账号", position = 5) + private String account; + + /** 姓名 */ + @ApiModelProperty(value = "姓名", position = 7) + private String name; + + /** 昵称 */ + @ApiModelProperty(value = "昵称", position = 8) + private String nickname; + + /** 性别 */ + @ApiModelProperty(value = "性别", position = 9) + private String gender; + + /** 年龄 */ + @ApiModelProperty(value = "年龄", position = 10) + private String age; + + /** 出生日期 */ + @ApiModelProperty(value = "出生日期", position = 11) + private String birthday; + + /** 民族 */ + @ApiModelProperty(value = "民族", position = 12) + private String nation; + + /** 籍贯 */ + @ApiModelProperty(value = "籍贯", position = 13) + private String nativePlace; + + /** 家庭住址 */ + @ApiModelProperty(value = "家庭住址", position = 14) + private String homeAddress; + + /** 通信地址 */ + @ApiModelProperty(value = "通信地址", position = 15) + private String mailingAddress; + + /** 证件类型 */ + @ApiModelProperty(value = "证件类型", position = 16) + private String idCardType; + + /** 证件号码 */ + @ApiModelProperty(value = "证件号码", position = 17) + private String idCardNumber; + + /** 文化程度 */ + @ApiModelProperty(value = "文化程度", position = 18) + private String cultureLevel; + + /** 政治面貌 */ + @ApiModelProperty(value = "政治面貌", position = 19) + private String politicalOutlook; + + /** 毕业院校 */ + @ApiModelProperty(value = "毕业院校", position = 20) + private String college; + + /** 学历 */ + @ApiModelProperty(value = "学历", position = 21) + private String education; + + /** 学制 */ + @ApiModelProperty(value = "学制", position = 22) + private String eduLength; + + /** 学位 */ + @ApiModelProperty(value = "学位", position = 23) + private String degree; + + /** 手机 */ + @ApiModelProperty(value = "手机", position = 24) + private String phone; + + /** 邮箱 */ + @ApiModelProperty(value = "邮箱", position = 25) + private String email; + + /** 家庭电话 */ + @ApiModelProperty(value = "家庭电话", position = 26) + private String homeTel; + + /** 办公电话 */ + @ApiModelProperty(value = "办公电话", position = 27) + private String officeTel; + + /** 紧急联系人 */ + @ApiModelProperty(value = "紧急联系人", position = 28) + private String emergencyContact; + + /** 紧急联系人电话 */ + @ApiModelProperty(value = "紧急联系人电话", position = 29) + private String emergencyPhone; + + /** 紧急联系人地址 */ + @ApiModelProperty(value = "紧急联系人地址", position = 30) + private String emergencyAddress; + + /** 员工编号 */ + @ApiModelProperty(value = "员工编号", position = 31) + private String empNo; + + /** 入职日期 */ + @ApiModelProperty(value = "入职日期", position = 32) + private String entryDate; + + /** 机构id */ + @ApiModelProperty(value = "机构id", position = 33) + private String orgId; + + /** 岗位id */ + @ApiModelProperty(value = "岗位id", position = 34) + private String positionId; + + /** 岗级 */ + @ApiModelProperty(value = "岗级", position = 35) + private String positionLevel; + + /** 主管id */ + @ApiModelProperty(value = "主管id", position = 36) + private String directorId; + + /** 上次登录ip */ + @ApiModelProperty(value = "上次登录ip", position = 37) + private String lastLoginIp; + + /** 上次登录地点 */ + @ApiModelProperty(value = "上次登录地点", position = 38) + private String lastLoginAddress; + + /** 上次登录时间 */ + @ApiModelProperty(value = "上次登录时间", position = 39) + private Date lastLoginTime; + + /** 上次登录设备 */ + @ApiModelProperty(value = "上次登录设备", position = 40) + private String lastLoginDevice; + + /** 最新登录ip */ + @ApiModelProperty(value = "最新登录ip", position = 41) + private String latestLoginIp; + + /** 最新登录地点 */ + @ApiModelProperty(value = "最新登录地点", position = 42) + private String latestLoginAddress; + + /** 最新登录时间 */ + @ApiModelProperty(value = "最新登录时间", position = 43) + private Date latestLoginTime; + + /** 最新登录设备 */ + @ApiModelProperty(value = "最新登录设备", position = 44) + private String latestLoginDevice; + + /** 用户状态 */ + @ApiModelProperty(value = "用户状态", position = 45) + private String userStatus; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 46) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 47) + private String extJson; + + /* ====额外的字段==== */ + + /** 机构名称 */ + @ApiModelProperty(value = "机构名称", position = 48) + private String orgName; + + /** 岗位名称 */ + @ApiModelProperty(value = "岗位名称", position = 49) + private String positionName; + + /** 主管名称 */ + @ApiModelProperty(value = "主管名称", position = 50) + private String directorName; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/result/BizUserRoleResult.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/result/BizUserRoleResult.java new file mode 100644 index 00000000..4abee597 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/result/BizUserRoleResult.java @@ -0,0 +1,48 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.user.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 角色选择器结果 + * + * @author xuyuxiang + * @date 2022/7/22 14:29 + **/ +@Getter +@Setter +public class BizUserRoleResult { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 组织id */ + @ApiModelProperty(value = "机构id", position = 2) + private String orgId; + + /** 名称 */ + @ApiModelProperty(value = "名称", position = 3) + private String name; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 4) + private String category; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 5) + private Integer sortCode; +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/service/BizUserService.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/service/BizUserService.java new file mode 100644 index 00000000..3916271b --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/service/BizUserService.java @@ -0,0 +1,183 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.user.service; + +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.web.multipart.MultipartFile; +import vip.xiaonuo.biz.modular.org.entity.BizOrg; +import vip.xiaonuo.biz.modular.position.entity.BizPosition; +import vip.xiaonuo.biz.modular.user.entity.BizUser; +import vip.xiaonuo.biz.modular.user.param.*; +import vip.xiaonuo.biz.modular.user.result.BizUserResult; +import vip.xiaonuo.biz.modular.user.result.BizUserRoleResult; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; + +/** + * 人员Service接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:35 + **/ +public interface BizUserService extends IService { + + /** + * 获取人员分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + Page page(BizUserPageParam bizUserPageParam); + + /** + * 添加人员 + * + * @author xuyuxiang + * @date 2022/4/24 20:48 + */ + void add(BizUserAddParam bizUserAddParam); + + /** + * 编辑人员 + * + * @author xuyuxiang + * @date 2022/4/24 21:13 + */ + void edit(BizUserEditParam bizUserEditParam); + + /** + * 删除人员 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + void delete(List bizUserIdParamList); + + /** + * 获取人员详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + BizUser detail(BizUserIdParam bizUserIdPara); + + /** + * 获取人员详情 + * + * @author xuyuxiang + * @date 2022/7/26 17:21 + **/ + BizUser queryEntity(String id); + + /** + * 禁用人员 + * + * @author xuyuxiang + * @date 2022/7/5 18:20 + **/ + void disableUser(BizUserIdParam bizUserIdParam); + + /** + * 启用人员 + * + * @author xuyuxiang + * @date 2022/7/5 18:21 + **/ + void enableUser(BizUserIdParam bizUserIdParam); + + /** + * 重置人员密码 + * + * @author xuyuxiang + * @date 2022/7/5 18:22 + **/ + void resetPassword(BizUserIdParam bizUserIdParam); + + /** + * 获取人员拥有角色 + * + * @author xuyuxiang + * @date 2022/5/13 21:00 + */ + List ownRole(BizUserIdParam bizUserIdParam); + + /** + * 给人员授权角色 + * + * @author xuyuxiang + * @date 2022/4/29 11:13 + **/ + void grantRole(BizUserGrantRoleParam bizUserGrantRoleParam); + + /** + * 人员导入 + * + * @author xuyuxiang + * @date 2022/8/8 13:16 + **/ + void importUser(MultipartFile file); + + /** + * 人员导出 + * + * @author xuyuxiang + * @date 2022/8/8 13:16 + **/ + void exportUser(BizUserExportParam bizUserExportParam, HttpServletResponse response) throws IOException; + + /* ====人员部分所需要用到的选择器==== */ + + /** + * 获取机构树选择器 + * + * @author xuyuxiang + * @date 2022/5/13 21:00 + */ + List> orgTreeSelector(); + + /** + * 获取机构列表选择器 + * + * @author xuyuxiang + * @date 2022/7/22 13:34 + **/ + List orgListSelector(BizUserSelectorOrgListParam bizUserSelectorOrgListParam); + + /** + * 获取岗位选择器 + * + * @author xuyuxiang + * @date 2022/5/13 21:00 + */ + List positionSelector(BizUserSelectorPositionParam bizUserSelectorPositionParam); + + /** + * 获取角色选择器 + * + * @author xuyuxiang + * @date 2022/5/13 21:00 + */ + List roleSelector(BizUserSelectorRoleParam bizUserSelectorRoleParam); + + /** + * 获取人员选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + List userSelector(BizUserSelectorUserParam bizUserSelectorUserParam); +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/service/impl/BizUserServiceImpl.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/service/impl/BizUserServiceImpl.java new file mode 100644 index 00000000..8a24241f --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/service/impl/BizUserServiceImpl.java @@ -0,0 +1,544 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.user.service.impl; + +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.img.ImgUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNode; +import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.poi.ss.usermodel.Workbook; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import vip.xiaonuo.auth.core.util.StpLoginUserUtil; +import vip.xiaonuo.biz.core.enums.BizBuildInEnum; +import vip.xiaonuo.biz.modular.org.entity.BizOrg; +import vip.xiaonuo.biz.modular.org.service.BizOrgService; +import vip.xiaonuo.biz.modular.position.entity.BizPosition; +import vip.xiaonuo.biz.modular.position.service.BizPositionService; +import vip.xiaonuo.biz.modular.user.entity.BizUser; +import vip.xiaonuo.biz.modular.user.enums.BizUserStatusEnum; +import vip.xiaonuo.biz.modular.user.mapper.BizUserMapper; +import vip.xiaonuo.biz.modular.user.param.*; +import vip.xiaonuo.biz.modular.user.result.BizUserExportResult; +import vip.xiaonuo.biz.modular.user.result.BizUserResult; +import vip.xiaonuo.biz.modular.user.result.BizUserRoleResult; +import vip.xiaonuo.biz.modular.user.service.BizUserService; +import vip.xiaonuo.common.enums.CommonSortOrderEnum; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.common.util.*; +import vip.xiaonuo.dev.api.DevConfigApi; +import vip.xiaonuo.sys.api.SysRoleApi; +import vip.xiaonuo.sys.api.SysUserApi; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 人员Service接口实现类 + * + * @author xuyuxiang + * @date 2022/2/23 18:43 + **/ +@Service +public class BizUserServiceImpl extends ServiceImpl implements BizUserService { + + private static final String SNOWY_SYS_DEFAULT_PASSWORD_KEY = "SNOWY_SYS_DEFAULT_PASSWORD"; + + @Resource + private DevConfigApi devConfigApi; + + @Resource + private SysUserApi sysUserApi; + + @Resource + private SysRoleApi sysRoleApi; + + @Resource + private BizOrgService bizOrgService; + + @Resource + private BizPositionService bizPositionService; + + @Override + public Page page(BizUserPageParam bizUserPageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(ObjectUtil.isNotEmpty(bizUserPageParam.getSearchKey())) { + queryWrapper.and(q -> q.like("SYS_USER.ACCOUNT", bizUserPageParam.getSearchKey()) + .or().like("SYS_USER.NAME", bizUserPageParam.getSearchKey()) + .or().like("SYS_USER.PHONE", bizUserPageParam.getSearchKey())); + } + if(ObjectUtil.isNotEmpty(bizUserPageParam.getUserStatus())) { + queryWrapper.eq("SYS_USER.USER_STATUS", bizUserPageParam.getUserStatus()); + } + if(ObjectUtil.isNotEmpty(bizUserPageParam.getOrgId())) { + queryWrapper.eq("SYS_USER.ORG_ID", bizUserPageParam.getOrgId()); + } + if(ObjectUtil.isAllNotEmpty(bizUserPageParam.getSortField(), bizUserPageParam.getSortOrder())) { + CommonSortOrderEnum.validate(bizUserPageParam.getSortOrder()); + queryWrapper.orderBy(true, bizUserPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), + StrUtil.toUnderlineCase("SYS_USER." + bizUserPageParam.getSortField())); + } else { + queryWrapper.orderByAsc("SYS_USER.SORT_CODE"); + } + // 排除超管 + queryWrapper.ne("SYS_USER.ID", "-1"); + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + queryWrapper.in("SYS_USER.ORG_ID", loginUserDataScope); + } else { + queryWrapper.eq("SYS_USER.ID", StpUtil.getLoginIdAsString()); + } + return this.baseMapper.page(CommonPageRequest.defaultPage(), queryWrapper); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void add(BizUserAddParam bizUserAddParam) { + checkParam(bizUserAddParam); + // 设置手机号 + if(ObjectUtil.isNotEmpty(bizUserAddParam.getPhone())) { + bizUserAddParam.setPhone(CommonCryptogramUtil.doSm4CbcEncrypt(bizUserAddParam.getPhone())); + } + // 设置证件号 + if(ObjectUtil.isNotEmpty(bizUserAddParam.getIdCardNumber())) { + bizUserAddParam.setIdCardNumber(CommonCryptogramUtil.doSm4CbcEncrypt(bizUserAddParam.getIdCardNumber())); + } + // 设置紧急联系人电话 + if(ObjectUtil.isNotEmpty(bizUserAddParam.getEmergencyPhone())) { + bizUserAddParam.setEmergencyPhone(CommonCryptogramUtil.doSm4CbcEncrypt(bizUserAddParam.getEmergencyPhone())); + } + BizUser bizUser = BeanUtil.toBean(bizUserAddParam, BizUser.class); + if(ObjectUtil.isEmpty(bizUser.getAvatar())) { + // 设置默认头像 + bizUser.setAvatar(CommonAvatarUtil.generateImg(bizUser.getName())); + } + // 设置密码 + bizUser.setPassword(CommonCryptogramUtil.doHashValue(devConfigApi.getValueByKey(SNOWY_SYS_DEFAULT_PASSWORD_KEY))); + // 设置状态 + bizUser.setUserStatus(BizUserStatusEnum.ENABLE.getValue()); + this.save(bizUser); + } + + private void checkParam(BizUserAddParam bizUserAddParam) { + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + if(!loginUserDataScope.contains(bizUserAddParam.getOrgId())) { + throw new CommonException("您没有权限在该机构下增加人员,机构id:{}", bizUserAddParam.getOrgId()); + } + } else { + throw new CommonException("您没有权限在该机构下增加人员,机构id:{}", bizUserAddParam.getOrgId()); + } + if (this.count(new LambdaQueryWrapper() + .eq(BizUser::getAccount, bizUserAddParam.getAccount())) > 0) { + throw new CommonException("存在重复的账号,账号为:{}", bizUserAddParam.getAccount()); + } + if(ObjectUtil.isNotEmpty(bizUserAddParam.getPhone())) { + if(!PhoneUtil.isMobile(bizUserAddParam.getPhone())) { + throw new CommonException("手机号码:{}格式错误", bizUserAddParam.getPhone()); + } + if (this.count(new LambdaQueryWrapper() + .eq(BizUser::getPhone, bizUserAddParam.getPhone())) > 0) { + throw new CommonException("存在重复的手机号,手机号为:{}", bizUserAddParam.getPhone()); + } + } + if(ObjectUtil.isNotEmpty(bizUserAddParam.getEmail())) { + if(!CommonEmailUtil.isEmail(bizUserAddParam.getEmail())) { + throw new CommonException("邮箱:{}格式错误", bizUserAddParam.getPhone()); + } + if (this.count(new LambdaQueryWrapper() + .eq(BizUser::getEmail, bizUserAddParam.getEmail())) > 0) { + throw new CommonException("存在重复的邮箱,邮箱为:{}", bizUserAddParam.getEmail()); + } + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void edit(BizUserEditParam bizUserEditParam) { + BizUser bizUser = this.queryEntity(bizUserEditParam.getId()); + checkParam(bizUserEditParam); + // 设置手机号 + if(ObjectUtil.isNotEmpty(bizUserEditParam.getPhone())) { + bizUserEditParam.setPhone(CommonCryptogramUtil.doSm4CbcEncrypt(bizUserEditParam.getPhone())); + } + // 设置证件号 + if(ObjectUtil.isNotEmpty(bizUserEditParam.getIdCardNumber())) { + bizUserEditParam.setIdCardNumber(CommonCryptogramUtil.doSm4CbcEncrypt(bizUserEditParam.getIdCardNumber())); + } + // 设置紧急联系人电话 + if(ObjectUtil.isNotEmpty(bizUserEditParam.getEmergencyPhone())) { + bizUserEditParam.setEmergencyPhone(CommonCryptogramUtil.doSm4CbcEncrypt(bizUserEditParam.getEmergencyPhone())); + } + BeanUtil.copyProperties(bizUserEditParam, bizUser); + this.updateById(bizUser); + } + + private void checkParam(BizUserEditParam bizUserEditParam) { + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + if(!loginUserDataScope.contains(bizUserEditParam.getOrgId())) { + throw new CommonException("您没有权限编辑该机构下的人员,机构id:{}", bizUserEditParam.getOrgId()); + } + } else { + if(!bizUserEditParam.getId().equals(StpUtil.getLoginIdAsString())) { + throw new CommonException("您没有权限编辑该机构下的人员,机构id:{}", bizUserEditParam.getOrgId()); + } + } + if (this.count(new LambdaQueryWrapper() + .eq(BizUser::getAccount, bizUserEditParam.getAccount()) + .ne(BizUser::getId, bizUserEditParam.getId())) > 0) { + throw new CommonException("存在重复的账号,账号为:{}", bizUserEditParam.getAccount()); + } + if(ObjectUtil.isNotEmpty(bizUserEditParam.getPhone())) { + if(!PhoneUtil.isMobile(bizUserEditParam.getPhone())) { + throw new CommonException("手机号码:{}格式错误", bizUserEditParam.getPhone()); + } + if (this.count(new LambdaQueryWrapper() + .eq(BizUser::getPhone, bizUserEditParam.getPhone()) + .ne(BizUser::getId, bizUserEditParam.getId())) > 0) { + throw new CommonException("存在重复的手机号,手机号为:{}", bizUserEditParam.getPhone()); + } + } + if(ObjectUtil.isNotEmpty(bizUserEditParam.getEmail())) { + if(!CommonEmailUtil.isEmail(bizUserEditParam.getEmail())) { + throw new CommonException("邮箱:{}格式错误", bizUserEditParam.getPhone()); + } + if (this.count(new LambdaQueryWrapper() + .eq(BizUser::getEmail, bizUserEditParam.getEmail()) + .ne(BizUser::getId, bizUserEditParam.getId())) > 0) { + throw new CommonException("存在重复的邮箱,邮箱为:{}", bizUserEditParam.getEmail()); + } + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void delete(List bizUserIdParamList) { + List bizUserIdList = CollStreamUtil.toList(bizUserIdParamList, BizUserIdParam::getId); + if(ObjectUtil.isNotEmpty(bizUserIdList)) { + boolean containsSuperAdminAccount = this.listByIds(bizUserIdList).stream().map(BizUser::getAccount) + .collect(Collectors.toSet()).contains(BizBuildInEnum.BUILD_IN_USER_ACCOUNT.getValue()); + if(containsSuperAdminAccount) { + throw new CommonException("不可删除系统内置超管用户"); + } + // 获取这些人员的的机构id集合 + Set userOrgIdList = this.listByIds(bizUserIdList).stream().map(BizUser::getOrgId).collect(Collectors.toSet()); + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + if(!loginUserDataScope.containsAll(userOrgIdList)) { + throw new CommonException("您没有权限删除这些机构下的人员,机构id:{}", + CollectionUtil.subtract(userOrgIdList, loginUserDataScope)); + } + } else { + if(bizUserIdList.size() != 1 || !bizUserIdList.get(0).equals(StpUtil.getLoginIdAsString())) { + throw new CommonException("您没有权限删除这些机构下的人员,机构id:{}", userOrgIdList); + } + } + // 清除【将这些人员作为主管】的信息 + this.update(new LambdaUpdateWrapper().in(BizUser::getDirectorId, bizUserIdList).set(BizUser::getDirectorId, null)); + // 清除【将这些人员作为兼任岗位的主管】的信息 + this.list(new LambdaQueryWrapper() .isNotNull(BizUser::getPositionJson)).forEach(sysUser -> { + List handledJsonObjectList = JSONUtil.toList(JSONUtil.parseArray(sysUser.getPositionJson()), + JSONObject.class).stream().peek(jsonObject -> { + String directorId = jsonObject.getStr("directorId"); + if (ObjectUtil.isNotEmpty(directorId) && bizUserIdList.contains(directorId)) { + jsonObject.remove("directorId"); + } + }).collect(Collectors.toList()); + this.update(new LambdaUpdateWrapper().eq(BizUser::getId, sysUser.getId()) + .set(BizUser::getPositionJson, JSONUtil.toJsonStr(handledJsonObjectList))); + }); + // 执行删除 + this.removeBatchByIds(bizUserIdList); + + // TODO 此处需要将这些人员踢下线,并永久注销这些人员 + } + } + + @Override + public BizUser detail(BizUserIdParam bizUserIdParam) { + return this.queryEntity(bizUserIdParam.getId()); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void disableUser(BizUserIdParam bizUserIdParam) { + BizUser bizUser = this.detail(bizUserIdParam); + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + if(!loginUserDataScope.contains(bizUser.getOrgId())) { + throw new CommonException("您没有权限禁用该机构下的人员:{},机构id:{}", bizUser.getName(), bizUser.getOrgId()); + } + } else { + if(!bizUser.getId().equals(StpUtil.getLoginIdAsString())) { + throw new CommonException("您没有权限禁用该机构下的人员:{},机构id:{}", bizUser.getName(), bizUser.getOrgId()); + } + } + this.update(new LambdaUpdateWrapper().eq(BizUser::getId, + bizUserIdParam.getId()).set(BizUser::getUserStatus, BizUserStatusEnum.DISABLED.getValue())); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void enableUser(BizUserIdParam bizUserIdParam) { + BizUser bizUser = this.detail(bizUserIdParam); + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + if(!loginUserDataScope.contains(bizUser.getOrgId())) { + throw new CommonException("您没有权限启用该机构下的人员:{},机构id:{}", bizUser.getName(), bizUser.getOrgId()); + } + } else { + if(!bizUser.getId().equals(StpUtil.getLoginIdAsString())) { + throw new CommonException("您没有权限启用该机构下的人员:{},机构id:{}", bizUser.getName(), bizUser.getOrgId()); + } + } + this.update(new LambdaUpdateWrapper().eq(BizUser::getId, + bizUserIdParam.getId()).set(BizUser::getUserStatus, BizUserStatusEnum.ENABLE.getValue())); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void resetPassword(BizUserIdParam bizUserIdParam) { + BizUser bizUser = this.detail(bizUserIdParam); + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + if(!loginUserDataScope.contains(bizUser.getOrgId())) { + throw new CommonException("您没有权限为该机构下的人员:{}重置密码,机构id:{}", bizUser.getName(), bizUser.getOrgId()); + } + } else { + if(!bizUser.getId().equals(StpUtil.getLoginIdAsString())) { + throw new CommonException("您没有权限为该机构下的人员:{}重置密码,机构id:{}", bizUser.getName(), bizUser.getOrgId()); + } + } + this.update(new LambdaUpdateWrapper().eq(BizUser::getId, + bizUserIdParam.getId()).set(BizUser::getPassword, + CommonCryptogramUtil.doHashValue(devConfigApi.getValueByKey(SNOWY_SYS_DEFAULT_PASSWORD_KEY)))); + } + + @Override + public List ownRole(BizUserIdParam bizUserIdParam) { + return sysUserApi.ownRole(bizUserIdParam.getId()); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void grantRole(BizUserGrantRoleParam bizUserGrantRoleParam) { + BizUser bizUser = this.queryEntity(bizUserGrantRoleParam.getId()); + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + if(!loginUserDataScope.contains(bizUser.getOrgId())) { + throw new CommonException("您没有权限为该机构下的人员:{}授权角色,机构id:{}", bizUser.getName(), bizUser.getOrgId()); + } + } else { + if(!bizUser.getId().equals(StpUtil.getLoginIdAsString())) { + throw new CommonException("您没有权限为该机构下的人员:{}授权角色,机构id:{}", bizUser.getName(), bizUser.getOrgId()); + } + } + sysUserApi.grantRole(bizUserGrantRoleParam.getId(), bizUserGrantRoleParam.getRoleIdList()); + } + + @Override + public void importUser(MultipartFile file) { + // TODO 待完善 + } + + @Override + public void exportUser(BizUserExportParam bizUserExportParam, HttpServletResponse response) throws IOException { + File tempFile = null; + try { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(ObjectUtil.isNotEmpty(bizUserExportParam.getSearchKey())) { + queryWrapper.and(q -> q.like("SYS_USER.ACCOUNT", bizUserExportParam.getSearchKey()) + .or().like("SYS_USER.NAME", bizUserExportParam.getSearchKey()) + .or().like("SYS_USER.PHONE", bizUserExportParam.getSearchKey())); + } + if(ObjectUtil.isNotEmpty(bizUserExportParam.getUserStatus())) { + queryWrapper.eq("SYS_USER.STATUS", bizUserExportParam.getUserStatus()); + } + String fileName = "SNOWY2.0系统B端人员信息清单"; + List bizUserExportResultList = this.baseMapper.exportList(queryWrapper).stream().peek(sysUserExportResult -> { + if(ObjectUtil.isNotEmpty(sysUserExportResult.getAvatar())) { + sysUserExportResult.setAvatarByte(ImgUtil.toBytes(ImgUtil.toImage(StrUtil + .split(sysUserExportResult.getAvatar(), StrUtil.COMMA).get(1)), ImgUtil.IMAGE_TYPE_PNG)); + } + }).collect(Collectors.toList()); + Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(fileName, "B端人员"), + BizUserExportResult.class, bizUserExportResultList); + tempFile = FileUtil.file(FileUtil.getTmpDir() + FileUtil.FILE_SEPARATOR + fileName + ".xls"); + BufferedOutputStream outputStream = FileUtil.getOutputStream(tempFile); + workbook.write(outputStream); + outputStream.close(); + CommonDownloadUtil.download(tempFile, response); + } catch (Exception e) { + e.printStackTrace(); + CommonResponseUtil.renderError(response, "导出失败"); + } finally { + FileUtil.del(tempFile); + } + } + + @Override + public BizUser queryEntity(String id) { + BizUser bizUser = this.getById(id); + if(ObjectUtil.isEmpty(bizUser)) { + throw new CommonException("人员不存在,id值为:{}", id); + } + return bizUser; + } + + /* ====人员部分所需要用到的选择器==== */ + + @Override + public List> orgTreeSelector() { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + lambdaQueryWrapper.in(BizOrg::getId, loginUserDataScope); + } else { + return CollectionUtil.newArrayList(); + } + lambdaQueryWrapper.orderByAsc(BizOrg::getSortCode); + List bizOrgList = bizOrgService.list(lambdaQueryWrapper); + List> treeNodeList = bizOrgList.stream().map(bizOrg -> + new TreeNode<>(bizOrg.getId(), bizOrg.getParentId(), bizOrg.getName(), bizOrg.getSortCode())) + .collect(Collectors.toList()); + return TreeUtil.build(treeNodeList, "0"); + } + + @Override + public List orgListSelector(BizUserSelectorOrgListParam bizUserSelectorOrgListParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + lambdaQueryWrapper.in(BizOrg::getId, loginUserDataScope); + } else { + return CollectionUtil.newArrayList(); + } + // 查询部分字段 + lambdaQueryWrapper.select(BizOrg::getId, BizOrg::getParentId, BizOrg::getName, + BizOrg::getCategory, BizOrg::getSortCode); + if(ObjectUtil.isNotEmpty(bizUserSelectorOrgListParam.getParentId())) { + lambdaQueryWrapper.eq(BizOrg::getParentId, bizUserSelectorOrgListParam.getParentId()); + } + if(ObjectUtil.isNotEmpty(bizUserSelectorOrgListParam.getSearchKey())) { + lambdaQueryWrapper.like(BizOrg::getName, bizUserSelectorOrgListParam.getSearchKey()); + } + lambdaQueryWrapper.orderByAsc(BizOrg::getSortCode); + return bizOrgService.list(lambdaQueryWrapper); + } + + @Override + public List positionSelector(BizUserSelectorPositionParam bizUserSelectorPositionParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + lambdaQueryWrapper.in(BizPosition::getOrgId, loginUserDataScope); + } else { + return CollectionUtil.newArrayList(); + } + // 查询部分字段 + lambdaQueryWrapper.select(BizPosition::getId, BizPosition::getOrgId, BizPosition::getName, + BizPosition::getCategory, BizPosition::getSortCode); + if(ObjectUtil.isNotEmpty(bizUserSelectorPositionParam.getOrgId())) { + lambdaQueryWrapper.eq(BizPosition::getOrgId, bizUserSelectorPositionParam.getOrgId()); + } + if(ObjectUtil.isNotEmpty(bizUserSelectorPositionParam.getSearchKey())) { + lambdaQueryWrapper.like(BizPosition::getName, bizUserSelectorPositionParam.getSearchKey()); + } + lambdaQueryWrapper.orderByAsc(BizPosition::getSortCode); + return bizPositionService.list(lambdaQueryWrapper); + } + + @Override + public List roleSelector(BizUserSelectorRoleParam bizUserSelectorRoleParam) { + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + if(ObjectUtil.isNotEmpty(bizUserSelectorRoleParam.getOrgId())) { + if(loginUserDataScope.contains(bizUserSelectorRoleParam.getOrgId())) { + return sysRoleApi.roleSelector(bizUserSelectorRoleParam.getOrgId(), bizUserSelectorRoleParam.getCategory(), + bizUserSelectorRoleParam.getSearchKey()).stream().map(jsonObject -> + JSONUtil.toBean(jsonObject, BizUserRoleResult.class)).collect(Collectors.toList()); + } else { + return CollectionUtil.newArrayList(); + } + } else { + return sysRoleApi.roleSelector(bizUserSelectorRoleParam.getOrgId(), bizUserSelectorRoleParam.getCategory(), + bizUserSelectorRoleParam.getSearchKey()).stream().map(jsonObject -> + JSONUtil.toBean(jsonObject, BizUserRoleResult.class)).filter(bizUserRoleResult -> ObjectUtil + .isNotEmpty(bizUserRoleResult.getOrgId()) && loginUserDataScope.contains(bizUserRoleResult.getOrgId())) + .collect(Collectors.toList()); + } + } else { + return CollectionUtil.newArrayList(); + } + } + + @Override + public List userSelector(BizUserSelectorUserParam bizUserSelectorUserParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + // 校验数据范围 + List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope(); + if(ObjectUtil.isNotEmpty(loginUserDataScope)) { + lambdaQueryWrapper.in(BizUser::getOrgId, loginUserDataScope); + } else { + return CollectionUtil.newArrayList(); + } + // 只查询部分字段 + lambdaQueryWrapper.select(BizUser::getId, BizUser::getOrgId, BizUser::getAccount, BizUser::getName, BizUser::getSortCode); + if(ObjectUtil.isNotEmpty(bizUserSelectorUserParam.getOrgId())) { + lambdaQueryWrapper.eq(BizUser::getOrgId, bizUserSelectorUserParam.getOrgId()); + } + if(ObjectUtil.isNotEmpty(bizUserSelectorUserParam.getSearchKey())) { + lambdaQueryWrapper.like(BizUser::getName, bizUserSelectorUserParam.getSearchKey()); + } + lambdaQueryWrapper.orderByAsc(BizUser::getSortCode); + return this.list(lambdaQueryWrapper); + } +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/wrapper/BizUserResultWrapperImpl.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/wrapper/BizUserResultWrapperImpl.java new file mode 100644 index 00000000..b3f56a83 --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/wrapper/BizUserResultWrapperImpl.java @@ -0,0 +1,52 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.user.wrapper; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import vip.xiaonuo.biz.modular.user.result.BizUserResult; +import vip.xiaonuo.common.pojo.CommonWrapperInterface; +import vip.xiaonuo.common.util.CommonCryptogramUtil; + +/** + * BizUserResult类型的包装实现类 + * + * @author xuyuxiang + * @date 2022/9/15 21:42 + */ +public class BizUserResultWrapperImpl implements CommonWrapperInterface { + + /** + * 对手机号和证件号码进行解密 + * + * @author xuyuxiang + * @date 2022/9/15 21:45 + */ + @Override + public JSONObject doWrap(BizUserResult bizUserResult) { + String phone = bizUserResult.getPhone(); + if(ObjectUtil.isNotEmpty(phone)) { + bizUserResult.setPhone(CommonCryptogramUtil.doSm4CbcDecrypt(phone)); + } + String idCardNumber = bizUserResult.getIdCardNumber(); + if(ObjectUtil.isNotEmpty(idCardNumber)) { + bizUserResult.setIdCardNumber(CommonCryptogramUtil.doSm4CbcDecrypt(idCardNumber)); + } + String emergencyPhone = bizUserResult.getEmergencyPhone(); + if(ObjectUtil.isNotEmpty(emergencyPhone)) { + bizUserResult.setEmergencyPhone(CommonCryptogramUtil.doSm4CbcDecrypt(emergencyPhone)); + } + return JSONUtil.parseObj(bizUserResult); + } +} diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/wrapper/BizUserWrapperImpl.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/wrapper/BizUserWrapperImpl.java new file mode 100644 index 00000000..a70ed94b --- /dev/null +++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/wrapper/BizUserWrapperImpl.java @@ -0,0 +1,52 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.biz.modular.user.wrapper; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import vip.xiaonuo.biz.modular.user.entity.BizUser; +import vip.xiaonuo.common.pojo.CommonWrapperInterface; +import vip.xiaonuo.common.util.CommonCryptogramUtil; + +/** + * SysUser类型的包装实现类 + * + * @author xuyuxiang + * @date 2022/9/15 21:42 + */ +public class BizUserWrapperImpl implements CommonWrapperInterface { + + /** + * 对手机号和证件号码进行解密 + * + * @author xuyuxiang + * @date 2022/9/15 21:45 + */ + @Override + public JSONObject doWrap(BizUser bizUser) { + String phone = bizUser.getPhone(); + if(ObjectUtil.isNotEmpty(phone)) { + bizUser.setPhone(CommonCryptogramUtil.doSm4CbcDecrypt(phone)); + } + String idCardNumber = bizUser.getIdCardNumber(); + if(ObjectUtil.isNotEmpty(idCardNumber)) { + bizUser.setIdCardNumber(CommonCryptogramUtil.doSm4CbcDecrypt(idCardNumber)); + } + String emergencyPhone = bizUser.getEmergencyPhone(); + if(ObjectUtil.isNotEmpty(emergencyPhone)) { + bizUser.setEmergencyPhone(CommonCryptogramUtil.doSm4CbcDecrypt(emergencyPhone)); + } + return JSONUtil.parseObj(bizUser); + } +} diff --git a/snowy-plugin/snowy-plugin-client/README.md b/snowy-plugin/snowy-plugin-client/README.md new file mode 100644 index 00000000..80cd8094 --- /dev/null +++ b/snowy-plugin/snowy-plugin-client/README.md @@ -0,0 +1 @@ +# C端功能插件 \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-client/pom.xml b/snowy-plugin/snowy-plugin-client/pom.xml new file mode 100644 index 00000000..b84de476 --- /dev/null +++ b/snowy-plugin/snowy-plugin-client/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + + + vip.xiaonuo + snowy-plugin + 2.0.0 + + + snowy-plugin-client + jar + C端功能插件 + + + + + vip.xiaonuo + snowy-plugin-client-api + ${project.parent.version} + + + + + vip.xiaonuo + snowy-plugin-auth-api + ${project.parent.version} + + + + + vip.xiaonuo + snowy-plugin-dev-api + ${project.parent.version} + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/core/config/ClientConfigure.java b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/core/config/ClientConfigure.java new file mode 100644 index 00000000..599010f5 --- /dev/null +++ b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/core/config/ClientConfigure.java @@ -0,0 +1,68 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.client.core.config; + +import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver; +import io.swagger.annotations.ApiOperation; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.bind.annotation.RequestMethod; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import vip.xiaonuo.common.pojo.CommonResult; + +import javax.annotation.Resource; + +/** + * C端相关配置 + * + * @author xuyuxiang + * @date 2022/7/7 16:18 + **/ +@Configuration +public class ClientConfigure { + + @Resource + private OpenApiExtensionResolver openApiExtensionResolver; + + /** + * API文档分组配置 + * + * @author xuyuxiang + * @date 2022/7/7 16:18 + **/ + @Bean(value = "clientDocApi") + public Docket clientDocApi() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(new ApiInfoBuilder() + .title("C端功能CLIENT") + .description("C端功能CLIENT") + .termsOfServiceUrl("https://www.xiaonuo.vip") + .contact(new Contact("SNOWY_TEAM","https://www.xiaonuo.vip", "xuyuxiang29@foxmail.com")) + .version("2.0.0") + .build()) + .useDefaultResponseMessages(false) + .globalResponseMessage(RequestMethod.GET, CommonResult.responseList()) + .globalResponseMessage(RequestMethod.POST, CommonResult.responseList()) + .groupName("C端功能CLIENT") + .select() + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + .apis(RequestHandlerSelectors.basePackage("vip.xiaonuo.client")) + .paths(PathSelectors.any()) + .build().extensions(openApiExtensionResolver.buildExtensions("C端功能CLIENT")); + } +} diff --git a/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/relation/entity/ClientRelation.java b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/relation/entity/ClientRelation.java new file mode 100644 index 00000000..5f27fca8 --- /dev/null +++ b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/relation/entity/ClientRelation.java @@ -0,0 +1,44 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.client.modular.relation.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Getter; +import lombok.Setter; + +/** + * C端关系实体 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +@TableName("CLIENT_RELATION") +public class ClientRelation { + + /** id */ + private String id; + + /** 对象id */ + private String objectId; + + /** 目标id */ + private String targetId; + + /** 分类 */ + private String category; + + /** 扩展信息 */ + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/relation/enums/ClientRelationCategoryEnum.java b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/relation/enums/ClientRelationCategoryEnum.java new file mode 100644 index 00000000..5ba4bbca --- /dev/null +++ b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/relation/enums/ClientRelationCategoryEnum.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.client.modular.relation.enums; + +import lombok.Getter; + +/** + * C端关系分类枚举 + * + * @author xuyuxiang + * @date 2022/4/21 19:56 + **/ +@Getter +public enum ClientRelationCategoryEnum { + + /* ====C端用户与其他关系==== */ + + /** 测试关系 */ + USER_TEST("USER_TEST"); + + private final String value; + + ClientRelationCategoryEnum(String value) { + this.value = value; + } +} diff --git a/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/relation/mapper/ClientRelationMapper.java b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/relation/mapper/ClientRelationMapper.java new file mode 100644 index 00000000..bae15575 --- /dev/null +++ b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/relation/mapper/ClientRelationMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.client.modular.relation.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.client.modular.relation.entity.ClientRelation; + +/** + * C端关系Mapper接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:37 + **/ +public interface ClientRelationMapper extends BaseMapper { +} diff --git a/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/relation/mapper/mapping/ClientRelationMapper.xml b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/relation/mapper/mapping/ClientRelationMapper.xml new file mode 100644 index 00000000..db53edd8 --- /dev/null +++ b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/relation/mapper/mapping/ClientRelationMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/relation/service/ClientRelationService.java b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/relation/service/ClientRelationService.java new file mode 100644 index 00000000..dcd1d15a --- /dev/null +++ b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/relation/service/ClientRelationService.java @@ -0,0 +1,219 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.client.modular.relation.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import vip.xiaonuo.client.modular.relation.entity.ClientRelation; + +import java.util.List; + +/** + * C端关系Service接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:35 + **/ +public interface ClientRelationService extends IService { + + /** + * 追加关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationWithAppend(String objectId, String targetId, String category); + + /** + * 追加关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationWithAppend(String objectId, String targetId, String category, String extJson); + + /** + * 批量追加关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationBatchWithAppend(String objectId, List targetIdList, String category); + + /** + * 批量追加关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationBatchWithAppend(String objectId, List targetIdList, String category, List extJsonList); + + /** + * 清空原关系并保存关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationWithClear(String objectId, String targetId, String category); + + /** + * 清空原关系并保存关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationWithClear(String objectId, String targetId, String category, String extJson); + + /** + * 清空原关系并批量保存关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationBatchWithClear(String objectId, List targetIdList, String category); + + /** + * 清空原关系并批量保存关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationBatchWithClear(String objectId, List targetIdList, String category, List extJsonList); + + /** + * 根据对象id获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByObjectId(String objectId); + + /** + * 根据对象id集合获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByObjectIdList(List objectIdList); + + /** + * 根据对象id和关系分类获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByObjectIdAndCategory(String objectId, String category); + + /** + * 根据对象id集合和关系分类获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByObjectIdListAndCategory(List objectIdList, String category); + + /** + * 根据目标id获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByTargetId(String targetId); + + /** + * 根据目标id集合获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByTargetIdList(List targetIdList); + + /** + * 根据目标id和关系分类获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByTargetIdAndCategory(String targetId, String category); + + /** + * 根据目标id集合和关系分类获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByTargetIdListAndCategory(List targetIdList, String category); + + /** + * 根据对象id获取目标id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:07 + */ + List getRelationTargetIdListByObjectId(String objectId); + + /** + * 根据对象id集合获取目标id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:07 + */ + List getRelationTargetIdListByObjectIdList(List objectIdList); + + /** + * 根据对象id和关系分类获取目标id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:07 + */ + List getRelationTargetIdListByObjectIdAndCategory(String objectId, String category); + + /** + * 根据对象id集合和关系分类获取目标id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:07 + */ + List getRelationTargetIdListByObjectIdListAndCategory(List objectIdList, String category); + + /** + * 根据目标id获取对象id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:07 + */ + List getRelationObjectIdListByTargetId(String targetId); + + /** + * 根据目标id集合获取对象id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:07 + */ + List getRelationObjectIdListByTargetIdList(List targetIdList); + + /** + * 根据目标id和关系分类获取对象id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:08 + */ + List getRelationObjectIdListByTargetIdAndCategory(String targetId, String category); + + /** + * 根据目标id集合和关系分类获取对象id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:08 + */ + List getRelationObjectIdListByTargetIdListAndCategory(List targetIdList, String category); +} diff --git a/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/relation/service/impl/ClientRelationServiceImpl.java b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/relation/service/impl/ClientRelationServiceImpl.java new file mode 100644 index 00000000..70c57341 --- /dev/null +++ b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/relation/service/impl/ClientRelationServiceImpl.java @@ -0,0 +1,218 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.client.modular.relation.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import vip.xiaonuo.client.modular.relation.entity.ClientRelation; +import vip.xiaonuo.client.modular.relation.mapper.ClientRelationMapper; +import vip.xiaonuo.client.modular.relation.service.ClientRelationService; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * C端关系Service接口实现类 + * + * @author xuyuxiang + * @date 2022/2/23 18:43 + **/ +@Service +public class ClientRelationServiceImpl extends ServiceImpl implements ClientRelationService { + + @Transactional(rollbackFor = Exception.class) + public void saveRelation(String objectId, String targetId, String category, String extJson, boolean clear) { + // 是否需要先删除关系 + if(clear) { + this.remove(new LambdaQueryWrapper().eq(ClientRelation::getObjectId, objectId) + .eq(ClientRelation::getCategory, category)); + } + ClientRelation clientRelation = new ClientRelation(); + clientRelation.setObjectId(objectId); + clientRelation.setTargetId(targetId); + clientRelation.setCategory(category); + clientRelation.setExtJson(extJson); + this.save(clientRelation); + } + + @Transactional(rollbackFor = Exception.class) + public void saveRelationBatch(String objectId, List targetIdList, String category, List extJsonList, boolean clear) { + // 是否需要先删除关系 + if(clear) { + this.remove(new LambdaQueryWrapper().eq(ClientRelation::getObjectId, objectId) + .eq(ClientRelation::getCategory, category)); + } + List clientRelationList = CollectionUtil.newArrayList(); + for(int i = 0; i < targetIdList.size(); i++) { + ClientRelation clientRelation = new ClientRelation(); + clientRelation.setObjectId(objectId); + clientRelation.setTargetId(targetIdList.get(i)); + clientRelation.setCategory(category); + if(ObjectUtil.isNotEmpty(extJsonList)) { + clientRelation.setExtJson(extJsonList.get(i)); + } + clientRelationList.add(clientRelation); + } + if(ObjectUtil.isNotEmpty(clientRelationList)) { + this.saveBatch(clientRelationList); + } + } + + @Override + public void saveRelationWithAppend(String objectId, String targetId, String category) { + this.saveRelation(objectId, targetId, category, null, false); + } + + @Override + public void saveRelationWithAppend(String objectId, String targetId, String category, String extJson) { + this.saveRelation(objectId, targetId, category, extJson, false); + } + + @Override + public void saveRelationBatchWithAppend(String objectId, List targetIdList, String category) { + this.saveRelationBatch(objectId, targetIdList, category, null, false); + } + + @Override + public void saveRelationBatchWithAppend(String objectId, List targetIdList, String category, List extJsonList) { + this.saveRelationBatch(objectId, targetIdList, category, extJsonList, false); + } + + @Override + public void saveRelationWithClear(String objectId, String targetId, String category) { + this.saveRelation(objectId, targetId, category, null, true); + } + + @Override + public void saveRelationWithClear(String objectId, String targetId, String category, String extJson) { + this.saveRelation(objectId, targetId, category, extJson, true); + } + + @Override + public void saveRelationBatchWithClear(String objectId, List targetIdList, String category) { + this.saveRelationBatch(objectId, targetIdList, category, null, true); + } + + @Override + public void saveRelationBatchWithClear(String objectId, List targetIdList, String category, List extJsonList) { + this.saveRelationBatch(objectId, targetIdList, category, extJsonList, true); + } + + @Override + public List getRelationListByObjectId(String objectId) { + return this.getRelationListByObjectIdAndCategory(objectId, null); + } + + @Override + public List getRelationListByObjectIdList(List objectIdList) { + return this.getRelationListByObjectIdListAndCategory(objectIdList, null); + } + + @Override + public List getRelationListByObjectIdAndCategory(String objectId, String category) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(ClientRelation::getObjectId, objectId); + if(ObjectUtil.isNotEmpty(category)) { + lambdaQueryWrapper.eq(ClientRelation::getCategory, category); + } + return this.list(lambdaQueryWrapper); + } + + @Override + public List getRelationListByObjectIdListAndCategory(List objectIdList, String category) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(ClientRelation::getObjectId, objectIdList); + if(ObjectUtil.isNotEmpty(category)) { + lambdaQueryWrapper.eq(ClientRelation::getCategory, category); + } + return this.list(lambdaQueryWrapper); + } + + @Override + public List getRelationListByTargetId(String targetId) { + return this.getRelationListByTargetIdAndCategory(targetId, null); + } + + @Override + public List getRelationListByTargetIdList(List targetIdList) { + return this.getRelationListByTargetIdListAndCategory(targetIdList, null); + } + + @Override + public List getRelationListByTargetIdAndCategory(String targetId, String category) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(ClientRelation::getTargetId, targetId); + if(ObjectUtil.isNotEmpty(category)) { + lambdaQueryWrapper.eq(ClientRelation::getCategory, category); + } + return this.list(lambdaQueryWrapper); + } + + @Override + public List getRelationListByTargetIdListAndCategory(List targetIdList, String category) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(ClientRelation::getTargetId, targetIdList); + if(ObjectUtil.isNotEmpty(category)) { + lambdaQueryWrapper.eq(ClientRelation::getCategory, category); + } + return this.list(lambdaQueryWrapper); + } + + @Override + public List getRelationTargetIdListByObjectId(String objectId) { + return this.getRelationTargetIdListByObjectIdAndCategory(objectId, null); + } + + @Override + public List getRelationTargetIdListByObjectIdList(List objectIdList) { + return this.getRelationTargetIdListByObjectIdListAndCategory(objectIdList, null); + } + + @Override + public List getRelationTargetIdListByObjectIdAndCategory(String objectId, String category) { + return this.getRelationListByObjectIdAndCategory(objectId, category).stream() + .map(ClientRelation::getTargetId).collect(Collectors.toList()); + } + + @Override + public List getRelationTargetIdListByObjectIdListAndCategory(List objectIdList, String category) { + return this.getRelationListByObjectIdListAndCategory(objectIdList, category).stream() + .map(ClientRelation::getTargetId).collect(Collectors.toList()); + } + + @Override + public List getRelationObjectIdListByTargetId(String targetId) { + return this.getRelationObjectIdListByTargetIdAndCategory(targetId, null); + } + + @Override + public List getRelationObjectIdListByTargetIdList(List targetIdList) { + return this.getRelationObjectIdListByTargetIdListAndCategory(targetIdList, null); + } + + @Override + public List getRelationObjectIdListByTargetIdAndCategory(String targetId, String category) { + return this.getRelationListByTargetIdAndCategory(targetId, category).stream() + .map(ClientRelation::getObjectId).collect(Collectors.toList()); + } + + @Override + public List getRelationObjectIdListByTargetIdListAndCategory(List targetIdList, String category) { + return this.getRelationListByTargetIdListAndCategory(targetIdList, category).stream() + .map(ClientRelation::getObjectId).collect(Collectors.toList()); + } +} diff --git a/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/controller/ClientUserController.java b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/controller/ClientUserController.java new file mode 100644 index 00000000..67f9b201 --- /dev/null +++ b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/controller/ClientUserController.java @@ -0,0 +1,129 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.client.modular.user.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.client.modular.user.entity.ClientUser; +import vip.xiaonuo.client.modular.user.param.ClientUserAddParam; +import vip.xiaonuo.client.modular.user.param.ClientUserEditParam; +import vip.xiaonuo.client.modular.user.param.ClientUserIdParam; +import vip.xiaonuo.client.modular.user.param.ClientUserPageParam; +import vip.xiaonuo.client.modular.user.service.ClientUserService; +import vip.xiaonuo.client.modular.user.wrapper.ClientUserWrapperImpl; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.annotation.CommonWrapper; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.pojo.CommonValidList; + +import javax.annotation.Resource; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; + +/** + * C端用户控制器 + * + * @author xuyuxiang + * @date 2022/4/22 9:34 + **/ +@Api(tags = "C端用户控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 1) +@RestController +@Validated +public class ClientUserController { + + @Resource + private ClientUserService clientUserService; + + /** + * 获取C端用户分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("获取C端用户分页") + @CommonWrapper(ClientUserWrapperImpl.class) + @GetMapping("/client/user/page") + public CommonResult> page(ClientUserPageParam clientUserPageParam) { + return CommonResult.data(clientUserService.page(clientUserPageParam)); + } + + /** + * 添加C端用户 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("添加C端用户") + @CommonLog("添加C端用户") + @PostMapping("/client/user/add") + public CommonResult add(@RequestBody @Valid ClientUserAddParam clientUserAddParam) { + clientUserService.add(clientUserAddParam); + return CommonResult.ok(); + } + + /** + * 编辑C端用户 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("编辑C端用户") + @CommonLog("编辑C端用户") + @PostMapping("/client/user/edit") + public CommonResult edit(@RequestBody @Valid ClientUserEditParam clientUserEditParam) { + clientUserService.edit(clientUserEditParam); + return CommonResult.ok(); + } + + /** + * 删除C端用户 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 4) + @ApiOperation("删除C端用户") + @CommonLog("删除C端用户") + @PostMapping("/client/user/delete") + public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList clientUserIdParamList) { + clientUserService.delete(clientUserIdParamList); + return CommonResult.ok(); + } + + /** + * 获取C端用户详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 5) + @ApiOperation("获取C端用户详情") + @CommonWrapper(ClientUserWrapperImpl.class) + @GetMapping("/client/user/detail") + public CommonResult detail(@Valid ClientUserIdParam clientUserIdParam) { + return CommonResult.data(clientUserService.detail(clientUserIdParam)); + } +} diff --git a/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/entity/ClientUser.java b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/entity/ClientUser.java new file mode 100644 index 00000000..79b88a40 --- /dev/null +++ b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/entity/ClientUser.java @@ -0,0 +1,221 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.client.modular.user.entity; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import vip.xiaonuo.common.pojo.CommonEntity; + +import java.util.Date; + +/** + * C端用户实体 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +@TableName("CLIENT_USER") +public class ClientUser extends CommonEntity { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 头像 */ + @ApiModelProperty(value = "头像,图片base64", position = 2) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String avatar; + + /** 签名 */ + @ApiModelProperty(value = "签名,图片base64", position = 3) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String signature; + + /** 账号 */ + @ApiModelProperty(value = "账号", position = 4) + private String account; + + /** 密码 */ + @ApiModelProperty(value = "密码", position = 5) + private String password; + + /** 姓名 */ + @ApiModelProperty(value = "姓名", position = 6) + private String name; + + /** 昵称 */ + @ApiModelProperty(value = "昵称", position = 7) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String nickname; + + /** 性别 */ + @ApiModelProperty(value = "性别", position = 8) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String gender; + + /** 年龄 */ + @ApiModelProperty(value = "年龄", position = 9) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String age; + + /** 出生日期 */ + @ApiModelProperty(value = "出生日期", position = 10) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String birthday; + + /** 民族 */ + @ApiModelProperty(value = "民族", position = 11) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String nation; + + /** 籍贯 */ + @ApiModelProperty(value = "籍贯", position = 12) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String nativePlace; + + /** 家庭住址 */ + @ApiModelProperty(value = "家庭住址", position = 13) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String homeAddress; + + /** 通信地址 */ + @ApiModelProperty(value = "通信地址", position = 14) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String mailingAddress; + + /** 证件类型 */ + @ApiModelProperty(value = "证件类型", position = 15) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String idCardType; + + /** 证件号码 */ + @ApiModelProperty(value = "证件号码", position = 16) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String idCardNumber; + + /** 文化程度 */ + @ApiModelProperty(value = "文化程度", position = 17) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String cultureLevel; + + /** 政治面貌 */ + @ApiModelProperty(value = "政治面貌", position = 18) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String politicalOutlook; + + /** 毕业院校 */ + @ApiModelProperty(value = "毕业院校", position = 19) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String college; + + /** 学历 */ + @ApiModelProperty(value = "学历", position = 20) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String education; + + /** 学制 */ + @ApiModelProperty(value = "学制", position = 21) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String eduLength; + + /** 学位 */ + @ApiModelProperty(value = "学位", position = 22) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String degree; + + /** 手机 */ + @ApiModelProperty(value = "手机", position = 23) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String phone; + + /** 邮箱 */ + @ApiModelProperty(value = "邮箱", position = 24) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String email; + + /** 家庭电话 */ + @ApiModelProperty(value = "家庭电话", position = 25) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String homeTel; + + /** 办公电话 */ + @ApiModelProperty(value = "办公电话", position = 26) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String officeTel; + + /** 紧急联系人 */ + @ApiModelProperty(value = "紧急联系人", position = 27) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String emergencyContact; + + /** 紧急联系人电话 */ + @ApiModelProperty(value = "紧急联系人电话", position = 28) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String emergencyPhone; + + /** 紧急联系人地址 */ + @ApiModelProperty(value = "紧急联系人地址", position = 29) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String emergencyAddress; + + /** 上次登录ip */ + @ApiModelProperty(value = "上次登录ip", position = 30) + private String lastLoginIp; + + /** 上次登录地点 */ + @ApiModelProperty(value = "上次登录地点", position = 31) + private String lastLoginAddress; + + /** 上次登录时间 */ + @ApiModelProperty(value = "上次登录时间", position = 32) + private Date lastLoginTime; + + /** 上次登录设备 */ + @ApiModelProperty(value = "上次登录设备", position = 33) + private String lastLoginDevice; + + /** 最新登录ip */ + @ApiModelProperty(value = "最新登录ip", position = 34) + private String latestLoginIp; + + /** 最新登录地点 */ + @ApiModelProperty(value = "最新登录地点", position = 35) + private String latestLoginAddress; + + /** 最新登录时间 */ + @ApiModelProperty(value = "最新登录时间", position = 36) + private Date latestLoginTime; + + /** 最新登录设备 */ + @ApiModelProperty(value = "最新登录设备", position = 37) + private String latestLoginDevice; + + /** 用户状态 */ + @ApiModelProperty(value = "用户状态", position = 38) + private String userStatus; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 39) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 40) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/enums/ClientUserStatusEnum.java b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/enums/ClientUserStatusEnum.java new file mode 100644 index 00000000..2ee74852 --- /dev/null +++ b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/enums/ClientUserStatusEnum.java @@ -0,0 +1,49 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.client.modular.user.enums; + +import lombok.Getter; +import vip.xiaonuo.common.exception.CommonException; + +/** + * C端用户状态枚举 + * + * @author xuyuxiang + * @date 2022/4/27 21:47 + */ +@Getter +public enum ClientUserStatusEnum { + + /** + * 正常 + */ + ENABLE("ENABLE"), + + /** + * 停用 + */ + DISABLED("DISABLED"); + + private final String value; + + ClientUserStatusEnum(String value) { + this.value = value; + } + + public static void validate(String value) { + boolean flag = ENABLE.getValue().equals(value) || DISABLED.getValue().equals(value); + if(!flag) { + throw new CommonException("不支持的C端用户状态:{}", value); + } + } +} diff --git a/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/mapper/ClientUserMapper.java b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/mapper/ClientUserMapper.java new file mode 100644 index 00000000..06423690 --- /dev/null +++ b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/mapper/ClientUserMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.client.modular.user.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.client.modular.user.entity.ClientUser; + +/** + * C端用户Mapper接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:37 + **/ +public interface ClientUserMapper extends BaseMapper { +} diff --git a/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/mapper/mapping/ClientUserMapper.xml b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/mapper/mapping/ClientUserMapper.xml new file mode 100644 index 00000000..736e5a9c --- /dev/null +++ b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/mapper/mapping/ClientUserMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/param/ClientUserAddParam.java b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/param/ClientUserAddParam.java new file mode 100644 index 00000000..c1eaa6f5 --- /dev/null +++ b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/param/ClientUserAddParam.java @@ -0,0 +1,148 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.client.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * C端用户添加参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class ClientUserAddParam { + + /** 账号 */ + @ApiModelProperty(value = "账号", required = true, position = 1) + @NotBlank(message = "account不能为空") + private String account; + + /** 姓名 */ + @ApiModelProperty(value = "姓名", required = true, position = 2) + @NotBlank(message = "name不能为空") + private String name; + + /** 头像 */ + @ApiModelProperty(value = "头像,图片base64", position = 3) + private String avatar; + + /** 签名 */ + @ApiModelProperty(value = "签名,图片base64", position = 4) + private String signature; + + /** 昵称 */ + @ApiModelProperty(value = "昵称", position = 7) + private String nickname; + + /** 性别 */ + @ApiModelProperty(value = "性别", position = 8) + private String gender; + + /** 年龄 */ + @ApiModelProperty(value = "年龄", position = 9) + private String age; + + /** 出生日期 */ + @ApiModelProperty(value = "出生日期", position = 10) + private String birthday; + + /** 民族 */ + @ApiModelProperty(value = "民族", position = 11) + private String nation; + + /** 籍贯 */ + @ApiModelProperty(value = "籍贯", position = 12) + private String nativePlace; + + /** 家庭住址 */ + @ApiModelProperty(value = "家庭住址", position = 13) + private String homeAddress; + + /** 通信地址 */ + @ApiModelProperty(value = "通信地址", position = 14) + private String mailingAddress; + + /** 证件类型 */ + @ApiModelProperty(value = "证件类型", position = 15) + private String idCardType; + + /** 证件号码 */ + @ApiModelProperty(value = "证件号码", position = 16) + private String idCardNumber; + + /** 文化程度 */ + @ApiModelProperty(value = "文化程度", position = 17) + private String cultureLevel; + + /** 政治面貌 */ + @ApiModelProperty(value = "政治面貌", position = 18) + private String politicalOutlook; + + /** 毕业院校 */ + @ApiModelProperty(value = "毕业院校", position = 19) + private String college; + + /** 学历 */ + @ApiModelProperty(value = "学历", position = 20) + private String education; + + /** 学制 */ + @ApiModelProperty(value = "学制", position = 21) + private String eduLength; + + /** 学位 */ + @ApiModelProperty(value = "学位", position = 22) + private String degree; + + /** 手机 */ + @ApiModelProperty(value = "手机", position = 23) + private String phone; + + /** 邮箱 */ + @ApiModelProperty(value = "邮箱", position = 24) + private String email; + + /** 家庭电话 */ + @ApiModelProperty(value = "家庭电话", position = 25) + private String homeTel; + + /** 办公电话 */ + @ApiModelProperty(value = "办公电话", position = 26) + private String officeTel; + + /** 紧急联系人 */ + @ApiModelProperty(value = "紧急联系人", position = 27) + private String emergencyContact; + + /** 紧急联系人电话 */ + @ApiModelProperty(value = "紧急联系人电话", position = 28) + private String emergencyPhone; + + /** 紧急联系人地址 */ + @ApiModelProperty(value = "紧急联系人地址", position = 29) + private String emergencyAddress; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 30) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 31) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/param/ClientUserEditParam.java b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/param/ClientUserEditParam.java new file mode 100644 index 00000000..129d6530 --- /dev/null +++ b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/param/ClientUserEditParam.java @@ -0,0 +1,153 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.client.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * C端用户参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class ClientUserEditParam { + + /** id */ + @ApiModelProperty(value = "id", required = true, position = 1) + @NotBlank(message = "id不能为空") + private String id; + + /** 账号 */ + @ApiModelProperty(value = "账号", required = true, position = 2) + @NotBlank(message = "account不能为空") + private String account; + + /** 姓名 */ + @ApiModelProperty(value = "姓名", required = true, position = 3) + @NotBlank(message = "name不能为空") + private String name; + + /** 头像 */ + @ApiModelProperty(value = "头像,图片base64", position = 4) + private String avatar; + + /** 签名 */ + @ApiModelProperty(value = "签名,图片base64", position = 5) + private String signature; + + /** 昵称 */ + @ApiModelProperty(value = "昵称", position = 7) + private String nickname; + + /** 性别 */ + @ApiModelProperty(value = "性别", position = 8) + private String gender; + + /** 年龄 */ + @ApiModelProperty(value = "年龄", position = 9) + private String age; + + /** 出生日期 */ + @ApiModelProperty(value = "出生日期", position = 10) + private String birthday; + + /** 民族 */ + @ApiModelProperty(value = "民族", position = 11) + private String nation; + + /** 籍贯 */ + @ApiModelProperty(value = "籍贯", position = 12) + private String nativePlace; + + /** 家庭住址 */ + @ApiModelProperty(value = "家庭住址", position = 13) + private String homeAddress; + + /** 通信地址 */ + @ApiModelProperty(value = "通信地址", position = 14) + private String mailingAddress; + + /** 证件类型 */ + @ApiModelProperty(value = "证件类型", position = 15) + private String idCardType; + + /** 证件号码 */ + @ApiModelProperty(value = "证件号码", position = 16) + private String idCardNumber; + + /** 文化程度 */ + @ApiModelProperty(value = "文化程度", position = 17) + private String cultureLevel; + + /** 政治面貌 */ + @ApiModelProperty(value = "政治面貌", position = 18) + private String politicalOutlook; + + /** 毕业院校 */ + @ApiModelProperty(value = "毕业院校", position = 19) + private String college; + + /** 学历 */ + @ApiModelProperty(value = "学历", position = 20) + private String education; + + /** 学制 */ + @ApiModelProperty(value = "学制", position = 21) + private String eduLength; + + /** 学位 */ + @ApiModelProperty(value = "学位", position = 22) + private String degree; + + /** 手机 */ + @ApiModelProperty(value = "手机", position = 23) + private String phone; + + /** 邮箱 */ + @ApiModelProperty(value = "邮箱", position = 24) + private String email; + + /** 家庭电话 */ + @ApiModelProperty(value = "家庭电话", position = 25) + private String homeTel; + + /** 办公电话 */ + @ApiModelProperty(value = "办公电话", position = 26) + private String officeTel; + + /** 紧急联系人 */ + @ApiModelProperty(value = "紧急联系人", position = 27) + private String emergencyContact; + + /** 紧急联系人电话 */ + @ApiModelProperty(value = "紧急联系人电话", position = 28) + private String emergencyPhone; + + /** 紧急联系人地址 */ + @ApiModelProperty(value = "紧急联系人地址", position = 29) + private String emergencyAddress; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 30) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 31) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/param/ClientUserIdParam.java b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/param/ClientUserIdParam.java new file mode 100644 index 00000000..987a5144 --- /dev/null +++ b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/param/ClientUserIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.client.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * C端用户Id参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class ClientUserIdParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/param/ClientUserPageParam.java b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/param/ClientUserPageParam.java new file mode 100644 index 00000000..f5b66220 --- /dev/null +++ b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/param/ClientUserPageParam.java @@ -0,0 +1,48 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.client.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * C端用户参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class ClientUserPageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 账号、姓名关键词 */ + @ApiModelProperty(value = "账号、姓名关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/provider/ClientLoginUserApiProvider.java b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/provider/ClientLoginUserApiProvider.java new file mode 100644 index 00000000..b8e45891 --- /dev/null +++ b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/provider/ClientLoginUserApiProvider.java @@ -0,0 +1,164 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.client.modular.user.provider; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import org.springframework.stereotype.Service; +import vip.xiaonuo.auth.api.SaBaseLoginUserApi; +import vip.xiaonuo.auth.core.pojo.SaBaseClientLoginUser; +import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser; +import vip.xiaonuo.client.modular.user.result.ClientLoginUser; +import vip.xiaonuo.client.modular.user.service.ClientUserService; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * C端登录用户API接口实现类 + * + * @author xuyuxiang + * @date 2022/4/29 13:36 + **/ +@Service("clientLoginUserApi") +public class ClientLoginUserApiProvider implements SaBaseLoginUserApi { + + @Resource + private ClientUserService clientUserService; + + /** + * 不实现B端用户信息 + * + * @author xuyuxiang + * @date 2022/7/8 10:36 + **/ + @Override + public SaBaseLoginUser getUserById(String id) { + return null; + } + + /** + * 根据id获取C端用户信息,查不到则返回null + * + * @author xuyuxiang + * @date 2021/12/28 15:35 + **/ + @Override + public SaBaseClientLoginUser getClientUserById(String id) { + return clientUserService.getUserById(id); + } + + /** + * 不实现B端用户信息 + * + * @author xuyuxiang + * @date 2022/7/8 10:36 + **/ + @Override + public SaBaseLoginUser getUserByAccount(String account) { + return null; + } + + /** + * 根据账号获取C端用户信息,查不到则返回null + * + * @author xuyuxiang + * @date 2021/12/28 15:35 + **/ + @Override + public ClientLoginUser getClientUserByAccount(String account) { + return clientUserService.getUserByAccount(account); + } + + /** + * 不实现B端用户信息 + * + * @author xuyuxiang + * @date 2022/8/25 14:08 + **/ + @Override + public SaBaseLoginUser getUserByPhone(String phone) { + return null; + } + + /** + * 根据手机号获取C端用户信息,查不到则返回null + * + * @author xuyuxiang + * @date 2022/8/25 14:08 + **/ + @Override + public SaBaseClientLoginUser getClientUserByPhone(String phone) { + return clientUserService.getUserByPhone(phone); + } + + /** + * 根据用户id获取用户集合 + * + * @author xuyuxiang + * @date 2022/4/27 22:53 + */ + @Override + public List listUserByUserIdList(List userIdList) { + return clientUserService.listByIds(userIdList).stream().map(JSONUtil::parseObj).collect(Collectors.toList()); + } + + /** + * 根据用户id获取角色码集合 + * + * @author xuyuxiang + * @date 2022/4/27 22:53 + */ + @Override + public List getRoleCodeListByUserId(String userId) { + // TODO C端用户暂无角色码 + return CollectionUtil.newArrayList(); + } + + /** + * 根据用户id获取按钮码集合 + * + * @author xuyuxiang + * @date 2022/4/27 22:54 + */ + @Override + public List getButtonCodeListListByUserId(String userId) { + // TODO C端用户暂无按钮码 + return CollectionUtil.newArrayList(); + } + + /** + * 根据用户id获取权限集合 + * + * @author xuyuxiang + * @date 2022/4/27 22:54 + */ + @Override + public List getPermissionListByUserId(String userId, String orgId) { + // TODO C端用户暂无权限码 + return CollectionUtil.newArrayList(); + } + + /** + * 更新用户的登录时间和登录ip等信息 + * + * @author xuyuxiang + * @date 2022/4/27 22:57 + */ + @Override + public void updateUserLoginInfo(String userId, String device) { + clientUserService.updateUserLoginInfo(userId, device); + } +} \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/result/ClientLoginUser.java b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/result/ClientLoginUser.java new file mode 100644 index 00000000..712d9b0a --- /dev/null +++ b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/result/ClientLoginUser.java @@ -0,0 +1,37 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.client.modular.user.result; + +import vip.xiaonuo.auth.core.pojo.SaBaseClientLoginUser; +import vip.xiaonuo.client.modular.user.enums.ClientUserStatusEnum; + +/** + * C端登录用户对象 + * + * @author xuyuxiang + * @date 2022/4/21 19:33 + **/ +public class ClientLoginUser extends SaBaseClientLoginUser { + + /** + * 实现是否可以登录 + * + * @author xuyuxiang + * @date 2022/8/15 15:27 + **/ + @Override + public Boolean getEnabled() { + // 仅判断状态是否正常,可自行扩展 + return this.getUserStatus().equals(ClientUserStatusEnum.ENABLE.getValue()); + } +} diff --git a/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/service/ClientUserService.java b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/service/ClientUserService.java new file mode 100644 index 00000000..6bd00084 --- /dev/null +++ b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/service/ClientUserService.java @@ -0,0 +1,121 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.client.modular.user.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import vip.xiaonuo.client.modular.user.entity.ClientUser; +import vip.xiaonuo.client.modular.user.param.ClientUserAddParam; +import vip.xiaonuo.client.modular.user.param.ClientUserEditParam; +import vip.xiaonuo.client.modular.user.param.ClientUserIdParam; +import vip.xiaonuo.client.modular.user.param.ClientUserPageParam; +import vip.xiaonuo.client.modular.user.result.ClientLoginUser; + +import java.util.List; + +/** + * C端用户Service接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:35 + **/ +public interface ClientUserService extends IService { + + /** + * 根据id获取用户信息,查不到则返回null + * + * @author xuyuxiang + * @date 2022/4/27 21:38 + */ + ClientLoginUser getUserById(String id); + + /** + * 根据账户获取用户信息,查不到则返回null + * + * @author xuyuxiang + * @date 2022/4/27 21:38 + */ + ClientLoginUser getUserByAccount(String account); + + /** + * 根据手机号获取用户信息,查不到则返回null + * + * @author xuyuxiang + * @date 2022/4/27 21:38 + */ + ClientLoginUser getUserByPhone(String phone); + + /** + * 根据邮箱获取用户信息,查不到则返回null + * + * @author xuyuxiang + * @date 2022/4/27 21:38 + */ + ClientLoginUser getUserByEmail(String email); + + /** + * 获取C端用户分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + Page page(ClientUserPageParam clientUserPageParam); + + /** + * 添加C端用户 + * + * @author xuyuxiang + * @date 2022/4/24 20:48 + */ + void add(ClientUserAddParam clientUserAddParam); + + /** + * 编辑C端用户 + * + * @author xuyuxiang + * @date 2022/4/24 21:13 + */ + void edit(ClientUserEditParam clientUserEditParam); + + /** + * 删除C端用户 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + void delete(List clientUserIdParamList); + + /** + * 获取C端用户详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + ClientUser detail(ClientUserIdParam clientUserIdParam); + + /** + * 更新C端用户的登录时间和登录ip等信息 + * + * @author xuyuxiang + * @date 2022/4/27 22:58 + */ + void updateUserLoginInfo(String userId, String device); + + /** + * 获取C端用户详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + ClientUser queryEntity(String id); +} diff --git a/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/service/impl/ClientUserServiceImpl.java b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/service/impl/ClientUserServiceImpl.java new file mode 100644 index 00000000..cfd58a74 --- /dev/null +++ b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/service/impl/ClientUserServiceImpl.java @@ -0,0 +1,291 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.client.modular.user.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import vip.xiaonuo.client.modular.relation.service.ClientRelationService; +import vip.xiaonuo.client.modular.user.entity.ClientUser; +import vip.xiaonuo.client.modular.user.enums.ClientUserStatusEnum; +import vip.xiaonuo.client.modular.user.mapper.ClientUserMapper; +import vip.xiaonuo.client.modular.user.param.ClientUserAddParam; +import vip.xiaonuo.client.modular.user.param.ClientUserEditParam; +import vip.xiaonuo.client.modular.user.param.ClientUserIdParam; +import vip.xiaonuo.client.modular.user.param.ClientUserPageParam; +import vip.xiaonuo.client.modular.user.result.ClientLoginUser; +import vip.xiaonuo.client.modular.user.service.ClientUserService; +import vip.xiaonuo.common.enums.CommonSortOrderEnum; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.common.util.*; +import vip.xiaonuo.dev.api.DevConfigApi; + +import javax.annotation.Resource; +import java.util.List; + +/** + * C端用户Service接口实现类 + * + * @author xuyuxiang + * @date 2022/2/23 18:43 + **/ +@Service +public class ClientUserServiceImpl extends ServiceImpl implements ClientUserService { + + private static final String SNOWY_SYS_DEFAULT_PASSWORD_KEY = "SNOWY_SYS_DEFAULT_PASSWORD"; + + @Resource + private DevConfigApi devConfigApi; + + @Resource + private ClientRelationService clientRelationService; + + @Override + public ClientLoginUser getUserById(String id) { + ClientUser clientUser = this.getById(id); + if(ObjectUtil.isNotEmpty(clientUser)) { + ClientLoginUser clientLoginUser = BeanUtil.copyProperties(clientUser, ClientLoginUser.class); + if(ObjectUtil.isNotEmpty(clientLoginUser.getPhone())) { + clientLoginUser.setPhone(CommonCryptogramUtil.doSm4CbcDecrypt(clientLoginUser.getPhone())); + } + if(ObjectUtil.isNotEmpty(clientLoginUser.getIdCardNumber())) { + clientLoginUser.setIdCardNumber(CommonCryptogramUtil.doSm4CbcDecrypt(clientLoginUser.getIdCardNumber())); + } + if(ObjectUtil.isNotEmpty(clientLoginUser.getEmergencyPhone())) { + clientLoginUser.setIdCardNumber(CommonCryptogramUtil.doSm4CbcDecrypt(clientLoginUser.getEmergencyPhone())); + } + return clientLoginUser; + } + return null; + } + + @Override + public ClientLoginUser getUserByAccount(String account) { + ClientUser clientUser = this.getOne(new LambdaQueryWrapper().eq(ClientUser::getAccount, account)); + if(ObjectUtil.isNotEmpty(clientUser)) { + ClientLoginUser clientLoginUser = BeanUtil.copyProperties(clientUser, ClientLoginUser.class); + if(ObjectUtil.isNotEmpty(clientLoginUser.getPhone())) { + clientLoginUser.setPhone(CommonCryptogramUtil.doSm4CbcDecrypt(clientLoginUser.getPhone())); + } + if(ObjectUtil.isNotEmpty(clientLoginUser.getIdCardNumber())) { + clientLoginUser.setIdCardNumber(CommonCryptogramUtil.doSm4CbcDecrypt(clientLoginUser.getIdCardNumber())); + } + if(ObjectUtil.isNotEmpty(clientLoginUser.getEmergencyPhone())) { + clientLoginUser.setIdCardNumber(CommonCryptogramUtil.doSm4CbcDecrypt(clientLoginUser.getEmergencyPhone())); + } + return clientLoginUser; + } + return null; + } + + @Override + public ClientLoginUser getUserByPhone(String phone) { + ClientUser clientUser = this.getOne(new LambdaQueryWrapper().eq(ClientUser::getPhone, CommonCryptogramUtil.doSm4CbcEncrypt(phone))); + if(ObjectUtil.isNotEmpty(clientUser)) { + ClientLoginUser clientLoginUser = BeanUtil.copyProperties(clientUser, ClientLoginUser.class); + if(ObjectUtil.isNotEmpty(clientLoginUser.getPhone())) { + clientLoginUser.setPhone(CommonCryptogramUtil.doSm4CbcDecrypt(clientLoginUser.getPhone())); + } + if(ObjectUtil.isNotEmpty(clientLoginUser.getIdCardNumber())) { + clientLoginUser.setIdCardNumber(CommonCryptogramUtil.doSm4CbcDecrypt(clientLoginUser.getIdCardNumber())); + } + if(ObjectUtil.isNotEmpty(clientLoginUser.getEmergencyPhone())) { + clientLoginUser.setIdCardNumber(CommonCryptogramUtil.doSm4CbcDecrypt(clientLoginUser.getEmergencyPhone())); + } + return clientLoginUser; + } + return null; + } + + @Override + public ClientLoginUser getUserByEmail(String email) { + ClientUser clientUser = this.getOne(new LambdaQueryWrapper().eq(ClientUser::getEmail, email)); + if(ObjectUtil.isNotEmpty(clientUser)) { + ClientLoginUser clientLoginUser = BeanUtil.copyProperties(clientUser, ClientLoginUser.class); + if(ObjectUtil.isNotEmpty(clientLoginUser.getPhone())) { + clientLoginUser.setPhone(CommonCryptogramUtil.doSm4CbcDecrypt(clientLoginUser.getPhone())); + } + if(ObjectUtil.isNotEmpty(clientLoginUser.getIdCardNumber())) { + clientLoginUser.setIdCardNumber(CommonCryptogramUtil.doSm4CbcDecrypt(clientLoginUser.getIdCardNumber())); + } + if(ObjectUtil.isNotEmpty(clientLoginUser.getEmergencyPhone())) { + clientLoginUser.setIdCardNumber(CommonCryptogramUtil.doSm4CbcDecrypt(clientLoginUser.getEmergencyPhone())); + } + return clientLoginUser; + } + return null; + } + + @Override + public Page page(ClientUserPageParam clientUserPageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(ObjectUtil.isNotEmpty(clientUserPageParam.getSearchKey())) { + queryWrapper.lambda().and(q -> q.like(ClientUser::getName, clientUserPageParam.getSearchKey()) + .or().like(ClientUser::getAccount, clientUserPageParam.getSearchKey())); + } + if(ObjectUtil.isAllNotEmpty(clientUserPageParam.getSortField(), clientUserPageParam.getSortOrder())) { + CommonSortOrderEnum.validate(clientUserPageParam.getSortOrder()); + queryWrapper.orderBy(true, clientUserPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), + StrUtil.toUnderlineCase(clientUserPageParam.getSortField())); + } else { + queryWrapper.lambda().orderByAsc(ClientUser::getSortCode); + } + return this.page(CommonPageRequest.defaultPage(), queryWrapper); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void add(ClientUserAddParam clientUserAddParam) { + checkParam(clientUserAddParam); + // 设置手机号 + if(ObjectUtil.isNotEmpty(clientUserAddParam.getPhone())) { + clientUserAddParam.setPhone(CommonCryptogramUtil.doSm4CbcEncrypt(clientUserAddParam.getPhone())); + } + // 设置证件号 + if(ObjectUtil.isNotEmpty(clientUserAddParam.getIdCardNumber())) { + clientUserAddParam.setIdCardNumber(CommonCryptogramUtil.doSm4CbcEncrypt(clientUserAddParam.getIdCardNumber())); + } + // 设置紧急联系人电话 + if(ObjectUtil.isNotEmpty(clientUserAddParam.getEmergencyPhone())) { + clientUserAddParam.setEmergencyPhone(CommonCryptogramUtil.doSm4CbcEncrypt(clientUserAddParam.getEmergencyPhone())); + } + ClientUser clientUser = BeanUtil.toBean(clientUserAddParam, ClientUser.class); + if(ObjectUtil.isEmpty(clientUser.getAvatar())) { + // 设置默认头像 + clientUser.setAvatar(CommonAvatarUtil.generateImg(clientUser.getName())); + } + // 设置默认密码 + clientUser.setPassword(CommonCryptogramUtil.doHashValue(devConfigApi.getValueByKey(SNOWY_SYS_DEFAULT_PASSWORD_KEY))); + // 设置状态 + clientUser.setUserStatus(ClientUserStatusEnum.ENABLE.getValue()); + this.save(clientUser); + } + + private void checkParam(ClientUserAddParam clientUserAddParam) { + if (this.count(new LambdaQueryWrapper() + .eq(ClientUser::getAccount, clientUserAddParam.getAccount())) > 0) { + throw new CommonException("存在重复的账号,账号为:{}", clientUserAddParam.getAccount()); + } + if(ObjectUtil.isNotEmpty(clientUserAddParam.getPhone())) { + if(!PhoneUtil.isMobile(clientUserAddParam.getPhone())) { + throw new CommonException("手机号码:{}格式错误", clientUserAddParam.getPhone()); + } + if (this.count(new LambdaQueryWrapper() + .eq(ClientUser::getPhone, clientUserAddParam.getPhone())) > 0) { + throw new CommonException("存在重复的手机号,手机号为:{}", clientUserAddParam.getPhone()); + } + } + if(ObjectUtil.isNotEmpty(clientUserAddParam.getEmail())) { + if(!CommonEmailUtil.isEmail(clientUserAddParam.getEmail())) { + throw new CommonException("邮箱:{}格式错误", clientUserAddParam.getPhone()); + } + if (this.count(new LambdaQueryWrapper() + .eq(ClientUser::getEmail, clientUserAddParam.getEmail())) > 0) { + throw new CommonException("存在重复的邮箱,邮箱为:{}", clientUserAddParam.getEmail()); + } + } + } + + @Override + public void edit(ClientUserEditParam clientUserEditParam) { + ClientUser clientUser = this.queryEntity(clientUserEditParam.getId()); + checkParam(clientUserEditParam); + // 设置手机号 + if(ObjectUtil.isNotEmpty(clientUserEditParam.getPhone())) { + clientUserEditParam.setPhone(CommonCryptogramUtil.doSm4CbcEncrypt(clientUserEditParam.getPhone())); + } + // 设置证件号 + if(ObjectUtil.isNotEmpty(clientUserEditParam.getIdCardNumber())) { + clientUserEditParam.setIdCardNumber(CommonCryptogramUtil.doSm4CbcEncrypt(clientUserEditParam.getIdCardNumber())); + } + // 设置紧急联系人电话 + if(ObjectUtil.isNotEmpty(clientUserEditParam.getEmergencyPhone())) { + clientUserEditParam.setEmergencyPhone(CommonCryptogramUtil.doSm4CbcEncrypt(clientUserEditParam.getEmergencyPhone())); + } + BeanUtil.copyProperties(clientUserEditParam, clientUser); + this.updateById(clientUser); + } + + private void checkParam(ClientUserEditParam clientUserEditParam) { + if (this.count(new LambdaQueryWrapper() + .eq(ClientUser::getAccount, clientUserEditParam.getAccount()) + .ne(ClientUser::getId, clientUserEditParam.getId())) > 0) { + throw new CommonException("存在重复的账号,账号为:{}", clientUserEditParam.getAccount()); + } + if(ObjectUtil.isNotEmpty(clientUserEditParam.getPhone())) { + if(!PhoneUtil.isMobile(clientUserEditParam.getPhone())) { + throw new CommonException("手机号码:{}格式错误", clientUserEditParam.getPhone()); + } + if (this.count(new LambdaQueryWrapper() + .eq(ClientUser::getPhone, clientUserEditParam.getPhone()) + .ne(ClientUser::getId, clientUserEditParam.getId())) > 0) { + throw new CommonException("存在重复的手机号,手机号为:{}", clientUserEditParam.getPhone()); + } + } + if(ObjectUtil.isNotEmpty(clientUserEditParam.getEmail())) { + if(!CommonEmailUtil.isEmail(clientUserEditParam.getEmail())) { + throw new CommonException("邮箱:{}格式错误", clientUserEditParam.getPhone()); + } + if (this.count(new LambdaQueryWrapper() + .eq(ClientUser::getEmail, clientUserEditParam.getEmail()) + .ne(ClientUser::getId, clientUserEditParam.getId())) > 0) { + throw new CommonException("存在重复的邮箱,邮箱为:{}", clientUserEditParam.getEmail()); + } + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void delete(List clientUserIdParamList) { + this.removeBatchByIds(CollStreamUtil.toList(clientUserIdParamList, ClientUserIdParam::getId)); + } + + @Override + public ClientUser detail(ClientUserIdParam clientUserIdParam) { + return this.queryEntity(clientUserIdParam.getId()); + } + + @Override + public void updateUserLoginInfo(String userId, String device) { + ClientUser clientUser = this.queryEntity(userId); + clientUser.setLastLoginTime(clientUser.getLatestLoginTime()); + clientUser.setLastLoginIp(clientUser.getLatestLoginIp()); + clientUser.setLastLoginAddress(clientUser.getLatestLoginAddress()); + clientUser.setLastLoginDevice(clientUser.getLatestLoginDevice()); + clientUser.setLatestLoginTime(DateTime.now()); + String ip = CommonIpAddressUtil.getIp(CommonServletUtil.getRequest()); + clientUser.setLatestLoginIp(ip); + clientUser.setLatestLoginAddress(CommonIpAddressUtil.getCityInfo(ip)); + clientUser.setLatestLoginDevice(device); + this.updateById(clientUser); + } + + @Override + public ClientUser queryEntity(String id) { + ClientUser clientUser = this.getById(id); + if(ObjectUtil.isEmpty(clientUser)) { + throw new CommonException("用户不存在,id值为:{}", id); + } + return clientUser; + } +} diff --git a/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/wrapper/ClientUserWrapperImpl.java b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/wrapper/ClientUserWrapperImpl.java new file mode 100644 index 00000000..0231ea5d --- /dev/null +++ b/snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/wrapper/ClientUserWrapperImpl.java @@ -0,0 +1,52 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.client.modular.user.wrapper; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import vip.xiaonuo.client.modular.user.entity.ClientUser; +import vip.xiaonuo.common.pojo.CommonWrapperInterface; +import vip.xiaonuo.common.util.CommonCryptogramUtil; + +/** + * ClientUser类型的包装实现类 + * + * @author xuyuxiang + * @date 2022/9/15 21:42 + */ +public class ClientUserWrapperImpl implements CommonWrapperInterface { + + /** + * 对手机号和证件号码进行解密 + * + * @author xuyuxiang + * @date 2022/9/15 21:45 + */ + @Override + public JSONObject doWrap(ClientUser clientUser) { + String phone = clientUser.getPhone(); + if(ObjectUtil.isNotEmpty(phone)) { + clientUser.setPhone(CommonCryptogramUtil.doSm4CbcDecrypt(phone)); + } + String idCardNumber = clientUser.getIdCardNumber(); + if(ObjectUtil.isNotEmpty(idCardNumber)) { + clientUser.setIdCardNumber(CommonCryptogramUtil.doSm4CbcDecrypt(idCardNumber)); + } + String emergencyPhone = clientUser.getEmergencyPhone(); + if(ObjectUtil.isNotEmpty(emergencyPhone)) { + clientUser.setEmergencyPhone(CommonCryptogramUtil.doSm4CbcDecrypt(emergencyPhone)); + } + return JSONUtil.parseObj(clientUser); + } +} diff --git a/snowy-plugin/snowy-plugin-dev/README.md b/snowy-plugin/snowy-plugin-dev/README.md new file mode 100644 index 00000000..1d374180 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/README.md @@ -0,0 +1 @@ +# 开发工具插件 \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-dev/pom.xml b/snowy-plugin/snowy-plugin-dev/pom.xml new file mode 100644 index 00000000..8fde3d6f --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + + + vip.xiaonuo + snowy-plugin + 2.0.0 + + + snowy-plugin-dev + jar + 开发工具插件 + + + + + vip.xiaonuo + snowy-plugin-dev-api + ${project.parent.version} + + + + + vip.xiaonuo + snowy-plugin-auth-api + ${project.parent.version} + + + + + vip.xiaonuo + snowy-plugin-sys-api + ${project.parent.version} + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/core/aop/DevLogAop.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/core/aop/DevLogAop.java new file mode 100644 index 00000000..ecb59ad0 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/core/aop/DevLogAop.java @@ -0,0 +1,122 @@ +/* +Copyright [2020] [https://www.xiaonuo.vip] + +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. + +Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + +1.请不要删除和修改根目录下的LICENSE文件。 +2.请不要删除和修改Snowy源码头部的版权声明。 +3.请保留源码和相关描述文件的项目出处,作者声明等。 +4.分发源码时候,请注明软件出处 https://gitee.com/xiaonuobase/snowy-layui +5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/xiaonuobase/snowy-layui +6.若您的项目无法满足以上几点,可申请商业授权,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.core.aop; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser; +import vip.xiaonuo.auth.core.util.StpLoginUserUtil; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.dev.modular.log.util.DevLogUtil; + +import java.lang.reflect.Method; + +/** + * 业务日志aop切面 + * + * @author xuyuxiang + * @date 2020/3/20 11:47 + */ +@Aspect +@Order +@Component +public class DevLogAop { + + /** + * 日志切入点 + * + * @author xuyuxiang + * @date 2020/3/23 17:10 + */ + @Pointcut("@annotation(vip.xiaonuo.common.annotation.CommonLog)") + private void getLogPointCut() { + } + + /** + * 操作成功返回结果记录日志 + * + * @author xuyuxiang + * @date 2022/9/2 15:24 + */ + @AfterReturning(pointcut = "getLogPointCut()", returning = "result") + public void doAfterReturning(JoinPoint joinPoint, Object result) { + MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); + Method method = methodSignature.getMethod(); + CommonLog commonLog = method.getAnnotation(CommonLog.class); + String userName = "未知"; + try { + SaBaseLoginUser loginUser = StpLoginUserUtil.getLoginUser(); + if(ObjectUtil.isNotNull(loginUser)) { + userName = loginUser.getName(); + } + } catch (Exception ignored) { + } + // 异步记录日志 + DevLogUtil.executeOperationLog(commonLog, userName, joinPoint, JSONUtil.toJsonStr(result)); + } + + /** + * 操作发生异常记录日志 + * + * @author xuyuxiang + * @date 2022/9/2 15:24 + */ + @AfterThrowing(pointcut = "getLogPointCut()", throwing = "exception") + public void doAfterThrowing(JoinPoint joinPoint, Exception exception) { + MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); + Method method = methodSignature.getMethod(); + CommonLog commonLog = method.getAnnotation(CommonLog.class); + String userName = "未知"; + try { + SaBaseLoginUser loginUser = StpLoginUserUtil.getLoginUser(); + if(ObjectUtil.isNotNull(loginUser)) { + userName = loginUser.getName(); + } + } catch (Exception ignored) { + } + //异步记录日志 + DevLogUtil.executeExceptionLog(commonLog, userName, joinPoint, exception); + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/core/config/DevConfigure.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/core/config/DevConfigure.java new file mode 100644 index 00000000..798ebfd5 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/core/config/DevConfigure.java @@ -0,0 +1,67 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.core.config; + +import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver; +import io.swagger.annotations.ApiOperation; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.bind.annotation.RequestMethod; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import vip.xiaonuo.common.pojo.CommonResult; + +import javax.annotation.Resource; + +/** + * 开发工具相关配置 + * + * @author xuyuxiang + * @date 2022/7/7 16:18 + **/ +@Configuration +public class DevConfigure { + + @Resource + private OpenApiExtensionResolver openApiExtensionResolver; + + /** + * API文档分组配置 + * + * @author xuyuxiang + * @date 2022/7/7 16:18 + **/ + @Bean(value = "devDocApi") + public Docket devDocApi() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(new ApiInfoBuilder() + .title("开发工具DEV") + .description("开发工具DEV") + .termsOfServiceUrl("https://www.xiaonuo.vip") + .contact(new Contact("SNOWY_TEAM","https://www.xiaonuo.vip", "xuyuxiang29@foxmail.com")) + .version("2.0.0") + .build()) + .globalResponseMessage(RequestMethod.GET, CommonResult.responseList()) + .globalResponseMessage(RequestMethod.POST, CommonResult.responseList()) + .groupName("开发工具DEV") + .select() + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + .apis(RequestHandlerSelectors.basePackage("vip.xiaonuo.dev")) + .paths(PathSelectors.any()) + .build().extensions(openApiExtensionResolver.buildExtensions("开发工具DEV")); + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/core/listener/DevJobListener.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/core/listener/DevJobListener.java new file mode 100644 index 00000000..ba16d4be --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/core/listener/DevJobListener.java @@ -0,0 +1,62 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.core.listener; + +import cn.hutool.cron.CronUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.event.ApplicationStartedEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.timer.CommonTimerTaskRunner; +import vip.xiaonuo.dev.modular.job.entity.DevJob; +import vip.xiaonuo.dev.modular.job.enums.DevJobStatusEnum; +import vip.xiaonuo.dev.modular.job.service.DevJobService; + +/** + * 定时任务监听器,系统启动时将定时任务启动 + * + * @author xuyuxiang + * @date 2022/8/5 16:07 + **/ +@Slf4j +@Configuration +public class DevJobListener implements ApplicationListener, Ordered { + + @SuppressWarnings("ALL") + @Override + public void onApplicationEvent( ApplicationStartedEvent applicationStartedEvent) { + SpringUtil.getBean(DevJobService.class).list(new LambdaQueryWrapper() + .eq(DevJob::getJobStatus, DevJobStatusEnum.RUNNING.getValue()).orderByAsc(DevJob::getSortCode)) + .forEach(devJob -> CronUtil.schedule(devJob.getId(), devJob.getCronExpression(), () -> { + try { + // 运行定时任务 + ((CommonTimerTaskRunner) SpringUtil.getBean(Class.forName(devJob.getActionClass()))).action(); + } catch (ClassNotFoundException e) { + throw new CommonException("定时任务找不到对应的类,名称为:{}", devJob.getActionClass()); + } + })); + // 设置秒级别的启用 + CronUtil.setMatchSecond(true); + // 启动定时器执行器 + CronUtil.restart(); + } + + @Override + public int getOrder() { + return LOWEST_PRECEDENCE; + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/controller/DevConfigController.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/controller/DevConfigController.java new file mode 100644 index 00000000..d8bc086d --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/controller/DevConfigController.java @@ -0,0 +1,168 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.config.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.pojo.CommonValidList; +import vip.xiaonuo.dev.modular.config.entity.DevConfig; +import vip.xiaonuo.dev.modular.config.enums.DevConfigCategoryEnum; +import vip.xiaonuo.dev.modular.config.param.*; +import vip.xiaonuo.dev.modular.config.service.DevConfigService; + +import javax.annotation.Resource; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * 配置控制器 + * + * @author xuyuxiang + * @date 2022/4/22 10:56 + **/ +@Api(tags = "配置控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 1) +@RestController +@Validated +public class DevConfigController { + + @Resource + private DevConfigService devConfigService; + + /** + * 获取配置分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("获取配置分页") + @GetMapping("/dev/config/page") + public CommonResult> page(DevConfigPageParam devConfigPageParam) { + return CommonResult.data(devConfigService.page(devConfigPageParam)); + } + + /** + * 获取系统基础配置 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("获取系统基础配置") + @GetMapping("/dev/config/sysBaseList") + public CommonResult> sysBaseList() { + DevConfigListParam devConfigListParam = new DevConfigListParam(); + devConfigListParam.setCategory(DevConfigCategoryEnum.SYS_BASE.getValue()); + return CommonResult.data(devConfigService.list(devConfigListParam)); + } + + /** + * 获取配置列表 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("获取配置列表") + @GetMapping("/dev/config/list") + public CommonResult> list(DevConfigListParam devConfigListParam) { + return CommonResult.data(devConfigService.list(devConfigListParam)); + } + + /** + * 添加配置 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("添加配置") + @CommonLog("添加配置") + @PostMapping("/dev/config/add") + public CommonResult add(@RequestBody @Valid DevConfigAddParam devConfigAddParam) { + devConfigService.add(devConfigAddParam); + return CommonResult.ok(); + } + + /** + * 编辑配置 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 4) + @ApiOperation("编辑配置") + @CommonLog("编辑配置") + @PostMapping("/dev/config/edit") + public CommonResult edit(@RequestBody @Valid DevConfigEditParam devConfigEditParam) { + devConfigService.edit(devConfigEditParam); + return CommonResult.ok(); + } + + /** + * 删除配置 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 5) + @ApiOperation("删除配置") + @CommonLog("删除配置") + @PostMapping("/dev/config/delete") + public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList devConfigIdParamList) { + devConfigService.delete(devConfigIdParamList); + return CommonResult.ok(); + } + + /** + * 获取配置详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 6) + @ApiOperation("获取配置详情") + @GetMapping("/dev/config/detail") + public CommonResult detail(@Valid DevConfigIdParam devConfigIdParam) { + return CommonResult.data(devConfigService.detail(devConfigIdParam)); + } + + /** + * 配置批量更新 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 7) + @ApiOperation("配置批量更新") + @CommonLog("配置批量更新") + @PostMapping("/dev/config/editBatch") + public CommonResult editBatch(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList devConfigBatchParamList) { + devConfigService.editBatch(devConfigBatchParamList); + return CommonResult.ok(); + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/entity/DevConfig.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/entity/DevConfig.java new file mode 100644 index 00000000..b55bd5b6 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/entity/DevConfig.java @@ -0,0 +1,62 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.config.entity; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import vip.xiaonuo.common.pojo.CommonEntity; + +/** + * 配置实体 + * + * @author xuyuxiang + * @date 2022/2/23 18:27 + **/ +@Getter +@Setter +@TableName("DEV_CONFIG") +public class DevConfig extends CommonEntity { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 配置键 */ + @ApiModelProperty(value = "配置键", position = 2) + private String configKey; + + /** 配置值 */ + @ApiModelProperty(value = "配置值", position = 3) + private String configValue; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 4) + private String category; + + /** 备注 */ + @ApiModelProperty(value = "备注", position = 5) + private String remark; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 6) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 7) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/enums/DevConfigCategoryEnum.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/enums/DevConfigCategoryEnum.java new file mode 100644 index 00000000..6fe203a8 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/enums/DevConfigCategoryEnum.java @@ -0,0 +1,109 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.config.enums; + +import lombok.Getter; +import vip.xiaonuo.common.exception.CommonException; + +/** + * 配置分类枚举 + * + * @author xuyuxiang + * @date 2022/7/6 22:21 + */ +@Getter +public enum DevConfigCategoryEnum { + + /** + * 系统基础 + */ + SYS_BASE("SYS_BASE"), + + /** + * 业务定义 + */ + BIZ_DEFINE("BIZ_DEFINE"), + + /** + * 三方登录-码云 + */ + THIRD_GITEE("THIRD_GITEE"), + + /** + * 三方登录-微信 + */ + THIRD_WECHAT("THIRD_WECHAT"), + + /** + * 文件-本地 + */ + FILE_LOCAL("FILE_LOCAL"), + + /** + * 文件-腾讯云 + */ + FILE_TENCENT("FILE_TENCENT"), + + /** + * 文件-阿里云 + */ + FILE_ALIYUN("FILE_ALIYUN"), + + /** + * 文件-MINIO + */ + FILE_MINIO("FILE_MINIO"), + + /** + * 邮件-本地 + */ + EMAIL_LOCAL("EMAIL_LOCAL"), + + /** + * 邮件-腾讯云 + */ + EMAIL_TENCENT("EMAIL_TENCENT"), + + /** + * 邮件-阿里云 + */ + EMAIL_ALIYUN("EMAIL_ALIYUN"), + + /** + * 短信-腾讯云 + */ + SMS_TENCENT("SMS_TENCENT"), + + /** + * 短信-阿里云 + */ + SMS_ALIYUN("SMS_ALIYUN"); + + private final String value; + + DevConfigCategoryEnum(String value) { + this.value = value; + } + + public static void validate(String value) { + boolean flag = SYS_BASE.getValue().equals(value) || BIZ_DEFINE.getValue().equals(value) || + THIRD_GITEE.getValue().equals(value) || THIRD_WECHAT.getValue().equals(value) || + FILE_LOCAL.getValue().equals(value) || FILE_TENCENT.getValue().equals(value) || + FILE_ALIYUN.getValue().equals(value) || FILE_MINIO.getValue().equals(value) || + EMAIL_TENCENT.getValue().equals(value) || EMAIL_ALIYUN.getValue().equals(value) || + SMS_TENCENT.getValue().equals(value) || SMS_ALIYUN.getValue().equals(value); + if(!flag) { + throw new CommonException("不支持的配置分类:{}", value); + } + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/mapper/DevConfigMapper.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/mapper/DevConfigMapper.java new file mode 100644 index 00000000..ef051a1e --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/mapper/DevConfigMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.config.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.dev.modular.config.entity.DevConfig; + +/** + * 配置Mapper接口 + * + * @author xuyuxiang + * @date 2022/4/22 10:43 + **/ +public interface DevConfigMapper extends BaseMapper { +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/mapper/mapping/DevConfigMapper.xml b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/mapper/mapping/DevConfigMapper.xml new file mode 100644 index 00000000..ba9a3918 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/mapper/mapping/DevConfigMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/param/DevConfigAddParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/param/DevConfigAddParam.java new file mode 100644 index 00000000..470d4bf4 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/param/DevConfigAddParam.java @@ -0,0 +1,54 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.config.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 配置添加参数 + * + * @author xuyuxiang + * @date 2022/7/30 17:53 + */ +@Getter +@Setter +public class DevConfigAddParam { + + /** 配置键 */ + @ApiModelProperty(value = "配置键", required = true, position = 1) + @NotBlank(message = "configKey不能为空") + private String configKey; + + /** 配置值 */ + @ApiModelProperty(value = "配置值", required = true, position = 2) + @NotBlank(message = "configValue不能为空") + private String configValue; + + /** 备注 */ + @ApiModelProperty(value = "备注", position = 3) + private String remark; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", required = true, position = 4) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 5) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/param/DevConfigBatchParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/param/DevConfigBatchParam.java new file mode 100644 index 00000000..f4d8842a --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/param/DevConfigBatchParam.java @@ -0,0 +1,41 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.config.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 配置批量更新参数 + * + * @author xuyuxiang + * @date 2022/7/7 17:01 + **/ +@Getter +@Setter +public class DevConfigBatchParam { + + /** 配置键 */ + @ApiModelProperty(value = "配置键", required = true, position = 1) + @NotBlank(message = "configKey不能为空") + private String configKey; + + /** 配置值 */ + @ApiModelProperty(value = "配置值", required = true, position = 2) + @NotBlank(message = "configValue不能为空") + private String configValue; + +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/param/DevConfigEditParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/param/DevConfigEditParam.java new file mode 100644 index 00000000..9a5665b1 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/param/DevConfigEditParam.java @@ -0,0 +1,59 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.config.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 配置编辑参数 + * + * @author xuyuxiang + * @date 2022/7/30 17:53 + */ +@Getter +@Setter +public class DevConfigEditParam { + + /** id */ + @ApiModelProperty(value = "id", required = true, position = 1) + @NotBlank(message = "id不能为空") + private String id; + + /** 配置键 */ + @ApiModelProperty(value = "配置键", required = true, position = 2) + @NotBlank(message = "configKey不能为空") + private String configKey; + + /** 配置值 */ + @ApiModelProperty(value = "配置值", required = true, position = 3) + @NotBlank(message = "configValue不能为空") + private String configValue; + + /** 备注 */ + @ApiModelProperty(value = "备注", position = 4) + private String remark; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", required = true, position = 5) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 6) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/param/DevConfigIdParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/param/DevConfigIdParam.java new file mode 100644 index 00000000..03de2eb5 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/param/DevConfigIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.config.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 配置Id参数 + * + * @author xuyuxiang + * @date 2022/7/30 17:52 + */ +@Getter +@Setter +public class DevConfigIdParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/param/DevConfigListParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/param/DevConfigListParam.java new file mode 100644 index 00000000..82f9dbaf --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/param/DevConfigListParam.java @@ -0,0 +1,32 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.config.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 配置列表参数 + * + * @author xuyuxiang + * @date 2022/7/30 17:53 + */ +@Getter +@Setter +public class DevConfigListParam { + + /** 配置分类 */ + @ApiModelProperty(value = "配置分类") + private String category; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/param/DevConfigPageParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/param/DevConfigPageParam.java new file mode 100644 index 00000000..9718e4a6 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/param/DevConfigPageParam.java @@ -0,0 +1,48 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.config.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 配置查询参数 + * + * @author xuyuxiang + * @date 2022/7/30 17:53 + */ +@Getter +@Setter +public class DevConfigPageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 配置键关键词 */ + @ApiModelProperty(value = "配置键关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/provider/DevConfigApiProvider.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/provider/DevConfigApiProvider.java new file mode 100644 index 00000000..ebcae0ab --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/provider/DevConfigApiProvider.java @@ -0,0 +1,37 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.config.provider; + +import org.springframework.stereotype.Service; +import vip.xiaonuo.dev.api.DevConfigApi; +import vip.xiaonuo.dev.modular.config.service.DevConfigService; + +import javax.annotation.Resource; + +/** + * 配置API接口实现类 + * + * @author xuyuxiang + * @date 2022/6/17 14:43 + **/ +@Service +public class DevConfigApiProvider implements DevConfigApi { + + @Resource + private DevConfigService devConfigService; + + @Override + public String getValueByKey(String key) { + return devConfigService.getValueByKey(key); + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/service/DevConfigService.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/service/DevConfigService.java new file mode 100644 index 00000000..69ac3079 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/service/DevConfigService.java @@ -0,0 +1,101 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.config.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import vip.xiaonuo.dev.modular.config.entity.DevConfig; +import vip.xiaonuo.dev.modular.config.param.*; + +import java.util.List; + +/** + * 配置Service接口 + * + * @author xuyuxiang + * @date 2022/4/22 10:41 + **/ +public interface DevConfigService extends IService { + + /** + * 根据键获取值 + * + * @author xuyuxiang + * @date 2022/4/22 14:52 + **/ + String getValueByKey(String key); + + /** + * 获取配置分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + Page page(DevConfigPageParam devConfigPageParam); + + /** + * 获取配置列表 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + List list(DevConfigListParam devConfigListParam); + + /** + * 添加配置 + * + * @author xuyuxiang + * @date 2022/4/24 20:48 + */ + void add(DevConfigAddParam devConfigAddParam); + + /** + * 编辑配置 + * + * @author xuyuxiang + * @date 2022/4/24 21:13 + */ + void edit(DevConfigEditParam devConfigEditParam); + + /** + * 删除配置 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + void delete(List devConfigIdParamList); + + /** + * 获取配置详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + DevConfig detail(DevConfigIdParam devConfigIdParam); + + /** + * 获取配置详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + DevConfig queryEntity(String id); + + /** + * 配置批量更新 + * + * @author xuyuxiang + * @date 2022/6/28 11:09 + **/ + void editBatch(List devConfigBatchParamList); +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/service/impl/DevConfigServiceImpl.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/service/impl/DevConfigServiceImpl.java new file mode 100644 index 00000000..9b1fafdc --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/config/service/impl/DevConfigServiceImpl.java @@ -0,0 +1,186 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.config.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import vip.xiaonuo.common.cache.CommonCacheOperator; +import vip.xiaonuo.common.enums.CommonSortOrderEnum; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.dev.modular.config.entity.DevConfig; +import vip.xiaonuo.dev.modular.config.enums.DevConfigCategoryEnum; +import vip.xiaonuo.dev.modular.config.mapper.DevConfigMapper; +import vip.xiaonuo.dev.modular.config.param.*; +import vip.xiaonuo.dev.modular.config.service.DevConfigService; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 配置Service接口实现类 + * + * @author xuyuxiang + * @date 2022/4/22 10:41 + **/ +@Service +public class DevConfigServiceImpl extends ServiceImpl implements DevConfigService { + + private static final String CONFIG_CACHE_KEY = "dev-config:"; + + @Resource + private CommonCacheOperator commonCacheOperator; + + @Override + public String getValueByKey(String key) { + // 从缓存中取 + Object cacheValue = commonCacheOperator.get(CONFIG_CACHE_KEY + key); + if(ObjectUtil.isNotEmpty(cacheValue)) { + return Convert.toStr(cacheValue); + } + DevConfig devConfig = this.getOne(new LambdaQueryWrapper().eq(DevConfig::getConfigKey, key)); + if(ObjectUtil.isNotEmpty(devConfig)) { + // 更新到缓存 + commonCacheOperator.put(CONFIG_CACHE_KEY + key, devConfig.getConfigValue()); + return devConfig.getConfigValue(); + } + return null; + } + + @Override + public Page page(DevConfigPageParam devConfigPageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + // 查询部分字段 + queryWrapper.lambda().select(DevConfig::getId, DevConfig::getConfigKey, DevConfig::getConfigValue, + DevConfig::getCategory, DevConfig::getRemark, DevConfig::getSortCode); + if(ObjectUtil.isNotEmpty(devConfigPageParam.getSearchKey())) { + queryWrapper.lambda().like(DevConfig::getConfigKey, devConfigPageParam.getSearchKey()); + } + if(ObjectUtil.isAllNotEmpty(devConfigPageParam.getSortField(), devConfigPageParam.getSortOrder())) { + CommonSortOrderEnum.validate(devConfigPageParam.getSortOrder()); + queryWrapper.orderBy(true, devConfigPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), + StrUtil.toUnderlineCase(devConfigPageParam.getSortField())); + } else { + queryWrapper.lambda().orderByAsc(DevConfig::getSortCode); + } + queryWrapper.lambda().eq(DevConfig::getCategory, DevConfigCategoryEnum.BIZ_DEFINE.getValue()); + return this.page(CommonPageRequest.defaultPage(), queryWrapper); + } + + @Override + public List list(DevConfigListParam devConfigListParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + // 查询部分字段 + lambdaQueryWrapper.select(DevConfig::getId, DevConfig::getConfigKey, DevConfig::getConfigValue, + DevConfig::getCategory, DevConfig::getSortCode); + if(ObjectUtil.isNotEmpty(devConfigListParam.getCategory())) { + lambdaQueryWrapper.eq(DevConfig::getCategory, devConfigListParam.getCategory()); + } + return this.list(lambdaQueryWrapper); + } + + @Override + public void add(DevConfigAddParam devConfigAddParam) { + checkParam(devConfigAddParam); + DevConfig devConfig = BeanUtil.toBean(devConfigAddParam, DevConfig.class); + devConfig.setCategory(DevConfigCategoryEnum.BIZ_DEFINE.getValue()); + this.save(devConfig); + } + + private void checkParam(DevConfigAddParam devConfigAddParam) { + boolean hasSameConfig = this.count(new LambdaQueryWrapper() + .eq(DevConfig::getConfigKey, devConfigAddParam.getConfigKey())) > 0; + if (hasSameConfig) { + throw new CommonException("存在重复的配置,配置键为:{}", devConfigAddParam.getConfigKey()); + } + } + + @Override + public void edit(DevConfigEditParam devConfigEditParam) { + DevConfig devConfig = this.queryEntity(devConfigEditParam.getId()); + checkParam(devConfigEditParam); + BeanUtil.copyProperties(devConfigEditParam, devConfig); + devConfig.setCategory(DevConfigCategoryEnum.BIZ_DEFINE.getValue()); + this.updateById(devConfig); + // 移除对应的缓存 + commonCacheOperator.remove(CONFIG_CACHE_KEY + devConfig.getConfigKey()); + } + + private void checkParam(DevConfigEditParam devConfigEditParam) { + boolean hasSameConfig = this.count(new LambdaQueryWrapper() + .eq(DevConfig::getConfigKey, devConfigEditParam.getConfigKey()) + .ne(DevConfig::getId, devConfigEditParam.getId())) > 0; + if (hasSameConfig) { + throw new CommonException("存在重复的配置,配置键为:{}", devConfigEditParam.getConfigKey()); + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void delete(List devConfigIdParamList) { + List devConfigIdList = CollStreamUtil.toList(devConfigIdParamList, DevConfigIdParam::getId); + if(ObjectUtil.isNotEmpty(devConfigIdList)) { + List devConfigList = this.listByIds(devConfigIdList); + if(ObjectUtil.isNotEmpty(devConfigList)) { + List devConfigResultList = CollectionUtil.newArrayList(devConfigList.stream() + .map(DevConfig::getCategory).collect(Collectors.toSet())); + if(devConfigResultList.size() != 1 || !devConfigResultList.get(0).equals(DevConfigCategoryEnum.BIZ_DEFINE.getValue())) { + throw new CommonException("不可删除系统内置配置"); + } + devConfigList.forEach(devConfig -> { + // 移除对应的缓存 + commonCacheOperator.remove(CONFIG_CACHE_KEY + devConfig.getConfigValue()); + }); + // 执行删除 + this.removeBatchByIds(devConfigIdList); + } + } + } + + @Override + public DevConfig detail(DevConfigIdParam devConfigIdParam) { + return this.queryEntity(devConfigIdParam.getId()); + } + + @Override + public DevConfig queryEntity(String id) { + DevConfig devConfig = this.getById(id); + if(ObjectUtil.isEmpty(devConfig)) { + throw new CommonException("配置不存在,id值为:{}", id); + } + return devConfig; + } + + @Override + public void editBatch(List devConfigBatchParamList) { + devConfigBatchParamList.forEach(devConfigBatchParam -> { + this.update(new LambdaUpdateWrapper() + .eq(DevConfig::getConfigKey, devConfigBatchParam.getConfigKey()) + .set(DevConfig::getConfigValue, devConfigBatchParam.getConfigValue())); + // 移除对应的缓存 + commonCacheOperator.remove(CONFIG_CACHE_KEY + devConfigBatchParam.getConfigValue()); + }); + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/controller/DevDictController.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/controller/DevDictController.java new file mode 100644 index 00000000..b22e52d1 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/controller/DevDictController.java @@ -0,0 +1,150 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.dict.controller; + +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.pojo.CommonValidList; +import vip.xiaonuo.dev.modular.dict.entity.DevDict; +import vip.xiaonuo.dev.modular.dict.param.*; +import vip.xiaonuo.dev.modular.dict.service.DevDictService; + +import javax.annotation.Resource; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * 字典控制器 + * + * @author xuyuxiang + * @date 2022/6/21 14:58 + **/ +@Api(tags = "字典控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 2) +@RestController +@Validated +public class DevDictController { + + @Resource + private DevDictService devDictService; + + /** + * 获取字典分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("获取字典分页") + @GetMapping("/dev/dict/page") + public CommonResult> page(DevDictPageParam devDictPageParam) { + return CommonResult.data(devDictService.page(devDictPageParam)); + } + + /** + * 获取字典列表 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("获取字典列表") + @GetMapping("/dev/dict/list") + public CommonResult> list(DevDictListParam devDictListParam) { + return CommonResult.data(devDictService.list(devDictListParam)); + } + + /** + * 获取字典树 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("获取字典树") + @GetMapping("/dev/dict/tree") + public CommonResult>> tree(DevDictTreeParam devDictTreeParam) { + return CommonResult.data(devDictService.tree(devDictTreeParam)); + } + + /** + * 添加字典 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 4) + @ApiOperation("添加字典") + @CommonLog("添加字典") + @PostMapping("/dev/dict/add") + public CommonResult add(@RequestBody @Valid DevDictAddParam devDictAddParam) { + devDictService.add(devDictAddParam); + return CommonResult.ok(); + } + + /** + * 编辑字典 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 5) + @ApiOperation("编辑字典") + @CommonLog("编辑字典") + @PostMapping("/dev/dict/edit") + public CommonResult edit(@RequestBody @Valid DevDictEditParam devDictEditParam) { + devDictService.edit(devDictEditParam); + return CommonResult.ok(); + } + + /** + * 删除字典 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 6) + @ApiOperation("删除字典") + @CommonLog("删除字典") + @PostMapping("/dev/dict/delete") + public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList devDictIdParamList) { + devDictService.delete(devDictIdParamList); + return CommonResult.ok(); + } + + /** + * 获取字典详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 7) + @ApiOperation("获取字典详情") + @GetMapping("/dev/dict/detail") + public CommonResult detail(@Valid DevDictIdParam devDictIdParam) { + return CommonResult.data(devDictService.detail(devDictIdParam)); + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/entity/DevDict.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/entity/DevDict.java new file mode 100644 index 00000000..a2858f88 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/entity/DevDict.java @@ -0,0 +1,62 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.dict.entity; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import vip.xiaonuo.common.pojo.CommonEntity; + +/** + * 字典实体 + * + * @author xuyuxiang + * @date 2022/2/23 18:27 + **/ +@Getter +@Setter +@TableName("DEV_DICT") +public class DevDict extends CommonEntity { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 父id */ + @ApiModelProperty(value = "父id", position = 2) + private String parentId; + + /** 字典文字 */ + @ApiModelProperty(value = "字典文字", position = 3) + private String dictLabel; + + /** 字典值 */ + @ApiModelProperty(value = "字典值", position = 4) + private String dictValue; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 5) + private String category; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 6) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 7) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/enums/DevDictCategoryEnum.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/enums/DevDictCategoryEnum.java new file mode 100644 index 00000000..3807ddb7 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/enums/DevDictCategoryEnum.java @@ -0,0 +1,49 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.dict.enums; + +import lombok.Getter; +import vip.xiaonuo.common.exception.CommonException; + +/** + * 字典分类枚举 + * + * @author xuyuxiang + * @date 2022/7/6 22:21 + */ +@Getter +public enum DevDictCategoryEnum { + + /** + * 框架 + */ + FRM("FRM"), + + /** + * 业务 + */ + BIZ("BIZ"); + + private final String value; + + DevDictCategoryEnum(String value) { + this.value = value; + } + + public static void validate(String value) { + boolean flag = FRM.getValue().equals(value) || BIZ.getValue().equals(value); + if(!flag) { + throw new CommonException("不支持的字典分类:{}", value); + } + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/mapper/DevDictMapper.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/mapper/DevDictMapper.java new file mode 100644 index 00000000..f3ed899c --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/mapper/DevDictMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.dict.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.dev.modular.dict.entity.DevDict; + +/** + * 字典Mapper接口 + * + * @author xuyuxiang + * @date 2022/4/22 10:40 + **/ +public interface DevDictMapper extends BaseMapper { +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/mapper/mapping/DevDictMapper.xml b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/mapper/mapping/DevDictMapper.xml new file mode 100644 index 00000000..732eb08b --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/mapper/mapping/DevDictMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/param/DevDictAddParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/param/DevDictAddParam.java new file mode 100644 index 00000000..db1d5ac2 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/param/DevDictAddParam.java @@ -0,0 +1,60 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.dict.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 字典添加参数 + * + * @author xuyuxiang + * @date 2022/7/30 21:48 + */ +@Getter +@Setter +public class DevDictAddParam { + + /** 父id */ + @ApiModelProperty(value = "父id", position = 1) + @NotBlank(message = "parentId不能为空") + private String parentId; + + /** 字典文字 */ + @ApiModelProperty(value = "字典文字", position = 2) + @NotBlank(message = "dictLabel不能为空") + private String dictLabel; + + /** 字典值 */ + @ApiModelProperty(value = "字典值", position = 3) + @NotBlank(message = "dictValue不能为空") + private String dictValue; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 4) + @NotBlank(message = "category不能为空") + private String category; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 5) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 6) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/param/DevDictEditParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/param/DevDictEditParam.java new file mode 100644 index 00000000..ee606fab --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/param/DevDictEditParam.java @@ -0,0 +1,65 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.dict.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 字典编辑参数 + * + * @author xuyuxiang + * @date 2022/7/30 21:48 + */ +@Getter +@Setter +public class DevDictEditParam { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + @NotBlank(message = "id不能为空") + private String id; + + /** 父id */ + @ApiModelProperty(value = "父id", position = 2) + @NotBlank(message = "parentId不能为空") + private String parentId; + + /** 字典文字 */ + @ApiModelProperty(value = "字典文字", position = 3) + @NotBlank(message = "dictLabel不能为空") + private String dictLabel; + + /** 字典值 */ + @ApiModelProperty(value = "字典值", position = 4) + @NotBlank(message = "dictValue不能为空") + private String dictValue; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 5) + @NotBlank(message = "category不能为空") + private String category; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 6) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 7) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/param/DevDictIdParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/param/DevDictIdParam.java new file mode 100644 index 00000000..c2567a5c --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/param/DevDictIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.dict.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 字典Id参数 + * + * @author xuyuxiang + * @date 2022/7/30 21:48 + */ +@Getter +@Setter +public class DevDictIdParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/param/DevDictListParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/param/DevDictListParam.java new file mode 100644 index 00000000..66996c1b --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/param/DevDictListParam.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.dict.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 字典列表参数 + * + * @author xuyuxiang + * @date 2022/7/30 21:49 + */ +@Getter +@Setter +public class DevDictListParam { + + /** 父id */ + @ApiModelProperty(value = "父id") + private String parentId; + + /** 字典分类 */ + @ApiModelProperty(value = "字典分类") + private String category; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/param/DevDictPageParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/param/DevDictPageParam.java new file mode 100644 index 00000000..30e2cdcc --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/param/DevDictPageParam.java @@ -0,0 +1,56 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.dict.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 字典查询参数 + * + * @author xuyuxiang + * @date 2022/7/30 21:49 + */ +@Getter +@Setter +public class DevDictPageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 父id */ + @ApiModelProperty(value = "父id") + private String parentId; + + /** 字典分类 */ + @ApiModelProperty(value = "字典分类") + private String category; + + /** 字典文字关键词 */ + @ApiModelProperty(value = "字典文字关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/param/DevDictTreeParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/param/DevDictTreeParam.java new file mode 100644 index 00000000..8ea7c4f0 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/param/DevDictTreeParam.java @@ -0,0 +1,32 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.dict.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 字典树参数 + * + * @author xuyuxiang + * @date 2022/7/30 21:49 + */ +@Getter +@Setter +public class DevDictTreeParam { + + /** 字典分类 */ + @ApiModelProperty(value = "字典分类") + private String category; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/provider/DevDictApiProvider.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/provider/DevDictApiProvider.java new file mode 100644 index 00000000..e9a5df0d --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/provider/DevDictApiProvider.java @@ -0,0 +1,26 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.dict.provider; + +import org.springframework.stereotype.Service; +import vip.xiaonuo.dev.api.DevDictApi; + +/** + * 字典API接口实现类 + * + * @author xuyuxiang + * @date 2022/9/2 16:05 + */ +@Service +public class DevDictApiProvider implements DevDictApi { +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/service/DevDictService.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/service/DevDictService.java new file mode 100644 index 00000000..c45ca38e --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/service/DevDictService.java @@ -0,0 +1,94 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.dict.service; + +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import vip.xiaonuo.dev.modular.dict.entity.DevDict; +import vip.xiaonuo.dev.modular.dict.param.*; + +import java.util.List; + +/** + * 字典Service接口 + * + * @author xuyuxiang + * @date 2022/4/22 10:41 + **/ +public interface DevDictService extends IService { + + /** + * 获取字典分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + Page page(DevDictPageParam devDictPageParam); + + /** + * 获取字典列表 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + List list(DevDictListParam devDictListParam); + + /** + * 获取字典树 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + List> tree(DevDictTreeParam devDictTreeParam); + + /** + * 添加字典 + * + * @author xuyuxiang + * @date 2022/4/24 20:48 + */ + void add(DevDictAddParam devDictAddParam); + + /** + * 编辑字典 + * + * @author xuyuxiang + * @date 2022/4/24 21:13 + */ + void edit(DevDictEditParam devDictEditParam); + + /** + * 删除字典 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + void delete(List devDictIdParamList); + + /** + * 获取字典详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + DevDict detail(DevDictIdParam devDictIdParam); + + /** + * 获取字典详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + DevDict queryEntity(String id); +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/service/impl/DevDictServiceImpl.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/service/impl/DevDictServiceImpl.java new file mode 100644 index 00000000..944795d2 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/dict/service/impl/DevDictServiceImpl.java @@ -0,0 +1,181 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.dict.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNode; +import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import vip.xiaonuo.common.enums.CommonSortOrderEnum; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.dev.modular.dict.entity.DevDict; +import vip.xiaonuo.dev.modular.dict.enums.DevDictCategoryEnum; +import vip.xiaonuo.dev.modular.dict.mapper.DevDictMapper; +import vip.xiaonuo.dev.modular.dict.param.*; +import vip.xiaonuo.dev.modular.dict.service.DevDictService; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 字典Service接口实现类 + * + * @author xuyuxiang + * @date 2022/4/22 10:41 + **/ +@Service +public class DevDictServiceImpl extends ServiceImpl implements DevDictService { + + @Override + public Page page(DevDictPageParam devDictPageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + // 查询部分字段 + queryWrapper.lambda().select(DevDict::getId, DevDict::getParentId, DevDict::getCategory, DevDict::getDictLabel, + DevDict::getDictValue, DevDict::getSortCode); + if(ObjectUtil.isNotEmpty(devDictPageParam.getParentId())) { + queryWrapper.lambda().eq(DevDict::getParentId, devDictPageParam.getParentId()); + } + if(ObjectUtil.isNotEmpty(devDictPageParam.getCategory())) { + queryWrapper.lambda().eq(DevDict::getCategory, devDictPageParam.getCategory()); + } + if(ObjectUtil.isNotEmpty(devDictPageParam.getSearchKey())) { + queryWrapper.lambda().like(DevDict::getDictLabel, devDictPageParam.getSearchKey()); + } + if(ObjectUtil.isAllNotEmpty(devDictPageParam.getSortField(), devDictPageParam.getSortOrder())) { + CommonSortOrderEnum.validate(devDictPageParam.getSortOrder()); + queryWrapper.orderBy(true, devDictPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), + StrUtil.toUnderlineCase(devDictPageParam.getSortField())); + } else { + queryWrapper.lambda().orderByAsc(DevDict::getSortCode); + } + return this.page(CommonPageRequest.defaultPage(), queryWrapper); + } + + @Override + public List list(DevDictListParam devDictListParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + if(ObjectUtil.isNotEmpty(devDictListParam.getParentId())) { + lambdaQueryWrapper.eq(DevDict::getParentId, devDictListParam.getParentId()); + } + if(ObjectUtil.isNotEmpty(devDictListParam.getCategory())) { + lambdaQueryWrapper.eq(DevDict::getCategory, devDictListParam.getCategory()); + } + return this.list(lambdaQueryWrapper); + } + + @Override + public List> tree(DevDictTreeParam devDictTreeParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.orderByAsc(DevDict::getSortCode); + if(ObjectUtil.isNotEmpty(devDictTreeParam.getCategory())) { + lambdaQueryWrapper.eq(DevDict::getCategory, devDictTreeParam.getCategory()); + } + List devDictList = this.list(lambdaQueryWrapper); + List> treeNodeList = devDictList.stream().map(devDict -> + new TreeNode<>(devDict.getId(), devDict.getParentId(), + devDict.getDictLabel(), devDict.getSortCode()).setExtra(JSONUtil.parseObj(devDict))) + .collect(Collectors.toList()); + return TreeUtil.build(treeNodeList, "0"); + } + + @Override + public void add(DevDictAddParam devDictAddParam) { + checkParam(devDictAddParam); + DevDict devDict = BeanUtil.toBean(devDictAddParam, DevDict.class); + this.save(devDict); + } + + private void checkParam(DevDictAddParam devDictAddParam) { + DevDictCategoryEnum.validate(devDictAddParam.getCategory()); + boolean hasSameDictLabel = this.count(new LambdaQueryWrapper() + .eq(DevDict::getParentId, devDictAddParam.getParentId()) + .eq(DevDict::getCategory, devDictAddParam.getCategory()) + .eq(DevDict::getDictLabel, devDictAddParam.getDictLabel())) > 0; + if (hasSameDictLabel) { + throw new CommonException("存在重复的字典文字,名称为:{}", devDictAddParam.getDictLabel()); + } + + boolean hasSameDictValue = this.count(new LambdaQueryWrapper() + .eq(DevDict::getParentId, devDictAddParam.getParentId()) + .eq(DevDict::getDictValue, devDictAddParam.getDictValue())) > 0; + if (hasSameDictValue) { + throw new CommonException("存在重复的字典值,名称为:{}", devDictAddParam.getDictValue()); + } + } + + @Override + public void edit(DevDictEditParam devDictEditParam) { + DevDict devDict = this.queryEntity(devDictEditParam.getId()); + checkParam(devDictEditParam); + BeanUtil.copyProperties(devDictEditParam, devDict); + this.updateById(devDict); + } + + private void checkParam(DevDictEditParam devDictEditParam) { + DevDictCategoryEnum.validate(devDictEditParam.getCategory()); + boolean hasSameDictLabel = this.count(new LambdaQueryWrapper() + .eq(DevDict::getParentId, devDictEditParam.getParentId()) + .eq(DevDict::getCategory, devDictEditParam.getCategory()) + .eq(DevDict::getDictLabel, devDictEditParam.getDictLabel()) + .ne(DevDict::getId, devDictEditParam.getId())) > 0; + if (hasSameDictLabel) { + throw new CommonException("存在重复的字典文字,名称为:{}", devDictEditParam.getDictLabel()); + } + + boolean hasSameDictValue = this.count(new LambdaQueryWrapper() + .eq(DevDict::getParentId, devDictEditParam.getParentId()) + .eq(DevDict::getDictValue, devDictEditParam.getDictValue()) + .ne(DevDict::getId, devDictEditParam.getId())) > 0; + if (hasSameDictValue) { + throw new CommonException("存在重复的字典值,名称为:{}", devDictEditParam.getDictValue()); + } + } + + @Override + public void delete(List devDictIdParamList) { + List devDictIdList = CollStreamUtil.toList(devDictIdParamList, DevDictIdParam::getId); + if(ObjectUtil.isNotEmpty(devDictIdList)) { + boolean systemDict = this.listByIds(devDictIdList).stream().map(DevDict::getCategory) + .collect(Collectors.toSet()).contains(DevDictCategoryEnum.FRM.getValue()); + if(systemDict) { + throw new CommonException("不可删除系统内置字典"); + } + // 删除 + this.removeBatchByIds(devDictIdList); + } + } + + @Override + public DevDict detail(DevDictIdParam devDictIdParam) { + return this.queryEntity(devDictIdParam.getId()); + } + + @Override + public DevDict queryEntity(String id) { + DevDict devDict = this.getById(id); + if(ObjectUtil.isEmpty(devDict)) { + throw new CommonException("字典不存在,id值为:{}", id); + } + return devDict; + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/controller/DevEmailController.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/controller/DevEmailController.java new file mode 100644 index 00000000..05982dfa --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/controller/DevEmailController.java @@ -0,0 +1,212 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.email.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.pojo.CommonValidList; +import vip.xiaonuo.dev.modular.email.entity.DevEmail; +import vip.xiaonuo.dev.modular.email.param.*; +import vip.xiaonuo.dev.modular.email.service.DevEmailService; + +import javax.annotation.Resource; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; + +/** + * 邮件控制器 + * + * @author xuyuxiang + * @date 2022/2/23 18:26 + **/ +@Api(tags = "邮件控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 3) +@RestController +@Validated +public class DevEmailController { + + @Resource + private DevEmailService devEmailService; + + /** + * 发送邮件——本地TXT + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("发送本地文本邮件") + @CommonLog("发送本地文本邮件") + @PostMapping("/dev/email/sendLocalTxt") + public CommonResult sendLocal(@RequestBody @Valid DevEmailSendLocalTxtParam devEmailSendLocalTxtParam) { + devEmailService.sendLocal(devEmailSendLocalTxtParam); + return CommonResult.ok(); + } + + /** + * 发送邮件——本地HTML + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("发送本地HTML邮件") + @CommonLog("发送本地HTML邮件") + @PostMapping("/dev/email/sendLocalHtml") + public CommonResult sendLocal(@RequestBody @Valid DevEmailSendLocalHtmlParam devEmailSendLocalHtmlParam) { + devEmailService.sendLocal(devEmailSendLocalHtmlParam); + return CommonResult.ok(); + } + + /** + * 发送邮件——阿里云TXT + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("发送阿里云文本邮件") + @CommonLog("发送阿里云文本邮件") + @PostMapping("/dev/email/sendAliyunTxt") + public CommonResult sendAliyun(@RequestBody @Valid DevEmailSendAliyunTxtParam devEmailSendAliyunTxtParam) { + devEmailService.sendAliyun(devEmailSendAliyunTxtParam); + return CommonResult.ok(); + } + + /** + * 发送邮件——阿里云HTML + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 4) + @ApiOperation("发送阿里云HTML邮件") + @CommonLog("发送阿里云HTML邮件") + @PostMapping("/dev/email/sendAliyunHtml") + public CommonResult sendAliyun(@RequestBody @Valid DevEmailSendAliyunHtmlParam devEmailSendAliyunHtmlParam) { + devEmailService.sendAliyun(devEmailSendAliyunHtmlParam); + return CommonResult.ok(); + } + + /** + * 发送邮件——阿里云TMP + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 5) + @ApiOperation("发送阿里云模板邮件") + @CommonLog("发送阿里云模板邮件") + @PostMapping("/dev/email/sendAliyunTmp") + public CommonResult sendAliyun(@RequestBody @Valid DevEmailSendAliyunTmpParam devEmailSendAliyunTmpParam) { + devEmailService.sendAliyun(devEmailSendAliyunTmpParam); + return CommonResult.ok(); + } + + /** + * 发送邮件——腾讯云TXT + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 6) + @ApiOperation("发送腾讯云文本邮件") + @CommonLog("发送腾讯云文本邮件") + @PostMapping("/dev/email/sendTencentTxt") + public CommonResult sendTencent(@RequestBody @Valid DevEmailSendTencentTxtParam devEmailSendTencentTxtParam) { + devEmailService.sendTencent(devEmailSendTencentTxtParam); + return CommonResult.ok(); + } + + /** + * 发送邮件——腾讯云HTML + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 7) + @ApiOperation("发送腾讯云HTML邮件") + @CommonLog("发送腾讯云HTML邮件") + @PostMapping("/dev/email/sentTencentHtml") + public CommonResult sendTencent(@RequestBody @Valid DevEmailSendTencentHtmlParam devEmailSendTencentHtmlParam) { + devEmailService.sendTencent(devEmailSendTencentHtmlParam); + return CommonResult.ok(); + } + + /** + * 发送邮件——腾讯云TMP + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 8) + @ApiOperation("发送腾讯云模板邮件") + @CommonLog("发送腾讯云模板邮件") + @PostMapping("/dev/email/sentTencentTmp") + public CommonResult sendTencent(@RequestBody @Valid DevEmailSendTencentTmpParam devEmailSendTencentTmpParam) { + devEmailService.sendTencent(devEmailSendTencentTmpParam); + return CommonResult.ok(); + } + + /** + * 获取邮件分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 9) + @ApiOperation("获取邮件分页") + @GetMapping("/dev/email/page") + public CommonResult> page(DevEmailPageParam devEmailPageParam) { + return CommonResult.data(devEmailService.page(devEmailPageParam)); + } + + /** + * 删除邮件 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 10) + @ApiOperation("删除邮件") + @CommonLog("删除邮件") + @PostMapping("/dev/email/delete") + public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList devEmailIdParamList) { + devEmailService.delete(devEmailIdParamList); + return CommonResult.ok(); + } + + /** + * 获取邮件详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 11) + @ApiOperation("获取邮件详情") + @GetMapping("/dev/email/detail") + public CommonResult detail(@Valid DevEmailIdParam devEmailIdParam) { + return CommonResult.data(devEmailService.detail(devEmailIdParam)); + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/entity/DevEmail.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/entity/DevEmail.java new file mode 100644 index 00000000..34a0b9fd --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/entity/DevEmail.java @@ -0,0 +1,79 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.email.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import vip.xiaonuo.common.pojo.CommonEntity; + +/** + * 邮件实体 + * + * @author xuyuxiang + * @date 2022/2/23 18:27 + **/ +@Getter +@Setter +@TableName("DEV_EMAIL") +public class DevEmail extends CommonEntity { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 邮件引擎 */ + @ApiModelProperty(value = "邮件引擎", position = 2) + private String engine; + + /** 发件人邮箱 */ + @ApiModelProperty(value = "发件人邮箱", position = 3) + private String sendAccount; + + /** 发件人昵称 */ + @ApiModelProperty(value = "发件人昵称", position = 4) + private String sendUser; + + /** 接收人 */ + @ApiModelProperty(value = "接收人", position = 5) + private String receiveAccounts; + + /** 邮件主题 */ + @ApiModelProperty(value = "邮件主题", position = 6) + private String subject; + + /** 邮件正文 */ + @ApiModelProperty(value = "邮件正文", position = 7) + private String content; + + /** 标签名 */ + @ApiModelProperty(value = "标签名", position = 8) + private String tagName; + + /** 模板名 */ + @ApiModelProperty(value = "模板名", position = 9) + private String templateName; + + /** 发送参数 */ + @ApiModelProperty(value = "发送参数", position = 10) + private String templateParam; + + /** 回执信息 */ + @ApiModelProperty(value = "回执信息", position = 11) + private String receiptInfo; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 12) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/enums/DevEmailEngineTypeEnum.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/enums/DevEmailEngineTypeEnum.java new file mode 100644 index 00000000..7f72d76e --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/enums/DevEmailEngineTypeEnum.java @@ -0,0 +1,40 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.email.enums; + +import lombok.Getter; + +/** + * 邮件发送引擎类型枚举 + * + * @author xuyuxiang + * @date 2022/6/16 16:14 + **/ +@Getter +public enum DevEmailEngineTypeEnum { + + /** 本地 */ + LOCAL("LOCAL"), + + /** 阿里云 */ + ALIYUN("ALIYUN"), + + /** 腾讯云 */ + TENCENT("TENCENT"); + + private final String value; + + DevEmailEngineTypeEnum(String value) { + this.value = value; + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/enums/DevEmailTypeEnum.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/enums/DevEmailTypeEnum.java new file mode 100644 index 00000000..e364f066 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/enums/DevEmailTypeEnum.java @@ -0,0 +1,40 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.email.enums; + +import lombok.Getter; + +/** + * 邮件类型枚举 + * + * @author xuyuxiang + * @date 2022/6/16 16:14 + **/ +@Getter +public enum DevEmailTypeEnum { + + /** 纯文本 */ + TEXT("TEXT"), + + /** 富文本 */ + HTML("HTML"), + + /** 模板 */ + TEMPLATE("TEMPLATE"); + + private final String value; + + DevEmailTypeEnum(String value) { + this.value = value; + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/mapper/DevEmailMapper.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/mapper/DevEmailMapper.java new file mode 100644 index 00000000..f4795178 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/mapper/DevEmailMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.email.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.dev.modular.email.entity.DevEmail; + +/** + * 邮件Mapper接口 + * + * @author xuyuxiang + * @date 2022/2/23 18:40 + **/ +public interface DevEmailMapper extends BaseMapper { +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/mapper/mapping/DevEmailMapper.xml b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/mapper/mapping/DevEmailMapper.xml new file mode 100644 index 00000000..2b4dd01e --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/mapper/mapping/DevEmailMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailIdParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailIdParam.java new file mode 100644 index 00000000..7b2e3481 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.email.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 邮件Id参数 + * + * @author xuyuxiang + * @date 2022/6/21 15:38 + **/ +@Getter +@Setter +public class DevEmailIdParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailPageParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailPageParam.java new file mode 100644 index 00000000..f26934e4 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailPageParam.java @@ -0,0 +1,52 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.email.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 邮件查询参数 + * + * @author xuyuxiang + * @date 2022/6/21 15:38 + **/ +@Getter +@Setter +public class DevEmailPageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 邮件引擎 */ + @ApiModelProperty(value = "邮件引擎") + private String engine; + + /** 邮件主题关键词 */ + @ApiModelProperty(value = "邮件主题关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendAliyunHtmlParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendAliyunHtmlParam.java new file mode 100644 index 00000000..ae525828 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendAliyunHtmlParam.java @@ -0,0 +1,54 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.email.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 邮件发送——阿里云HTML参数 + * + * @author xuyuxiang + * @date 2022/6/21 15:38 + **/ +@Getter +@Setter +public class DevEmailSendAliyunHtmlParam { + + /** 发件人邮箱 */ + @ApiModelProperty(value = "发件人邮箱,即管理控制台中配置的发信地址", required = true, position = 1) + @NotBlank(message = "sendAccount不能为空") + private String sendAccount; + + /** 接收人 */ + @ApiModelProperty(value = "接收人邮箱地址,多个逗号拼接", required = true, position = 2) + @NotBlank(message = "receiveAccounts不能为空") + private String receiveAccounts; + + /** 邮件主题 */ + @ApiModelProperty(value = "邮件主题", required = true, position = 3) + @NotBlank(message = "subject不能为空") + private String subject; + + /** 邮件正文 */ + @ApiModelProperty(value = "邮件正文", required = true, position = 4) + @NotBlank(message = "content不能为空") + private String content; + + /** 发件人昵称 */ + @ApiModelProperty(value = "发件人昵称", position = 5) + private String sendUser; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendAliyunTmpParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendAliyunTmpParam.java new file mode 100644 index 00000000..7a224b3d --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendAliyunTmpParam.java @@ -0,0 +1,49 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.email.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 邮件发送——阿里云TMP参数 + * + * @author xuyuxiang + * @date 2022/6/21 15:38 + **/ +@Getter +@Setter +public class DevEmailSendAliyunTmpParam { + + /** 发件人邮箱 */ + @ApiModelProperty(value = "管理控制台中配置的发信地址", required = true, position = 1) + @NotBlank(message = "sendAccount不能为空") + private String sendAccount; + + /** 接收人 */ + @ApiModelProperty(value = "预先创建且上传了收件人的收件人列表名称", required = true, position = 2) + @NotBlank(message = "receiveAccounts不能为空") + private String receiveAccounts; + + /** 模板名 */ + @ApiModelProperty(value = "预先创建且通过审核的模板名称", required = true, position = 4) + @NotBlank(message = "templateName不能为空") + private String templateName; + + /** 标签名 */ + @ApiModelProperty(value = "标签名", position = 5) + private String tagName; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendAliyunTxtParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendAliyunTxtParam.java new file mode 100644 index 00000000..5f139cc9 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendAliyunTxtParam.java @@ -0,0 +1,54 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.email.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 邮件发送——阿里云TXT参数 + * + * @author xuyuxiang + * @date 2022/6/21 15:38 + **/ +@Getter +@Setter +public class DevEmailSendAliyunTxtParam { + + /** 发件人邮箱 */ + @ApiModelProperty(value = "发件人邮箱,即管理控制台中配置的发信地址", required = true, position = 1) + @NotBlank(message = "sendAccount不能为空") + private String sendAccount; + + /** 接收人 */ + @ApiModelProperty(value = "接收人邮箱地址,多个逗号拼接", required = true, position = 2) + @NotBlank(message = "receiveAccounts不能为空") + private String receiveAccounts; + + /** 邮件主题 */ + @ApiModelProperty(value = "邮件主题", required = true, position = 3) + @NotBlank(message = "subject不能为空") + private String subject; + + /** 邮件正文 */ + @ApiModelProperty(value = "邮件正文", required = true, position = 4) + @NotBlank(message = "content不能为空") + private String content; + + /** 发件人昵称 */ + @ApiModelProperty(value = "发件人昵称", position = 5) + private String sendUser; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendLocalHtmlParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendLocalHtmlParam.java new file mode 100644 index 00000000..c7f5627f --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendLocalHtmlParam.java @@ -0,0 +1,59 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.email.param; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.map.MapUtil; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import java.io.File; +import java.io.InputStream; +import java.util.List; +import java.util.Map; + +/** + * 邮件发送——本地HTML参数 + * + * @author xuyuxiang + * @date 2022/6/21 15:38 + **/ +@Getter +@Setter +public class DevEmailSendLocalHtmlParam { + + /** 接收人 */ + @ApiModelProperty(value = "接收人邮箱地址,多个逗号拼接", required = true, position = 1) + @NotBlank(message = "receiveAccounts不能为空") + private String receiveAccounts; + + /** 邮件主题 */ + @ApiModelProperty(value = "邮件主题", required = true, position = 2) + @NotBlank(message = "subject不能为空") + private String subject; + + /** 邮件正文 */ + @ApiModelProperty(value = "邮件正文", required = true, position = 3) + @NotBlank(message = "content不能为空") + private String content; + + /** 图片展位符 */ + @ApiModelProperty(value = "图片展位符", position = 4, hidden = true) + private Map imageMap = MapUtil.newHashMap(); + + /** 附件列表 */ + @ApiModelProperty(value = "附件列表", position = 5, hidden = true) + private List files = CollectionUtil.newArrayList(); +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendLocalTxtParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendLocalTxtParam.java new file mode 100644 index 00000000..c81110ce --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendLocalTxtParam.java @@ -0,0 +1,52 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.email.param; + +import cn.hutool.core.collection.CollectionUtil; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import java.io.File; +import java.util.List; + +/** + * 邮件发送——本地TXT参数 + * + * @author xuyuxiang + * @date 2022/6/21 15:38 + **/ +@Getter +@Setter +public class DevEmailSendLocalTxtParam { + + /** 接收人 */ + @ApiModelProperty(value = "接收人邮箱地址,多个逗号拼接", required = true, position = 1) + @NotBlank(message = "receiveAccounts不能为空") + private String receiveAccounts; + + /** 邮件主题 */ + @ApiModelProperty(value = "邮件主题", required = true, position = 2) + @NotBlank(message = "subject不能为空") + private String subject; + + /** 邮件正文 */ + @ApiModelProperty(value = "邮件正文", required = true, position = 3) + @NotBlank(message = "content不能为空") + private String content; + + /** 附件列表 */ + @ApiModelProperty(value = "附件列表", position = 4, hidden = true) + private List files = CollectionUtil.newArrayList(); +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendTencentHtmlParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendTencentHtmlParam.java new file mode 100644 index 00000000..f2f9909c --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendTencentHtmlParam.java @@ -0,0 +1,61 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.email.param; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.json.JSONObject; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * 邮件发送——腾讯云HTML参数 + * + * @author xuyuxiang + * @date 2022/6/21 15:38 + **/ +@Getter +@Setter +public class DevEmailSendTencentHtmlParam { + + /** 发件人邮箱 */ + @ApiModelProperty(value = "管理控制台中配置的发信地址", required = true, position = 1) + @NotBlank(message = "sendAccount不能为空") + private String sendAccount; + + /** 接收人 */ + @ApiModelProperty(value = "接收人邮箱地址,多个逗号拼接", required = true, position = 2) + @NotBlank(message = "receiveAccounts不能为空") + private String receiveAccounts; + + /** 邮件主题 */ + @ApiModelProperty(value = "邮件主题", required = true, position = 3) + @NotBlank(message = "subject不能为空") + private String subject; + + /** 邮件正文 */ + @ApiModelProperty(value = "邮件正文", required = true, position = 4) + @NotBlank(message = "content不能为空") + private String content; + + /** 发件人昵称 */ + @ApiModelProperty(value = "发件人昵称", position = 5) + private String sendUser; + + /** 附件列表 */ + @ApiModelProperty(value = "附件列表", position = 6, hidden = true) + List attachmentList = CollectionUtil.newArrayList(); +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendTencentTmpParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendTencentTmpParam.java new file mode 100644 index 00000000..d37aea28 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendTencentTmpParam.java @@ -0,0 +1,65 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.email.param; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.json.JSONObject; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * 邮件发送——腾讯云TMP参数 + * + * @author xuyuxiang + * @date 2022/6/21 15:38 + **/ +@Getter +@Setter +public class DevEmailSendTencentTmpParam { + + /** 发件人邮箱 */ + @ApiModelProperty(value = "管理控制台中配置的发信地址", required = true, position = 1) + @NotBlank(message = "sendAccount不能为空") + private String sendAccount; + + /** 接收人 */ + @ApiModelProperty(value = "预先创建且上传了收件人的收件人列表id", required = true, position = 2) + @NotBlank(message = "receiveAccounts不能为空") + private String receiveAccounts; + + /** 模板名 */ + @ApiModelProperty(value = "预先创建且通过审核的模板Id", required = true, position = 3) + @NotBlank(message = "templateName不能为空") + private String templateName; + + /** 邮件主题 */ + @ApiModelProperty(value = "邮件主题", required = true, position = 4) + @NotBlank(message = "subject不能为空") + private String subject; + + /** 发件人昵称 */ + @ApiModelProperty(value = "发件人昵称", position = 5) + private String sendUser; + + /** 发送参数 */ + @ApiModelProperty(value = "预先创建且通过审核的模板的参数json", position = 6) + private String templateParam; + + /** 附件列表 */ + @ApiModelProperty(value = "附件列表", position = 7, hidden = true) + List attachmentList = CollectionUtil.newArrayList(); +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendTencentTxtParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendTencentTxtParam.java new file mode 100644 index 00000000..46e7d977 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/param/DevEmailSendTencentTxtParam.java @@ -0,0 +1,61 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.email.param; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.json.JSONObject; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * 邮件发送——腾讯云TXT参数 + * + * @author xuyuxiang + * @date 2022/6/21 15:38 + **/ +@Getter +@Setter +public class DevEmailSendTencentTxtParam { + + /** 发件人邮箱 */ + @ApiModelProperty(value = "管理控制台中配置的发信地址", required = true, position = 1) + @NotBlank(message = "sendAccount不能为空") + private String sendAccount; + + /** 接收人 */ + @ApiModelProperty(value = "接收人邮箱地址,多个逗号拼接", required = true, position = 2) + @NotBlank(message = "receiveAccounts不能为空") + private String receiveAccounts; + + /** 邮件主题 */ + @ApiModelProperty(value = "邮件主题", required = true, position = 3) + @NotBlank(message = "subject不能为空") + private String subject; + + /** 邮件正文 */ + @ApiModelProperty(value = "邮件正文", required = true, position = 4) + @NotBlank(message = "content不能为空") + private String content; + + /** 发件人昵称 */ + @ApiModelProperty(value = "发件人昵称", position = 5) + private String sendUser; + + /** 附件列表 */ + @ApiModelProperty(value = "附件列表", position = 6, hidden = true) + List attachmentList = CollectionUtil.newArrayList(); +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/provider/DevEmailApiProvider.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/provider/DevEmailApiProvider.java new file mode 100644 index 00000000..594ff4cf --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/provider/DevEmailApiProvider.java @@ -0,0 +1,125 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.email.provider; + +import cn.hutool.json.JSONObject; +import org.springframework.stereotype.Service; +import vip.xiaonuo.dev.api.DevEmailApi; +import vip.xiaonuo.dev.modular.email.param.*; +import vip.xiaonuo.dev.modular.email.service.DevEmailService; + +import javax.annotation.Resource; +import java.io.File; +import java.io.InputStream; +import java.util.List; +import java.util.Map; + +/** + * 邮件API接口提供者 + * + * @author xuyuxiang + * @date 2022/6/22 15:32 + **/ +@Service +public class DevEmailApiProvider implements DevEmailApi { + + @Resource + private DevEmailService devEmailService; + + @Override + public void sendTextEmailLocal(String tos, String subject, String content, List files) { + DevEmailSendLocalTxtParam devEmailSendLocalTxtParam = new DevEmailSendLocalTxtParam(); + devEmailSendLocalTxtParam.setReceiveAccounts(tos); + devEmailSendLocalTxtParam.setSubject(subject); + devEmailSendLocalTxtParam.setContent(content); + devEmailSendLocalTxtParam.setFiles(files); + devEmailService.sendLocal(devEmailSendLocalTxtParam); + } + + @Override + public void sendHtmlEmailLocal(String tos, String subject, String content, Map imageMap, List files) { + DevEmailSendLocalHtmlParam devEmailSendLocalHtmlParam = new DevEmailSendLocalHtmlParam(); + devEmailSendLocalHtmlParam.setReceiveAccounts(tos); + devEmailSendLocalHtmlParam.setSubject(subject); + devEmailSendLocalHtmlParam.setContent(content); + devEmailSendLocalHtmlParam.setImageMap(imageMap); + devEmailSendLocalHtmlParam.setFiles(files); + devEmailService.sendLocal(devEmailSendLocalHtmlParam); + } + + @Override + public void sendTextEmailAliyun(String from, String user, String tos, String subject, String content) { + DevEmailSendAliyunTxtParam devEmailSendAliyunTxtParam = new DevEmailSendAliyunTxtParam(); + devEmailSendAliyunTxtParam.setSendAccount(from); + devEmailSendAliyunTxtParam.setSendUser(user); + devEmailSendAliyunTxtParam.setReceiveAccounts(tos); + devEmailSendAliyunTxtParam.setSubject(subject); + devEmailSendAliyunTxtParam.setContent(content); + devEmailService.sendAliyun(devEmailSendAliyunTxtParam); + } + + @Override + public void sendHtmlEmailAliyun(String from, String user, String tos, String subject, String content) { + DevEmailSendAliyunHtmlParam devEmailSendAliyunHtmlParam = new DevEmailSendAliyunHtmlParam(); + devEmailSendAliyunHtmlParam.setSendAccount(from); + devEmailSendAliyunHtmlParam.setSendUser(user); + devEmailSendAliyunHtmlParam.setReceiveAccounts(tos); + devEmailSendAliyunHtmlParam.setSubject(subject); + devEmailSendAliyunHtmlParam.setContent(content); + devEmailService.sendAliyun(devEmailSendAliyunHtmlParam); + } + + @Override + public void sendEmailWithTemplateAliyun(String from, String tagName, String toName, String templateName) { + DevEmailSendAliyunTmpParam devEmailSendAliyunTmpParam = new DevEmailSendAliyunTmpParam(); + devEmailSendAliyunTmpParam.setReceiveAccounts(toName); + devEmailSendAliyunTmpParam.setTagName(tagName); + devEmailSendAliyunTmpParam.setTemplateName(templateName); + devEmailService.sendAliyun(devEmailSendAliyunTmpParam); + } + + @Override + public void sendTextEmailTencent(String from, String user, String tos, String subject, String content, List attachmentList) { + DevEmailSendTencentTxtParam devEmailSendTencentTxtParam = new DevEmailSendTencentTxtParam(); + devEmailSendTencentTxtParam.setSendAccount(from); + devEmailSendTencentTxtParam.setSendUser(user); + devEmailSendTencentTxtParam.setReceiveAccounts(tos); + devEmailSendTencentTxtParam.setSubject(subject); + devEmailSendTencentTxtParam.setContent(content); + devEmailSendTencentTxtParam.setAttachmentList(attachmentList); + devEmailService.sendTencent(devEmailSendTencentTxtParam); + } + + @Override + public void sendHtmlEmailTencent(String from, String user, String tos, String subject, String content, List attachmentList) { + DevEmailSendTencentHtmlParam devEmailSendTencentHtmlParam = new DevEmailSendTencentHtmlParam(); + devEmailSendTencentHtmlParam.setSendAccount(from); + devEmailSendTencentHtmlParam.setSendUser(user); + devEmailSendTencentHtmlParam.setReceiveAccounts(tos); + devEmailSendTencentHtmlParam.setSubject(subject); + devEmailSendTencentHtmlParam.setContent(content); + devEmailSendTencentHtmlParam.setAttachmentList(attachmentList); + devEmailService.sendTencent(devEmailSendTencentHtmlParam); + } + + @Override + public void sendEmailWithTemplateTencent(String from, String user, String toId, String templateId, String templateParam, String subject, List attachmentList) { + DevEmailSendTencentTmpParam devEmailSendTencentTmpParam = new DevEmailSendTencentTmpParam(); + devEmailSendTencentTmpParam.setSendAccount(from); + devEmailSendTencentTmpParam.setSendUser(user); + devEmailSendTencentTmpParam.setReceiveAccounts(toId); + devEmailSendTencentTmpParam.setTemplateName(templateId); + devEmailSendTencentTmpParam.setAttachmentList(attachmentList); + devEmailService.sendTencent(devEmailSendTencentTmpParam); + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/service/DevEmailService.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/service/DevEmailService.java new file mode 100644 index 00000000..cb03154f --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/service/DevEmailService.java @@ -0,0 +1,125 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.email.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import vip.xiaonuo.dev.modular.email.entity.DevEmail; +import vip.xiaonuo.dev.modular.email.param.*; + +import java.util.List; + +/** + * 邮件Service接口 + * + * @author xuyuxiang + * @date 2022/2/23 18:27 + **/ +public interface DevEmailService extends IService { + + /** + * 发送邮件——本地TXT + * + * @author xuyuxiang + * @date 2022/6/21 18:37 + **/ + void sendLocal(DevEmailSendLocalTxtParam devEmailSendLocalTxtParam); + + /** + * 发送邮件——本地HTML + * + * @author xuyuxiang + * @date 2022/6/21 18:37 + **/ + void sendLocal(DevEmailSendLocalHtmlParam devEmailSendLocalHtmlParam); + + /** + * 发送邮件——阿里云TXT + * + * @author xuyuxiang + * @date 2022/6/21 18:37 + **/ + void sendAliyun(DevEmailSendAliyunTxtParam devEmailSendAliyunTxtParam); + + /** + * 发送邮件——阿里云HTML + * + * @author xuyuxiang + * @date 2022/6/21 18:37 + **/ + void sendAliyun(DevEmailSendAliyunHtmlParam devEmailSendAliyunHtmlParam); + + /** + * 发送邮件——阿里云TMP + * + * @author xuyuxiang + * @date 2022/6/21 18:37 + **/ + void sendAliyun(DevEmailSendAliyunTmpParam devEmailSendAliyunTmpParam); + + /** + * 发送邮件——腾讯云TXT + * + * @author xuyuxiang + * @date 2022/6/21 18:37 + **/ + void sendTencent(DevEmailSendTencentTxtParam devEmailSendTencentTxtParam); + + /** + * 发送邮件——腾讯云HTML + * + * @author xuyuxiang + * @date 2022/6/21 18:37 + **/ + void sendTencent(DevEmailSendTencentHtmlParam devEmailSendTencentHtmlParam); + + /** + * 发送邮件——腾讯云TMP + * + * @author xuyuxiang + * @date 2022/6/21 18:37 + **/ + void sendTencent(DevEmailSendTencentTmpParam devEmailSendTencentTmpParam); + + /** + * 获取邮件分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + Page page(DevEmailPageParam devEmailPageParam); + + /** + * 删除邮件 + * + * @author xuyuxiang + * @date 2022/8/4 10:36 + **/ + void delete(List devEmailIdParamList); + + /** + * 获取邮件详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + DevEmail detail(DevEmailIdParam devEmailIdParam); + + /** + * 获取邮件详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + DevEmail queryEntity(String id); +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/service/impl/DevEmailServiceImpl.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/service/impl/DevEmailServiceImpl.java new file mode 100644 index 00000000..c502f466 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/service/impl/DevEmailServiceImpl.java @@ -0,0 +1,201 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.email.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.mail.MailAccount; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import vip.xiaonuo.common.enums.CommonSortOrderEnum; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.common.util.CommonEmailUtil; +import vip.xiaonuo.dev.modular.email.entity.DevEmail; +import vip.xiaonuo.dev.modular.email.enums.DevEmailEngineTypeEnum; +import vip.xiaonuo.dev.modular.email.mapper.DevEmailMapper; +import vip.xiaonuo.dev.modular.email.param.*; +import vip.xiaonuo.dev.modular.email.service.DevEmailService; +import vip.xiaonuo.dev.modular.email.util.DevEmailAliyunUtil; +import vip.xiaonuo.dev.modular.email.util.DevEmailLocalUtil; +import vip.xiaonuo.dev.modular.email.util.DevEmailTencentUtil; + +import java.util.List; + +/** + * 邮件Service接口实现类 + * + * @author xuyuxiang + * @date 2022/2/23 18:43 + **/ +@Service +public class DevEmailServiceImpl extends ServiceImpl implements DevEmailService { + + @Transactional(rollbackFor = Exception.class) + @Override + public void sendLocal(DevEmailSendLocalTxtParam devEmailSendLocalTxtParam) { + CommonEmailUtil.validEmail(devEmailSendLocalTxtParam.getReceiveAccounts()); + String receiptInfo = DevEmailLocalUtil.sendTextEmail(devEmailSendLocalTxtParam.getReceiveAccounts(), + devEmailSendLocalTxtParam.getSubject(), devEmailSendLocalTxtParam.getContent(), devEmailSendLocalTxtParam.getFiles()); + DevEmail devEmail = new DevEmail(); + BeanUtil.copyProperties(devEmailSendLocalTxtParam, devEmail); + devEmail.setEngine(DevEmailEngineTypeEnum.LOCAL.getValue()); + devEmail.setReceiptInfo(receiptInfo); + MailAccount client = DevEmailLocalUtil.getClient(); + devEmail.setSendAccount(client.getFrom()); + devEmail.setSendUser(client.getUser()); + this.save(devEmail); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void sendLocal(DevEmailSendLocalHtmlParam devEmailSendLocalHtmlParam) { + CommonEmailUtil.validEmail(devEmailSendLocalHtmlParam.getReceiveAccounts()); + String receiptInfo = DevEmailLocalUtil.sendHtmlEmail(devEmailSendLocalHtmlParam.getReceiveAccounts(), + devEmailSendLocalHtmlParam.getSubject(), devEmailSendLocalHtmlParam.getContent(), devEmailSendLocalHtmlParam.getImageMap(), + devEmailSendLocalHtmlParam.getFiles()); + DevEmail devEmail = new DevEmail(); + BeanUtil.copyProperties(devEmailSendLocalHtmlParam, devEmail); + devEmail.setEngine(DevEmailEngineTypeEnum.LOCAL.getValue()); + devEmail.setReceiptInfo(receiptInfo); + MailAccount client = DevEmailLocalUtil.getClient(); + devEmail.setSendAccount(client.getFrom()); + devEmail.setSendUser(client.getUser()); + this.save(devEmail); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void sendAliyun(DevEmailSendAliyunTxtParam devEmailSendAliyunTxtParam) { + CommonEmailUtil.validEmail(devEmailSendAliyunTxtParam.getReceiveAccounts()); + String receiptInfo = DevEmailAliyunUtil.sendTextEmail(devEmailSendAliyunTxtParam.getSendAccount(), + devEmailSendAliyunTxtParam.getSendUser(), devEmailSendAliyunTxtParam.getReceiveAccounts(), + devEmailSendAliyunTxtParam.getSubject(), devEmailSendAliyunTxtParam.getContent()); + DevEmail devEmail = new DevEmail(); + BeanUtil.copyProperties(devEmailSendAliyunTxtParam, devEmail); + devEmail.setEngine(DevEmailEngineTypeEnum.ALIYUN.getValue()); + devEmail.setReceiptInfo(receiptInfo); + this.save(devEmail); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void sendAliyun(DevEmailSendAliyunHtmlParam devEmailSendAliyunHtmlParam) { + CommonEmailUtil.validEmail(devEmailSendAliyunHtmlParam.getReceiveAccounts()); + String receiptInfo = DevEmailAliyunUtil.sendHtmlEmail(devEmailSendAliyunHtmlParam.getSendAccount(), + devEmailSendAliyunHtmlParam.getSendUser(), devEmailSendAliyunHtmlParam.getReceiveAccounts(), + devEmailSendAliyunHtmlParam.getSubject(), devEmailSendAliyunHtmlParam.getContent()); + DevEmail devEmail = new DevEmail(); + BeanUtil.copyProperties(devEmailSendAliyunHtmlParam, devEmail); + devEmail.setEngine(DevEmailEngineTypeEnum.ALIYUN.getValue()); + devEmail.setReceiptInfo(receiptInfo); + this.save(devEmail); + } + + @Override + public void sendAliyun(DevEmailSendAliyunTmpParam devEmailSendAliyunTmpParam) { + CommonEmailUtil.validEmail(devEmailSendAliyunTmpParam.getReceiveAccounts()); + String receiptInfo = DevEmailAliyunUtil.sendEmailWithTemplate(devEmailSendAliyunTmpParam.getSendAccount(), + devEmailSendAliyunTmpParam.getTagName(), devEmailSendAliyunTmpParam.getReceiveAccounts(), + devEmailSendAliyunTmpParam.getTemplateName()); + DevEmail devEmail = new DevEmail(); + BeanUtil.copyProperties(devEmailSendAliyunTmpParam, devEmail); + devEmail.setEngine(DevEmailEngineTypeEnum.ALIYUN.getValue()); + devEmail.setReceiptInfo(receiptInfo); + this.save(devEmail); + } + + @Override + public void sendTencent(DevEmailSendTencentTxtParam devEmailSendTencentTxtParam) { + CommonEmailUtil.validEmail(devEmailSendTencentTxtParam.getReceiveAccounts()); + String receiptInfo = DevEmailTencentUtil.sendTextEmail(devEmailSendTencentTxtParam.getSendAccount(), + devEmailSendTencentTxtParam.getSendUser(), devEmailSendTencentTxtParam.getReceiveAccounts(), + devEmailSendTencentTxtParam.getSubject(), devEmailSendTencentTxtParam.getContent(), + devEmailSendTencentTxtParam.getAttachmentList()); + DevEmail devEmail = new DevEmail(); + BeanUtil.copyProperties(devEmailSendTencentTxtParam, devEmail); + devEmail.setEngine(DevEmailEngineTypeEnum.TENCENT.getValue()); + devEmail.setReceiptInfo(receiptInfo); + this.save(devEmail); + } + + @Override + public void sendTencent(DevEmailSendTencentHtmlParam devEmailSendTencentHtmlParam) { + CommonEmailUtil.validEmail(devEmailSendTencentHtmlParam.getReceiveAccounts()); + String receiptInfo = DevEmailTencentUtil.sendHtmlEmail(devEmailSendTencentHtmlParam.getSendAccount(), + devEmailSendTencentHtmlParam.getSendUser(), devEmailSendTencentHtmlParam.getReceiveAccounts(), + devEmailSendTencentHtmlParam.getSubject(), devEmailSendTencentHtmlParam.getContent(), + devEmailSendTencentHtmlParam.getAttachmentList()); + DevEmail devEmail = new DevEmail(); + BeanUtil.copyProperties(devEmailSendTencentHtmlParam, devEmail); + devEmail.setEngine(DevEmailEngineTypeEnum.TENCENT.getValue()); + devEmail.setReceiptInfo(receiptInfo); + this.save(devEmail); + } + + @Override + public void sendTencent(DevEmailSendTencentTmpParam devEmailSendTencentTmpParam) { + CommonEmailUtil.validEmail(devEmailSendTencentTmpParam.getReceiveAccounts()); + String receiptInfo = DevEmailTencentUtil.sendEmailWithTemplate(devEmailSendTencentTmpParam.getSendAccount(), + devEmailSendTencentTmpParam.getSendUser(), devEmailSendTencentTmpParam.getReceiveAccounts(), + devEmailSendTencentTmpParam.getTemplateName(), devEmailSendTencentTmpParam.getTemplateParam(), + devEmailSendTencentTmpParam.getSubject(), CollectionUtil.newArrayList()); + DevEmail devEmail = new DevEmail(); + BeanUtil.copyProperties(devEmailSendTencentTmpParam, devEmail); + devEmail.setEngine(DevEmailEngineTypeEnum.TENCENT.getValue()); + devEmail.setReceiptInfo(receiptInfo); + this.save(devEmail); + } + + @Override + public Page page(DevEmailPageParam devEmailPageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(ObjectUtil.isNotEmpty(devEmailPageParam.getEngine())) { + queryWrapper.lambda().eq(DevEmail::getEngine, devEmailPageParam.getEngine()); + } + if(ObjectUtil.isNotEmpty(devEmailPageParam.getSearchKey())) { + queryWrapper.lambda().like(DevEmail::getSubject, devEmailPageParam.getSearchKey()); + } + if(ObjectUtil.isAllNotEmpty(devEmailPageParam.getSortField(), devEmailPageParam.getSortOrder())) { + CommonSortOrderEnum.validate(devEmailPageParam.getSortOrder()); + queryWrapper.orderBy(true, devEmailPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), + StrUtil.toUnderlineCase(devEmailPageParam.getSortField())); + } + return this.page(CommonPageRequest.defaultPage(), queryWrapper); + } + + @Override + public void delete(List devEmailIdParamList) { + this.removeBatchByIds(CollStreamUtil.toList(devEmailIdParamList, DevEmailIdParam::getId)); + } + + @Override + public DevEmail detail(DevEmailIdParam devEmailIdParam) { + return this.queryEntity(devEmailIdParam.getId()); + } + + @Override + public DevEmail queryEntity(String id) { + DevEmail devEmail = this.getById(id); + if(ObjectUtil.isEmpty(devEmail)) { + throw new CommonException("邮件发送记录不存在,id值为:{}", id); + } + return devEmail; + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/util/DevEmailAliyunUtil.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/util/DevEmailAliyunUtil.java new file mode 100644 index 00000000..90767818 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/util/DevEmailAliyunUtil.java @@ -0,0 +1,221 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.email.util; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.aliyuncs.DefaultAcsClient; +import com.aliyuncs.IAcsClient; +import com.aliyuncs.dm.model.v20151123.BatchSendMailRequest; +import com.aliyuncs.dm.model.v20151123.SingleSendMailRequest; +import com.aliyuncs.exceptions.ClientException; +import com.aliyuncs.http.MethodType; +import com.aliyuncs.profile.DefaultProfile; +import lombok.extern.slf4j.Slf4j; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.dev.api.DevConfigApi; + +/** + * 阿里云邮件工具类 + * 参考文档:https://help.aliyun.com/document_detail/29459.html + * + * @author xuyuxiang + * @date 2022/6/17 10:17 + **/ +@Slf4j +public class DevEmailAliyunUtil { + + private static IAcsClient client; + + private static final String SNOWY_EMAIL_ALIYUN_ACCESS_KEY_ID_KEY = "SNOWY_EMAIL_ALIYUN_ACCESS_KEY_ID"; + private static final String SNOWY_EMAIL_ALIYUN_ACCESS_KEY_SECRET_KEY = "SNOWY_EMAIL_ALIYUN_ACCESS_KEY_SECRET"; + private static final String SNOWY_EMAIL_ALIYUN_REGION_ID_KEY = "SNOWY_EMAIL_ALIYUN_REGION_ID"; + + /** + * 初始化操作的客户端 + * + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + private static void initClient() { + + DevConfigApi devConfigApi = SpringUtil.getBean(DevConfigApi.class); + + /* accessKeyId */ + String accessKeyId = devConfigApi.getValueByKey(SNOWY_EMAIL_ALIYUN_ACCESS_KEY_ID_KEY); + + if(ObjectUtil.isEmpty(accessKeyId)) { + throw new CommonException("阿里云邮件操作客户端未正确配置:accessKeyId为空"); + } + + /* accessKeySecret */ + String accessKeySecret = devConfigApi.getValueByKey(SNOWY_EMAIL_ALIYUN_ACCESS_KEY_SECRET_KEY); + + if(ObjectUtil.isEmpty(accessKeySecret)) { + throw new CommonException("阿里云邮件操作客户端未正确配置:accessKeySecret为空"); + } + + /* regionId */ + String regionId = devConfigApi.getValueByKey(SNOWY_EMAIL_ALIYUN_REGION_ID_KEY); + + if(ObjectUtil.isEmpty(regionId)) { + throw new CommonException("阿里云邮件操作客户端未正确配置:regionId为空"); + } + + client = new DefaultAcsClient(DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret)); + } + + /** + * 发送纯文本邮件(不使用模板,频率限制100 QPS) + * + * @param from 管理控制台中配置的发信地址,必传且必须正确 + * @param user 发信人昵称,长度小于15个字符,可不传 + * @param tos 目标地址,多个 email 地址可以用逗号分隔,最多100个地址,必传且必须正确 + * @param subject 邮件主题,必传 + * @param content 邮件 txt 正文,限制28K,必传 + * @return 发送成功的回执id + * @author xuyuxiang + * @date 2022/2/23 14:24 + **/ + public static String sendTextEmail(String from, String user, String tos, String subject, String content) { + try { + initClient(); + SingleSendMailRequest singleSendMailRequest = createSingleSendRequest(from, user, tos, subject, content, false); + return client.getAcsResponse(singleSendMailRequest).getEnvId(); + } catch (ClientException e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 发送HTML邮件(不使用模板,频率限制100 QPS) + * + * @param from 管理控制台中配置的发信地址,必传且必须正确 + * @param user 发信人昵称,长度小于15个字符,可不传 + * @param tos 目标地址,多个 email 地址可以用逗号分隔,最多100个地址,必传且必须正确 + * @param subject 邮件主题,必传 + * @param content 邮件 html 正文,限制28K,必传 + * @return 发送成功的回执id + * @author xuyuxiang + * @date 2022/2/23 14:24 + **/ + public static String sendHtmlEmail(String from, String user, String tos, String subject, String content) { + try { + initClient(); + SingleSendMailRequest singleSendMailRequest = createSingleSendRequest(from, user, tos, subject, content, true); + return client.getAcsResponse(singleSendMailRequest).getEnvId(); + } catch (ClientException e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 使用模板发送邮件,国内频率限制是20/min;海外频率限制是10/min。 + * + * @param from 管理控制台中配置的发信地址,必传且必须正确 + * @param tagName 控制台创建的邮件标签,可不传 + * @param toName 预先创建且上传了收件人的收件人列表名称,必传且必须正确 + * @param templateName 预先创建且通过审核的模板名称,必传且必须正确 + * @return 发送成功的回执id + * @author xuyuxiang + * @date 2022/2/23 14:24 + **/ + public static String sendEmailWithTemplate(String from, String tagName, String toName, String templateName) { + try { + initClient(); + BatchSendMailRequest batchSendMailRequest = createBatchSendRequest(from, tagName, toName, templateName); + return client.getAcsResponse(batchSendMailRequest).getEnvId(); + } catch (ClientException e) { + throw new CommonException(e.getMessage()); + } + } + + + /** + * 创建发送一个邮件的请求 + * + * @author xuyuxiang + * @date 2022/2/23 13:33 + **/ + private static SingleSendMailRequest createSingleSendRequest(String from, String user, String tos, String subject, String content, boolean isHtml) { + SingleSendMailRequest request = new SingleSendMailRequest(); + + // 控制台创建的发信地址 + request.setAccountName(from); + + // 发信人昵称 + request.setFromAlias(user); + + // 地址类型:0-为随机账号,1-为发信地址 + request.setAddressType(1); + + // 使用管理台配置的回信地址 + request.setReplyToAddress(true); + + // 目标地址 + request.setToAddress(tos); + + // 邮件主题 + request.setSubject(subject); + + //如果采用byte[].toString的方式的话请确保最终转换成utf-8的格式再放入htmlbody和textbody,若编码不一致则会被当成垃圾邮件。 + if(isHtml) { + request.setHtmlBody(content); + } else { + request.setTextBody(content); + } + + //SDK 采用的是http协议的发信方式, 默认是GET方法,有一定的长度限制。 + //若textBody、htmlBody或content的大小不确定,建议采用POST方式提交,避免出现uri is not valid异常 + request.setSysMethod(MethodType.POST); + + //是否开启追踪功能,开启需要备案,0关闭,1开启 + request.setClickTrace("0"); + + return request; + } + + /** + * 创建发送批量邮件的请求 + * + * @author fengshuonan + * @date 2020/10/30 22:39 + */ + private static BatchSendMailRequest createBatchSendRequest(String from, String tagName, String toName, String templateName) { + BatchSendMailRequest request = new BatchSendMailRequest(); + + // 控制台创建的发信地址 + request.setAccountName(from); + + // 预先创建且上传了收件人的收件人列表名称 + request.setReceiversName(toName); + + // 邮件模板,在控制台创建,相当于邮件的内容 + request.setTemplateName(templateName); + + // 地址类型:0-为随机账号,1-为发信地址 + request.setAddressType(1); + + // 控制台创建的标签 + request.setTagName(tagName); + + //SDK 采用的是http协议的发信方式, 默认是GET方法,有一定的长度限制。 + //若textBody、htmlBody或content的大小不确定,建议采用POST方式提交,避免出现uri is not valid异常 + request.setSysMethod(MethodType.POST); + + //是否开启追踪功能,开启需要备案,0关闭,1开启 + request.setClickTrace("0"); + + return request; + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/util/DevEmailLocalUtil.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/util/DevEmailLocalUtil.java new file mode 100644 index 00000000..89f6bad5 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/util/DevEmailLocalUtil.java @@ -0,0 +1,117 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.email.util; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.extra.mail.MailAccount; +import cn.hutool.extra.mail.MailUtil; +import cn.hutool.extra.spring.SpringUtil; +import lombok.extern.slf4j.Slf4j; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.dev.api.DevConfigApi; + +import java.io.File; +import java.io.InputStream; +import java.util.List; +import java.util.Map; + +/** + * 本地邮件工具类 + * + * @author xuyuxiang + * @date 2022/6/17 11:15 + **/ +@Slf4j +public class DevEmailLocalUtil { + + private static MailAccount mailAccount; + + private static final String SNOWY_EMAIL_LOCAL_FROM_KEY = "SNOWY_EMAIL_LOCAL_FROM"; + private static final String SNOWY_EMAIL_LOCAL_PASSWORD_KEY = "SNOWY_EMAIL_LOCAL_PASSWORD"; + + /** + * 初始化操作的客户端 + * + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + private static void initClient() { + + DevConfigApi devConfigApi = SpringUtil.getBean(DevConfigApi.class); + + /* 发件人(必须正确,否则发送失败) */ + String from = devConfigApi.getValueByKey(SNOWY_EMAIL_LOCAL_FROM_KEY); + + if(ObjectUtil.isEmpty(from)) { + throw new CommonException("本地邮件操作客户端未正确配置:from为空"); + } + + /* 密码(注意,某些邮箱需要为SMTP服务单独设置授权码,详情查看相关帮助) */ + String pass = devConfigApi.getValueByKey(SNOWY_EMAIL_LOCAL_PASSWORD_KEY); + + if(ObjectUtil.isEmpty(pass)) { + throw new CommonException("本地邮件操作客户端未正确配置:pass为空"); + } + + mailAccount = new MailAccount(); + mailAccount.setFrom(from); + mailAccount.setPass(pass); + } + + public static MailAccount getClient() { + initClient(); + return mailAccount; + } + + /** + * 发送纯文本邮件 + * + * @param tos 收件人邮箱,逗号拼接 + * @param subject 邮件主题 + * @param content 邮件内容 + * @param files 附件列表 + * @return 发送成功的回执id + * @author xuyuxiang + * @date 2022/2/7 22:29 + */ + public static String sendTextEmail(String tos, String subject, String content, List files) { + try { + initClient(); + return MailUtil.send(mailAccount, tos, subject, content, false, ArrayUtil.toArray(files, File.class)); + } catch (Exception e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 发送HTML邮件 + * + * @param tos 收件人邮箱列表,逗号拼接 + * @param subject 邮件主题 + * @param content 邮件内容 + * @param imageMap – 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER + * @param files 附件列表 + * @return 发送成功的回执id + * @author xuyuxiang + * @date 2022/2/7 22:29 + */ + public static String sendHtmlEmail(String tos, String subject, String content, Map imageMap, List files) { + try { + initClient(); + return MailUtil.send(mailAccount, tos, subject, content, imageMap, true, ArrayUtil.toArray(files, File.class)); + } catch (Exception e) { + throw new CommonException(e.getMessage()); + } + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/util/DevEmailTencentUtil.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/util/DevEmailTencentUtil.java new file mode 100644 index 00000000..417ac19b --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/email/util/DevEmailTencentUtil.java @@ -0,0 +1,213 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.email.util; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.codec.Base64; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import cn.hutool.json.JSONObject; +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.exception.TencentCloudSDKException; +import com.tencentcloudapi.ses.v20201002.SesClient; +import com.tencentcloudapi.ses.v20201002.models.*; +import lombok.extern.slf4j.Slf4j; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.dev.api.DevConfigApi; + +import java.util.List; + +/** + * 腾讯云邮件工具类 + * 参考文档:https://cloud.tencent.com/document/api/1288/51034 + * + * @author xuyuxiang + * @date 2022/6/17 11:26 + **/ +@Slf4j +public class DevEmailTencentUtil { + + private static SesClient client; + + private static final String SNOWY_EMAIL_TENCENT_SECRET_ID_KEY = "SNOWY_EMAIL_TENCENT_SECRET_ID"; + private static final String SNOWY_EMAIL_TENCENT_SECRET_KEY_KEY = "SNOWY_EMAIL_TENCENT_SECRET_KEY"; + private static final String SNOWY_EMAIL_TENCENT_REGION_ID_KEY = "SNOWY_EMAIL_TENCENT_REGION_ID"; + + /** + * 初始化操作的客户端 + * + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + private static void initClient() { + + DevConfigApi devConfigApi = SpringUtil.getBean(DevConfigApi.class); + + /* secretId */ + String secretId = devConfigApi.getValueByKey(SNOWY_EMAIL_TENCENT_SECRET_ID_KEY); + + if(ObjectUtil.isEmpty(secretId)) { + throw new CommonException("腾讯云邮件操作客户端未正确配置:secretId为空"); + } + + /* secretKey */ + String secretKey = devConfigApi.getValueByKey(SNOWY_EMAIL_TENCENT_SECRET_KEY_KEY); + + if(ObjectUtil.isEmpty(secretKey)) { + throw new CommonException("腾讯云邮件操作客户端未正确配置:secretKey为空"); + } + + /* regionId */ + String regionId = devConfigApi.getValueByKey(SNOWY_EMAIL_TENCENT_REGION_ID_KEY); + + if(ObjectUtil.isEmpty(regionId)) { + throw new CommonException("腾讯云邮件操作客户端未正确配置:regionId为空"); + } + + client = new SesClient(new Credential(secretId, secretKey), regionId); + } + + /** + * 发送纯文本邮件(不使用模板,默认接口请求频率限制:20次/秒。) + * + * @param from 管理控制台中配置的发信地址,必传且必须正确 + * @param user 发信人昵称,可不传 + * @param tos 目标地址,多个 email 地址可以用逗号分隔,最多50个地址,必传且必须正确,非群发邮件请多次调用API发送 + * @param subject 邮件主题,必传 + * @param content 邮件 txt 正文,必传,注意:腾讯云api目前要求请求包大小不得超过8 MB。 + * @param attachmentList 需要发送附件时,填写附件相关参数,格式:[{"FileName": "xxxx", "Content": "xxx"}] + * 支持的格式与说明见:https://cloud.tencent.com/document/api/1288/51053#Attachment + * @return 发送成功的回执id + * @author xuyuxiang + * @date 2022/2/23 14:24 + **/ + public static String sendTextEmail(String from, String user, String tos, String subject, String content, List attachmentList) { + try { + initClient(); + SendEmailRequest singleSendMailRequest = createSingleSendRequest(from, user, tos, subject, content, false, attachmentList); + return client.SendEmail(singleSendMailRequest).getMessageId(); + } catch (TencentCloudSDKException e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 发送HTML邮件(不使用模板,默认接口请求频率限制:20次/秒。) + * + * @param from 管理控制台中配置的发信地址,必传且必须正确 + * @param user 发信人昵称,可不传 + * @param tos 目标地址,多个 email 地址可以用逗号分隔,最多50个地址,必传且必须正确,非群发邮件请多次调用API发送 + * @param subject 邮件主题,必传 + * @param content 邮件 txt 正文,必传,注意:腾讯云api目前要求请求包大小不得超过8 MB。 + * @param attachmentList 需要发送附件时,填写附件相关参数,格式:[{"FileName": "xxxx", "Content": "xxx"}] + * 支持的格式与说明见:https://cloud.tencent.com/document/api/1288/51053#Attachment + * @return 发送成功的回执id + * @author xuyuxiang + * @date 2022/2/23 14:24 + **/ + public static String sendHtmlEmail(String from, String user, String tos, String subject, String content, List attachmentList) { + try { + initClient(); + SendEmailRequest singleSendMailRequest = createSingleSendRequest(from, user, tos, subject, content, true, attachmentList); + return client.SendEmail(singleSendMailRequest).getMessageId(); + } catch (TencentCloudSDKException e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 使用模板发送邮件,默认接口请求频率限制:20次/秒。 + * + * @param from 管理控制台中配置的发信地址,必传且必须正确 + * @param user 发信人昵称,可不传 + * @param toId 预先创建且上传了收件人的收件人列表id,必传且必须正确 + * @param templateId 预先创建且通过审核的模板Id,必传且必须正确 + * @param templateParam 预先创建且通过审核的模板的参数json,格式{"name":"张三"},可不传 + * @param subject 邮件主题,必传 + * @param attachmentList 需要发送附件时,填写附件相关参数,格式:[{"FileName": "xxxx", "Content": "xxx"}] + * 支持的格式与说明见:https://cloud.tencent.com/document/api/1288/51053#Attachment + * @return 发送成功的回执id + * @author xuyuxiang + * @date 2022/2/23 14:24 + **/ + public static String sendEmailWithTemplate(String from, String user, String toId, String templateId, + String templateParam, String subject, List attachmentList) { + try { + initClient(); + BatchSendEmailRequest batchSendEmailRequest = createBatchSendRequest(from, user, toId, templateId, templateParam, subject, attachmentList); + return client.BatchSendEmail(batchSendEmailRequest).getTaskId().toString(); + } catch (TencentCloudSDKException e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 创建发送一个邮件的请求 + * + * @author xuyuxiang + * @date 2022/2/23 13:33 + **/ + private static SendEmailRequest createSingleSendRequest(String from, String user, String tos, String subject, + String content, boolean isHtml, List attachmentList) { + SendEmailRequest sendEmailRequest = new SendEmailRequest(); + sendEmailRequest.setFromEmailAddress(ObjectUtil.isNotEmpty(user)?user + " <" + from + ">" :from); + sendEmailRequest.setDestination(StrUtil.splitToArray(tos, StrUtil.COMMA)); + sendEmailRequest.setSubject(subject); + Simple simple = new Simple(); + if(isHtml) { + simple.setHtml(Base64.encode(content)); + } else { + simple.setText(Base64.encode(content)); + } + sendEmailRequest.setSimple(simple); + if(ObjectUtil.isNotEmpty(attachmentList)) { + Attachment[] attachments = (Attachment[]) attachmentList.stream().map(jsonObject -> { + Attachment attachment = new Attachment(); + BeanUtil.copyProperties(jsonObject, attachment); + return attachment; + }).toArray(); + sendEmailRequest.setAttachments(attachments); + } + return sendEmailRequest; + } + + /** + * 创建发送批量邮件的请求 + * + * @author xuyuxiang + * @date 2022/2/23 13:33 + **/ + private static BatchSendEmailRequest createBatchSendRequest(String from, String user, String toId, String templateId, + String templateParam, String subject, List attachmentList) { + BatchSendEmailRequest batchSendEmailRequest = new BatchSendEmailRequest(); + batchSendEmailRequest.setFromEmailAddress(ObjectUtil.isNotEmpty(user)?user + " <" + from + ">" :from); + batchSendEmailRequest.setReceiverId(Convert.toLong(toId)); + Template template = new Template(); + template.setTemplateID(Convert.toLong(templateId)); + template.setTemplateData(templateParam); + batchSendEmailRequest.setTemplate(template); + batchSendEmailRequest.setSubject(subject); + batchSendEmailRequest.setTaskType(1L); + if(ObjectUtil.isNotEmpty(attachmentList)) { + Attachment[] attachments = (Attachment[]) attachmentList.stream().map(jsonObject -> { + Attachment attachment = new Attachment(); + BeanUtil.copyProperties(jsonObject, attachment); + return attachment; + }).toArray(); + batchSendEmailRequest.setAttachments(attachments); + } + return batchSendEmailRequest; + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/controller/DevFileController.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/controller/DevFileController.java new file mode 100644 index 00000000..04ab33c7 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/controller/DevFileController.java @@ -0,0 +1,271 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.file.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.pojo.CommonValidList; +import vip.xiaonuo.dev.api.DevConfigApi; +import vip.xiaonuo.dev.modular.file.entity.DevFile; +import vip.xiaonuo.dev.modular.file.enums.DevFileEngineTypeEnum; +import vip.xiaonuo.dev.modular.file.param.DevFileIdParam; +import vip.xiaonuo.dev.modular.file.param.DevFileListParam; +import vip.xiaonuo.dev.modular.file.param.DevFilePageParam; +import vip.xiaonuo.dev.modular.file.service.DevFileService; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import java.io.IOException; +import java.util.List; + +/** + * 文件控制器 + * + * @author xuyuxiang + * @date 2022/2/23 18:26 + **/ +@Api(tags = "文件控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 4) +@RestController +@Validated +public class DevFileController { + + /** 默认文件引擎 */ + private static final String SNOWY_SYS_DEFAULT_FILE_ENGINE_KEY = "SNOWY_SYS_DEFAULT_FILE_ENGINE"; + + @Resource + private DevConfigApi devConfigApi; + + @Resource + private DevFileService devFileService; + + /** + * 动态上传文件返回id + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 1) + @ApiOperation("动态上传文件返回id") + @CommonLog("动态上传文件返回id") + @PostMapping("/dev/file/uploadDynamicReturnId") + public CommonResult uploadDynamicReturnId(@RequestPart("file") MultipartFile file) { + return CommonResult.data(devFileService.uploadReturnId(devConfigApi.getValueByKey(SNOWY_SYS_DEFAULT_FILE_ENGINE_KEY), file)); + } + + /** + * 动态上传文件返回url + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 2) + @ApiOperation("动态上传文件返回url") + @CommonLog("动态上传文件返回url") + @PostMapping("/dev/file/uploadDynamicReturnUrl") + public CommonResult uploadDynamicReturnUrl(@RequestPart("file") MultipartFile file) { + return CommonResult.data(devFileService.uploadReturnUrl(devConfigApi.getValueByKey(SNOWY_SYS_DEFAULT_FILE_ENGINE_KEY), file)); + } + + /** + * 本地文件上传,返回文件id + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 3) + @ApiOperation("上传本地文件返回id") + @CommonLog("上传本地文件返回id") + @PostMapping("/dev/file/uploadLocalReturnId") + public CommonResult uploadLocalReturnId(@RequestPart("file") MultipartFile file) { + return CommonResult.data(devFileService.uploadReturnId(DevFileEngineTypeEnum.LOCAL.getValue(), file)); + } + + /** + * 本地文件上传,返回文件Url + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 4) + @ApiOperation("上传本地文件返回url") + @CommonLog("上传本地文件返回url") + @PostMapping("/dev/file/uploadLocalReturnUrl") + public CommonResult uploadLocalReturnUrl(@RequestPart("file") MultipartFile file) { + return CommonResult.data(devFileService.uploadReturnUrl(DevFileEngineTypeEnum.LOCAL.getValue(), file)); + } + + /** + * 阿里云文件上传,返回文件id + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 5) + @ApiOperation("上传阿里云文件返回id") + @CommonLog("上传阿里云文件返回id") + @PostMapping("/dev/file/uploadAliyunReturnId") + public CommonResult uploadAliyunReturnId(@RequestPart("file") MultipartFile file) { + return CommonResult.data(devFileService.uploadReturnId(DevFileEngineTypeEnum.ALIYUN.getValue(), file)); + } + + /** + * 阿里云文件上传,返回文件Url + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 6) + @ApiOperation("上传阿里云文件返回url") + @CommonLog("上传阿里云文件返回url") + @PostMapping("/dev/file/uploadAliyunReturnUrl") + public CommonResult uploadAliyunReturnUrl(@RequestPart("file") MultipartFile file) { + return CommonResult.data(devFileService.uploadReturnUrl(DevFileEngineTypeEnum.ALIYUN.getValue(), file)); + } + + /** + * 腾讯云文件上传,返回文件id + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 7) + @ApiOperation("上传腾讯云文件返回id") + @CommonLog("上传腾讯云文件返回id") + @PostMapping("/dev/file/uploadTencentReturnId") + public CommonResult uploadTencentReturnId(@RequestPart("file") MultipartFile file) { + return CommonResult.data(devFileService.uploadReturnId(DevFileEngineTypeEnum.TENCENT.getValue(), file)); + } + + /** + * 腾讯云文件上传,返回文件Url + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 8) + @ApiOperation("上传腾讯云文件返回url") + @CommonLog("上传腾讯云文件返回url") + @PostMapping("/dev/file/uploadTencentReturnUrl") + public CommonResult uploadTencentReturnUrl(@RequestPart("file") MultipartFile file) { + return CommonResult.data(devFileService.uploadReturnUrl(DevFileEngineTypeEnum.TENCENT.getValue(), file)); + } + + /** + * MINIO文件上传,返回文件id + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 9) + @ApiOperation("上传MINIO文件返回id") + @CommonLog("上传MINIO文件返回id") + @PostMapping("/dev/file/uploadMinioReturnId") + public CommonResult uploadMinioReturnId(@RequestPart("file") MultipartFile file) { + return CommonResult.data(devFileService.uploadReturnId(DevFileEngineTypeEnum.MINIO.getValue(), file)); + } + + /** + * MINIO文件上传,返回文件Url + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 10) + @ApiOperation("上传MINIO文件返回url") + @CommonLog("上传MINIO文件返回url") + @PostMapping("/dev/file/uploadMinioReturnUrl") + public CommonResult uploadMinioReturnUrl(@RequestPart("file") MultipartFile file) { + return CommonResult.data(devFileService.uploadReturnUrl(DevFileEngineTypeEnum.MINIO.getValue(), file)); + } + + /** + * 获取文件分页列表 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 11) + @ApiOperation("获取文件分页列表") + @GetMapping("/dev/file/page") + public CommonResult> page(DevFilePageParam devFilePageParam) { + return CommonResult.data(devFileService.page(devFilePageParam)); + } + + /** + * 获取文件列表 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 12) + @ApiOperation("获取文件列表") + @GetMapping("/dev/file/list") + public CommonResult> list(DevFileListParam devFileListParam) { + return CommonResult.data(devFileService.list(devFileListParam)); + } + + /** + * 下载文件 + * + * @author xuyuxiang + * @date 2022/6/21 15:44 + **/ + @ApiOperationSupport(order = 13) + @ApiOperation("下载文件") + @CommonLog("下载文件") + @GetMapping(value = "/dev/file/download", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) + public void download(@Valid DevFileIdParam devFileIdParam, HttpServletResponse response) throws IOException { + devFileService.download(devFileIdParam, response); + } + + /** + * 删除文件 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 14) + @ApiOperation("删除文件") + @CommonLog("删除文件") + @PostMapping(value = "/dev/file/delete") + public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList devFileIdParamList) { + devFileService.delete(devFileIdParamList); + return CommonResult.ok(); + } + + /** + * 获取文件详情 + * + * @author xuyuxiang + * @date 2022/6/21 15:44 + **/ + @ApiOperationSupport(order = 15) + @ApiOperation("获取文件详情") + @GetMapping("/dev/file/detail") + public CommonResult detail(@Valid DevFileIdParam devFileIdParam) { + return CommonResult.data(devFileService.detail(devFileIdParam)); + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/entity/DevFile.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/entity/DevFile.java new file mode 100644 index 00000000..d443f941 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/entity/DevFile.java @@ -0,0 +1,79 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.file.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import vip.xiaonuo.common.pojo.CommonEntity; + +/** + * 文件实体 + * + * @author xuyuxiang + * @date 2022/2/23 18:27 + **/ +@Getter +@Setter +@TableName("DEV_FILE") +public class DevFile extends CommonEntity { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 存储引擎 */ + @ApiModelProperty(value = "存储引擎", position = 2) + private String engine; + + /** 存储桶 */ + @ApiModelProperty(value = "存储桶", position = 3) + private String bucket; + + /** 文件名称 */ + @ApiModelProperty(value = "文件名称", position = 4) + private String name; + + /** 文件后缀 */ + @ApiModelProperty(value = "文件后缀", position = 5) + private String suffix; + + /** 文件大小kb */ + @ApiModelProperty(value = "文件大小kb", position = 6) + private String sizeKb; + + /** 文件大小(格式化后) */ + @ApiModelProperty(value = "文件大小(格式化后)", position = 7) + private String sizeInfo; + + /** 文件的对象名(唯一名称) */ + @ApiModelProperty(value = "文件的对象名(唯一名称)", position = 8) + private String objName; + + /** 文件存储路径 */ + @ApiModelProperty(value = "文件存储路径", position = 9) + private String storagePath; + + /** 文件下载路径 */ + @ApiModelProperty(value = "文件下载路径", position = 10) + private String downloadPath; + + /** 图片缩略图 */ + @ApiModelProperty(value = "图片缩略图", position = 11) + private String thumbnail; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 12) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/enums/DevFileBucketAuthEnum.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/enums/DevFileBucketAuthEnum.java new file mode 100644 index 00000000..31838eff --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/enums/DevFileBucketAuthEnum.java @@ -0,0 +1,38 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.file.enums; + +/** + * 文件存储桶的权限策略枚举 + * + * @author xuyuxiang + * @date 2022/1/5 23:29 + */ +public enum DevFileBucketAuthEnum { + + /** + * 私有的(仅有 owner 可以读写) + */ + PRIVATE, + + /** + * 公有读,私有写( owner 可以读写, 其他客户可以读) + */ + PUBLIC_READ, + + /** + * 公共读写(即所有人都可以读写,慎用) + */ + PUBLIC_READ_WRITE + +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/enums/DevFileEngineTypeEnum.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/enums/DevFileEngineTypeEnum.java new file mode 100644 index 00000000..d928f389 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/enums/DevFileEngineTypeEnum.java @@ -0,0 +1,43 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.file.enums; + +import lombok.Getter; + +/** + * 文件存储引擎类型枚举 + * + * @author xuyuxiang + * @date 2022/6/16 16:14 + **/ +@Getter +public enum DevFileEngineTypeEnum { + + /** 本地 */ + LOCAL("LOCAL"), + + /** 阿里云 */ + ALIYUN("ALIYUN"), + + /** 腾讯云 */ + TENCENT("TENCENT"), + + /** MINIO */ + MINIO("MINIO"); + + private final String value; + + DevFileEngineTypeEnum(String value) { + this.value = value; + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/mapper/DevFileMapper.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/mapper/DevFileMapper.java new file mode 100644 index 00000000..c2b67f78 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/mapper/DevFileMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.file.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.dev.modular.file.entity.DevFile; + +/** + * 文件Mapper接口 + * + * @author xuyuxiang + * @date 2022/2/23 18:40 + **/ +public interface DevFileMapper extends BaseMapper { +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/mapper/mapping/DevFileMapper.xml b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/mapper/mapping/DevFileMapper.xml new file mode 100644 index 00000000..55937e36 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/mapper/mapping/DevFileMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/param/DevFileIdParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/param/DevFileIdParam.java new file mode 100644 index 00000000..5d906dbc --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/param/DevFileIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.file.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 文件Id参数 + * + * @author xuyuxiang + * @date 2022/7/31 10:24 + */ +@Getter +@Setter +public class DevFileIdParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/param/DevFileListParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/param/DevFileListParam.java new file mode 100644 index 00000000..fe122e5d --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/param/DevFileListParam.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.file.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 文件列表参数 + * + * @author xuyuxiang + * @date 2022/7/31 10:24 + */ +@Getter +@Setter +public class DevFileListParam { + + /** 文件引擎 */ + @ApiModelProperty(value = "文件引擎") + private String engine; + + /** 文件名关键词 */ + @ApiModelProperty(value = "文件名关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/param/DevFilePageParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/param/DevFilePageParam.java new file mode 100644 index 00000000..7a962c69 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/param/DevFilePageParam.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.file.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 文件分页列表参数 + * + * @author xuyuxiang + * @date 2022/7/31 10:24 + */ +@Getter +@Setter +public class DevFilePageParam { + + /** 文件引擎 */ + @ApiModelProperty(value = "文件引擎") + private String engine; + + /** 文件名关键词 */ + @ApiModelProperty(value = "文件名关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/provider/DevFileApiProvider.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/provider/DevFileApiProvider.java new file mode 100644 index 00000000..d248face --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/provider/DevFileApiProvider.java @@ -0,0 +1,74 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.file.provider; + +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import vip.xiaonuo.dev.api.DevFileApi; +import vip.xiaonuo.dev.modular.file.enums.DevFileEngineTypeEnum; +import vip.xiaonuo.dev.modular.file.service.DevFileService; + +import javax.annotation.Resource; + +/** + * 文件API接口提供者 + * + * @author xuyuxiang + * @date 2022/6/22 15:32 + **/ +@Service +public class DevFileApiProvider implements DevFileApi { + + @Resource + private DevFileService devFileService; + + @Override + public String storageFileWithReturnUrlLocal(MultipartFile file) { + return devFileService.uploadReturnUrl(DevFileEngineTypeEnum.LOCAL.getValue(), file); + } + + @Override + public String storageFileWithReturnIdLocal(MultipartFile file) { + return devFileService.uploadReturnId(DevFileEngineTypeEnum.LOCAL.getValue(), file); + } + + @Override + public String storageFileWithReturnUrlAliyun(MultipartFile file) { + return devFileService.uploadReturnUrl(DevFileEngineTypeEnum.ALIYUN.getValue(), file); + } + + @Override + public String storageFileWithReturnIdAliyun(MultipartFile file) { + return devFileService.uploadReturnId(DevFileEngineTypeEnum.ALIYUN.getValue(), file); + } + + @Override + public String storageFileWithReturnUrlTencent(MultipartFile file) { + return devFileService.uploadReturnUrl(DevFileEngineTypeEnum.TENCENT.getValue(), file); + } + + @Override + public String storageFileWithReturnIdTencent(MultipartFile file) { + return devFileService.uploadReturnId(DevFileEngineTypeEnum.TENCENT.getValue(), file); + } + + @Override + public String storageFileWithReturnUrlMinio(MultipartFile file) { + return devFileService.uploadReturnUrl(DevFileEngineTypeEnum.MINIO.getValue(), file); + } + + @Override + public String storageFileWithReturnIdMinio(MultipartFile file) { + return devFileService.uploadReturnId(DevFileEngineTypeEnum.MINIO.getValue(), file); + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/service/DevFileService.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/service/DevFileService.java new file mode 100644 index 00000000..ad73f4d5 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/service/DevFileService.java @@ -0,0 +1,98 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.file.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.web.multipart.MultipartFile; +import vip.xiaonuo.dev.modular.file.entity.DevFile; +import vip.xiaonuo.dev.modular.file.param.DevFileIdParam; +import vip.xiaonuo.dev.modular.file.param.DevFileListParam; +import vip.xiaonuo.dev.modular.file.param.DevFilePageParam; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; + +/** + * 文件Service接口 + * + * @author xuyuxiang + * @date 2022/2/23 18:27 + **/ +public interface DevFileService extends IService { + + /** + * MultipartFile文件上传,返回文件id + * + * @author xuyuxiang + * @date 2022/4/22 15:53 + **/ + String uploadReturnId(String engine, MultipartFile file); + + /** + * MultipartFile文件上传,返回文件Url + * + * @author xuyuxiang + * @date 2022/4/22 15:53 + **/ + String uploadReturnUrl(String engine, MultipartFile file); + + /** + * 文件分页列表接口 + * + * @author xuyuxiang + * @date 2022/6/21 15:44 + **/ + Page page(DevFilePageParam devFilePageParam); + + /** + * 文件列表接口 + * + * @author xuyuxiang + * @date 2022/6/21 15:44 + **/ + List list(DevFileListParam devFileListParam); + + /** + * 下载文件 + * + * @author xuyuxiang + * @date 2022/6/21 15:44 + **/ + void download(DevFileIdParam devFileIdParam, HttpServletResponse response) throws IOException; + + /** + * 删除文件 + * + * @author xuyuxiang + * @date 2022/8/4 10:36 + **/ + void delete(List devFileIdParamList); + + /** + * 获取文件详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + DevFile detail(DevFileIdParam devFileIdParam); + + /** + * 获取文件详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + DevFile queryEntity(String id); +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/service/impl/DevFileServiceImpl.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/service/impl/DevFileServiceImpl.java new file mode 100644 index 00000000..d370ff53 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/service/impl/DevFileServiceImpl.java @@ -0,0 +1,281 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.file.service.impl; + +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.img.ImgUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.common.prop.CommonProperties; +import vip.xiaonuo.common.util.CommonDownloadUtil; +import vip.xiaonuo.common.util.CommonResponseUtil; +import vip.xiaonuo.dev.modular.file.entity.DevFile; +import vip.xiaonuo.dev.modular.file.enums.DevFileEngineTypeEnum; +import vip.xiaonuo.dev.modular.file.mapper.DevFileMapper; +import vip.xiaonuo.dev.modular.file.param.DevFileIdParam; +import vip.xiaonuo.dev.modular.file.param.DevFileListParam; +import vip.xiaonuo.dev.modular.file.param.DevFilePageParam; +import vip.xiaonuo.dev.modular.file.service.DevFileService; +import vip.xiaonuo.dev.modular.file.util.DevFileAliyunUtil; +import vip.xiaonuo.dev.modular.file.util.DevFileLocalUtil; +import vip.xiaonuo.dev.modular.file.util.DevFileMinIoUtil; +import vip.xiaonuo.dev.modular.file.util.DevFileTencentUtil; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.List; + +/** + * 文件Service接口实现类 + * + * @author xuyuxiang + * @date 2022/2/23 18:43 + **/ +@Service +public class DevFileServiceImpl extends ServiceImpl implements DevFileService { + + @Resource + private CommonProperties commonProperties; + + @Override + public String uploadReturnId(String engine, MultipartFile file) { + return this.storageFile(engine, file, true); + } + + @Override + public String uploadReturnUrl(String engine, MultipartFile file) { + return this.storageFile(engine, file, false); + } + + @Override + public Page page(DevFilePageParam devFilePageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(ObjectUtil.isNotEmpty(devFilePageParam.getEngine())) { + queryWrapper.lambda().eq(DevFile::getEngine, devFilePageParam.getEngine()); + } + if(ObjectUtil.isNotEmpty(devFilePageParam.getSearchKey())) { + queryWrapper.lambda().like(DevFile::getName, devFilePageParam.getSearchKey()); + } + return this.page(CommonPageRequest.defaultPage(), queryWrapper); + } + + @Override + public List list(DevFileListParam devFileListParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(ObjectUtil.isNotEmpty(devFileListParam.getEngine())) { + queryWrapper.lambda().eq(DevFile::getEngine, devFileListParam.getEngine()); + } + if(ObjectUtil.isNotEmpty(devFileListParam.getSearchKey())) { + queryWrapper.lambda().like(DevFile::getName, devFileListParam.getSearchKey()); + } + return this.list(queryWrapper); + } + + @Override + public void download(DevFileIdParam devFileIdParam, HttpServletResponse response) throws IOException { + DevFile devFile = this.queryEntity(devFileIdParam.getId()); + if(!devFile.getEngine().equals(DevFileEngineTypeEnum.LOCAL.getValue())) { + CommonResponseUtil.renderError(response, "非本地文件不支持此方式下载,id值为:" + devFile.getId()); + return; + } + File file = FileUtil.file(devFile.getStoragePath()); + if(!FileUtil.exist(file)) { + CommonResponseUtil.renderError(response, "找不到存储的文件,id值为:" + devFile.getId()); + return; + } + CommonDownloadUtil.download(devFile.getName(), IoUtil.readBytes(FileUtil.getInputStream(file)), response); + } + + @Override + public void delete(List devFileIdParamList) { + this.removeBatchByIds(CollStreamUtil.toList(devFileIdParamList, DevFileIdParam::getId)); + } + + /** + * 存储文件 + * + * @author xuyuxiang + * @date 2022/6/16 16:24 + **/ + private String storageFile(String engine, MultipartFile file, boolean returnFileId) { + + // 如果引擎为空,默认使用本地 + if(ObjectUtil.isEmpty(engine)) { + engine = DevFileEngineTypeEnum.LOCAL.getValue(); + } + + // 生成id + String fileId = IdWorker.getIdStr(); + + // 存储桶名称 + String bucketName; + + // 定义存储的url,本地文件返回文件实际路径,其他引擎返回网络地址 + String storageUrl; + + // 根据引擎类型执行不同方法 + if(engine.equals(DevFileEngineTypeEnum.LOCAL.getValue())) { + + // 使用固定名称defaultBucketName + bucketName = "defaultBucketName"; + storageUrl = DevFileLocalUtil.storageFileWithReturnUrl(bucketName, genFileKey(fileId, file), file); + } else if(engine.equals(DevFileEngineTypeEnum.ALIYUN.getValue())) { + + // 使用阿里云默认配置的bucketName + bucketName = DevFileAliyunUtil.getDefaultBucketName(); + storageUrl = DevFileAliyunUtil.storageFileWithReturnUrl(bucketName, genFileKey(fileId, file), file); + } else if(engine.equals(DevFileEngineTypeEnum.TENCENT.getValue())) { + + // 使用腾讯云默认配置的bucketName + bucketName = DevFileTencentUtil.getDefaultBucketName(); + storageUrl = DevFileTencentUtil.storageFileWithReturnUrl(bucketName, genFileKey(fileId, file), file); + } else if(engine.equals(DevFileEngineTypeEnum.MINIO.getValue())) { + + // 使用MINIO默认配置的bucketName + bucketName = DevFileMinIoUtil.getDefaultBucketName(); + storageUrl = DevFileMinIoUtil.storageFileWithReturnUrl(bucketName, genFileKey(fileId, file), file); + } else { + throw new CommonException("不支持的文件引擎:{}", engine); + } + + // 将文件信息保存到数据库 + DevFile devFile = new DevFile(); + + // 设置文件id + devFile.setId(fileId); + + // 设置存储引擎类型 + devFile.setEngine(engine); + devFile.setBucket(bucketName); + devFile.setName(file.getOriginalFilename()); + String suffix = ObjectUtil.isNotEmpty(file.getOriginalFilename())?StrUtil.subAfter(file.getOriginalFilename(), + StrUtil.DOT, true):null; + devFile.setSuffix(suffix); + devFile.setSizeKb(Convert.toStr(NumberUtil.div(new BigDecimal(file.getSize()), BigDecimal.valueOf(1024)) + .setScale(0, BigDecimal.ROUND_HALF_UP))); + devFile.setSizeInfo(FileUtil.readableFileSize(file.getSize())); + devFile.setObjName(ObjectUtil.isNotEmpty(devFile.getSuffix())?fileId + StrUtil.DOT + devFile.getSuffix():null); + // 如果是图片,则压缩生成缩略图 + if(ObjectUtil.isNotEmpty(suffix)) { + if(isPic(suffix)) { + try { + devFile.setThumbnail(ImgUtil.toBase64DataUri(ImgUtil.scale(ImgUtil.toImage(file.getBytes()), + 100, 100, null), suffix)); + } catch (IOException e) { + throw new CommonException("文件上传失败,获取文件流错误"); + } + } + } + // 存储路径 + devFile.setStoragePath(storageUrl); + + // 定义下载地址 + String downloadUrl; + + // 下载路径,注意:本地文件下载地址设置为下载接口地址 + 文件id + if(engine.equals(DevFileEngineTypeEnum.LOCAL.getValue())) { + String apiUrl = commonProperties.getBackendUrl(); + if(ObjectUtil.isEmpty(apiUrl)) { + throw new CommonException("后端域名地址未正确配置:snowy.config.common.backend-url为空"); + } + downloadUrl= apiUrl + "/dev/file/download?id=" + fileId; + devFile.setDownloadPath(downloadUrl); + } else { + // 阿里云、腾讯云、MINIO可以直接使用存储地址(公网)作为下载地址 + downloadUrl= storageUrl; + devFile.setDownloadPath(devFile.getStoragePath()); + } + + this.save(devFile); + + // 如果是返回id则返回文件id + if(returnFileId) { + return fileId; + } else { + // 否则返回下载地址 + return downloadUrl; + } + } + + /** + * 生成文件的key,格式如 2021/10/11/1377109572375810050.docx + * + * @author xuyuxiang + * @date 2022/4/22 15:58 + **/ + public String genFileKey(String fileId, MultipartFile file) { + + // 获取文件原始名称 + String originalFileName = file.getOriginalFilename(); + + // 获取文件后缀 + String fileSuffix = FileUtil.getSuffix(originalFileName); + + // 生成文件的对象名称,格式如:1377109572375810050.docx + String fileObjectName = fileId + StrUtil.DOT + fileSuffix; + + // 获取日期文件夹,格式如,2021/10/11/ + String dateFolderPath = DateUtil.thisYear() + FileUtil.FILE_SEPARATOR + + (DateUtil.thisMonth() + 1) + FileUtil.FILE_SEPARATOR + + DateUtil.thisDayOfMonth() + FileUtil.FILE_SEPARATOR; + + // 返回 + return dateFolderPath + fileObjectName; + } + + @Override + public DevFile detail(DevFileIdParam devFileIdParam) { + return this.queryEntity(devFileIdParam.getId()); + } + + @Override + public DevFile queryEntity(String id) { + DevFile devFile = this.getById(id); + if(ObjectUtil.isEmpty(devFile)) { + throw new CommonException("文件不存在,id值为:{}", id); + } + return devFile; + } + + /** + * 根据文件后缀判断是否图片 + * + * @author xuyuxiang + * @date 2020/7/6 15:31 + */ + private static boolean isPic(String fileSuffix) { + fileSuffix = fileSuffix.toLowerCase(); + return ImgUtil.IMAGE_TYPE_GIF.equals(fileSuffix) + || ImgUtil.IMAGE_TYPE_JPG.equals(fileSuffix) + || ImgUtil.IMAGE_TYPE_JPEG.equals(fileSuffix) + || ImgUtil.IMAGE_TYPE_BMP.equals(fileSuffix) + || ImgUtil.IMAGE_TYPE_PNG.equals(fileSuffix) + || ImgUtil.IMAGE_TYPE_PSD.equals(fileSuffix); + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/util/DevFileAliyunUtil.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/util/DevFileAliyunUtil.java new file mode 100644 index 00000000..4e4c71f8 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/util/DevFileAliyunUtil.java @@ -0,0 +1,469 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.file.util; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.aliyun.oss.*; +import com.aliyun.oss.model.CannedAccessControlList; +import com.aliyun.oss.model.GeneratePresignedUrlRequest; +import com.aliyun.oss.model.OSSObject; +import com.aliyun.oss.model.ObjectMetadata; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.multipart.MultipartFile; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.dev.api.DevConfigApi; +import vip.xiaonuo.dev.modular.file.enums.DevFileBucketAuthEnum; + +import javax.activation.MimetypesFileTypeMap; +import java.io.*; +import java.net.URL; +import java.util.Date; + +/** + * 阿里云文件工具类 + * 参考文档:https://help.aliyun.com/document_detail/32010.html + * + * @author xuyuxiang + * @date 2022/1/2 18:13 + */ +@Slf4j +public class DevFileAliyunUtil { + + private static OSS client; + + private static String defaultBucketName; + + private static final String SNOWY_FILE_ALIYUN_ACCESS_KEY_ID_KEY = "SNOWY_FILE_ALIYUN_ACCESS_KEY_ID"; + private static final String SNOWY_FILE_ALIYUN_ACCESS_KEY_SECRET_KEY = "SNOWY_FILE_ALIYUN_ACCESS_KEY_SECRET"; + private static final String SNOWY_FILE_ALIYUN_END_POINT_KEY = "SNOWY_FILE_ALIYUN_END_POINT"; + private static final String SNOWY_FILE_ALIYUN_DEFAULT_BUCKET_NAME = "SNOWY_FILE_ALIYUN_DEFAULT_BUCKET_NAME"; + + /** + * 初始化操作的客户端 + * + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + private static void initClient() { + + DevConfigApi devConfigApi = SpringUtil.getBean(DevConfigApi.class); + + /* accessKeyId */ + String accessKeyId = devConfigApi.getValueByKey(SNOWY_FILE_ALIYUN_ACCESS_KEY_ID_KEY); + + if(ObjectUtil.isEmpty(accessKeyId)) { + throw new CommonException("阿里云文件操作客户端未正确配置:accessKeyId为空"); + } + + /* accessKeySecret */ + String accessKeySecret = devConfigApi.getValueByKey(SNOWY_FILE_ALIYUN_ACCESS_KEY_SECRET_KEY); + + if(ObjectUtil.isEmpty(accessKeySecret)) { + throw new CommonException("阿里云文件操作客户端未正确配置:accessKeySecret为空"); + } + + /* endpoint */ + String endpoint = devConfigApi.getValueByKey(SNOWY_FILE_ALIYUN_END_POINT_KEY); + + if(ObjectUtil.isEmpty(accessKeySecret)) { + throw new CommonException("阿里云文件操作客户端未正确配置:endpoint为空"); + } + + /* 默认BucketName */ + defaultBucketName = devConfigApi.getValueByKey(SNOWY_FILE_ALIYUN_DEFAULT_BUCKET_NAME); + + if(ObjectUtil.isEmpty(defaultBucketName)) { + throw new CommonException("阿里云文件操作客户端未正确配置:defaultBucketName为空"); + } + + client = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); + } + + /** + * 获取默认存储桶名称 + * + * @author xuyuxiang + * @date 2022/6/22 18:05 + **/ + public static String getDefaultBucketName() { + initClient(); + return defaultBucketName; + } + + /** + * 销毁操作的客户端 + * + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void destroyClient() { + initClient(); + client.shutdown(); + } + + /** + * 获取操作的客户端 + * + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public OSS getClient() { + initClient(); + return client; + } + + /** + * 查询存储桶是否存在 + * 例如:传入参数examplebucket-1250000000,返回true代表存在此桶 + * + * @param bucketName 桶名称 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public boolean doesBucketExist(String bucketName) { + try { + initClient(); + return client.doesBucketExist(bucketName); + } catch (OSSException | ClientException e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 设置预定义策略 + * 预定义策略如公有读、公有读写、私有读 + * + * @param bucketName 桶名称 + * @param devFileBucketAuthEnum 存储桶权限 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void setBucketAcl(String bucketName, DevFileBucketAuthEnum devFileBucketAuthEnum) { + try { + initClient(); + if (devFileBucketAuthEnum.equals(DevFileBucketAuthEnum.PRIVATE)) { + client.setBucketAcl(bucketName, CannedAccessControlList.Private); + } else if (devFileBucketAuthEnum.equals(DevFileBucketAuthEnum.PUBLIC_READ)) { + client.setBucketAcl(bucketName, CannedAccessControlList.PublicRead); + } else if (devFileBucketAuthEnum.equals(DevFileBucketAuthEnum.PUBLIC_READ_WRITE)) { + client.setBucketAcl(bucketName, CannedAccessControlList.PublicReadWrite); + } + } catch (OSSException | ClientException e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 判断是否存在文件 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static boolean isExistingFile(String bucketName, String key) { + try { + initClient(); + return client.doesObjectExist(bucketName, key); + } catch (OSSException | ClientException e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 存储文件,不返回地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param file 文件 + * @author xuyuxiang + * @date 2022/1/5 23:45 + */ + public static void storageFile(String bucketName, String key, File file) { + BufferedInputStream inputStream; + try { + inputStream = FileUtil.getInputStream(file); + } catch (IORuntimeException e) { + throw new CommonException("获取文件流异常,名称是:{}", file.getName()); + } + storageFile(bucketName, key, inputStream); + } + + /** + * 存储文件,不返回地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param multipartFile 文件 + * @author xuyuxiang + * @date 2022/1/5 23:45 + */ + public static void storageFile(String bucketName, String key, MultipartFile multipartFile) { + InputStream inputStream; + try { + inputStream = multipartFile.getInputStream(); + } catch (IOException e) { + throw new CommonException("获取文件流异常,名称是:{}", multipartFile.getName()); + } + storageFile(bucketName, key, inputStream); + } + + /** + * 存储文件,不返回地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param bytes 文件字节数组 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void storageFile(String bucketName, String key, byte[] bytes) { + ByteArrayInputStream byteArrayInputStream = null; + try { + initClient(); + byteArrayInputStream = new ByteArrayInputStream(bytes); + ObjectMetadata objectMetadata = new ObjectMetadata(); + objectMetadata.setContentType(getFileContentType(key)); + client.putObject(bucketName, key, new ByteArrayInputStream(bytes), objectMetadata); + } catch (OSSException | ClientException e) { + throw new CommonException(e.getMessage()); + } finally { + IoUtil.close(byteArrayInputStream); + } + } + + /** + * 存储文件,不返回地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param inputStream 文件流 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void storageFile(String bucketName, String key, InputStream inputStream) { + try { + initClient(); + ObjectMetadata objectMetadata = new ObjectMetadata(); + objectMetadata.setContentType(getFileContentType(key)); + client.putObject(bucketName, key, inputStream, objectMetadata); + } catch (OSSException | ClientException e) { + throw new CommonException(e.getMessage()); + } finally { + IoUtil.close(inputStream); + } + } + + /** + * 存储文件,返回外网地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param file 文件 + * @author xuyuxiang + * @date 2022/1/5 23:45 + */ + public static String storageFileWithReturnUrl(String bucketName, String key, File file) { + storageFile(bucketName, key, file); + setFileAcl(bucketName, key, DevFileBucketAuthEnum.PUBLIC_READ); + return getFileAuthUrl(bucketName, key); + } + + /** + * 存储文件,返回外网地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param multipartFile 文件 + * @author xuyuxiang + * @date 2022/1/5 23:45 + */ + public static String storageFileWithReturnUrl(String bucketName, String key, MultipartFile multipartFile) { + storageFile(bucketName, key, multipartFile); + setFileAcl(bucketName, key, DevFileBucketAuthEnum.PUBLIC_READ); + return getFileAuthUrl(bucketName, key); + } + + /** + * 存储文件,返回外网地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param bytes 文件字节数组 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static String storageFileWithReturnUrl(String bucketName, String key, byte[] bytes) { + storageFile(bucketName, key, bytes); + setFileAcl(bucketName, key, DevFileBucketAuthEnum.PUBLIC_READ); + return getFileAuthUrl(bucketName, key); + } + + /** + * 存储文件,返回外网地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param inputStream 文件流 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static String storageFileWithReturnUrl(String bucketName, String key, InputStream inputStream) { + storageFile(bucketName, key, inputStream); + setFileAcl(bucketName, key, DevFileBucketAuthEnum.PUBLIC_READ); + return getFileAuthUrl(bucketName, key); + } + + /** + * 获取某个bucket下的文件字节 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static byte[] getFileBytes(String bucketName, String key) { + InputStream objectContent = null; + try { + initClient(); + OSSObject ossObject = client.getObject(bucketName, key); + objectContent = ossObject.getObjectContent(); + return IoUtil.readBytes(objectContent); + } catch (OSSException | ClientException e) { + throw new CommonException(e.getMessage()); + } finally { + IoUtil.close(objectContent); + } + } + + /** + * 设置文件访问权限管理 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param devFileBucketAuthEnum 文件权限 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void setFileAcl(String bucketName, String key, DevFileBucketAuthEnum devFileBucketAuthEnum) { + try { + initClient(); + if (devFileBucketAuthEnum.equals(DevFileBucketAuthEnum.PRIVATE)) { + client.setObjectAcl(bucketName, key, CannedAccessControlList.Private); + } else if (devFileBucketAuthEnum.equals(DevFileBucketAuthEnum.PUBLIC_READ)) { + client.setObjectAcl(bucketName, key, CannedAccessControlList.PublicRead); + } else if (devFileBucketAuthEnum.equals(DevFileBucketAuthEnum.PUBLIC_READ_WRITE)) { + client.setObjectAcl(bucketName, key, CannedAccessControlList.PublicReadWrite); + } + } catch (OSSException | ClientException e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 拷贝文件 + * + * @param originBucketName 源文件桶 + * @param originFileKey 源文件名称 + * @param newBucketName 新文件桶 + * @param newFileKey 新文件名称 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void copyFile(String originBucketName, String originFileKey, String newBucketName, String newFileKey) { + try { + initClient(); + client.copyObject(originBucketName, originFileKey, newBucketName, newFileKey); + } catch (OSSException | ClientException e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 获取文件的下载地址(带鉴权和有效时间的),生成外网地址 + * + * @param bucketName 文件桶 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param timeoutMillis 时效 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static String getFileAuthUrl(String bucketName, String key, Long timeoutMillis) { + initClient(); + GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, key, HttpMethod.GET); + Date expirationDate = new Date(System.currentTimeMillis() + timeoutMillis); + request.setExpiration(expirationDate); + URL url; + try { + url = client.generatePresignedUrl(request); + } catch (OSSException | ClientException e) { + throw new CommonException(e.getMessage()); + } + return url.toString(); + } + + /** + * 获取文件的下载地址(永久的,文件必须为公有读),生成外网地址 + * + * @param bucketName 文件桶 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static String getFileAuthUrl(String bucketName, String key) { + try { + initClient(); + OSSClient ossClient = (OSSClient) client; + return bucketName + StrUtil.DOT + ossClient.getEndpoint().toString() + StrUtil.SLASH + key; + } catch (OSSException | ClientException e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 删除文件 + * + * @param bucketName 文件桶 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void deleteFile(String bucketName, String key) { + try{ + initClient(); + client.deleteObject(bucketName, key); + } catch (OSSException | ClientException e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 根据文件名获取ContentType + * + * @author xuyuxiang + * @date 2022/1/6 11:27 + **/ + private static String getFileContentType(String key) { + // 根据文件名获取contentType + String contentType = "application/octet-stream"; + if (key.contains(".")) { + contentType = MimetypesFileTypeMap.getDefaultFileTypeMap().getContentType(key); + } + return contentType; + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/util/DevFileLocalUtil.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/util/DevFileLocalUtil.java new file mode 100644 index 00000000..6bba1924 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/util/DevFileLocalUtil.java @@ -0,0 +1,363 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.file.util; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.extra.spring.SpringUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import cn.hutool.system.SystemUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.multipart.MultipartFile; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.dev.api.DevConfigApi; +import vip.xiaonuo.dev.modular.file.enums.DevFileBucketAuthEnum; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + +/** + * 本地文件工具类 + * + * @author xuyuxiang + * @date 2022/1/2 18:13 + */ +@Slf4j +public class DevFileLocalUtil { + + private static JSONObject client; + + private static final String SNOWY_FILE_LOCAL_FOLDER_FOR_WINDOWS_KEY = "SNOWY_FILE_LOCAL_FOLDER_FOR_WINDOWS"; + private static final String SNOWY_FILE_LOCAL_FOLDER_FOR_UNIX_KEY = "SNOWY_FILE_LOCAL_FOLDER_FOR_UNIX"; + + /** + * 初始化操作的客户端 + * + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + private static void initClient() { + + String uploadFileFolder; + + DevConfigApi devConfigApi = SpringUtil.getBean(DevConfigApi.class); + + if(SystemUtil.getOsInfo().isWindows()) { + + /* 本地文件上传的位置 windows系统 */ + String localFolderForWindows = devConfigApi.getValueByKey(SNOWY_FILE_LOCAL_FOLDER_FOR_WINDOWS_KEY); + + if(ObjectUtil.isEmpty(localFolderForWindows)) { + throw new CommonException("本地文件操作客户端未正确配置:SNOWY_FILE_LOCAL_FOLDER_FOR_WINDOWS为空"); + } + uploadFileFolder = localFolderForWindows; + } else { + + /* 本地文件上传的位置 unix系列系统(linux、mac等) */ + String localFolderForUnix = devConfigApi.getValueByKey(SNOWY_FILE_LOCAL_FOLDER_FOR_UNIX_KEY); + + if(ObjectUtil.isEmpty(localFolderForUnix)) { + throw new CommonException("本地文件操作客户端未正确配置:SNOWY_FILE_LOCAL_FOLDER_FOR_UNIX为空"); + } + uploadFileFolder = localFolderForUnix; + } + if(!FileUtil.exist(uploadFileFolder)) { + FileUtil.mkdir(uploadFileFolder); + } + client = JSONUtil.createObj(); + client.set("localFileUploadFolder", uploadFileFolder); + } + + /** + * 销毁操作的客户端 + * + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void destroyClient() { + client.clear(); + } + + /** + * 获取操作的客户端 + * + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static JSONObject getClient() { + return client; + } + + /** + * 获取上传地址 + * + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static String getUploadFileFolder() { + return client.getStr("localFileUploadFolder"); + } + + /** + * 查询存储桶是否存在 + * 例如:传入参数examplebucket-1250000000,返回true代表存在此桶 + * + * @param bucketName 桶名称 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static boolean doesBucketExist(String bucketName) { + initClient(); + return FileUtil.exist(getUploadFileFolder() + FileUtil.FILE_SEPARATOR + bucketName); + } + + /** + * 设置预定义策略 + * 预定义策略如公有读、公有读写、私有读 + * + * @param bucketName 桶名称 + * @param devFileBucketAuthEnum 存储桶权限 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void setBucketAcl(String bucketName, DevFileBucketAuthEnum devFileBucketAuthEnum) { + // 无需 + } + + /** + * 判断是否存在文件 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static boolean isExistingFile(String bucketName, String key) { + initClient(); + return FileUtil.exist(getUploadFileFolder() + FileUtil.FILE_SEPARATOR + bucketName + FileUtil.FILE_SEPARATOR + key); + } + + /** + * 存储文件,不返回地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param file 文件 + * @author xuyuxiang + * @date 2022/1/5 23:45 + */ + public static void storageFile(String bucketName, String key, File file) { + BufferedInputStream inputStream; + try { + inputStream = FileUtil.getInputStream(file); + } catch (IORuntimeException e) { + throw new CommonException("获取文件流异常,名称是:{}", file.getName()); + } + storageFile(bucketName, key, inputStream); + } + + /** + * 存储文件,不返回地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param multipartFile 文件 + * @author xuyuxiang + * @date 2022/1/5 23:45 + */ + public static void storageFile(String bucketName, String key, MultipartFile multipartFile) { + InputStream inputStream; + try { + inputStream = multipartFile.getInputStream(); + } catch (IOException e) { + throw new CommonException("获取文件流异常,名称是:{}", multipartFile.getName()); + } + storageFile(bucketName, key, inputStream); + } + + /** + * 存储文件,不返回地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param bytes 文件字节数组 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void storageFile(String bucketName, String key, byte[] bytes) { + initClient(); + FileUtil.writeBytes(bytes, getUploadFileFolder() + FileUtil.FILE_SEPARATOR + bucketName + FileUtil.FILE_SEPARATOR + key); + } + + /** + * 存储文件,不返回地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param inputStream 文件流 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void storageFile(String bucketName, String key, InputStream inputStream) { + initClient(); + FileUtil.writeFromStream(inputStream, getUploadFileFolder() + FileUtil.FILE_SEPARATOR + bucketName + FileUtil.FILE_SEPARATOR + key); + } + + /** + * 存储文件,返回存储的地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param file 文件 + * @author xuyuxiang + * @date 2022/1/5 23:45 + */ + public static String storageFileWithReturnUrl(String bucketName, String key, File file) { + storageFile(bucketName, key, file); + return getFileAuthUrl(bucketName, key); + } + + /** + * 存储文件,返回存储的地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param multipartFile 文件 + * @author xuyuxiang + * @date 2022/1/5 23:45 + */ + public static String storageFileWithReturnUrl(String bucketName, String key, MultipartFile multipartFile) { + storageFile(bucketName, key, multipartFile); + return getFileAuthUrl(bucketName, key); + } + + /** + * 存储文件,返回存储的地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param bytes 文件字节数组 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static String storageFileWithReturnUrl(String bucketName, String key, byte[] bytes) { + storageFile(bucketName, key, bytes); + return getFileAuthUrl(bucketName, key); + } + + /** + * 存储文件,返回存储的地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param inputStream 文件流 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static String storageFileWithReturnUrl(String bucketName, String key, InputStream inputStream) { + storageFile(bucketName, key, inputStream); + return getFileAuthUrl(bucketName, key); + } + + /** + * 获取某个bucket下的文件字节 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static byte[] getFileBytes(String bucketName, String key) { + File file = getFileByBucketNameAndKey(bucketName, key); + return FileUtil.readBytes(file); + } + + /** + * 设置文件访问权限管理 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param devFileBucketAuthEnum 文件权限 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void setFileAcl(String bucketName, String key, DevFileBucketAuthEnum devFileBucketAuthEnum) { + // 无需 + } + + /** + * 拷贝文件 + * + * @param originBucketName 源文件桶 + * @param originFileKey 源文件名称 + * @param newBucketName 新文件桶 + * @param newFileKey 新文件名称 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void copyFile(String originBucketName, String originFileKey, String newBucketName, String newFileKey) { + initClient(); + File file = getFileByBucketNameAndKey(originBucketName, originFileKey); + File newFile = FileUtil.file(getUploadFileFolder() + FileUtil.FILE_SEPARATOR + newBucketName + FileUtil.FILE_SEPARATOR + newFileKey); + FileUtil.copy(file, newFile, true); + } + + /** + * 获取文件的实际存储地址 + * + * @param bucketName 文件桶 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static String getFileAuthUrl(String bucketName, String key) { + initClient(); + File file = getFileByBucketNameAndKey(bucketName, key); + return file.getAbsolutePath(); + } + + /** + * 删除文件 + * + * @param bucketName 文件桶 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void deleteFile(String bucketName, String key) { + File file = getFileByBucketNameAndKey(bucketName, key); + FileUtil.del(file); + } + + /** + * 根据桶名称和文件key获取文件 + * + * @param bucketName 文件桶 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static File getFileByBucketNameAndKey(String bucketName, String key) { + initClient(); + String path = getUploadFileFolder() + FileUtil.FILE_SEPARATOR + bucketName + FileUtil.FILE_SEPARATOR + key; + File file = FileUtil.file(path); + if(!FileUtil.exist(file)) { + throw new CommonException("文件{}不存在", path); + } + return file; + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/util/DevFileMinIoUtil.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/util/DevFileMinIoUtil.java new file mode 100644 index 00000000..bbc683b6 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/util/DevFileMinIoUtil.java @@ -0,0 +1,447 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.file.util; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import io.minio.MinioClient; +import io.minio.errors.InvalidEndpointException; +import io.minio.errors.InvalidPortException; +import io.minio.http.Method; +import io.minio.policy.PolicyType; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.multipart.MultipartFile; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.dev.api.DevConfigApi; +import vip.xiaonuo.dev.modular.file.enums.DevFileBucketAuthEnum; + +import javax.activation.MimetypesFileTypeMap; +import java.io.*; + +/** + * MINIO文件工具类 + * 参考文档:http://docs.minio.org.cn/docs/master/java-client-quickstart-guide + * + * @author xuyuxiang + * @date 2022/1/2 18:13 + */ +@Slf4j +public class DevFileMinIoUtil { + + private static MinioClient client; + + private static String defaultBucketName; + + private static final String SNOWY_FILE_MINIO_ACCESS_KEY_KEY = "SNOWY_FILE_MINIO_ACCESS_KEY"; + private static final String SNOWY_FILE_MINIO_SECRET_KEY_KEY = "SNOWY_FILE_MINIO_SECRET_KEY"; + private static final String SNOWY_FILE_MINIO_END_POINT_KEY = "SNOWY_FILE_MINIO_END_POINT"; + private static final String SNOWY_FILE_MINIO_DEFAULT_BUCKET_NAME = "SNOWY_FILE_MINIO_DEFAULT_BUCKET_NAME"; + + + /** + * 初始化操作的客户端 + * + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + private static void initClient() { + + DevConfigApi devConfigApi = SpringUtil.getBean(DevConfigApi.class); + + /* accessKey */ + String accessKey = devConfigApi.getValueByKey(SNOWY_FILE_MINIO_ACCESS_KEY_KEY); + + if(ObjectUtil.isEmpty(accessKey)) { + throw new CommonException("MINIO文件操作客户端未正确配置:accessKey为空"); + } + + /* secretKey */ + String secretKey = devConfigApi.getValueByKey(SNOWY_FILE_MINIO_SECRET_KEY_KEY); + + if(ObjectUtil.isEmpty(secretKey)) { + throw new CommonException("MINIO文件操作客户端未正确配置:secretKey为空"); + } + + /* endpoint */ + String endpoint = devConfigApi.getValueByKey(SNOWY_FILE_MINIO_END_POINT_KEY); + + if(ObjectUtil.isEmpty(endpoint)) { + throw new CommonException("MINIO文件操作客户端未正确配置:secretKey为空"); + } + + /* 默认BucketName */ + defaultBucketName = devConfigApi.getValueByKey(SNOWY_FILE_MINIO_DEFAULT_BUCKET_NAME); + + if(ObjectUtil.isEmpty(defaultBucketName)) { + throw new CommonException("MINIO文件操作客户端未正确配置:defaultBucketName为空"); + } + + try { + client = new MinioClient(endpoint, accessKey, secretKey); + } catch (InvalidEndpointException | InvalidPortException e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 获取默认存储桶名称 + * + * @author xuyuxiang + * @date 2022/6/22 18:05 + **/ + public static String getDefaultBucketName() { + initClient(); + return defaultBucketName; + } + + /** + * 销毁操作的客户端 + * + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void destroyClient() { + // 无需 + } + + /** + * 获取操作的客户端 + * + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static MinioClient getClient() { + return client; + } + + /** + * 查询存储桶是否存在 + * 例如:传入参数examplebucket-1250000000,返回true代表存在此桶 + * + * @param bucketName 桶名称 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static boolean doesBucketExist(String bucketName) { + try { + initClient(); + client.bucketExists(bucketName); + } catch (Exception e) { + throw new CommonException(e.getMessage()); + } + return false; + } + + /** + * 设置预定义策略 + * 预定义策略如公有读、公有读写、私有读 + * + * @param bucketName 桶名称 + * @param devFileBucketAuthEnum 存储桶权限 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void setBucketAcl(String bucketName, DevFileBucketAuthEnum devFileBucketAuthEnum) { + setFileAcl(bucketName, "*", devFileBucketAuthEnum); + } + + /** + * 判断是否存在文件 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static boolean isExistingFile(String bucketName, String key) { + try { + initClient(); + InputStream object = client.getObject(bucketName, key); + return !ObjectUtil.isEmpty(object); + } catch (Exception e) { + return false; + } + } + + /** + * 存储文件,不返回地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param file 文件 + * @author xuyuxiang + * @date 2022/1/5 23:45 + */ + public static void storageFile(String bucketName, String key, File file) { + BufferedInputStream inputStream; + try { + inputStream = FileUtil.getInputStream(file); + } catch (IORuntimeException e) { + throw new CommonException("获取文件流异常,名称是:{}", file.getName()); + } + storageFile(bucketName, key, inputStream); + } + + /** + * 存储文件,不返回地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param multipartFile 文件 + * @author xuyuxiang + * @date 2022/1/5 23:45 + */ + public static void storageFile(String bucketName, String key, MultipartFile multipartFile) { + InputStream inputStream; + try { + inputStream = multipartFile.getInputStream(); + } catch (IOException e) { + throw new CommonException("获取文件流异常,名称是:{}", multipartFile.getName()); + } + storageFile(bucketName, key, inputStream); + } + + /** + * 存储文件,不返回地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param bytes 文件字节数组 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void storageFile(String bucketName, String key, byte[] bytes) { + ByteArrayInputStream byteArrayInputStream = null; + try { + initClient(); + byteArrayInputStream = new ByteArrayInputStream(bytes); + client.putObject(bucketName, key, new ByteArrayInputStream(bytes), bytes.length, getFileContentType(key)); + } catch (Exception e) { + throw new CommonException(e.getMessage()); + } finally { + IoUtil.close(byteArrayInputStream); + } + } + + /** + * 存储文件,不返回地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param inputStream 文件流 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void storageFile(String bucketName, String key, InputStream inputStream) { + try { + initClient(); + client.putObject(bucketName, key, inputStream, inputStream.available(), getFileContentType(key)); + } catch (Exception e) { + throw new CommonException(e.getMessage()); + } finally { + IoUtil.close(inputStream); + } + } + + /** + * 存储文件,返回外网地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param file 文件 + * @author xuyuxiang + * @date 2022/1/5 23:45 + */ + public static String storageFileWithReturnUrl(String bucketName, String key, File file) { + storageFile(bucketName, key, file); + setFileAcl(bucketName, key, DevFileBucketAuthEnum.PUBLIC_READ); + return getFileAuthUrl(bucketName, key); + } + + /** + * 存储文件,返回外网地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param multipartFile 文件 + * @author xuyuxiang + * @date 2022/1/5 23:45 + */ + public static String storageFileWithReturnUrl(String bucketName, String key, MultipartFile multipartFile) { + storageFile(bucketName, key, multipartFile); + setFileAcl(bucketName, key, DevFileBucketAuthEnum.PUBLIC_READ); + return getFileAuthUrl(bucketName, key); + } + + /** + * 存储文件,返回外网地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param bytes 文件字节数组 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static String storageFileWithReturnUrl(String bucketName, String key, byte[] bytes) { + storageFile(bucketName, key, bytes); + setFileAcl(bucketName, key, DevFileBucketAuthEnum.PUBLIC_READ); + return getFileAuthUrl(bucketName, key); + } + + /** + * 存储文件,返回外网地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param inputStream 文件流 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static String storageFileWithReturnUrl(String bucketName, String key, InputStream inputStream) { + storageFile(bucketName, key, inputStream); + setFileAcl(bucketName, key, DevFileBucketAuthEnum.PUBLIC_READ); + return getFileAuthUrl(bucketName, key); + } + + /** + * 获取某个bucket下的文件字节 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static byte[] getFileBytes(String bucketName, String key) { + try { + initClient(); + InputStream inputStream = client.getObject(bucketName, key); + return IoUtil.readBytes(inputStream); + } catch (Exception e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 设置文件访问权限管理 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param devFileBucketAuthEnum 文件权限 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void setFileAcl(String bucketName, String key, DevFileBucketAuthEnum devFileBucketAuthEnum) { + try { + if (devFileBucketAuthEnum.equals(DevFileBucketAuthEnum.PRIVATE)) { + client.setBucketPolicy(bucketName, key, PolicyType.NONE); + } else if (devFileBucketAuthEnum.equals(DevFileBucketAuthEnum.PUBLIC_READ)) { + client.setBucketPolicy(bucketName, key, PolicyType.READ_ONLY); + } else if (devFileBucketAuthEnum.equals(DevFileBucketAuthEnum.PUBLIC_READ_WRITE)) { + client.setBucketPolicy(bucketName, key, PolicyType.READ_WRITE); + } + } catch (Exception e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 拷贝文件 + * + * @param originBucketName 源文件桶 + * @param originFileKey 源文件名称 + * @param newBucketName 新文件桶 + * @param newFileKey 新文件名称 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void copyFile(String originBucketName, String originFileKey, String newBucketName, String newFileKey) { + try { + initClient(); + client.copyObject(originBucketName, originFileKey, newBucketName, newFileKey); + } catch (Exception e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 获取文件的下载地址(带鉴权和有效时间的),生成外网地址 + * + * @param bucketName 文件桶 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param timeoutMillis 时效 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static String getFileAuthUrl(String bucketName, String key, Long timeoutMillis) { + try { + initClient(); + return client.getPresignedObjectUrl(Method.GET, bucketName, key, timeoutMillis.intValue(), null); + } catch (Exception e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 获取文件的下载地址(永久的,文件必须为公有读),生成外网地址 + * + * @param bucketName 文件桶 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static String getFileAuthUrl(String bucketName, String key) { + try { + initClient(); + DevConfigApi devConfigApi = SpringUtil.getBean(DevConfigApi.class); + return devConfigApi.getValueByKey(SNOWY_FILE_MINIO_END_POINT_KEY) + StrUtil.SLASH + bucketName + StrUtil.SLASH + key; + } catch (Exception e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 删除文件 + * + * @param bucketName 文件桶 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void deleteFile(String bucketName, String key) { + try { + client.removeObject(bucketName, key); + } catch (Exception e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 根据文件名获取ContentType + * + * @author xuyuxiang + * @date 2022/1/6 11:27 + **/ + private static String getFileContentType(String key) { + // 根据文件名获取contentType + String contentType = "application/octet-stream"; + if (key.contains(".")) { + contentType = MimetypesFileTypeMap.getDefaultFileTypeMap().getContentType(key); + } + return contentType; + } + +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/util/DevFileTencentUtil.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/util/DevFileTencentUtil.java new file mode 100644 index 00000000..7cbaf8da --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/util/DevFileTencentUtil.java @@ -0,0 +1,503 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.file.util; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.qcloud.cos.COSClient; +import com.qcloud.cos.ClientConfig; +import com.qcloud.cos.auth.BasicCOSCredentials; +import com.qcloud.cos.auth.COSCredentials; +import com.qcloud.cos.exception.CosClientException; +import com.qcloud.cos.http.HttpMethodName; +import com.qcloud.cos.model.*; +import com.qcloud.cos.region.Region; +import com.qcloud.cos.transfer.TransferManager; +import com.qcloud.cos.transfer.TransferManagerConfiguration; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.multipart.MultipartFile; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.dev.api.DevConfigApi; +import vip.xiaonuo.dev.modular.file.enums.DevFileBucketAuthEnum; + +import javax.activation.MimetypesFileTypeMap; +import java.io.*; +import java.net.URL; +import java.util.Date; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * 腾讯云文件工具类 + * 参考文档:https://cloud.tencent.com/document/product/436/10199 + * + * @author xuyuxiang + * @date 2022/1/2 18:13 + */ +@Slf4j +public class DevFileTencentUtil { + + private static COSClient client; + + private static String defaultBucketName; + + private static TransferManager transferManager; + + private static final String SNOWY_FILE_TENCENT_SECRET_ID_KEY = "SNOWY_FILE_TENCENT_SECRET_ID"; + private static final String SNOWY_FILE_TENCENT_SECRET_KEY_KEY = "SNOWY_FILE_TENCENT_SECRET_KEY"; + private static final String SNOWY_FILE_TENCENT_REGION_ID_KEY = "SNOWY_FILE_TENCENT_REGION_ID"; + private static final String SNOWY_FILE_TENCENT_DEFAULT_BUCKET_NAME = "SNOWY_FILE_TENCENT_DEFAULT_BUCKET_NAME"; + + /** + * 初始化操作的客户端 + * + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + private static void initClient() { + + DevConfigApi devConfigApi = SpringUtil.getBean(DevConfigApi.class); + + /* secretId */ + String secretId = devConfigApi.getValueByKey(SNOWY_FILE_TENCENT_SECRET_ID_KEY); + + if(ObjectUtil.isEmpty(secretId)) { + throw new CommonException("腾讯云文件操作客户端未正确配置:secretId为空"); + } + + /* secretKey */ + String secretKey = devConfigApi.getValueByKey(SNOWY_FILE_TENCENT_SECRET_KEY_KEY); + + if(ObjectUtil.isEmpty(secretKey)) { + throw new CommonException("腾讯云文件操作客户端未正确配置:secretKey为空"); + } + + /* regionId */ + String regionId = devConfigApi.getValueByKey(SNOWY_FILE_TENCENT_REGION_ID_KEY); + + if(ObjectUtil.isEmpty(regionId)) { + throw new CommonException("腾讯云文件操作客户端未正确配置:regionId为空"); + } + + /* 默认BucketName */ + defaultBucketName = devConfigApi.getValueByKey(SNOWY_FILE_TENCENT_DEFAULT_BUCKET_NAME); + + if(ObjectUtil.isEmpty(defaultBucketName)) { + throw new CommonException("腾讯云文件操作客户端未正确配置:defaultBucketName为空"); + } + + + // 1.初始化用户身份信息 + Region region = new Region(regionId); + COSCredentials cred = new BasicCOSCredentials(secretId, secretKey); + + // 2.设置 bucket 的区域, COS 地域的简称请参照 https://cloud.tencent.com/document/product/436/6224 + + ClientConfig clientConfig = new ClientConfig(region); + + // 3.生成 cos 客户端。 + client = new COSClient(cred, clientConfig); + + // 4.线程池大小,建议在客户端与 COS 网络充足(例如使用腾讯云的 CVM,同地域上传 COS)的情况下,设置成16或32即可,可较充分的利用网络资源 + // 对于使用公网传输且网络带宽质量不高的情况,建议减小该值,避免因网速过慢,造成请求超时。 + ExecutorService threadPool = Executors.newFixedThreadPool(32); + + // 5.传入一个线程池, 若不传入线程池,默认 TransferManager 中会生成一个单线程的线程池。 + transferManager = new TransferManager(client, threadPool); + + // 6.设置高级接口的分块上传阈值和分块大小为10MB + TransferManagerConfiguration transferManagerConfiguration = new TransferManagerConfiguration(); + transferManagerConfiguration.setMultipartUploadThreshold(10 * 1024 * 1024); + transferManagerConfiguration.setMinimumUploadPartSize(10 * 1024 * 1024); + transferManager.setConfiguration(transferManagerConfiguration); + } + + /** + * 获取默认存储桶名称 + * + * @author xuyuxiang + * @date 2022/6/22 18:05 + **/ + public static String getDefaultBucketName() { + initClient(); + return defaultBucketName; + } + + /** + * 销毁操作的客户端 + * + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void destroyClient() { + initClient(); + client.shutdown(); + } + + /** + * 获取操作的客户端 + * + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static COSClient getClient() { + initClient(); + return client; + } + + /** + * 查询存储桶是否存在 + * 例如:传入参数examplebucket-1250000000,返回true代表存在此桶 + * + * @param bucketName 桶名称 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static boolean doesBucketExist(String bucketName) { + try { + initClient(); + return client.doesBucketExist(bucketName); + } catch (CosClientException e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 设置预定义策略 + * 预定义策略如公有读、公有读写、私有读 + * + * @param bucketName 桶名称 + * @param devFileBucketAuthEnum 存储桶权限 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void setBucketAcl(String bucketName, DevFileBucketAuthEnum devFileBucketAuthEnum) { + try { + initClient(); + if (devFileBucketAuthEnum.equals(DevFileBucketAuthEnum.PRIVATE)) { + client.setBucketAcl(bucketName, CannedAccessControlList.Private); + } else if (devFileBucketAuthEnum.equals(DevFileBucketAuthEnum.PUBLIC_READ)) { + client.setBucketAcl(bucketName, CannedAccessControlList.PublicRead); + } else if (devFileBucketAuthEnum.equals(DevFileBucketAuthEnum.PUBLIC_READ_WRITE)) { + client.setBucketAcl(bucketName, CannedAccessControlList.PublicReadWrite); + } + } catch (CosClientException e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 判断是否存在文件 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static boolean isExistingFile(String bucketName, String key) { + try { + initClient(); + client.getObjectMetadata(bucketName, key); + return true; + } catch (CosClientException e) { + return false; + } + } + + /** + * 存储文件,不返回地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param file 文件 + * @author xuyuxiang + * @date 2022/1/5 23:45 + */ + public static void storageFile(String bucketName, String key, File file) { + BufferedInputStream inputStream; + try { + inputStream = FileUtil.getInputStream(file); + } catch (IORuntimeException e) { + throw new CommonException("获取文件流异常,名称是:{}", file.getName()); + } + storageFile(bucketName, key, inputStream); + } + + /** + * 存储文件,不返回地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param multipartFile 文件 + * @author xuyuxiang + * @date 2022/1/5 23:45 + */ + public static void storageFile(String bucketName, String key, MultipartFile multipartFile) { + InputStream inputStream; + try { + inputStream = multipartFile.getInputStream(); + } catch (IOException e) { + throw new CommonException("获取文件流异常,名称是:{}", multipartFile.getName()); + } + storageFile(bucketName, key, inputStream); + } + + /** + * 存储文件,不返回地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param bytes 文件字节数组 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void storageFile(String bucketName, String key, byte[] bytes) { + ByteArrayInputStream byteArrayInputStream = null; + try { + initClient(); + byteArrayInputStream = new ByteArrayInputStream(bytes); + ObjectMetadata objectMetadata = new ObjectMetadata(); + objectMetadata.setContentType(getFileContentType(key)); + client.putObject(bucketName, key, new ByteArrayInputStream(bytes), objectMetadata); + } catch (CosClientException e) { + throw new CommonException(e.getMessage()); + } finally { + IoUtil.close(byteArrayInputStream); + } + } + + /** + * 存储文件,不返回地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param inputStream 文件流 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void storageFile(String bucketName, String key, InputStream inputStream) { + try { + initClient(); + ObjectMetadata objectMetadata = new ObjectMetadata(); + objectMetadata.setContentType(getFileContentType(key)); + client.putObject(bucketName, key, inputStream, objectMetadata); + } catch (CosClientException e) { + throw new CommonException(e.getMessage()); + } finally { + IoUtil.close(inputStream); + } + } + + /** + * 存储文件,返回外网地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param file 文件 + * @author xuyuxiang + * @date 2022/1/5 23:45 + */ + public static String storageFileWithReturnUrl(String bucketName, String key, File file) { + storageFile(bucketName, key, file); + setFileAcl(bucketName, key, DevFileBucketAuthEnum.PUBLIC_READ); + return getFileAuthUrl(bucketName, key); + } + + /** + * 存储文件,返回外网地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param multipartFile 文件 + * @author xuyuxiang + * @date 2022/1/5 23:45 + */ + public static String storageFileWithReturnUrl(String bucketName, String key, MultipartFile multipartFile) { + storageFile(bucketName, key, multipartFile); + setFileAcl(bucketName, key, DevFileBucketAuthEnum.PUBLIC_READ); + return getFileAuthUrl(bucketName, key); + } + + /** + * 存储文件,返回外网地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param bytes 文件字节数组 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static String storageFileWithReturnUrl(String bucketName, String key, byte[] bytes) { + storageFile(bucketName, key, bytes); + setFileAcl(bucketName, key, DevFileBucketAuthEnum.PUBLIC_READ); + return getFileAuthUrl(bucketName, key); + } + + /** + * 存储文件,返回外网地址 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param inputStream 文件流 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static String storageFileWithReturnUrl(String bucketName, String key, InputStream inputStream) { + storageFile(bucketName, key, inputStream); + setFileAcl(bucketName, key, DevFileBucketAuthEnum.PUBLIC_READ); + return getFileAuthUrl(bucketName, key); + } + + /** + * 获取某个bucket下的文件字节 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static byte[] getFileBytes(String bucketName, String key) { + COSObjectInputStream cosObjectInput = null; + try { + initClient(); + GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key); + COSObject cosObject = client.getObject(getObjectRequest); + cosObjectInput = cosObject.getObjectContent(); + return IoUtil.readBytes(cosObjectInput); + } catch (CosClientException e) { + throw new CommonException(e.getMessage()); + } finally { + IoUtil.close(cosObjectInput); + } + } + + /** + * 设置文件访问权限管理 + * + * @param bucketName 桶名称 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param devFileBucketAuthEnum 文件权限 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void setFileAcl(String bucketName, String key, DevFileBucketAuthEnum devFileBucketAuthEnum) { + try { + initClient(); + if (devFileBucketAuthEnum.equals(DevFileBucketAuthEnum.PRIVATE)) { + client.setObjectAcl(bucketName, key, CannedAccessControlList.Private); + } else if (devFileBucketAuthEnum.equals(DevFileBucketAuthEnum.PUBLIC_READ)) { + client.setObjectAcl(bucketName, key, CannedAccessControlList.PublicRead); + } else if (devFileBucketAuthEnum.equals(DevFileBucketAuthEnum.PUBLIC_READ_WRITE)) { + client.setObjectAcl(bucketName, key, CannedAccessControlList.PublicReadWrite); + } + } catch (CosClientException e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 拷贝文件 + * + * @param originBucketName 源文件桶 + * @param originFileKey 源文件名称 + * @param newBucketName 新文件桶 + * @param newFileKey 新文件名称 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void copyFile(String originBucketName, String originFileKey, String newBucketName, String newFileKey) { + try { + initClient(); + transferManager.copy(originBucketName, originFileKey, newBucketName, newFileKey); + } catch (CosClientException e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 获取文件的下载地址(带鉴权和有效时间的),生成外网地址 + * + * @param bucketName 文件桶 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @param timeoutMillis 时效 + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static String getFileAuthUrl(String bucketName, String key, Long timeoutMillis) { + GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, key, HttpMethodName.GET); + Date expirationDate = new Date(System.currentTimeMillis() + timeoutMillis); + request.setExpiration(expirationDate); + URL url; + try { + initClient(); + url = client.generatePresignedUrl(request); + } catch (CosClientException e) { + throw new CommonException(e.getMessage()); + } + return url.toString(); + } + + /** + * 获取文件的下载地址(永久的,文件必须为公有读),生成外网地址 + * + * @param bucketName 文件桶 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static String getFileAuthUrl(String bucketName, String key) { + URL url; + try { + initClient(); + url = client.getObjectUrl(bucketName, key); + } catch (CosClientException e) { + throw new CommonException(e.getMessage()); + } + return url.toString(); + } + + /** + * 删除文件 + * + * @param bucketName 文件桶 + * @param key 唯一标示id,例如a.txt, doc/a.txt + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + public static void deleteFile(String bucketName, String key) { + try{ + initClient(); + client.deleteObject(bucketName, key); + } catch (CosClientException e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 根据文件名获取ContentType + * + * @author xuyuxiang + * @date 2022/1/6 11:27 + **/ + private static String getFileContentType(String key) { + // 根据文件名获取contentType + String contentType = "application/octet-stream"; + if (key.contains(".")) { + contentType = MimetypesFileTypeMap.getDefaultFileTypeMap().getContentType(key); + } + return contentType; + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/controller/DevJobController.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/controller/DevJobController.java new file mode 100644 index 00000000..1211d8c8 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/controller/DevJobController.java @@ -0,0 +1,179 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.job.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.pojo.CommonValidList; +import vip.xiaonuo.dev.modular.job.entity.DevJob; +import vip.xiaonuo.dev.modular.job.param.*; +import vip.xiaonuo.dev.modular.job.service.DevJobService; + +import javax.annotation.Resource; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * 定时任务控制器 + * + * @author xuyuxiang + * @date 2022/8/5 10:48 + **/ +@Api(tags = "定时任务控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 7) +@RestController +@Validated +public class DevJobController { + + @Resource + private DevJobService devJobService; + + /** + * 获取定时任务分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("获取定时任务分页") + @GetMapping("/dev/job/page") + public CommonResult> page(DevJobPageParam devJobPageParam) { + return CommonResult.data(devJobService.page(devJobPageParam)); + } + + /** + * 获取定时任务列表 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("获取定时任务列表") + @GetMapping("/dev/job/list") + public CommonResult> list(DevJobListParam devJobListParam) { + return CommonResult.data(devJobService.list(devJobListParam)); + } + + /** + * 添加定时任务 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("添加定时任务") + @CommonLog("添加定时任务") + @PostMapping("/dev/job/add") + public CommonResult add(@RequestBody @Valid DevJobAddParam devJobAddParam) { + devJobService.add(devJobAddParam); + return CommonResult.ok(); + } + + /** + * 编辑定时任务 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 4) + @ApiOperation("编辑定时任务") + @CommonLog("编辑定时任务") + @PostMapping("/dev/job/edit") + public CommonResult edit(@RequestBody @Valid DevJobEditParam devJobEditParam) { + devJobService.edit(devJobEditParam); + return CommonResult.ok(); + } + + /** + * 删除定时任务 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 5) + @ApiOperation("删除定时任务") + @CommonLog("删除定时任务") + @PostMapping("/dev/job/delete") + public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList devJobIdParamList) { + devJobService.delete(devJobIdParamList); + return CommonResult.ok(); + } + + /** + * 获取定时任务详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 6) + @ApiOperation("获取定时任务详情") + @GetMapping("/dev/job/detail") + public CommonResult detail(@Valid DevJobIdParam devJobIdParam) { + return CommonResult.data(devJobService.detail(devJobIdParam)); + } + + /** + * 停止定时任务 + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 6) + @ApiOperation("停止定时任务") + @CommonLog("停止定时任务") + @PostMapping("/dev/job/stopJob") + public CommonResult stopJob(@RequestBody DevJobIdParam devJobIdParam) { + devJobService.stopJob(devJobIdParam); + return CommonResult.ok(); + } + + /** + * 运行定时任务 + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 7) + @ApiOperation("运行定时任务") + @CommonLog("运行定时任务") + @PostMapping("/dev/job/runJob") + public CommonResult runJob(@RequestBody @Valid DevJobIdParam devJobIdParam) { + devJobService.runJob(devJobIdParam); + return CommonResult.ok(); + } + + /** + * 获取定时任务类 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 8) + @ApiOperation("获取定时任务类") + @GetMapping("/dev/job/getActionClass") + public CommonResult> getActionClass() { + return CommonResult.data(devJobService.getActionClass()); + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/entity/DevJob.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/entity/DevJob.java new file mode 100644 index 00000000..822b637d --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/entity/DevJob.java @@ -0,0 +1,71 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.job.entity; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import vip.xiaonuo.common.pojo.CommonEntity; + +/** + * 定时任务实体类 + * + * @author xuyuxiang + * @date 2022/8/5 10:38 + **/ +@Getter +@Setter +@TableName("DEV_JOB") +public class DevJob extends CommonEntity { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 名称 */ + @ApiModelProperty(value = "名称", position = 2) + private String name; + + /** 编码 */ + @ApiModelProperty(value = "编码", position = 3) + private String code; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 4) + private String category; + + /** 任务类名 */ + @ApiModelProperty(value = "任务类名", position = 5) + private String actionClass; + + /** cron表达式 */ + @ApiModelProperty(value = "cron表达式", position = 6) + private String cronExpression; + + /** 任务状态 */ + @ApiModelProperty(value = "任务状态", position = 7) + private String jobStatus; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 8) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 9) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String extJson; + +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/enums/DevJobCategoryEnum.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/enums/DevJobCategoryEnum.java new file mode 100644 index 00000000..59730b78 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/enums/DevJobCategoryEnum.java @@ -0,0 +1,49 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.job.enums; + +import lombok.Getter; +import vip.xiaonuo.common.exception.CommonException; + +/** + * 定时任务分类枚举 + * + * @author xuyuxiang + * @date 2022/7/6 22:21 + */ +@Getter +public enum DevJobCategoryEnum { + + /** + * 框架 + */ + FRM("FRM"), + + /** + * 业务 + */ + BIZ("BIZ"); + + private final String value; + + DevJobCategoryEnum(String value) { + this.value = value; + } + + public static void validate(String value) { + boolean flag = FRM.getValue().equals(value) || BIZ.getValue().equals(value); + if(!flag) { + throw new CommonException("不支持的定时任务分类:{}", value); + } + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/enums/DevJobStatusEnum.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/enums/DevJobStatusEnum.java new file mode 100644 index 00000000..9b95c9d2 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/enums/DevJobStatusEnum.java @@ -0,0 +1,49 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.job.enums; + +import lombok.Getter; +import vip.xiaonuo.common.exception.CommonException; + +/** + * 定时任务状态枚举 + * + * @author xuyuxiang + * @date 2022/4/27 21:47 + */ +@Getter +public enum DevJobStatusEnum { + + /** + * 运行 + */ + RUNNING("RUNNING"), + + /** + * 停止 + */ + STOPPED("STOPPED"); + + private final String value; + + DevJobStatusEnum(String value) { + this.value = value; + } + + public static void validate(String value) { + boolean flag = RUNNING.getValue().equals(value) || STOPPED.getValue().equals(value); + if(!flag) { + throw new CommonException("不支持的定时任务状态:{}", value); + } + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/mapper/DevJobMapper.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/mapper/DevJobMapper.java new file mode 100644 index 00000000..9815fd1d --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/mapper/DevJobMapper.java @@ -0,0 +1,26 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.job.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.dev.modular.job.entity.DevJob; + +/** + * 定时任务Mapper接口 + * + * @author xuyuxiang + * @date 2022/8/5 10:45 + **/ +public interface DevJobMapper extends BaseMapper { + +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/mapper/mapping/DevJobMapper.xml b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/mapper/mapping/DevJobMapper.xml new file mode 100644 index 00000000..736e7d7e --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/mapper/mapping/DevJobMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/param/DevJobAddParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/param/DevJobAddParam.java new file mode 100644 index 00000000..f8faad3c --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/param/DevJobAddParam.java @@ -0,0 +1,60 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.job.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 定时任务添加参数 + * + * @author xuyuxiang + * @date 2022/7/30 17:53 + */ +@Getter +@Setter +public class DevJobAddParam { + + /** 名称 */ + @ApiModelProperty(value = "名称", required = true, position = 1) + @NotBlank(message = "name不能为空") + private String name; + + /** 分类 */ + @ApiModelProperty(value = "分类", required = true, position = 2) + @NotBlank(message = "category不能为空") + private String category; + + /** 任务类名 */ + @ApiModelProperty(value = "任务类名", required = true, position = 3) + @NotBlank(message = "actionClass不能为空") + private String actionClass; + + /** cron表达式 */ + @ApiModelProperty(value = "cron表达式", required = true, position = 4) + @NotBlank(message = "cronExpression不能为空") + private String cronExpression; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", required = true, position = 5) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 6) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/param/DevJobEditParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/param/DevJobEditParam.java new file mode 100644 index 00000000..e9c871f6 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/param/DevJobEditParam.java @@ -0,0 +1,65 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.job.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 定时任务编辑参数 + * + * @author xuyuxiang + * @date 2022/7/30 17:53 + */ +@Getter +@Setter +public class DevJobEditParam { + + /** id */ + @ApiModelProperty(value = "id", required = true, position = 1) + @NotBlank(message = "id不能为空") + private String id; + + /** 名称 */ + @ApiModelProperty(value = "名称", required = true, position = 2) + @NotBlank(message = "name不能为空") + private String name; + + /** 分类 */ + @ApiModelProperty(value = "分类", required = true, position = 3) + @NotBlank(message = "category不能为空") + private String category; + + /** 任务类名 */ + @ApiModelProperty(value = "任务类名", required = true, position = 4) + @NotBlank(message = "actionClass不能为空") + private String actionClass; + + /** cron表达式 */ + @ApiModelProperty(value = "cron表达式", required = true, position = 5) + @NotBlank(message = "cronExpression不能为空") + private String cronExpression; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", required = true, position = 6) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 7) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/param/DevJobIdParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/param/DevJobIdParam.java new file mode 100644 index 00000000..095da427 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/param/DevJobIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.job.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 定时任务Id参数 + * + * @author xuyuxiang + * @date 2022/7/30 17:52 + */ +@Getter +@Setter +public class DevJobIdParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/param/DevJobListParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/param/DevJobListParam.java new file mode 100644 index 00000000..24162307 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/param/DevJobListParam.java @@ -0,0 +1,40 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.job.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 定时任务列表参数 + * + * @author xuyuxiang + * @date 2022/7/30 17:53 + */ +@Getter +@Setter +public class DevJobListParam { + + /** 任务分类 */ + @ApiModelProperty(value = "任务分类") + private String category; + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; + + /** 任务状态 */ + @ApiModelProperty(value = "任务状态") + private String jobStatus; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/param/DevJobPageParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/param/DevJobPageParam.java new file mode 100644 index 00000000..afd87e2b --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/param/DevJobPageParam.java @@ -0,0 +1,56 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.job.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 定时任务查询参数 + * + * @author xuyuxiang + * @date 2022/7/30 17:53 + */ +@Getter +@Setter +public class DevJobPageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 任务分类 */ + @ApiModelProperty(value = "任务分类") + private String category; + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; + + /** 任务状态 */ + @ApiModelProperty(value = "任务状态") + private String jobStatus; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/provider/DevJobApiProvider.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/provider/DevJobApiProvider.java new file mode 100644 index 00000000..9da6092b --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/provider/DevJobApiProvider.java @@ -0,0 +1,26 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.job.provider; + +import org.springframework.stereotype.Service; +import vip.xiaonuo.dev.api.DevJobApi; + +/** + * 定时任务API接口实现类 + * + * @author xuyuxiang + * @date 2022/9/2 16:06 + */ +@Service +public class DevJobApiProvider implements DevJobApi { +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/service/DevJobService.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/service/DevJobService.java new file mode 100644 index 00000000..2be83edf --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/service/DevJobService.java @@ -0,0 +1,109 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.job.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import vip.xiaonuo.dev.modular.job.entity.DevJob; +import vip.xiaonuo.dev.modular.job.param.*; + +import java.util.List; + +/** + * 定时任务Service接口 + * + * @author xuyuxiang + * @date 2022/8/5 10:46 + **/ +public interface DevJobService extends IService { + + /** + * 获取定时任务分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + Page page(DevJobPageParam devJobPageParam); + + /** + * 获取定时任务列表 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + List list(DevJobListParam devJobListParam); + + /** + * 添加定时任务 + * + * @author xuyuxiang + * @date 2022/4/24 20:48 + */ + void add(DevJobAddParam devJobAddParam); + + /** + * 编辑定时任务 + * + * @author xuyuxiang + * @date 2022/4/24 21:13 + */ + void edit(DevJobEditParam devJobEditParam); + + /** + * 删除定时任务 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + void delete(List devJobIdParamList); + + /** + * 获取定时任务详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + DevJob detail(DevJobIdParam devJobIdParam); + + /** + * 获取定时任务详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + DevJob queryEntity(String id); + + /** + * 停止定时任务 + * + * @author xuyuxiang + * @date 2022/7/5 18:20 + **/ + void stopJob(DevJobIdParam devJobIdParam); + + /** + * 运行定时任务 + * + * @author xuyuxiang + * @date 2022/7/5 18:21 + **/ + void runJob(DevJobIdParam devJobIdParam); + + /** + * 获取定时任务类 + * + * @author xuyuxiang + * @date 2022/8/22 9:35 + **/ + List getActionClass(); +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/service/impl/DevJobServiceImpl.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/service/impl/DevJobServiceImpl.java new file mode 100644 index 00000000..1bc0af3b --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/service/impl/DevJobServiceImpl.java @@ -0,0 +1,232 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.job.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.cron.CronUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.scheduling.support.CronExpression; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import vip.xiaonuo.common.enums.CommonSortOrderEnum; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.common.timer.CommonTimerTaskRunner; +import vip.xiaonuo.dev.modular.job.entity.DevJob; +import vip.xiaonuo.dev.modular.job.enums.DevJobCategoryEnum; +import vip.xiaonuo.dev.modular.job.enums.DevJobStatusEnum; +import vip.xiaonuo.dev.modular.job.mapper.DevJobMapper; +import vip.xiaonuo.dev.modular.job.param.*; +import vip.xiaonuo.dev.modular.job.service.DevJobService; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 定时任务Service接口实现类 + * + * @author xuyuxiang + * @date 2022/8/5 10:47 + **/ +@Service +public class DevJobServiceImpl extends ServiceImpl implements DevJobService { + + @Override + public Page page(DevJobPageParam devJobPageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + // 查询部分字段 + queryWrapper.lambda().select(DevJob::getId, DevJob::getName, DevJob::getCategory, + DevJob::getActionClass, DevJob::getCronExpression, DevJob::getJobStatus, DevJob::getSortCode); + if(ObjectUtil.isNotEmpty(devJobPageParam.getCategory())) { + queryWrapper.lambda().eq(DevJob::getCategory, devJobPageParam.getCategory()); + } + if(ObjectUtil.isNotEmpty(devJobPageParam.getSearchKey())) { + queryWrapper.lambda().like(DevJob::getName, devJobPageParam.getSearchKey()); + } + if(ObjectUtil.isNotEmpty(devJobPageParam.getJobStatus())) { + queryWrapper.lambda().like(DevJob::getJobStatus, devJobPageParam.getJobStatus()); + } + if(ObjectUtil.isAllNotEmpty(devJobPageParam.getSortField(), devJobPageParam.getSortOrder())) { + CommonSortOrderEnum.validate(devJobPageParam.getSortOrder()); + queryWrapper.orderBy(true, devJobPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), + StrUtil.toUnderlineCase(devJobPageParam.getSortField())); + } else { + queryWrapper.lambda().orderByAsc(DevJob::getSortCode); + } + return this.page(CommonPageRequest.defaultPage(), queryWrapper); + } + + @Override + public List list(DevJobListParam devJobListParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + // 查询部分字段 + lambdaQueryWrapper.select(DevJob::getId, DevJob::getName, DevJob::getCategory, + DevJob::getActionClass, DevJob::getCronExpression, DevJob::getJobStatus, DevJob::getSortCode); + if(ObjectUtil.isNotEmpty(devJobListParam.getCategory())) { + lambdaQueryWrapper.eq(DevJob::getCategory, devJobListParam.getCategory()); + } + if(ObjectUtil.isNotEmpty(devJobListParam.getSearchKey())) { + lambdaQueryWrapper.like(DevJob::getName, devJobListParam.getSearchKey()); + } + if(ObjectUtil.isNotEmpty(devJobListParam.getJobStatus())) { + lambdaQueryWrapper.like(DevJob::getJobStatus, devJobListParam.getJobStatus()); + } + return this.list(lambdaQueryWrapper); + } + + @Override + public void add(DevJobAddParam devJobAddParam) { + checkParam(devJobAddParam); + DevJob devJob = BeanUtil.toBean(devJobAddParam, DevJob.class); + devJob.setCode(RandomUtil.randomString(10)); + devJob.setJobStatus(DevJobStatusEnum.STOPPED.getValue()); + this.save(devJob); + } + + private void checkParam(DevJobAddParam devJobAddParam) { + DevJobCategoryEnum.validate(devJobAddParam.getCategory()); + if(!CronExpression.isValidExpression(devJobAddParam.getCronExpression())) { + throw new CommonException("cron表达式:{}格式不正确", devJobAddParam.getCronExpression()); + } + try { + Class actionClass = Class.forName(devJobAddParam.getActionClass()); + if(!CommonTimerTaskRunner.class.isAssignableFrom(actionClass)) { + List actionClassArr = StrUtil.split(devJobAddParam.getActionClass(), StrUtil.DOT); + throw new CommonException("定时任务对应的类:{}不符合要求", actionClassArr.get(actionClassArr.size() - 1)); + } + } catch (ClassNotFoundException e) { + throw new CommonException("定时任务找不到对应的类,名称为:{}", devJobAddParam.getActionClass()); + } + boolean hasSameJob = this.count(new LambdaQueryWrapper() + .eq(DevJob::getActionClass, devJobAddParam.getActionClass()) + .eq(DevJob::getCronExpression, devJobAddParam.getCronExpression())) > 0; + if (hasSameJob) { + throw new CommonException("存在重复执行的定时任务,名称为:{}", devJobAddParam.getName()); + } + } + + @Override + public void edit(DevJobEditParam devJobEditParam) { + DevJob devJob = this.queryEntity(devJobEditParam.getId()); + if(devJob.getJobStatus().equals(DevJobStatusEnum.RUNNING.getValue())) { + throw new CommonException("运行中的定时任务不可编辑,id值为:{}", devJob.getId()); + } + checkParam(devJobEditParam); + BeanUtil.copyProperties(devJobEditParam, devJob); + this.updateById(devJob); + } + + private void checkParam(DevJobEditParam devJobEditParam) { + DevJobCategoryEnum.validate(devJobEditParam.getCategory()); + if(!CronExpression.isValidExpression(devJobEditParam.getCronExpression())) { + throw new CommonException("cron表达式:{}格式不正确", devJobEditParam.getCronExpression()); + } + try { + Class actionClass = Class.forName(devJobEditParam.getActionClass()); + if(!CommonTimerTaskRunner.class.isAssignableFrom(actionClass)) { + List actionClassArr = StrUtil.split(devJobEditParam.getActionClass(), StrUtil.DOT); + throw new CommonException("定时任务对应的类:{}不符合要求", actionClassArr.get(actionClassArr.size() - 1)); + } + } catch (ClassNotFoundException e) { + throw new CommonException("定时任务找不到对应的类,名称为:{}", devJobEditParam.getActionClass()); + } + boolean hasSameJob = this.count(new LambdaQueryWrapper() + .eq(DevJob::getActionClass, devJobEditParam.getActionClass()) + .eq(DevJob::getCronExpression, devJobEditParam.getCronExpression()) + .ne(DevJob::getId, devJobEditParam.getId())) > 0; + if (hasSameJob) { + throw new CommonException("存在重复的定时任务,名称为:{}", devJobEditParam.getName()); + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void delete(List devJobIdParamList) { + List devJobIdList = CollStreamUtil.toList(devJobIdParamList, DevJobIdParam::getId); + if(ObjectUtil.isNotEmpty(devJobIdList)) { + // 将运行中的停止 + devJobIdList.forEach(CronUtil::remove); + // 执行删除 + this.removeBatchByIds(devJobIdList); + } + } + + @Override + public DevJob detail(DevJobIdParam devJobIdParam) { + return this.queryEntity(devJobIdParam.getId()); + } + + @Override + public DevJob queryEntity(String id) { + DevJob devJob = this.getById(id); + if(ObjectUtil.isEmpty(devJob)) { + throw new CommonException("定时任务不存在,id值为:{}", id); + } + return devJob; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void stopJob(DevJobIdParam devJobIdParam) { + DevJob devJob = this.detail(devJobIdParam); + if(devJob.getJobStatus().equals(DevJobStatusEnum.STOPPED.getValue())) { + throw new CommonException("定时任务已经处于停止状态,id值为:{}", devJob.getId()); + } + // 将运行中的定时任务停止 + CronUtil.remove(devJob.getId()); + this.update(new LambdaUpdateWrapper().eq(DevJob::getId, devJobIdParam.getId()) + .set(DevJob::getJobStatus, DevJobStatusEnum.STOPPED.getValue())); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void runJob(DevJobIdParam devJobIdParam) { + DevJob devJob = this.detail(devJobIdParam); + if(devJob.getJobStatus().equals(DevJobStatusEnum.RUNNING.getValue())) { + throw new CommonException("定时任务已经处于运行状态,id值为:{}", devJob.getId()); + } + CronUtil.schedule(devJob.getId(), devJob.getCronExpression(), () -> { + try { + // 运行定时任务 + ((CommonTimerTaskRunner) SpringUtil.getBean(Class.forName(devJob.getActionClass()))).action(); + } catch (ClassNotFoundException e) { + throw new CommonException("定时任务找不到对应的类,名称为:{}", devJob.getActionClass()); + } + }); + this.update(new LambdaUpdateWrapper().eq(DevJob::getId, devJobIdParam.getId()) + .set(DevJob::getJobStatus, DevJobStatusEnum.RUNNING.getValue())); + } + + @Override + public List getActionClass() { + Map commonTimerTaskRunnerMap = SpringUtil.getBeansOfType(CommonTimerTaskRunner.class); + if (ObjectUtil.isNotEmpty(commonTimerTaskRunnerMap)) { + Collection values = commonTimerTaskRunnerMap.values(); + return values.stream().map(commonTimerTaskRunner -> commonTimerTaskRunner.getClass().getName()).collect(Collectors.toList()); + } else { + return CollectionUtil.newArrayList(); + } + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/task/DevJobTimerTaskRunner.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/task/DevJobTimerTaskRunner.java new file mode 100644 index 00000000..7ebdf5da --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/job/task/DevJobTimerTaskRunner.java @@ -0,0 +1,34 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.job.task; + +import org.springframework.stereotype.Component; +import vip.xiaonuo.common.timer.CommonTimerTaskRunner; + +/** + * 定时器的一个示例 + * + * @author xuyuxiang + * @date 2022/8/5 15:52 + **/ +@Component +public class DevJobTimerTaskRunner implements CommonTimerTaskRunner { + + private int n = 1; + + @Override + public void action() { + System.out.println("我是一个定时任务,正在在被执行第" + n + "次"); + n = n + 1; + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/controller/DevLogController.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/controller/DevLogController.java new file mode 100644 index 00000000..08fda4a9 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/controller/DevLogController.java @@ -0,0 +1,133 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.log.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.dev.modular.log.entity.DevLog; +import vip.xiaonuo.dev.modular.log.param.DevLogDeleteParam; +import vip.xiaonuo.dev.modular.log.param.DevLogPageParam; +import vip.xiaonuo.dev.modular.log.result.DevLogOpBarChartDataResult; +import vip.xiaonuo.dev.modular.log.result.DevLogOpPieChartDataResult; +import vip.xiaonuo.dev.modular.log.result.DevLogVisLineChartDataResult; +import vip.xiaonuo.dev.modular.log.result.DevLogVisPieChartDataResult; +import vip.xiaonuo.dev.modular.log.service.DevLogService; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 日志控制器 + * + * @author xuyuxiang + * @date 2022/9/2 15:15 + */ +@Api(tags = "日志控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 8) +@RestController +@Validated +public class DevLogController { + + @Resource + private DevLogService devLogService; + + /** + * 获取日志分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("获取日志分页") + @GetMapping("/dev/log/page") + public CommonResult> page(DevLogPageParam devLogPageParam) { + return CommonResult.data(devLogService.page(devLogPageParam)); + } + + /** + * 清空日志 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("清空日志") + @CommonLog("清空日志") + @PostMapping("/dev/log/delete") + public CommonResult delete(@RequestBody DevLogDeleteParam devLogDeleteParam) { + devLogService.delete(devLogDeleteParam); + return CommonResult.ok(); + } + + /** + * 获取访问日志折线图数据 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("获取访问日志折线图数据") + @GetMapping("/dev/log/vis/lineChartData") + public CommonResult> visLogLineChartData() { + return CommonResult.data(devLogService.visLogLineChartData()); + } + + /** + * 获取访问日志饼状图数据 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 4) + @ApiOperation("获取访问日志饼状图数据") + @GetMapping("/dev/log/vis/pieChartData") + public CommonResult> visLogPieChartData() { + return CommonResult.data(devLogService.visLogPieChartData()); + } + + /** + * 获取操作日志柱状图数据 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 5) + @ApiOperation("获取操作日志柱状图数据") + @GetMapping("/dev/log/op/barChartData") + public CommonResult> opLogBarChartData() { + return CommonResult.data(devLogService.opLogBarChartData()); + } + + /** + * 获取操作日志饼状图数据 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 5) + @ApiOperation("获取操作日志饼状图数据") + @GetMapping("/dev/log/op/pieChartData") + public CommonResult> opLogPieChartData() { + return CommonResult.data(devLogService.opLogPieChartData()); + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/entity/DevLog.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/entity/DevLog.java new file mode 100644 index 00000000..3e622127 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/entity/DevLog.java @@ -0,0 +1,126 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.log.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +/** + * 日志实体 + * + * @author xuyuxiang + * @date 2022/9/2 15:02 + */ +@Getter +@Setter +@TableName("DEV_LOG") +public class DevLog { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 日志分类 */ + @ApiModelProperty(value = "日志分类", position = 2) + private String category; + + /** 日志名称 */ + @ApiModelProperty(value = "日志名称", position = 3) + private String name; + + /** 执行状态 */ + @ApiModelProperty(value = "执行状态", position = 4) + private String exeStatus; + + /** 具体消息 */ + @ApiModelProperty(value = "具体消息", position = 5) + private String exeMessage; + + /** 操作ip */ + @ApiModelProperty(value = "操作ip", position = 6) + private String opIp; + + /** 操作地址 */ + @ApiModelProperty(value = "操作地址", position = 7) + private String opAddress; + + /** 操作浏览器 */ + @ApiModelProperty(value = "操作浏览器", position = 8) + private String opBrowser; + + /** 操作系统 */ + @ApiModelProperty(value = "操作系统", position = 9) + private String opOs; + + /** 类名称 */ + @ApiModelProperty(value = "类名称", position = 10) + private String className; + + /** 方法名称 */ + @ApiModelProperty(value = "方法名称", position = 11) + private String methodName; + + /** 请求方式 */ + @ApiModelProperty(value = "请求方式", position = 12) + private String reqMethod; + + /** 请求地址 */ + @ApiModelProperty(value = "请求地址", position = 13) + private String reqUrl; + + /** 请求参数 */ + @ApiModelProperty(value = "请求参数", position = 14) + private String paramJson; + + /** 返回结果 */ + @ApiModelProperty(value = "返回结果", position = 15) + private String resultJson; + + /** 操作时间 */ + @ApiModelProperty(value = "操作时间", position = 16) + private Date opTime; + + /** 操作人姓名 */ + @ApiModelProperty(value = "操作人姓名", position = 17) + private String opUser; + + /** 签名数据 */ + @ApiModelProperty(value = "签名数据", position = 18) + private String signData; + + /** 创建时间 */ + @ApiModelProperty(value = "创建时间", position = 19) + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** 创建人 */ + @ApiModelProperty(value = "创建人", position = 20) + @TableField(fill = FieldFill.INSERT) + private String createUser; + + /** 更新时间 */ + @ApiModelProperty(value = "更新时间", position = 21) + @TableField(fill = FieldFill.UPDATE) + private Date updateTime; + + /** 更新人 */ + @ApiModelProperty(value = "更新人", position = 22) + @TableField(fill = FieldFill.UPDATE) + private String updateUser; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/enums/DevLogCategoryEnum.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/enums/DevLogCategoryEnum.java new file mode 100644 index 00000000..c2f9dac6 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/enums/DevLogCategoryEnum.java @@ -0,0 +1,43 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.log.enums; + +import lombok.Getter; + +/** + * 日志分类枚举 + * + * @author xuyuxiang + * @date 2022/6/16 16:14 + **/ +@Getter +public enum DevLogCategoryEnum { + + /** 操作日志 */ + OPERATE("OPERATE"), + + /** 异常日志 */ + EXCEPTION("EXCEPTION"), + + /** 登录日志 */ + LOGIN("LOGIN"), + + /** 登出日志 */ + LOGOUT("LOGOUT"); + + private final String value; + + DevLogCategoryEnum(String value) { + this.value = value; + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/enums/DevLogExeStatusEnum.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/enums/DevLogExeStatusEnum.java new file mode 100644 index 00000000..9d260dca --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/enums/DevLogExeStatusEnum.java @@ -0,0 +1,37 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.log.enums; + +import lombok.Getter; + +/** + * 日志执行状态枚举 + * + * @author xuyuxiang + * @date 2022/6/16 16:14 + **/ +@Getter +public enum DevLogExeStatusEnum { + + /** 成功 */ + SUCCESS("SUCCESS"), + + /** 失败 */ + FAIL("FAIL"); + + private final String value; + + DevLogExeStatusEnum(String value) { + this.value = value; + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/mapper/DevLogMapper.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/mapper/DevLogMapper.java new file mode 100644 index 00000000..7978fd2f --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/mapper/DevLogMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.log.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.dev.modular.log.entity.DevLog; + +/** + * 日志Mapper接口 + * + * @author xuyuxiang + * @date 2022/2/23 18:40 + **/ +public interface DevLogMapper extends BaseMapper { +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/mapper/mapping/DevLogMapper.xml b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/mapper/mapping/DevLogMapper.xml new file mode 100644 index 00000000..d9dde349 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/mapper/mapping/DevLogMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/param/DevLogDeleteParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/param/DevLogDeleteParam.java new file mode 100644 index 00000000..db064935 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/param/DevLogDeleteParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.log.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 日志清空参数 + * + * @author xuyuxiang + * @date 2022/9/6 13:16 + */ +@Getter +@Setter +public class DevLogDeleteParam { + + /** 日志分类 */ + @ApiModelProperty(value = "日志分类", required = true) + @NotBlank(message = "category不能为空") + private String category; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/param/DevLogPageParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/param/DevLogPageParam.java new file mode 100644 index 00000000..78fbd702 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/param/DevLogPageParam.java @@ -0,0 +1,52 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.log.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 日志查询参数 + * + * @author xuyuxiang + * @date 2022/9/2 15:04 + */ +@Getter +@Setter +public class DevLogPageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 日志分类 */ + @ApiModelProperty(value = "日志分类") + private String category; + + /** 日志名称关键词 */ + @ApiModelProperty(value = "日志名称关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/provider/DevLogApiProvider.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/provider/DevLogApiProvider.java new file mode 100644 index 00000000..82bb0fad --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/provider/DevLogApiProvider.java @@ -0,0 +1,65 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.log.provider; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.stereotype.Service; +import vip.xiaonuo.auth.core.util.StpLoginUserUtil; +import vip.xiaonuo.dev.api.DevLogApi; +import vip.xiaonuo.dev.modular.log.entity.DevLog; +import vip.xiaonuo.dev.modular.log.enums.DevLogCategoryEnum; +import vip.xiaonuo.dev.modular.log.service.DevLogService; +import vip.xiaonuo.dev.modular.log.util.DevLogUtil; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 日志API接口实现类 + * + * @author xuyuxiang + * @date 2022/9/2 16:07 + */ +@Service +public class DevLogApiProvider implements DevLogApi { + + @Resource + private DevLogService devLogService; + + @Override + public void executeLoginLog(String userName) { + DevLogUtil.executeLoginLog(userName); + } + + @Override + public void executeLogoutLog(String userName) { + DevLogUtil.executeLogoutLog(userName); + } + + @Override + public List currentUserVisLogList() { + return devLogService.list(new LambdaQueryWrapper().eq(DevLog::getOpUser, StpLoginUserUtil.getLoginUser().getName()) + .in(DevLog::getCategory, DevLogCategoryEnum.LOGIN.getValue(), DevLogCategoryEnum.LOGOUT.getValue()) + .last("limit 0, 10").orderByDesc(DevLog::getCreateTime)).stream().map(JSONUtil::parseObj).collect(Collectors.toList()); + } + + @Override + public List currentUserOpLogList() { + return devLogService.list(new LambdaQueryWrapper().eq(DevLog::getOpUser, StpLoginUserUtil.getLoginUser().getName()) + .in(DevLog::getCategory, DevLogCategoryEnum.OPERATE.getValue(), DevLogCategoryEnum.EXCEPTION.getValue()) + .last("limit 0, 10").orderByDesc(DevLog::getCreateTime)).stream().map(JSONUtil::parseObj).collect(Collectors.toList()); + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/result/DevLogOpBarChartDataResult.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/result/DevLogOpBarChartDataResult.java new file mode 100644 index 00000000..2da7c514 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/result/DevLogOpBarChartDataResult.java @@ -0,0 +1,40 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.log.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 操作日志柱状图数据结果 + * + * @author xuyuxiang + * @date 2022/9/4 21:14 + */ +@Getter +@Setter +public class DevLogOpBarChartDataResult { + + /** 日期 */ + @ApiModelProperty(value = "日期", position = 1) + private String date; + + /** 名称 */ + @ApiModelProperty(value = "名称", position = 2) + private String name; + + /** 数量 */ + @ApiModelProperty(value = "数量", position = 3) + private Long count; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/result/DevLogOpPieChartDataResult.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/result/DevLogOpPieChartDataResult.java new file mode 100644 index 00000000..9d4faa41 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/result/DevLogOpPieChartDataResult.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.log.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 操作日志饼状图数据结果 + * + * @author xuyuxiang + * @date 2022/9/4 21:14 + */ +@Getter +@Setter +public class DevLogOpPieChartDataResult { + + /** 类型 */ + @ApiModelProperty(value = "类型", position = 1) + private String type; + + /** 数量 */ + @ApiModelProperty(value = "数量", position = 2) + private Long value; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/result/DevLogVisLineChartDataResult.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/result/DevLogVisLineChartDataResult.java new file mode 100644 index 00000000..5a1e8a63 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/result/DevLogVisLineChartDataResult.java @@ -0,0 +1,40 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.log.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 访问日志折线图数据结果 + * + * @author xuyuxiang + * @date 2022/9/4 21:14 + */ +@Getter +@Setter +public class DevLogVisLineChartDataResult { + + /** 日期 */ + @ApiModelProperty(value = "日期", position = 1) + private String date; + + /** 登录数量 */ + @ApiModelProperty(value = "登录数量", position = 2) + private Long loginCount; + + /** 登出数量 */ + @ApiModelProperty(value = "登出数量", position = 3) + private Long logoutCount; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/result/DevLogVisPieChartDataResult.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/result/DevLogVisPieChartDataResult.java new file mode 100644 index 00000000..c4c7a5f6 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/result/DevLogVisPieChartDataResult.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.log.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 访问日志饼状图数据结果 + * + * @author xuyuxiang + * @date 2022/9/4 21:14 + */ +@Getter +@Setter +public class DevLogVisPieChartDataResult { + + /** 类型 */ + @ApiModelProperty(value = "类型", position = 1) + private String type; + + /** 数量 */ + @ApiModelProperty(value = "数量", position = 2) + private Long value; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/service/DevLogService.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/service/DevLogService.java new file mode 100644 index 00000000..d1e34998 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/service/DevLogService.java @@ -0,0 +1,82 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.log.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import vip.xiaonuo.dev.modular.log.entity.DevLog; +import vip.xiaonuo.dev.modular.log.param.DevLogDeleteParam; +import vip.xiaonuo.dev.modular.log.param.DevLogPageParam; +import vip.xiaonuo.dev.modular.log.result.DevLogOpBarChartDataResult; +import vip.xiaonuo.dev.modular.log.result.DevLogOpPieChartDataResult; +import vip.xiaonuo.dev.modular.log.result.DevLogVisLineChartDataResult; +import vip.xiaonuo.dev.modular.log.result.DevLogVisPieChartDataResult; + +import java.util.List; + +/** + * 日志Service接口 + * + * @author xuyuxiang + * @date 2022/9/2 15:04 + */ +public interface DevLogService extends IService { + + /** + * 获取日志分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + Page page(DevLogPageParam devLogPageParam); + + /** + * 清空日志 + * + * @author xuyuxiang + * @date 2022/9/6 13:17 + */ + void delete(DevLogDeleteParam devLogDeleteParam); + + /** + * 获取访问日志折线图数据 + * + * @author xuyuxiang + * @date 2022/9/4 21:18 + */ + List visLogLineChartData(); + + /** + * 获取访问日志饼状图数据 + * + * @author xuyuxiang + * @date 2022/9/4 21:18 + */ + List visLogPieChartData(); + + /** + * 获取操作日志柱状图数据 + * + * @author xuyuxiang + * @date 2022/9/4 21:18 + */ + List opLogBarChartData(); + + /** + * 获取操作日志饼状图数据 + * + * @author xuyuxiang + * @date 2022/9/4 21:18 + */ + List opLogPieChartData(); +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/service/impl/DevLogServiceImpl.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/service/impl/DevLogServiceImpl.java new file mode 100644 index 00000000..bc31e1b6 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/service/impl/DevLogServiceImpl.java @@ -0,0 +1,174 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.log.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import vip.xiaonuo.common.enums.CommonSortOrderEnum; +import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.dev.modular.log.entity.DevLog; +import vip.xiaonuo.dev.modular.log.enums.DevLogCategoryEnum; +import vip.xiaonuo.dev.modular.log.mapper.DevLogMapper; +import vip.xiaonuo.dev.modular.log.param.DevLogDeleteParam; +import vip.xiaonuo.dev.modular.log.param.DevLogPageParam; +import vip.xiaonuo.dev.modular.log.result.DevLogOpBarChartDataResult; +import vip.xiaonuo.dev.modular.log.result.DevLogOpPieChartDataResult; +import vip.xiaonuo.dev.modular.log.result.DevLogVisLineChartDataResult; +import vip.xiaonuo.dev.modular.log.result.DevLogVisPieChartDataResult; +import vip.xiaonuo.dev.modular.log.service.DevLogService; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 日志Service接口实现类 + * + * @author xuyuxiang + * @date 2022/9/2 15:05 + */ +@Service +public class DevLogServiceImpl extends ServiceImpl implements DevLogService { + + @Override + public Page page(DevLogPageParam devLogPageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(ObjectUtil.isNotEmpty(devLogPageParam.getCategory())) { + queryWrapper.lambda().eq(DevLog::getCategory, devLogPageParam.getCategory()); + } + if(ObjectUtil.isNotEmpty(devLogPageParam.getSearchKey())) { + queryWrapper.lambda().like(DevLog::getName, devLogPageParam.getSearchKey()); + } + if(ObjectUtil.isAllNotEmpty(devLogPageParam.getSortField(), devLogPageParam.getSortOrder())) { + CommonSortOrderEnum.validate(devLogPageParam.getSortOrder()); + queryWrapper.orderBy(true, devLogPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), + StrUtil.toUnderlineCase(devLogPageParam.getSortField())); + } else { + queryWrapper.lambda().orderByDesc(DevLog::getCreateTime); + } + return this.page(CommonPageRequest.defaultPage(), queryWrapper); + } + + @Override + public void delete(DevLogDeleteParam devLogDeleteParam) { + this.remove(new LambdaQueryWrapper().eq(DevLog::getCategory, devLogDeleteParam.getCategory())); + } + + @Override + public List visLogLineChartData() { + DateTime lastWeek = DateUtil.lastWeek(); + DateTime now = DateTime.now(); + Map> listMap = this.list(new LambdaQueryWrapper().in(DevLog::getCategory, DevLogCategoryEnum.LOGIN.getValue(), + DevLogCategoryEnum.LOGOUT.getValue()).between(DevLog::getOpTime, lastWeek, now).orderByAsc(DevLog::getOpTime)) + .stream().map(devLog -> JSONUtil.parseObj(devLog).set("date", DateUtil.formatDate(devLog.getOpTime()))) + .collect(Collectors.groupingBy(jsonObject -> jsonObject.getStr("date"))); + long between = DateUtil.between(lastWeek, now, DateUnit.DAY); + List resultList = CollectionUtil.newArrayList(); + for(int i = 1; i<= between; i++) { + DevLogVisLineChartDataResult devLogVisLineChartDataResult = new DevLogVisLineChartDataResult(); + String date = DateUtil.formatDate(DateUtil.offsetDay(lastWeek, i)); + devLogVisLineChartDataResult.setDate(date); + List jsonObjectList = listMap.get(date); + if(ObjectUtil.isNotEmpty(jsonObjectList)) { + devLogVisLineChartDataResult.setLoginCount(jsonObjectList.stream().filter(jsonObject -> jsonObject.getStr("category") + .equals(DevLogCategoryEnum.LOGIN.getValue())).count()); + devLogVisLineChartDataResult.setLogoutCount(jsonObjectList.stream().filter(jsonObject -> jsonObject.getStr("category") + .equals(DevLogCategoryEnum.LOGOUT.getValue())).count()); + } else { + devLogVisLineChartDataResult.setLoginCount(0L); + devLogVisLineChartDataResult.setLogoutCount(0L); + } + resultList.add(devLogVisLineChartDataResult); + } + return resultList; + } + + @Override + public List visLogPieChartData() { + List resultList = CollectionUtil.newArrayList(); + DevLogVisPieChartDataResult devLogLoginPieChartDataResult = new DevLogVisPieChartDataResult(); + devLogLoginPieChartDataResult.setType("登录"); + devLogLoginPieChartDataResult.setValue(this.count(new LambdaQueryWrapper() + .eq(DevLog::getCategory, DevLogCategoryEnum.LOGIN.getValue()))); + resultList.add(devLogLoginPieChartDataResult); + + DevLogVisPieChartDataResult devLogLogoutPieChartDataResult = new DevLogVisPieChartDataResult(); + devLogLogoutPieChartDataResult.setType("登出"); + devLogLogoutPieChartDataResult.setValue(this.count(new LambdaQueryWrapper() + .eq(DevLog::getCategory, DevLogCategoryEnum.LOGOUT.getValue()))); + resultList.add(devLogLogoutPieChartDataResult); + return resultList; + } + + @Override + public List opLogBarChartData() { + DateTime lastWeek = DateUtil.lastWeek(); + DateTime now = DateTime.now(); + Map> listMap = this.list(new LambdaQueryWrapper().in(DevLog::getCategory, DevLogCategoryEnum.OPERATE.getValue(), + DevLogCategoryEnum.EXCEPTION.getValue()).between(DevLog::getOpTime, lastWeek, now).orderByAsc(DevLog::getOpTime)) + .stream().map(devLog -> JSONUtil.parseObj(devLog).set("date", DateUtil.formatDate(devLog.getOpTime()))) + .collect(Collectors.groupingBy(jsonObject -> jsonObject.getStr("date"))); + long between = DateUtil.between(lastWeek, now, DateUnit.DAY); + List resultList = CollectionUtil.newArrayList(); + for(int i = 1; i<= between; i++) { + String date = DateUtil.formatDate(DateUtil.offsetDay(lastWeek, i)); + DevLogOpBarChartDataResult devLogOperateBarChartDataResult = new DevLogOpBarChartDataResult(); + devLogOperateBarChartDataResult.setDate(date); + devLogOperateBarChartDataResult.setName("操作日志"); + DevLogOpBarChartDataResult devLogExceptionBarChartDataResult = new DevLogOpBarChartDataResult(); + devLogExceptionBarChartDataResult.setDate(date); + devLogExceptionBarChartDataResult.setName("异常日志"); + List jsonObjectList = listMap.get(date); + if(ObjectUtil.isNotEmpty(jsonObjectList)) { + devLogOperateBarChartDataResult.setCount(jsonObjectList.stream().filter(jsonObject -> jsonObject.getStr("category") + .equals(DevLogCategoryEnum.OPERATE.getValue())).count()); + devLogExceptionBarChartDataResult.setCount(jsonObjectList.stream().filter(jsonObject -> jsonObject.getStr("category") + .equals(DevLogCategoryEnum.EXCEPTION.getValue())).count()); + } else { + devLogOperateBarChartDataResult.setCount(0L); + devLogExceptionBarChartDataResult.setCount(0L); + } + resultList.add(devLogOperateBarChartDataResult); + resultList.add(devLogExceptionBarChartDataResult); + } + return resultList; + } + + @Override + public List opLogPieChartData() { + List resultList = CollectionUtil.newArrayList(); + DevLogOpPieChartDataResult devLogOperatePieChartDataResult = new DevLogOpPieChartDataResult(); + devLogOperatePieChartDataResult.setType("操作日志"); + devLogOperatePieChartDataResult.setValue(this.count(new LambdaQueryWrapper() + .eq(DevLog::getCategory, DevLogCategoryEnum.OPERATE.getValue()))); + resultList.add(devLogOperatePieChartDataResult); + + DevLogOpPieChartDataResult devLogExceptionPieChartDataResult = new DevLogOpPieChartDataResult(); + devLogExceptionPieChartDataResult.setType("异常日志"); + devLogExceptionPieChartDataResult.setValue(this.count(new LambdaQueryWrapper() + .eq(DevLog::getCategory, DevLogCategoryEnum.EXCEPTION.getValue()))); + resultList.add(devLogExceptionPieChartDataResult); + return resultList; + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/util/DevLogUtil.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/util/DevLogUtil.java new file mode 100644 index 00000000..77906f3a --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/log/util/DevLogUtil.java @@ -0,0 +1,152 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.log.util; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.extra.spring.SpringUtil; +import org.aspectj.lang.JoinPoint; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.util.*; +import vip.xiaonuo.dev.modular.log.entity.DevLog; +import vip.xiaonuo.dev.modular.log.enums.DevLogCategoryEnum; +import vip.xiaonuo.dev.modular.log.enums.DevLogExeStatusEnum; +import vip.xiaonuo.dev.modular.log.service.DevLogService; + +import javax.servlet.http.HttpServletRequest; + +/** + * 日志工具类 + * + * @author xuyuxiang + * @date 2022/9/2 15:26 + */ +public class DevLogUtil { + + private static final DevLogService devLogService = SpringUtil.getBean(DevLogService.class); + + /** + * 记录操作日志 + * + * @author xuyuxiang + * @date 2022/9/2 15:31 + */ + public static void executeOperationLog(CommonLog commonLog, String userName, JoinPoint joinPoint, String resultJson) { + HttpServletRequest request = CommonServletUtil.getRequest(); + DevLog devLog = genBasOpLog(); + ThreadUtil.execute(() -> { + devLog.setCategory(DevLogCategoryEnum.OPERATE.getValue()); + devLog.setName(commonLog.value()); + devLog.setExeStatus(DevLogExeStatusEnum.SUCCESS.getValue()); + devLog.setClassName(joinPoint.getTarget().getClass().getName()); + devLog.setMethodName(joinPoint.getSignature().getName()); + devLog.setReqUrl(request.getRequestURI()); + devLog.setParamJson(CommonJoinPointUtil.getArgsJsonString(joinPoint)); + devLog.setResultJson(resultJson); + devLog.setOpTime(DateTime.now()); + devLog.setOpUser(userName); + creatLogSignValue(devLog); + devLogService.save(devLog); + }); + } + + /** + * 记录异常日志 + * + * @author xuyuxiang + * @date 2022/9/2 15:31 + */ + public static void executeExceptionLog(CommonLog commonLog, String userName, JoinPoint joinPoint, Exception exception) { + HttpServletRequest request = CommonServletUtil.getRequest(); + DevLog devLog = genBasOpLog(); + ThreadUtil.execute(() -> { + devLog.setCategory(DevLogCategoryEnum.EXCEPTION.getValue()); + devLog.setName(commonLog.value()); + devLog.setExeStatus(DevLogExeStatusEnum.FAIL.getValue()); + devLog.setExeMessage(ExceptionUtil.stacktraceToString(exception, Integer.MAX_VALUE)); + devLog.setClassName(joinPoint.getTarget().getClass().getName()); + devLog.setMethodName(joinPoint.getSignature().getName()); + devLog.setReqMethod(request.getMethod()); + devLog.setReqUrl(request.getRequestURI()); + devLog.setParamJson(CommonJoinPointUtil.getArgsJsonString(joinPoint)); + devLog.setOpTime(DateTime.now()); + devLog.setOpUser(userName); + creatLogSignValue(devLog); + devLogService.save(devLog); + }); + } + + /** + * 记录登录日志 + * + * @author xuyuxiang + * @date 2022/9/2 16:08 + */ + public static void executeLoginLog(String userName) { + DevLog devLog = genBasOpLog(); + ThreadUtil.execute(() -> { + devLog.setCategory(DevLogCategoryEnum.LOGIN.getValue()); + devLog.setName("用户登录"); + devLog.setExeStatus(DevLogExeStatusEnum.SUCCESS.getValue()); + devLog.setOpTime(DateTime.now()); + devLog.setOpUser(userName); + creatLogSignValue(devLog); + devLogService.save(devLog); + }); + } + + /** + * 记录登出日志 + * + * @author xuyuxiang + * @date 2022/9/2 16:08 + */ + public static void executeLogoutLog(String userName) { + DevLog devLog = genBasOpLog(); + ThreadUtil.execute(() -> { + devLog.setCategory(DevLogCategoryEnum.LOGOUT.getValue()); + devLog.setName("用户登出"); + devLog.setExeStatus(DevLogExeStatusEnum.SUCCESS.getValue()); + devLog.setOpTime(DateTime.now()); + devLog.setOpUser(userName); + creatLogSignValue(devLog); + devLogService.save(devLog); + }); + } + + /** + * 构建基础操作日志 + * + * @author xuyuxiang + * @date 2020/3/19 14:44 + */ + private static DevLog genBasOpLog() { + HttpServletRequest request = CommonServletUtil.getRequest(); + String ip = CommonIpAddressUtil.getIp(request); + DevLog devLog = new DevLog(); + devLog.setOpIp(CommonIpAddressUtil.getIp(request)); + devLog.setOpAddress(CommonIpAddressUtil.getCityInfo(ip)); + devLog.setOpBrowser(CommonUaUtil.getBrowser(request)); + devLog.setOpOs(CommonUaUtil.getOs(request)); + return devLog; + } + + /** + * 构建日志完整性保护签名数据 + */ + private static void creatLogSignValue (DevLog devLog) { + String logStr = devLog.toString().replaceAll(" +",""); + devLog.setSignData(CommonCryptogramUtil.doSignature(logStr)); + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/controller/DevMessageController.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/controller/DevMessageController.java new file mode 100644 index 00000000..a1a5a40c --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/controller/DevMessageController.java @@ -0,0 +1,110 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.message.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.pojo.CommonValidList; +import vip.xiaonuo.dev.modular.message.entity.DevMessage; +import vip.xiaonuo.dev.modular.message.param.DevMessageIdParam; +import vip.xiaonuo.dev.modular.message.param.DevMessagePageParam; +import vip.xiaonuo.dev.modular.message.param.DevMessageSendParam; +import vip.xiaonuo.dev.modular.message.result.DevMessageResult; +import vip.xiaonuo.dev.modular.message.service.DevMessageService; + +import javax.annotation.Resource; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; + +/** + * 站内信控制器 + * + * @author xuyuxiang + * @date 2022/6/21 14:57 + **/ +@Api(tags = "站内信控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 6) +@RestController +@Validated +public class DevMessageController { + + @Resource + private DevMessageService devMessageService; + + /** + * 发送站内信 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("发送站内信") + @CommonLog("发送站内信") + @PostMapping("/dev/message/send") + public CommonResult send(@RequestBody @Valid DevMessageSendParam devMessageSendParam) { + devMessageService.send(devMessageSendParam); + return CommonResult.ok(); + } + + /** + * 获取站内信分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("获取站内信分页") + @GetMapping("/dev/message/page") + public CommonResult> page(DevMessagePageParam devMessagePageParam) { + return CommonResult.data(devMessageService.page(devMessagePageParam)); + } + + /** + * 删除站内信 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("删除站内信") + @CommonLog("删除站内信") + @PostMapping("/dev/message/delete") + public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList devMessageIdParamList) { + devMessageService.delete(devMessageIdParamList); + return CommonResult.ok(); + } + + /** + * 获取站内信详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 4) + @ApiOperation("获取站内信详情") + @GetMapping("/dev/message/detail") + public CommonResult detail(@Valid DevMessageIdParam devMessageIdParam) { + return CommonResult.data(devMessageService.detail(devMessageIdParam)); + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/entity/DevMessage.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/entity/DevMessage.java new file mode 100644 index 00000000..d7686a4f --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/entity/DevMessage.java @@ -0,0 +1,51 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.message.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import vip.xiaonuo.common.pojo.CommonEntity; + +/** + * 站内信实体 + * + * @author xuyuxiang + * @date 2022/2/23 18:27 + **/ +@Getter +@Setter +@TableName("DEV_MESSAGE") +public class DevMessage extends CommonEntity { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 2) + private String category; + + /** 主题 */ + @ApiModelProperty(value = "主题", position = 3) + private String subject; + + /** 正文 */ + @ApiModelProperty(value = "正文", position = 4) + private String content; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 5) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/enums/DevMessageCategoryEnum.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/enums/DevMessageCategoryEnum.java new file mode 100644 index 00000000..b016fef3 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/enums/DevMessageCategoryEnum.java @@ -0,0 +1,37 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.message.enums; + +import lombok.Getter; + +/** + * 分类枚举 + * + * @author xuyuxiang + * @date 2022/6/16 16:14 + **/ +@Getter +public enum DevMessageCategoryEnum { + + /** 系统 */ + SYS("SYS"), + + /** 业务 */ + BIZ("BIZ"); + + private final String value; + + DevMessageCategoryEnum(String value) { + this.value = value; + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/mapper/DevMessageMapper.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/mapper/DevMessageMapper.java new file mode 100644 index 00000000..11f8cb11 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/mapper/DevMessageMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.message.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.dev.modular.message.entity.DevMessage; + +/** + * 站内信Mapper接口 + * + * @author xuyuxiang + * @date 2022/6/21 14:55 + **/ +public interface DevMessageMapper extends BaseMapper { +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/mapper/mapping/DevMessageMapper.xml b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/mapper/mapping/DevMessageMapper.xml new file mode 100644 index 00000000..d6b05a8e --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/mapper/mapping/DevMessageMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/param/DevMessageIdParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/param/DevMessageIdParam.java new file mode 100644 index 00000000..05c24050 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/param/DevMessageIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.message.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 站内信Id参数 + * + * @author xuyuxiang + * @date 2022/6/21 15:34 + **/ +@Getter +@Setter +public class DevMessageIdParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/param/DevMessageListParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/param/DevMessageListParam.java new file mode 100644 index 00000000..f529f503 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/param/DevMessageListParam.java @@ -0,0 +1,38 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.message.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * 站内信列表参数 + * + * @author xuyuxiang + * @date 2022/6/21 15:34 + **/ +@Getter +@Setter +public class DevMessageListParam { + + /** 接收人id集合 */ + @ApiModelProperty(value = "接收人id集合") + private List receiverIdList; + + /** 条数" */ + @ApiModelProperty(value = "条数") + private Integer limit; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/param/DevMessagePageParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/param/DevMessagePageParam.java new file mode 100644 index 00000000..c8fb3df6 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/param/DevMessagePageParam.java @@ -0,0 +1,56 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.message.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 站内信查询参数 + * + * @author xuyuxiang + * @date 2022/6/21 15:34 + **/ +@Getter +@Setter +public class DevMessagePageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 站内信分类 */ + @ApiModelProperty(value = "站内信分类") + private String category; + + /** 主题关键词 */ + @ApiModelProperty(value = "主题关键词") + private String searchKey; + + /** 接收用户id */ + @ApiModelProperty(value = "接收用户id") + private String receiveUserId; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/param/DevMessageSendParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/param/DevMessageSendParam.java new file mode 100644 index 00000000..2cac0348 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/param/DevMessageSendParam.java @@ -0,0 +1,51 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.message.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * 站内信发送参数 + * + * @author xuyuxiang + * @date 2022/6/21 15:34 + **/ +@Getter +@Setter +public class DevMessageSendParam { + + /** 主题 */ + @ApiModelProperty(value = "主题", required = true, position = 1) + @NotBlank(message = "subject不能为空") + private String subject; + + /** 接收人id集合 */ + @ApiModelProperty(value = "接收人id集合", required = true, position = 2) + @NotEmpty(message = "receiverIdList不能为空") + private List receiverIdList; + + /** 正文 */ + @ApiModelProperty(value = "正文", position = 3) + private String content; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 4, hidden = true) + @NotBlank(message = "category不能为空") + private String category; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/provider/DevMessageProvider.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/provider/DevMessageProvider.java new file mode 100644 index 00000000..b4a1e444 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/provider/DevMessageProvider.java @@ -0,0 +1,86 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.message.provider; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.stereotype.Service; +import vip.xiaonuo.dev.api.DevMessageApi; +import vip.xiaonuo.dev.modular.message.param.DevMessageIdParam; +import vip.xiaonuo.dev.modular.message.param.DevMessageListParam; +import vip.xiaonuo.dev.modular.message.param.DevMessageSendParam; +import vip.xiaonuo.dev.modular.message.service.DevMessageService; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 站内信API接口提供者 + * + * @author xuyuxiang + * @date 2022/6/22 15:32 + **/ +@Service +public class DevMessageProvider implements DevMessageApi { + + @Resource + private DevMessageService devMessageService; + + @Override + public void sendMessage(List receiverIdList, String subject) { + this.sendMessage(receiverIdList, subject, null); + } + + @Override + public void sendMessage(List receiverIdList, String subject, String content) { + this.sendMessageWithContent(receiverIdList, subject, null); + } + + @Override + public void sendMessageWithContent(List receiverIdList, String subject, String content) { + this.sendMessageWithContent(receiverIdList, null, subject, content); + } + + @Override + public void sendMessageWithContent(List receiverIdList, String category, String subject, String content) { + DevMessageSendParam devMessageSendParam = new DevMessageSendParam(); + devMessageSendParam.setReceiverIdList(receiverIdList); + devMessageSendParam.setCategory(category); + devMessageSendParam.setSubject(subject); + devMessageSendParam.setContent(ObjectUtil.isEmpty(content)?subject:content); + devMessageService.send(devMessageSendParam); + } + + @Override + public List list(List receiverIdList, Integer limit) { + DevMessageListParam devMessageListParam = new DevMessageListParam(); + devMessageListParam.setReceiverIdList(receiverIdList); + devMessageListParam.setLimit(limit); + return devMessageService.list(devMessageListParam).stream().map(JSONUtil::parseObj).collect(Collectors.toList()); + } + + @Override + public Page page(List receiverIdList, String category) { + return devMessageService.page(receiverIdList, category); + } + + @Override + public JSONObject detail(String id) { + DevMessageIdParam devMessageIdParam = new DevMessageIdParam(); + devMessageIdParam.setId(id); + return JSONUtil.parseObj(devMessageService.detail(devMessageIdParam)); + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/result/DevMessageResult.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/result/DevMessageResult.java new file mode 100644 index 00000000..ce7d854b --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/result/DevMessageResult.java @@ -0,0 +1,77 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.message.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * 站内信结果 + * + * @author xuyuxiang + * @date 2022/7/31 16:39 + */ +@Getter +@Setter +public class DevMessageResult { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 2) + private String category; + + /** 主题 */ + @ApiModelProperty(value = "主题", position = 3) + private String subject; + + /** 正文 */ + @ApiModelProperty(value = "正文", position = 4) + private String content; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 5) + private String extJson; + + /** 接收信息集合 */ + @ApiModelProperty(value = "接收信息集合", position = 6) + private List receiveInfoList; + + /** + * 接收信息类 + * + * @author xuyuxiang + * @date 2022/7/31 16:42 + */ + @Getter + @Setter + public static class DevReceiveInfo { + + /** 接收人ID */ + @ApiModelProperty(value = "接收人ID", position = 1) + private String receiveUserId; + + /** 接收人姓名 */ + @ApiModelProperty(value = "接收人姓名", position = 2) + private String receiveUserName; + + /** 是否已读 */ + @ApiModelProperty(value = "是否已读", position = 3) + private Boolean read; + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/service/DevMessageService.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/service/DevMessageService.java new file mode 100644 index 00000000..4f24e6ee --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/service/DevMessageService.java @@ -0,0 +1,90 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.message.service; + +import cn.hutool.json.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import vip.xiaonuo.dev.modular.message.entity.DevMessage; +import vip.xiaonuo.dev.modular.message.param.DevMessageIdParam; +import vip.xiaonuo.dev.modular.message.param.DevMessageListParam; +import vip.xiaonuo.dev.modular.message.param.DevMessagePageParam; +import vip.xiaonuo.dev.modular.message.param.DevMessageSendParam; +import vip.xiaonuo.dev.modular.message.result.DevMessageResult; + +import java.util.List; + +/** + * 站内信Service接口 + * + * @author xuyuxiang + * @date 2022/6/21 14:54 + **/ +public interface DevMessageService extends IService { + + /** + * 发送站内信 + * + * @author xuyuxiang + * @date 2022/6/21 18:37 + **/ + void send(DevMessageSendParam devMessageSendParam); + + /** + * 获取站内信分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + Page page(DevMessagePageParam devMessagePageParam); + + /** + * 获取站内信分页,返回JSONObject分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + Page page(List receiverIdList, String category); + + /** + * 获取站内信列表 + * + * @author xuyuxiang + * @date 2022/9/2 11:50 + */ + List list(DevMessageListParam devMessageListParam); + + /** + * 删除站内信 + * + * @author xuyuxiang + * @date 2022/8/4 10:36 + **/ + void delete(List devMessageIdParamList); + + /** + * 获取站内信详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + DevMessageResult detail(DevMessageIdParam devMessageIdParam); + + /** + * 获取站内信详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + DevMessage queryEntity(String id); +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/service/impl/DevMessageServiceImpl.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/service/impl/DevMessageServiceImpl.java new file mode 100644 index 00000000..7173d1c5 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/message/service/impl/DevMessageServiceImpl.java @@ -0,0 +1,210 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.message.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import vip.xiaonuo.common.enums.CommonSortOrderEnum; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.dev.modular.message.entity.DevMessage; +import vip.xiaonuo.dev.modular.message.enums.DevMessageCategoryEnum; +import vip.xiaonuo.dev.modular.message.mapper.DevMessageMapper; +import vip.xiaonuo.dev.modular.message.param.DevMessageIdParam; +import vip.xiaonuo.dev.modular.message.param.DevMessageListParam; +import vip.xiaonuo.dev.modular.message.param.DevMessagePageParam; +import vip.xiaonuo.dev.modular.message.param.DevMessageSendParam; +import vip.xiaonuo.dev.modular.message.result.DevMessageResult; +import vip.xiaonuo.dev.modular.message.service.DevMessageService; +import vip.xiaonuo.dev.modular.relation.entity.DevRelation; +import vip.xiaonuo.dev.modular.relation.enums.DevRelationCategoryEnum; +import vip.xiaonuo.dev.modular.relation.service.DevRelationService; +import vip.xiaonuo.sys.api.SysUserApi; + +import javax.annotation.Resource; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 站内信Service接口实现类 + * + * @author xuyuxiang + * @date 2022/6/21 14:56 + **/ +@Service +public class DevMessageServiceImpl extends ServiceImpl implements DevMessageService { + + @Resource + private SysUserApi sysUserApi; + + @Resource + private DevRelationService devRelationService; + + @Transactional(rollbackFor = Exception.class) + @Override + public void send(DevMessageSendParam devMessageSendParam) { + devMessageSendParam.setContent(ObjectUtil.isEmpty(devMessageSendParam.getContent())? + devMessageSendParam.getSubject():devMessageSendParam.getContent()); + devMessageSendParam.setCategory(ObjectUtil.isEmpty(devMessageSendParam.getCategory())? + DevMessageCategoryEnum.SYS.getValue() :devMessageSendParam.getCategory()); + DevMessage devMessage = BeanUtil.toBean(devMessageSendParam, DevMessage.class); + this.save(devMessage); + List receiverIdList = devMessageSendParam.getReceiverIdList(); + if(ObjectUtil.isNotEmpty(receiverIdList)) { + List extJsonList = receiverIdList.stream().map(userId -> JSONUtil.toJsonStr(JSONUtil.createObj() + .set("read", false))).collect(Collectors.toList()); + devRelationService.saveRelationBatchWithAppend(devMessage.getId(), receiverIdList, + DevRelationCategoryEnum.MSG_TO_USER.getValue(), extJsonList); + } + } + + @Override + public Page page(DevMessagePageParam devMessagePageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(ObjectUtil.isNotEmpty(devMessagePageParam.getSearchKey())) { + queryWrapper.lambda().like(DevMessage::getSubject, devMessagePageParam.getSearchKey()); + } + if(ObjectUtil.isNotEmpty(devMessagePageParam.getReceiveUserId())) { + queryWrapper.lambda().in(DevMessage::getId, devRelationService.list(new LambdaUpdateWrapper() + .eq(DevRelation::getCategory, DevRelationCategoryEnum.MSG_TO_USER.getValue()) + .eq(DevRelation::getTargetId, devMessagePageParam.getReceiveUserId())).stream() + .map(DevRelation::getObjectId).collect(Collectors.toList())); + } + if(ObjectUtil.isAllNotEmpty(devMessagePageParam.getSortField(), devMessagePageParam.getSortOrder())) { + CommonSortOrderEnum.validate(devMessagePageParam.getSortOrder()); + queryWrapper.orderBy(true, devMessagePageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), + StrUtil.toUnderlineCase(devMessagePageParam.getSortField())); + } + return this.page(CommonPageRequest.defaultPage(), queryWrapper); + } + + @Override + public Page page(List receiverIdList, String category) { + if(ObjectUtil.isNotEmpty(receiverIdList)) { + List messageRelationList = devRelationService + .getRelationListByTargetIdListAndCategory(receiverIdList, DevRelationCategoryEnum.MSG_TO_USER.getValue()); + List messageIdList = messageRelationList.stream().map(DevRelation::getObjectId).collect(Collectors.toList()); + if(ObjectUtil.isNotEmpty(messageIdList)) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(DevMessage::getId, messageIdList).orderByDesc(DevMessage::getCreateTime); + if(ObjectUtil.isNotEmpty(category)) { + lambdaQueryWrapper.eq(DevMessage::getCategory, category); + } + Page resultPage = new Page<>(); + Page devMessagePage = this.page(CommonPageRequest.defaultPage(), lambdaQueryWrapper); + BeanUtil.copyProperties(devMessagePage, resultPage); + List relationMessageIdList = CollStreamUtil.toList(messageRelationList, DevRelation::getObjectId); + List jsonObjectList = devMessagePage.getRecords().stream().map(obj -> { + JSONObject jsonObject = JSONUtil.parseObj(obj); + jsonObject.set("read", JSONUtil.parseObj(messageRelationList.get(relationMessageIdList + .indexOf(jsonObject.getStr("id"))).getExtJson()).getBool("read")); + return jsonObject; + }).collect(Collectors.toList()); + CollectionUtil.sort(jsonObjectList, Comparator.comparingInt(jsonObject -> Convert.toInt(jsonObject.getBool("read")))); + resultPage.setRecords(jsonObjectList); + return resultPage; + } + return CommonPageRequest.defaultPage(); + } + return CommonPageRequest.defaultPage(); + } + + @Override + public List list(DevMessageListParam devMessageListParam) { + if(ObjectUtil.isNotEmpty(devMessageListParam.getReceiverIdList())) { + List messageIdList = devRelationService + .getRelationListByTargetIdListAndCategory(devMessageListParam.getReceiverIdList(), + DevRelationCategoryEnum.MSG_TO_USER.getValue()).stream().filter(devRelation -> JSONUtil + .parseObj(devRelation.getExtJson()).getBool("read").equals(false)) + .map(DevRelation::getObjectId).collect(Collectors.toList()); + if(ObjectUtil.isNotEmpty(messageIdList)) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(DevMessage::getId, messageIdList).orderByDesc(DevMessage::getCreateTime); + lambdaQueryWrapper.last("limit 0, " + devMessageListParam.getLimit()); + return this.list(lambdaQueryWrapper); + } + return CollectionUtil.newArrayList(); + } + return CollectionUtil.newArrayList(); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void delete(List devMessageIdParamList) { + List devMessageIdList = CollStreamUtil.toList(devMessageIdParamList, DevMessageIdParam::getId); + if(ObjectUtil.isNotEmpty(devMessageIdList)) { + // 清除站内信与用户关联关系 + devRelationService.remove(new LambdaUpdateWrapper().eq(DevRelation::getCategory, DevRelationCategoryEnum.MSG_TO_USER.getValue()) + .in(DevRelation::getObjectId, devMessageIdList)); + // 执行删除 + this.removeBatchByIds(devMessageIdList); + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public DevMessageResult detail(DevMessageIdParam devMessageIdParam) { + DevMessageResult devMessageResult = new DevMessageResult(); + DevMessage devMessage = this.queryEntity(devMessageIdParam.getId()); + BeanUtil.copyProperties(devMessage, devMessageResult); + DevRelation myMessage = devRelationService.getOne(new LambdaQueryWrapper() + .eq(DevRelation::getObjectId, devMessage.getId()).eq(DevRelation::getTargetId, StpUtil.getLoginIdAsString()) + .eq(DevRelation::getCategory, DevRelationCategoryEnum.MSG_TO_USER.getValue())); + if(ObjectUtil.isNotEmpty(myMessage)) { + // 设置为已读 + String myMessageExtJson = JSONUtil.toJsonStr(JSONUtil.parseObj(myMessage.getExtJson()).set("read", true)); + devRelationService.update(new LambdaUpdateWrapper() + .eq(DevRelation::getObjectId, devMessage.getId()).eq(DevRelation::getTargetId, StpUtil.getLoginIdAsString()) + .eq(DevRelation::getCategory, DevRelationCategoryEnum.MSG_TO_USER.getValue()).set(DevRelation::getExtJson, myMessageExtJson)); + } + List receiveInfoList = devRelationService.getRelationListByObjectIdAndCategory(devMessage.getId(), + DevRelationCategoryEnum.MSG_TO_USER.getValue()).stream().map(devRelation -> { + DevMessageResult.DevReceiveInfo devReceiveInfo = new DevMessageResult.DevReceiveInfo(); + JSONObject userObj = sysUserApi.getUserByIdWithException(devRelation.getTargetId()); + String userName = "未知用户"; + if(ObjectUtil.isNotEmpty(userObj)) { + userName = userObj.getStr("name"); + } + devReceiveInfo.setReceiveUserId(devRelation.getTargetId()); + devReceiveInfo.setReceiveUserName(userName); + devReceiveInfo.setRead(JSONUtil.parseObj(devRelation.getExtJson()).getBool("read")); + return devReceiveInfo; + }).collect(Collectors.toList()); + devMessageResult.setReceiveInfoList(receiveInfoList); + return devMessageResult; + } + + @Override + public DevMessage queryEntity(String id) { + DevMessage devMessage = this.getById(id); + if(ObjectUtil.isEmpty(devMessage)) { + throw new CommonException("站内信不存在,id值为:{}", id); + } + return devMessage; + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/monitor/controller/DevMonitorController.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/monitor/controller/DevMonitorController.java new file mode 100644 index 00000000..e8fc27ff --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/monitor/controller/DevMonitorController.java @@ -0,0 +1,55 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.monitor.controller; + +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.dev.modular.monitor.result.DevMonitorServerResult; +import vip.xiaonuo.dev.modular.monitor.service.DevMonitorService; + +import javax.annotation.Resource; + +/** + * 监控控制器 + * + * @author xuyuxiang + * @date 2022/6/21 14:57 + **/ +@Api(tags = "监控控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 8) +@RestController +@Validated +public class DevMonitorController { + + @Resource + private DevMonitorService devMonitorService; + + /** + * 获取服务器监控信息 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("获取服务器监控信息") + @GetMapping("/dev/monitor/serverInfo") + public CommonResult serverInfo() { + return CommonResult.data(devMonitorService.serverInfo()); + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/monitor/result/DevMonitorServerResult.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/monitor/result/DevMonitorServerResult.java new file mode 100644 index 00000000..e6ca8ceb --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/monitor/result/DevMonitorServerResult.java @@ -0,0 +1,254 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.monitor.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 服务器监控结果 + * + * @author xuyuxiang + * @date 2022/9/1 16:00 + */ +@Getter +@Setter +public class DevMonitorServerResult { + + /* ==============概览数据============ */ + /** CPU信息 */ + @ApiModelProperty(value = "CPU信息", position = 1) + private DevMonitorCpuInfo devMonitorCpuInfo; + + /** 内存信息 */ + @ApiModelProperty(value = "内存信息", position = 2) + private DevMonitorMemoryInfo devMonitorMemoryInfo; + + /** 存储信息 */ + @ApiModelProperty(value = "存储信息", position = 3) + private DevMonitorStorageInfo devMonitorStorageInfo; + + /** 网络信息 */ + @ApiModelProperty(value = "网络信息", position = 4) + private DevMonitorNetworkInfo devMonitorNetworkInfo; + + /* ==============服务器数据============ */ + /** 服务器信息 */ + @ApiModelProperty(value = "服务器信息", position = 5) + private DevMonitorServerInfo devMonitorServerInfo; + + /* ==============JVM数据============ */ + /** JVM信息 */ + @ApiModelProperty(value = "JVM信息", position = 6) + private DevMonitorJvmInfo devMonitorJvmInfo; + + /** + * CPU信息类 + * + * @author xuyuxiang + * @date 2022/7/31 16:42 + */ + @Getter + @Setter + public static class DevMonitorCpuInfo { + + /** CPU名称 */ + @ApiModelProperty(value = "CPU名称", position = 1) + private String cupName; + + /** CPU数量 */ + @ApiModelProperty(value = "CPU数量", position = 2) + private String cupNum; + + /** CPU物理核心数 */ + @ApiModelProperty(value = "CPU物理核心数", position = 3) + private String cpuPhysicalCoreNum; + + /** CPU逻辑核心数 */ + @ApiModelProperty(value = "CPU逻辑核心数", position = 4) + private String cpuLogicalCoreNum; + + /** CPU系统使用率 */ + @ApiModelProperty(value = "CPU系统使用率", position = 5) + private String cpuSysUseRate; + + /** CPU用户使用率 */ + @ApiModelProperty(value = "CPU用户使用率", position = 6) + private String cpuUserUseRate; + + /** CPU当前总使用率 */ + @ApiModelProperty(value = "CPU当前总使用率", position = 7) + private Double cpuTotalUseRate; + + /** CPU当前等待率 */ + @ApiModelProperty(value = "CPU当前等待率", position = 8) + private String cpuWaitRate; + + /** CPU当前空闲率 */ + @ApiModelProperty(value = "CPU当前空闲率", position = 9) + private String cpuFreeRate; + } + + /** + * 内存信息类 + * + * @author xuyuxiang + * @date 2022/7/31 16:42 + */ + @Getter + @Setter + public static class DevMonitorMemoryInfo { + + /** 内存总量 */ + @ApiModelProperty(value = "内存总量", position = 1) + private String memoryTotal; + + /** 内存已用 */ + @ApiModelProperty(value = "内存已用", position = 2) + private String memoryUsed; + + /** 内存剩余 */ + @ApiModelProperty(value = "内存剩余", position = 3) + private String memoryFree; + + /** 内存使用率 */ + @ApiModelProperty(value = "内存使用率", position = 4) + private Double memoryUseRate; + } + + /** + * 存储信息 + * + * @author xuyuxiang + * @date 2022/7/31 16:42 + */ + @Getter + @Setter + public static class DevMonitorStorageInfo { + + /** 存储总量 */ + @ApiModelProperty(value = "存储总量", position = 1) + private String storageTotal; + + /** 存储已用 */ + @ApiModelProperty(value = "存储已用", position = 2) + private String storageUsed; + + /** 存储剩余 */ + @ApiModelProperty(value = "存储剩余", position = 3) + private String storageFree; + + /** 存储使用率 */ + @ApiModelProperty(value = "存储使用率", position = 4) + private Double storageUseRate; + } + + /** + * 网络信息类 + * + * @author xuyuxiang + * @date 2022/7/31 16:42 + */ + @Getter + @Setter + public static class DevMonitorNetworkInfo { + + /** 上行速率 */ + @ApiModelProperty(value = "上行速率", position = 1) + private String upLinkRate; + + /** 下行速率 */ + @ApiModelProperty(value = "下行速率", position = 2) + private String downLinkRate; + + } + + /** + * 服务器信息类 + * + * @author xuyuxiang + * @date 2022/7/31 16:42 + */ + @Getter + @Setter + public static class DevMonitorServerInfo { + + /** 服务器名称 */ + @ApiModelProperty(value = "服务器名称", position = 1) + private String serverName; + + /** 服务器操作系统 */ + @ApiModelProperty(value = "服务器操作系统", position = 2) + private String serverOs; + + /** 服务器IP */ + @ApiModelProperty(value = "服务器IP", position = 3) + private String serverIp; + + /** 服务器架构 */ + @ApiModelProperty(value = "服务器架构", position = 4) + private String serverArchitecture; + } + + /** + * JVM信息类 + * + * @author xuyuxiang + * @date 2022/7/31 16:42 + */ + @Getter + @Setter + public static class DevMonitorJvmInfo { + + /** JVM名称 */ + @ApiModelProperty(value = "JVM名称", position = 1) + private String jvmName; + + /** JVM版本 */ + @ApiModelProperty(value = "JVM版本", position = 2) + private String jvmVersion; + + /** JVM总分配内存 */ + @ApiModelProperty(value = "JVM总分配内存", position = 3) + private String jvmMemoryTotal; + + /** JVM已用内存 */ + @ApiModelProperty(value = "JVM已用内存", position = 4) + private String jvmMemoryUsed; + + /** JVM剩余内存 */ + @ApiModelProperty(value = "JVM剩余内存", position = 5) + private String jvmMemoryFree; + + /** JVM内存使用率 */ + @ApiModelProperty(value = "JVM内存使用率", position = 6) + private Double jvmUseRate; + + /** JVM启动时间 */ + @ApiModelProperty(value = "JVM启动时间", position = 7) + private String jvmStartTime; + + /** JVM运行时长 */ + @ApiModelProperty(value = "JVM运行时长", position = 8) + private String jvmRunTime; + + /** Java版本 */ + @ApiModelProperty(value = "Java版本", position = 9) + private String javaVersion; + + /** Java安装路径 */ + @ApiModelProperty(value = "Java安装路径", position = 10) + private String javaPath; + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/monitor/service/DevMonitorService.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/monitor/service/DevMonitorService.java new file mode 100644 index 00000000..82014317 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/monitor/service/DevMonitorService.java @@ -0,0 +1,32 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.monitor.service; + +import vip.xiaonuo.dev.modular.monitor.result.DevMonitorServerResult; + +/** + * 监控Service接口 + * + * @author xuyuxiang + * @date 2022/9/1 15:59 + */ +public interface DevMonitorService { + + /** + * 获取服务器监控信息 + * + * @author xuyuxiang + * @date 2022/9/1 16:02 + */ + DevMonitorServerResult serverInfo(); +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/monitor/service/impl/DevMonitorServiceImpl.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/monitor/service/impl/DevMonitorServiceImpl.java new file mode 100644 index 00000000..8815b0da --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/monitor/service/impl/DevMonitorServiceImpl.java @@ -0,0 +1,163 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.monitor.service.impl; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.net.NetUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.system.JvmInfo; +import cn.hutool.system.OsInfo; +import cn.hutool.system.RuntimeInfo; +import cn.hutool.system.SystemUtil; +import org.springframework.stereotype.Service; +import oshi.SystemInfo; +import oshi.hardware.CentralProcessor; +import oshi.hardware.GlobalMemory; +import oshi.hardware.HardwareAbstractionLayer; +import oshi.software.os.FileSystem; +import oshi.software.os.OperatingSystem; +import oshi.util.Util; +import vip.xiaonuo.common.util.CommonNetWorkInfoUtil; +import vip.xiaonuo.dev.modular.monitor.result.DevMonitorServerResult; +import vip.xiaonuo.dev.modular.monitor.service.DevMonitorService; + +import java.lang.management.ManagementFactory; +import java.lang.management.RuntimeMXBean; +import java.math.BigDecimal; +import java.util.Map; +import java.util.concurrent.atomic.AtomicLong; + +/** + * 监控Service接口实现类 + * + * @author xuyuxiang + * @date 2022/9/1 15:59 + */ +@Service +public class DevMonitorServiceImpl implements DevMonitorService { + + @Override + public DevMonitorServerResult serverInfo() { + DevMonitorServerResult devMonitorServerResult = new DevMonitorServerResult(); + SystemInfo si = new SystemInfo(); + HardwareAbstractionLayer hal = si.getHardware(); + CentralProcessor cpu = hal.getProcessor(); + + // CPU信息 + DevMonitorServerResult.DevMonitorCpuInfo devMonitorCpuInfo = new DevMonitorServerResult.DevMonitorCpuInfo(); + devMonitorCpuInfo.setCupName(StrUtil.trim(cpu.getProcessorIdentifier().getName())); + devMonitorCpuInfo.setCupNum(cpu.getPhysicalPackageCount() + "颗物理CPU"); + devMonitorCpuInfo.setCpuPhysicalCoreNum(cpu.getPhysicalProcessorCount() + "个物理核心"); + devMonitorCpuInfo.setCpuLogicalCoreNum(cpu.getLogicalProcessorCount() + "个逻辑核心"); + long[] prevTicks = cpu.getSystemCpuLoadTicks(); + Util.sleep(1000); + long[] ticks = cpu.getSystemCpuLoadTicks(); + long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] + - prevTicks[CentralProcessor.TickType.NICE.getIndex()]; + long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] + - prevTicks[CentralProcessor.TickType.IRQ.getIndex()]; + long softIrq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] + - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()]; + long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] + - prevTicks[CentralProcessor.TickType.STEAL.getIndex()]; + long sys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] + - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()]; + long user = ticks[CentralProcessor.TickType.USER.getIndex()] + - prevTicks[CentralProcessor.TickType.USER.getIndex()]; + long ioWait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] + - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()]; + long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] + - prevTicks[CentralProcessor.TickType.IDLE.getIndex()]; + long totalCpu = user + nice + sys + idle + ioWait + irq + softIrq + steal; + devMonitorCpuInfo.setCpuSysUseRate(NumberUtil.div(NumberUtil.mul(sys, 100), totalCpu, 2) + "%"); + devMonitorCpuInfo.setCpuUserUseRate(NumberUtil.div(NumberUtil.mul(user, 100), totalCpu, 2) + "%"); + devMonitorCpuInfo.setCpuTotalUseRate(NumberUtil.div(NumberUtil.mul(NumberUtil.add(sys, user), 100), totalCpu, 2)); + devMonitorCpuInfo.setCpuWaitRate(NumberUtil.div(NumberUtil.mul(ioWait, 100), totalCpu, 2) + "%"); + devMonitorCpuInfo.setCpuFreeRate(NumberUtil.div(NumberUtil.mul(idle, 100), totalCpu, 2) + "%"); + devMonitorServerResult.setDevMonitorCpuInfo(devMonitorCpuInfo); + + // 内存信息 + GlobalMemory memory = hal.getMemory(); + DevMonitorServerResult.DevMonitorMemoryInfo devMonitorMemoryInfo = new DevMonitorServerResult.DevMonitorMemoryInfo(); + long used = memory.getTotal() - memory.getAvailable(); + devMonitorMemoryInfo.setMemoryTotal(FileUtil.readableFileSize(memory.getTotal())); + devMonitorMemoryInfo.setMemoryUsed(FileUtil.readableFileSize(used)); + devMonitorMemoryInfo.setMemoryFree(FileUtil.readableFileSize(memory.getAvailable())); + devMonitorMemoryInfo.setMemoryUseRate(NumberUtil.mul(NumberUtil.div(used, memory.getTotal(), 4), 100)); + devMonitorServerResult.setDevMonitorMemoryInfo(devMonitorMemoryInfo); + + // 存储信息 + DevMonitorServerResult.DevMonitorStorageInfo devMonitorStorageInfo = new DevMonitorServerResult.DevMonitorStorageInfo(); + OperatingSystem operatingSystem = si.getOperatingSystem(); + FileSystem fileSystem = operatingSystem.getFileSystem(); + AtomicLong storageTotal = new AtomicLong(); + AtomicLong storageUsed = new AtomicLong(); + AtomicLong storageFree = new AtomicLong(); + fileSystem.getFileStores().forEach(osFileStore -> { + long totalSpace = osFileStore.getTotalSpace(); + long usableSpace = osFileStore.getUsableSpace(); + long freeSpace = osFileStore.getFreeSpace(); + long usedSpace = totalSpace - usableSpace; + storageTotal.addAndGet(totalSpace); + storageUsed.addAndGet(usedSpace); + storageFree.addAndGet(freeSpace); + }); + devMonitorStorageInfo.setStorageTotal(FileUtil.readableFileSize(storageTotal.get())); + devMonitorStorageInfo.setStorageUsed(FileUtil.readableFileSize(storageUsed.get())); + devMonitorStorageInfo.setStorageFree(FileUtil.readableFileSize(storageFree.get())); + devMonitorStorageInfo.setStorageUseRate(NumberUtil.mul(NumberUtil.div(storageUsed.doubleValue(), storageTotal.doubleValue(), 4), 100)); + devMonitorServerResult.setDevMonitorStorageInfo(devMonitorStorageInfo); + + // 网络信息 + DevMonitorServerResult.DevMonitorNetworkInfo devMonitorNetworkInfo = new DevMonitorServerResult.DevMonitorNetworkInfo(); + Map networkUpRate = CommonNetWorkInfoUtil.getNetworkUpRate(); + devMonitorNetworkInfo.setUpLinkRate(networkUpRate.get("UP")); + devMonitorNetworkInfo.setDownLinkRate(networkUpRate.get("DOWN")); + devMonitorServerResult.setDevMonitorNetworkInfo(devMonitorNetworkInfo); + + // 服务器信息 + OsInfo osInfo = SystemUtil.getOsInfo(); + DevMonitorServerResult.DevMonitorServerInfo devMonitorServerInfo = new DevMonitorServerResult.DevMonitorServerInfo(); + devMonitorServerInfo.setServerName(NetUtil.getLocalHostName()); + devMonitorServerInfo.setServerOs(osInfo.getName()); + devMonitorServerInfo.setServerIp(NetUtil.getLocalhostStr()); + devMonitorServerInfo.setServerArchitecture(osInfo.getArch()); + devMonitorServerResult.setDevMonitorServerInfo(devMonitorServerInfo); + + // JVM信息 + DevMonitorServerResult.DevMonitorJvmInfo devMonitorJvmInfo = new DevMonitorServerResult.DevMonitorJvmInfo(); + RuntimeInfo runtimeInfo = SystemUtil.getRuntimeInfo(); + JvmInfo jvmInfo = SystemUtil.getJvmInfo(); + devMonitorJvmInfo.setJvmName(jvmInfo.getName()); + devMonitorJvmInfo.setJvmVersion(jvmInfo.getVersion()); + long totalMemory = runtimeInfo.getTotalMemory(); + devMonitorJvmInfo.setJvmMemoryTotal(FileUtil.readableFileSize(totalMemory)); + devMonitorJvmInfo.setJvmMemoryFree(FileUtil.readableFileSize(runtimeInfo.getFreeMemory())); + long jvmMemoryUsed = NumberUtil.sub(new BigDecimal(runtimeInfo + .getTotalMemory()), new BigDecimal(runtimeInfo.getFreeMemory())).longValue(); + devMonitorJvmInfo.setJvmMemoryUsed(FileUtil.readableFileSize(jvmMemoryUsed)); + double jvmUseRate = NumberUtil.mul(NumberUtil.div(jvmMemoryUsed, totalMemory, 4), 100); + devMonitorJvmInfo.setJvmUseRate(jvmUseRate); + RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean(); + DateTime startTime = DateUtil.date(runtimeMXBean.getStartTime()); + devMonitorJvmInfo.setJvmStartTime(DateUtil.formatDateTime(startTime)); + devMonitorJvmInfo.setJvmRunTime(DateUtil.formatBetween(startTime, DateTime.now())); + devMonitorJvmInfo.setJavaVersion(SystemUtil.get("java.version", false)); + devMonitorJvmInfo.setJavaPath(SystemUtil.get("java.home", false)); + devMonitorServerResult.setDevMonitorJvmInfo(devMonitorJvmInfo); + return devMonitorServerResult; + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/relation/entity/DevRelation.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/relation/entity/DevRelation.java new file mode 100644 index 00000000..fceacb6c --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/relation/entity/DevRelation.java @@ -0,0 +1,44 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.relation.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Getter; +import lombok.Setter; + +/** + * 关系实体 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +@TableName("DEV_RELATION") +public class DevRelation { + + /** id */ + private String id; + + /** 对象id */ + private String objectId; + + /** 目标id */ + private String targetId; + + /** 分类 */ + private String category; + + /** 扩展信息 */ + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/relation/enums/DevRelationCategoryEnum.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/relation/enums/DevRelationCategoryEnum.java new file mode 100644 index 00000000..8ff6a19d --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/relation/enums/DevRelationCategoryEnum.java @@ -0,0 +1,41 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.relation.enums; + +import lombok.Getter; + +/** + * 关系分类枚举 + * + * @author xuyuxiang + * @date 2022/4/21 19:56 + **/ +@Getter +public enum DevRelationCategoryEnum { + + /* ====文件与业务关系==== */ + + /** 文件与业务默认关联关系,后续有多种类型关联,可扩展 */ + FILE_TO_BIZ_DEFAULT("FILE_TO_BIZ_DEFAULT"), + + /* ====站内信与用户关系==== */ + + /** 站内信与接收用户 */ + MSG_TO_USER("MSG_TO_USER"); + + private final String value; + + DevRelationCategoryEnum(String value) { + this.value = value; + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/relation/mapper/DevRelationMapper.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/relation/mapper/DevRelationMapper.java new file mode 100644 index 00000000..519d57f2 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/relation/mapper/DevRelationMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.relation.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.dev.modular.relation.entity.DevRelation; + +/** + * 关系Mapper接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:37 + **/ +public interface DevRelationMapper extends BaseMapper { +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/relation/mapper/mapping/DevRelationMapper.xml b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/relation/mapper/mapping/DevRelationMapper.xml new file mode 100644 index 00000000..4bf0dd7e --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/relation/mapper/mapping/DevRelationMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/relation/service/DevRelationService.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/relation/service/DevRelationService.java new file mode 100644 index 00000000..1c37ae87 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/relation/service/DevRelationService.java @@ -0,0 +1,219 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.relation.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import vip.xiaonuo.dev.modular.relation.entity.DevRelation; + +import java.util.List; + +/** + * 关系Service接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:35 + **/ +public interface DevRelationService extends IService { + + /** + * 追加关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationWithAppend(String objectId, String targetId, String category); + + /** + * 追加关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationWithAppend(String objectId, String targetId, String category, String extJson); + + /** + * 批量追加关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationBatchWithAppend(String objectId, List targetIdList, String category); + + /** + * 批量追加关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationBatchWithAppend(String objectId, List targetIdList, String category, List extJsonList); + + /** + * 清空原关系并保存关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationWithClear(String objectId, String targetId, String category); + + /** + * 清空原关系并保存关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationWithClear(String objectId, String targetId, String category, String extJson); + + /** + * 清空原关系并批量保存关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationBatchWithClear(String objectId, List targetIdList, String category); + + /** + * 清空原关系并批量保存关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationBatchWithClear(String objectId, List targetIdList, String category, List extJsonList); + + /** + * 根据对象id获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByObjectId(String objectId); + + /** + * 根据对象id集合获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByObjectIdList(List objectIdList); + + /** + * 根据对象id和关系分类获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByObjectIdAndCategory(String objectId, String category); + + /** + * 根据对象id集合和关系分类获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByObjectIdListAndCategory(List objectIdList, String category); + + /** + * 根据目标id获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByTargetId(String targetId); + + /** + * 根据目标id集合获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByTargetIdList(List targetIdList); + + /** + * 根据目标id和关系分类获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByTargetIdAndCategory(String targetId, String category); + + /** + * 根据目标id集合和关系分类获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByTargetIdListAndCategory(List targetIdList, String category); + + /** + * 根据对象id获取目标id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:07 + */ + List getRelationTargetIdListByObjectId(String objectId); + + /** + * 根据对象id集合获取目标id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:07 + */ + List getRelationTargetIdListByObjectIdList(List objectIdList); + + /** + * 根据对象id和关系分类获取目标id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:07 + */ + List getRelationTargetIdListByObjectIdAndCategory(String objectId, String category); + + /** + * 根据对象id集合和关系分类获取目标id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:07 + */ + List getRelationTargetIdListByObjectIdListAndCategory(List objectIdList, String category); + + /** + * 根据目标id获取对象id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:07 + */ + List getRelationObjectIdListByTargetId(String targetId); + + /** + * 根据目标id集合获取对象id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:07 + */ + List getRelationObjectIdListByTargetIdList(List targetIdList); + + /** + * 根据目标id和关系分类获取对象id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:08 + */ + List getRelationObjectIdListByTargetIdAndCategory(String targetId, String category); + + /** + * 根据目标id集合和关系分类获取对象id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:08 + */ + List getRelationObjectIdListByTargetIdListAndCategory(List targetIdList, String category); +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/relation/service/impl/DevRelationServiceImpl.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/relation/service/impl/DevRelationServiceImpl.java new file mode 100644 index 00000000..709ed653 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/relation/service/impl/DevRelationServiceImpl.java @@ -0,0 +1,218 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.relation.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import vip.xiaonuo.dev.modular.relation.entity.DevRelation; +import vip.xiaonuo.dev.modular.relation.mapper.DevRelationMapper; +import vip.xiaonuo.dev.modular.relation.service.DevRelationService; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 关系Service接口实现类 + * + * @author xuyuxiang + * @date 2022/2/23 18:43 + **/ +@Service +public class DevRelationServiceImpl extends ServiceImpl implements DevRelationService { + + @Transactional(rollbackFor = Exception.class) + public void saveRelation(String objectId, String targetId, String category, String extJson, boolean clear) { + // 是否需要先删除关系 + if(clear) { + this.remove(new LambdaQueryWrapper().eq(DevRelation::getObjectId, objectId) + .eq(DevRelation::getCategory, category)); + } + DevRelation devRelation = new DevRelation(); + devRelation.setObjectId(objectId); + devRelation.setTargetId(targetId); + devRelation.setCategory(category); + devRelation.setExtJson(extJson); + this.save(devRelation); + } + + @Transactional(rollbackFor = Exception.class) + public void saveRelationBatch(String objectId, List targetIdList, String category, List extJsonList, boolean clear) { + // 是否需要先删除关系 + if(clear) { + this.remove(new LambdaQueryWrapper().eq(DevRelation::getObjectId, objectId) + .eq(DevRelation::getCategory, category)); + } + List devRelationList = CollectionUtil.newArrayList(); + for(int i = 0; i < targetIdList.size(); i++) { + DevRelation devRelation = new DevRelation(); + devRelation.setObjectId(objectId); + devRelation.setTargetId(targetIdList.get(i)); + devRelation.setCategory(category); + if(ObjectUtil.isNotEmpty(extJsonList)) { + devRelation.setExtJson(extJsonList.get(i)); + } + devRelationList.add(devRelation); + } + if(ObjectUtil.isNotEmpty(devRelationList)) { + this.saveBatch(devRelationList); + } + } + + @Override + public void saveRelationWithAppend(String objectId, String targetId, String category) { + this.saveRelation(objectId, targetId, category, null, false); + } + + @Override + public void saveRelationWithAppend(String objectId, String targetId, String category, String extJson) { + this.saveRelation(objectId, targetId, category, extJson, false); + } + + @Override + public void saveRelationBatchWithAppend(String objectId, List targetIdList, String category) { + this.saveRelationBatch(objectId, targetIdList, category, null, false); + } + + @Override + public void saveRelationBatchWithAppend(String objectId, List targetIdList, String category, List extJsonList) { + this.saveRelationBatch(objectId, targetIdList, category, extJsonList, false); + } + + @Override + public void saveRelationWithClear(String objectId, String targetId, String category) { + this.saveRelation(objectId, targetId, category, null, true); + } + + @Override + public void saveRelationWithClear(String objectId, String targetId, String category, String extJson) { + this.saveRelation(objectId, targetId, category, extJson, true); + } + + @Override + public void saveRelationBatchWithClear(String objectId, List targetIdList, String category) { + this.saveRelationBatch(objectId, targetIdList, category, null, true); + } + + @Override + public void saveRelationBatchWithClear(String objectId, List targetIdList, String category, List extJsonList) { + this.saveRelationBatch(objectId, targetIdList, category, extJsonList, true); + } + + @Override + public List getRelationListByObjectId(String objectId) { + return this.getRelationListByObjectIdAndCategory(objectId, null); + } + + @Override + public List getRelationListByObjectIdList(List objectIdList) { + return this.getRelationListByObjectIdListAndCategory(objectIdList, null); + } + + @Override + public List getRelationListByObjectIdAndCategory(String objectId, String category) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(DevRelation::getObjectId, objectId); + if(ObjectUtil.isNotEmpty(category)) { + lambdaQueryWrapper.eq(DevRelation::getCategory, category); + } + return this.list(lambdaQueryWrapper); + } + + @Override + public List getRelationListByObjectIdListAndCategory(List objectIdList, String category) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(DevRelation::getObjectId, objectIdList); + if(ObjectUtil.isNotEmpty(category)) { + lambdaQueryWrapper.eq(DevRelation::getCategory, category); + } + return this.list(lambdaQueryWrapper); + } + + @Override + public List getRelationListByTargetId(String targetId) { + return this.getRelationListByTargetIdAndCategory(targetId, null); + } + + @Override + public List getRelationListByTargetIdList(List targetIdList) { + return this.getRelationListByTargetIdListAndCategory(targetIdList, null); + } + + @Override + public List getRelationListByTargetIdAndCategory(String targetId, String category) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(DevRelation::getTargetId, targetId); + if(ObjectUtil.isNotEmpty(category)) { + lambdaQueryWrapper.eq(DevRelation::getCategory, category); + } + return this.list(lambdaQueryWrapper); + } + + @Override + public List getRelationListByTargetIdListAndCategory(List targetIdList, String category) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(DevRelation::getTargetId, targetIdList); + if(ObjectUtil.isNotEmpty(category)) { + lambdaQueryWrapper.eq(DevRelation::getCategory, category); + } + return this.list(lambdaQueryWrapper); + } + + @Override + public List getRelationTargetIdListByObjectId(String objectId) { + return this.getRelationTargetIdListByObjectIdAndCategory(objectId, null); + } + + @Override + public List getRelationTargetIdListByObjectIdList(List objectIdList) { + return this.getRelationTargetIdListByObjectIdListAndCategory(objectIdList, null); + } + + @Override + public List getRelationTargetIdListByObjectIdAndCategory(String objectId, String category) { + return this.getRelationListByObjectIdAndCategory(objectId, category).stream() + .map(DevRelation::getTargetId).collect(Collectors.toList()); + } + + @Override + public List getRelationTargetIdListByObjectIdListAndCategory(List objectIdList, String category) { + return this.getRelationListByObjectIdListAndCategory(objectIdList, category).stream() + .map(DevRelation::getTargetId).collect(Collectors.toList()); + } + + @Override + public List getRelationObjectIdListByTargetId(String targetId) { + return this.getRelationObjectIdListByTargetIdAndCategory(targetId, null); + } + + @Override + public List getRelationObjectIdListByTargetIdList(List targetIdList) { + return this.getRelationObjectIdListByTargetIdListAndCategory(targetIdList, null); + } + + @Override + public List getRelationObjectIdListByTargetIdAndCategory(String targetId, String category) { + return this.getRelationListByTargetIdAndCategory(targetId, category).stream() + .map(DevRelation::getObjectId).collect(Collectors.toList()); + } + + @Override + public List getRelationObjectIdListByTargetIdListAndCategory(List targetIdList, String category) { + return this.getRelationListByTargetIdListAndCategory(targetIdList, category).stream() + .map(DevRelation::getObjectId).collect(Collectors.toList()); + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/controller/DevSmsController.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/controller/DevSmsController.java new file mode 100644 index 00000000..96b5dff1 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/controller/DevSmsController.java @@ -0,0 +1,125 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.sms.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.pojo.CommonValidList; +import vip.xiaonuo.dev.modular.sms.entity.DevSms; +import vip.xiaonuo.dev.modular.sms.param.DevSmsIdParam; +import vip.xiaonuo.dev.modular.sms.param.DevSmsPageParam; +import vip.xiaonuo.dev.modular.sms.param.DevSmsSendAliyunParam; +import vip.xiaonuo.dev.modular.sms.param.DevSmsSendTencentParam; +import vip.xiaonuo.dev.modular.sms.service.DevSmsService; + +import javax.annotation.Resource; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; + +/** + * 短信控制器 + * + * @author xuyuxiang + * @date 2022/2/23 18:26 + **/ +@Api(tags = "短信控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 5) +@RestController +@Validated +public class DevSmsController { + + @Resource + private DevSmsService devSmsService; + + /** + * 发送短信——阿里云 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("发送阿里云短信") + @CommonLog("发送阿里云短信") + @PostMapping("/dev/sms/sendAliyun") + public CommonResult sendAliyun(@RequestBody @Valid DevSmsSendAliyunParam devSmsSendAliyunParam) { + devSmsService.sendAliyun(devSmsSendAliyunParam); + return CommonResult.ok(); + } + + /** + * 发送短信——腾讯云 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("发送腾讯云短信") + @CommonLog("发送腾讯云短信") + @PostMapping("/dev/sms/sendTencent") + public CommonResult sendTencent(@RequestBody @Valid DevSmsSendTencentParam devSmsSendTencentParam) { + devSmsService.sendTencent(devSmsSendTencentParam); + return CommonResult.ok(); + } + + /** + * 获取短信分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("获取短信分页") + @GetMapping("/dev/sms/page") + public CommonResult> page(DevSmsPageParam devSmsPageParam) { + return CommonResult.data(devSmsService.page(devSmsPageParam)); + } + + /** + * 删除短信 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 4) + @ApiOperation("删除短信") + @CommonLog("删除短信") + @PostMapping("/dev/sms/delete") + public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList devSmsIdParamList) { + devSmsService.delete(devSmsIdParamList); + return CommonResult.ok(); + } + + /** + * 获取短信详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 5) + @ApiOperation("获取短信详情") + @GetMapping("/dev/sms/detail") + public CommonResult detail(@Valid DevSmsIdParam devSmsIdParam) { + return CommonResult.data(devSmsService.detail(devSmsIdParam)); + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/entity/DevSms.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/entity/DevSms.java new file mode 100644 index 00000000..43adb70f --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/entity/DevSms.java @@ -0,0 +1,63 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.sms.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import vip.xiaonuo.common.pojo.CommonEntity; + +/** + * 短信实体 + * + * @author xuyuxiang + * @date 2022/2/23 18:27 + **/ +@Getter +@Setter +@TableName("DEV_SMS") +public class DevSms extends CommonEntity { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 短信引擎 */ + @ApiModelProperty(value = "短信引擎", position = 2) + private String engine; + + /** 手机号 */ + @ApiModelProperty(value = "手机号", position = 3) + private String phoneNumbers; + + /** 短信签名 */ + @ApiModelProperty(value = "短信签名", position = 4) + private String signName; + + /** 模板编码 */ + @ApiModelProperty(value = "模板编码", position = 5) + private String templateCode; + + /** 发送参数 */ + @ApiModelProperty(value = "发送参数", position = 6) + private String templateParam; + + /** 回执信息 */ + @ApiModelProperty(value = "回执信息", position = 7) + private String receiptInfo; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 8) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/enums/DevSmsEngineTypeEnum.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/enums/DevSmsEngineTypeEnum.java new file mode 100644 index 00000000..215452fa --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/enums/DevSmsEngineTypeEnum.java @@ -0,0 +1,37 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.sms.enums; + +import lombok.Getter; + +/** + * 短信发送引擎类型枚举 + * + * @author xuyuxiang + * @date 2022/6/16 16:14 + **/ +@Getter +public enum DevSmsEngineTypeEnum { + + /** 阿里云 */ + ALIYUN("ALIYUN"), + + /** 腾讯云 */ + TENCENT("TENCENT"); + + private final String value; + + DevSmsEngineTypeEnum(String value) { + this.value = value; + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/mapper/DevSmsMapper.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/mapper/DevSmsMapper.java new file mode 100644 index 00000000..963957d1 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/mapper/DevSmsMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.sms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.dev.modular.sms.entity.DevSms; + +/** + * 短信Mapper接口 + * + * @author xuyuxiang + * @date 2022/2/23 18:40 + **/ +public interface DevSmsMapper extends BaseMapper { +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/mapper/mapping/DevSmsMapper.xml b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/mapper/mapping/DevSmsMapper.xml new file mode 100644 index 00000000..b001d92e --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/mapper/mapping/DevSmsMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/param/DevSmsIdParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/param/DevSmsIdParam.java new file mode 100644 index 00000000..2038d05e --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/param/DevSmsIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.sms.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 短信Id参数 + * + * @author xuyuxiang + * @date 2022/7/31 15:25 + */ +@Getter +@Setter +public class DevSmsIdParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/param/DevSmsPageParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/param/DevSmsPageParam.java new file mode 100644 index 00000000..731e2287 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/param/DevSmsPageParam.java @@ -0,0 +1,52 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.sms.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 短信查询参数 + * + * @author xuyuxiang + * @date 2022/7/31 15:26 + */ +@Getter +@Setter +public class DevSmsPageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 短信引擎 */ + @ApiModelProperty(value = "短信引擎") + private String engine; + + /** 手机号关键词 */ + @ApiModelProperty(value = "手机号关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/param/DevSmsSendAliyunParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/param/DevSmsSendAliyunParam.java new file mode 100644 index 00000000..aa9407db --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/param/DevSmsSendAliyunParam.java @@ -0,0 +1,48 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.sms.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 短信发送——阿里云参数 + * + * @author xuyuxiang + * @date 2022/7/31 15:21 + */ +@Getter +@Setter +public class DevSmsSendAliyunParam { + + /** 手机号 */ + @ApiModelProperty(value = "手机号,多个逗号拼接", required = true, position = 1) + @NotBlank(message = "phoneNumbers不能为空") + private String phoneNumbers; + + /** 模板编码 */ + @ApiModelProperty(value = "短信服务控制台配置且审核通过的模板编码", required = true, position = 2) + @NotBlank(message = "templateCode不能为空") + private String templateCode; + + /** 发送参数 */ + @ApiModelProperty(value = "短信模板变量对应的实际值,JSON格式", position = 3) + private String templateParam; + + /** 短信签名 */ + @ApiModelProperty(value = "短信服务控制台配置且审核通过的短信签名", position = 4) + private String signName; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/param/DevSmsSendTencentParam.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/param/DevSmsSendTencentParam.java new file mode 100644 index 00000000..bbe3ca6e --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/param/DevSmsSendTencentParam.java @@ -0,0 +1,52 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.sms.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 短信发送——阿里云参数 + * + * @author xuyuxiang + * @date 2022/7/31 15:21 + */ +@Getter +@Setter +public class DevSmsSendTencentParam { + + /** 手机号 */ + @ApiModelProperty(value = "手机号,多个逗号拼接", required = true, position = 1) + @NotBlank(message = "phoneNumbers不能为空") + private String phoneNumbers; + + /** 模板编码 */ + @ApiModelProperty(value = "短信服务控制台配置且审核通过的模板编码", required = true, position = 2) + @NotBlank(message = "templateCode不能为空") + private String templateCode; + + /** 发送参数 */ + @ApiModelProperty(value = "短信模板变量对应的顺序。支持传入多个参数,逗号拼接", position = 3) + private String templateParam; + + /** sdkAppId */ + @ApiModelProperty(value = "在短信控制台添加应用后生成的实际SdkAppId", position = 4) + private String sdkAppId; + + /** 短信签名 */ + @ApiModelProperty(value = "短信服务控制台配置且审核通过的短信签名", position = 5) + private String signName; +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/provider/DevSmsApiProvider.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/provider/DevSmsApiProvider.java new file mode 100644 index 00000000..1d8ec800 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/provider/DevSmsApiProvider.java @@ -0,0 +1,55 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.sms.provider; + +import org.springframework.stereotype.Service; +import vip.xiaonuo.dev.api.DevSmsApi; +import vip.xiaonuo.dev.modular.sms.param.DevSmsSendAliyunParam; +import vip.xiaonuo.dev.modular.sms.param.DevSmsSendTencentParam; +import vip.xiaonuo.dev.modular.sms.service.DevSmsService; + +import javax.annotation.Resource; + +/** + * 短信API接口提供者 + * + * @author xuyuxiang + * @date 2022/6/22 15:33 + **/ +@Service +public class DevSmsApiProvider implements DevSmsApi { + + @Resource + private DevSmsService devSmsService; + + @Override + public void sendSmsAliyun(String phoneNumbers, String signName, String templateCode, String templateParam) { + DevSmsSendAliyunParam devSmsSendAliyunParam = new DevSmsSendAliyunParam(); + devSmsSendAliyunParam.setPhoneNumbers(phoneNumbers); + devSmsSendAliyunParam.setSignName(signName); + devSmsSendAliyunParam.setTemplateCode(templateCode); + devSmsSendAliyunParam.setTemplateParam(templateParam); + devSmsService.sendAliyun(devSmsSendAliyunParam); + } + + @Override + public void sendSmsTencent(String sdkAppId, String phoneNumbers, String signName, String templateCode, String templateParam) { + DevSmsSendTencentParam devSmsSendTencentParam = new DevSmsSendTencentParam(); + devSmsSendTencentParam.setSdkAppId(sdkAppId); + devSmsSendTencentParam.setPhoneNumbers(phoneNumbers); + devSmsSendTencentParam.setSignName(signName); + devSmsSendTencentParam.setTemplateCode(templateCode); + devSmsSendTencentParam.setTemplateParam(templateParam); + devSmsService.sendTencent(devSmsSendTencentParam); + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/service/DevSmsService.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/service/DevSmsService.java new file mode 100644 index 00000000..302d810d --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/service/DevSmsService.java @@ -0,0 +1,80 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.sms.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import vip.xiaonuo.dev.modular.sms.entity.DevSms; +import vip.xiaonuo.dev.modular.sms.param.DevSmsIdParam; +import vip.xiaonuo.dev.modular.sms.param.DevSmsPageParam; +import vip.xiaonuo.dev.modular.sms.param.DevSmsSendAliyunParam; +import vip.xiaonuo.dev.modular.sms.param.DevSmsSendTencentParam; + +import java.util.List; + +/** + * 短信Service接口 + * + * @author xuyuxiang + * @date 2022/2/23 18:27 + **/ +public interface DevSmsService extends IService { + + /** + * 发送短信——阿里云 + * + * @author xuyuxiang + * @date 2022/6/21 18:37 + **/ + void sendAliyun(DevSmsSendAliyunParam devSmsSendAliyunParam); + + /** + * 发送短信——腾讯云 + * + * @author xuyuxiang + * @date 2022/6/21 18:37 + **/ + void sendTencent(DevSmsSendTencentParam devSmsSendTencentParam); + + /** + * 获取短信分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + Page page(DevSmsPageParam devSmsPageParam); + + /** + * 删除短信 + * + * @author xuyuxiang + * @date 2022/8/4 10:36 + **/ + void delete(List devSmsIdParamList); + + /** + * 获取短信详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + DevSms detail(DevSmsIdParam devSmsIdParam); + + /** + * 获取短信详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + DevSms queryEntity(String id); +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/service/impl/DevSmsServiceImpl.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/service/impl/DevSmsServiceImpl.java new file mode 100644 index 00000000..5716f9ce --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/service/impl/DevSmsServiceImpl.java @@ -0,0 +1,125 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.sms.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import vip.xiaonuo.common.enums.CommonSortOrderEnum; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.dev.modular.sms.entity.DevSms; +import vip.xiaonuo.dev.modular.sms.enums.DevSmsEngineTypeEnum; +import vip.xiaonuo.dev.modular.sms.mapper.DevSmsMapper; +import vip.xiaonuo.dev.modular.sms.param.DevSmsIdParam; +import vip.xiaonuo.dev.modular.sms.param.DevSmsPageParam; +import vip.xiaonuo.dev.modular.sms.param.DevSmsSendAliyunParam; +import vip.xiaonuo.dev.modular.sms.param.DevSmsSendTencentParam; +import vip.xiaonuo.dev.modular.sms.service.DevSmsService; +import vip.xiaonuo.dev.modular.sms.util.DevSmsAliyunUtil; +import vip.xiaonuo.dev.modular.sms.util.DevSmsTencentUtil; + +import java.util.List; + +/** + * 短信Service接口实现类 + * + * @author xuyuxiang + * @date 2022/2/23 18:43 + **/ +@Service +public class DevSmsServiceImpl extends ServiceImpl implements DevSmsService { + + @Transactional(rollbackFor = Exception.class) + @Override + public void sendAliyun(DevSmsSendAliyunParam devSmsSendAliyunParam) { + validPhone(devSmsSendAliyunParam.getPhoneNumbers()); + String receiptInfo = DevSmsAliyunUtil.sendSms(devSmsSendAliyunParam.getPhoneNumbers(), devSmsSendAliyunParam.getSignName(), + devSmsSendAliyunParam.getTemplateCode(), devSmsSendAliyunParam.getTemplateParam()); + DevSms devSms = new DevSms(); + BeanUtil.copyProperties(devSmsSendAliyunParam, devSms); + devSms.setEngine(DevSmsEngineTypeEnum.ALIYUN.getValue()); + devSms.setReceiptInfo(receiptInfo); + this.save(devSms); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void sendTencent(DevSmsSendTencentParam smsSendTencentParam) { + validPhone(smsSendTencentParam.getPhoneNumbers()); + String receiptInfo =DevSmsTencentUtil.sendSms(smsSendTencentParam.getSdkAppId(), smsSendTencentParam.getPhoneNumbers(), + smsSendTencentParam.getSignName(), smsSendTencentParam.getTemplateCode(), smsSendTencentParam.getTemplateParam()); + DevSms devSms = new DevSms(); + BeanUtil.copyProperties(smsSendTencentParam, devSms); + devSms.setEngine(DevSmsEngineTypeEnum.TENCENT.getValue()); + devSms.setReceiptInfo(receiptInfo); + this.save(devSms); + } + + @Override + public Page page(DevSmsPageParam devSmsPageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(ObjectUtil.isNotEmpty(devSmsPageParam.getEngine())) { + queryWrapper.lambda().eq(DevSms::getEngine, devSmsPageParam.getEngine()); + } + if(ObjectUtil.isNotEmpty(devSmsPageParam.getSearchKey())) { + queryWrapper.lambda().like(DevSms::getPhoneNumbers, devSmsPageParam.getSearchKey()); + } + if(ObjectUtil.isAllNotEmpty(devSmsPageParam.getSortField(), devSmsPageParam.getSortOrder())) { + CommonSortOrderEnum.validate(devSmsPageParam.getSortOrder()); + queryWrapper.orderBy(true, devSmsPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), + StrUtil.toUnderlineCase(devSmsPageParam.getSortField())); + } + return this.page(CommonPageRequest.defaultPage(), queryWrapper); + } + + @Override + public void delete(List devSmsIdParamList) { + this.removeBatchByIds(CollStreamUtil.toList(devSmsIdParamList, DevSmsIdParam::getId)); + } + + @Override + public DevSms detail(DevSmsIdParam devSmsIdParam) { + return this.queryEntity(devSmsIdParam.getId()); + } + + @Override + public DevSms queryEntity(String id) { + DevSms devSms = this.getById(id); + if(ObjectUtil.isEmpty(devSms)) { + throw new CommonException("短信不存在,id值为:{}", id); + } + return devSms; + } + + /** + * 校验手机格式 + * + * @author xuyuxiang + * @date 2022/8/15 13:32 + **/ + private void validPhone(String phones) { + StrUtil.split(phones, StrUtil.COMMA).forEach(phone -> { + if(!PhoneUtil.isMobile(phone)) { + throw new CommonException("手机号码:{}格式错误", phone); + } + }); + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/util/DevSmsAliyunUtil.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/util/DevSmsAliyunUtil.java new file mode 100644 index 00000000..9baf77ed --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/util/DevSmsAliyunUtil.java @@ -0,0 +1,122 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.sms.util; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.extra.spring.SpringUtil; +import cn.hutool.json.JSONUtil; +import com.aliyun.dysmsapi20170525.Client; +import com.aliyun.dysmsapi20170525.models.SendSmsRequest; +import com.aliyun.dysmsapi20170525.models.SendSmsResponse; +import com.aliyun.dysmsapi20170525.models.SendSmsResponseBody; +import com.aliyun.teaopenapi.models.Config; +import lombok.extern.slf4j.Slf4j; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.dev.api.DevConfigApi; + +/** + * 阿里云短信工具类 + * 参考文档:https://next.api.aliyun.com/api-tools/sdk/Dysmsapi?version=2017-05-25&language=java-tea + * + * @author xuyuxiang + * @date 2022/1/2 17:05 + */ +@Slf4j +public class DevSmsAliyunUtil { + + private static Client client; + + private static final String SNOWY_SMS_ALIYUN_ACCESS_KEY_ID_KEY = "SNOWY_SMS_ALIYUN_ACCESS_KEY_ID"; + private static final String SNOWY_SMS_ALIYUN_ACCESS_KEY_SECRET_KEY = "SNOWY_SMS_ALIYUN_ACCESS_KEY_SECRET"; + private static final String SNOWY_SMS_ALIYUN_END_POINT_KEY = "SNOWY_SMS_ALIYUN_END_POINT"; + private static final String SNOWY_SMS_ALIYUN_DEFAULT_SIGN_NAME_KEY = "SNOWY_SMS_ALIYUN_DEFAULT_SIGN_NAME"; + + /** + * 初始化操作的客户端 + * + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + private static void initClient() { + + DevConfigApi devConfigApi = SpringUtil.getBean(DevConfigApi.class); + + /* accessKeyId */ + String accessKeyId = devConfigApi.getValueByKey(SNOWY_SMS_ALIYUN_ACCESS_KEY_ID_KEY); + + if(ObjectUtil.isEmpty(accessKeyId)) { + throw new CommonException("阿里云短信操作客户端未正确配置:accessKeyId为空"); + } + + /* accessKeySecret */ + String accessKeySecret = devConfigApi.getValueByKey(SNOWY_SMS_ALIYUN_ACCESS_KEY_SECRET_KEY); + + if(ObjectUtil.isEmpty(accessKeyId)) { + throw new CommonException("阿里云短信操作客户端未正确配置:accessKeySecret为空"); + } + + /* endpoint */ + String endpoint = devConfigApi.getValueByKey(SNOWY_SMS_ALIYUN_END_POINT_KEY); + + if(ObjectUtil.isEmpty(accessKeyId)) { + throw new CommonException("阿里云短信操作客户端未正确配置:endpoint为空"); + } + + try { + client = new Client(new Config().setAccessKeyId(accessKeyId).setAccessKeySecret(accessKeySecret).setEndpoint(endpoint)); + } catch (Exception e) { + throw new CommonException(e.getMessage()); + } + } + + /** + * 发送短信 + * + * @param phoneNumbers 手机号码,支持对多个手机号码发送短信,手机号码之间以半角逗号(,)分隔。 + * 上限为1000个手机号码。批量调用相对于单条调用及时性稍有延迟。 + * @param signName 短信服务控制台配置且审核通过的短信签名 + * @param templateCode 短信服务控制台配置且审核通过的模板编码 + * @param templateParam 短信模板变量对应的实际值,JSON格式。支持传入多个参数,示例:{"name":"张三","number":"15038****76"} + * @return 发送的结果信息集合 com.aliyun.dysmsapi20170525.models.SendSmsResponse + * @author xuyuxiang + * @date 2022/2/24 13:42 + **/ + public static String sendSms(String phoneNumbers, String signName, String templateCode, String templateParam) { + try { + initClient(); + if(ObjectUtil.isEmpty(signName)) { + // 签名为空,则获取默认签名 + DevConfigApi devConfigApi = SpringUtil.getBean(DevConfigApi.class); + signName = devConfigApi.getValueByKey(SNOWY_SMS_ALIYUN_DEFAULT_SIGN_NAME_KEY); + if(ObjectUtil.isEmpty(signName)) { + throw new CommonException("阿里云短信操作客户端未正确配置:signName为空"); + } + } + SendSmsRequest sendSmsRequest = new SendSmsRequest() + .setPhoneNumbers(phoneNumbers) + .setSignName(signName) + .setTemplateCode(templateCode) + .setTemplateParam(templateParam); + SendSmsResponse sendSmsResponse = client.sendSms(sendSmsRequest); + SendSmsResponseBody body = sendSmsResponse.getBody(); + String code = body.getCode().toLowerCase(); + if(code.equals("ok")) { + return JSONUtil.toJsonStr(body); + } else { + throw new CommonException(body.getMessage()); + } + } catch (Exception e) { + throw new CommonException(e.getMessage()); + } + } +} diff --git a/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/util/DevSmsTencentUtil.java b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/util/DevSmsTencentUtil.java new file mode 100644 index 00000000..d86c15d6 --- /dev/null +++ b/snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/sms/util/DevSmsTencentUtil.java @@ -0,0 +1,131 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.dev.modular.sms.util; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import cn.hutool.json.JSONUtil; +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.sms.v20210111.SmsClient; +import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest; +import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse; +import com.tencentcloudapi.sms.v20210111.models.SendStatus; +import lombok.extern.slf4j.Slf4j; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.dev.api.DevConfigApi; + +/** + * 腾讯云短信工具类 + * 参考文档:https://cloud.tencent.com/document/product/382/43194 + * + * @author xuyuxiang + * @date 2022/1/2 17:05 + */ +@Slf4j +public class DevSmsTencentUtil { + + private static SmsClient client; + + private static final String SNOWY_SMS_TENCENT_SECRET_ID_KEY = "SNOWY_SMS_TENCENT_SECRET_ID"; + private static final String SNOWY_SMS_TENCENT_SECRET_KEY_KEY = "SNOWY_SMS_TENCENT_SECRET_KEY"; + private static final String SNOWY_SMS_TENCENT_REGION_ID_KEY = "SNOWY_SMS_TENCENT_REGION_ID"; + private static final String SNOWY_SMS_TENCENT_DEFAULT_SDK_APP_ID_KEY = "SNOWY_SMS_TENCENT_DEFAULT_SDK_APP_ID"; + private static final String SNOWY_SMS_TENCENT_DEFAULT_SIGN_NAME_KEY = "SNOWY_SMS_TENCENT_DEFAULT_SIGN_NAME"; + + /** + * 初始化操作的客户端 + * + * @author xuyuxiang + * @date 2022/1/5 23:24 + */ + private static void initClient() { + + DevConfigApi devConfigApi = SpringUtil.getBean(DevConfigApi.class); + + /* secretId */ + String secretId = devConfigApi.getValueByKey(SNOWY_SMS_TENCENT_SECRET_ID_KEY); + + if(ObjectUtil.isEmpty(secretId)) { + throw new CommonException("腾讯云短信操作客户端未正确配置:secretId为空"); + } + + /* secretKey */ + String secretKey = devConfigApi.getValueByKey(SNOWY_SMS_TENCENT_SECRET_KEY_KEY); + + if(ObjectUtil.isEmpty(secretKey)) { + throw new CommonException("腾讯云短信操作客户端未正确配置:secretKey为空"); + } + + /* regionId */ + String regionId = devConfigApi.getValueByKey(SNOWY_SMS_TENCENT_REGION_ID_KEY); + + if(ObjectUtil.isEmpty(regionId)) { + throw new CommonException("腾讯云短信操作客户端未正确配置:regionId为空"); + } + + client = new SmsClient(new Credential(secretId, secretKey), regionId); + } + + /** + * 发送短信 + * + * @param sdkAppId 短信 SdkAppId,在 短信控制台 添加应用后生成的实际 SdkAppId,示例如1400006666。 + * 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看 + * @param phoneNumbers 手机号码,支持对多个手机号码发送短信,手机号码之间以半角逗号(,)分隔。 + * 上限为1000个手机号码。批量调用相对于单条调用及时性稍有延迟。 + * @param signName 短信服务控制台配置且审核通过的短信签名 + * @param templateCode 短信服务控制台配置且审核通过的模板编码 + * @param templateParam 短信模板变量对应的顺序。支持传入多个参数,逗号拼接,示例:"张三,15038****76,进行中" + * @return 发送的结果信息集合 com.tencentcloudapi.sms.v20210111.models.SendStatus + * @author xuyuxiang + * @date 2022/2/24 13:42 + **/ + public static String sendSms(String sdkAppId, String phoneNumbers, String signName, String templateCode, String templateParam) { + try { + initClient(); + if(ObjectUtil.isEmpty(sdkAppId)) { + // sdkAppId为空,则获取默认sdkAppId + DevConfigApi devConfigApi = SpringUtil.getBean(DevConfigApi.class); + signName = devConfigApi.getValueByKey(SNOWY_SMS_TENCENT_DEFAULT_SDK_APP_ID_KEY); + if(ObjectUtil.isEmpty(signName)) { + throw new CommonException("腾讯云短信操作客户端未正确配置:sdkAppId为空"); + } + } + if(ObjectUtil.isEmpty(signName)) { + // 签名为空,则获取默认签名 + DevConfigApi devConfigApi = SpringUtil.getBean(DevConfigApi.class); + signName = devConfigApi.getValueByKey(SNOWY_SMS_TENCENT_DEFAULT_SIGN_NAME_KEY); + if(ObjectUtil.isEmpty(signName)) { + throw new CommonException("腾讯云短信操作客户端未正确配置:signName为空"); + } + } + SendSmsRequest sendSmsRequest = new SendSmsRequest(); + sendSmsRequest.setSmsSdkAppId(sdkAppId); + sendSmsRequest.setPhoneNumberSet(StrUtil.splitToArray(phoneNumbers, StrUtil.COMMA)); + sendSmsRequest.setSignName(signName); + sendSmsRequest.setTemplateId(templateCode); + sendSmsRequest.setTemplateParamSet(ObjectUtil.isNotEmpty(templateParam)?StrUtil.splitToArray(templateParam, StrUtil.COMMA):null); + SendSmsResponse sendSmsResponse = client.SendSms(sendSmsRequest); + SendStatus sendStatus = sendSmsResponse.getSendStatusSet()[0]; + String code = sendStatus.getCode().toLowerCase(); + if(code.equals("ok")) { + return JSONUtil.toJsonStr(sendSmsResponse); + } else { + throw new CommonException(sendStatus.getMessage()); + } + } catch (Exception e) { + throw new CommonException(e.getMessage()); + } + } +} diff --git a/snowy-plugin/snowy-plugin-sys/README.md b/snowy-plugin/snowy-plugin-sys/README.md new file mode 100644 index 00000000..441bfacc --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/README.md @@ -0,0 +1 @@ +# 系统功能插件 \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-sys/pom.xml b/snowy-plugin/snowy-plugin-sys/pom.xml new file mode 100644 index 00000000..45e3a0bb --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + + + vip.xiaonuo + snowy-plugin + 2.0.0 + + + snowy-plugin-sys + jar + 系统功能插件 + + + + + vip.xiaonuo + snowy-plugin-sys-api + ${project.parent.version} + + + + + vip.xiaonuo + snowy-plugin-auth-api + ${project.parent.version} + + + + + vip.xiaonuo + snowy-plugin-dev-api + ${project.parent.version} + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/core/config/SysConfigure.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/core/config/SysConfigure.java new file mode 100644 index 00000000..e9ada0c5 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/core/config/SysConfigure.java @@ -0,0 +1,67 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.core.config; + +import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver; +import io.swagger.annotations.ApiOperation; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.bind.annotation.RequestMethod; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import vip.xiaonuo.common.pojo.CommonResult; + +import javax.annotation.Resource; + +/** + * 系统功能相关配置 + * + * @author xuyuxiang + * @date 2022/7/7 16:18 + **/ +@Configuration +public class SysConfigure { + + @Resource + private OpenApiExtensionResolver openApiExtensionResolver; + + /** + * API文档分组配置 + * + * @author xuyuxiang + * @date 2022/7/7 16:18 + **/ + @Bean(value = "sysDocApi") + public Docket sysDocApi() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(new ApiInfoBuilder() + .title("系统功能SYS") + .description("系统功能SYS") + .termsOfServiceUrl("https://www.xiaonuo.vip") + .contact(new Contact("SNOWY_TEAM","https://www.xiaonuo.vip", "xuyuxiang29@foxmail.com")) + .version("2.0.0") + .build()) + .globalResponseMessage(RequestMethod.GET, CommonResult.responseList()) + .globalResponseMessage(RequestMethod.POST, CommonResult.responseList()) + .groupName("系统功能SYS") + .select() + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + .apis(RequestHandlerSelectors.basePackage("vip.xiaonuo.sys")) + .paths(PathSelectors.any()) + .build().extensions(openApiExtensionResolver.buildExtensions("系统功能SYS")); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/core/enums/SysBuildInEnum.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/core/enums/SysBuildInEnum.java new file mode 100644 index 00000000..5a5c6d54 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/core/enums/SysBuildInEnum.java @@ -0,0 +1,46 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.core.enums; + +import lombok.Getter; + +/** + * 系统内置的不可删除的标识枚举 + * + * @author xuyuxiang + * @date 2022/4/21 19:56 + **/ +@Getter +public enum SysBuildInEnum { + + /** 超管用户账号 */ + BUILD_IN_USER_ACCOUNT("superAdmin", "超管"), + + /** 超管角色编码 */ + BUILD_IN_ROLE_CODE("superAdmin", "超管"), + + /** 系统内置模块编码 */ + BUILD_IN_MODULE_CODE("system", "系统内置"), + + /** 系统内置单页面编码 */ + BUILD_IN_SPA_CODE("system", "系统内置"); + + private final String value; + + private final String name; + + SysBuildInEnum(String value, String name) { + this.value = value; + this.name = name; + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/controller/SysIndexController.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/controller/SysIndexController.java new file mode 100644 index 00000000..0f5dd9f8 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/controller/SysIndexController.java @@ -0,0 +1,146 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.index.controller; + +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.pojo.CommonValidList; +import vip.xiaonuo.sys.modular.index.param.*; +import vip.xiaonuo.sys.modular.index.result.*; +import vip.xiaonuo.sys.modular.index.service.SysIndexService; + +import javax.annotation.Resource; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * 系统首页控制器 + * + * @author xuyuxiang + * @date 2022/9/2 10:44 + */ +@Api(tags = "系统首页控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 0) +@RestController +@Validated +public class SysIndexController { + + @Resource + private SysIndexService sysIndexService; + + /** + * 添加当前用户日程 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("添加日程") + @CommonLog("添加日程") + @PostMapping("/sys/index/schedule/add") + public CommonResult addSchedule(@RequestBody @Valid SysIndexScheduleAddParam sysIndexScheduleAddParam) { + sysIndexService.addSchedule(sysIndexScheduleAddParam); + return CommonResult.ok(); + } + + /** + * 删除日程 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("删除日程") + @CommonLog("删除日程") + @PostMapping("/sys/index/schedule/deleteSchedule") + public CommonResult deleteSchedule(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList sysIndexScheduleIdParamList) { + sysIndexService.deleteSchedule(sysIndexScheduleIdParamList); + return CommonResult.ok(); + } + + /** + * 获取当前用户日程列表 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("获取日程列表") + @GetMapping("/sys/index/schedule/list") + public CommonResult> scheduleList(@Valid SysIndexScheduleListParam sysIndexScheduleListParam) { + return CommonResult.data(sysIndexService.scheduleList(sysIndexScheduleListParam)); + } + + /** + * 获取当前用户站内信列表 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 4) + @ApiOperation("获取当前用户站内信列表") + @GetMapping("/sys/index/message/list") + public CommonResult> messageList(SysIndexMessageListParam sysIndexMessageListParam) { + return CommonResult.data(sysIndexService.messageList(sysIndexMessageListParam)); + } + + /** + * 获取站内信详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 5) + @ApiOperation("获取站内信详情") + @GetMapping("/sys/index/message/detail") + public CommonResult messageDetail(@Valid SysIndexMessageIdParam sysIndexMessageIdParam) { + return CommonResult.data(sysIndexService.messageDetail(sysIndexMessageIdParam)); + } + + /** + * 获取当前用户访问日志列表 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 6) + @ApiOperation("获取当前用户访问日志列表") + @GetMapping("/sys/index/visLog/list") + public CommonResult> visLogList() { + return CommonResult.data(sysIndexService.visLogList()); + } + + /** + * 获取当前用户操作日志列表 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 7) + @ApiOperation("获取当前用户操作日志列表") + @GetMapping("/sys/index/opLog/list") + public CommonResult> opLogList() { + return CommonResult.data(sysIndexService.opLogList()); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/param/SysIndexMessageIdParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/param/SysIndexMessageIdParam.java new file mode 100644 index 00000000..ebcf9c20 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/param/SysIndexMessageIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.index.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 站内信Id参数 + * + * @author xuyuxiang + * @date 2022/9/2 11:06 + */ +@Getter +@Setter +public class SysIndexMessageIdParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/param/SysIndexMessageListParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/param/SysIndexMessageListParam.java new file mode 100644 index 00000000..a06cbf96 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/param/SysIndexMessageListParam.java @@ -0,0 +1,32 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.index.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 站内信列表参数 + * + * @author xuyuxiang + * @date 2022/6/21 15:34 + **/ +@Getter +@Setter +public class SysIndexMessageListParam { + + /** 条数" */ + @ApiModelProperty(value = "条数") + private Integer limit; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/param/SysIndexScheduleAddParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/param/SysIndexScheduleAddParam.java new file mode 100644 index 00000000..6392fe9c --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/param/SysIndexScheduleAddParam.java @@ -0,0 +1,53 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.index.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 日程添加参数 + * + * @author xuyuxiang + * @date 2022/9/2 11:06 + */ +@Getter +@Setter +public class SysIndexScheduleAddParam { + + /** 日程日期 */ + @ApiModelProperty(value = "日程日期", required = true, position = 1) + @NotBlank(message = "scheduleDate不能为空") + private String scheduleDate; + + /** 日程时间 */ + @ApiModelProperty(value = "日程时间", required = true, position = 2) + @NotBlank(message = "scheduleTime不能为空") + private String scheduleTime; + + /** 日程内容 */ + @ApiModelProperty(value = "日程内容", required = true, position = 3) + @NotBlank(message = "scheduleContent不能为空") + private String scheduleContent; + + /** 用户id */ + @ApiModelProperty(value = "用户id", hidden = true, position = 4) + private String scheduleUserId; + + /** 用户姓名 */ + @ApiModelProperty(value = "用户姓名", hidden = true, position = 5) + private String scheduleUserName; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/param/SysIndexScheduleIdParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/param/SysIndexScheduleIdParam.java new file mode 100644 index 00000000..859208b5 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/param/SysIndexScheduleIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.index.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 日程Id参数 + * + * @author xuyuxiang + * @date 2022/9/2 11:06 + */ +@Getter +@Setter +public class SysIndexScheduleIdParam { + + /** 日程id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/param/SysIndexScheduleListParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/param/SysIndexScheduleListParam.java new file mode 100644 index 00000000..e0bd6044 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/param/SysIndexScheduleListParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.index.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 日程列表查询参数 + * + * @author xuyuxiang + * @date 2022/9/2 11:06 + */ +@Getter +@Setter +public class SysIndexScheduleListParam { + + /** 日程日期 */ + @ApiModelProperty(value = "日程日期", required = true) + @NotBlank(message = "scheduleDate不能为空") + private String scheduleDate; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/result/SysIndexMessageDetailResult.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/result/SysIndexMessageDetailResult.java new file mode 100644 index 00000000..9dfb17ab --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/result/SysIndexMessageDetailResult.java @@ -0,0 +1,77 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.index.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * 站内信详情结果 + * + * @author xuyuxiang + * @date 2022/7/31 16:39 + */ +@Getter +@Setter +public class SysIndexMessageDetailResult { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 2) + private String category; + + /** 主题 */ + @ApiModelProperty(value = "主题", position = 3) + private String subject; + + /** 正文 */ + @ApiModelProperty(value = "正文", position = 4) + private String content; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 5) + private String extJson; + + /** 接收信息集合 */ + @ApiModelProperty(value = "接收信息集合", position = 6) + private List receiveInfoList; + + /** + * 接收信息类 + * + * @author xuyuxiang + * @date 2022/7/31 16:42 + */ + @Getter + @Setter + public static class DevReceiveInfo { + + /** 接收人ID */ + @ApiModelProperty(value = "接收人ID", position = 1) + private String receiveUserId; + + /** 接收人姓名 */ + @ApiModelProperty(value = "接收人姓名", position = 2) + private String receiveUserName; + + /** 是否已读 */ + @ApiModelProperty(value = "是否已读", position = 3) + private Boolean read; + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/result/SysIndexMessageListResult.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/result/SysIndexMessageListResult.java new file mode 100644 index 00000000..9686aefe --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/result/SysIndexMessageListResult.java @@ -0,0 +1,66 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.index.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +/** + * 站内信列表结果 + * + * @author xuyuxiang + * @date 2022/7/31 16:39 + */ +@Getter +@Setter +public class SysIndexMessageListResult { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 2) + private String category; + + /** 主题 */ + @ApiModelProperty(value = "主题", position = 3) + private String subject; + + /** 正文 */ + @ApiModelProperty(value = "正文", position = 4) + private String content; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 5) + private String extJson; + + /** 创建时间 */ + @ApiModelProperty(value = "创建时间", position = 6) + private Date createTime; + + /** 创建人 */ + @ApiModelProperty(value = "创建人", position = 7) + private String createUser; + + /** 更新时间 */ + @ApiModelProperty(value = "更新时间", position = 8) + private Date updateTime; + + /** 更新人 */ + @ApiModelProperty(value = "更新人", position = 9) + private String updateUser; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/result/SysIndexOpLogListResult.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/result/SysIndexOpLogListResult.java new file mode 100644 index 00000000..d1142660 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/result/SysIndexOpLogListResult.java @@ -0,0 +1,124 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.index.result; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +/** + * 操作日志结果 + * + * @author xuyuxiang + * @date 2022/9/2 15:02 + */ +@Getter +@Setter +public class SysIndexOpLogListResult { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 日志分类 */ + @ApiModelProperty(value = "日志分类", position = 2) + private String category; + + /** 日志名称 */ + @ApiModelProperty(value = "日志名称", position = 3) + private String name; + + /** 执行状态 */ + @ApiModelProperty(value = "执行状态", position = 4) + private String exeStatus; + + /** 具体消息 */ + @ApiModelProperty(value = "具体消息", position = 5) + private String exeMessage; + + /** 操作ip */ + @ApiModelProperty(value = "操作ip", position = 6) + private String opIp; + + /** 操作地址 */ + @ApiModelProperty(value = "操作地址", position = 7) + private String opAddress; + + /** 操作浏览器 */ + @ApiModelProperty(value = "操作浏览器", position = 8) + private String opBrowser; + + /** 操作系统 */ + @ApiModelProperty(value = "操作系统", position = 9) + private String opOs; + + /** 类名称 */ + @ApiModelProperty(value = "类名称", position = 10) + private String className; + + /** 方法名称 */ + @ApiModelProperty(value = "方法名称", position = 11) + private String methodName; + + /** 请求方式 */ + @ApiModelProperty(value = "请求方式", position = 12) + private String reqMethod; + + /** 请求地址 */ + @ApiModelProperty(value = "请求地址", position = 13) + private String reqUrl; + + /** 请求参数 */ + @ApiModelProperty(value = "请求参数", position = 14) + private String paramJson; + + /** 返回结果 */ + @ApiModelProperty(value = "返回结果", position = 15) + private String resultJson; + + /** 操作时间 */ + @ApiModelProperty(value = "操作时间", position = 16) + private Date opTime; + + /** 操作人姓名 */ + @ApiModelProperty(value = "操作人姓名", position = 17) + private String opUser; + + /** 签名数据 */ + @ApiModelProperty(value = "签名数据", position = 18) + private String signData; + + /** 创建时间 */ + @ApiModelProperty(value = "创建时间", position = 19) + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** 创建人 */ + @ApiModelProperty(value = "创建人", position = 20) + @TableField(fill = FieldFill.INSERT) + private String createUser; + + /** 更新时间 */ + @ApiModelProperty(value = "更新时间", position = 21) + @TableField(fill = FieldFill.UPDATE) + private Date updateTime; + + /** 更新人 */ + @ApiModelProperty(value = "更新人", position = 22) + @TableField(fill = FieldFill.UPDATE) + private String updateUser; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/result/SysIndexScheduleListResult.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/result/SysIndexScheduleListResult.java new file mode 100644 index 00000000..2b9a4b96 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/result/SysIndexScheduleListResult.java @@ -0,0 +1,52 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.index.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 日程列表结果 + * + * @author xuyuxiang + * @date 2022/9/2 11:21 + */ +@Getter +@Setter +public class SysIndexScheduleListResult { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 用户id */ + @ApiModelProperty(value = "用户id", position = 2) + private String scheduleUserId; + + /** 用户姓名 */ + @ApiModelProperty(value = "用户姓名", position = 3) + private String scheduleUserName; + + /** 日程日期 */ + @ApiModelProperty(value = "日程日期", position = 4) + private String scheduleDate; + + /** 日程时间 */ + @ApiModelProperty(value = "日程时间", position = 5) + private String scheduleTime; + + /** 日程内容 */ + @ApiModelProperty(value = "日程内容", position = 6) + private String scheduleContent; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/result/SysIndexVisLogListResult.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/result/SysIndexVisLogListResult.java new file mode 100644 index 00000000..ba95649c --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/result/SysIndexVisLogListResult.java @@ -0,0 +1,100 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.index.result; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +/** + * 访问日志结果 + * + * @author xuyuxiang + * @date 2022/9/2 15:02 + */ +@Getter +@Setter +public class SysIndexVisLogListResult { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 日志分类 */ + @ApiModelProperty(value = "日志分类", position = 2) + private String category; + + /** 日志名称 */ + @ApiModelProperty(value = "日志名称", position = 3) + private String name; + + /** 执行状态 */ + @ApiModelProperty(value = "执行状态", position = 4) + private String exeStatus; + + /** 具体消息 */ + @ApiModelProperty(value = "具体消息", position = 5) + private String exeMessage; + + /** 操作ip */ + @ApiModelProperty(value = "操作ip", position = 6) + private String opIp; + + /** 操作地址 */ + @ApiModelProperty(value = "操作地址", position = 7) + private String opAddress; + + /** 操作浏览器 */ + @ApiModelProperty(value = "操作浏览器", position = 8) + private String opBrowser; + + /** 操作系统 */ + @ApiModelProperty(value = "操作系统", position = 9) + private String opOs; + + /** 操作时间 */ + @ApiModelProperty(value = "操作时间", position = 10) + private Date opTime; + + /** 操作人姓名 */ + @ApiModelProperty(value = "操作人姓名", position = 11) + private String opUser; + + /** 签名数据 */ + @ApiModelProperty(value = "签名数据", position = 12) + private String signData; + + /** 创建时间 */ + @ApiModelProperty(value = "创建时间", position = 13) + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** 创建人 */ + @ApiModelProperty(value = "创建人", position = 14) + @TableField(fill = FieldFill.INSERT) + private String createUser; + + /** 更新时间 */ + @ApiModelProperty(value = "更新时间", position = 15) + @TableField(fill = FieldFill.UPDATE) + private Date updateTime; + + /** 更新人 */ + @ApiModelProperty(value = "更新人", position = 16) + @TableField(fill = FieldFill.UPDATE) + private String updateUser; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/service/SysIndexService.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/service/SysIndexService.java new file mode 100644 index 00000000..483b245f --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/service/SysIndexService.java @@ -0,0 +1,84 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.index.service; + +import vip.xiaonuo.common.pojo.CommonValidList; +import vip.xiaonuo.sys.modular.index.param.*; +import vip.xiaonuo.sys.modular.index.result.*; + +import java.util.List; + +/** + * 系统首页Service接口 + * + * @author xuyuxiang + * @date 2022/9/2 10:45 + */ +public interface SysIndexService { + + /** + * 添加当前用户日程 + * + * @author xuyuxiang + * @date 2022/9/2 11:13 + */ + void addSchedule(SysIndexScheduleAddParam sysIndexScheduleAddParam); + + /** + * 删除日程 + * + * @author xuyuxiang + * @date 2022/9/2 11:32 + */ + void deleteSchedule(CommonValidList sysIndexScheduleIdParamList); + + /** + * 获取当前用户日程列表 + * + * @author xuyuxiang + * @date 2022/9/2 11:23 + */ + List scheduleList(SysIndexScheduleListParam sysIndexScheduleListParam); + + /** + * 获取当前用户站内信列表 + * + * @author xuyuxiang + * @date 2022/9/2 11:36 + */ + List messageList(SysIndexMessageListParam sysIndexMessageListParam); + + /** + * 获取站内信详情 + * + * @author xuyuxiang + * @date 2022/9/2 11:44 + */ + SysIndexMessageDetailResult messageDetail(SysIndexMessageIdParam sysIndexMessageIdParam); + + /** + * 获取当前用户访问日志列表 + * + * @author xuyuxiang + * @date 2022/9/4 15:11 + */ + List visLogList(); + + /** + * 获取当前用户操作日志列表 + * + * @author xuyuxiang + * @date 2022/9/4 15:11 + */ + List opLogList(); +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/service/impl/SysIndexServiceImpl.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/service/impl/SysIndexServiceImpl.java new file mode 100644 index 00000000..9f6d0fb9 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/index/service/impl/SysIndexServiceImpl.java @@ -0,0 +1,108 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.index.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.springframework.stereotype.Service; +import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser; +import vip.xiaonuo.auth.core.util.StpLoginUserUtil; +import vip.xiaonuo.common.pojo.CommonValidList; +import vip.xiaonuo.dev.api.DevLogApi; +import vip.xiaonuo.dev.api.DevMessageApi; +import vip.xiaonuo.sys.modular.index.param.*; +import vip.xiaonuo.sys.modular.index.result.*; +import vip.xiaonuo.sys.modular.index.service.SysIndexService; +import vip.xiaonuo.sys.modular.relation.entity.SysRelation; +import vip.xiaonuo.sys.modular.relation.enums.SysRelationCategoryEnum; +import vip.xiaonuo.sys.modular.relation.service.SysRelationService; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 系统首页Service接口实现类 + * + * @author xuyuxiang + * @date 2022/9/2 10:45 + */ +@Service +public class SysIndexServiceImpl implements SysIndexService { + + @Resource + private SysRelationService sysRelationService; + + @Resource + private DevMessageApi devMessageApi; + + @Resource + private DevLogApi devLogApi; + + @Override + public void addSchedule(SysIndexScheduleAddParam sysIndexScheduleAddParam) { + SaBaseLoginUser loginUser = StpLoginUserUtil.getLoginUser(); + sysIndexScheduleAddParam.setScheduleUserId(loginUser.getId()); + sysIndexScheduleAddParam.setScheduleUserName(loginUser.getName()); + sysRelationService.saveRelationWithAppend(loginUser.getId(), sysIndexScheduleAddParam.getScheduleDate(), + SysRelationCategoryEnum.SYS_USER_SCHEDULE_DATA.getValue(), JSONUtil.toJsonStr(sysIndexScheduleAddParam)); + } + + @Override + public void deleteSchedule(CommonValidList sysIndexScheduleIdParamList) { + List scheduleIdList = sysIndexScheduleIdParamList.stream().map(SysIndexScheduleIdParam::getId) + .collect(Collectors.toList()); + if(ObjectUtil.isNotEmpty(scheduleIdList)) { + sysRelationService.removeBatchByIds(scheduleIdList); + } + } + + @Override + public List scheduleList(SysIndexScheduleListParam sysIndexScheduleListParam) { + return sysRelationService.list(new LambdaUpdateWrapper().eq(SysRelation::getObjectId, StpUtil.getLoginIdAsString()) + .eq(SysRelation::getTargetId, sysIndexScheduleListParam.getScheduleDate()) + .eq(SysRelation::getCategory, SysRelationCategoryEnum.SYS_USER_SCHEDULE_DATA.getValue())) + .stream().map(sysRelation -> { + SysIndexScheduleListResult sysIndexScheduleListResult = JSONUtil.toBean(sysRelation.getExtJson(), SysIndexScheduleListResult.class); + sysIndexScheduleListResult.setId(sysRelation.getId()); + return sysIndexScheduleListResult; + }).collect(Collectors.toList()); + } + + @Override + public List messageList(SysIndexMessageListParam sysIndexMessageListParam) { + return devMessageApi.list(CollectionUtil.newArrayList(StpUtil.getLoginIdAsString()), + ObjectUtil.isEmpty(sysIndexMessageListParam.getLimit())?10:sysIndexMessageListParam.getLimit()).stream() + .map(jsonObject -> JSONUtil.toBean(jsonObject, SysIndexMessageListResult.class)).collect(Collectors.toList()); + } + + @Override + public SysIndexMessageDetailResult messageDetail(SysIndexMessageIdParam sysIndexMessageIdParam) { + return JSONUtil.toBean(devMessageApi.detail(sysIndexMessageIdParam.getId()), SysIndexMessageDetailResult.class); + } + + @Override + public List visLogList() { + return devLogApi.currentUserVisLogList().stream() + .map(jsonObject -> JSONUtil.toBean(jsonObject, SysIndexVisLogListResult.class)).collect(Collectors.toList()); + } + + @Override + public List opLogList() { + return devLogApi.currentUserOpLogList().stream() + .map(jsonObject -> JSONUtil.toBean(jsonObject, SysIndexOpLogListResult.class)).collect(Collectors.toList()); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/controller/SysOrgController.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/controller/SysOrgController.java new file mode 100644 index 00000000..f4e5a0c8 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/controller/SysOrgController.java @@ -0,0 +1,166 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.org.controller; + +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.pojo.CommonValidList; +import vip.xiaonuo.sys.modular.org.entity.SysOrg; +import vip.xiaonuo.sys.modular.org.param.*; +import vip.xiaonuo.sys.modular.org.service.SysOrgService; +import vip.xiaonuo.sys.modular.user.entity.SysUser; + +import javax.annotation.Resource; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * 组织控制器 + * + * @author xuyuxiang + * @date 2022/4/24 19:55 + */ +@Api(tags = "组织控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 1) +@RestController +@Validated +public class SysOrgController { + + @Resource + private SysOrgService sysOrgService; + + /** + * 获取组织分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("获取组织分页") + @GetMapping("/sys/org/page") + public CommonResult> page(SysOrgPageParam sysOrgPageParam) { + return CommonResult.data(sysOrgService.page(sysOrgPageParam)); + } + + /** + * 获取组织树 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("获取组织树") + @GetMapping("/sys/org/tree") + public CommonResult>> tree() { + return CommonResult.data(sysOrgService.tree()); + } + + /** + * 添加组织 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("添加组织") + @CommonLog("添加组织") + @PostMapping("/sys/org/add") + public CommonResult add(@RequestBody @Valid SysOrgAddParam sysOrgAddParam) { + sysOrgService.add(sysOrgAddParam); + return CommonResult.ok(); + } + + /** + * 编辑组织 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 4) + @ApiOperation("编辑组织") + @CommonLog("编辑组织") + @PostMapping("/sys/org/edit") + public CommonResult edit(@RequestBody @Valid SysOrgEditParam sysOrgEditParam) { + sysOrgService.edit(sysOrgEditParam); + return CommonResult.ok(); + } + + /** + * 删除组织 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 5) + @ApiOperation("删除组织") + @CommonLog("删除组织") + @PostMapping("/sys/org/delete") + public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList sysOrgIdParamList) { + sysOrgService.delete(sysOrgIdParamList); + return CommonResult.ok(); + } + + /** + * 获取组织详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 6) + @ApiOperation("获取组织详情") + @GetMapping("/sys/org/detail") + public CommonResult detail(@Valid SysOrgIdParam sysOrgIdParam) { + return CommonResult.data(sysOrgService.detail(sysOrgIdParam)); + } + + /* ====组织部分所需要用到的选择器==== */ + + /** + * 获取组织树选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 7) + @ApiOperation("获取组织树选择器") + @GetMapping("/sys/org/orgTreeSelector") + public CommonResult>> orgTreeSelector() { + return CommonResult.data(sysOrgService.orgTreeSelector()); + } + + /** + * 获取用户选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 8) + @ApiOperation("获取用户选择器") + @GetMapping("/sys/org/userSelector") + public CommonResult> userSelector(SysOrgSelectorUserParam sysOrgSelectorUserParam) { + return CommonResult.data(sysOrgService.userSelector(sysOrgSelectorUserParam)); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/entity/SysOrg.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/entity/SysOrg.java new file mode 100644 index 00000000..be004c4a --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/entity/SysOrg.java @@ -0,0 +1,67 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.org.entity; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import vip.xiaonuo.common.pojo.CommonEntity; + +/** + * 组织实体 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +@TableName("SYS_ORG") +public class SysOrg extends CommonEntity { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 父id */ + @ApiModelProperty(value = "父id", position = 2) + private String parentId; + + /** 主管id */ + @ApiModelProperty(value = "主管id", position = 3) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String directorId; + + /** 名称 */ + @ApiModelProperty(value = "名称", position = 4) + private String name; + + /** 编码 */ + @ApiModelProperty(value = "编码", position = 5) + private String code; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 6) + private String category; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 7) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 8) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/enums/SysOrgCategoryEnum.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/enums/SysOrgCategoryEnum.java new file mode 100644 index 00000000..1fd20780 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/enums/SysOrgCategoryEnum.java @@ -0,0 +1,45 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.org.enums; + +import lombok.Getter; +import vip.xiaonuo.common.exception.CommonException; + +/** + * 组织分类枚举 + * + * @author xuyuxiang + * @date 2022/4/21 19:56 + **/ +@Getter +public enum SysOrgCategoryEnum { + + /** 公司 */ + COMPANY("COMPANY"), + + /** 部门 */ + DEPT("DEPT"); + + private final String value; + + SysOrgCategoryEnum(String value) { + this.value = value; + } + + public static void validate(String value) { + boolean flag = COMPANY.getValue().equals(value) || DEPT.getValue().equals(value); + if(!flag) { + throw new CommonException("不支持的组织分类:{}", value); + } + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/mapper/SysOrgMapper.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/mapper/SysOrgMapper.java new file mode 100644 index 00000000..e48863f4 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/mapper/SysOrgMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.org.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.sys.modular.org.entity.SysOrg; + +/** + * 组织Mapper接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:37 + **/ +public interface SysOrgMapper extends BaseMapper { +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/mapper/mapping/SysOrgMapper.xml b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/mapper/mapping/SysOrgMapper.xml new file mode 100644 index 00000000..5776c3a6 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/mapper/mapping/SysOrgMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/param/SysOrgAddParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/param/SysOrgAddParam.java new file mode 100644 index 00000000..cb13fa81 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/param/SysOrgAddParam.java @@ -0,0 +1,59 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.org.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 组织添加参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class SysOrgAddParam { + + /** 父id */ + @ApiModelProperty(value = "父id", required = true, position = 1) + @NotBlank(message = "parentId不能为空") + private String parentId; + + /** 名称 */ + @ApiModelProperty(value = "名称", required = true, position = 2) + @NotBlank(message = "name不能为空") + private String name; + + /** 分类 */ + @ApiModelProperty(value = "分类", required = true, position = 3) + @NotBlank(message = "category不能为空") + private String category; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", required = true, position = 4) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 主管id */ + @ApiModelProperty(value = "主管id", position = 5) + private String directorId; + + /** 扩展JSON */ + @ApiModelProperty(value = "扩展JSON", position = 6) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/param/SysOrgEditParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/param/SysOrgEditParam.java new file mode 100644 index 00000000..716c2fd5 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/param/SysOrgEditParam.java @@ -0,0 +1,64 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.org.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 组织编辑参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class SysOrgEditParam { + + /** id */ + @ApiModelProperty(value = "id", required = true, position = 1) + @NotBlank(message = "id不能为空") + private String id; + + /** 父id */ + @ApiModelProperty(value = "父id", required = true, position = 2) + @NotBlank(message = "parentId不能为空") + private String parentId; + + /** 名称 */ + @ApiModelProperty(value = "名称", required = true, position = 3) + @NotBlank(message = "name不能为空") + private String name; + + /** 分类 */ + @ApiModelProperty(value = "分类", required = true, position = 4) + @NotBlank(message = "category不能为空") + private String category; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", required = true, position = 5) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 主管id */ + @ApiModelProperty(value = "主管id", position = 6) + private String directorId; + + /** 扩展JSON */ + @ApiModelProperty(value = "扩展JSON", position = 7) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/param/SysOrgIdParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/param/SysOrgIdParam.java new file mode 100644 index 00000000..4d3bc643 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/param/SysOrgIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.org.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 组织Id参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class SysOrgIdParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/param/SysOrgPageParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/param/SysOrgPageParam.java new file mode 100644 index 00000000..0c917176 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/param/SysOrgPageParam.java @@ -0,0 +1,52 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.org.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 组织查询参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class SysOrgPageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 父id */ + @ApiModelProperty(value = "父id") + private String parentId; + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/param/SysOrgSelectorOrgListParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/param/SysOrgSelectorOrgListParam.java new file mode 100644 index 00000000..9a451e67 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/param/SysOrgSelectorOrgListParam.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.org.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 组织列表选择器参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class SysOrgSelectorOrgListParam { + + /** 父id */ + @ApiModelProperty(value = "父id") + private String parentId; + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/param/SysOrgSelectorUserParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/param/SysOrgSelectorUserParam.java new file mode 100644 index 00000000..0ffc5f7a --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/param/SysOrgSelectorUserParam.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.org.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 用户选择器参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class SysOrgSelectorUserParam { + + /** 组织id */ + @ApiModelProperty(value = "组织id") + private String orgId; + + /** 姓名关键词 */ + @ApiModelProperty(value = "姓名关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/provider/SysOrgApiProvider.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/provider/SysOrgApiProvider.java new file mode 100644 index 00000000..1692027b --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/provider/SysOrgApiProvider.java @@ -0,0 +1,66 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.org.provider; + +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import org.springframework.stereotype.Service; +import vip.xiaonuo.sys.api.SysOrgApi; +import vip.xiaonuo.sys.modular.org.entity.SysOrg; +import vip.xiaonuo.sys.modular.org.param.SysOrgSelectorOrgListParam; +import vip.xiaonuo.sys.modular.org.service.SysOrgService; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 组织API接口提供者 + * + * @author xuyuxiang + * @date 2022/7/22 14:56 + **/ +@Service +public class SysOrgApiProvider implements SysOrgApi { + + @Resource + private SysOrgService sysOrgService; + + @Override + public String getNameById(String orgId) { + return sysOrgService.queryEntity(orgId).getName(); + } + + @Override + public String getSupervisorIdByOrgId(String orgId) { + SysOrg sysOrg = sysOrgService.getById(orgId); + if(ObjectUtil.isNotEmpty(sysOrg)) { + return sysOrg.getDirectorId(); + } + return null; + } + + @Override + public List> orgTreeSelector() { + return sysOrgService.orgTreeSelector(); + } + + @Override + public List orgListSelector(String parentId) { + SysOrgSelectorOrgListParam sysOrgSelectorOrgListParam = new SysOrgSelectorOrgListParam(); + sysOrgSelectorOrgListParam.setParentId(parentId); + return sysOrgService.orgListSelector(sysOrgSelectorOrgListParam).stream().map(JSONUtil::parseObj).collect(Collectors.toList()); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/service/SysOrgService.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/service/SysOrgService.java new file mode 100644 index 00000000..85f7ea21 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/service/SysOrgService.java @@ -0,0 +1,127 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.org.service; + +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import vip.xiaonuo.sys.modular.org.entity.SysOrg; +import vip.xiaonuo.sys.modular.org.param.*; +import vip.xiaonuo.sys.modular.user.entity.SysUser; + +import java.util.List; + +/** + * 组织Service接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:35 + **/ +public interface SysOrgService extends IService { + + /** + * 获取组织分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + Page page(SysOrgPageParam sysOrgPageParam); + + /** + * 获取组织树 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + List> tree(); + + /** + * 添加组织 + * + * @author xuyuxiang + * @date 2022/4/24 20:48 + */ + void add(SysOrgAddParam sysOrgAddParam); + + /** + * 编辑组织 + * + * @author xuyuxiang + * @date 2022/4/24 21:13 + */ + void edit(SysOrgEditParam sysOrgEditParam); + + /** + * 删除组织 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + void delete(List sysOrgIdParamList); + + /** + * 获取组织详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + SysOrg detail(SysOrgIdParam sysOrgIdParam); + + /** + * 获取组织详情 + * + * @author xuyuxiang + * @date 2022/7/25 19:42 + **/ + SysOrg queryEntity(String id); + + /** + * 根据id获取所有的子数据列表 + * + * @author xuyuxiang + * @date 2022/8/15 14:55 + **/ + List getChildListById(List originDataList, String id, boolean includeSelf); + + /** + * 根据id获取数据 + * + * @author xuyuxiang + * @date 2022/8/15 14:55 + **/ + SysOrg getById(List originDataList, String id) ; + + /** + * 获取组织树选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + List> orgTreeSelector(); + + /** + * 获取组织列表选择器 + * + * @author xuyuxiang + * @date 2022/7/22 13:34 + **/ + List orgListSelector(SysOrgSelectorOrgListParam sysOrgSelectorOrgListParam); + + /** + * 获取用户选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + List userSelector(SysOrgSelectorUserParam sysOrgSelectorUserParam); +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/service/impl/SysOrgServiceImpl.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/service/impl/SysOrgServiceImpl.java new file mode 100644 index 00000000..9c2125a4 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/org/service/impl/SysOrgServiceImpl.java @@ -0,0 +1,301 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.org.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNode; +import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import vip.xiaonuo.common.enums.CommonSortOrderEnum; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.sys.modular.org.entity.SysOrg; +import vip.xiaonuo.sys.modular.org.enums.SysOrgCategoryEnum; +import vip.xiaonuo.sys.modular.org.mapper.SysOrgMapper; +import vip.xiaonuo.sys.modular.org.param.*; +import vip.xiaonuo.sys.modular.org.service.SysOrgService; +import vip.xiaonuo.sys.modular.position.entity.SysPosition; +import vip.xiaonuo.sys.modular.position.service.SysPositionService; +import vip.xiaonuo.sys.modular.role.entity.SysRole; +import vip.xiaonuo.sys.modular.role.enums.SysRoleCategoryEnum; +import vip.xiaonuo.sys.modular.role.service.SysRoleService; +import vip.xiaonuo.sys.modular.user.entity.SysUser; +import vip.xiaonuo.sys.modular.user.service.SysUserService; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 组织Service接口实现类 + * + * @author xuyuxiang + * @date 2022/2/23 18:43 + **/ +@Service +public class SysOrgServiceImpl extends ServiceImpl implements SysOrgService { + + @Resource + private SysRoleService sysRoleService; + + @Resource + private SysPositionService sysPositionService; + + @Resource + private SysUserService sysUserService; + + @Override + public Page page(SysOrgPageParam sysOrgPageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + // 查询部分字段 + queryWrapper.lambda().select(SysOrg::getId, SysOrg::getParentId, SysOrg::getName, + SysOrg::getCategory, SysOrg::getSortCode); + if(ObjectUtil.isNotEmpty(sysOrgPageParam.getParentId())) { + queryWrapper.lambda().eq(SysOrg::getParentId, sysOrgPageParam.getParentId()); + } + if(ObjectUtil.isNotEmpty(sysOrgPageParam.getSearchKey())) { + queryWrapper.lambda().like(SysOrg::getName, sysOrgPageParam.getSearchKey()); + } + if(ObjectUtil.isAllNotEmpty(sysOrgPageParam.getSortField(), sysOrgPageParam.getSortOrder())) { + CommonSortOrderEnum.validate(sysOrgPageParam.getSortOrder()); + queryWrapper.orderBy(true, sysOrgPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), + StrUtil.toUnderlineCase(sysOrgPageParam.getSortField())); + } else { + queryWrapper.lambda().orderByAsc(SysOrg::getSortCode); + } + return this.page(CommonPageRequest.defaultPage(), queryWrapper); + } + + @Override + public List> tree() { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.orderByAsc(SysOrg::getSortCode); + List sysOrgList = this.list(lambdaQueryWrapper); + List> treeNodeList = sysOrgList.stream().map(sysOrg -> + new TreeNode<>(sysOrg.getId(), sysOrg.getParentId(), + sysOrg.getName(), sysOrg.getSortCode()).setExtra(JSONUtil.parseObj(sysOrg))) + .collect(Collectors.toList()); + return TreeUtil.build(treeNodeList, "0"); + } + + @Override + public void add(SysOrgAddParam sysOrgAddParam) { + SysOrgCategoryEnum.validate(sysOrgAddParam.getCategory()); + SysOrg sysOrg = BeanUtil.toBean(sysOrgAddParam, SysOrg.class); + // 重复名称 + boolean repeatName = this.count(new LambdaQueryWrapper().eq(SysOrg::getParentId, sysOrg.getParentId()) + .eq(SysOrg::getName, sysOrg.getName())) > 0; + if(repeatName) { + throw new CommonException("存在重复的同级组织,名称为:{}", sysOrg.getName()); + } + sysOrg.setCode(RandomUtil.randomString(10)); + this.save(sysOrg); + } + + @Override + public void edit(SysOrgEditParam sysOrgEditParam) { + SysOrgCategoryEnum.validate(sysOrgEditParam.getCategory()); + SysOrg sysOrg = this.queryEntity(sysOrgEditParam.getId()); + BeanUtil.copyProperties(sysOrgEditParam, sysOrg); + boolean repeatName = this.count(new LambdaQueryWrapper().eq(SysOrg::getParentId, sysOrg.getParentId()) + .eq(SysOrg::getName, sysOrg.getName()).ne(SysOrg::getId, sysOrg.getId())) > 0; + if(repeatName) { + throw new CommonException("存在重复的同级组织,名称为:{}", sysOrg.getName()); + } + List originDataList = this.list(); + boolean errorLevel = this.getChildListById(originDataList, sysOrg.getId(), true).stream() + .map(SysOrg::getId).collect(Collectors.toList()).contains(sysOrg.getParentId()); + if(errorLevel) { + throw new CommonException("不可选择上级组织:{}", this.getById(originDataList, sysOrg.getParentId()).getName()); + } + this.updateById(sysOrg); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void delete(List sysOrgIdParamList) { + List orgIdList = CollStreamUtil.toList(sysOrgIdParamList, SysOrgIdParam::getId); + if(ObjectUtil.isNotEmpty(orgIdList)) { + List allOrgList = this.list(); + // 获取所有子组织 + List toDeleteOrgIdList = CollectionUtil.newArrayList(); + orgIdList.forEach(orgId -> toDeleteOrgIdList.addAll(this.getChildListById(allOrgList, orgId, true).stream() + .map(SysOrg::getId).collect(Collectors.toList()))); + + // 组织下有人不能删除(直属组织) + boolean hasOrgUser = sysUserService.count(new LambdaQueryWrapper().in(SysUser::getOrgId, toDeleteOrgIdList)) > 0; + if(hasOrgUser) { + throw new CommonException("请先删除组织下的用户"); + } + // 组织下有人不能删除(兼任组织) + List positionJsonList = sysUserService.list(new LambdaQueryWrapper() + .isNotNull(SysUser::getPositionJson)).stream().map(SysUser::getPositionJson).collect(Collectors.toList()); + if(ObjectUtil.isNotEmpty(positionJsonList)) { + List positionOrgIdList = CollectionUtil.newArrayList(); + positionJsonList.forEach(positionJson -> JSONUtil.toList(JSONUtil.parseArray(positionJson), JSONObject.class) + .forEach(jsonObject -> positionOrgIdList.add(jsonObject.getStr("orgId")))); + boolean hasPositionUser = CollectionUtil.intersectionDistinct(toDeleteOrgIdList, CollectionUtil.removeNull(positionOrgIdList)).size() > 0; + if(hasPositionUser) { + throw new CommonException("请先删除组织下的用户"); + } + } + // 组织下有角色不能删除 + boolean hasRole = sysRoleService.count(new LambdaQueryWrapper().in(SysRole::getOrgId, toDeleteOrgIdList)) > 0; + if(hasRole) { + throw new CommonException("请先删除组织下的角色"); + } + // 组织下有职位不能删除 + boolean hasPosition = sysPositionService.count(new LambdaQueryWrapper().in(SysPosition::getOrgId, toDeleteOrgIdList)) > 0; + if(hasPosition) { + throw new CommonException("请先删除组织下的职位"); + } + // 执行删除 + this.removeBatchByIds(toDeleteOrgIdList); + } + } + + @Override + public SysOrg detail(SysOrgIdParam sysOrgIdParam) { + return this.queryEntity(sysOrgIdParam.getId()); + } + + @Override + public SysOrg queryEntity(String id) { + SysOrg sysOrg = this.getById(id); + if(ObjectUtil.isEmpty(sysOrg)) { + throw new CommonException("组织不存在,id值为:{}", id); + } + return sysOrg; + } + + /* ====组织部分所需要用到的选择器==== */ + + @Override + public List> orgTreeSelector() { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.orderByAsc(SysOrg::getSortCode); + List sysOrgList = this.list(lambdaQueryWrapper); + List> treeNodeList = sysOrgList.stream().map(sysOrg -> + new TreeNode<>(sysOrg.getId(), sysOrg.getParentId(), sysOrg.getName(), sysOrg.getSortCode())) + .collect(Collectors.toList()); + return TreeUtil.build(treeNodeList, "0"); + } + + @Override + public List orgListSelector(SysOrgSelectorOrgListParam sysOrgSelectorOrgListParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + // 查询部分字段 + lambdaQueryWrapper.select(SysOrg::getId, SysOrg::getParentId, SysOrg::getName, + SysOrg::getCategory, SysOrg::getSortCode); + if(ObjectUtil.isNotEmpty(sysOrgSelectorOrgListParam.getParentId())) { + lambdaQueryWrapper.eq(SysOrg::getParentId, sysOrgSelectorOrgListParam.getParentId()); + } + if(ObjectUtil.isNotEmpty(sysOrgSelectorOrgListParam.getSearchKey())) { + lambdaQueryWrapper.like(SysOrg::getName, sysOrgSelectorOrgListParam.getSearchKey()); + } + lambdaQueryWrapper.orderByAsc(SysOrg::getSortCode); + return this.list(lambdaQueryWrapper); + } + + @Override + public List userSelector(SysOrgSelectorUserParam sysOrgSelectorUserParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + // 只查询部分字段 + lambdaQueryWrapper.select(SysUser::getId, SysUser::getOrgId, SysUser::getAccount, SysUser::getName); + if(ObjectUtil.isNotEmpty(sysOrgSelectorUserParam.getOrgId())) { + lambdaQueryWrapper.eq(SysUser::getOrgId, sysOrgSelectorUserParam.getOrgId()); + } + if(ObjectUtil.isNotEmpty(sysOrgSelectorUserParam.getSearchKey())) { + lambdaQueryWrapper.like(SysUser::getName, sysOrgSelectorUserParam.getSearchKey()); + } + lambdaQueryWrapper.orderByAsc(SysUser::getSortCode); + return sysUserService.list(lambdaQueryWrapper); + } + + /* ====以下为各种递归方法==== */ + + @Override + public List getChildListById(List originDataList, String id, boolean includeSelf) { + List resultList = CollectionUtil.newArrayList(); + execRecursionFindChild(originDataList, id, resultList); + if(includeSelf) { + SysOrg self = this.getById(originDataList, id); + if(ObjectUtil.isNotEmpty(self)) { + resultList.add(self); + } + } + return resultList; + } + + public List getParentListById(List originDataList, String id, boolean includeSelf) { + List resultList = CollectionUtil.newArrayList(); + execRecursionFindParent(originDataList, id, resultList); + if(includeSelf) { + SysOrg self = this.getById(originDataList, id); + if(ObjectUtil.isNotEmpty(self)) { + resultList.add(self); + } + } + return resultList; + } + + public void execRecursionFindChild(List originDataList, String id, List resultList) { + originDataList.forEach(item -> { + if(item.getParentId().equals(id)) { + resultList.add(item); + execRecursionFindChild(originDataList, item.getId(), resultList); + } + }); + } + + public void execRecursionFindParent(List originDataList, String id, List resultList) { + originDataList.forEach(item -> { + if(item.getId().equals(id)) { + SysOrg parent = this.getById(originDataList, item.getParentId()); + if(ObjectUtil.isNotEmpty(parent)) { + resultList.add(parent); + } + execRecursionFindParent(originDataList, item.getParentId(), resultList); + } + }); + } + + @Override + public SysOrg getById(List originDataList, String id) { + int index = CollStreamUtil.toList(originDataList, SysOrg::getId).indexOf(id); + return index == -1?null:originDataList.get(index); + } + + public SysOrg getParentById(List originDataList, String id) { + SysOrg self = this.getById(originDataList, id); + return ObjectUtil.isNotEmpty(self)?self:this.getById(originDataList, self.getParentId()); + } + + public SysOrg getChildById(List originDataList, String id) { + int index = CollStreamUtil.toList(originDataList, SysOrg::getParentId).indexOf(id); + return index == -1?null:originDataList.get(index); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/controller/SysPositionController.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/controller/SysPositionController.java new file mode 100644 index 00000000..c704b10c --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/controller/SysPositionController.java @@ -0,0 +1,152 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.position.controller; + +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.pojo.CommonValidList; +import vip.xiaonuo.sys.modular.position.entity.SysPosition; +import vip.xiaonuo.sys.modular.position.param.*; +import vip.xiaonuo.sys.modular.position.service.SysPositionService; + +import javax.annotation.Resource; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * 职位控制器 + * + * @author xuyuxiang + * @date 2022/4/25 20:40 + */ +@Api(tags = "职位控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 2) +@RestController +@Validated +public class SysPositionController { + + @Resource + private SysPositionService sysPositionService; + + /** + * 获取职位分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("获取职位分页") + @GetMapping("/sys/position/page") + public CommonResult> page(SysPositionPageParam sysPositionPageParam) { + return CommonResult.data(sysPositionService.page(sysPositionPageParam)); + } + + /** + * 添加职位 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("添加职位") + @CommonLog("添加职位") + @PostMapping("/sys/position/add") + public CommonResult add(@RequestBody @Valid SysPositionAddParam sysPositionAddParam) { + sysPositionService.add(sysPositionAddParam); + return CommonResult.ok(); + } + + /** + * 编辑职位 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("编辑职位") + @CommonLog("编辑职位") + @PostMapping("/sys/position/edit") + public CommonResult edit(@RequestBody @Valid SysPositionEditParam sysPositionEditParam) { + sysPositionService.edit(sysPositionEditParam); + return CommonResult.ok(); + } + + /** + * 删除职位 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 4) + @ApiOperation("删除职位") + @CommonLog("删除职位") + @PostMapping("/sys/position/delete") + public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList sysPositionIdParamList) { + sysPositionService.delete(sysPositionIdParamList); + return CommonResult.ok(); + } + + /** + * 获取职位详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 5) + @ApiOperation("获取职位详情") + @GetMapping("/sys/position/detail") + public CommonResult detail(@Valid SysPositionIdParam sysPositionIdParam) { + return CommonResult.data(sysPositionService.detail(sysPositionIdParam)); + } + + /* ====职位部分所需要用到的选择器==== */ + + /** + * 获取组织树选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 6) + @ApiOperation("获取组织树选择器") + @GetMapping("/sys/position/orgTreeSelector") + public CommonResult>> orgTreeSelector() { + return CommonResult.data(sysPositionService.orgTreeSelector()); + } + + /** + * 获取职位选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 7) + @ApiOperation("获取职位选择器") + @GetMapping("/sys/position/positionSelector") + public CommonResult> positionSelector(SysPositionSelectorPositionParam sysPositionSelectorPositionParam) { + return CommonResult.data(sysPositionService.positionSelector(sysPositionSelectorPositionParam)); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/entity/SysPosition.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/entity/SysPosition.java new file mode 100644 index 00000000..99888aa3 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/entity/SysPosition.java @@ -0,0 +1,62 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.position.entity; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import vip.xiaonuo.common.pojo.CommonEntity; + +/** + * 职位实体 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +@TableName("SYS_POSITION") +public class SysPosition extends CommonEntity { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 组织id */ + @ApiModelProperty(value = "组织id", position = 2) + private String orgId; + + /** 名称 */ + @ApiModelProperty(value = "名称", position = 3) + private String name; + + /** 编码 */ + @ApiModelProperty(value = "编码", position = 4) + private String code; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 5) + private String category; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 6) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 7) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/enums/SysPositionCategoryEnum.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/enums/SysPositionCategoryEnum.java new file mode 100644 index 00000000..6ac93cf1 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/enums/SysPositionCategoryEnum.java @@ -0,0 +1,48 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.position.enums; + +import lombok.Getter; +import vip.xiaonuo.common.exception.CommonException; + +/** + * 职位分类枚举 + * + * @author xuyuxiang + * @date 2022/4/21 19:56 + **/ +@Getter +public enum SysPositionCategoryEnum { + + /** 高层 */ + COMPANY("HIGH"), + + /** 中层 */ + DEPT("MIDDLE"), + + /** 基层 */ + LOW("LOW"); + + private final String value; + + SysPositionCategoryEnum(String value) { + this.value = value; + } + + public static void validate(String value) { + boolean flag = COMPANY.getValue().equals(value) || DEPT.getValue().equals(value); + if(!flag) { + throw new CommonException("不支持的职位分类:{}", value); + } + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/mapper/SysPositionMapper.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/mapper/SysPositionMapper.java new file mode 100644 index 00000000..b186db33 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/mapper/SysPositionMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.position.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.sys.modular.position.entity.SysPosition; + +/** + * 职位Mapper接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:37 + **/ +public interface SysPositionMapper extends BaseMapper { +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/mapper/mapping/SysPositionMapper.xml b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/mapper/mapping/SysPositionMapper.xml new file mode 100644 index 00000000..ec432e78 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/mapper/mapping/SysPositionMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/param/SysPositionAddParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/param/SysPositionAddParam.java new file mode 100644 index 00000000..f554bac1 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/param/SysPositionAddParam.java @@ -0,0 +1,55 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.position.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 职位添加参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class SysPositionAddParam { + + /** 组织id */ + @ApiModelProperty(value = "组织id", required = true, position = 1) + @NotBlank(message = "orgId不能为空") + private String orgId; + + /** 名称 */ + @ApiModelProperty(value = "名称", required = true, position = 2) + @NotBlank(message = "name不能为空") + private String name; + + /** 分类 */ + @ApiModelProperty(value = "分类", required = true, position = 3) + @NotBlank(message = "category不能为空") + private String category; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", required = true, position = 4) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 扩展JSON */ + @ApiModelProperty(value = "扩展JSON", position = 5) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/param/SysPositionEditParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/param/SysPositionEditParam.java new file mode 100644 index 00000000..1e7cb733 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/param/SysPositionEditParam.java @@ -0,0 +1,60 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.position.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 职位编辑参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class SysPositionEditParam { + + /** id */ + @ApiModelProperty(value = "id", required = true, position = 1) + @NotBlank(message = "id不能为空") + private String id; + + /** 组织id */ + @ApiModelProperty(value = "组织id", required = true, position = 2) + @NotBlank(message = "orgId不能为空") + private String orgId; + + /** 名称 */ + @ApiModelProperty(value = "名称", required = true, position = 3) + @NotBlank(message = "name不能为空") + private String name; + + /** 分类 */ + @ApiModelProperty(value = "分类", required = true, position = 4) + @NotBlank(message = "category不能为空") + private String category; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", required = true, position = 5) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 扩展JSON */ + @ApiModelProperty(value = "扩展JSON", position = 6) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/param/SysPositionIdParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/param/SysPositionIdParam.java new file mode 100644 index 00000000..c4aff4c4 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/param/SysPositionIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.position.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 职位Id参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class SysPositionIdParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/param/SysPositionPageParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/param/SysPositionPageParam.java new file mode 100644 index 00000000..96200590 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/param/SysPositionPageParam.java @@ -0,0 +1,56 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.position.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 职位查询参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class SysPositionPageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 组织id */ + @ApiModelProperty(value = "组织id") + private String orgId; + + /** 职位分类 */ + @ApiModelProperty(value = "职位分类") + private String category; + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/param/SysPositionSelectorPositionParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/param/SysPositionSelectorPositionParam.java new file mode 100644 index 00000000..d185c9f7 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/param/SysPositionSelectorPositionParam.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.position.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 职位选择器参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class SysPositionSelectorPositionParam { + + /** 组织id */ + @ApiModelProperty(value = "组织id") + private String orgId; + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/provider/SysPositionApiProvider.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/provider/SysPositionApiProvider.java new file mode 100644 index 00000000..d1546341 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/provider/SysPositionApiProvider.java @@ -0,0 +1,50 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.position.provider; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import org.springframework.stereotype.Service; +import vip.xiaonuo.sys.api.SysPositionApi; +import vip.xiaonuo.sys.modular.position.param.SysPositionSelectorPositionParam; +import vip.xiaonuo.sys.modular.position.service.SysPositionService; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 职位API接口提供者 + * + * @author xuyuxiang + * @date 2022/7/22 14:56 + **/ +@Service +public class SysPositionApiProvider implements SysPositionApi { + + @Resource + private SysPositionService sysPositionService; + + @Override + public String getNameById(String positionId) { + return sysPositionService.queryEntity(positionId).getName(); + } + + @Override + public List positionSelector(String orgId, String searchKey) { + SysPositionSelectorPositionParam sysPositionSelectorPositionParam = new SysPositionSelectorPositionParam(); + sysPositionSelectorPositionParam.setOrgId(orgId); + sysPositionSelectorPositionParam.setSearchKey(searchKey); + return sysPositionService.positionSelector(sysPositionSelectorPositionParam).stream().map(JSONUtil::parseObj).collect(Collectors.toList()); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/service/SysPositionService.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/service/SysPositionService.java new file mode 100644 index 00000000..3db8511e --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/service/SysPositionService.java @@ -0,0 +1,104 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.position.service; + +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import vip.xiaonuo.sys.modular.position.entity.SysPosition; +import vip.xiaonuo.sys.modular.position.param.*; + +import java.util.List; + +/** + * 职位Service接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:35 + **/ +public interface SysPositionService extends IService { + + /** + * 获取职位分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + Page page(SysPositionPageParam sysPositionPageParam); + + /** + * 添加职位 + * + * @author xuyuxiang + * @date 2022/4/24 20:48 + */ + void add(SysPositionAddParam sysPositionAddParam); + + /** + * 编辑职位 + * + * @author xuyuxiang + * @date 2022/4/24 21:13 + */ + void edit(SysPositionEditParam sysPositionEditParam); + + /** + * 删除职位 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + void delete(List sysPositionIdParamList); + + /** + * 获取职位详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + SysPosition detail(SysPositionIdParam sysPositionIdParam); + + /** + * 获取职位详情 + * + * @author xuyuxiang + * @date 2022/7/25 19:42 + **/ + SysPosition queryEntity(String id); + + /** + * 根据id获取数据 + * + * @author xuyuxiang + * @date 2022/8/15 14:55 + **/ + SysPosition getById(List originDataList, String id) ; + + /* ====职位部分所需要用到的选择器==== */ + + /** + * 获取组织树选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + List> orgTreeSelector(); + + /** + * 获取职位选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + List positionSelector(SysPositionSelectorPositionParam sysPositionSelectorPositionParam); +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/service/impl/SysPositionServiceImpl.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/service/impl/SysPositionServiceImpl.java new file mode 100644 index 00000000..9d112ce9 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/position/service/impl/SysPositionServiceImpl.java @@ -0,0 +1,190 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.position.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNode; +import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import vip.xiaonuo.common.enums.CommonSortOrderEnum; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.sys.modular.org.entity.SysOrg; +import vip.xiaonuo.sys.modular.org.service.SysOrgService; +import vip.xiaonuo.sys.modular.position.entity.SysPosition; +import vip.xiaonuo.sys.modular.position.enums.SysPositionCategoryEnum; +import vip.xiaonuo.sys.modular.position.mapper.SysPositionMapper; +import vip.xiaonuo.sys.modular.position.param.*; +import vip.xiaonuo.sys.modular.position.service.SysPositionService; +import vip.xiaonuo.sys.modular.user.entity.SysUser; +import vip.xiaonuo.sys.modular.user.service.SysUserService; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 职位Service接口实现类 + * + * @author xuyuxiang + * @date 2022/2/23 18:43 + **/ +@Service +public class SysPositionServiceImpl extends ServiceImpl implements SysPositionService { + + @Resource + private SysOrgService sysOrgService; + + @Resource + private SysUserService sysUserService; + + @Override + public Page page(SysPositionPageParam sysPositionPageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + // 查询部分字段 + queryWrapper.lambda().select(SysPosition::getId, SysPosition::getOrgId, SysPosition::getName, + SysPosition::getCategory, SysPosition::getSortCode); + if(ObjectUtil.isNotEmpty(sysPositionPageParam.getOrgId())) { + queryWrapper.lambda().eq(SysPosition::getOrgId, sysPositionPageParam.getOrgId()); + } + if(ObjectUtil.isNotEmpty(sysPositionPageParam.getCategory())) { + queryWrapper.lambda().eq(SysPosition::getCategory, sysPositionPageParam.getCategory()); + } + if(ObjectUtil.isNotEmpty(sysPositionPageParam.getSearchKey())) { + queryWrapper.lambda().like(SysPosition::getName, sysPositionPageParam.getSearchKey()); + } + if(ObjectUtil.isAllNotEmpty(sysPositionPageParam.getSortField(), sysPositionPageParam.getSortOrder())) { + CommonSortOrderEnum.validate(sysPositionPageParam.getSortOrder()); + queryWrapper.orderBy(true, sysPositionPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), + StrUtil.toUnderlineCase(sysPositionPageParam.getSortField())); + } else { + queryWrapper.lambda().orderByAsc(SysPosition::getSortCode); + } + return this.page(CommonPageRequest.defaultPage(), queryWrapper); + } + + @Override + public void add(SysPositionAddParam sysPositionAddParam) { + SysPositionCategoryEnum.validate(sysPositionAddParam.getCategory()); + SysPosition sysPosition = BeanUtil.toBean(sysPositionAddParam, SysPosition.class); + boolean repeatName = this.count(new LambdaQueryWrapper().eq(SysPosition::getOrgId, sysPosition.getOrgId()) + .eq(SysPosition::getName, sysPosition.getName())) > 0; + if(repeatName) { + throw new CommonException("同组织下存在重复的职位,名称为:{}", sysPosition.getName()); + } + sysPosition.setCode(RandomUtil.randomString(10)); + this.save(sysPosition); + } + + @Override + public void edit(SysPositionEditParam sysPositionEditParam) { + SysPositionCategoryEnum.validate(sysPositionEditParam.getCategory()); + SysPosition sysPosition = this.queryEntity(sysPositionEditParam.getId()); + BeanUtil.copyProperties(sysPositionEditParam, sysPosition); + boolean repeatName = this.count(new LambdaQueryWrapper().eq(SysPosition::getOrgId, sysPosition.getOrgId()) + .eq(SysPosition::getName, sysPosition.getName()).ne(SysPosition::getId, sysPosition.getId())) > 0; + if(repeatName) { + throw new CommonException("同组织下存在重复的职位,名称为:{}", sysPosition.getName()); + } + this.updateById(sysPosition); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void delete(List sysPositionIdParamList) { + List positionIdList = CollStreamUtil.toList(sysPositionIdParamList, SysPositionIdParam::getId); + if(ObjectUtil.isNotEmpty(positionIdList)) { + // 职位下有人不能删除(直属职位) + boolean hasOrgUser = sysUserService.count(new LambdaQueryWrapper().in(SysUser::getPositionId, positionIdList)) > 0; + if(hasOrgUser) { + throw new CommonException("请先删除职位下的用户"); + } + // 职位下有人不能删除(兼任职位) + List positionJsonList = sysUserService.list(new LambdaQueryWrapper() + .isNotNull(SysUser::getPositionJson)).stream().map(SysUser::getPositionJson).collect(Collectors.toList()); + if(ObjectUtil.isNotEmpty(positionJsonList)) { + List extPositionIdList = CollectionUtil.newArrayList(); + positionJsonList.forEach(positionJson -> JSONUtil.toList(JSONUtil.parseArray(positionJson), JSONObject.class) + .forEach(jsonObject -> extPositionIdList.add(jsonObject.getStr("positionId")))); + boolean hasPositionUser = CollectionUtil.intersectionDistinct(positionIdList, CollectionUtil.removeNull(extPositionIdList)).size() > 0; + if(hasPositionUser) { + throw new CommonException("请先删除职位下的用户"); + } + } + // 执行删除 + this.removeBatchByIds(positionIdList); + } + } + + @Override + public SysPosition detail(SysPositionIdParam sysPositionIdParam) { + return this.queryEntity(sysPositionIdParam.getId()); + } + + @Override + public SysPosition queryEntity(String id) { + SysPosition sysPosition = this.getById(id); + if(ObjectUtil.isEmpty(sysPosition)) { + throw new CommonException("职位不存在,id值为:{}", id); + } + return sysPosition; + } + + @Override + public SysPosition getById(List originDataList, String id) { + int index = CollStreamUtil.toList(originDataList, SysPosition::getId).indexOf(id); + return index == -1?null:originDataList.get(index); + } + + /* ====职位部分所需要用到的选择器==== */ + + @Override + public List> orgTreeSelector() { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.orderByAsc(SysOrg::getSortCode); + List sysOrgList = sysOrgService.list(lambdaQueryWrapper); + List> treeNodeList = sysOrgList.stream().map(sysOrg -> + new TreeNode<>(sysOrg.getId(), sysOrg.getParentId(), sysOrg.getName(), sysOrg.getSortCode())) + .collect(Collectors.toList()); + return TreeUtil.build(treeNodeList, "0"); + } + + @Override + public List positionSelector(SysPositionSelectorPositionParam sysPositionSelectorPositionParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + // 查询部分字段 + lambdaQueryWrapper.select(SysPosition::getId, SysPosition::getOrgId, SysPosition::getName, + SysPosition::getCategory, SysPosition::getSortCode); + if(ObjectUtil.isNotEmpty(sysPositionSelectorPositionParam.getOrgId())) { + lambdaQueryWrapper.eq(SysPosition::getOrgId, sysPositionSelectorPositionParam.getOrgId()); + } + if(ObjectUtil.isNotEmpty(sysPositionSelectorPositionParam.getSearchKey())) { + lambdaQueryWrapper.like(SysPosition::getName, sysPositionSelectorPositionParam.getSearchKey()); + } + lambdaQueryWrapper.orderByAsc(SysPosition::getSortCode); + return this.list(lambdaQueryWrapper); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/entity/SysRelation.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/entity/SysRelation.java new file mode 100644 index 00000000..e370755d --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/entity/SysRelation.java @@ -0,0 +1,53 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.relation.entity; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 关系实体 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +@TableName("SYS_RELATION") +public class SysRelation{ + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 对象id */ + @ApiModelProperty(value = "对象id", position = 2) + private String objectId; + + /** 目标id */ + @ApiModelProperty(value = "目标id", position = 3) + private String targetId; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 4) + private String category; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 5) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/enums/SysRelationCategoryEnum.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/enums/SysRelationCategoryEnum.java new file mode 100644 index 00000000..05aec9dc --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/enums/SysRelationCategoryEnum.java @@ -0,0 +1,46 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.relation.enums; + +import lombok.Getter; + +/** + * 关系分类枚举 + * + * @author xuyuxiang + * @date 2022/4/21 19:56 + **/ +@Getter +public enum SysRelationCategoryEnum { + + /** 用户工作台数据 */ + SYS_USER_WORKBENCH_DATA("SYS_USER_WORKBENCH_DATA"), + + /** 用户日程数据 */ + SYS_USER_SCHEDULE_DATA("SYS_USER_SCHEDULE_DATA"), + + /** 用户拥有角色 */ + SYS_USER_HAS_ROLE("SYS_USER_HAS_ROLE"), + + /** 角色拥有资源 */ + SYS_ROLE_HAS_RESOURCE("SYS_ROLE_HAS_RESOURCE"), + + /** 角色拥有权限 */ + SYS_ROLE_HAS_PERMISSION("SYS_ROLE_HAS_PERMISSION"); + + private final String value; + + SysRelationCategoryEnum(String value) { + this.value = value; + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/mapper/SysRelationMapper.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/mapper/SysRelationMapper.java new file mode 100644 index 00000000..f8816c12 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/mapper/SysRelationMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.relation.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.sys.modular.relation.entity.SysRelation; + +/** + * 关系Mapper接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:37 + **/ +public interface SysRelationMapper extends BaseMapper { +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/mapper/mapping/SysRelationMapper.xml b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/mapper/mapping/SysRelationMapper.xml new file mode 100644 index 00000000..74148f75 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/mapper/mapping/SysRelationMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/provider/SysRelationApiProvider.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/provider/SysRelationApiProvider.java new file mode 100644 index 00000000..e9811733 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/provider/SysRelationApiProvider.java @@ -0,0 +1,40 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.relation.provider; + +import org.springframework.stereotype.Service; +import vip.xiaonuo.sys.api.SysRelationApi; +import vip.xiaonuo.sys.modular.relation.enums.SysRelationCategoryEnum; +import vip.xiaonuo.sys.modular.relation.service.SysRelationService; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 关系API接口实现类 + * + * @author xuyuxiang + * @date 2022/6/6 15:33 + **/ +@Service +public class SysRelationApiProvider implements SysRelationApi { + + @Resource + private SysRelationService sysRelationService; + + @Override + public List getUserIdListByRoleIdList(List roleIdList) { + return sysRelationService.getRelationObjectIdListByTargetIdListAndCategory(roleIdList, + SysRelationCategoryEnum.SYS_USER_HAS_ROLE.getValue()); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/service/SysRelationService.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/service/SysRelationService.java new file mode 100644 index 00000000..ce23e404 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/service/SysRelationService.java @@ -0,0 +1,231 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.relation.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import vip.xiaonuo.sys.modular.relation.entity.SysRelation; + +import java.util.List; + +/** + * 关系Service接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:35 + **/ +public interface SysRelationService extends IService { + + /** + * 获取当前接口的数据范围 + * 返回的集合有三种情况 + * 1、 + * + * + * @return 数据范围(即组织id)集合 + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ +// List getDataScopeList(); + + /** + * 追加关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationWithAppend(String objectId, String targetId, String category); + + /** + * 追加关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationWithAppend(String objectId, String targetId, String category, String extJson); + + /** + * 批量追加关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationBatchWithAppend(String objectId, List targetIdList, String category); + + /** + * 批量追加关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationBatchWithAppend(String objectId, List targetIdList, String category, List extJsonList); + + /** + * 清空原关系并保存关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationWithClear(String objectId, String targetId, String category); + + /** + * 清空原关系并保存关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationWithClear(String objectId, String targetId, String category, String extJson); + + /** + * 清空原关系并批量保存关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationBatchWithClear(String objectId, List targetIdList, String category); + + /** + * 清空原关系并批量保存关系 + * + * @author xuyuxiang + * @date 2022/4/24 22:29 + */ + void saveRelationBatchWithClear(String objectId, List targetIdList, String category, List extJsonList); + + /** + * 根据对象id获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByObjectId(String objectId); + + /** + * 根据对象id集合获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByObjectIdList(List objectIdList); + + /** + * 根据对象id和关系分类获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByObjectIdAndCategory(String objectId, String category); + + /** + * 根据对象id集合和关系分类获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByObjectIdListAndCategory(List objectIdList, String category); + + /** + * 根据目标id获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByTargetId(String targetId); + + /** + * 根据目标id集合获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByTargetIdList(List targetIdList); + + /** + * 根据目标id和关系分类获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByTargetIdAndCategory(String targetId, String category); + + /** + * 根据目标id集合和关系分类获取关系列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:06 + */ + List getRelationListByTargetIdListAndCategory(List targetIdList, String category); + + /** + * 根据对象id获取目标id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:07 + */ + List getRelationTargetIdListByObjectId(String objectId); + + /** + * 根据对象id集合获取目标id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:07 + */ + List getRelationTargetIdListByObjectIdList(List objectIdList); + + /** + * 根据对象id和关系分类获取目标id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:07 + */ + List getRelationTargetIdListByObjectIdAndCategory(String objectId, String category); + + /** + * 根据对象id集合和关系分类获取目标id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:07 + */ + List getRelationTargetIdListByObjectIdListAndCategory(List objectIdList, String category); + + /** + * 根据目标id获取对象id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:07 + */ + List getRelationObjectIdListByTargetId(String targetId); + + /** + * 根据目标id集合获取对象id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:07 + */ + List getRelationObjectIdListByTargetIdList(List targetIdList); + + /** + * 根据目标id和关系分类获取对象id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:08 + */ + List getRelationObjectIdListByTargetIdAndCategory(String targetId, String category); + + /** + * 根据目标id集合和关系分类获取对象id列表 + * + * @author xuyuxiang + * @date 2022/4/27 22:08 + */ + List getRelationObjectIdListByTargetIdListAndCategory(List targetIdList, String category); +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/service/impl/SysRelationServiceImpl.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/service/impl/SysRelationServiceImpl.java new file mode 100644 index 00000000..69d77731 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/service/impl/SysRelationServiceImpl.java @@ -0,0 +1,218 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.relation.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import vip.xiaonuo.sys.modular.relation.entity.SysRelation; +import vip.xiaonuo.sys.modular.relation.mapper.SysRelationMapper; +import vip.xiaonuo.sys.modular.relation.service.SysRelationService; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 关系Service接口实现类 + * + * @author xuyuxiang + * @date 2022/2/23 18:43 + **/ +@Service +public class SysRelationServiceImpl extends ServiceImpl implements SysRelationService { + + @Transactional(rollbackFor = Exception.class) + public void saveRelation(String objectId, String targetId, String category, String extJson, boolean clear) { + // 是否需要先删除关系 + if(clear) { + this.remove(new LambdaQueryWrapper().eq(SysRelation::getObjectId, objectId) + .eq(SysRelation::getCategory, category)); + } + SysRelation sysRelation = new SysRelation(); + sysRelation.setObjectId(objectId); + sysRelation.setTargetId(targetId); + sysRelation.setCategory(category); + sysRelation.setExtJson(extJson); + this.save(sysRelation); + } + + @Transactional(rollbackFor = Exception.class) + public void saveRelationBatch(String objectId, List targetIdList, String category, List extJsonList, boolean clear) { + // 是否需要先删除关系 + if(clear) { + this.remove(new LambdaQueryWrapper().eq(SysRelation::getObjectId, objectId) + .eq(SysRelation::getCategory, category)); + } + List sysRelationList = CollectionUtil.newArrayList(); + for(int i = 0; i < targetIdList.size(); i++) { + SysRelation sysRelation = new SysRelation(); + sysRelation.setObjectId(objectId); + sysRelation.setTargetId(targetIdList.get(i)); + sysRelation.setCategory(category); + if(ObjectUtil.isNotEmpty(extJsonList)) { + sysRelation.setExtJson(extJsonList.get(i)); + } + sysRelationList.add(sysRelation); + } + if(ObjectUtil.isNotEmpty(sysRelationList)) { + this.saveBatch(sysRelationList); + } + } + + @Override + public void saveRelationWithAppend(String objectId, String targetId, String category) { + this.saveRelation(objectId, targetId, category, null, false); + } + + @Override + public void saveRelationWithAppend(String objectId, String targetId, String category, String extJson) { + this.saveRelation(objectId, targetId, category, extJson, false); + } + + @Override + public void saveRelationBatchWithAppend(String objectId, List targetIdList, String category) { + this.saveRelationBatch(objectId, targetIdList, category, null, false); + } + + @Override + public void saveRelationBatchWithAppend(String objectId, List targetIdList, String category, List extJsonList) { + this.saveRelationBatch(objectId, targetIdList, category, extJsonList, false); + } + + @Override + public void saveRelationWithClear(String objectId, String targetId, String category) { + this.saveRelation(objectId, targetId, category, null, true); + } + + @Override + public void saveRelationWithClear(String objectId, String targetId, String category, String extJson) { + this.saveRelation(objectId, targetId, category, extJson, true); + } + + @Override + public void saveRelationBatchWithClear(String objectId, List targetIdList, String category) { + this.saveRelationBatch(objectId, targetIdList, category, null, true); + } + + @Override + public void saveRelationBatchWithClear(String objectId, List targetIdList, String category, List extJsonList) { + this.saveRelationBatch(objectId, targetIdList, category, extJsonList, true); + } + + @Override + public List getRelationListByObjectId(String objectId) { + return this.getRelationListByObjectIdAndCategory(objectId, null); + } + + @Override + public List getRelationListByObjectIdList(List objectIdList) { + return this.getRelationListByObjectIdListAndCategory(objectIdList, null); + } + + @Override + public List getRelationListByObjectIdAndCategory(String objectId, String category) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(SysRelation::getObjectId, objectId); + if(ObjectUtil.isNotEmpty(category)) { + lambdaQueryWrapper.eq(SysRelation::getCategory, category); + } + return this.list(lambdaQueryWrapper); + } + + @Override + public List getRelationListByObjectIdListAndCategory(List objectIdList, String category) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(SysRelation::getObjectId, objectIdList); + if(ObjectUtil.isNotEmpty(category)) { + lambdaQueryWrapper.eq(SysRelation::getCategory, category); + } + return this.list(lambdaQueryWrapper); + } + + @Override + public List getRelationListByTargetId(String targetId) { + return this.getRelationListByTargetIdAndCategory(targetId, null); + } + + @Override + public List getRelationListByTargetIdList(List targetIdList) { + return this.getRelationListByTargetIdListAndCategory(targetIdList, null); + } + + @Override + public List getRelationListByTargetIdAndCategory(String targetId, String category) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(SysRelation::getTargetId, targetId); + if(ObjectUtil.isNotEmpty(category)) { + lambdaQueryWrapper.eq(SysRelation::getCategory, category); + } + return this.list(lambdaQueryWrapper); + } + + @Override + public List getRelationListByTargetIdListAndCategory(List targetIdList, String category) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(SysRelation::getTargetId, targetIdList); + if(ObjectUtil.isNotEmpty(category)) { + lambdaQueryWrapper.eq(SysRelation::getCategory, category); + } + return this.list(lambdaQueryWrapper); + } + + @Override + public List getRelationTargetIdListByObjectId(String objectId) { + return this.getRelationTargetIdListByObjectIdAndCategory(objectId, null); + } + + @Override + public List getRelationTargetIdListByObjectIdList(List objectIdList) { + return this.getRelationTargetIdListByObjectIdListAndCategory(objectIdList, null); + } + + @Override + public List getRelationTargetIdListByObjectIdAndCategory(String objectId, String category) { + return this.getRelationListByObjectIdAndCategory(objectId, category).stream() + .map(SysRelation::getTargetId).collect(Collectors.toList()); + } + + @Override + public List getRelationTargetIdListByObjectIdListAndCategory(List objectIdList, String category) { + return this.getRelationListByObjectIdListAndCategory(objectIdList, category).stream() + .map(SysRelation::getTargetId).collect(Collectors.toList()); + } + + @Override + public List getRelationObjectIdListByTargetId(String targetId) { + return this.getRelationObjectIdListByTargetIdAndCategory(targetId, null); + } + + @Override + public List getRelationObjectIdListByTargetIdList(List targetIdList) { + return this.getRelationObjectIdListByTargetIdListAndCategory(targetIdList, null); + } + + @Override + public List getRelationObjectIdListByTargetIdAndCategory(String targetId, String category) { + return this.getRelationListByTargetIdAndCategory(targetId, category).stream() + .map(SysRelation::getObjectId).collect(Collectors.toList()); + } + + @Override + public List getRelationObjectIdListByTargetIdListAndCategory(List targetIdList, String category) { + return this.getRelationListByTargetIdListAndCategory(targetIdList, category).stream() + .map(SysRelation::getObjectId).collect(Collectors.toList()); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/controller/SysButtonController.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/controller/SysButtonController.java new file mode 100644 index 00000000..cb75f1e0 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/controller/SysButtonController.java @@ -0,0 +1,123 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.sys.modular.resource.entity.SysButton; +import vip.xiaonuo.sys.modular.resource.param.button.SysButtonAddParam; +import vip.xiaonuo.sys.modular.resource.param.button.SysButtonEditParam; +import vip.xiaonuo.sys.modular.resource.param.button.SysButtonIdParam; +import vip.xiaonuo.sys.modular.resource.param.button.SysButtonPageParam; +import vip.xiaonuo.sys.modular.resource.service.SysButtonService; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +/** + * 按钮控制器 + * + * @author xuyuxiang + * @date 2022/6/27 13:56 + **/ +@Api(tags = "按钮控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 3) +@RestController +@Validated +public class SysButtonController { + + @Resource + private SysButtonService sysButtonService; + + /** + * 获取按钮分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("获取按钮分页") + @GetMapping("/sys/button/page") + public CommonResult> page(SysButtonPageParam sysButtonPageParam) { + return CommonResult.data(sysButtonService.page(sysButtonPageParam)); + } + + /** + * 添加按钮 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("添加按钮") + @CommonLog("添加按钮") + @PostMapping("/sys/button/add") + public CommonResult add(@RequestBody @Valid SysButtonAddParam sysButtonAddParam) { + sysButtonService.add(sysButtonAddParam); + return CommonResult.ok(); + } + + /** + * 编辑按钮 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("编辑按钮") + @CommonLog("编辑按钮") + @PostMapping("/sys/button/edit") + public CommonResult edit(@RequestBody @Valid SysButtonEditParam sysButtonEditParam) { + sysButtonService.edit(sysButtonEditParam); + return CommonResult.ok(); + } + + /** + * 删除按钮 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 4) + @ApiOperation("删除按钮") + @CommonLog("删除按钮") + @PostMapping("/sys/button/delete") + public CommonResult delete(@RequestBody @Valid List sysButtonIdParamList) { + sysButtonService.delete(sysButtonIdParamList); + return CommonResult.ok(); + } + + /** + * 获取按钮详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 5) + @ApiOperation("获取按钮详情") + @GetMapping("/sys/button/detail") + public CommonResult detail(@Valid SysButtonIdParam sysButtonIdParam) { + return CommonResult.data(sysButtonService.detail(sysButtonIdParam)); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/controller/SysMenuController.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/controller/SysMenuController.java new file mode 100644 index 00000000..8d8e011d --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/controller/SysMenuController.java @@ -0,0 +1,181 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.controller; + +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.pojo.CommonValidList; +import vip.xiaonuo.sys.modular.resource.entity.SysMenu; +import vip.xiaonuo.sys.modular.resource.entity.SysModule; +import vip.xiaonuo.sys.modular.resource.param.menu.*; +import vip.xiaonuo.sys.modular.resource.service.SysMenuService; + +import javax.annotation.Resource; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * 菜单控制器 + * + * @author xuyuxiang + * @date 2022/6/27 14:09 + **/ +@Api(tags = "菜单控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 5) +@RestController +@Validated +public class SysMenuController { + + @Resource + private SysMenuService sysMenuService; + + /** + * 获取菜单分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("获取菜单分页") + @GetMapping("/sys/menu/page") + public CommonResult> page(SysMenuPageParam sysMenuPageParam) { + return CommonResult.data(sysMenuService.page(sysMenuPageParam)); + } + + /** + * 获取菜单树 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("获取菜单树") + @GetMapping("/sys/menu/tree") + public CommonResult>> tree(SysMenuTreeParam sysMenuTreeParam) { + return CommonResult.data(sysMenuService.tree(sysMenuTreeParam)); + } + + /** + * 添加菜单 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("添加菜单") + @CommonLog("添加菜单") + @PostMapping("/sys/menu/add") + public CommonResult add(@RequestBody @Valid SysMenuAddParam sysMenuAddParam) { + sysMenuService.add(sysMenuAddParam); + return CommonResult.ok(); + } + + /** + * 编辑菜单 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 4) + @ApiOperation("编辑菜单") + @CommonLog("编辑菜单") + @PostMapping("/sys/menu/edit") + public CommonResult edit(@RequestBody @Valid SysMenuEditParam sysMenuEditParam) { + sysMenuService.edit(sysMenuEditParam); + return CommonResult.ok(); + } + + /** + * 更改菜单所属模块 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 5) + @ApiOperation("更改菜单所属模块") + @CommonLog("更改菜单所属模块") + @PostMapping("/sys/menu/changeModule") + public CommonResult changeModule(@RequestBody @Valid SysMenuChangeModuleParam sysMenuChangeModuleParam) { + sysMenuService.changeModule(sysMenuChangeModuleParam); + return CommonResult.ok(); + } + + /** + * 删除菜单 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 6) + @ApiOperation("删除菜单") + @CommonLog("删除菜单") + @PostMapping("/sys/menu/delete") + public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList sysMenuIdParamList) { + sysMenuService.delete(sysMenuIdParamList); + return CommonResult.ok(); + } + + /** + * 获取菜单详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 7) + @ApiOperation("获取菜单详情") + @GetMapping("/sys/menu/detail") + public CommonResult detail(@Valid SysMenuIdParam sysMenuIdParam) { + return CommonResult.data(sysMenuService.detail(sysMenuIdParam)); + } + + /* ====菜单部分所需要用到的选择器==== */ + + /** + * 获取模块选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 8) + @ApiOperation("获取模块选择器") + @GetMapping("/sys/menu/moduleSelector") + public CommonResult> moduleSelector(SysMenuSelectorModuleParam sysMenuSelectorModuleParam) { + return CommonResult.data(sysMenuService.moduleSelector(sysMenuSelectorModuleParam)); + } + + /** + * 获取菜单树选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 9) + @ApiOperation("获取菜单树选择器") + @GetMapping("/sys/menu/menuTreeSelector") + public CommonResult>> menuTreeSelector(SysMenuSelectorMenuParam sysMenuSelectorMenuParam) { + return CommonResult.data(sysMenuService.menuTreeSelector(sysMenuSelectorMenuParam)); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/controller/SysModuleController.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/controller/SysModuleController.java new file mode 100644 index 00000000..8c20924c --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/controller/SysModuleController.java @@ -0,0 +1,125 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.pojo.CommonValidList; +import vip.xiaonuo.sys.modular.resource.entity.SysModule; +import vip.xiaonuo.sys.modular.resource.param.module.SysModuleAddParam; +import vip.xiaonuo.sys.modular.resource.param.module.SysModuleEditParam; +import vip.xiaonuo.sys.modular.resource.param.module.SysModuleIdParam; +import vip.xiaonuo.sys.modular.resource.param.module.SysModulePageParam; +import vip.xiaonuo.sys.modular.resource.service.SysModuleService; + +import javax.annotation.Resource; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; + +/** + * 模块控制器 + * + * @author xuyuxiang + * @date 2022/6/27 14:12 + **/ +@Api(tags = "模块控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 6) +@RestController +@Validated +public class SysModuleController { + + @Resource + private SysModuleService sysModuleService; + + /** + * 获取模块分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("获取模块分页") + @GetMapping("/sys/module/page") + public CommonResult> page(SysModulePageParam sysModulePageParam) { + return CommonResult.data(sysModuleService.page(sysModulePageParam)); + } + + /** + * 添加模块 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("添加模块") + @CommonLog("添加模块") + @PostMapping("/sys/module/add") + public CommonResult add(@RequestBody @Valid SysModuleAddParam sysModuleAddParam) { + sysModuleService.add(sysModuleAddParam); + return CommonResult.ok(); + } + + /** + * 编辑模块 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("编辑模块") + @CommonLog("编辑模块") + @PostMapping("/sys/module/edit") + public CommonResult edit(@RequestBody @Valid SysModuleEditParam sysModuleEditParam) { + sysModuleService.edit(sysModuleEditParam); + return CommonResult.ok(); + } + + /** + * 删除模块 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 4) + @ApiOperation("删除模块") + @CommonLog("删除模块") + @PostMapping("/sys/module/delete") + public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList sysModuleIdParamList) { + sysModuleService.delete(sysModuleIdParamList); + return CommonResult.ok(); + } + + /** + * 获取模块详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 5) + @ApiOperation("获取模块详情") + @GetMapping("/sys/module/detail") + public CommonResult detail(@Valid SysModuleIdParam sysModuleIdParam) { + return CommonResult.data(sysModuleService.detail(sysModuleIdParam)); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/controller/SysSpaController.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/controller/SysSpaController.java new file mode 100644 index 00000000..e40cf9b4 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/controller/SysSpaController.java @@ -0,0 +1,125 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.pojo.CommonValidList; +import vip.xiaonuo.sys.modular.resource.entity.SysSpa; +import vip.xiaonuo.sys.modular.resource.param.spa.SysSpaAddParam; +import vip.xiaonuo.sys.modular.resource.param.spa.SysSpaEditParam; +import vip.xiaonuo.sys.modular.resource.param.spa.SysSpaIdParam; +import vip.xiaonuo.sys.modular.resource.param.spa.SysSpaPageParam; +import vip.xiaonuo.sys.modular.resource.service.SysSpaService; + +import javax.annotation.Resource; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; + +/** + * 单页面控制器 + * + * @author xuyuxiang + * @date 2022/6/27 14:14 + **/ +@Api(tags = "单页面控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 7) +@RestController +@Validated +public class SysSpaController { + + @Resource + private SysSpaService sysSpaService; + + /** + * 获取单页面分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("获取单页面分页") + @GetMapping("/sys/spa/page") + public CommonResult> page(SysSpaPageParam sysSpaPageParam) { + return CommonResult.data(sysSpaService.page(sysSpaPageParam)); + } + + /** + * 添加单页面 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("添加单页面") + @CommonLog("添加单页面") + @PostMapping("/sys/spa/add") + public CommonResult add(@RequestBody @Valid SysSpaAddParam sysSpaAddParam) { + sysSpaService.add(sysSpaAddParam); + return CommonResult.ok(); + } + + /** + * 编辑单页面 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("编辑单页面") + @CommonLog("编辑单页面") + @PostMapping("/sys/spa/edit") + public CommonResult edit(@RequestBody @Valid SysSpaEditParam sysSpaEditParam) { + sysSpaService.edit(sysSpaEditParam); + return CommonResult.ok(); + } + + /** + * 删除单页面 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 4) + @ApiOperation("删除单页面") + @CommonLog("删除单页面") + @PostMapping("/sys/spa/delete") + public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList sysSpaIdParamList) { + sysSpaService.delete(sysSpaIdParamList); + return CommonResult.ok(); + } + + /** + * 获取单页面详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 5) + @ApiOperation("获取单页面详情") + @GetMapping("/sys/spa/detail") + public CommonResult detail(@Valid SysSpaIdParam sysSpaIdParam) { + return CommonResult.data(sysSpaService.detail(sysSpaIdParam)); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/entity/SysButton.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/entity/SysButton.java new file mode 100644 index 00000000..c69909af --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/entity/SysButton.java @@ -0,0 +1,62 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.entity; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import vip.xiaonuo.common.pojo.CommonEntity; + +/** + * 按钮实体 + * + * @author xuyuxiang + * @date 2022/7/27 18:25 + **/ +@Getter +@Setter +@TableName("SYS_RESOURCE") +public class SysButton extends CommonEntity { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 父id */ + @ApiModelProperty(value = "父id", position = 2) + private String parentId; + + /** 标题 */ + @ApiModelProperty(value = "标题", position = 3) + private String title; + + /** 编码 */ + @ApiModelProperty(value = "编码", position = 4) + private String code; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 5) + private String category; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 6) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 7) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/entity/SysMenu.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/entity/SysMenu.java new file mode 100644 index 00000000..39bd83f5 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/entity/SysMenu.java @@ -0,0 +1,93 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.entity; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import vip.xiaonuo.common.pojo.CommonEntity; + +/** + * 菜单实体 + * + * @author xuyuxiang + * @date 2022/7/27 18:20 + **/ +@Getter +@Setter +@TableName("SYS_RESOURCE") +public class SysMenu extends CommonEntity { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 父id */ + @ApiModelProperty(value = "父id", position = 2) + private String parentId; + + /** 标题 */ + @ApiModelProperty(value = "标题", position = 3) + private String title; + + /** 别名 */ + @ApiModelProperty(value = "别名", position = 4) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String name; + + /** 编码 */ + @ApiModelProperty(value = "编码", position = 5) + private String code; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 6) + private String category; + + /** 模块 */ + @ApiModelProperty(value = "模块", position = 7) + private String module; + + /** 菜单类型 */ + @ApiModelProperty(value = "菜单类型", position = 8) + private String menuType; + + /** 路径 */ + @ApiModelProperty(value = "路径", position = 9) + private String path; + + /** 组件 */ + @ApiModelProperty(value = "组件", position = 10) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String component; + + /** 图标 */ + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + @ApiModelProperty(value = "图标", position = 11) + private String icon; + + /** 颜色 */ + @ApiModelProperty(value = "颜色", position = 12) + private String color; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 13) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 14) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/entity/SysModule.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/entity/SysModule.java new file mode 100644 index 00000000..4be3103c --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/entity/SysModule.java @@ -0,0 +1,66 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.entity; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import vip.xiaonuo.common.pojo.CommonEntity; + +/** + * 模块实体 + * + * @author xuyuxiang + * @date 2022/7/27 18:20 + **/ +@Getter +@Setter +@TableName("SYS_RESOURCE") +public class SysModule extends CommonEntity { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 标题 */ + @ApiModelProperty(value = "标题", position = 2) + private String title; + + /** 编码 */ + @ApiModelProperty(value = "编码", position = 3) + private String code; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 4) + private String category; + + /** 图标 */ + @ApiModelProperty(value = "图标", position = 5) + private String icon; + + /** 颜色 */ + @ApiModelProperty(value = "颜色", position = 6) + private String color; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 7) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 8) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/entity/SysSpa.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/entity/SysSpa.java new file mode 100644 index 00000000..f6862d3e --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/entity/SysSpa.java @@ -0,0 +1,78 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.entity; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import vip.xiaonuo.common.pojo.CommonEntity; + +/** + * 单页面实体 + * + * @author xuyuxiang + * @date 2022/7/27 18:27 + **/ +@Getter +@Setter +@TableName("SYS_RESOURCE") +public class SysSpa extends CommonEntity { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 标题 */ + @ApiModelProperty(value = "标题", position = 2) + private String title; + + /** 别名 */ + @ApiModelProperty(value = "别名", position = 3) + private String name; + + /** 编码 */ + @ApiModelProperty(value = "编码", position = 4) + private String code; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 5) + private String category; + + /** 菜单类型 */ + @ApiModelProperty(value = "菜单类型", position = 6) + private String menuType; + + /** 路径 */ + @ApiModelProperty(value = "路径", position = 7) + private String path; + + /** 组件 */ + @ApiModelProperty(value = "组件", position = 8) + private String component; + + /** 图标 */ + @ApiModelProperty(value = "图标", position = 9) + private String icon; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 10) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 11) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/enums/SysResourceCategoryEnum.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/enums/SysResourceCategoryEnum.java new file mode 100644 index 00000000..6e98bc7a --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/enums/SysResourceCategoryEnum.java @@ -0,0 +1,52 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.enums; + +import lombok.Getter; +import vip.xiaonuo.common.exception.CommonException; + +/** + * 资源分类枚举 + * + * @author xuyuxiang + * @date 2022/4/21 19:56 + **/ +@Getter +public enum SysResourceCategoryEnum { + + /** 模块 */ + MODULE("MODULE"), + + /** 单页面 */ + SPA("SPA"), + + /** 菜单 */ + MENU("MENU"), + + /** 按钮 */ + BUTTON("BUTTON"); + + private final String value; + + SysResourceCategoryEnum(String value) { + this.value = value; + } + + public static void validate(String value) { + boolean flag = MODULE.getValue().equals(value) || SPA.getValue().equals(value) || MENU.getValue().equals(value) + || BUTTON.getValue().equals(value); + if(!flag) { + throw new CommonException("不支持的资源分类:{}", value); + } + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/enums/SysResourceMenuTypeEnum.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/enums/SysResourceMenuTypeEnum.java new file mode 100644 index 00000000..27577ef4 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/enums/SysResourceMenuTypeEnum.java @@ -0,0 +1,52 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.enums; + +import lombok.Getter; +import vip.xiaonuo.common.exception.CommonException; + +/** + * 菜单类型枚举 + * + * @author xuyuxiang + * @date 2022/4/21 19:56 + **/ +@Getter +public enum SysResourceMenuTypeEnum { + + /** 目录 */ + CATALOG("CATALOG"), + + /** 组件 */ + MENU("MENU"), + + /** 内链 */ + IFRAME("IFRAME"), + + /** 外链 */ + LINK("LINK"); + + private final String value; + + SysResourceMenuTypeEnum(String value) { + this.value = value; + } + + public static void validate(String value) { + boolean flag = CATALOG.getValue().equals(value) || MENU.getValue().equals(value) || IFRAME.getValue().equals(value) || + LINK.getValue().equals(value); + if(!flag) { + throw new CommonException("不支持的菜单类型:{}", value); + } + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/SysButtonMapper.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/SysButtonMapper.java new file mode 100644 index 00000000..24ed63d1 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/SysButtonMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.sys.modular.resource.entity.SysButton; + +/** + * 按钮Mapper接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:37 + **/ +public interface SysButtonMapper extends BaseMapper { +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/SysMenuMapper.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/SysMenuMapper.java new file mode 100644 index 00000000..0191d82c --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/SysMenuMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.sys.modular.resource.entity.SysMenu; + +/** + * 菜单Mapper接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:37 + **/ +public interface SysMenuMapper extends BaseMapper { +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/SysModuleMapper.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/SysModuleMapper.java new file mode 100644 index 00000000..e5ad36cd --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/SysModuleMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.sys.modular.resource.entity.SysModule; + +/** + * 模块Mapper接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:37 + **/ +public interface SysModuleMapper extends BaseMapper { +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/SysSpaMapper.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/SysSpaMapper.java new file mode 100644 index 00000000..f6e5889b --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/SysSpaMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.sys.modular.resource.entity.SysSpa; + +/** + * 单页面Mapper接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:37 + **/ +public interface SysSpaMapper extends BaseMapper { +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/mapping/SysButtonMapper.xml b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/mapping/SysButtonMapper.xml new file mode 100644 index 00000000..688cda2c --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/mapping/SysButtonMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/mapping/SysMenuMapper.xml b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/mapping/SysMenuMapper.xml new file mode 100644 index 00000000..fea4fd3c --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/mapping/SysMenuMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/mapping/SysModuleMapper.xml b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/mapping/SysModuleMapper.xml new file mode 100644 index 00000000..aa3241fe --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/mapping/SysModuleMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/mapping/SysSpaMapper.xml b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/mapping/SysSpaMapper.xml new file mode 100644 index 00000000..340f9699 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/mapper/mapping/SysSpaMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/button/SysButtonAddParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/button/SysButtonAddParam.java new file mode 100644 index 00000000..118a4e6c --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/button/SysButtonAddParam.java @@ -0,0 +1,55 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.param.button; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 按钮添加参数 + * + * @author xuyuxiang + * @date 2022/7/27 18:40 + **/ +@Getter +@Setter +public class SysButtonAddParam { + + /** 父id */ + @ApiModelProperty(value = "父id", required = true, position = 1) + @NotBlank(message = "parentId不能为空") + private String parentId; + + /** 标题 */ + @ApiModelProperty(value = "标题", required = true, position = 2) + @NotBlank(message = "title不能为空") + private String title; + + /** 编码 */ + @ApiModelProperty(value = "编码", required = true, position = 3) + @NotBlank(message = "code不能为空") + private String code; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", required = true, position = 4) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 扩展JSON */ + @ApiModelProperty(value = "扩展JSON", position = 5) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/button/SysButtonEditParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/button/SysButtonEditParam.java new file mode 100644 index 00000000..06fdc873 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/button/SysButtonEditParam.java @@ -0,0 +1,60 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.param.button; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 按钮编辑参数 + * + * @author xuyuxiang + * @date 2022/7/27 18:40 + **/ +@Getter +@Setter +public class SysButtonEditParam { + + /** id */ + @ApiModelProperty(value = "id", required = true, position = 1) + @NotBlank(message = "id不能为空") + private String id; + + /** 父id */ + @ApiModelProperty(value = "父id", required = true, position = 2) + @NotBlank(message = "parentId不能为空") + private String parentId; + + /** 标题 */ + @ApiModelProperty(value = "标题", required = true, position = 3) + @NotBlank(message = "title不能为空") + private String title; + + /** 编码 */ + @ApiModelProperty(value = "编码", required = true, position = 4) + @NotBlank(message = "code不能为空") + private String code; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", required = true, position = 5) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 扩展JSON */ + @ApiModelProperty(value = "扩展JSON", position = 6) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/button/SysButtonIdParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/button/SysButtonIdParam.java new file mode 100644 index 00000000..5e2d2207 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/button/SysButtonIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.param.button; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 按钮Id参数 + * + * @author xuyuxiang + * @date 2022/7/27 18:40 + **/ +@Getter +@Setter +public class SysButtonIdParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/button/SysButtonPageParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/button/SysButtonPageParam.java new file mode 100644 index 00000000..3449bd28 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/button/SysButtonPageParam.java @@ -0,0 +1,52 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.param.button; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 按钮查询参数 + * + * @author xuyuxiang + * @date 2022/7/27 18:40 + **/ +@Getter +@Setter +public class SysButtonPageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 父id */ + @ApiModelProperty(value = "父id") + private String parentId; + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuAddParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuAddParam.java new file mode 100644 index 00000000..e36f1765 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuAddParam.java @@ -0,0 +1,77 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.param.menu; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 菜单添加参数 + * + * @author xuyuxiang + * @date 2022/7/27 18:40 + **/ +@Getter +@Setter +public class SysMenuAddParam { + + /** 父id */ + @ApiModelProperty(value = "父id", required = true, position = 1) + @NotBlank(message = "parentId不能为空") + private String parentId; + + /** 标题 */ + @ApiModelProperty(value = "标题", required = true, position = 2) + @NotBlank(message = "title不能为空") + private String title; + + /** 菜单类型 */ + @ApiModelProperty(value = "菜单类型", required = true, position = 3) + @NotBlank(message = "menuType不能为空") + private String menuType; + + /** 模块 */ + @ApiModelProperty(value = "模块", required = true, position = 4) + @NotBlank(message = "module不能为空") + private String module; + + /** 路径 */ + @ApiModelProperty(value = "路径", required = true, position = 5) + @NotBlank(message = "path不能为空") + private String path; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", required = true, position = 6) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 别名 */ + @ApiModelProperty(value = "别名", position = 7) + private String name; + + /** 组件 */ + @ApiModelProperty(value = "组件", position = 8) + private String component; + + /** 图标 */ + @ApiModelProperty(value = "图标", position = 9) + private String icon; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 10) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuChangeModuleParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuChangeModuleParam.java new file mode 100644 index 00000000..a34fc0c1 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuChangeModuleParam.java @@ -0,0 +1,40 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.param.menu; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 菜单更改所属模块参数 + * + * @author xuyuxiang + * @date 2022/7/27 18:40 + **/ +@Getter +@Setter +public class SysMenuChangeModuleParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; + + /** 模块 */ + @ApiModelProperty(value = "module", required = true) + @NotBlank(message = "module不能为空") + private String module; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuEditParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuEditParam.java new file mode 100644 index 00000000..63da2cbc --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuEditParam.java @@ -0,0 +1,82 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.param.menu; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 菜单编辑参数 + * + * @author xuyuxiang + * @date 2022/7/27 18:40 + **/ +@Getter +@Setter +public class SysMenuEditParam { + + /** id */ + @ApiModelProperty(value = "id", required = true, position = 1) + @NotBlank(message = "id不能为空") + private String id; + + /** 父id */ + @ApiModelProperty(value = "父id", required = true, position = 2) + @NotBlank(message = "parentId不能为空") + private String parentId; + + /** 标题 */ + @ApiModelProperty(value = "标题", required = true, position = 3) + @NotBlank(message = "title不能为空") + private String title; + + /** 菜单类型 */ + @ApiModelProperty(value = "菜单类型", required = true, position = 4) + @NotBlank(message = "menuType不能为空") + private String menuType; + + /** 模块 */ + @ApiModelProperty(value = "模块", required = true, position = 5) + @NotBlank(message = "module不能为空") + private String module; + + /** 路径 */ + @ApiModelProperty(value = "路径", required = true, position = 6) + @NotBlank(message = "path不能为空") + private String path; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", required = true, position = 7) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 别名 */ + @ApiModelProperty(value = "别名", position = 8) + private String name; + + /** 组件 */ + @ApiModelProperty(value = "组件", position = 9) + private String component; + + /** 图标 */ + @ApiModelProperty(value = "图标", position = 10) + private String icon; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 11) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuIdParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuIdParam.java new file mode 100644 index 00000000..2b74c5db --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.param.menu; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 菜单Id参数 + * + * @author xuyuxiang + * @date 2022/7/27 18:40 + **/ +@Getter +@Setter +public class SysMenuIdParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuPageParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuPageParam.java new file mode 100644 index 00000000..d321a22a --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuPageParam.java @@ -0,0 +1,52 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.param.menu; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 菜单查询参数 + * + * @author xuyuxiang + * @date 2022/7/27 18:40 + **/ +@Getter +@Setter +public class SysMenuPageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; + + /** 模块 */ + @ApiModelProperty(value = "模块") + private String module; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuSelectorMenuParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuSelectorMenuParam.java new file mode 100644 index 00000000..c2b780f0 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuSelectorMenuParam.java @@ -0,0 +1,32 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.param.menu; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 菜单选择器参数 + * + * @author xuyuxiang + * @date 2022/7/27 18:40 + **/ +@Getter +@Setter +public class SysMenuSelectorMenuParam { + + /** 模块 */ + @ApiModelProperty(value = "模块") + private String module; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuSelectorModuleParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuSelectorModuleParam.java new file mode 100644 index 00000000..76340c7e --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuSelectorModuleParam.java @@ -0,0 +1,32 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.param.menu; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 模块选择器参数 + * + * @author xuyuxiang + * @date 2022/7/27 18:40 + **/ +@Getter +@Setter +public class SysMenuSelectorModuleParam { + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuTreeParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuTreeParam.java new file mode 100644 index 00000000..96eb2c4d --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/menu/SysMenuTreeParam.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.param.menu; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 菜单树查询参数 + * + * @author xuyuxiang + * @date 2022/7/27 18:40 + **/ +@Getter +@Setter +public class SysMenuTreeParam { + + /** 模块 */ + @ApiModelProperty(value = "模块") + private String module; + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/module/SysModuleAddParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/module/SysModuleAddParam.java new file mode 100644 index 00000000..00642784 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/module/SysModuleAddParam.java @@ -0,0 +1,55 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.param.module; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 模块添加参数 + * + * @author xuyuxiang + * @date 2022/7/27 18:40 + **/ +@Getter +@Setter +public class SysModuleAddParam { + + /** 标题 */ + @ApiModelProperty(value = "标题", required = true, position = 1) + @NotBlank(message = "title不能为空") + private String title; + + /** 图标 */ + @ApiModelProperty(value = "图标", required = true, position = 2) + @NotBlank(message = "icon不能为空") + private String icon; + + /** 颜色 */ + @ApiModelProperty(value = "颜色", required = true, position = 3) + @NotBlank(message = "color不能为空") + private String color; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", required = true, position = 4) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 5) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/module/SysModuleEditParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/module/SysModuleEditParam.java new file mode 100644 index 00000000..9769ad1a --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/module/SysModuleEditParam.java @@ -0,0 +1,60 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.param.module; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 模块编辑参数 + * + * @author xuyuxiang + * @date 2022/7/27 18:40 + **/ +@Getter +@Setter +public class SysModuleEditParam { + + /** id */ + @ApiModelProperty(value = "id", required = true, position = 1) + @NotBlank(message = "id不能为空") + private String id; + + /** 标题 */ + @ApiModelProperty(value = "标题", required = true, position = 2) + @NotBlank(message = "title不能为空") + private String title; + + /** 图标 */ + @ApiModelProperty(value = "图标", required = true, position = 3) + @NotBlank(message = "icon不能为空") + private String icon; + + /** 颜色 */ + @ApiModelProperty(value = "颜色", required = true, position = 4) + @NotBlank(message = "color不能为空") + private String color; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", required = true, position = 5) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 6) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/module/SysModuleIdParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/module/SysModuleIdParam.java new file mode 100644 index 00000000..864e4d83 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/module/SysModuleIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.param.module; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 模块Id参数 + * + * @author xuyuxiang + * @date 2022/7/27 18:40 + **/ +@Getter +@Setter +public class SysModuleIdParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/module/SysModulePageParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/module/SysModulePageParam.java new file mode 100644 index 00000000..1764624e --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/module/SysModulePageParam.java @@ -0,0 +1,48 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.param.module; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 模块查询参数 + * + * @author xuyuxiang + * @date 2022/7/27 18:40 + **/ +@Getter +@Setter +public class SysModulePageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/spa/SysSpaAddParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/spa/SysSpaAddParam.java new file mode 100644 index 00000000..03d34f1e --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/spa/SysSpaAddParam.java @@ -0,0 +1,70 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.param.spa; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 单页面添加参数 + * + * @author xuyuxiang + * @date 2022/7/27 18:40 + **/ +@Getter +@Setter +public class SysSpaAddParam { + + /** 标题 */ + @ApiModelProperty(value = "标题", required = true, position = 1) + @NotBlank(message = "title不能为空") + private String title; + + /** 菜单类型 */ + @ApiModelProperty(value = "菜单类型", required = true, position = 2) + @NotBlank(message = "menuType不能为空") + private String menuType; + + /** 别名 */ + @ApiModelProperty(value = "别名", required = true, position = 3) + @NotBlank(message = "name不能为空") + private String name; + + /** 路径 */ + @ApiModelProperty(value = "路径", required = true, position = 4) + @NotBlank(message = "path不能为空") + private String path; + + /** 组件 */ + @ApiModelProperty(value = "组件", required = true, position = 5) + @NotBlank(message = "component不能为空") + private String component; + + /** 图标 */ + @ApiModelProperty(value = "图标", required = true, position = 6) + @NotBlank(message = "icon不能为空") + private String icon; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", required = true, position = 7) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 8) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/spa/SysSpaEditParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/spa/SysSpaEditParam.java new file mode 100644 index 00000000..d2473718 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/spa/SysSpaEditParam.java @@ -0,0 +1,75 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.param.spa; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 单页面编辑参数 + * + * @author xuyuxiang + * @date 2022/7/27 18:40 + **/ +@Getter +@Setter +public class SysSpaEditParam { + + /** id */ + @ApiModelProperty(value = "id", required = true, position = 1) + @NotBlank(message = "id不能为空") + private String id; + + /** 标题 */ + @ApiModelProperty(value = "标题", required = true, position = 2) + @NotBlank(message = "title不能为空") + private String title; + + /** 菜单类型 */ + @ApiModelProperty(value = "菜单类型", required = true, position = 3) + @NotBlank(message = "menuType不能为空") + private String menuType; + + /** 别名 */ + @ApiModelProperty(value = "别名", required = true, position = 4) + @NotBlank(message = "name不能为空") + private String name; + + /** 路径 */ + @ApiModelProperty(value = "路径", required = true, position = 5) + @NotBlank(message = "path不能为空") + private String path; + + /** 组件 */ + @ApiModelProperty(value = "组件", required = true, position = 6) + @NotBlank(message = "component不能为空") + private String component; + + /** 图标 */ + @ApiModelProperty(value = "图标", required = true, position = 7) + @NotBlank(message = "icon不能为空") + private String icon; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", required = true, position = 8) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 9) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/spa/SysSpaIdParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/spa/SysSpaIdParam.java new file mode 100644 index 00000000..aba7eb3d --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/spa/SysSpaIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.param.spa; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 单页面Id参数 + * + * @author xuyuxiang + * @date 2022/7/27 18:40 + **/ +@Getter +@Setter +public class SysSpaIdParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/spa/SysSpaPageParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/spa/SysSpaPageParam.java new file mode 100644 index 00000000..dba49446 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/param/spa/SysSpaPageParam.java @@ -0,0 +1,48 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.param.spa; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 单页面查询参数 + * + * @author xuyuxiang + * @date 2022/7/27 18:40 + **/ +@Getter +@Setter +public class SysSpaPageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysButtonService.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysButtonService.java new file mode 100644 index 00000000..82bdfd3c --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysButtonService.java @@ -0,0 +1,80 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import vip.xiaonuo.sys.modular.resource.entity.SysButton; +import vip.xiaonuo.sys.modular.resource.param.button.SysButtonAddParam; +import vip.xiaonuo.sys.modular.resource.param.button.SysButtonEditParam; +import vip.xiaonuo.sys.modular.resource.param.button.SysButtonIdParam; +import vip.xiaonuo.sys.modular.resource.param.button.SysButtonPageParam; + +import java.util.List; + +/** + * 按钮Service接口 + * + * @author xuyuxiang + * @date 2022/6/27 14:01 + **/ +public interface SysButtonService extends IService { + + /** + * 获取按钮分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + Page page(SysButtonPageParam sysButtonPageParam); + + /** + * 添加按钮 + * + * @author xuyuxiang + * @date 2022/4/24 20:48 + */ + void add(SysButtonAddParam sysButtonAddParam); + + /** + * 编辑按钮 + * + * @author xuyuxiang + * @date 2022/4/24 21:13 + */ + void edit(SysButtonEditParam sysButtonEditParam); + + /** + * 删除按钮 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + void delete(List sysButtonIdParamList); + + /** + * 获取按钮详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + SysButton detail(SysButtonIdParam sysButtonIdParam); + + /** + * 获取按钮详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + SysButton queryEntity(String id); +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysMenuService.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysMenuService.java new file mode 100644 index 00000000..1aeb3b88 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysMenuService.java @@ -0,0 +1,132 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.service; + +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import vip.xiaonuo.sys.modular.resource.entity.SysMenu; +import vip.xiaonuo.sys.modular.resource.entity.SysModule; +import vip.xiaonuo.sys.modular.resource.param.menu.*; + +import java.util.List; + +/** + * 菜单Service接口 + * + * @author xuyuxiang + * @date 2022/6/27 14:02 + **/ +public interface SysMenuService extends IService { + + + /** + * 获取菜单分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + Page page(SysMenuPageParam sysMenuPageParam); + + /** + * 获取菜单树 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + List> tree(SysMenuTreeParam sysMenuTreeParam); + + /** + * 添加菜单 + * + * @author xuyuxiang + * @date 2022/4/24 20:48 + */ + void add(SysMenuAddParam sysMenuAddParam); + + /** + * 编辑菜单 + * + * @author xuyuxiang + * @date 2022/4/24 21:13 + */ + void edit(SysMenuEditParam sysMenuEditParam); + + /** + * 更改菜单所属模块 + * + * @author xuyuxiang + * @date 2022/9/26 13:09 + **/ + void changeModule(SysMenuChangeModuleParam sysMenuChangeModuleParam); + + /** + * 删除菜单 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + void delete(List sysMenuIdParamList); + + /** + * 获取菜单详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + SysMenu detail(SysMenuIdParam sysMenuIdParam); + + /** + * 获取菜单详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + SysMenu queryEntity(String id); + + /* ====以下为各种递归方法==== */ + + /** + * 根据id获取所有的子数据列表 + * + * @author xuyuxiang + * @date 2022/8/2 14:52 + */ + List getChildListById(List originDataList, String id, boolean includeSelf); + + /** + * 根据id获取所有的父数据列表 + * + * @author xuyuxiang + * @date 2022/8/2 14:52 + */ + List getParentListById(List originDataList, String id, boolean includeSelf); + + /* ====菜单部分所需要用到的选择器==== */ + + /** + * 获取模块选择器 + * + * @author xuyuxiang + * @date 2022/8/2 14:53 + */ + List moduleSelector(SysMenuSelectorModuleParam sysMenuSelectorModuleParam); + + /** + * 获取菜单树选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + List> menuTreeSelector(SysMenuSelectorMenuParam sysMenuSelectorMenuParam); +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysModuleService.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysModuleService.java new file mode 100644 index 00000000..07d252e9 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysModuleService.java @@ -0,0 +1,80 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import vip.xiaonuo.sys.modular.resource.entity.SysModule; +import vip.xiaonuo.sys.modular.resource.param.module.SysModuleAddParam; +import vip.xiaonuo.sys.modular.resource.param.module.SysModuleEditParam; +import vip.xiaonuo.sys.modular.resource.param.module.SysModuleIdParam; +import vip.xiaonuo.sys.modular.resource.param.module.SysModulePageParam; + +import java.util.List; + +/** + * 模块Service接口 + * + * @author xuyuxiang + * @date 2022/6/27 14:03 + **/ +public interface SysModuleService extends IService { + + /** + * 获取模块分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + Page page(SysModulePageParam sysModulePageParam); + + /** + * 添加模块 + * + * @author xuyuxiang + * @date 2022/4/24 20:48 + */ + void add(SysModuleAddParam sysModuleAddParam); + + /** + * 编辑模块 + * + * @author xuyuxiang + * @date 2022/4/24 21:13 + */ + void edit(SysModuleEditParam sysModuleEditParam); + + /** + * 删除模块 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + void delete(List sysModuleIdParamList); + + /** + * 获取模块详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + SysModule detail(SysModuleIdParam sysModuleIdParam); + + /** + * 获取模块详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + SysModule queryEntity(String id); +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysSpaService.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysSpaService.java new file mode 100644 index 00000000..1142327b --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysSpaService.java @@ -0,0 +1,80 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import vip.xiaonuo.sys.modular.resource.entity.SysSpa; +import vip.xiaonuo.sys.modular.resource.param.spa.SysSpaAddParam; +import vip.xiaonuo.sys.modular.resource.param.spa.SysSpaEditParam; +import vip.xiaonuo.sys.modular.resource.param.spa.SysSpaIdParam; +import vip.xiaonuo.sys.modular.resource.param.spa.SysSpaPageParam; + +import java.util.List; + +/** + * 单页面Service接口 + * + * @author xuyuxiang + * @date 2022/6/27 14:03 + **/ +public interface SysSpaService extends IService { + + /** + * 获取单页面分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + Page page(SysSpaPageParam sysSpaPageParam); + + /** + * 添加单页面 + * + * @author xuyuxiang + * @date 2022/4/24 20:48 + */ + void add(SysSpaAddParam sysSpaAddParam); + + /** + * 编辑单页面 + * + * @author xuyuxiang + * @date 2022/4/24 21:13 + */ + void edit(SysSpaEditParam sysSpaEditParam); + + /** + * 删除单页面 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + void delete(List sysSpaIdParamList); + + /** + * 获取单页面详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + SysSpa detail(SysSpaIdParam sysSpaIdParam); + + /** + * 获取单页面详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + SysSpa queryEntity(String id); +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysButtonServiceImpl.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysButtonServiceImpl.java new file mode 100644 index 00000000..d1ecac68 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysButtonServiceImpl.java @@ -0,0 +1,157 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import vip.xiaonuo.common.enums.CommonSortOrderEnum; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.sys.modular.relation.entity.SysRelation; +import vip.xiaonuo.sys.modular.relation.enums.SysRelationCategoryEnum; +import vip.xiaonuo.sys.modular.relation.service.SysRelationService; +import vip.xiaonuo.sys.modular.resource.entity.SysButton; +import vip.xiaonuo.sys.modular.resource.entity.SysMenu; +import vip.xiaonuo.sys.modular.resource.enums.SysResourceCategoryEnum; +import vip.xiaonuo.sys.modular.resource.mapper.SysButtonMapper; +import vip.xiaonuo.sys.modular.resource.param.button.SysButtonAddParam; +import vip.xiaonuo.sys.modular.resource.param.button.SysButtonEditParam; +import vip.xiaonuo.sys.modular.resource.param.button.SysButtonIdParam; +import vip.xiaonuo.sys.modular.resource.param.button.SysButtonPageParam; +import vip.xiaonuo.sys.modular.resource.service.SysButtonService; +import vip.xiaonuo.sys.modular.resource.service.SysMenuService; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 按钮Service接口实现类 + * + * @author xuyuxiang + * @date 2022/6/27 14:25 + **/ +@Service +public class SysButtonServiceImpl extends ServiceImpl implements SysButtonService { + + @Resource + private SysRelationService sysRelationService; + + @Resource + private SysMenuService sysMenuService; + + @Override + public Page page(SysButtonPageParam sysButtonPageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.lambda().eq(SysButton::getCategory, SysResourceCategoryEnum.BUTTON.getValue()); + if(ObjectUtil.isNotEmpty(sysButtonPageParam.getParentId())) { + queryWrapper.lambda().eq(SysButton::getParentId, sysButtonPageParam.getParentId()); + } + if(ObjectUtil.isNotEmpty(sysButtonPageParam.getSearchKey())) { + queryWrapper.lambda().like(SysButton::getTitle, sysButtonPageParam.getSearchKey()); + } + if(ObjectUtil.isAllNotEmpty(sysButtonPageParam.getSortField(), sysButtonPageParam.getSortOrder())) { + CommonSortOrderEnum.validate(sysButtonPageParam.getSortOrder()); + queryWrapper.orderBy(true, sysButtonPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), + StrUtil.toUnderlineCase(sysButtonPageParam.getSortField())); + } else { + queryWrapper.lambda().orderByAsc(SysButton::getSortCode); + } + return this.page(CommonPageRequest.defaultPage(), queryWrapper); + } + + @Override + public void add(SysButtonAddParam sysButtonAddParam) { + SysButton sysButton = BeanUtil.toBean(sysButtonAddParam, SysButton.class); + boolean repeatCode = this.count(new LambdaQueryWrapper() + .eq(SysButton::getCategory, SysResourceCategoryEnum.BUTTON.getValue()) + .eq(SysButton::getCode, sysButton.getCode())) > 0; + if(repeatCode) { + throw new CommonException("存在重复的按钮,编码为:{}", sysButton.getCode()); + } + sysButton.setCategory(SysResourceCategoryEnum.BUTTON.getValue()); + this.save(sysButton); + } + + @Override + public void edit(SysButtonEditParam sysButtonEditParam) { + SysButton sysButton = this.queryEntity(sysButtonEditParam.getId()); + BeanUtil.copyProperties(sysButtonEditParam, sysButton); + boolean repeatCode = this.count(new LambdaQueryWrapper() + .eq(SysButton::getCategory, SysResourceCategoryEnum.BUTTON.getValue()) + .eq(SysButton::getCode, sysButton.getCode()) + .ne(SysButton::getId, sysButtonEditParam.getId())) > 0; + if(repeatCode) { + throw new CommonException("存在重复的按钮,编码为:{}", sysButton.getCode()); + } + this.updateById(sysButton); + } + + @Override + public void delete(List sysButtonIdParamList) { + List buttonIdList = CollStreamUtil.toList(sysButtonIdParamList, SysButtonIdParam::getId); + if(ObjectUtil.isNotEmpty(buttonIdList)) { + // 获取按钮的父菜单id集合 + List parentMenuIdList = sysMenuService.list(new LambdaUpdateWrapper().in(SysMenu::getId, buttonIdList) + .eq(SysMenu::getCategory, SysResourceCategoryEnum.BUTTON.getValue())).stream().map(SysMenu::getParentId) + .collect(Collectors.toList()); + if(ObjectUtil.isNotEmpty(parentMenuIdList)) { + sysRelationService.list(new LambdaUpdateWrapper().in(SysRelation::getTargetId, parentMenuIdList) + .eq(SysRelation::getCategory, SysRelationCategoryEnum.SYS_ROLE_HAS_RESOURCE.getValue()) + .isNotNull(SysRelation::getExtJson)).forEach(sysRelation -> { + JSONObject extJsonObject = JSONUtil.parseObj(sysRelation.getExtJson()); + List buttonInfoList = extJsonObject.getBeanList("buttonInfo", String.class); + if (ObjectUtil.isNotEmpty(buttonInfoList)) { + Set intersectionDistinct = CollectionUtil.intersectionDistinct(buttonIdList, buttonInfoList); + if(ObjectUtil.isNotEmpty(intersectionDistinct)) { + Collection disjunction = CollectionUtil.disjunction(buttonInfoList, intersectionDistinct); + extJsonObject.set("buttonInfo", disjunction); + } + } + // 清除对应的角色与资源信息中的【授权的按钮信息】 + sysRelationService.update(new LambdaUpdateWrapper().eq(SysRelation::getId, sysRelation.getId()) + .set(SysRelation::getExtJson, JSONUtil.toJsonStr(extJsonObject))); + }); + // 执行删除 + this.removeBatchByIds(buttonIdList); + } + } + } + + @Override + public SysButton detail(SysButtonIdParam sysButtonIdParam) { + return this.queryEntity(sysButtonIdParam.getId()); + } + + @Override + public SysButton queryEntity(String id) { + SysButton sysButton = this.getById(id); + if(ObjectUtil.isEmpty(sysButton)) { + throw new CommonException("按钮不存在,id值为:{}", id); + } + return sysButton; + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysMenuServiceImpl.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysMenuServiceImpl.java new file mode 100644 index 00000000..db960281 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,336 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNode; +import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import vip.xiaonuo.common.enums.CommonSortOrderEnum; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.sys.modular.relation.entity.SysRelation; +import vip.xiaonuo.sys.modular.relation.enums.SysRelationCategoryEnum; +import vip.xiaonuo.sys.modular.relation.service.SysRelationService; +import vip.xiaonuo.sys.modular.resource.entity.SysMenu; +import vip.xiaonuo.sys.modular.resource.entity.SysModule; +import vip.xiaonuo.sys.modular.resource.enums.SysResourceCategoryEnum; +import vip.xiaonuo.sys.modular.resource.enums.SysResourceMenuTypeEnum; +import vip.xiaonuo.sys.modular.resource.mapper.SysMenuMapper; +import vip.xiaonuo.sys.modular.resource.param.menu.*; +import vip.xiaonuo.sys.modular.resource.service.SysMenuService; +import vip.xiaonuo.sys.modular.resource.service.SysModuleService; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 菜单Service接口实现类 + * + * @author xuyuxiang + * @date 2022/6/27 14:25 + **/ +@Service +public class SysMenuServiceImpl extends ServiceImpl implements SysMenuService { + + @Resource + private SysRelationService sysRelationService; + + @Resource + private SysModuleService sysModuleService; + + @Override + public Page page(SysMenuPageParam sysMenuPageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.lambda().eq(SysMenu::getCategory, SysResourceCategoryEnum.MENU.getValue()); + if(ObjectUtil.isNotEmpty(sysMenuPageParam.getSearchKey())) { + queryWrapper.lambda().like(SysMenu::getTitle, sysMenuPageParam.getSearchKey()); + } + if(ObjectUtil.isNotEmpty(sysMenuPageParam.getModule())) { + queryWrapper.lambda().like(SysMenu::getModule, sysMenuPageParam.getModule()); + } + if(ObjectUtil.isAllNotEmpty(sysMenuPageParam.getSortField(), sysMenuPageParam.getSortOrder())) { + CommonSortOrderEnum.validate(sysMenuPageParam.getSortOrder()); + queryWrapper.orderBy(true, sysMenuPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), + StrUtil.toUnderlineCase(sysMenuPageParam.getSortField())); + } else { + queryWrapper.lambda().orderByAsc(SysMenu::getSortCode); + } + return this.page(CommonPageRequest.defaultPage(), queryWrapper); + } + + @Override + public List> tree(SysMenuTreeParam sysMenuTreeParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(SysMenu::getCategory, SysResourceCategoryEnum.MENU.getValue()) + .orderByAsc(SysMenu::getSortCode); + if(ObjectUtil.isNotEmpty(sysMenuTreeParam.getModule())) { + lambdaQueryWrapper.eq(SysMenu::getModule, sysMenuTreeParam.getModule()); + } + if(ObjectUtil.isNotEmpty(sysMenuTreeParam.getSearchKey())) { + lambdaQueryWrapper.like(SysMenu::getTitle, sysMenuTreeParam.getSearchKey()); + } + List resourceList = this.list(lambdaQueryWrapper); + List> treeNodeList = resourceList.stream().map(sysMenu -> + new TreeNode<>(sysMenu.getId(), sysMenu.getParentId(), + sysMenu.getTitle(), sysMenu.getSortCode()).setExtra(JSONUtil.parseObj(sysMenu))) + .collect(Collectors.toList()); + return TreeUtil.build(treeNodeList, "0"); + } + + @Override + public void add(SysMenuAddParam sysMenuAddParam) { + checkParam(sysMenuAddParam); + SysMenu sysMenu = BeanUtil.toBean(sysMenuAddParam, SysMenu.class); + boolean repeatTitle = this.count(new LambdaQueryWrapper().eq(SysMenu::getParentId, sysMenu.getParentId()) + .eq(SysMenu::getCategory, SysResourceCategoryEnum.MENU.getValue()).eq(SysMenu::getTitle, sysMenu.getTitle())) > 0; + if(repeatTitle) { + throw new CommonException("存在重复的菜单,名称为:{}", sysMenu.getTitle()); + } + List originDataList = this.list(new LambdaQueryWrapper().eq(SysMenu::getCategory, + SysResourceCategoryEnum.MENU.getValue())); + if(!sysMenuAddParam.getParentId().equals("0")) { + SysMenu parentMenu = this.getById(originDataList, sysMenuAddParam.getParentId()); + if(ObjectUtil.isEmpty(parentMenu)) { + throw new CommonException("上级菜单不存在,id值为:{}", sysMenuAddParam.getParentId()); + } + if(!parentMenu.getModule().equals(sysMenuAddParam.getModule())) { + throw new CommonException("module与上级菜单不一致"); + } + } + sysMenu.setCategory(SysResourceCategoryEnum.MENU.getValue()); + this.save(sysMenu); + } + + private void checkParam(SysMenuAddParam sysMenuAddParam) { + SysResourceMenuTypeEnum.validate(sysMenuAddParam.getMenuType()); + if(SysResourceMenuTypeEnum.MENU.getValue().equals(sysMenuAddParam.getMenuType())) { + if(ObjectUtil.isEmpty(sysMenuAddParam.getName())) { + throw new CommonException("name不能为空"); + } + if(ObjectUtil.isEmpty(sysMenuAddParam.getComponent())) { + throw new CommonException("component不能为空"); + } + } else if(SysResourceMenuTypeEnum.IFRAME.getValue().equals(sysMenuAddParam.getMenuType()) || + SysResourceMenuTypeEnum.LINK.getValue().equals(sysMenuAddParam.getMenuType())) { + sysMenuAddParam.setName(RandomUtil.randomNumbers(10)); + sysMenuAddParam.setComponent(null); + } else { + sysMenuAddParam.setName(null); + sysMenuAddParam.setComponent(null); + } + + } + + @Override + public void edit(SysMenuEditParam sysMenuEditParam) { + SysMenu sysMenu = this.queryEntity(sysMenuEditParam.getId()); + checkParam(sysMenuEditParam); + BeanUtil.copyProperties(sysMenuEditParam, sysMenu); + boolean repeatTitle = this.count(new LambdaQueryWrapper().eq(SysMenu::getParentId, sysMenu.getParentId()) + .eq(SysMenu::getCategory, SysResourceCategoryEnum.MENU.getValue()).eq(SysMenu::getTitle, sysMenu.getTitle()) + .ne(SysMenu::getId, sysMenu.getId())) > 0; + if(repeatTitle) { + throw new CommonException("存在重复的菜单,名称为:{}", sysMenu.getTitle()); + } + List originDataList = this.list(new LambdaQueryWrapper().eq(SysMenu::getCategory, + SysResourceCategoryEnum.MENU.getValue())); + boolean errorLevel = this.getChildListById(originDataList, sysMenu.getId(), true).stream() + .map(SysMenu::getId).collect(Collectors.toList()).contains(sysMenu.getParentId()); + if(errorLevel) { + throw new CommonException("不可选择上级菜单:{}", this.getById(originDataList, sysMenu.getParentId()).getName()); + } + if(!sysMenuEditParam.getParentId().equals("0")) { + SysMenu parentMenu = this.getById(originDataList, sysMenuEditParam.getParentId()); + if(ObjectUtil.isEmpty(parentMenu)) { + throw new CommonException("上级菜单不存在,id值为:{}", sysMenuEditParam.getParentId()); + } + if(!parentMenu.getModule().equals(sysMenuEditParam.getModule())) { + throw new CommonException("module与上级菜单不一致"); + } + } + this.updateById(sysMenu); + } + + @Override + public void changeModule(SysMenuChangeModuleParam sysMenuChangeModuleParam) { + SysMenu sysMenu = this.queryEntity(sysMenuChangeModuleParam.getId()); + if(!sysMenu.getParentId().equals("0")) { + throw new CommonException("非顶级菜单不可修改所属模块"); + } + List sysMenuList = this.list(new LambdaQueryWrapper().eq(SysMenu::getCategory, + SysResourceCategoryEnum.MENU.getValue())); + List sysMenuChildList = this.getChildListById(sysMenuList, sysMenu.getId(), true).stream() + .peek(sysMenuTemp -> sysMenuTemp.setModule(sysMenuChangeModuleParam.getModule())).collect(Collectors.toList()); + this.updateBatchById(sysMenuChildList); + } + + private void checkParam(SysMenuEditParam sysMenuEditParam) { + SysResourceMenuTypeEnum.validate(sysMenuEditParam.getMenuType()); + if(SysResourceMenuTypeEnum.MENU.getValue().equals(sysMenuEditParam.getMenuType())) { + if(ObjectUtil.isEmpty(sysMenuEditParam.getName())) { + throw new CommonException("name不能为空"); + } + if(ObjectUtil.isEmpty(sysMenuEditParam.getComponent())) { + throw new CommonException("component不能为空"); + } + } else if(SysResourceMenuTypeEnum.IFRAME.getValue().equals(sysMenuEditParam.getMenuType()) || + SysResourceMenuTypeEnum.LINK.getValue().equals(sysMenuEditParam.getMenuType())) { + if(ObjectUtil.isEmpty(sysMenuEditParam.getName())) { + sysMenuEditParam.setName(RandomUtil.randomNumbers(10)); + } + sysMenuEditParam.setComponent(null); + } else { + sysMenuEditParam.setName(null); + sysMenuEditParam.setComponent(null); + } + } + + @Override + public void delete(List sysMenuIdParamList) { + List sysMenuIdList = CollStreamUtil.toList(sysMenuIdParamList, SysMenuIdParam::getId); + if(ObjectUtil.isNotEmpty(sysMenuIdList)) { + // 获取菜单下的菜单、按钮 + List allMenuList = this.list(new LambdaUpdateWrapper() + .in(SysMenu::getCategory, CollectionUtil.newArrayList(SysResourceCategoryEnum.MENU.getValue(), + SysResourceCategoryEnum.BUTTON.getValue()))); + List toDeleteMenuIdList = CollectionUtil.newArrayList(); + sysMenuIdList.forEach(menuId -> toDeleteMenuIdList.addAll(this.getChildListById(allMenuList, menuId, true).stream() + .map(SysMenu::getId).collect(Collectors.toList()))); + if(ObjectUtil.isNotEmpty(toDeleteMenuIdList)) { + // 清除对应的角色与资源信息 + sysRelationService.remove(new LambdaUpdateWrapper().in(SysRelation::getTargetId, toDeleteMenuIdList) + .eq(SysRelation::getCategory, SysRelationCategoryEnum.SYS_ROLE_HAS_RESOURCE.getValue())); + // 执行删除 + this.removeBatchByIds(toDeleteMenuIdList); + } + } + } + + @Override + public SysMenu detail(SysMenuIdParam sysMenuIdParam) { + return this.queryEntity(sysMenuIdParam.getId()); + } + + @Override + public SysMenu queryEntity(String id) { + SysMenu sysMenu = this.getById(id); + if(ObjectUtil.isEmpty(sysMenu)) { + throw new CommonException("菜单不存在,id值为:{}", id); + } + return sysMenu; + } + + @Override + public List moduleSelector(SysMenuSelectorModuleParam sysMenuSelectorModuleParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + if(ObjectUtil.isNotEmpty(sysMenuSelectorModuleParam.getSearchKey())) { + lambdaQueryWrapper.like(SysModule::getTitle, sysMenuSelectorModuleParam.getSearchKey()); + } + lambdaQueryWrapper.eq(SysModule::getCategory, SysResourceCategoryEnum.MODULE.getValue()); + return sysModuleService.list(lambdaQueryWrapper); + } + + @Override + public List> menuTreeSelector(SysMenuSelectorMenuParam sysMenuSelectorMenuParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + // 查询类型为菜单的 + lambdaQueryWrapper.eq(SysMenu::getCategory, SysResourceCategoryEnum.MENU.getValue()); + if(ObjectUtil.isNotEmpty(sysMenuSelectorMenuParam.getModule())) { + lambdaQueryWrapper.eq(SysMenu::getModule, sysMenuSelectorMenuParam.getModule()); + } + List resourceList = this.list(lambdaQueryWrapper); + List> treeNodeList = resourceList.stream().map(sysMenu -> + new TreeNode<>(sysMenu.getId(), sysMenu.getParentId(), + sysMenu.getTitle(), sysMenu.getSortCode()).setExtra(JSONUtil.parseObj(sysMenu))) + .collect(Collectors.toList()); + return TreeUtil.build(treeNodeList, "0"); + } + + /* ====以下为各种递归方法==== */ + + @Override + public List getChildListById(List originDataList, String id, boolean includeSelf) { + List resultList = CollectionUtil.newArrayList(); + execRecursionFindChild(originDataList, id, resultList); + if(includeSelf) { + SysMenu self = this.getById(originDataList, id); + if(ObjectUtil.isNotEmpty(self)) { + resultList.add(self); + } + } + return resultList; + } + + @Override + public List getParentListById(List originDataList, String id, boolean includeSelf) { + List resultList = CollectionUtil.newArrayList(); + execRecursionFindParent(originDataList, id, resultList); + if(includeSelf) { + SysMenu self = this.getById(originDataList, id); + if(ObjectUtil.isNotEmpty(self)) { + resultList.add(self); + } + } + return resultList; + } + + public void execRecursionFindChild(List originDataList, String id, List resultList) { + originDataList.forEach(item -> { + if(item.getParentId().equals(id)) { + resultList.add(item); + execRecursionFindChild(originDataList, item.getId(), resultList); + } + }); + } + + public void execRecursionFindParent(List originDataList, String id, List resultList) { + originDataList.forEach(item -> { + if(item.getId().equals(id)) { + SysMenu parent = this.getById(originDataList, item.getParentId()); + if(ObjectUtil.isNotEmpty(parent)) { + resultList.add(parent); + } + execRecursionFindParent(originDataList, item.getParentId(), resultList); + } + }); + } + + public SysMenu getById(List originDataList, String id) { + int index = CollStreamUtil.toList(originDataList, SysMenu::getId).indexOf(id); + return index == -1?null:originDataList.get(index); + } + + public SysMenu getParentById(List originDataList, String id) { + SysMenu self = this.getById(originDataList, id); + return ObjectUtil.isNotEmpty(self)?self:this.getById(originDataList, self.getParentId()); + } + + public SysMenu getChildById(List originDataList, String id) { + int index = CollStreamUtil.toList(originDataList, SysMenu::getParentId).indexOf(id); + return index == -1?null:originDataList.get(index); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysModuleServiceImpl.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysModuleServiceImpl.java new file mode 100644 index 00000000..a48ebde7 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysModuleServiceImpl.java @@ -0,0 +1,151 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import vip.xiaonuo.common.enums.CommonSortOrderEnum; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.sys.core.enums.SysBuildInEnum; +import vip.xiaonuo.sys.modular.relation.entity.SysRelation; +import vip.xiaonuo.sys.modular.relation.enums.SysRelationCategoryEnum; +import vip.xiaonuo.sys.modular.relation.service.SysRelationService; +import vip.xiaonuo.sys.modular.resource.entity.SysMenu; +import vip.xiaonuo.sys.modular.resource.entity.SysModule; +import vip.xiaonuo.sys.modular.resource.enums.SysResourceCategoryEnum; +import vip.xiaonuo.sys.modular.resource.mapper.SysModuleMapper; +import vip.xiaonuo.sys.modular.resource.param.module.SysModuleAddParam; +import vip.xiaonuo.sys.modular.resource.param.module.SysModuleEditParam; +import vip.xiaonuo.sys.modular.resource.param.module.SysModuleIdParam; +import vip.xiaonuo.sys.modular.resource.param.module.SysModulePageParam; +import vip.xiaonuo.sys.modular.resource.service.SysMenuService; +import vip.xiaonuo.sys.modular.resource.service.SysModuleService; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 模块Service接口实现类 + * + * @author xuyuxiang + * @date 2022/6/27 14:25 + **/ +@Service +public class SysModuleServiceImpl extends ServiceImpl implements SysModuleService { + + @Resource + private SysMenuService sysMenuService; + + @Resource + private SysRelationService sysRelationService; + + @Override + public Page page(SysModulePageParam sysModulePageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.lambda().eq(SysModule::getCategory, SysResourceCategoryEnum.MODULE.getValue()); + if(ObjectUtil.isNotEmpty(sysModulePageParam.getSearchKey())) { + queryWrapper.lambda().like(SysModule::getTitle, sysModulePageParam.getSearchKey()); + } + if(ObjectUtil.isAllNotEmpty(sysModulePageParam.getSortField(), sysModulePageParam.getSortOrder())) { + CommonSortOrderEnum.validate(sysModulePageParam.getSortOrder()); + queryWrapper.orderBy(true, sysModulePageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), + StrUtil.toUnderlineCase(sysModulePageParam.getSortField())); + } else { + queryWrapper.lambda().orderByAsc(SysModule::getSortCode); + } + return this.page(CommonPageRequest.defaultPage(), queryWrapper); + } + + @Override + public void add(SysModuleAddParam sysModuleAddParam) { + SysModule sysModule = BeanUtil.toBean(sysModuleAddParam, SysModule.class); + boolean repeatTitle = this.count(new LambdaQueryWrapper().eq(SysModule::getCategory, + SysResourceCategoryEnum.MODULE.getValue()).eq(SysModule::getTitle, sysModule.getTitle())) > 0; + if(repeatTitle) { + throw new CommonException("存在重复的模块,名称为:{}", sysModule.getTitle()); + } + sysModule.setCode(RandomUtil.randomString(10)); + sysModule.setCategory(SysResourceCategoryEnum.MODULE.getValue()); + this.save(sysModule); + } + + @Override + public void edit(SysModuleEditParam sysModuleEditParam) { + SysModule sysModule = this.queryEntity(sysModuleEditParam.getId()); + BeanUtil.copyProperties(sysModuleEditParam, sysModule); + boolean repeatTitle = this.count(new LambdaQueryWrapper().eq(SysModule::getCategory, + SysResourceCategoryEnum.MODULE.getValue()).eq(SysModule::getTitle, sysModule.getTitle()) + .ne(SysModule::getId, sysModule.getId())) > 0; + if(repeatTitle) { + throw new CommonException("存在重复的模块,名称为:{}", sysModule.getTitle()); + } + this.updateById(sysModule); + } + + @Override + public void delete(List sysModuleIdParamList) { + List sysModuleIdList = CollStreamUtil.toList(sysModuleIdParamList, SysModuleIdParam::getId); + if(ObjectUtil.isNotEmpty(sysModuleIdList)) { + boolean containsSystemModule = this.listByIds(sysModuleIdList).stream().map(SysModule::getCode) + .collect(Collectors.toSet()).contains(SysBuildInEnum.BUILD_IN_MODULE_CODE.getValue()); + if(containsSystemModule) { + throw new CommonException("不可删除系统内置模块"); + } + + // 获取模块下的菜单、按钮 + List allMenuList = sysMenuService.list(new LambdaUpdateWrapper() + .in(SysMenu::getCategory, CollectionUtil.newArrayList(SysResourceCategoryEnum.MENU.getValue(), + SysResourceCategoryEnum.BUTTON.getValue()))); + if(ObjectUtil.isNotEmpty(allMenuList)) { + List toDeleteMenuIdList = CollectionUtil.newArrayList(sysModuleIdList); + allMenuList.stream().filter(sysMenu -> sysModuleIdList.contains(sysMenu.getModule())) + .collect(Collectors.toList()).forEach(sysMenu -> toDeleteMenuIdList + .addAll(sysMenuService.getChildListById(allMenuList, sysMenu.getId(), true).stream() + .map(SysMenu::getId).collect(Collectors.toList()))); + if(ObjectUtil.isNotEmpty(toDeleteMenuIdList)) { + // 清除对应的角色与资源信息 + sysRelationService.remove(new LambdaUpdateWrapper().in(SysRelation::getTargetId, toDeleteMenuIdList) + .eq(SysRelation::getCategory, SysRelationCategoryEnum.SYS_ROLE_HAS_RESOURCE.getValue())); + // 执行删除 + this.removeBatchByIds(toDeleteMenuIdList); + } + } + } + } + + @Override + public SysModule detail(SysModuleIdParam sysModuleIdParam) { + return this.queryEntity(sysModuleIdParam.getId()); + } + + @Override + public SysModule queryEntity(String id) { + SysModule sysModule = this.getById(id); + if(ObjectUtil.isEmpty(sysModule)) { + throw new CommonException("模块不存在,id值为:{}", id); + } + return sysModule; + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysSpaServiceImpl.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysSpaServiceImpl.java new file mode 100644 index 00000000..9b45b934 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysSpaServiceImpl.java @@ -0,0 +1,120 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import vip.xiaonuo.common.enums.CommonSortOrderEnum; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.sys.core.enums.SysBuildInEnum; +import vip.xiaonuo.sys.modular.resource.entity.SysSpa; +import vip.xiaonuo.sys.modular.resource.enums.SysResourceCategoryEnum; +import vip.xiaonuo.sys.modular.resource.mapper.SysSpaMapper; +import vip.xiaonuo.sys.modular.resource.param.spa.SysSpaAddParam; +import vip.xiaonuo.sys.modular.resource.param.spa.SysSpaEditParam; +import vip.xiaonuo.sys.modular.resource.param.spa.SysSpaIdParam; +import vip.xiaonuo.sys.modular.resource.param.spa.SysSpaPageParam; +import vip.xiaonuo.sys.modular.resource.service.SysSpaService; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 单页面Service接口实现类 + * + * @author xuyuxiang + * @date 2022/6/27 14:25 + **/ +@Service +public class SysSpaServiceImpl extends ServiceImpl implements SysSpaService { + + @Override + public Page page(SysSpaPageParam sysSpaPageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.lambda().eq(SysSpa::getCategory, SysResourceCategoryEnum.SPA.getValue()); + if(ObjectUtil.isNotEmpty(sysSpaPageParam.getSearchKey())) { + queryWrapper.lambda().like(SysSpa::getTitle, sysSpaPageParam.getSearchKey()); + } + if(ObjectUtil.isAllNotEmpty(sysSpaPageParam.getSortField(), sysSpaPageParam.getSortOrder())) { + CommonSortOrderEnum.validate(sysSpaPageParam.getSortOrder()); + queryWrapper.orderBy(true, sysSpaPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), + StrUtil.toUnderlineCase(sysSpaPageParam.getSortField())); + } else { + queryWrapper.lambda().orderByAsc(SysSpa::getSortCode); + } + return this.page(CommonPageRequest.defaultPage(), queryWrapper); + } + + @Override + public void add(SysSpaAddParam sysSpaAddParam) { + SysSpa sysSpa = BeanUtil.toBean(sysSpaAddParam, SysSpa.class); + boolean repeatTitle = this.count(new LambdaQueryWrapper().eq(SysSpa::getCategory, + SysResourceCategoryEnum.SPA.getValue()).eq(SysSpa::getTitle, sysSpa.getTitle())) > 0; + if(repeatTitle) { + throw new CommonException("存在重复的单页面,名称为:{}", sysSpa.getTitle()); + } + sysSpa.setCode(RandomUtil.randomString(10)); + sysSpa.setCategory(SysResourceCategoryEnum.SPA.getValue()); + this.save(sysSpa); + } + + @Override + public void edit(SysSpaEditParam sysSpaEditParam) { + SysSpa sysSpa = this.queryEntity(sysSpaEditParam.getId()); + BeanUtil.copyProperties(sysSpaEditParam, sysSpa); + boolean repeatTitle = this.count(new LambdaQueryWrapper().eq(SysSpa::getCategory, + SysResourceCategoryEnum.SPA.getValue()).eq(SysSpa::getTitle, sysSpa.getTitle()) + .ne(SysSpa::getId, sysSpa.getId())) > 0; + if(repeatTitle) { + throw new CommonException("存在重复的单页面,名称为:{}", sysSpa.getTitle()); + } + this.updateById(sysSpa); + } + + @Override + public void delete(List sysSpaIdParamList) { + List sysSpaIdList = CollStreamUtil.toList(sysSpaIdParamList, SysSpaIdParam::getId); + if(ObjectUtil.isNotEmpty(sysSpaIdList)) { + boolean containsSystemSpa = this.listByIds(sysSpaIdList).stream().map(SysSpa::getCode) + .collect(Collectors.toSet()).contains(SysBuildInEnum.BUILD_IN_SPA_CODE.getValue()); + if(containsSystemSpa) { + throw new CommonException("不可删除系统内置单页面"); + } + // 删除 + this.removeBatchByIds(sysSpaIdList); + } + } + + @Override + public SysSpa detail(SysSpaIdParam sysSpaIdParam) { + return this.queryEntity(sysSpaIdParam.getId()); + } + + @Override + public SysSpa queryEntity(String id) { + SysSpa sysSpa = this.getById(id); + if(ObjectUtil.isEmpty(sysSpa)) { + throw new CommonException("单页面不存在,id值为:{}", id); + } + return sysSpa; + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/controller/SysRoleController.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/controller/SysRoleController.java new file mode 100644 index 00000000..7faca13a --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/controller/SysRoleController.java @@ -0,0 +1,279 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.role.controller; + +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.pojo.CommonValidList; +import vip.xiaonuo.sys.modular.role.entity.SysRole; +import vip.xiaonuo.sys.modular.role.param.*; +import vip.xiaonuo.sys.modular.role.result.SysRoleGrantResourceTreeResult; +import vip.xiaonuo.sys.modular.role.result.SysRoleOwnPermissionResult; +import vip.xiaonuo.sys.modular.role.result.SysRoleOwnResourceResult; +import vip.xiaonuo.sys.modular.role.service.SysRoleService; +import vip.xiaonuo.sys.modular.user.entity.SysUser; + +import javax.annotation.Resource; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * 角色控制器 + * + * @author xuyuxiang + * @date 2022/4/25 20:19 + */ +@Api(tags = "角色控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 8) +@RestController +@Validated +public class SysRoleController { + + @Resource + private SysRoleService sysRoleService; + + /** + * 获取角色分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("获取角色分页") + @GetMapping("/sys/role/page") + public CommonResult> page(SysRolePageParam sysRolePageParam) { + return CommonResult.data(sysRoleService.page(sysRolePageParam)); + } + + /** + * 添加角色 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("添加角色") + @CommonLog("添加角色") + @PostMapping("/sys/role/add") + public CommonResult add(@RequestBody @Valid SysRoleAddParam sysRoleAddParam) { + sysRoleService.add(sysRoleAddParam); + return CommonResult.ok(); + } + + /** + * 编辑角色 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("编辑角色") + @CommonLog("编辑角色") + @PostMapping("/sys/role/edit") + public CommonResult edit(@RequestBody @Valid SysRoleEditParam sysRoleEditParam) { + sysRoleService.edit(sysRoleEditParam); + return CommonResult.ok(); + } + + /** + * 删除角色 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 4) + @ApiOperation("删除角色") + @CommonLog("删除角色") + @PostMapping("/sys/role/delete") + public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList sysRoleIdParamList) { + sysRoleService.delete(sysRoleIdParamList); + return CommonResult.ok(); + } + + /** + * 获取角色详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 5) + @ApiOperation("获取角色详情") + @GetMapping("/sys/role/detail") + public CommonResult detail(@Valid SysRoleIdParam sysRoleIdParam) { + return CommonResult.data(sysRoleService.detail(sysRoleIdParam)); + } + + /** + * 获取角色拥有资源 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 6) + @ApiOperation("获取角色拥有资源") + @GetMapping("/sys/role/ownResource") + public CommonResult ownResource(@Valid SysRoleIdParam sysRoleIdParam) { + return CommonResult.data(sysRoleService.ownResource(sysRoleIdParam)); + } + + /** + * 给角色授权资源 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 7) + @ApiOperation("给角色授权资源") + @CommonLog("给角色授权资源") + @PostMapping("/sys/role/grantResource") + public CommonResult grantResource(@RequestBody @Valid SysRoleGrantResourceParam sysRoleGrantResourceParam) { + sysRoleService.grantResource(sysRoleGrantResourceParam); + return CommonResult.ok(); + } + + /** + * 获取角色拥有权限 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 8) + @ApiOperation("获取角色拥有权限") + @GetMapping("/sys/role/ownPermission") + public CommonResult ownPermission(@Valid SysRoleIdParam sysRoleIdParam) { + return CommonResult.data(sysRoleService.ownPermission(sysRoleIdParam)); + } + + /** + * 给角色授权权限 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 9) + @ApiOperation("给角色授权权限") + @CommonLog("给角色授权权限") + @PostMapping("/sys/role/grantPermission") + public CommonResult grantPermission(@RequestBody @Valid SysRoleGrantPermissionParam sysRoleGrantPermissionParam) { + sysRoleService.grantPermission(sysRoleGrantPermissionParam); + return CommonResult.ok(); + } + + /** + * 获取角色下的用户 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 10) + @ApiOperation("获取角色下的用户") + @GetMapping("/sys/role/ownUser") + public CommonResult> ownUser(@Valid SysRoleIdParam sysRoleIdParam) { + return CommonResult.data(sysRoleService.ownUser(sysRoleIdParam)); + } + + /** + * 给角色授权用户 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 11) + @ApiOperation("给角色授权用户") + @CommonLog("给角色授权用户") + @PostMapping("/sys/role/grantUser") + public CommonResult grantUser(@RequestBody @Valid SysRoleGrantUserParam sysRoleGrantUserParam) { + sysRoleService.grantUser(sysRoleGrantUserParam); + return CommonResult.ok(); + } + + /* ====角色部分所需要用到的选择器==== */ + + /** + * 获取组织树选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 12) + @ApiOperation("获取组织树选择器") + @GetMapping("/sys/role/orgTreeSelector") + public CommonResult>> orgTreeSelector() { + return CommonResult.data(sysRoleService.orgTreeSelector()); + } + + /** + * 获取资源授权树 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 13) + @ApiOperation("获取资源授权树") + @GetMapping("/sys/role/resourceTreeSelector") + public CommonResult> resourceTreeSelector() { + return CommonResult.data(sysRoleService.resourceTreeSelector()); + } + + /** + * 获取权限授权树 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 14) + @ApiOperation("获取权限授权树") + @GetMapping("/sys/role/permissionTreeSelector") + public CommonResult> permissionTreeSelector() { + return CommonResult.data(sysRoleService.permissionTreeSelector()); + } + + /** + * 获取角色选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 15) + @ApiOperation("获取角色选择器") + @GetMapping("/sys/role/roleSelector") + public CommonResult> roleSelector(SysRoleSelectorRoleParam sysRoleSelectorRoleParam) { + return CommonResult.data(sysRoleService.roleSelector(sysRoleSelectorRoleParam)); + } + + /** + * 获取用户选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 16) + @ApiOperation("获取用户选择器") + @GetMapping("/sys/role/userSelector") + public CommonResult> userSelector(SysRoleSelectorUserParam sysRoleSelectorUserParam) { + return CommonResult.data(sysRoleService.userSelector(sysRoleSelectorUserParam)); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/entity/SysRole.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/entity/SysRole.java new file mode 100644 index 00000000..75d5cf84 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/entity/SysRole.java @@ -0,0 +1,63 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.role.entity; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import vip.xiaonuo.common.pojo.CommonEntity; + +/** + * 角色实体 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +@TableName("SYS_ROLE") +public class SysRole extends CommonEntity { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 组织id */ + @ApiModelProperty(value = "组织id", position = 2) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String orgId; + + /** 名称 */ + @ApiModelProperty(value = "名称", position = 3) + private String name; + + /** 编码 */ + @ApiModelProperty(value = "编码", position = 4) + private String code; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 5) + private String category; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 6) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 7) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/enums/SysRoleCategoryEnum.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/enums/SysRoleCategoryEnum.java new file mode 100644 index 00000000..c2a6f3c2 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/enums/SysRoleCategoryEnum.java @@ -0,0 +1,45 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.role.enums; + +import lombok.Getter; +import vip.xiaonuo.common.exception.CommonException; + +/** + * 角色分类枚举 + * + * @author xuyuxiang + * @date 2022/4/21 19:56 + **/ +@Getter +public enum SysRoleCategoryEnum { + + /** 全局 */ + GLOBAL("GLOBAL"), + + /** 组织 */ + ORG("ORG"); + + private final String value; + + SysRoleCategoryEnum(String value) { + this.value = value; + } + + public static void validate(String value) { + boolean flag = GLOBAL.getValue().equals(value) || ORG.getValue().equals(value); + if(!flag) { + throw new CommonException("不支持的角色分类:{}", value); + } + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/enums/SysRoleDataScopeCategoryEnum.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/enums/SysRoleDataScopeCategoryEnum.java new file mode 100644 index 00000000..41d615f0 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/enums/SysRoleDataScopeCategoryEnum.java @@ -0,0 +1,56 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.role.enums; + +import lombok.Getter; +import vip.xiaonuo.common.exception.CommonException; + +/** + * 给角色授权权限对应的数据范围枚举 + * + * @author xuyuxiang + * @date 2022/4/21 19:56 + **/ +@Getter +public enum SysRoleDataScopeCategoryEnum { + + /** 全部 */ + SCOPE_ALL("SCOPE_ALL"), + + /** 仅自己 */ + SCOPE_SELF("SCOPE_SELF"), + + /** 仅所属组织 */ + SCOPE_ORG("SCOPE_ORG"), + + /** 所属组织及以下 */ + SCOPE_ORG_CHILD("SCOPE_ORG_CHILD"), + + /** 自定义组织 */ + SCOPE_ORG_DEFINE("SCOPE_ORG_DEFINE"); + + private final String value; + + SysRoleDataScopeCategoryEnum(String value) { + this.value = value; + } + + public static void validate(String value) { + boolean flag = SCOPE_ALL.getValue().equals(value) || SCOPE_SELF.getValue().equals(value) || + SCOPE_ORG.getValue().equals(value) || SCOPE_ORG_CHILD.getValue().equals(value) || + SCOPE_ORG_DEFINE.getValue().equals(value); + if(!flag) { + throw new CommonException("不支持的数据范围:{}", value); + } + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/mapper/SysRoleMapper.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/mapper/SysRoleMapper.java new file mode 100644 index 00000000..b98ffb40 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/mapper/SysRoleMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.role.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.sys.modular.role.entity.SysRole; + +/** + * 角色Mapper接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:37 + **/ +public interface SysRoleMapper extends BaseMapper { +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/mapper/mapping/SysRoleMapper.xml b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/mapper/mapping/SysRoleMapper.xml new file mode 100644 index 00000000..d9a981d8 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/mapper/mapping/SysRoleMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleAddParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleAddParam.java new file mode 100644 index 00000000..8b31d154 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleAddParam.java @@ -0,0 +1,54 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.role.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 角色添加参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class SysRoleAddParam { + + /** 名称 */ + @ApiModelProperty(value = "名称", required = true, position = 1) + @NotBlank(message = "name不能为空") + private String name; + + /** 分类 */ + @ApiModelProperty(value = "分类", required = true, position = 2) + @NotBlank(message = "category不能为空") + private String category; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", required = true, position = 3) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 组织id */ + @ApiModelProperty(value = "组织id", position = 4) + private String orgId; + + /** 扩展JSON */ + @ApiModelProperty(value = "扩展JSON", position = 5) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleEditParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleEditParam.java new file mode 100644 index 00000000..808034d0 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleEditParam.java @@ -0,0 +1,59 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.role.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 角色编辑参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class SysRoleEditParam { + + /** id */ + @ApiModelProperty(value = "id", required = true, position = 1) + @NotBlank(message = "id不能为空") + private String id; + + /** 名称 */ + @ApiModelProperty(value = "名称", required = true, position = 2) + @NotBlank(message = "name不能为空") + private String name; + + /** 分类 */ + @ApiModelProperty(value = "分类", required = true, position = 3) + @NotBlank(message = "category不能为空") + private String category; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", required = true, position = 4) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 组织id */ + @ApiModelProperty(value = "组织id", position = 5) + private String orgId; + + /** 扩展JSON */ + @ApiModelProperty(value = "扩展JSON", position = 6) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleGrantPermissionParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleGrantPermissionParam.java new file mode 100644 index 00000000..fef594d0 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleGrantPermissionParam.java @@ -0,0 +1,70 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.role.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 角色授权权限参数 + * + * @author xuyuxiang + * @date 2022/7/27 15:05 + **/ +@Getter +@Setter +public class SysRoleGrantPermissionParam { + + /** 角色id */ + @ApiModelProperty(value = "角色id", required = true, position = 1) + @NotBlank(message = "id不能为空") + private String id; + + /** 授权权限信息 */ + @Valid + @ApiModelProperty(value = "授权权限信息", required = true, position = 2) + @NotNull(message = "grantInfoList不能为空") + private List grantInfoList; + + /** + * 角色授权权限类 + * + * @author xuyuxiang + * @date 2022/4/28 23:19 + */ + @Getter + @Setter + public static class SysRoleGrantPermission { + + /** 接口地址 */ + @ApiModelProperty(value = "接口地址", position = 1) + @NotBlank(message = "apiUrl不能为空") + private String apiUrl; + + /** 数据范围分类 */ + @ApiModelProperty(value = "数据范围分类", position = 2) + @NotBlank(message = "category不能为空") + private String scopeCategory; + + /** 自定义范围组织id集合 */ + @ApiModelProperty(value = "自定义范围组织id集合", position = 3) + @NotNull(message = "scopeDefineOrgIdList不能为空") + private List scopeDefineOrgIdList; + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleGrantResourceParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleGrantResourceParam.java new file mode 100644 index 00000000..ea15ab53 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleGrantResourceParam.java @@ -0,0 +1,65 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.role.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 角色授权资源参数 + * + * @author xuyuxiang + * @date 2022/7/27 15:05 + **/ +@Getter +@Setter +public class SysRoleGrantResourceParam { + + /** 角色id */ + @ApiModelProperty(value = "角色id", required = true, position = 1) + @NotBlank(message = "id不能为空") + private String id; + + /** 授权资源信息 */ + @Valid + @ApiModelProperty(value = "授权资源信息", required = true, position = 2) + @NotNull(message = "grantInfoList不能为空") + private List grantInfoList; + + /** + * 角色授权资源类 + * + * @author xuyuxiang + * @date 2022/4/28 23:19 + */ + @Getter + @Setter + public static class SysRoleGrantResource { + + /** 菜单id */ + @ApiModelProperty(value = "菜单id", position = 1) + @NotBlank(message = "menuId不能为空") + private String menuId; + + /** 按钮id集合 */ + @ApiModelProperty(value = "按钮id集合", position = 2) + @NotNull(message = "buttonInfo不能为空") + private List buttonInfo; + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleGrantUserParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleGrantUserParam.java new file mode 100644 index 00000000..55a74cb6 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleGrantUserParam.java @@ -0,0 +1,42 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.role.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 角色授权用户参数 + * + * @author xuyuxiang + * @date 2022/7/27 15:05 + **/ +@Getter +@Setter +public class SysRoleGrantUserParam { + + /** 角色id */ + @ApiModelProperty(value = "角色id", required = true, position = 1) + @NotBlank(message = "id不能为空") + private String id; + + /** 授权用户信息 */ + @ApiModelProperty(value = "授权用户信息", required = true, position = 2) + @NotNull(message = "grantInfoList不能为空") + private List grantInfoList; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleIdParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleIdParam.java new file mode 100644 index 00000000..499abb90 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.role.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 角色Id参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class SysRoleIdParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRolePageParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRolePageParam.java new file mode 100644 index 00000000..8ab5c1d7 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRolePageParam.java @@ -0,0 +1,56 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.role.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 角色查询参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class SysRolePageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 组织id */ + @ApiModelProperty(value = "组织id") + private String orgId; + + /** 职位分类 */ + @ApiModelProperty(value = "职位分类") + private String category; + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleSelectorRoleParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleSelectorRoleParam.java new file mode 100644 index 00000000..1b932f27 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleSelectorRoleParam.java @@ -0,0 +1,40 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.role.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 角色选择器参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class SysRoleSelectorRoleParam { + + /** 组织id */ + @ApiModelProperty(value = "组织id") + private String orgId; + + /** 角色分类 */ + @ApiModelProperty(value = "角色分类") + private String category; + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleSelectorUserParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleSelectorUserParam.java new file mode 100644 index 00000000..0d76e561 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/param/SysRoleSelectorUserParam.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.role.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 用户选择器参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class SysRoleSelectorUserParam { + + /** 组织id */ + @ApiModelProperty(value = "组织id") + private String orgId; + + /** 姓名关键词 */ + @ApiModelProperty(value = "姓名关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/provider/SysRoleApiProvider.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/provider/SysRoleApiProvider.java new file mode 100644 index 00000000..4ea37ece --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/provider/SysRoleApiProvider.java @@ -0,0 +1,53 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.role.provider; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.stereotype.Service; +import vip.xiaonuo.sys.api.SysRoleApi; +import vip.xiaonuo.sys.modular.role.entity.SysRole; +import vip.xiaonuo.sys.modular.role.param.SysRoleSelectorRoleParam; +import vip.xiaonuo.sys.modular.role.service.SysRoleService; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 角色API接口提供者 + * + * @author xuyuxiang + * @date 2022/7/22 14:57 + **/ +@Service +public class SysRoleApiProvider implements SysRoleApi { + + @Resource + private SysRoleService sysRoleService; + + @Override + public boolean orgHasRole(List orgIdList) { + return sysRoleService.count(new LambdaQueryWrapper().in(SysRole::getOrgId, orgIdList)) > 0; + } + + @Override + public List roleSelector(String orgId, String category, String searchKey) { + SysRoleSelectorRoleParam sysRoleSelectorRoleParam = new SysRoleSelectorRoleParam(); + sysRoleSelectorRoleParam.setOrgId(orgId); + sysRoleSelectorRoleParam.setCategory(category); + sysRoleSelectorRoleParam.setSearchKey(searchKey); + return sysRoleService.roleSelector(sysRoleSelectorRoleParam).stream().map(JSONUtil::parseObj).collect(Collectors.toList()); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/result/SysRoleGrantResourceTreeResult.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/result/SysRoleGrantResourceTreeResult.java new file mode 100644 index 00000000..16925433 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/result/SysRoleGrantResourceTreeResult.java @@ -0,0 +1,99 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.role.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * 角色授权资源树结果 + * + * @author xuyuxiang + * @date 2022/7/27 15:09 + **/ +@Getter +@Setter +public class SysRoleGrantResourceTreeResult { + + /** 模块id */ + @ApiModelProperty(value = "模块id", position = 1) + private String id; + + /** 模块名称*/ + @ApiModelProperty(value = "模块名称", position = 2) + private String title; + + /** 模块图标 */ + @ApiModelProperty(value = "模块图标", position = 3) + private String icon; + + /** 模块下菜单集合*/ + @ApiModelProperty(value = "模块下菜单集合", position = 4) + private List menu; + + /** + * 授权菜单类 + * + * @author xuyuxiang + * @date 2022/8/13 16:54 + */ + @Getter + @Setter + public static class SysRoleGrantResourceMenuResult { + + /** 菜单id */ + @ApiModelProperty(value = "菜单id", position = 1) + private String id; + + /** 父id */ + @ApiModelProperty(value = "父id", position = 2) + private String parentId; + + /** 父名称 */ + @ApiModelProperty(value = "菜单名称", position = 3) + private String parentName; + + /** 标题 */ + @ApiModelProperty(value = "菜单标题", position = 4) + private String title; + /** 模块 */ + @ApiModelProperty(value = "菜单模块", position = 5) + private String module; + + /** 菜单下按钮集合 */ + @ApiModelProperty(value = "菜单下按钮集合", position = 6) + private List button; + + /** + * 授权按钮类 + * + * @author xuyuxiang + * @date 2022/8/13 16:54 + */ + @Getter + @Setter + public static class SysRoleGrantResourceButtonResult { + + /** 按钮id */ + @ApiModelProperty(value = "按钮id", position = 1) + private String id; + + /** 标题 */ + @ApiModelProperty(value = "按钮标题", position = 2) + private String title; + } + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/result/SysRoleOwnPermissionResult.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/result/SysRoleOwnPermissionResult.java new file mode 100644 index 00000000..f8f8e551 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/result/SysRoleOwnPermissionResult.java @@ -0,0 +1,62 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.role.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * 角色拥有的权限结果 + * + * @author xuyuxiang + * @date 2022/7/27 15:08 + **/ +@Getter +@Setter +public class SysRoleOwnPermissionResult { + + /** 角色id */ + @ApiModelProperty(value = "角色id", position = 1) + private String id; + + /** 已授权权限信息 */ + @ApiModelProperty(value = "已授权权限信息", position = 2) + private List grantInfoList; + + /** + * 角色拥有资源类 + * + * @author xuyuxiang + * @date 2022/4/28 23:19 + */ + @Getter + @Setter + public static class SysRoleOwnPermission { + + /** 菜单id */ + @ApiModelProperty(value = "接口地址", position = 1) + private String apiUrl; + + /** 数据范围分类 */ + @ApiModelProperty(value = "数据范围分类", position = 1) + private String scopeCategory; + + /** 自定义范围组织id集合 */ + @ApiModelProperty(value = "自定义范围组织id集合", position = 2) + private List scopeDefineOrgIdList; + + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/result/SysRoleOwnResourceResult.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/result/SysRoleOwnResourceResult.java new file mode 100644 index 00000000..d8104219 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/result/SysRoleOwnResourceResult.java @@ -0,0 +1,57 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.role.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * 角色拥有的资源结果 + * + * @author xuyuxiang + * @date 2022/7/27 15:08 + **/ +@Getter +@Setter +public class SysRoleOwnResourceResult { + + /** 角色id */ + @ApiModelProperty(value = "角色id", position = 1) + private String id; + + /** 已授权资源信息 */ + @ApiModelProperty(value = "已授权资源信息", position = 2) + private List grantInfoList; + + /** + * 角色拥有资源类 + * + * @author xuyuxiang + * @date 2022/4/28 23:19 + */ + @Getter + @Setter + public static class SysRoleOwnResource { + + /** 菜单id */ + @ApiModelProperty(value = "菜单id", position = 1) + private String menuId; + + /** 按钮id集合 */ + @ApiModelProperty(value = "按钮id集合", position = 2) + private List buttonInfo; + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/service/SysRoleService.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/service/SysRoleService.java new file mode 100644 index 00000000..59a5459b --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/service/SysRoleService.java @@ -0,0 +1,172 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.role.service; + +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import vip.xiaonuo.sys.modular.role.entity.SysRole; +import vip.xiaonuo.sys.modular.role.param.*; +import vip.xiaonuo.sys.modular.role.result.SysRoleGrantResourceTreeResult; +import vip.xiaonuo.sys.modular.role.result.SysRoleOwnPermissionResult; +import vip.xiaonuo.sys.modular.role.result.SysRoleOwnResourceResult; +import vip.xiaonuo.sys.modular.user.entity.SysUser; + +import java.util.List; + +/** + * 角色Service接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:35 + **/ +public interface SysRoleService extends IService { + + /** + * 获取角色分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + Page page(SysRolePageParam sysRolePageParam); + + /** + * 添加角色 + * + * @author xuyuxiang + * @date 2022/4/24 20:48 + */ + void add(SysRoleAddParam sysRoleAddParam); + + /** + * 编辑角色 + * + * @author xuyuxiang + * @date 2022/4/24 21:13 + */ + void edit(SysRoleEditParam sysRoleEditParam); + + /** + * 删除角色 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + void delete(List sysRoleIdParamList); + + /** + * 获取角色详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + SysRole detail(SysRoleIdParam sysRoleIdParam); + + /** + * 获取角色详情 + * + * @author xuyuxiang + * @date 2022/7/25 19:42 + **/ + SysRole queryEntity(String id); + + /** + * 获取角色拥有资源 + * + * @author xuyuxiang + * @date 2022/5/13 20:51 + */ + SysRoleOwnResourceResult ownResource(SysRoleIdParam SysRoleIdParam); + + /** + * 给角色授权资源 + * + * @author xuyuxiang + * @date 2022/4/29 10:12 + **/ + void grantResource(SysRoleGrantResourceParam sysRoleGrantResourceParam); + + /** + * 获取角色拥有权限 + * + * @author xuyuxiang + * @date 2022/5/13 20:51 + */ + SysRoleOwnPermissionResult ownPermission(SysRoleIdParam SysRoleIdParam); + + /** + * 给角色授权权限 + * + * @author xuyuxiang + * @date 2022/4/29 10:12 + **/ + void grantPermission(SysRoleGrantPermissionParam sysRoleGrantPermissionParam); + + /** + * 获取角色下的用户 + * + * @author xuyuxiang + * @date 2022/8/22 13:56 + **/ + List ownUser(SysRoleIdParam sysRoleIdParam); + + /** + * 给角色授权用户 + * + * @author xuyuxiang + * @date 2022/4/29 10:12 + **/ + void grantUser(SysRoleGrantUserParam sysRoleGrantUserParam); + + /* ====角色部分所需要用到的选择器==== */ + + /** + * 获取组织树选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + List> orgTreeSelector(); + + /** + * 获取资源授权树 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + List resourceTreeSelector(); + + /** + * 获取权限授权树 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + List permissionTreeSelector(); + + /** + * 获取角色选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + List roleSelector(SysRoleSelectorRoleParam sysRoleSelectorRoleParam); + + /** + * 获取用户选择器 + * + * @author xuyuxiang + * @date 2022/8/22 13:39 + **/ + List userSelector(SysRoleSelectorUserParam sysRoleSelectorUserParam); +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/service/impl/SysRoleServiceImpl.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/service/impl/SysRoleServiceImpl.java new file mode 100644 index 00000000..d1bd3c0f --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,519 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.role.service.impl; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNode; +import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import io.swagger.annotations.ApiOperation; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; +import vip.xiaonuo.common.enums.CommonSortOrderEnum; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.sys.core.enums.SysBuildInEnum; +import vip.xiaonuo.sys.modular.org.entity.SysOrg; +import vip.xiaonuo.sys.modular.org.service.SysOrgService; +import vip.xiaonuo.sys.modular.relation.entity.SysRelation; +import vip.xiaonuo.sys.modular.relation.enums.SysRelationCategoryEnum; +import vip.xiaonuo.sys.modular.relation.service.SysRelationService; +import vip.xiaonuo.sys.modular.resource.entity.SysMenu; +import vip.xiaonuo.sys.modular.resource.entity.SysSpa; +import vip.xiaonuo.sys.modular.resource.enums.SysResourceCategoryEnum; +import vip.xiaonuo.sys.modular.resource.service.SysMenuService; +import vip.xiaonuo.sys.modular.role.entity.SysRole; +import vip.xiaonuo.sys.modular.role.enums.SysRoleCategoryEnum; +import vip.xiaonuo.sys.modular.role.mapper.SysRoleMapper; +import vip.xiaonuo.sys.modular.role.param.*; +import vip.xiaonuo.sys.modular.role.result.SysRoleGrantResourceTreeResult; +import vip.xiaonuo.sys.modular.role.result.SysRoleOwnPermissionResult; +import vip.xiaonuo.sys.modular.role.result.SysRoleOwnResourceResult; +import vip.xiaonuo.sys.modular.role.service.SysRoleService; +import vip.xiaonuo.sys.modular.user.entity.SysUser; +import vip.xiaonuo.sys.modular.user.service.SysUserService; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 角色Service接口实现类 + * + * @author xuyuxiang + * @date 2022/2/23 18:43 + **/ +@Service +public class SysRoleServiceImpl extends ServiceImpl implements SysRoleService { + + @Resource + private SysRelationService sysRelationService; + + @Resource + private SysOrgService sysOrgService; + + @Resource + private SysMenuService sysMenuService; + + @Resource + private SysUserService sysUserService; + + @Override + public Page page(SysRolePageParam sysRolePageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + // 查询部分字段 + queryWrapper.lambda().select(SysRole::getId, SysRole::getOrgId, SysRole::getName, + SysRole::getCategory, SysRole::getSortCode); + if(ObjectUtil.isNotEmpty(sysRolePageParam.getOrgId())) { + queryWrapper.lambda().eq(SysRole::getOrgId, sysRolePageParam.getOrgId()); + } + if(ObjectUtil.isNotEmpty(sysRolePageParam.getCategory())) { + queryWrapper.lambda().eq(SysRole::getCategory, sysRolePageParam.getCategory()); + } + if(ObjectUtil.isNotEmpty(sysRolePageParam.getSearchKey())) { + queryWrapper.lambda().like(SysRole::getName, sysRolePageParam.getSearchKey()); + } + if(ObjectUtil.isAllNotEmpty(sysRolePageParam.getSortField(), sysRolePageParam.getSortOrder())) { + CommonSortOrderEnum.validate(sysRolePageParam.getSortOrder()); + queryWrapper.orderBy(true, sysRolePageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), + StrUtil.toUnderlineCase(sysRolePageParam.getSortField())); + } else { + queryWrapper.lambda().orderByAsc(SysRole::getSortCode); + } + return this.page(CommonPageRequest.defaultPage(), queryWrapper); + } + + @Override + public void add(SysRoleAddParam sysRoleAddParam) { + SysRoleCategoryEnum.validate(sysRoleAddParam.getCategory()); + if(SysRoleCategoryEnum.ORG.getValue().equals(sysRoleAddParam.getCategory())) { + if(ObjectUtil.isEmpty(sysRoleAddParam.getOrgId())) { + throw new CommonException("orgId不能为空"); + } + } else { + sysRoleAddParam.setOrgId(null); + } + SysRole sysRole = BeanUtil.toBean(sysRoleAddParam, SysRole.class); + boolean repeatName = this.count(new LambdaQueryWrapper().eq(SysRole::getOrgId, sysRole.getOrgId()) + .eq(SysRole::getName, sysRole.getName())) > 0; + if(repeatName) { + if(ObjectUtil.isEmpty(sysRole.getOrgId())) { + throw new CommonException("存在重复的全局角色,名称为:{}", sysRole.getName()); + } else { + throw new CommonException("同组织下存在重复的角色,名称为:{}", sysRole.getName()); + } + } + sysRole.setCode(RandomUtil.randomString(10)); + this.save(sysRole); + } + + @Override + public void edit(SysRoleEditParam sysRoleEditParam) { + SysRole sysRole = this.queryEntity(sysRoleEditParam.getId()); + boolean superRole = sysRole.getCode().equals(SysBuildInEnum.BUILD_IN_ROLE_CODE.getValue()); + if(superRole) { + throw new CommonException("不可编辑超管角色"); + } + if(SysRoleCategoryEnum.ORG.getValue().equals(sysRoleEditParam.getCategory()) && ObjectUtil.isEmpty(sysRoleEditParam.getOrgId())) { + throw new CommonException("orgId不能为空"); + } else { + sysRoleEditParam.setOrgId(null); + } + boolean repeatName = this.count(new LambdaQueryWrapper().eq(SysRole::getOrgId, sysRole.getOrgId()) + .eq(SysRole::getName, sysRole.getName()).ne(SysRole::getId, sysRole.getId())) > 0; + if(repeatName) { + if(ObjectUtil.isEmpty(sysRole.getOrgId())) { + throw new CommonException("存在重复的全局角色,名称为:{}", sysRole.getName()); + } else { + throw new CommonException("同组织下存在重复的角色,名称为:{}", sysRole.getName()); + } + } + BeanUtil.copyProperties(sysRoleEditParam, sysRole); + this.updateById(sysRole); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void delete(List sysRoleIdParamList) { + List sysRoleIdList = CollStreamUtil.toList(sysRoleIdParamList, SysRoleIdParam::getId); + if(ObjectUtil.isNotEmpty(sysRoleIdList)) { + boolean containsSuperAdminRole = this.listByIds(sysRoleIdList).stream().map(SysRole::getCode) + .collect(Collectors.toSet()).contains(SysBuildInEnum.BUILD_IN_ROLE_CODE.getValue()); + if(containsSuperAdminRole) { + throw new CommonException("不可删除系统内置超管角色"); + } + // 级联删除角色与用户关系 + sysRelationService.remove(new LambdaUpdateWrapper().in(SysRelation::getTargetId, sysRoleIdList) + .eq(SysRelation::getCategory, SysRelationCategoryEnum.SYS_USER_HAS_ROLE.getValue())); + // 级联删除角色与资源关系 + sysRelationService.remove(new LambdaUpdateWrapper().in(SysRelation::getObjectId, sysRoleIdList) + .eq(SysRelation::getCategory, SysRelationCategoryEnum.SYS_ROLE_HAS_RESOURCE.getValue())); + // 执行删除 + this.removeBatchByIds(sysRoleIdList); + } + } + + @Override + public SysRole detail(SysRoleIdParam sysRoleIdParam) { + return this.queryEntity(sysRoleIdParam.getId()); + } + + @Override + public SysRoleOwnResourceResult ownResource(SysRoleIdParam sysRoleIdParam) { + SysRoleOwnResourceResult sysRoleOwnResourceResult = new SysRoleOwnResourceResult(); + sysRoleOwnResourceResult.setId(sysRoleIdParam.getId()); + sysRoleOwnResourceResult.setGrantInfoList(sysRelationService.getRelationListByObjectIdAndCategory(sysRoleIdParam.getId(), + SysRelationCategoryEnum.SYS_ROLE_HAS_RESOURCE.getValue()).stream().map(sysRelation -> + JSONUtil.toBean(sysRelation.getExtJson(), SysRoleOwnResourceResult.SysRoleOwnResource.class)).collect(Collectors.toList())); + return sysRoleOwnResourceResult; + } + + @Override + public void grantResource(SysRoleGrantResourceParam sysRoleGrantResourceParam) { + String id = sysRoleGrantResourceParam.getId(); + List menuIdList = sysRoleGrantResourceParam.getGrantInfoList().stream() + .map(SysRoleGrantResourceParam.SysRoleGrantResource::getMenuId).collect(Collectors.toList()); + List extJsonList = sysRoleGrantResourceParam.getGrantInfoList().stream() + .map(JSONUtil::toJsonStr).collect(Collectors.toList()); + sysRelationService.saveRelationBatchWithClear(id, menuIdList, SysRelationCategoryEnum.SYS_ROLE_HAS_RESOURCE.getValue(), + extJsonList); + } + + @Override + public SysRoleOwnPermissionResult ownPermission(SysRoleIdParam sysRoleIdParam) { + SysRoleOwnPermissionResult sysRoleOwnPermissionResult = new SysRoleOwnPermissionResult(); + sysRoleOwnPermissionResult.setId(sysRoleIdParam.getId()); + sysRoleOwnPermissionResult.setGrantInfoList(sysRelationService.getRelationListByObjectIdAndCategory(sysRoleIdParam.getId(), + SysRelationCategoryEnum.SYS_ROLE_HAS_PERMISSION.getValue()).stream().map(sysRelation -> + JSONUtil.toBean(sysRelation.getExtJson(), SysRoleOwnPermissionResult.SysRoleOwnPermission.class)).collect(Collectors.toList())); + return sysRoleOwnPermissionResult; + } + + @Override + public void grantPermission(SysRoleGrantPermissionParam sysRoleGrantPermissionParam) { + String id = sysRoleGrantPermissionParam.getId(); + List apiUrlList = sysRoleGrantPermissionParam.getGrantInfoList().stream() + .map(SysRoleGrantPermissionParam.SysRoleGrantPermission::getApiUrl).collect(Collectors.toList()); + List extJsonList = sysRoleGrantPermissionParam.getGrantInfoList().stream() + .map(JSONUtil::toJsonStr).collect(Collectors.toList()); + sysRelationService.saveRelationBatchWithClear(id, apiUrlList, SysRelationCategoryEnum.SYS_ROLE_HAS_PERMISSION.getValue(), + extJsonList); + } + + @Override + public List ownUser(SysRoleIdParam sysRoleIdParam) { + return sysRelationService.getRelationObjectIdListByTargetIdAndCategory(sysRoleIdParam.getId(), + SysRelationCategoryEnum.SYS_USER_HAS_ROLE.getValue()); + } + + @Override + public void grantUser(SysRoleGrantUserParam sysRoleGrantUserParam) { + String id = sysRoleGrantUserParam.getId(); + List grantInfoList = sysRoleGrantUserParam.getGrantInfoList(); + sysRelationService.remove(new LambdaQueryWrapper().eq(SysRelation::getTargetId, id) + .eq(SysRelation::getCategory, SysRelationCategoryEnum.SYS_USER_HAS_ROLE.getValue())); + sysRelationService.saveBatch(grantInfoList.stream().map(userId -> { + SysRelation sysRelation = new SysRelation(); + sysRelation.setObjectId(userId); + sysRelation.setTargetId(id); + sysRelation.setCategory(SysRelationCategoryEnum.SYS_USER_HAS_ROLE.getValue()); + return sysRelation; + }).collect(Collectors.toList())); + } + + @Override + public SysRole queryEntity(String id) { + SysRole sysRole = this.getById(id); + if(ObjectUtil.isEmpty(sysRole)) { + throw new CommonException("角色不存在,id值为:{}", id); + } + return sysRole; + } + + /* ====职位部分所需要用到的选择器==== */ + + @Override + public List> orgTreeSelector() { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.orderByAsc(SysOrg::getSortCode); + List sysOrgList = sysOrgService.list(lambdaQueryWrapper); + List> treeNodeList = sysOrgList.stream().map(sysOrg -> + new TreeNode<>(sysOrg.getId(), sysOrg.getParentId(), sysOrg.getName(), sysOrg.getSortCode())) + .collect(Collectors.toList()); + return TreeUtil.build(treeNodeList, "0"); + } + + @Override + public List resourceTreeSelector() { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(SysMenu::getCategory, SysResourceCategoryEnum.MODULE.getValue(), SysResourceCategoryEnum.MENU.getValue(), + SysResourceCategoryEnum.BUTTON.getValue()); + List allMenuAndButtonAndFieldList = sysMenuService.list(lambdaQueryWrapper); + List sysModuleList = CollectionUtil.newArrayList(); + List sysMenuList = CollectionUtil.newArrayList(); + List sysButtonList = CollectionUtil.newArrayList(); + allMenuAndButtonAndFieldList.forEach(sysMenu -> { + if (sysMenu.getCategory().equals(SysResourceCategoryEnum.MODULE.getValue())) sysModuleList.add(sysMenu); + if (sysMenu.getCategory().equals(SysResourceCategoryEnum.MENU.getValue())) sysMenuList.add(sysMenu); + if (sysMenu.getCategory().equals(SysResourceCategoryEnum.BUTTON.getValue())) sysButtonList.add(sysMenu); + }); + List leafMenuList = CollectionUtil.newArrayList(); + SysMenu rootSysMenu = new SysMenu(); + rootSysMenu.setId("0"); + rootSysMenu.setParentId("-1"); + rootSysMenu.setSortCode(-1); + sysMenuList.add(rootSysMenu); + List> treeNodeList = sysMenuList.stream().map(sysMenu -> + new TreeNode<>(sysMenu.getId(), sysMenu.getParentId(), + sysMenu.getTitle(), sysMenu.getSortCode())).collect(Collectors.toList()); + List> treeList = TreeUtil.build(treeNodeList, "-1"); + sysMenuList.forEach(sysMenu -> { + boolean isLeafMenu = this.getChildListById(sysMenuList, sysMenu.getId(), false).size() == 0; + if(isLeafMenu) { + SysRoleGrantResourceTreeResult.SysRoleGrantResourceMenuResult sysRoleGrantResourceMenuResult = + new SysRoleGrantResourceTreeResult.SysRoleGrantResourceMenuResult(); + BeanUtil.copyProperties(sysMenu, sysRoleGrantResourceMenuResult); + JSONObject parentJsonObject = getParentNode(treeList, sysMenu); + List parentIdSplitList = StrUtil.split(parentJsonObject.getStr("parentId"), StrUtil.DASHED); + List parentNameSplitList = StrUtil.split(parentJsonObject.getStr("parentName"), StrUtil.DASHED); + if(parentNameSplitList.size() > 1) { + sysRoleGrantResourceMenuResult.setParentId(parentIdSplitList.get(3)); + sysRoleGrantResourceMenuResult.setParentName(parentNameSplitList.get(0)); + StringBuilder selfNamePrefix = new StringBuilder(); + for(int i = 1; i< parentNameSplitList.size(); i++) { + selfNamePrefix.append(parentNameSplitList.get(i)).append(StrUtil.DASHED); + } + sysRoleGrantResourceMenuResult.setTitle(selfNamePrefix + sysRoleGrantResourceMenuResult.getTitle()); + } else { + sysRoleGrantResourceMenuResult.setParentName(parentJsonObject.getStr("parentName")); + } + sysRoleGrantResourceMenuResult.setButton(this.getChildListById(sysButtonList, sysMenu.getId(), false) + .stream().map(sysMenuItem -> { + SysRoleGrantResourceTreeResult.SysRoleGrantResourceMenuResult.SysRoleGrantResourceButtonResult + sysRoleGrantResourceButtonResult = new SysRoleGrantResourceTreeResult + .SysRoleGrantResourceMenuResult.SysRoleGrantResourceButtonResult(); + BeanUtil.copyProperties(sysMenuItem, sysRoleGrantResourceButtonResult); + return sysRoleGrantResourceButtonResult; + }).collect(Collectors.toList())); + leafMenuList.add(sysRoleGrantResourceMenuResult); + } + }); + Map> menuListGroup = leafMenuList.stream() + .collect(Collectors.groupingBy(SysRoleGrantResourceTreeResult.SysRoleGrantResourceMenuResult::getModule)); + return sysModuleList.stream().map(sysModule -> { + SysRoleGrantResourceTreeResult sysRoleGrantResourceTreeResult = new SysRoleGrantResourceTreeResult(); + sysRoleGrantResourceTreeResult.setId(sysModule.getId()); + sysRoleGrantResourceTreeResult.setTitle(sysModule.getTitle()); + sysRoleGrantResourceTreeResult.setIcon(sysModule.getIcon()); + sysRoleGrantResourceTreeResult.setMenu(menuListGroup.get(sysModule.getId())); + return sysRoleGrantResourceTreeResult; + }).collect(Collectors.toList()); + } + + @Override + public List permissionTreeSelector() { + List permissionResult = CollectionUtil.newArrayList(); + SpringUtil.getApplicationContext().getBeansOfType(RequestMappingHandlerMapping.class).values() + .forEach(requestMappingHandlerMapping -> requestMappingHandlerMapping.getHandlerMethods() + .forEach((key, value) -> { + SaCheckPermission saCheckPermission = value.getMethod().getAnnotation(SaCheckPermission.class); + if(ObjectUtil.isNotEmpty(saCheckPermission)) { + PatternsRequestCondition patternsCondition = key.getPatternsCondition(); + if (patternsCondition != null) { + String apiName = "未定义接口名称"; + ApiOperation apiOperation = value.getMethod().getAnnotation(ApiOperation.class); + if(ObjectUtil.isNotEmpty(apiOperation)) { + String annotationValue = apiOperation.value(); + if(ObjectUtil.isNotEmpty(annotationValue)) { + apiName = annotationValue; + } + } + permissionResult.add(patternsCondition.getPatterns().iterator().next() + StrUtil.BRACKET_START + apiName + StrUtil.BRACKET_END); + } + } + })); + return CollectionUtil.sortByPinyin(permissionResult.stream().filter(api -> + !api.startsWith("/" + StrUtil.BRACKET_START) + && !api.startsWith("/error") + && !api.contains("/api-docs") + && !api.contains("/swagger-resources")).collect(Collectors.toList())); + } + + @Override + public List roleSelector(SysRoleSelectorRoleParam sysRoleSelectorRoleParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + // 查询部分字段 + lambdaQueryWrapper.select(SysRole::getId, SysRole::getOrgId, SysRole::getName, + SysRole::getCategory, SysRole::getSortCode); + if(ObjectUtil.isNotEmpty(sysRoleSelectorRoleParam.getOrgId())) { + lambdaQueryWrapper.eq(SysRole::getOrgId, sysRoleSelectorRoleParam.getOrgId()); + } + if(ObjectUtil.isNotEmpty(sysRoleSelectorRoleParam.getCategory())) { + lambdaQueryWrapper.eq(SysRole::getCategory, sysRoleSelectorRoleParam.getCategory()); + } + if(ObjectUtil.isNotEmpty(sysRoleSelectorRoleParam.getSearchKey())) { + lambdaQueryWrapper.like(SysRole::getName, sysRoleSelectorRoleParam.getSearchKey()); + } + lambdaQueryWrapper.orderByAsc(SysRole::getSortCode); + return this.list(lambdaQueryWrapper); + } + + @Override + public List userSelector(SysRoleSelectorUserParam sysRoleSelectorUserParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + // 只查询部分字段 + lambdaQueryWrapper.select(SysUser::getId, SysUser::getOrgId, SysUser::getAccount, SysUser::getName); + if(ObjectUtil.isNotEmpty(sysRoleSelectorUserParam.getOrgId())) { + lambdaQueryWrapper.eq(SysUser::getOrgId, sysRoleSelectorUserParam.getOrgId()); + } + if(ObjectUtil.isNotEmpty(sysRoleSelectorUserParam.getSearchKey())) { + lambdaQueryWrapper.like(SysUser::getName, sysRoleSelectorUserParam.getSearchKey()); + } + lambdaQueryWrapper.orderByAsc(SysUser::getSortCode); + return sysUserService.list(lambdaQueryWrapper); + } + + /* ====以下为各种递归方法==== */ + + public JSONObject getParentNode(List> treeList, SysMenu sysMenu) { + List> resultList = CollectionUtil.newArrayList(); + getNode(treeList, sysMenu.getId(), resultList); + JSONObject jsonObject = JSONUtil.createObj(); + if(ObjectUtil.isNotEmpty(resultList)) { + Tree currentNode = resultList.get(0); + if(currentNode.getId().equals("0") || currentNode.getParentId().equals("0")) { + jsonObject.set("parentId", sysMenu.getId()); + jsonObject.set("parentName", sysMenu.getTitle()); + } else { + jsonObject.set("parentId", StrUtil.join(StrUtil.DASHED, CollectionUtil.reverse(CollectionUtil + .removeNull(this.getParentsId(currentNode, false))))); + jsonObject.set("parentName", StrUtil.join(StrUtil.DASHED, CollectionUtil.reverse(CollectionUtil + .removeNull(TreeUtil.getParentsName(currentNode, false))))); + } + } else { + jsonObject.set("parentId", sysMenu.getId()); + jsonObject.set("parentName", sysMenu.getTitle()); + } + return jsonObject; + } + + public List getParentsId(Tree node, boolean includeCurrentNode) { + final List result = new ArrayList<>(); + if (null == node) { + return result; + } + + if (includeCurrentNode) { + result.add(node.getId()); + } + + Tree parent = node.getParent(); + while (null != parent) { + result.add(parent.getId()); + parent = parent.getParent(); + } + return result; + } + + public void getNode(List> treeList, String id, List> resultList) { + for (Tree tree: treeList) { + if(tree.getId().equals(id)) { + resultList.add(tree); + break; + } else { + List> children = tree.getChildren(); + if(ObjectUtil.isNotEmpty(children)) { + getNode(children, id, resultList); + } + } + } + } + + public List getChildListById(List originDataList, String id, boolean includeSelf) { + List sysResourceList = CollectionUtil.newArrayList(); + execRecursionFindChild(originDataList, id, sysResourceList); + if(includeSelf) { + SysMenu self = this.getById(originDataList, id); + if(ObjectUtil.isNotEmpty(self)) { + sysResourceList.add(self); + } + } + return sysResourceList; + } + + public List getParentListById(List originDataList, String id, boolean includeSelf) { + List sysResourceList = CollectionUtil.newArrayList(); + execRecursionFindParent(originDataList, id, sysResourceList); + if(includeSelf) { + SysMenu self = this.getById(originDataList, id); + if(ObjectUtil.isNotEmpty(self)) { + sysResourceList.add(self); + } + } + return sysResourceList; + } + + public void execRecursionFindChild(List originDataList, String id, List resultList) { + originDataList.forEach(item -> { + if(item.getParentId().equals(id)) { + resultList.add(item); + execRecursionFindChild(originDataList, item.getId(), resultList); + } + }); + } + + public void execRecursionFindParent(List originDataList, String id, List resultList) { + originDataList.forEach(item -> { + if(item.getId().equals(id)) { + SysMenu parent = this.getById(originDataList, item.getParentId()); + if(ObjectUtil.isNotEmpty(parent)) { + resultList.add(parent); + } + execRecursionFindParent(originDataList, item.getParentId(), resultList); + } + }); + } + + public SysMenu getById(List originDataList, String id) { + int index = CollStreamUtil.toList(originDataList, SysMenu::getId).indexOf(id); + return index == -1?null:originDataList.get(index); + } + + public SysMenu getParentById(List originDataList, String id) { + SysMenu self = this.getById(originDataList, id); + return ObjectUtil.isNotEmpty(self)?self:this.getById(originDataList, self.getParentId()); + } + + public SysMenu getChildById(List originDataList, String id) { + int index = CollStreamUtil.toList(originDataList, SysMenu::getParentId).indexOf(id); + return index == -1?null:originDataList.get(index); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/controller/SysUserCenterController.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/controller/SysUserCenterController.java new file mode 100644 index 00000000..86f2fe9b --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/controller/SysUserCenterController.java @@ -0,0 +1,282 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.controller; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.sys.modular.user.param.*; +import vip.xiaonuo.sys.modular.user.result.SysUserMessageDetailResult; +import vip.xiaonuo.sys.modular.user.result.SysUserMessageResult; +import vip.xiaonuo.sys.modular.user.result.SysUserPicValidCodeResult; +import vip.xiaonuo.sys.modular.user.result.SysUserPositionResult; +import vip.xiaonuo.sys.modular.user.service.SysUserService; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +/** + * 用户个人控制器 + * + * @author xuyuxiang + * @date 2022/4/22 9:34 + **/ +@Api(tags = "用户个人控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 10) +@RestController +@Validated +public class SysUserCenterController { + + @Resource + private SysUserService sysUserService; + + /** + * 获取图片验证码 + * + * @author xuyuxiang + * @date 2022/7/8 9:26 + **/ + @ApiOperationSupport(order = 1) + @ApiOperation("获取图片验证码") + @GetMapping("/sys/userCenter/getPicCaptcha") + public CommonResult getPicCaptcha() { + return CommonResult.data(sysUserService.getPicCaptcha()); + } + + /** + * 找回密码获取手机验证码 + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 2) + @ApiOperation("找回密码获取手机验证码") + @GetMapping("/sys/userCenter/findPasswordGetPhoneValidCode") + public CommonResult findPasswordGetPhoneValidCode(@Valid SysUserGetPhoneValidCodeParam sysUserGetPhoneValidCodeParam) { + return CommonResult.ok(sysUserService.findPasswordGetPhoneValidCode(sysUserGetPhoneValidCodeParam)); + } + + /** + * 找回密码获取邮箱验证码 + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 3) + @ApiOperation("找回密码获取邮箱验证码") + @GetMapping("/sys/userCenter/findPasswordGetEmailValidCode") + public CommonResult findPasswordGetEmailValidCode(@Valid SysUserGetEmailValidCodeParam sysUserGetEmailValidCodeParam) { + return CommonResult.ok(sysUserService.findPasswordGetEmailValidCode(sysUserGetEmailValidCodeParam)); + } + + /** + * 通过手机号找回用户密码 + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 4) + @ApiOperation("通过手机号找回用户密码") + @CommonLog("通过手机号找回用户密码") + @PostMapping("/sys/userCenter/findPasswordByPhone") + public CommonResult findPasswordByPhone(@RequestBody @Valid SysUserFindPwdByPhoneParam sysUserFindPwdByPhoneParam) { + sysUserService.findPasswordByPhone(sysUserFindPwdByPhoneParam); + return CommonResult.ok(); + } + + /** + * 通过邮箱找回用户密码 + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 5) + @ApiOperation("通过邮箱找回用户密码") + @CommonLog("通过邮箱找回用户密码") + @PostMapping("/sys/userCenter/findPasswordByEmail") + public CommonResult findPasswordByEmail(@RequestBody @Valid SysUserFindPwdByEmailParam sysUserFindPwdByEmailParam) { + sysUserService.findPasswordByEmail(sysUserFindPwdByEmailParam); + return CommonResult.ok(); + } + + /** + * 修改用户密码 + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 6) + @ApiOperation("修改用户密码") + @CommonLog("修改用户密码") + @PostMapping("/sys/userCenter/updatePassword") + public CommonResult updatePassword(@RequestBody @Valid SysUserUpdatePwdParam sysUserUpdatePwdParam) { + sysUserService.updatePassword(sysUserUpdatePwdParam); + return CommonResult.ok(); + } + + /** + * 修改用户头像 + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 7) + @ApiOperation("修改用户头像") + @CommonLog("修改用户头像") + @PostMapping("/sys/userCenter/updateAvatar") + public CommonResult updateAvatar(@RequestPart("file") @ApiParam(value="文件", required = true) MultipartFile file) { + return CommonResult.data(sysUserService.updateAvatar(file)); + } + + /** + * 修改用户签名图片 + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 8) + @ApiOperation("修改用户签名图片") + @CommonLog("修改用户签名图片") + @PostMapping("/sys/userCenter/updateSignature") + public CommonResult updateSignature(@RequestBody @Valid SysUserSignatureParam sysUserSignatureParam) { + sysUserService.updateSignature(sysUserSignatureParam); + return CommonResult.ok(); + } + + /** + * 获取登录用户的菜单 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 9) + @ApiOperation("获取登录用户的菜单") + @GetMapping("/sys/userCenter/loginMenu") + public CommonResult>> loginMenu() { + SysUserIdParam sysUserIdParam = new SysUserIdParam(); + sysUserIdParam.setId(StpUtil.getLoginIdAsString()); + return CommonResult.data(sysUserService.ownMenu(sysUserIdParam)); + } + + /** + * 获取登录用户组织树 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 10) + @ApiOperation("获取登录用户组织树") + @GetMapping("/sys/userCenter/loginOrgTree") + public CommonResult>> loginOrgTree() { + SysUserIdParam sysUserIdParam = new SysUserIdParam(); + sysUserIdParam.setId(StpUtil.getLoginIdAsString()); + return CommonResult.data(sysUserService.loginOrgTree(sysUserIdParam)); + } + + /** + * 获取登录用户的职位信息 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 11) + @ApiOperation("获取登录用户的职位信息") + @GetMapping("/sys/userCenter/loginPositionInfo") + public CommonResult> loginPositionInfo() { + SysUserIdParam sysUserIdParam = new SysUserIdParam(); + sysUserIdParam.setId(StpUtil.getLoginIdAsString()); + return CommonResult.data(sysUserService.loginPositionInfo(sysUserIdParam)); + } + + /** + * 编辑个人信息 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 12) + @ApiOperation("编辑个人信息") + @CommonLog("编辑个人信息") + @PostMapping("/sys/userCenter/updateUserInfo") + public CommonResult updateUserInfo(@RequestBody @Valid SysUserUpdateInfoParam sysUserUpdateInfoParam) { + sysUserService.updateUserInfo(sysUserUpdateInfoParam); + return CommonResult.ok(); + } + + /** + * 编辑个人工作台 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 13) + @ApiOperation("编辑个人工作台") + @CommonLog("编辑个人工作台") + @PostMapping("/sys/userCenter/updateUserWorkbench") + public CommonResult updateUserWorkbench(@RequestBody @Valid SysUserUpdateWorkbenchParam sysUserUpdateWorkbenchParam) { + sysUserService.updateUserWorkbench(sysUserUpdateWorkbenchParam); + return CommonResult.ok(); + } + + /** + * 获取登录用户的工作台 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 14) + @ApiOperation("获取登录用户的工作台") + @GetMapping("/sys/userCenter/loginWorkbench") + public CommonResult loginWorkbench() { + SysUserIdParam sysUserIdParam = new SysUserIdParam(); + sysUserIdParam.setId(StpUtil.getLoginIdAsString()); + return CommonResult.data(sysUserService.loginWorkbench(sysUserIdParam)); + } + + /** + * 获取登录用户的站内信分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 15) + @ApiOperation("获取登录用户的站内信分页") + @GetMapping("/sys/userCenter/loginUnreadMessagePage") + public CommonResult> loginMessagePage(SysUserMessagePageParam sysUserMessagePageParam) { + return CommonResult.data(sysUserService.loginMessagePage(sysUserMessagePageParam)); + } + + /** + * 读取登录用户站内信详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 16) + @ApiOperation("读取登录用户站内信详情") + @GetMapping("/sys/userCenter/loginUnreadMessageDetail") + public CommonResult loginMessageDetail(@Valid SysUserMessageIdParam sysUserMessageIdParam) { + return CommonResult.data(sysUserService.loginMessageDetail(sysUserMessageIdParam)); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/controller/SysUserController.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/controller/SysUserController.java new file mode 100644 index 00000000..f3a4db7c --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/controller/SysUserController.java @@ -0,0 +1,304 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.controller; + +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.annotation.CommonWrapper; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.pojo.CommonValidList; +import vip.xiaonuo.sys.modular.org.entity.SysOrg; +import vip.xiaonuo.sys.modular.position.entity.SysPosition; +import vip.xiaonuo.sys.modular.role.entity.SysRole; +import vip.xiaonuo.sys.modular.user.entity.SysUser; +import vip.xiaonuo.sys.modular.user.param.*; +import vip.xiaonuo.sys.modular.user.result.SysUserResult; +import vip.xiaonuo.sys.modular.user.service.SysUserService; +import vip.xiaonuo.sys.modular.user.wrapper.SysUserResultWrapperImpl; +import vip.xiaonuo.sys.modular.user.wrapper.SysUserWrapperImpl; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import java.io.IOException; +import java.util.List; + +/** + * 用户控制器 + * + * @author xuyuxiang + * @date 2022/4/22 9:34 + **/ +@Api(tags = "用户控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 9) +@RestController +@Validated +public class SysUserController { + + @Resource + private SysUserService sysUserService; + + /** + * 获取用户分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("获取用户分页") + @CommonWrapper(SysUserResultWrapperImpl.class) + @GetMapping("/sys/user/page") + public CommonResult> page(SysUserPageParam sysUserPageParam) { + return CommonResult.data(sysUserService.page(sysUserPageParam)); + } + + /** + * 添加用户 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("添加用户") + @CommonLog("添加用户") + @PostMapping("/sys/user/add") + public CommonResult add(@RequestBody @Valid SysUserAddParam sysUserAddParam) { + sysUserService.add(sysUserAddParam); + return CommonResult.ok(); + } + + /** + * 编辑用户 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("编辑用户") + @CommonLog("编辑用户") + @PostMapping("/sys/user/edit") + public CommonResult edit(@RequestBody @Valid SysUserEditParam sysUserEditParam) { + sysUserService.edit(sysUserEditParam); + return CommonResult.ok(); + } + + /** + * 删除用户 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 4) + @ApiOperation("删除用户") + @CommonLog("删除用户") + @PostMapping("/sys/user/delete") + public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList sysUserIdParamList) { + sysUserService.delete(sysUserIdParamList); + return CommonResult.ok(); + } + + /** + * 获取用户详情 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 5) + @ApiOperation("获取用户详情") + @CommonWrapper(SysUserWrapperImpl.class) + @GetMapping("/sys/user/detail") + public CommonResult detail(@Valid SysUserIdParam sysUserIdParam) { + return CommonResult.data(sysUserService.detail(sysUserIdParam)); + } + + /** + * 禁用用户 + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 6) + @ApiOperation("禁用用户") + @CommonLog("禁用用户") + @PostMapping("/sys/user/disableUser") + public CommonResult disableUser(@RequestBody SysUserIdParam sysUserIdParam) { + sysUserService.disableUser(sysUserIdParam); + return CommonResult.ok(); + } + + /** + * 启用用户 + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 7) + @ApiOperation("启用用户") + @CommonLog("启用用户") + @PostMapping("/sys/user/enableUser") + public CommonResult enableUser(@RequestBody @Valid SysUserIdParam sysUserIdParam) { + sysUserService.enableUser(sysUserIdParam); + return CommonResult.ok(); + } + + /** + * 重置用户密码 + * + * @author xuyuxiang + * @date 2021/10/13 14:01 + **/ + @ApiOperationSupport(order = 8) + @ApiOperation("重置用户密码") + @CommonLog("重置用户密码") + @PostMapping("/sys/user/resetPassword") + public CommonResult resetPassword(@RequestBody @Valid SysUserIdParam sysUserIdParam) { + sysUserService.resetPassword(sysUserIdParam); + return CommonResult.ok(); + } + + /** + * 用户拥有角色 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 9) + @ApiOperation("获取用户拥有角色") + @GetMapping("/sys/user/ownRole") + public CommonResult> ownRole(@Valid SysUserIdParam sysUserIdParam) { + return CommonResult.data(sysUserService.ownRole(sysUserIdParam)); + } + + /** + * 给用户授权角色 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 10) + @ApiOperation("给用户授权角色") + @CommonLog("给用户授权角色") + @PostMapping("/sys/user/grantRole") + public CommonResult grantRole(@RequestBody @Valid SysUserGrantRoleParam sysUserGrantRoleParam) { + sysUserService.grantRole(sysUserGrantRoleParam); + return CommonResult.ok(); + } + + /** + * 用户导入 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 11) + @ApiOperation("用户导入") + @CommonLog("用户导入") + @PostMapping("/sys/user/import") + public CommonResult importUser(@RequestPart("file") @ApiParam(value="文件", required = true) MultipartFile file) { + sysUserService.importUser(file); + return CommonResult.ok(); + } + + /** + * 用户导出 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 12) + @ApiOperation("用户导出") + @CommonLog("用户导出") + @GetMapping(value = "/sys/user/export", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) + public void exportUser(SysUserExportParam sysUserExportParam, HttpServletResponse response) throws IOException { + sysUserService.exportUser(sysUserExportParam, response); + } + + /* ====用户部分所需要用到的选择器==== */ + + /** + * 获取组织树选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 13) + @ApiOperation("获取组织树选择器") + @GetMapping("/sys/user/orgTreeSelector") + public CommonResult>> orgTreeSelector() { + return CommonResult.data(sysUserService.orgTreeSelector()); + } + + /** + * 获取组织列表选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 14) + @ApiOperation("获取组织列表选择器") + @GetMapping("/sys/user/orgListSelector") + public CommonResult> orgListSelector(SysUserSelectorOrgListParam sysUserSelectorOrgListParam) { + return CommonResult.data(sysUserService.orgListSelector(sysUserSelectorOrgListParam)); + } + + /** + * 获取职位选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 15) + @ApiOperation("获取职位选择器") + @GetMapping("/sys/user/positionSelector") + public CommonResult> positionSelector(SysUserSelectorPositionParam sysUserSelectorPositionParam) { + return CommonResult.data(sysUserService.positionSelector(sysUserSelectorPositionParam)); + } + + /** + * 获取角色选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 16) + @ApiOperation("获取角色选择器") + @GetMapping("/sys/user/roleSelector") + public CommonResult> roleSelector(SysUserSelectorRoleParam sysUserSelectorRoleParam) { + return CommonResult.data(sysUserService.roleSelector(sysUserSelectorRoleParam)); + } + + /** + * 获取用户选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 17) + @ApiOperation("获取用户选择器") + @GetMapping("/sys/user/userSelector") + public CommonResult> userSelector(SysUserSelectorUserParam sysUserSelectorUserParam) { + return CommonResult.data(sysUserService.userSelector(sysUserSelectorUserParam)); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/entity/SysUser.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/entity/SysUser.java new file mode 100644 index 00000000..64d9f86a --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/entity/SysUser.java @@ -0,0 +1,256 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.entity; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import vip.xiaonuo.common.pojo.CommonEntity; + +import java.util.Date; + +/** + * 用户实体 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +@TableName("SYS_USER") +public class SysUser extends CommonEntity { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 头像 */ + @ApiModelProperty(value = "头像", position = 2) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String avatar; + + /** 签名 */ + @ApiModelProperty(value = "签名", position = 3) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String signature; + + /** 账号 */ + @ApiModelProperty(value = "账号", position = 4) + private String account; + + /** 密码 */ + @ApiModelProperty(value = "密码", position = 5) + private String password; + + /** 姓名 */ + @ApiModelProperty(value = "姓名", position = 6) + private String name; + + /** 昵称 */ + @ApiModelProperty(value = "昵称", position = 7) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String nickname; + + /** 性别 */ + @ApiModelProperty(value = "性别", position = 8) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String gender; + + /** 年龄 */ + @ApiModelProperty(value = "年龄", position = 9) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String age; + + /** 出生日期 */ + @ApiModelProperty(value = "出生日期", position = 10) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String birthday; + + /** 民族 */ + @ApiModelProperty(value = "民族", position = 11) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String nation; + + /** 籍贯 */ + @ApiModelProperty(value = "籍贯", position = 12) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String nativePlace; + + /** 家庭住址 */ + @ApiModelProperty(value = "家庭住址", position = 13) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String homeAddress; + + /** 通信地址 */ + @ApiModelProperty(value = "通信地址", position = 14) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String mailingAddress; + + /** 证件类型 */ + @ApiModelProperty(value = "证件类型", position = 15) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String idCardType; + + /** 证件号码 */ + @ApiModelProperty(value = "证件号码", position = 16) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String idCardNumber; + + /** 文化程度 */ + @ApiModelProperty(value = "文化程度", position = 17) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String cultureLevel; + + /** 政治面貌 */ + @ApiModelProperty(value = "政治面貌", position = 18) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String politicalOutlook; + + /** 毕业院校 */ + @ApiModelProperty(value = "毕业院校", position = 19) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String college; + + /** 学历 */ + @ApiModelProperty(value = "学历", position = 20) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String education; + + /** 学制 */ + @ApiModelProperty(value = "学制", position = 21) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String eduLength; + + /** 学位 */ + @ApiModelProperty(value = "学位", position = 22) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String degree; + + /** 手机 */ + @ApiModelProperty(value = "手机", position = 23) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String phone; + + /** 邮箱 */ + @ApiModelProperty(value = "邮箱", position = 24) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String email; + + /** 家庭电话 */ + @ApiModelProperty(value = "家庭电话", position = 25) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String homeTel; + + /** 办公电话 */ + @ApiModelProperty(value = "办公电话", position = 26) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String officeTel; + + /** 紧急联系人 */ + @ApiModelProperty(value = "紧急联系人", position = 27) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String emergencyContact; + + /** 紧急联系人电话 */ + @ApiModelProperty(value = "紧急联系人电话", position = 28) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String emergencyPhone; + + /** 紧急联系人地址 */ + @ApiModelProperty(value = "紧急联系人地址", position = 29) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String emergencyAddress; + + /** 员工编号 */ + @ApiModelProperty(value = "员工编号", position = 30) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String empNo; + + /** 入职日期 */ + @ApiModelProperty(value = "入职日期", position = 31) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String entryDate; + + /** 组织id */ + @ApiModelProperty(value = "组织id", position = 32) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String orgId; + + /** 职位id */ + @ApiModelProperty(value = "职位id", position = 33) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String positionId; + + /** 职级 */ + @ApiModelProperty(value = "职级", position = 34) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String positionLevel; + + /** 主管id */ + @ApiModelProperty(value = "主管id", position = 35) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String directorId; + + /** 兼任信息 */ + @ApiModelProperty(value = "兼任信息", position = 36) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String positionJson; + + /** 上次登录ip */ + @ApiModelProperty(value = "上次登录ip", position = 37) + private String lastLoginIp; + + /** 上次登录地点 */ + @ApiModelProperty(value = "上次登录地点", position = 38) + private String lastLoginAddress; + + /** 上次登录时间 */ + @ApiModelProperty(value = "上次登录时间", position = 39) + private Date lastLoginTime; + + /** 上次登录设备 */ + @ApiModelProperty(value = "上次登录设备", position = 40) + private String lastLoginDevice; + + /** 最新登录ip */ + @ApiModelProperty(value = "最新登录ip", position = 41) + private String latestLoginIp; + + /** 最新登录地点 */ + @ApiModelProperty(value = "最新登录地点", position = 42) + private String latestLoginAddress; + + /** 最新登录时间 */ + @ApiModelProperty(value = "最新登录时间", position = 43) + private Date latestLoginTime; + + /** 最新登录设备 */ + @ApiModelProperty(value = "最新登录设备", position = 44) + private String latestLoginDevice; + + /** 用户状态 */ + @ApiModelProperty(value = "用户状态", position = 45) + private String userStatus; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 46) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 47) + @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/enums/SysUserStatusEnum.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/enums/SysUserStatusEnum.java new file mode 100644 index 00000000..39b0cb8d --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/enums/SysUserStatusEnum.java @@ -0,0 +1,49 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.enums; + +import lombok.Getter; +import vip.xiaonuo.common.exception.CommonException; + +/** + * 用户状态枚举 + * + * @author xuyuxiang + * @date 2022/4/27 21:47 + */ +@Getter +public enum SysUserStatusEnum { + + /** + * 正常 + */ + ENABLE("ENABLE"), + + /** + * 停用 + */ + DISABLED("DISABLED"); + + private final String value; + + SysUserStatusEnum(String value) { + this.value = value; + } + + public static void validate(String value) { + boolean flag = ENABLE.getValue().equals(value) || DISABLED.getValue().equals(value); + if(!flag) { + throw new CommonException("不支持的用户状态:{}", value); + } + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/mapper/SysUserMapper.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/mapper/SysUserMapper.java new file mode 100644 index 00000000..bf1c898e --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/mapper/SysUserMapper.java @@ -0,0 +1,48 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import vip.xiaonuo.sys.modular.user.entity.SysUser; +import vip.xiaonuo.sys.modular.user.result.SysUserExportResult; +import vip.xiaonuo.sys.modular.user.result.SysUserResult; + +import java.util.List; + +/** + * 用户Mapper接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:37 + **/ +public interface SysUserMapper extends BaseMapper { + + /** + * 获取用户分页列表 + * + * @author xuyuxiang + * @date 2022/7/8 13:27 + **/ + Page page(@Param("page") Page page, @Param("ew") QueryWrapper queryWrapper); + + /** + * 获取要导出的用户列表 + * + * @author xuyuxiang + * @date 2022/7/8 13:27 + **/ + List exportList(@Param("ew") QueryWrapper queryWrapper); +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/mapper/mapping/SysUserMapper.xml b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/mapper/mapping/SysUserMapper.xml new file mode 100644 index 00000000..d50478aa --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/mapper/mapping/SysUserMapper.xml @@ -0,0 +1,32 @@ + + + + + + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserAddParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserAddParam.java new file mode 100644 index 00000000..ade0e7d2 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserAddParam.java @@ -0,0 +1,178 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 用户添加参数 + * + * @author xuyuxiang + * @date 2022/7/26 15:36 + **/ +@Getter +@Setter +public class SysUserAddParam { + + /** 账号 */ + @ApiModelProperty(value = "账号", required = true, position = 1) + @NotBlank(message = "account不能为空") + private String account; + + /** 姓名 */ + @ApiModelProperty(value = "姓名", required = true, position = 2) + @NotBlank(message = "name不能为空") + private String name; + + /** 组织id */ + @ApiModelProperty(value = "组织id", required = true, position = 3) + @NotBlank(message = "orgId不能为空") + private String orgId; + + /** 职位id */ + @ApiModelProperty(value = "职位id", required = true, position = 4) + @NotBlank(message = "positionId不能为空") + private String positionId; + + /** 职级 */ + @ApiModelProperty(value = "职级", position = 5) + private String positionLevel; + + /** 主管id */ + @ApiModelProperty(value = "主管id", position = 6) + private String directorId; + + /** 头像 */ + @ApiModelProperty(value = "头像,图片base64", position = 7) + private String avatar; + + /** 签名 */ + @ApiModelProperty(value = "签名,图片base64", position = 8) + private String signature; + + /** 昵称 */ + @ApiModelProperty(value = "昵称", position = 9) + private String nickname; + + /** 性别 */ + @ApiModelProperty(value = "性别", position = 10) + private String gender; + + /** 年龄 */ + @ApiModelProperty(value = "年龄", position = 11) + private String age; + + /** 出生日期 */ + @ApiModelProperty(value = "出生日期", position = 12) + private String birthday; + + /** 民族 */ + @ApiModelProperty(value = "民族", position = 13) + private String nation; + + /** 籍贯 */ + @ApiModelProperty(value = "籍贯", position = 14) + private String nativePlace; + + /** 家庭住址 */ + @ApiModelProperty(value = "家庭住址", position = 15) + private String homeAddress; + + /** 通信地址 */ + @ApiModelProperty(value = "通信地址", position = 16) + private String mailingAddress; + + /** 证件类型 */ + @ApiModelProperty(value = "证件类型", position = 17) + private String idCardType; + + /** 证件号码 */ + @ApiModelProperty(value = "证件号码", position = 18) + private String idCardNumber; + + /** 文化程度 */ + @ApiModelProperty(value = "文化程度", position = 19) + private String cultureLevel; + + /** 政治面貌 */ + @ApiModelProperty(value = "政治面貌", position = 20) + private String politicalOutlook; + + /** 毕业院校 */ + @ApiModelProperty(value = "毕业院校", position = 21) + private String college; + + /** 学历 */ + @ApiModelProperty(value = "学历", position = 22) + private String education; + + /** 学制 */ + @ApiModelProperty(value = "学制", position = 23) + private String eduLength; + + /** 学位 */ + @ApiModelProperty(value = "学位", position = 24) + private String degree; + + /** 手机 */ + @ApiModelProperty(value = "手机", position = 25) + private String phone; + + /** 邮箱 */ + @ApiModelProperty(value = "邮箱", position = 26) + private String email; + + /** 家庭电话 */ + @ApiModelProperty(value = "家庭电话", position = 27) + private String homeTel; + + /** 办公电话 */ + @ApiModelProperty(value = "办公电话", position = 28) + private String officeTel; + + /** 紧急联系人 */ + @ApiModelProperty(value = "紧急联系人", position = 29) + private String emergencyContact; + + /** 紧急联系人电话 */ + @ApiModelProperty(value = "紧急联系人电话", position = 30) + private String emergencyPhone; + + /** 紧急联系人地址 */ + @ApiModelProperty(value = "紧急联系人地址", position = 31) + private String emergencyAddress; + + /** 员工编号 */ + @ApiModelProperty(value = "员工编号", position = 32) + private String empNo; + + /** 入职日期 */ + @ApiModelProperty(value = "员工编号", position = 33) + private String entryDate; + + /** 兼任信息 */ + @ApiModelProperty(value = "兼任信息", position = 34) + private String positionJson; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 35) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 36) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserEditParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserEditParam.java new file mode 100644 index 00000000..3e7158ac --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserEditParam.java @@ -0,0 +1,183 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 用户编辑参数 + * + * @author xuyuxiang + * @date 2022/7/26 15:43 + **/ +@Getter +@Setter +public class SysUserEditParam { + + /** id */ + @ApiModelProperty(value = "id", required = true, position = 1) + @NotBlank(message = "id不能为空") + private String id; + + /** 账号 */ + @ApiModelProperty(value = "账号", required = true, position = 2) + @NotBlank(message = "account不能为空") + private String account; + + /** 姓名 */ + @ApiModelProperty(value = "姓名", required = true, position = 3) + @NotBlank(message = "name不能为空") + private String name; + + /** 组织id */ + @ApiModelProperty(value = "组织id", required = true, position = 4) + @NotBlank(message = "orgId不能为空") + private String orgId; + + /** 职位id */ + @ApiModelProperty(value = "职位id", required = true, position = 5) + @NotBlank(message = "positionId不能为空") + private String positionId; + + /** 职级 */ + @ApiModelProperty(value = "职级", position = 6) + private String positionLevel; + + /** 主管id */ + @ApiModelProperty(value = "主管id", position = 7) + private String directorId; + + /** 头像 */ + @ApiModelProperty(value = "头像,图片base64", position = 8) + private String avatar; + + /** 签名 */ + @ApiModelProperty(value = "签名,图片base64", position = 9) + private String signature; + + /** 昵称 */ + @ApiModelProperty(value = "昵称", position = 10) + private String nickname; + + /** 性别 */ + @ApiModelProperty(value = "性别", position = 11) + private String gender; + + /** 年龄 */ + @ApiModelProperty(value = "年龄", position = 12) + private String age; + + /** 出生日期 */ + @ApiModelProperty(value = "出生日期", position = 13) + private String birthday; + + /** 民族 */ + @ApiModelProperty(value = "民族", position = 14) + private String nation; + + /** 籍贯 */ + @ApiModelProperty(value = "籍贯", position = 15) + private String nativePlace; + + /** 家庭住址 */ + @ApiModelProperty(value = "家庭住址", position = 16) + private String homeAddress; + + /** 通信地址 */ + @ApiModelProperty(value = "通信地址", position = 17) + private String mailingAddress; + + /** 证件类型 */ + @ApiModelProperty(value = "证件类型", position = 18) + private String idCardType; + + /** 证件号码 */ + @ApiModelProperty(value = "证件号码", position = 19) + private String idCardNumber; + + /** 文化程度 */ + @ApiModelProperty(value = "文化程度", position = 20) + private String cultureLevel; + + /** 政治面貌 */ + @ApiModelProperty(value = "政治面貌", position = 21) + private String politicalOutlook; + + /** 毕业院校 */ + @ApiModelProperty(value = "毕业院校", position = 22) + private String college; + + /** 学历 */ + @ApiModelProperty(value = "学历", position = 23) + private String education; + + /** 学制 */ + @ApiModelProperty(value = "学制", position = 24) + private String eduLength; + + /** 学位 */ + @ApiModelProperty(value = "学位", position = 25) + private String degree; + + /** 手机 */ + @ApiModelProperty(value = "手机", position = 26) + private String phone; + + /** 邮箱 */ + @ApiModelProperty(value = "邮箱", position = 27) + private String email; + + /** 家庭电话 */ + @ApiModelProperty(value = "家庭电话", position = 28) + private String homeTel; + + /** 办公电话 */ + @ApiModelProperty(value = "办公电话", position = 29) + private String officeTel; + + /** 紧急联系人 */ + @ApiModelProperty(value = "紧急联系人", position = 30) + private String emergencyContact; + + /** 紧急联系人电话 */ + @ApiModelProperty(value = "紧急联系人电话", position = 31) + private String emergencyPhone; + + /** 紧急联系人地址 */ + @ApiModelProperty(value = "紧急联系人地址", position = 32) + private String emergencyAddress; + + /** 员工编号 */ + @ApiModelProperty(value = "员工编号", position = 33) + private String empNo; + + /** 入职日期 */ + @ApiModelProperty(value = "员工编号", position = 34) + private String entryDate; + + /** 兼任信息 */ + @ApiModelProperty(value = "兼任信息", position = 35) + private String positionJson; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 36) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 37) + private String extJson; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserExportParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserExportParam.java new file mode 100644 index 00000000..459fa311 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserExportParam.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 用户导出参数 + * + * @author xuyuxiang + * @date 2022/7/26 16:00 + **/ +@Getter +@Setter +public class SysUserExportParam { + + /** 用户状态 */ + @ApiModelProperty(value = "用户状态") + private String userStatus; + + /** 账号、姓名、手机号关键词 */ + @ApiModelProperty(value = "账号、姓名、手机号关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserFindPwdByEmailParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserFindPwdByEmailParam.java new file mode 100644 index 00000000..c0c8c674 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserFindPwdByEmailParam.java @@ -0,0 +1,50 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 用户找回密码参数 + * + * @author xuyuxiang + * @date 2022/7/26 16:04 + **/ +@Getter +@Setter +public class SysUserFindPwdByEmailParam { + + /** 邮箱 */ + @ApiModelProperty(value = "邮箱", required = true, position = 1) + @NotBlank(message = "email不能为空") + private String email; + + /** 验证码 */ + @ApiModelProperty(value = "验证码", required = true, position = 2) + @NotBlank(message = "validCode不能为空") + private String validCode; + + /** 验证码请求号 */ + @ApiModelProperty(value = "验证码请求号", required = true, position = 3) + @NotBlank(message = "validCodeReqNo不能为空") + private String validCodeReqNo; + + /** 新密码 */ + @ApiModelProperty(value = "新密码", required = true, position = 4) + @NotBlank(message = "newPassword不能为空") + private String newPassword; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserFindPwdByPhoneParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserFindPwdByPhoneParam.java new file mode 100644 index 00000000..b2ee9700 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserFindPwdByPhoneParam.java @@ -0,0 +1,50 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 用户找回密码参数 + * + * @author xuyuxiang + * @date 2022/7/26 16:04 + **/ +@Getter +@Setter +public class SysUserFindPwdByPhoneParam { + + /** 手机号 */ + @ApiModelProperty(value = "手机号", required = true, position = 1) + @NotBlank(message = "phone不能为空") + private String phone; + + /** 验证码 */ + @ApiModelProperty(value = "验证码", required = true, position = 2) + @NotBlank(message = "validCode不能为空") + private String validCode; + + /** 验证码请求号 */ + @ApiModelProperty(value = "验证码请求号", required = true, position = 3) + @NotBlank(message = "validCodeReqNo不能为空") + private String validCodeReqNo; + + /** 新密码 */ + @ApiModelProperty(value = "新密码", required = true, position = 4) + @NotBlank(message = "newPassword不能为空") + private String newPassword; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserGetEmailValidCodeParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserGetEmailValidCodeParam.java new file mode 100644 index 00000000..19fe4175 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserGetEmailValidCodeParam.java @@ -0,0 +1,45 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 获取邮箱验证码参数 + * + * @author xuyuxiang + * @date 2022/8/25 13:45 + **/ +@Getter +@Setter +public class SysUserGetEmailValidCodeParam { + + /** 邮箱 */ + @ApiModelProperty(value = "邮箱", required = true, position = 1) + @NotBlank(message = "邮箱不能为空") + private String email; + + /** 验证码 */ + @ApiModelProperty(value = "验证码", required = true, position = 2) + @NotBlank(message = "验证码不能为空") + private String validCode; + + /** 验证码请求号 */ + @ApiModelProperty(value = "验证码请求号", required = true, position = 3) + @NotBlank(message = "验证码请求号不能为空") + private String validCodeReqNo; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserGetPhoneValidCodeParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserGetPhoneValidCodeParam.java new file mode 100644 index 00000000..2185a753 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserGetPhoneValidCodeParam.java @@ -0,0 +1,45 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 获取手机验证码参数 + * + * @author xuyuxiang + * @date 2022/8/25 13:45 + **/ +@Getter +@Setter +public class SysUserGetPhoneValidCodeParam { + + /** 手机号 */ + @ApiModelProperty(value = "手机号", required = true, position = 1) + @NotBlank(message = "手机号不能为空") + private String phone; + + /** 验证码 */ + @ApiModelProperty(value = "验证码", required = true, position = 2) + @NotBlank(message = "验证码不能为空") + private String validCode; + + /** 验证码请求号 */ + @ApiModelProperty(value = "验证码请求号", required = true, position = 3) + @NotBlank(message = "验证码请求号不能为空") + private String validCodeReqNo; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserGrantRoleParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserGrantRoleParam.java new file mode 100644 index 00000000..bb3b65dd --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserGrantRoleParam.java @@ -0,0 +1,42 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 用户授权角色参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class SysUserGrantRoleParam { + + /** id */ + @ApiModelProperty(value = "id", required = true, position = 1) + @NotBlank(message = "id不能为空") + private String id; + + /** 角色id集合 */ + @ApiModelProperty(value = "角色id集合", required = true, position = 2) + @NotNull(message = "roleIdList不能为空") + private List roleIdList; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserIdParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserIdParam.java new file mode 100644 index 00000000..1c4a9758 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 用户Id参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class SysUserIdParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserMessageIdParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserMessageIdParam.java new file mode 100644 index 00000000..15b33382 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserMessageIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 站内信Id参数 + * + * @author xuyuxiang + * @date 2022/9/2 11:06 + */ +@Getter +@Setter +public class SysUserMessageIdParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserMessagePageParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserMessagePageParam.java new file mode 100644 index 00000000..ea88e0d4 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserMessagePageParam.java @@ -0,0 +1,48 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 站内信分页参数 + * + * @author xuyuxiang + * @date 2022/9/2 11:06 + */ +@Getter +@Setter +public class SysUserMessagePageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 站内信分类 */ + @ApiModelProperty(value = "站内信分类") + private String category; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserPageParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserPageParam.java new file mode 100644 index 00000000..f60daa75 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserPageParam.java @@ -0,0 +1,56 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 用户查询参数 + * + * @author xuyuxiang + * @date 2022/7/26 16:00 + **/ +@Getter +@Setter +public class SysUserPageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 账号、姓名关键词 */ + @ApiModelProperty(value = "账号、姓名关键词") + private String searchKey; + + /** 用户状态 */ + @ApiModelProperty(value = "用户状态") + private String userStatus; + + /** 所属组织 */ + @ApiModelProperty(value = "所属组织") + private String orgId; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserSelectorOrgListParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserSelectorOrgListParam.java new file mode 100644 index 00000000..fc3a03dd --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserSelectorOrgListParam.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 组织列表选择器参数 + * + * @author xuyuxiang + * @date 2022/4/21 16:13 + **/ +@Getter +@Setter +public class SysUserSelectorOrgListParam { + + /** 父id */ + @ApiModelProperty(value = "父id") + private String parentId; + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserSelectorPositionParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserSelectorPositionParam.java new file mode 100644 index 00000000..e60a0864 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserSelectorPositionParam.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 职位选择器参数 + * + * @author xuyuxiang + * @date 2022/7/26 15:58 + **/ +@Getter +@Setter +public class SysUserSelectorPositionParam { + + /** 组织id */ + @ApiModelProperty(value = "组织id") + private String orgId; + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserSelectorRoleParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserSelectorRoleParam.java new file mode 100644 index 00000000..097e7ae8 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserSelectorRoleParam.java @@ -0,0 +1,40 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 角色选择器参数 + * + * @author xuyuxiang + * @date 2022/7/26 16:02 + **/ +@Getter +@Setter +public class SysUserSelectorRoleParam { + + /** 组织id */ + @ApiModelProperty(value = "组织id", position = 1) + private String orgId; + + /** 角色分类 */ + @ApiModelProperty(value = "角色分类") + private String category; + + /** 名称关键词 */ + @ApiModelProperty(value = "名称关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserSelectorUserParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserSelectorUserParam.java new file mode 100644 index 00000000..bf5ad620 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserSelectorUserParam.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 用户选择器参数 + * + * @author xuyuxiang + * @date 2022/7/26 16:03 + **/ +@Getter +@Setter +public class SysUserSelectorUserParam { + + /** 组织id */ + @ApiModelProperty(value = "组织id") + private String orgId; + + /** 姓名关键词 */ + @ApiModelProperty(value = "姓名关键词") + private String searchKey; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserSignatureParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserSignatureParam.java new file mode 100644 index 00000000..3b3bf66c --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserSignatureParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 用户修改签名图片接口 + * + * @author yubaoshan + * @date 2022/9/7 23:12 + **/ +@Getter +@Setter +public class SysUserSignatureParam { + + /** 签名图片base64编码 */ + @ApiModelProperty(value = "signature", required = true) + @NotBlank(message = "signature签名图片不能为空") + private String signature; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserUpdateInfoParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserUpdateInfoParam.java new file mode 100644 index 00000000..eb0d5719 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserUpdateInfoParam.java @@ -0,0 +1,64 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 编辑个人信息参数 + * + * @author xuyuxiang + * @date 2022/7/27 17:08 + **/ +@Getter +@Setter +public class SysUserUpdateInfoParam { + + /** id */ + @ApiModelProperty(value = "id", required = true, position = 1) + @NotBlank(message = "id不能为空") + private String id; + + /** 姓名 */ + @ApiModelProperty(value = "姓名", required = true, position = 2) + @NotBlank(message = "name不能为空") + private String name; + + /** 手机 */ + @ApiModelProperty(value = "手机", position = 3) + private String phone; + + /** 昵称 */ + @ApiModelProperty(value = "昵称", position = 4) + private String nickname; + + /** 性别 */ + @ApiModelProperty(value = "性别", position = 5) + private String gender; + + /** 出生日期 */ + @ApiModelProperty(value = "出生日期", position = 6) + private String birthday; + + /** 邮箱 */ + @ApiModelProperty(value = "邮箱", position = 7) + private String email; + + /** 签名 */ + @ApiModelProperty(value = "签名,图片base64", position = 8) + private String signature; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserUpdatePwdParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserUpdatePwdParam.java new file mode 100644 index 00000000..2e2e45a1 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserUpdatePwdParam.java @@ -0,0 +1,40 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 用户修改密码参数 + * + * @author xuyuxiang + * @date 2022/7/26 16:04 + **/ +@Getter +@Setter +public class SysUserUpdatePwdParam { + + /** 旧密码 */ + @ApiModelProperty(value = "旧密码", required = true, position = 2) + @NotBlank(message = "password不能为空") + private String password; + + /** 新密码 */ + @ApiModelProperty(value = "新密码", required = true, position = 3) + @NotBlank(message = "newPassword不能为空") + private String newPassword; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserUpdateWorkbenchParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserUpdateWorkbenchParam.java new file mode 100644 index 00000000..4e6de549 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/param/SysUserUpdateWorkbenchParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 编辑个人工作台参数 + * + * @author xuyuxiang + * @date 2022/7/27 17:08 + **/ +@Getter +@Setter +public class SysUserUpdateWorkbenchParam { + + /** 工作台数据 */ + @ApiModelProperty(value = "工作台数据", required = true) + @NotBlank(message = "workbenchData不能为空") + private String workbenchData; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/provider/SysLoginUserApiProvider.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/provider/SysLoginUserApiProvider.java new file mode 100644 index 00000000..efdf4198 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/provider/SysLoginUserApiProvider.java @@ -0,0 +1,160 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.provider; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import org.springframework.stereotype.Service; +import vip.xiaonuo.auth.api.SaBaseLoginUserApi; +import vip.xiaonuo.auth.core.pojo.SaBaseClientLoginUser; +import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser; +import vip.xiaonuo.sys.modular.user.result.SysLoginUser; +import vip.xiaonuo.sys.modular.user.service.SysUserService; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 登录用户API接口实现类 + * + * @author xuyuxiang + * @date 2022/4/29 13:36 + **/ +@Service("loginUserApi") +public class SysLoginUserApiProvider implements SaBaseLoginUserApi { + + @Resource + private SysUserService sysUserService; + + /** + * 根据id获取B端用户信息,查不到则返回null + * + * @author xuyuxiang + * @date 2022/3/10 16:14 + **/ + @Override + public SaBaseLoginUser getUserById(String id) { + return sysUserService.getUserById(id); + } + + /** + * 不实现C端用户信息 + * + * @author xuyuxiang + * @date 2022/3/10 16:14 + **/ + @Override + public SaBaseClientLoginUser getClientUserById(String id) { + return null; + } + + /** + * 根据账号获取B端用户信息,查不到则返回null + * + * @author xuyuxiang + * @date 2021/12/28 15:35 + **/ + @Override + public SysLoginUser getUserByAccount(String account) { + return sysUserService.getUserByAccount(account); + } + + /** + * 不实现C端用户信息 + * + * @author xuyuxiang + * @date 2022/7/8 10:36 + **/ + @Override + public SaBaseClientLoginUser getClientUserByAccount(String account) { + return null; + } + + /** + * 根据手机号获取B端用户信息,查不到则返回null + * + * @author xuyuxiang + * @date 2022/8/25 14:09 + **/ + @Override + public SaBaseLoginUser getUserByPhone(String phone) { + return sysUserService.getUserByPhone(phone); + } + + /** + * 不实现C端用户信息 + * + * @author xuyuxiang + * @date 2022/8/25 14:09 + **/ + @Override + public SaBaseClientLoginUser getClientUserByPhone(String phone) { + return null; + } + + /** + * 根据用户id获取用户集合 + * + * @author xuyuxiang + * @date 2022/4/27 22:53 + */ + @Override + public List listUserByUserIdList(List userIdList) { + return sysUserService.listByIds(userIdList).stream().map(JSONUtil::parseObj).collect(Collectors.toList()); + } + + /** + * 根据用户id获取按钮码集合 + * + * @author xuyuxiang + * @date 2022/4/27 22:54 + */ + @Override + public List getButtonCodeListListByUserId(String userId) { + return sysUserService.getButtonCodeList(userId); + } + + /** + * 根据用户id获取权限集合 + * + * @author xuyuxiang + * @date 2022/4/27 22:54 + */ + @Override + public List getPermissionListByUserId(String userId, String orgId) { + return sysUserService.getPermissionList(userId, orgId); + } + + /** + * 根据用户id获取角色码集合 + * + * @author xuyuxiang + * @date 2022/4/27 22:53 + */ + @Override + public List getRoleCodeListByUserId(String userId) { + return sysUserService.getRoleCodeList(userId); + } + + /** + * 更新用户的登录时间和登录ip等信息 + * + * @author xuyuxiang + * @date 2022/4/27 22:57 + */ + @Override + public void updateUserLoginInfo(String userId, String device) { + sysUserService.updateUserLoginInfo(userId, device); + } +} \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/provider/SysUserApiProvider.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/provider/SysUserApiProvider.java new file mode 100644 index 00000000..53aa4627 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/provider/SysUserApiProvider.java @@ -0,0 +1,146 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.provider; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.stereotype.Service; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.sys.api.SysUserApi; +import vip.xiaonuo.sys.modular.user.entity.SysUser; +import vip.xiaonuo.sys.modular.user.param.SysUserGrantRoleParam; +import vip.xiaonuo.sys.modular.user.param.SysUserIdParam; +import vip.xiaonuo.sys.modular.user.param.SysUserSelectorUserParam; +import vip.xiaonuo.sys.modular.user.service.SysUserService; + +import javax.annotation.Resource; +import java.util.HashSet; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; + +/** + * 用户API接口提供者 + * + * @author xuyuxiang + * @date 2022/6/20 18:24 + **/ +@Service +public class SysUserApiProvider implements SysUserApi { + + @Resource + private SysUserService sysUserService; + + @Override + public JSONObject getUserByIdWithoutException(String userId) { + SysUser sysUser = sysUserService.getById(userId); + if(ObjectUtil.isEmpty(sysUser)) { + return JSONUtil.parseObj(sysUser); + } + return null; + } + + @Override + public List getUserListByIdListWithoutException(List userIdList) { + return sysUserService.listByIds(userIdList).stream().map(JSONUtil::parseObj).collect(Collectors.toList()); + } + + @Override + public JSONObject getUserByIdWithException(String userId) { + return JSONUtil.parseObj(sysUserService.queryEntity(userId)); + } + + @Override + public List getUserListByIdWithException(List userIdList) { + HashSet userIdSet = CollectionUtil.newHashSet(userIdList); + List sysUserList = sysUserService.listByIds(userIdSet); + if(sysUserList.size() != userIdSet.size()) { + throw new CommonException("某用户不存在,id值集合为:{}", userIdSet); + } + return sysUserList.stream().map(JSONUtil::parseObj).collect(Collectors.toList()); + } + + @Override + public List ownRole(String userId) { + SysUserIdParam sysUserIdParam = new SysUserIdParam(); + sysUserIdParam.setId(userId); + return sysUserService.ownRole(sysUserIdParam); + } + + @Override + public void grantRole(String userId, List roleIdList) { + SysUserGrantRoleParam sysUserGrantRoleParam = new SysUserGrantRoleParam(); + sysUserGrantRoleParam.setId(userId); + sysUserGrantRoleParam.setRoleIdList(roleIdList); + sysUserService.grantRole(sysUserGrantRoleParam); + } + + @Override + public List getUserIdListByOrgIdList(List orgIdList) { + if(ObjectUtil.isNotEmpty(orgIdList)) { + return sysUserService.list(new LambdaQueryWrapper().in(SysUser::getOrgId, orgIdList)).stream() + .map(SysUser::getId).collect(Collectors.toList()); + } + return CollectionUtil.newArrayList(); + } + + @Override + public List getUserIdListByPositionIdList(List positionIdList) { + if(ObjectUtil.isNotEmpty(positionIdList)) { + return sysUserService.list(new LambdaQueryWrapper().in(SysUser::getPositionId, positionIdList)).stream() + .map(SysUser::getId).collect(Collectors.toList()); + } + return CollectionUtil.newArrayList(); + } + + @Override + public String getSupervisorIdByUserIdAndOrgIdAndPositionId(String userId, String orgId, String positionId) { + SysUser sysUser = sysUserService.queryEntity(userId); + String userOrgId = sysUser.getOrgId(); + String userPositionId = sysUser.getPositionId(); + String positionJson = sysUser.getPositionJson(); + AtomicReference result = new AtomicReference<>(); + if(ObjectUtil.isAllNotEmpty(userOrgId, userPositionId)) { + if(userOrgId.equals(orgId) && userPositionId.equals(positionId)) { + String directorId = sysUser.getDirectorId(); + if(ObjectUtil.isNotEmpty(directorId)) { + return directorId; + } + } + } + if(ObjectUtil.isNotEmpty(positionJson)) { + JSONUtil.parseArray(positionJson).forEach(object -> { + JSONObject jsonObject = JSONUtil.parseObj(object); + String tempPositionId = jsonObject.getStr("positionId"); + String directorId = jsonObject.getStr("directorId"); + if(ObjectUtil.isNotEmpty(tempPositionId) && tempPositionId.equals(positionId)) { + if(ObjectUtil.isNotEmpty(directorId)) { + result.set(directorId); + } + } + }); + } + return result.get(); + } + + @Override + public List userSelector(String orgId, String searchKey) { + SysUserSelectorUserParam sysUserSelectorUserParam = new SysUserSelectorUserParam(); + sysUserSelectorUserParam.setOrgId(orgId); + sysUserSelectorUserParam.setSearchKey(searchKey); + return sysUserService.userSelector(sysUserSelectorUserParam).stream().map(JSONUtil::parseObj).collect(Collectors.toList()); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysLoginUser.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysLoginUser.java new file mode 100644 index 00000000..2608040e --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysLoginUser.java @@ -0,0 +1,37 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.result; + +import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser; +import vip.xiaonuo.sys.modular.user.enums.SysUserStatusEnum; + +/** + * 登录用户对象 + * + * @author xuyuxiang + * @date 2022/4/21 19:33 + **/ +public class SysLoginUser extends SaBaseLoginUser { + + /** + * 实现是否可以登录 + * + * @author xuyuxiang + * @date 2022/8/15 15:26 + **/ + @Override + public Boolean getEnabled() { + // 仅判断状态是否正常,可自行扩展 + return getUserStatus().equals(SysUserStatusEnum.ENABLE.getValue()); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysUserExportResult.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysUserExportResult.java new file mode 100644 index 00000000..74abe7b2 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysUserExportResult.java @@ -0,0 +1,197 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.result; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +/** + * 用户导出结果集 + * + * @author xuyuxiang + * @date 2022/7/8 13:22 + **/ +@Getter +@Setter +public class SysUserExportResult { + + /** 头像 */ + private String avatar; + + /** 头像字节数组 */ + @Excel(name = "头像", type = 2, imageType = 2) + private byte[] avatarByte; + + /** 账号 */ + @Excel(name = "账号") + private String account; + + /** 姓名 */ + @Excel(name = "姓名") + private String name; + + /** 昵称 */ + @Excel(name = "姓名") + private String nickname; + + /** 性别 */ + @Excel(name = "性别") + private String gender; + + /** 年龄 */ + @Excel(name = "年龄") + private String age; + + /** 出生日期 */ + @Excel(name = "出生日期") + private String birthday; + + /** 民族 */ + @Excel(name = "民族") + private String nation; + + /** 籍贯 */ + @Excel(name = "籍贯") + private String nativePlace; + + /** 家庭住址 */ + @Excel(name = "家庭住址") + private String homeAddress; + + /** 通信地址 */ + @Excel(name = "通信地址") + private String mailingAddress; + + /** 证件类型 */ + @Excel(name = "证件类型") + private String idCardType; + + /** 证件号码 */ + @Excel(name = "证件号码") + private String idCardNumber; + + /** 文化程度 */ + @Excel(name = "文化程度") + private String cultureLevel; + + /** 政治面貌 */ + @Excel(name = "政治面貌") + private String politicalOutlook; + + /** 毕业院校 */ + @Excel(name = "毕业院校") + private String college; + + /** 学历 */ + @Excel(name = "学历") + private String education; + + /** 学制 */ + @Excel(name = "学制") + private String eduLength; + + /** 学位 */ + @Excel(name = "学位") + private String degree; + + /** 手机 */ + @Excel(name = "手机") + private String phone; + + /** 邮箱 */ + @Excel(name = "邮箱") + private String email; + + /** 家庭电话 */ + @Excel(name = "家庭电话") + private String homeTel; + + /** 办公电话 */ + @Excel(name = "办公电话") + private String officeTel; + + /** 紧急联系人 */ + @Excel(name = "紧急联系人") + private String emergencyContact; + + /** 紧急联系人电话 */ + @Excel(name = "紧急联系人电话") + private String emergencyPhone; + + /** 紧急联系人地址 */ + @Excel(name = "紧急联系人地址") + private String emergencyAddress; + + /** 员工编号 */ + @Excel(name = "员工编号") + private String empNo; + + /** 入职日期 */ + @Excel(name = "入职日期") + private String entryDate; + + /** 组织名称 */ + @Excel(name = "组织名称") + private String orgName; + + /** 职位名称 */ + @Excel(name = "职位名称") + private String positionName; + + /** 主管名称 */ + @Excel(name = "主管名称") + private String directorName; + + /** 职级 */ + @Excel(name = "职级") + private String positionLevel; + + /** 上次登录ip */ + @Excel(name = "上次登录ip") + private String lastLoginIp; + + /** 上次登录地点 */ + @Excel(name = "上次登录地点") + private String lastLoginAddress; + + /** 上次登录时间 */ + @Excel(name = "上次登录时间", format = "yyyy-MM-dd HH:mm:ss") + private Date lastLoginTime; + + /** 上次登录设备 */ + @Excel(name = "上次登录设备") + private String lastLoginDevice; + + /** 最新登录ip */ + @Excel(name = "最新登录ip") + private String latestLoginIp; + + /** 最新登录地点 */ + @Excel(name = "最新登录地点") + private String latestLoginAddress; + + /** 最新登录时间 */ + @Excel(name = "最新登录时间", format = "yyyy-MM-dd HH:mm:ss") + private Date latestLoginTime; + + /** 最新登录设备 */ + @Excel(name = "最新登录设备") + private String latestLoginDevice; + + /** 用户状态 */ + @Excel(name = "用户状态", replace = { "正常_ENABLE", "停用_DISABLED" }) + private String userStatus; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysUserMessageDetailResult.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysUserMessageDetailResult.java new file mode 100644 index 00000000..f65fb28a --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysUserMessageDetailResult.java @@ -0,0 +1,77 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * 站内信详情结果 + * + * @author xuyuxiang + * @date 2022/7/31 16:39 + */ +@Getter +@Setter +public class SysUserMessageDetailResult { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 2) + private String category; + + /** 主题 */ + @ApiModelProperty(value = "主题", position = 3) + private String subject; + + /** 正文 */ + @ApiModelProperty(value = "正文", position = 4) + private String content; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 5) + private String extJson; + + /** 接收信息集合 */ + @ApiModelProperty(value = "接收信息集合", position = 6) + private List receiveInfoList; + + /** + * 接收信息类 + * + * @author xuyuxiang + * @date 2022/7/31 16:42 + */ + @Getter + @Setter + public static class DevReceiveInfo { + + /** 接收人ID */ + @ApiModelProperty(value = "接收人ID", position = 1) + private String receiveUserId; + + /** 接收人姓名 */ + @ApiModelProperty(value = "接收人姓名", position = 2) + private String receiveUserName; + + /** 是否已读 */ + @ApiModelProperty(value = "是否已读", position = 3) + private Boolean read; + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysUserMessageResult.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysUserMessageResult.java new file mode 100644 index 00000000..5e850093 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysUserMessageResult.java @@ -0,0 +1,70 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +/** + * 用户未读消息结果 + * + * @author xuyuxiang + * @date 2022/9/6 17:29 + */ +@Getter +@Setter +public class SysUserMessageResult { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 分类 */ + @ApiModelProperty(value = "分类", position = 2) + private String category; + + /** 主题 */ + @ApiModelProperty(value = "主题", position = 3) + private String subject; + + /** 正文 */ + @ApiModelProperty(value = "正文", position = 4) + private String content; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 5) + private String extJson; + + /** 是否已读 */ + @ApiModelProperty(value = "是否已读", position = 6) + private Boolean read; + + /** 创建时间 */ + @ApiModelProperty(value = "创建时间", position = 7) + private Date createTime; + + /** 创建人 */ + @ApiModelProperty(value = "创建人", position = 8) + private String createUser; + + /** 更新时间 */ + @ApiModelProperty(value = "更新时间", position = 9) + private Date updateTime; + + /** 更新人 */ + @ApiModelProperty(value = "更新人", position = 10) + private String updateUser; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysUserPicValidCodeResult.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysUserPicValidCodeResult.java new file mode 100644 index 00000000..40298e42 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysUserPicValidCodeResult.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 图片验证码结果 + * + * @author xuyuxiang + * @date 2022/7/8 9:28 + **/ +@Getter +@Setter +public class SysUserPicValidCodeResult { + + /** 验证码图片,Base64 */ + @ApiModelProperty(value = "验证码图片,Base64", position = 1) + private String validCodeBase64; + + /** 验证码请求号 */ + @ApiModelProperty(value = "验证码请求号", position = 2) + private String validCodeReqNo; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysUserPositionResult.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysUserPositionResult.java new file mode 100644 index 00000000..9827c9f3 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysUserPositionResult.java @@ -0,0 +1,52 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 用户职位信息 + * + * @author xuyuxiang + * @date 2022/8/22 9:00 + **/ +@Getter +@Setter +public class SysUserPositionResult { + + /** 组织id */ + @ApiModelProperty(value = "组织id", position = 1) + private String orgId; + + /** 组织名称 */ + @ApiModelProperty(value = "组织名称", position = 2) + private String orgName; + + /** 职位id */ + @ApiModelProperty(value = "职位id", position = 3) + private String positionId; + + /** 职位名称 */ + @ApiModelProperty(value = "职位名称", position = 4) + private String positionName; + + /** 组织分类 */ + @ApiModelProperty(value = "组织分类", position = 5) + private String category; + + /** 职位类型 */ + @ApiModelProperty(value = "职位类型", position = 6) + private String type; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysUserResult.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysUserResult.java new file mode 100644 index 00000000..6269611d --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysUserResult.java @@ -0,0 +1,224 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +/** + * 用户结果集 + * + * @author xuyuxiang + * @date 2022/7/8 13:22 + **/ +@Getter +@Setter +public class SysUserResult { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 头像 */ + @ApiModelProperty(value = "头像", position = 3) + private String avatar; + + /** 签名 */ + @ApiModelProperty(value = "签名", position = 4) + private String signature; + + /** 账号 */ + @ApiModelProperty(value = "账号", position = 5) + private String account; + + /** 姓名 */ + @ApiModelProperty(value = "姓名", position = 7) + private String name; + + /** 昵称 */ + @ApiModelProperty(value = "昵称", position = 8) + private String nickname; + + /** 性别 */ + @ApiModelProperty(value = "性别", position = 9) + private String gender; + + /** 年龄 */ + @ApiModelProperty(value = "年龄", position = 10) + private String age; + + /** 出生日期 */ + @ApiModelProperty(value = "出生日期", position = 11) + private String birthday; + + /** 民族 */ + @ApiModelProperty(value = "民族", position = 12) + private String nation; + + /** 籍贯 */ + @ApiModelProperty(value = "籍贯", position = 13) + private String nativePlace; + + /** 家庭住址 */ + @ApiModelProperty(value = "家庭住址", position = 14) + private String homeAddress; + + /** 通信地址 */ + @ApiModelProperty(value = "通信地址", position = 15) + private String mailingAddress; + + /** 证件类型 */ + @ApiModelProperty(value = "证件类型", position = 16) + private String idCardType; + + /** 证件号码 */ + @ApiModelProperty(value = "证件号码", position = 17) + private String idCardNumber; + + /** 文化程度 */ + @ApiModelProperty(value = "文化程度", position = 18) + private String cultureLevel; + + /** 政治面貌 */ + @ApiModelProperty(value = "政治面貌", position = 19) + private String politicalOutlook; + + /** 毕业院校 */ + @ApiModelProperty(value = "毕业院校", position = 20) + private String college; + + /** 学历 */ + @ApiModelProperty(value = "学历", position = 21) + private String education; + + /** 学制 */ + @ApiModelProperty(value = "学制", position = 22) + private String eduLength; + + /** 学位 */ + @ApiModelProperty(value = "学位", position = 23) + private String degree; + + /** 手机 */ + @ApiModelProperty(value = "手机", position = 24) + private String phone; + + /** 邮箱 */ + @ApiModelProperty(value = "邮箱", position = 25) + private String email; + + /** 家庭电话 */ + @ApiModelProperty(value = "家庭电话", position = 26) + private String homeTel; + + /** 办公电话 */ + @ApiModelProperty(value = "办公电话", position = 27) + private String officeTel; + + /** 紧急联系人 */ + @ApiModelProperty(value = "紧急联系人", position = 28) + private String emergencyContact; + + /** 紧急联系人电话 */ + @ApiModelProperty(value = "紧急联系人电话", position = 29) + private String emergencyPhone; + + /** 紧急联系人地址 */ + @ApiModelProperty(value = "紧急联系人地址", position = 30) + private String emergencyAddress; + + /** 员工编号 */ + @ApiModelProperty(value = "员工编号", position = 31) + private String empNo; + + /** 入职日期 */ + @ApiModelProperty(value = "入职日期", position = 32) + private String entryDate; + + /** 组织id */ + @ApiModelProperty(value = "组织id", position = 33) + private String orgId; + + /** 职位id */ + @ApiModelProperty(value = "职位id", position = 34) + private String positionId; + + /** 职级 */ + @ApiModelProperty(value = "职级", position = 35) + private String positionLevel; + + /** 主管id */ + @ApiModelProperty(value = "主管id", position = 36) + private String directorId; + + /** 上次登录ip */ + @ApiModelProperty(value = "上次登录ip", position = 37) + private String lastLoginIp; + + /** 上次登录地点 */ + @ApiModelProperty(value = "上次登录地点", position = 38) + private String lastLoginAddress; + + /** 上次登录时间 */ + @ApiModelProperty(value = "上次登录时间", position = 39) + private Date lastLoginTime; + + /** 上次登录设备 */ + @ApiModelProperty(value = "上次登录设备", position = 40) + private String lastLoginDevice; + + /** 最新登录ip */ + @ApiModelProperty(value = "最新登录ip", position = 41) + private String latestLoginIp; + + /** 最新登录地点 */ + @ApiModelProperty(value = "最新登录地点", position = 42) + private String latestLoginAddress; + + /** 最新登录时间 */ + @ApiModelProperty(value = "最新登录时间", position = 43) + private Date latestLoginTime; + + /** 最新登录设备 */ + @ApiModelProperty(value = "最新登录设备", position = 44) + private String latestLoginDevice; + + /** 用户状态 */ + @ApiModelProperty(value = "用户状态", position = 45) + private String userStatus; + + /** 排序码 */ + @ApiModelProperty(value = "排序码", position = 46) + private Integer sortCode; + + /** 扩展信息 */ + @ApiModelProperty(value = "扩展信息", position = 47) + private String extJson; + + /* ====额外的字段==== */ + + /** 组织名称 */ + @ApiModelProperty(value = "组织名称", position = 48) + private String orgName; + + /** 职位名称 */ + @ApiModelProperty(value = "职位名称", position = 49) + private String positionName; + + /** 主管名称 */ + @ApiModelProperty(value = "主管名称", position = 50) + private String directorName; +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/service/SysUserService.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/service/SysUserService.java new file mode 100644 index 00000000..76816806 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/service/SysUserService.java @@ -0,0 +1,376 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.service; + +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.json.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.web.multipart.MultipartFile; +import vip.xiaonuo.sys.modular.org.entity.SysOrg; +import vip.xiaonuo.sys.modular.position.entity.SysPosition; +import vip.xiaonuo.sys.modular.role.entity.SysRole; +import vip.xiaonuo.sys.modular.user.entity.SysUser; +import vip.xiaonuo.sys.modular.user.param.*; +import vip.xiaonuo.sys.modular.user.result.*; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; + +/** + * 用户Service接口 + * + * @author xuyuxiang + * @date 2022/4/21 18:35 + **/ +public interface SysUserService extends IService { + + /** + * 根据id获取用户信息,查不到则返回null + * + * @author xuyuxiang + * @date 2022/4/27 21:38 + */ + SysLoginUser getUserById(String id); + + /** + * 根据账户获取用户信息,查不到则返回null + * + * @author xuyuxiang + * @date 2022/4/27 21:38 + */ + SysLoginUser getUserByAccount(String account); + + /** + * 根据手机号获取用户信息,查不到则返回null + * + * @author xuyuxiang + * @date 2022/4/27 21:38 + */ + SysLoginUser getUserByPhone(String phone); + + /** + * 根据邮箱获取用户信息,查不到则返回null + * + * @author xuyuxiang + * @date 2022/4/27 21:38 + */ + SysLoginUser getUserByEmail(String email); + + /** + * 获取用户分页 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + Page page(SysUserPageParam sysUserPageParam); + + /** + * 添加用户 + * + * @author xuyuxiang + * @date 2022/4/24 20:48 + */ + void add(SysUserAddParam sysUserAddParam); + + /** + * 编辑用户 + * + * @author xuyuxiang + * @date 2022/4/24 21:13 + */ + void edit(SysUserEditParam sysUserEditParam); + + /** + * 删除用户 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + void delete(List sysUserIdParamList); + + /** + * 获取用户详情 + * + * @author xuyuxiang + * @date 2022/4/24 21:18 + */ + SysUser detail(SysUserIdParam sysUserIdParam); + + /** + * 获取用户详情 + * + * @author xuyuxiang + * @date 2022/7/26 17:21 + **/ + SysUser queryEntity(String id); + + /** + * 禁用用户 + * + * @author xuyuxiang + * @date 2022/7/5 18:20 + **/ + void disableUser(SysUserIdParam sysUserIdParam); + + /** + * 启用用户 + * + * @author xuyuxiang + * @date 2022/7/5 18:21 + **/ + void enableUser(SysUserIdParam sysUserIdParam); + + /** + * 重置用户密码 + * + * @author xuyuxiang + * @date 2022/7/5 18:22 + **/ + void resetPassword(SysUserIdParam sysUserIdParam); + + /** + * 获取图片验证码 + * + * @author xuyuxiang + * @date 2021/12/28 14:46 + **/ + SysUserPicValidCodeResult getPicCaptcha(); + + /** + * 找回密码获取手机验证码 + * + * @author xuyuxiang + * @date 2022/8/25 15:16 + **/ + String findPasswordGetPhoneValidCode(SysUserGetPhoneValidCodeParam sysUserGetPhoneValidCodeParam); + + /** + * 找回密码获取邮箱验证码 + * + * @author xuyuxiang + * @date 2022/8/25 15:16 + **/ + String findPasswordGetEmailValidCode(SysUserGetEmailValidCodeParam sysUserGetEmailValidCodeParam); + + /** + * 通过手机号找回用户密码 + * + * @author xuyuxiang + * @date 2022/4/22 15:53 + **/ + void findPasswordByPhone(SysUserFindPwdByPhoneParam sysUserFindPwdByPhoneParam); + + /** + * 通过邮箱找回用户密码 + * + * @author xuyuxiang + * @date 2022/4/22 15:53 + **/ + void findPasswordByEmail(SysUserFindPwdByEmailParam sysUserFindPwdByEmailParam); + + /** + * 修改用户密码 + * + * @author xuyuxiang + * @date 2022/4/22 15:53 + **/ + void updatePassword(SysUserUpdatePwdParam sysUserUpdatePwdParam); + + /** + * 修改用户头像返回base64 + * + * @author xuyuxiang + * @date 2022/4/22 15:53 + **/ + String updateAvatar(MultipartFile file); + + /** + * 修改用户签名图片返回base64 + * + * @author xuyuxiang yubaoshan + * @date 2022/4/22 15:53 + **/ + void updateSignature(SysUserSignatureParam sysUserSignatureParam); + + /** + * 更新用户的登录时间和登录ip等信息 + * + * @author xuyuxiang + * @date 2022/4/27 22:58 + */ + void updateUserLoginInfo(String userId, String device); + + /** + * 获取用户拥有菜单 + * + * @author xuyuxiang + * @date 2022/6/25 18:55 + */ + List> ownMenu(SysUserIdParam sysUserIdParam); + + /** + * 获取用户拥有角色 + * + * @author xuyuxiang + * @date 2022/5/13 21:00 + */ + List ownRole(SysUserIdParam sysUserIdParam); + + /** + * 给用户授权角色 + * + * @author xuyuxiang + * @date 2022/4/29 11:13 + **/ + void grantRole(SysUserGrantRoleParam sysUserGrantRoleParam); + + /** + * 获取用户组织树 + * + * @author xuyuxiang + * @date 2022/6/25 18:55 + */ + List> loginOrgTree(SysUserIdParam sysUserIdParam); + + /** + * 编辑个人信息 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + void updateUserInfo(SysUserUpdateInfoParam sysUserUpdateInfoParam); + + /** + * 编辑个人工作台 + * + * @author xuyuxiang + * @date 2022/4/24 20:47 + */ + void updateUserWorkbench(SysUserUpdateWorkbenchParam sysUserUpdateWorkbenchParam); + + /** + * 获取用户工作台数据 + * + * @author xuyuxiang + * @date 2022/5/13 21:00 + */ + String loginWorkbench(SysUserIdParam sysUserIdParam); + + /** + * 获取按钮编码集合 + * + * @author xuyuxiang + * @date 2022/4/29 11:13 + **/ + List getButtonCodeList(String userId); + + /** + * 获取权限集合 + * + * @author xuyuxiang + * @date 2022/4/29 11:13 + **/ + List getPermissionList(String userId, String orgId); + + /** + * 获取角色码集合 + * + * @author xuyuxiang + * @date 2022/4/29 11:13 + **/ + List getRoleCodeList(String userId); + + /** + * 用户导入 + * + * @author xuyuxiang + * @date 2022/8/8 13:16 + **/ + void importUser(MultipartFile file); + + /** + * 用户导出 + * + * @author xuyuxiang + * @date 2022/8/8 13:16 + **/ + void exportUser(SysUserExportParam sysUserExportParam, HttpServletResponse response) throws IOException; + + /** + * 获取登录用户的职位信息 + * + * @author xuyuxiang + * @date 2022/8/22 9:03 + **/ + List loginPositionInfo(SysUserIdParam sysUserIdParam); + + /* ====用户部分所需要用到的选择器==== */ + + /** + * 获取组织树选择器 + * + * @author xuyuxiang + * @date 2022/5/13 21:00 + */ + List> orgTreeSelector(); + + /** + * 获取组织列表选择器 + * + * @author xuyuxiang + * @date 2022/7/22 13:34 + **/ + List orgListSelector(SysUserSelectorOrgListParam sysUserSelectorOrgListParam); + + /** + * 获取职位选择器 + * + * @author xuyuxiang + * @date 2022/5/13 21:00 + */ + List positionSelector(SysUserSelectorPositionParam sysUserSelectorPositionParam); + + /** + * 获取角色选择器 + * + * @author xuyuxiang + * @date 2022/5/13 21:00 + */ + List roleSelector(SysUserSelectorRoleParam sysUserSelectorRoleParam); + + /** + * 获取用户选择器 + * + * @author xuyuxiang + * @date 2022/4/24 20:08 + */ + List userSelector(SysUserSelectorUserParam sysUserSelectorUserParam); + + /** + * 获取登录用户的站内信分页 + * + * @author xuyuxiang + * @date 2022/9/6 17:31 + */ + Page loginMessagePage(SysUserMessagePageParam sysUserMessagePageParam); + + /** + * 读取登录用户站内信详情 + * + * @author xuyuxiang + * @date 2022/9/6 17:39 + */ + SysUserMessageDetailResult loginMessageDetail(SysUserMessageIdParam sysUserMessageIdParam); +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/service/impl/SysUserServiceImpl.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/service/impl/SysUserServiceImpl.java new file mode 100644 index 00000000..148924d9 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/service/impl/SysUserServiceImpl.java @@ -0,0 +1,1108 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.service.impl; + +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.captcha.CaptchaUtil; +import cn.hutool.captcha.CircleCaptcha; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.img.ImgUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNode; +import cn.hutool.core.lang.tree.TreeNodeConfig; +import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.lang.tree.parser.DefaultNodeParser; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.BCrypt; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.poi.ss.usermodel.Workbook; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import vip.xiaonuo.common.cache.CommonCacheOperator; +import vip.xiaonuo.common.enums.CommonSortOrderEnum; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.common.util.*; +import vip.xiaonuo.dev.api.DevConfigApi; +import vip.xiaonuo.dev.api.DevEmailApi; +import vip.xiaonuo.dev.api.DevMessageApi; +import vip.xiaonuo.dev.api.DevSmsApi; +import vip.xiaonuo.sys.core.enums.SysBuildInEnum; +import vip.xiaonuo.sys.modular.org.entity.SysOrg; +import vip.xiaonuo.sys.modular.org.service.SysOrgService; +import vip.xiaonuo.sys.modular.position.entity.SysPosition; +import vip.xiaonuo.sys.modular.position.service.SysPositionService; +import vip.xiaonuo.sys.modular.relation.entity.SysRelation; +import vip.xiaonuo.sys.modular.relation.enums.SysRelationCategoryEnum; +import vip.xiaonuo.sys.modular.relation.service.SysRelationService; +import vip.xiaonuo.sys.modular.resource.entity.SysButton; +import vip.xiaonuo.sys.modular.resource.entity.SysMenu; +import vip.xiaonuo.sys.modular.resource.enums.SysResourceCategoryEnum; +import vip.xiaonuo.sys.modular.resource.enums.SysResourceMenuTypeEnum; +import vip.xiaonuo.sys.modular.resource.service.SysButtonService; +import vip.xiaonuo.sys.modular.resource.service.SysMenuService; +import vip.xiaonuo.sys.modular.role.entity.SysRole; +import vip.xiaonuo.sys.modular.role.enums.SysRoleDataScopeCategoryEnum; +import vip.xiaonuo.sys.modular.role.service.SysRoleService; +import vip.xiaonuo.sys.modular.user.entity.SysUser; +import vip.xiaonuo.sys.modular.user.enums.SysUserStatusEnum; +import vip.xiaonuo.sys.modular.user.mapper.SysUserMapper; +import vip.xiaonuo.sys.modular.user.param.*; +import vip.xiaonuo.sys.modular.user.result.*; +import vip.xiaonuo.sys.modular.user.service.SysUserService; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 用户Service接口实现类 + * + * @author xuyuxiang + * @date 2022/2/23 18:43 + **/ +@Service +public class SysUserServiceImpl extends ServiceImpl implements SysUserService { + + private static final String SNOWY_SYS_DEFAULT_PASSWORD_KEY = "SNOWY_SYS_DEFAULT_PASSWORD"; + + private static final String SNOWY_SYS_DEFAULT_WORKBENCH_DATA_KEY = "SNOWY_SYS_DEFAULT_WORKBENCH_DATA"; + + private static final String USER_CACHE_KEY = "user-validCode:"; + + @Resource + private CommonCacheOperator commonCacheOperator; + + @Resource + private DevSmsApi devSmsApi; + + @Resource + private DevEmailApi devEmailApi; + + @Resource + private DevConfigApi devConfigApi; + + @Resource + private DevMessageApi devMessageApi; + + @Resource + private SysOrgService sysOrgService; + + @Resource + private SysPositionService sysPositionService; + + @Resource + private SysRoleService sysRoleService; + + @Resource + private SysMenuService sysMenuService; + + @Resource + private SysButtonService sysButtonService; + + @Resource + private SysRelationService sysRelationService; + + @Override + public SysLoginUser getUserById(String id) { + SysUser sysUser = this.getById(id); + if(ObjectUtil.isNotEmpty(sysUser)) { + SysLoginUser sysLoginUser = BeanUtil.copyProperties(sysUser, SysLoginUser.class); + if(ObjectUtil.isNotEmpty(sysLoginUser.getOrgId())) { + sysLoginUser.setOrgName(sysOrgService.queryEntity(sysLoginUser.getOrgId()).getName()); + } + if(ObjectUtil.isNotEmpty(sysLoginUser.getPositionId())) { + sysLoginUser.setPositionName(sysPositionService.queryEntity(sysLoginUser.getPositionId()).getName()); + } + if(ObjectUtil.isNotEmpty(sysLoginUser.getPhone())) { + sysLoginUser.setPhone(CommonCryptogramUtil.doSm4CbcDecrypt(sysLoginUser.getPhone())); + } + if(ObjectUtil.isNotEmpty(sysLoginUser.getIdCardNumber())) { + sysLoginUser.setIdCardNumber(CommonCryptogramUtil.doSm4CbcDecrypt(sysLoginUser.getIdCardNumber())); + } + if(ObjectUtil.isNotEmpty(sysLoginUser.getEmergencyPhone())) { + sysLoginUser.setIdCardNumber(CommonCryptogramUtil.doSm4CbcDecrypt(sysLoginUser.getEmergencyPhone())); + } + return sysLoginUser; + } + return null; + } + + @Override + public SysLoginUser getUserByAccount(String account) { + SysUser sysUser = this.getOne(new LambdaQueryWrapper().eq(SysUser::getAccount, account)); + if(ObjectUtil.isNotEmpty(sysUser)) { + SysLoginUser sysLoginUser = BeanUtil.copyProperties(sysUser, SysLoginUser.class); + if(ObjectUtil.isNotEmpty(sysLoginUser.getOrgId())) { + sysLoginUser.setOrgName(sysOrgService.queryEntity(sysLoginUser.getOrgId()).getName()); + } + if(ObjectUtil.isNotEmpty(sysLoginUser.getPositionId())) { + sysLoginUser.setPositionName(sysPositionService.queryEntity(sysLoginUser.getPositionId()).getName()); + } + if(ObjectUtil.isNotEmpty(sysLoginUser.getPhone())) { + sysLoginUser.setPhone(CommonCryptogramUtil.doSm4CbcDecrypt(sysLoginUser.getPhone())); + } + if(ObjectUtil.isNotEmpty(sysLoginUser.getIdCardNumber())) { + sysLoginUser.setIdCardNumber(CommonCryptogramUtil.doSm4CbcDecrypt(sysLoginUser.getIdCardNumber())); + } + if(ObjectUtil.isNotEmpty(sysLoginUser.getEmergencyPhone())) { + sysLoginUser.setIdCardNumber(CommonCryptogramUtil.doSm4CbcDecrypt(sysLoginUser.getEmergencyPhone())); + } + return sysLoginUser; + } + return null; + } + + @Override + public SysLoginUser getUserByPhone(String phone) { + SysUser sysUser = this.getOne(new LambdaQueryWrapper().eq(SysUser::getPhone, CommonCryptogramUtil.doSm4CbcEncrypt(phone))); + if(ObjectUtil.isNotEmpty(sysUser)) { + SysLoginUser sysLoginUser = BeanUtil.copyProperties(sysUser, SysLoginUser.class); + if(ObjectUtil.isNotEmpty(sysLoginUser.getOrgId())) { + sysLoginUser.setOrgName(sysOrgService.queryEntity(sysLoginUser.getOrgId()).getName()); + } + if(ObjectUtil.isNotEmpty(sysLoginUser.getPositionId())) { + sysLoginUser.setPositionName(sysPositionService.queryEntity(sysLoginUser.getPositionId()).getName()); + } + if(ObjectUtil.isNotEmpty(sysLoginUser.getPhone())) { + sysLoginUser.setPhone(CommonCryptogramUtil.doSm4CbcDecrypt(sysLoginUser.getPhone())); + } + if(ObjectUtil.isNotEmpty(sysLoginUser.getIdCardNumber())) { + sysLoginUser.setIdCardNumber(CommonCryptogramUtil.doSm4CbcDecrypt(sysLoginUser.getIdCardNumber())); + } + if(ObjectUtil.isNotEmpty(sysLoginUser.getEmergencyPhone())) { + sysLoginUser.setIdCardNumber(CommonCryptogramUtil.doSm4CbcDecrypt(sysLoginUser.getEmergencyPhone())); + } + return sysLoginUser; + } + return null; + } + + @Override + public SysLoginUser getUserByEmail(String email) { + SysUser sysUser = this.getOne(new LambdaQueryWrapper().eq(SysUser::getEmail, email)); + if(ObjectUtil.isNotEmpty(sysUser)) { + SysLoginUser sysLoginUser = BeanUtil.copyProperties(sysUser, SysLoginUser.class); + if(ObjectUtil.isNotEmpty(sysLoginUser.getOrgId())) { + sysLoginUser.setOrgName(sysOrgService.queryEntity(sysLoginUser.getOrgId()).getName()); + } + if(ObjectUtil.isNotEmpty(sysLoginUser.getPositionId())) { + sysLoginUser.setPositionName(sysPositionService.queryEntity(sysLoginUser.getPositionId()).getName()); + } + if(ObjectUtil.isNotEmpty(sysLoginUser.getPhone())) { + sysLoginUser.setPhone(CommonCryptogramUtil.doSm4CbcDecrypt(sysLoginUser.getPhone())); + } + if(ObjectUtil.isNotEmpty(sysLoginUser.getIdCardNumber())) { + sysLoginUser.setIdCardNumber(CommonCryptogramUtil.doSm4CbcDecrypt(sysLoginUser.getIdCardNumber())); + } + if(ObjectUtil.isNotEmpty(sysLoginUser.getEmergencyPhone())) { + sysLoginUser.setIdCardNumber(CommonCryptogramUtil.doSm4CbcDecrypt(sysLoginUser.getEmergencyPhone())); + } + return sysLoginUser; + } + return null; + } + + @Override + public Page page(SysUserPageParam sysUserPageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(ObjectUtil.isNotEmpty(sysUserPageParam.getSearchKey())) { + queryWrapper.and(q -> q.like("SYS_USER.ACCOUNT", sysUserPageParam.getSearchKey()) + .or().like("SYS_USER.NAME", sysUserPageParam.getSearchKey())); + } + if(ObjectUtil.isNotEmpty(sysUserPageParam.getOrgId())) { + queryWrapper.eq("SYS_USER.ORG_ID", sysUserPageParam.getOrgId()); + } + if(ObjectUtil.isNotEmpty(sysUserPageParam.getUserStatus())) { + queryWrapper.eq("SYS_USER.USER_STATUS", sysUserPageParam.getUserStatus()); + } + if(ObjectUtil.isAllNotEmpty(sysUserPageParam.getSortField(), sysUserPageParam.getSortOrder())) { + CommonSortOrderEnum.validate(sysUserPageParam.getSortOrder()); + queryWrapper.orderBy(true, sysUserPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), + StrUtil.toUnderlineCase("SYS_USER." + sysUserPageParam.getSortField())); + } else { + queryWrapper.orderByAsc("SYS_USER.SORT_CODE"); + } + return this.baseMapper.page(CommonPageRequest.defaultPage(), queryWrapper); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void add(SysUserAddParam sysUserAddParam) { + checkParam(sysUserAddParam); + // 设置手机号 + if(ObjectUtil.isNotEmpty(sysUserAddParam.getPhone())) { + sysUserAddParam.setPhone(CommonCryptogramUtil.doSm4CbcEncrypt(sysUserAddParam.getPhone())); + } + // 设置证件号 + if(ObjectUtil.isNotEmpty(sysUserAddParam.getIdCardNumber())) { + sysUserAddParam.setIdCardNumber(CommonCryptogramUtil.doSm4CbcEncrypt(sysUserAddParam.getIdCardNumber())); + } + // 设置紧急联系人电话 + if(ObjectUtil.isNotEmpty(sysUserAddParam.getEmergencyPhone())) { + sysUserAddParam.setEmergencyPhone(CommonCryptogramUtil.doSm4CbcEncrypt(sysUserAddParam.getEmergencyPhone())); + } + SysUser sysUser = BeanUtil.toBean(sysUserAddParam, SysUser.class); + if(ObjectUtil.isEmpty(sysUser.getAvatar())) { + // 设置默认头像 + sysUser.setAvatar(CommonAvatarUtil.generateImg(sysUser.getName())); + } + // 设置默认密码 + sysUser.setPassword(CommonCryptogramUtil.doHashValue(devConfigApi.getValueByKey(SNOWY_SYS_DEFAULT_PASSWORD_KEY))); + // 设置状态 + sysUser.setUserStatus(SysUserStatusEnum.ENABLE.getValue()); + this.save(sysUser); + } + + private void checkParam(SysUserAddParam sysUserAddParam) { + if (this.count(new LambdaQueryWrapper() + .eq(SysUser::getAccount, sysUserAddParam.getAccount())) > 0) { + throw new CommonException("存在重复的账号,账号为:{}", sysUserAddParam.getAccount()); + } + if(ObjectUtil.isNotEmpty(sysUserAddParam.getPhone())) { + if(!PhoneUtil.isMobile(sysUserAddParam.getPhone())) { + throw new CommonException("手机号码:{}格式错误", sysUserAddParam.getPhone()); + } + if (this.count(new LambdaQueryWrapper() + .eq(SysUser::getPhone, sysUserAddParam.getPhone())) > 0) { + throw new CommonException("存在重复的手机号,手机号为:{}", sysUserAddParam.getPhone()); + } + } + if(ObjectUtil.isNotEmpty(sysUserAddParam.getEmail())) { + if(!CommonEmailUtil.isEmail(sysUserAddParam.getEmail())) { + throw new CommonException("邮箱:{}格式错误", sysUserAddParam.getPhone()); + } + if (this.count(new LambdaQueryWrapper() + .eq(SysUser::getEmail, sysUserAddParam.getEmail())) > 0) { + throw new CommonException("存在重复的邮箱,邮箱为:{}", sysUserAddParam.getEmail()); + } + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void edit(SysUserEditParam sysUserEditParam) { + SysUser sysUser = this.queryEntity(sysUserEditParam.getId()); + checkParam(sysUserEditParam); + // 设置手机号 + if(ObjectUtil.isNotEmpty(sysUserEditParam.getPhone())) { + sysUserEditParam.setPhone(CommonCryptogramUtil.doSm4CbcEncrypt(sysUserEditParam.getPhone())); + } + // 设置证件号 + if(ObjectUtil.isNotEmpty(sysUserEditParam.getIdCardNumber())) { + sysUserEditParam.setIdCardNumber(CommonCryptogramUtil.doSm4CbcEncrypt(sysUserEditParam.getIdCardNumber())); + } + // 设置紧急联系人电话 + if(ObjectUtil.isNotEmpty(sysUserEditParam.getEmergencyPhone())) { + sysUserEditParam.setEmergencyPhone(CommonCryptogramUtil.doSm4CbcEncrypt(sysUserEditParam.getEmergencyPhone())); + } + BeanUtil.copyProperties(sysUserEditParam, sysUser); + this.updateById(sysUser); + } + + private void checkParam(SysUserEditParam sysUserEditParam) { + if (this.count(new LambdaQueryWrapper() + .eq(SysUser::getAccount, sysUserEditParam.getAccount()) + .ne(SysUser::getId, sysUserEditParam.getId())) > 0) { + throw new CommonException("存在重复的账号,账号为:{}", sysUserEditParam.getAccount()); + } + if(ObjectUtil.isNotEmpty(sysUserEditParam.getPhone())) { + if(!PhoneUtil.isMobile(sysUserEditParam.getPhone())) { + throw new CommonException("手机号码:{}格式错误", sysUserEditParam.getPhone()); + } + if (this.count(new LambdaQueryWrapper() + .eq(SysUser::getPhone, sysUserEditParam.getPhone()) + .ne(SysUser::getId, sysUserEditParam.getId())) > 0) { + throw new CommonException("存在重复的手机号,手机号为:{}", sysUserEditParam.getPhone()); + } + } + if(ObjectUtil.isNotEmpty(sysUserEditParam.getEmail())) { + if(!CommonEmailUtil.isEmail(sysUserEditParam.getEmail())) { + throw new CommonException("邮箱:{}格式错误", sysUserEditParam.getPhone()); + } + if (this.count(new LambdaQueryWrapper() + .eq(SysUser::getEmail, sysUserEditParam.getEmail()) + .ne(SysUser::getId, sysUserEditParam.getId())) > 0) { + throw new CommonException("存在重复的邮箱,邮箱为:{}", sysUserEditParam.getEmail()); + } + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void delete(List sysUserIdParamList) { + List sysUserIdList = CollStreamUtil.toList(sysUserIdParamList, SysUserIdParam::getId); + if(ObjectUtil.isNotEmpty(sysUserIdList)) { + boolean containsSuperAdminAccount = this.listByIds(sysUserIdList).stream().map(SysUser::getAccount) + .collect(Collectors.toSet()).contains(SysBuildInEnum.BUILD_IN_USER_ACCOUNT.getValue()); + if(containsSuperAdminAccount) { + throw new CommonException("不可删除系统内置超管用户"); + } + // 清除【将这些用户作为主管】的信息 + this.update(new LambdaUpdateWrapper().in(SysUser::getDirectorId, sysUserIdList).set(SysUser::getDirectorId, null)); + // 清除【将这些用户作为兼任职位的主管】的信息 + this.list(new LambdaQueryWrapper() .isNotNull(SysUser::getPositionJson)).forEach(sysUser -> { + List handledJsonObjectList = JSONUtil.toList(JSONUtil.parseArray(sysUser.getPositionJson()), + JSONObject.class).stream().peek(jsonObject -> { + String directorId = jsonObject.getStr("directorId"); + if (ObjectUtil.isNotEmpty(directorId) && sysUserIdList.contains(directorId)) { + jsonObject.remove("directorId"); + } + }).collect(Collectors.toList()); + this.update(new LambdaUpdateWrapper().eq(SysUser::getId, sysUser.getId()) + .set(SysUser::getPositionJson, JSONUtil.toJsonStr(handledJsonObjectList))); + }); + // 执行删除 + this.removeBatchByIds(sysUserIdList); + + // TODO 此处需要将这些用户踢下线,并永久注销这些用户 + } + } + + @Override + public SysUser detail(SysUserIdParam sysUserIdParam) { + return this.queryEntity(sysUserIdParam.getId()); + } + + @Override + public void disableUser(SysUserIdParam sysUserIdParam) { + this.update(new LambdaUpdateWrapper().eq(SysUser::getId, + sysUserIdParam.getId()).set(SysUser::getUserStatus, SysUserStatusEnum.DISABLED.getValue())); + } + + @Override + public void enableUser(SysUserIdParam sysUserIdParam) { + + this.update(new LambdaUpdateWrapper().eq(SysUser::getId, + sysUserIdParam.getId()).set(SysUser::getUserStatus, SysUserStatusEnum.ENABLE.getValue())); + } + + @Override + public void resetPassword(SysUserIdParam sysUserIdParam) { + this.update(new LambdaUpdateWrapper().eq(SysUser::getId, + sysUserIdParam.getId()).set(SysUser::getPassword, + CommonCryptogramUtil.doHashValue(devConfigApi.getValueByKey(SNOWY_SYS_DEFAULT_PASSWORD_KEY)))); + } + + @Override + public SysUserPicValidCodeResult getPicCaptcha() { + // 生成验证码,随机4位字符 + CircleCaptcha circleCaptcha = CaptchaUtil.createCircleCaptcha(100, 38, 4, 10); + // 定义返回结果 + SysUserPicValidCodeResult sysUserPicValidCodeResult = new SysUserPicValidCodeResult(); + // 获取验证码的值 + String validCode = circleCaptcha.getCode(); + // 获取验证码的base64 + String validCodeBase64 = circleCaptcha.getImageBase64Data(); + // 生成请求号 + String validCodeReqNo = IdWorker.getIdStr(); + // 将base64返回前端 + sysUserPicValidCodeResult.setValidCodeBase64(validCodeBase64); + // 将请求号返回前端 + sysUserPicValidCodeResult.setValidCodeReqNo(validCodeReqNo); + // 将请求号作为key,验证码的值作为value放到redis,用于校验,5分钟有效 + commonCacheOperator.put(USER_CACHE_KEY + validCodeReqNo, validCode, 5 * 60); + return sysUserPicValidCodeResult; + } + + /** + * 校验验证码 + * + * @author xuyuxiang + * @date 2022/8/25 14:29 + **/ + private void validValidCode(String validCode, String validCodeReqNo) { + // 依据请求号,取出缓存中的验证码进行校验 + Object existValidCode = commonCacheOperator.get(USER_CACHE_KEY + validCodeReqNo); + // 为空则直接验证码错误 + if(ObjectUtil.isEmpty(existValidCode)) { + throw new CommonException("验证码错误"); + } + // 不一致则直接验证码错误 + if(!validCode.equals(Convert.toStr(existValidCode))) { + // 移除该验证码 + commonCacheOperator.remove(USER_CACHE_KEY + validCodeReqNo); + throw new CommonException("验证码错误"); + } + // 移除该验证码 + commonCacheOperator.remove(USER_CACHE_KEY + validCodeReqNo); + } + + @Override + public String findPasswordGetPhoneValidCode(SysUserGetPhoneValidCodeParam sysUserGetPhoneValidCodeParam) { + // 手机号 + String phone = sysUserGetPhoneValidCodeParam.getPhone(); + // 验证码正确则校验手机号格式 + if(!PhoneUtil.isMobile(phone)) { + throw new CommonException("手机号码:{}格式错误", phone); + } + // 执行校验验证码 + validValidCode(sysUserGetPhoneValidCodeParam.getValidCode(), sysUserGetPhoneValidCodeParam.getValidCodeReqNo()); + // 根据手机号获取用户信息,判断用户是否存在 + if(ObjectUtil.isEmpty(this.getUserByPhone(phone))) { + throw new CommonException("手机码:{}不存在", phone); + } + // 生成手机验证码的值,随机6为数字 + String phoneValidCode = RandomUtil.randomNumbers(6); + // 生成手机验证码的请求号 + String phoneValidCodeReqNo = IdWorker.getIdStr(); + + // TODO 使用阿里云执行发送验证码,将验证码作为短信内容的参数变量放入, + // TODO 签名不传则使用系统默认配置的签名,支持传入多个参数,示例:{"name":"张三","number":"15038****76"} + //devSmsApi.sendSmsAliyun(phone, null, "验证码模板号", JSONUtil.toJsonStr(JSONUtil.createObj().set("validCode", phoneValidCode))); + + // TODO 使用腾讯云执行发送验证码,将验证码作为短信内容的参数变量放入, + // TODO sdkAppId和签名不传则使用系统默认配置的sdkAppId和签名,支持传入多个参数,逗号拼接,示例:"张三,15038****76,进行中" + //devSmsApi.sendSmsTencent(null, phone, null, "验证码模板号", phoneValidCode); + + // 将请求号作为key,验证码的值作为value放到redis,用于校验,5分钟有效 + commonCacheOperator.put(USER_CACHE_KEY + phoneValidCodeReqNo, phoneValidCode, 5 * 60); + // 返回请求号 + return phoneValidCodeReqNo; + } + + @Override + public String findPasswordGetEmailValidCode(SysUserGetEmailValidCodeParam sysUserGetEmailValidCodeParam) { + // 邮箱 + String email = sysUserGetEmailValidCodeParam.getEmail(); + // 验证码正确则校验手机号格式 + if(!CommonEmailUtil.isEmail(email)) { + throw new CommonException("邮箱:{}格式错误", email); + } + // 执行校验验证码 + validValidCode(sysUserGetEmailValidCodeParam.getValidCode(), sysUserGetEmailValidCodeParam.getValidCodeReqNo()); + // 根据手机号获取用户信息,判断用户是否存在 + if(ObjectUtil.isEmpty(this.getUserByEmail(email))) { + throw new CommonException("邮箱:{}不存在", email); + } + // 生成邮箱验证码的值,随机6为数字 + String emailValidCode = RandomUtil.randomNumbers(6); + // 生成邮箱验证码的请求号 + String emailValidCodeReqNo = IdWorker.getIdStr(); + + // TODO 使用本地发送邮件 + String content = "您正在找回密码,验证码为:" + emailValidCode + ",5分钟内有效。"; + devEmailApi.sendTextEmailLocal(email, "找回密码邮件", content, CollectionUtil.newArrayList()); + + // 将请求号作为key,验证码的值作为value放到redis,用于校验,5分钟有效 + commonCacheOperator.put(USER_CACHE_KEY + emailValidCodeReqNo, emailValidCode, 5 * 60); + // 返回请求号 + return emailValidCodeReqNo; + } + + @Override + public void findPasswordByPhone(SysUserFindPwdByPhoneParam sysUserFindPwdByPhoneParam) { + // 执行校验验证码 + validValidCode(sysUserFindPwdByPhoneParam.getValidCode(), sysUserFindPwdByPhoneParam.getValidCodeReqNo()); + this.update(new LambdaUpdateWrapper().eq(SysUser::getPhone, + sysUserFindPwdByPhoneParam.getPhone()).set(SysUser::getPassword, + BCrypt.hashpw(sysUserFindPwdByPhoneParam.getNewPassword()))); + } + + @Override + public void findPasswordByEmail(SysUserFindPwdByEmailParam sysUserFindPwdByEmailParam) { + // 执行校验验证码 + validValidCode(sysUserFindPwdByEmailParam.getValidCode(), sysUserFindPwdByEmailParam.getValidCodeReqNo()); + this.update(new LambdaUpdateWrapper().eq(SysUser::getEmail, + sysUserFindPwdByEmailParam.getEmail()).set(SysUser::getPassword, + BCrypt.hashpw(sysUserFindPwdByEmailParam.getNewPassword()))); + } + + @Override + public void updatePassword(SysUserUpdatePwdParam sysUserUpdatePwdParam) { + SysUser sysUser = this.queryEntity(StpUtil.getLoginIdAsString()); + String password = sysUserUpdatePwdParam.getPassword(); + String newPassword = sysUserUpdatePwdParam.getNewPassword(); + if (!CommonCryptogramUtil.doHashValue(password).equals(sysUser.getPassword())) { + throw new CommonException("原密码错误"); + } + this.update(new LambdaUpdateWrapper().eq(SysUser::getId, + sysUser.getId()).set(SysUser::getPassword, + CommonCryptogramUtil.doHashValue(newPassword))); + } + + @Override + public String updateAvatar(MultipartFile file) { + SysUser sysUser = this.queryEntity(StpUtil.getLoginIdAsString()); + try { + String suffix = Objects.requireNonNull(FileUtil.getSuffix(file.getOriginalFilename())).toLowerCase(); + BufferedImage bufferedImage = ImgUtil.toImage(file.getBytes()); + String base64 = ImgUtil.toBase64DataUri(bufferedImage, suffix); + this.update(new LambdaUpdateWrapper().eq(SysUser::getId, + sysUser.getId()).set(SysUser::getAvatar, base64)); + return base64; + } catch (IOException e) { + e.printStackTrace(); + throw new CommonException("头像修改失败,用户id值为:{}", sysUser.getId()); + } + } + + @Override + public void updateSignature(SysUserSignatureParam sysUserSignatureParam) { + SysUser sysUser = this.queryEntity(StpUtil.getLoginIdAsString()); + // 更新指定字段 + this.update(new LambdaUpdateWrapper().eq(SysUser::getId, sysUser.getId()) + .set(SysUser::getSignature, sysUserSignatureParam.getSignature())); + } + + @Override + public void updateUserLoginInfo(String userId, String device) { + SysUser sysUser = this.queryEntity(userId); + sysUser.setLastLoginTime(sysUser.getLatestLoginTime()); + sysUser.setLastLoginIp(sysUser.getLatestLoginIp()); + sysUser.setLastLoginAddress(sysUser.getLatestLoginAddress()); + sysUser.setLastLoginDevice(sysUser.getLatestLoginDevice()); + sysUser.setLatestLoginTime(DateTime.now()); + String ip = CommonIpAddressUtil.getIp(CommonServletUtil.getRequest()); + sysUser.setLatestLoginIp(ip); + sysUser.setLatestLoginAddress(CommonIpAddressUtil.getCityInfo(ip)); + sysUser.setLatestLoginDevice(device); + this.updateById(sysUser); + } + + @Override + public List> ownMenu(SysUserIdParam sysUserIdParam) { + + // 获取角色id列表 + List roleIdList = this.ownRole(sysUserIdParam); + + // 获取菜单id列表 + List menuIdList = CollectionUtil.newArrayList(); + + if(ObjectUtil.isNotEmpty(roleIdList)) { + menuIdList = sysRelationService.getRelationTargetIdListByObjectIdListAndCategory(roleIdList, + SysRelationCategoryEnum.SYS_ROLE_HAS_RESOURCE.getValue()); + } + + // 获取所有的菜单和模块以及单页面列表,并按分类和排序码排序 + List allModuleAndMenuAndSpaList = sysMenuService.list(new LambdaQueryWrapper() + .in(SysMenu::getCategory, SysResourceCategoryEnum.MODULE.getValue(), SysResourceCategoryEnum.MENU.getValue(), + SysResourceCategoryEnum.SPA.getValue()).orderByAsc(CollectionUtil.newArrayList(SysMenu::getCategory, + SysMenu::getSortCode))); + // 全部以菜单承载 + List allModuleList = CollectionUtil.newArrayList(); + List allMenuList = CollectionUtil.newArrayList(); + List allSpaList = CollectionUtil.newArrayList(); + // 根据类型抽取 + allModuleAndMenuAndSpaList.forEach(sysMenu -> { + boolean isModule = sysMenu.getCategory().equals(SysResourceCategoryEnum.MODULE.getValue()); + if (isModule) { + // 抽取所有的模块列表 + allModuleList.add(sysMenu); + } + boolean isMenu = sysMenu.getCategory().equals(SysResourceCategoryEnum.MENU.getValue()); + if (isMenu) { + // 抽取所有的菜单列表 + allMenuList.add(sysMenu); + } + boolean isSpa = sysMenu.getCategory().equals(SysResourceCategoryEnum.SPA.getValue()); + if (isSpa) { + // 抽取所有的单页面列表 + allSpaList.add(sysMenu); + } + }); + + // 定义结果 + List resultList = CollectionUtil.newArrayList(); + + // 获取拥有的菜单列表 + List finalMenuIdList = menuIdList; + List menuList = allMenuList.stream().filter(sysMenu -> + finalMenuIdList.contains(sysMenu.getId())).collect(Collectors.toList()); + + // 对获取到的角色对应的菜单列表进行处理,获取父列表 + menuList.forEach(sysMenu -> execRecursionFindParent(allMenuList, sysMenu.getId(), resultList)); + + // 将拥有的菜单列表添加 + resultList.addAll(menuList); + + // 获取模块id集合 + Set moduleIdSet = resultList.stream().map(SysMenu::getModule).collect(Collectors.toSet()); + + // 抽取拥有的模块列表 + List moduleList = allModuleList.stream().filter(sysMenu -> + moduleIdSet.contains(sysMenu.getId())).collect(Collectors.toList()); + + // 如果一个模块都没拥有 + if(ObjectUtil.isEmpty(moduleList)) { + // 如果系统中无模块(极端情况) + if(ObjectUtil.isEmpty(allModuleList)) { + // 如果系统中无单页面,则返回空列表 + if(ObjectUtil.isEmpty(allSpaList)) { + return CollectionUtil.newArrayList(); + } else { + // 否则构造一个模块,并添加到拥有模块 + SysMenu sysMenu = new SysMenu(); + sysMenu.setId(IdWorker.getIdStr()); + sysMenu.setPath(StrUtil.SLASH + RandomUtil.randomString(10)); + sysMenu.setCategory(SysResourceCategoryEnum.MODULE.getValue()); + allModuleList.add(sysMenu); + moduleList.add(sysMenu); + } + } else { + // 否则将系统中第一个模块作为拥有的模块 + moduleList.add(allModuleList.get(0)); + } + } + + // 将拥有的模块放入集合 + resultList.addAll(moduleList); + + // 获取第一个模块 + SysMenu firstModule = moduleList.get(0); + + // 将第一个模块作为所有单页面的所属模块,并添加 + List spaList = allSpaList.stream().peek(sysMenu -> { + sysMenu.setParentId(firstModule.getId()); + sysMenu.setModule(firstModule.getId()); + }).collect(Collectors.toList()); + + // 获取第一个单页面的id + String firstSpaId = spaList.get(0).getId(); + + // 将单页面放入集合 + resultList.addAll(spaList); + + // 最终处理,构造meta + List resultJsonObjectList = resultList.stream().map(sysMenu -> { + + // 将模块的父id设置为0,设置随机path + if(sysMenu.getCategory().equals(SysResourceCategoryEnum.MODULE.getValue())) { + sysMenu.setParentId("0"); + sysMenu.setPath(StrUtil.SLASH + RandomUtil.randomString(10)); + } + // 将根菜单的父id设置为模块的id + if(sysMenu.getCategory().equals(SysResourceCategoryEnum.MENU.getValue())) { + if(sysMenu.getParentId().equals("0")) { + sysMenu.setParentId(sysMenu.getModule()); + } + } + JSONObject menuJsonObject = JSONUtil.parseObj(sysMenu); + JSONObject metaJsonObject = JSONUtil.createObj(); + metaJsonObject.set("icon", sysMenu.getIcon()); + metaJsonObject.set("title", sysMenu.getTitle()); + metaJsonObject.set("type", sysMenu.getCategory().toLowerCase()); + // 如果是菜单,则设置type菜单类型为小写 + if (sysMenu.getCategory().equals(SysResourceCategoryEnum.MENU.getValue())) { + if (!sysMenu.getMenuType().equals(SysResourceMenuTypeEnum.CATALOG.getValue())) { + metaJsonObject.set("type", sysMenu.getMenuType().toLowerCase()); + } + } + // 如果是单页面 + if(sysMenu.getCategory().equals(SysResourceCategoryEnum.SPA.getValue())) { + metaJsonObject.set("type", SysResourceCategoryEnum.MENU.getValue().toLowerCase()); + if(sysMenu.getId().equals(firstSpaId)) { + // 如果是首页(第一个单页面)则设置affix + metaJsonObject.set("affix", true); + } else { + // 否则隐藏该单页面 + metaJsonObject.set("hidden", true); + } + } + menuJsonObject.set("meta", metaJsonObject); + return menuJsonObject; + }).collect(Collectors.toList()); + + // 执行构造树 + List> treeNodeList = resultJsonObjectList.stream().map(jsonObject -> + new TreeNode<>(jsonObject.getStr("id"), jsonObject.getStr("parentId"), + jsonObject.getStr("title"), jsonObject.getInt("sortCode")).setExtra(JSONUtil.parseObj(jsonObject))) + .collect(Collectors.toList()); + return TreeUtil.build(treeNodeList, "0"); + } + + /** + * 递归获取父节点 + * + * @author xuyuxiang + * @date 2022/6/27 17:56 + **/ + private void execRecursionFindParent(List originDataList, String id, List resultList) { + originDataList.forEach(item -> { + if(item.getId().equals(id)) { + int index = CollStreamUtil.toList(originDataList, SysMenu::getId).indexOf(id); + SysMenu parent = index == -1?null:originDataList.get(index); + if(ObjectUtil.isNotEmpty(parent)) { + if(!CollectionUtil.contains(resultList, parent)) { + resultList.add(parent); + } + } + execRecursionFindParent(originDataList, item.getParentId(), resultList); + } + }); + } + + @Override + public List ownRole(SysUserIdParam sysUserIdParam) { + return sysRelationService.getRelationTargetIdListByObjectIdAndCategory(sysUserIdParam.getId(), + SysRelationCategoryEnum.SYS_USER_HAS_ROLE.getValue()); + } + + @Override + public void grantRole(SysUserGrantRoleParam sysUserGrantRoleParam) { + sysRelationService.saveRelationBatchWithClear(sysUserGrantRoleParam.getId(), sysUserGrantRoleParam.getRoleIdList(), + SysRelationCategoryEnum.SYS_USER_HAS_ROLE.getValue()); + } + + @Override + public List> loginOrgTree(SysUserIdParam sysUserIdParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.orderByAsc(SysOrg::getSortCode); + List sysOrgList = sysOrgService.list(lambdaQueryWrapper); + SysUser sysUser = this.queryEntity(sysUserIdParam.getId()); + List> treeNodeList = sysOrgList.stream().map(sysOrg -> { + TreeNode treeNode = new TreeNode<>(sysOrg.getId(), sysOrg.getParentId(), sysOrg.getName(), sysOrg.getSortCode()); + if(ObjectUtil.isNotEmpty(sysUser.getOrgId())) { + if(sysOrg.getId().equals(sysUser.getOrgId())) { + treeNode.setExtra(JSONUtil.createObj().set("style", JSONUtil.createObj().set("color", "#FFF") + .set("background", "var(--primary-color)"))); + } + } + return treeNode; + }).collect(Collectors.toList()); + return TreeUtil.build(treeNodeList, "0", new TreeNodeConfig().setParentIdKey("pid") + .setNameKey("label"), new DefaultNodeParser<>()); + } + + @Override + public void updateUserInfo(SysUserUpdateInfoParam sysUserUpdateInfoParam) { + SysUser sysUser = this.queryEntity(sysUserUpdateInfoParam.getId()); + // 更新指定字段 + this.update(new LambdaUpdateWrapper().eq(SysUser::getId, sysUser.getId()) + .set(SysUser::getName, sysUserUpdateInfoParam.getName()) + .set(SysUser::getPhone, sysUserUpdateInfoParam.getPhone()) + .set(SysUser::getNickname, sysUserUpdateInfoParam.getNickname()) + .set(SysUser::getGender, sysUserUpdateInfoParam.getGender()) + .set(SysUser::getBirthday, sysUserUpdateInfoParam.getBirthday()) + .set(SysUser::getEmail, sysUserUpdateInfoParam.getEmail()) + .set(SysUser::getSignature, sysUserUpdateInfoParam.getSignature())); + } + + @Override + public void updateUserWorkbench(SysUserUpdateWorkbenchParam sysUserUpdateWorkbenchParam) { + sysRelationService.saveRelationWithClear(StpUtil.getLoginIdAsString(), null, + SysRelationCategoryEnum.SYS_USER_WORKBENCH_DATA.getValue(), sysUserUpdateWorkbenchParam.getWorkbenchData()); + } + + @Override + public String loginWorkbench(SysUserIdParam sysUserIdParam) { + SysUser sysUser = this.queryEntity(sysUserIdParam.getId()); + SysRelation sysRelation = sysRelationService.getOne(new LambdaUpdateWrapper().eq(SysRelation::getObjectId, sysUser.getId()) + .eq(SysRelation::getCategory, SysRelationCategoryEnum.SYS_USER_WORKBENCH_DATA.getValue())); + if(ObjectUtil.isNotEmpty(sysRelation)) { + return sysRelation.getExtJson(); + } + return devConfigApi.getValueByKey(SNOWY_SYS_DEFAULT_WORKBENCH_DATA_KEY); + } + + @Override + public SysUser queryEntity(String id) { + SysUser sysUser = this.getById(id); + if(ObjectUtil.isEmpty(sysUser)) { + throw new CommonException("用户不存在,id值为:{}", id); + } + return sysUser; + } + + @Override + public List getButtonCodeList(String userId) { + List roleIdList = sysRelationService.getRelationTargetIdListByObjectIdAndCategory(userId, + SysRelationCategoryEnum.SYS_USER_HAS_ROLE.getValue()); + if(ObjectUtil.isNotEmpty(roleIdList)) { + List buttonIdList = CollectionUtil.newArrayList(); + sysRelationService.getRelationListByObjectIdListAndCategory(roleIdList, + SysRelationCategoryEnum.SYS_ROLE_HAS_RESOURCE.getValue()).forEach(sysRelation -> { + if (ObjectUtil.isNotEmpty(sysRelation.getExtJson())) { + buttonIdList.addAll(JSONUtil.parseObj(sysRelation.getExtJson()).getBeanList("buttonInfo", String.class)); + } + }); + if(ObjectUtil.isNotEmpty(buttonIdList)) { + return sysButtonService.listByIds(buttonIdList).stream().map(SysButton::getCode).collect(Collectors.toList()); + } + } + return CollectionUtil.newArrayList(); + } + + @Override + public List getPermissionList(String userId, String orgId) { + if(ObjectUtil.isNotEmpty(orgId)) { + List roleIdList = sysRelationService.getRelationTargetIdListByObjectIdAndCategory(userId, + SysRelationCategoryEnum.SYS_USER_HAS_ROLE.getValue()); + if(ObjectUtil.isNotEmpty(roleIdList)) { + Map> groupMap = sysRelationService.getRelationListByObjectIdListAndCategory(roleIdList, + SysRelationCategoryEnum.SYS_ROLE_HAS_PERMISSION.getValue()).stream().collect(Collectors.groupingBy(SysRelation::getTargetId)); + if(ObjectUtil.isNotEmpty(groupMap)) { + List resultList = CollectionUtil.newArrayList(); + List sysOrgList = sysOrgService.list(); + List scopeAllList = sysOrgList.stream().map(SysOrg::getId).collect(Collectors.toList()); + List scopeOrgList = CollectionUtil.newArrayList(orgId); + List scopeOrgChildList = sysOrgService.getChildListById(sysOrgList, orgId, true) + .stream().map(SysOrg::getId).collect(Collectors.toList()); + groupMap.forEach((key, value) -> { + JSONObject jsonObject = JSONUtil.createObj().set("apiUrl", key); + Set scopeSet = CollectionUtil.newHashSet(); + value.forEach(sysRelation -> { + JSONObject extJsonObject = JSONUtil.parseObj(sysRelation.getExtJson()); + String scopeCategory = extJsonObject.getStr("scopeCategory"); + if(!scopeCategory.equals(SysRoleDataScopeCategoryEnum.SCOPE_SELF.getValue())) { + if(scopeCategory.equals(SysRoleDataScopeCategoryEnum.SCOPE_ALL.getValue())) { + scopeSet.addAll(scopeAllList); + } else if(scopeCategory.equals(SysRoleDataScopeCategoryEnum.SCOPE_ORG.getValue())) { + scopeSet.addAll(scopeOrgList); + } else if(scopeCategory.equals(SysRoleDataScopeCategoryEnum.SCOPE_ORG_CHILD.getValue())) { + scopeSet.addAll(scopeOrgChildList); + } else { + scopeSet.addAll(extJsonObject.getBeanList("scopeDefineOrgIdList", String.class)); + } + } + }); + resultList.add(jsonObject.set("dataScope", CollectionUtil.newArrayList(scopeSet))); + }); + return resultList; + } + } + } + return CollectionUtil.newArrayList(); + } + + @Override + public List getRoleCodeList(String userId) { + List roleIdList = sysRelationService.getRelationTargetIdListByObjectIdAndCategory(userId, + SysRelationCategoryEnum.SYS_USER_HAS_ROLE.getValue()); + if(ObjectUtil.isNotEmpty(roleIdList)) { + return sysRoleService.listByIds(roleIdList) + .stream().map(SysRole::getCode).collect(Collectors.toList()); + } + return CollectionUtil.newArrayList(); + } + + @Override + public void importUser(MultipartFile file) { + // TODO 待完善 + } + + @Override + public void exportUser(SysUserExportParam sysUserExportParam, HttpServletResponse response) throws IOException { + File tempFile = null; + try { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(ObjectUtil.isNotEmpty(sysUserExportParam.getSearchKey())) { + queryWrapper.and(q -> q.like("SYS_USER.ACCOUNT", sysUserExportParam.getSearchKey()) + .or().like("SYS_USER.NAME", sysUserExportParam.getSearchKey()) + .or().like("SYS_USER.PHONE", sysUserExportParam.getSearchKey())); + } + if(ObjectUtil.isNotEmpty(sysUserExportParam.getUserStatus())) { + queryWrapper.eq("SYS_USER.STATUS", sysUserExportParam.getUserStatus()); + } + String fileName = "SNOWY2.0系统B端用户信息清单"; + List sysUserExportResultList = this.baseMapper.exportList(queryWrapper).stream().peek(sysUserExportResult -> { + if(ObjectUtil.isNotEmpty(sysUserExportResult.getAvatar())) { + sysUserExportResult.setAvatarByte(ImgUtil.toBytes(ImgUtil.toImage(StrUtil + .split(sysUserExportResult.getAvatar(), StrUtil.COMMA).get(1)), ImgUtil.IMAGE_TYPE_PNG)); + } + }).collect(Collectors.toList()); + Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(fileName, "B端用户"), + SysUserExportResult.class, sysUserExportResultList); + tempFile = FileUtil.file(FileUtil.getTmpDir() + FileUtil.FILE_SEPARATOR + fileName + ".xls"); + BufferedOutputStream outputStream = FileUtil.getOutputStream(tempFile); + workbook.write(outputStream); + outputStream.close(); + CommonDownloadUtil.download(tempFile, response); + } catch (Exception e) { + e.printStackTrace(); + CommonResponseUtil.renderError(response, "导出失败"); + } finally { + FileUtil.del(tempFile); + } + } + + @Override + public List loginPositionInfo(SysUserIdParam sysUserIdParam) { + SysUser sysUser = this.queryEntity(sysUserIdParam.getId()); + List sysUserPositionResultList = CollectionUtil.newArrayList(); + List sysOrgList = sysOrgService.list(); + String primaryOrgId = sysUser.getOrgId(); + SysOrg primarySysOrg = sysOrgService.getById(sysOrgList, primaryOrgId); + if(ObjectUtil.isEmpty(primarySysOrg)) { + throw new CommonException("组织不存在,id值为:{}", primaryOrgId); + } + String primaryOrgName = primarySysOrg.getName(); + List sysPositionList = sysPositionService.list(); + String primaryPositionId = sysUser.getPositionId(); + SysPosition primaryPosition = sysPositionService.getById(sysPositionList, primaryPositionId); + if(ObjectUtil.isEmpty(primaryPosition)) { + throw new CommonException("职位不存在,id值为:{}", primaryPositionId); + } + String primaryPositionName = primaryPosition.getName(); + SysUserPositionResult primarySysUserPositionResult = new SysUserPositionResult(); + primarySysUserPositionResult.setOrgId(primaryOrgId); + primarySysUserPositionResult.setOrgName(primaryOrgName); + primarySysUserPositionResult.setPositionId(primaryPositionId); + primarySysUserPositionResult.setPositionName(primaryPositionName); + primarySysUserPositionResult.setCategory(primarySysOrg.getCategory()); + primarySysUserPositionResult.setType("primary"); + sysUserPositionResultList.add(primarySysUserPositionResult); + String positionJson = sysUser.getPositionJson(); + if(ObjectUtil.isNotEmpty(positionJson)) { + JSONArray jsonArray = JSONUtil.parseArray(positionJson); + if(ObjectUtil.isNotEmpty(jsonArray)) { + jsonArray.forEach(obj -> { + JSONObject jsonObject = JSONUtil.parseObj(obj); + String slaveOrgId = jsonObject.getStr("orgId"); + String slavePositionId = jsonObject.getStr("positionId"); + if(ObjectUtil.hasEmpty(slaveOrgId, slavePositionId)) { + throw new CommonException("兼任职位数据不完整,用户id值为:{}", sysUserIdParam.getId()); + } + SysOrg slaveSysOrg = sysOrgService.getById(sysOrgList, slaveOrgId); + if(ObjectUtil.isEmpty(slaveSysOrg)) { + throw new CommonException("组织不存在,id值为:{}", slaveSysOrg); + } + String slaveOrgName = slaveSysOrg.getName(); + + SysPosition slavePosition = sysPositionService.getById(sysPositionList, slavePositionId); + if(ObjectUtil.isEmpty(slavePosition)) { + throw new CommonException("职位不存在,id值为:{}", slavePositionId); + } + String slavePositionName = slavePosition.getName(); + SysUserPositionResult slaveSysUserPositionResult = new SysUserPositionResult(); + slaveSysUserPositionResult.setOrgId(slaveOrgId); + slaveSysUserPositionResult.setOrgName(slaveOrgName); + slaveSysUserPositionResult.setPositionId(slavePositionId); + slaveSysUserPositionResult.setPositionName(slavePositionName); + slaveSysUserPositionResult.setCategory(slaveSysOrg.getCategory()); + slaveSysUserPositionResult.setType("slave"); + sysUserPositionResultList.add(slaveSysUserPositionResult); + }); + } + } + return sysUserPositionResultList; + } + + /* ====用户部分所需要用到的选择器==== */ + + @Override + public List> orgTreeSelector() { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.orderByAsc(SysOrg::getSortCode); + List sysOrgList = sysOrgService.list(lambdaQueryWrapper); + List> treeNodeList = sysOrgList.stream().map(sysOrg -> + new TreeNode<>(sysOrg.getId(), sysOrg.getParentId(), sysOrg.getName(), sysOrg.getSortCode())) + .collect(Collectors.toList()); + return TreeUtil.build(treeNodeList, "0"); + } + + @Override + public List orgListSelector(SysUserSelectorOrgListParam sysUserSelectorOrgListParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + // 查询部分字段 + lambdaQueryWrapper.select(SysOrg::getId, SysOrg::getParentId, SysOrg::getName, + SysOrg::getCategory, SysOrg::getSortCode); + if(ObjectUtil.isNotEmpty(sysUserSelectorOrgListParam.getParentId())) { + lambdaQueryWrapper.eq(SysOrg::getParentId, sysUserSelectorOrgListParam.getParentId()); + } + if(ObjectUtil.isNotEmpty(sysUserSelectorOrgListParam.getSearchKey())) { + lambdaQueryWrapper.like(SysOrg::getName, sysUserSelectorOrgListParam.getSearchKey()); + } + lambdaQueryWrapper.orderByAsc(SysOrg::getSortCode); + return sysOrgService.list(lambdaQueryWrapper); + } + + @Override + public List positionSelector(SysUserSelectorPositionParam sysUserSelectorPositionParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + // 查询部分字段 + lambdaQueryWrapper.select(SysPosition::getId, SysPosition::getOrgId, SysPosition::getName, + SysPosition::getCategory, SysPosition::getSortCode); + if(ObjectUtil.isNotEmpty(sysUserSelectorPositionParam.getOrgId())) { + lambdaQueryWrapper.eq(SysPosition::getOrgId, sysUserSelectorPositionParam.getOrgId()); + } + if(ObjectUtil.isNotEmpty(sysUserSelectorPositionParam.getSearchKey())) { + lambdaQueryWrapper.like(SysPosition::getName, sysUserSelectorPositionParam.getSearchKey()); + } + lambdaQueryWrapper.orderByAsc(SysPosition::getSortCode); + return sysPositionService.list(lambdaQueryWrapper); + } + + @Override + public List roleSelector(SysUserSelectorRoleParam sysUserSelectorRoleParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.select(SysRole::getId, SysRole::getOrgId, SysRole::getName, + SysRole::getCategory, SysRole::getSortCode); + if(ObjectUtil.isNotEmpty(sysUserSelectorRoleParam.getOrgId())) { + lambdaQueryWrapper.eq(SysRole::getOrgId, sysUserSelectorRoleParam.getOrgId()); + } + if(ObjectUtil.isNotEmpty(sysUserSelectorRoleParam.getCategory())) { + lambdaQueryWrapper.eq(SysRole::getCategory, sysUserSelectorRoleParam.getCategory()); + } + if(ObjectUtil.isNotEmpty(sysUserSelectorRoleParam.getSearchKey())) { + lambdaQueryWrapper.like(SysRole::getName, sysUserSelectorRoleParam.getSearchKey()); + } + lambdaQueryWrapper.orderByAsc(SysRole::getSortCode); + return sysRoleService.list(lambdaQueryWrapper); + } + + @Override + public List userSelector(SysUserSelectorUserParam sysUserSelectorUserParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + // 只查询部分字段 + lambdaQueryWrapper.select(SysUser::getId, SysUser::getOrgId, SysUser::getAccount, SysUser::getName, SysUser::getSortCode); + if(ObjectUtil.isNotEmpty(sysUserSelectorUserParam.getOrgId())) { + lambdaQueryWrapper.eq(SysUser::getOrgId, sysUserSelectorUserParam.getOrgId()); + } + if(ObjectUtil.isNotEmpty(sysUserSelectorUserParam.getSearchKey())) { + lambdaQueryWrapper.like(SysUser::getName, sysUserSelectorUserParam.getSearchKey()); + } + lambdaQueryWrapper.orderByAsc(SysUser::getSortCode); + return this.list(lambdaQueryWrapper); + } + + @Override + public Page loginMessagePage(SysUserMessagePageParam sysUserMessagePageParam) { + Page resultPage = new Page<>(); + Page devMessagePage = devMessageApi.page(CollectionUtil.newArrayList(StpUtil.getLoginIdAsString()), sysUserMessagePageParam.getCategory()); + BeanUtil.copyProperties(devMessagePage, resultPage); + return resultPage; + } + + @Override + public SysUserMessageDetailResult loginMessageDetail(SysUserMessageIdParam sysUserMessageIdParam) { + return JSONUtil.toBean(devMessageApi.detail(sysUserMessageIdParam.getId()), SysUserMessageDetailResult.class); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/wrapper/SysUserResultWrapperImpl.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/wrapper/SysUserResultWrapperImpl.java new file mode 100644 index 00000000..da803b88 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/wrapper/SysUserResultWrapperImpl.java @@ -0,0 +1,52 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.wrapper; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import vip.xiaonuo.common.pojo.CommonWrapperInterface; +import vip.xiaonuo.common.util.CommonCryptogramUtil; +import vip.xiaonuo.sys.modular.user.result.SysUserResult; + +/** + * SysUserResult类型的包装实现类 + * + * @author xuyuxiang + * @date 2022/9/15 21:42 + */ +public class SysUserResultWrapperImpl implements CommonWrapperInterface { + + /** + * 对手机号和证件号码进行解密 + * + * @author xuyuxiang + * @date 2022/9/15 21:45 + */ + @Override + public JSONObject doWrap(SysUserResult sysUserResult) { + String phone = sysUserResult.getPhone(); + if(ObjectUtil.isNotEmpty(phone)) { + sysUserResult.setPhone(CommonCryptogramUtil.doSm4CbcDecrypt(phone)); + } + String idCardNumber = sysUserResult.getIdCardNumber(); + if(ObjectUtil.isNotEmpty(idCardNumber)) { + sysUserResult.setIdCardNumber(CommonCryptogramUtil.doSm4CbcDecrypt(idCardNumber)); + } + String emergencyPhone = sysUserResult.getEmergencyPhone(); + if(ObjectUtil.isNotEmpty(emergencyPhone)) { + sysUserResult.setEmergencyPhone(CommonCryptogramUtil.doSm4CbcDecrypt(emergencyPhone)); + } + return JSONUtil.parseObj(sysUserResult); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/wrapper/SysUserWrapperImpl.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/wrapper/SysUserWrapperImpl.java new file mode 100644 index 00000000..32bd4f92 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/wrapper/SysUserWrapperImpl.java @@ -0,0 +1,52 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.user.wrapper; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import vip.xiaonuo.common.pojo.CommonWrapperInterface; +import vip.xiaonuo.common.util.CommonCryptogramUtil; +import vip.xiaonuo.sys.modular.user.entity.SysUser; + +/** + * SysUser类型的包装实现类 + * + * @author xuyuxiang + * @date 2022/9/15 21:42 + */ +public class SysUserWrapperImpl implements CommonWrapperInterface { + + /** + * 对手机号和证件号码进行解密 + * + * @author xuyuxiang + * @date 2022/9/15 21:45 + */ + @Override + public JSONObject doWrap(SysUser sysUser) { + String phone = sysUser.getPhone(); + if(ObjectUtil.isNotEmpty(phone)) { + sysUser.setPhone(CommonCryptogramUtil.doSm4CbcDecrypt(phone)); + } + String idCardNumber = sysUser.getIdCardNumber(); + if(ObjectUtil.isNotEmpty(idCardNumber)) { + sysUser.setIdCardNumber(CommonCryptogramUtil.doSm4CbcDecrypt(idCardNumber)); + } + String emergencyPhone = sysUser.getEmergencyPhone(); + if(ObjectUtil.isNotEmpty(emergencyPhone)) { + sysUser.setEmergencyPhone(CommonCryptogramUtil.doSm4CbcDecrypt(emergencyPhone)); + } + return JSONUtil.parseObj(sysUser); + } +} diff --git a/snowy-web-app/README.md b/snowy-web-app/README.md new file mode 100644 index 00000000..b18d1f3d --- /dev/null +++ b/snowy-web-app/README.md @@ -0,0 +1 @@ +# 主启动模块 \ No newline at end of file diff --git a/snowy-web-app/pom.xml b/snowy-web-app/pom.xml new file mode 100644 index 00000000..7fd09b2d --- /dev/null +++ b/snowy-web-app/pom.xml @@ -0,0 +1,144 @@ + + + 4.0.0 + + + vip.xiaonuo + snowy + 2.0.0 + + + snowy-web-app + jar + 主启动模块 + + + 4.13.2 + 1.18.22 + 3.5.1 + 8.0.28 + 21.5.0.0 + 11.2.1.jre8 + + + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + junit + junit + ${junit.version} + test + + + + + com.baomidou + dynamic-datasource-spring-boot-starter + ${dynamic.datasource.version} + + + + + mysql + mysql-connector-java + ${mysql.connector.java.version} + + + + + + + + + + + + + + + + + vip.xiaonuo + snowy-plugin-auth + ${project.parent.version} + + + + + vip.xiaonuo + snowy-plugin-biz + ${project.parent.version} + + + + + vip.xiaonuo + snowy-plugin-client + ${project.parent.version} + + + + + vip.xiaonuo + snowy-plugin-dev + ${project.parent.version} + + + + + vip.xiaonuo + snowy-plugin-sys + ${project.parent.version} + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.5.4 + + true + + + + + repackage + + + + + + + \ No newline at end of file diff --git a/snowy-web-app/src/main/java/vip/xiaonuo/Application.java b/snowy-web-app/src/main/java/vip/xiaonuo/Application.java new file mode 100644 index 00000000..efc22a92 --- /dev/null +++ b/snowy-web-app/src/main/java/vip/xiaonuo/Application.java @@ -0,0 +1,63 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.Banner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc; + +/** + * SpringBoot方式启动类 + * + * @author xuyuxiang + * @date 2021/12/18 16:57 + */ +@Slf4j +@EnableSwagger2WebMvc +@RestController +@SpringBootApplication +public class Application { + + /* 解决druid 日志报错:discard long time none received connection:xxx */ + static { + System.setProperty("druid.mysql.usePingMethod","false"); + } + + /** + * 主启动函数 + * + * @author xuyuxiang + * @date 2022/7/30 21:42 + */ + public static void main(String[] args) { + SpringApplication springApplication = new SpringApplication(Application.class); + springApplication.setBannerMode(Banner.Mode.OFF); + springApplication.run(args); + log.info(">>> {}", Application.class.getSimpleName().toUpperCase() + " STARTING SUCCESS"); + } + + /** + * 首页 + * + * @author xuyuxiang + * @date 2022/7/8 14:22 + **/ + @GetMapping("/") + public String index() { + return "WELCOME"; + } +} diff --git a/snowy-web-app/src/main/java/vip/xiaonuo/core/config/GlobalConfigure.java b/snowy-web-app/src/main/java/vip/xiaonuo/core/config/GlobalConfigure.java new file mode 100644 index 00000000..7de02548 --- /dev/null +++ b/snowy-web-app/src/main/java/vip/xiaonuo/core/config/GlobalConfigure.java @@ -0,0 +1,542 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.core.config; + +import cn.dev33.satoken.context.SaHolder; +import cn.dev33.satoken.context.model.SaResponse; +import cn.dev33.satoken.filter.SaServletFilter; +import cn.dev33.satoken.router.SaHttpMethod; +import cn.dev33.satoken.router.SaRouter; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.EnumUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.ContentType; +import cn.hutool.http.Header; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.mapping.DatabaseIdProvider; +import org.apache.ibatis.reflection.MetaObject; +import org.apache.ibatis.reflection.ReflectionException; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.lang.NonNull; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import vip.xiaonuo.common.annotation.CommonNoRepeat; +import vip.xiaonuo.common.annotation.CommonWrapper; +import vip.xiaonuo.common.enums.CommonDeleteFlagEnum; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.pojo.CommonWrapperInterface; +import vip.xiaonuo.core.handler.GlobalExceptionUtil; +import vip.xiaonuo.sys.core.enums.SysBuildInEnum; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import javax.sql.DataSource; +import java.lang.reflect.Array; +import java.lang.reflect.Method; +import java.sql.SQLException; +import java.util.*; + +/** + * Snowy配置 + * + * @author xuyuxiang + * @date 2021/10/9 14:24 + **/ +@Configuration +@MapperScan(basePackages = {"vip.xiaonuo.**.mapper"}) +public class GlobalConfigure implements WebMvcConfigurer { + + /** + * 无需登录的接口地址集合 + */ + private static final String[] NO_LOGIN_PATH_ARR = { + /* 主入口 */ + "/", + + /* 静态资源 */ + "/favicon.ico", + "/doc.html", + "/webjars/**", + "/swagger-resources/**", + "/v2/api-docs", + "/v2/api-docs-ext", + "/configuration/ui", + "/configuration/security", + "/ureport/**", + "/druid/**", + + /* 认证相关 */ + "/auth/c/getPicCaptcha", + "/auth/c/getPhoneValidCode", + "/auth/c/doLogin", + "/auth/c/doLoginByPhone", + + "/auth/b/getPicCaptcha", + "/auth/b/getPhoneValidCode", + "/auth/b/doLogin", + "/auth/b/doLoginByPhone", + + /* 三方登录相关 */ + "/auth/third/render", + "/auth/third/callback", + + /* 系统基础配置 */ + "/dev/config/sysBaseList", + + /* 系统字典树 */ + "/dev/dict/tree", + + /* 文件下载 */ + "/dev/file/download", + + /* 用户个人中心相关 */ + "/sys/userCenter/getPicCaptcha", + "/sys/userCenter/findPasswordGetPhoneValidCode", + "/sys/userCenter/findPasswordGetEmailValidCode", + "/sys/userCenter/findPasswordByPhone", + "/sys/userCenter/findPasswordByEmail" + }; + + /** + * 仅超管使用的接口地址集合 + */ + private static final String[] SUPER_PERMISSION_PATH_ARR = { + "/auth/session/**", + "/auth/third/page", + "/client/user/**", + "/sys/org/**", + "/sys/position/**", + "/sys/button/**", + "/sys/menu/**", + "/sys/module/**", + "/sys/spa/**", + "/sys/role/**", + "/sys/user/**", + "/dev/config/**", + "/dev/dict/**", + "/dev/email/**", + "/dev/file/**", + "/dev/job/**", + "/dev/log/**", + "/dev/message/**", + "/dev/monitor/**", + "/dev/sms/**", + }; + + /** + * 注册跨域过滤器 + */ + @Bean + public SaServletFilter getSaServletFilter() { + return new SaServletFilter() + // 指定拦截路由 + .addInclude("/**") + + // 设置鉴权的接口 + .setAuth(r -> { + SaRouter.match("/**") + .notMatch(CollectionUtil.newArrayList(NO_LOGIN_PATH_ARR)) + .check(r1 -> StpUtil.checkLogin()); + SaRouter.match(CollectionUtil.newArrayList(SUPER_PERMISSION_PATH_ARR)) + .notMatch(CollectionUtil.newArrayList(NO_LOGIN_PATH_ARR)) + .check(r1 -> StpUtil.checkRole(SysBuildInEnum.BUILD_IN_ROLE_CODE.getValue())); + }) + // 前置函数:在每次认证函数之前执行 + .setBeforeAuth(obj -> { + + // ---------- 设置跨域响应头 ---------- + SaHolder.getResponse() + + // 是否可以在iframe显示视图: DENY=不可以 | SAMEORIGIN=同域下可以 | ALLOW-FROM uri=指定域名下可以 + // .setHeader("X-Frame-Options", "SAMEORIGIN") + + // 是否启用浏览器默认XSS防护: 0=禁用 | 1=启用 | 1; mode=block 启用, 并在检查到XSS攻击时,停止渲染页面 + .setHeader("X-XSS-Protection", "1; mode=block") + // 禁用浏览器内容嗅探 + .setHeader("X-Content-Type-Options", "nosniff") + // 允许指定域访问跨域资源 + .setHeader("Access-Control-Allow-Origin", "*") + // 允许所有请求方式 + .setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE") + // 有效时间 + .setHeader("Access-Control-Max-Age", "3600") + // 允许的header参数 + .setHeader("Access-Control-Allow-Headers", "*"); + + // 如果是预检请求,则立即返回到前端 + SaRouter.match(SaHttpMethod.OPTIONS) + // OPTIONS预检请求,不做处理 + .free(r -> {}) + .back(); + }).setError(e -> { + // 由于过滤器中抛出的异常不进入全局异常处理,所以必须提供[异常处理函数]来处理[认证函数]里抛出的异常 + // 在[异常处理函数]里的返回值,将作为字符串输出到前端,此处统一转为JSON输出前端 + SaResponse saResponse = SaHolder.getResponse(); + saResponse.setHeader(Header.CONTENT_TYPE.getValue(), ContentType.JSON + ";charset=" + CharsetUtil.UTF_8); + return GlobalExceptionUtil.getCommonResult((Exception) e); + }); + } + + /** + * RedisTemplate序列化 + * + * @author xuyuxiang + * @date 2022/6/21 17:01 + **/ + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(redisConnectionFactory); + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + redisTemplate.setKeySerializer(stringRedisSerializer); + redisTemplate.setHashKeySerializer(stringRedisSerializer); + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); + redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); + redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); + redisTemplate.afterPropertiesSet(); + return redisTemplate; + } + + /** + * 静态资源映射 + * + * @author xuyuxiang + * @date 2022/7/25 15:16 + **/ + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); + } + + /** + * 添加节流防抖拦截器 + * + * @author xuyuxiang + * @date 2022/6/20 15:18 + **/ + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new HandlerInterceptor() { + @Override + public boolean preHandle(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response, + @NonNull Object handler) throws Exception { + if (handler instanceof HandlerMethod) { + HandlerMethod handlerMethod = (HandlerMethod) handler; + Method method = handlerMethod.getMethod(); + CommonNoRepeat annotation = method.getAnnotation(CommonNoRepeat.class); + if (ObjectUtil.isNotEmpty(annotation)) { + if (this.isRepeatSubmit(request, annotation)) { + response.setCharacterEncoding(CharsetUtil.UTF_8); + response.setContentType(ContentType.JSON.toString()); + response.getWriter().write(JSONUtil.toJsonStr(CommonResult.error("请求过于频繁,请稍后再试"))); + return false; + } + } + } + return true; + } + + public boolean isRepeatSubmit(HttpServletRequest request, CommonNoRepeat annotation) { + JSONObject jsonObject = JSONUtil.createObj(); + jsonObject.set("repeatParam", JSONUtil.toJsonStr(request.getParameterMap())); + jsonObject.set("repeatTime", DateUtil.current()); + String url = request.getRequestURI(); + HttpSession session = request.getSession(); + Object sessionObj = session.getAttribute("repeatData"); + if (ObjectUtil.isNotEmpty(sessionObj)) { + JSONObject sessionJsonObject = JSONUtil.parseObj(sessionObj); + if(sessionJsonObject.containsKey(url)) { + JSONObject existRepeatJsonObject = sessionJsonObject.getJSONObject(url); + if (jsonObject.getStr("repeatParam").equals(existRepeatJsonObject.getStr("repeatParam")) && + jsonObject.getLong("repeatTime") - existRepeatJsonObject.getLong("repeatTime") < annotation.interval()) { + return true; + } + } + } + session.setAttribute("repeatData", JSONUtil.createObj().set(url, jsonObject)); + return false; + } + }).addPathPatterns("/**"); + } + + /** + * 通用Wrapper的AOP + * + * @author xuyuxiang + * @date 2022/9/15 21:24 + */ + @Component + @Aspect + public static class CommonWrapperAop { + + /** + * 切入点 + * + * @author xuyuxiang + * @date 2022/9/15 21:27 + */ + @Pointcut("@annotation(vip.xiaonuo.common.annotation.CommonWrapper)") + private void wrapperPointcut() { + + } + + /** + * 执行包装 + * + * @author xuyuxiang + * @date 2022/9/15 21:27 + */ + @Around("wrapperPointcut()") + public Object doWrapper(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { + // 直接执行原有业务逻辑 + Object proceedResult = proceedingJoinPoint.proceed(); + return processWrapping(proceedingJoinPoint, proceedResult); + } + + /** + * 具体包装过程 + * + * @author xuyuxiang + * @date 2022/9/15 21:27 + */ + @SuppressWarnings("all") + private Object processWrapping(ProceedingJoinPoint proceedingJoinPoint, Object originResult) throws IllegalAccessException, InstantiationException { + MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature(); + Method method = methodSignature.getMethod(); + CommonWrapper commonWrapper = method.getAnnotation(CommonWrapper.class); + Class>[] baseWrapperClasses = commonWrapper.value(); + if (ObjectUtil.isEmpty(baseWrapperClasses)) { + return originResult; + } + if (!(originResult instanceof CommonResult)) { + return originResult; + } + CommonResult commonResult = (CommonResult) originResult; + Object beWrapped = commonResult.getData(); + if (ObjectUtil.isBasicType(beWrapped)) { + throw new CommonException("被包装的值不能是基本类型"); + } + if (beWrapped instanceof Page) { + Page page = (Page) beWrapped; + ArrayList> maps = new ArrayList<>(); + for (Object wrappedItem : page.getRecords()) { + maps.add(this.wrapPureObject(wrappedItem, baseWrapperClasses)); + } + page.setRecords(maps); + commonResult.setData(page); + } else if (beWrapped instanceof Collection) { + Collection collection = (Collection) beWrapped; + List> maps = new ArrayList<>(); + for (Object wrappedItem : collection) { + maps.add(this.wrapPureObject(wrappedItem, baseWrapperClasses)); + } + commonResult.setData(maps); + } else if (ArrayUtil.isArray(beWrapped)) { + Object[] objects = this.objToArray(beWrapped); + ArrayList> maps = new ArrayList<>(); + for (Object wrappedItem : objects) { + maps.add(this.wrapPureObject(wrappedItem, baseWrapperClasses)); + } + commonResult.setData(maps); + } else { + commonResult.setData(this.wrapPureObject(beWrapped, baseWrapperClasses)); + } + return commonResult; + } + + /** + * 原始对象包装JSONObject + * + * @author xuyuxiang + * @date 2022/9/15 21:36 + */ + @SuppressWarnings("all") + private JSONObject wrapPureObject(Object originModel, Class>[] baseWrapperClasses) { + JSONObject jsonObject = JSONUtil.parseObj(originModel); + try { + for (Class> commonWrapperClass : baseWrapperClasses) { + CommonWrapperInterface commonWrapperInterface = commonWrapperClass.newInstance(); + Map incrementFieldsMap = commonWrapperInterface.doWrap(originModel); + jsonObject.putAll(incrementFieldsMap); + } + } catch (Exception e) { + throw new CommonException("原始对象包装过程,字段转化异常:{}", e.getMessage()); + } + return jsonObject; + } + + /** + * Object转array + * + * @author xuyuxiang + * @date 2022/9/15 21:34 + */ + private Object[] objToArray(Object object) { + int length = Array.getLength(object); + Object[] result = new Object[length]; + for (int i = 0; i < result.length; i++) { + result[i] = Array.get(object, i); + } + return result; + } + } + + /** + * 分页插件 + * + * @author xuyuxiang + * @date 2022/3/11 10:59 + **/ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); + mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); + return mybatisPlusInterceptor; + } + + /** + * 数据库id选择器,用于Mapper.xml中 + * MyBatis可以根据不同的数据库厂商执行不同的语句 + * + * @author xuyuxiang + * @date 2022/1/8 2:16 + */ + @Component + public static class CustomDbIdProvider implements DatabaseIdProvider { + + @Override + public String getDatabaseId(DataSource dataSource) throws SQLException { + String url = dataSource.getConnection().getMetaData().getURL(); + if (url.contains("oracle")) { + return "oracle"; + } else if (url.contains("postgresql")) { + return "pgsql"; + } else if (url.contains("mysql")) { + return "mysql"; + } else if (url.contains("dm")) { + return "dm"; + } else if (url.contains("kingbase")) { + return "kingbase"; + } else { + return "mysql"; + } + } + } + + /** + * 自定义公共字段自动注入 + * + * @author xuyuxiang + * @date 2020/3/31 15:42 + */ + @Component + public static class CustomMetaObjectHandler implements MetaObjectHandler { + + /** 删除标志 */ + private static final String DELETE_FLAG = "deleteFlag"; + + /** 创建人 */ + private static final String CREATE_USER = "createUser"; + + /** 创建时间 */ + private static final String CREATE_TIME = "createTime"; + + /** 更新人 */ + private static final String UPDATE_USER = "updateUser"; + + /** 更新时间 */ + private static final String UPDATE_TIME = "updateTime"; + + @Override + public void insertFill(MetaObject metaObject) { + try { + //为空则设置deleteFlag + Object deleteFlag = metaObject.getValue(DELETE_FLAG); + if (ObjectUtil.isNull(deleteFlag)) { + setFieldValByName(DELETE_FLAG, EnumUtil.toString(CommonDeleteFlagEnum.NOT_DELETE), metaObject); + } + } catch (ReflectionException ignored) { } + try { + //为空则设置createUser + Object createUser = metaObject.getValue(CREATE_USER); + if (ObjectUtil.isNull(createUser)) { + setFieldValByName(CREATE_USER, this.getUserId(), metaObject); + } + } catch (ReflectionException ignored) { } + try { + //为空则设置createTime + Object createTime = metaObject.getValue(CREATE_TIME); + if (ObjectUtil.isNull(createTime)) { + setFieldValByName(CREATE_TIME, new Date(), metaObject); + } + } catch (ReflectionException ignored) { } + } + + @Override + public void updateFill(MetaObject metaObject) { + try { + //设置updateUser + setFieldValByName(UPDATE_USER, this.getUserId(), metaObject); + } catch (ReflectionException ignored) { } + try { + //设置updateTime + setFieldValByName(UPDATE_TIME, DateTime.now(), metaObject); + } catch (ReflectionException ignored) { } + } + + /** + * 获取用户id + */ + private String getUserId() { + try { + String loginId = StpUtil.getLoginIdAsString(); + if (ObjectUtil.isNotEmpty(loginId)) { + return loginId; + } else { + return "-1"; + } + } catch (Exception e) { + return "-1"; + } + + } + } +} diff --git a/snowy-web-app/src/main/java/vip/xiaonuo/core/handler/GlobalErrorAttributesHandler.java b/snowy-web-app/src/main/java/vip/xiaonuo/core/handler/GlobalErrorAttributesHandler.java new file mode 100644 index 00000000..79541989 --- /dev/null +++ b/snowy-web-app/src/main/java/vip/xiaonuo/core/handler/GlobalErrorAttributesHandler.java @@ -0,0 +1,66 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.core.handler; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpStatus; +import org.springframework.boot.web.error.ErrorAttributeOptions; +import org.springframework.boot.web.servlet.error.DefaultErrorAttributes; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.WebRequest; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.pojo.CommonResult; + +import java.util.Map; + +/** + * 将未知错误异常,输出格式重写为我们熟悉的响应格式 + * + * @author xuyuxiang + * @date 2021/10/9 15:24 + **/ +@Component +public class GlobalErrorAttributesHandler extends DefaultErrorAttributes { + @Override + public Map getErrorAttributes(WebRequest webRequest, ErrorAttributeOptions attributeOptions) { + // 获取spring默认的返回内容 + Map defaultErrorAttributes = super.getErrorAttributes(webRequest, attributeOptions); + + // 获取其状态码 + Object status = defaultErrorAttributes.get("status"); + if (ObjectUtil.isNotEmpty(status)) { + // 如果其为404,则处理 + if (HttpStatus.HTTP_NOT_FOUND == Convert.toInt(status)) { + return BeanUtil.beanToMap(CommonResult.get(HttpStatus.HTTP_NOT_FOUND, "路径不存在", null)); + } else { + return BeanUtil.beanToMap(CommonResult.get(HttpStatus.HTTP_INTERNAL_ERROR, "服务器异常", null)); + } + } + + // 如果返回的异常是CommonException,则按CommonException响应的内容进行返回 + Throwable throwable = this.getError(webRequest); + if (ObjectUtil.isNotEmpty(throwable)) { + if (throwable instanceof CommonException) { + CommonException commonException = (CommonException) throwable; + return BeanUtil.beanToMap(CommonResult.error(commonException.getMsg())); + } else { + return BeanUtil.beanToMap(CommonResult.get(HttpStatus.HTTP_INTERNAL_ERROR, "服务器异常", null)); + } + } else { + // throwable为空,则直接返回默认异常 + return BeanUtil.beanToMap(CommonResult.error("服务器异常")); + } + } +} diff --git a/snowy-web-app/src/main/java/vip/xiaonuo/core/handler/GlobalErrorViewController.java b/snowy-web-app/src/main/java/vip/xiaonuo/core/handler/GlobalErrorViewController.java new file mode 100644 index 00000000..a6a3b5c2 --- /dev/null +++ b/snowy-web-app/src/main/java/vip/xiaonuo/core/handler/GlobalErrorViewController.java @@ -0,0 +1,60 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.core.handler; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.common.pojo.CommonResult; + +import javax.servlet.http.HttpServletRequest; + +/** + * 全局异常页面处理器,覆盖默认的Whitelabel Error Page + * + * @author xuyuxiang + * @date 2022/2/11 15:41 + **/ +@Slf4j +@RestController +public class GlobalErrorViewController { + + /** + * Error页面视图,直接响应JSON + * + * @author xuyuxiang + * @date 2022/2/11 16:11 + **/ + @RequestMapping("/errorView") + public CommonResult globalError(HttpServletRequest request) { + CommonResult commonResult = new CommonResult<>(404, "路径不存在", null); + Object model = request.getAttribute("model"); + if(ObjectUtil.isNotEmpty(model)) { + JSONObject errorObj = JSONUtil.parseObj(model); + Integer code = errorObj.getInt("code"); + String msg = errorObj.getStr("msg"); + if(ObjectUtil.isAllNotEmpty(code, msg)) { + commonResult.setCode(code).setMsg(msg); + } else if(ObjectUtil.isNotEmpty(msg)) { + commonResult = CommonResult.error(msg); + } else { + commonResult = CommonResult.error(); + } + } + log.error(">>> {}", commonResult.getMsg()); + return commonResult; + } +} diff --git a/snowy-web-app/src/main/java/vip/xiaonuo/core/handler/GlobalErrorViewHandler.java b/snowy-web-app/src/main/java/vip/xiaonuo/core/handler/GlobalErrorViewHandler.java new file mode 100644 index 00000000..1ce6287e --- /dev/null +++ b/snowy-web-app/src/main/java/vip/xiaonuo/core/handler/GlobalErrorViewHandler.java @@ -0,0 +1,73 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.core.handler; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import org.springframework.boot.autoconfigure.web.ServerProperties; +import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Collections; +import java.util.Map; + +/** + * 全局异常页面处理器,覆盖默认的Whitelabel Error Page + * + * @author xuyuxiang + * @date 2022/2/11 15:41 + **/ +@RestController +public class GlobalErrorViewHandler extends BasicErrorController { + + public GlobalErrorViewHandler(ServerProperties serverProperties) { + super(new GlobalErrorAttributesHandler(), serverProperties.getError()); + } + + /** + * 覆盖默认的Json响应 + * + * @author xuyuxiang + * @date 2022/2/11 15:47 + **/ + @Override + public ResponseEntity> error(HttpServletRequest request) { + Map defaultErrorAttributes = super.getErrorAttributes(request, getErrorAttributeOptions(request, MediaType.ALL)); + Integer code = Convert.toInt(defaultErrorAttributes.get("code")); + return new ResponseEntity<>(defaultErrorAttributes, HttpStatus.valueOf(ObjectUtil.isNotEmpty(code)?code:500)); + } + + /** + * 覆盖默认的错误页面,响应JSON + * + * @author xuyuxiang + * @date 2022/2/12 21:55 + */ + @Override + @RequestMapping(produces = {"text/html"}) + public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) { + HttpStatus status = this.getStatus(request); + Map model = Collections.unmodifiableMap(this.getErrorAttributes(request, this.getErrorAttributeOptions(request, MediaType.TEXT_HTML))); + response.setStatus(status.value()); + ModelAndView modelAndView = this.resolveErrorView(request, response, status, model); + request.setAttribute("model", model); + return modelAndView != null ? modelAndView : new ModelAndView("errorView", model); + } +} diff --git a/snowy-web-app/src/main/java/vip/xiaonuo/core/handler/GlobalExceptionHandler.java b/snowy-web-app/src/main/java/vip/xiaonuo/core/handler/GlobalExceptionHandler.java new file mode 100644 index 00000000..13ead595 --- /dev/null +++ b/snowy-web-app/src/main/java/vip/xiaonuo/core/handler/GlobalExceptionHandler.java @@ -0,0 +1,40 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.core.handler; + +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import vip.xiaonuo.common.pojo.CommonResult; + +/** + * 全局异常处理器 + * + * @author xuyuxiang + * @date 2021/10/9 14:59 + **/ +@ControllerAdvice +public class GlobalExceptionHandler { + + /** + * 不同异常返回不同结果 + * + * @author xuyuxiang + * @date 2022/7/28 16:54 + **/ + @ResponseBody + @ExceptionHandler + public CommonResult handleException(Exception e) { + return GlobalExceptionUtil.getCommonResult(e); + } +} diff --git a/snowy-web-app/src/main/java/vip/xiaonuo/core/handler/GlobalExceptionUtil.java b/snowy-web-app/src/main/java/vip/xiaonuo/core/handler/GlobalExceptionUtil.java new file mode 100644 index 00000000..88d066cc --- /dev/null +++ b/snowy-web-app/src/main/java/vip/xiaonuo/core/handler/GlobalExceptionUtil.java @@ -0,0 +1,174 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.core.handler; + +import cn.dev33.satoken.exception.SaTokenException; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpStatus; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpMethod; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.validation.BindException; +import org.springframework.validation.BindingResult; +import org.springframework.validation.ObjectError; +import org.springframework.web.HttpMediaTypeNotSupportedException; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingServletRequestParameterException; +import org.springframework.web.multipart.MultipartException; +import org.springframework.web.multipart.support.MissingServletRequestPartException; +import vip.xiaonuo.auth.core.util.AuthExceptionUtil; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.util.CommonServletUtil; + +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import java.util.List; +import java.util.Set; + +/** + * 全局异常处理工具类,将异常转为通用结果 + * + * @author xuyuxiang + * @date 2021/12/18 16:44 + */ +@Slf4j +public class GlobalExceptionUtil { + + /** + * 根据错误类型获取对应的CommonResult + * + * @author xuyuxiang + * @date 2021/10/11 15:52 + **/ + public static CommonResult getCommonResult(Exception e) { + CommonResult commonResult; + if (e instanceof HttpRequestMethodNotSupportedException) { + + // 如果是请求方法异常 405 + String method = CommonServletUtil.getRequest().getMethod(); + if (HttpMethod.GET.toString().equals(method)) { + commonResult = CommonResult.get(HttpStatus.HTTP_BAD_METHOD, "请求方法应为POST", null); + } else if(HttpMethod.POST.toString().equals(method)) { + commonResult = CommonResult.get(HttpStatus.HTTP_BAD_METHOD, "请求方法应为GET", null); + } else { + commonResult = CommonResult.get(HttpStatus.HTTP_BAD_METHOD, "请求方法仅支持GET或POST", null); + } + } else if (e instanceof HttpMessageNotReadableException) { + + // 如果是参数传递格式不支持异常 415 + if (e.getMessage().contains("JSON parse error")) { + + //JSON格式转换错误特殊提示 + commonResult = CommonResult.get(HttpStatus.HTTP_UNSUPPORTED_TYPE, "参数格式错误", null); + } else { + commonResult = CommonResult.get(HttpStatus.HTTP_UNSUPPORTED_TYPE, "请使用JSON方式传参", null); + } + } else if (e instanceof HttpMediaTypeNotSupportedException) { + + // 如果是JSON参数格式错误异常 415 + commonResult = CommonResult.get(HttpStatus.HTTP_UNSUPPORTED_TYPE, "参数格式错误", null); + } else if (e instanceof MethodArgumentNotValidException) { + + // 如果是参数校验异常(MethodArgumentNotValidException) 415 + MethodArgumentNotValidException methodArgumentNotValidException = (MethodArgumentNotValidException) e; + commonResult = CommonResult.get(HttpStatus.HTTP_UNSUPPORTED_TYPE, getArgNotValidMessage(methodArgumentNotValidException.getBindingResult()), null); + } else if (e instanceof BindException) { + + // 如果是参数校验异常(BindException) 415 + BindException bindException = (BindException) e; + commonResult = CommonResult.get(HttpStatus.HTTP_UNSUPPORTED_TYPE, getArgNotValidMessage(bindException.getBindingResult()), null); + } else if (e instanceof ConstraintViolationException) { + + // 如果是参数校验异常(ConstraintViolationException) 415 + ConstraintViolationException constraintViolationException = (ConstraintViolationException) e; + commonResult = CommonResult.get(HttpStatus.HTTP_UNSUPPORTED_TYPE, getArgNotValidMessage(constraintViolationException.getConstraintViolations()), null); + } else if (e instanceof MissingServletRequestParameterException) { + + // 如果是参数校验异常(MissingServletRequestParameterException) 415 + MissingServletRequestParameterException missingServletRequestParameterException = (MissingServletRequestParameterException) e; + commonResult = CommonResult.get(HttpStatus.HTTP_UNSUPPORTED_TYPE, missingServletRequestParameterException.getMessage(), null); + } + else if (e instanceof MultipartException) { + + //文件上传错误特殊提示 + commonResult = CommonResult.error("请使用multipart/form-data方式上传文件"); + } else if (e instanceof MissingServletRequestPartException) { + + //文件上传错误特殊提示 + commonResult = CommonResult.error("请选择要上传的文件并检查文件参数名称是否正确"); + } else if (e instanceof SaTokenException) { + + // 如果是SaToken相关异常,则由AuthExceptionUtil处理 + return AuthExceptionUtil.getCommonResult(e); + } else if (e instanceof CommonException) { + + // 通用业务异常,直接返回给前端 + CommonException commonException = (CommonException) e; + commonResult = CommonResult.get(commonException.getCode(), commonException.getMsg(), null); + } else { + // 未知异常打印详情 + e.printStackTrace(); + + // 未知异常返回服务器异常 + commonResult = CommonResult.error("服务器异常"); + } + log.error(">>> {},请求地址:{}", commonResult.getMsg(), CommonServletUtil.getRequest().getRequestURL()); + return commonResult; + } + + /** + * 获取请求参数不正确的提示信息,多个信息,拼接成用逗号分隔的形式 + * + * @author xuyuxiang + * @date 2021/10/12 11:14 + **/ + public static String getArgNotValidMessage(Set> constraintViolationSet) { + if (ObjectUtil.isEmpty(constraintViolationSet)) { + return ""; + } + StringBuilder stringBuilder = StrUtil.builder(); + + // 多个错误用逗号分隔 + for (ConstraintViolation constraintViolation : constraintViolationSet) { + stringBuilder.append(StrUtil.COMMA).append(constraintViolation.getMessage()); + } + + // 最终把首部的逗号去掉 + return StrUtil.removePrefix(stringBuilder.toString(), StrUtil.COMMA); + } + + /** + * 获取请求参数不正确的提示信息,多个信息,拼接成用逗号分隔的形式 + * + * @author xuyuxiang + * @date 2021/10/12 11:14 + **/ + public static String getArgNotValidMessage(BindingResult bindingResult) { + if (ObjectUtil.isNull(bindingResult)) { + return ""; + } + StringBuilder stringBuilder = StrUtil.builder(); + + // 多个错误用逗号分隔 + List allErrorInfos = bindingResult.getAllErrors(); + for (ObjectError error : allErrorInfos) { + stringBuilder.append(StrUtil.COMMA).append(error.getDefaultMessage()); + } + + // 最终把首部的逗号去掉 + return StrUtil.removePrefix(stringBuilder.toString(), StrUtil.COMMA); + } +} diff --git a/snowy-web-app/src/main/resources/README.md b/snowy-web-app/src/main/resources/README.md new file mode 100644 index 00000000..87802ef6 --- /dev/null +++ b/snowy-web-app/src/main/resources/README.md @@ -0,0 +1,6 @@ +#druid加密密码 +java -cp druid-1.2.8.jar com.alibaba.druid.filter.config.ConfigTools your password + +privateKey:MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAxaJNW11cVWuAUcMMoQtkzRLLCRZjcqO6A33R5jlKiCifWPxjQKU8XufHcW4TukB4EqK/sKEhLS+/H/n1ZSkqZQIDAQABAkAN8PACBOjxgZ7QpbCrX5FhwfSelHy5ZoFFo8d9tQbj6dHOrfwHsRqAkAxGoZ/ivhDKUYf/G7eSwVUqv2H0T1m1AiEA9jRLwNL4/R5HhqfqNVMIF+GbuBhtM+HHPFOoOCR0f4sCIQDNf0ulYZf4DuyDiDuvpWjMtLEuNgnN0LOo1iVKFtM7zwIgfcdfwAXIEEAM2H0mSNG/e7vVeup3t56r02UFtpDhN1sCIQCGhrnnx07sJiDxLoMcRmWn9PY0sU2TvfePJLl+mhiogwIhAPPckbPRPJP52gutyn8GGNV28absrzjA6thi6KAej1aC +publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMWiTVtdXFVrgFHDDKELZM0SywkWY3KjugN90eY5Sogon1j8Y0ClPF7nx3FuE7pAeBKiv7ChIS0vvx/59WUpKmUCAwEAAQ== +password:DDnBgo6jKfgn7z+Qhn4/KTbzKzyT/ByFi7JDJA2w6yP/t++OQUjHJyApYeWaN4qVFV3V4fq0HbqTmkyWVj44yA== \ No newline at end of file diff --git a/snowy-web-app/src/main/resources/_sql/snowy_mysql.sql b/snowy-web-app/src/main/resources/_sql/snowy_mysql.sql new file mode 100644 index 00000000..7a6a7360 --- /dev/null +++ b/snowy-web-app/src/main/resources/_sql/snowy_mysql.sql @@ -0,0 +1,1063 @@ +/* + Navicat Premium Data Transfer + + Source Server : localhost_3306 + Source Server Type : MySQL + Source Server Version : 80026 + Source Host : localhost:3306 + Source Schema : snowy + + Target Server Type : MySQL + Target Server Version : 80026 + File Encoding : 65001 + + Date: 21/09/2022 11:09:51 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for AUTH_THIRD_USER +-- ---------------------------- +DROP TABLE IF EXISTS `AUTH_THIRD_USER`; +CREATE TABLE `AUTH_THIRD_USER` ( + `ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `THIRD_ID` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '三方用户id', + `USER_ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '系统用户id', + `AVATAR` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '头像', + `NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名', + `NICKNAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '昵称', + `GENDER` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '性别', + `CATEGORY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分类', + `EXT_JSON` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '扩展信息', + `DELETE_FLAG` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '删除标志', + `CREATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `CREATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建用户', + `UPDATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `UPDATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改用户', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '三方用户' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of AUTH_THIRD_USER +-- ---------------------------- + +-- ---------------------------- +-- Table structure for CLIENT_RELATION +-- ---------------------------- +DROP TABLE IF EXISTS `CLIENT_RELATION`; +CREATE TABLE `CLIENT_RELATION` ( + `ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `OBJECT_ID` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '对象ID', + `TARGET_ID` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '目标ID', + `CATEGORY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分类', + `EXT_JSON` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '扩展信息', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '关系' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of CLIENT_RELATION +-- ---------------------------- + +-- ---------------------------- +-- Table structure for CLIENT_USER +-- ---------------------------- +DROP TABLE IF EXISTS `CLIENT_USER`; +CREATE TABLE `CLIENT_USER` ( + `ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `AVATAR` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '头像', + `SIGNATURE` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '签名', + `ACCOUNT` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '账号', + `PASSWORD` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码', + `NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名', + `NICKNAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '昵称', + `GENDER` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '性别', + `AGE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '年龄', + `BIRTHDAY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '出生日期', + `NATION` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '民族', + `NATIVE_PLACE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '籍贯', + `HOME_ADDRESS` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '家庭住址', + `MAILING_ADDRESS` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '通信地址', + `ID_CARD_TYPE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '证件类型', + `ID_CARD_NUMBER` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '证件号码', + `CULTURE_LEVEL` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文化程度', + `POLITICAL_OUTLOOK` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '政治面貌', + `COLLEGE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '毕业院校', + `EDUCATION` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '学历', + `EDU_LENGTH` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '学制', + `DEGREE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '学位', + `PHONE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机', + `EMAIL` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱', + `HOME_TEL` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '家庭电话', + `OFFICE_TEL` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '办公电话', + `EMERGENCY_CONTACT` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '紧急联系人', + `EMERGENCY_PHONE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '紧急联系人电话', + `EMERGENCY_ADDRESS` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '紧急联系人地址', + `LAST_LOGIN_IP` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '上次登录ip', + `LAST_LOGIN_ADDRESS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '上次登录地点', + `LAST_LOGIN_TIME` datetime(0) NULL DEFAULT NULL COMMENT '上次登录时间', + `LAST_LOGIN_DEVICE` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '上次登录设备', + `LATEST_LOGIN_IP` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '最新登录ip', + `LATEST_LOGIN_ADDRESS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '最新登录地点', + `LATEST_LOGIN_TIME` datetime(0) NULL DEFAULT NULL COMMENT '最新登录时间', + `LATEST_LOGIN_DEVICE` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '最新登录设备', + `USER_STATUS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户状态', + `SORT_CODE` int(0) NULL DEFAULT NULL COMMENT '排序码', + `EXT_JSON` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '扩展信息', + `DELETE_FLAG` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '删除标志', + `CREATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `CREATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建用户', + `UPDATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `UPDATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改用户', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'C端用户' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of CLIENT_USER +-- ---------------------------- + +-- ---------------------------- +-- Table structure for DEV_CONFIG +-- ---------------------------- +DROP TABLE IF EXISTS `DEV_CONFIG`; +CREATE TABLE `DEV_CONFIG` ( + `ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `CONFIG_KEY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '配置键', + `CONFIG_VALUE` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '配置值', + `CATEGORY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分类', + `REMARK` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `SORT_CODE` int(0) NULL DEFAULT NULL COMMENT '排序码', + `EXT_JSON` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '扩展信息', + `DELETE_FLAG` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '删除标志', + `CREATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `CREATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建用户', + `UPDATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `UPDATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改用户', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '配置' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of DEV_CONFIG +-- ---------------------------- +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967455', 'SNOWY_SYS_LOGO', 'data:image/png;base64,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', 'SYS_BASE', '系统LOGO', 1, NULL, 'NOT_DELETE', '2022-08-18 01:03:52', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967456', 'SNOWY_SYS_NAME', 'Snowy', 'SYS_BASE', '系统名称', 2, NULL, 'NOT_DELETE', '2022-08-18 01:09:44', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967457', 'SNOWY_SYS_VERSION', 'V2.0.0', 'SYS_BASE', '系统版本', 3, NULL, 'NOT_DELETE', '2022-08-18 01:10:45', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967458', 'SNOWY_SYS_COPYRIGHT', 'Snowy ©2022 Created by 小诺开源技术', 'SYS_BASE', '系统版权', 4, NULL, 'NOT_DELETE', '2022-08-18 01:11:28', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967459', 'SNOWY_SYS_COPYRIGHT_URL', 'https://www.xiaonuo.vip', 'SYS_BASE', '系统版权链接地址', 5, NULL, 'NOT_DELETE', '2022-08-18 01:12:15', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967462', 'SNOWY_SYS_DEFAULT_CAPTCHA_OPEN', 'false', 'SYS_BASE', '登录验证码开关', 8, NULL, 'NOT_DELETE', '2022-04-22 13:13:56', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967463', 'SNOWY_SYS_DEFAULT_FILE_ENGINE', 'LOCAL', 'SYS_BASE', '默认文件存储引擎', 9, NULL, 'NOT_DELETE', '2022-04-22 13:13:56', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967464', 'SNOWY_SYS_DEFAULT_PASSWORD', '123456', 'SYS_BASE', '默认用户密码', 10, NULL, 'NOT_DELETE', '2022-07-05 18:53:48', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967465', 'SNOWY_SYS_DEFAULT_DESCRRIPTION', 'Snowy是一款国内首例国产密码算法加密框架,采用Vue3.0+AntDesignVue3.0+SpringBoot2.8前后分离技术打造,技术框架与密码的结合,让前后分离‘密’不可分!', 'SYS_BASE', '系统描述', 11, NULL, 'NOT_DELETE', '2022-08-18 01:15:49', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967466', 'SNOWY_SYS_DEFAULT_WORKBENCH_DATA', '{\"shortcut\":[{\"id\":\"1548901111999770526\",\"title\":\"系统首页\",\"icon\":\"home-outlined\",\"path\":\"/index\"},{\"id\":\"1548901111999770527\",\"title\":\"个人中心\",\"icon\":\"appstore-outlined\",\"path\":\"/usercenter\"}]}', 'SYS_BASE', '系统默认工作台数据', 12, NULL, 'NOT_DELETE', '2022-08-18 01:15:49', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967558', 'SNOWY_THIRD_GITEE_CLIENT_ID', 'GiteeClientId', 'THIRD_GITEE', 'GiteeClientId', 13, NULL, 'NOT_DELETE', '2022-04-22 13:13:56', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967559', 'SNOWY_THIRD_GITEE_CLIENT_SECRET', 'GiteeClientSecret', 'THIRD_GITEE', 'GiteeClientSecret', 14, NULL, 'NOT_DELETE', '2022-04-22 13:13:56', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967560', 'SNOWY_THIRD_GITEE_REDIRECT_URL', 'http://localhost:81/callback?platform=gitee', 'THIRD_GITEE', 'Gitee重定向地址', 15, NULL, 'NOT_DELETE', '2022-04-22 13:13:56', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967561', 'SNOWY_THIRD_WECHAT_CLIENT_ID', 'WechatClientId', 'THIRD_WECHAT', 'WechatClientId', 16, NULL, 'NOT_DELETE', '2022-04-22 13:13:56', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967562', 'SNOWY_THIRD_WECHAT_CLIENT_SECRET', 'WechatClientSecret', 'THIRD_WECHAT', 'WechatClientSecret', 17, NULL, 'NOT_DELETE', '2022-04-22 13:13:56', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967563', 'SNOWY_THIRD_WECHAT_REDIRECT_URL', 'Wechat重定向地址', 'THIRD_WECHAT', 'Wechat重定向地址', 18, NULL, 'NOT_DELETE', '2022-04-22 13:13:56', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967564', 'SNOWY_FILE_LOCAL_FOLDER_FOR_WINDOWS', 'D:/defaultUploadFolder', 'FILE_LOCAL', '本地文件Windows存储位置', 19, NULL, 'NOT_DELETE', '2022-04-22 13:13:56', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967565', 'SNOWY_FILE_LOCAL_FOLDER_FOR_UNIX', '/defaultUploadFolder', 'FILE_LOCAL', '本地文件Linux存储位置', 20, NULL, 'NOT_DELETE', '2022-04-22 13:14:23', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967566', 'SNOWY_FILE_TENCENT_SECRET_ID', '腾讯云文件SecretId', 'FILE_TENCENT', '腾讯云文件SecretId', 21, NULL, 'NOT_DELETE', '2022-04-22 13:15:39', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967567', 'SNOWY_FILE_TENCENT_SECRET_KEY', '腾讯云文件SecretKey', 'FILE_TENCENT', '腾讯云文件SecretKey', 22, NULL, 'NOT_DELETE', '2022-04-22 13:16:23', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967568', 'SNOWY_FILE_TENCENT_REGION_ID', '腾讯云文件RegionId', 'FILE_TENCENT', '腾讯云文件RegionId', 23, NULL, 'NOT_DELETE', '2022-04-22 13:16:57', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967569', 'SNOWY_FILE_TENCENT_DEFAULT_BUCKET_NAME', 'defaultbucket', 'FILE_TENCENT', '腾讯云文件默认存储桶', 24, NULL, 'NOT_DELETE', '2022-04-22 13:16:57', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967570', 'SNOWY_FILE_ALIYUN_ACCESS_KEY_ID', '阿里云文件AccessKeyId', 'FILE_ALIYUN', '阿里云文件AccessKeyId', 25, NULL, 'NOT_DELETE', '2022-04-22 13:18:31', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967571', 'SNOWY_FILE_ALIYUN_ACCESS_KEY_SECRET', '阿里云文件AccessKeySecret', 'FILE_ALIYUN', '阿里云文件AccessKeySecret', 26, NULL, 'NOT_DELETE', '2022-04-22 13:18:45', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967572', 'SNOWY_FILE_ALIYUN_END_POINT', '阿里云文件EndPoint', 'FILE_ALIYUN', '阿里云文件EndPoint', 27, NULL, 'NOT_DELETE', '2022-04-22 13:19:05', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967573', 'SNOWY_FILE_ALIYUN_DEFAULT_BUCKET_NAME', 'defaultbucket', 'FILE_ALIYUN', '阿里云文件默认存储桶', 28, NULL, 'NOT_DELETE', '2022-04-22 13:19:05', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967574', 'SNOWY_FILE_MINIO_ACCESS_KEY', 'MINIO文件AccessKey', 'FILE_MINIO', 'MINIO文件AccessKey', 29, NULL, 'NOT_DELETE', '2022-04-22 13:20:11', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967575', 'SNOWY_FILE_MINIO_SECRET_KEY', 'MINIO文件SecetKey', 'FILE_MINIO', 'MINIO文件SecetKey', 30, NULL, 'NOT_DELETE', '2022-04-22 13:20:26', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967576', 'SNOWY_FILE_MINIO_END_POINT', 'MINIO文件EndPoint', 'FILE_MINIO', 'MINIO文件EndPoint', 31, NULL, 'NOT_DELETE', '2022-04-22 13:20:41', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967577', 'SNOWY_FILE_MINIO_DEFAULT_BUCKET_NAME', 'defaultbucket', 'FILE_MINIO', 'MINIO文件默认存储桶', 32, NULL, 'NOT_DELETE', '2022-04-22 13:20:41', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967578', 'SNOWY_EMAIL_LOCAL_FROM', '本地邮件发件账号', 'EMAIL_LOCAL', '本地邮件发件账号', 33, NULL, 'NOT_DELETE', '2022-04-22 13:39:06', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967579', 'SNOWY_EMAIL_LOCAL_PASSWORD', '本地邮件发件密码', 'EMAIL_LOCAL', '本地邮件发件密码', 34, NULL, 'NOT_DELETE', '2022-04-22 13:40:02', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967580', 'SNOWY_EMAIL_TENCENT_SECRET_ID', '腾讯云邮件SecretId', 'EMAIL_TENCENT', '腾讯云邮件SecretId', 35, NULL, 'NOT_DELETE', '2022-04-22 13:40:48', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967581', 'SNOWY_EMAIL_TENCENT_SECRET_KEY', '腾讯云邮件SecretKey', 'EMAIL_TENCENT', '腾讯云邮件SecretKey', 36, NULL, 'NOT_DELETE', '2022-04-22 13:40:56', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967582', 'SNOWY_EMAIL_TENCENT_REGION_ID', '腾讯云邮件RegionId', 'EMAIL_TENCENT', '腾讯云邮件RegionId', 37, NULL, 'NOT_DELETE', '2022-04-22 13:41:15', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967583', 'SNOWY_EMAIL_ALIYUN_ACCESS_KEY_ID', '阿里云邮件AccessKeyId', 'EMAIL_ALIYUN', '阿里云邮件AccessKeyId', 38, NULL, 'NOT_DELETE', '2022-04-22 13:41:53', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967584', 'SNOWY_EMAIL_ALIYUN_ACCESS_KEY_SECRET', '阿里云邮件AccessKeySecret', 'EMAIL_ALIYUN', '阿里云邮件AccessKeySecret', 39, NULL, 'NOT_DELETE', '2022-04-22 13:42:06', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967585', 'SNOWY_EMAIL_ALIYUN_REGION_ID', '阿里云邮件RegionId', 'EMAIL_ALIYUN', '阿里云邮件RegionId', 40, NULL, 'NOT_DELETE', '2022-04-22 13:42:36', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967586', 'SNOWY_SMS_TENCENT_SECRET_ID', '腾讯云短信SecretId', 'SMS_TENCENT', '腾讯云短信SecretId', 41, NULL, 'NOT_DELETE', '2022-04-22 13:43:15', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967587', 'SNOWY_SMS_TENCENT_SECRET_KEY', '腾讯云短信SecretKey', 'SMS_TENCENT', '腾讯云短信SecretKey', 42, NULL, 'NOT_DELETE', '2022-04-22 13:43:31', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967588', 'SNOWY_SMS_TENCENT_REGION_ID', '腾讯云短信RegionId', 'SMS_TENCENT', '腾讯云短信RegionId', 43, NULL, 'NOT_DELETE', '2022-04-22 13:43:44', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967589', 'SNOWY_SMS_TENCENT_DEFAULT_SDK_APP_ID', '腾讯云短信默认SdkAppId', 'SMS_TENCENT', '腾讯云短信默认SdkAppId', 44, NULL, 'NOT_DELETE', '2022-04-22 13:43:44', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967590', 'SNOWY_SMS_TENCENT_DEFAULT_SIGN_NAME', '腾讯云短信默认签名', 'SMS_TENCENT', '腾讯云短信默认签名', 45, NULL, 'NOT_DELETE', '2022-04-22 13:43:44', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967591', 'SNOWY_SMS_ALIYUN_ACCESS_KEY_ID', '阿里云短信AccessKeyId', 'SMS_ALIYUN', '阿里云短信AccessKeyId', 46, NULL, 'NOT_DELETE', '2022-04-22 13:44:12', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967592', 'SNOWY_SMS_ALIYUN_ACCESS_KEY_SECRET', '阿里云短信AccessKeySecret', 'SMS_ALIYUN', '阿里云短信AccessKeySecret', 47, NULL, 'NOT_DELETE', '2022-04-22 13:44:26', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967593', 'SNOWY_SMS_ALIYUN_END_POINT', '阿里云短信EndPoint', 'SMS_ALIYUN', '阿里云短信EndPoint', 48, NULL, 'NOT_DELETE', '2022-04-22 13:44:40', '-1', NULL, NULL); +INSERT INTO `DEV_CONFIG` VALUES ('1554740179362967594', 'SNOWY_SMS_ALIYUN_DEFAULT_SIGN_NAME', '阿里云短信默认签名', 'SMS_ALIYUN', '阿里云短信默认签名', 49, NULL, 'NOT_DELETE', '2022-04-22 13:43:44', '-1', NULL, NULL); + +-- ---------------------------- +-- Table structure for DEV_DICT +-- ---------------------------- +DROP TABLE IF EXISTS `DEV_DICT`; +CREATE TABLE `DEV_DICT` ( + `ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `PARENT_ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '父id', + `DICT_LABEL` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字典文字', + `DICT_VALUE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字典值', + `CATEGORY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分类', + `SORT_CODE` int(0) NULL DEFAULT NULL COMMENT '排序码', + `EXT_JSON` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '扩展信息', + `DELETE_FLAG` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '删除标志', + `CREATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `CREATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建用户', + `UPDATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `UPDATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改用户', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of DEV_DICT +-- ---------------------------- +INSERT INTO `DEV_DICT` VALUES ('1543839774776291330', '0', '用户性别类型', 'GENDER', 'FRM', 1, NULL, 'NOT_DELETE', '2022-07-04 14:11:00', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1543839901037424642', '1543839774776291330', '男', '男', 'FRM', 10, NULL, 'NOT_DELETE', '2022-07-04 14:11:30', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1543840033980084226', '1543839774776291330', '女', '女', 'FRM', 20, NULL, 'NOT_DELETE', '2022-07-04 14:12:02', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1543860103661809666', '0', '系统菜单类型', 'MENU_TYPE', 'FRM', 2, NULL, 'NOT_DELETE', '2022-07-04 15:31:47', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1543860239020388354', '1543860103661809666', '目录', 'CATALOG', 'FRM', 10, NULL, 'NOT_DELETE', '2022-07-04 15:32:19', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1543860305508495361', '1543860103661809666', '菜单', 'MENU', 'FRM', 20, NULL, 'NOT_DELETE', '2022-07-04 15:32:35', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1543860423485878274', '1543860103661809666', '内链', 'IFRAME', 'FRM', 30, NULL, 'NOT_DELETE', '2022-07-04 15:33:03', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1543860477512708098', '1543860103661809666', '外链', 'LINK', 'FRM', 40, NULL, 'NOT_DELETE', '2022-07-04 15:33:16', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1544329873407946753', '0', '系统通用状态', 'COMMON_STATUS', 'FRM', 3, NULL, 'NOT_DELETE', '2022-07-05 22:38:29', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1545397556652027906', '1544329873407946753', '启用', 'ENABLE', 'FRM', 10, NULL, 'NOT_DELETE', '2022-07-08 21:21:04', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1545397556652027907', '1544329873407946753', '停用', 'DISABLED', 'FRM', 20, NULL, 'NOT_DELETE', '2022-07-08 21:21:04', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547207669861064706', '0', '系统角色分类', 'ROLE_CATEGORY', 'FRM', 4, NULL, 'NOT_DELETE', '2022-07-13 21:13:50', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547207891009937409', '1547207669861064706', '全局', 'GLOBAL', 'FRM', 10, NULL, 'NOT_DELETE', '2022-07-13 21:14:42', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547207990075203585', '1547207669861064706', '机构', 'ORG', 'FRM', 20, NULL, 'NOT_DELETE', '2022-07-13 21:15:05', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547227094995705858', '0', '系统机构分类', 'ORG_CATEGORY', 'FRM', 5, NULL, 'NOT_DELETE', '2022-07-13 22:31:00', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547227670693289985', '1547227094995705858', '部门', 'DEPT', 'FRM', 10, NULL, 'NOT_DELETE', '2022-07-13 22:33:17', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547228161267474434', '1547227094995705858', '公司', 'COMPANY', 'FRM', 20, NULL, 'NOT_DELETE', '2022-07-13 22:35:14', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547409689434742786', '0', '系统职位分类', 'POSITION_CATEGORY', 'FRM', 6, NULL, 'NOT_DELETE', '2022-07-14 10:36:34', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547409794837602305', '1547409689434742786', '高层', 'HIGH', 'FRM', 10, NULL, 'NOT_DELETE', '2022-07-14 10:36:59', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547409844779180033', '1547409689434742786', '中层', 'MIDDLE', 'FRM', 20, NULL, 'NOT_DELETE', '2022-07-14 10:37:11', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547409906406088706', '1547409689434742786', '基层', 'LOW', 'FRM', 30, NULL, 'NOT_DELETE', '2022-07-14 10:37:26', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658113', '0', '用户民族类型', 'NATION', 'FRM', 7, NULL, 'NOT_DELETE', '2022-07-15 01:57:35', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658114', '1547641470701658113', '汉族', '汉族', 'FRM', 1, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658115', '1547641470701658113', '壮族', '壮族', 'FRM', 2, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658116', '1547641470701658113', '回族', '回族', 'FRM', 3, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658117', '1547641470701658113', '满族', '满族', 'FRM', 4, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658118', '1547641470701658113', '维吾尔族', '维吾尔族', 'FRM', 5, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658119', '1547641470701658113', '苗族', '苗族', 'FRM', 6, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658120', '1547641470701658113', '彝族', '彝族', 'FRM', 7, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658121', '1547641470701658113', '土家族', '土家族', 'FRM', 8, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658122', '1547641470701658113', '藏族', '藏族', 'FRM', 9, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658123', '1547641470701658113', '蒙古族', '蒙古族', 'FRM', 10, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658124', '1547641470701658113', '侗族', '侗族', 'FRM', 11, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658125', '1547641470701658113', '布依族', '布依族', 'FRM', 12, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658126', '1547641470701658113', '瑶族', '瑶族', 'FRM', 13, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658127', '1547641470701658113', '白族', '白族', 'FRM', 14, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658128', '1547641470701658113', '朝鲜族', '朝鲜族', 'FRM', 15, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658129', '1547641470701658113', '哈尼族', '哈尼族', 'FRM', 16, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658130', '1547641470701658113', '黎族', '黎族', 'FRM', 17, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658131', '1547641470701658113', '哈萨克族', '哈萨克族', 'FRM', 18, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658132', '1547641470701658113', '傣族', '傣族', 'FRM', 19, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658133', '1547641470701658113', '畲族', '畲族', 'FRM', 20, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658134', '1547641470701658113', '傈僳族', '傈僳族', 'FRM', 21, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658135', '1547641470701658113', '东乡族', '东乡族', 'FRM', 22, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658136', '1547641470701658113', '仡佬族', '仡佬族', 'FRM', 23, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658137', '1547641470701658113', '拉祜族', '拉祜族', 'FRM', 24, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658138', '1547641470701658113', '佤族', '佤族', 'FRM', 25, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658139', '1547641470701658113', '水族', '水族', 'FRM', 26, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658140', '1547641470701658113', '纳西族', '纳西族', 'FRM', 27, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658141', '1547641470701658113', '羌族', '羌族', 'FRM', 28, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658142', '1547641470701658113', '土族', '土族', 'FRM', 29, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658143', '1547641470701658113', '仫佬族', '仫佬族', 'FRM', 30, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658144', '1547641470701658113', '锡伯族', '锡伯族', 'FRM', 31, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658145', '1547641470701658113', '柯尔克孜族', '柯尔克孜族', 'FRM', 32, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658146', '1547641470701658113', '景颇族', '景颇族', 'FRM', 33, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658147', '1547641470701658113', '达斡尔族', '达斡尔族', 'FRM', 34, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658148', '1547641470701658113', '撒拉族', '撒拉族', 'FRM', 35, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658149', '1547641470701658113', '布朗族', '布朗族', 'FRM', 36, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658150', '1547641470701658113', '毛南族', '毛南族', 'FRM', 37, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658151', '1547641470701658113', '塔吉克族', '塔吉克族', 'FRM', 38, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658152', '1547641470701658113', '普米族', '普米族', 'FRM', 39, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658153', '1547641470701658113', '阿昌族', '阿昌族', 'FRM', 40, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658154', '1547641470701658113', '怒族', '怒族', 'FRM', 41, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658155', '1547641470701658113', '鄂温克族', '鄂温克族', 'FRM', 42, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658156', '1547641470701658113', '京族', '京族', 'FRM', 43, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658157', '1547641470701658113', '基诺族', '基诺族', 'FRM', 44, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658158', '1547641470701658113', '德昂族', '德昂族', 'FRM', 45, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658159', '1547641470701658113', '保安族', '保安族', 'FRM', 46, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658160', '1547641470701658113', '俄罗斯族', '俄罗斯族', 'FRM', 47, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658161', '1547641470701658113', '裕固族', '裕固族', 'FRM', 48, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658162', '1547641470701658113', '乌孜别克族', '乌孜别克族', 'FRM', 49, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658163', '1547641470701658113', '门巴族', '门巴族', 'FRM', 50, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658164', '1547641470701658113', '鄂伦春族', '鄂伦春族', 'FRM', 51, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658165', '1547641470701658113', '独龙族', '独龙族', 'FRM', 52, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658166', '1547641470701658113', '赫哲族', '赫哲族', 'FRM', 53, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658167', '1547641470701658113', '高山族', '高山族', 'FRM', 54, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658168', '1547641470701658113', '珞巴族', '珞巴族', 'FRM', 55, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1547641470701658169', '1547641470701658113', '塔塔尔族 ', '塔塔尔族 ', 'FRM', 56, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1549019269252104194', '0', '登录设备类型', 'AUTH_DEVICE_TYPE', 'FRM', 8, NULL, 'NOT_DELETE', '2022-07-18 21:12:28', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1549019748883349506', '1549019269252104194', 'PC端', 'PC', 'FRM', 10, NULL, 'NOT_DELETE', '2022-07-18 21:14:22', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1549019813924421634', '1549019269252104194', '移动端', 'APP', 'FRM', 20, NULL, 'NOT_DELETE', '2022-07-18 21:14:38', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1549019864537088002', '1549019269252104194', '小程序', 'MINI', 'FRM', 30, NULL, 'NOT_DELETE', '2022-07-18 21:14:50', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1554678566166323202', '0', '系统字典分类', 'DICT_CATEGORY', 'FRM', 9, NULL, 'NOT_DELETE', '2022-08-03 12:00:29', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1554678761742524417', '1554678566166323202', '框架', 'FRM', 'FRM', 10, NULL, 'NOT_DELETE', '2022-08-03 12:01:16', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1554678863617974273', '1554678566166323202', '业务', 'BIZ', 'FRM', 20, NULL, 'NOT_DELETE', '2022-08-03 12:01:40', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1554679788378120194', '0', '短信发送引擎', 'SMS_ENGINE', 'FRM', 10, NULL, 'NOT_DELETE', '2022-08-03 12:05:21', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1554679872054484993', '1554679788378120194', '阿里云', 'ALIYUN', 'FRM', 10, NULL, 'NOT_DELETE', '2022-08-03 12:05:41', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1554679958398427138', '1554679788378120194', '腾讯云', 'TENCENT', 'FRM', 20, NULL, 'NOT_DELETE', '2022-08-03 12:06:01', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1554726376265744386', '0', '文件上传引擎', 'FILE_ENGINE', 'FRM', 11, NULL, 'NOT_DELETE', '2022-08-03 15:10:28', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1554726639571566593', '1554726376265744386', '本地', 'LOCAL', 'FRM', 10, NULL, 'NOT_DELETE', '2022-08-03 15:11:31', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1554726696068841474', '1554726376265744386', '阿里云', 'ALIYUN', 'FRM', 20, NULL, 'NOT_DELETE', '2022-08-03 15:11:44', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1554726762338844674', '1554726376265744386', '腾讯云', 'TENCENT', 'FRM', 30, NULL, 'NOT_DELETE', '2022-08-03 15:12:00', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1554726830844411905', '1554726376265744386', 'MINIO', 'MINIO', 'FRM', 40, NULL, 'NOT_DELETE', '2022-08-03 15:12:17', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1556317797993218049', '0', '邮件发送引擎', 'EMAIL_ENGINE', 'FRM', 12, NULL, 'NOT_DELETE', '2022-08-08 00:34:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1556319651447767041', '1556317797993218049', '本地', 'LOCAL', 'FRM', 10, NULL, 'NOT_DELETE', '2022-08-08 00:41:35', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1556319726962016258', '1556317797993218049', '阿里云', 'ALIYUN', 'FRM', 20, NULL, 'NOT_DELETE', '2022-08-08 00:41:53', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1556319786349166593', '1556317797993218049', '腾讯云', 'TENCENT', 'FRM', 30, NULL, 'NOT_DELETE', '2022-08-08 00:42:07', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1559942543251079169', '0', '系统通用开关', 'COMMON_SWITCH', 'FRM', 13, NULL, 'NOT_DELETE', '2022-08-18 00:37:40', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1559942706694717442', '1559942543251079169', '开', 'true', 'FRM', 10, NULL, 'NOT_DELETE', '2022-08-18 00:38:18', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1559942777674924034', '1559942543251079169', '关', 'false', 'FRM', 20, NULL, 'NOT_DELETE', '2022-08-18 00:38:35', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1560306347516461058', '0', '用户证件类型', 'IDCARD_TYPE', 'FRM', 14, NULL, 'NOT_DELETE', '2022-08-19 00:43:17', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1560306502135283714', '1560306347516461058', '身份证', '身份证', 'FRM', 10, NULL, 'NOT_DELETE', '2022-08-19 00:43:54', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1560306768913989633', '1560306347516461058', '出生证', '出生证', 'FRM', 20, NULL, 'NOT_DELETE', '2022-08-19 00:44:57', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1560307009365049346', '1560306347516461058', '军官证', '军官证', 'FRM', 30, NULL, 'NOT_DELETE', '2022-08-19 00:45:55', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1560307180937248769', '1560306347516461058', '护照', '护照', 'FRM', 40, NULL, 'NOT_DELETE', '2022-08-19 00:46:36', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1560309358598914050', '0', '通用文化程度', 'CULTURE_LEVEL', 'FRM', 15, NULL, 'NOT_DELETE', '2022-08-19 00:55:15', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1560309494892822530', '1560309358598914050', '小学', '小学', 'FRM', 10, NULL, 'NOT_DELETE', '2022-08-19 00:55:47', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1560309602136981505', '1560309358598914050', '中学', '中学', 'FRM', 20, NULL, 'NOT_DELETE', '2022-08-19 00:56:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1560309700136894465', '1560309358598914050', '高中', '高中', 'FRM', 30, NULL, 'NOT_DELETE', '2022-08-19 00:56:36', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1560309744118366209', '1560309358598914050', '中专', '中专', 'FRM', 40, NULL, 'NOT_DELETE', '2022-08-19 00:56:47', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1560309783037313026', '1560309358598914050', '大专', '大专', 'FRM', 50, NULL, 'NOT_DELETE', '2022-08-19 00:56:56', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1560309816423972866', '1560309358598914050', '本科', '本科', 'FRM', 60, NULL, 'NOT_DELETE', '2022-08-19 00:57:04', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1560309855661686785', '1560309358598914050', '硕士研究生', '硕士研究生', 'FRM', 70, NULL, 'NOT_DELETE', '2022-08-19 00:57:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1560310085471797250', '1560309358598914050', '博士研究生', '博士研究生', 'FRM', 80, NULL, 'NOT_DELETE', '2022-08-19 00:58:08', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1560338934867791874', '0', '定时任务分类', 'JOB_CATEGORY', 'FRM', 16, NULL, 'NOT_DELETE', '2022-08-19 02:52:46', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1560339092900777985', '1560338934867791874', '框架', 'FRM', 'FRM', 10, NULL, 'NOT_DELETE', '2022-08-19 02:53:24', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1560339156134105089', '1560338934867791874', '业务', 'BIZ', 'FRM', 20, NULL, 'NOT_DELETE', '2022-08-19 02:53:39', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1560342111344234497', '0', '定时任务状态', 'JOB_STATUS', 'FRM', 17, NULL, 'NOT_DELETE', '2022-08-19 03:05:24', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1560342186812346370', '1560342111344234497', '运行', 'RUNNING', 'FRM', 20, NULL, 'NOT_DELETE', '2022-08-19 03:05:42', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1560342250096005121', '1560342111344234497', '停止', 'STOPPED', 'FRM', 20, NULL, 'NOT_DELETE', '2022-08-19 03:05:57', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1561595062998102017', '0', '三方用户分类', 'THIRD_CATEGORY', 'FRM', 18, NULL, 'NOT_DELETE', '2022-08-22 14:04:11', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1561595252714860545', '1561595062998102017', '码云GITEE', 'GITEE', 'FRM', 10, NULL, 'NOT_DELETE', '2022-08-22 14:04:56', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1561595322336112641', '1561595062998102017', '微信WECHAT', 'WECHAT', 'FRM', 20, NULL, 'NOT_DELETE', '2022-08-22 14:05:13', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1567580351742619650', '0', '系统消息类型', 'MESSAGE_CATEGORY', 'FRM', 19, NULL, 'NOT_DELETE', '2022-09-08 02:27:35', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1567580424270524418', '1567580351742619650', '系统', 'SYS', 'FRM', 10, NULL, 'NOT_DELETE', '2022-09-08 02:27:52', '-1', NULL, NULL); +INSERT INTO `DEV_DICT` VALUES ('1567580487684206594', '1567580351742619650', '业务', 'BIZ', 'FRM', 20, NULL, 'NOT_DELETE', '2022-09-08 02:28:07', '-1', NULL, NULL); + +-- ---------------------------- +-- Table structure for DEV_EMAIL +-- ---------------------------- +DROP TABLE IF EXISTS `DEV_EMAIL`; +CREATE TABLE `DEV_EMAIL` ( + `ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `ENGINE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮件引擎', + `SEND_ACCOUNT` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '发件人邮箱', + `SEND_USER` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '发件人昵称', + `RECEIVE_ACCOUNTS` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '接收人', + `SUBJECT` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '邮件主题', + `CONTENT` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '邮件正文', + `TAG_NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '标签名', + `TEMPLATE_NAME` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '模板名', + `TEMPLATE_PARAM` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '发送参数', + `RECEIPT_INFO` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '回执信息', + `EXT_JSON` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '扩展信息', + `DELETE_FLAG` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '删除标志', + `CREATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `CREATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建用户', + `UPDATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `UPDATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改用户', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '邮件' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of DEV_EMAIL +-- ---------------------------- + +-- ---------------------------- +-- Table structure for DEV_FILE +-- ---------------------------- +DROP TABLE IF EXISTS `DEV_FILE`; +CREATE TABLE `DEV_FILE` ( + `ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `ENGINE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '存储引擎', + `BUCKET` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '存储桶', + `NAME` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '文件名称', + `SUFFIX` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件后缀', + `SIZE_KB` bigint(0) NULL DEFAULT NULL COMMENT '文件大小kb', + `SIZE_INFO` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件大小(格式化后)', + `OBJ_NAME` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '文件的对象名(唯一名称)', + `STORAGE_PATH` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '文件存储路径', + `DOWNLOAD_PATH` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '文件下载路径', + `THUMBNAIL` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '图片缩略图', + `EXT_JSON` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '扩展信息', + `DELETE_FLAG` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '删除标志', + `CREATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `CREATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建用户', + `UPDATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `UPDATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改用户', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '文件' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of DEV_FILE +-- ---------------------------- + +-- ---------------------------- +-- Table structure for DEV_JOB +-- ---------------------------- +DROP TABLE IF EXISTS `DEV_JOB`; +CREATE TABLE `DEV_JOB` ( + `ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `CODE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '编码', + `CATEGORY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分类', + `ACTION_CLASS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务类名', + `CRON_EXPRESSION` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'cron表达式', + `JOB_STATUS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务状态', + `SORT_CODE` int(0) NULL DEFAULT NULL COMMENT '排序码', + `EXT_JSON` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '扩展信息', + `DELETE_FLAG` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '删除标志', + `CREATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `CREATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建用户', + `UPDATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `UPDATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改用户', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '定时任务' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of DEV_JOB +-- ---------------------------- +INSERT INTO `DEV_JOB` VALUES ('1555471535453827073', '定时任务', 'qi06nah38m', 'FRM', 'vip.xiaonuo.dev.modular.job.task.DevJobTimerTaskRunner', '0 0 0 1 * ?', 'STOPPED', 1, NULL, 'NOT_DELETE', '2022-08-05 16:31:29', '-1', NULL, NULL); + +-- ---------------------------- +-- Table structure for DEV_LOG +-- ---------------------------- +DROP TABLE IF EXISTS `DEV_LOG`; +CREATE TABLE `DEV_LOG` ( + `ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键', + `CATEGORY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '日志分类', + `NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '日志名称', + `EXE_STATUS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行状态', + `EXE_MESSAGE` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '具体消息', + `OP_IP` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作ip', + `OP_ADDRESS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作地址', + `OP_BROWSER` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作浏览器', + `OP_OS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作系统', + `CLASS_NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '类名称', + `METHOD_NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '方法名称', + `REQ_METHOD` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求方式', + `REQ_URL` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '请求地址', + `PARAM_JSON` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '请求参数', + `RESULT_JSON` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '返回结果', + `OP_TIME` datetime(0) NULL DEFAULT NULL COMMENT '操作时间', + `OP_USER` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作人姓名', + `SIGN_DATA` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '签名数据', + `CREATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `CREATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建用户', + `UPDATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `UPDATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改用户', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '日志' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of DEV_LOG +-- ---------------------------- + +-- ---------------------------- +-- Table structure for DEV_MESSAGE +-- ---------------------------- +DROP TABLE IF EXISTS `DEV_MESSAGE`; +CREATE TABLE `DEV_MESSAGE` ( + `ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `CATEGORY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分类', + `SUBJECT` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '主题', + `CONTENT` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '正文', + `EXT_JSON` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '扩展信息', + `DELETE_FLAG` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '删除标志', + `CREATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `CREATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建用户', + `UPDATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `UPDATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改用户', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '站内信' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of DEV_MESSAGE +-- ---------------------------- + +-- ---------------------------- +-- Table structure for DEV_RELATION +-- ---------------------------- +DROP TABLE IF EXISTS `DEV_RELATION`; +CREATE TABLE `DEV_RELATION` ( + `ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `OBJECT_ID` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '对象ID', + `TARGET_ID` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '目标ID', + `CATEGORY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分类', + `EXT_JSON` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '扩展信息', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '关系' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of DEV_RELATION +-- ---------------------------- + +-- ---------------------------- +-- Table structure for DEV_SMS +-- ---------------------------- +DROP TABLE IF EXISTS `DEV_SMS`; +CREATE TABLE `DEV_SMS` ( + `ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `ENGINE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '短信引擎', + `PHONE_NUMBERS` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '手机号', + `SIGN_NAME` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '短信签名', + `TEMPLATE_CODE` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '模板编码', + `TEMPLATE_PARAM` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '发送参数', + `RECEIPT_INFO` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '回执信息', + `EXT_JSON` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '扩展信息', + `DELETE_FLAG` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '删除标志', + `CREATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `CREATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建用户', + `UPDATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `UPDATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改用户', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '短信' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of DEV_SMS +-- ---------------------------- + +-- ---------------------------- +-- Table structure for SYS_ORG +-- ---------------------------- +DROP TABLE IF EXISTS `SYS_ORG`; +CREATE TABLE `SYS_ORG` ( + `ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `PARENT_ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '父id', + `DIRECTOR_ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '主管ID', + `NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `CODE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '编码', + `CATEGORY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分类', + `SORT_CODE` int(0) NULL DEFAULT NULL COMMENT '排序码', + `EXT_JSON` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '扩展信息', + `DELETE_FLAG` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '删除标志', + `CREATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `CREATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建用户', + `UPDATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `UPDATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改用户', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '组织' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of SYS_ORG +-- ---------------------------- +INSERT INTO `SYS_ORG` VALUES ('1543842934270394368', '0', NULL, '小诺科技有限公司', 'yfqtrbd5qz', 'COMPANY', 1, NULL, 'NOT_DELETE', '2022-07-18 19:42:43', '-1', NULL, NULL); +INSERT INTO `SYS_ORG` VALUES ('1543842934270394369', '1543842934270394368', '1543837863788879874', '领导班子', 'xmfvgov44q', 'DEPT', 2, NULL, 'NOT_DELETE', '2022-07-18 19:42:43', '-1', NULL, NULL); +INSERT INTO `SYS_ORG` VALUES ('1543842934270394370', '1543842934270394368', '1543837863788879880', '工会办公室', '5ruzr6n7g7', 'DEPT', 3, NULL, 'NOT_DELETE', '2022-07-18 19:42:43', '-1', NULL, NULL); +INSERT INTO `SYS_ORG` VALUES ('1543842934270394371', '1543842934270394368', '1543837863788879883', '综合管理部', 'l4sdfnw27p', 'DEPT', 4, NULL, 'NOT_DELETE', '2022-07-18 19:42:43', '-1', NULL, NULL); +INSERT INTO `SYS_ORG` VALUES ('1543842934270394372', '1543842934270394368', '1543837863788879887', '财务资产部', 'h7yq9t1q0t', 'DEPT', 5, NULL, 'NOT_DELETE', '2022-07-18 19:42:43', '-1', NULL, NULL); +INSERT INTO `SYS_ORG` VALUES ('1543842934270394373', '1543842934270394368', '1543837863788879892', '人力资源部', '245ryxcbqh', 'DEPT', 6, NULL, 'NOT_DELETE', '2022-07-18 19:42:43', '-1', NULL, NULL); +INSERT INTO `SYS_ORG` VALUES ('1543842934270394374', '1543842934270394368', '1543837863788879898', '党群工作部', 'sc6jkffc4d', 'DEPT', 7, NULL, 'NOT_DELETE', '2022-07-18 19:42:43', '-1', NULL, NULL); +INSERT INTO `SYS_ORG` VALUES ('1543842934270394375', '1543842934270394368', '1543837863788879903', '纪检监督部', '39t022fx1m', 'DEPT', 8, NULL, 'NOT_DELETE', '2022-07-18 19:42:43', '-1', NULL, NULL); +INSERT INTO `SYS_ORG` VALUES ('1543842934270394376', '1543842934270394368', '1543837863788879907', '生产技术部', '34m3lam984', 'DEPT', 9, NULL, 'NOT_DELETE', '2022-07-18 19:42:43', '-1', NULL, NULL); +INSERT INTO `SYS_ORG` VALUES ('1543842934270394377', '1543842934270394368', '1543837863788879912', '计划营销部', 'w742mipwer', 'DEPT', 10, NULL, 'NOT_DELETE', '2022-07-18 19:42:43', '-1', NULL, NULL); +INSERT INTO `SYS_ORG` VALUES ('1543842934270394378', '1543842934270394368', '1543837863788879917', '后勤保卫部', 'b71pvf46do', 'DEPT', 11, NULL, 'NOT_DELETE', '2022-07-18 19:42:43', '-1', NULL, NULL); +INSERT INTO `SYS_ORG` VALUES ('1543842934270394379', '1543842934270394368', NULL, '西南分公司', 'ksekw9x0cg', 'COMPANY', 12, NULL, 'NOT_DELETE', '2022-07-18 19:42:43', '-1', NULL, NULL); +INSERT INTO `SYS_ORG` VALUES ('1543842934270394380', '1543842934270394379', '1543837863788879925', '综管部', 'snt7z4gzg2', 'DEPT', 13, NULL, 'NOT_DELETE', '2022-07-18 19:42:43', '-1', NULL, NULL); +INSERT INTO `SYS_ORG` VALUES ('1543842934270394381', '1543842934270394379', '1543837863788879930', '研发部', 'jowwv1u5gm', 'DEPT', 14, NULL, 'NOT_DELETE', '2022-07-18 19:42:43', '-1', NULL, NULL); +INSERT INTO `SYS_ORG` VALUES ('1543842934270394382', '1543842934270394379', '1543837863788879934', '销售部', '23grt76733', 'DEPT', 15, NULL, 'NOT_DELETE', '2022-07-18 19:42:43', '-1', NULL, NULL); +INSERT INTO `SYS_ORG` VALUES ('1543842934270394383', '1543842934270394379', '1543837863788879939', '人事部', 'n1in22gf6x', 'DEPT', 16, NULL, 'NOT_DELETE', '2022-07-18 19:42:43', '-1', NULL, NULL); +INSERT INTO `SYS_ORG` VALUES ('1543842934270394384', '1543842934270394379', '1543837863788879944', '采购部', 'v27rqp18yf', 'DEPT', 17, NULL, 'NOT_DELETE', '2022-07-18 19:42:43', '-1', NULL, NULL); +INSERT INTO `SYS_ORG` VALUES ('1543842934270394385', '1543842934270394379', '1543837863788879949', '技术部', '34xmmu0esf', 'DEPT', 18, NULL, 'NOT_DELETE', '2022-07-18 19:42:43', '-1', NULL, NULL); +INSERT INTO `SYS_ORG` VALUES ('1543842934270394386', '1543842934270394379', '1543837863788879954', '质检部', 'bm8kuwwzan', 'DEPT', 19, NULL, 'NOT_DELETE', '2022-07-18 19:42:43', '-1', NULL, NULL); + +-- ---------------------------- +-- Table structure for SYS_POSITION +-- ---------------------------- +DROP TABLE IF EXISTS `SYS_POSITION`; +CREATE TABLE `SYS_POSITION` ( + `ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `ORG_ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组织id', + `NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `CODE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '编码', + `CATEGORY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分类', + `SORT_CODE` int(0) NULL DEFAULT NULL COMMENT '排序码', + `EXT_JSON` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '扩展信息', + `DELETE_FLAG` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '删除标志', + `CREATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `CREATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建用户', + `UPDATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `UPDATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改用户', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '职位' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of SYS_POSITION +-- ---------------------------- +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019583', '1543842934270394369', '党委书记', 'rsz5dmh762', 'HIGH', 1, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019584', '1543842934270394369', '总经理', 'wo1araqs2z', 'HIGH', 2, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019585', '1543842934270394369', '副总经理', 'asqvwbsc16', 'HIGH', 3, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019586', '1543842934270394369', '总会计师', 'kwwyyb1ki9', 'HIGH', 4, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019587', '1543842934270394369', '总经理助理', 'aln9y4tno6', 'HIGH', 5, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019588', '1543842934270394370', '工会主席', 'j155xzpd3q', 'HIGH', 6, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019589', '1543842934270394370', '工会副主席', 'za9ebd8yb3', 'MIDDLE', 7, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019590', '1543842934270394370', '工会干事', '1crq7ylpdq', 'LOW', 8, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019591', '1543842934270394371', '部门经理', 'krq0kj7oio', 'MIDDLE', 9, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019592', '1543842934270394371', '部门副经理', 'p87a2qrmai', 'MIDDLE', 10, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019593', '1543842934270394371', '行政秘书', 'yw4e9p7jop', 'LOW', 11, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019594', '1543842934270394371', '行政专员', 'gpj40g9sfy', 'LOW', 12, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019595', '1543842934270394372', '财务总监', 'djtgymhpfq', 'MIDDLE', 13, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019596', '1543842934270394372', '审计主管', '1xbotmzysq', 'MIDDLE', 14, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019597', '1543842934270394372', '会计', 'sz6xuyyw1p', 'LOW', 15, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019598', '1543842934270394372', '出纳', '32ep33wuui', 'LOW', 16, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019599', '1543842934270394373', '人资总监', 'opig590piu', 'MIDDLE', 17, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019600', '1543842934270394373', '招聘主管', 'zidce26bp3', 'MIDDLE', 18, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019601', '1543842934270394373', '招聘专员', '1tq2m6gg7r', 'LOW', 19, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019602', '1543842934270394373', '薪酬主管', 'yysav5vvro', 'MIDDLE', 20, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019603', '1543842934270394373', '绩效主管', 'rjnelqruj6', 'MIDDLE', 21, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019604', '1543842934270394374', '组织部长', 'mtgiot5d0e', 'MIDDLE', 22, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019605', '1543842934270394374', '宣传部长', 'thimndbcim', 'MIDDLE', 23, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019606', '1543842934270394374', '团委书记', 'if2bhfasci', 'MIDDLE', 24, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019607', '1543842934270394374', '组织专员', 'vkw8sdgz3o', 'LOW', 25, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019608', '1543842934270394374', '宣传专员', 'mrx68t1f7w', 'LOW', 26, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019609', '1543842934270394375', '监察室主任', 'w5yxpau8yr', 'MIDDLE', 27, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019610', '1543842934270394375', '监察室副主任', 'gttosc25hw', 'MIDDLE', 28, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019611', '1543842934270394375', '监察委员', '2m9hs6fkjo', 'LOW', 29, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019612', '1543842934270394376', '部门经理', 'o86yv2ypo6', 'MIDDLE', 30, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019613', '1543842934270394376', '部门副经理', 'gv3j2yz30e', 'MIDDLE', 31, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019614', '1543842934270394376', '网络工程师', 'ebbnm4y8jr', 'LOW', 32, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019615', '1543842934270394376', '维修工程师', 'cm6j5y200r', 'LOW', 33, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019616', '1543842934270394377', '营销总监', 'b6zdp05m95', 'MIDDLE', 34, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019617', '1543842934270394377', '销售主管', 'gjbtoi2p2j', 'MIDDLE', 35, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019618', '1543842934270394377', '销售专员', 'vucrc1t64r', 'LOW', 36, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019619', '1543842934270394378', '总务科长', '7wdazftlai', 'MIDDLE', 37, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019620', '1543842934270394378', '保卫科长', 'fh5ciy870i', 'MIDDLE', 38, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019621', '1543842934270394378', '供应科长', '877wu8sx7x', 'MIDDLE', 39, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019622', '1543842934270394378', '调度员', 'whubr9jawi', 'LOW', 40, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019623', '1543842934270394378', '司机', 'su5w4voauh', 'LOW', 41, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019624', '1543842934270394378', '厨师', 'wh54f8flj6', 'LOW', 42, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019625', '1543842934270394380', '部门经理', '81vtv8x93j', 'MIDDLE', 43, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019626', '1543842934270394380', '部门副经理', '001mqeiozs', 'MIDDLE', 44, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019627', '1543842934270394380', '工作成员', '6p19ejkr72', 'LOW', 45, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019628', '1543842934270394381', '部门经理', 'xuhv41bl3s', 'MIDDLE', 46, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019629', '1543842934270394381', '部门副经理', '5h4vo5z27b', 'MIDDLE', 47, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019630', '1543842934270394381', '工作成员', 'mn0fzfdcvv', 'LOW', 48, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019631', '1543842934270394382', '部门经理', 'fzwvetfon9', 'MIDDLE', 49, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019632', '1543842934270394382', '部门副经理', 'rxgjbmjbvd', 'MIDDLE', 50, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019633', '1543842934270394382', '工作成员', 'bj0zt5ncy0', 'LOW', 51, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019634', '1543842934270394383', '部门经理', 'wqv31lvmhf', 'MIDDLE', 52, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019635', '1543842934270394383', '部门副经理', '31etuwtybi', 'MIDDLE', 53, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019636', '1543842934270394383', '工作成员', 'rtgawbjyzq', 'LOW', 54, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019637', '1543842934270394384', '部门经理', 'b9d2p1xo8h', 'MIDDLE', 55, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019638', '1543842934270394384', '部门副经理', 'ayb8lhufv4', 'MIDDLE', 56, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019639', '1543842934270394384', '工作成员', '6xyf1kce64', 'LOW', 57, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019640', '1543842934270394385', '部门经理', 'd82h5he4ln', 'MIDDLE', 58, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019641', '1543842934270394385', '部门副经理', 'a45lsv38dk', 'MIDDLE', 59, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019642', '1543842934270394385', '工作成员', 'npvkzerms9', 'LOW', 60, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019643', '1543842934270394386', '部门经理', '7tl8vkbd4m', 'MIDDLE', 61, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019644', '1543842934270394386', '部门副经理', 'h9kz9lgk1u', 'MIDDLE', 62, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); +INSERT INTO `SYS_POSITION` VALUES ('1543899639134019645', '1543842934270394386', '工作成员', 'jh8z81wka8', 'LOW', 99, NULL, 'NOT_DELETE', '2022-07-18 19:43:26', '-1', NULL, NULL); + +-- ---------------------------- +-- Table structure for SYS_RELATION +-- ---------------------------- +DROP TABLE IF EXISTS `SYS_RELATION`; +CREATE TABLE `SYS_RELATION` ( + `ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `OBJECT_ID` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '对象ID', + `TARGET_ID` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '目标ID', + `CATEGORY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分类', + `EXT_JSON` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '扩展信息', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '关系' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of SYS_RELATION +-- ---------------------------- +INSERT INTO `SYS_RELATION` VALUES ('1569556138947522560', '1543837863788879873', '1570687866138206209', 'SYS_USER_HAS_ROLE', NULL); +INSERT INTO `SYS_RELATION` VALUES ('1569556138947522561', '1543837863788879871', '1570687866138206208', 'SYS_USER_HAS_ROLE', NULL); +INSERT INTO `SYS_RELATION` VALUES ('1570792235898695682', '1570687866138206209', '/biz/org/add', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/org/add\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235898695683', '1570687866138206209', '/biz/org/delete', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/org/delete\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235898695684', '1570687866138206209', '/biz/org/detail', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/org/detail\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235898695685', '1570687866138206209', '/biz/org/edit', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/org/edit\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235898695686', '1570687866138206209', '/biz/org/orgTreeSelector', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/org/orgTreeSelector\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235898695687', '1570687866138206209', '/biz/org/page', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/org/page\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235907084290', '1570687866138206209', '/biz/org/tree', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/org/tree\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235907084291', '1570687866138206209', '/biz/org/userSelector', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/org/userSelector\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235907084292', '1570687866138206209', '/biz/position/add', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/position/add\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235907084293', '1570687866138206209', '/biz/position/delete', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/position/delete\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235907084294', '1570687866138206209', '/biz/position/detail', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/position/detail\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235907084295', '1570687866138206209', '/biz/position/edit', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/position/edit\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235907084296', '1570687866138206209', '/biz/position/orgTreeSelector', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/position/orgTreeSelector\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235907084297', '1570687866138206209', '/biz/position/page', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/position/page\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235907084298', '1570687866138206209', '/biz/position/positionSelector', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/position/positionSelector\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235915472898', '1570687866138206209', '/biz/user/add', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/add\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235915472899', '1570687866138206209', '/biz/user/delete', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/delete\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235915472900', '1570687866138206209', '/biz/user/detail', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/detail\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235915472901', '1570687866138206209', '/biz/user/disableUser', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/disableUser\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235915472902', '1570687866138206209', '/biz/user/edit', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/edit\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235915472903', '1570687866138206209', '/biz/user/enableUser', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/enableUser\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235915472904', '1570687866138206209', '/biz/user/export', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/export\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235915472905', '1570687866138206209', '/biz/user/grantRole', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/grantRole\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235915472906', '1570687866138206209', '/biz/user/import', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/import\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235915472907', '1570687866138206209', '/biz/user/orgListSelector', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/orgListSelector\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235915472908', '1570687866138206209', '/biz/user/orgTreeSelector', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/orgTreeSelector\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235915472909', '1570687866138206209', '/biz/user/ownRole', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/ownRole\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235915472910', '1570687866138206209', '/biz/user/page', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/page\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235923861505', '1570687866138206209', '/biz/user/positionSelector', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/positionSelector\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235923861506', '1570687866138206209', '/biz/user/resetPassword', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/resetPassword\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235923861507', '1570687866138206209', '/biz/user/roleSelector', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/roleSelector\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1570792235923861508', '1570687866138206209', '/biz/user/userSelector', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/userSelector\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441409', '1570687866138206208', '1548901111999770826', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999770826\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441410', '1570687866138206208', '1548901111999770926', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999770926\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441411', '1570687866138206208', '1548901111999771026', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999771026\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441412', '1570687866138206208', '1548901111999771226', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999771226\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441413', '1570687866138206208', '1548901111999771326', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999771326\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441414', '1570687866138206208', '1548901111999771426', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999771426\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441415', '1570687866138206208', '1548901111999771526', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999771526\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441416', '1570687866138206208', '1548901111999771726', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999771726\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441417', '1570687866138206208', '1548901111999771826', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999771826\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441418', '1570687866138206208', '1548901111999771926', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999771926\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441419', '1570687866138206208', '1548901111999772026', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999772026\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441420', '1570687866138206208', '1548901111999772226', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999772226\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441421', '1570687866138206208', '1548901111999772326', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999772326\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441422', '1570687866138206208', '1548901111999772426', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999772426\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441423', '1570687866138206208', '1548901111999772526', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999772526\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441424', '1570687866138206208', '1548901111999772626', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999772626\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441425', '1570687866138206208', '1548901111999772726', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999772726\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441426', '1570687866138206208', '1548901111999772826', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999772826\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441427', '1570687866138206208', '1548901111999772926', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999772926\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441428', '1570687866138206208', '1548901111999773226', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773226\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441429', '1570687866138206208', '1548901111999773326', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773326\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441430', '1570687866138206208', '1548901111999773427', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773427\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441431', '1570687866138206208', '1548901111999773428', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773428\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441432', '1570687866138206208', '1548901111999773429', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773429\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441433', '1570687866138206208', '1548901111999773430', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773430\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441434', '1570687866138206208', '1548901111999773431', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773431\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441435', '1570687866138206208', '1548901111999773432', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773432\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441436', '1570687866138206208', '1548901111999773433', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773433\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441437', '1570687866138206208', '1548901111999773434', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773434\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441438', '1570687866138206208', '1548901111999773435', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773435\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441439', '1570687866138206208', '1548901111999773436', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773436\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441440', '1570687866138206208', '1548901111999773437', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773437\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441441', '1570687866138206208', '1548901111999773438', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773438\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441442', '1570687866138206208', '1548901111999773439', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773439\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441443', '1570687866138206208', '1548901111999773440', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773440\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441444', '1570687866138206208', '1548901111999773441', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773441\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441445', '1570687866138206208', '1548901111999773442', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773442\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441446', '1570687866138206208', '1548901111999773443', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773443\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441447', '1570687866138206208', '1548901111999773444', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773444\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441448', '1570687866138206208', '1548901111999773445', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773445\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441449', '1570687866138206208', '1548901111999773978', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773978\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195223441450', '1570687866138206208', '1548901111999773979', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773979\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571054195286355970', '1570687866138206208', '1548901111999773980', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773980\",\"buttonInfo\":[]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991599063041', '1570687866138206208', '/biz/org/add', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/org/add\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991603257345', '1570687866138206208', '/biz/org/delete', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/org/delete\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991603257346', '1570687866138206208', '/biz/org/detail', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/org/detail\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991603257347', '1570687866138206208', '/biz/org/edit', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/org/edit\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991603257348', '1570687866138206208', '/biz/org/orgTreeSelector', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/org/orgTreeSelector\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991603257349', '1570687866138206208', '/biz/org/page', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/org/page\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991603257350', '1570687866138206208', '/biz/org/tree', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/org/tree\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991603257351', '1570687866138206208', '/biz/org/userSelector', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/org/userSelector\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991603257352', '1570687866138206208', '/biz/position/add', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/position/add\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991603257353', '1570687866138206208', '/biz/position/delete', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/position/delete\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991603257354', '1570687866138206208', '/biz/position/detail', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/position/detail\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991603257355', '1570687866138206208', '/biz/position/edit', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/position/edit\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991603257356', '1570687866138206208', '/biz/position/orgTreeSelector', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/position/orgTreeSelector\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991603257357', '1570687866138206208', '/biz/position/page', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/position/page\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991603257358', '1570687866138206208', '/biz/position/positionSelector', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/position/positionSelector\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991603257359', '1570687866138206208', '/biz/user/add', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/add\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991603257360', '1570687866138206208', '/biz/user/delete', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/delete\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991603257361', '1570687866138206208', '/biz/user/detail', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/detail\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991603257362', '1570687866138206208', '/biz/user/disableUser', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/disableUser\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991603257363', '1570687866138206208', '/biz/user/edit', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/edit\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991611645954', '1570687866138206208', '/biz/user/enableUser', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/enableUser\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991611645955', '1570687866138206208', '/biz/user/export', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/export\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991611645956', '1570687866138206208', '/biz/user/grantRole', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/grantRole\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991611645957', '1570687866138206208', '/biz/user/import', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/import\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991611645958', '1570687866138206208', '/biz/user/orgListSelector', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/orgListSelector\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991611645959', '1570687866138206208', '/biz/user/orgTreeSelector', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/orgTreeSelector\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991611645960', '1570687866138206208', '/biz/user/ownRole', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/ownRole\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991611645961', '1570687866138206208', '/biz/user/page', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/page\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991611645962', '1570687866138206208', '/biz/user/positionSelector', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/positionSelector\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991611645963', '1570687866138206208', '/biz/user/resetPassword', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/resetPassword\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991611645964', '1570687866138206208', '/biz/user/roleSelector', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/roleSelector\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571089991611645965', '1570687866138206208', '/biz/user/userSelector', 'SYS_ROLE_HAS_PERMISSION', '{\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[],\"apiUrl\":\"/biz/user/userSelector\"}'); +INSERT INTO `SYS_RELATION` VALUES ('1571133996951502849', '1570687866138206209', '1548901111999773978', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773978\",\"buttonInfo\":[\"1571129529564758017\",\"1571129929961406466\",\"1571130756155408386\",\"1571130811058847745\"]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571133996951502850', '1570687866138206209', '1548901111999773979', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773979\",\"buttonInfo\":[\"1571130973294526465\",\"1571131043532341249\",\"1571131137006600193\",\"1571131427361488898\",\"1571131544973967361\",\"1571131727656878081\",\"1571132076853657601\"]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571133996951502851', '1570687866138206209', '1548901111999773980', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999773980\",\"buttonInfo\":[\"1571132393993371649\",\"1571132468178026497\",\"1571132576143605761\",\"1571132658851086338\"]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571134629653872641', '1543837863788879872', NULL, 'SYS_USER_WORKBENCH_DATA', '{\"shortcut\":[{\"id\":\"1548901111999770527\",\"title\":\"个人中心\",\"icon\":\"appstore-outlined\",\"path\":\"/usercenter\"},{\"id\":\"1548901111999772426\",\"title\":\"系统配置\",\"icon\":\"appstore-outlined\",\"path\":\"/sys/config\"}]}'); +INSERT INTO `SYS_RELATION` VALUES ('1571134629653872642', '1543837863788879873', NULL, 'SYS_USER_WORKBENCH_DATA', '{\"shortcut\":[{\"id\":\"1548901111999770527\",\"title\":\"个人中心\",\"icon\":\"appstore-outlined\",\"path\":\"/usercenter\"},{\"id\":\"1548901111999773978\",\"title\":\"机构管理\",\"icon\":\"appstore-outlined\",\"path\":\"/biz/org\"},{\"id\":\"1548901111999773979\",\"title\":\"人员管理\",\"icon\":\"appstore-outlined\",\"path\":\"/biz/user\"},{\"id\":\"1548901111999773980\",\"title\":\"岗位管理\",\"icon\":\"appstore-outlined\",\"path\":\"/biz/position\"}]}'); + +-- ---------------------------- +-- Table structure for SYS_RESOURCE +-- ---------------------------- +DROP TABLE IF EXISTS `SYS_RESOURCE`; +CREATE TABLE `SYS_RESOURCE` ( + `ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `PARENT_ID` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '父id', + `TITLE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '标题', + `NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '别名', + `CODE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '编码', + `CATEGORY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分类', + `MODULE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模块', + `MENU_TYPE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单类型', + `PATH` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '路径', + `COMPONENT` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件', + `ICON` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '图标', + `COLOR` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '颜色', + `SORT_CODE` int(0) NULL DEFAULT NULL COMMENT '排序码', + `EXT_JSON` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '扩展信息', + `DELETE_FLAG` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '删除标志', + `CREATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `CREATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建用户', + `UPDATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `UPDATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改用户', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '资源' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of SYS_RESOURCE +-- ---------------------------- +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999770525', NULL, '系统', NULL, 'system', 'MODULE', NULL, NULL, NULL, NULL, 'appstore-add-outlined', '#05a045', 1, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999770526', NULL, '系统首页', 'index', 'system', 'SPA', NULL, 'MENU', '/index', 'index/index', 'home-outlined', NULL, 2, NULL, 'NOT_DELETE', '2022-07-18 17:21:06', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999770527', NULL, '个人中心', 'userCenter', 'system', 'SPA', NULL, 'MENU', '/usercenter', 'sys/user/userCenter', 'appstore-outlined', NULL, 3, NULL, 'NOT_DELETE', '2022-07-23 16:58:25', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999770726', '0', '组织架构', NULL, 'wxq116zcyp', 'MENU', '1548901111999770525', 'CATALOG', '/e4y8y7ib2p', NULL, 'apartment-outlined', NULL, 4, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999770826', '1548901111999770726', '组织管理', 'sysOrg', '7scuix7595', 'MENU', '1548901111999770525', 'MENU', '/sys/org', 'sys/org/index', 'cluster-outlined', NULL, 5, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999770926', '1548901111999770726', '用户管理', 'sysUser', 'ue0wd497yb', 'MENU', '1548901111999770525', 'MENU', '/sys/user', 'sys/user/index', 'user-outlined', NULL, 6, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999771026', '1548901111999770726', '职位管理', 'sysPosition', 'fkbckffqxi', 'MENU', '1548901111999770525', 'MENU', '/sys/position', 'sys/position/index', 'apartment-outlined', NULL, 7, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999771126', '0', '权限管控', NULL, 'k7av3f3rg6', 'MENU', '1548901111999770525', 'CATALOG', '/5k9uuuzafi', NULL, 'user-switch-outlined', NULL, 8, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999771226', '1548901111999771126', '角色管理', 'sysRole', 'hwjxhcg122', 'MENU', '1548901111999770525', 'MENU', '/sys/role', 'sys/role/index', 'deployment-unit-outlined', NULL, 9, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999771326', '1548901111999771126', '模块管理', 'sysModule', 'opli26z18q', 'MENU', '1548901111999770525', 'MENU', '/sys/module', 'sys/resource/module/index', 'appstore-add-outlined', NULL, 10, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999771426', '1548901111999771126', '菜单管理', 'sysMenu', 'q38j3bb839', 'MENU', '1548901111999770525', 'MENU', '/sys/menu', 'sys/resource/menu/index', 'pic-left-outlined', NULL, 11, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999771526', '1548901111999771126', '单页管理', 'sysSpa', '8mm06l6wwu', 'MENU', '1548901111999770525', 'MENU', '/sys/spa', 'sys/resource/spa/index', 'pic-center-outlined', NULL, 12, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999771626', '0', '基础工具', NULL, 'nplvu771br', 'MENU', '1548901111999770525', 'CATALOG', '/ozmlc6eyw5', NULL, 'tool-outlined', NULL, 13, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999771726', '1548901111999771626', '文件管理', 'devFile', 'n25k83x4sy', 'MENU', '1548901111999770525', 'MENU', '/dev/file/index', 'dev/file/index', 'copy-outlined', NULL, 14, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999771826', '1548901111999771626', '邮件推送', 'devEmail', 'x4fx2a91tq', 'MENU', '1548901111999770525', 'MENU', '/dev/email/index', 'dev/email/index', 'send-outlined', NULL, 15, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999771926', '1548901111999771626', '短信发送', 'devSms', 'nnjsr7tkrs', 'MENU', '1548901111999770525', 'MENU', '/dev/sms/index', 'dev/sms/index', 'mail-outlined', NULL, 16, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999772026', '1548901111999771626', '站内信息', 'devMessage', '0yitzu8786', 'MENU', '1548901111999770525', 'MENU', '/dev/message/index', 'dev/message/index', 'message-outlined', NULL, 17, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999772126', '0', '系统运维', NULL, '3poiqgf7zx', 'MENU', '1548901111999770525', 'CATALOG', '/a0l7fxfq3m', NULL, 'hdd-outlined', NULL, 18, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999772226', '1548901111999772126', '三方用户', 'authThird', 'xf89fmzrtz', 'MENU', '1548901111999770525', 'MENU', '/auth/third', 'auth/third/index', 'team-outlined', NULL, 19, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999772326', '1548901111999772126', '数据字典', 'devDict', 'pzr1auhqf3', 'MENU', '1548901111999770525', 'MENU', '/sys/dict', 'dev/dict/index', 'file-search-outlined', NULL, 20, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999772426', '1548901111999772126', '系统配置', 'devConfig', '38zmn86vxg', 'MENU', '1548901111999770525', 'MENU', '/sys/config', 'dev/config/index', 'setting-outlined', NULL, 21, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999772526', '1548901111999772126', '任务调度', 'devJob', 'mj2p3y3hzq', 'MENU', '1548901111999770525', 'MENU', '/dev/job', 'dev/job/index', 'field-time-outlined', NULL, 22, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999772626', '1548901111999772126', '会话管理', 'authMonitor', '4x1fpyaxys', 'MENU', '1548901111999770525', 'MENU', '/auth/monitor', 'auth/monitor/index', 'usergroup-delete-outlined', NULL, 23, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999772726', '1548901111999772126', '系统监控', 'devMonitor', 'sugg84qph2', 'MENU', '1548901111999770525', 'MENU', '/dev/monitor', 'dev/monitor/index', 'database-outlined', NULL, 24, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999772826', '1548901111999772126', '连接监控', '连接监控', '1xw98nknao', 'MENU', '1548901111999770525', 'IFRAME', 'http://localhost:82/druid/index.html', NULL, 'console-sql-outlined', NULL, 25, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999772926', '1548901111999772126', '接口文档', 'jieKouWenDang', 'ookzmx37dt', 'MENU', '1548901111999770525', 'IFRAME', 'http://localhost:82/doc.html', NULL, 'file-word-outlined', NULL, 26, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773126', '1548901111999772126', '日志审计', NULL, 'i7wpmggo6a', 'MENU', '1548901111999770525', 'CATALOG', '/x1vjuegii4', NULL, 'robot-outlined', NULL, 27, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773226', '1548901111999773126', '访问日志', 'devVislog', 'gr29jwaigx', 'MENU', '1548901111999770525', 'MENU', '/dev/vislog', 'dev/log/vislog/index', 'bars-outlined', NULL, 28, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773326', '1548901111999773126', '操作日志', 'devOplog', '4jbjjrz8h7', 'MENU', '1548901111999770525', 'MENU', '/dev/oplog', 'dev/log/oplog/index', 'bars-outlined', NULL, 29, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773426', '0', '开发示例', NULL, 'kyd5idwiwr', 'MENU', '1548901111999770525', 'CATALOG', '/e2re4evf5y', NULL, 'project-outlined', NULL, 30, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773427', '1548901111999773426', '图标选择', 'tuBiaoXuanZe', '97ygt0hy8t', 'MENU', '1548901111999770525', 'MENU', '/exm/iconSelect', 'exm/iconSelect/index', 'appstore-outlined', NULL, 31, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773428', '1548901111999773426', 'ECK线图', 'eCKXianTu', '7voetv0mru', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/eCKXianTu', 'exm/chart/eCKXianTu', 'appstore-outlined', NULL, 32, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773429', '1548901111999773426', 'EC仪表图', 'eCYiBiaoTu', 'c4uor9wg1b', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/eCYiBiaoTu', 'exm/chart/eCYiBiaoTu', 'appstore-outlined', NULL, 33, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773430', '1548901111999773426', 'EC散点图', 'eCSanDianTu', '6r6ti8izxi', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/eCSanDianTu', 'exm/chart/eCSanDianTu', 'appstore-outlined', NULL, 34, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773431', '1548901111999773426', 'EC柱状图', 'eCZhuZhuangTu', 's3ft1ri9qz', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/eCZhuZhuangTu', 'exm/chart/eCZhuZhuangTu', 'appstore-outlined', NULL, 35, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773432', '1548901111999773426', 'EC树形图', 'eCShuXingTu', '63lz6owubp', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/eCShuXingTu', 'exm/chart/eCShuXingTu', 'appstore-outlined', NULL, 36, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773433', '1548901111999773426', 'EC漏斗图', 'eCLouDouTu', 'd46vov3j2d', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/eCLouDouTu', 'exm/chart/eCLouDouTu', 'appstore-outlined', NULL, 37, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773434', '1548901111999773426', 'EC线形图', 'eCXianXingTu', 'dgp8hclhlr', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/eCXianXingTu', 'exm/chart/eCXianXingTu', 'appstore-outlined', NULL, 38, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773435', '1548901111999773426', 'EC饼状图', 'eCBingZhuangTu', '2y1g7u2p1k', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/eCBingZhuangTu', 'exm/chart/eCBingZhuangTu', 'appstore-outlined', NULL, 39, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773436', '1548901111999773426', 'G2进度图', 'g2JinDuTu', '8vvhyctv2w', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/g2JinDuTu', 'exm/chart/g2JinDuTu', 'appstore-outlined', NULL, 40, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773437', '1548901111999773426', 'G2子弹图', 'g2ZiDanTu', '3lgc3ci5f3', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/g2ZiDanTu', 'exm/chart/g2ZiDanTu', 'appstore-outlined', NULL, 41, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773438', '1548901111999773426', 'G2散点图', 'g2SanDianTu', 'e22qm4b30d', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/g2SanDianTu', 'exm/chart/g2SanDianTu', 'appstore-outlined', NULL, 42, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773439', '1548901111999773426', 'G2柱状图', 'g2ZhuZhuangTu', '92huf33fcf', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/g2ZhuZhuangTu', 'exm/chart/g2ZhuZhuangTu', 'appstore-outlined', NULL, 43, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773440', '1548901111999773426', 'G2漏斗图', 'g2LouDouTu', '7w3gnlts80', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/g2LouDouTu', 'exm/chart/g2LouDouTu', 'appstore-outlined', NULL, 44, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773441', '1548901111999773426', 'G2折线图', 'g2ZheXianTu', '4g3gr90z1i', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/g2ZheXianTu', 'exm/chart/g2ZheXianTu', 'appstore-outlined', NULL, 45, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773442', '1548901111999773426', 'G2词云图', 'g2CiYunTu', 'atpbicf8em', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/g2CiYunTu', 'exm/chart/g2CiYunTu', 'appstore-outlined', NULL, 46, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773443', '1548901111999773426', 'G2面积图', 'g2MianJiTu', 'm5lnxo3d56', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/g2MianJiTu', 'exm/chart/g2MianJiTu', 'appstore-outlined', NULL, 47, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773444', '1548901111999773426', 'G2饼状图', 'g2BingZhuangTu', 'tmn482a18x', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/g2BingZhuangTu', 'exm/chart/g2BingZhuangTu', 'appstore-outlined', NULL, 48, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773445', '1548901111999773426', 'G2条形图', 'g2TiaoXingTu', 'aej0gwpe43', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/g2TiaoXingTu', 'exm/chart/g2TiaoXingTu', 'appstore-outlined', NULL, 49, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773976', NULL, '业务', NULL, 'system', 'MODULE', NULL, NULL, NULL, NULL, 'profile-outlined', '#d81b43', 50, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773977', '0', '公司架构', NULL, '3xavzjxt5z', 'MENU', '1548901111999773976', 'CATALOG', '/1nlpdpnief', NULL, 'cluster-outlined', NULL, 51, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773978', '1548901111999773977', '机构管理', 'bizOrg', 'mnt1f21q40', 'MENU', '1548901111999773976', 'MENU', '/biz/org', 'biz/org/index', 'cluster-outlined', NULL, 52, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773979', '1548901111999773977', '人员管理', 'bizUser', '38dptg40lo', 'MENU', '1548901111999773976', 'MENU', '/biz/user', 'biz/user/index', 'user-outlined', NULL, 53, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1548901111999773980', '1548901111999773977', '岗位管理', 'bizPosition', 'l6b7kcqaji', 'MENU', '1548901111999773976', 'MENU', '/biz/position', 'biz/position/index', 'apartment-outlined', NULL, 54, NULL, 'NOT_DELETE', '2022-07-18 13:45:57', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1571129529564758017', '1548901111999773978', '新增机构', NULL, 'bizOrgAdd', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 1, NULL, 'NOT_DELETE', '2022-09-17 21:30:45', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1571129929961406466', '1548901111999773978', '批量删除', NULL, 'bizOrgBatchDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, 'NOT_DELETE', '2022-09-17 21:32:20', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1571130756155408386', '1548901111999773978', '编辑机构', NULL, 'bizOrgEdit', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, 'NOT_DELETE', '2022-09-17 21:35:37', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1571130811058847745', '1548901111999773978', '删除机构', NULL, 'bizOrgDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, 'NOT_DELETE', '2022-09-17 21:35:50', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1571130973294526465', '1548901111999773979', '新增人员', NULL, 'bizUserAdd', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 1, NULL, 'NOT_DELETE', '2022-09-17 21:36:29', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1571131043532341249', '1548901111999773979', '批量删除', NULL, 'bizUserBatchDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, 'NOT_DELETE', '2022-09-17 21:36:46', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1571131137006600193', '1548901111999773979', '编辑人员', NULL, 'bizUserEdit', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, 'NOT_DELETE', '2022-09-17 21:37:08', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1571131427361488898', '1548901111999773979', '授权角色', NULL, 'bizUserGrantRole', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, 'NOT_DELETE', '2022-09-17 21:38:17', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1571131544973967361', '1548901111999773979', '重置密码', NULL, 'bizUserPwdReset', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 5, NULL, 'NOT_DELETE', '2022-09-17 21:38:45', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1571131727656878081', '1548901111999773979', '删除人员', NULL, 'bizUserDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 6, NULL, 'NOT_DELETE', '2022-09-17 21:39:29', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1571132076853657601', '1548901111999773979', '启用禁用', NULL, 'bizUserUpdataStatus', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 7, NULL, 'NOT_DELETE', '2022-09-17 21:40:52', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1571132393993371649', '1548901111999773980', '新增岗位', NULL, 'bizPositionAdd', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 1, NULL, 'NOT_DELETE', '2022-09-17 21:42:08', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1571132468178026497', '1548901111999773980', '批量删除', NULL, 'bizPositionBatchDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, 'NOT_DELETE', '2022-09-17 21:42:25', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1571132576143605761', '1548901111999773980', '编辑岗位', NULL, 'bizPositionEdit', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, 'NOT_DELETE', '2022-09-17 21:42:51', '-1', NULL, NULL); +INSERT INTO `SYS_RESOURCE` VALUES ('1571132658851086338', '1548901111999773980', '删除岗位', NULL, 'bizPositionDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, 'NOT_DELETE', '2022-09-17 21:43:11', '-1', NULL, NULL); + +-- ---------------------------- +-- Table structure for SYS_ROLE +-- ---------------------------- +DROP TABLE IF EXISTS `SYS_ROLE`; +CREATE TABLE `SYS_ROLE` ( + `ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `ORG_ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组织id', + `NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `CODE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '编码', + `CATEGORY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分类', + `SORT_CODE` int(0) NULL DEFAULT NULL COMMENT '排序码', + `EXT_JSON` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '扩展信息', + `DELETE_FLAG` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '删除标志', + `CREATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `CREATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建用户', + `UPDATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `UPDATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改用户', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of SYS_ROLE +-- ---------------------------- +INSERT INTO `SYS_ROLE` VALUES ('1570687866138206208', NULL, '超级管理员', 'superAdmin', 'GLOBAL', 1, NULL, 'NOT_DELETE', '2022-07-06 23:51:10', '-1', NULL, NULL); +INSERT INTO `SYS_ROLE` VALUES ('1570687866138206209', NULL, '业务管理员', 'bizAdmin', 'GLOBAL', 2, NULL, 'NOT_DELETE', '2022-07-06 23:51:10', '-1', NULL, NULL); + +-- ---------------------------- +-- Table structure for SYS_USER +-- ---------------------------- +DROP TABLE IF EXISTS `SYS_USER`; +CREATE TABLE `SYS_USER` ( + `ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `AVATAR` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '头像', + `SIGNATURE` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '签名', + `ACCOUNT` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '账号', + `PASSWORD` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码', + `NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名', + `NICKNAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '昵称', + `GENDER` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '性别', + `AGE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '年龄', + `BIRTHDAY` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '出生日期', + `NATION` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '民族', + `NATIVE_PLACE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '籍贯', + `HOME_ADDRESS` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '家庭住址', + `MAILING_ADDRESS` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '通信地址', + `ID_CARD_TYPE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '证件类型', + `ID_CARD_NUMBER` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '证件号码', + `CULTURE_LEVEL` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文化程度', + `POLITICAL_OUTLOOK` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '政治面貌', + `COLLEGE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '毕业院校', + `EDUCATION` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '学历', + `EDU_LENGTH` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '学制', + `DEGREE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '学位', + `PHONE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机', + `EMAIL` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱', + `HOME_TEL` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '家庭电话', + `OFFICE_TEL` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '办公电话', + `EMERGENCY_CONTACT` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '紧急联系人', + `EMERGENCY_PHONE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '紧急联系人电话', + `EMERGENCY_ADDRESS` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '紧急联系人地址', + `EMP_NO` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '员工编号', + `ENTRY_DATE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '入职日期', + `ORG_ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '机构id', + `POSITION_ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '职位id', + `POSITION_LEVEL` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '职级', + `DIRECTOR_ID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '主管id', + `POSITION_JSON` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '兼任信息', + `LAST_LOGIN_IP` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '上次登录ip', + `LAST_LOGIN_ADDRESS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '上次登录地点', + `LAST_LOGIN_TIME` datetime(0) NULL DEFAULT NULL COMMENT '上次登录时间', + `LAST_LOGIN_DEVICE` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '上次登录设备', + `LATEST_LOGIN_IP` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '最新登录ip', + `LATEST_LOGIN_ADDRESS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '最新登录地点', + `LATEST_LOGIN_TIME` datetime(0) NULL DEFAULT NULL COMMENT '最新登录时间', + `LATEST_LOGIN_DEVICE` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '最新登录设备', + `USER_STATUS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户状态', + `SORT_CODE` int(0) NULL DEFAULT NULL COMMENT '排序码', + `EXT_JSON` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '扩展信息', + `DELETE_FLAG` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '删除标志', + `CREATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `CREATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建用户', + `UPDATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '修改时间', + `UPDATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改用户', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of SYS_USER +-- ---------------------------- +INSERT INTO `SYS_USER` VALUES ('1543837863788879871', 'data:image/jpg;base64,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', 'data:image/png;base64,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', 'superAdmin', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '超管', NULL, '男', NULL, '1990-01-01', '汉', '新疆维吾尔自治区乌鲁木齐市', '新疆维吾尔自治区乌鲁木齐市达坂城区大学广场97号-3-6', '新疆维吾尔自治区乌鲁木齐市达坂城区大学广场97号-3-6', '身份证', '5cabec9d8a98f62836a4f1cc3e29a423ba6c83bfca3b5d297c72611f62749b84', NULL, NULL, NULL, NULL, NULL, NULL, 'eb77186abe605f8de5958df60ef4a279', 'superAdmin@foxmail.com', NULL, NULL, '系统管理员', '9c8f683ccff14071f90f1f51ba83f069', '四川省成都市成华区大港三街83号-3-10', '0000', '2022-07-04', '1543842934270394376', '1543899639134019612', 'C1', '1543837863788879876', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 1, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879873', 'data:image/jpg;base64,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', 'data:image/png;base64,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', 'bizAdmin', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '业管', NULL, '男', NULL, '1995-01-01', '汉', '四川省成都市', '四川省成都市成华区大港三街83号-3-10', '四川省成都市成华区大港三街83号-3-10', '身份证', '82bf93da3e832e7cb90278a4a75268c4ef43af01915e6312f617a8c0636b805c', NULL, NULL, NULL, NULL, NULL, NULL, '9c8f683ccff14071f90f1f51ba83f069', 'bizAdmin@foxmail.com', NULL, NULL, '业务管理员', 'eb77186abe605f8de5958df60ef4a279', '新疆维吾尔自治区乌鲁木齐市达坂城区大学广场97号-3-6', '0001', '2022-07-04', '1543842934270394376', '1543899639134019612', 'C1', '1543837863788879876', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 2, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879874', 'data:image/jpg;base64,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', NULL, '15908868936', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '云峰', NULL, '男', NULL, '1996-03-01', '汉', '贵州省遵义市', '贵州省遵义市习水县正阳关街95号-1-6', '贵州省遵义市习水县正阳关街95号-1-6', '身份证', '6a03973f8de7f8bde0124998dfd2fdffed589f76433e51397463420ae797032e', NULL, NULL, NULL, NULL, NULL, NULL, '230c50186acba606954675cc5a3ba95f', '0dv7fw15@sohu.com', NULL, NULL, '梁发', 'b32a0e152a33b7ca1a22c99ef74e57eb', '湖北省武汉市江汉区周村大厦17号-4-4', '0002', '2022-07-04', '1543842934270394369', '1543899639134019583', 'A0', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'DISABLED', 3, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879875', 'data:image/jpg;base64,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', NULL, '15908818916', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '华明永', NULL, '男', NULL, '1992-06-10', '汉', '四川省自贡市', '四川省自贡市大安区大港沿62号-8-1', '四川省自贡市大安区大港沿62号-8-1', '身份证', '82d38e9ac108939377a52ddfdf0f91261f07edec4822c0206f760e32b77dfe4c', NULL, NULL, NULL, NULL, NULL, NULL, '404cd70992ccddce5eb61e3506fbaf0c', 'jqaqyv@yahoo.com', NULL, NULL, '范琼勤', '7fd5feae3b9b50bf5a519f4b517e3b05', '黑龙江省大庆市让胡路区兴安大厦112号-15-8', '0003', '2022-07-04', '1543842934270394369', '1543899639134019584', 'A1', '1543837863788879874', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 4, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879876', 'data:image/jpg;base64,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', NULL, '15908787747', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '周丹', NULL, '男', NULL, '1995-12-12', '汉', '四川省自贡市', '四川省自贡市风岗街73号-7-8', '四川省自贡市风岗街73号-7-8', '身份证', '1b70b117e828708f263b5762ae1ff2d54e241ce8631575943563093a16421680', NULL, NULL, NULL, NULL, NULL, NULL, 'c1b5b42528518db8ff18cb3b9264a4e7', '62cyzqd@263.net', NULL, NULL, '席瑾颖', 'e2137bee07214b0a438d700fa65c27c6', '四川省阿坝藏族羌族自治州金川县沛县路100号-19-7', '0004', '2022-07-04', '1543842934270394369', '1543899639134019585', 'A1', '1543837863788879875', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'DISABLED', 5, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879877', 'data:image/jpg;base64,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', NULL, '15908773956', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '秦琼勤', NULL, '男', NULL, '1993-05-01', '汉', '江西省吉安市', '江西省吉安市新干县新安路144号-3-9', '江西省吉安市新干县新安路144号-3-9', '身份证', 'ed1c175925a79ac0a69285eb76faec1efc64560802fd96f5f17c3ad51a38eee4', NULL, NULL, NULL, NULL, NULL, NULL, '35949e6af4eac27ef729c2bc71033cab', '55kqvepy@yahoo.com.cn', NULL, NULL, '花贵福', '688bc77909af612c330f097d115f1e9c', '四川省凉山彝族自治州雷波县李村街128号-16-3', '0005', '2022-07-04', '1543842934270394369', '1543899639134019585', 'A1', '1543837863788879875', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 6, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879878', 'data:image/jpg;base64,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', NULL, '15908672124', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '云固之', NULL, '男', NULL, '1993-06-23', '汉', '四川省雅安市', '四川省雅安市汉源县太湖路60号-10-2', '四川省雅安市汉源县太湖路60号-10-2', '身份证', '27a4b13b0a7002741e8ad30f5320d9daf344b40899e39dd6b6b9c067f69359e2', NULL, NULL, NULL, NULL, NULL, NULL, 'daea642d9f27fc9a4249e52c6ae7b2c8', 'p77bq7@gmail.com', NULL, NULL, '鲍悦昭', '75a49ecae12de82ad9eb0aff1dd12ab5', '甘肃省庆阳市合水县高邮湖街101号-19-9', '0006', '2022-07-04', '1543842934270394369', '1543899639134019586', 'A1', '1543837863788879875', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 7, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879879', 'data:image/jpg;base64,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', NULL, '15908667640', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '范卿', NULL, '男', NULL, '1995-07-23', '汉', '云南省保山市', '云南省保山市腾冲县虹桥广场150号-18-8', '云南省保山市腾冲县虹桥广场150号-18-8', '身份证', 'de6801ee98040b58dfdae96ac81cc25a94306372d1cd341544feddd7fae37125', NULL, NULL, NULL, NULL, NULL, NULL, 'a95c180457c251089d279654e254fbb5', 'zyss0q@yahoo.com.cn', NULL, NULL, '祝秀娟', '6a210e8e2a6f729bd1fb1828a1ebb88f', '四川省宜宾市翠屏区承德街147号-16-5', '0007', '2022-07-04', '1543842934270394369', '1543899639134019587', 'A1', '1543837863788879875', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 8, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879880', 'data:image/jpg;base64,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', NULL, '15908623536', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '严裕', NULL, '男', NULL, '1996-04-29', '汉', '四川省凉山彝族自治州', '四川省凉山彝族自治州会东县上海路99号-19-6', '四川省凉山彝族自治州会东县上海路99号-19-6', '身份证', '3a71d8d49ab539966ec46f1de6555f927f1afb6974dee60288e8a9cf0a6b7d74', NULL, NULL, NULL, NULL, NULL, NULL, '1ccdb23d245c60988ecfa31fe14b536c', '5qvu6d304@sina.com', NULL, NULL, '杜燕彩', '85a5a355f7e5cfa0b9702fabb71e874c', '河南省南阳市西峡县仙居街48号-5-6', '0008', '2022-07-04', '1543842934270394370', '1543899639134019588', 'B1', '1543837863788879875', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 9, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879881', 'data:image/jpg;base64,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', NULL, '15908603811', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '酆善', NULL, '男', NULL, '1992-12-20', '汉', '河南省周口市', '河南省周口市太康县江南大厦133号-16-10', '河南省周口市太康县江南大厦133号-16-10', '身份证', '29c9a117e0376078fabd2dfcc86f8cbd2fb3ebef658d06d204b58d19abfb4a04', NULL, NULL, NULL, NULL, NULL, NULL, '74a678091f38cf1232ca58153c61d4be', '8qkg47z@yahoo.com.cn', NULL, NULL, '邹晨辰', '8f758b3158c299d6e0eff2e5bc1908c2', '四川省阿坝藏族羌族自治州九寨沟县锦州支街106号-15-10', '0009', '2022-07-04', '1543842934270394370', '1543899639134019589', 'C1', '1543837863788879880', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 10, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879882', 'data:image/jpg;base64,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', NULL, '15305134325', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '毛波宁', NULL, '男', NULL, '1996-07-04', '汉', '四川省成都市', '四川省成都市双流县胶东广场102号-17-7', '四川省成都市双流县胶东广场102号-17-7', '身份证', '6f607651c89f944255340c8575b4328a1f07edec4822c0206f760e32b77dfe4c', NULL, NULL, NULL, NULL, NULL, NULL, '48e02b9afade88c46b2115634afc9fdb', 'zycgp4t@hotmail.com', NULL, NULL, '吴武新', 'd320c8e979706442a8639262aac85332', '重庆市双桥区新安路36号-2-8', '0010', '2022-07-04', '1543842934270394370', '1543899639134019590', 'C1', '1543837863788879880', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 11, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879883', 'data:image/jpg;base64,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', NULL, '15908603096', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '穆彪博', NULL, '男', NULL, '1996-05-22', '汉', '四川省攀枝花市', '四川省攀枝花市米易县宁阳广场32号-11-3', '四川省攀枝花市米易县宁阳广场32号-11-3', '身份证', 'eba39b9e9fddbfd7018b724c3afed2239785f65375df41c939d8cdb4d88ca5db', NULL, NULL, NULL, NULL, NULL, NULL, '39413bf58c8e615b1d13c9ea02f2693e', 'cc7q52wg3@hotmail.com', NULL, NULL, '秦群豪', 'a7fa15ddf82381c9185a24c13106f4e3', '河北省保定市清苑县华城路14号-7-9', '0011', '2022-07-04', '1543842934270394371', '1543899639134019591', 'B1', '1543837863788879876', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 12, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879884', 'data:image/jpg;base64,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', NULL, '15908592273', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '廉飞彬', NULL, '男', NULL, '1993-06-03', '汉', '浙江省金华市', '浙江省金华市永康市伏龙山路124号-2-1', '浙江省金华市永康市伏龙山路124号-2-1', '身份证', '3c5dd54fe82e85855d4dc528e93c575f06d06cf04f13630403919cbe7b0777ee', NULL, NULL, NULL, NULL, NULL, NULL, '9ada4dea2a81004c6e3c1d1477a9d1de', 'lfdt9pu@sina.com', NULL, NULL, '花中', '820ac5bab156e90bf85252f03eb39e28', '新疆维吾尔自治区克孜勒苏柯尔克孜自治州阿克陶县标山路64号-20-8', '0012', '2022-07-04', '1543842934270394371', '1543899639134019592', 'C1', '1543837863788879883', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 13, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879885', 'data:image/jpg;base64,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', NULL, '15908587949', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '王薇', NULL, '男', NULL, '1994-07-26', '汉', '四川省雅安市', '四川省雅安市石棉县东光大厦68号-18-6', '四川省雅安市石棉县东光大厦68号-18-6', '身份证', 'd8d62d828f405681c7cea6d344d702ac10696dd8958e28583703c74d3a19aea9', NULL, NULL, NULL, NULL, NULL, NULL, 'db488003a31156a054702588c3c83351', 'mrc03kcm@ask.com', NULL, NULL, '项固之', '35e63bfeb678f8bda348887b6a6c9e3f', '四川省阿坝藏族羌族自治州松潘县福州北路62号-8-6', '0013', '2022-07-04', '1543842934270394371', '1543899639134019593', 'C1', '1543837863788879883', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 14, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879886', 'data:image/jpg;base64,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', NULL, '15908548666', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '米姣', NULL, '男', NULL, '1994-06-19', '汉', '四川省泸州市', '四川省泸州市古蔺县平阴路15号-8-10', '四川省泸州市古蔺县平阴路15号-8-10', '身份证', '4b193a112e548eee61d8ed1fd00a439b94019cfb53b013722c1af87d36d246c8', NULL, NULL, NULL, NULL, NULL, NULL, '8474259d099205c4a76b05af817ff9ae', '7xf61s@163.com', NULL, NULL, '鲁晨辰', 'b8002a429b7bf45282fccee2a494c30a', '四川省巴中市新安路69号-11-10', '0014', '2022-07-04', '1543842934270394371', '1543899639134019594', 'C1', '1543837863788879883', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 15, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879887', 'data:image/jpg;base64,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', NULL, '15908491526', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '袁伟刚', NULL, '男', NULL, '1996-05-10', '汉', '山东省威海市', '山东省威海市荣成市昆明路71号-1-5', '山东省威海市荣成市昆明路71号-1-5', '身份证', 'adeca7f5993f0d16968a17fa7c4c577d3ad560279d87ddd748dc3b31d815b8be', NULL, NULL, NULL, NULL, NULL, NULL, '242ae50ebc8a00eb17eabd90aca9e186', 'twkqf2@yeah.net', NULL, NULL, '计伯', '525d77353b3bf7d054c410721534cf68', '四川省绵阳市北川羌族自治县恩县广场142号-4-9', '0015', '2022-07-04', '1543842934270394372', '1543899639134019595', 'B1', '1543837863788879876', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 16, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879888', 'data:image/jpg;base64,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', NULL, '15908444664', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '姚庆', NULL, '男', NULL, '1996-08-21', '汉', '四川省成都市', '四川省成都市都江堰市新田路82号-20-10', '四川省成都市都江堰市新田路82号-20-10', '身份证', 'c3bceddc993558d5ee8c2e1bdd022ef9506ad6c7369d15ce9b4ee1b03f96fa60', NULL, NULL, NULL, NULL, NULL, NULL, '272ef93facfa31dcbaea22a9cdd19221', 'tkcz6uza@263.net', NULL, NULL, '王裕', '81a91bc6adb94ec8c28f87c698506211', '四川省凉山彝族自治州宁南县市场一路30号-12-4', '0016', '2022-07-04', '1543842934270394372', '1543899639134019596', 'C1', '1543837863788879887', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 17, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879889', 'data:image/jpg;base64,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', NULL, '15908443719', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '倪艳', NULL, '男', NULL, '1992-08-30', '汉', '四川省广元市', '四川省广元市剑阁县掖县路39号-10-6', '四川省广元市剑阁县掖县路39号-10-6', '身份证', '0123ef4a826c2fffdbe09afc56221acfdaa4cb93bc49714a6254b452788af023', NULL, NULL, NULL, NULL, NULL, NULL, '65fcbca18303e00cf1724ef0b9670459', 'rd11l7n@hotmail.com', NULL, NULL, '伍蕊薇', '2e1638f0f370c8a5333b99efdaf94024', '河南省洛阳市汝阳县山西广场64号-7-5', '0017', '2022-07-04', '1543842934270394372', '1543899639134019597', 'C1', '1543837863788879887', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 18, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879890', 'data:image/jpg;base64,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', NULL, '15908406065', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '戚冠', NULL, '男', NULL, '1993-01-11', '汉', '四川省阿坝藏族羌族自治州', '四川省阿坝藏族羌族自治州黑水县武胜关广场87号-19-3', '四川省阿坝藏族羌族自治州黑水县武胜关广场87号-19-3', '身份证', '9e688444b73b2469cdbb818b0d0fef47506ad6c7369d15ce9b4ee1b03f96fa60', NULL, NULL, NULL, NULL, NULL, NULL, '5d3368c5d171ab19d3bd5235501e15ee', 'qzak6n@gmail.com', NULL, NULL, '孔希', '815b2db3e64526f574998908a624bd23', '四川省攀枝花市东区无棣一路69号-6-3', '0018', '2022-07-04', '1543842934270394372', '1543899639134019598', 'C1', '1543837863788879887', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 19, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879891', 'data:image/jpg;base64,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', NULL, '15908368732', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '窦兴', NULL, '男', NULL, '1994-02-05', '汉', '辽宁省本溪市', '辽宁省本溪市桓仁满族自治县瑞金广场109号-14-9', '辽宁省本溪市桓仁满族自治县瑞金广场109号-14-9', '身份证', '08a6ea38575fae1719f7ad0b3a167478916364fa387dd3086883d470568be3f6', NULL, NULL, NULL, NULL, NULL, NULL, 'aac4286f3921b2ab731468e0dacd9925', 'lcrb7f@msn.com', NULL, NULL, '沈志', '0265797b6b9c06ae0dcd2795c63082e4', '四川省南充市嘉陵区安城街139号-10-8', '0019', '2022-07-04', '1543842934270394372', '1543899639134019598', 'C1', '1543837863788879887', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 20, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879892', 'data:image/jpg;base64,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', NULL, '15908297993', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '薛芬芳', NULL, '男', NULL, '1992-07-19', '汉', '四川省攀枝花市', '四川省攀枝花市仁和区红山峡支路58号-12-3', '四川省攀枝花市仁和区红山峡支路58号-12-3', '身份证', 'bff28644bd638f5c6c04e742bfb369e15050b821d450f5720ded9a8fd55774b0', NULL, NULL, NULL, NULL, NULL, NULL, '74842d64e30808b9bb7b7893e21124f8', '7pgsq34@0355.net', NULL, NULL, '秦家', '80df9c0b8a936b02de576bf160750040', '江苏省镇江市京口区雒口大厦69号-20-2', '0020', '2022-07-04', '1543842934270394373', '1543899639134019599', 'B1', '1543837863788879876', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 21, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879893', 'data:image/jpg;base64,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', NULL, '15908285297', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '史博', NULL, '男', NULL, '1996-01-25', '汉', '湖北省武汉市', '湖北省武汉市武昌区王家麦岛46号-15-8', '湖北省武汉市武昌区王家麦岛46号-15-8', '身份证', '107ae8f627cf538da955139e7e5603761167fd632b2d7774bac7cc3b8bef5723', NULL, NULL, NULL, NULL, NULL, NULL, '6c79b1646de72230890ff05e0ef7d2c0', '3ggkluh@live.com', NULL, NULL, '鲍伟刚', 'dea4367134492288d8c76d6ee65a717f', '四川省南充市澳门四街103号-2-7', '0021', '2022-07-04', '1543842934270394373', '1543899639134019600', 'C1', '1543837863788879892', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 22, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879894', 'data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDvKKKK/IT6sKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigB8MTTzJEpUM5wCxwKs6hp8unzKkhDBhkMOh9aitbO4vHK26b2UZPzAY/Ott5Lie7tbXUxHCigP8xBMhHHXtmvTwmEjWoPmi021yy+zvZpvb+vv5qtVwmrNW6rqZt5pT2dlFcPKv7zHyYwQSM1n12C6usmriyjQMvIMme4BNQajrj2N40AgVwoByWx1FelisrwKi6sK3LBPl+Fv3ra9f8AgHPSxNa/K4Xb13toYlhpc+oK7QvGoQgHeSP5CnXWjXVq8SMY3aVtqhG7/iBV/S38zTdVfGNyscfgasyfc0T/AID/AOgipo5bhp4WMmnzOzvf+/y7egTxFSNVrp/wLlS28OyNayPcB0mBOxFZTnj/ABrNudMvLSLzZ4diZxncD/I10W5p9Uv7YmfhFKGOUjbwOgzjrVTUxLB4fgiuXLTmTnc2SeSf5YrbFZbhVQlKEWuRS1vu07a6bvpYmliKvOk2tbaeqvoc7RRRXyx6YUUUUAFFFFAFmyuZra4UwuULEA47jNb+qFV1i3Z7czosTEptB9eea5qEqs8ZckKGBJHYZrpNS12GMGO1CyyMuC/YD+tfQZZWprCVFWqWScWuu13ovP8A4c4MTCTqxcI3un/VxdP1HT572OOCxWKQ5w4RRjg+lLqOoWFveNHPZLLIAMsUU5496x9C/wCQxB/wL/0E07X/APkLyfRf5V0rM639mutZX57bK1rX2M/q8PrHJra3fzNCxkjns9VeGPYjKdqAYx8p9KddyfZ7fSJGViIwCQo5+6Kz9K1OOwtblTu81+UwMjOD1qefxCzeRJFGPORSH3j5SSBnGD7U6eNw/wBUXPO07dFt799v0FKjU9q7R0/4Fiw+o6c9w0/2W8WVxhmQlc/k3tTpIbC+024u1hm3xqwBmkYkEDPqadpup3uo+YAbeMpjgoxzn/gVSag62elXKyyo00xJwvGScDgfSu2PLVoSrytKDUndwS1+9u9/Iyd4zUFdPTq2cnRRRXxB7IUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf/9k=', NULL, '15908277086', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '许鸣', NULL, '男', NULL, '1996-08-13', '汉', '贵州省遵义市', '贵州省遵义市红花岗区大港三街77号-3-3', '贵州省遵义市红花岗区大港三街77号-3-3', '身份证', 'bf04cdc0202e8e2a82362693d65d754609704c0c68c240677c4786b69e5bf1a1', NULL, NULL, NULL, NULL, NULL, NULL, '6653643bbd9cb5782ecd1382e953da31', 'xl4ir88t0@163.net', NULL, NULL, '金振壮', '8ef7175a29b3a41b353f78c6d49288a2', '湖北省黄石市西塞山区太湖路22号-12-9', '0022', '2022-07-04', '1543842934270394373', '1543899639134019601', 'C1', '1543837863788879892', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 23, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879895', 'data:image/jpg;base64,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', NULL, '15908264436', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '穆茂进', NULL, '男', NULL, '1995-04-22', '汉', '四川省资阳市', '四川省资阳市安岳县泰州五街127号-10-10', '四川省资阳市安岳县泰州五街127号-10-10', '身份证', 'fc4efd51f3a9f687aca5d9bd46582591d43e5e45dcc24fdb7afa79503bcbb614', NULL, NULL, NULL, NULL, NULL, NULL, '0f9476f31302d6471502fc10941b3c1a', '0mtggxah@aol.com', NULL, NULL, '钱翰', '515339b0ccee740ed1349cda87dcdc77', '江苏省南通市海安县漳州路一路121号-18-1', '0023', '2022-07-04', '1543842934270394373', '1543899639134019601', 'C1', '1543837863788879892', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 24, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879896', 'data:image/jpg;base64,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', NULL, '15908257238', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '顾永', NULL, '男', NULL, '1993-07-17', '汉', '山东省济宁市', '山东省济宁市泗水县大连街28号-17-8', '山东省济宁市泗水县大连街28号-17-8', '身份证', 'e48a07c883bdeda55953199d5dfc340986efb0d4901d56709928e53fc87347f7', NULL, NULL, NULL, NULL, NULL, NULL, 'd37adc7ddb7800cbabefa81d4a3b33e5', 'hequ2p2e2@hotmail.com', NULL, NULL, '熊竹霭', 'ce7d1f7d65f6636ad892b72cbbce80a4', '四川省广元市旺苍县闽江大厦67号-14-10', '0024', '2022-07-04', '1543842934270394373', '1543899639134019602', 'C1', '1543837863788879892', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 25, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879897', 'data:image/jpg;base64,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', NULL, '15908251128', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '赵时', NULL, '男', NULL, '1995-05-09', '汉', '四川省达州市', '四川省达州市达县四平路72号-7-1', '四川省达州市达县四平路72号-7-1', '身份证', 'e482a1277bdd7ace91c5b3ca3da2d1041a3e3823eed4d7b57eb6a7d996b3fc95', NULL, NULL, NULL, NULL, NULL, NULL, '94405a8df2105cd49091de9060e59642', '42fztu@sina.com', NULL, NULL, '明华', 'c51a112c654534d53f6a68fb0bcc1a7e', '重庆市南岸区台东东七广场49号-8-8', '0025', '2022-07-04', '1543842934270394373', '1543899639134019603', 'C1', '1543837863788879892', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 26, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879898', 'data:image/jpg;base64,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', NULL, '13605586796', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '鲁富顺', NULL, '男', NULL, '1993-10-27', '汉', '四川省凉山彝族自治州', '四川省凉山彝族自治州雷波县平原广场140号-5-10', '四川省凉山彝族自治州雷波县平原广场140号-5-10', '身份证', '8d5fe13a5834f7eff21fa4e9452d5e648806cfecf41adc48cad0b7a166fb7c68', NULL, NULL, NULL, NULL, NULL, NULL, '56bb8a81a3cd92fe15eb0bef5a69ae09', 'zvnqyh@yahoo.com', NULL, NULL, '周成', '18abdfaacf22e98ee36f83faebd8c84e', '四川省宜宾市南溪县南海支路74号-13-5', '0026', '2022-07-04', '1543842934270394374', '1543899639134019604', 'B1', '1543837863788879876', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 27, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879899', 'data:image/jpg;base64,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', NULL, '15908237312', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '沈强军', NULL, '男', NULL, '1996-10-11', '汉', '河南省新乡市', '河南省新乡市新乡县延吉街30号-3-9', '河南省新乡市新乡县延吉街30号-3-9', '身份证', '2415919dfae59002efcbd907a8ec94d363e0dcca9e794888dba4728da7a6cb75', NULL, NULL, NULL, NULL, NULL, NULL, '936a914a2d52f149ec1f5a3b33ec2668', '4rhm0e3o@sohu.com', NULL, NULL, '卜凝晓', 'e3ac875ef6cdb89917cfa45c76b55aa6', '四川省广安市广安区菜市一街35号-19-5', '0027', '2022-07-04', '1543842934270394374', '1543899639134019605', 'C1', '1543837863788879898', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 28, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879900', 'data:image/jpg;base64,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', NULL, '15908211381', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '沈亨奇', NULL, '男', NULL, '1993-11-19', '汉', '四川省广元市', '四川省广元市利州区西陵峡三路19号-16-9', '四川省广元市利州区西陵峡三路19号-16-9', '身份证', 'f358b393412ae1ec9244d7fdf587c155610e26ec556a0f14ce64db0654911a63', NULL, NULL, NULL, NULL, NULL, NULL, '1bc4a6bc514da03e093fd58cbf12c297', 'obaoi9zu@qq.com', NULL, NULL, '吕思', '2bb5701fde4f139dd5b81dd4125fde0f', '四川省眉山市青神县汕头街82号-7-6', '0028', '2022-07-04', '1543842934270394374', '1543899639134019606', 'C1', '1543837863788879898', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 29, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879901', 'data:image/jpg;base64,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', NULL, '15908190533', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '李霭', NULL, '男', NULL, '1995-09-20', '汉', '山东省临沂市', '山东省临沂市河东区台东东二路30号-4-7', '山东省临沂市河东区台东东二路30号-4-7', '身份证', 'e2ac0cac1f464fae34929cc2d99094492a3e9a1c8c95137ec9abf2a51ff9de2a', NULL, NULL, NULL, NULL, NULL, NULL, 'c3bddd55042b05976a948248813b16fc', 'uuiyxd0@aol.com', NULL, NULL, '罗策腾', '55aac30cc08356256e2e4c51306d0a71', '四川省绵阳市游仙区如东路56号-11-2', '0029', '2022-07-04', '1543842934270394374', '1543899639134019607', 'C1', '1543837863788879898', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 30, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879902', 'data:image/jpg;base64,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', NULL, '15908180826', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '钱珍贞', NULL, '男', NULL, '1994-03-24', '汉', '宁夏回族自治区中卫市', '宁夏回族自治区中卫市海原县团岛三街70号-7-6', '宁夏回族自治区中卫市海原县团岛三街70号-7-6', '身份证', '5696b41984b1fc4367a8a4340f23f8a58d41a4aa51f1f926de293f38d9dfaecb', NULL, NULL, NULL, NULL, NULL, NULL, '1efdce284d2d6c7bb6a6a7a3f9698096', 'zdauc8@qq.com', NULL, NULL, '尹松善', '81facefc21b72b86113731d5aa94b0a1', '新疆维吾尔自治区伊犁哈萨克自治州霍城县台西四街23号-2-6', '0030', '2022-07-04', '1543842934270394374', '1543899639134019608', 'C1', '1543837863788879898', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 31, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879903', 'data:image/jpg;base64,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', NULL, '15908111533', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '赵露瑶', NULL, '男', NULL, '1995-04-04', '汉', '四川省成都市', '四川省成都市新津县城阳街124号-12-1', '四川省成都市新津县城阳街124号-12-1', '身份证', '6b9459d9cc52f4a7e181b791dbd271d06191cc359886dd2a1788ce319e03c6af', NULL, NULL, NULL, NULL, NULL, NULL, 'f1be5388ed7dd1bcff384ac6c837576b', '23fa5cnt@yahoo.com.cn', NULL, NULL, '邬泽', '74a5e44cba344c772a2bb48bb930335f', '四川省南充市阆中市夏津大厦112号-19-1', '0031', '2022-07-04', '1543842934270394375', '1543899639134019609', 'B1', '1543837863788879875', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 32, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879904', 'data:image/jpg;base64,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', NULL, '15908098268', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '吴邦', NULL, '男', NULL, '1993-06-30', '汉', '四川省凉山彝族自治州', '四川省凉山彝族自治州美姑县宁国一支广场146号-4-7', '四川省凉山彝族自治州美姑县宁国一支广场146号-4-7', '身份证', '5301fa5eb41f5def3d156bd0aa9f2efcbb32e09cdfbeb6f958ac659d85d25ef4', NULL, NULL, NULL, NULL, NULL, NULL, '7631822e658ca33eaa788a8c445e2382', 'url2136q0@qq.com', NULL, NULL, '章维启', '285ae2361561b6141b110474da4e10df', '湖北省鄂州市梁子湖区秀湛路132号-7-8', '0032', '2022-07-04', '1543842934270394375', '1543899639134019610', 'C1', '1543837863788879903', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 33, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879905', 'data:image/jpg;base64,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', NULL, '15908030306', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '史光天', NULL, '男', NULL, '1994-07-28', '汉', '四川省南充市', '四川省南充市高坪区金口三路24号-7-8', '四川省南充市高坪区金口三路24号-7-8', '身份证', 'c3856e1bc5d148b97cd61088dc9a3d2454388a51f724a92d9dfa96ace6d5b3a1', NULL, NULL, NULL, NULL, NULL, NULL, 'af06e3492255070071f66316d9de8c62', 'z590w8oi8@0355.net', NULL, NULL, '费翰', '69906634de43310294a4c0511a3f4640', '河南省洛阳市西工区福山大厦35号-1-6', '0033', '2022-07-04', '1543842934270394375', '1543899639134019611', 'C1', '1543837863788879903', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 34, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879906', 'data:image/jpg;base64,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', NULL, '15907980472', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '臧生龙', NULL, '男', NULL, '1992-07-24', '汉', '山西省临汾市', '山西省临汾市尧都区驼峰路37号-16-1', '山西省临汾市尧都区驼峰路37号-16-1', '身份证', '7863e9e614a4903ea4eb5fb76b6613371effab7bd587ee853c84ac687e14788b', NULL, NULL, NULL, NULL, NULL, NULL, 'b01ea59f0f7137954a1a8534301a11b1', 'mvokoze@live.com', NULL, NULL, '蒋东文', '661950822e89a52d26ecc821b6d2a5bc', '云南省文山壮族苗族自治州马关县台东三街117号-11-6', '0034', '2022-07-04', '1543842934270394375', '1543899639134019611', 'C1', '1543837863788879903', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 35, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879907', 'data:image/jpg;base64,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', NULL, '15907956213', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '尤薇', NULL, '男', NULL, '1993-10-16', '汉', '四川省成都市', '四川省成都市彭州市掖县路37号-11-10', '四川省成都市彭州市掖县路37号-11-10', '身份证', '825d21e757c17cdd138de639781c6f01e4d089196dfde0b15ad8decd28afa723', NULL, NULL, NULL, NULL, NULL, NULL, 'c0355b135baed6101463f2b65016d6e6', 'bxmowe3vp@0355.net', NULL, NULL, '廉毅', '47801741321e1f7b1693280aae521868', '四川省阿坝藏族羌族自治州黑水县昆明路141号-18-6', '0035', '2022-07-04', '1543842934270394376', '1543899639134019612', 'B1', '1543837863788879876', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 36, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879908', 'data:image/jpg;base64,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', NULL, '15907955395', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '何红', NULL, '男', NULL, '1993-04-03', '汉', '四川省绵阳市', '四川省绵阳市三台县山东路115号-8-4', '四川省绵阳市三台县山东路115号-8-4', '身份证', '453c3b546b49a7aea17701d3894a66f1b0f9361d0e04a29009b9a657fd71620e', NULL, NULL, NULL, NULL, NULL, NULL, '36ded054e375f9a225908210b4dbf076', 'nu6ppye@msn.com', NULL, NULL, '严宁', '607ee5d0d045dcb4a10110806f2ef0e7', '四川省自贡市富顺县枣庄广场77号-1-7', '0036', '2022-07-04', '1543842934270394376', '1543899639134019613', 'C1', '1543837863788879907', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 37, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879909', 'data:image/jpg;base64,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', NULL, '15907915216', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '费慧巧', NULL, '男', NULL, '1996-12-28', '汉', '四川省甘孜藏族自治州', '四川省甘孜藏族自治州康定县德平广场22号-7-7', '四川省甘孜藏族自治州康定县德平广场22号-7-7', '身份证', '6c8775aa2b4963f1adbf7782ec889f42ed589f76433e51397463420ae797032e', NULL, NULL, NULL, NULL, NULL, NULL, 'd6ed8739c2837d1194899843947e3e12', '03jwur905@0355.net', NULL, NULL, '计保', '7782e29b27a434cac91dd5935002bc4a', '四川省绵阳市港联路91号-16-9', '0037', '2022-07-04', '1543842934270394376', '1543899639134019614', 'C1', '1543837863788879907', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 38, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879910', 'data:image/jpg;base64,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', NULL, '15907833046', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '韦言', NULL, '男', NULL, '1994-10-18', '汉', '湖北省恩施土家族苗族自治州', '湖北省恩施土家族苗族自治州鹤峰县如东路131号-6-4', '湖北省恩施土家族苗族自治州鹤峰县如东路131号-6-4', '身份证', '34db39a1e1976b47b4390bdcda928b758d41a4aa51f1f926de293f38d9dfaecb', NULL, NULL, NULL, NULL, NULL, NULL, 'a92b96e737d0af8a149a9663405f83e8', '720s39xk3@yahoo.com.cn', NULL, NULL, '姜磊民', '0d46b049b6c704c7b839bac0d2d51f35', '四川省攀枝花市西区泰州一路53号-5-10', '0038', '2022-07-04', '1543842934270394376', '1543899639134019615', 'C1', '1543837863788879907', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 39, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879911', 'data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDvKKKK/IT6sKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigC1Y2MuoTNFEyKwXd85IGM/wD16v8A/CNXv/PWD/vo/wCFV9FgFxqAUzNGAu4hTgsPSuhmjEl8kst7GsCDiINjPuTmvo8sy6hXw3tKkG3e3xJfPyt977HnYnEThU5Yvp2MBNFmOoizeRA2zeWXJAH6VRuYfs9zJDvD7G27hXY2tgttcT3Cu0hk+4GOdo9M/WotP1U30M8rQ+WsQ/vZzwfaumeR4e0acpck5OTW8tF06LzM442eskrpW8tWcxp9n9uu1g8zZkE7sZ6VL/ZF0880dunmrE+wtkLz9Ca2NIvobu8kP2UCdiXMmAdo4GM9aW8lupZpo9OiMTxEtKcAb/THrXPSyzCPCqo25av4U7tW2Semm78jSWJqqo42tp12OfurG5stn2iPZvzt+YHOPp9asS6Z5elR33nZ3nGzb0698+1bt/cwwNALm1NwRESfkDbemSc9OlLcXdoNFWc2wMLcLHtHB57dK0eT4SE6sefaOl73W2rtZMn63Vai7bv7zkaKKK+XPTCiiigAooooAu6Zb2tzcMl3N5UYTIbcF5yOOa6H+zNM/szbuj8r/n4yu7r/AHsfhXPaZDaT3DreSeWgTIO4DJyOK3Td6PFY/Ymm3wj+EbiTznqPevqMnVFUJSqqGqaTk9W+z8vNanm4tzc0ot9NkVobpbTW4oY7tprZlC5LhhnGB0+gqxfpHpWk3CIfmndsfj/gKS3/ALFgT7dGAoU7QGJJz7A96EvrHWonguB5TKSUyeceoP8ASu6naNKVN1I+0nfks20k0r6/kYS1kpKL5Va+nYj8OPBHCV/5byuR+AGfyqwuoST6wttFCA0bMJH/ANisnRQi62ojYsg3BWIxkYq02qRWE+oAR5uGkOxvX6/SufB4zkwdNTkoRjJp262V/vbLrUr1ZWV21+ehevpjZaiJ58m0li8tsDOCMmqV7t/4RiHYSU3/AC564yapWs9xqeywmutkfLbiucnrzV7VjBa6NDZpMsjhh0PPfmiWK+sUa1eOkHF2va/M7XW+3bQap+znCD+K6+5X1Odooor5E9UKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP//Z', NULL, '15907746112', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '袁致树', NULL, '男', NULL, '1995-12-04', '汉', '海南省省直辖县级行政区划', '海南省省直辖县级行政区划中沙群岛的岛礁及其海域伏龙街110号-16-3', '海南省省直辖县级行政区划中沙群岛的岛礁及其海域伏龙街110号-16-3', '身份证', '14b326ccd21b4aa1423ea8f66d6ac7b3f051bcd9eba02f31d01ef6b0f2e4c35f', NULL, NULL, NULL, NULL, NULL, NULL, '086b5d659bb6f67c5638b9ca727dcd5a', '9au1mqc@aol.com', NULL, NULL, '项宏言', 'c9d4c33511a178b41de86bbf8e473c18', '湖北省襄樊市宜城市仙游路66号-7-6', '0039', '2022-07-04', '1543842934270394376', '1543899639134019615', 'C1', '1543837863788879907', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 40, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879912', 'data:image/jpg;base64,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', NULL, '15907728560', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '李茂进', NULL, '男', NULL, '1993-08-09', '汉', '安徽省宣城市', '安徽省宣城市宁国市闽江一大厦120号-3-9', '安徽省宣城市宁国市闽江一大厦120号-3-9', '身份证', '0d0076cc3c0fc16e8780395bb1334cbda149a4d34e9940f57811e4c41a279c63', NULL, NULL, NULL, NULL, NULL, NULL, 'dc0dac6c3968370554ba9d7f2d5b5237', '9ufl149nl@msn.com', NULL, NULL, '舒政谦', 'a298632cf433088f8e9f99addd211f4e', '四川省成都市郫县贵州街51号-12-3', '0040', '2022-07-04', '1543842934270394377', '1543899639134019616', 'B1', '1543837863788879877', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 41, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879913', 'data:image/jpg;base64,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', NULL, '15907722777', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '尤福', NULL, '男', NULL, '1995-06-24', '汉', '河南省漯河市', '河南省漯河市召陵区雒口大厦74号-1-4', '河南省漯河市召陵区雒口大厦74号-1-4', '身份证', '8e1e34824f6adddf029af993038ee1989487d9ea13c41589b96a77722c23374b', NULL, NULL, NULL, NULL, NULL, NULL, '1ab9290e0b1499a87a3e534ca07a724d', 'v2mu90kad@aol.com', NULL, NULL, '祝纯毓', 'bc8e8880d4080f15758e65b103b4533e', '四川省乐山市峨眉山市澳门八街60号-9-3', '0041', '2022-07-04', '1543842934270394377', '1543899639134019616', 'C1', '1543837863788879912', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 42, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879914', 'data:image/jpg;base64,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', NULL, '15907718524', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '米光天', NULL, '男', NULL, '1993-08-22', '汉', '四川省甘孜藏族自治州', '四川省甘孜藏族自治州得荣县台南路109号-13-5', '四川省甘孜藏族自治州得荣县台南路109号-13-5', '身份证', '1cf36cfb84ac6058fcc75cfb8e29b0aaf4a98d1ed23e6df5e6c160223eb493f9', NULL, NULL, NULL, NULL, NULL, NULL, 'bf739cbd238c55babf8d206a4ca96366', 'yx7c5s62f@3721.net', NULL, NULL, '孔冰爽', 'd5a9e21602d57ba2ce4ec9d555a8730b', '四川省雅安市荥经县台东二路132号-8-9', '0042', '2022-07-04', '1543842934270394377', '1543899639134019618', 'C1', '1543837863788879912', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 43, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879915', 'data:image/jpg;base64,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', NULL, '15907692948', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '毛楠榕', NULL, '男', NULL, '1993-02-07', '汉', '四川省成都市', '四川省成都市新都区宁国四街89号-15-8', '四川省成都市新都区宁国四街89号-15-8', '身份证', '992734675a700387f56677dc0b9e4c9f2fc88ff015aa6bd017d49ca40a50e04f', NULL, NULL, NULL, NULL, NULL, NULL, '96d8dc62088f66b005f6c374c3733b8e', '5mxoxxn@sohu.com', NULL, NULL, '穆学祥', '60abd63f59500ece2bb12ef073b89f05', '四川省甘孜藏族自治州道孚县新湛路67号-6-1', '0043', '2022-07-04', '1543842934270394377', '1543899639134019618', 'C1', '1543837863788879912', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 44, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879916', 'data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDvKKKK/IT6sKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCeztJL24WCMqGIJyx44rS/wCEavf+esH/AH0f8KyI5HicPG7Iw7qcGtXRru5l1aFJLiV1O7Ks5IPymvUy5YOpKNKtBuUmldOy1sjlxDqxTlBqyQ7/AIRq9/56wf8AfR/wpG8N3iqWMsGAM/eP+FLrl3cxao6R3EqLtHCuQOlX9Fmkl0i5kmkdyGYZdieNo9a9SlhMuqYqWFUJJxvrfsc0quIjTVRta26dzBsbCXUJWjiZFKjJ3kj+lX/+Eavf+esH/fR/wrJjmlhJMUjoTwSrEVPHd3ksqRi7mBZgozIe9eRhp4JQUatNuXk7HXUjWveMkl6F/wD4Rq9/56wf99H/AAqve6NcWEHnSvEVyBhSc/yrbZ4tFiD3NzPcTMOAXJz9B0rBv9VuNQOHIWIHIRen4+telj8Nl+GpOLTVXte9vXoc9CpXqSvf3e9vyKNFFFfOHoBRRRQAUUUUAFaOhf8AIZg/4F/6CaZplta3Mzrdz+UgXIO4Lk/jW1aWek2dyk8d+pdc4DTLjkYr2MrwNSdSniLpRUk9Wr6PsceJrRUZU7O9uwy6/s86vcrfgY2oUJJHbnpSXOp6fa6dJbWJyWBAABwM9yTUt5aaTe3BnkvlDEAYWVcVX/snRv8AoIf+Rk/wr26qxUZ1PYKn7zfvXXNZvuccXTajz82ltOmhU07W/wCz7Xyfs/mfMWzvx/Sr0XiXzZkj+yY3sFz5nTP4VgXKRxXUiRNvjViFbOcj8K6C203SUeO4F10w4VpVwO/Nefl2JzGT9jTqJRhZa8u3lpqdGIp4dLnlF3fqXNU1b+zXjXyfM3gn72MfpWbL4l82F4/smNykZ8zpn8Kra/eRXV0iwsHWNcFh0JNZNPM86xUcTOFGp7m2yfTXW3cWHwdN01KcdfmFFFFfNnohRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB//Z', NULL, '15907452198', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '卫子', NULL, '男', NULL, '1993-08-29', '汉', '四川省绵阳市', '四川省绵阳市涪城区瞿塘峡街93号-11-1', '四川省绵阳市涪城区瞿塘峡街93号-11-1', '身份证', 'a94f16575a2c8dfce1738ae2194b24bc8f49214aad8f6818362f9b4f6b02c87c', NULL, NULL, NULL, NULL, NULL, NULL, '2a60b7aa5894e3ddade63a6edd65f9a3', 'qunrdcj2n@yahoo.com', NULL, NULL, '萧永', '01a24b215fd2fb4bb0ced674df6596e7', '四川省凉山彝族自治州盐源县青大街116号-5-5', '0044', '2022-07-04', '1543842934270394377', '1543899639134019618', 'C1', '1543837863788879912', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 45, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879917', 'data:image/jpg;base64,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', NULL, '15907432793', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '李致树', NULL, '男', NULL, '1992-01-23', '汉', '四川省凉山彝族自治州', '四川省凉山彝族自治州会理县南九水街90号-14-8', '四川省凉山彝族自治州会理县南九水街90号-14-8', '身份证', 'e26ef09db152fb20cbfda494d6acee4356ac2f9aa0db9721d33e9532b7b9be9d', NULL, NULL, NULL, NULL, NULL, NULL, '9de687c98b939e0234734a030cb9545b', 'u6dpvhv@sohu.com', NULL, NULL, '常红', 'bf8e81571d8e8fca990fc1c2bc9540b7', '宁夏回族自治区银川市兴庆区仙山西大厦83号-4-10', '0045', '2022-07-04', '1543842934270394378', '1543899639134019619', 'B1', '1543837863788879877', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 46, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879918', 'data:image/jpg;base64,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', NULL, '15907418202', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '谈可', NULL, '男', NULL, '1996-01-24', '汉', '新疆维吾尔自治区巴音郭楞蒙古自治州', '新疆维吾尔自治区巴音郭楞蒙古自治州若羌县太平角六街39号-20-10', '新疆维吾尔自治区巴音郭楞蒙古自治州若羌县太平角六街39号-20-10', '身份证', 'dbf044c40fd407feee9c7d20eeccd9e87d273fb9bcae486ba2a89966b50a3c09', NULL, NULL, NULL, NULL, NULL, NULL, '174946d5f8a64c421e310fc1769b1fc9', 'ojht5aclq@sohu.com', NULL, NULL, '曹固之', 'd8b14cf73e2bf550d289dc41b6ebe4a5', '山西省太原市古交市奉化街126号-9-6', '0046', '2022-07-04', '1543842934270394378', '1543899639134019620', 'C1', '1543837863788879917', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 47, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879919', 'data:image/jpg;base64,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', NULL, '15907398155', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '臧以', NULL, '男', NULL, '1992-05-10', '汉', '广西壮族自治区百色市', '广西壮族自治区百色市右江区太平角四路146号-5-5', '广西壮族自治区百色市右江区太平角四路146号-5-5', '身份证', 'bdb05b0a4e157a520c7d43fba89be4cfa3ef2a6abfcb6d4e904aa76a03a0583b', NULL, NULL, NULL, NULL, NULL, NULL, '64da562626bf2ab62002f81ff3d01d2a', 'gs6ird7@sohu.com', NULL, NULL, '秦新', '77c20eb91cc087331d1aadbc56f1a862', '贵州省黔东南苗族侗族自治州镇远县恒台街131号-2-10', '0047', '2022-07-04', '1543842934270394378', '1543899639134019621', 'C1', '1543837863788879917', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 48, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879920', 'data:image/jpg;base64,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', NULL, '15907382408', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '史顺', NULL, '男', NULL, '1994-04-18', '汉', '江西省萍乡市', '江西省萍乡市莲花县泰州一路136号-16-9', '江西省萍乡市莲花县泰州一路136号-16-9', '身份证', '00d86cfbf136fb317f2b333ebe2ed10649516f004c55efdfaa09d27b351e718a', NULL, NULL, NULL, NULL, NULL, NULL, 'a8ff036fde534668821f17dfa1910165', 'zoysolxk7@hotmail.com', NULL, NULL, '卞露瑶', '93605b9cab465bc8be2883a564d6d001', '云南省怒江傈僳族自治州福贡县恩县广场58号-10-6', '0048', '2022-07-04', '1543842934270394378', '1543899639134019622', 'C1', '1543837863788879917', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 49, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879921', 'data:image/jpg;base64,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', NULL, '15907375446', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '俞梅', NULL, '男', NULL, '1996-12-21', '汉', '湖北省恩施土家族苗族自治州', '湖北省恩施土家族苗族自治州来凤县清平路47号-8-3', '湖北省恩施土家族苗族自治州来凤县清平路47号-8-3', '身份证', '93e5dc1c09a4b1ad6b640c33755f2ea02fb13b3cfb204d4d2e8a829807cab6f7', NULL, NULL, NULL, NULL, NULL, NULL, '6bcd7787c33f8592b8f071d76ccc53d3', 'ved3p7rhd@163.net', NULL, NULL, '陶栋', 'b31cea5379afd7bb74ae76b911669226', '四川省成都市郫县龙岩街46号-3-7', '0049', '2022-07-04', '1543842934270394378', '1543899639134019623', 'C1', '1543837863788879917', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 50, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879922', 'data:image/jpg;base64,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', NULL, '15907313322', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '曹霞香', NULL, '男', NULL, '1994-02-23', '汉', '四川省甘孜藏族自治州', '四川省甘孜藏族自治州理塘县大麦岛87号-16-4', '四川省甘孜藏族自治州理塘县大麦岛87号-16-4', '身份证', 'fc4441eaca7d3f28d257d222b3dda45ba1a8b02e10952851c1dd87ea27012008', NULL, NULL, NULL, NULL, NULL, NULL, '0681f62e67f4adcb1601811c04e248fc', 'l6ij9fzrk@163.com', NULL, NULL, '皮昌成', '9c466de76d1d5bf5126223e4a22575b4', '四川省乐山市五通桥区正阳路140号-3-10', '0050', '2022-07-04', '1543842934270394378', '1543899639134019623', 'C1', '1543837863788879917', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 51, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879923', 'data:image/jpg;base64,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', NULL, '15907296854', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '沈新', NULL, '男', NULL, '1995-06-22', '汉', '吉林省白城市', '吉林省白城市通榆县莱芜一广场84号-11-10', '吉林省白城市通榆县莱芜一广场84号-11-10', '身份证', '7f9f31f4b434ba5fab70e9e35b6b3e688f49214aad8f6818362f9b4f6b02c87c', NULL, NULL, NULL, NULL, NULL, NULL, 'e03ed6ad36a93ab456f183027735711f', 'nidajpir@live.com', NULL, NULL, '尹力', '92253c42d0c92402f0c9ded29b8e304c', '四川省成都市武侯区风岗街25号-5-3', '0051', '2022-07-04', '1543842934270394378', '1543899639134019624', 'C1', '1543837863788879917', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 52, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879924', 'data:image/jpg;base64,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', NULL, '13007845940', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '薛林有', NULL, '女', NULL, '1993-05-13', '汉', '四川省甘孜藏族自治州', '四川省甘孜藏族自治州泸定县龙岩街52号-10-10', '四川省甘孜藏族自治州泸定县龙岩街52号-10-10', '身份证', '7aa5cbc555a2fb99c12ac9afb093960915e0a452128ac61ec74aa941e65431b3', NULL, NULL, NULL, NULL, NULL, NULL, '75141916aece5291dcdc5887bbe69ffc', 'c0ijuoj@sina.com', NULL, NULL, '苏岩中', '7bc8bd10c8ccd5fb7f6aec7675a039b6', '河北省石家庄市赞皇县云溪广场43号-1-6', '0052', '2022-07-04', '1543842934270394378', '1543899639134019624', 'C1', '1543837863788879917', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 53, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879925', 'data:image/jpg;base64,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', NULL, '13007856275', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '伏昭', NULL, '女', NULL, '1996-08-23', '汉', '四川省凉山彝族自治州', '四川省凉山彝族自治州越西县吴兴二大厦130号-19-4', '四川省凉山彝族自治州越西县吴兴二大厦130号-19-4', '身份证', '904f8c27d6fc6f316132f1f36d701ded71003a0eff95f5db08c606d45d7d7091', NULL, NULL, NULL, NULL, NULL, NULL, 'c4ec7c2c10213901f122d91070cf9ddd', '0c6rkj3px@msn.com', NULL, NULL, '范旭', 'ce6a28eccc0cf4d6aa80be264e4fe2eb', '四川省凉山彝族自治州布拖县清平路46号-1-2', '0053', '2022-07-04', '1543842934270394380', '1543899639134019625', 'B1', '1543837863788879877', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 54, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879926', 'data:image/jpg;base64,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', NULL, '13007883589', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '金超', NULL, '女', NULL, '1993-12-22', '汉', '江西省宜春市', '江西省宜春市吴兴大厦38号-15-7', '江西省宜春市吴兴大厦38号-15-7', '身份证', '52e8c04b84840844068846aa4f23ed5e71003a0eff95f5db08c606d45d7d7091', NULL, NULL, NULL, NULL, NULL, NULL, '65b47c5ce6b40f4968edb7a058fefd5f', 'fge6dq9@163.net', NULL, NULL, '喻云莲', '0f60966c886e7711efb4aa15365819f8', '四川省德阳市中江县长汀街97号-8-9', '0054', '2022-07-04', '1543842934270394380', '1543899639134019626', 'C1', '1543837863788879925', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 55, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879927', 'data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDvKKKK/IT6sKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCW3gNxOsQdELZ+ZzgDj1rYGgR/wBnmT7TH52fveZ+76+uKzdNwL1GM/kMvKts38+mK6wef9gP+kt5uf8AWfZznr/cr6PJcDQr0pyqxu9eq8vNa/K3mefjK04SSi7f16HMx6SzztGbu1GwjJ8zrn04q3e6CkUyrBdRIu3JE8mGz+A6Vat7e5jvppRdSguVyxtG+f8Awq9fvLG25bwwRhfm/wBHLj657V2UMrw31ebqQ1v3W13/AHu2/wCFzGeJqc6UZfn/AJHLwaXeXSF4Ig6BiuQwHP4mpP7Evg6K8Sxh22hmcEZ/DNT6NeTxX8dpHLmBnORtHPHX17VJr17cLfNbiUiJdrAAAYOPXrXlwwuBWD+sy5rp2aurX3+78TpdSt7X2ata1+o3/hGr3/nrB/30f8KbJ4dvI42cyQYUEnDH/CtLVlul0u2hgWZnGNxQEngd8VhSJqKRs0i3SoByWDAV0Y3DYPDTcFRk9L3vpt6dCKNStUXNzr7inRRRXzh6AUUUUAFFFFAD4Vdpo1i/1hYBecc54rq1tJ9o3S6lnHOJY/8AGuf0m3iuNQjWZ1VF+bBON2O1bFkLK8mvY4wo5xHlie3UfjX0eS00o3e8nZLmtsr7WfoefjJa6dPLuWfsk3/PXUv+/sdF7G0eh3Cs0zHHWZgW6j0qN9OuprCG3maENG3+sRyDt+mOtVWGlw3k9pI7MjJ/rGfOw+g/z7V7FV+zi048qkrXlK2rW1rdPuOSK5ne97O+i7fMzNG/5C9v/vH+Rq7rVncyajLOkLGJFDFiOOBzTbDWIdOt3hWIzHeSrfdyO1Mu9fubmJ4gkcaOCDgZOPrXhwngoYD2FSo3Jvmsls7Wtfb5nbJVnX54x0tbUP8AhIr7/pl/3zWlJdSXfhmWebG5uOBgfexVO107SZrWKSW88uQqNy+aowfoRT9UvLOHTFsLRw4yM7TkAZz1+tddGpiaVCpVxNZOLg7Lmvq9tDGcacpxjThZp66djAooor5U9QKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/9k=', NULL, '13007884900', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '伍慧巧', NULL, '女', NULL, '1995-09-07', '汉', '四川省阿坝藏族羌族自治州', '四川省阿坝藏族羌族自治州松潘县台西纬五路118号-11-7', '四川省阿坝藏族羌族自治州松潘县台西纬五路118号-11-7', '身份证', 'e8bfe31d1398599e41a92fcd304cf5f8d776ed7aa451dea7d28ad2b94b263640', NULL, NULL, NULL, NULL, NULL, NULL, '2ea341c1f3e9bcd50cb9d729e935654e', 'egias08v9@sina.com', NULL, NULL, '皮谦', '0f3ac549666b502d3d8a9476948f78d7', '四川省自贡市富顺县镇江街65号-16-2', '0055', '2022-07-04', '1543842934270394380', '1543899639134019627', 'C1', '1543837863788879925', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 56, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879928', 'data:image/jpg;base64,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', NULL, '13007918138', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '鲁有', NULL, '女', NULL, '1994-03-06', '汉', '贵州省遵义市', '贵州省遵义市湄潭县无棣三街57号-3-1', '贵州省遵义市湄潭县无棣三街57号-3-1', '身份证', 'c6edaeed2ec941fda98951b7953f90c749516f004c55efdfaa09d27b351e718a', NULL, NULL, NULL, NULL, NULL, NULL, 'a3742f204d019d8a2cfbf192735a0cf8', 'e2i2i9@0355.net', NULL, NULL, '舒泰盛', '9aa9e9d0b034831f3c5843a495faa742', '黑龙江省双鸭山市莱芜一广场133号-4-5', '0056', '2022-07-04', '1543842934270394380', '1543899639134019627', 'C1', '1543837863788879925', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 57, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879929', 'data:image/jpg;base64,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', NULL, '13007965121', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '廉茜秋', NULL, '女', NULL, '1996-02-21', '汉', '四川省宜宾市', '四川省宜宾市南溪县泰兴广场42号-19-3', '四川省宜宾市南溪县泰兴广场42号-19-3', '身份证', 'f975169cd116d7e8a32440c8947bd54b3ad560279d87ddd748dc3b31d815b8be', NULL, NULL, NULL, NULL, NULL, NULL, 'd7e3a260749627d6445f49081cb984ff', 'x1e1gdtcg@263.net', NULL, NULL, '朱彪博', 'cbce2ac16bfc2b0dba23a80515ccc1e8', '四川省遂宁市船山区道口路92号-10-4', '0057', '2022-07-04', '1543842934270394380', '1543899639134019627', 'C1', '1543837863788879925', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 58, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879930', 'data:image/jpg;base64,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', NULL, '13007968907', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '湛兰凤', NULL, '女', NULL, '1996-12-14', '汉', '四川省凉山彝族自治州', '四川省凉山彝族自治州会理县漳州街二街109号-13-6', '四川省凉山彝族自治州会理县漳州街二街109号-13-6', '身份证', 'fe2e8c4aaa699a16c21c8c24a7e75cb9610e26ec556a0f14ce64db0654911a63', NULL, NULL, NULL, NULL, NULL, NULL, '0e821a42c2249d27f745981af38ad153', '5xpphe@yeah.net', NULL, NULL, '贺朋斌', '217e4b745733debc4a978a87a5815d28', '四川省内江市东兴区宁国三大厦86号-15-5', '0058', '2022-07-04', '1543842934270394381', '1543899639134019628', 'B1', '1543837863788879877', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 59, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879931', 'data:image/jpg;base64,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', NULL, '13007972227', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '祁馨', NULL, '女', NULL, '1995-06-02', '汉', '四川省宜宾市', '四川省宜宾市长宁县闽江四街31号-9-1', '四川省宜宾市长宁县闽江四街31号-9-1', '身份证', '13c3743671cbad6024571806539e838d7d273fb9bcae486ba2a89966b50a3c09', NULL, NULL, NULL, NULL, NULL, NULL, 'ed22f72b7d600ba20f57cafb3ef555b4', 'f6n9hyo7@msn.com', NULL, NULL, '殷哲', '2e8838db312d6107f660cdcb4753dc23', '四川省成都市新津县嘉峪关路59号-15-4', '0059', '2022-07-04', '1543842934270394381', '1543899639134019629', 'C1', '1543837863788879930', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 60, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879932', 'data:image/jpg;base64,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', NULL, '13007987546', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '常广志', NULL, '女', NULL, '1995-12-25', '汉', '四川省阿坝藏族羌族自治州', '四川省阿坝藏族羌族自治州红原县平原广场16号-9-3', '四川省阿坝藏族羌族自治州红原县平原广场16号-9-3', '身份证', '7c88f1b6e2be8b3f38e32fec511e12c6a1a8b02e10952851c1dd87ea27012008', NULL, NULL, NULL, NULL, NULL, NULL, 'c3ffb5fa3928666cc17bccc804754e37', 'xpr8z2t@263.net', NULL, NULL, '董贵福', '2135859af2465cf5fc475d3303c77e90', '四川省遂宁市射洪县云南路30号-1-10', '0060', '2022-07-04', '1543842934270394381', '1543899639134019630', 'C1', '1543837863788879930', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 61, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879933', 'data:image/jpg;base64,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', NULL, '13008016601', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '倪友裕', NULL, '女', NULL, '1996-06-27', '汉', '四川省雅安市', '四川省雅安市芦山县龙泉路144号-4-5', '四川省雅安市芦山县龙泉路144号-4-5', '身份证', '35ce9d25d04b7f9dce00f7bfea4bbf2d10696dd8958e28583703c74d3a19aea9', NULL, NULL, NULL, NULL, NULL, NULL, 'f37b9a186f34e1b25da5d0247bfc3bba', 'isya7pv@126.com', NULL, NULL, '皮娥玲', '9bb41a2dbc0b81013217720e988eebee', '贵州省遵义市务川仡佬族苗族自治县团岛四街145号-14-9', '0061', '2022-07-04', '1543842934270394381', '1543899639134019630', 'C1', '1543837863788879930', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 62, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879934', 'data:image/jpg;base64,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', NULL, '13008056697', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '鲍楠榕', NULL, '女', NULL, '1996-06-10', '汉', '吉林省通化市', '吉林省通化市通化县江苏广场38号-14-10', '吉林省通化市通化县江苏广场38号-14-10', '身份证', 'd573c83a1042737f89ac6e6f653f1b26a1a8b02e10952851c1dd87ea27012008', NULL, NULL, NULL, NULL, NULL, NULL, '4e13f5e02ba2650d4f5cdc9376b2e255', '018nf7k14@msn.com', NULL, NULL, '云磊民', '0487047454648d633540e8894f60b985', '四川省甘孜藏族自治州康定县银川西路41号-11-7', '0062', '2022-07-04', '1543842934270394382', '1543899639134019631', 'B1', '1543837863788879877', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 63, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879935', 'data:image/jpg;base64,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', NULL, '13008080822', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '狄星', NULL, '女', NULL, '1995-02-26', '汉', '贵州省黔东南苗族侗族自治州', '贵州省黔东南苗族侗族自治州镇远县市场二大厦28号-10-9', '贵州省黔东南苗族侗族自治州镇远县市场二大厦28号-10-9', '身份证', '42896a659d6c6bbad711f3a878471ecda1a8b02e10952851c1dd87ea27012008', NULL, NULL, NULL, NULL, NULL, NULL, 'ba8cfb2d9a33a5b3a91297ce0fbcc836', 'dnv66ool@0355.net', NULL, NULL, '何信子', '8cd6398f893d93820b2155643deb8494', '四川省甘孜藏族自治州乡城县吴淞路39号-7-5', '0063', '2022-07-04', '1543842934270394382', '1543899639134019632', 'C1', '1543837863788879934', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 64, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879936', 'data:image/jpg;base64,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', NULL, '13008101333', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '云龙', NULL, '女', NULL, '1995-03-12', '汉', '河南省焦作市', '河南省焦作市中站区钜野广场117号-8-10', '河南省焦作市中站区钜野广场117号-8-10', '身份证', 'add53fb225b7b405b0b69ad8cb89ccfc506ad6c7369d15ce9b4ee1b03f96fa60', NULL, NULL, NULL, NULL, NULL, NULL, '87291445ddb5907a9bf7c9efb1326f6c', '036oyk@hotmail.com', NULL, NULL, '何霞香', 'da752c920827025e1259ba8b515248d2', '四川省成都市青白江区长春街15号-8-7', '0064', '2022-07-04', '1543842934270394382', '1543899639134019633', 'C1', '1543837863788879934', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 65, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879937', 'data:image/jpg;base64,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', NULL, '13008134985', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '苗云莲', NULL, '女', NULL, '1996-04-22', '汉', '四川省内江市', '四川省内江市大港三街110号-11-1', '四川省内江市大港三街110号-11-1', '身份证', '7a0cf89e424e367946e442f63512d3e2a3ef2a6abfcb6d4e904aa76a03a0583b', NULL, NULL, NULL, NULL, NULL, NULL, '8628107fa6758122a5957edaf329a595', 'xde49s@sohu.com', NULL, NULL, '袁庆', '777f1833c53e195e8efa1ef8c1a27ec6', '四川省攀枝花市东区吴兴大厦14号-16-9', '0065', '2022-07-04', '1543842934270394382', '1543899639134019633', 'C1', '1543837863788879934', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 66, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879938', 'data:image/jpg;base64,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', NULL, '13008193037', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '曹武新', NULL, '女', NULL, '1993-03-31', '汉', '宁夏回族自治区吴忠市', '宁夏回族自治区吴忠市同心县巢湖街61号-2-4', '宁夏回族自治区吴忠市同心县巢湖街61号-2-4', '身份证', 'a8533256d951a052c1cfbbec1bcf9d89c7b7a0587fda00379475b0ad6fbdca57', NULL, NULL, NULL, NULL, NULL, NULL, 'd704c57ddd415a38516374d1380d6a6a', 'dvxcz4kx@aol.com', NULL, NULL, '顾巧', '3cec7df880ea42e297b104bd9b7c80b2', '四川省宜宾市台东四路114号-15-4', '0066', '2022-07-04', '1543842934270394382', '1543899639134019633', 'C1', '1543837863788879934', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 67, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879939', 'data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCeiiivzs/RQooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAJrS2e8u4raNkV5WCKXOBk+pq/rug3Og3SRTMJEkXckijAPqPwP9Kr6bpV9qszR2EPmyRjcRvC4H4kV0esNr2q3Gn6LfwQW8rjKszBi5AILEjOOh4FdtKgp0ZNxd7qztp6djjq13CtFKStZ3V9fXuYOh6V/bWqJZed5O5WO/buxgZ6ZFM1rTf7I1aex83zfK2/Pt25yoPTJ9a7Tw54Q1DR9ZjvLia2aNVYERsxPIx3UUzxB4N1HVdcuL2Ca1WKXbgSMwPCgdlPpXU8tqfVb8j5+b8Lf5nIszp/Wrc65OX8b/5HK6Hov9sSyq8s0MaLnzI7ZpRn0+XpW4vgaFmCjU7nJOOdNkA/nVbS5NS0e61DRolQseZp41dvLAH3ht57+lbNndXmqllsL62maJ0aRYTcI23cM43tjoDV4ahQcFGcLy1739FrqTiq+IU3KE7R07W16vTQpTeAo4H2PqkxOM/JYO4/MEis3V/C402wa5iubi4KsAytZPGAPUseK7K8j1G51SWW2nt47fy0CieZsbstnARxjtnPtWN4iudS0rSJre6WGeK+OFkjkciPAHADEnnGetb4jCYeEJSULJX11+XU58Ni8ROcYud27aafPocHRRRXzx9CFFFFABRRRQBoaRqN3p98jWkxiMjKj4AORnpzXV+N47uTX7EWIl+0CAlTESGHJycjpXF2ez7db+Y4RPMXc56KM8mvSfEXi210rdDaLHPesuM9VQdsnv16V6+CcZYWpGrOyTX9JHkY1TjiqcqULtp/puznPBup39z4jhiuL65ljKOSkkrMOnoTUfi3VNQt/E95FBfXUUa7MIkzKB8inoDUPgf/AJGiH/cf+VReM/8AkbL3/tn/AOi1pOpP+z07u/P+hSpw/tFqytyfqa3g+3ubqZ72HXFju3YiS3kTzDIoxycsD36/rWr4UhvG1rVr25j+SVyiyBdqsVYjgfhXOeBZYYfEDPNMkaiB+XOM9D/LJ/CtiLW9Ah1O5gFwwsWjYkyIzo0xbJYDB7d8DpXVg501Tpzk7Wb67u2+pyY2nUdSpTir3S2WyvtoaX/CLS/899M/8FUf/wAVVTxtYT/8I5aeWqsloR5jKFRQMbchc8DPYVNo/wBnvIha6RqdkYokHnx/2cQJc8ZbLDP4VX1wJp3gy7tpkt7ee4mBSCE8AbweB9FzXTVjTeHm4xsmnrzXWn39fQ5aUqixMFKV2mtOWz1+7pr1PPKKKK+WPqgooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA/9k=', NULL, '13008210336', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '计霭', NULL, '女', NULL, '1994-07-20', '汉', '四川省成都市', '四川省成都市郫县春阳路78号-4-9', '四川省成都市郫县春阳路78号-4-9', '身份证', '0d0af00160f267c401ef748f9b9b007df4a98d1ed23e6df5e6c160223eb493f9', NULL, NULL, NULL, NULL, NULL, NULL, 'eb0851adc8928c6a30922243927da8ff', 'zkvryrde@yahoo.com.cn', NULL, NULL, '金先', '0fb0d2022416c343a6c19765a3e4bd23', '河北省承德市双滦区东海一大厦121号-7-10', '0067', '2022-07-04', '1543842934270394383', '1543899639134019634', 'B1', '1543837863788879877', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 68, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879940', 'data:image/jpg;base64,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', NULL, '13008233582', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '方贞', NULL, '女', NULL, '1992-12-29', '汉', '江苏省徐州市', '江苏省徐州市邳州市德盛街149号-9-10', '江苏省徐州市邳州市德盛街149号-9-10', '身份证', 'fec3b1870c482373bc1accdeace9fbbae8677c8f71353e5f1773aba2b55709fa', NULL, NULL, NULL, NULL, NULL, NULL, '066a6be3ea29699f5000602d57bf29cc', '03jsrhhiy@live.com', NULL, NULL, '孙秋', '389b91a8cf78c536ea2132fe3fae630f', '四川省阿坝藏族羌族自治州阿坝县澄海一路113号-13-1', '0068', '2022-07-04', '1543842934270394383', '1543899639134019635', 'C1', '1543837863788879939', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 69, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879941', 'data:image/jpg;base64,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', NULL, '13008260931', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '项斌', NULL, '女', NULL, '1995-08-23', '汉', '四川省德阳市', '四川省德阳市善化街78号-15-3', '四川省德阳市善化街78号-15-3', '身份证', 'b63e4d948a0dd114f95ebf377abf8ea886efb0d4901d56709928e53fc87347f7', NULL, NULL, NULL, NULL, NULL, NULL, 'd520a47835e9a4e3cbd6f2894a07e2c8', 'bvz07yx@live.com', NULL, NULL, '宋纯毓', '887f95b28949bcd05ec7312b93093a1a', '四川省凉山彝族自治州宁南县荷泽二街73号-9-1', '0069', '2022-07-04', '1543842934270394383', '1543899639134019636', 'C1', '1543837863788879939', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 70, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879942', 'data:image/jpg;base64,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', NULL, '13008260970', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '蓝波宁', NULL, '女', NULL, '1995-08-08', '汉', '贵州省黔南布依族苗族自治州', '贵州省黔南布依族苗族自治州长顺县顺城路82号-8-6', '贵州省黔南布依族苗族自治州长顺县顺城路82号-8-6', '身份证', '8feae1ad23915b439261f66a2c7481f9c4b1d415c457917e60613098e5b480bf', NULL, NULL, NULL, NULL, NULL, NULL, 'e8d98d2e24d808843f41987d5f1d9b7c', 'd77ozai@yahoo.com', NULL, NULL, '严昌成', '5df4bb4f85f672aadfa16223a2962233', '四川省阿坝藏族羌族自治州金川县宁夏路97号-20-5', '0070', '2022-07-04', '1543842934270394383', '1543899639134019636', 'C1', '1543837863788879939', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 71, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879943', 'data:image/jpg;base64,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', NULL, '13008301129', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '施学祥', NULL, '女', NULL, '1993-06-03', '汉', '四川省内江市', '四川省内江市漳州路一路119号-4-1', '四川省内江市漳州路一路119号-4-1', '身份证', '9695ff4d786d7349453c8599725135fb71003a0eff95f5db08c606d45d7d7091', NULL, NULL, NULL, NULL, NULL, NULL, 'e95115f3fc8d013c42b2f669ebc03382', 'gzpy5hu@0355.net', NULL, NULL, '穆柔', '6d8faa32bafff2d4e38ad1399d025475', '四川省甘孜藏族自治州新龙县丰盛街38号-15-3', '0071', '2022-07-04', '1543842934270394383', '1543899639134019636', 'C1', '1543837863788879939', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 72, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879944', 'data:image/jpg;base64,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', NULL, '15905695070', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '金钧冠', NULL, '女', NULL, '1996-03-13', '汉', '四川省阿坝藏族羌族自治州', '四川省阿坝藏族羌族自治州小金县沛县路54号-17-5', '四川省阿坝藏族羌族自治州小金县沛县路54号-17-5', '身份证', 'f24b2e708177aea5f11ca5ada58083578bc87c5df8350e8ddff6c5a35be1ed9a', NULL, NULL, NULL, NULL, NULL, NULL, 'a618744318ccd50eca3465ebb60db3bc', '03y2j8i@live.com', NULL, NULL, '汤茜秋', '5c323814e71902936b966ce255909f78', '江西省赣州市信丰县高田广场28号-14-6', '0072', '2022-07-04', '1543842934270394384', '1543899639134019637', 'B1', '1543837863788879877', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 73, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879945', 'data:image/jpg;base64,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', NULL, '13008301438', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '韩坚和', NULL, '女', NULL, '1994-05-23', '汉', '四川省眉山市', '四川省眉山市彭山县西陵峡三路65号-18-9', '四川省眉山市彭山县西陵峡三路65号-18-9', '身份证', 'f66f73f1095ecb50765d9b9f3db206fd8d41a4aa51f1f926de293f38d9dfaecb', NULL, NULL, NULL, NULL, NULL, NULL, 'd69c2841aa520a631840e43b5654e541', '1fasez5@aol.com', NULL, NULL, '昌辰', 'e17e2163c323cfe25f22f35e73a32683', '四川省攀枝花市东区宝山广场95号-20-2', '0073', '2022-07-04', '1543842934270394384', '1543899639134019638', 'C1', '1543837863788879944', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 74, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879946', 'data:image/jpg;base64,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', NULL, '15900456019', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '萧才发', NULL, '女', NULL, '1993-07-19', '汉', '四川省巴中市', '四川省巴中市平昌县临清路24号-6-7', '四川省巴中市平昌县临清路24号-6-7', '身份证', 'eeb6c02a5ccdf14b649aa858ea4dcebbd43e5e45dcc24fdb7afa79503bcbb614', NULL, NULL, NULL, NULL, NULL, NULL, '801a394cddb51fd53a6175c6d0477907', '6eqakmuhm@ask.com', NULL, NULL, '柳霭', '1c689822c5fa80cfad8a6aca3501a786', '四川省南充市顺庆区泰州街108号-12-8', '0074', '2022-07-04', '1543842934270394384', '1543899639134019639', 'C1', '1543837863788879944', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 75, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879947', 'data:image/jpg;base64,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', NULL, '13008306154', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '伏飞彬', NULL, '女', NULL, '1992-09-30', '汉', '河南省漯河市', '河南省漯河市源汇区朝城路144号-4-4', '河南省漯河市源汇区朝城路144号-4-4', '身份证', 'f81437e728a287cad433ceaf5393527015e0a452128ac61ec74aa941e65431b3', NULL, NULL, NULL, NULL, NULL, NULL, 'daed56fe360c4182f10eef68a06157ea', 'gounqcyyz@sohu.com', NULL, NULL, '纪敬震', '2d3176e4ee4c149dcd5e1e0e09fdd5d2', '重庆市石柱土家族自治县旅顺街13号-14-5', '0075', '2022-07-04', '1543842934270394384', '1543899639134019639', 'C1', '1543837863788879944', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 76, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879948', 'data:image/jpg;base64,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', NULL, '13008324192', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '贝君琴', NULL, '女', NULL, '1995-08-08', '汉', '四川省眉山市', '四川省眉山市东坡区安城街76号-10-9', '四川省眉山市东坡区安城街76号-10-9', '身份证', '2c93de581f22e104e2260886c6b27c2d94306372d1cd341544feddd7fae37125', NULL, NULL, NULL, NULL, NULL, NULL, '33eb647845ddf08b540260aa9ed794ee', 'zud1fqeo@0355.net', NULL, NULL, '尤星', 'c90e543cb7490fb94c31ec5c01ee357a', '山西省晋城市泽州县莱州路45号-11-1', '0076', '2022-07-04', '1543842934270394384', '1543899639134019639', 'C1', '1543837863788879944', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 77, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879949', 'data:image/jpg;base64,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', NULL, '13008339032', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '奚祥', NULL, '女', NULL, '1994-04-04', '汉', '安徽省六安市', '安徽省六安市舒城县山东路78号-18-2', '安徽省六安市舒城县山东路78号-18-2', '身份证', 'a9472ee5050ffd1d9cfd105f3af0fbbd3ad560279d87ddd748dc3b31d815b8be', NULL, NULL, NULL, NULL, NULL, NULL, 'fb6a6e1d69b8050bd0b1cd7b139cf1d0', 'elj0fw@hotmail.com', NULL, NULL, '蒋岩中', 'fdc18c582b87e7e45ffe7532ed4ae718', '宁夏回族自治区银川市瑞阳街143号-17-10', '0077', '2022-07-04', '1543842934270394385', '1543899639134019640', 'B1', '1543837863788879877', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 78, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879950', 'data:image/jpg;base64,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', NULL, '13706845429', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '常泰盛', NULL, '女', NULL, '1995-01-08', '汉', '四川省宜宾市', '四川省宜宾市屏山县山城广场110号-9-4', '四川省宜宾市屏山县山城广场110号-9-4', '身份证', '2b81f8a4f45547c6f3917ca9ed4a3d57d05d79b1b3ef348cbc6c893fd7a467bf', NULL, NULL, NULL, NULL, NULL, NULL, '1086503fc416e98cd6df36e0b62a70e1', '6e318jj@qq.com', NULL, NULL, '康行时', '98ceaae0c91d719870f579a363bb683e', '四川省南充市高坪区刘家峡路142号-20-7', '0078', '2022-07-04', '1543842934270394385', '1543899639134019641', 'C1', '1543837863788879949', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 79, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879951', 'data:image/jpg;base64,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', NULL, '13008434949', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '祝超', NULL, '女', NULL, '1995-06-17', '汉', '四川省绵阳市', '四川省绵阳市安县保定街58号-8-8', '四川省绵阳市安县保定街58号-8-8', '身份证', 'd74d1f6826bc23d985397776fe46966170776f2fccccaecfae6b50137fa5b8a0', NULL, NULL, NULL, NULL, NULL, NULL, '380d10ac1184ce83b114e90906f2dcbe', '0r8r3b@hotmail.com', NULL, NULL, '成河哲', '4f461fc4e8618a0b0cdbf43cc665ba08', '四川省成都市金牛区浙江路50号-8-10', '0079', '2022-07-04', '1543842934270394385', '1543899639134019642', 'C1', '1543837863788879949', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 80, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879952', 'data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDKooorrMAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKALFpY3d+7JZ2s9w6jJWGMuQPXiuo0n4f3uo6Pc3tw9xZzRFgltJandJhQRjJB5Jx0PSsPQ9fvfD9zJcWPl75E2N5i7hjOf6V6fo/iXVZfB11q+oW2XUuYWQKi7QowSGYZ+bP17VEm1sVFI830/wpq95qFvbTadfW0crhWme1fCA9znH86ua/4I1HSL9LeziutRjaIOZYbVsA5I28Z54B6966PRfFviq/ibUntIZtLt3P2loggYKo3NgMwycGodV+JN9cXe7QoGFskW6QTwgsDk5PBOBjFK8rhZWOU8P6H/aniWDSbzzrcuXDjbh1KqTjB+lJqmgz2/iG80zT4bi7+zt0SMu23jkgD3rvfAHiW71W7urOW0Ulme5luFbABJAwFx/Wrc2v6jd+PYNItbUQi3LCWZ/m3xHaxIGBj7oAPPWlzO47Kxy2p+AnsvDVrewJfT6hKE8y2SLftJGTkAZGOn1rl5dC1eCJ5ZtKvo40GWd7dwFHqSRXsY1S71TxHfabYXccEdlGm9jD5m5znI6jGOB9c15xqfjvW7y3urCdrcwyBo22xYJHT1pxcmDSOUooorQgKKKKACiiigDpPBWi2Otay0d/NshgjMxj6eYAeQT2HrXcfECC4vfD+nWulRSSxyyqVjt1JDIFyOB26e1eSq7JnaxXIIODjI9K9K1/xLHY+H9An0u/tpLu32b40kDYHl4IZQc47VnJPmTKT0NfwhoE+meEr6y1dRAty0jOA4yiFApJPQdDVOHW9MhZtA8IWNvPPIjbpJOI2wOck8ue3PHvVfw14zttU06/svEV8qSTlgpYbF8tlwVBA4xz19al0iPwV4YuJNQt9YM8oQqA8gcgH0CqOaizu7lehN4Fih0a2Nrcx+XqV3ePDKmR8uxN+OOwB/8AHqbdeKtRfx2dLsbCGV4w0ALsQOSGLEgcAADj61zPhPUJNS+JEN05YLNNPKEJ4Xcjf0AH4Vrv4l07w74p8QyS2jyXzt+5lByDwMKfQZ5J/wAKbWok9DrNF1q/vdXv9O1C0ggltVRswy7wd2fyrm/FHiDWh4XaS5022S0vgYleOYsygjIJ4xyPetrw/pEWg/btZvdWFx9tVZXlkQRhRyfU+v6Vw1n4us/+ERvtG1CCWcu7fZ9uPlBORknphue/WklroNvTU42iiitzMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/2Q==', NULL, '13008464826', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '花栋', NULL, '女', NULL, '1996-08-25', '汉', '四川省绵阳市', '四川省绵阳市盐亭县临清路71号-6-5', '四川省绵阳市盐亭县临清路71号-6-5', '身份证', '3d7daf692200f254ae56740324145d709d1fa5d186863db2900a177e7b75e375', NULL, NULL, NULL, NULL, NULL, NULL, '634b86c1cef6568e99fda3ef0169ac05', 'oov4n7v@yahoo.com', NULL, NULL, '费莺', 'bc8d6dc4170cf567aea25680900d92b2', '江西省上饶市云门一街18号-9-10', '0080', '2022-07-04', '1543842934270394385', '1543899639134019642', 'C1', '1543837863788879949', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 81, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879953', 'data:image/jpg;base64,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', NULL, '13008468578', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '熊生龙', NULL, '女', NULL, '1993-11-30', '汉', '山东省淄博市', '山东省淄博市周村区城武大厦26号-1-1', '山东省淄博市周村区城武大厦26号-1-1', '身份证', '3e853fceff9a7cd1170dba36c1416e67249c6a0298a73989b59216b6e7602b79', NULL, NULL, NULL, NULL, NULL, NULL, 'e983e335506c4fd4c5a6422413bffe05', 'n5bpau@163.net', NULL, NULL, '成佳嘉', '4bebfdd5c95ffbfefebed7988508742d', '四川省宜宾市筠连县普集支路19号-2-5', '0081', '2022-07-04', '1543842934270394385', '1543899639134019642', 'C1', '1543837863788879949', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 82, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879954', 'data:image/jpg;base64,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', NULL, '15605144380', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '尹建家', NULL, '女', NULL, '1996-01-14', '汉', '四川省泸州市', '四川省泸州市古蔺县吴兴大厦38号-14-4', '四川省泸州市古蔺县吴兴大厦38号-14-4', '身份证', 'd2bae0fd02e9ba1ae51afb05242f0320a9d2a4cfc2aee23aa417b49482332829', NULL, NULL, NULL, NULL, NULL, NULL, '902f313ad188e8b40e9b1dc4aadad169', 'v7e7a8w@googlemail.com', NULL, NULL, '窦菁梦', 'da47a37725cc1c4d4c835df2f7738998', '四川省广元市利州区钜野广场19号-18-1', '0082', '2022-07-04', '1543842934270394386', '1543899639134019643', 'B1', '1543837863788879877', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 83, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879955', 'data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDvKKKK/IT6sKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCezt/td3HBv2bzjdjOK1X0ewgkMc+ogOOq4ANUdH/AOQtb/739DXTPJdjUAqz2og3D5CTvxivo8owdCth3UqQvLmt1fTtzI8/FVpwqcsXZWv/AFozDg0aC8uZ1trv91GFIYrnOc/T0p9xoCwWks63gk8tScBOv61p3Eoh/tEwwzPO5C/KhIztGOR6ZqjpRa2tJra6sborIc8RE5GMYrqlgcHGaoyguZ83vJysnd20u/67mSrVmudS0VtNLvuc/U1rB9puo4A4UucAmt3Rbi0gur750gjLKEWRsHAz60jeJyGIFoCAevmf/WrzKWX4SFOFXEVrXb0Sb2dt076+iOmVeq5OMIfj3MrUtObTpUQyBw65yBj8KpV0P/CUH/n0H/fz/wCtU1/qMN5oMh8yNZXA/dbwSPmFaVcDgK3tJ4atsm+Wz6dLtkxrV4cqqQ3dr3OYooorwTuCiiigAooooAv6MC2r24HqT+hrppbeU3JlS0s2OciRyQ3/AKDXPaA8MepBpXCnaQmehJrQthYfbDqT3yhizMIyRx1HTr0r6zJ5xhhVG61k3ulZJJX1T+48vFpuq32XZ6lmCS6e5volliSdSGEYGRnaOcntx6U+0u7uOymudQCoF+6oXB4/xNV4G0/z5NWe5ILMQFPGO2MdTSteWGtxG3eR4mDZUE4z/Q/SvRp1uVXVRc75uVc2krvRv79upzyhfTl00u7bdzOsdeNnC6G3DlnLk78dfwq2nife6r9kxk4/1n/1q5+ZUSZ1jfegJAbGM+9bthpumSQQXElyQ+AzI0igZH4Zrw8BjcxqS9hSqJKPfl29banbXo4eK55R39TS1TVP7N8r9z5nmZ/ixjGPb3rLl8S+bC8f2TG9SufM6Z/Co/EV5DcywpC6v5YOWU5HOP8ACsWtM1znEwxU6dGp7non0V9bd7k4bCU3TUpx1+YUUUV80eiFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH//Z', NULL, '13008514695', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '殷宁', NULL, '女', NULL, '1996-07-28', '汉', '贵州省黔东南苗族侗族自治州', '贵州省黔东南苗族侗族自治州锦屏县宁国一支广场116号-15-5', '贵州省黔东南苗族侗族自治州锦屏县宁国一支广场116号-15-5', '身份证', '7eac1787d80ba4fb796b2a1c5b22fc5e33e331e2ff1b9c451e65196db90d5d9e', NULL, NULL, NULL, NULL, NULL, NULL, 'a59309de78e76ef249702debdbcb6d9e', 'gf43ui@googlemail.com', NULL, NULL, '和冠', '82003c46a77c9518b1efc0cdce26b803', '山东省青岛市李沧区西藏二街57号-14-9', '0083', '2022-07-04', '1543842934270394386', '1543899639134019644', 'C1', '1543837863788879954', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 84, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879956', 'data:image/jpg;base64,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', NULL, '13008538256', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '谈飞彬', NULL, '女', NULL, '1994-08-09', '汉', '四川省遂宁市', '四川省遂宁市大英县海口街115号-9-5', '四川省遂宁市大英县海口街115号-9-5', '身份证', '6337d063ddf30f5b6bb3fde15da236d042e874388506c7a31df8972bcebd56d5', NULL, NULL, NULL, NULL, NULL, NULL, '666357efd42b6b085fceba980c7195c5', '05abgpf@sina.com', NULL, NULL, '顾珠', '61c33653a15be27ddcc0736a5a02f817', '四川省甘孜藏族自治州六码头149号-17-1', '0084', '2022-07-04', '1543842934270394386', '1543899639134019645', 'C1', '1543837863788879954', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 85, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879957', 'data:image/jpg;base64,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', NULL, '13008603524', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '贝育', NULL, '女', NULL, '1995-04-12', '汉', '四川省成都市', '四川省成都市金牛区盐城街101号-14-5', '四川省成都市金牛区盐城街101号-14-5', '身份证', '3d53c331cbc7e72942a9de50974ec5eaba6c83bfca3b5d297c72611f62749b84', NULL, NULL, NULL, NULL, NULL, NULL, 'bc2482ec20b089e9927c7e3f2b44a97f', 'atg3odr@qq.com', NULL, NULL, '鲍菲寒', '4360670c518a18dab5e0f948c15ee1c3', '河北省邯郸市临漳县太平角一街61号-3-7', '0085', '2022-07-04', '1543842934270394386', '1543899639134019645', 'C1', '1543837863788879954', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 86, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); +INSERT INTO `SYS_USER` VALUES ('1543837863788879958', 'data:image/jpg;base64,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', NULL, '13008612125', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '孙达安', NULL, '女', NULL, '1996-01-04', '汉', '江西省萍乡市', '江西省萍乡市安源区漳州街79号-5-6', '江西省萍乡市安源区漳州街79号-5-6', '身份证', 'f18b7b38401c9ea9c34679a63d131567a1a8b02e10952851c1dd87ea27012008', NULL, NULL, NULL, NULL, NULL, NULL, '24bce07a464675f0b9e08915901dca02', 'f8ohfcq@sina.com', NULL, NULL, '时良海', '6c77c1234bb9555cbe5adacdb88f974a', '江西省抚州市宜黄县新昌街122号-1-8', '0086', '2022-07-04', '1543842934270394386', '1543899639134019645', 'C1', '1543837863788879954', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', 99, NULL, 'NOT_DELETE', '2022-07-18 19:41:58', '-1', NULL, NULL); + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/snowy-web-app/src/main/resources/_sql/snowy_oracle.sql b/snowy-web-app/src/main/resources/_sql/snowy_oracle.sql new file mode 100644 index 00000000..c1605029 --- /dev/null +++ b/snowy-web-app/src/main/resources/_sql/snowy_oracle.sql @@ -0,0 +1,1791 @@ +/* + Navicat Premium Data Transfer + + Source Server : 本地oracle + Source Server Type : Oracle + Source Server Version : 110200 + Source Host : localhost:1521 + Source Schema : SNOWY + + Target Server Type : Oracle + Target Server Version : 110200 + File Encoding : 65001 + + Date: 27/09/2022 20:03:20 +*/ + + +-- ---------------------------- +-- Table structure for AUTH_THIRD_USER +-- ---------------------------- +DROP TABLE "SNOWY"."AUTH_THIRD_USER"; +CREATE TABLE "SNOWY"."AUTH_THIRD_USER" ( + "ID" NVARCHAR2(20) NOT NULL, + "THIRD_ID" NVARCHAR2(255), + "USER_ID" NVARCHAR2(20), + "AVATAR" NCLOB, + "NAME" NVARCHAR2(255), + "NICKNAME" NVARCHAR2(255), + "GENDER" NVARCHAR2(255), + "CATEGORY" NVARCHAR2(255), + "EXT_JSON" NCLOB, + "DELETE_FLAG" NVARCHAR2(255), + "CREATE_TIME" DATE, + "CREATE_USER" NVARCHAR2(20), + "UPDATE_TIME" DATE, + "UPDATE_USER" NVARCHAR2(20) +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SNOWY"."AUTH_THIRD_USER"."THIRD_ID" IS '三方用户id'; +COMMENT ON COLUMN "SNOWY"."AUTH_THIRD_USER"."USER_ID" IS '系统用户id'; +COMMENT ON COLUMN "SNOWY"."AUTH_THIRD_USER"."AVATAR" IS '头像'; +COMMENT ON COLUMN "SNOWY"."AUTH_THIRD_USER"."NAME" IS '姓名'; +COMMENT ON COLUMN "SNOWY"."AUTH_THIRD_USER"."NICKNAME" IS '昵称'; +COMMENT ON COLUMN "SNOWY"."AUTH_THIRD_USER"."GENDER" IS '性别'; +COMMENT ON COLUMN "SNOWY"."AUTH_THIRD_USER"."CATEGORY" IS '分类'; +COMMENT ON COLUMN "SNOWY"."AUTH_THIRD_USER"."EXT_JSON" IS '扩展信息'; +COMMENT ON COLUMN "SNOWY"."AUTH_THIRD_USER"."DELETE_FLAG" IS '删除标志'; +COMMENT ON COLUMN "SNOWY"."AUTH_THIRD_USER"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SNOWY"."AUTH_THIRD_USER"."CREATE_USER" IS '创建用户'; +COMMENT ON COLUMN "SNOWY"."AUTH_THIRD_USER"."UPDATE_TIME" IS '修改时间'; +COMMENT ON COLUMN "SNOWY"."AUTH_THIRD_USER"."UPDATE_USER" IS '修改用户'; +COMMENT ON TABLE "SNOWY"."AUTH_THIRD_USER" IS '三方用户'; + +-- ---------------------------- +-- Records of AUTH_THIRD_USER +-- ---------------------------- + +-- ---------------------------- +-- Table structure for CLIENT_RELATION +-- ---------------------------- +DROP TABLE "SNOWY"."CLIENT_RELATION"; +CREATE TABLE "SNOWY"."CLIENT_RELATION" ( + "ID" NVARCHAR2(20) NOT NULL, + "OBJECT_ID" NCLOB, + "TARGET_ID" NCLOB, + "CATEGORY" NVARCHAR2(255), + "EXT_JSON" NCLOB +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SNOWY"."CLIENT_RELATION"."OBJECT_ID" IS '对象ID'; +COMMENT ON COLUMN "SNOWY"."CLIENT_RELATION"."TARGET_ID" IS '目标ID'; +COMMENT ON COLUMN "SNOWY"."CLIENT_RELATION"."CATEGORY" IS '分类'; +COMMENT ON COLUMN "SNOWY"."CLIENT_RELATION"."EXT_JSON" IS '扩展信息'; +COMMENT ON TABLE "SNOWY"."CLIENT_RELATION" IS '关系'; + +-- ---------------------------- +-- Records of CLIENT_RELATION +-- ---------------------------- + +-- ---------------------------- +-- Table structure for CLIENT_USER +-- ---------------------------- +DROP TABLE "SNOWY"."CLIENT_USER"; +CREATE TABLE "SNOWY"."CLIENT_USER" ( + "ID" NVARCHAR2(20) NOT NULL, + "AVATAR" NCLOB, + "SIGNATURE" NCLOB, + "ACCOUNT" NVARCHAR2(255), + "PASSWORD" NVARCHAR2(255), + "NAME" NVARCHAR2(255), + "NICKNAME" NVARCHAR2(255), + "GENDER" NVARCHAR2(255), + "AGE" NVARCHAR2(255), + "BIRTHDAY" NVARCHAR2(255), + "NATION" NVARCHAR2(255), + "NATIVE_PLACE" NVARCHAR2(255), + "HOME_ADDRESS" NCLOB, + "MAILING_ADDRESS" NCLOB, + "ID_CARD_TYPE" NVARCHAR2(255), + "ID_CARD_NUMBER" NVARCHAR2(255), + "CULTURE_LEVEL" NVARCHAR2(255), + "POLITICAL_OUTLOOK" NVARCHAR2(255), + "COLLEGE" NVARCHAR2(255), + "EDUCATION" NVARCHAR2(255), + "EDU_LENGTH" NVARCHAR2(255), + "DEGREE" NVARCHAR2(255), + "PHONE" NVARCHAR2(255), + "EMAIL" NVARCHAR2(255), + "HOME_TEL" NVARCHAR2(255), + "OFFICE_TEL" NVARCHAR2(255), + "EMERGENCY_CONTACT" NVARCHAR2(255), + "EMERGENCY_PHONE" NVARCHAR2(255), + "EMERGENCY_ADDRESS" NCLOB, + "LAST_LOGIN_IP" NVARCHAR2(255), + "LAST_LOGIN_ADDRESS" NVARCHAR2(255), + "LAST_LOGIN_TIME" DATE, + "LAST_LOGIN_DEVICE" NCLOB, + "LATEST_LOGIN_IP" NVARCHAR2(255), + "LATEST_LOGIN_ADDRESS" NVARCHAR2(255), + "LATEST_LOGIN_TIME" DATE, + "LATEST_LOGIN_DEVICE" NCLOB, + "USER_STATUS" NVARCHAR2(255), + "SORT_CODE" NUMBER(11,0), + "EXT_JSON" NCLOB, + "DELETE_FLAG" NVARCHAR2(255), + "CREATE_TIME" DATE, + "CREATE_USER" NVARCHAR2(20), + "UPDATE_TIME" DATE, + "UPDATE_USER" NVARCHAR2(20) +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."AVATAR" IS '头像'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."SIGNATURE" IS '签名'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."ACCOUNT" IS '账号'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."PASSWORD" IS '密码'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."NAME" IS '姓名'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."NICKNAME" IS '昵称'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."GENDER" IS '性别'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."AGE" IS '年龄'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."BIRTHDAY" IS '出生日期'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."NATION" IS '民族'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."NATIVE_PLACE" IS '籍贯'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."HOME_ADDRESS" IS '家庭住址'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."MAILING_ADDRESS" IS '通信地址'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."ID_CARD_TYPE" IS '证件类型'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."ID_CARD_NUMBER" IS '证件号码'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."CULTURE_LEVEL" IS '文化程度'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."POLITICAL_OUTLOOK" IS '政治面貌'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."COLLEGE" IS '毕业院校'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."EDUCATION" IS '学历'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."EDU_LENGTH" IS '学制'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."DEGREE" IS '学位'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."PHONE" IS '手机'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."EMAIL" IS '邮箱'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."HOME_TEL" IS '家庭电话'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."OFFICE_TEL" IS '办公电话'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."EMERGENCY_CONTACT" IS '紧急联系人'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."EMERGENCY_PHONE" IS '紧急联系人电话'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."EMERGENCY_ADDRESS" IS '紧急联系人地址'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."LAST_LOGIN_IP" IS '上次登录ip'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."LAST_LOGIN_ADDRESS" IS '上次登录地点'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."LAST_LOGIN_TIME" IS '上次登录时间'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."LAST_LOGIN_DEVICE" IS '上次登录设备'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."LATEST_LOGIN_IP" IS '最新登录ip'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."LATEST_LOGIN_ADDRESS" IS '最新登录地点'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."LATEST_LOGIN_TIME" IS '最新登录时间'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."LATEST_LOGIN_DEVICE" IS '最新登录设备'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."USER_STATUS" IS '用户状态'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."SORT_CODE" IS '排序码'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."EXT_JSON" IS '扩展信息'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."DELETE_FLAG" IS '删除标志'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."CREATE_USER" IS '创建用户'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."UPDATE_TIME" IS '修改时间'; +COMMENT ON COLUMN "SNOWY"."CLIENT_USER"."UPDATE_USER" IS '修改用户'; +COMMENT ON TABLE "SNOWY"."CLIENT_USER" IS 'C端用户'; + +-- ---------------------------- +-- Records of CLIENT_USER +-- ---------------------------- + +-- ---------------------------- +-- Table structure for DEV_CONFIG +-- ---------------------------- +DROP TABLE "SNOWY"."DEV_CONFIG"; +CREATE TABLE "SNOWY"."DEV_CONFIG" ( + "ID" NVARCHAR2(20) NOT NULL, + "CONFIG_KEY" NVARCHAR2(255), + "CONFIG_VALUE" NCLOB, + "CATEGORY" NVARCHAR2(255), + "REMARK" NVARCHAR2(255), + "SORT_CODE" NUMBER(11,0), + "EXT_JSON" NCLOB, + "DELETE_FLAG" NVARCHAR2(255), + "CREATE_TIME" DATE, + "CREATE_USER" NVARCHAR2(20), + "UPDATE_TIME" DATE, + "UPDATE_USER" NVARCHAR2(20) +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SNOWY"."DEV_CONFIG"."CONFIG_KEY" IS '配置键'; +COMMENT ON COLUMN "SNOWY"."DEV_CONFIG"."CONFIG_VALUE" IS '配置值'; +COMMENT ON COLUMN "SNOWY"."DEV_CONFIG"."CATEGORY" IS '分类'; +COMMENT ON COLUMN "SNOWY"."DEV_CONFIG"."REMARK" IS '备注'; +COMMENT ON COLUMN "SNOWY"."DEV_CONFIG"."SORT_CODE" IS '排序码'; +COMMENT ON COLUMN "SNOWY"."DEV_CONFIG"."EXT_JSON" IS '扩展信息'; +COMMENT ON COLUMN "SNOWY"."DEV_CONFIG"."DELETE_FLAG" IS '删除标志'; +COMMENT ON COLUMN "SNOWY"."DEV_CONFIG"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SNOWY"."DEV_CONFIG"."CREATE_USER" IS '创建用户'; +COMMENT ON COLUMN "SNOWY"."DEV_CONFIG"."UPDATE_TIME" IS '修改时间'; +COMMENT ON COLUMN "SNOWY"."DEV_CONFIG"."UPDATE_USER" IS '修改用户'; +COMMENT ON TABLE "SNOWY"."DEV_CONFIG" IS '配置'; + +-- ---------------------------- +-- Records of DEV_CONFIG +-- ---------------------------- +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967455', 'SNOWY_SYS_LOGO', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARsAAAEsCAYAAADzUhc0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAACAASURBVHic7Z17nBXVle9/+5x+A81LREFBXoqOSgYljhpREBEUNRklAgIaRZgxicb5mHsn1zAz+ThOMnO9icYZZ0BARMJDfAYQUF6Ngg8QRVRQXoKAIPKmn+ex7h/FCdB096lzalXt2rvW9/PJ5xPpPlW76+z9q7XXWnstQBAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEIWA2HCB6bRuR7nEI3lm9l2j1XvkuuYjpHoBtxGLAnUuAT/bLJDWZq18n6vMacLBO90jsQcSGmUQaKI4Bdy0FvqkUwTGR2hTRyj26R2EfIjbMJNNAGsD6A8DZ04FRS0VwTOKxD4mKJ534b6X0jcU2CnQPwDaSBKROkpcXNukbi5AbEzcQjV1x6r+J1vAhlg0zyTSQrmfLPP2pWDcm8POVp/63CA0vIjbM1KVPtWwAZxK3ek4EJ6xsOEjUdSZRberUf1dKtlGciNgwkyagIVk5VAd8eUgEJ4zctRTYekT3KOxHxIaZquTplk2G82cDQxYQVSVEdMJAMk00ehnR2u90jyQaiNgwU99fU595O4AHVwUzFqFp/tf7wLQvm/4d2UXxIWKjgUkbdY9A+N1HRL//RPcoooWIDTPVSXe/VzqZaN522U7pYNHXRP/4QfbfIwLiYtqwIWLDTG3a3e9VJ4H7KoAPvhXBCZI1+4hGL3P/+xKN4kPERiN7q4GRS3WPIloMW+w8dzfEFFAgYsOGiA0zdansv3MyXx4Gbn+TKJESC8dPapJEtywk2pxDiDumgAJZIWzIo2Qm4XIbdTIvb5MIld888A4wd7vuUUQbERtm6vIQGwD478+BaV+KdeMLE4imfJH7x2LK+Z/Ag4gNM40l9LnhZ+8Ab34tgsPJS1vzf54KskA4kWfJTDJPywYAjiSA0cuBtftEcDio2H36Ke5ckLNRvEiJCWbqH+bLlT1VQO9XgMO1RC2LZarnS6+XiK6d6+0aCpJBzIlYNiFl7NtOxTjd4zCRQ7VE6/Z7v44IDS8iNsxUucwgzsbsLcDJFeMEdzy0kqjVVL7ridrzIWLDjBcHcUPM3iLWTS489SnftQhi3XAiYsMMt9jcXwEs3y2C44ZJG3ifkwgNLyI2zNR4dBDX50gCuG4ucMkcEZzGeH8vUZupRGM8RJ4agiB5NpyI2DDjJfTdFOsPAEfrRHAaYvhS4EAt/3UVxGfDiYgNM36JDQD8dKVTXc6/O5jH7koiP0t6imHDh4gNM/mcjXLLtC+BgmeBZz4TwQGcnlwdpvt3/bgcV2BFxIaZfM9G5cLD7/p/DxOQnlxmIWLDjJ+WTYbaFNDpT0QbD0bTwpn6BZGaEMzfLpYNH3JcgZkgxAYAdhwDRuZQcc4WFu8kum1RMI7bmJKyoJyIZcOMnw7i+qzZF70jDSOXAZVMWdrZkBITvIjYMMN1XMEtxZOA8avtF5zvqomueJVoT1Vw94wpWSCcyLNkJqlh2T/+EX/2bJioThLdWwG8/22w97X2gWpCfDbMHEsEf880AWNWAKu/Jepzpn1lKUon67mvgtSz4UQsG2aCchA3xLAlwJbDdlk4T39q198TZcSyYSZIB3F9thwBRlkUoXppK5G0urEHsWyY4T71nSur9gI/fcd8a2D9fqI73uI/2JorsoviQ8SGmTCs8v/6DHjsQ3MFZ1cl0YgQWDQiNLyI2DCj27LJMH4NUDbZPMG5czFRx+nOKfcwIA5iPkRsmAnT8q5KAh99F6YRZWf2Ft0jOIEk9PEiYsNMWCybDMOXAF8dNUNwfvuRGeMU8kPEhhmvrVy42XgIOG8GMPStcC/kZpOJfvWB7lGcjhg3fIjYMBM2yybDnK26R9A47+4lCuq8U67IVooPERtm6kJm2ZzME+vCZ91sPkx0VwgiTw2hlFg2nIjYMFOrMakvG4+8B7R6LjyCM/gNou6zAD/LenqhKAYUyAphQx4lMzqPK7jhUB3w6QH9glObIlrwte5RZEe2UXyI2DCT1r6Ms3PxHGDgfKLKhB7ReWIdkQndPuOyjWJFzkZFlDd3An/3dvD3nb6JaLRF57cE94hlE2F0FAy/f4UZ1p/Aj4hNxCmeRPTaNv+3U9uPEvWcTVQd0hB3Y8g2ig8Rm4hTmwLurfD/PsOXOAmGJiHOYV5EbAQcqAX6z/XHutl0mGjEEqJVe/24ur+I2PAiYiMA8O9087LdwIzN/lzbb0RreBGxEQA4CWx+oLNyIQdSYoIPERsBAFAc9+e6R+r8ua5gHiI2AgCg0KeZUB3is2LZIMhWihMRGwGAf2eAwlZyI1dkG8WHiA0jdQa3wvXLstHRR4uLuAIKRGzYELFhxORQqV8TwWTLpkB6fbMiYsNIQcxco9uvbdRRgy2bM0uBZoXmfqdhQ8RGAODfGzyslQvdUF6kewR2IWIjAHD8E36gu8mcF1oU6h6BXYjYCAD8sWzqUkSHDc6zObtM9wjsQsRGAOCP2KTJ7AxisWx4EbERAPgT+q5Jme8gFvjIOsW+rTI3d0TQSyJtdujbryMcUSWr2Nz6GrBXBMd6/DiImSIgafDMaSZFc7Oyr9q9NmSdYh/sB9q/APw45B0VBW/4EY2qSgKVhm6j4kq2UdkYOJ+o8wz3v+/6ffZiiDsqCuGkLmXuNqowBjQTB3GTvLkzNyd6Tsbzox+IdWMrfmQQJ8nc4uZFMdlGNUVGC3L5fnOaYo9/BMQnEk3aIKJjG34cOKxKhrtDaFO0KAJaSgbxaUzfRFTwLNHjHzn/nYvlmvP7LEXAz1bm+ikh7PiT1GfucYWSuESjGuLv3j41dyqXAEBWsWnIhqlJAWe9QLT6W7FwbMGPbVRl0tykvpZFQHPx2fyFrUecVjz1S4bk8v3mvSvdUwUMW5Lvp4Ww4Uc0ylTnMOA4iKWWjcP+GqKbFjTciicXayPr+6ypA/ZbjgC7KsW6sQERm1MpjgNxg0uGcHL3MuD9bxv+GavYZJOSjtOB2xYRVSdFdEzGr22UqfhVudA0fvU+0bwdjf/ct2hUY7z+FTBOQ5P6sJFKmyu4Ytmcil8lN0ziD58Q/fbjpn+HVWzcXmval8BjH5q72DgwNacEcKIv3Jh8CNOvPlqmsHgn0cPv8l6T9ZH+0xrg6U+jKzgm/+F+bKOqDd5GRZk1+4hGLuO/LmuOJAF45D3OK5qFyZaNXyUmTCUeUctm6xGiG99wos3csD/S2hTQfhrRe3ujZ+GYfMK51Idt1CGDq/RFMex9LEHUdSaw6bA/1/dFv/dWA8OXAJ8diJ7gmIofGcQJQxP6gOi1cEmmiR54x997+GYsbjsavaS/lMGLyw+fjcliEzV+vdoJ8viJrzvT9QeAIQuIqhLRsHDqDF5cfvhsqgx2EEfJspmxieh3WULcHPh+iH7eDmDMCsdMM7mJmxtMVlQ/vhhTz0UB0cmzWbyT6LZFwdwrEJ/7jM1AwbNB3EkvJm8b/HiTm5xnEwWx6TmbaMD84DK9Aw3wPbne7u2UyT4bcRCfit02OPBtNVFDByv9JFCx+eV7wNQv7BUck/8wP8TG5OMKNqfZVCaIxlQEf99ACx8m0sA9y4EV3xD1Pdu+d4fJb3I/8kqM3kZZqjbjVxM1m6Ln3loe6cilwCf77bNwTK1KB/izbTBZfG312Ty2Vt+9tYjNjmPApS8BvV+2S3BkcZ2KyaFv20qCLt1FVD5F73rTaiyu/Q44WmeP4Jh8FsiPF7nJeUe2HVcYtQw4onlbq31nem8FkEjZITgmN6L3YxtVZ7D4mnyotj7bjhDtqtQ9ihCIzZytQOEk3aPg4YJWStWNAX7dW/dIcsePbZSpll5pAfD/rtQ9Cu/UJIluW0TUZabukThoF5sM//6xHdZNUVypf+2jVNsS3SPJDT9C3yZaB93LgZdvAGzIdv/5SqeKZlgIjdj8nw+AiRY1v1s4GOjVVvco3OPLcQXDvs1bOgOLhwA3dTJfaADg2Y26R3AqoRGbFAFjVwCtp9ohOH3OVGrdHUrVjtE9Enf40n7XEAdxlxbAvEHA3EFKndfCfKGZuZmo6Nng1lHSZe3t0IhNhoO1TllC3ePgojiu1KS+QJti3SNpmtBNhAB562ZgSGfzRSbD378dbCTQ7XY5lHPs8leAXi/ZIzhjLlTqwD1KDT5X90gaJ0olFQCgQxnw6kAA45Tq3tIOodl2vGtl0BUS3S7UUIoNAKzbDxyutUdwAOC1G4GHLtY9ioaxY7m5Z8kQ4Edd7PmrD9QQDVvScNdKv3G7SgM9G5Uro5c74buSAjsmRXHc+TsmfE4Utj5btqbnN8TDlwAXtrZjTmW4e3njXSv9xu2WLbtlozFt+/WvgJLJwD+8a5eFM+4ipbaPAAZ01D2SE9iWMdsQV7UHME6pP1xll9A8+gHR3O367u82nyq026iT+f0nukfAT+cWSr0yEPj7i3SPxMF2n83YC4H5g3WPgp8n1xM9/pHeMbiNOmYXm5BkgRZPIpq52S4Lp7xIqf++RqlFNwHdyvWOpciyg4cZep8BYJxSE/sq1brYLoumfArRL1bpHoXh0aiGqE05Ib1FX9slOABw47mO4OjExm3U6POBBRZaMwDw8XdEug9W5ooxYgM4Tc/uXq57FP7QvaVSY3rqu79t26g/XAlM66dU+zK7rBkA2H6UaHiI2iS5zRQ3SmwApy3oxS8SbT9qn4Uz6VqlME6PlWNLNGpoV+CbkcDDl9onMoBT0rPzDGCDhhB3Y7jt6W6c2ADApwftboB347lKXdk+2HvaIDYlcWDODUqd3cxOoQGAh9/VPYLT4XMQh5R39zoqr3scfrFwMDCqh+5RmEPXcuCVgbpH4S/jVxNN3KB7FKfjdhsV6qS+bDSbAjzwNtEz19j3Jmt5PHLy+ldEY1c4/dP9xFSfTWEMqLzXKe2h2cfuKwXPEumsH9wUVuXZNMUznzuKr3scfnHbeUq9dTPQp52/9zFRrs9pBrx0gyM0usfiJxW7icJ8gt7t6ssuNkUeRxIAj621ux/VpW2VWv23Sj12uT91ZwD+6/rZ310BeORSYOdIpW47z26hufhFomvn6h5F01gbjWqMB94BXt1mr+AAwPjLlJo1AGhnQBVAvzpNdCgD5twAPHGl3SIDAPuqiT49qHsU2XH7XRvtszmZqqRTPN127uym1Jp9RJe/wntd7pXrV5W+N28GLm5jv9BUJYhGLNU9CndYH41qiIO1TrP0rUfstnAub6dUYgzwq+/xXZN7+brNvXBD+1Jg6nUAxikVBaEZv5qobArw2le6R+IOt/3BrLFsMmw8BNzxFvBNJZHN+RaFx52ibZ8n2l+jezSnw1kpbsFgoHc7e7/L+oQ16tQYbjvBWmXZZFj7HXD2dKcWju6x+M3+u5XaeZdTrNsL3N0EOHpGPX01gHFKRUVoluwiavWceXPW+Ep9HDy4Cki5LMZsMuc0V+rlG7z5XT4/yPucNh/x9vlL2gA/vzgaIgM4BytHL3PO/5lGJH029Zm4AXh0te5RBENRXKnn+wHleXbl7D/PSSDkGMvkjUQ/WZ7/50d0d8p2RolhS4AwdK3Mh1qXVmz2N8f/EPmW3BEQMQWkx0bnLTlwPtGbO/P//N5RQD6npd/bS/TQqvzLU/ZsBWy8MzrfE+Bs9YcuBnRW2vPKH68GHnRhhVpt2WRIE/DyVvu3UxleHejU2c2XAfOBVXtye15/XE806I38heaH5zktVaLGz1aaLTSAe/9cJMQGAO6rAJbuiobgNCt06uxOuCa/z68/AAxZ6D4re28V0YOr8vc3FMSAOQOAc5tHy6oBgEkh61qZD26T+iIjNofqHL/El4eiITiAU1h907D8CqsfqAXuWQ70n0u0sRHn8b9/TNRsMlH7F/Ib36BzgU3DgOT9ShVafr6pPrMC7lrpJ24PYlqXZ5ONoYuBXZVEHS3OwTmZHi2VOpYgevQD4KlPc//80t3A4AWn//vWI0RdZ+Y/rsKYs90rtaRNTy4s3kl0x1vBdq0MA5GxbDKs2w90nA78cJEdbxU3NC9U6qmrnQqAnZrn/vltRwFMIBqxxLFy4hPzF5p+HYDPhgKJ+5WKotB8fYxowHwzQ9yN4TYaFTnLJsNrXwF1KSLbyxOczI3nKrXxIFHPF/P7/IzNwIKv3WeM1iemgHmDHJ9Sflcwm4O1REMW6h4FP9XiIM7O/35f9wiCp2drpe7zUFj9YG1+n2tXAszoH12hAYBRS4GVe3SPgh+JRrngD+sBNSE626kMk48XVn/9xmDuN/ZCYN/dSg3rHl2h+c0aonk7dI/CH9xuoyItNoBzrsO25nduue08fwurty4GJvYFJvaNrsgAwDOfEf3Lh7pH4R9uv93Iiw0APP+l7hHo490fOlYOd3eFUT2Ag/coNfbCaAtN+RSiB95xf1jRRCJTg5gDt+1DbebFAUCXFjzXevIq4IX+0RaZDKZ1rcwH8dkIOXF7V6Wevhoo8jgjzigBfnGJCE2UqJUMYvfkG8q1hUSKqHSyE5b1mmj2XQ0w6A37qyUKJ6hJAkTZv28RG7hvRWEjXx0luv0t3jKeC78GBs7nu54QbuRsVA4QolFkqyH6zQX+7MOp481HgCfWRfOZRg0pnpUDybTd0YL6bDhINHA+ESYQbTvq330eeQ/ABKLeL4vo2AxJ6Ns9UfPZXDcX8FJcK1fWfgdM3ySCYyvV1e7WkIgNgLjyr9NkmLjiVcea8btveEOMXApggjiObaQq4S6LWMQGTgZknLm7QNiYtIEo3yp6nFw/z+kioHscAh+JtLsgi4iN5eypIrqvgmjMCt0jcdh2FPjRIuDJ9SI4tpAkwI2PWMQGjionLYxGPbGO6KwXgMkhKz15JAH8YhXQ5xWidfvte+5Cw4jYwFFlm6b818eIfvwW0SPv6R5J06zeB9z4BjBni01PP3okUrKNco0toe+aJNFv1hCd+yfgxa26R+OOPVVOqdYhC4i2H7VPdGJWewIdEil3meeRrdRnI3e8BZhaM2XeDuALC7OOY8r+g75JSOjbNWkyf0K8us384kybDju1X3SPg5MIGDZIpkVsXJMic7dR/eY6uTM/elP3SHh44B0AE4iuft0u0bGZmqSzlcqGiA0cq8bEqT19E9Gy3bpH4Q8r9wAvRaiLqckk04CbkjYiNoby85VEI5fqHoW/DF8CjF9ttuBEwUEMuNsuitjAmRCmTIpnPiNq+zzR03k0nPPC432cwuVBkkgDj60FLpxNVLHbTNEpjMgKE5+NS+LKfdFmnYxe5tSz3V8T7H2/1xZ4tLdSE/sq9cergr03AGw4BNyy0EzncRQWGBGQchH6jsKzyEoqxNGoRIrodx8RlU0mmhZwYfZu5QDGKfXxHSek+MFLlNp/d/BWzpGE4zy+5nWiTwzKOi6IwAojuMuzicCjcEdYp++wJcA/fgBUMVbSc8Od3YBlQxr+WdsSx8ppWxLsmADg7T1A/3nOwdLg7547JljMHLh5WYvY4Hg0SvcgGmDedqKXtwV/32d+AMweoFSnFk0vlYWDgT7tghrVCb6rAcasAHZVhl9wwmox60AyiBG+PJvNh4m6zwKC7AtdXgj8shfwSC+gtMDd+7jPmSd+r/204OvkdJwOYALRrpFAx2bhtCG4+3GFFTfrRywbOFuosLwj52wh6vvn4O/7kwuA8Zcp5VZo6vPiAKAkzj0qd/zgdWBWSLuaRkJsFHDURX8sERs49Th0z9T1+51M4KGLgd1Vwd8/7nEmdG8JtCrmGUuubDvq+LYwgShsJ8ij4CBGIfDpgey/FoVH4QqdU3TqF0Q3vKHv/oD3v78wBpRqsmxOZuhi4L6K8AhOJCwbSDTKNTqdePtriO5Z7pRa0EmSQWyKQyA2gFMsLCwWTlTERmoQuySmIanvmc+IWk8lavt8sPdtDLe9fxqjJA6UhSjcMHQxgAlEPWfrFZ1IbKPgHMbMRkQeRdMoBFsKYHelkwl8sDbAm2bBq9iElY2HgJ8sJ9qhqTBXRAwbV4jYIFirZukuojC2pvWqNXGlLxqVjee+APrNC8/WKqqI2OD42Q6fp+GOo060qf884NOD/t4rH7z6rYriSp1ZyjMWP9hyxNladZ0ZbMQqKuomoW+XEPydFPO2E103z8cbMMBx6j2sls3JbD0uOrsDyj4uiMg+qkYcxO5IpP2JSG083lN7yEJnkocZjjVRGiIHcTY6HM8+HrvCX9EJS4TOb9yc3ROxwXHLhnnKzdlCNGB+sD21vcAhts0LvV8jaCZuAF72sSKgKXWSvCLFszRxpI7oziXAzkrdI3EPh9g0M8iyORk/EwGjUjxLOmJqoN3zROXPmXfa100GaDZaazqu4JU0He8aOoFoTAUR52nyqFg2x8RB7A6OqbWvmuj+CqJ9AVfR44JDHIssmE2TNgLXh9yZH0bqxEHsDq95NgPnE7WbBjwbsp7auZBgsGzKi7xfIwxsPAQMfoPHuolKNOpYEiBq+pmJ2OB4BrGHSbFqL9tQtMGRZxSGg5hccJ1pispxBTcvq4g8Cn+xIbzJ8RpvZmA0ym+i4iB2c9wlIo+iaby23y224Cly+GxaFtlzFojrCItJuUd+Y8Ey4cHLWrPBVObYNsSU9yJcYYHrYGpUfDbSN8olKY9lQaNiKmejJG7Ps6hLA6m0dyexDS8iN7hphxSRR9E0XrdRNiwwjjf5GSVAc0u2DccSPE5z0/Kt8kIBlVXZc7UsWCbe8XoQ0+8T40HA8TcUx+3ZRiXSPE7ziOyiXJ0vtGRqeMfLxLLBQcyRZ1MUsyOxLwOHUNgQqXQDxbJvGS2aGvnjtVKfDftyDsumMGZGmQk3pJlqHNkwN9yQSmXPIo7Io2iamPJ2hsUGnw3Hwoore97kKSaxsWFuuCGRyv68IvIomsarg9iGXIoEQ/SltABoZcmRhRoXb2o32JRV3RR1aXEQB4INfgqOfucFMaVs2TYk097b2wDRsWxSBKS8iE22g1W24HWh2eCnKIrxOERNLKDVENVMlo0t28ps1CSzBxmaFJs0IRKxuzTC0+tbJyznoyzYUgLOfODIkYlEng0cS9CTzyZNkdAaANGpgt8YXIJri2UD8MyJqM+rk2labBCNh+W1lYsNpjKXj6KFRWLDQVR8NoBEo1zj5a1eZIHYcHWYsMVBzBX6tiF44JZsR14i9Cgax+uksuFkb4ohGgXYczYqRTznxWwR32wkXFjGEXkUTRP3mNRng2XD5Z9rF+KumLlQl+IpAh+VbRRBMohdoTyKjS1wPAKucpq6SUOOK3DT5KOwZN5kxWuY05YFxlGdzoZsasB7VnkGSak4QdNJfUGNQjNek/pscQJyLIwyS8TGa4QyQ2Qsm0Lg6yxNGaPyKHzFhn05kbuuhtmwRWzS4LFsbLF6s6KAfdVN/4oFy8Q7aXiLPNjQVSBJPDVt2pV4v0YYSJO7Lo/ZiIxlA+BolucVoUfROF59NjYUz0q7OEjnBhusPMB5Hhyhb1u22G6o9RKNiopzy2uhJBsyiN3kSbjBhmeRoTLp/Ro2HNJ1S7bnJQ7i40Tpb20MjpeLTYtLHMS8ZD/1HQHSHlu52ABXBrFNYsNBVPzDgMfjClERm5jy5muwIbfEaxZ1BhuyqTPY0DUjSA7XNf1zMfLgvQaxLU5AjrewDefEMmRzeLohSpnp3hzEnCMJMV77RtniFOX4vm2JRgE8lfpseh7ZqPYiNuVFSv3gTFivOuQx7GtDdbpEmifUa4vwAtkXjxtK4tHx2xysavrnWXV32a3AY32AcgsS15rCyzrjOFOkG66zQPGYDU/DQUpMuISAPm2B313V9K9lfScXxk9Mnt9+RPQf64CDtd7HFya8JrTZkJKeIp48G5vgyKgujjsvI1ujnb3PANbertRqAL2y/G5Ouvurv1Zq0U3AgI75Dy6MeC1/aoMTMMVk2dgElw/LgunRIL/sBSwZ4v73czbyvn+mUgtvAtpbUiQpg5eFZoMTkGsbZRMc26i4smObXZ9ebYH/+zdKtS52/9fl5dosOL4vT6WJOkwH9mY57Rl2vG4hygqcSWVyXgZXb2ubqGI4rsAhWGHijcHATZ2UWpfHZz29k+MxpVbeBtzZzctV9ON1P10Ys2MrJVpzKhxlQZWyI/eoIAY8dLEjNHlfw+sgurc8cfNRS4le2OT1isHj1cy1QWyUssPRzUk1g2VTHHOSPmsYwug6UAC+HQ20K1XqKY/XYvU2vNBfqZnXc14xGGKw4+3jFVsjJvnC1drG1BfRRa2BVwY6QsNxPXbX5vDuSo3paZ4H3svjjCnz/t76cFXqE07FVLFRABbfDPyoC59725c4yqRrlaJxSu0ZZc6D9pJnUxQzfwvCVSzKJrhauZiyBgBg7IXANyMBGqdUh2a8cTRfg7ZnlSn15xudMFmYIXh7q8ct8HckJfR9Ghxiw1U4PQh6tgIm9lXqbGaRyeD7qZ4hnU8M/PJXiNbs8/uOueM1x6S0ACiMA2CoWauLNGMGcUHMDiuJw0EcMyAa1bMVsPFOpTb6fJ9A09GWDQHG9w7yju4geHOOxpUdtTq4HMRhX1xu4Tiu4LV8iZ8oAGN6AhW3BHO/QM8rtyhyrJyrXydauSfIOzeNV1OXq/CUTgh826iCGABDQ70nw5VBHNYt9osDgKHdlJoU0P20FEdYeZsjOmv2EV3+io4RnIrXHkE2pKMTU1lQwB7LhqPEREEsXGU3upYD/3EFcEdXpYYGfG+t1v/l7ZR64m+AVkU6R8ET9jVdcDj7nZdYUN8H4ElniCFcc+PtWx2h0XFv7a6GR3opteJWvWPw6rOJwZ7SoByUhuhN7gWObWUsJNuoLi2AmdcDHX2KNLkhFEvk0rZKYZxSn/8YuL1L8Pf3OiGK4ua3neUM0bbUbKlyUZMCapLe3Oa6fTZdyx2R2TZCqeHd9dpYoVoiF7V2HkanPxHtOBbcfRW8bSEKPHZnCAPsDmILSKS9C7DOFJvh3YF/6wN0KQ/HRi6U02LH67/KJAAACKFJREFUXY6l0608uHt6WWhxySA+BVu2UccS3p+JjmkxojuwZRgw83qlwiI0QEjFJkPFLcB9PYO5l9d1ZkiSaKMQ+LZRNvTRAni+06BLTHRqDsy4XqluLcMjMhlCLTbnNFdq8rVKzRng7328biEUzLdsAD7BtKkrptclG1OO5RsEd3YDlgeUoJcPoRabDEO7OduqeYOAS9rwX99rlbqCmB1vcy69tEVs6tLee0cVxvyPVP64K4BxSs0eoFTXEG2b6mOE2GQY0lmpilv4nbHksdd3XEno+2RsybNJMjiIY/Avu7xDGTDlWuDFG8IrMCdj3BJpU6JU4n6lDtzNt8C9bqMKYkqZ3qiOGE9921IMvy7t/eR3YVwp7uhchzJgwjXA7lFK3dvTDKEBDBSbDG1KlFo8BLjmLJ7reV1nNoR7uXw2zQ0X3gwpBsvGDypuBcZdZI7IZDB6ifQ9W6kFNwG/ucz7tbxOKhvybLhOfTezpHtqGt6KqnHToQyY2BfoEcJIkxuMfwc1L3QefHWS6L8+Ax55L7/reI0mGfnt14OjWBQQroOHXkilmbpienwRdShztky7AYz1PhxtGP4+PkFpgVKP9FJq0Ln5fd70EhEcSFLf6XDYEF622Ld2Bt662fsYwoA1YpNh3iDgyauAM0py+5zXOSU+mxPYso0CeJzm+QYy2pcCfx6k1F+1MXPbVB/jt1H1yXTrBIAJnxP984fAnqrsn/PqszE9GgXwWTa2HMRMpIFahpo2ueZgPXkV8NOLnEiW97uHBwvex40z7iKl3rnVXcdOr3tz0x3EAF/dFRuyqQHnBcThs8nleQzpBPziEqVsExrAQsumPpmOnduPEv16NdBYx86oR6MAPpFoUeg4iTmsAp0k0jzV+txsxT6+HfjeGUrN83670GK92GTo3MIRnR6ziDYdPv3nXsO+IYqQ5g1XTklZgSO+posNV5JjU8GHVkXAP1/mCA3P3cKLBe/j3Fg2xKkoX/+b9ZzUZ8FU4cqzKS2w43kopq4ZTYlNxa3Aw5faLzRAhCybDOc0P/HFPrSS6D8/43mjm16pD+DZMgBA80I7onNp4nkm9YMHAzo6Rcd7t1Oq1zjv1zcFC6ZE/jx1tVJzBzn/32skxoaDmGyV+pQ9J785HMQnC2/bEmD+YEdovF/ZLCx4H3vjpk7Ol35rytsmwobcEq4M4pI40LoY2FnJcz2dVDF0xUymHWvv4N1OOLv4bu/XNJHIi02GYo+hRhu2DVx5NkVxeywbjmdy9VlOPWAbw9m5IGLDhA3bKC4KLSkmBvBYe/dcEG2RySBLRPgLXKHvgphStohvjeHh+zBhyZTQjw1Zs5x/gy3bKFkgfMizZMIGseHEBoc5YEeyZlgQsWGiuQWLi7MqXZtivmvppDKhewT2IGLDhA0FozjFxpb6QKYfuQgTIjZM2CA2XtuWnEyu9YTCSiVDno3gIGIj/AVOy8aG+j4AX+6RIGIjnATnwrIhzyaugB4tdY/CHkRsmLihI/DSDbpH4Y0ko2XTwnCH+a6RQGqsWX2Zwo6IDROFcaXu6KrUvRfoHkn+cB3EBMz1YZ1R4rRL6dhMRIYbC4zdcDHlOmeS3ldBNGUjXxHxIOCsQWNa6Lu0wDkoWVKglMntUsKMWDY+MflapV4cAHQv1z0SPZjks7niTGDRTY7Q6B6LzRg0JcxjaDeldhwl6jRD90jcwRl4MeVsVEwBC28CWheL0PiNIVPCXDq1UArjlNoxQvdIssOZZxN2n8095ztO4PRYpURogkHEJiA6tVBq5vXh3lZxRqPCLDZnlQFT+yklTuBgEbEJkOHdlVp2i/NWDSOcSX1hPfU96FxgiSXtbE1DfDYBc+7xguu7KonGrwamfKF7RCdIMTptwtYV86r2TqfJ75+p1ELdg4koIjaayJjwszYTDVuiezR288ilwL9cDjQvlG2TTmQbpZlh3R0H8pwBukcCxBlnQ2kItlE/uQDYOwp44kqlRGj0I2ITEoZ2U0q3L4dzG1WkWWym9QOeu06p9mUiMmFBxCZETO2n1KzrgS4t9NyfM8+mIKZvkd/SGRh9vohM2BCfTcgY1t1ZJDM2Ef3TGmDzkeDubXo5hb5nAytuVWqu7oEIDSKWTUgZ0UOpJUOCvaepYlMcBx79a2DBYN0jEZpCxCbEdD6efbxtODCqh//3qzVQbMb0BGrHKPX495VqJk7gUCPbKAPoUu4soi4ziLYd9e8+3hoQB8+s609sO4XwI5aNQSy/xV8LhzOD2G9u7yJCYxpi2RhE5xYnFtfoZUTTvuS9vgm9r9b+LdC7nVIv6x6IkDNi2RjKtH5KTe+vexTBURIHxvd2hEb3WIT8ELExmJE9lArCcayb3mc4NWce6yNCYzKyjTKcF/o7C3DbEaIuM71dKxGyaFSXFsC/fd85LX+d7sEInhHLxhK6lCs1oz/Q1UO9nLA5iJcMcYRG9zgEHkRsLGJED6W2Dldq6nX5HXngtmzyacHbr4PjBMY4pbqWi9DYhIiNhdxzgZN9nKs/h7OVC5B7t4ayAicLWJzAdiI+G0vJWAWd/kS045i7z3CLTTwG16c7v9cW+P2V0uHAZsSysZwddzlHHqb1y/67dczbqGIXs6tLC+DlG4CP71Cqf0cRGpsRsYkIo89Xali3YO+ZzWdzZzcnK/r2riIyUUDEJkLMGuBYOcO7N/xz7gzi1o10xRx4DvDZUGD2AKVOzooW7EbEJoLMvN6JWHVq7u99Gmrn8tjlwOs3An/VRkQmaojYRJR7LlBq+S2n/ht3mk1hvdl1xZnA+MuUKhUncCSRaFSEyUSsNh8m6j4LqEzwXj/TO+r8lsCXw5R6n/fygmGIZSOge0ul/ucHwNllQG2Kr6pNgXJKQQRdcVAQhJBzsJYowSg27+4lSqZNK8klCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIKgj/8Pjmxw3AMtgFIAAAAASUVORK5CYII=', 'SYS_BASE', '系统LOGO', '1', NULL, 'NOT_DELETE', TO_DATE('2022-08-18 01:03:52', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967456', 'SNOWY_SYS_NAME', 'Snowy', 'SYS_BASE', '系统名称', '2', NULL, 'NOT_DELETE', TO_DATE('2022-08-18 01:09:44', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967457', 'SNOWY_SYS_VERSION', 'V2.0.0', 'SYS_BASE', '系统版本', '3', NULL, 'NOT_DELETE', TO_DATE('2022-08-18 01:10:45', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967458', 'SNOWY_SYS_COPYRIGHT', 'Snowy ©2022 Created by 小诺开源技术', 'SYS_BASE', '系统版权', '4', NULL, 'NOT_DELETE', TO_DATE('2022-08-18 01:11:28', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967459', 'SNOWY_SYS_COPYRIGHT_URL', 'https://www.xiaonuo.vip', 'SYS_BASE', '系统版权链接地址', '5', NULL, 'NOT_DELETE', TO_DATE('2022-08-18 01:12:15', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967462', 'SNOWY_SYS_DEFAULT_CAPTCHA_OPEN', 'false', 'SYS_BASE', '登录验证码开关', '8', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:13:56', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967463', 'SNOWY_SYS_DEFAULT_FILE_ENGINE', 'LOCAL', 'SYS_BASE', '默认文件存储引擎', '9', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:13:56', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967464', 'SNOWY_SYS_DEFAULT_PASSWORD', '123456', 'SYS_BASE', '默认用户密码', '10', NULL, 'NOT_DELETE', TO_DATE('2022-07-05 18:53:48', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967465', 'SNOWY_SYS_DEFAULT_DESCRRIPTION', 'Snowy是一款国内首例国产密码算法加密框架,采用Vue3.0+AntDesignVue3.0+SpringBoot2.8前后分离技术打造,技术框架与密码的结合,让前后分离‘密’不可分!', 'SYS_BASE', '系统描述', '11', NULL, 'NOT_DELETE', TO_DATE('2022-08-18 01:15:49', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967466', 'SNOWY_SYS_DEFAULT_WORKBENCH_DATA', '{"shortcut":[{"id":"1548901111999770526","title":"系统首页","icon":"home-outlined","path":"/index"},{"id":"1548901111999770527","title":"个人中心","icon":"appstore-outlined","path":"/usercenter"}]}', 'SYS_BASE', '系统默认工作台数据', '12', NULL, 'NOT_DELETE', TO_DATE('2022-08-18 01:15:49', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967558', 'SNOWY_THIRD_GITEE_CLIENT_ID', 'GiteeClientId', 'THIRD_GITEE', 'GiteeClientId', '13', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:13:56', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967559', 'SNOWY_THIRD_GITEE_CLIENT_SECRET', 'GiteeClientSecret', 'THIRD_GITEE', 'GiteeClientSecret', '14', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:13:56', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967560', 'SNOWY_THIRD_GITEE_REDIRECT_URL', 'http://localhost:81/callback?platform=gitee', 'THIRD_GITEE', 'Gitee重定向地址', '15', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:13:56', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967561', 'SNOWY_THIRD_WECHAT_CLIENT_ID', 'WechatClientId', 'THIRD_WECHAT', 'WechatClientId', '16', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:13:56', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967562', 'SNOWY_THIRD_WECHAT_CLIENT_SECRET', 'WechatClientSecret', 'THIRD_WECHAT', 'WechatClientSecret', '17', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:13:56', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967563', 'SNOWY_THIRD_WECHAT_REDIRECT_URL', 'Wechat重定向地址', 'THIRD_WECHAT', 'Wechat重定向地址', '18', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:13:56', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967564', 'SNOWY_FILE_LOCAL_FOLDER_FOR_WINDOWS', 'D:/defaultUploadFolder', 'FILE_LOCAL', '本地文件Windows存储位置', '19', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:13:56', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967565', 'SNOWY_FILE_LOCAL_FOLDER_FOR_UNIX', '/defaultUploadFolder', 'FILE_LOCAL', '本地文件Linux存储位置', '20', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:14:23', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967566', 'SNOWY_FILE_TENCENT_SECRET_ID', '腾讯云文件SecretId', 'FILE_TENCENT', '腾讯云文件SecretId', '21', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:15:39', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967567', 'SNOWY_FILE_TENCENT_SECRET_KEY', '腾讯云文件SecretKey', 'FILE_TENCENT', '腾讯云文件SecretKey', '22', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:16:23', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967568', 'SNOWY_FILE_TENCENT_REGION_ID', '腾讯云文件RegionId', 'FILE_TENCENT', '腾讯云文件RegionId', '23', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967569', 'SNOWY_FILE_TENCENT_DEFAULT_BUCKET_NAME', 'defaultbucket', 'FILE_TENCENT', '腾讯云文件默认存储桶', '24', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967570', 'SNOWY_FILE_ALIYUN_ACCESS_KEY_ID', '阿里云文件AccessKeyId', 'FILE_ALIYUN', '阿里云文件AccessKeyId', '25', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:18:31', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967571', 'SNOWY_FILE_ALIYUN_ACCESS_KEY_SECRET', '阿里云文件AccessKeySecret', 'FILE_ALIYUN', '阿里云文件AccessKeySecret', '26', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:18:45', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967572', 'SNOWY_FILE_ALIYUN_END_POINT', '阿里云文件EndPoint', 'FILE_ALIYUN', '阿里云文件EndPoint', '27', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:19:05', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967573', 'SNOWY_FILE_ALIYUN_DEFAULT_BUCKET_NAME', 'defaultbucket', 'FILE_ALIYUN', '阿里云文件默认存储桶', '28', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:19:05', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967574', 'SNOWY_FILE_MINIO_ACCESS_KEY', 'MINIO文件AccessKey', 'FILE_MINIO', 'MINIO文件AccessKey', '29', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:20:11', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967575', 'SNOWY_FILE_MINIO_SECRET_KEY', 'MINIO文件SecetKey', 'FILE_MINIO', 'MINIO文件SecetKey', '30', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:20:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967576', 'SNOWY_FILE_MINIO_END_POINT', 'MINIO文件EndPoint', 'FILE_MINIO', 'MINIO文件EndPoint', '31', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:20:41', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967577', 'SNOWY_FILE_MINIO_DEFAULT_BUCKET_NAME', 'defaultbucket', 'FILE_MINIO', 'MINIO文件默认存储桶', '32', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:20:41', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967578', 'SNOWY_EMAIL_LOCAL_FROM', '本地邮件发件账号', 'EMAIL_LOCAL', '本地邮件发件账号', '33', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:39:06', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967579', 'SNOWY_EMAIL_LOCAL_PASSWORD', '本地邮件发件密码', 'EMAIL_LOCAL', '本地邮件发件密码', '34', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:40:02', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967580', 'SNOWY_EMAIL_TENCENT_SECRET_ID', '腾讯云邮件SecretId', 'EMAIL_TENCENT', '腾讯云邮件SecretId', '35', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:40:48', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967581', 'SNOWY_EMAIL_TENCENT_SECRET_KEY', '腾讯云邮件SecretKey', 'EMAIL_TENCENT', '腾讯云邮件SecretKey', '36', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:40:56', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967582', 'SNOWY_EMAIL_TENCENT_REGION_ID', '腾讯云邮件RegionId', 'EMAIL_TENCENT', '腾讯云邮件RegionId', '37', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:41:15', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967583', 'SNOWY_EMAIL_ALIYUN_ACCESS_KEY_ID', '阿里云邮件AccessKeyId', 'EMAIL_ALIYUN', '阿里云邮件AccessKeyId', '38', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:41:53', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967584', 'SNOWY_EMAIL_ALIYUN_ACCESS_KEY_SECRET', '阿里云邮件AccessKeySecret', 'EMAIL_ALIYUN', '阿里云邮件AccessKeySecret', '39', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:42:06', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967585', 'SNOWY_EMAIL_ALIYUN_REGION_ID', '阿里云邮件RegionId', 'EMAIL_ALIYUN', '阿里云邮件RegionId', '40', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:42:36', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967586', 'SNOWY_SMS_TENCENT_SECRET_ID', '腾讯云短信SecretId', 'SMS_TENCENT', '腾讯云短信SecretId', '41', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:43:15', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967587', 'SNOWY_SMS_TENCENT_SECRET_KEY', '腾讯云短信SecretKey', 'SMS_TENCENT', '腾讯云短信SecretKey', '42', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:43:31', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967588', 'SNOWY_SMS_TENCENT_REGION_ID', '腾讯云短信RegionId', 'SMS_TENCENT', '腾讯云短信RegionId', '43', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:43:44', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967589', 'SNOWY_SMS_TENCENT_DEFAULT_SDK_APP_ID', '腾讯云短信默认SdkAppId', 'SMS_TENCENT', '腾讯云短信默认SdkAppId', '44', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:43:44', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967590', 'SNOWY_SMS_TENCENT_DEFAULT_SIGN_NAME', '腾讯云短信默认签名', 'SMS_TENCENT', '腾讯云短信默认签名', '45', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:43:44', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967591', 'SNOWY_SMS_ALIYUN_ACCESS_KEY_ID', '阿里云短信AccessKeyId', 'SMS_ALIYUN', '阿里云短信AccessKeyId', '46', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:44:12', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967592', 'SNOWY_SMS_ALIYUN_ACCESS_KEY_SECRET', '阿里云短信AccessKeySecret', 'SMS_ALIYUN', '阿里云短信AccessKeySecret', '47', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:44:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967593', 'SNOWY_SMS_ALIYUN_END_POINT', '阿里云短信EndPoint', 'SMS_ALIYUN', '阿里云短信EndPoint', '48', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:44:40', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_CONFIG" VALUES ('1554740179362967594', 'SNOWY_SMS_ALIYUN_DEFAULT_SIGN_NAME', '阿里云短信默认签名', 'SMS_ALIYUN', '阿里云短信默认签名', '49', NULL, 'NOT_DELETE', TO_DATE('2022-04-22 13:43:44', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); + +-- ---------------------------- +-- Table structure for DEV_DICT +-- ---------------------------- +DROP TABLE "SNOWY"."DEV_DICT"; +CREATE TABLE "SNOWY"."DEV_DICT" ( + "ID" NVARCHAR2(20) NOT NULL, + "PARENT_ID" NVARCHAR2(20), + "DICT_LABEL" NVARCHAR2(255), + "DICT_VALUE" NVARCHAR2(255), + "CATEGORY" NVARCHAR2(255), + "SORT_CODE" NUMBER(11,0), + "EXT_JSON" NCLOB, + "DELETE_FLAG" NVARCHAR2(255), + "CREATE_TIME" DATE, + "CREATE_USER" NVARCHAR2(20), + "UPDATE_TIME" DATE, + "UPDATE_USER" NVARCHAR2(20) +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SNOWY"."DEV_DICT"."PARENT_ID" IS '父id'; +COMMENT ON COLUMN "SNOWY"."DEV_DICT"."DICT_LABEL" IS '字典文字'; +COMMENT ON COLUMN "SNOWY"."DEV_DICT"."DICT_VALUE" IS '字典值'; +COMMENT ON COLUMN "SNOWY"."DEV_DICT"."CATEGORY" IS '分类'; +COMMENT ON COLUMN "SNOWY"."DEV_DICT"."SORT_CODE" IS '排序码'; +COMMENT ON COLUMN "SNOWY"."DEV_DICT"."EXT_JSON" IS '扩展信息'; +COMMENT ON COLUMN "SNOWY"."DEV_DICT"."DELETE_FLAG" IS '删除标志'; +COMMENT ON COLUMN "SNOWY"."DEV_DICT"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SNOWY"."DEV_DICT"."CREATE_USER" IS '创建用户'; +COMMENT ON COLUMN "SNOWY"."DEV_DICT"."UPDATE_TIME" IS '修改时间'; +COMMENT ON COLUMN "SNOWY"."DEV_DICT"."UPDATE_USER" IS '修改用户'; +COMMENT ON TABLE "SNOWY"."DEV_DICT" IS '字典'; + +-- ---------------------------- +-- Records of DEV_DICT +-- ---------------------------- +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658144', '1547641470701658113', '锡伯族', '锡伯族', 'FRM', '31', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658145', '1547641470701658113', '柯尔克孜族', '柯尔克孜族', 'FRM', '32', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658146', '1547641470701658113', '景颇族', '景颇族', 'FRM', '33', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658147', '1547641470701658113', '达斡尔族', '达斡尔族', 'FRM', '34', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658148', '1547641470701658113', '撒拉族', '撒拉族', 'FRM', '35', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658149', '1547641470701658113', '布朗族', '布朗族', 'FRM', '36', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658150', '1547641470701658113', '毛南族', '毛南族', 'FRM', '37', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658151', '1547641470701658113', '塔吉克族', '塔吉克族', 'FRM', '38', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658152', '1547641470701658113', '普米族', '普米族', 'FRM', '39', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658153', '1547641470701658113', '阿昌族', '阿昌族', 'FRM', '40', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658154', '1547641470701658113', '怒族', '怒族', 'FRM', '41', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658155', '1547641470701658113', '鄂温克族', '鄂温克族', 'FRM', '42', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658156', '1547641470701658113', '京族', '京族', 'FRM', '43', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658157', '1547641470701658113', '基诺族', '基诺族', 'FRM', '44', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658158', '1547641470701658113', '德昂族', '德昂族', 'FRM', '45', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658159', '1547641470701658113', '保安族', '保安族', 'FRM', '46', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658160', '1547641470701658113', '俄罗斯族', '俄罗斯族', 'FRM', '47', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658161', '1547641470701658113', '裕固族', '裕固族', 'FRM', '48', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658162', '1547641470701658113', '乌孜别克族', '乌孜别克族', 'FRM', '49', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658163', '1547641470701658113', '门巴族', '门巴族', 'FRM', '50', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658164', '1547641470701658113', '鄂伦春族', '鄂伦春族', 'FRM', '51', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658165', '1547641470701658113', '独龙族', '独龙族', 'FRM', '52', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658166', '1547641470701658113', '赫哲族', '赫哲族', 'FRM', '53', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658167', '1547641470701658113', '高山族', '高山族', 'FRM', '54', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658168', '1547641470701658113', '珞巴族', '珞巴族', 'FRM', '55', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658169', '1547641470701658113', '塔塔尔族 ', '塔塔尔族 ', 'FRM', '56', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1549019269252104194', '0', '登录设备类型', 'AUTH_DEVICE_TYPE', 'FRM', '8', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 21:12:28', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1549019748883349506', '1549019269252104194', 'PC端', 'PC', 'FRM', '10', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 21:14:22', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1549019813924421634', '1549019269252104194', '移动端', 'APP', 'FRM', '20', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 21:14:38', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1549019864537088002', '1549019269252104194', '小程序', 'MINI', 'FRM', '30', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 21:14:50', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1554678566166323202', '0', '系统字典分类', 'DICT_CATEGORY', 'FRM', '9', NULL, 'NOT_DELETE', TO_DATE('2022-08-03 12:00:29', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1554678761742524417', '1554678566166323202', '框架', 'FRM', 'FRM', '10', NULL, 'NOT_DELETE', TO_DATE('2022-08-03 12:01:16', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1554678863617974273', '1554678566166323202', '业务', 'BIZ', 'FRM', '20', NULL, 'NOT_DELETE', TO_DATE('2022-08-03 12:01:40', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1554679788378120194', '0', '短信发送引擎', 'SMS_ENGINE', 'FRM', '10', NULL, 'NOT_DELETE', TO_DATE('2022-08-03 12:05:21', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1554679872054484993', '1554679788378120194', '阿里云', 'ALIYUN', 'FRM', '10', NULL, 'NOT_DELETE', TO_DATE('2022-08-03 12:05:41', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1554679958398427138', '1554679788378120194', '腾讯云', 'TENCENT', 'FRM', '20', NULL, 'NOT_DELETE', TO_DATE('2022-08-03 12:06:01', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1554726376265744386', '0', '文件上传引擎', 'FILE_ENGINE', 'FRM', '11', NULL, 'NOT_DELETE', TO_DATE('2022-08-03 15:10:28', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1554726639571566593', '1554726376265744386', '本地', 'LOCAL', 'FRM', '10', NULL, 'NOT_DELETE', TO_DATE('2022-08-03 15:11:31', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1554726696068841474', '1554726376265744386', '阿里云', 'ALIYUN', 'FRM', '20', NULL, 'NOT_DELETE', TO_DATE('2022-08-03 15:11:44', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1554726762338844674', '1554726376265744386', '腾讯云', 'TENCENT', 'FRM', '30', NULL, 'NOT_DELETE', TO_DATE('2022-08-03 15:12:00', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1554726830844411905', '1554726376265744386', 'MINIO', 'MINIO', 'FRM', '40', NULL, 'NOT_DELETE', TO_DATE('2022-08-03 15:12:17', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1556317797993218049', '0', '邮件发送引擎', 'EMAIL_ENGINE', 'FRM', '12', NULL, 'NOT_DELETE', TO_DATE('2022-08-08 00:34:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1556319651447767041', '1556317797993218049', '本地', 'LOCAL', 'FRM', '10', NULL, 'NOT_DELETE', TO_DATE('2022-08-08 00:41:35', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1556319726962016258', '1556317797993218049', '阿里云', 'ALIYUN', 'FRM', '20', NULL, 'NOT_DELETE', TO_DATE('2022-08-08 00:41:53', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1556319786349166593', '1556317797993218049', '腾讯云', 'TENCENT', 'FRM', '30', NULL, 'NOT_DELETE', TO_DATE('2022-08-08 00:42:07', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1559942543251079169', '0', '系统通用开关', 'COMMON_SWITCH', 'FRM', '13', NULL, 'NOT_DELETE', TO_DATE('2022-08-18 00:37:40', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1559942706694717442', '1559942543251079169', '开', 'true', 'FRM', '10', NULL, 'NOT_DELETE', TO_DATE('2022-08-18 00:38:18', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1559942777674924034', '1559942543251079169', '关', 'false', 'FRM', '20', NULL, 'NOT_DELETE', TO_DATE('2022-08-18 00:38:35', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1560306347516461058', '0', '用户证件类型', 'IDCARD_TYPE', 'FRM', '14', NULL, 'NOT_DELETE', TO_DATE('2022-08-19 00:43:17', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1560306502135283714', '1560306347516461058', '身份证', '身份证', 'FRM', '10', NULL, 'NOT_DELETE', TO_DATE('2022-08-19 00:43:54', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1560306768913989633', '1560306347516461058', '出生证', '出生证', 'FRM', '20', NULL, 'NOT_DELETE', TO_DATE('2022-08-19 00:44:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1560307009365049346', '1560306347516461058', '军官证', '军官证', 'FRM', '30', NULL, 'NOT_DELETE', TO_DATE('2022-08-19 00:45:55', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1560307180937248769', '1560306347516461058', '护照', '护照', 'FRM', '40', NULL, 'NOT_DELETE', TO_DATE('2022-08-19 00:46:36', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1560309358598914050', '0', '通用文化程度', 'CULTURE_LEVEL', 'FRM', '15', NULL, 'NOT_DELETE', TO_DATE('2022-08-19 00:55:15', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1560309494892822530', '1560309358598914050', '小学', '小学', 'FRM', '10', NULL, 'NOT_DELETE', TO_DATE('2022-08-19 00:55:47', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1560309602136981505', '1560309358598914050', '中学', '中学', 'FRM', '20', NULL, 'NOT_DELETE', TO_DATE('2022-08-19 00:56:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1560309700136894465', '1560309358598914050', '高中', '高中', 'FRM', '30', NULL, 'NOT_DELETE', TO_DATE('2022-08-19 00:56:36', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1560309744118366209', '1560309358598914050', '中专', '中专', 'FRM', '40', NULL, 'NOT_DELETE', TO_DATE('2022-08-19 00:56:47', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1560309783037313026', '1560309358598914050', '大专', '大专', 'FRM', '50', NULL, 'NOT_DELETE', TO_DATE('2022-08-19 00:56:56', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1560309816423972866', '1560309358598914050', '本科', '本科', 'FRM', '60', NULL, 'NOT_DELETE', TO_DATE('2022-08-19 00:57:04', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1560309855661686785', '1560309358598914050', '硕士研究生', '硕士研究生', 'FRM', '70', NULL, 'NOT_DELETE', TO_DATE('2022-08-19 00:57:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1560310085471797250', '1560309358598914050', '博士研究生', '博士研究生', 'FRM', '80', NULL, 'NOT_DELETE', TO_DATE('2022-08-19 00:58:08', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1560338934867791874', '0', '定时任务分类', 'JOB_CATEGORY', 'FRM', '16', NULL, 'NOT_DELETE', TO_DATE('2022-08-19 02:52:46', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1560339092900777985', '1560338934867791874', '框架', 'FRM', 'FRM', '10', NULL, 'NOT_DELETE', TO_DATE('2022-08-19 02:53:24', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1560339156134105089', '1560338934867791874', '业务', 'BIZ', 'FRM', '20', NULL, 'NOT_DELETE', TO_DATE('2022-08-19 02:53:39', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1560342111344234497', '0', '定时任务状态', 'JOB_STATUS', 'FRM', '17', NULL, 'NOT_DELETE', TO_DATE('2022-08-19 03:05:24', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1560342186812346370', '1560342111344234497', '运行', 'RUNNING', 'FRM', '20', NULL, 'NOT_DELETE', TO_DATE('2022-08-19 03:05:42', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1560342250096005121', '1560342111344234497', '停止', 'STOPPED', 'FRM', '20', NULL, 'NOT_DELETE', TO_DATE('2022-08-19 03:05:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1561595062998102017', '0', '三方用户分类', 'THIRD_CATEGORY', 'FRM', '18', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:04:11', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1561595252714860545', '1561595062998102017', '码云GITEE', 'GITEE', 'FRM', '10', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:04:56', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1561595322336112641', '1561595062998102017', '微信WECHAT', 'WECHAT', 'FRM', '20', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1567580351742619650', '0', '系统消息类型', 'MESSAGE_CATEGORY', 'FRM', '19', NULL, 'NOT_DELETE', TO_DATE('2022-09-08 02:27:35', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1567580424270524418', '1567580351742619650', '系统', 'SYS', 'FRM', '10', NULL, 'NOT_DELETE', TO_DATE('2022-09-08 02:27:52', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1567580487684206594', '1567580351742619650', '业务', 'BIZ', 'FRM', '20', NULL, 'NOT_DELETE', TO_DATE('2022-09-08 02:28:07', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1543839774776291330', '0', '用户性别类型', 'GENDER', 'FRM', '1', NULL, 'NOT_DELETE', TO_DATE('2022-07-04 14:11:00', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1543839901037424642', '1543839774776291330', '男', '男', 'FRM', '10', NULL, 'NOT_DELETE', TO_DATE('2022-07-04 14:11:30', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1543840033980084226', '1543839774776291330', '女', '女', 'FRM', '20', NULL, 'NOT_DELETE', TO_DATE('2022-07-04 14:12:02', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1543860103661809666', '0', '系统菜单类型', 'MENU_TYPE', 'FRM', '2', NULL, 'NOT_DELETE', TO_DATE('2022-07-04 15:31:47', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1543860239020388354', '1543860103661809666', '目录', 'CATALOG', 'FRM', '10', NULL, 'NOT_DELETE', TO_DATE('2022-07-04 15:32:19', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1543860305508495361', '1543860103661809666', '菜单', 'MENU', 'FRM', '20', NULL, 'NOT_DELETE', TO_DATE('2022-07-04 15:32:35', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1543860423485878274', '1543860103661809666', '内链', 'IFRAME', 'FRM', '30', NULL, 'NOT_DELETE', TO_DATE('2022-07-04 15:33:03', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1543860477512708098', '1543860103661809666', '外链', 'LINK', 'FRM', '40', NULL, 'NOT_DELETE', TO_DATE('2022-07-04 15:33:16', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1544329873407946753', '0', '系统通用状态', 'COMMON_STATUS', 'FRM', '3', NULL, 'NOT_DELETE', TO_DATE('2022-07-05 22:38:29', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1545397556652027906', '1544329873407946753', '启用', 'ENABLE', 'FRM', '10', NULL, 'NOT_DELETE', TO_DATE('2022-07-08 21:21:04', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1545397556652027907', '1544329873407946753', '停用', 'DISABLED', 'FRM', '20', NULL, 'NOT_DELETE', TO_DATE('2022-07-08 21:21:04', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547207669861064706', '0', '系统角色分类', 'ROLE_CATEGORY', 'FRM', '4', NULL, 'NOT_DELETE', TO_DATE('2022-07-13 21:13:50', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547207891009937409', '1547207669861064706', '全局', 'GLOBAL', 'FRM', '10', NULL, 'NOT_DELETE', TO_DATE('2022-07-13 21:14:42', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547207990075203585', '1547207669861064706', '机构', 'ORG', 'FRM', '20', NULL, 'NOT_DELETE', TO_DATE('2022-07-13 21:15:05', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547227094995705858', '0', '系统机构分类', 'ORG_CATEGORY', 'FRM', '5', NULL, 'NOT_DELETE', TO_DATE('2022-07-13 22:31:00', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547227670693289985', '1547227094995705858', '部门', 'DEPT', 'FRM', '10', NULL, 'NOT_DELETE', TO_DATE('2022-07-13 22:33:17', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547228161267474434', '1547227094995705858', '公司', 'COMPANY', 'FRM', '20', NULL, 'NOT_DELETE', TO_DATE('2022-07-13 22:35:14', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547409689434742786', '0', '系统职位分类', 'POSITION_CATEGORY', 'FRM', '6', NULL, 'NOT_DELETE', TO_DATE('2022-07-14 10:36:34', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547409794837602305', '1547409689434742786', '高层', 'HIGH', 'FRM', '10', NULL, 'NOT_DELETE', TO_DATE('2022-07-14 10:36:59', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547409844779180033', '1547409689434742786', '中层', 'MIDDLE', 'FRM', '20', NULL, 'NOT_DELETE', TO_DATE('2022-07-14 10:37:11', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547409906406088706', '1547409689434742786', '基层', 'LOW', 'FRM', '30', NULL, 'NOT_DELETE', TO_DATE('2022-07-14 10:37:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658113', '0', '用户民族类型', 'NATION', 'FRM', '7', NULL, 'NOT_DELETE', TO_DATE('2022-07-15 01:57:35', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658114', '1547641470701658113', '汉族', '汉族', 'FRM', '1', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658115', '1547641470701658113', '壮族', '壮族', 'FRM', '2', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658116', '1547641470701658113', '回族', '回族', 'FRM', '3', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658117', '1547641470701658113', '满族', '满族', 'FRM', '4', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658118', '1547641470701658113', '维吾尔族', '维吾尔族', 'FRM', '5', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658119', '1547641470701658113', '苗族', '苗族', 'FRM', '6', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658120', '1547641470701658113', '彝族', '彝族', 'FRM', '7', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658121', '1547641470701658113', '土家族', '土家族', 'FRM', '8', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658122', '1547641470701658113', '藏族', '藏族', 'FRM', '9', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658123', '1547641470701658113', '蒙古族', '蒙古族', 'FRM', '10', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658124', '1547641470701658113', '侗族', '侗族', 'FRM', '11', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658125', '1547641470701658113', '布依族', '布依族', 'FRM', '12', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658126', '1547641470701658113', '瑶族', '瑶族', 'FRM', '13', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658127', '1547641470701658113', '白族', '白族', 'FRM', '14', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658128', '1547641470701658113', '朝鲜族', '朝鲜族', 'FRM', '15', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658129', '1547641470701658113', '哈尼族', '哈尼族', 'FRM', '16', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658130', '1547641470701658113', '黎族', '黎族', 'FRM', '17', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658131', '1547641470701658113', '哈萨克族', '哈萨克族', 'FRM', '18', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658132', '1547641470701658113', '傣族', '傣族', 'FRM', '19', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658133', '1547641470701658113', '畲族', '畲族', 'FRM', '20', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658134', '1547641470701658113', '傈僳族', '傈僳族', 'FRM', '21', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658135', '1547641470701658113', '东乡族', '东乡族', 'FRM', '22', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658136', '1547641470701658113', '仡佬族', '仡佬族', 'FRM', '23', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658137', '1547641470701658113', '拉祜族', '拉祜族', 'FRM', '24', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658138', '1547641470701658113', '佤族', '佤族', 'FRM', '25', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658139', '1547641470701658113', '水族', '水族', 'FRM', '26', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658140', '1547641470701658113', '纳西族', '纳西族', 'FRM', '27', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658141', '1547641470701658113', '羌族', '羌族', 'FRM', '28', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658142', '1547641470701658113', '土族', '土族', 'FRM', '29', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."DEV_DICT" VALUES ('1547641470701658143', '1547641470701658113', '仫佬族', '仫佬族', 'FRM', '30', NULL, 'NOT_DELETE', TO_DATE('2022-08-22 14:05:13', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); + +-- ---------------------------- +-- Table structure for DEV_EMAIL +-- ---------------------------- +DROP TABLE "SNOWY"."DEV_EMAIL"; +CREATE TABLE "SNOWY"."DEV_EMAIL" ( + "ID" NVARCHAR2(20) NOT NULL, + "ENGINE" NVARCHAR2(255), + "SEND_ACCOUNT" NVARCHAR2(255), + "SEND_USER" NVARCHAR2(255), + "RECEIVE_ACCOUNTS" NCLOB, + "SUBJECT" NCLOB, + "CONTENT" NCLOB, + "TAG_NAME" NVARCHAR2(255), + "TEMPLATE_NAME" NCLOB, + "TEMPLATE_PARAM" NCLOB, + "RECEIPT_INFO" NCLOB, + "EXT_JSON" NCLOB, + "DELETE_FLAG" NVARCHAR2(255), + "CREATE_TIME" DATE, + "CREATE_USER" NVARCHAR2(20), + "UPDATE_TIME" DATE, + "UPDATE_USER" NVARCHAR2(20) +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SNOWY"."DEV_EMAIL"."ENGINE" IS '邮件引擎'; +COMMENT ON COLUMN "SNOWY"."DEV_EMAIL"."SEND_ACCOUNT" IS '发件人邮箱'; +COMMENT ON COLUMN "SNOWY"."DEV_EMAIL"."SEND_USER" IS '发件人昵称'; +COMMENT ON COLUMN "SNOWY"."DEV_EMAIL"."RECEIVE_ACCOUNTS" IS '接收人'; +COMMENT ON COLUMN "SNOWY"."DEV_EMAIL"."SUBJECT" IS '邮件主题'; +COMMENT ON COLUMN "SNOWY"."DEV_EMAIL"."CONTENT" IS '邮件正文'; +COMMENT ON COLUMN "SNOWY"."DEV_EMAIL"."TAG_NAME" IS '标签名'; +COMMENT ON COLUMN "SNOWY"."DEV_EMAIL"."TEMPLATE_NAME" IS '模板名'; +COMMENT ON COLUMN "SNOWY"."DEV_EMAIL"."TEMPLATE_PARAM" IS '发送参数'; +COMMENT ON COLUMN "SNOWY"."DEV_EMAIL"."RECEIPT_INFO" IS '回执信息'; +COMMENT ON COLUMN "SNOWY"."DEV_EMAIL"."EXT_JSON" IS '扩展信息'; +COMMENT ON COLUMN "SNOWY"."DEV_EMAIL"."DELETE_FLAG" IS '删除标志'; +COMMENT ON COLUMN "SNOWY"."DEV_EMAIL"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SNOWY"."DEV_EMAIL"."CREATE_USER" IS '创建用户'; +COMMENT ON COLUMN "SNOWY"."DEV_EMAIL"."UPDATE_TIME" IS '修改时间'; +COMMENT ON COLUMN "SNOWY"."DEV_EMAIL"."UPDATE_USER" IS '修改用户'; +COMMENT ON TABLE "SNOWY"."DEV_EMAIL" IS '邮件'; + +-- ---------------------------- +-- Records of DEV_EMAIL +-- ---------------------------- + +-- ---------------------------- +-- Table structure for DEV_FILE +-- ---------------------------- +DROP TABLE "SNOWY"."DEV_FILE"; +CREATE TABLE "SNOWY"."DEV_FILE" ( + "ID" NVARCHAR2(20) NOT NULL, + "ENGINE" NVARCHAR2(255), + "BUCKET" NVARCHAR2(255), + "NAME" NCLOB, + "SUFFIX" NVARCHAR2(255), + "SIZE_KB" NUMBER(20,0), + "SIZE_INFO" NVARCHAR2(255), + "OBJ_NAME" NCLOB, + "STORAGE_PATH" NCLOB, + "DOWNLOAD_PATH" NCLOB, + "THUMBNAIL" NCLOB, + "EXT_JSON" NCLOB, + "DELETE_FLAG" NVARCHAR2(255), + "CREATE_TIME" DATE, + "CREATE_USER" NVARCHAR2(20), + "UPDATE_TIME" DATE, + "UPDATE_USER" NVARCHAR2(20) +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SNOWY"."DEV_FILE"."ENGINE" IS '存储引擎'; +COMMENT ON COLUMN "SNOWY"."DEV_FILE"."BUCKET" IS '存储桶'; +COMMENT ON COLUMN "SNOWY"."DEV_FILE"."NAME" IS '文件名称'; +COMMENT ON COLUMN "SNOWY"."DEV_FILE"."SUFFIX" IS '文件后缀'; +COMMENT ON COLUMN "SNOWY"."DEV_FILE"."SIZE_KB" IS '文件大小kb'; +COMMENT ON COLUMN "SNOWY"."DEV_FILE"."SIZE_INFO" IS '文件大小(格式化后)'; +COMMENT ON COLUMN "SNOWY"."DEV_FILE"."OBJ_NAME" IS '文件的对象名(唯一名称)'; +COMMENT ON COLUMN "SNOWY"."DEV_FILE"."STORAGE_PATH" IS '文件存储路径'; +COMMENT ON COLUMN "SNOWY"."DEV_FILE"."DOWNLOAD_PATH" IS '文件下载路径'; +COMMENT ON COLUMN "SNOWY"."DEV_FILE"."THUMBNAIL" IS '图片缩略图'; +COMMENT ON COLUMN "SNOWY"."DEV_FILE"."EXT_JSON" IS '扩展信息'; +COMMENT ON COLUMN "SNOWY"."DEV_FILE"."DELETE_FLAG" IS '删除标志'; +COMMENT ON COLUMN "SNOWY"."DEV_FILE"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SNOWY"."DEV_FILE"."CREATE_USER" IS '创建用户'; +COMMENT ON COLUMN "SNOWY"."DEV_FILE"."UPDATE_TIME" IS '修改时间'; +COMMENT ON COLUMN "SNOWY"."DEV_FILE"."UPDATE_USER" IS '修改用户'; +COMMENT ON TABLE "SNOWY"."DEV_FILE" IS '文件'; + +-- ---------------------------- +-- Records of DEV_FILE +-- ---------------------------- + +-- ---------------------------- +-- Table structure for DEV_JOB +-- ---------------------------- +DROP TABLE "SNOWY"."DEV_JOB"; +CREATE TABLE "SNOWY"."DEV_JOB" ( + "ID" NVARCHAR2(20) NOT NULL, + "NAME" NVARCHAR2(255), + "CODE" NVARCHAR2(255), + "CATEGORY" NVARCHAR2(255), + "ACTION_CLASS" NVARCHAR2(255), + "CRON_EXPRESSION" NVARCHAR2(255), + "JOB_STATUS" NVARCHAR2(255), + "SORT_CODE" NUMBER(11,0), + "EXT_JSON" NCLOB, + "DELETE_FLAG" NVARCHAR2(255), + "CREATE_TIME" DATE, + "CREATE_USER" NVARCHAR2(20), + "UPDATE_TIME" DATE, + "UPDATE_USER" NVARCHAR2(20) +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SNOWY"."DEV_JOB"."NAME" IS '名称'; +COMMENT ON COLUMN "SNOWY"."DEV_JOB"."CODE" IS '编码'; +COMMENT ON COLUMN "SNOWY"."DEV_JOB"."CATEGORY" IS '分类'; +COMMENT ON COLUMN "SNOWY"."DEV_JOB"."ACTION_CLASS" IS '任务类名'; +COMMENT ON COLUMN "SNOWY"."DEV_JOB"."CRON_EXPRESSION" IS 'cron表达式'; +COMMENT ON COLUMN "SNOWY"."DEV_JOB"."JOB_STATUS" IS '任务状态'; +COMMENT ON COLUMN "SNOWY"."DEV_JOB"."SORT_CODE" IS '排序码'; +COMMENT ON COLUMN "SNOWY"."DEV_JOB"."EXT_JSON" IS '扩展信息'; +COMMENT ON COLUMN "SNOWY"."DEV_JOB"."DELETE_FLAG" IS '删除标志'; +COMMENT ON COLUMN "SNOWY"."DEV_JOB"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SNOWY"."DEV_JOB"."CREATE_USER" IS '创建用户'; +COMMENT ON COLUMN "SNOWY"."DEV_JOB"."UPDATE_TIME" IS '修改时间'; +COMMENT ON COLUMN "SNOWY"."DEV_JOB"."UPDATE_USER" IS '修改用户'; +COMMENT ON TABLE "SNOWY"."DEV_JOB" IS '定时任务'; + +-- ---------------------------- +-- Records of DEV_JOB +-- ---------------------------- +INSERT INTO "SNOWY"."DEV_JOB" VALUES ('1555471535453827073', '定时任务', 'qi06nah38m', 'FRM', 'vip.xiaonuo.dev.modular.job.task.DevJobTimerTaskRunner', '0 0 0 1 * ?', 'STOPPED', '1', NULL, 'NOT_DELETE', TO_DATE('2022-08-05 16:31:29', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); + +-- ---------------------------- +-- Table structure for DEV_LOG +-- ---------------------------- +DROP TABLE "SNOWY"."DEV_LOG"; +CREATE TABLE "SNOWY"."DEV_LOG" ( + "ID" NVARCHAR2(20) NOT NULL, + "CATEGORY" NVARCHAR2(255), + "NAME" NVARCHAR2(255), + "EXE_STATUS" NVARCHAR2(255), + "EXE_MESSAGE" NCLOB, + "OP_IP" NVARCHAR2(255), + "OP_ADDRESS" NVARCHAR2(255), + "OP_BROWSER" NVARCHAR2(255), + "OP_OS" NVARCHAR2(255), + "CLASS_NAME" NVARCHAR2(255), + "METHOD_NAME" NVARCHAR2(255), + "REQ_METHOD" NVARCHAR2(255), + "REQ_URL" NCLOB, + "PARAM_JSON" NCLOB, + "RESULT_JSON" NCLOB, + "OP_TIME" DATE, + "OP_USER" NVARCHAR2(255), + "SIGN_DATA" NCLOB, + "CREATE_TIME" DATE, + "CREATE_USER" NVARCHAR2(20), + "UPDATE_TIME" DATE, + "UPDATE_USER" NVARCHAR2(20) +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SNOWY"."DEV_LOG"."ID" IS '主键'; +COMMENT ON COLUMN "SNOWY"."DEV_LOG"."CATEGORY" IS '日志分类'; +COMMENT ON COLUMN "SNOWY"."DEV_LOG"."NAME" IS '日志名称'; +COMMENT ON COLUMN "SNOWY"."DEV_LOG"."EXE_STATUS" IS '执行状态'; +COMMENT ON COLUMN "SNOWY"."DEV_LOG"."EXE_MESSAGE" IS '具体消息'; +COMMENT ON COLUMN "SNOWY"."DEV_LOG"."OP_IP" IS '操作ip'; +COMMENT ON COLUMN "SNOWY"."DEV_LOG"."OP_ADDRESS" IS '操作地址'; +COMMENT ON COLUMN "SNOWY"."DEV_LOG"."OP_BROWSER" IS '操作浏览器'; +COMMENT ON COLUMN "SNOWY"."DEV_LOG"."OP_OS" IS '操作系统'; +COMMENT ON COLUMN "SNOWY"."DEV_LOG"."CLASS_NAME" IS '类名称'; +COMMENT ON COLUMN "SNOWY"."DEV_LOG"."METHOD_NAME" IS '方法名称'; +COMMENT ON COLUMN "SNOWY"."DEV_LOG"."REQ_METHOD" IS '请求方式'; +COMMENT ON COLUMN "SNOWY"."DEV_LOG"."REQ_URL" IS '请求地址'; +COMMENT ON COLUMN "SNOWY"."DEV_LOG"."PARAM_JSON" IS '请求参数'; +COMMENT ON COLUMN "SNOWY"."DEV_LOG"."RESULT_JSON" IS '返回结果'; +COMMENT ON COLUMN "SNOWY"."DEV_LOG"."OP_TIME" IS '操作时间'; +COMMENT ON COLUMN "SNOWY"."DEV_LOG"."OP_USER" IS '操作人姓名'; +COMMENT ON COLUMN "SNOWY"."DEV_LOG"."SIGN_DATA" IS '签名数据'; +COMMENT ON COLUMN "SNOWY"."DEV_LOG"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SNOWY"."DEV_LOG"."CREATE_USER" IS '创建用户'; +COMMENT ON COLUMN "SNOWY"."DEV_LOG"."UPDATE_TIME" IS '修改时间'; +COMMENT ON COLUMN "SNOWY"."DEV_LOG"."UPDATE_USER" IS '修改用户'; +COMMENT ON TABLE "SNOWY"."DEV_LOG" IS '日志'; + +-- ---------------------------- +-- Records of DEV_LOG +-- ---------------------------- + +-- ---------------------------- +-- Table structure for DEV_MESSAGE +-- ---------------------------- +DROP TABLE "SNOWY"."DEV_MESSAGE"; +CREATE TABLE "SNOWY"."DEV_MESSAGE" ( + "ID" NVARCHAR2(20) NOT NULL, + "CATEGORY" NVARCHAR2(255), + "SUBJECT" NCLOB, + "CONTENT" NCLOB, + "EXT_JSON" NCLOB, + "DELETE_FLAG" NVARCHAR2(255), + "CREATE_TIME" DATE, + "CREATE_USER" NVARCHAR2(20), + "UPDATE_TIME" DATE, + "UPDATE_USER" NVARCHAR2(20) +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SNOWY"."DEV_MESSAGE"."CATEGORY" IS '分类'; +COMMENT ON COLUMN "SNOWY"."DEV_MESSAGE"."SUBJECT" IS '主题'; +COMMENT ON COLUMN "SNOWY"."DEV_MESSAGE"."CONTENT" IS '正文'; +COMMENT ON COLUMN "SNOWY"."DEV_MESSAGE"."EXT_JSON" IS '扩展信息'; +COMMENT ON COLUMN "SNOWY"."DEV_MESSAGE"."DELETE_FLAG" IS '删除标志'; +COMMENT ON COLUMN "SNOWY"."DEV_MESSAGE"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SNOWY"."DEV_MESSAGE"."CREATE_USER" IS '创建用户'; +COMMENT ON COLUMN "SNOWY"."DEV_MESSAGE"."UPDATE_TIME" IS '修改时间'; +COMMENT ON COLUMN "SNOWY"."DEV_MESSAGE"."UPDATE_USER" IS '修改用户'; +COMMENT ON TABLE "SNOWY"."DEV_MESSAGE" IS '站内信'; + +-- ---------------------------- +-- Records of DEV_MESSAGE +-- ---------------------------- + +-- ---------------------------- +-- Table structure for DEV_RELATION +-- ---------------------------- +DROP TABLE "SNOWY"."DEV_RELATION"; +CREATE TABLE "SNOWY"."DEV_RELATION" ( + "ID" NVARCHAR2(20) NOT NULL, + "OBJECT_ID" NCLOB, + "TARGET_ID" NCLOB, + "CATEGORY" NVARCHAR2(255), + "EXT_JSON" NCLOB +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SNOWY"."DEV_RELATION"."OBJECT_ID" IS '对象ID'; +COMMENT ON COLUMN "SNOWY"."DEV_RELATION"."TARGET_ID" IS '目标ID'; +COMMENT ON COLUMN "SNOWY"."DEV_RELATION"."CATEGORY" IS '分类'; +COMMENT ON COLUMN "SNOWY"."DEV_RELATION"."EXT_JSON" IS '扩展信息'; +COMMENT ON TABLE "SNOWY"."DEV_RELATION" IS '关系'; + +-- ---------------------------- +-- Records of DEV_RELATION +-- ---------------------------- + +-- ---------------------------- +-- Table structure for DEV_SMS +-- ---------------------------- +DROP TABLE "SNOWY"."DEV_SMS"; +CREATE TABLE "SNOWY"."DEV_SMS" ( + "ID" NVARCHAR2(20) NOT NULL, + "ENGINE" NVARCHAR2(255), + "PHONE_NUMBERS" NCLOB, + "SIGN_NAME" NCLOB, + "TEMPLATE_CODE" NCLOB, + "TEMPLATE_PARAM" NCLOB, + "RECEIPT_INFO" NCLOB, + "EXT_JSON" NCLOB, + "DELETE_FLAG" NVARCHAR2(255), + "CREATE_TIME" DATE, + "CREATE_USER" NVARCHAR2(20), + "UPDATE_TIME" DATE, + "UPDATE_USER" NVARCHAR2(20) +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SNOWY"."DEV_SMS"."ENGINE" IS '短信引擎'; +COMMENT ON COLUMN "SNOWY"."DEV_SMS"."PHONE_NUMBERS" IS '手机号'; +COMMENT ON COLUMN "SNOWY"."DEV_SMS"."SIGN_NAME" IS '短信签名'; +COMMENT ON COLUMN "SNOWY"."DEV_SMS"."TEMPLATE_CODE" IS '模板编码'; +COMMENT ON COLUMN "SNOWY"."DEV_SMS"."TEMPLATE_PARAM" IS '发送参数'; +COMMENT ON COLUMN "SNOWY"."DEV_SMS"."RECEIPT_INFO" IS '回执信息'; +COMMENT ON COLUMN "SNOWY"."DEV_SMS"."EXT_JSON" IS '扩展信息'; +COMMENT ON COLUMN "SNOWY"."DEV_SMS"."DELETE_FLAG" IS '删除标志'; +COMMENT ON COLUMN "SNOWY"."DEV_SMS"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SNOWY"."DEV_SMS"."CREATE_USER" IS '创建用户'; +COMMENT ON COLUMN "SNOWY"."DEV_SMS"."UPDATE_TIME" IS '修改时间'; +COMMENT ON COLUMN "SNOWY"."DEV_SMS"."UPDATE_USER" IS '修改用户'; +COMMENT ON TABLE "SNOWY"."DEV_SMS" IS '短信'; + +-- ---------------------------- +-- Records of DEV_SMS +-- ---------------------------- + +-- ---------------------------- +-- Table structure for SYS_ORG +-- ---------------------------- +DROP TABLE "SNOWY"."SYS_ORG"; +CREATE TABLE "SNOWY"."SYS_ORG" ( + "ID" NVARCHAR2(20) NOT NULL, + "PARENT_ID" NVARCHAR2(20), + "DIRECTOR_ID" NVARCHAR2(20), + "NAME" NVARCHAR2(255), + "CODE" NVARCHAR2(255), + "CATEGORY" NVARCHAR2(255), + "SORT_CODE" NUMBER(11,0), + "EXT_JSON" NCLOB, + "DELETE_FLAG" NVARCHAR2(255), + "CREATE_TIME" DATE, + "CREATE_USER" NVARCHAR2(20), + "UPDATE_TIME" DATE, + "UPDATE_USER" NVARCHAR2(20) +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SNOWY"."SYS_ORG"."PARENT_ID" IS '父id'; +COMMENT ON COLUMN "SNOWY"."SYS_ORG"."DIRECTOR_ID" IS '主管ID'; +COMMENT ON COLUMN "SNOWY"."SYS_ORG"."NAME" IS '名称'; +COMMENT ON COLUMN "SNOWY"."SYS_ORG"."CODE" IS '编码'; +COMMENT ON COLUMN "SNOWY"."SYS_ORG"."CATEGORY" IS '分类'; +COMMENT ON COLUMN "SNOWY"."SYS_ORG"."SORT_CODE" IS '排序码'; +COMMENT ON COLUMN "SNOWY"."SYS_ORG"."EXT_JSON" IS '扩展信息'; +COMMENT ON COLUMN "SNOWY"."SYS_ORG"."DELETE_FLAG" IS '删除标志'; +COMMENT ON COLUMN "SNOWY"."SYS_ORG"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SNOWY"."SYS_ORG"."CREATE_USER" IS '创建用户'; +COMMENT ON COLUMN "SNOWY"."SYS_ORG"."UPDATE_TIME" IS '修改时间'; +COMMENT ON COLUMN "SNOWY"."SYS_ORG"."UPDATE_USER" IS '修改用户'; +COMMENT ON TABLE "SNOWY"."SYS_ORG" IS '组织'; + +-- ---------------------------- +-- Records of SYS_ORG +-- ---------------------------- +INSERT INTO "SNOWY"."SYS_ORG" VALUES ('1543842934270394368', '0', NULL, '小诺科技有限公司', 'yfqtrbd5qz', 'COMPANY', '1', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:42:43', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_ORG" VALUES ('1543842934270394369', '1543842934270394368', '1543837863788879874', '领导班子', 'xmfvgov44q', 'DEPT', '2', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:42:43', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_ORG" VALUES ('1543842934270394370', '1543842934270394368', '1543837863788879880', '工会办公室', '5ruzr6n7g7', 'DEPT', '3', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:42:43', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_ORG" VALUES ('1543842934270394371', '1543842934270394368', '1543837863788879883', '综合管理部', 'l4sdfnw27p', 'DEPT', '4', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:42:43', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_ORG" VALUES ('1543842934270394372', '1543842934270394368', '1543837863788879887', '财务资产部', 'h7yq9t1q0t', 'DEPT', '5', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:42:43', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_ORG" VALUES ('1543842934270394373', '1543842934270394368', '1543837863788879892', '人力资源部', '245ryxcbqh', 'DEPT', '6', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:42:43', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_ORG" VALUES ('1543842934270394374', '1543842934270394368', '1543837863788879898', '党群工作部', 'sc6jkffc4d', 'DEPT', '7', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:42:43', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_ORG" VALUES ('1543842934270394375', '1543842934270394368', '1543837863788879903', '纪检监督部', '39t022fx1m', 'DEPT', '8', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:42:43', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_ORG" VALUES ('1543842934270394376', '1543842934270394368', '1543837863788879907', '生产技术部', '34m3lam984', 'DEPT', '9', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:42:43', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_ORG" VALUES ('1543842934270394377', '1543842934270394368', '1543837863788879912', '计划营销部', 'w742mipwer', 'DEPT', '10', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:42:43', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_ORG" VALUES ('1543842934270394378', '1543842934270394368', '1543837863788879917', '后勤保卫部', 'b71pvf46do', 'DEPT', '11', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:42:43', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_ORG" VALUES ('1543842934270394379', '1543842934270394368', NULL, '西南分公司', 'ksekw9x0cg', 'COMPANY', '12', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:42:43', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_ORG" VALUES ('1543842934270394380', '1543842934270394379', '1543837863788879925', '综管部', 'snt7z4gzg2', 'DEPT', '13', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:42:43', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_ORG" VALUES ('1543842934270394381', '1543842934270394379', '1543837863788879930', '研发部', 'jowwv1u5gm', 'DEPT', '14', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:42:43', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_ORG" VALUES ('1543842934270394382', '1543842934270394379', '1543837863788879934', '销售部', '23grt76733', 'DEPT', '15', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:42:43', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_ORG" VALUES ('1543842934270394383', '1543842934270394379', '1543837863788879939', '人事部', 'n1in22gf6x', 'DEPT', '16', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:42:43', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_ORG" VALUES ('1543842934270394384', '1543842934270394379', '1543837863788879944', '采购部', 'v27rqp18yf', 'DEPT', '17', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:42:43', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_ORG" VALUES ('1543842934270394385', '1543842934270394379', '1543837863788879949', '技术部', '34xmmu0esf', 'DEPT', '18', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:42:43', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_ORG" VALUES ('1543842934270394386', '1543842934270394379', '1543837863788879954', '质检部', 'bm8kuwwzan', 'DEPT', '19', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:42:43', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); + +-- ---------------------------- +-- Table structure for SYS_POSITION +-- ---------------------------- +DROP TABLE "SNOWY"."SYS_POSITION"; +CREATE TABLE "SNOWY"."SYS_POSITION" ( + "ID" NVARCHAR2(20) NOT NULL, + "ORG_ID" NVARCHAR2(20), + "NAME" NVARCHAR2(255), + "CODE" NVARCHAR2(255), + "CATEGORY" NVARCHAR2(255), + "SORT_CODE" NUMBER(11,0), + "EXT_JSON" NCLOB, + "DELETE_FLAG" NVARCHAR2(255), + "CREATE_TIME" DATE, + "CREATE_USER" NVARCHAR2(20), + "UPDATE_TIME" DATE, + "UPDATE_USER" NVARCHAR2(20) +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SNOWY"."SYS_POSITION"."ORG_ID" IS '组织id'; +COMMENT ON COLUMN "SNOWY"."SYS_POSITION"."NAME" IS '名称'; +COMMENT ON COLUMN "SNOWY"."SYS_POSITION"."CODE" IS '编码'; +COMMENT ON COLUMN "SNOWY"."SYS_POSITION"."CATEGORY" IS '分类'; +COMMENT ON COLUMN "SNOWY"."SYS_POSITION"."SORT_CODE" IS '排序码'; +COMMENT ON COLUMN "SNOWY"."SYS_POSITION"."EXT_JSON" IS '扩展信息'; +COMMENT ON COLUMN "SNOWY"."SYS_POSITION"."DELETE_FLAG" IS '删除标志'; +COMMENT ON COLUMN "SNOWY"."SYS_POSITION"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SNOWY"."SYS_POSITION"."CREATE_USER" IS '创建用户'; +COMMENT ON COLUMN "SNOWY"."SYS_POSITION"."UPDATE_TIME" IS '修改时间'; +COMMENT ON COLUMN "SNOWY"."SYS_POSITION"."UPDATE_USER" IS '修改用户'; +COMMENT ON TABLE "SNOWY"."SYS_POSITION" IS '职位'; + +-- ---------------------------- +-- Records of SYS_POSITION +-- ---------------------------- +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019583', '1543842934270394369', '党委书记', 'rsz5dmh762', 'HIGH', '1', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019584', '1543842934270394369', '总经理', 'wo1araqs2z', 'HIGH', '2', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019585', '1543842934270394369', '副总经理', 'asqvwbsc16', 'HIGH', '3', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019586', '1543842934270394369', '总会计师', 'kwwyyb1ki9', 'HIGH', '4', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019587', '1543842934270394369', '总经理助理', 'aln9y4tno6', 'HIGH', '5', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019588', '1543842934270394370', '工会主席', 'j155xzpd3q', 'HIGH', '6', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019589', '1543842934270394370', '工会副主席', 'za9ebd8yb3', 'MIDDLE', '7', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019590', '1543842934270394370', '工会干事', '1crq7ylpdq', 'LOW', '8', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019591', '1543842934270394371', '部门经理', 'krq0kj7oio', 'MIDDLE', '9', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019592', '1543842934270394371', '部门副经理', 'p87a2qrmai', 'MIDDLE', '10', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019593', '1543842934270394371', '行政秘书', 'yw4e9p7jop', 'LOW', '11', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019594', '1543842934270394371', '行政专员', 'gpj40g9sfy', 'LOW', '12', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019595', '1543842934270394372', '财务总监', 'djtgymhpfq', 'MIDDLE', '13', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019596', '1543842934270394372', '审计主管', '1xbotmzysq', 'MIDDLE', '14', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019597', '1543842934270394372', '会计', 'sz6xuyyw1p', 'LOW', '15', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019598', '1543842934270394372', '出纳', '32ep33wuui', 'LOW', '16', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019599', '1543842934270394373', '人资总监', 'opig590piu', 'MIDDLE', '17', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019600', '1543842934270394373', '招聘主管', 'zidce26bp3', 'MIDDLE', '18', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019601', '1543842934270394373', '招聘专员', '1tq2m6gg7r', 'LOW', '19', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019602', '1543842934270394373', '薪酬主管', 'yysav5vvro', 'MIDDLE', '20', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019603', '1543842934270394373', '绩效主管', 'rjnelqruj6', 'MIDDLE', '21', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019604', '1543842934270394374', '组织部长', 'mtgiot5d0e', 'MIDDLE', '22', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019605', '1543842934270394374', '宣传部长', 'thimndbcim', 'MIDDLE', '23', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019606', '1543842934270394374', '团委书记', 'if2bhfasci', 'MIDDLE', '24', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019607', '1543842934270394374', '组织专员', 'vkw8sdgz3o', 'LOW', '25', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019608', '1543842934270394374', '宣传专员', 'mrx68t1f7w', 'LOW', '26', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019609', '1543842934270394375', '监察室主任', 'w5yxpau8yr', 'MIDDLE', '27', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019610', '1543842934270394375', '监察室副主任', 'gttosc25hw', 'MIDDLE', '28', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019611', '1543842934270394375', '监察委员', '2m9hs6fkjo', 'LOW', '29', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019612', '1543842934270394376', '部门经理', 'o86yv2ypo6', 'MIDDLE', '30', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019613', '1543842934270394376', '部门副经理', 'gv3j2yz30e', 'MIDDLE', '31', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019614', '1543842934270394376', '网络工程师', 'ebbnm4y8jr', 'LOW', '32', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019615', '1543842934270394376', '维修工程师', 'cm6j5y200r', 'LOW', '33', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019616', '1543842934270394377', '营销总监', 'b6zdp05m95', 'MIDDLE', '34', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019617', '1543842934270394377', '销售主管', 'gjbtoi2p2j', 'MIDDLE', '35', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019618', '1543842934270394377', '销售专员', 'vucrc1t64r', 'LOW', '36', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019619', '1543842934270394378', '总务科长', '7wdazftlai', 'MIDDLE', '37', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019620', '1543842934270394378', '保卫科长', 'fh5ciy870i', 'MIDDLE', '38', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019621', '1543842934270394378', '供应科长', '877wu8sx7x', 'MIDDLE', '39', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019622', '1543842934270394378', '调度员', 'whubr9jawi', 'LOW', '40', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019623', '1543842934270394378', '司机', 'su5w4voauh', 'LOW', '41', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019624', '1543842934270394378', '厨师', 'wh54f8flj6', 'LOW', '42', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019625', '1543842934270394380', '部门经理', '81vtv8x93j', 'MIDDLE', '43', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019626', '1543842934270394380', '部门副经理', '001mqeiozs', 'MIDDLE', '44', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019627', '1543842934270394380', '工作成员', '6p19ejkr72', 'LOW', '45', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019628', '1543842934270394381', '部门经理', 'xuhv41bl3s', 'MIDDLE', '46', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019629', '1543842934270394381', '部门副经理', '5h4vo5z27b', 'MIDDLE', '47', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019630', '1543842934270394381', '工作成员', 'mn0fzfdcvv', 'LOW', '48', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019631', '1543842934270394382', '部门经理', 'fzwvetfon9', 'MIDDLE', '49', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019632', '1543842934270394382', '部门副经理', 'rxgjbmjbvd', 'MIDDLE', '50', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019633', '1543842934270394382', '工作成员', 'bj0zt5ncy0', 'LOW', '51', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019634', '1543842934270394383', '部门经理', 'wqv31lvmhf', 'MIDDLE', '52', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019635', '1543842934270394383', '部门副经理', '31etuwtybi', 'MIDDLE', '53', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019636', '1543842934270394383', '工作成员', 'rtgawbjyzq', 'LOW', '54', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019637', '1543842934270394384', '部门经理', 'b9d2p1xo8h', 'MIDDLE', '55', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019638', '1543842934270394384', '部门副经理', 'ayb8lhufv4', 'MIDDLE', '56', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019639', '1543842934270394384', '工作成员', '6xyf1kce64', 'LOW', '57', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019640', '1543842934270394385', '部门经理', 'd82h5he4ln', 'MIDDLE', '58', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019641', '1543842934270394385', '部门副经理', 'a45lsv38dk', 'MIDDLE', '59', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019642', '1543842934270394385', '工作成员', 'npvkzerms9', 'LOW', '60', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019643', '1543842934270394386', '部门经理', '7tl8vkbd4m', 'MIDDLE', '61', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019644', '1543842934270394386', '部门副经理', 'h9kz9lgk1u', 'MIDDLE', '62', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_POSITION" VALUES ('1543899639134019645', '1543842934270394386', '工作成员', 'jh8z81wka8', 'LOW', '99', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:43:26', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); + +-- ---------------------------- +-- Table structure for SYS_RELATION +-- ---------------------------- +DROP TABLE "SNOWY"."SYS_RELATION"; +CREATE TABLE "SNOWY"."SYS_RELATION" ( + "ID" NVARCHAR2(20) NOT NULL, + "OBJECT_ID" NCLOB, + "TARGET_ID" NCLOB, + "CATEGORY" NVARCHAR2(255), + "EXT_JSON" NCLOB +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SNOWY"."SYS_RELATION"."OBJECT_ID" IS '对象ID'; +COMMENT ON COLUMN "SNOWY"."SYS_RELATION"."TARGET_ID" IS '目标ID'; +COMMENT ON COLUMN "SNOWY"."SYS_RELATION"."CATEGORY" IS '分类'; +COMMENT ON COLUMN "SNOWY"."SYS_RELATION"."EXT_JSON" IS '扩展信息'; +COMMENT ON TABLE "SNOWY"."SYS_RELATION" IS '关系'; + +-- ---------------------------- +-- Records of SYS_RELATION +-- ---------------------------- +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1569556138947522560', '1543837863788879873', '1570687866138206209', 'SYS_USER_HAS_ROLE', NULL); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1569556138947522561', '1543837863788879871', '1570687866138206208', 'SYS_USER_HAS_ROLE', NULL); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235898695682', '1570687866138206209', '/biz/org/add', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/org/add"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235898695683', '1570687866138206209', '/biz/org/delete', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/org/delete"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235898695684', '1570687866138206209', '/biz/org/detail', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/org/detail"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235898695685', '1570687866138206209', '/biz/org/edit', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/org/edit"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235898695686', '1570687866138206209', '/biz/org/orgTreeSelector', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/org/orgTreeSelector"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235898695687', '1570687866138206209', '/biz/org/page', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/org/page"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235907084290', '1570687866138206209', '/biz/org/tree', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/org/tree"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235907084291', '1570687866138206209', '/biz/org/userSelector', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/org/userSelector"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235907084292', '1570687866138206209', '/biz/position/add', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/position/add"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235907084293', '1570687866138206209', '/biz/position/delete', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/position/delete"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235907084294', '1570687866138206209', '/biz/position/detail', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/position/detail"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235907084295', '1570687866138206209', '/biz/position/edit', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/position/edit"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235907084296', '1570687866138206209', '/biz/position/orgTreeSelector', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/position/orgTreeSelector"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235907084297', '1570687866138206209', '/biz/position/page', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/position/page"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235907084298', '1570687866138206209', '/biz/position/positionSelector', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/position/positionSelector"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235915472898', '1570687866138206209', '/biz/user/add', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/add"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441409', '1570687866138206208', '1548901111999770826', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999770826","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441410', '1570687866138206208', '1548901111999770926', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999770926","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441411', '1570687866138206208', '1548901111999771026', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999771026","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441412', '1570687866138206208', '1548901111999771226', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999771226","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441413', '1570687866138206208', '1548901111999771326', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999771326","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441414', '1570687866138206208', '1548901111999771426', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999771426","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441415', '1570687866138206208', '1548901111999771526', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999771526","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441416', '1570687866138206208', '1548901111999771726', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999771726","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441417', '1570687866138206208', '1548901111999771826', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999771826","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441418', '1570687866138206208', '1548901111999771926', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999771926","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441419', '1570687866138206208', '1548901111999772026', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999772026","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441420', '1570687866138206208', '1548901111999772226', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999772226","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441421', '1570687866138206208', '1548901111999772326', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999772326","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441422', '1570687866138206208', '1548901111999772426', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999772426","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441423', '1570687866138206208', '1548901111999772526', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999772526","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441424', '1570687866138206208', '1548901111999772626', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999772626","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441425', '1570687866138206208', '1548901111999772726', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999772726","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441426', '1570687866138206208', '1548901111999772826', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999772826","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441427', '1570687866138206208', '1548901111999772926', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999772926","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441428', '1570687866138206208', '1548901111999773226', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773226","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441429', '1570687866138206208', '1548901111999773326', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773326","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441430', '1570687866138206208', '1548901111999773427', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773427","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441431', '1570687866138206208', '1548901111999773428', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773428","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441432', '1570687866138206208', '1548901111999773429', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773429","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441433', '1570687866138206208', '1548901111999773430', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773430","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441434', '1570687866138206208', '1548901111999773431', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773431","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441435', '1570687866138206208', '1548901111999773432', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773432","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441436', '1570687866138206208', '1548901111999773433', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773433","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441437', '1570687866138206208', '1548901111999773434', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773434","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441438', '1570687866138206208', '1548901111999773435', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773435","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441439', '1570687866138206208', '1548901111999773436', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773436","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441440', '1570687866138206208', '1548901111999773437', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773437","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441441', '1570687866138206208', '1548901111999773438', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773438","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441442', '1570687866138206208', '1548901111999773439', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773439","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441443', '1570687866138206208', '1548901111999773440', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773440","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441444', '1570687866138206208', '1548901111999773441', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773441","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441445', '1570687866138206208', '1548901111999773442', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773442","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441446', '1570687866138206208', '1548901111999773443', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773443","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441447', '1570687866138206208', '1548901111999773444', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773444","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441448', '1570687866138206208', '1548901111999773445', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773445","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441449', '1570687866138206208', '1548901111999773978', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773978","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195223441450', '1570687866138206208', '1548901111999773979', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773979","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571054195286355970', '1570687866138206208', '1548901111999773980', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773980","buttonInfo":[]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991599063041', '1570687866138206208', '/biz/org/add', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/org/add"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991603257345', '1570687866138206208', '/biz/org/delete', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/org/delete"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991603257346', '1570687866138206208', '/biz/org/detail', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/org/detail"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991603257347', '1570687866138206208', '/biz/org/edit', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/org/edit"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991603257348', '1570687866138206208', '/biz/org/orgTreeSelector', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/org/orgTreeSelector"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991603257349', '1570687866138206208', '/biz/org/page', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/org/page"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991603257350', '1570687866138206208', '/biz/org/tree', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/org/tree"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991603257351', '1570687866138206208', '/biz/org/userSelector', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/org/userSelector"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991603257352', '1570687866138206208', '/biz/position/add', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/position/add"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991603257353', '1570687866138206208', '/biz/position/delete', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/position/delete"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991603257354', '1570687866138206208', '/biz/position/detail', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/position/detail"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235915472899', '1570687866138206209', '/biz/user/delete', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/delete"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235915472900', '1570687866138206209', '/biz/user/detail', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/detail"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235915472901', '1570687866138206209', '/biz/user/disableUser', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/disableUser"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235915472902', '1570687866138206209', '/biz/user/edit', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/edit"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235915472903', '1570687866138206209', '/biz/user/enableUser', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/enableUser"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235915472904', '1570687866138206209', '/biz/user/export', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/export"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235915472905', '1570687866138206209', '/biz/user/grantRole', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/grantRole"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235915472906', '1570687866138206209', '/biz/user/import', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/import"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235915472907', '1570687866138206209', '/biz/user/orgListSelector', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/orgListSelector"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235915472908', '1570687866138206209', '/biz/user/orgTreeSelector', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/orgTreeSelector"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235915472909', '1570687866138206209', '/biz/user/ownRole', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/ownRole"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235915472910', '1570687866138206209', '/biz/user/page', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/page"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235923861505', '1570687866138206209', '/biz/user/positionSelector', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/positionSelector"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235923861506', '1570687866138206209', '/biz/user/resetPassword', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/resetPassword"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235923861507', '1570687866138206209', '/biz/user/roleSelector', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/roleSelector"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1570792235923861508', '1570687866138206209', '/biz/user/userSelector', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/userSelector"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991603257355', '1570687866138206208', '/biz/position/edit', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/position/edit"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991603257356', '1570687866138206208', '/biz/position/orgTreeSelector', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/position/orgTreeSelector"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991603257357', '1570687866138206208', '/biz/position/page', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/position/page"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991603257358', '1570687866138206208', '/biz/position/positionSelector', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/position/positionSelector"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991603257359', '1570687866138206208', '/biz/user/add', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/add"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991603257360', '1570687866138206208', '/biz/user/delete', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/delete"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991603257361', '1570687866138206208', '/biz/user/detail', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/detail"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991603257362', '1570687866138206208', '/biz/user/disableUser', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/disableUser"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991603257363', '1570687866138206208', '/biz/user/edit', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/edit"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991611645954', '1570687866138206208', '/biz/user/enableUser', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/enableUser"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991611645955', '1570687866138206208', '/biz/user/export', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/export"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991611645956', '1570687866138206208', '/biz/user/grantRole', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/grantRole"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991611645957', '1570687866138206208', '/biz/user/import', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/import"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991611645958', '1570687866138206208', '/biz/user/orgListSelector', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/orgListSelector"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991611645959', '1570687866138206208', '/biz/user/orgTreeSelector', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/orgTreeSelector"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991611645960', '1570687866138206208', '/biz/user/ownRole', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/ownRole"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991611645961', '1570687866138206208', '/biz/user/page', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/page"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991611645962', '1570687866138206208', '/biz/user/positionSelector', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/positionSelector"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991611645963', '1570687866138206208', '/biz/user/resetPassword', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/resetPassword"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991611645964', '1570687866138206208', '/biz/user/roleSelector', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/roleSelector"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571089991611645965', '1570687866138206208', '/biz/user/userSelector', 'SYS_ROLE_HAS_PERMISSION', '{"scopeCategory":"SCOPE_ALL","scopeDefineOrgIdList":[],"apiUrl":"/biz/user/userSelector"}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571133996951502849', '1570687866138206209', '1548901111999773978', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773978","buttonInfo":["1571129529564758017","1571129929961406466","1571130756155408386","1571130811058847745"]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571133996951502850', '1570687866138206209', '1548901111999773979', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773979","buttonInfo":["1571130973294526465","1571131043532341249","1571131137006600193","1571131427361488898","1571131544973967361","1571131727656878081","1571132076853657601"]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571133996951502851', '1570687866138206209', '1548901111999773980', 'SYS_ROLE_HAS_RESOURCE', '{"menuId":"1548901111999773980","buttonInfo":["1571132393993371649","1571132468178026497","1571132576143605761","1571132658851086338"]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571134629653872641', '1543837863788879872', NULL, 'SYS_USER_WORKBENCH_DATA', '{"shortcut":[{"id":"1548901111999770527","title":"个人中心","icon":"appstore-outlined","path":"/usercenter"},{"id":"1548901111999772426","title":"系统配置","icon":"appstore-outlined","path":"/sys/config"}]}'); +INSERT INTO "SNOWY"."SYS_RELATION" VALUES ('1571134629653872642', '1543837863788879873', NULL, 'SYS_USER_WORKBENCH_DATA', '{"shortcut":[{"id":"1548901111999770527","title":"个人中心","icon":"appstore-outlined","path":"/usercenter"},{"id":"1548901111999773978","title":"机构管理","icon":"appstore-outlined","path":"/biz/org"},{"id":"1548901111999773979","title":"人员管理","icon":"appstore-outlined","path":"/biz/user"},{"id":"1548901111999773980","title":"岗位管理","icon":"appstore-outlined","path":"/biz/position"}]}'); + +-- ---------------------------- +-- Table structure for SYS_RESOURCE +-- ---------------------------- +DROP TABLE "SNOWY"."SYS_RESOURCE"; +CREATE TABLE "SNOWY"."SYS_RESOURCE" ( + "ID" NVARCHAR2(20) NOT NULL, + "PARENT_ID" NVARCHAR2(255), + "TITLE" NVARCHAR2(255), + "NAME" NVARCHAR2(255), + "CODE" NVARCHAR2(255), + "CATEGORY" NVARCHAR2(255), + "MODULE" NVARCHAR2(255), + "MENU_TYPE" NVARCHAR2(255), + "PATH" NCLOB, + "COMPONENT" NVARCHAR2(255), + "ICON" NVARCHAR2(255), + "COLOR" NVARCHAR2(255), + "SORT_CODE" NUMBER(11,0), + "EXT_JSON" NCLOB, + "DELETE_FLAG" NVARCHAR2(255), + "CREATE_TIME" DATE, + "CREATE_USER" NVARCHAR2(20), + "UPDATE_TIME" DATE, + "UPDATE_USER" NVARCHAR2(20) +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SNOWY"."SYS_RESOURCE"."PARENT_ID" IS '父id'; +COMMENT ON COLUMN "SNOWY"."SYS_RESOURCE"."TITLE" IS '标题'; +COMMENT ON COLUMN "SNOWY"."SYS_RESOURCE"."NAME" IS '别名'; +COMMENT ON COLUMN "SNOWY"."SYS_RESOURCE"."CODE" IS '编码'; +COMMENT ON COLUMN "SNOWY"."SYS_RESOURCE"."CATEGORY" IS '分类'; +COMMENT ON COLUMN "SNOWY"."SYS_RESOURCE"."MODULE" IS '模块'; +COMMENT ON COLUMN "SNOWY"."SYS_RESOURCE"."MENU_TYPE" IS '菜单类型'; +COMMENT ON COLUMN "SNOWY"."SYS_RESOURCE"."PATH" IS '路径'; +COMMENT ON COLUMN "SNOWY"."SYS_RESOURCE"."COMPONENT" IS '组件'; +COMMENT ON COLUMN "SNOWY"."SYS_RESOURCE"."ICON" IS '图标'; +COMMENT ON COLUMN "SNOWY"."SYS_RESOURCE"."COLOR" IS '颜色'; +COMMENT ON COLUMN "SNOWY"."SYS_RESOURCE"."SORT_CODE" IS '排序码'; +COMMENT ON COLUMN "SNOWY"."SYS_RESOURCE"."EXT_JSON" IS '扩展信息'; +COMMENT ON COLUMN "SNOWY"."SYS_RESOURCE"."DELETE_FLAG" IS '删除标志'; +COMMENT ON COLUMN "SNOWY"."SYS_RESOURCE"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SNOWY"."SYS_RESOURCE"."CREATE_USER" IS '创建用户'; +COMMENT ON COLUMN "SNOWY"."SYS_RESOURCE"."UPDATE_TIME" IS '修改时间'; +COMMENT ON COLUMN "SNOWY"."SYS_RESOURCE"."UPDATE_USER" IS '修改用户'; +COMMENT ON TABLE "SNOWY"."SYS_RESOURCE" IS '资源'; + +-- ---------------------------- +-- Records of SYS_RESOURCE +-- ---------------------------- +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999770525', NULL, '系统', NULL, 'system', 'MODULE', NULL, NULL, NULL, NULL, 'appstore-add-outlined', '#05a045', '1', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999770526', NULL, '系统首页', 'index', 'system', 'SPA', NULL, 'MENU', '/index', 'index/index', 'home-outlined', NULL, '2', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 17:21:06', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999770527', NULL, '个人中心', 'userCenter', 'system', 'SPA', NULL, 'MENU', '/usercenter', 'sys/user/userCenter', 'appstore-outlined', NULL, '3', NULL, 'NOT_DELETE', TO_DATE('2022-07-23 16:58:25', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999770726', '0', '组织架构', NULL, 'wxq116zcyp', 'MENU', '1548901111999770525', 'CATALOG', '/e4y8y7ib2p', NULL, 'apartment-outlined', NULL, '4', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999770826', '1548901111999770726', '组织管理', 'sysOrg', '7scuix7595', 'MENU', '1548901111999770525', 'MENU', '/sys/org', 'sys/org/index', 'cluster-outlined', NULL, '5', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999770926', '1548901111999770726', '用户管理', 'sysUser', 'ue0wd497yb', 'MENU', '1548901111999770525', 'MENU', '/sys/user', 'sys/user/index', 'user-outlined', NULL, '6', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999771026', '1548901111999770726', '职位管理', 'sysPosition', 'fkbckffqxi', 'MENU', '1548901111999770525', 'MENU', '/sys/position', 'sys/position/index', 'apartment-outlined', NULL, '7', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999771126', '0', '权限管控', NULL, 'k7av3f3rg6', 'MENU', '1548901111999770525', 'CATALOG', '/5k9uuuzafi', NULL, 'user-switch-outlined', NULL, '8', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999771226', '1548901111999771126', '角色管理', 'sysRole', 'hwjxhcg122', 'MENU', '1548901111999770525', 'MENU', '/sys/role', 'sys/role/index', 'deployment-unit-outlined', NULL, '9', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999771326', '1548901111999771126', '模块管理', 'sysModule', 'opli26z18q', 'MENU', '1548901111999770525', 'MENU', '/sys/module', 'sys/resource/module/index', 'appstore-add-outlined', NULL, '10', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999771426', '1548901111999771126', '菜单管理', 'sysMenu', 'q38j3bb839', 'MENU', '1548901111999770525', 'MENU', '/sys/menu', 'sys/resource/menu/index', 'pic-left-outlined', NULL, '11', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999771526', '1548901111999771126', '单页管理', 'sysSpa', '8mm06l6wwu', 'MENU', '1548901111999770525', 'MENU', '/sys/spa', 'sys/resource/spa/index', 'pic-center-outlined', NULL, '12', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999771626', '0', '基础工具', NULL, 'nplvu771br', 'MENU', '1548901111999770525', 'CATALOG', '/ozmlc6eyw5', NULL, 'tool-outlined', NULL, '13', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999771726', '1548901111999771626', '文件管理', 'devFile', 'n25k83x4sy', 'MENU', '1548901111999770525', 'MENU', '/dev/file/index', 'dev/file/index', 'copy-outlined', NULL, '14', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999771826', '1548901111999771626', '邮件推送', 'devEmail', 'x4fx2a91tq', 'MENU', '1548901111999770525', 'MENU', '/dev/email/index', 'dev/email/index', 'send-outlined', NULL, '15', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999771926', '1548901111999771626', '短信发送', 'devSms', 'nnjsr7tkrs', 'MENU', '1548901111999770525', 'MENU', '/dev/sms/index', 'dev/sms/index', 'mail-outlined', NULL, '16', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999772026', '1548901111999771626', '站内信息', 'devMessage', '0yitzu8786', 'MENU', '1548901111999770525', 'MENU', '/dev/message/index', 'dev/message/index', 'message-outlined', NULL, '17', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999772126', '0', '系统运维', NULL, '3poiqgf7zx', 'MENU', '1548901111999770525', 'CATALOG', '/a0l7fxfq3m', NULL, 'hdd-outlined', NULL, '18', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999772226', '1548901111999772126', '三方用户', 'authThird', 'xf89fmzrtz', 'MENU', '1548901111999770525', 'MENU', '/auth/third', 'auth/third/index', 'team-outlined', NULL, '19', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999772326', '1548901111999772126', '数据字典', 'devDict', 'pzr1auhqf3', 'MENU', '1548901111999770525', 'MENU', '/sys/dict', 'dev/dict/index', 'file-search-outlined', NULL, '20', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999772426', '1548901111999772126', '系统配置', 'devConfig', '38zmn86vxg', 'MENU', '1548901111999770525', 'MENU', '/sys/config', 'dev/config/index', 'setting-outlined', NULL, '21', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999772526', '1548901111999772126', '任务调度', 'devJob', 'mj2p3y3hzq', 'MENU', '1548901111999770525', 'MENU', '/dev/job', 'dev/job/index', 'field-time-outlined', NULL, '22', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999772626', '1548901111999772126', '会话管理', 'authMonitor', '4x1fpyaxys', 'MENU', '1548901111999770525', 'MENU', '/auth/monitor', 'auth/monitor/index', 'usergroup-delete-outlined', NULL, '23', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999772726', '1548901111999772126', '系统监控', 'devMonitor', 'sugg84qph2', 'MENU', '1548901111999770525', 'MENU', '/dev/monitor', 'dev/monitor/index', 'database-outlined', NULL, '24', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999772826', '1548901111999772126', '连接监控', '连接监控', '1xw98nknao', 'MENU', '1548901111999770525', 'IFRAME', 'http://localhost:82/druid/index.html', NULL, 'console-sql-outlined', NULL, '25', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999772926', '1548901111999772126', '接口文档', 'jieKouWenDang', 'ookzmx37dt', 'MENU', '1548901111999770525', 'IFRAME', 'http://localhost:82/doc.html', NULL, 'file-word-outlined', NULL, '26', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773126', '1548901111999772126', '日志审计', NULL, 'i7wpmggo6a', 'MENU', '1548901111999770525', 'CATALOG', '/x1vjuegii4', NULL, 'robot-outlined', NULL, '27', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773226', '1548901111999773126', '访问日志', 'devVislog', 'gr29jwaigx', 'MENU', '1548901111999770525', 'MENU', '/dev/vislog', 'dev/log/vislog/index', 'bars-outlined', NULL, '28', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773326', '1548901111999773126', '操作日志', 'devOplog', '4jbjjrz8h7', 'MENU', '1548901111999770525', 'MENU', '/dev/oplog', 'dev/log/oplog/index', 'bars-outlined', NULL, '29', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773426', '0', '开发示例', NULL, 'kyd5idwiwr', 'MENU', '1548901111999770525', 'CATALOG', '/e2re4evf5y', NULL, 'project-outlined', NULL, '30', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773427', '1548901111999773426', '图标选择', 'tuBiaoXuanZe', '97ygt0hy8t', 'MENU', '1548901111999770525', 'MENU', '/exm/iconSelect', 'exm/iconSelect/index', 'appstore-outlined', NULL, '31', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773428', '1548901111999773426', 'ECK线图', 'eCKXianTu', '7voetv0mru', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/eCKXianTu', 'exm/chart/eCKXianTu', 'appstore-outlined', NULL, '32', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773429', '1548901111999773426', 'EC仪表图', 'eCYiBiaoTu', 'c4uor9wg1b', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/eCYiBiaoTu', 'exm/chart/eCYiBiaoTu', 'appstore-outlined', NULL, '33', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773430', '1548901111999773426', 'EC散点图', 'eCSanDianTu', '6r6ti8izxi', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/eCSanDianTu', 'exm/chart/eCSanDianTu', 'appstore-outlined', NULL, '34', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773431', '1548901111999773426', 'EC柱状图', 'eCZhuZhuangTu', 's3ft1ri9qz', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/eCZhuZhuangTu', 'exm/chart/eCZhuZhuangTu', 'appstore-outlined', NULL, '35', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773432', '1548901111999773426', 'EC树形图', 'eCShuXingTu', '63lz6owubp', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/eCShuXingTu', 'exm/chart/eCShuXingTu', 'appstore-outlined', NULL, '36', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773433', '1548901111999773426', 'EC漏斗图', 'eCLouDouTu', 'd46vov3j2d', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/eCLouDouTu', 'exm/chart/eCLouDouTu', 'appstore-outlined', NULL, '37', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773434', '1548901111999773426', 'EC线形图', 'eCXianXingTu', 'dgp8hclhlr', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/eCXianXingTu', 'exm/chart/eCXianXingTu', 'appstore-outlined', NULL, '38', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773435', '1548901111999773426', 'EC饼状图', 'eCBingZhuangTu', '2y1g7u2p1k', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/eCBingZhuangTu', 'exm/chart/eCBingZhuangTu', 'appstore-outlined', NULL, '39', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773436', '1548901111999773426', 'G2进度图', 'g2JinDuTu', '8vvhyctv2w', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/g2JinDuTu', 'exm/chart/g2JinDuTu', 'appstore-outlined', NULL, '40', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773437', '1548901111999773426', 'G2子弹图', 'g2ZiDanTu', '3lgc3ci5f3', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/g2ZiDanTu', 'exm/chart/g2ZiDanTu', 'appstore-outlined', NULL, '41', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773438', '1548901111999773426', 'G2散点图', 'g2SanDianTu', 'e22qm4b30d', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/g2SanDianTu', 'exm/chart/g2SanDianTu', 'appstore-outlined', NULL, '42', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773439', '1548901111999773426', 'G2柱状图', 'g2ZhuZhuangTu', '92huf33fcf', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/g2ZhuZhuangTu', 'exm/chart/g2ZhuZhuangTu', 'appstore-outlined', NULL, '43', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773440', '1548901111999773426', 'G2漏斗图', 'g2LouDouTu', '7w3gnlts80', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/g2LouDouTu', 'exm/chart/g2LouDouTu', 'appstore-outlined', NULL, '44', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773441', '1548901111999773426', 'G2折线图', 'g2ZheXianTu', '4g3gr90z1i', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/g2ZheXianTu', 'exm/chart/g2ZheXianTu', 'appstore-outlined', NULL, '45', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773442', '1548901111999773426', 'G2词云图', 'g2CiYunTu', 'atpbicf8em', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/g2CiYunTu', 'exm/chart/g2CiYunTu', 'appstore-outlined', NULL, '46', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773443', '1548901111999773426', 'G2面积图', 'g2MianJiTu', 'm5lnxo3d56', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/g2MianJiTu', 'exm/chart/g2MianJiTu', 'appstore-outlined', NULL, '47', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773444', '1548901111999773426', 'G2饼状图', 'g2BingZhuangTu', 'tmn482a18x', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/g2BingZhuangTu', 'exm/chart/g2BingZhuangTu', 'appstore-outlined', NULL, '48', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773445', '1548901111999773426', 'G2条形图', 'g2TiaoXingTu', 'aej0gwpe43', 'MENU', '1548901111999770525', 'MENU', '/exm/chart/g2TiaoXingTu', 'exm/chart/g2TiaoXingTu', 'appstore-outlined', NULL, '49', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773976', NULL, '业务', NULL, 'system', 'MODULE', NULL, NULL, NULL, NULL, 'profile-outlined', '#d81b43', '50', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773977', '0', '公司架构', NULL, '3xavzjxt5z', 'MENU', '1548901111999773976', 'CATALOG', '/1nlpdpnief', NULL, 'cluster-outlined', NULL, '51', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773978', '1548901111999773977', '机构管理', 'bizOrg', 'mnt1f21q40', 'MENU', '1548901111999773976', 'MENU', '/biz/org', 'biz/org/index', 'cluster-outlined', NULL, '52', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773979', '1548901111999773977', '人员管理', 'bizUser', '38dptg40lo', 'MENU', '1548901111999773976', 'MENU', '/biz/user', 'biz/user/index', 'user-outlined', NULL, '53', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1548901111999773980', '1548901111999773977', '岗位管理', 'bizPosition', 'l6b7kcqaji', 'MENU', '1548901111999773976', 'MENU', '/biz/position', 'biz/position/index', 'apartment-outlined', NULL, '54', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 13:45:57', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1571129529564758017', '1548901111999773978', '新增机构', NULL, 'bizOrgAdd', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, '1', NULL, 'NOT_DELETE', TO_DATE('2022-09-17 21:30:45', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1571129929961406466', '1548901111999773978', '批量删除', NULL, 'bizOrgBatchDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, '2', NULL, 'NOT_DELETE', TO_DATE('2022-09-17 21:32:20', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1571130756155408386', '1548901111999773978', '编辑机构', NULL, 'bizOrgEdit', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, '3', NULL, 'NOT_DELETE', TO_DATE('2022-09-17 21:35:37', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1571130811058847745', '1548901111999773978', '删除机构', NULL, 'bizOrgDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, '4', NULL, 'NOT_DELETE', TO_DATE('2022-09-17 21:35:50', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1571130973294526465', '1548901111999773979', '新增人员', NULL, 'bizUserAdd', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, '1', NULL, 'NOT_DELETE', TO_DATE('2022-09-17 21:36:29', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1571131043532341249', '1548901111999773979', '批量删除', NULL, 'bizUserBatchDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, '2', NULL, 'NOT_DELETE', TO_DATE('2022-09-17 21:36:46', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1571131137006600193', '1548901111999773979', '编辑人员', NULL, 'bizUserEdit', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, '3', NULL, 'NOT_DELETE', TO_DATE('2022-09-17 21:37:08', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1571131427361488898', '1548901111999773979', '授权角色', NULL, 'bizUserGrantRole', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, '4', NULL, 'NOT_DELETE', TO_DATE('2022-09-17 21:38:17', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1571131544973967361', '1548901111999773979', '重置密码', NULL, 'bizUserPwdReset', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, '5', NULL, 'NOT_DELETE', TO_DATE('2022-09-17 21:38:45', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1571131727656878081', '1548901111999773979', '删除人员', NULL, 'bizUserDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, '6', NULL, 'NOT_DELETE', TO_DATE('2022-09-17 21:39:29', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1571132076853657601', '1548901111999773979', '启用禁用', NULL, 'bizUserUpdataStatus', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, '7', NULL, 'NOT_DELETE', TO_DATE('2022-09-17 21:40:52', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1571132393993371649', '1548901111999773980', '新增岗位', NULL, 'bizPositionAdd', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, '1', NULL, 'NOT_DELETE', TO_DATE('2022-09-17 21:42:08', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1571132468178026497', '1548901111999773980', '批量删除', NULL, 'bizPositionBatchDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, '2', NULL, 'NOT_DELETE', TO_DATE('2022-09-17 21:42:25', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1571132576143605761', '1548901111999773980', '编辑岗位', NULL, 'bizPositionEdit', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, '3', NULL, 'NOT_DELETE', TO_DATE('2022-09-17 21:42:51', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('1571132658851086338', '1548901111999773980', '删除岗位', NULL, 'bizPositionDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, '4', NULL, 'NOT_DELETE', TO_DATE('2022-09-17 21:43:11', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); + +-- ---------------------------- +-- Table structure for SYS_ROLE +-- ---------------------------- +DROP TABLE "SNOWY"."SYS_ROLE"; +CREATE TABLE "SNOWY"."SYS_ROLE" ( + "ID" NVARCHAR2(20) NOT NULL, + "ORG_ID" NVARCHAR2(20), + "NAME" NVARCHAR2(255), + "CODE" NVARCHAR2(255), + "CATEGORY" NVARCHAR2(255), + "SORT_CODE" NUMBER(11,0), + "EXT_JSON" NCLOB, + "DELETE_FLAG" NVARCHAR2(255), + "CREATE_TIME" DATE, + "CREATE_USER" NVARCHAR2(20), + "UPDATE_TIME" DATE, + "UPDATE_USER" NVARCHAR2(20) +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SNOWY"."SYS_ROLE"."ORG_ID" IS '组织id'; +COMMENT ON COLUMN "SNOWY"."SYS_ROLE"."NAME" IS '名称'; +COMMENT ON COLUMN "SNOWY"."SYS_ROLE"."CODE" IS '编码'; +COMMENT ON COLUMN "SNOWY"."SYS_ROLE"."CATEGORY" IS '分类'; +COMMENT ON COLUMN "SNOWY"."SYS_ROLE"."SORT_CODE" IS '排序码'; +COMMENT ON COLUMN "SNOWY"."SYS_ROLE"."EXT_JSON" IS '扩展信息'; +COMMENT ON COLUMN "SNOWY"."SYS_ROLE"."DELETE_FLAG" IS '删除标志'; +COMMENT ON COLUMN "SNOWY"."SYS_ROLE"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SNOWY"."SYS_ROLE"."CREATE_USER" IS '创建用户'; +COMMENT ON COLUMN "SNOWY"."SYS_ROLE"."UPDATE_TIME" IS '修改时间'; +COMMENT ON COLUMN "SNOWY"."SYS_ROLE"."UPDATE_USER" IS '修改用户'; +COMMENT ON TABLE "SNOWY"."SYS_ROLE" IS '角色'; + +-- ---------------------------- +-- Records of SYS_ROLE +-- ---------------------------- +INSERT INTO "SNOWY"."SYS_ROLE" VALUES ('1570687866138206208', NULL, '超级管理员', 'superAdmin', 'GLOBAL', '1', NULL, 'NOT_DELETE', TO_DATE('2022-07-06 23:51:10', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_ROLE" VALUES ('1570687866138206209', NULL, '业务管理员', 'bizAdmin', 'GLOBAL', '2', NULL, 'NOT_DELETE', TO_DATE('2022-07-06 23:51:10', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); + +-- ---------------------------- +-- Table structure for SYS_USER +-- ---------------------------- +DROP TABLE "SNOWY"."SYS_USER"; +CREATE TABLE "SNOWY"."SYS_USER" ( + "ID" NVARCHAR2(20) NOT NULL, + "AVATAR" NCLOB, + "SIGNATURE" NCLOB, + "ACCOUNT" NVARCHAR2(255), + "PASSWORD" NVARCHAR2(255), + "NAME" NVARCHAR2(255), + "NICKNAME" NVARCHAR2(255), + "GENDER" NVARCHAR2(255), + "AGE" NVARCHAR2(255), + "BIRTHDAY" NVARCHAR2(255), + "NATION" NVARCHAR2(255), + "NATIVE_PLACE" NVARCHAR2(255), + "HOME_ADDRESS" NCLOB, + "MAILING_ADDRESS" NCLOB, + "ID_CARD_TYPE" NVARCHAR2(255), + "ID_CARD_NUMBER" NVARCHAR2(255), + "CULTURE_LEVEL" NVARCHAR2(255), + "POLITICAL_OUTLOOK" NVARCHAR2(255), + "COLLEGE" NVARCHAR2(255), + "EDUCATION" NVARCHAR2(255), + "EDU_LENGTH" NVARCHAR2(255), + "DEGREE" NVARCHAR2(255), + "PHONE" NVARCHAR2(255), + "EMAIL" NVARCHAR2(255), + "HOME_TEL" NVARCHAR2(255), + "OFFICE_TEL" NVARCHAR2(255), + "EMERGENCY_CONTACT" NVARCHAR2(255), + "EMERGENCY_PHONE" NVARCHAR2(255), + "EMERGENCY_ADDRESS" NCLOB, + "EMP_NO" NVARCHAR2(255), + "ENTRY_DATE" NVARCHAR2(255), + "ORG_ID" NVARCHAR2(20), + "POSITION_ID" NVARCHAR2(20), + "POSITION_LEVEL" NVARCHAR2(255), + "DIRECTOR_ID" NVARCHAR2(20), + "POSITION_JSON" NCLOB, + "LAST_LOGIN_IP" NVARCHAR2(255), + "LAST_LOGIN_ADDRESS" NVARCHAR2(255), + "LAST_LOGIN_TIME" DATE, + "LAST_LOGIN_DEVICE" NCLOB, + "LATEST_LOGIN_IP" NVARCHAR2(255), + "LATEST_LOGIN_ADDRESS" NVARCHAR2(255), + "LATEST_LOGIN_TIME" DATE, + "LATEST_LOGIN_DEVICE" NCLOB, + "USER_STATUS" NVARCHAR2(255), + "SORT_CODE" NUMBER(11,0), + "EXT_JSON" NCLOB, + "DELETE_FLAG" NVARCHAR2(255), + "CREATE_TIME" DATE, + "CREATE_USER" NVARCHAR2(20), + "UPDATE_TIME" DATE, + "UPDATE_USER" NVARCHAR2(20) +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."AVATAR" IS '头像'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."SIGNATURE" IS '签名'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."ACCOUNT" IS '账号'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."PASSWORD" IS '密码'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."NAME" IS '姓名'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."NICKNAME" IS '昵称'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."GENDER" IS '性别'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."AGE" IS '年龄'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."BIRTHDAY" IS '出生日期'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."NATION" IS '民族'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."NATIVE_PLACE" IS '籍贯'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."HOME_ADDRESS" IS '家庭住址'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."MAILING_ADDRESS" IS '通信地址'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."ID_CARD_TYPE" IS '证件类型'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."ID_CARD_NUMBER" IS '证件号码'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."CULTURE_LEVEL" IS '文化程度'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."POLITICAL_OUTLOOK" IS '政治面貌'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."COLLEGE" IS '毕业院校'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."EDUCATION" IS '学历'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."EDU_LENGTH" IS '学制'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."DEGREE" IS '学位'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."PHONE" IS '手机'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."EMAIL" IS '邮箱'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."HOME_TEL" IS '家庭电话'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."OFFICE_TEL" IS '办公电话'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."EMERGENCY_CONTACT" IS '紧急联系人'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."EMERGENCY_PHONE" IS '紧急联系人电话'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."EMERGENCY_ADDRESS" IS '紧急联系人地址'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."EMP_NO" IS '员工编号'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."ENTRY_DATE" IS '入职日期'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."ORG_ID" IS '机构id'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."POSITION_ID" IS '职位id'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."POSITION_LEVEL" IS '职级'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."DIRECTOR_ID" IS '主管id'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."POSITION_JSON" IS '兼任信息'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."LAST_LOGIN_IP" IS '上次登录ip'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."LAST_LOGIN_ADDRESS" IS '上次登录地点'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."LAST_LOGIN_TIME" IS '上次登录时间'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."LAST_LOGIN_DEVICE" IS '上次登录设备'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."LATEST_LOGIN_IP" IS '最新登录ip'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."LATEST_LOGIN_ADDRESS" IS '最新登录地点'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."LATEST_LOGIN_TIME" IS '最新登录时间'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."LATEST_LOGIN_DEVICE" IS '最新登录设备'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."USER_STATUS" IS '用户状态'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."SORT_CODE" IS '排序码'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."EXT_JSON" IS '扩展信息'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."DELETE_FLAG" IS '删除标志'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."CREATE_USER" IS '创建用户'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."UPDATE_TIME" IS '修改时间'; +COMMENT ON COLUMN "SNOWY"."SYS_USER"."UPDATE_USER" IS '修改用户'; +COMMENT ON TABLE "SNOWY"."SYS_USER" IS '用户'; + +-- ---------------------------- +-- Records of SYS_USER +-- ---------------------------- +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879878', 'data:image/jpg;base64,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', NULL, '15908672124', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '云固之', NULL, '男', NULL, '1993-06-23', '汉', '四川省雅安市', '四川省雅安市汉源县太湖路60号-10-2', '四川省雅安市汉源县太湖路60号-10-2', '身份证', '27a4b13b0a7002741e8ad30f5320d9daf344b40899e39dd6b6b9c067f69359e2', NULL, NULL, NULL, NULL, NULL, NULL, 'daea642d9f27fc9a4249e52c6ae7b2c8', 'p77bq7@gmail.com', NULL, NULL, '鲍悦昭', '75a49ecae12de82ad9eb0aff1dd12ab5', '甘肃省庆阳市合水县高邮湖街101号-19-9', '0006', '2022-07-04', '1543842934270394369', '1543899639134019586', 'A1', '1543837863788879875', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '7', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879879', 'data:image/jpg;base64,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', NULL, '15908667640', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '范卿', NULL, '男', NULL, '1995-07-23', '汉', '云南省保山市', '云南省保山市腾冲县虹桥广场150号-18-8', '云南省保山市腾冲县虹桥广场150号-18-8', '身份证', 'de6801ee98040b58dfdae96ac81cc25a94306372d1cd341544feddd7fae37125', NULL, NULL, NULL, NULL, NULL, NULL, 'a95c180457c251089d279654e254fbb5', 'zyss0q@yahoo.com.cn', NULL, NULL, '祝秀娟', '6a210e8e2a6f729bd1fb1828a1ebb88f', '四川省宜宾市翠屏区承德街147号-16-5', '0007', '2022-07-04', '1543842934270394369', '1543899639134019587', 'A1', '1543837863788879875', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '8', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879880', 'data:image/jpg;base64,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', NULL, '15908623536', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '严裕', NULL, '男', NULL, '1996-04-29', '汉', '四川省凉山彝族自治州', '四川省凉山彝族自治州会东县上海路99号-19-6', '四川省凉山彝族自治州会东县上海路99号-19-6', '身份证', '3a71d8d49ab539966ec46f1de6555f927f1afb6974dee60288e8a9cf0a6b7d74', NULL, NULL, NULL, NULL, NULL, NULL, '1ccdb23d245c60988ecfa31fe14b536c', '5qvu6d304@sina.com', NULL, NULL, '杜燕彩', '85a5a355f7e5cfa0b9702fabb71e874c', '河南省南阳市西峡县仙居街48号-5-6', '0008', '2022-07-04', '1543842934270394370', '1543899639134019588', 'B1', '1543837863788879875', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '9', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879881', 'data:image/jpg;base64,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', NULL, '15908603811', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '酆善', NULL, '男', NULL, '1992-12-20', '汉', '河南省周口市', '河南省周口市太康县江南大厦133号-16-10', '河南省周口市太康县江南大厦133号-16-10', '身份证', '29c9a117e0376078fabd2dfcc86f8cbd2fb3ebef658d06d204b58d19abfb4a04', NULL, NULL, NULL, NULL, NULL, NULL, '74a678091f38cf1232ca58153c61d4be', '8qkg47z@yahoo.com.cn', NULL, NULL, '邹晨辰', '8f758b3158c299d6e0eff2e5bc1908c2', '四川省阿坝藏族羌族自治州九寨沟县锦州支街106号-15-10', '0009', '2022-07-04', '1543842934270394370', '1543899639134019589', 'C1', '1543837863788879880', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '10', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879882', 'data:image/jpg;base64,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', NULL, '15305134325', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '毛波宁', NULL, '男', NULL, '1996-07-04', '汉', '四川省成都市', '四川省成都市双流县胶东广场102号-17-7', '四川省成都市双流县胶东广场102号-17-7', '身份证', '6f607651c89f944255340c8575b4328a1f07edec4822c0206f760e32b77dfe4c', NULL, NULL, NULL, NULL, NULL, NULL, '48e02b9afade88c46b2115634afc9fdb', 'zycgp4t@hotmail.com', NULL, NULL, '吴武新', 'd320c8e979706442a8639262aac85332', '重庆市双桥区新安路36号-2-8', '0010', '2022-07-04', '1543842934270394370', '1543899639134019590', 'C1', '1543837863788879880', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '11', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879883', 'data:image/jpg;base64,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', NULL, '15908603096', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '穆彪博', NULL, '男', NULL, '1996-05-22', '汉', '四川省攀枝花市', '四川省攀枝花市米易县宁阳广场32号-11-3', '四川省攀枝花市米易县宁阳广场32号-11-3', '身份证', 'eba39b9e9fddbfd7018b724c3afed2239785f65375df41c939d8cdb4d88ca5db', NULL, NULL, NULL, NULL, NULL, NULL, '39413bf58c8e615b1d13c9ea02f2693e', 'cc7q52wg3@hotmail.com', NULL, NULL, '秦群豪', 'a7fa15ddf82381c9185a24c13106f4e3', '河北省保定市清苑县华城路14号-7-9', '0011', '2022-07-04', '1543842934270394371', '1543899639134019591', 'B1', '1543837863788879876', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '12', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879884', 'data:image/jpg;base64,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', NULL, '15908592273', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '廉飞彬', NULL, '男', NULL, '1993-06-03', '汉', '浙江省金华市', '浙江省金华市永康市伏龙山路124号-2-1', '浙江省金华市永康市伏龙山路124号-2-1', '身份证', '3c5dd54fe82e85855d4dc528e93c575f06d06cf04f13630403919cbe7b0777ee', NULL, NULL, NULL, NULL, NULL, NULL, '9ada4dea2a81004c6e3c1d1477a9d1de', 'lfdt9pu@sina.com', NULL, NULL, '花中', '820ac5bab156e90bf85252f03eb39e28', '新疆维吾尔自治区克孜勒苏柯尔克孜自治州阿克陶县标山路64号-20-8', '0012', '2022-07-04', '1543842934270394371', '1543899639134019592', 'C1', '1543837863788879883', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '13', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879891', 'data:image/jpg;base64,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', NULL, '15908368732', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '窦兴', NULL, '男', NULL, '1994-02-05', '汉', '辽宁省本溪市', '辽宁省本溪市桓仁满族自治县瑞金广场109号-14-9', '辽宁省本溪市桓仁满族自治县瑞金广场109号-14-9', '身份证', '08a6ea38575fae1719f7ad0b3a167478916364fa387dd3086883d470568be3f6', NULL, NULL, NULL, NULL, NULL, NULL, 'aac4286f3921b2ab731468e0dacd9925', 'lcrb7f@msn.com', NULL, NULL, '沈志', '0265797b6b9c06ae0dcd2795c63082e4', '四川省南充市嘉陵区安城街139号-10-8', '0019', '2022-07-04', '1543842934270394372', '1543899639134019598', 'C1', '1543837863788879887', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '20', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879892', 'data:image/jpg;base64,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', NULL, '15908297993', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '薛芬芳', NULL, '男', NULL, '1992-07-19', '汉', '四川省攀枝花市', '四川省攀枝花市仁和区红山峡支路58号-12-3', '四川省攀枝花市仁和区红山峡支路58号-12-3', '身份证', 'bff28644bd638f5c6c04e742bfb369e15050b821d450f5720ded9a8fd55774b0', NULL, NULL, NULL, NULL, NULL, NULL, '74842d64e30808b9bb7b7893e21124f8', '7pgsq34@0355.net', NULL, NULL, '秦家', '80df9c0b8a936b02de576bf160750040', '江苏省镇江市京口区雒口大厦69号-20-2', '0020', '2022-07-04', '1543842934270394373', '1543899639134019599', 'B1', '1543837863788879876', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '21', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879893', 'data:image/jpg;base64,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', NULL, '15908285297', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '史博', NULL, '男', NULL, '1996-01-25', '汉', '湖北省武汉市', '湖北省武汉市武昌区王家麦岛46号-15-8', '湖北省武汉市武昌区王家麦岛46号-15-8', '身份证', '107ae8f627cf538da955139e7e5603761167fd632b2d7774bac7cc3b8bef5723', NULL, NULL, NULL, NULL, NULL, NULL, '6c79b1646de72230890ff05e0ef7d2c0', '3ggkluh@live.com', NULL, NULL, '鲍伟刚', 'dea4367134492288d8c76d6ee65a717f', '四川省南充市澳门四街103号-2-7', '0021', '2022-07-04', '1543842934270394373', '1543899639134019600', 'C1', '1543837863788879892', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '22', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879894', 'data:image/jpg;base64,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', NULL, '15908277086', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '许鸣', NULL, '男', NULL, '1996-08-13', '汉', '贵州省遵义市', '贵州省遵义市红花岗区大港三街77号-3-3', '贵州省遵义市红花岗区大港三街77号-3-3', '身份证', 'bf04cdc0202e8e2a82362693d65d754609704c0c68c240677c4786b69e5bf1a1', NULL, NULL, NULL, NULL, NULL, NULL, '6653643bbd9cb5782ecd1382e953da31', 'xl4ir88t0@163.net', NULL, NULL, '金振壮', '8ef7175a29b3a41b353f78c6d49288a2', '湖北省黄石市西塞山区太湖路22号-12-9', '0022', '2022-07-04', '1543842934270394373', '1543899639134019601', 'C1', '1543837863788879892', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '23', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879895', 'data:image/jpg;base64,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', NULL, '15908264436', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '穆茂进', NULL, '男', NULL, '1995-04-22', '汉', '四川省资阳市', '四川省资阳市安岳县泰州五街127号-10-10', '四川省资阳市安岳县泰州五街127号-10-10', '身份证', 'fc4efd51f3a9f687aca5d9bd46582591d43e5e45dcc24fdb7afa79503bcbb614', NULL, NULL, NULL, NULL, NULL, NULL, '0f9476f31302d6471502fc10941b3c1a', '0mtggxah@aol.com', NULL, NULL, '钱翰', '515339b0ccee740ed1349cda87dcdc77', '江苏省南通市海安县漳州路一路121号-18-1', '0023', '2022-07-04', '1543842934270394373', '1543899639134019601', 'C1', '1543837863788879892', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '24', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879896', 'data:image/jpg;base64,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', NULL, '15908257238', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '顾永', NULL, '男', NULL, '1993-07-17', '汉', '山东省济宁市', '山东省济宁市泗水县大连街28号-17-8', '山东省济宁市泗水县大连街28号-17-8', '身份证', 'e48a07c883bdeda55953199d5dfc340986efb0d4901d56709928e53fc87347f7', NULL, NULL, NULL, NULL, NULL, NULL, 'd37adc7ddb7800cbabefa81d4a3b33e5', 'hequ2p2e2@hotmail.com', NULL, NULL, '熊竹霭', 'ce7d1f7d65f6636ad892b72cbbce80a4', '四川省广元市旺苍县闽江大厦67号-14-10', '0024', '2022-07-04', '1543842934270394373', '1543899639134019602', 'C1', '1543837863788879892', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '25', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879897', 'data:image/jpg;base64,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', NULL, '15908251128', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '赵时', NULL, '男', NULL, '1995-05-09', '汉', '四川省达州市', '四川省达州市达县四平路72号-7-1', '四川省达州市达县四平路72号-7-1', '身份证', 'e482a1277bdd7ace91c5b3ca3da2d1041a3e3823eed4d7b57eb6a7d996b3fc95', NULL, NULL, NULL, NULL, NULL, NULL, '94405a8df2105cd49091de9060e59642', '42fztu@sina.com', NULL, NULL, '明华', 'c51a112c654534d53f6a68fb0bcc1a7e', '重庆市南岸区台东东七广场49号-8-8', '0025', '2022-07-04', '1543842934270394373', '1543899639134019603', 'C1', '1543837863788879892', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '26', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879898', 'data:image/jpg;base64,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', NULL, '13605586796', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '鲁富顺', NULL, '男', NULL, '1993-10-27', '汉', '四川省凉山彝族自治州', '四川省凉山彝族自治州雷波县平原广场140号-5-10', '四川省凉山彝族自治州雷波县平原广场140号-5-10', '身份证', '8d5fe13a5834f7eff21fa4e9452d5e648806cfecf41adc48cad0b7a166fb7c68', NULL, NULL, NULL, NULL, NULL, NULL, '56bb8a81a3cd92fe15eb0bef5a69ae09', 'zvnqyh@yahoo.com', NULL, NULL, '周成', '18abdfaacf22e98ee36f83faebd8c84e', '四川省宜宾市南溪县南海支路74号-13-5', '0026', '2022-07-04', '1543842934270394374', '1543899639134019604', 'B1', '1543837863788879876', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '27', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879899', 'data:image/jpg;base64,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', NULL, '15908237312', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '沈强军', NULL, '男', NULL, '1996-10-11', '汉', '河南省新乡市', '河南省新乡市新乡县延吉街30号-3-9', '河南省新乡市新乡县延吉街30号-3-9', '身份证', '2415919dfae59002efcbd907a8ec94d363e0dcca9e794888dba4728da7a6cb75', NULL, NULL, NULL, NULL, NULL, NULL, '936a914a2d52f149ec1f5a3b33ec2668', '4rhm0e3o@sohu.com', NULL, NULL, '卜凝晓', 'e3ac875ef6cdb89917cfa45c76b55aa6', '四川省广安市广安区菜市一街35号-19-5', '0027', '2022-07-04', '1543842934270394374', '1543899639134019605', 'C1', '1543837863788879898', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '28', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879900', 'data:image/jpg;base64,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', NULL, '15908211381', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '沈亨奇', NULL, '男', NULL, '1993-11-19', '汉', '四川省广元市', '四川省广元市利州区西陵峡三路19号-16-9', '四川省广元市利州区西陵峡三路19号-16-9', '身份证', 'f358b393412ae1ec9244d7fdf587c155610e26ec556a0f14ce64db0654911a63', NULL, NULL, NULL, NULL, NULL, NULL, '1bc4a6bc514da03e093fd58cbf12c297', 'obaoi9zu@qq.com', NULL, NULL, '吕思', '2bb5701fde4f139dd5b81dd4125fde0f', '四川省眉山市青神县汕头街82号-7-6', '0028', '2022-07-04', '1543842934270394374', '1543899639134019606', 'C1', '1543837863788879898', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '29', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879901', 'data:image/jpg;base64,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', NULL, '15908190533', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '李霭', NULL, '男', NULL, '1995-09-20', '汉', '山东省临沂市', '山东省临沂市河东区台东东二路30号-4-7', '山东省临沂市河东区台东东二路30号-4-7', '身份证', 'e2ac0cac1f464fae34929cc2d99094492a3e9a1c8c95137ec9abf2a51ff9de2a', NULL, NULL, NULL, NULL, NULL, NULL, 'c3bddd55042b05976a948248813b16fc', 'uuiyxd0@aol.com', NULL, NULL, '罗策腾', '55aac30cc08356256e2e4c51306d0a71', '四川省绵阳市游仙区如东路56号-11-2', '0029', '2022-07-04', '1543842934270394374', '1543899639134019607', 'C1', '1543837863788879898', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '30', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879885', 'data:image/jpg;base64,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', NULL, '15908587949', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '王薇', NULL, '男', NULL, '1994-07-26', '汉', '四川省雅安市', '四川省雅安市石棉县东光大厦68号-18-6', '四川省雅安市石棉县东光大厦68号-18-6', '身份证', 'd8d62d828f405681c7cea6d344d702ac10696dd8958e28583703c74d3a19aea9', NULL, NULL, NULL, NULL, NULL, NULL, 'db488003a31156a054702588c3c83351', 'mrc03kcm@ask.com', NULL, NULL, '项固之', '35e63bfeb678f8bda348887b6a6c9e3f', '四川省阿坝藏族羌族自治州松潘县福州北路62号-8-6', '0013', '2022-07-04', '1543842934270394371', '1543899639134019593', 'C1', '1543837863788879883', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '14', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879886', 'data:image/jpg;base64,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', NULL, '15908548666', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '米姣', NULL, '男', NULL, '1994-06-19', '汉', '四川省泸州市', '四川省泸州市古蔺县平阴路15号-8-10', '四川省泸州市古蔺县平阴路15号-8-10', '身份证', '4b193a112e548eee61d8ed1fd00a439b94019cfb53b013722c1af87d36d246c8', NULL, NULL, NULL, NULL, NULL, NULL, '8474259d099205c4a76b05af817ff9ae', '7xf61s@163.com', NULL, NULL, '鲁晨辰', 'b8002a429b7bf45282fccee2a494c30a', '四川省巴中市新安路69号-11-10', '0014', '2022-07-04', '1543842934270394371', '1543899639134019594', 'C1', '1543837863788879883', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '15', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879887', 'data:image/jpg;base64,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', NULL, '15908491526', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '袁伟刚', NULL, '男', NULL, '1996-05-10', '汉', '山东省威海市', '山东省威海市荣成市昆明路71号-1-5', '山东省威海市荣成市昆明路71号-1-5', '身份证', 'adeca7f5993f0d16968a17fa7c4c577d3ad560279d87ddd748dc3b31d815b8be', NULL, NULL, NULL, NULL, NULL, NULL, '242ae50ebc8a00eb17eabd90aca9e186', 'twkqf2@yeah.net', NULL, NULL, '计伯', '525d77353b3bf7d054c410721534cf68', '四川省绵阳市北川羌族自治县恩县广场142号-4-9', '0015', '2022-07-04', '1543842934270394372', '1543899639134019595', 'B1', '1543837863788879876', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '16', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879888', 'data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCeiiivzs/RQooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAHwxmaeOIdXYKPxNbPiXRINH1aKys3mmLxhsNgnJJGOB7frVnwTqMlnra26RB/tRCEk42gZOa7h9adxrqpGFXT4/kkByWbYSePYivXwmDo1sO3KVm322sm/wAUeRjMZWo4hKMbxS773aX4M4LTPDq3emarcXRmgnsoywjK4ydpOCDz2o17w6umGwS0aaeS6jL7duTkY6AfWuwN7Zalomt31mxLS2f74bSMOI24yevGB+FSaheWGmNZahdt++is2Fum0/MxAzz2Pb8TXS8BQ9luunveXM/0OVY+v7bZ9fd8+VafeeZW9ndXcjR21tNM6jLLGhYj6gVZTQtWZ1U6beKCcbmt3wPc8V03gO4ku/EF/cTNukliLsfcsKln8ReKftMwttPeSBZGVHW1ZgQCR1HWuOlhKLpKrNvVvZdjuq4yuqzpQS0S3dtzJ1XwVqGm2sUsebxmba6QRlivHB9SOvaseTR9UijaSTTbxEUFmZoGAAHUk4r0CW88Sx6CmoDa1w2M2gs23jnH97Pv0rBvtf8AFMthcR3OnOkDxssjG1dcKRg8npWuJwmGi7pSV1fa/wCpjhsXiZKzcXZ23t+hyFFFFeMeyFFFFABRRRQBs+Fb6107X4Lm8JWNQwDAZ2kjGT7cmu4vLO303RtQe4uGkh1C6DvNGudqOR+gGefeuG8NWunXesImpTCOFQXAPCuRzgnsK6K78dr/AGhPBBbxSaeY/LTevGf7xH9329K9vA1adPDv2rSu3bvdrW67HiY+lUqYheyTdkr9rJ6Wfc2GvNPfwtq0GmoFtLaF4Vdejtt5x69Rz3pdU1PT7eLT9P1S3ElrdQ8vjOwgDn179R0rE129sNI8Kw6Rp86TPcgO8idxnJPtkjAHoK20hsNUOkat9viRLOPJQkcnA6nPGCK9BVZTbpxa5ko32tvqvRI850owSqST5W5W3vto/VsxfAiQnXdSe1D/AGYJhN5+bBbjP4CqS+L9Wt7p7GzSB1EzLGDGSTljjv71s6LrOmW416/SZPOaVpAhGNyDhMeuSf1qHSk8P+H9Oj1eW6+1XMqkoSPmz3Cr2PYk1ywjJUoRp1FG3M279LnXOUXVnKpTcr8qSt1sdVdSXyaS4gaJtRSEPtxkFu/HvggV5xe+M9WvLSa0nWAJIpR8RkH+dLF4vu18SHVXXMbDy2hB4EfoPfvn1rW8Q2nh/U9Mk1q2uhFKeqoM73PYr2Pv+PNGIxLxUG6E7ct7pu113DD4VYWaVeF+a1mlez7HDUUUV88fQhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB//9k=', NULL, '15908444664', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '姚庆', NULL, '男', NULL, '1996-08-21', '汉', '四川省成都市', '四川省成都市都江堰市新田路82号-20-10', '四川省成都市都江堰市新田路82号-20-10', '身份证', 'c3bceddc993558d5ee8c2e1bdd022ef9506ad6c7369d15ce9b4ee1b03f96fa60', NULL, NULL, NULL, NULL, NULL, NULL, '272ef93facfa31dcbaea22a9cdd19221', 'tkcz6uza@263.net', NULL, NULL, '王裕', '81a91bc6adb94ec8c28f87c698506211', '四川省凉山彝族自治州宁南县市场一路30号-12-4', '0016', '2022-07-04', '1543842934270394372', '1543899639134019596', 'C1', '1543837863788879887', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '17', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879889', 'data:image/jpg;base64,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', NULL, '15908443719', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '倪艳', NULL, '男', NULL, '1992-08-30', '汉', '四川省广元市', '四川省广元市剑阁县掖县路39号-10-6', '四川省广元市剑阁县掖县路39号-10-6', '身份证', '0123ef4a826c2fffdbe09afc56221acfdaa4cb93bc49714a6254b452788af023', NULL, NULL, NULL, NULL, NULL, NULL, '65fcbca18303e00cf1724ef0b9670459', 'rd11l7n@hotmail.com', NULL, NULL, '伍蕊薇', '2e1638f0f370c8a5333b99efdaf94024', '河南省洛阳市汝阳县山西广场64号-7-5', '0017', '2022-07-04', '1543842934270394372', '1543899639134019597', 'C1', '1543837863788879887', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '18', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879890', 'data:image/jpg;base64,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', NULL, '15908406065', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '戚冠', NULL, '男', NULL, '1993-01-11', '汉', '四川省阿坝藏族羌族自治州', '四川省阿坝藏族羌族自治州黑水县武胜关广场87号-19-3', '四川省阿坝藏族羌族自治州黑水县武胜关广场87号-19-3', '身份证', '9e688444b73b2469cdbb818b0d0fef47506ad6c7369d15ce9b4ee1b03f96fa60', NULL, NULL, NULL, NULL, NULL, NULL, '5d3368c5d171ab19d3bd5235501e15ee', 'qzak6n@gmail.com', NULL, NULL, '孔希', '815b2db3e64526f574998908a624bd23', '四川省攀枝花市东区无棣一路69号-6-3', '0018', '2022-07-04', '1543842934270394372', '1543899639134019598', 'C1', '1543837863788879887', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '19', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879871', 'data:image/jpg;base64,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', 'data:image/png;base64,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', 'superAdmin', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '超管', NULL, '男', NULL, '1990-01-01', '汉', '新疆维吾尔自治区乌鲁木齐市', '新疆维吾尔自治区乌鲁木齐市达坂城区大学广场97号-3-6', '新疆维吾尔自治区乌鲁木齐市达坂城区大学广场97号-3-6', '身份证', '5cabec9d8a98f62836a4f1cc3e29a423ba6c83bfca3b5d297c72611f62749b84', NULL, NULL, NULL, NULL, NULL, NULL, 'eb77186abe605f8de5958df60ef4a279', 'superAdmin@foxmail.com', NULL, NULL, '系统管理员', '9c8f683ccff14071f90f1f51ba83f069', '四川省成都市成华区大港三街83号-3-10', '0000', '2022-07-04', '1543842934270394376', '1543899639134019612', 'C1', '1543837863788879876', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '1', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879873', 'data:image/jpg;base64,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', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlIAAAFfCAYAAACFqSIwAAAgAElEQVR4Xu2dB/Q0RZW+nz8gCi4gIAioqKBiVsxZQV1FVGDNEcxZMcc1rXENmLMg5oyKac0BAwbMKKhgVlBAQUUE3f95oWa/oanq6e7pUN393nN+51Om4lM9M+9U3br3/2EzARMwARMwARNog8CfgK0iDZ0BXB04uo1O3EZeBP5fXsPxaEzABEzABExglAQ+DNy2ZORHAdcY5cw86FICFlJ+QEzABEzABExgfQLHAJctaeYk4MLrd+MWciNgIZXbing8JmACJmACYyTwQWCfkoGfDGw7xol5zOUELKT8hJiACZiACZhAOwQklrZONOUdqXYYZ9eKhVR2S+IBmYAJmIAJjJjAV4HrRsZ/InCREc/LQ08QsJDyo2ECJmACJmAC7RF4LPDCSHPekWqPcVYtWUhltRwejAmYgAmYwMgJPAp4SWQOZwKbjnxuHn6EgIWUHwsTMAETMAETaI/AJsA/gNj3636AnNJtEyJgITWhxfRUTMAETMAEsiDwKeDmkZEcChyQxQg9iNYIWEi1htINmYAJmIAJmMDZBPYFDouwUOTz1K0+oxspAQupkS6ch20CJmACJpA1gVS6GB/vZb1s9QdnIVWfmWuYgAmYgAmYwCoCbwb2jxT6PnCVVZX9+ngIWEiNZ608UhMwARMwgfEQSB3v/S+w0Xim4ZGuImAhtYqQXzcBEzABEzCBZgT+lbi9twtwfLMmXSs3AhZSua2Ix2MCJmACJjAVAqcDF4hMRjn3lE7GNgECFlITWERPwQRMwARMIEsCqdx7FlJZLlezQVlINePmWiZgAiZgAiawioDSwmzjHalVmMb9uoXUuNfPozcBEzABE8iXgIVUvmvT2sgspFpD6YZMwARMwARM4FwELKRm8EBYSM1gkT1FEzABEzCBQQhYSA2Cvd9OLaT65e3eTMAETMAE5kMgFd3czuYTegYspCa0mJ6KCZiACZhAVgT+AZwvMiILqayWab3BWEitx8+1TcAETMAETCBFIBWQc1fgOGObBgELqWmso2dhAiZgAiaQH4EzgU28I5XfwrQ5IgupNmm6LRMwgTkSeB5wd2Bj4MPAg+cIwXOOEjgV2MJCatpPh4XUtNfXszMBE+iWwCHAAYUuPgHs1W23bn0kBHxrbyQLtc4wLaTWoee6JmACcyfwd+D8BQj/C2w0dzCe/9kELKRm8CBYSM1gkT1FEzCBzgiknIl3AE7orFc3PBYCFlJjWak1xmkhtQY8VzUBE5g9gZSQ2hI4bfZ0DMBCagbPgIXUDBbZUzQBE+iMQEpI7QT8rrNe3fBYCFhIjWWl1hinhdQa8FzVBExg9gS8IzX7R6AUgIXUDJ4PC6kZLLKnaAIm0BmBlJDaBjils17d8FgIWEiNZaXWGKeF1BrwXNUETGD2BFJCamtAedZs8ybgOFIzWH8LqRkssqdoAibQGYEzgE0jrdvZvDPko2rYkc1HtVzNBmsh1Yyba5mACZiACKR2HCyk/HyIgGKKxcxHvxN6PiykJrSYnooJmEDvBCykekc+mg5vCnwuMtp/RIK4jmZSHuh5CVhI+akwARMwgeYELKSas5t6zQOBgyKTPAK40dQnP6f5WUjNabU9VxMwgbYJ2EeqbaLTae/NwP6R6TwTeMZ0pumZWEj5GTABEzCB5gRSPjB3A97ZvFnXnACB7wBXjcxjD+DzE5ifpxAIWEj5UTABEzCB5gRS4Q8U+uBSDoHQHOwEaqZEtkNjTGBxl6dgITWxBfV0TMAEeiXwZeD6iR4/COzX62jcWS4EUo7mvwAumcsgPY52CFhItcPRrZiACcyTwIWAXwJbJKYvISVBZZsXgZSj+YeAfeeFYvqztZCa/hp7hiZgAt0SSO0+qFcf8XXLPtfW7Wie68p0MC4LqQ6gukkTMIHZEXgp8MjErOV0vPvsiMx7wscAl40gsKP5BJ8LC6kJLqqnZAIm0DsBHfFJMF0i0fOzgKf3Pip3OBQBO5oPRX6Afi2kBoDuLk3ABCZJoOyI73fATpOctSdVJHA/4A0RLH8HNjOu6RGwkJremnpGJmACwxF4P/Afke7lK6Vr77bpE3gl8NDINH8P7Dj96c9vhhZS/az5DcMV6U8DR/XTpXsxARMYgMDtAN3MKtrxwC4DjMdd9k/gHcBdI90eChzQ/3DcY9cELKS6JgxfAa631M0ngVt23617MAETGIDAnsBnIv1+FrjZAONxl/0TcETz/pkP2qOFVLf45Vway6l0f+CN3Xbt1k3ABAYgYCE1APTMurSjeWYL0vVwLKS6JfxV4LqRLg4HdARgMwETmBYBC6lprWfd2TiieV1iEyhvIdXtIqaE1GEJh9RuR+PWTcAEuiZgIdU14bzbd0TzvNenk9FZSHWC9f8aLfpHLV6wkOqWu1s3gaEIWEgNRT6Pfh3RPI916HUUFlLd4k4lNP0wsE+3Xbt1EzCBAQhYSA0APaMu7Wie0WL0NRQLqW5Jfw24TqQLZ4XvlrtbN4GhCFhIDUU+j37taJ7HOvQ6CgupbnEfCVw70sXHgL277dqtm4AJDEDAQmoA6Jl0aUfzTBai72FYSHVLXEd4t4108SZAaQRsJmAC0yJgITWt9awzm1RE888DSlZsmygBC6luF/YFwOMjXTwB+O9uu3brJmACAxCwkBoAeiZd/hjYLTKWLwDarbJNlICFVLcLayHVLV+3bgK5EUiliPl6wl8yt/F7PM0IXAg4JVHVAZibMR1NLQupbpfKQqpbvm7dBHIj8CjgJZFB6Ut2m9wG6/G0RkA59A6JtHYWcL7WenFDWRKwkOp2WSykuuXr1k0gNwIPB16eGJT8ZOQvY5seAd3EjoW0eT9wh+lN1zNaJmAh1e3z8HHgVpEu3gLs323Xbt0ETGAgAmcCm0T6ttPxQAvScbdlx3r7ARJZtgkTsJDqdnEd/qBbvm7dBHIk8GzgKd6VynFpOhlT6ljvz4BElm3iBCykul3gjyTiRR0M3Lfbrt26CZjAgAR+DlzCu1IDrkB/XaeO9Q4FJLJsEydgIdXtAttHqlu+bt0EciWQ2qXQeO0rleuq1R9X2bGeHM3/tdSkvm+Lkc9V5k+AjoO3BTYF/g6cBPwj1D1/eE3/nhFe079FuzDwb6FP7Ybpr2jqQ2PWOBSu4YmAAkTb1iBgIbUGvApVLaQqQHIRE5goAe9KTXRhl6ZVJpjHMvvfA4eFv0+NZdA5jdNCqtvVsJDqlq9bN4GcCXhXqt7qXCbceNwh7LrIYf8o4NH1mum1dOpYr9dBtNjZqcCxYbfqZ4l2Lw1cFDgtrI+K7Q5sBfw21L8WcBNAGkO7btoB086bflyozAOAv7Q47kGbspDqFr+FVLd83boJ5E4gtSulXYAdcx98j+O7K/D28MVb7PaXCX+zHocX7arsWG/oseXev44mJba+n/tAq4zPQqoKpeZlLKSas3NNE5gCgbJdqWcC74pMcufwa/3kxGt/A/5YEc6lwg5AzKemShM7hd2E31UpDFwS0Li1syG7AKA2jluqvz0gf58TgIsFv6D3ARuX9KHPUvnz5GRTONYbkud3wk7WkGNopW8LqVYwJhuxkOqWr1s3gZwJKKK1BITEgm09Ap8EbrleE63XPgK4QeutzqdBCW45v4/eLKS6XcJ3ANqyLtpBmZ/7d0vFrZvAPAjo2OJK85hq57PUzbK9O++legcKbaFj2yr2PEDBmSWs/xD8i44Px5XyG1rcrpNP2MUBvVa0jUJ59Vm8+bdcVvVPX7FjKfFysyAChxSn3wauXgVg7mUspLpdoa8A14t0cTig5KY2EzCB6RKQk23ZcdV0Z97+zD4B7NV+s41bfD7whAq1fwBcuUK5oYromFXR1+8E7NnjIHTULBF1dI99dtaVhVRnaM9uWCkhdHOhaPIHuGO3Xbt1EzCBgQkoHpB8gWzrE9Du/t3Xb6a1FrRrJH+wov0I+BKgG4hfBJ7RWo/dN3QR4IXAbsHP7WuJLhe39rSTJj8n2dXCrb3fAD8FrgncFNBOmmJkKZ6Wyoubytw/xMvqflY99GAh1S3kVwMPjnTxVOA53Xbt1k3ABAYmoB9Mtx94DFPo/p+AHPB1bT4Hk2jQsVTM5MoRu0CQw7g9ho4IWEh1BDY0a2fzbvm6dRPInYCu9Gv3Wf4xRTsx/PJf/u/bhejUEg/yn1ncflOZxWv6db/sWxNjoP4U6XqzECFbkbLlO1PHtgG2DBU0jtgtwkV72nnQ+DYPcYNOATSHRbTuhd/OBcPOxfKRp8a6+C5SHf0tTLcFHwp8tM7AOy775kTSefk/6ajMNjMCFlLdLriFVDt8detJf6mt5nZ6cSsm0A2BlwKPjDR9IPCybrp0qx0RUOwoHU/FkhE/CtBa22ZGwEKq2wW3kFqfr66PKxaOTPFz7gO8e/1m3YIJ9EbAQqo31J13VBY7auuwU9j5INxBXgQspLpdDwup9fi+F7hDoQlt++uasM0ExkLAQmosK7V6nHKuvmqk2KGARJZthgQspLpddAup9fgqF5N8Kop2X+Dg9Zp2bRPojYCFVG+oO+2ozMl8j3BLu9MBuPE8CVhIdbsuFlLN+ZblsdK12i80b9o1TaBXAhZSveLurLOUk/kvEqEQOhuIG86LgIVUt+thIdWc777AYZHq8pOK7VI178k1TaBbAhZS3fLto3X9sJNgWtxiXO7TTuZ9rEDGfVhIdbs4FlLN+aa+fN6SuHrcvCfXNIFuCVhIdcu3j9afBijJdMzsZN7HCmTch4VUt4vzYeC2kS7eBNyv265H33rKqfPegLbYbSYwFgIWUmNZqfQ4TwvxvYol7GQ+/rVdewYWUmsjLG3gSODakRK5JeDslkL91sv8oxQKoWqy0Po9u4YJtE/AQqp9pn22aCfzPmmPsC8LqW4XTYk2Y9m13wrcq9uuR916yj/KTp2jXtbZDt5CatxLn3Iy/4dzKY57YdsavYVUWyTj7dhHqhnf1BePt9Gb8XStYQlYSA3Lf53eyyKZvwp4WI3G7xki2W8BKJ3M9b27XoNexkUtpLpdHAupZnz1IaM8YUWzf1Qznq41LIHXAQ+IDMEpYoZdlyq9txXJfE/gM4UOHVy4ygqMoIyFVLeLZCFVn6/9o+ozc428CRwB3CAyRO+w5r1uGl1bkcx/BuwSme4JwOWcWib/B6FshBZS3a6fhVR9vvsAH4xUOxPYtH5zrmECgxM4Ctg9Mor3R1IgDT5YD+D/CLTpZJ7aZVdn2pm6AnCs2Y+TgIVUt+tmIVWf72WBYyLVTkoc99XvwTVMoF8ChwO3iXT5QuDx/Q7FvdUg0GYkc12U2bmkb+1M7VBjbC6aEQELqW4Xw0KqPt+UkNLW+KXrN+caJjA4ATubD74EtQdQ5mTeJJL594ArrxiFQ7vUXqY8KlhIdbsOFlL1+aaElLa9d6vfnGuYwOAELKQGX4LaA2jLyXzR8YeA260YhX3mai9THhUspLpdBwup+nwtpOozc428CVhI5b0+sdHJvUCfRUVrKnY2DyEP9G+ZeVdqfM8KFlLdLpqFVH2+FlL1mblG3gQspPJen+Lobg18NDHkPYDPN5yOEh6/M+ys75po46fAZRq272oDEchNSN0NuBHwZ+CCwMnA0wdi00a3FlL1KVpI1WfmGnkTsJDKe32KozsauHxkyG06hKcc2dXtF4E3ANq9ukaInv4y4Nvjwjif0eYkpL4ZHpoi/dODuPrWCJfFQqr+ollI1WfmGnkTsJDKe32WR3dJ4PjEcLWbpB/7bVhZP7H2/xd4LPCSNjp3G+0SyEVI6QqwREfKxnpjy0Kq/vNqIVWfmWvkTcBCKu/1WR5daqdIQkb+Swpj0JbpGC91xBfr419hs0FBQm0ZEchFSKWS+y5QjTUYo4VU/YfdQqo+M9fIm4CFVN7rsxhd2S7Ru4G7tDyNSwA/Ajar0a7E1DOBZ9Wo46IdE8hFSL0aeHDJXHW8t+q2Q8eoGjVvIVUfm4VUfWaukTeBdwF3jgzxP4Fn5z30WY0utRt1Wgim+acOaChelU5ctqnZtm4VPh/QmG0DE8hFSAnDKYAeqpj9HthxYFZNureQqk/NQqo+M9fIm8DXgWtFhtjFLkfeJPIdXdlulHaAntHh0CWifl1zZ2oxnL8CBwOP6HB8bnoFgZyElIb6OeCmkTHrIbv4CFfztcADI+N+AvDfI5xPH0O2kOqDsvvok0BKSGmn6q59DsR9JQmkdqN0g1wiq4vdqOXBaKPg7SHnnm4HKhL61sBewEYV1u24mv5WFZp0kaoEchNSykelvFRFG+vRXirr++uAB1VdpJmVs5Ca2YLPYLrvSAimpwDPncH8c5/ikLtRq9goHU3Vm3oKj/Cc0KCSIMv3SrtVcmq3dUggNyG1N/CRxHzXCYTWIcLSplNC6kvAjYcaVOb9Otde5gvk4dUmYGfz2sh6rZD6nO5rN2rVZB8TBPemqwomXn+Fj/4akqtYLTchpWHrht4mkfErmqzE1JhMD/DDIgN29Nr0KqaElD7UUj50Y3omPNb5EbCQynfNFZvphYnhde0bVZeKdqfuCexes6JCN1wA+EfNei5ekUCOQkrbmHpgYnY/4E0V55ZDsbIt4xzZ58DsFsAnIwPRh8D5cxigx2ACNQlYSNUE1lPxssTEZwHb9eAb1WSqDwD0TNUJm7DoR+ETvgrcsEnHrhMnkOuX+S8TzuVj3JWQk+JWEfxjPKrs4310tUQqhL+FtEF9jMF9mECbBCyk2qTZTltlIko9HAlct52uOmlFu/PHBrHXpANd7NqzSUXXOS+BXIVU2UP+EOA1I1rMDwL7RMab27ZxLkhTR3u/AS6WyyA9DhOoQWAdIaXPaPmN7hZub/0z9KvdWblAKG2JfGhs1Qm8HHh4SXHtRl265Sjm1UdXvaTElG60Ky9tXRtrkOu68+ylfK5CSpM/A4g51/0QuFIvdNrpRPFHYomXPwTs204Xk2rFt/YmtZyeTDiGeWSExIGAktGWWWpHe7nO94GrmHQlAm8E7ltSUi4E9wIU42sMtj2g7xIJPz0ripZ+vgoDt5CqAKlqkZyFVCoGk+Z2R+B9VSc5cDnFxdI2atH00CtOiO3cBCyk/ERMjUDTHak3APILrWIKG3O7KgVnXEZiU3nqUt97ch3R5/WYc9mlQm0Ul103FW8042eh1annLKQ00VS0cznLXb9VEt02plsTMVMSzJ932/XoWreQGt2SecArCDQVUp+teVNZcYTk99J18MixLrgE0lUTg5+CiFpM7VPhOYgF8tR30VHANce6iDmOO3chpfx7ysMXszHtSqXewPd2rqTzLK2FVI6fFB7TOgTk46QYeUV7MaDr9yl7WkhQW6fvE0NeP4WLsW0goGPUgxJAdJx3nZHvRMWmJj863dLTUZ+O8mSLf/1stEggdyGlqf4knP8Wpz2mXanUL1L5R+gNbttAwELKT8PUCGgHIBb75/3AHVZM9rsN/Z/0maMLLd6dOifFi3brYnHo5LyvI9GPTe2h83z6IzAGITWFXanULUTtVNUNrtbf0zFMTxZSw3B3r90RSEXOVn437UqvMn1+XA84NdzQ0vGMcvSt8rGU24Dan/vulOZ/kwTkJwPPW7UAft0EygiMQUiV7UopsWPqzDunlXdgzuqrYSFVnZVLjoOAwrXEcmtWubWXmqFuZ/2oYlBG3er7VrgJXWxvJ+DKwF+AFwBvGwfSyqNU1PLU8ekXgnN55cZc0ARiBMYipMp2pRRa4FkjWF4H5qy2SBZS1Ti51HgINHU2XzVDiSk5pO+yqmCN11+5IsZSjaYGL1p2S0/O5Qr+68s+gy/T+AcwFiFVtit1MrDtCJbCgTmrLZKFVDVOLjUeAl0JqQUBxaPTMWEsg0ITSg8tueTTpL2h6iin6a6JzpWGTOtiM4G1CYxJSJXtSm0OnL42jW4bcGDOanwtpKpxcqnxEOhaSImEHKklpmJZFJqQehegz9yxOquXuVPIgV+7UTYTaIXAmISUJqwbFrHYGHLYzj2ImgNzVntkLaSqcXKp8RDoQ0gt707Jz6lJ2pAiUTm3K4m8bhePTVBJVO4feUTkqK+jUB/pjef9k/1IxyakjgYuH6E6lnhMDsy5+i1hIbWakUuMi0CfQmqxO/WNRNiYJuT0uaU//Yg9PqRQ0U3EXK1sN8qpuXJdtRGPa2xCKnU8NpZ4TKnAnPsB8qGygYWUn4KpEehbSC34KcH7XsBJgOLuxeziwJMSO/2pddDJgBIlr8oTOMQ66ojzZ8A2kc51M1HzHdvu2hAc3WcNAmMTUnKqPCwyv7FcY3VgztUPp4XUakYuMS4CQwmpqpSUz+/1JTnoUu0oPpNOA4Y6JlNYA2W42DiMXTtmOrbbMjFgBSjVj3GbCbRKYGxCauzxmFKBOY8ruV3S6oKPoLGUkPodoJg3NhMYG4GUkNJO0PMzmcytgUOBC9ccj3Z3JE763p3SEV2dJM06mtQulXejai6wi68mMDYhpRml4jGNweG8TAgqL5JyPs3dbgxoh7Fof2vJgXbufD3//gl8ErhFpNt3AHfvfzilPepSjIRRKhJ4qrLS4Dwb0A8emXaGtFOk8DQ7hOO2v4fXlKxd3z2afx3TLUL9mFIg5vfUqQgcCVy3Zh0XN4FKBMYopFLh/sficJ66eXizEFyv0sJNuJB8OmJ5r5Rsc9MJz9tTmy6B1CWZTwQfphxn/u/AIR3vAktYaZf+3RUA/GaNsfwK2LlCHy5iAo0IjFFIjd3hXBF1Y2f41wK+2WgVp1Vpi5BTrDirxa2hac3Ws5kDgV8GJ+fiXB8NHJQ5ADlnXyQE+9Tx3RVbHu9pJT5Ni67kPN40ertuL1675TG7ORM4F4ExCqmUw/lYtm5/kriWfDngGD+fZxPQ7ZpYHJyLAfplajOBMRFIhT1R0uGx+eykfsiusx4SZ9q1i5n8R3UU2MTkBN+0bpP+XGemBMYopMbucP5jYLfI82YhtQGKfCCUSLVo8nGQYLaZwFgIpALx/gLQZ9kYTVHBFfCyrYTx2oXWj6ei/Rq4aE1AutWtTBdK6Kw0MDYT6JzAGIWUoMhfZpMInb0T/jWdg6zRgYXUaljykZKvVNHuALx/dXWXMIFsCByYOL6bQmBIJThWXr51TAJKP5wWQT/Vlj7bt29wnKd22hJ368zJdWdGYKxC6g+Ja7r/GW6O5LyMFlKrV0cxbe4fKaYvpb6vWa8erUuYQJpAKlXJVGIa3TYk/9XOkVLKaKdNQTG3C4JocawpwaRbyW04fctJ/SzgAuFmoPr4ln2h/DYcisBYhdThwG0i0F4APHEomBX7tZBaDeppgL5oivYi4HGrq7uECWRDIJXNYA9AN5DnZH8Etl1zwk44vCZAV2+fwFiF1Ji3yy2kVj/HCmVxcKSYMtLfdXV1lzCBbAhMydF8Xaip0C912h06mnqdsbrsTAiMVUilHDj160+BOXM2C6nVq6PghQpiWDQlSr3R6uouYQJZEJiio/k6YE8Ivk/rtKG6Q0VTX3fcrj9RAmMVUjqDPyWxJrnPyUJq9Zvp8onr0GO+6bR61i4xNQJj3jnvYi3uFYJ8KideG/b7kGtPP7BsJjAYgdxFRxmYsaaKsZBa/bingnLqaCB2W3N1iy5hAv0TUNqU2A75VBzNmxBVLs1nAXqP69hT72c5jktc6d/Ff/u34Dwuh/IyU/n/Ap7eZDCuYwJtEBizkEqlitkP+GAbcDpqw0KqGljl6FLAwqLpdtBvqzXhUiYwKIFUYFnl16ubZ27QiQzUueJs6dZjlbx/9p0aaJHc7TmJI8dqqYzquf/as5Cq9sQ5KGc1Ti6VJwEl101F4dfRtT4HbNUI6IhUEdW3WlHcvlPVeLpUywTGLKTG6n9gIVXtIXZQzmqcXCpPAncB3hkZmr7sYzutec4in1Fpd0onDVUCbv4QeISTwOezeFMfyZiF1Fhv7llIVXtXOShnNU4ulSeBVwMPjgzt7cA98hzyKEalI1GJ1CrfXe8OZUcxMQ9yvASqPIy5zm6sN/cspKo9UQ7KWY2TS+VJ4AeAkvEW7W6Jnao8Z5HnqK4CvKXi7tShwAF5TsOjmgqBMQsprcEYb+5ZSFV799wHeFOkqINyVuPnUsMRKPOPuliJ79RwIx5nz1V9px4PvHCcU/Sox0Bg7EJK8UNuEAGtrXNtoedoFlLVVsVBOatxcqn8CKT8o45O7FLlN4PxjKjqzT6LqfGs6ehGOnYh9QXgxhHqRwLXzXQ1LKSqLUwqKOfPgUtVa8KlTGAQAin/qNcm/KYGGeTEOpUrgGJJlQX7fEVwQp/Y1D2doQmMXUjJ8TCWe03ZwTcbGm6i/18CF4+8djngmEzHPMSwUkE5FYCvrcjIQ8zLfU6fwK8BxTsrmv2jul37WwHvAy5Y0o2SHj8Q0I9tmwm0QmDsQkpOh3pjxEyJbxXMLTc7DVDU3qJZSJ2XyT+A80VYOShnbk+1x7MgkDqS1uv2j+r+OdF3wkcSP1aXe/8soB2qnIM3d0/LPbRCYOxCShC+D1wpQkORbvdohVK7jfwV2DzSZO4R2dulUK21VGRoXSvXMYnNBHIjcFzi6PlvK3ZKcpvHmMdTVUxpjjohuH8iSfqYGXjsPRKYgpDaFzgswUy+NPKpycn+AFw4MiD9kv10TgPNYCwnAttFxrF/uP6cwRA9BBP4PwKKvp3K+aZje+062/ohIDH1DWDTit0p5tRLgK9XLO9iJvB/BKYgpDQZiaVLRNb1ZYCuyOZk3wKuHhmQds+0i2bbQOBrwHUiQHI9tvXazZfA1YBvl0x/T+Bz88UzyMzvB7yupk+lvkue7Fhfg6zXaDudipBK/RLMMR2D/La0o1K0RwHKH2jbQCC1rrnnU/Qazo/Ad0oCRD4VeM78kGQx42sAbwhrU+eSyn2Bg7OYgQeRPYGpCCnFEjk+QTu33QuLg+pvC7Oqzmrdks8Lvj0fBd66bmMzq68vXH3OxOxDgNwPbMMSkDuFfl3MRpEAACAASURBVKw+seIO1c+ASw87ZPc+FgJTEVLirdsX+0TA5+Z0bnFQ/d2h1A6HRIr7y6k6wyolTy4k0v0McPMqFV2Gh4XbXzEUfwb0I08747Y8CEhQ6fPjeivy9ckJPeYukscsPIqsCExJSI3F6dzioPpbIJWYWoFY9ZptfQKfSoimmwG6Im4rJ1AUoculfRM336dnW+Cx4W+TyDDlnymxZcuDwC4hFM4f1xjOVoB+3JTZ1sAp4YbtWcAZgPL6LtyE9JqCfZ++/Pk4JSElOCmn8/cDd1hjAdqsanFQnaZZVWfVtORvAOWGK9rzgSc1bXQm9RTPTME3YyaB+u8z4TDmaT4ceHliAor5t+WYJzeisUusaPdWu4DL/+4GXCYRT3Do6SmUkW6Vnz41IZU6NvsnEPvVMcRCWBxUp643l34BxGxqz251Ku2W/D1wkUiTLwIe125Xk2stdaz3L0A7Hj7Sy3/Jy45mNXp9/myT/zSyH2FRKBVF01gZny22p/ZlVOZ0rqBrb8zgcUuNMccbhhngQilhLKS6W4nfATtEmndestXMFfdNR6BFOzPEI7oloF+ttnwJKLCvUsaU2dS+J7tcDX2/XTUEOVWYHwWf1iZGWdqeLsfTR9u7TPEBSX0xvArOdgzNwSwOqq9CipXOsv2LvzrHVElF3I7lpdTtphes3/xkWyg71ltM2j+O8l/+FwY/KQup+mt1E0Dx0ySe9O9c/VYvOkUhlfqFkVPmdQup6m9a3brUG7ZoDmBanWGqZFmuygsER8v1e5lmC6uOhBazfjbwn9NEMIlZKbaUktzHcnpqgr8Cdp7ETJtPYrHLJLG0+NN/s4FcI3acopBK3d7L6aZXyil+d0CB/WwbCFhIdfc0pMSA0mTEIsp3N5LxtXxscIJdNfJDAd3UteVL4LbA64HtQ0gEfS/qx65CIMxNMOS8yyRfZyWy1y56HdOPQv1pXXXsruP24mbGxuEYUoJar1UJ3nq2iNJApiikUqkactpmtzio/jZIxQfLLdBq9RnlU/I9wB0jw/EuSvkaleXUK9bMaSc8nyfPIxmagL4ndUMul10mhRrQBoP+flH4V/9NO4N92cWDiC7r70vAjRcFpiikNLfc/WospKq/JRzAtDqruiVTN/Z0bV/X923nJaDo2EpuW9XekkgJVbW+y5lAXQK6hXuxpT8Jg8X/l3BSPKW+LSaUlkVTn0Jp1dzvDrytpNCPgCssvz5VIZXKe5WLX43z7a16lDe8biFVnVWdkin/KP0IkfO5AtHZzk2grohS7YOARxukCbREoCiSJJCWhZL+//lb6qtpM3Kj+XGofCSg2605CaVV81Ki6wdECv0wZDHQ6+eyqQqp1HFQLomBLQ5WPcobXnck+Oqs6pRM+Ud9MeHcX6ftKZZ9E3CfBhPTB7KS5tpMoCqBRYwlBQtd7CApNpl2koYWSctz0BGcNi2W/7TLNHbTjtPlIpO4MyB3iPPYVIVUSqi8DDgwg1W2kKq+CA5gWp1VnZKpDwv7R52boi6vKDjpriVwlS7iB8C1ImX0eaPPHZsJFAksBJM+4/S/9ZdrCAHtMkkwSSjpX7mnTNF0Q1MCMWZyLJc7xGyEVO4397zLUv0taCFVnVWdkroBE7uZcivgf+o0NNGyTw237coElKb+W+A2gI7rdVxatMOA/5goI0+rGoExCaap7jJVWym4B/DWSOHvhUCj0XamuiOV+809i4Oqj/U5CSOdJqY6ryol9wQ+kyioCMR1rxdX6XMMZfS+vEtwDtd16VV2IiDheQKgnIUxs5BaRXE6r49JMIm6brJ/DtBx/pR3meo8YR8GFA6jaK8EdNQ6KyGlyeZ8c89Cqs6jnV7Lqf4QqEenfumUf9Qc84rdLcTM0i52ncCL8lm5JvDtcPT3mMQyKLzE++ovkWtkTCB3wXRqSKathNqxPzl+OytE/AHTMX3sR9SdgPfOUUjlfHPP+fbqfUrmLIrrzSSP0qn4UW/nnK3tqZuC7n0k5MlTIL66pqvcjwBeA+xUsht1FHCNuo27fFYEFgEqdwP2S+Sl7HPAKZEkcbQQTRZJzVbkUsBxiarKR6qd59ntSB0efBeKE9eH30OacW61ltPEVMfpuFvVWVUpOdf4URJQCkWglC1NkqieFJxs77f0i15R4GNO5loHZyqo8jTmUSa3NChy7pb/nXbdtev5sSCULJK6e14UoDR261C7z6U/uKZ8NJL61f0N4NrdrUXlli2kKqM6+4aI8+1V51VWco7xo3RlXL5KNy/JqVbGTDG1HhdiyBTL6UM29jmqgH73bGfJ3EqLBORzedWMku1KMC0ieutzbvG/W5yym6pIYAtAO35F0/u/1GdyykJKV461/V6074Y3UUW2nRVzvr3qaD8K3DpS/KHAq6s345JAyj8qp1yUbS2UdqCeFHagNmnQqHzGFOFd8WNiti3wx8RrNwS+3KBPV2mPwHIalOUQA+31UL0lC6bqrIYqmRJSSmqtIMVJm7KQ2j9cSS5OXh9u+pAb2rzLUn0FPgHcMlL8Q4CchG3VCUw5v97Nwq7TH8Kuw+0459ZnHfts2L1SUF/5nKwyJUGNibQtgdNWVfbrrRDQGt8+/EDeJvitDRWPyYKplSUdpJGnAc+M9KzTIx3tpU6RJpm0eMEhJaRyycZuIVX9vZJiNcVdlOpUmpVUaIPYr6ux59eTAFIKqCZ2MnAw8NISx/FUuzoK0C/ZollINVmJ1XWKu0yXDcJpdc12S8jxWM/cscFvzkdy7fLtu7UnAM8v6VSO6Mmo7XPckcpFSB0B3CCycK8Kxy99P0g596cHXA960eSEefWcB57Z2PSrPXUVXz4AY82vp9QtSuFS15QDTPFhtLPZ1CykmpIrr7fsyyTxNFTU77kHqOxmdfNqdZWIWhkWxkJquAX1Lkt19o67VZ1VWcl3AHeNFJCfz3btdDFIK++vGT1ctxaVXaCNCO4WUusveS6+THNJg7L+ik2nhVUiSkf3+gGqKABJs5Aa7oFIJVbWh7uiJds2ELCQaudp+GYirpF2R2/UTheDtPLiENZgVefHAK8HXrKqYI3XtYu3aaS8j/bOC8W7TDUeLBftnMAqEaXMBcoC8cNVI7GQWkWou9fvDuiKdNFycYbvbub1W3aamPrMYjXk17F95IX7A29sp4vBWlF8na0SvSs47+PDDby2B5gKf6Ar9srPNVfTe1YXRLTzpx0nOeRfeAAY3mUaAPoIulRcrr1Kxil/KOXQXCmi1IaF1HAr7l2Weuwdd6ser2LpVPwolRuzf9RintoV0u3OywGKG6UvbjmRvxZ4wXrokrUlFNRnzHRUmgqN0NFwBm1WYkniUZ9r+t/669P+AujvyHBbW+I56Rzc58DcV3YEUuF0FgOtJaIspIZdXwupevydJqYer2LpVPwoJSyNBTtdr7d51JZIe2BkqopIfdEJI1gc0ekzbCGc6oaZWAePd5nWoTfvuldYsctUW0RZSA37QPm4qh5/h4uox6tYesrxo9Yj07x2KtWOUlApFdVUbKjdJt+Ym8oTlM88dGv/Xonh6Hnbu+px3nIbUz7aOwg4MALsq8D1M1lXH1dVXwgLqeqsYiXnml9vPWrp2mXHevJDU1DQMdpQu03eZRrj0zKuMesCiILsxuK+Kb6eUsdV8okqTnvKQuqtiUz22rpTcK0czEKq+iqkbjneOxHBvnrL0y85df+oIVYw5Wfx8UQ6oyHGGOtTIu9iwMXDv/rf+rtm+FyUf1mX5l2mLum67TIC7wTukiigXSpphkY2ZSH1ZOA5ESpySIwp0kYA16wkh0g5aBZNEZq1A2PbQOAZwNMjQBTSX6/Z0gRSAU2/kggKa5arCZyVyAj/AOANq6t3UkIiqSiQFkJpIZ66FkrLE5No0s1FfeZ+GHhXJ7N2oyawmsDO4fJBTPPoR5Fu6DW2KQsp3UQ6PUFGv9C/35haexV9XFWdpYVUdVbFkoqHEgu4qV9gKX+B5r1Nv+ZjgBclptn1bT3dTpQPloIELhzaFYJBQqlPkRSbvo7n9JmmH4j6VyEpbCaQA4GycAc3Br60ziCnLKTERTeSYoEGdYNJqViGNgup6iugeDSHRIo7cXE5Q6XWOD5R5HElgqD6ysyv5GGJZNnyQ9uxZRwSTvoM04e9/nTDMofPbe02LYsmiSebCeRIQCdQCkUSC5zbiqtPDm/ILsE/G3hKpAPdYLpzlx1XbFtJUh8ZKevjqvNCcbiIig9VoVjqGZN/nj5YdERlq0dAF1auG6lydDhmvkgQrxKxfwZ+Gcpqt2on4DjgtESXin+l4/7LAJcP4mmjesPrpLR3mzrB6kZ7IJA6zVDXDw/5NtcaxtSFlDLax/JpdfHLsclC+LiqOjULqeqslkumIn47FVEznhI1fwfO16z6KGpJXH8deO/SrtMoBu5BmkCBgG7qnRQC9Bbh/Dj8WFkb2tSF1GaArjXGLIcUDhZS1R9hx92qzmpRMnUcqtd1c9WRn+szTQn6+i0NU0M7YboCrr9fLf3v5f9m36Zh1sa9tk/gRyHbQaxlHZkrz+jaNnUhJUA5+0ntC8jfomjaRtcHtu3cBBwuot4TkfLB8/NVj+Ny6acBOnrP0ZZFUkoonZLjwD0mE+iAQMqXUV19G7h6W33OQUil/KTkHLl7WyAbtuPjqnrgnCamOq8yJ3PH3qrOsVjy08DNmldvpaaOKuTsfWz4oahf1RJOFkmt4HUjEyBQJqI0vVYv2sxBSKX8pHRleOOBHxgLqXoL4FuO1XmlnMzl/NxnXrTqI86/pD4v5B8lh/A+TeErtLO++Ptuw851nPtyYIfCzT/5ROlHioSZbjftFsqcGuJA/XOpv+sBWwE/AZ4E6OjEZgK5EJBP1FHAriUD0o8Q/dBszeYgpMr8pO46cJA4+/3Ue5QtpKrzSjmZvyyROql6y/MteTtA4TaKJhGyEBsSJWcEoaL//g9ASYz1r2I9bR4CVOrDvHhjUg7suwD/FmIwKYjl60NcpnWpSwBJiLUtAnWDUU7pyjyQCrOx7thd3wSqEkjFzFvU1/vuisBfqzZYpdwchJQ4pPKMKYGhHHKHNPv9VKfvNDHVWNnJvBqnuqXkW6ZYTkXLwU1g1Vy0i6VAxF2aghrqSMWiqkvKbjtF4G3A3UvwvLskRcxaVOcipJRaJJZGRL/at16L4PqVLaSqM/Qtx2qsdK1XxzNFs5N5NX6xUtsA+rUbcwf4CHDb5k33UlN+VZpDX7YQVRJWvh3aF/V593Nyyfd5ZyJKyOcipMqO0PYLv6CGegSdb686eQup1axuWJLuwE7mq/mlSqQuraj8/sBbmjfdS80jQ3b7XjordGJRNQT1bvrU0XQqpFA3PVZr9Z4l70E9+7EAutVarlBqLkJKKFLHQp0q1QprYL+fCpBCEaeJWc3qk8AtIsXkozN0LrbVo8+zRNlulG7LKVFw7qa8fMcAFxx4oPJNUfLixzoX38ArUa/7/waUWk0+x7odeidAN1hzMWUPiL0Pe7lcMychlfoSlsPnkFGKLaSqvxVTtxx1g+iy1ZuZdEkl6lbC7qJ1/qtswlS/AshZO2b6718b0dxfEZzezwzCWrcQdVypW8zfC7sNcniXY7xcH/Tflk03/64UIkIrFU5TU78SVLr84Dx9TSl2X0/JsZ8b+XyVINaliKHtviGu2yKBd3E8vezCz0lIlR3vPRo4aKAnwvn2qoO/NfDRSPG/AEpMOXcrczLPIZL/WNdHIiP2WTkG36gumd8gJG+We0TZdfNVY5CQ0uegbkQ6qvoqWv28rtuid1jhQ/xa4MH9DOc8vUhA6Xv7CiX99/YDe05CSrx1DTmWnf0FwBMHeiDs91MdvK6t/iBSXNfNY7sw1VueRsnU7qZubF1tGlPsfRZlvhcKzPnZ3keUZ4dtiCqJKLlgeJdq2DX+aUVh/DFg756HWkVALYb0ypCUuPMhzk1IpdLFPAh4Xee04x1YSFUHrzNwnYUXLZdt5uozab+kI5m3z1Qt6lf3AyNN55L4vJtZr9dqG6JKR4ryX/0coNQ3q2y7cNRUNZbVzoCON3+3quHwunbc/gAoSGnR9JpuRS5203TkpWPPn61oW0eo8uFR3ZSpHfklld18VGwwvf/12ShfyJRdIry+POdLBwaLuEpvBq5RkYmO/T5Qsew6xfQjWSdGewGaQxXTLrKOp6uub5U2k2XmJqTeD/xHhEZfD0RsIZxvr/ojnBJSvwlvmuotTa+kI5l3s6YnANtHmn5K8B3pptfptCpR9QDgbh0EA50OpfHN5Pkhsn3XI9fxnfqq48csEfUE4EVdD27R/tyEVCoonW6QvLgv6IV+Ug7U+nVRVX0PNPTeu00JKWWx1y/MOZsjmbe/+rcCPp5oVuJKOxS26gTuA8if6jbVq7hkhgR0nKdjva5tn5qhib4ffGhfCCimVG82NyGlD74LR+gqvYOc5t7QG/kNHSkSqyKyFs3HVedlYiEVf0AdybybN25qB1viShcfbM0I6OKPntkD/WOxGcABaz0N+K8e+lfcp09VvBn4LeAlwDt6GFe0i7kJKZ2flyUrvAfw9p4X41rA1yN9KujZ0DFfekaxsjsLqTiilJO5I5mvfKRKC8iHJpabTkdVQ/zoWm82edbWjrxElYKa2vIm8AhA4TO6Noko3c5eFYl/cAG1ADE3IVV2A0dMJLTkANinXS6RQV1Z2OVAadtAwELqvE+Dncy7eYc8GXhOomm9L/X+tLVHYLFL9Rj7O7YHtcWWngUo1VrXppALb11xC1uO9/JRHGwHqghhbkJK89cNnFclcmbp6C/mWNrlw5MSUsqXdvkuOx5h2xZS5120zwB7Rtayl4i+I3yGqg45dcPXt/WqEmxeTr5UTw1+j3JxUI5DBfBM2VYh3pF2D3XDTxcEykxCeEtAeU7lW1jmT6Ngpbo5p9Qo2qGUgF7ccNsovKaTA72m23dydJb7yKaAguNqLAr6XLQdwrGVXlP/sduAEpfKBat+NC9xKJqyFWg+utmmMDD6DouxWp6zIpMr9p6+63QjUDf9NC+1sVMCnHaHVK9L07q/cUXqukMAlcvK5iiktACPBxQ7qmhfBpSrrE+zkKpO20Lq3Kz0/tUHsT5oi6ZYPPJBsTUjkEqAemg4imrWap61dN1dX6Zy1rXNl4AEypsi0/8mIBeULk0ZAvTjJXaUvuj3ocCruxxE07bnKqSUJ0gxSor2HuDOTWE2rGchVR2chdS5WcnB8lEJfLsBx1ZH65JLBG4JfCJBZErHelcJAUW3DXNVGBHtgleJ2+QHZnoEFEMq5qumzxkduXZlElHyidLuW8qyFVEa8FyFlB4WPTRFU86sVE6trh4iC6nqZC2kNrDSe1eR+nVEUDRtwa9y1KxOfX4lU0E4h4jk3CV9BSssPj8S3xLhtvkROA5QLsWiKdah0vd0Yfq+Vaqlss8rHfOm/BW7GFPtNucqpBRnQrGjivaLFbf6agOuUMFCqgKkUMRCagMr/UJMBZzrJVFn9WUbXUn5iyx2aZYHP6XbevIRkh9d0eQ3FDsqHt0iesC1CCjCuXLTxUzvhS7iMt0v+CvLnyxlSmx911ozGaDwXIWU8uo9L8L7aED53Po0C6nqtC2kzmGl962OYWJ5I48EdH3Y1ozAQ8KHe6z2lI71lMYkdoRnIdXsuRl7LX0fxvLNduEfdR1AqdEU8LbM5A+lI73sba5CSgujDxF9mCybbvQp63WfZiFVnbaF1DmsynajFCgyFY27Oun5lkztRin321UnhMVCakKL2cJUUomKFWJAQaPbMAkopXyRj/Iq0w+a16wqlMvrcxZSVwoJFxWHR6JKucr6iNhaXHsLqervBgup8t2oTwO3qI7TJQsEUgnEVWyIiyhdLpB212LX6b0j1SX1fNtO3VJtI35UHQElQqMSURrwnIVULo+0hVT1lbCQ8m5U9aelXsmrAd8uqTK1W5CpHSmF06iTILYeZZfOlYByu+rztWh3BN7XcNByUn94Is5dqkmFX5Dv1KjMQmr45bKQqr4GcxdSZb5R3o2q/hzFSn6n5OjucOB26zWfXe2UkHKOz+yWqpcBKa/dzSM9NXEVkO+TXGRiwqxsMh8Abt/LbFvuxEKqZaANmrOQqg5t7kLKvlHVn5U6JcuO9Lpwtq0ztq7KpoSUIl5v0VWnbjdbAgrtsdeaQqruEZ66UyBY/QiUW43CD43SLKSGXzYLqeprMGch5d2o6s9JnZI6upD/U8wUHkBHfsrtNTWzkJraiq43n6pCSpHHlQz9CiEljW4P67PpYjVzwyqNjQJ96k+pdUZtFlLDL5+FVPU1mLOQ8m5U9eekTknlQ1OOsZgparwuoUzRLKSmuKrN51RVSCmXn3IJNrVJCagFBAuppo9De/UspKqznKuQ0vtUN6xiH2D2jar+/BRL6jhBUZNjpl/dN23edPY1LaSyX6JeB1hFSCl350ENR6Vkzs+fyg5UkYGFVMOnosVqKSH1M0DRZm0bCKSElGL/6Dr3VO3FIf5KbH5NnEGnyqnuvL4FXD1S6UzgshM90ltMNyWk/gZcsC5Ilx89gc8lfjgsf76kMoKUTV7hNL4aLmuM/ggvNVELqeGf/5SQkn/GhYYfXlYjUEJVRZ8vmraLN8tqpO0NRs+APoBiaTu8G7UeZ+UkjL3HRpGWYr2pnx2MOBbZ/J+A/GBs8yKQCsipaOcvCCiU5Pq7FbGcEY7FJb4mK6AWLCykKj4VHRbTTQltqxZNtxnO32G/Y2z6BsARkYFP+cP/vcAdEovl3ajmT7HYKeN8zJRAVSJrynYR4PeRCTog55RXPT231I+K5wJPWar2hgpxnvS+2n8OAspCKp83i9JOKIZN0XwN+bxM5BQs5+CY6Ve0BNWUrCxIpJw+t5/SZHuei+Lc3D/SpzLR37bnsQzRXWpHSr4sGw8xIPc5GIHUs6AB7R35oS9fzTsHofTbMOobhp3MNwMK7jkr847U8MudOtr7BaD0NbZzE4jlSFQJsRKzKdnngZskJvRYQL5TtmYETk3ES7ovcHCzJkdVK/XlOeVj8lEtUI+DTe3O+sd8xUWwkKoIqsNivrVXD27KQVi/iL5cr6msSx8AHJIYoRxD98x69HkP7pElYQ3mcKyn1fGtvbyf0T5Hp9t0T4h02GbC4j7n03tfFlK9Iz9PhxZS9dbgQ4l0HXcF5CQ8BZMD9PEJR2hdQtDu25+mMNGB5pByrNUR++4Djanvbi2k+iaeb39fAa4XGd6DgNflO+x8RmYhNfxaWEjVW4NXhezgxVqPA15Ur6lsSysIpHZNYjblIJF9LMi1gK8nOhplwtSG0CykGoKbWLUy/yhFL//RxObbyXQspDrBWqtRC6lauHgSoJskRXsZoIBxY7cyB3NdPdbrtuYE3gncJVF9Tl8cFlLNn6Ep1Uz5R/26QdLhKXGpNRcLqVq4OilsIVUP6z2Bt0SqvL8kTEC9HoYtXeZgvgeg123NCCiz/PsSVb9Y4tjfrLe8a1lI5b0+fY1Ou7D3iXRm/6gaK2AhVQNWR0UtpOqBVdoOOVsX7UjguvWayq50mYP5oYBetzUn8KuQXLXYwlnAToBCSszFUkJKUd03nQsEz5OTga0jHOwfVePhsJCqAaujohZS9cAqbc5PIlWUhVwZyMdqcjBXTJZYhHY7mK+/qlcGvpdoRr518rGbk+l5iwUddUDO+TwFO4bPnNiMrwT8cD4o1puphdR6/NqobSFVj+JUg3J+DbhOAoUdzOs9I7HSzwSeFnlBwkFRvue0GyUMWwIS6EWzkFr/WRtLC6kd8ClniuhkbSykOsFaq1ELqVq4zi58QiKq91iDct4IkI9OzOxgXv/5iNX4OHCryAtHAddop4tRtZI62luVmkrx2v4jhN9QcmN9hyhwo46HFJJDO10SaIvbXop3ph8/8mH88KgITX+wqfhRxwD6XrJVJGAhVRFUh8UspOrDnVpQTsUvUqqgmNnBvP7zUayxHXBioplbAp9cv4vRtdDE2VxiSCKqqek51y5I1cS3TftxvWoEUvGjFHrl5dWacCkRsJAa/jmwkKq/BqmgnLrW/u76zQ1aY1/gsMQI9KteV/Jt6xF4QCKwoJL2yk9kjlZXSOnYWcfPbZjeoy8E9IPINgwBx49qkbuFVIswGzZlIVUf3JSCcv4cuEQEgfwUdp1g/sD6q71+jZT/2WuBB6/f/ChbqCukUsdA60xeyW3l6K9USDoetPVHIBU/Sjdbd+5vGNPoyUJq+HW0kKq/Bk8EnhepNragnM8Anp6Y/gsAzdO2HoHbAdrBjNlcj/XEoq6QKgvNsd4KgRzctSv7wfCvRdW6RFfXd3691Ywql7CQqoyqs4IWUvXR3gN4a6TamIJyluXT+0XIp1efjGssE7g78GZgkwiWM4IT9FyJ1RVS4qT8j7rQ0bVpV0R/2q1dmJJJXyrEuPpdeE07uTqaVRwwje0k4PLB8f004MchnIhCppw/XFI5LoRJuSjwr7DjK/85XfhQH2rrVEA7wvp+lMhb/Lv5UniS04G/Lb22UWhP412Ul0/Yfl3Datj+N4BrRuo6flQDoBZSDaC1XMVCqj7QKQTl1Bf8/omp68NXv85tzQncDXhbiR/o3I8wmggprcZ7QpiOZeGw+N+LfyUyfhZEyW6A/uZqEn0K9pqTlflHSYhKgNpqELCQqgGro6IWUvXBjj0oZ1k+vS8AEoq29QgoQGvZF9hTgees18WoazcVUk0mrd2fR4e/JvXHXuejwFfDjlXMJaHv+f13IgCtdtgU0sJWk4CFVE1gHRS3kKoPdexBOcvy6e0O6EjAth4BxUM6X6KJjwF7r9f86GunhFSXX6a7hHhSc068raPDhwKvH/AJSqVKmvsubeMlsZBqjK61ihZSzVDKITX26+kywE+bNdlLrbJwB86n194S6HhJgrto8q27V3vdjLallJDSF31KgLY1WeXyU6Jc5cbUMbairM/Jf5E83gAAG+xJREFU/hqc/YeYs468357oWO4G9x5iUGPv00Jq+BW0kGq2BnIm1ZdB0R4CvKZZk73USoU7cD699vCnGKuHVwCPaK+r0ba0fXC+Lk5giBQx+wC6GKBgnxuPlmi9gctxftmZvl7t5qUVO00pkYqmHx5yprc1IGAh1QBay1VSQkppUHZoua8pNafcaBeOTOiBA2+blzEuC3egXHB63bYeAd14LIuDo7hRih81d0vtSOkm25BiRu8BHQFKZBSdnq8Sbs0dDSx+SF0R+PtStHStvZKX6/NTDu8yJeDVfI8FTg43+NSWbuYpRZBMx43KLiDncJURB4kL3a7VLT7tmulftSX7wdJ/02tKjyOBXmV3bQixqjG/Mhwrxp79+wFvmvuboun8LaSakmuvXuoGmj4cNmuvm8m1pA/Z2G0gXWM+IsPZOtxB94tyE0D+ZynTka+Ofm3pOFJzDwuxzrNxc+BTFRpQSiLFMOvbJAS3iHT6W0AXAmwNCVhINQTXYrWbAZ+OtGchVQ75S4ASqBYtVyHlcActvmkSTd0GODzxmuLmXLv7IYymhz5v7Y0GSgsD1fGkXAu2As4MEdsX37O6AKHEzQ9roZ+6TdwVeEei0tgCGdede+flLaQ6R7yyg9TRno6u5MdgixMYk5ByuIN+nmL5fsgHpGhDH1f1M/t6vVhI1eM19tKpAJzegWxhZS2kWoC4ZhN2Nm8GcExCSjnFLp6YpsMdNFv/WC0leP6hhVQloBZSlTBNotB/As9KzETJox8/iVkOOAkLqQHhh64tpJqtwViE1LuAOyem6HAHzda+rJZ+Yet6/bLZB+S8xCyk2n/2um5Ra9YkD2EqVIyc9uWsb1uTgIXUmgBbqG4h1QziGISUfu09NjE9+UvoKEq3fWztESjejJSfimJ3KQinbQMBC6nxPA3aTVICc8X30o1CRUd/UcXh7wF8NlHWN/UqQlxVzEJqFaHuX7eQasY4dyFVJqI0488BezabumutIKD31CNDUtnHLSWTNTgLqbE9A7o888XIoL8cBJXSz5SZPmM+Eylgv8EWnwQLqRZhNmzKQqoZuJyF1CoRpfg024Y4Nc1m71omsB4B70itx6+v2gqVcIuSzn4dUkop7pZiaOlv+Xtd0f1jYWIspFpcQQupFmE2bMpCqhm4XIXUKhF1EnD9EByw2cxdywTWJ2AhtT7DPlr4dggW2nZfFlItErWQahFmw6YspJqBy1FIrRJR3wrJchV12WYCQxKwkBqSfvW+nwI8u3rxyiUV1X2TyqVdsJSAhdTwD4iFVLM1yE1IWUQ1W0fXGoZASkgNmVB3GBL593pwSLTdZuoe70i1uO4WUi3CbNiUhVQzcDkJKYuoZmvoWsMRSAmps8LtsOFG5p5TBBQPSrlE20jnosC1Oxp1OwQspNrhuE4rFlLN6OUipHS1WFeMU+bjvGbr61rdEtgOODHSxVAJdbud7bRaV4LzJ60heCWWFdvuA9PCMtxsLKSGY7/o2UKq2RrkIKSUIFeJci2imq2haw1HILUj5SOf4dakbs+vB3YFjg8393QTWN8nilEnQawbe4sUMPpXPlFKXCwRdkrdzlw+TcBCavinw0Kq2RoMLaTuArzTIqrZ4rnW4ARSQsq51wZfGg9gbAQspIZfMQupZmswpJBSEmLtRinDe8y+H2K/+HZes7V1re4J+NZe94zdw0wIWEgNv9AWUs3WYCghdaEQlVxiKmZK+aI1tYhqtq6u1Q8BC6l+OLuXGRCwkBp+kS2kmq3BUELqg8A+iSHLiVNJQI9tNiXXMoHeCFhI9YbaHU2dgIXU8CtsIdVsDeRgeclIVeWmOqJZkytrFRPiFivsHpw+VzbkAiYwMAELqYEXwN1Ph4CF1PBraSHVbA10hBbzUXoQ8LpmTZbW2hc4rKTEvYE3d9CvmzSBLghYSHVB1W3OkoCF1PDLbiHVbA3+GBL/FmvfA3h7syaTteQP9TlA/lExOxQ4oOU+3ZwJdEnAQqpLum57VgQspIZfbgupZmvwg+CPVKzd9tHeKufy73aUVLQZFdcygWoELKSqcXIpE1hJwEJqJaLOC6SE1G+Ai3Xe+3g76MvZvMy5/M/BT0vHjDYTGBOBlJA6Hdh8TBPxWE1gaAIWUkOvwDlX5X8UGcZfgC2GH162I+hDSD0feEIJATuXZ/t4eGArCKSE1D9DBGwDNAETqEjAQqoiqA6L3QuQj03R/gZcsMN+x95010LqUcBLSiDZuXzsT9C8x38RQIlri+Zce/N+Ljz7BgQspBpAa7nKfonkkX8Atm+5ryk116WQukTIX5V6f9i5fEpP0jzn4h2pea67Z90BAQupDqDWbDIVm+htwD1rtjWn4l0KKcWhukECpp3L5/SUTXeu9pGa7tp6Zj0TsJDqGXikO8Ue2j/y358JSGTZ4gS6ElI3DaEOYr0qq7qOROxc7qdy7AR8a2/sK+jxZ0PAQmr4pVDy25tEhrFHSIw7/AjzHEFXQuo7wFUTU94b+FieODwqE6hFwEKqFi4XNoE0AQup4Z+OVIRu3wgrX5suhNSBwEGJbt8B3H34x8UjMIFWCFhItYLRjZgAWEgN/xTolkzMvDb9CikF3lT+vlj0cseLGv594hG0S8BCKs3zsuGiz69rIt8G2BjQRaEqtlNwE9AN7Tq2A/BX4LQ6lcKc5J5Q1zXhusAvga/U7G82xf1lPexSp/xxfpFIyDvsaPPqve0dqZSvmmbtUAd5rb1Hsz4BC6lzGOqHk47y9Vl8bUAuFZutj3eSLfwupML65CRnt8akLKTWgNdC1VQi3C+EN3YLXUy2iWOBy0RmtxfwiZqzLnMw91rUhOnioyCQElJnApuOYgb1B7ksmpQ/U3+XrN/M7Gt8OMTY02ejDR/tDf0QpEIfvAyQv44tTSDlW/YI4BU1wZU5mNtXrSZMFx8FAR1DnZQYqXYelFVBP7TleqBo5yqrI6uLh9d0RKSAnsvHS3ptS0BiTK+dGml/W2A7YCPgFEB9LUxjUuw8vab3928j9c8PXDSksdGRmMr8vYS4xqOjMAU3Vl1bewQsqAJL70i191A1acmhD5pQO6dOyrfsTsB7azRb5mBuQVsDpIuOikBqR2pUk/BgsyBweNih0g30WZqF1LDL7tAHzfhrS/7biap1nmlt9cuhNJaKxw7mzdbGtcZBwEJqHOs0plH+MITs+Smgncdbht1Ffcb+K8Tnq3taMIr51/nSGcWERjZIhz5otmAHAIdEqsoB/cY1mvwecOVEeTuY1wDpoqMjoGM43cSyxQno6FKJ42PHk7EaW4UfZPpO1Y26sptxKqNjTDm169hUfahOFVvUkzDRsarGWMW2Dseh2smvMy/92NTxqI5b27BvAtdqo6Gc2rCQGnY1HPqgGf+XAo+MVK1zFPdK4KGJ7u1g3mxdXGs8BLwjtWGtlPZJfpKLv9keUSUeXz0rjwaUyD0WHqbuU6+2DgvuGbqhPnqzkBpuCR36oDn71JFo1V2k5wBPLuneDubN18Y1x0FgrkLqOEA71xZN9Z9TPTMSUxJCbQgqjeAEYE/g6PrDyaeGhdRwa6Eo2UpMXDQnxV29JqmdvCoCaJWI0jn/lVYPwSVMYNQEypIWy7dFQSl1S0/HOjL5vcgUcPJywB/Dl2ARwhUit/GKZS4VQiwcEyGocAQXAH5cQlc3Ci8B/AqQL+Mq2zHkyHztqoJ+vRIB+ZRKTLUlqCSmdLNytGYhNdzSKdaRPrCKdiSgSLK2OIF1HM1XiShdo1ZwPsWospnAlAk4IOeUV7efuUlQPRF4UhDY6/S6cxDG67QxWF0LqcHQn/2La7dI9+8E7jbcsLLvOeVovsqvaZWI0i9sHbdqR8pmAlMnkBJSZ4QdoanP3/Nrj4Ac2Q8FtBt5MvDlECz534HzVexGlx/qpuSp2HT3xSykumec6kGB5LTlXDSlKLCzY3pdmjiavw+4fclS6/bebcb8i2i4x9g9j5RASkjpNpiO72wmsC6BewBvrdiIArFWzVFYscn+illI9cd6uSc56imqb8y8JuVrIl+NXSNFUo7m+nV0/ZImvw/sbRE1zBvBvQ5GQNHFT4z0Lv/Dtq66DzY5d5wNAWXvUNBj+bXp2UqJ9OsAX89m1DUH4i/tmsBaKp66sWdH89WA6ziaK8L5HSyiVkN1idkRSO1InVXjOGZ20DzhtQloxzOmO7wjtTba+TWQyrGnc2b5ANniBOo4mq/yifJOlJ+yORNICSkFhtRrNhPogoACkMZ2PC+/4qZmF2NprU3vSLWGslZDHwT2idRQjA75ANniBJSQWEE3i6YEqcv+ZqtElBwiJcp0fdpmAnMk4Ft7c1z14eecElLekRp+bUY3gp+HOCjFgdvRvHwpU07jL1+KdL5KRCnEgXymUrn6RvcwecAm0ICAhVQDaK6yNoGUkNoFOH7t1gdqwDtS/YO3o3lz5nKOlZNs0W4OfAZYJaK0E6WyFlHN18A1p0HA4Q+msY5jm0VKSCnA6mhzP1pI9f8Y2tG8GfOUf5ScF5X889XAfUualk+UQhyM9s3aDJtrmUCUgMMf+MHom8BTgGcnOvWtvb5XY+T9vQh4TGQOdjQvX9iUf5SOSTcHdMaeMouokb9pPPzWCTj8QetI3WAJgbevCDS9L/ChsRL0jlT/K6ds1wqHXzQ7mpevxaqgmhZR/T/L7nG8BFI7Uo4jNd41zXXkNwK+WDK40UfTt5Dq/9HT9WLtoBTtXjWiwPY/6mF7VP67bwKb1ByGd6JqAnPx2RC4CKDbrkWzkJrNI9DbRF8FPCTRm1wz9NrrehtNBx1ZSHUAdUWTKSGljOqxbOj9jzCPHiWe9gO05av/XdcUOV5+VfaJqkvO5edAwDtSc1jlPOaopMbPjQxFjuc3Br6SxzCbj8JCqjm7pjWVmPGikcoWUiAGrwGuuWZQQP3KkQA7vOkiuZ4JTJzAVsCfvCM18VXOY3o3Az4dGYpOGa6VxxDXG4WF1Hr8mtT+MbCbhdR5COho8+A1E6aeDhwN3A/4TpPFcR0TmAmBLYE/W0jNZLWHnaaF1LD8J9m7hdS5l1VxtZ4eEls2WXDFhDoMULR4+UTZTMAEVhNIHe39Azj/6uouYQKVCfwP8O+R0nK/2KZyKxkX9I5U/4vzE+DS3pE6m4Biah0CXLLBMuhYQufrFk8N4LnK7Ak4svnsH4FeALwZ2D/R02REu4VUL8/SuTqRCtcuTNHm5CO17i6U2F3FIqr/h9c9ToaAhdRkljLbiZSJKA36G8C1sx19jYFZSNWA1VJRxczYNNLWrQBtgU7BXgg8NEQc13VqOX/rX5meuY3XnKScyG+3ZhuubgJzJmAhNefV737ufwS2LelG6b506eqs7ofSfQ8WUt0zLvagBycmJK4BHNX/cFrv8W6AotiuYycBTwAUfyTmr3EX4N3rdOC6JjBzAvaRmvkD0OH0FZ9MccpSdmRIHK8f2JMwC6n+l1EPT4z7nYD39j+c1ns8ArjBGq2+DHhGuJqtbOAx/ymFR/jWGn24qgnMnYBv7c39Cehm/qnUQ4vePh5ynk5GRGliFlLdPExlraaE1FQim385/NqoS1apcw4APr9U8UecE1uqaBZSdem6vAmcm4DcC+RmUDR9Pq179G7W8yWQipgvIp8C5MIyKRFlITXMw77wFSr2PpXjKt3QkJNhHdPNvUdHAgSeDGwdaUhXafWmtJmACTQn8FNg10J17fTqh4rNBJoQuA/wpkRF3Vb/WZNGc6/jHan+VyglpJ6SCKPf/wjX7/EVwAMSTvXLrev6q2JIPT/RZSqdzj1a8MNaf5ZuwQTGTUC5K7XruwjH8r2G6ZjGTcGjb4tAmYhSHwrM+dm2OsupHQup/lcjdbS3F/CJ/ofTaY8XKLmVcYkKv05SQkppBZRewGYCJmACJjA8gVUiSsfI+j6YpFlI9b+s2oU5X6TbKQqpdemmhNTdgXes27jrm4AJmIAJrE3gtcADS1rRKcyjAF0kmqRZSPW/rLraHwuLvzPwq/6Hk3WPvwV2jIzQzuZZL5sHZwImMBMCTwaeUzJX7UQpgfzUTlvONWULqf6f9mcCTyt0O5kIry3jfAzwokKbPwCu3HI/bs4ETMAETKAegccHv97ULU+dKNymcBO7Xg8jKW0hNcxCaZtTkb83Bz4D3HOYYYyi1weFG31bAF8E7jyKUXuQJmACJjBdAq8LF4pSM9ROlEIdLIezmSwNCalbAlcMx0oXB3T0dEFgI+DPgAJsnQBcD1DEUr0uHx/tDMh080P1Tw3/XfFJ/gDsBCg2kK6wL5tuiOwCHAYowqnNBEzABEzABEwgbwIHAhcGtgIetmKoh4a4gHnPqKXRSUilruO31EVpMx8Abt9HR+7DBEzABEzABEygEQH5716sRk2l91oltmo0l3fRoYWU6CiG0JPyxuTRmYAJmIAJmMAsCbwHuGPNme8DfLhmndEWz0FICZ6OBf++RFH+MEpWq5hL+u9/W3pNyTYXiWxPL7y2KKZ4FfI/0vGkwg38ZSksverqNTnInRle+2fJCuqYcxH/Que+aitl4qmx63hTY9f49Fe0zQD9aXxq87Q1nqAqPIrNa5yal1hoR/LXIRr5zwH9fWGN8biqCZiACZjAdAjoO0/fF1VNflF7VC08hXK5CKkpsJzaHBaiSm8KC6ypra7nYwImYAKrCeh4TpkqykwbER8CdEtPSYnfubrZaZWwkJrWevYxG8V20k7e74DjwsWCOv1qF0yXDZR9/kTgJeFSw3fqNOKyUQI3Bt4YnEF1w7HudryxmoAJmMAygd+Ei2NlVO7dIL/qpChLSB0TbuYtRNUiJIKOfBb/TcdQOgrTf9NRlI7LdDNPX6pK9aHEsjqmki3X05GVbu7pi1emG34KpqijNZsJFAksdr4kqv4Urs7q5qhF1upn5QBAyZ+LH4J1HERX9+ISJmACcyBwHeA1wO6JyWoXSj+EnwC8dQ5AyuY4RBypCwWfnDpnrnNfJ89/w/HiQmRJxCsUh3bG6thlg/+aMt+n7CLhmq9+ZJxVUk5hP04JPyhUTFeDVVc7dQvfuEsFnzm1tbDLB1+7RSR7RbW/WsgfqKvF2iLXe1M/OOS/ph8rKqsQJPpx8ktAvnH6V+2LhRxCYz9Qbgt8pA4glzUBE5gtgf1CjEMlGE7ZEcCNZksoMvEhhJSGcfXg0KwvA5sJmEB3BJTfSvFfbCZgAiaQIqDToqOBy1RAdD/gTRXKzabIUEJqAVg+Hfr1Hcsxp1/m+lWvY8Si6TUdMS7f9IstmnLaFQOCLsptG3Y0qiz24pZf1dt1OurUkZRu7qVMN/t0ZKpy65r8jcRpFY9YP9cIuyiXBG4K6F/tgNimQeBuc3T+nMbSeRYm0BuBrwLXrdCbdugVkNu2RGBoIeXFyJfAQlRZYOW7RlVGplREr65S0GVMwARmS0CbBFVOiJSg+KmzpZSYuIWUn4i6BJSEUufoiq31/UScrFVtKk2Q/rTjqF1D74KtItb89dsBhzev7pomYAIzIKDLPTrpiZl2oY4Cnu3PkjggC6kZvENGNEXtgukyghyvJa70p/+deoOPaGqDDFXO6D6mHQS9OzWB0RC4T4nP09eBW9dwgxnNpNscqIVUmzTdVpcElkWW3thyipQPmsJwpPzgiuPRjTr5xilExx8TMbC0vb1jiPqu7W7578V83ZTgWwJPvmlK5q1fbUrUrZ26hd+fXt8+hAbRGHXDUOEI9N9VXsnA1bbiai2i4au9Yv5L/X+9LodQ/W/VVUiRYsiSxXzV5reDz1uXa+K2TcAExk2gTERpZnILkHuArYSAhZQfDxMwARMwAROYHwHFgFKu25TpB5l++NUNMTM7khZSs1tyT9gETMAETGDmBA4GFJG8TEQ9BnjpzDlVmr6FVCVMLmQCJmACJmACkyDwXOBJJTPRJSC5TyjPqq0CAQupCpBcxARMwARMwAQmQGCVT5T8O3Uz2yKqxmJbSNWA5aImYAImYAImMFICq0SULrHcwiKq/upaSNVn5homYAImYAImMCYCTweesWLA9wfeOKZJ5TJWC6lcVsLjMAETMAETMIH2CbwBUH68lOl23iOBV7bf9TxatJCaxzp7liZgAiZgAv0Q2Dkckf0GOD50qXhyylGnuHcXDf9dwXIVUXyRb1Vx4hSfTnXUhuLYbRzix32h4dDVr+LVpexvwN4+zmtIN1SzkFqPn2ubgAmYgAmYgAgo5tJ7gOt1gENO4PcEDqvZ9l1KkpZbRNWEmSpuIdUSSDdjAiZgAiYwSwISUI8GHtXx7P8CbFGzD+02fSRRZ0/gczXbc/EIAQspPxYmYAImYAImsIHAlsCTgXsBFwb+DvwaUPqorUOxUwD97RDSQPXF70bAERU7k1BSwvLNE+WVMF5zsK1JwEJqTYCubgImYAImMHoCyn+5L7AfsE/Gs7k88OMK47s68NWQozNWXA7myt/5zwptucgKAhZSfkRMwARMwAREQAlq5eSseEJyjD4jJNxWomwdX10wJAiXg7SSZsv0HXJ0cJqW87T+5CStpNmyKwPa+fgt8BNgM+AqwYH62ETicNW7ArBdcJSWcNB4rhaSif80JApXEnIlL1ei7++Ef2MreY0w9uPCztKijJy7rwpcMfzl/hQo0fpbgUsv8ZcYEicJQTmtnxhY3SSwTs3pg0E05j7nUYzPQmoUy+RBmoAJmEBnBCR0fhGOrjrrZIYNnwqcFI7WJHR0A0+iVAJuowF5yGfqtgP2P7muLaQmt6SekAmYgAnUIvAl4Ia1arhwGYG3AccAnww7Z8tl5ZB+4ID4PgDcfsD+J9m1hdQkl9WTMgETMIHKBH4P6JjMth4BOaSfPxy1rddSN7V1Q08O6LaWCVhItQzUzZmACZjAyAgcCVx7ZGPueri6zfY/gNhox05HcrJLhn9/Ho7nFKdpD0BO4PL/ytUOBQ7IdXBjH5eF1NhX0OM3ARMwgfUIXC44a2s3Zc6mMAfvDEEvFTZAptABnw1CafF9qX8lrOR8P6SvU9W18k5UVVINy1lINQTnaiZgAiYwIQKKj6SEtUpfsmy6wSexsGM4ttKNPO3WSEjoCr3+1S06pSHZNdzuUxTu74VbdLppd6Hw+o/C/9bujRyudYtOaVRiptt+2wK6qfaD4Aiv23USe9oN+mVIp6IdIt0g1M1BOXcX7QLh5qAE0a9Cn4symqtuByoEwMcAJfYtmpzF5YzflZ0OvCvcXtRtRvWlm3eaj+JZaXy6sag5a/y6Vak5L3bI9B2uW3uan9rSOsipXYE7xVg+UU/savBu9xwCFlJ+EkzABEzABEzgvAQeA7yoQzASqTpSXYSK6LArN90lAQupLum6bRMwARMwgbESeHFI/dJ0/Nrp0u6dctrJtDumnb9F8uL7hsjjTdt3vUwIWEhlshAehgmYgAmYQFYEFKxTgT6rmo4YlVRYwS71r3yuYqajTgU1tU2EgIXURBbS0zABEzABE2idwOuA+69wg/k68NIV4qn1gbnBfAhYSOWzFh6JCZiACZhAfgS0g3Tn4PguJ259bypSuf49xLtL+S1Y3yP6/6H3RIuFINAfAAAAAElFTkSuQmCC', 'bizAdmin', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '业管', NULL, '男', NULL, '1995-01-01', '汉', '四川省成都市', '四川省成都市成华区大港三街83号-3-10', '四川省成都市成华区大港三街83号-3-10', '身份证', '82bf93da3e832e7cb90278a4a75268c4ef43af01915e6312f617a8c0636b805c', NULL, NULL, NULL, NULL, NULL, NULL, '9c8f683ccff14071f90f1f51ba83f069', 'bizAdmin@foxmail.com', NULL, NULL, '业务管理员', 'eb77186abe605f8de5958df60ef4a279', '新疆维吾尔自治区乌鲁木齐市达坂城区大学广场97号-3-6', '0001', '2022-07-04', '1543842934270394376', '1543899639134019612', 'C1', '1543837863788879876', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '2', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879874', 'data:image/jpg;base64,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', NULL, '15908868936', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '云峰', NULL, '男', NULL, '1996-03-01', '汉', '贵州省遵义市', '贵州省遵义市习水县正阳关街95号-1-6', '贵州省遵义市习水县正阳关街95号-1-6', '身份证', '6a03973f8de7f8bde0124998dfd2fdffed589f76433e51397463420ae797032e', NULL, NULL, NULL, NULL, NULL, NULL, '230c50186acba606954675cc5a3ba95f', '0dv7fw15@sohu.com', NULL, NULL, '梁发', 'b32a0e152a33b7ca1a22c99ef74e57eb', '湖北省武汉市江汉区周村大厦17号-4-4', '0002', '2022-07-04', '1543842934270394369', '1543899639134019583', 'A0', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'DISABLED', '3', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879875', 'data:image/jpg;base64,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', NULL, '15908818916', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '华明永', NULL, '男', NULL, '1992-06-10', '汉', '四川省自贡市', '四川省自贡市大安区大港沿62号-8-1', '四川省自贡市大安区大港沿62号-8-1', '身份证', '82d38e9ac108939377a52ddfdf0f91261f07edec4822c0206f760e32b77dfe4c', NULL, NULL, NULL, NULL, NULL, NULL, '404cd70992ccddce5eb61e3506fbaf0c', 'jqaqyv@yahoo.com', NULL, NULL, '范琼勤', '7fd5feae3b9b50bf5a519f4b517e3b05', '黑龙江省大庆市让胡路区兴安大厦112号-15-8', '0003', '2022-07-04', '1543842934270394369', '1543899639134019584', 'A1', '1543837863788879874', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '4', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879876', 'data:image/jpg;base64,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', NULL, '15908787747', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '周丹', NULL, '男', NULL, '1995-12-12', '汉', '四川省自贡市', '四川省自贡市风岗街73号-7-8', '四川省自贡市风岗街73号-7-8', '身份证', '1b70b117e828708f263b5762ae1ff2d54e241ce8631575943563093a16421680', NULL, NULL, NULL, NULL, NULL, NULL, 'c1b5b42528518db8ff18cb3b9264a4e7', '62cyzqd@263.net', NULL, NULL, '席瑾颖', 'e2137bee07214b0a438d700fa65c27c6', '四川省阿坝藏族羌族自治州金川县沛县路100号-19-7', '0004', '2022-07-04', '1543842934270394369', '1543899639134019585', 'A1', '1543837863788879875', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'DISABLED', '5', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879877', 'data:image/jpg;base64,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', NULL, '15908773956', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '秦琼勤', NULL, '男', NULL, '1993-05-01', '汉', '江西省吉安市', '江西省吉安市新干县新安路144号-3-9', '江西省吉安市新干县新安路144号-3-9', '身份证', 'ed1c175925a79ac0a69285eb76faec1efc64560802fd96f5f17c3ad51a38eee4', NULL, NULL, NULL, NULL, NULL, NULL, '35949e6af4eac27ef729c2bc71033cab', '55kqvepy@yahoo.com.cn', NULL, NULL, '花贵福', '688bc77909af612c330f097d115f1e9c', '四川省凉山彝族自治州雷波县李村街128号-16-3', '0005', '2022-07-04', '1543842934270394369', '1543899639134019585', 'A1', '1543837863788879875', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '6', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879935', 'data:image/jpg;base64,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', NULL, '13008080822', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '狄星', NULL, '女', NULL, '1995-02-26', '汉', '贵州省黔东南苗族侗族自治州', '贵州省黔东南苗族侗族自治州镇远县市场二大厦28号-10-9', '贵州省黔东南苗族侗族自治州镇远县市场二大厦28号-10-9', '身份证', '42896a659d6c6bbad711f3a878471ecda1a8b02e10952851c1dd87ea27012008', NULL, NULL, NULL, NULL, NULL, NULL, 'ba8cfb2d9a33a5b3a91297ce0fbcc836', 'dnv66ool@0355.net', NULL, NULL, '何信子', '8cd6398f893d93820b2155643deb8494', '四川省甘孜藏族自治州乡城县吴淞路39号-7-5', '0063', '2022-07-04', '1543842934270394382', '1543899639134019632', 'C1', '1543837863788879934', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '64', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879936', 'data:image/jpg;base64,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', NULL, '13008101333', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '云龙', NULL, '女', NULL, '1995-03-12', '汉', '河南省焦作市', '河南省焦作市中站区钜野广场117号-8-10', '河南省焦作市中站区钜野广场117号-8-10', '身份证', 'add53fb225b7b405b0b69ad8cb89ccfc506ad6c7369d15ce9b4ee1b03f96fa60', NULL, NULL, NULL, NULL, NULL, NULL, '87291445ddb5907a9bf7c9efb1326f6c', '036oyk@hotmail.com', NULL, NULL, '何霞香', 'da752c920827025e1259ba8b515248d2', '四川省成都市青白江区长春街15号-8-7', '0064', '2022-07-04', '1543842934270394382', '1543899639134019633', 'C1', '1543837863788879934', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '65', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879937', 'data:image/jpg;base64,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', NULL, '13008134985', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '苗云莲', NULL, '女', NULL, '1996-04-22', '汉', '四川省内江市', '四川省内江市大港三街110号-11-1', '四川省内江市大港三街110号-11-1', '身份证', '7a0cf89e424e367946e442f63512d3e2a3ef2a6abfcb6d4e904aa76a03a0583b', NULL, NULL, NULL, NULL, NULL, NULL, '8628107fa6758122a5957edaf329a595', 'xde49s@sohu.com', NULL, NULL, '袁庆', '777f1833c53e195e8efa1ef8c1a27ec6', '四川省攀枝花市东区吴兴大厦14号-16-9', '0065', '2022-07-04', '1543842934270394382', '1543899639134019633', 'C1', '1543837863788879934', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '66', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879938', 'data:image/jpg;base64,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', NULL, '13008193037', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '曹武新', NULL, '女', NULL, '1993-03-31', '汉', '宁夏回族自治区吴忠市', '宁夏回族自治区吴忠市同心县巢湖街61号-2-4', '宁夏回族自治区吴忠市同心县巢湖街61号-2-4', '身份证', 'a8533256d951a052c1cfbbec1bcf9d89c7b7a0587fda00379475b0ad6fbdca57', NULL, NULL, NULL, NULL, NULL, NULL, 'd704c57ddd415a38516374d1380d6a6a', 'dvxcz4kx@aol.com', NULL, NULL, '顾巧', '3cec7df880ea42e297b104bd9b7c80b2', '四川省宜宾市台东四路114号-15-4', '0066', '2022-07-04', '1543842934270394382', '1543899639134019633', 'C1', '1543837863788879934', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '67', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879939', 'data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCeiiivzs/RQooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAJrS2e8u4raNkV5WCKXOBk+pq/rug3Og3SRTMJEkXckijAPqPwP9Kr6bpV9qszR2EPmyRjcRvC4H4kV0esNr2q3Gn6LfwQW8rjKszBi5AILEjOOh4FdtKgp0ZNxd7qztp6djjq13CtFKStZ3V9fXuYOh6V/bWqJZed5O5WO/buxgZ6ZFM1rTf7I1aex83zfK2/Pt25yoPTJ9a7Tw54Q1DR9ZjvLia2aNVYERsxPIx3UUzxB4N1HVdcuL2Ca1WKXbgSMwPCgdlPpXU8tqfVb8j5+b8Lf5nIszp/Wrc65OX8b/5HK6Hov9sSyq8s0MaLnzI7ZpRn0+XpW4vgaFmCjU7nJOOdNkA/nVbS5NS0e61DRolQseZp41dvLAH3ht57+lbNndXmqllsL62maJ0aRYTcI23cM43tjoDV4ahQcFGcLy1739FrqTiq+IU3KE7R07W16vTQpTeAo4H2PqkxOM/JYO4/MEis3V/C402wa5iubi4KsAytZPGAPUseK7K8j1G51SWW2nt47fy0CieZsbstnARxjtnPtWN4iudS0rSJre6WGeK+OFkjkciPAHADEnnGetb4jCYeEJSULJX11+XU58Ni8ROcYud27aafPocHRRRXzx9CFFFFABRRRQBoaRqN3p98jWkxiMjKj4AORnpzXV+N47uTX7EWIl+0CAlTESGHJycjpXF2ez7db+Y4RPMXc56KM8mvSfEXi210rdDaLHPesuM9VQdsnv16V6+CcZYWpGrOyTX9JHkY1TjiqcqULtp/puznPBup39z4jhiuL65ljKOSkkrMOnoTUfi3VNQt/E95FBfXUUa7MIkzKB8inoDUPgf/AJGiH/cf+VReM/8AkbL3/tn/AOi1pOpP+z07u/P+hSpw/tFqytyfqa3g+3ubqZ72HXFju3YiS3kTzDIoxycsD36/rWr4UhvG1rVr25j+SVyiyBdqsVYjgfhXOeBZYYfEDPNMkaiB+XOM9D/LJ/CtiLW9Ah1O5gFwwsWjYkyIzo0xbJYDB7d8DpXVg501Tpzk7Wb67u2+pyY2nUdSpTir3S2WyvtoaX/CLS/899M/8FUf/wAVVTxtYT/8I5aeWqsloR5jKFRQMbchc8DPYVNo/wBnvIha6RqdkYokHnx/2cQJc8ZbLDP4VX1wJp3gy7tpkt7ee4mBSCE8AbweB9FzXTVjTeHm4xsmnrzXWn39fQ5aUqixMFKV2mtOWz1+7pr1PPKKKK+WPqgooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA/9k=', NULL, '13008210336', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '计霭', NULL, '女', NULL, '1994-07-20', '汉', '四川省成都市', '四川省成都市郫县春阳路78号-4-9', '四川省成都市郫县春阳路78号-4-9', '身份证', '0d0af00160f267c401ef748f9b9b007df4a98d1ed23e6df5e6c160223eb493f9', NULL, NULL, NULL, NULL, NULL, NULL, 'eb0851adc8928c6a30922243927da8ff', 'zkvryrde@yahoo.com.cn', NULL, NULL, '金先', '0fb0d2022416c343a6c19765a3e4bd23', '河北省承德市双滦区东海一大厦121号-7-10', '0067', '2022-07-04', '1543842934270394383', '1543899639134019634', 'B1', '1543837863788879877', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '68', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879940', 'data:image/jpg;base64,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', NULL, '13008233582', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '方贞', NULL, '女', NULL, '1992-12-29', '汉', '江苏省徐州市', '江苏省徐州市邳州市德盛街149号-9-10', '江苏省徐州市邳州市德盛街149号-9-10', '身份证', 'fec3b1870c482373bc1accdeace9fbbae8677c8f71353e5f1773aba2b55709fa', NULL, NULL, NULL, NULL, NULL, NULL, '066a6be3ea29699f5000602d57bf29cc', '03jsrhhiy@live.com', NULL, NULL, '孙秋', '389b91a8cf78c536ea2132fe3fae630f', '四川省阿坝藏族羌族自治州阿坝县澄海一路113号-13-1', '0068', '2022-07-04', '1543842934270394383', '1543899639134019635', 'C1', '1543837863788879939', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '69', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879941', 'data:image/jpg;base64,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', NULL, '13008260931', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '项斌', NULL, '女', NULL, '1995-08-23', '汉', '四川省德阳市', '四川省德阳市善化街78号-15-3', '四川省德阳市善化街78号-15-3', '身份证', 'b63e4d948a0dd114f95ebf377abf8ea886efb0d4901d56709928e53fc87347f7', NULL, NULL, NULL, NULL, NULL, NULL, 'd520a47835e9a4e3cbd6f2894a07e2c8', 'bvz07yx@live.com', NULL, NULL, '宋纯毓', '887f95b28949bcd05ec7312b93093a1a', '四川省凉山彝族自治州宁南县荷泽二街73号-9-1', '0069', '2022-07-04', '1543842934270394383', '1543899639134019636', 'C1', '1543837863788879939', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '70', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879942', 'data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDKooorrMAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAL2kaa+r6pBYpNFE0rY3yNgD/E+g71oav4Q1fSdQW1NrJc+ZkxPboX3gdeByCPSq3h7Q5fEGqLZRTxQHaWLufT0HUmuy8P22tWfxBtbfWpnmkjtnETl9wKY4I/8Ar8+tQ3YaRzuheCtS1XUPs13b3enx7C3nS2rYyMcc4/nVXUPCmr2eoXFtDp19cxxOVWZLV8OB3GM/zr1HTdU16fxhd2V1ZummJv8AKmMDKGwRj5uh702z13U4tf1OLU7W5TT4mIt3jsZX3c9dyqeMVPO7lcqPF3Ro3ZHUq6nDKwwQfQ1b0nTzquq21iJliM77A7DIB7V3fw+1ixhvtduLy8t7YXEqOgmlVM8yE4yecZFOk+K7JIyrpCsASAwuev8A47VOT2SFZdTkvFHhmXwzdwQPcCcTR7w4TaAckEdT7fnWFXpH/C2X/wCgMv8A4E//AGNXvEPiax1r4eXD/aLaK7mVD9lE6s64kHbg9BnpSUpLdBZdDymiiitCQooooAKKKKAJrRZmvIVt2ZZ2dRGVOCGzxg/WvTdH0PUdO+IaS6jfLeyyW0kgkGd20YXkduvauL8FQ28viuya6miiiiYy5kcKCw+6BnvnFej2usaWPFOt3txexiS1iWBIyefLUbnI9fmJ4Hp71nN9C4onGoalqFlrQ0y+Vr+0uXjjhMa4UKeF98jPJ7j2NRRatqWm+C7jUvEDKLl1Plw7AhGRhVI9SeT6D6VS06fw74cjm1+XVGnn1ANLtBwW3NnAjB654yentS3lx4e8faagOoyWk0AL+W7hSnHJKnhh7j8xUW+4o5Twz47/AOEc0k2P9m/aMyGTf5+zrjjG0+lbkPxVM08cX9jY3sFz9q6ZP+5Xm9wkUdzKkEpliViEkK7dw7HHavQfD/hfwtcafYajcam6T7VeSF7mNV3A8jGM4yPWrko7shN7HU+LfFv/AAi/2P8A0L7T9p3/APLXZt27fY5+9+lcnefFE3djcW39j7POjaPd9pzjIxnGyq3xK1qx1S7sbeyuEn+zq5d423LltvAPf7v61wtKMFa7HKTuFFFFakBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB/9k=', NULL, '13008260970', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '蓝波宁', NULL, '女', NULL, '1995-08-08', '汉', '贵州省黔南布依族苗族自治州', '贵州省黔南布依族苗族自治州长顺县顺城路82号-8-6', '贵州省黔南布依族苗族自治州长顺县顺城路82号-8-6', '身份证', '8feae1ad23915b439261f66a2c7481f9c4b1d415c457917e60613098e5b480bf', NULL, NULL, NULL, NULL, NULL, NULL, 'e8d98d2e24d808843f41987d5f1d9b7c', 'd77ozai@yahoo.com', NULL, NULL, '严昌成', '5df4bb4f85f672aadfa16223a2962233', '四川省阿坝藏族羌族自治州金川县宁夏路97号-20-5', '0070', '2022-07-04', '1543842934270394383', '1543899639134019636', 'C1', '1543837863788879939', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '71', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879943', 'data:image/jpg;base64,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', NULL, '13008301129', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '施学祥', NULL, '女', NULL, '1993-06-03', '汉', '四川省内江市', '四川省内江市漳州路一路119号-4-1', '四川省内江市漳州路一路119号-4-1', '身份证', '9695ff4d786d7349453c8599725135fb71003a0eff95f5db08c606d45d7d7091', NULL, NULL, NULL, NULL, NULL, NULL, 'e95115f3fc8d013c42b2f669ebc03382', 'gzpy5hu@0355.net', NULL, NULL, '穆柔', '6d8faa32bafff2d4e38ad1399d025475', '四川省甘孜藏族自治州新龙县丰盛街38号-15-3', '0071', '2022-07-04', '1543842934270394383', '1543899639134019636', 'C1', '1543837863788879939', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '72', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879944', 'data:image/jpg;base64,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', NULL, '15905695070', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '金钧冠', NULL, '女', NULL, '1996-03-13', '汉', '四川省阿坝藏族羌族自治州', '四川省阿坝藏族羌族自治州小金县沛县路54号-17-5', '四川省阿坝藏族羌族自治州小金县沛县路54号-17-5', '身份证', 'f24b2e708177aea5f11ca5ada58083578bc87c5df8350e8ddff6c5a35be1ed9a', NULL, NULL, NULL, NULL, NULL, NULL, 'a618744318ccd50eca3465ebb60db3bc', '03y2j8i@live.com', NULL, NULL, '汤茜秋', '5c323814e71902936b966ce255909f78', '江西省赣州市信丰县高田广场28号-14-6', '0072', '2022-07-04', '1543842934270394384', '1543899639134019637', 'B1', '1543837863788879877', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '73', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879945', 'data:image/jpg;base64,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', NULL, '13008301438', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '韩坚和', NULL, '女', NULL, '1994-05-23', '汉', '四川省眉山市', '四川省眉山市彭山县西陵峡三路65号-18-9', '四川省眉山市彭山县西陵峡三路65号-18-9', '身份证', 'f66f73f1095ecb50765d9b9f3db206fd8d41a4aa51f1f926de293f38d9dfaecb', NULL, NULL, NULL, NULL, NULL, NULL, 'd69c2841aa520a631840e43b5654e541', '1fasez5@aol.com', NULL, NULL, '昌辰', 'e17e2163c323cfe25f22f35e73a32683', '四川省攀枝花市东区宝山广场95号-20-2', '0073', '2022-07-04', '1543842934270394384', '1543899639134019638', 'C1', '1543837863788879944', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '74', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879946', 'data:image/jpg;base64,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', NULL, '15900456019', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '萧才发', NULL, '女', NULL, '1993-07-19', '汉', '四川省巴中市', '四川省巴中市平昌县临清路24号-6-7', '四川省巴中市平昌县临清路24号-6-7', '身份证', 'eeb6c02a5ccdf14b649aa858ea4dcebbd43e5e45dcc24fdb7afa79503bcbb614', NULL, NULL, NULL, NULL, NULL, NULL, '801a394cddb51fd53a6175c6d0477907', '6eqakmuhm@ask.com', NULL, NULL, '柳霭', '1c689822c5fa80cfad8a6aca3501a786', '四川省南充市顺庆区泰州街108号-12-8', '0074', '2022-07-04', '1543842934270394384', '1543899639134019639', 'C1', '1543837863788879944', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '75', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879902', 'data:image/jpg;base64,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', NULL, '15908180826', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '钱珍贞', NULL, '男', NULL, '1994-03-24', '汉', '宁夏回族自治区中卫市', '宁夏回族自治区中卫市海原县团岛三街70号-7-6', '宁夏回族自治区中卫市海原县团岛三街70号-7-6', '身份证', '5696b41984b1fc4367a8a4340f23f8a58d41a4aa51f1f926de293f38d9dfaecb', NULL, NULL, NULL, NULL, NULL, NULL, '1efdce284d2d6c7bb6a6a7a3f9698096', 'zdauc8@qq.com', NULL, NULL, '尹松善', '81facefc21b72b86113731d5aa94b0a1', '新疆维吾尔自治区伊犁哈萨克自治州霍城县台西四街23号-2-6', '0030', '2022-07-04', '1543842934270394374', '1543899639134019608', 'C1', '1543837863788879898', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '31', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879903', 'data:image/jpg;base64,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', NULL, '15908111533', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '赵露瑶', NULL, '男', NULL, '1995-04-04', '汉', '四川省成都市', '四川省成都市新津县城阳街124号-12-1', '四川省成都市新津县城阳街124号-12-1', '身份证', '6b9459d9cc52f4a7e181b791dbd271d06191cc359886dd2a1788ce319e03c6af', NULL, NULL, NULL, NULL, NULL, NULL, 'f1be5388ed7dd1bcff384ac6c837576b', '23fa5cnt@yahoo.com.cn', NULL, NULL, '邬泽', '74a5e44cba344c772a2bb48bb930335f', '四川省南充市阆中市夏津大厦112号-19-1', '0031', '2022-07-04', '1543842934270394375', '1543899639134019609', 'B1', '1543837863788879875', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '32', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879904', 'data:image/jpg;base64,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', NULL, '15908098268', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '吴邦', NULL, '男', NULL, '1993-06-30', '汉', '四川省凉山彝族自治州', '四川省凉山彝族自治州美姑县宁国一支广场146号-4-7', '四川省凉山彝族自治州美姑县宁国一支广场146号-4-7', '身份证', '5301fa5eb41f5def3d156bd0aa9f2efcbb32e09cdfbeb6f958ac659d85d25ef4', NULL, NULL, NULL, NULL, NULL, NULL, '7631822e658ca33eaa788a8c445e2382', 'url2136q0@qq.com', NULL, NULL, '章维启', '285ae2361561b6141b110474da4e10df', '湖北省鄂州市梁子湖区秀湛路132号-7-8', '0032', '2022-07-04', '1543842934270394375', '1543899639134019610', 'C1', '1543837863788879903', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '33', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879905', 'data:image/jpg;base64,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', NULL, '15908030306', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '史光天', NULL, '男', NULL, '1994-07-28', '汉', '四川省南充市', '四川省南充市高坪区金口三路24号-7-8', '四川省南充市高坪区金口三路24号-7-8', '身份证', 'c3856e1bc5d148b97cd61088dc9a3d2454388a51f724a92d9dfa96ace6d5b3a1', NULL, NULL, NULL, NULL, NULL, NULL, 'af06e3492255070071f66316d9de8c62', 'z590w8oi8@0355.net', NULL, NULL, '费翰', '69906634de43310294a4c0511a3f4640', '河南省洛阳市西工区福山大厦35号-1-6', '0033', '2022-07-04', '1543842934270394375', '1543899639134019611', 'C1', '1543837863788879903', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '34', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879906', 'data:image/jpg;base64,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', NULL, '15907980472', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '臧生龙', NULL, '男', NULL, '1992-07-24', '汉', '山西省临汾市', '山西省临汾市尧都区驼峰路37号-16-1', '山西省临汾市尧都区驼峰路37号-16-1', '身份证', '7863e9e614a4903ea4eb5fb76b6613371effab7bd587ee853c84ac687e14788b', NULL, NULL, NULL, NULL, NULL, NULL, 'b01ea59f0f7137954a1a8534301a11b1', 'mvokoze@live.com', NULL, NULL, '蒋东文', '661950822e89a52d26ecc821b6d2a5bc', '云南省文山壮族苗族自治州马关县台东三街117号-11-6', '0034', '2022-07-04', '1543842934270394375', '1543899639134019611', 'C1', '1543837863788879903', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '35', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879907', 'data:image/jpg;base64,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', NULL, '15907956213', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '尤薇', NULL, '男', NULL, '1993-10-16', '汉', '四川省成都市', '四川省成都市彭州市掖县路37号-11-10', '四川省成都市彭州市掖县路37号-11-10', '身份证', '825d21e757c17cdd138de639781c6f01e4d089196dfde0b15ad8decd28afa723', NULL, NULL, NULL, NULL, NULL, NULL, 'c0355b135baed6101463f2b65016d6e6', 'bxmowe3vp@0355.net', NULL, NULL, '廉毅', '47801741321e1f7b1693280aae521868', '四川省阿坝藏族羌族自治州黑水县昆明路141号-18-6', '0035', '2022-07-04', '1543842934270394376', '1543899639134019612', 'B1', '1543837863788879876', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '36', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879908', 'data:image/jpg;base64,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', NULL, '15907955395', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '何红', NULL, '男', NULL, '1993-04-03', '汉', '四川省绵阳市', '四川省绵阳市三台县山东路115号-8-4', '四川省绵阳市三台县山东路115号-8-4', '身份证', '453c3b546b49a7aea17701d3894a66f1b0f9361d0e04a29009b9a657fd71620e', NULL, NULL, NULL, NULL, NULL, NULL, '36ded054e375f9a225908210b4dbf076', 'nu6ppye@msn.com', NULL, NULL, '严宁', '607ee5d0d045dcb4a10110806f2ef0e7', '四川省自贡市富顺县枣庄广场77号-1-7', '0036', '2022-07-04', '1543842934270394376', '1543899639134019613', 'C1', '1543837863788879907', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '37', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879909', 'data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCeiiivzs/RQooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKALNhZm/vI7ZZoYS+fnmbagwCeT+FdWPBEB0Jrg6jB9rDYEgnH2fG7HJ25zj9a5/wAP7RrETm9Fm6cxyeSZct0A2++a9PH2z+xWzfyG4zxcfYTkc/8APLr04/Wvay3C0qsJOau9e3+f/A8zxczxVWlUjGnKy06P/L/g+R51b+GHmvZIDqemgRFct5/D55+U45rT1fwTFbXSJZ6lbRRlASt7OFfOT0wvTp+tadjY6hBrV5dDUrhWlKbpDpb4lGPT+HHStnW5bmCTzE1VrKBY/n/0Iyr1PJboO3H+NdFLA0fZSc49e67v+9/Xmc9XH1vbRUJ9Oz3sv7v9eR5vZeHNV1KFprO2E0SuU3iRQMj6kVY/4Q/WlmhSa2SESuEV3lUgHBPO0k9vSrnhLVby21u30yC63WTzNldg+fg85IyOg71P421e/TWZLFLlltk2OqqACGx1zjPf1rhjQwv1b20ua6draWvv9x3Sr4p4n2MeWzV763tt94z/AIV5q3/PxZf99v8A/E1HP4B1WCCSZrizKxqWIDtnAGf7tdD4nj1KPw5p1rZR3ckw2+Y0KszYVcckepP6VxU8OvxQu88epJEB8zSLIFA981tiqGGoy5fZyenf/gGOFr4mvHm9pFa7W/4JlUUUV4p7QUUUUAFFFFAEtqk0t3DHb589pFWPBx8xPHP1r01NLvNi77nX92OcXMGM/nXDeF7G3vtdgS6mjjiQ78O2N5HRR/npmur0gaRqt3q8FuI1522+9yT0ILLk9M88e1e1lkEo3f2nZa22V+zPFzObcrL7Ku9L7u3dF/8Asu6/5+fEP/gTB/jS6vA9v4Nv0ke7dtuc3Tqz9R3XjFQy6DqN3olpYXT2gkgkH+kRSsDs+m0ZJ/8Ar1mOnhu01a80y4md4ZIc+e8xYRN1Kj9D654r0aj5ItWtzK12+rXoedTXPJNO/K72S6J+vU57wl/yNNh/vn/0E1r+L9J1CfX7q9htHe3ijV2kIwuFXJ69aj0TxVa6BYTWqW7XTiZjHIMIGTjGep9ah1PxxqOo20tssUEMMqlGCgliD15P+FeXGWGjhPZTndt30XW1rX2PVlHFSxftYQskravpe97bi/8ACe61/wBO/wD37/8Ar1vz6ncan8O7q8utgkcFflGB98AVl6doPhi8022nuNV8idox5kZuY1w3fgjIqXxLqulWvh1NE0qZZVJG4o24BQd3J7kn0ropzrwpTnXqXTi7K99Xsc1SFCdWEKFOzUld2tot9Th6KKK8A98KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP//Z', NULL, '15907915216', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '费慧巧', NULL, '男', NULL, '1996-12-28', '汉', '四川省甘孜藏族自治州', '四川省甘孜藏族自治州康定县德平广场22号-7-7', '四川省甘孜藏族自治州康定县德平广场22号-7-7', '身份证', '6c8775aa2b4963f1adbf7782ec889f42ed589f76433e51397463420ae797032e', NULL, NULL, NULL, NULL, NULL, NULL, 'd6ed8739c2837d1194899843947e3e12', '03jwur905@0355.net', NULL, NULL, '计保', '7782e29b27a434cac91dd5935002bc4a', '四川省绵阳市港联路91号-16-9', '0037', '2022-07-04', '1543842934270394376', '1543899639134019614', 'C1', '1543837863788879907', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '38', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879910', 'data:image/jpg;base64,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', NULL, '15907833046', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '韦言', NULL, '男', NULL, '1994-10-18', '汉', '湖北省恩施土家族苗族自治州', '湖北省恩施土家族苗族自治州鹤峰县如东路131号-6-4', '湖北省恩施土家族苗族自治州鹤峰县如东路131号-6-4', '身份证', '34db39a1e1976b47b4390bdcda928b758d41a4aa51f1f926de293f38d9dfaecb', NULL, NULL, NULL, NULL, NULL, NULL, 'a92b96e737d0af8a149a9663405f83e8', '720s39xk3@yahoo.com.cn', NULL, NULL, '姜磊民', '0d46b049b6c704c7b839bac0d2d51f35', '四川省攀枝花市西区泰州一路53号-5-10', '0038', '2022-07-04', '1543842934270394376', '1543899639134019615', 'C1', '1543837863788879907', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '39', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879911', 'data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDvKKKK/IT6sKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigC1Y2MuoTNFEyKwXd85IGM/wD16v8A/CNXv/PWD/vo/wCFV9FgFxqAUzNGAu4hTgsPSuhmjEl8kst7GsCDiINjPuTmvo8sy6hXw3tKkG3e3xJfPyt977HnYnEThU5Yvp2MBNFmOoizeRA2zeWXJAH6VRuYfs9zJDvD7G27hXY2tgttcT3Cu0hk+4GOdo9M/WotP1U30M8rQ+WsQ/vZzwfaumeR4e0acpck5OTW8tF06LzM442eskrpW8tWcxp9n9uu1g8zZkE7sZ6VL/ZF0880dunmrE+wtkLz9Ca2NIvobu8kP2UCdiXMmAdo4GM9aW8lupZpo9OiMTxEtKcAb/THrXPSyzCPCqo25av4U7tW2Semm78jSWJqqo42tp12OfurG5stn2iPZvzt+YHOPp9asS6Z5elR33nZ3nGzb0698+1bt/cwwNALm1NwRESfkDbemSc9OlLcXdoNFWc2wMLcLHtHB57dK0eT4SE6sefaOl73W2rtZMn63Vai7bv7zkaKKK+XPTCiiigAooooAu6Zb2tzcMl3N5UYTIbcF5yOOa6H+zNM/szbuj8r/n4yu7r/AHsfhXPaZDaT3DreSeWgTIO4DJyOK3Td6PFY/Ymm3wj+EbiTznqPevqMnVFUJSqqGqaTk9W+z8vNanm4tzc0ot9NkVobpbTW4oY7tprZlC5LhhnGB0+gqxfpHpWk3CIfmndsfj/gKS3/ALFgT7dGAoU7QGJJz7A96EvrHWonguB5TKSUyeceoP8ASu6naNKVN1I+0nfks20k0r6/kYS1kpKL5Va+nYj8OPBHCV/5byuR+AGfyqwuoST6wttFCA0bMJH/ANisnRQi62ojYsg3BWIxkYq02qRWE+oAR5uGkOxvX6/SufB4zkwdNTkoRjJp262V/vbLrUr1ZWV21+ehevpjZaiJ58m0li8tsDOCMmqV7t/4RiHYSU3/AC564yapWs9xqeywmutkfLbiucnrzV7VjBa6NDZpMsjhh0PPfmiWK+sUa1eOkHF2va/M7XW+3bQap+znCD+K6+5X1Odooor5E9UKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP//Z', NULL, '15907746112', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '袁致树', NULL, '男', NULL, '1995-12-04', '汉', '海南省省直辖县级行政区划', '海南省省直辖县级行政区划中沙群岛的岛礁及其海域伏龙街110号-16-3', '海南省省直辖县级行政区划中沙群岛的岛礁及其海域伏龙街110号-16-3', '身份证', '14b326ccd21b4aa1423ea8f66d6ac7b3f051bcd9eba02f31d01ef6b0f2e4c35f', NULL, NULL, NULL, NULL, NULL, NULL, '086b5d659bb6f67c5638b9ca727dcd5a', '9au1mqc@aol.com', NULL, NULL, '项宏言', 'c9d4c33511a178b41de86bbf8e473c18', '湖北省襄樊市宜城市仙游路66号-7-6', '0039', '2022-07-04', '1543842934270394376', '1543899639134019615', 'C1', '1543837863788879907', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '40', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879912', 'data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCvRRRX25mFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBPa2V1euUtLaa4dRkrFGXIHrxXRaR4IvdRsrue4FxZyQjKRSWzZl4J4yR6Y79aydD1q90W8aWx8syyr5eHXI6ivTtNvvE62tyNS0pnuCP3BgaLaDg/ezJ64rzsbXrUvgsvnr+JSPONP8L6reX8FvNYXlvHI4Vpntmwg9TnH86m1jwjqWm6i9tbW13exKoImjtmwcjpxn+dekXEniKPQree3hSTUyV823cpsHXPOR7d6bcN4nOiJcQC3/tEkFrXYoUDoQCXOT3zn8K5f7QquSd422tf8f60Cx5ronha81q5urdXS3lt1y0cwIbPYY69ep7VSs9LluNbi0ucm3leYROSuShzjp3rf0q08UTa1LrllZo8wmdZR5iKpb+JSCw4q9oHiXUrXxRNY6hAj3N5crHM2QPLI4wMcHFdk69Vczi07La+qfURg6p4a/s3xLbaP9r8zz2jHm+XjbubHTPOPrUXiXQf+Ed1KOz+0/aN8Ql3+XsxkkYxk+lei6t4sm07xTa6QtqjpO0YMhYgjc2OlZXxD16S3V9EECmO4hSQyluR854x/wH9a56GKxEp01JaNd1r57fgOyPNqKKK9ckKKKKACiiigCazUtewKBkmRQB+NejeP9b1HSryyjsbt4A8bM4XHPIx1rkvBsNjN4ktjfzrEsZ3xhujuPujPb1/DHeuivodP8Z+KLnzNSW3trKMIuAP3igncwJ4AyevPavNxLi8RFzXuxTb07lLY1NE1PU9a8C3LwXLtqcTMocY3EghgPTkHFVL+HX9J8PNfX/iMw3ecrDhSp/2c4yW+nH86uafrvhTw9LHptjNkStiSdTuUHsWb/Dge1aMmi2qavca5f332i28khIpgDHEp647EY9u/evOc1Tm242i3dXWr8vIZyHw/1W+l102b3DNbuskrJgYLnHNdJoOq3UviTU9LS3j+zwzySPKW+bk8AD61z+geJdD0m21O9+xrHdNOfJjQfM0Z+6o9AMc/h7VfW88I6rerqcd/Npl+TuZlby2z75BU/wBa2xMOapNum0mrbde+gkWbnxy8fioaRDaxyRfaEgMpc5ySA3HsSfypPGfiubSLltMS1SRLi1yXZiCNxZf6VmroPg5ZhMviKcSht4cXKBg2c5zt61FrGneGJLSe7fxDeXt1HERGsl0rsx5wvK5xk0oUsP7SNouy8nq+4anB0UUV7xIUUUUAFFFFABRRRQAU8yyGMRmRig6Lnj8qZRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB/9k=', NULL, '15907728560', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '李茂进', NULL, '男', NULL, '1993-08-09', '汉', '安徽省宣城市', '安徽省宣城市宁国市闽江一大厦120号-3-9', '安徽省宣城市宁国市闽江一大厦120号-3-9', '身份证', '0d0076cc3c0fc16e8780395bb1334cbda149a4d34e9940f57811e4c41a279c63', NULL, NULL, NULL, NULL, NULL, NULL, 'dc0dac6c3968370554ba9d7f2d5b5237', '9ufl149nl@msn.com', NULL, NULL, '舒政谦', 'a298632cf433088f8e9f99addd211f4e', '四川省成都市郫县贵州街51号-12-3', '0040', '2022-07-04', '1543842934270394377', '1543899639134019616', 'B1', '1543837863788879877', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '41', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879913', 'data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCeiiivzs/RQooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACtHQ9K/tnVI7LzvJ3hjv27sYGemRU3h2w07Ub+SLU7v7NCsRZX8xUy2QMZYY6E12+h6DoFlqiXGn6mbi4VThPPjfgjBOAM16OCwMq0oyduW+uup52Nx0aMZRV+a2mmhxN5oEkHiP+xoZ1lkJVRI42DlQfU+tM1vQbvQ7kRzjfE3+rmUfK3+B9q7fV9D8PXmrzXV5q5gumK7kFzGu0gADgjI4AqxqK6LqmnxWVzr6mOPBJFzEGcjoWOP8ACuyWWQtUWid/d16dmcccznem9Wre9p17o840nTX1bUY7OOaOJnzhpDx+Hqa018IX765NpaSQiSOPzVkkJCumQMjAPr/Otfw/e6LZX76Ytgby4+2MLecRxuduflO78M5Faupw6dL420u0Fpbs5WV7geWuHyh27uOT8pPNZ0cDRlSUm7vmS376W/U0r46tGs4xVlyt7dtb/oYH/CvNW/5+LL/vt/8A4mq994I1OwsZruWe0aOJSzBHYkj2+WuuvLV4buSO18IWVzCMbZd8SbuPQjI54rN8XWNvD4XiuBplvZ3LSpvWNFyvByNwHNdFbAUIU5yUXeK8/wBY2Zz0cfiJ1IRclaT8v0ldHn1FFFfPH0IUUUUAFFFFABXb/DzT3Nzc6i4xGqeUhPckgn8sD865rQrOyv8AVora+uGgic4BA+8ewz2z611fiPxHZ6dpx0bRto+XY7xn5UHcA9ye5/rXp4CEKf8AtVR6R2XVs8zMJzqf7LSWst30SLXh6Ox1q/1u7ntYLhTcfu2kjDYXBAxkegFcBZ2F1qErx2kDTOqFyq9ccD+ortvhzIhg1CHcPMyrbe+MEZq94X8MT+H7u5u7yeBgY9ilCeBnJJyBjoK7PqrxdOjK2j5rtepx/Wlg6laN9Vy8qfoVfAmn2tvDLdTArfGVoAkgwUwNxAB74/lWx9j0bUtdlfay6jb7lfy5GRscfNlSD0OPxI7Vx/h+7N74+WcMTHJNNIo7AFW/piug0b/kfta/65j/ANlrowdWDpQpqKa5rfhe/qc+MpTVadRyafLf8bW9DXisrGYSlTqg8r72+e5XP0y3zfhmsrX7Cxn8MXdyi3pMYyouZZ+Dkc7XPv6V0UKXSCYTXcUhY/uysW3Z9fmOe3pWV4gWdPCV+LmeOeTZ99I9gxkdsmu6vTj7GV4rZ9F/mcNCpL20bSe66v8AyPJqKKK+KPtQooooAKKKKACiiigCSGeW3kEkMrxSDoyMVI/EVNNqd/cxmOe+uZUPVZJWYfkTVWiqU5JWT0JcIt3a1CiiipKCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//2Q==', NULL, '15907722777', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '尤福', NULL, '男', NULL, '1995-06-24', '汉', '河南省漯河市', '河南省漯河市召陵区雒口大厦74号-1-4', '河南省漯河市召陵区雒口大厦74号-1-4', '身份证', '8e1e34824f6adddf029af993038ee1989487d9ea13c41589b96a77722c23374b', NULL, NULL, NULL, NULL, NULL, NULL, '1ab9290e0b1499a87a3e534ca07a724d', 'v2mu90kad@aol.com', NULL, NULL, '祝纯毓', 'bc8e8880d4080f15758e65b103b4533e', '四川省乐山市峨眉山市澳门八街60号-9-3', '0041', '2022-07-04', '1543842934270394377', '1543899639134019616', 'C1', '1543837863788879912', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '42', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879914', 'data:image/jpg;base64,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', NULL, '15907718524', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '米光天', NULL, '男', NULL, '1993-08-22', '汉', '四川省甘孜藏族自治州', '四川省甘孜藏族自治州得荣县台南路109号-13-5', '四川省甘孜藏族自治州得荣县台南路109号-13-5', '身份证', '1cf36cfb84ac6058fcc75cfb8e29b0aaf4a98d1ed23e6df5e6c160223eb493f9', NULL, NULL, NULL, NULL, NULL, NULL, 'bf739cbd238c55babf8d206a4ca96366', 'yx7c5s62f@3721.net', NULL, NULL, '孔冰爽', 'd5a9e21602d57ba2ce4ec9d555a8730b', '四川省雅安市荥经县台东二路132号-8-9', '0042', '2022-07-04', '1543842934270394377', '1543899639134019618', 'C1', '1543837863788879912', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '43', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879915', 'data:image/jpg;base64,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', NULL, '15907692948', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '毛楠榕', NULL, '男', NULL, '1993-02-07', '汉', '四川省成都市', '四川省成都市新都区宁国四街89号-15-8', '四川省成都市新都区宁国四街89号-15-8', '身份证', '992734675a700387f56677dc0b9e4c9f2fc88ff015aa6bd017d49ca40a50e04f', NULL, NULL, NULL, NULL, NULL, NULL, '96d8dc62088f66b005f6c374c3733b8e', '5mxoxxn@sohu.com', NULL, NULL, '穆学祥', '60abd63f59500ece2bb12ef073b89f05', '四川省甘孜藏族自治州道孚县新湛路67号-6-1', '0043', '2022-07-04', '1543842934270394377', '1543899639134019618', 'C1', '1543837863788879912', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '44', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879916', 'data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDvKKKK/IT6sKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCeztJL24WCMqGIJyx44rS/wCEavf+esH/AH0f8KyI5HicPG7Iw7qcGtXRru5l1aFJLiV1O7Ks5IPymvUy5YOpKNKtBuUmldOy1sjlxDqxTlBqyQ7/AIRq9/56wf8AfR/wpG8N3iqWMsGAM/eP+FLrl3cxao6R3EqLtHCuQOlX9Fmkl0i5kmkdyGYZdieNo9a9SlhMuqYqWFUJJxvrfsc0quIjTVRta26dzBsbCXUJWjiZFKjJ3kj+lX/+Eavf+esH/fR/wrJjmlhJMUjoTwSrEVPHd3ksqRi7mBZgozIe9eRhp4JQUatNuXk7HXUjWveMkl6F/wD4Rq9/56wf99H/AAqve6NcWEHnSvEVyBhSc/yrbZ4tFiD3NzPcTMOAXJz9B0rBv9VuNQOHIWIHIRen4+telj8Nl+GpOLTVXte9vXoc9CpXqSvf3e9vyKNFFFfOHoBRRRQAUUUUAFaOhf8AIZg/4F/6CaZplta3Mzrdz+UgXIO4Lk/jW1aWek2dyk8d+pdc4DTLjkYr2MrwNSdSniLpRUk9Wr6PsceJrRUZU7O9uwy6/s86vcrfgY2oUJJHbnpSXOp6fa6dJbWJyWBAABwM9yTUt5aaTe3BnkvlDEAYWVcVX/snRv8AoIf+Rk/wr26qxUZ1PYKn7zfvXXNZvuccXTajz82ltOmhU07W/wCz7Xyfs/mfMWzvx/Sr0XiXzZkj+yY3sFz5nTP4VgXKRxXUiRNvjViFbOcj8K6C203SUeO4F10w4VpVwO/Nefl2JzGT9jTqJRhZa8u3lpqdGIp4dLnlF3fqXNU1b+zXjXyfM3gn72MfpWbL4l82F4/smNykZ8zpn8Kra/eRXV0iwsHWNcFh0JNZNPM86xUcTOFGp7m2yfTXW3cWHwdN01KcdfmFFFFfNnohRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB//Z', NULL, '15907452198', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '卫子', NULL, '男', NULL, '1993-08-29', '汉', '四川省绵阳市', '四川省绵阳市涪城区瞿塘峡街93号-11-1', '四川省绵阳市涪城区瞿塘峡街93号-11-1', '身份证', 'a94f16575a2c8dfce1738ae2194b24bc8f49214aad8f6818362f9b4f6b02c87c', NULL, NULL, NULL, NULL, NULL, NULL, '2a60b7aa5894e3ddade63a6edd65f9a3', 'qunrdcj2n@yahoo.com', NULL, NULL, '萧永', '01a24b215fd2fb4bb0ced674df6596e7', '四川省凉山彝族自治州盐源县青大街116号-5-5', '0044', '2022-07-04', '1543842934270394377', '1543899639134019618', 'C1', '1543837863788879912', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '45', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879917', 'data:image/jpg;base64,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', NULL, '15907432793', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '李致树', NULL, '男', NULL, '1992-01-23', '汉', '四川省凉山彝族自治州', '四川省凉山彝族自治州会理县南九水街90号-14-8', '四川省凉山彝族自治州会理县南九水街90号-14-8', '身份证', 'e26ef09db152fb20cbfda494d6acee4356ac2f9aa0db9721d33e9532b7b9be9d', NULL, NULL, NULL, NULL, NULL, NULL, '9de687c98b939e0234734a030cb9545b', 'u6dpvhv@sohu.com', NULL, NULL, '常红', 'bf8e81571d8e8fca990fc1c2bc9540b7', '宁夏回族自治区银川市兴庆区仙山西大厦83号-4-10', '0045', '2022-07-04', '1543842934270394378', '1543899639134019619', 'B1', '1543837863788879877', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '46', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879918', 'data:image/jpg;base64,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', NULL, '15907418202', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '谈可', NULL, '男', NULL, '1996-01-24', '汉', '新疆维吾尔自治区巴音郭楞蒙古自治州', '新疆维吾尔自治区巴音郭楞蒙古自治州若羌县太平角六街39号-20-10', '新疆维吾尔自治区巴音郭楞蒙古自治州若羌县太平角六街39号-20-10', '身份证', 'dbf044c40fd407feee9c7d20eeccd9e87d273fb9bcae486ba2a89966b50a3c09', NULL, NULL, NULL, NULL, NULL, NULL, '174946d5f8a64c421e310fc1769b1fc9', 'ojht5aclq@sohu.com', NULL, NULL, '曹固之', 'd8b14cf73e2bf550d289dc41b6ebe4a5', '山西省太原市古交市奉化街126号-9-6', '0046', '2022-07-04', '1543842934270394378', '1543899639134019620', 'C1', '1543837863788879917', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '47', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879919', 'data:image/jpg;base64,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', NULL, '15907398155', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '臧以', NULL, '男', NULL, '1992-05-10', '汉', '广西壮族自治区百色市', '广西壮族自治区百色市右江区太平角四路146号-5-5', '广西壮族自治区百色市右江区太平角四路146号-5-5', '身份证', 'bdb05b0a4e157a520c7d43fba89be4cfa3ef2a6abfcb6d4e904aa76a03a0583b', NULL, NULL, NULL, NULL, NULL, NULL, '64da562626bf2ab62002f81ff3d01d2a', 'gs6ird7@sohu.com', NULL, NULL, '秦新', '77c20eb91cc087331d1aadbc56f1a862', '贵州省黔东南苗族侗族自治州镇远县恒台街131号-2-10', '0047', '2022-07-04', '1543842934270394378', '1543899639134019621', 'C1', '1543837863788879917', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '48', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879920', 'data:image/jpg;base64,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', NULL, '15907382408', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '史顺', NULL, '男', NULL, '1994-04-18', '汉', '江西省萍乡市', '江西省萍乡市莲花县泰州一路136号-16-9', '江西省萍乡市莲花县泰州一路136号-16-9', '身份证', '00d86cfbf136fb317f2b333ebe2ed10649516f004c55efdfaa09d27b351e718a', NULL, NULL, NULL, NULL, NULL, NULL, 'a8ff036fde534668821f17dfa1910165', 'zoysolxk7@hotmail.com', NULL, NULL, '卞露瑶', '93605b9cab465bc8be2883a564d6d001', '云南省怒江傈僳族自治州福贡县恩县广场58号-10-6', '0048', '2022-07-04', '1543842934270394378', '1543899639134019622', 'C1', '1543837863788879917', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '49', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879921', 'data:image/jpg;base64,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', NULL, '15907375446', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '俞梅', NULL, '男', NULL, '1996-12-21', '汉', '湖北省恩施土家族苗族自治州', '湖北省恩施土家族苗族自治州来凤县清平路47号-8-3', '湖北省恩施土家族苗族自治州来凤县清平路47号-8-3', '身份证', '93e5dc1c09a4b1ad6b640c33755f2ea02fb13b3cfb204d4d2e8a829807cab6f7', NULL, NULL, NULL, NULL, NULL, NULL, '6bcd7787c33f8592b8f071d76ccc53d3', 'ved3p7rhd@163.net', NULL, NULL, '陶栋', 'b31cea5379afd7bb74ae76b911669226', '四川省成都市郫县龙岩街46号-3-7', '0049', '2022-07-04', '1543842934270394378', '1543899639134019623', 'C1', '1543837863788879917', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '50', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879922', 'data:image/jpg;base64,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', NULL, '15907313322', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '曹霞香', NULL, '男', NULL, '1994-02-23', '汉', '四川省甘孜藏族自治州', '四川省甘孜藏族自治州理塘县大麦岛87号-16-4', '四川省甘孜藏族自治州理塘县大麦岛87号-16-4', '身份证', 'fc4441eaca7d3f28d257d222b3dda45ba1a8b02e10952851c1dd87ea27012008', NULL, NULL, NULL, NULL, NULL, NULL, '0681f62e67f4adcb1601811c04e248fc', 'l6ij9fzrk@163.com', NULL, NULL, '皮昌成', '9c466de76d1d5bf5126223e4a22575b4', '四川省乐山市五通桥区正阳路140号-3-10', '0050', '2022-07-04', '1543842934270394378', '1543899639134019623', 'C1', '1543837863788879917', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '51', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879923', 'data:image/jpg;base64,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', NULL, '15907296854', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '沈新', NULL, '男', NULL, '1995-06-22', '汉', '吉林省白城市', '吉林省白城市通榆县莱芜一广场84号-11-10', '吉林省白城市通榆县莱芜一广场84号-11-10', '身份证', '7f9f31f4b434ba5fab70e9e35b6b3e688f49214aad8f6818362f9b4f6b02c87c', NULL, NULL, NULL, NULL, NULL, NULL, 'e03ed6ad36a93ab456f183027735711f', 'nidajpir@live.com', NULL, NULL, '尹力', '92253c42d0c92402f0c9ded29b8e304c', '四川省成都市武侯区风岗街25号-5-3', '0051', '2022-07-04', '1543842934270394378', '1543899639134019624', 'C1', '1543837863788879917', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '52', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879924', 'data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCCiiiv0Q+CCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK39Y8M/2VoWn6n9r837Wqny/L27Mru65OfyqPwzqGn6ffSHUNOF8sqhI4zGr4bPo1emeI7vT9L0iF7zShc26kIsYiVli4468Adq8rGYyrSrwpxjo/TU9LCYSnVoznKW3roeTaNp39ravb2Hm+V5zEb9u7HBPTI9Kfrul/2LrM+n+d53lbf3m3bnKg9Mn1r0HwVd6TqMcUVvpEcdzZwJ5l0YUBL4xwRzk8mrfijUNG0e4im1DRIrp7gH995KMSVwMEnnpispZjVWK9lyPbbTfe/wBxrHL6bw3tOZb767dvvPLbbS9RvIvNtbC6njzjfFCzDPpkCt3RPA+o6qs7XAksPLxt8+FhvJz0zjp/WpND8R6wl22naJBDsnnaSONo/ugnvg8ACvRdSuLy10xI4byxS/YD57ltiH+8QOT+HvSxuNxFKSpxSTe3f5hg8HQqRc5XaW/b5HkU3h3V4p5I10y9kVWKh1tnwwB6jion0PV40Z30q+VVGSxt3AA9elei/bvE3/QY8O/9/W/wqh4j1XxRpGnj7bNpskNzui/cKxPI98dqunjq8pKHu3fm/wDImeCoxi5e9ZeS/wAzzqiiivYPKCiiigAooooA6jwJaWk+utc3cgVbOI3AB6ZGOT9M5rvNZ8SR2Ok2F2bI3MF8ADD3IZcgY7+mK8ejmkhD+W7LvUo2D1U9q9G1y/fTPDHhi9jVHeHym2sMg/uq8PMMNz4iEpa30S22T/U9jA4jkoTjHS2rfzX6F/TYk8PLplgI0iu9SuWlmjQ8IoBO0ew+UfnS6vbL4jbWtGJAurWSOa3J9414+mdwP1Fcvp+tSa98RLO8cFI95WJCfuqFOP8AH8aXX9ZuND+Id5e22GIVFZG6OpjXg/ofwrBYWr7f/p5y83z5tvu0N3iafsf7nNy/K3+epY8L6zp/hzS50ntsas1yYfLIwxHHU9gDn64rqfE9vpk0tsdQ0XUNRIDbDaIzBOmc7WHWvJxcy3erLc3Dl5ZJg7se5Jr0Pxx4jv8ASZ7JdMvFRZFcvhVfJBGOoNaYrCy+tQcH70r31a6d10Iw2Jj9Wmp/DG1tE+vZlX7D4b/6E/Xf+/Mn/wAXU3xICjRdOCqVXzeFPUDb0qTw/ca7rul/bT4lWAhyjxmyjO0j347EdqqfEi+tpLSxtEuElmVy7BSCQMYycdM1jS5/rkIN3abvrJ2080vwNKnJ9UnJKyaVtIq+vk/zPPKKKK+lPnwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA/9k=', NULL, '13007845940', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '薛林有', NULL, '女', NULL, '1993-05-13', '汉', '四川省甘孜藏族自治州', '四川省甘孜藏族自治州泸定县龙岩街52号-10-10', '四川省甘孜藏族自治州泸定县龙岩街52号-10-10', '身份证', '7aa5cbc555a2fb99c12ac9afb093960915e0a452128ac61ec74aa941e65431b3', NULL, NULL, NULL, NULL, NULL, NULL, '75141916aece5291dcdc5887bbe69ffc', 'c0ijuoj@sina.com', NULL, NULL, '苏岩中', '7bc8bd10c8ccd5fb7f6aec7675a039b6', '河北省石家庄市赞皇县云溪广场43号-1-6', '0052', '2022-07-04', '1543842934270394378', '1543899639134019624', 'C1', '1543837863788879917', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '53', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879925', 'data:image/jpg;base64,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', NULL, '13007856275', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '伏昭', NULL, '女', NULL, '1996-08-23', '汉', '四川省凉山彝族自治州', '四川省凉山彝族自治州越西县吴兴二大厦130号-19-4', '四川省凉山彝族自治州越西县吴兴二大厦130号-19-4', '身份证', '904f8c27d6fc6f316132f1f36d701ded71003a0eff95f5db08c606d45d7d7091', NULL, NULL, NULL, NULL, NULL, NULL, 'c4ec7c2c10213901f122d91070cf9ddd', '0c6rkj3px@msn.com', NULL, NULL, '范旭', 'ce6a28eccc0cf4d6aa80be264e4fe2eb', '四川省凉山彝族自治州布拖县清平路46号-1-2', '0053', '2022-07-04', '1543842934270394380', '1543899639134019625', 'B1', '1543837863788879877', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '54', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879926', 'data:image/jpg;base64,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', NULL, '13007883589', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '金超', NULL, '女', NULL, '1993-12-22', '汉', '江西省宜春市', '江西省宜春市吴兴大厦38号-15-7', '江西省宜春市吴兴大厦38号-15-7', '身份证', '52e8c04b84840844068846aa4f23ed5e71003a0eff95f5db08c606d45d7d7091', NULL, NULL, NULL, NULL, NULL, NULL, '65b47c5ce6b40f4968edb7a058fefd5f', 'fge6dq9@163.net', NULL, NULL, '喻云莲', '0f60966c886e7711efb4aa15365819f8', '四川省德阳市中江县长汀街97号-8-9', '0054', '2022-07-04', '1543842934270394380', '1543899639134019626', 'C1', '1543837863788879925', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '55', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879927', 'data:image/jpg;base64,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', NULL, '13007884900', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '伍慧巧', NULL, '女', NULL, '1995-09-07', '汉', '四川省阿坝藏族羌族自治州', '四川省阿坝藏族羌族自治州松潘县台西纬五路118号-11-7', '四川省阿坝藏族羌族自治州松潘县台西纬五路118号-11-7', '身份证', 'e8bfe31d1398599e41a92fcd304cf5f8d776ed7aa451dea7d28ad2b94b263640', NULL, NULL, NULL, NULL, NULL, NULL, '2ea341c1f3e9bcd50cb9d729e935654e', 'egias08v9@sina.com', NULL, NULL, '皮谦', '0f3ac549666b502d3d8a9476948f78d7', '四川省自贡市富顺县镇江街65号-16-2', '0055', '2022-07-04', '1543842934270394380', '1543899639134019627', 'C1', '1543837863788879925', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '56', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879928', 'data:image/jpg;base64,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', NULL, '13007918138', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '鲁有', NULL, '女', NULL, '1994-03-06', '汉', '贵州省遵义市', '贵州省遵义市湄潭县无棣三街57号-3-1', '贵州省遵义市湄潭县无棣三街57号-3-1', '身份证', 'c6edaeed2ec941fda98951b7953f90c749516f004c55efdfaa09d27b351e718a', NULL, NULL, NULL, NULL, NULL, NULL, 'a3742f204d019d8a2cfbf192735a0cf8', 'e2i2i9@0355.net', NULL, NULL, '舒泰盛', '9aa9e9d0b034831f3c5843a495faa742', '黑龙江省双鸭山市莱芜一广场133号-4-5', '0056', '2022-07-04', '1543842934270394380', '1543899639134019627', 'C1', '1543837863788879925', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '57', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879929', 'data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDKooorrMAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKANXQNAuvEd+9nZyQpIkRlJmYgYBA7A88iu10/wCFn+hz/wBpXX+lc+T9mk+Tpxu3Jnr6VxXh+50q01IyaxBPNa+WRthYht2Rjow46969I8Ma94au7h9H0uzvYftIYsJWJBwvPJckcelZzb6FRSMC0+Fmpfa4vtt1afZt37zyZG349spjNTan8LLr7X/xKrqH7NtH/H1Id+e/3Uxiug0jTvDM2uXdtZWV1Hd6c43O08m3PPT5znp3FYN94p8Gajcefd6fqkkuAu7zGHA+klTzSbHZGDp3gPVtTkulgltALW4e2kZ3YDevXHy5xzU+t+AbnQ9Glv5r+CR48fukU8gkDgn0z6Vs+D9GF9dHVLLV5rWyW+d47A5O5QQRn5+uMDoenet3VvBum6t4mN/qF6Ssiqi2q/KSQO7ZzjAPGB9abnZhy6Hn/hnwn/wkdne3H237P9lx8vlb92QT6jHSuar1zwjpEmkjxJZbSQkuyP1K7SV/RhXKW/hmwh8Aza1qXmpcyMTbbGxnsoIPXJyfpTUtROOhx1FFFaEhRRRQAUUUUAbvgz/kcNM/66/0NevQ6jqM3im5sRbRjTreJWacg5LkAhRzj3ryHwZ/yOGmf9df6GvS9eQSXV7bt4tttPjuEVWt5NpZBjBIJcEZHtWU9y47EnhrxVJr+r6pbCOIW9s37l0zl13EAn8h+dWbC51u50vUDrVhDaOqERCJwwYbTk8E1xdl4Y0zTp/OsvHdrbyYwWjZASPT/WV1ujR+VpOog+Il1nKH5wwPl/KeOGPWoaXQpN9TlfhrocZkfXbl02xt5MCk/wAZwCT+YA+v0rV8UW2l/wBp3eqQ3otdZ07y5v3x+SRcDC4756cc5PuK4jwnqNyusabpyykWr3yTMnqw4rsL+w0i++JNy2q3CIsECSpE+AsmFyck9h1x3/A1b+K5K2Oh8OXVxHo9veazKq3moyggbQvUfIvH+yv615x43vNTivzot24NpauXtgEC5Q/dzjg4HH50vjHxc+savD9gdktbN90LdCzj+P8ATj/69b+tahoXizwf/aV3Mttf2q7cLy4c/wAOO6nt6fgaErO7Bu+h5nRRRWpAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf/Z', NULL, '13007965121', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '廉茜秋', NULL, '女', NULL, '1996-02-21', '汉', '四川省宜宾市', '四川省宜宾市南溪县泰兴广场42号-19-3', '四川省宜宾市南溪县泰兴广场42号-19-3', '身份证', 'f975169cd116d7e8a32440c8947bd54b3ad560279d87ddd748dc3b31d815b8be', NULL, NULL, NULL, NULL, NULL, NULL, 'd7e3a260749627d6445f49081cb984ff', 'x1e1gdtcg@263.net', NULL, NULL, '朱彪博', 'cbce2ac16bfc2b0dba23a80515ccc1e8', '四川省遂宁市船山区道口路92号-10-4', '0057', '2022-07-04', '1543842934270394380', '1543899639134019627', 'C1', '1543837863788879925', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '58', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879930', 'data:image/jpg;base64,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', NULL, '13007968907', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '湛兰凤', NULL, '女', NULL, '1996-12-14', '汉', '四川省凉山彝族自治州', '四川省凉山彝族自治州会理县漳州街二街109号-13-6', '四川省凉山彝族自治州会理县漳州街二街109号-13-6', '身份证', 'fe2e8c4aaa699a16c21c8c24a7e75cb9610e26ec556a0f14ce64db0654911a63', NULL, NULL, NULL, NULL, NULL, NULL, '0e821a42c2249d27f745981af38ad153', '5xpphe@yeah.net', NULL, NULL, '贺朋斌', '217e4b745733debc4a978a87a5815d28', '四川省内江市东兴区宁国三大厦86号-15-5', '0058', '2022-07-04', '1543842934270394381', '1543899639134019628', 'B1', '1543837863788879877', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '59', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879931', 'data:image/jpg;base64,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', NULL, '13007972227', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '祁馨', NULL, '女', NULL, '1995-06-02', '汉', '四川省宜宾市', '四川省宜宾市长宁县闽江四街31号-9-1', '四川省宜宾市长宁县闽江四街31号-9-1', '身份证', '13c3743671cbad6024571806539e838d7d273fb9bcae486ba2a89966b50a3c09', NULL, NULL, NULL, NULL, NULL, NULL, 'ed22f72b7d600ba20f57cafb3ef555b4', 'f6n9hyo7@msn.com', NULL, NULL, '殷哲', '2e8838db312d6107f660cdcb4753dc23', '四川省成都市新津县嘉峪关路59号-15-4', '0059', '2022-07-04', '1543842934270394381', '1543899639134019629', 'C1', '1543837863788879930', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '60', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879932', 'data:image/jpg;base64,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', NULL, '13007987546', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '常广志', NULL, '女', NULL, '1995-12-25', '汉', '四川省阿坝藏族羌族自治州', '四川省阿坝藏族羌族自治州红原县平原广场16号-9-3', '四川省阿坝藏族羌族自治州红原县平原广场16号-9-3', '身份证', '7c88f1b6e2be8b3f38e32fec511e12c6a1a8b02e10952851c1dd87ea27012008', NULL, NULL, NULL, NULL, NULL, NULL, 'c3ffb5fa3928666cc17bccc804754e37', 'xpr8z2t@263.net', NULL, NULL, '董贵福', '2135859af2465cf5fc475d3303c77e90', '四川省遂宁市射洪县云南路30号-1-10', '0060', '2022-07-04', '1543842934270394381', '1543899639134019630', 'C1', '1543837863788879930', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '61', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879933', 'data:image/jpg;base64,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', NULL, '13008016601', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '倪友裕', NULL, '女', NULL, '1996-06-27', '汉', '四川省雅安市', '四川省雅安市芦山县龙泉路144号-4-5', '四川省雅安市芦山县龙泉路144号-4-5', '身份证', '35ce9d25d04b7f9dce00f7bfea4bbf2d10696dd8958e28583703c74d3a19aea9', NULL, NULL, NULL, NULL, NULL, NULL, 'f37b9a186f34e1b25da5d0247bfc3bba', 'isya7pv@126.com', NULL, NULL, '皮娥玲', '9bb41a2dbc0b81013217720e988eebee', '贵州省遵义市务川仡佬族苗族自治县团岛四街145号-14-9', '0061', '2022-07-04', '1543842934270394381', '1543899639134019630', 'C1', '1543837863788879930', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '62', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879934', 'data:image/jpg;base64,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', NULL, '13008056697', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '鲍楠榕', NULL, '女', NULL, '1996-06-10', '汉', '吉林省通化市', '吉林省通化市通化县江苏广场38号-14-10', '吉林省通化市通化县江苏广场38号-14-10', '身份证', 'd573c83a1042737f89ac6e6f653f1b26a1a8b02e10952851c1dd87ea27012008', NULL, NULL, NULL, NULL, NULL, NULL, '4e13f5e02ba2650d4f5cdc9376b2e255', '018nf7k14@msn.com', NULL, NULL, '云磊民', '0487047454648d633540e8894f60b985', '四川省甘孜藏族自治州康定县银川西路41号-11-7', '0062', '2022-07-04', '1543842934270394382', '1543899639134019631', 'B1', '1543837863788879877', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '63', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879953', 'data:image/jpg;base64,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', NULL, '13008468578', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '熊生龙', NULL, '女', NULL, '1993-11-30', '汉', '山东省淄博市', '山东省淄博市周村区城武大厦26号-1-1', '山东省淄博市周村区城武大厦26号-1-1', '身份证', '3e853fceff9a7cd1170dba36c1416e67249c6a0298a73989b59216b6e7602b79', NULL, NULL, NULL, NULL, NULL, NULL, 'e983e335506c4fd4c5a6422413bffe05', 'n5bpau@163.net', NULL, NULL, '成佳嘉', '4bebfdd5c95ffbfefebed7988508742d', '四川省宜宾市筠连县普集支路19号-2-5', '0081', '2022-07-04', '1543842934270394385', '1543899639134019642', 'C1', '1543837863788879949', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '82', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879954', 'data:image/jpg;base64,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', NULL, '15605144380', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '尹建家', NULL, '女', NULL, '1996-01-14', '汉', '四川省泸州市', '四川省泸州市古蔺县吴兴大厦38号-14-4', '四川省泸州市古蔺县吴兴大厦38号-14-4', '身份证', 'd2bae0fd02e9ba1ae51afb05242f0320a9d2a4cfc2aee23aa417b49482332829', NULL, NULL, NULL, NULL, NULL, NULL, '902f313ad188e8b40e9b1dc4aadad169', 'v7e7a8w@googlemail.com', NULL, NULL, '窦菁梦', 'da47a37725cc1c4d4c835df2f7738998', '四川省广元市利州区钜野广场19号-18-1', '0082', '2022-07-04', '1543842934270394386', '1543899639134019643', 'B1', '1543837863788879877', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '83', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879955', 'data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDvKKKK/IT6sKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCezt/td3HBv2bzjdjOK1X0ewgkMc+ogOOq4ANUdH/AOQtb/739DXTPJdjUAqz2og3D5CTvxivo8owdCth3UqQvLmt1fTtzI8/FVpwqcsXZWv/AFozDg0aC8uZ1trv91GFIYrnOc/T0p9xoCwWks63gk8tScBOv61p3Eoh/tEwwzPO5C/KhIztGOR6ZqjpRa2tJra6sborIc8RE5GMYrqlgcHGaoyguZ83vJysnd20u/67mSrVmudS0VtNLvuc/U1rB9puo4A4UucAmt3Rbi0gur750gjLKEWRsHAz60jeJyGIFoCAevmf/WrzKWX4SFOFXEVrXb0Sb2dt076+iOmVeq5OMIfj3MrUtObTpUQyBw65yBj8KpV0P/CUH/n0H/fz/wCtU1/qMN5oMh8yNZXA/dbwSPmFaVcDgK3tJ4atsm+Wz6dLtkxrV4cqqQ3dr3OYooorwTuCiiigAooooAv6MC2r24HqT+hrppbeU3JlS0s2OciRyQ3/AKDXPaA8MepBpXCnaQmehJrQthYfbDqT3yhizMIyRx1HTr0r6zJ5xhhVG61k3ulZJJX1T+48vFpuq32XZ6lmCS6e5volliSdSGEYGRnaOcntx6U+0u7uOymudQCoF+6oXB4/xNV4G0/z5NWe5ILMQFPGO2MdTSteWGtxG3eR4mDZUE4z/Q/SvRp1uVXVRc75uVc2krvRv79upzyhfTl00u7bdzOsdeNnC6G3DlnLk78dfwq2nife6r9kxk4/1n/1q5+ZUSZ1jfegJAbGM+9bthpumSQQXElyQ+AzI0igZH4Zrw8BjcxqS9hSqJKPfl29banbXo4eK55R39TS1TVP7N8r9z5nmZ/ixjGPb3rLl8S+bC8f2TG9SufM6Z/Co/EV5DcywpC6v5YOWU5HOP8ACsWtM1znEwxU6dGp7non0V9bd7k4bCU3TUpx1+YUUUV80eiFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH//Z', NULL, '13008514695', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '殷宁', NULL, '女', NULL, '1996-07-28', '汉', '贵州省黔东南苗族侗族自治州', '贵州省黔东南苗族侗族自治州锦屏县宁国一支广场116号-15-5', '贵州省黔东南苗族侗族自治州锦屏县宁国一支广场116号-15-5', '身份证', '7eac1787d80ba4fb796b2a1c5b22fc5e33e331e2ff1b9c451e65196db90d5d9e', NULL, NULL, NULL, NULL, NULL, NULL, 'a59309de78e76ef249702debdbcb6d9e', 'gf43ui@googlemail.com', NULL, NULL, '和冠', '82003c46a77c9518b1efc0cdce26b803', '山东省青岛市李沧区西藏二街57号-14-9', '0083', '2022-07-04', '1543842934270394386', '1543899639134019644', 'C1', '1543837863788879954', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '84', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879956', 'data:image/jpg;base64,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', NULL, '13008538256', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '谈飞彬', NULL, '女', NULL, '1994-08-09', '汉', '四川省遂宁市', '四川省遂宁市大英县海口街115号-9-5', '四川省遂宁市大英县海口街115号-9-5', '身份证', '6337d063ddf30f5b6bb3fde15da236d042e874388506c7a31df8972bcebd56d5', NULL, NULL, NULL, NULL, NULL, NULL, '666357efd42b6b085fceba980c7195c5', '05abgpf@sina.com', NULL, NULL, '顾珠', '61c33653a15be27ddcc0736a5a02f817', '四川省甘孜藏族自治州六码头149号-17-1', '0084', '2022-07-04', '1543842934270394386', '1543899639134019645', 'C1', '1543837863788879954', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '85', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879957', 'data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDKooorrMAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAFAyQPWu3/4VZrn/AD9af/38f/4iuIT76/WvUviff3liNK+yXc9vv83d5UhTdjZjODz1NRJu6SKSVrsxP+FWa5/z9af/AN/H/wDiKoax4B1XRNLm1C5uLN4Ytu5Y3YscsF4yo7mtrXLC60vwdY6vDrmsG5nWIuj3Z2jcuTgDnr71fv55bn4OedPK8srIhZ3YsT++HUmp5mOyOE0rwxrGt2zXGn2fnRK5Qt5qLhsA45I7EVsad8PNbl1CFNQsnhtWbEkiTRkqPXG6q/gy4L37Wc+uz6ZZ4Mp2ShFduBjJOAcd/avQtV1axls0tLHxZZ2ShcNLuE8h/wCBbuP505SadhJI4/XfhvqFteIujRSXdsUBZpJUVlbuOSOOlY9x4H8RWltLcz6dsiiQyO3nxnCgZJwG9K73R9V0zSZpJLvxgNQR1wFlJO33GCf5Vj+LZA+ly6lpPieSSzlJiktHuGbOeCq9+nY9u9JSlsNpHnNFFFakBRRRQAUUUUAKn31+tel/FdGkbRkRSzMZgABkk/JXCaHp9vqmqxWdxeizEpwshTcN3YdRjNenE+HvDbR3Oq6zNqV9Dkx/aJjM6E9dqfw5wOT6dazk9UUtiv4/tbiLwRp9skUjmF4/NKKSFCxkEnHQZxVe5/5Iuv8AuJ/6OFUh8U7kaq7mxRtPPCxE4kA9c9M+3/661NQm8OeKNAnkt9VnsEij3yQCQqowc8xZ2nn+7371NmrXK0exx3gD/kd9O/7af+i2r03VNcSz1GW3Ov6balcfuZ7ZndcgHkiQZ9enevMvAOB430/B4/e9f+ubV0nivxxrGj+JbuxtGg8iLZt3R5PKKTzn1JpyV5CTsjd/4SaP/oadG/8AAN//AI7WJ8WPuaR9Zv8A2SrPh7V/F3iO0N1bXmlxxJL5biSNt46HOAMdD61R+K9zC8+mWyyK00YkZ1B5UHbjP1waSVpIbeh5zRRRWxmFFFFABRRRQAUUUUAFFFFABRRRQA9JpYgRHK6A9QrEU0kkkk5J6k0lFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB/9k=', NULL, '13008603524', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '贝育', NULL, '女', NULL, '1995-04-12', '汉', '四川省成都市', '四川省成都市金牛区盐城街101号-14-5', '四川省成都市金牛区盐城街101号-14-5', '身份证', '3d53c331cbc7e72942a9de50974ec5eaba6c83bfca3b5d297c72611f62749b84', NULL, NULL, NULL, NULL, NULL, NULL, 'bc2482ec20b089e9927c7e3f2b44a97f', 'atg3odr@qq.com', NULL, NULL, '鲍菲寒', '4360670c518a18dab5e0f948c15ee1c3', '河北省邯郸市临漳县太平角一街61号-3-7', '0085', '2022-07-04', '1543842934270394386', '1543899639134019645', 'C1', '1543837863788879954', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '86', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879958', 'data:image/jpg;base64,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', NULL, '13008612125', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '孙达安', NULL, '女', NULL, '1996-01-04', '汉', '江西省萍乡市', '江西省萍乡市安源区漳州街79号-5-6', '江西省萍乡市安源区漳州街79号-5-6', '身份证', 'f18b7b38401c9ea9c34679a63d131567a1a8b02e10952851c1dd87ea27012008', NULL, NULL, NULL, NULL, NULL, NULL, '24bce07a464675f0b9e08915901dca02', 'f8ohfcq@sina.com', NULL, NULL, '时良海', '6c77c1234bb9555cbe5adacdb88f974a', '江西省抚州市宜黄县新昌街122号-1-8', '0086', '2022-07-04', '1543842934270394386', '1543899639134019645', 'C1', '1543837863788879954', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '99', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879947', 'data:image/jpg;base64,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', NULL, '13008306154', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '伏飞彬', NULL, '女', NULL, '1992-09-30', '汉', '河南省漯河市', '河南省漯河市源汇区朝城路144号-4-4', '河南省漯河市源汇区朝城路144号-4-4', '身份证', 'f81437e728a287cad433ceaf5393527015e0a452128ac61ec74aa941e65431b3', NULL, NULL, NULL, NULL, NULL, NULL, 'daed56fe360c4182f10eef68a06157ea', 'gounqcyyz@sohu.com', NULL, NULL, '纪敬震', '2d3176e4ee4c149dcd5e1e0e09fdd5d2', '重庆市石柱土家族自治县旅顺街13号-14-5', '0075', '2022-07-04', '1543842934270394384', '1543899639134019639', 'C1', '1543837863788879944', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '76', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879948', 'data:image/jpg;base64,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', NULL, '13008324192', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '贝君琴', NULL, '女', NULL, '1995-08-08', '汉', '四川省眉山市', '四川省眉山市东坡区安城街76号-10-9', '四川省眉山市东坡区安城街76号-10-9', '身份证', '2c93de581f22e104e2260886c6b27c2d94306372d1cd341544feddd7fae37125', NULL, NULL, NULL, NULL, NULL, NULL, '33eb647845ddf08b540260aa9ed794ee', 'zud1fqeo@0355.net', NULL, NULL, '尤星', 'c90e543cb7490fb94c31ec5c01ee357a', '山西省晋城市泽州县莱州路45号-11-1', '0076', '2022-07-04', '1543842934270394384', '1543899639134019639', 'C1', '1543837863788879944', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '77', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879949', 'data:image/jpg;base64,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', NULL, '13008339032', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '奚祥', NULL, '女', NULL, '1994-04-04', '汉', '安徽省六安市', '安徽省六安市舒城县山东路78号-18-2', '安徽省六安市舒城县山东路78号-18-2', '身份证', 'a9472ee5050ffd1d9cfd105f3af0fbbd3ad560279d87ddd748dc3b31d815b8be', NULL, NULL, NULL, NULL, NULL, NULL, 'fb6a6e1d69b8050bd0b1cd7b139cf1d0', 'elj0fw@hotmail.com', NULL, NULL, '蒋岩中', 'fdc18c582b87e7e45ffe7532ed4ae718', '宁夏回族自治区银川市瑞阳街143号-17-10', '0077', '2022-07-04', '1543842934270394385', '1543899639134019640', 'B1', '1543837863788879877', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '78', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879950', 'data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDvKKKK/IT6sKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCSCCW5mWGFd0jdBkD371d/sLUv+fb/wAfX/GotMgnmvUMKu2whn2PtO3PODkV1CQhnCm3vUB/ia5OB+T172V5XTxdJyqKW+ltF/6S/wAzhxOJlSlaNv6+aMWfw5cRwI8TebIcbo8BdvHrnmq39hal/wA+3/j6/wCNdRcgswX7PcuB0aKUIP8A0IGqs0UhhkEVtfLIVOwm54Bxx/HXq4jIsKpNwjKy7X/+Rf5nLTxtW2rX9fNHJxQyzMViieQjkhFJqX7Be/8APpP/AN+z/hWv4ehkh1G5SRcMibWHXBzWin2id2EOrwvjnasSnA/OvLweTwrUI1J83M21ZcvT/E0dNXFuE3FWsvX9EzGl0GVIrd0d2MpAZfKP7vI71WvtKuLKVhseSMLu8xUOPx9K6CzurrUNJDwyqtyG2sxAx19PpUOqPdSWsiW0vmpGu24JCjtzj+tdmIyzBPD+1pRlqk1bXpqrX+b7GVPE1lU5ZNb2f9fkcvRRRXyh6gUUUUAFFFFAF3TIbi4uvLt5zCxHLByOPw610qSRxwS2kF9uuUUkvKxYg9z/AJ6Vydq8cd1G0u7yw3zbSQQPwrobK4sZJzFp1onmhSQ8vH5Hk19NkdaEYct0m3bVu9n/ACpdfM87Gwbd+nyt82SRxSNZWUkdy6zOy5d5XZW4JPBOOcVLexi+kZLS/aK4j6qshwfqBTb2eLTbG2E0SSFWGEBwBweR9Kzy2izo0sZktplBYBTg59u1epWqU6S9g3G9ldOTi9unS/8ATOWEZS9/XrZ2v9/kO0mVgLy0Qg3rEnzWYlTjjr7c1fgtLy2tBFDDZpLt2mUMcn3Py1naBBDG32t7lFPKeW2B+Oc1pwJbwTXchvom+0HIG4fL19/eoy2MpUKcp6bpWa0T1v6t6X0fcrENKckvLo9x6QXdtHHHaw2iIB84LNyfbj+dZ+tS3NvY+WIYIY5W+by2JJP5CrC20A0lrH+0I8k58zI9c9M0mo29vd2EUP22IGEZzkHdgY9a2xUak8NKFPR8q05o6PrH7uq0ZFNxVROWuvZ/ecpRRRXwR7gUUUUAFFFFABShipyCQfakooAUsWOSST70lFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH//Z', NULL, '13706845429', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '常泰盛', NULL, '女', NULL, '1995-01-08', '汉', '四川省宜宾市', '四川省宜宾市屏山县山城广场110号-9-4', '四川省宜宾市屏山县山城广场110号-9-4', '身份证', '2b81f8a4f45547c6f3917ca9ed4a3d57d05d79b1b3ef348cbc6c893fd7a467bf', NULL, NULL, NULL, NULL, NULL, NULL, '1086503fc416e98cd6df36e0b62a70e1', '6e318jj@qq.com', NULL, NULL, '康行时', '98ceaae0c91d719870f579a363bb683e', '四川省南充市高坪区刘家峡路142号-20-7', '0078', '2022-07-04', '1543842934270394385', '1543899639134019641', 'C1', '1543837863788879949', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '79', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879951', 'data:image/jpg;base64,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', NULL, '13008434949', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '祝超', NULL, '女', NULL, '1995-06-17', '汉', '四川省绵阳市', '四川省绵阳市安县保定街58号-8-8', '四川省绵阳市安县保定街58号-8-8', '身份证', 'd74d1f6826bc23d985397776fe46966170776f2fccccaecfae6b50137fa5b8a0', NULL, NULL, NULL, NULL, NULL, NULL, '380d10ac1184ce83b114e90906f2dcbe', '0r8r3b@hotmail.com', NULL, NULL, '成河哲', '4f461fc4e8618a0b0cdbf43cc665ba08', '四川省成都市金牛区浙江路50号-8-10', '0079', '2022-07-04', '1543842934270394385', '1543899639134019642', 'C1', '1543837863788879949', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '80', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); +INSERT INTO "SNOWY"."SYS_USER" VALUES ('1543837863788879952', 'data:image/jpg;base64,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', NULL, '13008464826', '207cf410532f92a47dee245ce9b11ff71f578ebd763eb3bbea44ebd043d018fb', '花栋', NULL, '女', NULL, '1996-08-25', '汉', '四川省绵阳市', '四川省绵阳市盐亭县临清路71号-6-5', '四川省绵阳市盐亭县临清路71号-6-5', '身份证', '3d7daf692200f254ae56740324145d709d1fa5d186863db2900a177e7b75e375', NULL, NULL, NULL, NULL, NULL, NULL, '634b86c1cef6568e99fda3ef0169ac05', 'oov4n7v@yahoo.com', NULL, NULL, '费莺', 'bc8d6dc4170cf567aea25680900d92b2', '江西省上饶市云门一街18号-9-10', '0080', '2022-07-04', '1543842934270394385', '1543899639134019642', 'C1', '1543837863788879949', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'ENABLE', '81', NULL, 'NOT_DELETE', TO_DATE('2022-07-18 19:41:58', 'SYYYY-MM-DD HH24:MI:SS'), '-1', NULL, NULL); + +-- ---------------------------- +-- Primary Key structure for table AUTH_THIRD_USER +-- ---------------------------- +ALTER TABLE "SNOWY"."AUTH_THIRD_USER" ADD CONSTRAINT "SYS_C008574" PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Checks structure for table AUTH_THIRD_USER +-- ---------------------------- +ALTER TABLE "SNOWY"."AUTH_THIRD_USER" ADD CONSTRAINT "SYS_C008556" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table CLIENT_RELATION +-- ---------------------------- +ALTER TABLE "SNOWY"."CLIENT_RELATION" ADD CONSTRAINT "SYS_C008573" PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Checks structure for table CLIENT_RELATION +-- ---------------------------- +ALTER TABLE "SNOWY"."CLIENT_RELATION" ADD CONSTRAINT "SYS_C008555" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table CLIENT_USER +-- ---------------------------- +ALTER TABLE "SNOWY"."CLIENT_USER" ADD CONSTRAINT "SYS_C008575" PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Checks structure for table CLIENT_USER +-- ---------------------------- +ALTER TABLE "SNOWY"."CLIENT_USER" ADD CONSTRAINT "SYS_C008558" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table DEV_CONFIG +-- ---------------------------- +ALTER TABLE "SNOWY"."DEV_CONFIG" ADD CONSTRAINT "SYS_C008576" PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Checks structure for table DEV_CONFIG +-- ---------------------------- +ALTER TABLE "SNOWY"."DEV_CONFIG" ADD CONSTRAINT "SYS_C008557" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table DEV_DICT +-- ---------------------------- +ALTER TABLE "SNOWY"."DEV_DICT" ADD CONSTRAINT "SYS_C008580" PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Checks structure for table DEV_DICT +-- ---------------------------- +ALTER TABLE "SNOWY"."DEV_DICT" ADD CONSTRAINT "SYS_C008561" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table DEV_EMAIL +-- ---------------------------- +ALTER TABLE "SNOWY"."DEV_EMAIL" ADD CONSTRAINT "SYS_C008577" PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Checks structure for table DEV_EMAIL +-- ---------------------------- +ALTER TABLE "SNOWY"."DEV_EMAIL" ADD CONSTRAINT "SYS_C008559" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table DEV_FILE +-- ---------------------------- +ALTER TABLE "SNOWY"."DEV_FILE" ADD CONSTRAINT "SYS_C008578" PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Checks structure for table DEV_FILE +-- ---------------------------- +ALTER TABLE "SNOWY"."DEV_FILE" ADD CONSTRAINT "SYS_C008560" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table DEV_JOB +-- ---------------------------- +ALTER TABLE "SNOWY"."DEV_JOB" ADD CONSTRAINT "SYS_C008579" PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Checks structure for table DEV_JOB +-- ---------------------------- +ALTER TABLE "SNOWY"."DEV_JOB" ADD CONSTRAINT "SYS_C008562" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table DEV_LOG +-- ---------------------------- +ALTER TABLE "SNOWY"."DEV_LOG" ADD CONSTRAINT "SYS_C008582" PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Checks structure for table DEV_LOG +-- ---------------------------- +ALTER TABLE "SNOWY"."DEV_LOG" ADD CONSTRAINT "SYS_C008564" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table DEV_MESSAGE +-- ---------------------------- +ALTER TABLE "SNOWY"."DEV_MESSAGE" ADD CONSTRAINT "SYS_C008581" PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Checks structure for table DEV_MESSAGE +-- ---------------------------- +ALTER TABLE "SNOWY"."DEV_MESSAGE" ADD CONSTRAINT "SYS_C008563" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table DEV_RELATION +-- ---------------------------- +ALTER TABLE "SNOWY"."DEV_RELATION" ADD CONSTRAINT "SYS_C008585" PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Checks structure for table DEV_RELATION +-- ---------------------------- +ALTER TABLE "SNOWY"."DEV_RELATION" ADD CONSTRAINT "SYS_C008567" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table DEV_SMS +-- ---------------------------- +ALTER TABLE "SNOWY"."DEV_SMS" ADD CONSTRAINT "SYS_C008586" PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Checks structure for table DEV_SMS +-- ---------------------------- +ALTER TABLE "SNOWY"."DEV_SMS" ADD CONSTRAINT "SYS_C008568" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table SYS_ORG +-- ---------------------------- +ALTER TABLE "SNOWY"."SYS_ORG" ADD CONSTRAINT "SYS_C008583" PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Checks structure for table SYS_ORG +-- ---------------------------- +ALTER TABLE "SNOWY"."SYS_ORG" ADD CONSTRAINT "SYS_C008565" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table SYS_POSITION +-- ---------------------------- +ALTER TABLE "SNOWY"."SYS_POSITION" ADD CONSTRAINT "SYS_C008584" PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Checks structure for table SYS_POSITION +-- ---------------------------- +ALTER TABLE "SNOWY"."SYS_POSITION" ADD CONSTRAINT "SYS_C008566" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table SYS_RELATION +-- ---------------------------- +ALTER TABLE "SNOWY"."SYS_RELATION" ADD CONSTRAINT "SYS_C008589" PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Checks structure for table SYS_RELATION +-- ---------------------------- +ALTER TABLE "SNOWY"."SYS_RELATION" ADD CONSTRAINT "SYS_C008571" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table SYS_RESOURCE +-- ---------------------------- +ALTER TABLE "SNOWY"."SYS_RESOURCE" ADD CONSTRAINT "SYS_C008588" PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Checks structure for table SYS_RESOURCE +-- ---------------------------- +ALTER TABLE "SNOWY"."SYS_RESOURCE" ADD CONSTRAINT "SYS_C008569" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table SYS_ROLE +-- ---------------------------- +ALTER TABLE "SNOWY"."SYS_ROLE" ADD CONSTRAINT "SYS_C008587" PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Checks structure for table SYS_ROLE +-- ---------------------------- +ALTER TABLE "SNOWY"."SYS_ROLE" ADD CONSTRAINT "SYS_C008570" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table SYS_USER +-- ---------------------------- +ALTER TABLE "SNOWY"."SYS_USER" ADD CONSTRAINT "SYS_C008590" PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Checks structure for table SYS_USER +-- ---------------------------- +ALTER TABLE "SNOWY"."SYS_USER" ADD CONSTRAINT "SYS_C008572" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; diff --git a/snowy-web-app/src/main/resources/application.properties b/snowy-web-app/src/main/resources/application.properties new file mode 100644 index 00000000..da067017 --- /dev/null +++ b/snowy-web-app/src/main/resources/application.properties @@ -0,0 +1,142 @@ +######################################### +# server configuration +######################################### +server.port=82 +server.max-http-header-size=10240 + +######################################### +# spring profiles configuration +######################################### +spring.profiles.active=local +#spring.profiles.active=test +#spring.profiles.active=prod + +######################################### +# multipart configuration +######################################### +spring.servlet.multipart.max-request-size=100MB +spring.servlet.multipart.max-file-size=100MB + +######################################### +# datasource configuration +######################################### + +# mysql +spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.dynamic.datasource.master.url=jdbc:mysql://localhost:3306/snowy?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&useInformationSchema=true +spring.datasource.dynamic.datasource.master.username=root +spring.datasource.dynamic.datasource.master.password=12345678 +spring.datasource.dynamic.strict=true + +# oracle +#spring.datasource.dynamic.datasource.master.driver-class-name=oracle.jdbc.driver.OracleDriver +#spring.datasource.dynamic.datasource.master.url=jdbc:oracle:thin:@//127.0.0.1:1521/XE?remarksReporting=true +#spring.datasource.dynamic.datasource.master.username=SNOWY +#spring.datasource.dynamic.datasource.master.password=12345678 +#spring.datasource.dynamic.strict=true + +# dm database +#spring.datasource.dynamic.datasource.master.driver-class-name=dm.jdbc.driver.DmDriver +#spring.datasource.dynamic.datasource.master.url=jdbc:dm://localhost:5236/SYSDBA +#spring.datasource.dynamic.datasource.master.username=SYSDBA +#spring.datasource.dynamic.datasource.master.password=SYSDBA +#spring.datasource.dynamic.strict=true + +# druid monitor configuration +spring.datasource.druid.stat-view-servlet.enabled=true +spring.datasource.druid.stat-view-servlet.login-username=admin +spring.datasource.druid.stat-view-servlet.login-password=123456 + +# druid global configuration +spring.datasource.dynamic.public-key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMWiTVtdXFVrgFHDDKELZM0SywkWY3KjugN90eY5Sogon1j8Y0ClPF7nx3FuE7pAeBKiv7ChIS0vvx/59WUpKmUCAwEAAQ== +spring.datasource.dynamic.druid.initial-size=5 +spring.datasource.dynamic.druid.max-active=20 +spring.datasource.dynamic.druid.min-idle=5 +spring.datasource.dynamic.druid.max-wait=60000 +spring.datasource.dynamic.druid.pool-prepared-statements=true +spring.datasource.dynamic.druid.max-pool-prepared-statement-per-connection-size=20 +spring.datasource.dynamic.druid.validation-query-timeout=2000 +spring.datasource.dynamic.druid.test-on-borrow=false +spring.datasource.dynamic.druid.test-on-return=false +spring.datasource.dynamic.druid.test-while-idle=true +spring.datasource.dynamic.druid.time-between-eviction-runs-millis=60000 +spring.datasource.dynamic.druid.min-evictable-idle-time-millis=300000 +spring.datasource.dynamic.druid.filters=stat +spring.datasource.dynamic.druid.break-after-acquire-failure=false + +######################################### +# jackson configuration +######################################### +spring.jackson.time-zone=GMT+8 +spring.jackson.date-format=yyyy-MM-dd HH:mm:ss +spring.jackson.locale=zh_CN + +######################################### +# redis configuration +######################################### +spring.redis.database=1 +spring.redis.host=127.0.0.1 +spring.redis.port=6379 +spring.redis.password= +spring.redis.timeout=10s + +spring.redis.lettuce.pool.max-active=200 +spring.redis.lettuce.pool.max-wait=-1ms +spring.redis.lettuce.pool.max-idle=10 +spring.redis.lettuce.pool.min-idle=0 + +######################################### +# mybatis-plus configuration +######################################### +mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl +mybatis-plus.global-config.banner=false +mybatis-plus.global-config.db-config.id-type=ASSIGN_ID +mybatis-plus.global-config.db-config.logic-delete-field=DELETE_FLAG +mybatis-plus.global-config.db-config.logic-delete-value=DELETED +mybatis-plus.global-config.db-config.logic-not-delete-value=NOT_DELETE +mybatis-plus.mapper-locations=classpath*:vip/xiaonuo/**/mapping/*.xml + +######################################### +# sa-token configuration +######################################### +sa-token.token-name=token +sa-token.timeout=2592000 +sa-token.activity-timeout=-1 +sa-token.is-concurrent=true +sa-token.is-share=false +sa-token.token-style=random-32 +sa-token.is-log=false +sa-token.is-print=false + +# sa-token alone-redis configuration +sa-token.alone-redis.database=2 +sa-token.alone-redis.host=${spring.redis.host} +sa-token.alone-redis.port=${spring.redis.port} +sa-token.alone-redis.password=${spring.redis.password} +sa-token.alone-redis.timeout=${spring.redis.timeout} +sa-token.alone-redis.lettuce.pool.max-active=${spring.redis.lettuce.pool.max-active} +sa-token.alone-redis.lettuce.pool.max-wait=${spring.redis.lettuce.pool.max-wait} +sa-token.alone-redis.lettuce.pool.max-idle=${spring.redis.lettuce.pool.max-idle} +sa-token.alone-redis.lettuce.pool.min-idle=${spring.redis.lettuce.pool.min-idle} + +######################################### +# knife4j configuration +######################################### +knife4j.enable=true +knife4j.production=false +knife4j.basic.enable=true +knife4j.basic.username=admin +knife4j.basic.password=123456 +knife4j.setting.enableOpenApi=false +knife4j.setting.enableSwaggerModels=false +knife4j.setting.enableFooter=false +knife4j.setting.enableFooterCustom=true +knife4j.setting.footerCustomContent=Apache License 2.0 | Copyright 2022-[SNOWY](https://www.xiaonuo.vip) + +######################################### +# snowy configuration +######################################### + +# common configuration +snowy.config.common.front-url=http://localhost:81 +snowy.config.common.backend-url=http://localhost:82 diff --git a/snowy-web-app/src/main/resources/lib/DmJdbcDriver18.jar b/snowy-web-app/src/main/resources/lib/DmJdbcDriver18.jar new file mode 100644 index 00000000..81d53ebd Binary files /dev/null and b/snowy-web-app/src/main/resources/lib/DmJdbcDriver18.jar differ diff --git a/snowy-web-app/src/main/resources/lib/kingbase8-8.6.0.jar b/snowy-web-app/src/main/resources/lib/kingbase8-8.6.0.jar new file mode 100644 index 00000000..f9777361 Binary files /dev/null and b/snowy-web-app/src/main/resources/lib/kingbase8-8.6.0.jar differ diff --git a/snowy-web-app/src/main/resources/logback-spring.xml b/snowy-web-app/src/main/resources/logback-spring.xml new file mode 100644 index 00000000..5d28c043 --- /dev/null +++ b/snowy-web-app/src/main/resources/logback-spring.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/log_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/log_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + \ No newline at end of file diff --git a/snowy-web-app/src/test/java/vip/xiaonuo/MainTest.java b/snowy-web-app/src/test/java/vip/xiaonuo/MainTest.java new file mode 100644 index 00000000..e48f4bb8 --- /dev/null +++ b/snowy-web-app/src/test/java/vip/xiaonuo/MainTest.java @@ -0,0 +1,34 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +/** + * 主测试类 + * + * @author xuyuxiang + * @date 2022/9/17 17:09 + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class) +public class MainTest { + + @Test + public void test() { + + } +} diff --git a/snowy-web-app/src/test/java/vip/xiaonuo/Test.java b/snowy-web-app/src/test/java/vip/xiaonuo/Test.java new file mode 100644 index 00000000..a9270e71 --- /dev/null +++ b/snowy-web-app/src/test/java/vip/xiaonuo/Test.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo; + +/** + * TestMain方法 + * + * @author xuyuxiang + * @date 2022/9/17 17:10 + */ +public class Test { + public static void main(String[] args) { + + } +}