commit da4b2059baa8b712a96002c8b0bc0e21e5c888d5 Author: 王宇航 <653809315@qq.com> Date: Tue Nov 3 13:51:02 2026 +0800 Initial commit: yunjiao server diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c8c6b90 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +# Build output +target/ +**/target/ + +# Runtime and IDE files +logs/ +*.log +.idea/ +*.iml +.DS_Store + +# Local environment overrides and secrets +.env +.env.* +application-local.yml +application-local.yaml +application-local.properties +application-dev.yml diff --git a/DirectoryV2.xml b/DirectoryV2.xml new file mode 100644 index 0000000..4e8b79a --- /dev/null +++ b/DirectoryV2.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..55eeeb7 --- /dev/null +++ b/README.md @@ -0,0 +1,89 @@ + ![likeshop全开源商城](https://server.likeshop.cn/uploads/gitad/likeshop.png)
+![BuildingAI](https://server.likeshop.cn/uploads/gitad/fastbuildAI.png)
+

likeadmin通用管理后台(Java)

+

⚡️快速开发、🛠️ 一键生成代码、✅后台多端自适应、📱手机端、🖥️PC(电脑)端前台

+

+ +

+

+ + + + + + + + +

+
+
+
+
+ +## 🚀🚀🚀docker本地一句命令快速部署体验 +### 快速部署 +1.安装启动 [docker](https://www.docker.com/) 之后,在终端运行以下命令,等待程序启动完毕即可体验。
+ ```shell + docker run -it --name likeadmin_java -p 20222:20222 -p 20223:20223 likeshop/likeadmin_java:1.5.0 + ``` +
+ +### 本地访问 +命令运行完毕以后,请等待程序启动完毕再访问。由于谷歌浏览器对本地部署不友好原因,访问的链接下面尾部有/就带上/。PC端管理后台帐号为admin,密码为123456 。
+PC端管理后台:http://127.0.0.1:20222/ +
PC端前台:http://127.0.0.1:20223/pc/ +
手机端前台:http://127.0.0.1:20223/mobile/ +### ⚠️注意 +docker快速部署只适合本地部署体验,不熟悉docker请勿用于生产环境,可能造成数据丢失等问题。 +
+ + +## 👀体验 +### 管理后台 +地址:https://java-admin.likeadmin.cn
+账号:admin 密码:123456 +### 手机端uniapp前台 +
+### 手机端网页前台 +https://java-front.likeadmin.cn/mobile +### PC(电脑)端网页前台 +https://java-front.likeadmin.cn/pc/ +### 开发文档 +地址:[https://www.likeadmin.cn](https://www.likeadmin.cn "https://www.likeadmin.cn") + + +## 👨‍💻‍简介 +我们希望能够为开源社区做出更多的贡献,推出永久免费开源的likeadmin通用前后端分离管理后台系统。遵循MIT开源许可协议,您可以免费使用,甚至允许把你基于likeadmin开发的软件应用开源、发布、销售。 +
+## 🧐进一步了解 +### 🧰场景介绍 +1.likeadmin已经搭建好前后端分离的底层,包含程序安装、登录、登出、工作台、菜单权限控制、角色、管理员、部门管理、岗位管理、素材管理、网站设置、图库管理等基础功能,无需重复造轮子。更有开发者工具功能,一键生成代码,大大节省开发时间。
+2.可视化系统程序安装界面,可自定义安装数据,开发者可快速扩展发行自己的软件产品。
+3.likeadmin定位为通用的软件系统管理后台,方便开发者快速开发软件系统,文档清晰、代码易懂、简单易用。
+4.手机端uniapp前台,含导导航配置、微信登录、个人登录等等基础功能,方便根据业务开发含手机前台的项目。 + + +### 🐙 后端架构方面 +1.服务端使用Java8开发,性能有突破性的提升。
+2.使用Spring Boot2.7.5框架,目前国内流行的Java框架,高性能、简单易用、文档齐全、支持Mave高级项目管理工具、支持Redis等。 +### 🐹 前端架构方面 +#### 后台 +1.使用最流性的前后端分离方案typescript、vue3、vite开发,保持了代码的简洁、一致和规范。
+2.后台界面使用element-plus UI框架,简单精美的后台界面,丰富的组件库,方便快速开发,满足各种后台交互。 +
+### 前台 +手机端uniapp前台,可以编译成手机H5网页、微信小程序、安卓App,苹果App等客户端。
+### 🛠️ 代码生成器 +一键生成前后端业务代码,大大提示开发效率。
+## 界面预览 +### 🖥️后台页面 +![](https://md.likeshop.cn/server/index.php?s=/api/attachment/visitFile&sign=9cf02b831e49d6a411bafbc4d79f51d4)
+![](https://md.likeshop.cn/server/index.php?s=/api/attachment/visitFile&sign=eb83547d55b4f41f0d92fd6a3e01d87e)
+![](https://md.likeshop.cn/server/index.php?s=/api/attachment/visitFile&sign=818d843fb9cba396226e32dad1a58f3c)
+![](https://md.likeshop.cn/server/index.php?s=/api/attachment/visitFile&sign=194ab31919cd4dd619e6c453d7a44304)
+![](https://md.likeshop.cn/server/index.php?s=/api/attachment/visitFile&sign=f6770e2a8069d7b6ea3d83b91204b9d6)
+
+### 📱手机端前台界面 +
+ +

diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..f5cb300 --- /dev/null +++ b/pom.xml @@ -0,0 +1,284 @@ + + + + + org.yj + yunjiao-server + pom + 1.0.0 + 4.0.0 + + yj-admin + yj-front + yj-common + yj-generator + + + + + UTF-8 + UTF-8 + 1.8 + 1.8 + + 1.0.0 + 1.8 + 2.16.0 + + 5.1.49 + 3.5.2 + 1.2.4 + 1.4.5 + + 1.18.24 + 2.0.16 + 3.12.0 + 2.11.0 + 2.11.1 + 2.9.0 + + 2.3.2 + 1.2.4 + 6.1.2 + 1.32.0 + 1.32.0 + 3.1.3 + 2.3.2 + + 7.17.0 + 5.6.54 + 3.1.411 + 3.10.2 + 4.5.16 + + 4.4.0 + + + + + + + + org.springframework.boot + spring-boot-dependencies + 2.7.5 + pom + import + + + + + mysql + mysql-connector-java + ${mysql-connector.version} + + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + + + com.github.yulichang + mybatis-plus-join + ${mybatis-plus-join.version} + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + ${pagehelper.version} + + + + + org.apache.commons + commons-pool2 + ${commons-pool2.version} + + + + + org.projectlombok + lombok + ${lombok.version} + + + + + com.alibaba.fastjson2 + fastjson2 + ${fastJson2.version} + + + + + com.github.penggle + kaptcha + ${kaptcha.version} + + + + + cn.dev33 + sa-token-spring-boot-starter + ${sa-token.version} + + + + + cn.dev33 + sa-token-dao-redis-jackson + ${sa-token-redis.version} + + + + + org.quartz-scheduler + quartz + ${quartz-scheduler.version} + + + + + com.google.code.gson + gson + ${google-gson.version} + + + + + nl.bitwalker + UserAgentUtils + ${bitwalker.version} + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + + commons-io + commons-io + ${commons.io.version} + + + + + com.qiniu + qiniu-java-sdk + ${qiniu.version} + + + + + com.qcloud + cos_api + ${qcloud-version} + + + + + com.aliyun.oss + aliyun-sdk-oss + ${aliyun-oss.version} + + + + + com.tencentcloudapi + tencentcloud-sdk-java + ${tencentcloudapi.version} + + + + + com.aliyun + aliyun-java-sdk-core + ${aliyun-java.version} + + + + + com.alibaba + easyexcel + ${easyexcel.version} + + + + + com.github.oshi + oshi-core + ${oshi-core.version} + + + + + io.springfox + springfox-boot-starter + 3.0.0 + + + + + com.github.binarywang + weixin-java-miniapp + ${weixin.version} + + + + + com.github.binarywang + weixin-java-mp + ${weixin.version} + + + + + com.github.binarywang + weixin-java-pay + ${weixin.version} + + + + + org.yj + yj-common + ${like.version} + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.6.4 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.10.0 + + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + + + + + + \ No newline at end of file diff --git a/sql/install.sql b/sql/install.sql new file mode 100644 index 0000000..47a1850 --- /dev/null +++ b/sql/install.sql @@ -0,0 +1,1221 @@ +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for yj_admin +-- ---------------------------- +DROP TABLE IF EXISTS `yj_admin`; +CREATE TABLE `yj_admin` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `root` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否超级管理员 0-否 1-是', + `name` varchar(32) NOT NULL DEFAULT '' COMMENT '名称', + `avatar` varchar(255) NOT NULL DEFAULT '' COMMENT '用户头像', + `account` varchar(32) NOT NULL DEFAULT '' COMMENT '账号', + `password` varchar(32) NOT NULL COMMENT '密码', + `login_time` int(10) DEFAULT NULL COMMENT '最后登录时间', + `login_ip` varchar(39) DEFAULT '' COMMENT '最后登录ip', + `multipoint_login` tinyint(1) unsigned DEFAULT '1' COMMENT '是否支持多处登录:1-是;0-否;', + `disable` tinyint(1) unsigned DEFAULT '0' COMMENT '是否禁用:0-否;1-是;', + `create_time` int(10) NOT NULL COMMENT '创建时间', + `update_time` int(10) DEFAULT NULL COMMENT '修改时间', + `delete_time` int(10) DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='管理员表'; + +-- ---------------------------- +-- Records of yj_admin +-- ---------------------------- +BEGIN; +INSERT INTO `yj_admin` (`id`, `root`, `name`, `avatar`, `account`, `password`, `login_time`, `login_ip`, `multipoint_login`, `disable`, `create_time`, `update_time`, `delete_time`) VALUES (1, 1, 'admin', 'api/static/default_avatar.png', 'admin', '25bc144c738d61f98f3327ec7b7071af', 1731986562, '127.0.0.1', 1, 0, 1728627656, 1728627656, NULL); +COMMIT; + +-- ---------------------------- +-- Table structure for yj_admin_dept +-- ---------------------------- +DROP TABLE IF EXISTS `yj_admin_dept`; +CREATE TABLE `yj_admin_dept` ( + `admin_id` int(10) NOT NULL DEFAULT '0' COMMENT '管理员id', + `dept_id` int(10) NOT NULL DEFAULT '0' COMMENT '部门id', + PRIMARY KEY (`admin_id`,`dept_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='部门关联表'; + +-- ---------------------------- +-- Records of yj_admin_dept +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_admin_jobs +-- ---------------------------- +DROP TABLE IF EXISTS `yj_admin_jobs`; +CREATE TABLE `yj_admin_jobs` ( + `admin_id` int(10) NOT NULL COMMENT '管理员id', + `jobs_id` int(10) NOT NULL COMMENT '岗位id', + PRIMARY KEY (`admin_id`,`jobs_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='岗位关联表'; + +-- ---------------------------- +-- Records of yj_admin_jobs +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_admin_role +-- ---------------------------- +DROP TABLE IF EXISTS `yj_admin_role`; +CREATE TABLE `yj_admin_role` ( + `admin_id` int(10) NOT NULL COMMENT '管理员id', + `role_id` int(10) NOT NULL COMMENT '角色id', + PRIMARY KEY (`admin_id`,`role_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色关联表'; + +-- ---------------------------- +-- Records of yj_admin_role +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_admin_session +-- ---------------------------- +DROP TABLE IF EXISTS `yj_admin_session`; +CREATE TABLE `yj_admin_session` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `admin_id` int(11) unsigned NOT NULL COMMENT '用户id', + `terminal` tinyint(1) NOT NULL DEFAULT '1' COMMENT '客户端类型:1-pc管理后台 2-mobile手机管理后台', + `token` varchar(32) NOT NULL COMMENT '令牌', + `update_time` int(10) DEFAULT NULL COMMENT '更新时间', + `expire_time` int(10) NOT NULL COMMENT '到期时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `admin_id_client` (`admin_id`,`terminal`) USING BTREE COMMENT '一个用户在一个终端只有一个token', + UNIQUE KEY `token` (`token`) USING BTREE COMMENT 'token是唯一的' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员会话表'; + +-- ---------------------------- +-- Records of yj_admin_session +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_article +-- ---------------------------- +DROP TABLE IF EXISTS `yj_article`; +CREATE TABLE `yj_article` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '文章id', + `cid` int(11) NOT NULL COMMENT '文章分类', + `title` varchar(255) NOT NULL COMMENT '文章标题', + `desc` varchar(255) DEFAULT '' COMMENT '简介', + `abstract` text COMMENT '文章摘要', + `image` varchar(128) DEFAULT NULL COMMENT '文章图片', + `author` varchar(255) DEFAULT '' COMMENT '作者', + `content` text COMMENT '文章内容', + `click_virtual` int(10) DEFAULT '0' COMMENT '虚拟浏览量', + `click_actual` int(11) DEFAULT '0' COMMENT '实际浏览量', + `is_show` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示:1-是.0-否', + `sort` int(5) DEFAULT '0' COMMENT '排序', + `create_time` int(11) DEFAULT NULL COMMENT '创建时间', + `update_time` int(11) DEFAULT NULL COMMENT '更新时间', + `delete_time` int(11) DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COMMENT='文章表'; + +-- ---------------------------- +-- Records of yj_article +-- ---------------------------- +BEGIN; +INSERT INTO `yj_article` (`id`, `cid`, `title`, `desc`, `abstract`, `image`, `author`, `content`, `click_virtual`, `click_actual`, `is_show`, `sort`, `create_time`, `update_time`, `delete_time`) VALUES (1, 3, '让生活更精致!五款居家好物推荐,实用性超高', '##好物推荐🔥', '随着当代生活节奏的忙碌,很多人在闲暇之余都想好好的享受生活。随着科技的发展,也出现了越来越多可以帮助我们提升幸福感,让生活变得更精致的产品,下面周周就给大家盘点五款居家必备的好物,都是实用性很高的产品,周周可以保证大家买了肯定会喜欢。', 'api/static/article01.png', '红花', '

拥有一台投影仪,闲暇时可以在家里直接看影院级别的大片,光是想想都觉得超级爽。市面上很多投影仪大几千,其实周周觉得没必要,选泰捷这款一千多的足够了,性价比非常高。

泰捷的专业度很高,在电视TV领域研发已经十年,有诸多专利和技术创新,荣获国内外多项技术奖项,拿下了腾讯创新工场投资,打造的泰捷视频TV端和泰捷电视盒子都获得了极高评价。

这款投影仪的分辨率在3000元内无敌,做到了真1080P高分辨率,也就是跟市场售价三千DLP投影仪一样的分辨率,真正做到了分毫毕现,像桌布的花纹、天空的云彩等,这些细节都清晰可见。

亮度方面,泰捷达到了850ANSI流明,同价位一般是200ANSI。这是因为泰捷为了提升亮度和LCD技术透射率低的问题,首创高功率LED灯源,让其亮度做到同价位最好。专业媒体也进行了多次对比,效果与3000元价位投影仪相当。

操作系统周周也很喜欢,完全不卡。泰捷作为资深音视频品牌,在系统优化方面有十年的研发经验,打造出的“零极”系统是业内公认效率最高、速度最快的系统,用户也评价它流畅度能一台顶三台,而且为了解决行业广告多这一痛点,系统内不植入任何广告。

', 1, 2, 1, 0, 1663317759, 1727070911, NULL); +INSERT INTO `yj_article` (`id`, `cid`, `title`, `desc`, `abstract`, `image`, `author`, `content`, `click_virtual`, `click_actual`, `is_show`, `sort`, `create_time`, `update_time`, `delete_time`) VALUES (2, 2, '埋葬UI设计师的坟墓不是内卷,而是免费模式', '', '本文从另外一个角度,聊聊作者对UI设计师职业发展前景的担忧,欢迎从事UI设计的同学来参与讨论,会有赠书哦', 'api/static/article02.jpeg', '小明', '


一个职业,卷,根本就没什么大不了的,尤其是成熟且收入高的职业,不卷才不符合事物发展的规律。何况 UI 设计师的人力市场到今天也和 5 年前一样,还是停留在大型菜鸡互啄的场面。远不能和医疗、证券、教师或者演艺练习生相提并论。

真正会让我对UI设计师发展前景觉得悲观的事情就只有一件 —— 国内的互联网产品免费机制。这也是一个我一直以来想讨论的话题,就在这次写一写。

国内互联网市场的发展,是一部浩瀚的 “免费经济” 发展史。虽然今天免费已经是深入国内民众骨髓的认知,但最早的中文互联网也是需要付费的,网游也都是要花钱的。

只是自有国情在此,付费确实阻碍了互联网行业的扩张和普及,一批创业家就开始通过免费的模式为用户提供服务,从而扩大了自己的产品覆盖面和普及程度。

印象最深的就是免费急先锋周鸿祎,和现在鲜少出现在公众视野不同,一零年前他是当之无愧的互联网教主,因为他开发出了符合中国国情的互联网产品 “打法”,让 360 的发展如日中天。

就是他在自传中提到:

只要是在互联网上每个人都需要的服务,我们就认为它是基础服务,基础服务一定是免费的,这样的话不会形成价值歧视。就是说,只要这种服务是每个人都一定要用的,我一定免费提供,而且是无条件免费。增值服务不是所有人都需要的,这个比例可能会相当低,它只是百分之几甚至更少比例的人需要,所以这种服务一定要收费……

这就是互联网的游戏规则,它决定了要想建立一个有效的商业模式,就一定要有海量的用户基数……

', 2, 4, 1, 0, 1663322854, 1727071178, NULL); +INSERT INTO `yj_article` (`id`, `cid`, `title`, `desc`, `abstract`, `image`, `author`, `content`, `click_virtual`, `click_actual`, `is_show`, `sort`, `create_time`, `update_time`, `delete_time`) VALUES (3, 1, '金山电池公布“沪广深市民绿色生活方式”调查结果', '', '60%以上受访者认为高质量的10分钟足以完成“自我充电”', 'api/static/article03.png', '中网资讯科技', '

深圳,2021年10月22日)生活在一线城市的沪广深市民一向以效率见称,工作繁忙和快节奏的生活容易缺乏充足的休息。近日,一项针对沪广深市民绿色生活方式而展开的网络问卷调查引起了大家的注意。问卷的问题设定集中于市民对休息时间的看法,以及从对循环充电电池的使用方面了解其对绿色生活方式的态度。该调查采用随机抽样的模式,并对最终收集的1,500份有效问卷进行专业分析后发现,超过60%的受访者表示,在每天的工作时段能拥有10分钟高质量的休息时间,就可以高效“自我充电”。该调查结果反映出,在快节奏时代下,人们需要高质量的休息时间,也要学会利用高效率的休息方式和工具来应对快节奏的生活,以时刻保持“满电”状态。

  60%以上受访者认为高质量的10分钟足以完成“自我充电”

  这次调查超过1,500人,主要聚焦18至85岁的沪广深市民,了解他们对于休息时间的观念及使用充电电池的习惯,结果发现:

  · 90%以上有工作受访者每天工作时间在7小时以上,平均工作时间为8小时,其中43%以上的受访者工作时间超过9小时

  · 70%受访者认为在工作期间拥有10分钟“自我充电”时间不是一件困难的事情

  · 60%受访者认为在工作期间有10分钟休息时间足以为自己快速充电

  临床心理学家黄咏诗女士在发布会上分享为自己快速充电的实用技巧,她表示:“事实上,只要选择正确的休息方法,10分钟也足以为自己充电。以喝咖啡为例,我们可以使用心灵休息法 ── 静观呼吸,慢慢感受咖啡的温度和气味,如果能配合着聆听流水或海洋的声音,能够有效放松大脑及心灵。”

  这次调查结果反映出沪广深市民的希望在繁忙的工作中适时停下来,抽出10分钟喝杯咖啡、聆听音乐或小睡片刻,为自己充电。金山电池全新推出的“绿再十分充”超快速充电器仅需10分钟就能充好电,喝一杯咖啡的时间既能完成“自我充电”,也满足设备使用的用电需求,为提升工作效率和放松身心注入新能量。

  金山电池推出10分钟超快电池充电器*绿再十分充,以创新科技为市场带来革新体验

  该问卷同时从沪广深市民对循环充电电池的使用方面进行了调查,以了解其对绿色生活方式的态度:

  · 87%受访者目前没有使用充电电池,其中61%表示会考虑使用充电电池

  · 58%受访者过往曾使用过充电电池,却只有20%左右市民仍在使用

  · 60%左右受访者认为充电电池尚未被广泛使用,主要障碍来自于充电时间过长、缺乏相关教育

  · 90%以上受访者认为充电电池充满电需要1小时或更长的时间

  金山电池一直致力于为大众提供安全可靠的充电电池,并与消费者的需求和生活方式一起演变及进步。今天,金山电池宣布推出10分钟超快电池充电器*绿再十分充,只需10分钟*即可将4粒绿再十分充充电电池充好电,充电速度比其他品牌提升3倍**。充电器的LED灯可以显示每粒电池的充电状态和模式,并提示用户是否错误插入已损坏电池或一次性电池。尽管其体型小巧,却具备多项创新科技 ,如拥有独特的充电算法以优化充电电流,并能根据各个电池类型、状况和温度用最短的时间为充电电池充好电;绿再十分充内置横流扇,有效防止电池温度过热和提供低噪音的充电环境等。

', 11, 4, 1, 0, 1663322665, 1727071154, NULL); +COMMIT; + +-- ---------------------------- +-- Table structure for yj_article_cate +-- ---------------------------- +DROP TABLE IF EXISTS `yj_article_cate`; +CREATE TABLE `yj_article_cate` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '文章分类id', + `name` varchar(90) DEFAULT NULL COMMENT '分类名称', + `sort` int(11) DEFAULT '0' COMMENT '排序', + `is_show` tinyint(1) DEFAULT '1' COMMENT '是否显示:1-是;0-否', + `create_time` int(10) DEFAULT NULL COMMENT '创建时间', + `update_time` int(10) DEFAULT NULL COMMENT '更新时间', + `delete_time` int(10) DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COMMENT='文章分类表'; + +-- ---------------------------- +-- Records of yj_article_cate +-- ---------------------------- +BEGIN; +INSERT INTO `yj_article_cate` (`id`, `name`, `sort`, `is_show`, `create_time`, `update_time`, `delete_time`) VALUES (1, '科技', 0, 1, 1663317280, 1663317280, NULL); +INSERT INTO `yj_article_cate` (`id`, `name`, `sort`, `is_show`, `create_time`, `update_time`, `delete_time`) VALUES (2, '生活', 0, 1, 1663317280, 1663321464, NULL); +INSERT INTO `yj_article_cate` (`id`, `name`, `sort`, `is_show`, `create_time`, `update_time`, `delete_time`) VALUES (3, '好物', 0, 1, 1727070858, 1727070858, NULL); +COMMIT; + +-- ---------------------------- +-- Table structure for yj_article_collect +-- ---------------------------- +DROP TABLE IF EXISTS `yj_article_collect`; +CREATE TABLE `yj_article_collect` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '用户ID', + `article_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '文章ID', + `status` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '收藏状态 0-未收藏 1-已收藏', + `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间', + `update_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间', + `delete_time` int(10) DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文章收藏表'; + +-- ---------------------------- +-- Records of yj_article_collect +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_config +-- ---------------------------- +DROP TABLE IF EXISTS `yj_config`; +CREATE TABLE `yj_config` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `type` varchar(30) DEFAULT NULL COMMENT '类型', + `name` varchar(60) NOT NULL DEFAULT '' COMMENT '名称', + `value` text COMMENT '值', + `create_time` int(10) DEFAULT NULL COMMENT '创建时间', + `update_time` int(10) DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8mb4 COMMENT='配置表'; + +-- ---------------------------- +-- Records of yj_config +-- ---------------------------- +BEGIN; +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (1, 'tabbar', 'style', '{\"default_color\":\"#999999\",\"selected_color\":\"#4173ff\"}', 1694052124, 1694052124); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (2, 'storage', 'default', 'local', 1696991320, 1723111254); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (3, 'storage', 'aliyun', '{\"bucket\":\"likeadmin\",\"access_key\":\"****\",\"secret_key\":\"*****\",\"domain\":\"https:\\/\\/s.com\"}', 1696991320, 1707117207); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (4, 'storage', 'local', '[]', 1696995442, 1696995442); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (5, 'oa_setting', 'menu', '[{\"name\":\"菜单名称\",\"has_menu\":\"\",\"type\":\"miniprogram\",\"url\":\"https:\\/\\/www.1222.com\",\"appid\":\"11\",\"pagepath\":\"222\",\"sub_button\":[]}]', 1698224548, 1698224548); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (6, 'oa_setting', 'name', '1', 1703144563, 1729927449); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (7, 'oa_setting', 'original_id', '1', 1703144563, 1729927449); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (8, 'oa_setting', 'qr_code', '', 1703144563, 1729927449); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (9, 'oa_setting', 'app_id', '***', 1703144563, 1729927449); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (10, 'oa_setting', 'app_secret', '***', 1703144563, 1729927449); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (11, 'oa_setting', 'token', '***', 1703144563, 1729927449); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (12, 'oa_setting', 'encoding_aes_key', '***', 1703144563, 1729927449); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (13, 'oa_setting', 'encryption_type', '1', 1703144563, 1729927449); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (14, 'login', 'login_way', '[\"1\",\"2\"]', 1707105336, 1707105336); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (15, 'login', 'coerce_mobile', '0', 1707105336, 1710837840); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (16, 'login', 'login_agreement', '1', 1707105336, 1707105336); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (17, 'login', 'third_auth', '1', 1707105336, 1707105336); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (18, 'login', 'wechat_auth', '1', 1707105336, 1707105336); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (19, 'login', 'qq_auth', '0', 1707105336, 1707105336); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (20, 'mnp_setting', 'name', '', 1707106679, 1729865093); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (21, 'mnp_setting', 'original_id', '', 1707106679, 1729865093); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (22, 'mnp_setting', 'qr_code', '', 1707106679, 1729865093); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (23, 'mnp_setting', 'app_id', '***', 1707106679, 1729865093); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (24, 'mnp_setting', 'app_secret', '***', 1707106679, 1729865093); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (25, 'recharge', 'status', '1', 1707106705, 1707106705); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (26, 'recharge', 'min_amount', '0', 1707106705, 1707106705); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (27, 'storage', 'qiniu', '{\"bucket\":\"likeshopv2\",\"access_key\":\"***\",\"secret_key\":\"***\",\"domain\":\"https:\\/\\/qiniu.yixiangonline.com\"}', 1707116129, 1707116129); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (28, 'website', 'name', 'likeadmin开源', 1707275641, 1710468285); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (29, 'website', 'web_favicon', '/adminapi/static/web_favicon.ico', 1707275641, 1723774747); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (30, 'website', 'web_logo', '/adminapi/static/admin_logo.jpg', 1707275641, 1710930501); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (31, 'website', 'login_image', '/adminapi/static/login_image.png', 1707275641, 1707275641); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (32, 'website', 'shop_name', 'likeadmin', 1707275641, 1707275641); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (33, 'website', 'shop_logo', '/adminapi/static/shop_logo.png', 1707275641, 1707275641); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (34, 'website', 'pc_logo', '/adminapi/static/pc_logo.png', 1707275641, 1707275641); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (35, 'website', 'pc_title', '世界一流的后台框架', 1707275641, 1707275641); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (36, 'website', 'pc_ico', '/adminapi/static/pc_favicon.ico', 1707275641, 1723774632); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (37, 'website', 'pc_desc', 'likeadmin', 1707275641, 1710930247); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (38, 'website', 'pc_keywords', 'likeadmin', 1707275641, 1710930247); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (39, 'website', 'h5_favicon', '/adminapi/static/web_favicon.ico', 1707275641, 1723774667); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (40, 'agreement', 'service_title', '服务协议', 1707292881, 1707292881); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (41, 'agreement', 'service_content', '


服务协议:

一、微信小程序或APP或网站服务条款的确认和接纳本微信小程序或APP或网站(以下统称本站)的各项电子服务的所有权和运作权归本平台。本站提供的服务将完全按照其发布的服务条款和操作规则严格执行。用户同意所有服务条款并完成注册程序,才能成为本站的正式用户。用户确认:本协议条款是处理双方权利义务的约定,除非违反国家强制性法律,否则始终有效。在下订单的同时,您也同时承认了您拥有购买这些产品的权利能力和行为能力,并且将您对您在订单中提供的所有信息的真实性负责。

二、服务简介本站运用自己的操作系统通过国际互联网络为用户提供网络服务。同时,用户必须:(1)自行配备上网的所需设备,包括个人电脑、调制解调器或其它必备上网装置。(2)自行负担个人上网所支付的与此服务有关的电话费用、网络费用。基于本站所提供的网络服务的重要性,用户应同意(1)提供详尽、准确的个人资料。(2)不断更新注册资料,符合及时、详尽、准确的要求。本站保证不公开用户的真实姓名、地址、电子邮箱和联系电话等用户信息, 除以下情况外:(1)用户授权本站透露这些信息。(2)相应的法律及程序要求本站提供用户的个人资料。

三、价格和数量本站将尽最大努力保证您所购商品与网站上公布的价格一致。产品的价格和可获性都在本站上指明,这类信息将随时更改。您所订购的商品,如果发生缺货,您有权取消定单。

四、送货本站将会把产品送到您所指定的送货地址。所有在本站上列出的送货时间为参考时间,参考时间的计算是根据库存状况、正常的处理过程和送货时间、送货地点的基础上估计得出的。 请清楚准确地填写您的真实姓名、送货地址及联系方式。因如下情况造成订单延迟或无法配送等,本站将无法承担迟延配送的责任:(1)客户提供错误信息和不详细的地址;(2)货物送达无人签收,由此造成的重复配送所产生的费用及相关的后果。(3)不可抗力,例如:自然灾害、交通戒严、突发战争等。

五、服务条款的修改本站将可能不定期的修改本用户协议的有关条款,一旦条款及服务内容产生变动,本站将会在重要页面上提示修改内容。

六、用户隐私制度尊重用户个人隐私是本站的一项基本政策。所以,作为对以上第二条注册资料分析的补充,本站一定不会在未经合法用户授权时公开、编辑或透露其注册资料及保存在本站中的非公开内容。

七、用户的帐号,密码和安全性用户一旦注册成功,成为本站的合法用户,将得到一个密码和用户名。您可随时根据指示改变您的密码。用户需谨慎合理的保存、使用用户名和密码。用户若发现任何非法使用用户帐号或存在安全漏洞的情况,请立即通知本站和向公安机关报案。

八、对用户信息的存储和限制如果用户违背了国家法律法规规定或本协议约定,本站有视具体情形中止或终止对其提供网络服务的权利。

九、用户管理本协议依据国家相关法律法规规章制定,用户同意严格遵守以下条款:(1)从中国境内向外传输技术性资料时必须符合中国有关法规。(2) 不利用本站从事非法活动。(3)不干扰或混乱网络服务。(4)遵守所有使用网络服务的网络协议、规定、程序和惯例。用户须承诺不传输任何违法犯罪的、骚扰性的、中伤他人的、辱骂性的、恐吓性的、伤害性的、庸俗的,淫秽的、不文明的等信息资料;不传输损害国家社会公共利益和涉及国家安全的信息资料;不传输教唆他人从事本条所述行为的信息资料。未经许可而非法进入其它电脑系统是禁止的。若用户的行为不符合以上提到的服务条款,本站将作出独立判断立即取消用户服务帐号。用户需对自己在网上的行为承担法律责任。用户若在本站上散布和传播反动、色情或其它违反国家法律的信息,本站的系统记录有可能作为用户违反法律的证据。

十、通告所有发给用户的通告都可通过重要页面的公告或电子邮件或常规的信件传送。用户协议条款的修改、服务变更、或其它重要事件的通告都会以此形式进行。

十一、网络服务内容的所有权本站定义的网络服务内容包括:文字、软件、声音、图片、录象、图表、广告中的全部内容;电子邮件的全部内容;本站为用户提供的其它信息。所有这些内容受版权、商标、标签和其它财产所有权法律的保护。所以,用户只能在本站和广告商授权下才能使用这些内容,而不能擅自复制、再造这些内容、或创造与内容有关的派生产品。本站所有的文章版权归原文作者和本站共同所有,任何人需要转载本站的文章,必须征得原文作者和本站授权。

十二、责任限制如因不可抗力或其它本站无法控制的原因使本站销售系统崩溃或无法正常使用导致网上交易无法完成或丢失有关的信息、记录等本站会尽可能合理地协助处理善后事宜,并尽最大努力使客户免受损失。

十三、法律管辖和适用本协议的订立、执行和解释及争议的解决均应适用中国法律。如发生本站服务条款与中国法律相抵触时,则这些条款将完全按法律规定重新解释,而其它有效条款继续有效。如双方就本协议内容或其执行发生任何争议,双方应尽力友好协商解决;协商不成时,任何一方均可向人民法院提起诉讼。

', 1707292881, 1710726599); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (42, 'agreement', 'privacy_title', '隐私政策', 1707292881, 1707292881); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (43, 'agreement', 'privacy_content', '


隐私协议:

一、微信小程序或APP或网站服务条款的确认和接纳本微信小程序或APP或网站(以下统称本站)的各项电子服务的所有权和运作权归本平台。本站提供的服务将完全按照其发布的服务条款和操作规则严格执行。用户同意所有服务条款并完成注册程序,才能成为本站的正式用户。用户确认:本协议条款是处理双方权利义务的约定,除非违反国家强制性法律,否则始终有效。在下订单的同时,您也同时承认了您拥有购买这些产品的权利能力和行为能力,并且将您对您在订单中提供的所有信息的真实性负责。

二、服务简介本站运用自己的操作系统通过国际互联网络为用户提供网络服务。同时,用户必须:(1)自行配备上网的所需设备,包括个人电脑、调制解调器或其它必备上网装置。(2)自行负担个人上网所支付的与此服务有关的电话费用、网络费用。基于本站所提供的网络服务的重要性,用户应同意(1)提供详尽、准确的个人资料。(2)不断更新注册资料,符合及时、详尽、准确的要求。本站保证不公开用户的真实姓名、地址、电子邮箱和联系电话等用户信息, 除以下情况外:(1)用户授权本站透露这些信息。(2)相应的法律及程序要求本站提供用户的个人资料。

三、价格和数量本站将尽最大努力保证您所购商品与网站上公布的价格一致。产品的价格和可获性都在本站上指明,这类信息将随时更改。您所订购的商品,如果发生缺货,您有权取消定单。

四、送货本站将会把产品送到您所指定的送货地址。所有在本站上列出的送货时间为参考时间,参考时间的计算是根据库存状况、正常的处理过程和送货时间、送货地点的基础上估计得出的。 请清楚准确地填写您的真实姓名、送货地址及联系方式。因如下情况造成订单延迟或无法配送等,本站将无法承担迟延配送的责任:(1)客户提供错误信息和不详细的地址;(2)货物送达无人签收,由此造成的重复配送所产生的费用及相关的后果。(3)不可抗力,例如:自然灾害、交通戒严、突发战争等。

五、服务条款的修改本站将可能不定期的修改本用户协议的有关条款,一旦条款及服务内容产生变动,本站将会在重要页面上提示修改内容。

六、用户隐私制度尊重用户个人隐私是本站的一项基本政策。所以,作为对以上第二条注册资料分析的补充,本站一定不会在未经合法用户授权时公开、编辑或透露其注册资料及保存在本站中的非公开内容。

七、用户的帐号,密码和安全性用户一旦注册成功,成为本站的合法用户,将得到一个密码和用户名。您可随时根据指示改变您的密码。用户需谨慎合理的保存、使用用户名和密码。用户若发现任何非法使用用户帐号或存在安全漏洞的情况,请立即通知本站和向公安机关报案。

八、对用户信息的存储和限制如果用户违背了国家法律法规规定或本协议约定,本站有视具体情形中止或终止对其提供网络服务的权利。

九、用户管理本协议依据国家相关法律法规规章制定,用户同意严格遵守以下条款:(1)从中国境内向外传输技术性资料时必须符合中国有关法规。(2) 不利用本站从事非法活动。(3)不干扰或混乱网络服务。(4)遵守所有使用网络服务的网络协议、规定、程序和惯例。用户须承诺不传输任何违法犯罪的、骚扰性的、中伤他人的、辱骂性的、恐吓性的、伤害性的、庸俗的,淫秽的、不文明的等信息资料;不传输损害国家社会公共利益和涉及国家安全的信息资料;不传输教唆他人从事本条所述行为的信息资料。未经许可而非法进入其它电脑系统是禁止的。若用户的行为不符合以上提到的服务条款,本站将作出独立判断立即取消用户服务帐号。用户需对自己在网上的行为承担法律责任。用户若在本站上散布和传播反动、色情或其它违反国家法律的信息,本站的系统记录有可能作为用户违反法律的证据。

十、通告所有发给用户的通告都可通过重要页面的公告或电子邮件或常规的信件传送。用户协议条款的修改、服务变更、或其它重要事件的通告都会以此形式进行。

十一、网络服务内容的所有权本站定义的网络服务内容包括:文字、软件、声音、图片、录象、图表、广告中的全部内容;电子邮件的全部内容;本站为用户提供的其它信息。所有这些内容受版权、商标、标签和其它财产所有权法律的保护。所以,用户只能在本站和广告商授权下才能使用这些内容,而不能擅自复制、再造这些内容、或创造与内容有关的派生产品。本站所有的文章版权归原文作者和本站共同所有,任何人需要转载本站的文章,必须征得原文作者和本站授权。

十二、责任限制如因不可抗力或其它本站无法控制的原因使本站销售系统崩溃或无法正常使用导致网上交易无法完成或丢失有关的信息、记录等本站会尽可能合理地协助处理善后事宜,并尽最大努力使客户免受损失。

十三、法律管辖和适用本协议的订立、执行和解释及争议的解决均应适用中国法律。如发生本站服务条款与中国法律相抵触时,则这些条款将完全按法律规定重新解释,而其它有效条款继续有效。如双方就本协议内容或其执行发生任何争议,双方应尽力友好协商解决;协商不成时,任何一方均可向人民法院提起诉讼。

', 1707292881, 1710726599); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (44, 'default_image', 'user_avatar', '/adminapi/static/default_avatar.png', 1710141128, 1710141228); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (45, 'copyright', 'config', '[{\"key\":\"likeadmin开源后台\",\"value\":\"https:\\/\\/beian.miit.gov.cn\\/\"},{\"key\":\"likeshop开源电商\",\"value\":\"https:\\/\\/www.likeshop.cn\"}]', 1710471074, 1723715054); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (46, 'sms', 'tencent', '{\"name\":\"腾讯云短信\",\"type\":\"tencent\",\"sign\":\"1\",\"app_key\":\"\",\"app_id\":\"1\",\"secret_key\":\"1\",\"secret_id\":\"1\",\"status\":1}', 1710489820, 1731983329); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (47, 'sms', 'engine', 'tencent', 1710489825, 1731983329); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (48, 'sms', 'ali', '{\"name\":\"阿里云短信\",\"type\":\"ali\",\"sign\":\"***\",\"app_key\":\"**\",\"app_id\":\"\",\"secret_key\":\"***\",\"secret_id\":\"\",\"status\":1}', 1710489837, 1729343871); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (49, 'hot_search', 'status', '1', 1710817727, 1723169824); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (50, 'storage', 'qcloud', '{\"bucket\":\"***\",\"region\":\"ap-guangzhou\",\"access_key\":\"****\",\"secret_key\":\"*****\",\"domain\":\"https:\\/\\/xxx.com\"}', 1723111250, 1723111250); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (51, 'open_platform', 'app_id', '1', 1729527783, 1731983406); +INSERT INTO `yj_config` (`id`, `type`, `name`, `value`, `create_time`, `update_time`) VALUES (52, 'open_platform', 'app_secret', '1', 1729527783, 1731983406); +COMMIT; + +-- ---------------------------- +-- Table structure for yj_decorate_page +-- ---------------------------- +DROP TABLE IF EXISTS `yj_decorate_page`; +CREATE TABLE `yj_decorate_page` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `type` tinyint(2) unsigned NOT NULL DEFAULT '10' COMMENT '页面类型 1=商城首页, 2=个人中心, 3=客服设置 4-PC首页', + `name` varchar(100) NOT NULL DEFAULT '' COMMENT '页面名称', + `data` text COMMENT '页面数据', + `meta` text COMMENT '页面设置', + `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间', + `update_time` int(10) unsigned NOT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COMMENT='装修页面配置表'; + +-- ---------------------------- +-- Records of yj_decorate_page +-- ---------------------------- +BEGIN; +INSERT INTO `yj_decorate_page` (`id`, `type`, `name`, `data`, `meta`, `create_time`, `update_time`) VALUES (1, 1, '首页装修', '[{\"title\":\"搜索\",\"name\":\"search\",\"disabled\":1,\"content\":{},\"styles\":{}},{\"title\":\"首页轮播图\",\"name\":\"banner\",\"content\":{\"enabled\":1,\"data\":[{\"image\":\"/adminapi/static/banner001.png\",\"name\":\"\",\"link\":{\"id\":6,\"name\":\"来自瓷器的爱\",\"path\":\"/pages/news_detail/news_detail\",\"query\":{\"id\":6},\"type\":\"article\"},\"is_show\":\"1\",\"bg\":\"/adminapi/static/banner001_bg.png\"},{\"image\":\"/adminapi/static/banner002.png\",\"name\":\"\",\"link\":{\"id\":3,\"name\":\"金山电池公布“沪广深市民绿色生活方式”调查结果\",\"path\":\"/pages/news_detail/news_detail\",\"query\":{\"id\":3},\"type\":\"article\"},\"is_show\":\"1\",\"bg\":\"/adminapi/static/banner002_bg.png\"},{\"is_show\":\"1\",\"image\":\"/adminapi/static/banner003.png\",\"name\":\"\",\"link\":{\"id\":1,\"name\":\"让生活更精致!五款居家好物推荐,实用性超高\",\"path\":\"/pages/news_detail/news_detail\",\"query\":{\"id\":1},\"type\":\"article\"},\"bg\":\"/adminapi/static/banner003_bg.png\"}],\"style\":1,\"bg_style\":1},\"styles\":{}},{\"title\":\"导航菜单\",\"name\":\"nav\",\"content\":{\"enabled\":1,\"data\":[{\"image\":\"/adminapi/static/nav01.png\",\"name\":\"资讯中心\",\"link\":{\"path\":\"/pages/news/news\",\"name\":\"文章资讯\",\"type\":\"shop\",\"canTab\":true},\"is_show\":\"1\"},{\"image\":\"/adminapi/static/nav03.png\",\"name\":\"个人设置\",\"link\":{\"path\":\"/pages/user_set/user_set\",\"name\":\"个人设置\",\"type\":\"shop\"},\"is_show\":\"1\"},{\"image\":\"/adminapi/static/nav02.png\",\"name\":\"我的收藏\",\"link\":{\"path\":\"/pages/collection/collection\",\"name\":\"我的收藏\",\"type\":\"shop\"},\"is_show\":\"1\"},{\"image\":\"/adminapi/static/nav05.png\",\"name\":\"关于我们\",\"link\":{\"path\":\"/pages/as_us/as_us\",\"name\":\"关于我们\",\"type\":\"shop\"},\"is_show\":\"1\"},{\"image\":\"/adminapi/static/nav04.png\",\"name\":\"联系客服\",\"link\":{\"path\":\"/pages/customer_service/customer_service\",\"name\":\"联系客服\",\"type\":\"shop\"},\"is_show\":\"1\"}],\"style\":2,\"per_line\":5,\"show_line\":2},\"styles\":{}},{\"title\":\"首页中部轮播图\",\"name\":\"middle-banner\",\"content\":{\"enabled\":1,\"data\":[{\"is_show\":\"1\",\"image\":\"/adminapi/static/index_ad01.png\",\"name\":\"\",\"link\":{\"path\":\"/pages/agreement/agreement\",\"name\":\"隐私政策\",\"query\":{\"type\":\"privacy\"},\"type\":\"shop\"}}]},\"styles\":{}},{\"id\":\"l84almsk2uhyf\",\"title\":\"资讯\",\"name\":\"news\",\"disabled\":1,\"content\":{},\"styles\":{}}]', '[{\"title\":\"页面设置\",\"name\":\"page-meta\",\"content\":{\"title\":\"首页\",\"bg_type\":\"1\",\"bg_color\":\"#2F80ED\",\"bg_image\":\"/adminapi/static/page_meta_bg01.png\",\"text_color\":\"1\",\"title_type\":\"1\",\"title_img\":\"/adminapi/static/page_mate_title.png\"},\"styles\":{}}]', 1661757188, 1731945113); +INSERT INTO `yj_decorate_page` (`id`, `type`, `name`, `data`, `meta`, `create_time`, `update_time`) VALUES (2, 2, '个人中心', '[{\"title\":\"用户信息\",\"name\":\"user-info\",\"disabled\":1,\"content\":{},\"styles\":{}},{\"title\":\"我的服务\",\"name\":\"my-service\",\"content\":{\"style\":1,\"title\":\"我的服务\",\"data\":[{\"image\":\"/adminapi/static/user_collect.png\",\"name\":\"我的收藏\",\"link\":{\"path\":\"/pages/collection/collection\",\"name\":\"我的收藏\",\"type\":\"shop\"},\"is_show\":\"1\"},{\"image\":\"/adminapi/static/user_setting.png\",\"name\":\"个人设置\",\"link\":{\"path\":\"/pages/user_set/user_set\",\"name\":\"个人设置\",\"type\":\"shop\"},\"is_show\":\"1\"},{\"image\":\"/adminapi/static/user_kefu.png\",\"name\":\"联系客服\",\"link\":{\"path\":\"/pages/customer_service/customer_service\",\"name\":\"联系客服\",\"type\":\"shop\"},\"is_show\":\"1\"},{\"image\":\"/adminapi/static/wallet.png\",\"name\":\"我的钱包\",\"link\":{\"path\":\"/packages/pages/user_wallet/user_wallet\",\"name\":\"我的钱包\",\"type\":\"shop\"},\"is_show\":\"1\"}],\"enabled\":1},\"styles\":{}},{\"title\":\"个人中心广告图\",\"name\":\"user-banner\",\"content\":{\"enabled\":1,\"data\":[{\"image\":\"/adminapi/static/user_ad01.png\",\"name\":\"\",\"link\":{\"path\":\"/pages/customer_service/customer_service\",\"name\":\"联系客服\",\"type\":\"shop\"},\"is_show\":\"1\"},{\"image\":\"/adminapi/static/user_ad02.png\",\"name\":\"\",\"link\":{\"path\":\"/pages/customer_service/customer_service\",\"name\":\"联系客服\",\"type\":\"shop\"},\"is_show\":\"1\"}]},\"styles\":{}}]', '[{\"title\":\"页面设置\",\"name\":\"page-meta\",\"content\":{\"title\":\"个人中心\",\"bg_type\":\"1\",\"bg_color\":\"#2F80ED\",\"bg_image\":\"\",\"text_color\":\"1\",\"title_type\":\"1\",\"title_img\":\"/adminapi/static/page_mate_title.png\"},\"styles\":{}}]', 1661757188, 1731945117); +INSERT INTO `yj_decorate_page` (`id`, `type`, `name`, `data`, `meta`, `create_time`, `update_time`) VALUES (3, 3, '客服设置', '[{\"title\":\"客服设置\",\"name\":\"customer-service\",\"content\":{\"title\":\"添加客服二维码\",\"time\":\"早上 9:30 - 19:00\",\"mobile\":\"18578768757\",\"qrcode\":\"api/static/kefu01.png\",\"remark\":\"长按添加客服或拨打客服热线\"},\"styles\":{}}]', '', 1661757188, 1710929953); +INSERT INTO `yj_decorate_page` (`id`, `type`, `name`, `data`, `meta`, `create_time`, `update_time`) VALUES (4, 4, 'PC设置', '[{\"id\":\"lajcn8d0hzhed\",\"title\":\"首页轮播图\",\"name\":\"pc-banner\",\"content\":{\"enabled\":1,\"data\":[{\"image\":\"/adminapi/static/banner03.png\",\"name\":\"\",\"link\":{\"path\":\"/pages/news/news\",\"name\":\"文章资讯\",\"type\":\"shop\"}},{\"image\":\"/adminapi/static/banner02.png\",\"name\":\"\",\"link\":{\"path\":\"/pages/collection/collection\",\"name\":\"我的收藏\",\"type\":\"shop\"}},{\"image\":\"/adminapi/static/banner01.png\",\"name\":\"\",\"link\":{}}]},\"styles\":{\"position\":\"absolute\",\"left\":\"40\",\"top\":\"75px\",\"width\":\"750px\",\"height\":\"340px\"}}]', '', 1661757188, 1710990175); +INSERT INTO `yj_decorate_page` (`id`, `type`, `name`, `data`, `meta`, `create_time`, `update_time`) VALUES (5, 5, '系统风格', '{\"themeColorId\":3,\"topTextColor\":\"white\",\"navigationBarColor\":\"#A74BFD\",\"themeColor1\":\"#A74BFD\",\"themeColor2\":\"#CB60FF\",\"buttonColor\":\"white\"}', '', 1710410915, 1710990415); +COMMIT; + +-- ---------------------------- +-- Table structure for yj_decorate_tabbar +-- ---------------------------- +DROP TABLE IF EXISTS `yj_decorate_tabbar`; +CREATE TABLE `yj_decorate_tabbar` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(20) NOT NULL DEFAULT '' COMMENT '导航名称', + `selected` varchar(200) NOT NULL DEFAULT '' COMMENT '未选图标', + `unselected` varchar(200) NOT NULL DEFAULT '' COMMENT '已选图标', + `link` varchar(200) DEFAULT NULL COMMENT '链接地址', + `is_show` tinyint(255) unsigned NOT NULL DEFAULT '1' COMMENT '显示状态', + `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间', + `update_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COMMENT='装修底部导航表'; + +-- ---------------------------- +-- Records of yj_decorate_tabbar +-- ---------------------------- +BEGIN; +INSERT INTO `yj_decorate_tabbar` (`id`, `name`, `selected`, `unselected`, `link`, `is_show`, `create_time`, `update_time`) VALUES (1, '首页', '/adminapi/static/tabbar_home_sel.png', '/adminapi/static/tabbar_home.png', '{\"path\":\"/pages/index/index\",\"name\":\"商城首页\",\"type\":\"shop\"}', 1, 1662688157, 1662688157); +INSERT INTO `yj_decorate_tabbar` (`id`, `name`, `selected`, `unselected`, `link`, `is_show`, `create_time`, `update_time`) VALUES (2, '资讯', '/adminapi/static/tabbar_text_sel.png', '/adminapi/static/tabbar_text.png', '{\"path\":\"/pages/news/news\",\"name\":\"文章资讯\",\"type\":\"shop\",\"canTab\":\"1\"}', 1, 1662688157, 1662688157); +INSERT INTO `yj_decorate_tabbar` (`id`, `name`, `selected`, `unselected`, `link`, `is_show`, `create_time`, `update_time`) VALUES (3, '我的', '/adminapi/static/tabbar_me_sel.png', '/adminapi/static/tabbar_me.png', '{\"path\":\"/pages/user/user\",\"name\":\"个人中心\",\"type\":\"shop\",\"canTab\":\"1\"}', 1, 1662688157, 1662688157); +COMMIT; + +-- ---------------------------- +-- Table structure for yj_dept +-- ---------------------------- +DROP TABLE IF EXISTS `yj_dept`; +CREATE TABLE `yj_dept` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id', + `name` varchar(30) NOT NULL DEFAULT '' COMMENT '部门名称', + `pid` bigint(20) NOT NULL DEFAULT '0' COMMENT '上级部门id', + `sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序', + `leader` varchar(64) DEFAULT NULL COMMENT '负责人', + `mobile` varchar(16) DEFAULT NULL COMMENT '联系电话', + `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '部门状态(0停用 1正常)', + `create_time` int(10) NOT NULL COMMENT '创建时间', + `update_time` int(10) DEFAULT NULL COMMENT '修改时间', + `delete_time` int(10) DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='部门表'; + +-- ---------------------------- +-- Records of yj_dept +-- ---------------------------- +BEGIN; +INSERT INTO `yj_dept` (`id`, `name`, `pid`, `sort`, `leader`, `mobile`, `status`, `create_time`, `update_time`, `delete_time`) VALUES (1, '公司', 0, 0, 'boss', '12345698745', 1, 1650592684, 1653640368, NULL); +COMMIT; + +-- ---------------------------- +-- Table structure for yj_dev_crontab +-- ---------------------------- +DROP TABLE IF EXISTS `yj_dev_crontab`; +CREATE TABLE `yj_dev_crontab` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(32) NOT NULL COMMENT '定时任务名称', + `type` tinyint(1) NOT NULL COMMENT '类型 1-定时任务', + `system` tinyint(4) DEFAULT '0' COMMENT '是否系统任务 0-否 1-是', + `remark` varchar(255) DEFAULT '' COMMENT '备注', + `command` varchar(64) NOT NULL COMMENT '命令内容', + `params` varchar(64) DEFAULT '' COMMENT '参数', + `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态 1-运行 2-停止 3-错误', + `expression` varchar(64) NOT NULL COMMENT '运行规则', + `error` varchar(256) DEFAULT NULL COMMENT '运行失败原因', + `last_time` int(11) DEFAULT NULL COMMENT '最后执行时间', + `time` varchar(64) DEFAULT '0' COMMENT '实时执行时长', + `max_time` varchar(64) DEFAULT '0' COMMENT '最大执行时长', + `create_time` int(10) DEFAULT NULL COMMENT '创建时间', + `update_time` int(10) DEFAULT NULL COMMENT '更新时间', + `delete_time` int(10) DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='计划任务表'; + +-- ---------------------------- +-- Records of yj_dev_crontab +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_dev_pay_config +-- ---------------------------- +DROP TABLE IF EXISTS `yj_dev_pay_config`; +CREATE TABLE `yj_dev_pay_config` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(32) NOT NULL DEFAULT '' COMMENT '模版名称', + `pay_way` tinyint(1) NOT NULL COMMENT '支付方式:1-余额支付;2-微信支付;3-支付宝支付;', + `config` text COMMENT '对应支付配置(json字符串)', + `icon` varchar(255) DEFAULT NULL COMMENT '图标', + `sort` int(5) DEFAULT NULL COMMENT '排序', + `remark` varchar(255) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4; + +-- ---------------------------- +-- Records of yj_dev_pay_config +-- ---------------------------- +BEGIN; +INSERT INTO `yj_dev_pay_config` (`id`, `name`, `pay_way`, `config`, `icon`, `sort`, `remark`) VALUES (1, '余额支付', 1, '', '/api/static/balance_pay.png', 128, '余额支付备注'); +INSERT INTO `yj_dev_pay_config` (`id`, `name`, `pay_way`, `config`, `icon`, `sort`, `remark`) VALUES (2, '微信支付', 2, '{\"interface_version\":\"v3\",\"merchant_type\":\"ordinary_merchant\",\"mch_id\":\"**\",\"pay_sign_key\":\"**\",\"apiclient_cert\":\"**\",\"apiclient_key\":\"**\"}', '/api/static/wechat_pay.png', 123, '微信支付备注'); +INSERT INTO `yj_dev_pay_config` (`id`, `name`, `pay_way`, `config`, `icon`, `sort`, `remark`) VALUES (3, '支付宝支付', 3, '{\"mode\":\"normal_mode\",\"merchant_type\":\"ordinary_merchant\",\"app_id\":\"**\",\"private_key\":\"**\",\"ali_public_key\":\"**\"}', '/api/static/ali_pay.png', 123, '支付宝支付'); +COMMIT; + +-- ---------------------------- +-- Table structure for yj_dev_pay_way +-- ---------------------------- +DROP TABLE IF EXISTS `yj_dev_pay_way`; +CREATE TABLE `yj_dev_pay_way` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `pay_config_id` int(11) NOT NULL COMMENT '支付配置ID', + `scene` tinyint(1) NOT NULL COMMENT '场景:1-微信小程序;2-微信公众号;3-H5;4-PC;5-APP;', + `is_default` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否默认支付:0-否;1-是;', + `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:0-关闭;1-开启;', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4; + +-- ---------------------------- +-- Records of yj_dev_pay_way +-- ---------------------------- +BEGIN; +INSERT INTO `yj_dev_pay_way` (`id`, `pay_config_id`, `scene`, `is_default`, `status`) VALUES (1, 1, 1, 0, 1); +INSERT INTO `yj_dev_pay_way` (`id`, `pay_config_id`, `scene`, `is_default`, `status`) VALUES (2, 2, 1, 1, 1); +INSERT INTO `yj_dev_pay_way` (`id`, `pay_config_id`, `scene`, `is_default`, `status`) VALUES (3, 1, 2, 0, 1); +INSERT INTO `yj_dev_pay_way` (`id`, `pay_config_id`, `scene`, `is_default`, `status`) VALUES (4, 2, 2, 1, 1); +INSERT INTO `yj_dev_pay_way` (`id`, `pay_config_id`, `scene`, `is_default`, `status`) VALUES (5, 1, 3, 0, 1); +INSERT INTO `yj_dev_pay_way` (`id`, `pay_config_id`, `scene`, `is_default`, `status`) VALUES (6, 2, 3, 1, 1); +INSERT INTO `yj_dev_pay_way` (`id`, `pay_config_id`, `scene`, `is_default`, `status`) VALUES (7, 3, 3, 0, 1); +INSERT INTO `yj_dev_pay_way` (`id`, `pay_config_id`, `scene`, `is_default`, `status`) VALUES (8, 3, 2, 0, 1); +COMMIT; + +-- ---------------------------- +-- Table structure for yj_dict_data +-- ---------------------------- +DROP TABLE IF EXISTS `yj_dict_data`; +CREATE TABLE `yj_dict_data` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id', + `name` varchar(255) NOT NULL COMMENT '数据名称', + `value` varchar(255) NOT NULL COMMENT '数据值', + `type_id` int(11) NOT NULL COMMENT '字典类型id', + `type_value` varchar(255) NOT NULL COMMENT '字典类型', + `sort` int(10) DEFAULT '0' COMMENT '排序值', + `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态 0-停用 1-正常', + `remark` varchar(255) DEFAULT '' COMMENT '备注', + `create_time` int(10) NOT NULL COMMENT '创建时间', + `update_time` int(10) DEFAULT NULL COMMENT '修改时间', + `delete_time` int(10) DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COMMENT='字典数据表'; + +-- ---------------------------- +-- Records of yj_dict_data +-- ---------------------------- +BEGIN; +INSERT INTO `yj_dict_data` (`id`, `name`, `value`, `type_id`, `type_value`, `sort`, `status`, `remark`, `create_time`, `update_time`, `delete_time`) VALUES (1, '隐藏', '0', 1, 'show_status', 0, 1, '', 1656381543, 1656381543, NULL); +INSERT INTO `yj_dict_data` (`id`, `name`, `value`, `type_id`, `type_value`, `sort`, `status`, `remark`, `create_time`, `update_time`, `delete_time`) VALUES (2, '显示', '1', 1, 'show_status', 0, 1, '', 1656381550, 1656381550, NULL); +INSERT INTO `yj_dict_data` (`id`, `name`, `value`, `type_id`, `type_value`, `sort`, `status`, `remark`, `create_time`, `update_time`, `delete_time`) VALUES (3, '进行中', '0', 2, 'business_status', 0, 1, '', 1656381410, 1656381410, NULL); +INSERT INTO `yj_dict_data` (`id`, `name`, `value`, `type_id`, `type_value`, `sort`, `status`, `remark`, `create_time`, `update_time`, `delete_time`) VALUES (4, '成功', '1', 2, 'business_status', 0, 1, '', 1656381437, 1656381437, NULL); +INSERT INTO `yj_dict_data` (`id`, `name`, `value`, `type_id`, `type_value`, `sort`, `status`, `remark`, `create_time`, `update_time`, `delete_time`) VALUES (5, '失败', '2', 2, 'business_status', 0, 1, '', 1656381449, 1656381449, NULL); +INSERT INTO `yj_dict_data` (`id`, `name`, `value`, `type_id`, `type_value`, `sort`, `status`, `remark`, `create_time`, `update_time`, `delete_time`) VALUES (6, '待处理', '0', 3, 'event_status', 0, 1, '', 1656381212, 1656381212, NULL); +INSERT INTO `yj_dict_data` (`id`, `name`, `value`, `type_id`, `type_value`, `sort`, `status`, `remark`, `create_time`, `update_time`, `delete_time`) VALUES (7, '已处理', '1', 3, 'event_status', 0, 1, '', 1656381315, 1656381315, NULL); +INSERT INTO `yj_dict_data` (`id`, `name`, `value`, `type_id`, `type_value`, `sort`, `status`, `remark`, `create_time`, `update_time`, `delete_time`) VALUES (8, '拒绝处理', '2', 3, 'event_status', 0, 1, '', 1656381331, 1656381331, NULL); +INSERT INTO `yj_dict_data` (`id`, `name`, `value`, `type_id`, `type_value`, `sort`, `status`, `remark`, `create_time`, `update_time`, `delete_time`) VALUES (9, '禁用', '1', 4, 'system_disable', 0, 1, '', 1656312030, 1656312030, NULL); +INSERT INTO `yj_dict_data` (`id`, `name`, `value`, `type_id`, `type_value`, `sort`, `status`, `remark`, `create_time`, `update_time`, `delete_time`) VALUES (10, '正常', '0', 4, 'system_disable', 0, 1, '', 1656312040, 1656312040, NULL); +INSERT INTO `yj_dict_data` (`id`, `name`, `value`, `type_id`, `type_value`, `sort`, `status`, `remark`, `create_time`, `update_time`, `delete_time`) VALUES (11, '未知', '0', 5, 'sex', 0, 1, '', 1656062988, 1656062988, NULL); +INSERT INTO `yj_dict_data` (`id`, `name`, `value`, `type_id`, `type_value`, `sort`, `status`, `remark`, `create_time`, `update_time`, `delete_time`) VALUES (12, '男', '1', 5, 'sex', 0, 1, '', 1656062999, 1656062999, NULL); +INSERT INTO `yj_dict_data` (`id`, `name`, `value`, `type_id`, `type_value`, `sort`, `status`, `remark`, `create_time`, `update_time`, `delete_time`) VALUES (13, '女', '2', 5, 'sex', 0, 1, '', 1656063009, 1656063009, NULL); +COMMIT; + +-- ---------------------------- +-- Table structure for yj_dict_type +-- ---------------------------- +DROP TABLE IF EXISTS `yj_dict_type`; +CREATE TABLE `yj_dict_type` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id', + `name` varchar(255) NOT NULL DEFAULT '' COMMENT '字典名称', + `type` varchar(255) NOT NULL DEFAULT '' COMMENT '字典类型名称', + `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态 0-停用 1-正常', + `remark` varchar(255) DEFAULT '' COMMENT '备注', + `create_time` int(10) NOT NULL COMMENT '创建时间', + `update_time` int(10) DEFAULT NULL COMMENT '修改时间', + `delete_time` int(10) DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COMMENT='字典类型表'; + +-- ---------------------------- +-- Records of yj_dict_type +-- ---------------------------- +BEGIN; +INSERT INTO `yj_dict_type` (`id`, `name`, `type`, `status`, `remark`, `create_time`, `update_time`, `delete_time`) VALUES (1, '显示状态', 'show_status', 1, '', 1656381520, 1656381520, NULL); +INSERT INTO `yj_dict_type` (`id`, `name`, `type`, `status`, `remark`, `create_time`, `update_time`, `delete_time`) VALUES (2, '业务状态', 'business_status', 1, '', 1656381393, 1656381393, NULL); +INSERT INTO `yj_dict_type` (`id`, `name`, `type`, `status`, `remark`, `create_time`, `update_time`, `delete_time`) VALUES (3, '事件状态', 'event_status', 1, '', 1656381075, 1656381075, NULL); +INSERT INTO `yj_dict_type` (`id`, `name`, `type`, `status`, `remark`, `create_time`, `update_time`, `delete_time`) VALUES (4, '禁用状态', 'system_disable', 1, '', 1656311838, 1656311838, NULL); +INSERT INTO `yj_dict_type` (`id`, `name`, `type`, `status`, `remark`, `create_time`, `update_time`, `delete_time`) VALUES (5, '用户性别', 'sex', 1, '', 1656062946, 1656380925, NULL); +COMMIT; + +-- ---------------------------- +-- Table structure for yj_file +-- ---------------------------- +DROP TABLE IF EXISTS `yj_file`; +CREATE TABLE `yj_file` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `cid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '类目ID', + `source_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '上传者id', + `source` tinyint(1) NOT NULL DEFAULT '0' COMMENT '来源类型[0-后台,1-用户]', + `type` tinyint(2) unsigned NOT NULL DEFAULT '10' COMMENT '类型[10=图片, 20=视频]', + `name` varchar(255) NOT NULL DEFAULT '' COMMENT '文件名称', + `uri` varchar(200) NOT NULL COMMENT '文件路径', + `create_time` int(10) unsigned DEFAULT NULL COMMENT '创建时间', + `update_time` int(10) DEFAULT NULL COMMENT '更新时间', + `delete_time` int(10) DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件表'; + +-- ---------------------------- +-- Records of yj_file +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_file_cate +-- ---------------------------- +DROP TABLE IF EXISTS `yj_file_cate`; +CREATE TABLE `yj_file_cate` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `pid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '父级ID', + `type` tinyint(2) unsigned NOT NULL DEFAULT '10' COMMENT '类型[10=图片,20=视频,30=文件]', + `name` varchar(32) NOT NULL DEFAULT '' COMMENT '分类名称', + `create_time` int(10) unsigned DEFAULT NULL COMMENT '创建时间', + `update_time` int(10) unsigned DEFAULT NULL COMMENT '更新时间', + `delete_time` int(10) unsigned DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件分类表'; + +-- ---------------------------- +-- Records of yj_file_cate +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_gen_table +-- ---------------------------- +DROP TABLE IF EXISTS `yj_gen_table`; +CREATE TABLE `yj_gen_table` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `table_name` varchar(200) NOT NULL DEFAULT '' COMMENT '表名称', + `table_comment` varchar(200) NOT NULL DEFAULT '' COMMENT '表描述', + `sub_table_name` varchar(200) NOT NULL DEFAULT '' COMMENT '关联表名称', + `sub_table_fk` varchar(200) NOT NULL DEFAULT '' COMMENT '关联表外键', + `sub_table_fr` varchar(200) NOT NULL DEFAULT '' COMMENT '关联表主键', + `author_name` varchar(100) NOT NULL DEFAULT '' COMMENT '作者的名称', + `entity_name` varchar(100) NOT NULL DEFAULT '' COMMENT '实体的名称', + `module_name` varchar(60) NOT NULL DEFAULT '' COMMENT '生成模块名', + `function_name` varchar(60) NOT NULL DEFAULT '' COMMENT '生成功能名', + `tree_primary` varchar(60) NOT NULL DEFAULT '' COMMENT '树主键字段', + `tree_parent` varchar(60) NOT NULL DEFAULT '' COMMENT '树父级字段', + `tree_name` varchar(60) NOT NULL DEFAULT '' COMMENT '树显示字段', + `gen_tpl` varchar(20) NOT NULL DEFAULT 'crud' COMMENT '生成模板方式: [crud=单表, tree=树表]', + `gen_type` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '生成代码方式: [0=zip压缩包, 1=自定义路径]', + `gen_path` varchar(200) NOT NULL DEFAULT '/' COMMENT '生成代码路径: [不填默认项目路径]', + `menu_status` tinyint(2) unsigned NOT NULL DEFAULT '0' COMMENT '菜单状态: [1=自动构建, 2=手动添加]', + `menu_pid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '菜单父级', + `menu_name` varchar(100) NOT NULL DEFAULT '' COMMENT '菜单名称', + `remarks` varchar(200) NOT NULL DEFAULT '' COMMENT '备注信息', + `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间', + `update_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='代码生成业务表'; + +-- ---------------------------- +-- Records of yj_gen_table +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_gen_table_column +-- ---------------------------- +DROP TABLE IF EXISTS `yj_gen_table_column`; +CREATE TABLE `yj_gen_table_column` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '列主键', + `table_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '表外键', + `column_name` varchar(200) NOT NULL DEFAULT '' COMMENT '列名称', + `column_comment` varchar(200) NOT NULL DEFAULT '' COMMENT '列描述', + `column_length` varchar(5) DEFAULT '0' COMMENT '列长度', + `column_type` varchar(100) NOT NULL DEFAULT '' COMMENT '列类型 ', + `java_type` varchar(100) NOT NULL DEFAULT '' COMMENT 'JAVA类型', + `java_field` varchar(100) NOT NULL DEFAULT '' COMMENT 'JAVA字段', + `is_pk` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否主键: [1=是, 0=否]', + `is_increment` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否自增: [1=是, 0=否]', + `is_required` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否必填: [1=是, 0=否]', + `is_insert` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否插入字段: [1=是, 0=否]', + `is_edit` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否编辑字段: [1=是, 0=否]', + `is_list` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否列表字段: [1=是, 0=否]', + `is_query` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否查询字段: [1=是, 0=否]', + `query_type` varchar(30) NOT NULL DEFAULT 'EQ' COMMENT '查询方式: [等于、不等于、大于、小于、范围]', + `html_type` varchar(30) NOT NULL DEFAULT '' COMMENT '显示类型: [文本框、文本域、下拉框、复选框、单选框、日期控件]', + `dict_type` varchar(200) NOT NULL DEFAULT '' COMMENT '字典类型', + `sort` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '排序编号', + `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间', + `update_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='代码生成字段表'; + +-- ---------------------------- +-- Records of yj_gen_table_column +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_hot_search +-- ---------------------------- +DROP TABLE IF EXISTS `yj_hot_search`; +CREATE TABLE `yj_hot_search` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(200) NOT NULL DEFAULT '' COMMENT '关键词', + `sort` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '排序号', + `create_time` int(10) DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='热门搜索表'; + +-- ---------------------------- +-- Records of yj_hot_search +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_jobs +-- ---------------------------- +DROP TABLE IF EXISTS `yj_jobs`; +CREATE TABLE `yj_jobs` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id', + `name` varchar(50) NOT NULL COMMENT '岗位名称', + `code` varchar(64) NOT NULL COMMENT '岗位编码', + `sort` int(11) DEFAULT '0' COMMENT '显示顺序', + `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态(0停用 1正常)', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + `create_time` int(10) NOT NULL COMMENT '创建时间', + `update_time` int(10) DEFAULT NULL COMMENT '修改时间', + `delete_time` int(10) DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='岗位表'; + +-- ---------------------------- +-- Records of yj_jobs +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_notice_record +-- ---------------------------- +DROP TABLE IF EXISTS `yj_notice_record`; +CREATE TABLE `yj_notice_record` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `user_id` int(10) unsigned NOT NULL COMMENT '用户id', + `title` varchar(50) NOT NULL DEFAULT '' COMMENT '标题', + `content` text NOT NULL COMMENT '内容', + `scene_id` int(10) unsigned DEFAULT '0' COMMENT '场景', + `read` tinyint(1) DEFAULT '0' COMMENT '已读状态;0-未读,1-已读', + `recipient` tinyint(1) DEFAULT '0' COMMENT '通知接收对象类型;1-会员;2-商家;3-平台;4-游客(未注册用户)', + `send_type` tinyint(1) DEFAULT '0' COMMENT '通知发送类型 1-系统通知 2-短信通知 3-微信模板 4-微信小程序', + `notice_type` tinyint(1) DEFAULT NULL COMMENT '通知类型 1-业务通知 2-验证码', + `extra` varchar(255) DEFAULT '' COMMENT '其他', + `create_time` int(10) DEFAULT NULL COMMENT '创建时间', + `update_time` int(10) DEFAULT NULL COMMENT '更新时间', + `delete_time` int(10) DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='通知记录表'; + +-- ---------------------------- +-- Records of yj_notice_record +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_notice_setting +-- ---------------------------- +DROP TABLE IF EXISTS `yj_notice_setting`; +CREATE TABLE `yj_notice_setting` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `scene_id` int(10) NOT NULL COMMENT '场景id', + `scene_name` varchar(255) NOT NULL DEFAULT '' COMMENT '场景名称', + `scene_desc` varchar(255) NOT NULL DEFAULT '' COMMENT '场景描述', + `recipient` tinyint(1) NOT NULL DEFAULT '1' COMMENT '接收者 1-用户 2-平台', + `type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '通知类型: 1-业务通知 2-验证码', + `system_notice` text COMMENT '系统通知设置', + `sms_notice` text COMMENT '短信通知设置', + `oa_notice` text COMMENT '公众号通知设置', + `mnp_notice` text COMMENT '小程序通知设置', + `support` char(10) NOT NULL DEFAULT '' COMMENT '支持的发送类型 1-系统通知 2-短信通知 3-微信模板消息 4-小程序提醒', + `update_time` int(10) DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT='通知设置表'; + +-- ---------------------------- +-- Records of yj_notice_setting +-- ---------------------------- +BEGIN; +INSERT INTO `yj_notice_setting` (`id`, `scene_id`, `scene_name`, `scene_desc`, `recipient`, `type`, `system_notice`, `sms_notice`, `oa_notice`, `mnp_notice`, `support`, `update_time`) VALUES (1, 101, '登录验证码', '用户手机号码登录时发送', 1, 2, '{\"type\":\"system\",\"title\":\"\",\"content\":\"\",\"status\":\"0\",\"is_show\":\"\",\"tips\":[\"可选变量 验证码:code\"]}', '{\"type\":\"sms\",\"template_id\":\"SMS_123456\",\"content\":\"您正在登录,验证码${code},切勿将验证码泄露于他人,本条验证码有效期5分钟。\",\"status\":\"1\",\"is_show\":\"1\"}', '{\"type\":\"oa\",\"template_id\":\"\",\"template_sn\":\"\",\"name\":\"\",\"first\":\"\",\"remark\":\"\",\"tpl\":[],\"status\":\"0\",\"is_show\":\"\",\"tips\":[\"可选变量 验证码:code\",\"配置路径:小程序后台 > 功能 > 订阅消息\"]}', '{\"type\":\"mnp\",\"template_id\":\"\",\"template_sn\":\"\",\"name\":\"\",\"tpl\":[],\"status\":\"0\",\"is_show\":\"\",\"tips\":[\"可选变量 验证码:code\",\"配置路径:小程序后台 > 功能 > 订阅消息\"]}', '2', NULL); +INSERT INTO `yj_notice_setting` (`id`, `scene_id`, `scene_name`, `scene_desc`, `recipient`, `type`, `system_notice`, `sms_notice`, `oa_notice`, `mnp_notice`, `support`, `update_time`) VALUES (2, 102, '绑定手机验证码', '用户绑定手机号码时发送', 1, 2, '{\"type\":\"system\",\"title\":\"\",\"content\":\"\",\"status\":\"0\",\"is_show\":\"\"}', '{\"type\":\"sms\",\"template_id\":\"SMS_123456\",\"content\":\"您正在绑定手机号,验证码${code},切勿将验证码泄露于他人,本条验证码有效期5分钟。\",\"status\":\"1\",\"is_show\":\"1\"}', '{\"type\":\"oa\",\"template_id\":\"\",\"template_sn\":\"\",\"name\":\"\",\"first\":\"\",\"remark\":\"\",\"tpl\":[],\"status\":\"0\",\"is_show\":\"\"}', '{\"type\":\"mnp\",\"template_id\":\"\",\"template_sn\":\"\",\"name\":\"\",\"tpl\":[],\"status\":\"0\",\"is_show\":\"\"}', '2', NULL); +INSERT INTO `yj_notice_setting` (`id`, `scene_id`, `scene_name`, `scene_desc`, `recipient`, `type`, `system_notice`, `sms_notice`, `oa_notice`, `mnp_notice`, `support`, `update_time`) VALUES (3, 103, '变更手机验证码', '用户变更手机号码时发送', 1, 2, '{\"type\":\"system\",\"title\":\"\",\"content\":\"\",\"status\":\"0\",\"is_show\":\"\",\"tips\":[\"可选变量 验证码:code\"]}', '{\"type\":\"sms\",\"template_id\":\"SMS_123456\",\"content\":\"您正在变更手机号,验证码${code},切勿将验证码泄露于他人,本条验证码有效期5分钟。\",\"status\":\"1\",\"is_show\":\"1\"}', '{\"type\":\"oa\",\"template_id\":\"\",\"template_sn\":\"\",\"name\":\"\",\"first\":\"\",\"remark\":\"\",\"tpl\":[],\"status\":\"0\",\"is_show\":\"\",\"tips\":[\"可选变量 验证码:code\",\"配置路径:小程序后台 > 功能 > 订阅消息\"]}', '{\"type\":\"mnp\",\"template_id\":\"\",\"template_sn\":\"\",\"name\":\"\",\"tpl\":[],\"status\":\"0\",\"is_show\":\"\",\"tips\":[\"可选变量 验证码:code\",\"配置路径:小程序后台 > 功能 > 订阅消息\"]}', '2', NULL); +INSERT INTO `yj_notice_setting` (`id`, `scene_id`, `scene_name`, `scene_desc`, `recipient`, `type`, `system_notice`, `sms_notice`, `oa_notice`, `mnp_notice`, `support`, `update_time`) VALUES (4, 104, '找回登录密码验证码', '用户找回登录密码号码时发送', 1, 2, '{\"type\":\"system\",\"title\":\"\",\"content\":\"\",\"status\":\"0\",\"is_show\":\"\",\"tips\":[\"可选变量 验证码:code\"]}', '{\"type\":\"sms\",\"template_id\":\"SMS_123456\",\"content\":\"您正在找回登录密码,验证码${code},切勿将验证码泄露于他人,本条验证码有效期5分钟。\",\"status\":\"1\",\"is_show\":\"1\"}', '{\"type\":\"oa\",\"template_id\":\"\",\"template_sn\":\"\",\"name\":\"\",\"first\":\"\",\"remark\":\"\",\"tpl\":[],\"status\":\"0\",\"is_show\":\"\",\"tips\":[\"可选变量 验证码:code\",\"配置路径:小程序后台 > 功能 > 订阅消息\"]}', '{\"type\":\"mnp\",\"template_id\":\"\",\"template_sn\":\"\",\"name\":\"\",\"tpl\":[],\"status\":\"0\",\"is_show\":\"\",\"tips\":[\"可选变量 验证码:code\",\"配置路径:小程序后台 > 功能 > 订阅消息\"]}', '2', NULL); +COMMIT; + +-- ---------------------------- +-- Table structure for yj_official_account_reply +-- ---------------------------- +DROP TABLE IF EXISTS `yj_official_account_reply`; +CREATE TABLE `yj_official_account_reply` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(64) NOT NULL DEFAULT '' COMMENT '规则名称', + `keyword` varchar(64) NOT NULL DEFAULT '' COMMENT '关键词', + `reply_type` tinyint(1) NOT NULL COMMENT '回复类型 1-关注回复 2-关键字回复 3-默认回复', + `matching_type` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '匹配方式:1-全匹配;2-模糊匹配', + `content_type` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '内容类型:1-文本', + `content` text NOT NULL COMMENT '回复内容', + `status` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '启动状态:1-启动;0-关闭', + `sort` int(11) unsigned NOT NULL DEFAULT '50' COMMENT '排序', + `create_time` int(10) DEFAULT NULL COMMENT '创建时间', + `update_time` int(10) DEFAULT NULL COMMENT '更新时间', + `delete_time` int(10) DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='公众号消息回调表'; + +-- ---------------------------- +-- Records of yj_official_account_reply +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_operation_log +-- ---------------------------- +DROP TABLE IF EXISTS `yj_operation_log`; +CREATE TABLE `yj_operation_log` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `admin_id` int(11) NOT NULL COMMENT '管理员ID', + `admin_name` varchar(16) NOT NULL DEFAULT '' COMMENT '管理员名称', + `account` varchar(16) NOT NULL DEFAULT '' COMMENT '管理员账号', + `action` varchar(64) DEFAULT '' COMMENT '操作名称', + `type` varchar(8) NOT NULL COMMENT '请求方式', + `url` varchar(600) NOT NULL COMMENT '访问链接', + `params` text COMMENT '请求数据', + `result` text COMMENT '请求结果', + `ip` varchar(39) NOT NULL DEFAULT '' COMMENT 'ip地址', + `create_time` int(10) DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COMMENT='系统日志表'; + +-- ---------------------------- +-- Records of yj_operation_log +-- ---------------------------- +BEGIN; +INSERT INTO `yj_operation_log` (`id`, `admin_id`, `admin_name`, `account`, `action`, `type`, `url`, `params`, `result`, `ip`, `create_time`) VALUES (1, 1, 'admin', '', '页面装修保存', 'POST', '/adminapi/decorate.page/save', '[{\"data\":\"[{\\\"title\\\":\\\"搜索\\\",\\\"name\\\":\\\"search\\\",\\\"disabled\\\":1,\\\"content\\\":{},\\\"styles\\\":{}},{\\\"title\\\":\\\"首页轮播图\\\",\\\"name\\\":\\\"banner\\\",\\\"content\\\":{\\\"enabled\\\":1,\\\"data\\\":[{\\\"image\\\":\\\"/api/static/banner001.png\\\",\\\"name\\\":\\\"\\\",\\\"link\\\":{\\\"id\\\":6,\\\"name\\\":\\\"来自瓷器的爱\\\",\\\"path\\\":\\\"/pages/news_detail/news_detail\\\",\\\"query\\\":{\\\"id\\\":6},\\\"type\\\":\\\"article\\\"},\\\"is_show\\\":\\\"1\\\",\\\"bg\\\":\\\"api/static/banner001_bg.png\\\"},{\\\"image\\\":\\\"/api/static/banner002.png\\\",\\\"name\\\":\\\"\\\",\\\"link\\\":{\\\"id\\\":3,\\\"name\\\":\\\"金山电池公布“沪广深市民绿色生活方式”调查结果\\\",\\\"path\\\":\\\"/pages/news_detail/news_detail\\\",\\\"query\\\":{\\\"id\\\":3},\\\"type\\\":\\\"article\\\"},\\\"is_show\\\":\\\"1\\\",\\\"bg\\\":\\\"/api/static/banner002_bg.png\\\"},{\\\"is_show\\\":\\\"1\\\",\\\"image\\\":\\\"/api/static/banner003.png\\\",\\\"name\\\":\\\"\\\",\\\"link\\\":{\\\"id\\\":1,\\\"name\\\":\\\"让生活更精致!五款居家好物推荐,实用性超高\\\",\\\"path\\\":\\\"/pages/news_detail/news_detail\\\",\\\"query\\\":{\\\"id\\\":1},\\\"type\\\":\\\"article\\\"},\\\"bg\\\":\\\"/api/static/banner003_bg.png\\\"}],\\\"style\\\":1,\\\"bg_style\\\":1},\\\"styles\\\":{}},{\\\"title\\\":\\\"导航菜单\\\",\\\"name\\\":\\\"nav\\\",\\\"content\\\":{\\\"enabled\\\":1,\\\"data\\\":[{\\\"image\\\":\\\"/api/static/nav01.png\\\",\\\"name\\\":\\\"资讯中心\\\",\\\"link\\\":{\\\"path\\\":\\\"/pages/news/news\\\",\\\"name\\\":\\\"文章资讯\\\",\\\"type\\\":\\\"shop\\\",\\\"canTab\\\":true},\\\"is_show\\\":\\\"1\\\"},{\\\"image\\\":\\\"/api/static/nav03.png\\\",\\\"name\\\":\\\"个人设置\\\",\\\"link\\\":{\\\"path\\\":\\\"/pages/user_set/user_set\\\",\\\"name\\\":\\\"个人设置\\\",\\\"type\\\":\\\"shop\\\"},\\\"is_show\\\":\\\"1\\\"},{\\\"image\\\":\\\"/api/static/nav02.png\\\",\\\"name\\\":\\\"我的收藏\\\",\\\"link\\\":{\\\"path\\\":\\\"/pages/collection/collection\\\",\\\"name\\\":\\\"我的收藏\\\",\\\"type\\\":\\\"shop\\\"},\\\"is_show\\\":\\\"1\\\"},{\\\"image\\\":\\\"/api/static/nav05.png\\\",\\\"name\\\":\\\"关于我们\\\",\\\"link\\\":{\\\"path\\\":\\\"/pages/as_us/as_us\\\",\\\"name\\\":\\\"关于我们\\\",\\\"type\\\":\\\"shop\\\"},\\\"is_show\\\":\\\"1\\\"},{\\\"image\\\":\\\"/api/static/nav04.png\\\",\\\"name\\\":\\\"联系客服\\\",\\\"link\\\":{\\\"path\\\":\\\"/pages/customer_service/customer_service\\\",\\\"name\\\":\\\"联系客服\\\",\\\"type\\\":\\\"shop\\\"},\\\"is_show\\\":\\\"1\\\"}],\\\"style\\\":2,\\\"per_line\\\":5,\\\"show_line\\\":2},\\\"styles\\\":{}},{\\\"title\\\":\\\"首页中部轮播图\\\",\\\"name\\\":\\\"middle-banner\\\",\\\"content\\\":{\\\"enabled\\\":1,\\\"data\\\":[{\\\"is_show\\\":\\\"1\\\",\\\"image\\\":\\\"/api/static/index_ad01.png\\\",\\\"name\\\":\\\"\\\",\\\"link\\\":{\\\"path\\\":\\\"/pages/agreement/agreement\\\",\\\"name\\\":\\\"隐私政策\\\",\\\"query\\\":{\\\"type\\\":\\\"privacy\\\"},\\\"type\\\":\\\"shop\\\"}}]},\\\"styles\\\":{}},{\\\"id\\\":\\\"l84almsk2uhyf\\\",\\\"title\\\":\\\"资讯\\\",\\\"name\\\":\\\"news\\\",\\\"disabled\\\":1,\\\"content\\\":{},\\\"styles\\\":{}}]\",\"id\":1,\"meta\":\"[{\\\"title\\\":\\\"页面设置\\\",\\\"name\\\":\\\"page-meta\\\",\\\"content\\\":{\\\"title\\\":\\\"首页\\\",\\\"bg_type\\\":\\\"1\\\",\\\"bg_color\\\":\\\"#2F80ED\\\",\\\"bg_image\\\":\\\"/api/static/page_meta_bg01.png\\\",\\\"text_color\\\":\\\"1\\\",\\\"title_type\\\":\\\"1\\\",\\\"title_img\\\":\\\"/api/static/page_mate_title.png\\\"},\\\"styles\\\":{}}]\",\"name\":\"首页装修\",\"type\":1}]', '', '127.0.0.1', 1731945113); +INSERT INTO `yj_operation_log` (`id`, `admin_id`, `admin_name`, `account`, `action`, `type`, `url`, `params`, `result`, `ip`, `create_time`) VALUES (2, 1, 'admin', '', '页面装修保存', 'POST', '/adminapi/decorate.page/save', '[{\"data\":\"[{\\\"title\\\":\\\"用户信息\\\",\\\"name\\\":\\\"user-info\\\",\\\"disabled\\\":1,\\\"content\\\":{},\\\"styles\\\":{}},{\\\"title\\\":\\\"我的服务\\\",\\\"name\\\":\\\"my-service\\\",\\\"content\\\":{\\\"style\\\":1,\\\"title\\\":\\\"我的服务\\\",\\\"data\\\":[{\\\"image\\\":\\\"/api/static/user_collect.png\\\",\\\"name\\\":\\\"我的收藏\\\",\\\"link\\\":{\\\"path\\\":\\\"/pages/collection/collection\\\",\\\"name\\\":\\\"我的收藏\\\",\\\"type\\\":\\\"shop\\\"},\\\"is_show\\\":\\\"1\\\"},{\\\"image\\\":\\\"/api/static/user_setting.png\\\",\\\"name\\\":\\\"个人设置\\\",\\\"link\\\":{\\\"path\\\":\\\"/pages/user_set/user_set\\\",\\\"name\\\":\\\"个人设置\\\",\\\"type\\\":\\\"shop\\\"},\\\"is_show\\\":\\\"1\\\"},{\\\"image\\\":\\\"/api/static/user_kefu.png\\\",\\\"name\\\":\\\"联系客服\\\",\\\"link\\\":{\\\"path\\\":\\\"/pages/customer_service/customer_service\\\",\\\"name\\\":\\\"联系客服\\\",\\\"type\\\":\\\"shop\\\"},\\\"is_show\\\":\\\"1\\\"},{\\\"image\\\":\\\"/api/static/wallet.png\\\",\\\"name\\\":\\\"我的钱包\\\",\\\"link\\\":{\\\"path\\\":\\\"/packages/pages/user_wallet/user_wallet\\\",\\\"name\\\":\\\"我的钱包\\\",\\\"type\\\":\\\"shop\\\"},\\\"is_show\\\":\\\"1\\\"}],\\\"enabled\\\":1},\\\"styles\\\":{}},{\\\"title\\\":\\\"个人中心广告图\\\",\\\"name\\\":\\\"user-banner\\\",\\\"content\\\":{\\\"enabled\\\":1,\\\"data\\\":[{\\\"image\\\":\\\"api/static/user_ad01.png\\\",\\\"name\\\":\\\"\\\",\\\"link\\\":{\\\"path\\\":\\\"/pages/customer_service/customer_service\\\",\\\"name\\\":\\\"联系客服\\\",\\\"type\\\":\\\"shop\\\"},\\\"is_show\\\":\\\"1\\\"},{\\\"image\\\":\\\"/api/static/user_ad02.png\\\",\\\"name\\\":\\\"\\\",\\\"link\\\":{\\\"path\\\":\\\"/pages/customer_service/customer_service\\\",\\\"name\\\":\\\"联系客服\\\",\\\"type\\\":\\\"shop\\\"},\\\"is_show\\\":\\\"1\\\"}]},\\\"styles\\\":{}}]\",\"id\":2,\"meta\":\"[{\\\"title\\\":\\\"页面设置\\\",\\\"name\\\":\\\"page-meta\\\",\\\"content\\\":{\\\"title\\\":\\\"个人中心\\\",\\\"bg_type\\\":\\\"1\\\",\\\"bg_color\\\":\\\"#2F80ED\\\",\\\"bg_image\\\":\\\"\\\",\\\"text_color\\\":\\\"1\\\",\\\"title_type\\\":\\\"1\\\",\\\"title_img\\\":\\\"/api/static/page_mate_title.png\\\"},\\\"styles\\\":{}}]\",\"name\":\"个人中心\",\"type\":2}]', '', '127.0.0.1', 1731945117); +INSERT INTO `yj_operation_log` (`id`, `admin_id`, `admin_name`, `account`, `action`, `type`, `url`, `params`, `result`, `ip`, `create_time`) VALUES (3, 1, 'admin', '', '清除系统缓存', 'POST', '/adminapi/setting.system.cache/clear', '', '', '127.0.0.1', 1731946243); +INSERT INTO `yj_operation_log` (`id`, `admin_id`, `admin_name`, `account`, `action`, `type`, `url`, `params`, `result`, `ip`, `create_time`) VALUES (4, 1, 'admin', '', '短信引擎编辑', 'POST', '/adminapi/notice.sms_config/setConfig', '[{\"name\":\"腾讯云短信\",\"type\":\"tencent\",\"sign\":\"广州好象科技\",\"app_key\":\"\",\"app_id\":\"1\",\"secret_key\":\"1\",\"secret_id\":\"1\",\"status\":1}]', '', '127.0.0.1', 1731983325); +INSERT INTO `yj_operation_log` (`id`, `admin_id`, `admin_name`, `account`, `action`, `type`, `url`, `params`, `result`, `ip`, `create_time`) VALUES (5, 1, 'admin', '', '短信引擎编辑', 'POST', '/adminapi/notice.sms_config/setConfig', '[{\"name\":\"腾讯云短信\",\"type\":\"tencent\",\"sign\":\"1\",\"app_key\":\"\",\"app_id\":\"1\",\"secret_key\":\"1\",\"secret_id\":\"1\",\"status\":1}]', '', '127.0.0.1', 1731983329); +INSERT INTO `yj_operation_log` (`id`, `admin_id`, `admin_name`, `account`, `action`, `type`, `url`, `params`, `result`, `ip`, `create_time`) VALUES (6, 1, 'admin', '', '角色列表', 'GET', '/adminapi/auth.role/lists', 'page_no=1&page_size=15', '', '127.0.0.1', 1731983424); +INSERT INTO `yj_operation_log` (`id`, `admin_id`, `admin_name`, `account`, `action`, `type`, `url`, `params`, `result`, `ip`, `create_time`) VALUES (7, 1, 'admin', '', '服务监控', 'GET', '/adminapi/setting.system.system/info', '', '', '127.0.0.1', 1731983489); +INSERT INTO `yj_operation_log` (`id`, `admin_id`, `admin_name`, `account`, `action`, `type`, `url`, `params`, `result`, `ip`, `create_time`) VALUES (8, 1, 'admin', '', '角色列表', 'GET', '/adminapi/auth.role/lists', 'page_no=1&page_size=15', '', '127.0.0.1', 1731986667); +COMMIT; + +-- ---------------------------- +-- Table structure for yj_recharge_order +-- ---------------------------- +DROP TABLE IF EXISTS `yj_recharge_order`; +CREATE TABLE `yj_recharge_order` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id', + `sn` varchar(64) NOT NULL COMMENT '订单编号', + `user_id` int(11) NOT NULL COMMENT '用户id', + `pay_sn` varchar(255) DEFAULT '' COMMENT '支付编号-冗余字段,针对微信同一主体不同客户端支付需用不同订单号预留。', + `pay_way` tinyint(2) NOT NULL DEFAULT '2' COMMENT '支付方式 2-微信支付 3-支付宝支付', + `pay_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '支付状态:0-待支付;1-已支付', + `pay_time` int(10) DEFAULT NULL COMMENT '支付时间', + `order_amount` decimal(10,2) NOT NULL COMMENT '充值金额', + `order_terminal` tinyint(1) DEFAULT '1' COMMENT '终端', + `transaction_id` varchar(128) DEFAULT NULL COMMENT '第三方平台交易流水号', + `refund_status` tinyint(1) DEFAULT '0' COMMENT '退款状态 0-未退款 1-已退款', + `refund_transaction_id` varchar(255) DEFAULT NULL COMMENT '退款交易流水号', + `create_time` int(10) DEFAULT NULL COMMENT '创建时间', + `update_time` int(10) DEFAULT NULL COMMENT '更新时间', + `delete_time` int(10) DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ---------------------------- +-- Records of yj_recharge_order +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_refund_log +-- ---------------------------- +DROP TABLE IF EXISTS `yj_refund_log`; +CREATE TABLE `yj_refund_log` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id', + `sn` varchar(32) DEFAULT NULL COMMENT '编号', + `record_id` int(11) NOT NULL COMMENT '退款记录id', + `user_id` int(11) NOT NULL DEFAULT '0' COMMENT '关联用户', + `handle_id` int(11) NOT NULL DEFAULT '0' COMMENT '处理人id(管理员id)', + `order_amount` decimal(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '订单总的应付款金额,冗余字段', + `refund_amount` decimal(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '本次退款金额', + `refund_status` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '退款状态,0退款中,1退款成功,2退款失败', + `refund_msg` text COMMENT '退款信息', + `create_time` int(10) unsigned DEFAULT '0' COMMENT '创建时间', + `update_time` int(10) DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ---------------------------- +-- Records of yj_refund_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_refund_record +-- ---------------------------- +DROP TABLE IF EXISTS `yj_refund_record`; +CREATE TABLE `yj_refund_record` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id', + `sn` varchar(32) NOT NULL DEFAULT '' COMMENT '退款编号', + `user_id` int(11) NOT NULL DEFAULT '0' COMMENT '关联用户', + `order_id` int(11) NOT NULL DEFAULT '0' COMMENT '来源订单id', + `order_sn` varchar(32) NOT NULL COMMENT '来源单号', + `order_type` varchar(255) DEFAULT 'order' COMMENT '订单来源 order-商品订单 recharge-充值订单', + `order_amount` decimal(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '订单总的应付款金额,冗余字段', + `refund_amount` decimal(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '本次退款金额', + `transaction_id` varchar(255) DEFAULT NULL COMMENT '第三方平台交易流水号', + `refund_way` tinyint(1) NOT NULL DEFAULT '1' COMMENT '退款方式 1-线上退款 2-线下退款', + `refund_type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '退款类型 1-后台退款', + `refund_status` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '退款状态,0退款中,1退款成功,2退款失败', + `create_time` int(10) unsigned DEFAULT '0' COMMENT '创建时间', + `update_time` int(10) DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ---------------------------- +-- Records of yj_refund_record +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_sms_log +-- ---------------------------- +DROP TABLE IF EXISTS `yj_sms_log`; +CREATE TABLE `yj_sms_log` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id', + `scene_id` int(11) NOT NULL COMMENT '场景id', + `mobile` varchar(11) NOT NULL COMMENT '手机号码', + `content` varchar(255) NOT NULL COMMENT '发送内容', + `code` varchar(32) DEFAULT NULL COMMENT '发送关键字(注册、找回密码)', + `is_verify` tinyint(1) DEFAULT '0' COMMENT '是否已验证;0-否;1-是', + `check_num` int(5) DEFAULT '0' COMMENT '验证次数', + `send_status` tinyint(1) NOT NULL COMMENT '发送状态:0-发送中;1-发送成功;2-发送失败', + `send_time` int(10) NOT NULL COMMENT '发送时间', + `results` text COMMENT '短信结果', + `create_time` int(10) DEFAULT NULL COMMENT '创建时间', + `update_time` int(10) DEFAULT NULL COMMENT '更新时间', + `delete_time` int(10) DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信记录表'; + +-- ---------------------------- +-- Records of yj_sms_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_system_log_operate +-- ---------------------------- +DROP TABLE IF EXISTS `yj_system_log_operate`; +CREATE TABLE `yj_system_log_operate` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `admin_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '操作人ID', + `type` varchar(30) NOT NULL DEFAULT '' COMMENT '请求类型: GET/POST/PUT', + `title` varchar(30) DEFAULT '' COMMENT '操作标题', + `ip` varchar(39) NOT NULL DEFAULT '' COMMENT '请求IP', + `url` varchar(200) NOT NULL DEFAULT '' COMMENT '请求接口', + `method` varchar(200) NOT NULL DEFAULT '' COMMENT '请求方法', + `args` text COMMENT '请求参数', + `error` text COMMENT '错误信息', + `status` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '执行状态: 1=成功, 2=失败', + `start_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '开始时间', + `end_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '结束时间', + `task_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '执行耗时', + `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='系统操作日志表'; + +-- ---------------------------- +-- Records of yj_system_log_operate +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_system_menu +-- ---------------------------- +DROP TABLE IF EXISTS `yj_system_menu`; +CREATE TABLE `yj_system_menu` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `pid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '上级菜单', + `type` char(2) NOT NULL DEFAULT '' COMMENT '权限类型: M=目录,C=菜单,A=按钮', + `name` varchar(100) NOT NULL DEFAULT '' COMMENT '菜单名称', + `icon` varchar(100) NOT NULL DEFAULT '' COMMENT '菜单图标', + `sort` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '菜单排序', + `perms` varchar(100) NOT NULL DEFAULT '' COMMENT '权限标识', + `paths` varchar(100) NOT NULL DEFAULT '' COMMENT '路由地址', + `component` varchar(200) NOT NULL DEFAULT '' COMMENT '前端组件', + `selected` varchar(200) NOT NULL DEFAULT '' COMMENT '选中路径', + `params` varchar(200) NOT NULL DEFAULT '' COMMENT '路由参数', + `is_cache` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否缓存: 0=否, 1=是', + `is_show` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '是否显示: 0=否, 1=是', + `is_disable` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否禁用: 0=否, 1=是', + `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间', + `update_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=193 DEFAULT CHARSET=utf8mb4 COMMENT='系统菜单表'; + +-- ---------------------------- +-- Records of yj_system_menu +-- ---------------------------- +BEGIN; +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (4, 0, 'M', '权限管理', 'el-icon-Lock', 300, '', 'permission', '', '', '', 0, 1, 0, 1656664556, 1710472802); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (5, 0, 'C', '工作台', 'el-icon-Monitor', 1000, 'workbench/index', 'workbench', 'workbench/index', '', '', 1, 1, 0, 1656664793, 1664354981); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (6, 4, 'C', '菜单', 'el-icon-Operation', 100, 'auth.menu/lists', 'menu', 'permission/menu/index', '', '', 1, 1, 0, 1656664960, 1710472994); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (7, 4, 'C', '管理员', 'local-icon-shouyiren', 80, 'auth.admin/lists', 'admin', 'permission/admin/index', '', '', 1, 1, 0, 1656901567, 1710473013); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (8, 4, 'C', '角色', 'el-icon-Female', 90, 'auth.role/lists', 'role', 'permission/role/index', '', '', 1, 1, 0, 1656901660, 1710473000); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (12, 8, 'A', '新增', '', 1, 'auth.role/add', '', '', '', '', 0, 1, 0, 1657001790, 1663750625); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (14, 8, 'A', '编辑', '', 1, 'auth.role/edit', '', '', '', '', 0, 1, 0, 1657001924, 1663750631); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (15, 8, 'A', '删除', '', 1, 'auth.role/delete', '', '', '', '', 0, 1, 0, 1657001982, 1663750637); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (16, 6, 'A', '新增', '', 1, 'auth.menu/add', '', '', '', '', 0, 1, 0, 1657072523, 1663750565); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (17, 6, 'A', '编辑', '', 1, 'auth.menu/edit', '', '', '', '', 0, 1, 0, 1657073955, 1663750570); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (18, 6, 'A', '删除', '', 1, 'auth.menu/delete', '', '', '', '', 0, 1, 0, 1657073987, 1663750578); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (19, 7, 'A', '新增', '', 1, 'auth.admin/add', '', '', '', '', 0, 1, 0, 1657074035, 1663750596); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (20, 7, 'A', '编辑', '', 1, 'auth.admin/edit', '', '', '', '', 0, 1, 0, 1657074071, 1663750603); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (21, 7, 'A', '删除', '', 1, 'auth.admin/delete', '', '', '', '', 0, 1, 0, 1657074108, 1663750609); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (23, 28, 'M', '开发工具', 'el-icon-EditPen', 40, '', 'dev_tools', '', '', '', 0, 1, 0, 1657097744, 1710473127); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (24, 23, 'C', '代码生成器', 'el-icon-DocumentAdd', 1, 'gen/list', 'code', 'dev_tools/code/index', '', '', 1, 1, 0, 1657098110, 1731743267); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (25, 0, 'M', '组织管理', 'el-icon-OfficeBuilding', 400, '', 'organization', '', '', '', 0, 1, 0, 1657099914, 1710472797); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (26, 25, 'C', '部门管理', 'el-icon-Coordinate', 100, 'dept.dept/lists', 'department', 'organization/department/index', '', '', 1, 1, 0, 1657099989, 1710472962); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (27, 25, 'C', '岗位管理', 'el-icon-PriceTag', 90, 'dept.jobs/lists', 'post', 'organization/post/index', '', '', 1, 1, 0, 1657100044, 1710472967); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (28, 0, 'M', '系统设置', 'el-icon-Setting', 200, '', 'setting', '', '', '', 0, 1, 0, 1657100164, 1710472807); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (29, 28, 'M', '网站设置', 'el-icon-Basketball', 100, '', 'website', '', '', '', 0, 1, 0, 1657100230, 1710473049); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (30, 29, 'C', '网站信息', '', 1, 'setting.web.web_setting/getWebsite', 'information', 'setting/website/information', '', '', 1, 1, 0, 1657100306, 1657164412); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (31, 29, 'C', '网站备案', '', 1, 'setting.web.web_setting/getCopyright', 'filing', 'setting/website/filing', '', '', 1, 1, 0, 1657100434, 1657164723); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (32, 29, 'C', '政策协议', '', 1, 'setting.web.web_setting/getAgreement', 'protocol', 'setting/website/protocol', '', '', 1, 1, 0, 1657100571, 1657164770); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (33, 28, 'C', '存储设置', 'el-icon-FolderOpened', 70, 'setting.storage/lists', 'storage', 'setting/storage/index', '', '', 1, 1, 0, 1657160959, 1710473095); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (34, 23, 'C', '字典管理', 'el-icon-Box', 1, 'setting.dict.dict_type/lists', 'dict', 'setting/dict/type/index', '', '', 1, 1, 0, 1657161211, 1663225935); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (35, 28, 'M', '系统维护', 'el-icon-SetUp', 50, '', 'system', '', '', '', 0, 1, 0, 1657161569, 1710473122); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (36, 35, 'C', '系统日志', '', 90, 'setting.system.log/lists', 'journal', 'setting/system/journal', '', '', 1, 1, 0, 1657161696, 1710473253); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (37, 35, 'C', '系统缓存', '', 80, '', 'cache', 'setting/system/cache', '', '', 1, 1, 0, 1657161896, 1710473258); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (38, 35, 'C', '系统环境', '', 70, 'setting.system.system/info', 'environment', 'setting/system/environment', '', '', 1, 1, 0, 1657162000, 1710473265); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (39, 24, 'A', '导入数据表', '', 1, 'gen/importTable', '', '', '', '', 0, 1, 0, 1657162736, 1731743432); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (40, 24, 'A', '代码生成', '', 1, 'gen/genCode', '', '', '', '', 0, 1, 0, 1657162806, 1731743447); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (42, 24, 'A', '同步表结构', '', 1, 'gen/syncTable', '', '', '', '', 0, 1, 0, 1657162934, 1731743461); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (43, 24, 'A', '删除数据表', '', 1, 'gen/delTable', '', '', '', '', 0, 1, 0, 1657163015, 1731743480); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (44, 24, 'A', '预览代码', '', 1, 'gen/previewCode', '', '', '', '', 0, 1, 0, 1657163263, 1731743496); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (45, 26, 'A', '新增', '', 1, 'dept.dept/add', '', '', '', '', 0, 1, 0, 1657163548, 1663750492); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (46, 26, 'A', '编辑', '', 1, 'dept.dept/edit', '', '', '', '', 0, 1, 0, 1657163599, 1663750498); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (47, 26, 'A', '删除', '', 1, 'dept.dept/delete', '', '', '', '', 0, 1, 0, 1657163687, 1663750504); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (48, 27, 'A', '新增', '', 1, 'dept.jobs/add', '', '', '', '', 0, 1, 0, 1657163778, 1663750524); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (49, 27, 'A', '编辑', '', 1, 'dept.jobs/edit', '', '', '', '', 0, 1, 0, 1657163800, 1663750530); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (50, 27, 'A', '删除', '', 1, 'dept.jobs/delete', '', '', '', '', 0, 1, 0, 1657163820, 1663750535); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (51, 30, 'A', '保存', '', 1, 'setting.web.web_setting/setWebsite', '', '', '', '', 0, 1, 0, 1657164469, 1663750649); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (52, 31, 'A', '保存', '', 1, 'setting.web.web_setting/setCopyright', '', '', '', '', 0, 1, 0, 1657164692, 1663750657); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (53, 32, 'A', '保存', '', 1, 'setting.web.web_setting/setAgreement', '', '', '', '', 0, 1, 0, 1657164824, 1663750665); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (54, 33, 'A', '设置', '', 1, 'setting.storage/setup', '', '', '', '', 0, 1, 0, 1657165303, 1663750673); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (55, 34, 'A', '新增', '', 1, 'setting.dict.dict_type/add', '', '', '', '', 0, 1, 0, 1657166966, 1663750783); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (56, 34, 'A', '编辑', '', 1, 'setting.dict.dict_type/edit', '', '', '', '', 0, 1, 0, 1657166997, 1663750789); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (57, 34, 'A', '删除', '', 1, 'setting.dict.dict_type/delete', '', '', '', '', 0, 1, 0, 1657167038, 1663750796); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (58, 62, 'A', '新增', '', 1, 'setting.dict.dict_data/add', '', '', '', '', 0, 1, 0, 1657167317, 1663750758); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (59, 62, 'A', '编辑', '', 1, 'setting.dict.dict_data/edit', '', '', '', '', 0, 1, 0, 1657167371, 1663750751); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (60, 62, 'A', '删除', '', 1, 'setting.dict.dict_data/delete', '', '', '', '', 0, 1, 0, 1657167397, 1663750768); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (61, 37, 'A', '清除系统缓存', '', 1, 'setting.system.cache/clear', '', '', '', '', 0, 1, 0, 1657173837, 1657173939); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (62, 23, 'C', '字典数据管理', '', 1, 'setting.dict.dict_data/lists', 'dict/data', 'setting/dict/data/index', '/dev_tools/dict', '', 1, 0, 0, 1657174351, 1663745617); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (63, 158, 'M', '素材管理', 'el-icon-Picture', 0, '', 'material', '', '', '', 0, 1, 0, 1657507133, 1710472243); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (64, 63, 'C', '素材中心', 'el-icon-PictureRounded', 0, '', 'index', 'material/index', '', '', 1, 1, 0, 1657507296, 1664355653); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (66, 26, 'A', '详情', '', 0, 'dept.dept/detail', '', '', '', '', 0, 1, 0, 1663725459, 1663750516); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (67, 27, 'A', '详情', '', 0, 'dept.jobs/detail', '', '', '', '', 0, 1, 0, 1663725514, 1663750559); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (68, 6, 'A', '详情', '', 0, 'auth.menu/detail', '', '', '', '', 0, 1, 0, 1663725564, 1663750584); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (69, 7, 'A', '详情', '', 0, 'auth.admin/detail', '', '', '', '', 0, 1, 0, 1663725623, 1663750615); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (70, 158, 'M', '文章资讯', 'el-icon-ChatLineSquare', 90, '', 'article', '', '', '', 0, 1, 0, 1663749965, 1710471867); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (71, 70, 'C', '文章管理', 'el-icon-ChatDotSquare', 0, 'article.article/lists', 'lists', 'article/lists/index', '', '', 1, 1, 0, 1663750101, 1664354615); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (72, 70, 'C', '文章添加/编辑', '', 0, 'article.article/add:edit', 'lists/edit', 'article/lists/edit', '/article/lists', '', 1, 0, 0, 1663750153, 1664356275); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (73, 70, 'C', '文章栏目', 'el-icon-CollectionTag', 0, 'article.articleCate/lists', 'column', 'article/column/index', '', '', 1, 1, 0, 1663750287, 1664354678); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (74, 71, 'A', '新增', '', 0, 'article.article/add', '', '', '', '', 0, 1, 0, 1663750335, 1663750335); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (75, 71, 'A', '详情', '', 0, 'article.article/detail', '', '', '', '', 0, 1, 0, 1663750354, 1663750383); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (76, 71, 'A', '删除', '', 0, 'article.article/delete', '', '', '', '', 0, 1, 0, 1663750413, 1663750413); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (77, 71, 'A', '修改状态', '', 0, 'article.article/updateStatus', '', '', '', '', 0, 1, 0, 1663750442, 1663750442); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (78, 73, 'A', '添加', '', 0, 'article.articleCate/add', '', '', '', '', 0, 1, 0, 1663750483, 1663750483); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (79, 73, 'A', '删除', '', 0, 'article.articleCate/delete', '', '', '', '', 0, 1, 0, 1663750895, 1663750895); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (80, 73, 'A', '详情', '', 0, 'article.articleCate/detail', '', '', '', '', 0, 1, 0, 1663750913, 1663750913); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (81, 73, 'A', '修改状态', '', 0, 'article.articleCate/updateStatus', '', '', '', '', 0, 1, 0, 1663750936, 1663750936); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (82, 0, 'M', '渠道设置', 'el-icon-Message', 500, '', 'channel', '', '', '', 0, 1, 0, 1663754084, 1710472649); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (83, 82, 'C', 'h5设置', 'el-icon-Cellphone', 100, 'channel.web_page_setting/getConfig', 'h5', 'channel/h5', '', '', 1, 1, 0, 1663754158, 1710472929); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (84, 83, 'A', '保存', '', 0, 'channel.web_page_setting/setConfig', '', '', '', '', 0, 1, 0, 1663754259, 1663754259); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (85, 82, 'M', '微信公众号', 'local-icon-dingdan', 80, '', 'wx_oa', '', '', '', 0, 1, 0, 1663755470, 1710472946); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (86, 85, 'C', '公众号配置', '', 0, 'channel.official_account_setting/getConfig', 'config', 'channel/wx_oa/config', '', '', 1, 1, 0, 1663755663, 1664355450); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (87, 85, 'C', '菜单管理', '', 0, 'channel.official_account_menu/detail', 'menu', 'channel/wx_oa/menu', '', '', 1, 1, 0, 1663755767, 1664355456); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (88, 86, 'A', '保存', '', 0, 'channel.official_account_setting/setConfig', '', '', '', '', 0, 1, 0, 1663755799, 1663755799); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (89, 86, 'A', '保存并发布', '', 0, 'channel.official_account_menu/save', '', '', '', '', 0, 1, 0, 1663756490, 1663756490); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (90, 85, 'C', '关注回复', '', 0, 'channel.official_account_reply/lists', 'follow', 'channel/wx_oa/reply/follow_reply', '', '', 1, 1, 0, 1663818358, 1663818366); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (91, 85, 'C', '关键字回复', '', 0, '', 'keyword', 'channel/wx_oa/reply/keyword_reply', '', '', 1, 1, 0, 1663818445, 1663818445); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (93, 85, 'C', '默认回复', '', 0, '', 'default', 'channel/wx_oa/reply/default_reply', '', '', 1, 1, 0, 1663818580, 1663818580); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (94, 82, 'C', '微信小程序', 'local-icon-weixin', 90, 'channel.mnp_settings/getConfig', 'weapp', 'channel/weapp', '', '', 1, 1, 0, 1663831396, 1710472941); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (95, 94, 'A', '保存', '', 0, 'channel.mnp_settings/setConfig', '', '', '', '', 0, 1, 0, 1663831436, 1663831436); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (96, 0, 'M', '装修管理', 'el-icon-Brush', 600, '', 'decoration', '', '', '', 0, 1, 0, 1663834825, 1710472099); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (97, 175, 'C', '页面装修', 'el-icon-CopyDocument', 100, 'decorate.page/detail', 'pages', 'decoration/pages/index', '', '', 1, 1, 0, 1663834879, 1710929256); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (98, 97, 'A', '保存', '', 0, 'decorate.page/save', '', '', '', '', 0, 1, 0, 1663834956, 1663834956); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (99, 175, 'C', '底部导航', 'el-icon-Position', 90, 'decorate.tabbar/detail', 'tabbar', 'decoration/tabbar', '', '', 1, 1, 0, 1663835004, 1710929262); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (100, 99, 'A', '保存', '', 0, 'decorate.tabbar/save', '', '', '', '', 0, 1, 0, 1663835018, 1663835018); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (101, 158, 'M', '消息管理', 'el-icon-ChatDotRound', 80, '', 'message', '', '', '', 0, 1, 0, 1663838602, 1710471874); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (102, 101, 'C', '通知设置', '', 0, 'notice.notice/settingLists', 'notice', 'message/notice/index', '', '', 1, 1, 0, 1663839195, 1663839195); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (103, 102, 'A', '详情', '', 0, 'notice.notice/detail', '', '', '', '', 0, 1, 0, 1663839537, 1663839537); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (104, 101, 'C', '通知设置编辑', '', 0, 'notice.notice/set', 'notice/edit', 'message/notice/edit', '/message/notice', '', 1, 0, 0, 1663839873, 1663898477); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (105, 71, 'A', '编辑', '', 0, 'article.article/edit', '', '', '', '', 0, 1, 0, 1663840043, 1663840053); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (107, 101, 'C', '短信设置', '', 0, 'notice.sms_config/getConfig', 'short_letter', 'message/short_letter/index', '', '', 1, 1, 0, 1663898591, 1664355708); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (108, 107, 'A', '设置', '', 0, 'notice.sms_config/setConfig', '', '', '', '', 0, 1, 0, 1663898644, 1663898644); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (109, 107, 'A', '详情', '', 0, 'notice.sms_config/detail', '', '', '', '', 0, 1, 0, 1663898661, 1663898661); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (110, 28, 'C', '热门搜索', 'el-icon-Search', 60, 'setting.hot_search/getConfig', 'search', 'setting/search/index', '', '', 1, 1, 0, 1663901821, 1710473109); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (111, 110, 'A', '保存', '', 0, 'setting.hot_search/setConfig', '', '', '', '', 0, 1, 0, 1663901856, 1663901856); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (112, 28, 'M', '用户设置', 'local-icon-keziyuyue', 90, '', 'user', '', '', '', 0, 1, 0, 1663903302, 1710473056); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (113, 112, 'C', '用户设置', '', 0, 'setting.user.user/getConfig', 'setup', 'setting/user/setup', '', '', 1, 1, 0, 1663903506, 1663903506); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (114, 113, 'A', '保存', '', 0, 'setting.user.user/setConfig', '', '', '', '', 0, 1, 0, 1663903522, 1663903522); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (115, 112, 'C', '登录注册', '', 0, 'setting.user.user/getRegisterConfig', 'login_register', 'setting/user/login_register', '', '', 1, 1, 0, 1663903832, 1663903832); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (116, 115, 'A', '保存', '', 0, 'setting.user.user/setRegisterConfig', '', '', '', '', 0, 1, 0, 1663903852, 1663903852); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (117, 0, 'M', '用户管理', 'el-icon-User', 900, '', 'consumer', '', '', '', 0, 1, 0, 1663904351, 1710472074); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (118, 117, 'C', '用户列表', 'local-icon-user_guanli', 100, 'user.user/lists', 'lists', 'consumer/lists/index', '', '', 1, 1, 0, 1663904392, 1710471845); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (119, 117, 'C', '用户详情', '', 90, 'user.user/detail', 'lists/detail', 'consumer/lists/detail', '/consumer/lists', '', 1, 0, 0, 1663904470, 1710471851); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (120, 119, 'A', '编辑', '', 0, 'user.user/edit', '', '', '', '', 0, 1, 0, 1663904499, 1663904499); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (140, 82, 'C', '微信开发平台', 'local-icon-notice_buyer', 70, 'channel.open_setting/getConfig', 'open_setting', 'channel/open_setting', '', '', 1, 1, 0, 1666085713, 1710472951); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (141, 140, 'A', '保存', '', 0, 'channel.open_setting/setConfig', '', '', '', '', 0, 1, 0, 1666085751, 1666085776); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (142, 176, 'C', 'PC端装修', 'el-icon-Monitor', 8, 'decorate.data/pc', 'pc', 'decoration/pc', '', '', 0, 1, 0, 1668423284, 1731742947); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (143, 35, 'C', '定时任务', '', 100, 'crontab.crontab/lists', 'scheduled_task', 'setting/system/scheduled_task/index', '', '', 1, 1, 0, 1669357509, 1710473246); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (144, 35, 'C', '定时任务添加/编辑', '', 0, 'crontab.crontab/add:edit', 'scheduled_task/edit', 'setting/system/scheduled_task/edit', '/setting/system/scheduled_task', '', 1, 0, 0, 1669357670, 1669357765); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (145, 143, 'A', '添加', '', 0, 'crontab.crontab/add', '', '', '', '', 0, 1, 0, 1669358282, 1669358282); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (146, 143, 'A', '编辑', '', 0, 'crontab.crontab/edit', '', '', '', '', 0, 1, 0, 1669358303, 1669358303); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (147, 143, 'A', '删除', '', 0, 'crontab.crontab/delete', '', '', '', '', 0, 1, 0, 1669358334, 1669358334); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (148, 0, 'M', '模板示例', 'el-icon-SetUp', 100, '', 'template', '', '', '', 0, 1, 0, 1670206819, 1710472811); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (149, 148, 'M', '组件示例', 'el-icon-Coin', 0, '', 'component', '', '', '', 0, 1, 0, 1670207182, 1670207244); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (150, 149, 'C', '富文本', '', 90, '', 'rich_text', 'template/component/rich_text', '', '', 1, 1, 0, 1670207751, 1710473315); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (151, 149, 'C', '上传文件', '', 80, '', 'upload', 'template/component/upload', '', '', 1, 1, 0, 1670208925, 1710473322); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (152, 149, 'C', '图标', '', 100, '', 'icon', 'template/component/icon', '', '', 1, 1, 0, 1670230069, 1710473306); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (153, 149, 'C', '文件选择器', '', 60, '', 'file', 'template/component/file', '', '', 1, 1, 0, 1670232129, 1710473341); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (154, 149, 'C', '链接选择器', '', 50, '', 'link', 'template/component/link', '', '', 1, 1, 0, 1670292636, 1710473346); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (155, 149, 'C', '超出自动打点', '', 40, '', 'overflow', 'template/component/overflow', '', '', 1, 1, 0, 1670292883, 1710473351); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (156, 149, 'C', '悬浮input', '', 70, '', 'popover_input', 'template/component/popover_input', '', '', 1, 1, 0, 1670293336, 1710473329); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (157, 119, 'A', '余额调整', '', 0, 'user.user/adjustMoney', '', '', '', '', 0, 1, 0, 1677143088, 1677143088); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (158, 0, 'M', '应用管理', 'el-icon-Postcard', 800, '', 'app', '', '', '', 0, 1, 0, 1677143430, 1710472079); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (159, 158, 'C', '用户充值', 'local-icon-fukuan', 100, 'recharge.recharge/getConfig', 'recharge', 'app/recharge/index', '', '', 1, 1, 0, 1677144284, 1710471860); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (160, 159, 'A', '保存', '', 0, 'recharge.recharge/setConfig', '', '', '', '', 0, 1, 0, 1677145012, 1677145012); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (161, 28, 'M', '支付设置', 'local-icon-set_pay', 80, '', 'pay', '', '', '', 0, 1, 0, 1677148075, 1710473061); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (162, 161, 'C', '支付方式', '', 0, 'setting.pay.pay_way/getPayWay', 'method', 'setting/pay/method/index', '', '', 1, 1, 0, 1677148207, 1677148207); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (163, 161, 'C', '支付配置', '', 0, 'setting.pay.pay_config/lists', 'config', 'setting/pay/config/index', '', '', 1, 1, 0, 1677148260, 1677148374); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (164, 162, 'A', '设置支付方式', '', 0, 'setting.pay.pay_way/setPayWay', '', '', '', '', 0, 1, 0, 1677219624, 1677219624); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (165, 163, 'A', '配置', '', 0, 'setting.pay.pay_config/setConfig', '', '', '', '', 0, 1, 0, 1677219655, 1677219655); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (166, 0, 'M', '财务管理', 'local-icon-user_gaikuang', 700, '', 'finance', '', '', '', 0, 1, 0, 1677552269, 1710472085); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (167, 166, 'C', '充值记录', 'el-icon-Wallet', 90, 'recharge.recharge/lists', 'recharge_record', 'finance/recharge_record', '', '', 1, 1, 0, 1677552757, 1710472902); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (168, 166, 'C', '余额明细', 'local-icon-qianbao', 100, 'finance.account_log/lists', 'balance_details', 'finance/balance_details', '', '', 1, 1, 0, 1677552976, 1710472894); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (169, 167, 'A', '退款', '', 0, 'recharge.recharge/refund', '', '', '', '', 0, 1, 0, 1677809715, 1677809715); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (170, 166, 'C', '退款记录', 'local-icon-heshoujilu', 0, 'finance.refund/record', 'refund_record', 'finance/refund_record', '', '', 1, 1, 0, 1677811271, 1677811271); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (171, 170, 'A', '重新退款', '', 0, 'recharge.recharge/refundAgain', '', '', '', '', 0, 1, 0, 1677811295, 1677811295); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (172, 170, 'A', '退款日志', '', 0, 'finance.refund/log', '', '', '', '', 0, 1, 0, 1677811361, 1677811361); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (173, 175, 'C', '系统风格', 'el-icon-Brush', 80, '', 'style', 'decoration/style/style', '', '', 1, 1, 0, 1681635044, 1710929278); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (174, 96, 'C', '素材中心', 'local-icon-shangchuanzhaopian', 0, 'file/listCate', 'material', 'material/index', '', '', 1, 1, 0, 1710734367, 1710734392); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (175, 96, 'M', '移动端', '', 100, '', 'mobile', '', '', '', 0, 1, 0, 1710901543, 1710929294); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (176, 96, 'M', 'PC端', '', 90, '', 'pc', '', '', '', 0, 1, 0, 1710901592, 1710929299); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (177, 29, 'C', '站点统计', '', 0, 'setting.web.web_setting/getSiteStatistics', 'setting/website/statistics', 'setting/website/statistics', '', '', 0, 1, 0, 1710901592, 1731914843); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (178, 177, 'A', '保存', '', 0, 'setting.web.web_setting/setSiteStatistics', '', '', '', '', 1, 1, 0, 1710901592, 1731915036); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (179, 174, 'A', '素材列表', '', 0, 'file/lists', '/file/lists', 'consumer/lists/index', '', '', 0, 0, 0, 1710901592, 1710929299); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (180, 24, 'A', '下载代码', '', 0, 'gen/downloadCode', '', '', '', '', 1, 1, 0, 1731743525, 1731743525); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (181, 24, 'A', '数据表详情', '', 0, 'gen/detail', '', '', '', '', 1, 1, 0, 1731743570, 1731743570); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (182, 24, 'A', '导入数据表列表', '', 0, 'gen/db', '', '', '', '', 1, 1, 0, 1731743594, 1731743594); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (183, 23, 'C', '编辑数据表', '', 0, 'gen/editTable', 'code/edit', 'dev_tools/code/edit', '/dev_tools/code', 'gen/editTable', 1, 0, 0, 1731743917, 1731745089); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (184, 174, 'A', '图片上传', '', 0, 'upload/image', '', '', '', '', 1, 1, 0, 1731902268, 1731902268); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (185, 174, 'A', '文件上传', '', 0, 'upload/file', '', '', '', '', 1, 1, 0, 1731902282, 1731902282); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (186, 174, 'A', '视频上传', '', 0, 'upload/video', '', '', '', '', 1, 1, 0, 1731902296, 1731902296); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (187, 174, 'A', '文件重命名', '', 0, 'file/rename', '', '', '', '', 1, 1, 0, 1731902317, 1731902317); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (188, 174, 'A', '文件移动', '', 0, 'file/move', '', '', '', '', 1, 1, 0, 1731902331, 1731902331); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (189, 174, 'A', 'file/delete', '', 0, '文件删除', '', '', '', '', 1, 1, 0, 1731902344, 1731902344); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (190, 174, 'A', '新增分类', '', 0, 'file/addCate', '', '', '', '', 1, 1, 0, 1731902365, 1731902365); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (191, 174, 'A', '分类重命名', '', 0, 'file/editCate', '', '', '', '', 1, 1, 0, 1731902383, 1731902383); +INSERT INTO `yj_system_menu` (`id`, `pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`) VALUES (192, 174, 'A', '删除分类', '', 0, 'file/delCate', '', '', '', '', 1, 1, 0, 1731902397, 1731902397); +COMMIT; + +-- ---------------------------- +-- Table structure for yj_system_role +-- ---------------------------- +DROP TABLE IF EXISTS `yj_system_role`; +CREATE TABLE `yj_system_role` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(16) NOT NULL DEFAULT '' COMMENT '名称', + `desc` varchar(128) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '描述', + `sort` int(11) DEFAULT '0' COMMENT '排序', + `create_time` int(10) DEFAULT NULL COMMENT '创建时间', + `update_time` int(10) DEFAULT NULL COMMENT '更新时间', + `delete_time` int(10) DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表'; + +-- ---------------------------- +-- Records of yj_system_role +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_system_role_menu +-- ---------------------------- +DROP TABLE IF EXISTS `yj_system_role_menu`; +CREATE TABLE `yj_system_role_menu` ( + `role_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '角色ID', + `menu_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '菜单ID', + PRIMARY KEY (`role_id`,`menu_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色菜单关系表'; + +-- ---------------------------- +-- Records of yj_system_role_menu +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_user +-- ---------------------------- +DROP TABLE IF EXISTS `yj_user`; +CREATE TABLE `yj_user` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `sn` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '编号', + `avatar` varchar(200) NOT NULL DEFAULT '' COMMENT '头像', + `real_name` varchar(32) NOT NULL DEFAULT '' COMMENT '真实姓名', + `nickname` varchar(32) NOT NULL DEFAULT '' COMMENT '用户昵称', + `account` varchar(32) NOT NULL DEFAULT '' COMMENT '用户账号', + `password` varchar(32) NOT NULL DEFAULT '' COMMENT '用户密码', + `mobile` varchar(32) NOT NULL DEFAULT '' COMMENT '用户电话', + `sex` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '用户性别: [1=男, 2=女]', + `channel` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '注册渠道: [1-微信小程序 2-微信公众号 3-手机H5 4-电脑PC 5-苹果APP 6-安卓APP]', + `is_disable` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否禁用: [0=否, 1=是]', + `login_ip` varchar(200) NOT NULL DEFAULT '' COMMENT '最后登录IP', + `login_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最后登录时间', + `is_new_user` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否是新注册用户: [1-是, 0-否]', + `user_money` decimal(10,2) unsigned DEFAULT '0.00' COMMENT '用户余额', + `total_recharge_amount` decimal(10,2) unsigned DEFAULT '0.00' COMMENT '累计充值', + `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间', + `update_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间', + `delete_time` int(10) unsigned DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `sn` (`sn`) USING BTREE COMMENT '编号唯一', + UNIQUE KEY `account` (`account`) USING BTREE COMMENT '账号唯一' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; + +-- ---------------------------- +-- Records of yj_user +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_user_account_log +-- ---------------------------- +DROP TABLE IF EXISTS `yj_user_account_log`; +CREATE TABLE `yj_user_account_log` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `sn` varchar(32) NOT NULL DEFAULT '' COMMENT '流水号', + `user_id` int(11) NOT NULL COMMENT '用户id', + `change_object` tinyint(1) NOT NULL DEFAULT '0' COMMENT '变动对象', + `change_type` smallint(5) NOT NULL COMMENT '变动类型', + `action` tinyint(1) NOT NULL DEFAULT '0' COMMENT '动作 1-增加 2-减少', + `change_amount` decimal(10,2) NOT NULL COMMENT '变动数量', + `left_amount` decimal(10,2) NOT NULL DEFAULT '100.00' COMMENT '变动后数量', + `source_sn` varchar(255) DEFAULT NULL COMMENT '关联单号', + `remark` varchar(255) DEFAULT '' COMMENT '备注', + `extra` text COMMENT '预留扩展字段', + `create_time` int(10) DEFAULT NULL COMMENT '创建时间', + `update_time` int(10) DEFAULT NULL COMMENT '更新时间', + `delete_time` int(10) DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ---------------------------- +-- Records of yj_user_account_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_user_auth +-- ---------------------------- +DROP TABLE IF EXISTS `yj_user_auth`; +CREATE TABLE `yj_user_auth` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL COMMENT '用户id', + `openid` varchar(128) NOT NULL COMMENT '微信openid', + `unionid` varchar(128) DEFAULT '' COMMENT '微信unionid', + `terminal` tinyint(1) NOT NULL DEFAULT '1' COMMENT '客户端类型:1-微信小程序;2-微信公众号;3-手机H5;4-电脑PC;5-苹果APP;6-安卓APP', + `create_time` int(10) DEFAULT NULL COMMENT '创建时间', + `update_time` int(10) DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `openid` (`openid`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户授权表'; + +-- ---------------------------- +-- Records of yj_user_auth +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for yj_user_session +-- ---------------------------- +DROP TABLE IF EXISTS `yj_user_session`; +CREATE TABLE `yj_user_session` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL COMMENT '用户id', + `terminal` tinyint(1) NOT NULL DEFAULT '1' COMMENT '客户端类型:1-微信小程序;2-微信公众号;3-手机H5;4-电脑PC;5-苹果APP;6-安卓APP', + `token` varchar(191) NOT NULL COMMENT '令牌', + `update_time` int(10) DEFAULT NULL COMMENT '更新时间', + `expire_time` int(10) NOT NULL COMMENT '到期时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `admin_id_client` (`user_id`,`terminal`) USING BTREE COMMENT '一个用户在一个终端只有一个token', + UNIQUE KEY `token` (`token`) USING BTREE COMMENT 'token是唯一的' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户会话表'; + +-- ---------------------------- +-- Records of yj_user_session +-- ---------------------------- +BEGIN; +COMMIT; + +SET FOREIGN_KEY_CHECKS = 1; + +alter table yj_admin add first_login int default 1 null comment '是否首次登录'; + diff --git a/yj-admin/pom.xml b/yj-admin/pom.xml new file mode 100644 index 0000000..44653df --- /dev/null +++ b/yj-admin/pom.xml @@ -0,0 +1,76 @@ + + + + + + yunjiao-server + org.yj + 1.0.0 + + + + 4.0.0 + yj-admin + jar + + + + + + org.yj + yj-common + + + + + org.yj + yj-generator + 1.0.0 + + + + + com.github.penggle + kaptcha + + + + + cn.dev33 + sa-token-spring-boot-starter + + + + + cn.dev33 + sa-token-dao-redis-jackson + + + + + org.quartz-scheduler + quartz + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.6.4 + + + + repackage + + + + + + + + \ No newline at end of file diff --git a/yj-admin/src/main/java/com/yj/admin/LikeAdminApplication.java b/yj-admin/src/main/java/com/yj/admin/LikeAdminApplication.java new file mode 100644 index 0000000..b115cf8 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/LikeAdminApplication.java @@ -0,0 +1,25 @@ +package com.yj.admin; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * 启动器 + */ +@Configuration +@ComponentScan(basePackages = {"com.yj"}) +@MapperScan(basePackages = {"com.yj.*.mapper"}) +@EnableTransactionManagement +@SpringBootApplication(exclude = {RedisRepositoriesAutoConfiguration.class}) +public class LikeAdminApplication { + + public static void main(String[] args) { + SpringApplication.run(LikeAdminApplication.class, args); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/LikeAdminInterceptor.java b/yj-admin/src/main/java/com/yj/admin/LikeAdminInterceptor.java new file mode 100644 index 0000000..9cf73a7 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/LikeAdminInterceptor.java @@ -0,0 +1,218 @@ +package com.yj.admin; + +import cn.dev33.satoken.stp.StpUtil; +import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.admin.service.admin.IAdminRoleService; +import com.yj.common.aop.NotPower; +import com.yj.common.aop.NotLogin; +import com.yj.common.core.AjaxResult; +import com.yj.common.entity.admin.Admin; +import com.yj.common.enums.ErrorEnum; +import com.yj.common.exception.LoginException; +import com.yj.common.mapper.admin.AdminMapper; +import com.yj.common.util.StringUtils; +import com.yj.common.util.YmlUtils; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.List; + +/** + * 拦截器 + */ +@Component +public class LikeAdminInterceptor implements HandlerInterceptor { + + @Resource + AdminMapper systemAuthAdminMapper; + + @Resource + IAdminRoleService iAdminRoleService; + + /** + * 前置处理器 + * + * @param request 请求 + * @param response 响应 + * @param handler 处理 + * @return boolean + * @throws Exception 异常 + */ + @Override + public boolean preHandle(@NotNull HttpServletRequest request, + @NotNull HttpServletResponse response, + @NotNull Object handler) throws Exception { + + // 请求方法类型 + String reqUri = request.getRequestURI(); + if (!(handler instanceof HandlerMethod) || ( !reqUri.startsWith("/api") && !reqUri.startsWith("/adminapi"))) { + return HandlerInterceptor.super.preHandle(request, response, handler); + } + + // 登录权限校验 + try { + response.setContentType("application/json;charset=utf-8"); + Method method = this.obtainAop(handler); + this.checkLogin(method, reqUri); + } catch (LoginException e) { + AjaxResult result = AjaxResult.failed(e.getCode(), e.getMsg()); + response.getWriter().print(JSON.toJSONString(result)); + return false; + } + + // 演示环境拦截 + String env = YmlUtils.get("like.production"); + if (StringUtils.isNotNull(env) && env.equals("true")) { + String prefix = "/adminapi/"; + String route = request.getRequestURI().replaceFirst(prefix, ""); +// String auths = route.replace("/", ":"); + String auths = route; + List ignoreUrl = Arrays.asList("login/account", "login/logout"); + if (request.getMethod().equals("POST") && !ignoreUrl.contains(auths)) { + String message = "演示环境不支持修改数据,请下载源码本地部署体验"; + AjaxResult result = AjaxResult.failed(ErrorEnum.NO_PERMISSION.getCode(), message); + response.getWriter().print(JSON.toJSONString(result)); + return false; + } + } + + // 验证通过继续 + return HandlerInterceptor.super.preHandle(request, response, handler); + } + + /** + * 后置处理器 + * + * @param request 请求 + * @param response 响应 + * @param handler 处理 + * @param ex 异常 + * @throws Exception 异常 + */ + @Override + public void afterCompletion(@NotNull HttpServletRequest request, + @NotNull HttpServletResponse response, + @NotNull Object handler, Exception ex) throws Exception { + LikeAdminThreadLocal.remove(); + HandlerInterceptor.super.afterCompletion(request, response, handler, ex); + } + + /** + * 提取注解 + * + * @param handler 处理器 + * @return Method + * @throws Exception 异常 + */ + private Method obtainAop(@NotNull Object handler) throws Exception { + String[] objArr = handler.toString().split("#"); + String methodStr = objArr[1].split("\\(")[0]; + String classStr = objArr[0]; + Class clazz = Class.forName(classStr); + + Method[] methods = clazz.getDeclaredMethods(); + for (Method method : methods) { + if (method.getName().equals(methodStr)) { + return method; + } + } + + return null; + } + + /** + * 登录验证 + * + * @param method 方法类 + * @author fzr + */ + private void checkLogin(Method method, String reqUri) { + for (int i=0; i<=0; i++) { + // 免登校验 + if (StringUtils.isNotNull(method) && method.isAnnotationPresent(NotLogin.class)) { + break; + } + + // 令牌校验 + String token = StpUtil.getTokenValue(); + if (StringUtils.isNull(token) || StringUtils.isBlank(token)) { + Integer errCode = ErrorEnum.TOKEN_EMPTY.getCode(); + String errMsg = ErrorEnum.TOKEN_EMPTY.getMsg(); + throw new LoginException(errCode, errMsg); + } + + // 登录校验 + Object id = StpUtil.getLoginId(); + if (StringUtils.isNull(id)) { + Integer errCode = ErrorEnum.TOKEN_INVALID.getCode(); + String errMsg = ErrorEnum.TOKEN_INVALID.getMsg(); + throw new LoginException(errCode, errMsg); + } + + // 用户校验 + Admin adminUser = systemAuthAdminMapper.selectOne( + new QueryWrapper() + .select("id,name,disable") + .eq("id", Integer.parseInt(id.toString())) + .isNull("delete_time") + .last("limit 1")); + + // 删除校验 + if (StringUtils.isNull(adminUser)) { + Integer errCode = ErrorEnum.TOKEN_INVALID.getCode(); + String errMsg = ErrorEnum.TOKEN_INVALID.getMsg(); + throw new LoginException(errCode, errMsg); + } + + // 禁用校验 + if (adminUser.getDisable().equals(1)) { + Integer errCode = ErrorEnum.LOGIN_DISABLE_ERROR.getCode(); + String errMsg = ErrorEnum.LOGIN_DISABLE_ERROR.getMsg(); + throw new LoginException(errCode, errMsg); + } + + // 写入线程 + LikeAdminThreadLocal.put("adminId", id); + LikeAdminThreadLocal.put("username", adminUser.getName()); + String roleIds = StringUtils.join(iAdminRoleService.getRoleIdAttr(Integer.parseInt(String.valueOf(id))), ","); + LikeAdminThreadLocal.put("roleIds", roleIds); + + // 权限校验 + if (!adminUser.getId().equals(1)) { + this.checkAuth(method, reqUri); + } + } + } + + /** + * 权限验证 + * + * @param method 方法类 + * @param uri 请求路由 + * @author fzr + */ + private void checkAuth(Method method, String uri) { + for (int i=0; i<=0; i++) { + // 免权限校验 + if (StringUtils.isNotNull(method) && method.isAnnotationPresent(NotPower.class)) { + break; + } + + // 路由转权限 + String prefix = "/adminapi/"; + String route = uri.replaceFirst(prefix, ""); +// String auths = route.replace("/", ":"); + String auths = route; + // 校验权限 + StpUtil.checkPermission(auths); + } + } +} diff --git a/yj-admin/src/main/java/com/yj/admin/LikeAdminThreadLocal.java b/yj-admin/src/main/java/com/yj/admin/LikeAdminThreadLocal.java new file mode 100644 index 0000000..1c32829 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/LikeAdminThreadLocal.java @@ -0,0 +1,75 @@ +package com.yj.admin; + +import com.yj.common.util.ListUtils; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentSkipListMap; + +/** + * 本地线程 + */ +public class LikeAdminThreadLocal { + + /** + * 构造方法 + */ + public LikeAdminThreadLocal() {} + + /** + * 取得本地线程对象 + */ + private static final java.lang.ThreadLocal> MY_LOCAL = new java.lang.ThreadLocal<>(); + + /** + * 写入本地线程 + */ + public static void put(String key, Object val) { + Map map = MY_LOCAL.get(); + if (map == null) { + synchronized (MY_LOCAL) { + map = new ConcurrentSkipListMap<>(); + } + } + map.put(key, val); + MY_LOCAL.set(map); + } + + /** + * 获取本地线程 + */ + public static Object get(String key) { + return MY_LOCAL.get().getOrDefault(key, ""); + } + + /** + * 获取管理员ID + */ + public static Integer getAdminId() { + String adminId = LikeAdminThreadLocal.get("adminId").toString(); + if (adminId.equals("")) { + return 0; + } + return Integer.parseInt(adminId); + } + + /** + * 获取角色ID + */ + public static List getRoleIds() { + String roleIds = LikeAdminThreadLocal.get("roleIds").toString(); + if (roleIds.equals("") || roleIds.equals("0")) { + return Collections.emptyList(); + } + return ListUtils.stringToListAsInt(roleIds, ","); + } + + /** + * 删除本地线程 + */ + public static void remove() { + MY_LOCAL.remove(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/aop/Log.java b/yj-admin/src/main/java/com/yj/admin/aop/Log.java new file mode 100644 index 0000000..07586b7 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/aop/Log.java @@ -0,0 +1,29 @@ +package com.yj.admin.aop; + +import com.yj.admin.aop.aspect.RequestType; + +import java.lang.annotation.*; + +/** + * 日志记录类 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Log { + + /** + * 模块名称 + * + * @return String + */ + String title() default ""; + + /** + * 请求类型 + * + * @return String + */ + RequestType requestType() default RequestType.Default; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/aop/aspect/LogAspect.java b/yj-admin/src/main/java/com/yj/admin/aop/aspect/LogAspect.java new file mode 100644 index 0000000..397f8cf --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/aop/aspect/LogAspect.java @@ -0,0 +1,181 @@ +package com.yj.admin.aop.aspect; + +import com.alibaba.fastjson2.JSON; +import com.yj.admin.LikeAdminThreadLocal; +import com.yj.admin.aop.Log; +import com.yj.common.entity.admin.Admin; +import com.yj.common.entity.system.OperationLog; +import com.yj.common.mapper.admin.AdminMapper; +import com.yj.common.mapper.system.SystemLogOperateMapper; +import com.yj.common.util.IpUtils; +import com.yj.common.util.RequestUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.AfterThrowing; +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.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.stream.Collectors; + +@Aspect +@Component +public class LogAspect { + + @Resource + SystemLogOperateMapper systemLogOperateMapper; + + @Resource + AdminMapper adminMapper; + + private static final Logger log = LoggerFactory.getLogger(LogAspect.class); + + /** + * 线程本地变量 + */ + private static final ThreadLocal threadLocal = new ThreadLocal<>(); + + /** + * 单线程化的线程池 + */ + private final ExecutorService executor = Executors.newSingleThreadExecutor(); + + /** + * 声明切面点拦截那些类 + */ + @Pointcut("@annotation(com.yj.admin.aop.Log)") + private void pointCutMethodController() {} + + /** + * 环绕通知前后增强 + */ + @Around(value = "pointCutMethodController()") + public Object doAroundService(ProceedingJoinPoint joinPoint) throws Throwable { + // 开始时间 + threadLocal.set(System.currentTimeMillis()); + // 执行方法 + Object result = joinPoint.proceed(); + // 保存日志 + recordLog(joinPoint, null); + // 返回结果 + return result; + } + + /** + * 拦截异常操作 + * + * @param joinPoint 切点 + * @param e 异常 + */ + @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e") + public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e) { + recordLog(joinPoint, e); + } + + /** + * 记录日志信息 + * + * @param joinPointObj joinPoint + * @param e Exception 错误异常 + */ + private void recordLog(Object joinPointObj, final Exception e) { + try { + long beginTime = threadLocal.get(); + long endTime = System.currentTimeMillis(); + ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (requestAttributes != null) { + // 取得请求对象 + HttpServletRequest request = requestAttributes.getRequest(); + + // 获取当前的用户 + Integer adminId = LikeAdminThreadLocal.getAdminId(); + + // 获取日志注解 + ProceedingJoinPoint joinPoint = (ProceedingJoinPoint) joinPointObj; + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + Log logAnnotation = method.getAnnotation(Log.class); + + // 方法名称 + String className = joinPoint.getTarget().getClass().getName(); + String methodName = joinPoint.getSignature().getName(); + + // 获取请求参数 + String queryString = request.getQueryString(); + Object[] args = joinPoint.getArgs(); + String params = ""; + if (args.length > 0) { + if("POST".equals(request.getMethod())){ + if (RequestType.File.equals(logAnnotation.requestType())){ + //文件类型获取文件名称作为参数 + StandardMultipartHttpServletRequest standardMultipartHttpServletRequest = (StandardMultipartHttpServletRequest) args[0]; + //提取文件名 + params = standardMultipartHttpServletRequest + .getMultiFileMap() + .values() + .stream() + .map(m -> m.stream() + .map(MultipartFile::getOriginalFilename) + .collect(Collectors.joining(","))) + .collect(Collectors.joining(",")); + } else { + params = JSON.toJSONString(args); + } + + } else if("GET".equals(request.getMethod())){ + params = queryString; + } + } + + // 错误信息 + String error = ""; + int status = 1; + if (e != null) { + error = e.getMessage(); + status = 2; // 1=成功, 2=失败 + } + + String adminName = ""; + Admin admin = adminMapper.selectById(adminId); + if (admin != null) { + adminName = admin.getName(); + } + // 数据库日志 + OperationLog model = new OperationLog(); + model.setAdminId(adminId); + model.setAdminName(adminName); + model.setAction(logAnnotation.title()); + model.setIp(IpUtils.getIpAddress()); + model.setType(request.getMethod()); +// model.setMethod(className + "." + methodName + "()"); + model.setUrl(RequestUtils.route()); + model.setParams(params); + model.setResult(error); +// model.setStatus(status); +// model.setStartTime(beginTime / 1000); +// model.setEndTime(endTime / 1000); +// model.setTaskTime(endTime - beginTime); + model.setCreateTime(System.currentTimeMillis() / 1000); + executor.submit(() -> { + systemLogOperateMapper.insert(model); + }); + } + } catch (Exception ex) { + log.error("异常信息:{}", ex.getMessage()); + } + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/aop/aspect/RequestType.java b/yj-admin/src/main/java/com/yj/admin/aop/aspect/RequestType.java new file mode 100644 index 0000000..6ada84f --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/aop/aspect/RequestType.java @@ -0,0 +1,16 @@ +package com.yj.admin.aop.aspect; + +/** + * 请求参数类 + */ +public enum RequestType { + /** + * 文件类型 + */ + File, + /** + * 默认数据类型 + */ + Default + +} diff --git a/yj-admin/src/main/java/com/yj/admin/cache/CaptchaCache.java b/yj-admin/src/main/java/com/yj/admin/cache/CaptchaCache.java new file mode 100644 index 0000000..b3ef88b --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/cache/CaptchaCache.java @@ -0,0 +1,31 @@ +package com.yj.admin.cache; + +import com.yj.common.util.*; + +/** + * 验证码缓存器 + */ +public class CaptchaCache { + + public static String get(String uuid) { + String ip = IpUtils.getIpAddress().replaceAll("\\.", ""); + String captchaKey = YmlUtils.get("like.captcha.token") + ip + ":" + uuid; + Object code = RedisUtils.get(captchaKey); + + if (StringUtils.isNull(code) || StringUtils.isEmpty(code.toString())) { + return ""; + } + + RedisUtils.del(captchaKey); + return code.toString(); + } + + public static void set(String code, String uuid) { + String ip = IpUtils.getIpAddress().replaceAll("\\.", ""); + String verifyKey = YmlUtils.get("like.captcha.token") + ip + ":" + uuid; + long expireTime = Long.parseLong(YmlUtils.get("like.captcha.expire")); + + RedisUtils.set(verifyKey, code.toLowerCase(), expireTime); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/config/KaptChaConfig.java b/yj-admin/src/main/java/com/yj/admin/config/KaptChaConfig.java new file mode 100644 index 0000000..2b0dd06 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/config/KaptChaConfig.java @@ -0,0 +1,45 @@ +package com.yj.admin.config; + +import com.google.code.kaptcha.impl.DefaultKaptcha; +import com.google.code.kaptcha.util.Config; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Properties; + +import static com.google.code.kaptcha.Constants.*; + +/** + * 验证码配置 + */ +@Configuration +public class KaptChaConfig { + + @Bean(name = "captchaProducer") + public DefaultKaptcha getKaptchaBean() { + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + // 是否边框 + properties.setProperty(KAPTCHA_BORDER, "yes"); + // 字符颜色 + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black"); + // 图片宽度 + properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); + // 图片高度 + properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); + // 字符大小 + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38"); + // 验证键码 + properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode"); + // 字符长度 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4"); + // 字体样式 + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); + // 图片样式 + properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + return defaultKaptcha; + } +} + diff --git a/yj-admin/src/main/java/com/yj/admin/config/MybatisPlusConfig.java b/yj-admin/src/main/java/com/yj/admin/config/MybatisPlusConfig.java new file mode 100644 index 0000000..6d1ba28 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/config/MybatisPlusConfig.java @@ -0,0 +1,24 @@ +package com.yj.admin.config; + +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * MybatisPlus配置 + */ +@Configuration +public class MybatisPlusConfig { + + /** + * 分页插件集成 + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); + return interceptor; + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/config/SwaggerConfig.java b/yj-admin/src/main/java/com/yj/admin/config/SwaggerConfig.java new file mode 100644 index 0000000..9640555 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/config/SwaggerConfig.java @@ -0,0 +1,49 @@ +package com.yj.admin.config; + +import com.yj.common.config.GlobalConfig; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.oas.annotations.EnableOpenApi; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; + +@Configuration +@EnableOpenApi +public class SwaggerConfig { + + @Value("${like.swagger.enabled}") + private boolean enabled; + + @Value("${like.swagger.pathMapping}") + private String pathMapping; + + @Bean + public Docket createRestApi(){ + return new Docket(DocumentationType.OAS_30) + .apiInfo(apiInfo()) + .enable(enabled) + .select() + .apis(RequestHandlerSelectors.basePackage("com.yj.admin.controller")) + .build() + .pathMapping(pathMapping); + } + + private ApiInfo apiInfo(){ + String author = "FZR"; + String url = "https://gitee.com/likeadmin/likeadmin_java"; + String email = "tinyants@163.com"; + + return new ApiInfoBuilder() + .title("LikeAdmin【后台】接口文档") + .description("likeadmin是一套使用流行的技术栈的快速开发管理后台") + .version(GlobalConfig.version) + .contact(new Contact(author, url, email)) + .build(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/config/WebMvcConfig.java b/yj-admin/src/main/java/com/yj/admin/config/WebMvcConfig.java new file mode 100644 index 0000000..386b698 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/config/WebMvcConfig.java @@ -0,0 +1,55 @@ +package com.yj.admin.config; + +import com.yj.admin.LikeAdminInterceptor; +import com.yj.common.config.GlobalConfig; +import com.yj.common.util.YmlUtils; +import org.jetbrains.annotations.NotNull; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +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 javax.annotation.Resource; + +/** + * Web配置 + */ +@Configuration +public class WebMvcConfig implements WebMvcConfigurer { + + @Resource + LikeAdminInterceptor likeAdminInterceptor; + + /** + * 配置允许跨域 + */ + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("*") + .allowedHeaders("*") + .allowedMethods("GET", "POST", "DELETE", "PUT") + .maxAge(3600); + } + + /** + * 登录拦截器 + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(likeAdminInterceptor) + .addPathPatterns("/**"); + } + + /** + * 资源目录映射 + */ + @Override + public void addResourceHandlers(@NotNull ResourceHandlerRegistry registry) { + String directory = YmlUtils.get("like.upload-directory"); + registry.addResourceHandler("/"+ GlobalConfig.adminPublicPrefix +"/**") + .addResourceLocations("file:" + directory); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/config/quartz/CronUtils.java b/yj-admin/src/main/java/com/yj/admin/config/quartz/CronUtils.java new file mode 100644 index 0000000..ed2c6e2 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/config/quartz/CronUtils.java @@ -0,0 +1,54 @@ +package com.yj.admin.config.quartz; + +import org.quartz.CronExpression; + +import java.text.ParseException; +import java.util.Date; + +/** + * 表达式工具 + */ +public class CronUtils { + + /** + * 验证表达式是否有效 + * + * @param cronExpression 表达式 + * @return true=有效,false=无效 + */ + public static boolean isValid(String cronExpression) { + return CronExpression.isValidExpression(cronExpression); + } + + /** + * 验证表达式消息无效给出有效性 + * + * @param cronExpression 表达式 + * @return null=有效, 其它=无效时的错误描述 + */ + public static String invalidMessage(String cronExpression) { + try { + new CronExpression(cronExpression); + return null; + } catch (ParseException pe) { + return pe.getMessage(); + } + } + + /** + * 下一个执行时间点 + * + * @param cronExpression n表达式 + * @return Date下次表达式执行时间 + */ + public static Date nextExecution(String cronExpression) + { + try { + CronExpression cron = new CronExpression(cronExpression); + return cron.getNextValidTimeAfter(new Date(System.currentTimeMillis())); + } catch (ParseException e) { + throw new IllegalArgumentException(e.getMessage()); + } + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/config/quartz/InvokeUtils.java b/yj-admin/src/main/java/com/yj/admin/config/quartz/InvokeUtils.java new file mode 100644 index 0000000..e3a128b --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/config/quartz/InvokeUtils.java @@ -0,0 +1,152 @@ +package com.yj.admin.config.quartz; + +import com.yj.common.entity.DevCrontab; +import com.yj.common.util.SpringUtils; +import com.yj.common.util.StringUtils; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.LinkedList; +import java.util.List; + +/** + * 执行工具 + */ +public class InvokeUtils { + + /** + * 执行方法 + * + * @param crontab 系统任务 + */ + public static void invokeMethod(DevCrontab crontab) throws Exception { + String invokeTarget = crontab.getCommand(); + String beanName = getBeanName(invokeTarget); + String methodName = getMethodName(invokeTarget); + List methodParams = getMethodParams(invokeTarget); + + if (!isValidClassName(beanName)) { + Object bean = SpringUtils.getBean(beanName); + invokeMethod(bean, methodName, methodParams); + } else { + Object bean = Class.forName(beanName).newInstance(); + invokeMethod(bean, methodName, methodParams); + } + } + + /** + * 调用任务方法 + * + * @param bean 目标对象 + * @param methodName 方法名称 + * @param methodParams 方法参数 + */ + private static void invokeMethod(Object bean, String methodName, List methodParams) + throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, + InvocationTargetException { + if (StringUtils.isNotNull(methodParams) && methodParams.size() > 0) { + Method method = bean.getClass().getMethod(methodName, getMethodParamsType(methodParams)); + method.invoke(bean, getMethodParamsValue(methodParams)); + } else { + Method method = bean.getClass().getMethod(methodName); + method.invoke(bean); + } + } + + + /** + * 校验是否为为class包名 + * + * @param invokeTarget 名称 + * @return true是 false否 + */ + public static boolean isValidClassName(String invokeTarget) { + return StringUtils.countMatches(invokeTarget, ".") > 1; + } + + /** + * 获取bean名称 + * + * @param invokeTarget 目标字符串 + * @return bean名称 + */ + public static String getBeanName(String invokeTarget) { + String beanName = StringUtils.substringBefore(invokeTarget, "("); + return StringUtils.substringBeforeLast(beanName, "."); + } + + /** + * 获取bean方法 + * + * @param invokeTarget 目标字符串 + * @return method方法 + */ + public static String getMethodName(String invokeTarget) { + String methodName = StringUtils.substringBefore(invokeTarget, "("); + return StringUtils.substringAfterLast(methodName, "."); + } + + /** + * 获取method方法参数相关列表 + * + * @param invokeTarget 目标字符串 + * @return method方法相关参数列表 + */ + public static List getMethodParams(String invokeTarget) { + String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")"); + if (StringUtils.isEmpty(methodStr)) { + return null; + } + String[] methodParams = methodStr.split(",(?=([^\"']*[\"'][^\"']*[\"'])*[^\"']*$)"); + List clazz = new LinkedList<>(); + for (String methodParam : methodParams) { + String str = StringUtils.trimToEmpty(methodParam); + if (StringUtils.startsWithAny(str, "'", "\"")) { + clazz.add(new Object[]{StringUtils.substring(str, 1, str.length() - 1), String.class}); + } else if ("true".equalsIgnoreCase(str) || "false".equalsIgnoreCase(str)) { + clazz.add(new Object[]{Boolean.valueOf(str), Boolean.class}); + } else if (StringUtils.endsWith(str, "L")) { + clazz.add(new Object[]{Long.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Long.class}); + } else if (StringUtils.endsWith(str, "D")) { + clazz.add(new Object[]{Double.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Double.class}); + } else { + clazz.add(new Object[]{Integer.valueOf(str), Integer.class}); + } + } + return clazz; + } + + /** + * 获取参数类型 + * + * @param methodParams 参数相关列表 + * @return 参数类型列表 + */ + public static Class[] getMethodParamsType(List methodParams) { + Class[] clazz = new Class[methodParams.size()]; + int index = 0; + for (Object[] os : methodParams) + { + clazz[index] = (Class) os[1]; + index++; + } + return clazz; + } + + /** + * 获取参数值 + * + * @param methodParams 参数相关列表 + * @return 参数值列表 + */ + public static Object[] getMethodParamsValue(List methodParams) { + Object[] clazz = new Object[methodParams.size()]; + int index = 0; + for (Object[] os : methodParams) { + clazz[index] = os[0]; + index++; + } + return clazz; + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/config/quartz/QuartzUtils.java b/yj-admin/src/main/java/com/yj/admin/config/quartz/QuartzUtils.java new file mode 100644 index 0000000..b5c529b --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/config/quartz/QuartzUtils.java @@ -0,0 +1,107 @@ +package com.yj.admin.config.quartz; + +import com.yj.admin.config.quartz.exceution.QuartzJobExecution; +import com.yj.common.entity.DevCrontab; +import com.yj.common.util.StringUtils; +import org.quartz.*; + +/** + * 计划任务工具 + */ +public class QuartzUtils { + + /** + * 得到quartz任务类 + * + * @param crontab 执行计划 + * @return 具体执行任务类 + */ + private static Class getQuartzJobClass(DevCrontab crontab) { +// boolean isConcurrent = crontab.getConcurrent().equals(0); +// return isConcurrent ? QuartzJobExecution.class : QuartzDisExecution.class; + return QuartzJobExecution.class; + } + + /** + * 构建任务对象Key + * + * @param jobId (任务ID) + * @param jobGroup (任务分组) + * @return JobKey + */ + public static JobKey getJobKey(Integer jobId, String jobGroup) { + return JobKey.jobKey(TaskConstants.TASK_CLASS_NAME + jobId, jobGroup); + } + + /** + * 构建触发对象Key + * + * @param jobId (任务ID) + * @param jobGroup (任务分组) + * @return TriggerKey + */ + public static TriggerKey getTriggerKey(Integer jobId, String jobGroup) { + return TriggerKey.triggerKey(TaskConstants.TASK_PROPERTIES + jobId, jobGroup); + } + + /** + * 创建定时任务 + * + * @param scheduler 调度器 + * @param job 任务 + * @throws SchedulerException 调度异常 + */ + public static void createScheduleJob(Scheduler scheduler, DevCrontab job) throws SchedulerException { + Integer jobId = job.getId(); + String jobGroup = job.getType().toString(); + String expression = job.getExpression(); + + + // 构建任务 + Class jobClass = getQuartzJobClass(job); + JobDetail jobDetail = JobBuilder.newJob(jobClass) + .withIdentity(getJobKey(jobId, jobGroup)) + .build(); + + // 构建时间 + CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(expression); +// switch (job.getStrategy()) { +// case 1: // 立即执行 +// cronScheduleBuilder = cronScheduleBuilder.withMisfireHandlingInstructionIgnoreMisfires(); +// break; +// case 2: // 执行一次 +// cronScheduleBuilder = cronScheduleBuilder.withMisfireHandlingInstructionFireAndProceed(); +// break; +// case 3: // 放弃执行 +// cronScheduleBuilder = cronScheduleBuilder.withMisfireHandlingInstructionDoNothing(); +// break; +// } + + cronScheduleBuilder = cronScheduleBuilder.withMisfireHandlingInstructionIgnoreMisfires(); + + // 注入参数 + jobDetail.getJobDataMap().put(TaskConstants.TASK_PROPERTIES, job); + + // 构建目标 + CronTrigger trigger = TriggerBuilder.newTrigger() + .withIdentity(getTriggerKey(jobId, jobGroup)) + .withSchedule(cronScheduleBuilder) + .build(); + + // 如果存在则删除 + if (scheduler.checkExists(getJobKey(jobId, jobGroup))) { + scheduler.deleteJob(getJobKey(jobId, jobGroup)); + } + + // 如果过期则调度 + if (StringUtils.isNotNull(CronUtils.nextExecution(job.getExpression()))) { + scheduler.scheduleJob(jobDetail, trigger); + } + + // 如果暂停则停止 + if (!job.getStatus().equals(TaskConstants.STATUS_RUN)) { + scheduler.pauseJob(getJobKey(jobId, jobGroup)); + } + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/config/quartz/TaskConstants.java b/yj-admin/src/main/java/com/yj/admin/config/quartz/TaskConstants.java new file mode 100644 index 0000000..729ddca --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/config/quartz/TaskConstants.java @@ -0,0 +1,20 @@ +package com.yj.admin.config.quartz; + +/** + * 计划任务常量 + */ +public class TaskConstants { + + /** 执行任务名 */ + public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME"; + + /** 执行目标键 */ + public static final String TASK_PROPERTIES = "TASK_PROPERTIES"; + + /** 状态: 运行 */ + public static final Integer STATUS_RUN = 1; + + /** 状态: 失败 */ + public static final Integer STATUS_FAIL = 2; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/config/quartz/exceution/AbstractQuartzJob.java b/yj-admin/src/main/java/com/yj/admin/config/quartz/exceution/AbstractQuartzJob.java new file mode 100644 index 0000000..dc19591 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/config/quartz/exceution/AbstractQuartzJob.java @@ -0,0 +1,82 @@ +package com.yj.admin.config.quartz.exceution; + +import com.yj.admin.config.quartz.TaskConstants; +import com.yj.common.entity.DevCrontab; +import com.yj.common.mapper.DevCrontabMapper; +import com.yj.common.util.SpringUtils; +import com.yj.common.util.StringUtils; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; + +public abstract class AbstractQuartzJob implements Job { + + private static final Logger log = LoggerFactory.getLogger(AbstractQuartzJob.class); + + /** + * 线程本地变量 + */ + private static final ThreadLocal threadLocal = new ThreadLocal<>(); + + /** + * 执行 + * + * @param context 上下文 + */ + @Override + public void execute(JobExecutionContext context) { + DevCrontab crontab = new DevCrontab(); + BeanUtils.copyProperties(context.getMergedJobDataMap().get(TaskConstants.TASK_PROPERTIES), crontab); + try { + before(); + doExecute(context, crontab); + after(crontab, null); + } catch (Exception e) { + log.error("任务执行异常:", e); + after(crontab, e); + } + } + + /** + * 执行前 + */ + protected void before() { + threadLocal.set(System.currentTimeMillis()); + } + + /** + * 执行后 + * + * @param crontab 系统计划任务 + */ + protected void after(DevCrontab crontab, Exception e) + { + long startTime = threadLocal.get(); + long endTime = System.currentTimeMillis(); + threadLocal.remove(); + + crontab.setError(""); +// crontab.set(startTime / 1000); + crontab.setLastTime(endTime / 1000); + crontab.setMaxTime(endTime - startTime); + crontab.setTime(endTime - startTime); + if (StringUtils.isNotNull(e)) { + crontab.setError(e.getMessage()); + crontab.setStatus(TaskConstants.STATUS_FAIL); + } + + SpringUtils.getBean(DevCrontabMapper.class).updateById(crontab); + } + + /** + * 执行方法 + * + * @param context 工作执行上下文对象 + * @param sysJob 系统计划任务 + * @throws Exception 执行过程中的异常 + */ + protected abstract void doExecute(JobExecutionContext context, DevCrontab sysJob) throws Exception; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/config/quartz/exceution/QuartzDisExecution.java b/yj-admin/src/main/java/com/yj/admin/config/quartz/exceution/QuartzDisExecution.java new file mode 100644 index 0000000..7aff49b --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/config/quartz/exceution/QuartzDisExecution.java @@ -0,0 +1,19 @@ +package com.yj.admin.config.quartz.exceution; + +import com.yj.admin.config.quartz.InvokeUtils; +import com.yj.common.entity.DevCrontab; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.JobExecutionContext; + +/** + * 禁止并发任务 + */ +@DisallowConcurrentExecution +public class QuartzDisExecution extends AbstractQuartzJob { + + @Override + protected void doExecute(JobExecutionContext context, DevCrontab crontab) throws Exception { + InvokeUtils.invokeMethod(crontab); + } + +} \ No newline at end of file diff --git a/yj-admin/src/main/java/com/yj/admin/config/quartz/exceution/QuartzJobExecution.java b/yj-admin/src/main/java/com/yj/admin/config/quartz/exceution/QuartzJobExecution.java new file mode 100644 index 0000000..74a17fa --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/config/quartz/exceution/QuartzJobExecution.java @@ -0,0 +1,17 @@ +package com.yj.admin.config.quartz.exceution; + +import com.yj.admin.config.quartz.InvokeUtils; +import com.yj.common.entity.DevCrontab; +import org.quartz.JobExecutionContext; + +/** + * 允许并发任务 + */ +public class QuartzJobExecution extends AbstractQuartzJob { + + @Override + protected void doExecute(JobExecutionContext context, DevCrontab crontab) throws Exception { + InvokeUtils.invokeMethod(crontab); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/config/stp/StpInException.java b/yj-admin/src/main/java/com/yj/admin/config/stp/StpInException.java new file mode 100644 index 0000000..7c02984 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/config/stp/StpInException.java @@ -0,0 +1,42 @@ +package com.yj.admin.config.stp; + +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.exception.NotPermissionException; +import com.yj.common.core.AjaxResult; +import com.yj.common.enums.ErrorEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +/** + * Sa-Token的异常拦截 + */ +@Slf4j +@ControllerAdvice +public class StpInException { + + /** + * 拦截登录异常 + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(NotLoginException.class) + @ResponseBody + public AjaxResult handleNotLoginException(NotLoginException e){ + String msg = e.getMessage().startsWith("Token无效") ? "尚未登录,请先登录!" : e.getMessage(); + return AjaxResult.failed(ErrorEnum.TOKEN_INVALID.getCode(), msg); + } + + /** + * 拦截权限异常 + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(NotPermissionException.class) + @ResponseBody + public AjaxResult handleNotPermissionException(){ + return AjaxResult.failed(ErrorEnum.NO_PERMISSION.getCode(), ErrorEnum.NO_PERMISSION.getMsg()); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/config/stp/StpInterConfig.java b/yj-admin/src/main/java/com/yj/admin/config/stp/StpInterConfig.java new file mode 100644 index 0000000..c39bd75 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/config/stp/StpInterConfig.java @@ -0,0 +1,91 @@ +package com.yj.admin.config.stp; + +import cn.dev33.satoken.stp.StpInterface; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.admin.LikeAdminThreadLocal; +import com.yj.admin.service.admin.IAdminRoleService; +import com.yj.common.entity.system.SystemMenu; +import com.yj.common.entity.system.SystemRoleMenu; +import com.yj.common.mapper.system.SystemMenuMapper; +import com.yj.common.mapper.system.SystemRoleMenuMapper; +import com.yj.common.util.StringUtils; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.*; + +/** + * Sa-Token自定义权限验证接口 + */ +@Component +public class StpInterConfig implements StpInterface { + + @Resource + SystemRoleMenuMapper systemRoleMenuMapper; + + @Resource + SystemMenuMapper systemAuthMenuMapper; + + @Resource + IAdminRoleService iAdminRoleService; + + /** + * 返回一个账号所拥有的权限码集合 + * + * @param loginId 登录ID + * @param loginType 登录类型 + * @return List + */ + @Override + public List getPermissionList(Object loginId, String loginType) { + List roleIds = LikeAdminThreadLocal.getRoleIds(); + List perms = new LinkedList<>(); + if (roleIds.isEmpty()) { + return perms; + } + + List permList = systemRoleMenuMapper.selectList( + new QueryWrapper() + .select("role_id,menu_id") + .in("role_id", roleIds)); + + if (permList.isEmpty()) { + return perms; + } + + List menuIds = new LinkedList<>(); + for (SystemRoleMenu systemAuthPerm : permList) { + menuIds.add(systemAuthPerm.getMenuId()); + } + + List systemAuthMenus = systemAuthMenuMapper.selectList( + new QueryWrapper() + .select("id,perms") + .eq("is_disable", 0) + .in("id", menuIds) + .in("type", Arrays.asList("C", "A")) + .orderByAsc(Arrays.asList("sort", "id"))); + + for (SystemMenu item : systemAuthMenus) { + if (StringUtils.isNotNull(item.getPerms()) && StringUtils.isNotEmpty(item.getPerms())) { +// perms.add(item.getPerms().trim().replace("/", ":")); + perms.add(item.getPerms().trim()); + } + } + + return perms; + } + + /** + * 返回一个账号所拥有的角色标识集合 + * + * @param loginId 登录ID + * @param loginType 登录类型 + * @return List + */ + @Override + public List getRoleList(Object loginId, String loginType) { + return null; + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/ArtCateController.java b/yj-admin/src/main/java/com/yj/admin/controller/ArtCateController.java new file mode 100644 index 0000000..02cc53b --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/ArtCateController.java @@ -0,0 +1,86 @@ +package com.yj.admin.controller; + +import com.yj.admin.aop.Log; +import com.yj.common.aop.NotPower; +import com.yj.admin.service.IArtCateService; +import com.yj.admin.validate.article.ArtCateCreateValidate; +import com.yj.admin.validate.article.ArtCateUpdateValidate; +import com.yj.admin.validate.article.ArtCateSearchValidate; +import com.yj.admin.validate.commons.IdValidate; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.vo.article.ArticleCateVo; +import com.yj.common.core.AjaxResult; +import com.yj.common.core.PageResult; +import com.yj.common.validator.annotation.IDMust; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +@RestController +@RequestMapping({"/adminapi/article/articleCate", "/adminapi/article.articleCate"}) +@Api(tags = "文章分类管理") +public class ArtCateController { + + @Resource + IArtCateService iArtCateService; + + @NotPower + @GetMapping("/all") + @ApiOperation(value="所有分类") + public AjaxResult> all() { + List list = iArtCateService.all(); + return AjaxResult.success(list); + } + + @GetMapping("/lists") + @ApiOperation(value="分类列表") + public AjaxResult> list(@Validated PageValidate pageValidate, + @Validated ArtCateSearchValidate searchValidate) { + PageResult list = iArtCateService.list(pageValidate, searchValidate); + return AjaxResult.success(list); + } + + @GetMapping("/detail") + @ApiOperation(value="分类详情") + public AjaxResult detail(@Validated @IDMust() @RequestParam("id") Integer id) { + ArticleCateVo vo = iArtCateService.detail(id); + return AjaxResult.success(vo); + } + + @Log(title = "文章分类新增") + @PostMapping("/add") + @ApiOperation(value="分类新增") + public AjaxResult add(@Validated @RequestBody ArtCateCreateValidate createValidate) { + iArtCateService.add(createValidate); + return AjaxResult.success(); + } + + @Log(title = "文章分类编辑") + @PostMapping("/edit") + @ApiOperation(value="分类编辑") + public AjaxResult edit(@Validated @RequestBody ArtCateUpdateValidate updateValidate) { + iArtCateService.edit(updateValidate); + return AjaxResult.success(); + } + + @Log(title = "文章分类删除") + @PostMapping("/delete") + @ApiOperation(value="分类删除") + public AjaxResult del(@Validated @RequestBody IdValidate idValidate) { + iArtCateService.del(idValidate.getId()); + return AjaxResult.success(); + } + + @Log(title = "文章分类状态") + @PostMapping("/updateStatus") + @ApiOperation(value="分类状态") + public AjaxResult change(@Validated @RequestBody IdValidate idValidate) { + iArtCateService.change(idValidate.getId()); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/ArticleController.java b/yj-admin/src/main/java/com/yj/admin/controller/ArticleController.java new file mode 100644 index 0000000..7454284 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/ArticleController.java @@ -0,0 +1,78 @@ +package com.yj.admin.controller; + +import com.yj.admin.aop.Log; +import com.yj.admin.service.IArticleService; +import com.yj.admin.validate.article.ArticleCreateValidate; +import com.yj.admin.validate.article.ArticleSearchValidate; +import com.yj.admin.validate.article.ArticleUpdateValidate; + +import com.yj.admin.validate.commons.IdValidate; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.vo.article.ArticleDetailVo; +import com.yj.admin.vo.article.ArticleListedVo; +import com.yj.common.core.AjaxResult; +import com.yj.common.core.PageResult; +import com.yj.common.validator.annotation.IDMust; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping({"adminapi/article/article", "adminapi/article.article"}) +@Api(tags = "文章数据管理") +public class ArticleController { + + @Resource + IArticleService iArticleService; + + @GetMapping("/lists") + @ApiOperation(value="文章列表") + public AjaxResult> list(@Validated PageValidate pageValidate, + @Validated ArticleSearchValidate searchValidate) { + PageResult vos = iArticleService.list(pageValidate, searchValidate); + return AjaxResult.success(vos); + } + + @GetMapping("/detail") + @ApiOperation(value="文章详情") + public AjaxResult detail(@Validated @IDMust() @RequestParam("id") Integer id) { + ArticleDetailVo vo = iArticleService.detail(id); + return AjaxResult.success(vo); + } + + @Log(title = "文章新增") + @PostMapping("/add") + @ApiOperation(value="文章新增") + public AjaxResult add(@Validated @RequestBody ArticleCreateValidate createValidate) { + iArticleService.add(createValidate); + return AjaxResult.success(); + } + + @Log(title = "文章编辑") + @PostMapping("/edit") + @ApiOperation(value="文章编辑") + public AjaxResult edit(@Validated @RequestBody ArticleUpdateValidate updateValidate) { + iArticleService.edit(updateValidate); + return AjaxResult.success(); + } + + @Log(title = "文章删除") + @PostMapping("/delete") + @ApiOperation(value="文章删除") + public AjaxResult del(@Validated @RequestBody IdValidate idValidate) { + iArticleService.del(idValidate.getId()); + return AjaxResult.success(); + } + + @Log(title = "文章状态") + @PostMapping("/updateStatus") + @ApiOperation(value="文章状态") + public AjaxResult change(@Validated @RequestBody IdValidate idValidate) { + iArticleService.change(idValidate.getId()); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/CrontabController.java b/yj-admin/src/main/java/com/yj/admin/controller/CrontabController.java new file mode 100644 index 0000000..22d1e9d --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/CrontabController.java @@ -0,0 +1,119 @@ +package com.yj.admin.controller; + +import com.yj.admin.aop.Log; +import com.yj.admin.service.ICrontabService; +import com.yj.admin.validate.crontab.CrontabCreateValidate; +import com.yj.admin.validate.crontab.CrontabUpdateValidate; +import com.yj.admin.validate.commons.IdValidate; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.vo.CrontabDetailVo; +import com.yj.admin.vo.CrontabListedVo; +import com.yj.common.core.AjaxResult; +import com.yj.common.core.PageResult; +import com.yj.common.exception.OperateException; +import com.yj.common.validator.annotation.IDMust; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.quartz.CronExpression; +import org.quartz.SchedulerException; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.*; + +@RestController +@RequestMapping("/adminapi/crontab.crontab") +@Api(tags = "计划任务管理") +public class CrontabController { + + @Resource + ICrontabService iCrontabService; + + @GetMapping("/lists") + @ApiOperation(value="计划任务列表") + public AjaxResult< PageResult> list(@Validated PageValidate pageValidate) { + PageResult list = iCrontabService.list(pageValidate); + return AjaxResult.success(list); + } + + @GetMapping("/detail") + @ApiOperation(value="计划任务详情") + public AjaxResult detail(@Validated @IDMust() @RequestParam("id") Integer id) { + CrontabDetailVo vo = iCrontabService.detail(id); + return AjaxResult.success(vo); + } + + @Log(title = "计划任务新增") + @PostMapping("/add") + @ApiOperation(value="计划任务新增") + public AjaxResult add(@Validated @RequestBody CrontabCreateValidate createValidate) throws SchedulerException { + iCrontabService.add(createValidate); + return AjaxResult.success(); + } + + @Log(title = "计划任务编辑") + @PostMapping("/edit") + @ApiOperation(value="计划任务编辑") + public AjaxResult edit(@Validated @RequestBody CrontabUpdateValidate updateValidate) throws SchedulerException { + iCrontabService.edit(updateValidate); + return AjaxResult.success(); + } + + @Log(title = "计划任务删除") + @PostMapping("/delete") + @ApiOperation(value="计划任务删除") + public AjaxResult del(@Validated @RequestBody IdValidate idValidate) throws SchedulerException { + iCrontabService.del(idValidate.getId()); + return AjaxResult.success(); + } + + + @GetMapping("/expression") + @ApiOperation(value="计划任务列表") + public AjaxResult>> expression(@Validated @RequestParam("expression") String expression) { + return AjaxResult.success(getExpression(expression)); + } + + + public static List> getExpression(String cronExpression) { + try { + CronExpression cron = new CronExpression(cronExpression); + List dates = new ArrayList<>(); + + Date date = new Date(); + for (int i = 0; i < 5; i++) { + Date nextValidTimeAfter = cron.getNextValidTimeAfter(date); // 假设从当前时间开始 + if (nextValidTimeAfter != null) { + dates.add(nextValidTimeAfter); + date = nextValidTimeAfter; + } else { + break; // 如果没有更多的有效时间,则退出循环 + } + } + + List> lists = new ArrayList<>(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + for (int i = 0; i < dates.size(); i++) { + Map entry = new HashMap<>(); + entry.put("time", String.valueOf(i + 1)); + entry.put("date", sdf.format(dates.get(i))); + lists.add(entry); + } + + // 添加额外的条目 + Map extraEntry = new HashMap<>(); + extraEntry.put("time", "x"); + extraEntry.put("date", "……"); + lists.add(extraEntry); + + return lists; + } catch (Exception e) { + // 注意:在Java中,通常不会直接返回异常消息作为业务逻辑的一部分 + // 这里为了与PHP函数保持一致,我们返回异常消息,但在实际应用中应避免这样做 + throw new OperateException(e.getMessage()); + } + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/FileController.java b/yj-admin/src/main/java/com/yj/admin/controller/FileController.java new file mode 100644 index 0000000..1922a88 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/FileController.java @@ -0,0 +1,94 @@ +package com.yj.admin.controller; + +import com.alibaba.fastjson2.JSONObject; +import com.yj.admin.aop.Log; +import com.yj.admin.service.IFileService; +import com.yj.admin.validate.file.FileCateValidate; +import com.yj.admin.validate.file.FileMoveValidate; +import com.yj.admin.validate.file.FileRenameValidate; +import com.yj.admin.validate.file.FileSearchValidate; +import com.yj.admin.validate.commons.IdValidate; +import com.yj.admin.validate.commons.IdsValidate; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.vo.album.FileVo; +import com.yj.common.core.AjaxResult; +import com.yj.common.core.PageResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/adminapi/file") +@Api(tags = "文件数据管理") +public class FileController { + + @Resource + IFileService fileService; + + @GetMapping("/lists") + @ApiOperation(value="文件列表") + public AjaxResult> fileList(@Validated PageValidate pageValidate, + @Validated FileSearchValidate searchValidate) { + PageResult voPageResult = fileService.fileList(pageValidate, searchValidate); + return AjaxResult.success(voPageResult); + } + + @Log(title = "文件重命名") + @PostMapping("/rename") + @ApiOperation(value="文件重命名") + public AjaxResult rename(@Validated @RequestBody FileRenameValidate renameValidate) { + fileService.fileRename(renameValidate.getId(), renameValidate.getName()); + return AjaxResult.success(); + } + + @Log(title = "文件移动") + @PostMapping("/move") + @ApiOperation(value="相册文件移动") + public AjaxResult move(@Validated @RequestBody FileMoveValidate moveValidate) { + fileService.fileMove(moveValidate.getIds(), moveValidate.getCid()); + return AjaxResult.success(); + } + + @Log(title = "文件删除") + @PostMapping("/delete") + @ApiOperation(value="相册文件删除") + public AjaxResult del(@Validated @RequestBody IdsValidate idsValidate) { + fileService.fileDel(idsValidate.getIds()); + return AjaxResult.success(); + } + + @GetMapping("/listCate") + @ApiOperation(value="文件分类列表") + public AjaxResult cateList(@Validated FileSearchValidate searchValidate) { + JSONObject result = fileService.cateList(searchValidate); + return AjaxResult.success(result); + } + + @Log(title = "分类新增") + @PostMapping("/addCate") + @ApiOperation(value="分类新增") + public AjaxResult cateAdd(@Validated @RequestBody FileCateValidate cateValidate) { + fileService.cateAdd(cateValidate); + return AjaxResult.success(); + } + + @Log(title = "相册分类重命名") + @PostMapping("/editCate") + @ApiOperation(value="相册分类重命名") + public AjaxResult cateRename(@Validated @RequestBody FileRenameValidate renameValidate) { + fileService.cateRename(renameValidate.getId(), renameValidate.getName()); + return AjaxResult.success(); + } + + @Log(title = "相册分类删除") + @PostMapping("/delCate") + @ApiOperation(value="相册分类删除") + public AjaxResult cateDel(@Validated @RequestBody IdValidate idValidate) { + fileService.cateDel(idValidate.getId()); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/IndexController.java b/yj-admin/src/main/java/com/yj/admin/controller/IndexController.java new file mode 100644 index 0000000..86cf4ef --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/IndexController.java @@ -0,0 +1,31 @@ +package com.yj.admin.controller; + +import com.yj.admin.service.IIndexService; +import com.yj.common.core.AjaxResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Map; + +@Slf4j +@RestController +@RequestMapping("/adminapi/workbench") +@Api(tags = "主页数据管理") +public class IndexController { + + @Resource + IIndexService iIndexService; + + @GetMapping("/index") + @ApiOperation(value="控制台") + public AjaxResult> index() { + Map map = iIndexService.index(); + return AjaxResult.success(map); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/UploadController.java b/yj-admin/src/main/java/com/yj/admin/controller/UploadController.java new file mode 100644 index 0000000..392ad83 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/UploadController.java @@ -0,0 +1,128 @@ +package com.yj.admin.controller; + +import com.yj.admin.LikeAdminThreadLocal; +import com.yj.admin.aop.Log; +import com.yj.admin.aop.aspect.RequestType; +import com.yj.admin.service.IFileService; +import com.yj.common.aop.NotPower; +import com.yj.common.core.AjaxResult; +import com.yj.common.enums.AlbumEnum; +import com.yj.common.exception.OperateException; +import com.yj.common.plugin.storage.StorageDriver; +import com.yj.common.plugin.storage.UploadFilesVo; +import com.yj.common.util.StringUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.util.LinkedHashMap; +import java.util.Map; + +@RestController +@RequestMapping("/adminapi/upload") +@Api(tags = "上传文件管理") +public class UploadController { + + @Resource + IFileService fileService; + + @Log(title = "上传图片", requestType = RequestType.File) + @PostMapping("/image") + @NotPower + @ApiOperation(value="上传图片") + public AjaxResult image(@RequestParam("file") MultipartFile[] files, @RequestParam("cid") String requestCid) { + + String cid = StringUtils.isNotEmpty(requestCid) ? requestCid : "0"; + + if (files == null || files.length == 0) { + throw new OperateException("请选择上传图片!"); + } + + + for (int i = 0; i < files.length; i++) { + StorageDriver storageDriver = new StorageDriver(); + UploadFilesVo vo = storageDriver.upload(files[i], "image", AlbumEnum.IMAGE.getCode()); + Map album = new LinkedHashMap<>(); + album.put("aid", String.valueOf(LikeAdminThreadLocal.getAdminId())); + album.put("cid", cid); + album.put("type", String.valueOf(AlbumEnum.IMAGE.getCode())); +// album.put("size", vo.getSize().toString()); +// album.put("ext", vo.getExt()); + album.put("url", vo.getUrl()); + album.put("name", vo.getName()); + Integer id = fileService.fileAdd(album); + vo.setId(id); + } + + return AjaxResult.success(); + } + + @Log(title = "上传图片", requestType = RequestType.File) + @PostMapping("/file") + @NotPower + @ApiOperation(value="上传文件") + public AjaxResult file(@RequestParam("file") MultipartFile[] files, @RequestParam("cid") String requestCid) { + + String cid = StringUtils.isNotEmpty(requestCid) ? requestCid : "0"; + + if (files == null || files.length == 0) { + throw new OperateException("请选择上传文件!"); + } + + + for (int i = 0; i < files.length; i++) { + StorageDriver storageDriver = new StorageDriver(); + UploadFilesVo vo = storageDriver.upload(files[i], "image", AlbumEnum.Doc.getCode()); + Map album = new LinkedHashMap<>(); + album.put("aid", String.valueOf(LikeAdminThreadLocal.getAdminId())); + album.put("cid", cid); + album.put("type", String.valueOf(AlbumEnum.Doc.getCode())); +// album.put("size", vo.getSize().toString()); +// album.put("ext", vo.getExt()); + album.put("url", vo.getUrl()); + album.put("name", vo.getName()); + Integer id = fileService.fileAdd(album); + vo.setId(id); + } + + return AjaxResult.success(); + } + + @Log(title = "上传视频", requestType = RequestType.File) + @PostMapping("/video") + @NotPower + @ApiOperation(value="上传视频") + public AjaxResult video(@RequestParam("file") MultipartFile[] files, @RequestParam("cid") String requestCid) { + + String cid = StringUtils.isNotEmpty(requestCid) ? requestCid : "0"; + + + if (files == null || files.length == 0) { + throw new OperateException("请选择上传视频!"); + } + for (int i = 0; i < files.length; i++) { + + StorageDriver storageDriver = new StorageDriver(); + UploadFilesVo vo = storageDriver.upload(files[i], "video", AlbumEnum.Video.getCode()); + + Map album = new LinkedHashMap<>(); + album.put("cid", cid); + album.put("aid", String.valueOf(LikeAdminThreadLocal.getAdminId())); + album.put("type", String.valueOf(AlbumEnum.Video.getCode())); +// album.put("ext", vo.getExt()); +// album.put("size", vo.getSize().toString()); + album.put("url", vo.getUrl()); + album.put("name", vo.getName()); + Integer id = fileService.fileAdd(album); + + vo.setId(id); + } + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/UserController.java b/yj-admin/src/main/java/com/yj/admin/controller/UserController.java new file mode 100644 index 0000000..2b3a4e7 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/UserController.java @@ -0,0 +1,72 @@ +package com.yj.admin.controller; + +import com.alibaba.fastjson2.JSONObject; +import com.yj.admin.aop.Log; +import com.yj.admin.service.IUserService; +import com.yj.admin.validate.user.UserSearchValidate; +import com.yj.admin.validate.user.UserUpdateValidate; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.user.UserWalletValidate; +import com.yj.admin.vo.user.UserVo; +import com.yj.common.core.AjaxResult; +import com.yj.common.core.PageResult; +import com.yj.common.enums.ErrorEnum; +import com.yj.common.util.StringUtils; +import com.yj.common.validator.annotation.IDMust; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping({"adminapi/user/user", "adminapi/user.user"}) +@Api(tags = "用户数据管理") +public class UserController { + + @Resource + IUserService iUserService; + + @GetMapping("/lists") + @ApiOperation(value="用户列表") + public AjaxResult list(@Validated PageValidate pageValidate, + @Validated UserSearchValidate searchValidate) { + if (StringUtils.isNotNull(searchValidate.getExport()) && searchValidate.getExport().equals(1)) { + JSONObject ret = iUserService.getExportData(pageValidate, searchValidate); + return AjaxResult.success(ret); + } else if (StringUtils.isNotNull(searchValidate.getExport()) && searchValidate.getExport().equals(2)) { + String path = iUserService.export(searchValidate); + return AjaxResult.success(2, new JSONObject() {{ + put("url", path); + }}, ErrorEnum.SHOW_MSG.getCode()); + } else { + PageResult list = iUserService.list(pageValidate, searchValidate); + return AjaxResult.success(list); + } + } + + @GetMapping("/detail") + @ApiOperation(value="用户详情") + public AjaxResult detail(@Validated @IDMust() @RequestParam("id") Integer id) { + UserVo vo = iUserService.detail(id); + return AjaxResult.success(vo); + } + + @Log(title = "用户编辑") + @PostMapping("/edit") + @ApiOperation(value="用户编辑") + public AjaxResult edit(@Validated @RequestBody UserUpdateValidate updateValidate) { + iUserService.edit(updateValidate); + return AjaxResult.success(); + } + + @Log(title = "余额调整") + @PostMapping("/adjustMoney") + @ApiOperation(value="余额调整") + public AjaxResult adjustWallet(@Validated @RequestBody UserWalletValidate walletValidate) { + iUserService.adjustWallet(walletValidate); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/adminapi/ConfigController.java b/yj-admin/src/main/java/com/yj/admin/controller/adminapi/ConfigController.java new file mode 100644 index 0000000..f4b2750 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/adminapi/ConfigController.java @@ -0,0 +1,32 @@ +package com.yj.admin.controller.adminapi; + +import com.yj.admin.service.IIndexService; +import com.yj.common.aop.NotLogin; +import com.yj.common.core.AjaxResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Map; + +@Slf4j +@RestController +@RequestMapping("adminapi/config") +@Api(tags = "主页数据管理") +public class ConfigController { + + @Resource + IIndexService iIndexService; + @NotLogin + @GetMapping("/getConfig") + @ApiOperation(value="公共配置") + public AjaxResult> getConfig() { + Map map = iIndexService.config(); + return AjaxResult.success(map); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/adminapi/LoginController.java b/yj-admin/src/main/java/com/yj/admin/controller/adminapi/LoginController.java new file mode 100644 index 0000000..287665a --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/adminapi/LoginController.java @@ -0,0 +1,50 @@ +package com.yj.admin.controller.adminapi; + +import com.yj.admin.service.system.ISystemLoginService; +import com.yj.admin.validate.system.SystemAdminLoginsValidate; +import com.yj.admin.vo.system.SystemCaptchaVo; +import com.yj.admin.vo.system.SystemLoginVo; +import com.yj.common.aop.NotLogin; +import com.yj.common.aop.NotPower; +import com.yj.common.core.AjaxResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + +@RestController +@RequestMapping("adminapi/login") +@Api(tags = "系统登录管理") +public class LoginController { + + @Resource + ISystemLoginService iSystemLoginService; + + @NotLogin + @GetMapping("/captcha") + @ApiOperation(value="取验证码") + public AjaxResult captcha() { + SystemCaptchaVo vo = iSystemLoginService.captcha(); + return AjaxResult.success(vo); + } + + @NotLogin + @PostMapping("/account") + @ApiOperation(value="登录系统") + public AjaxResult account(@Validated() @RequestBody SystemAdminLoginsValidate loginsValidate) { + SystemLoginVo vo = iSystemLoginService.login(loginsValidate); + return AjaxResult.success(vo); + } + + @NotPower + @PostMapping("/logout") + @ApiOperation(value="退出登录") + public AjaxResult logout(HttpServletRequest request) { + iSystemLoginService.logout(request.getHeader("token")); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/adminapi/auth/AdminController.java b/yj-admin/src/main/java/com/yj/admin/controller/adminapi/auth/AdminController.java new file mode 100644 index 0000000..134e55a --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/adminapi/auth/AdminController.java @@ -0,0 +1,53 @@ +package com.yj.admin.controller.adminapi.auth; + +import com.yj.admin.LikeAdminThreadLocal; +import com.yj.admin.service.admin.IAdminRoleService; +import com.yj.admin.service.admin.IAdminService; +import com.yj.admin.validate.system.SystemEditSelfValidate; +import com.yj.admin.vo.auth.AdminMySelfVo; +import com.yj.common.aop.NotPower; +import com.yj.common.core.AjaxResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +@Slf4j +@RestController +@RequestMapping({"adminapi/auth/admin", "adminapi/auth.admin"}) +@Api(tags = "管理员详情管理") +public class AdminController { + + @Resource + IAdminService iAdminService; + + @Resource + IAdminRoleService iAdminRoleService; + + @Resource + IAdminService iSystemAuthAdminService; + + @NotPower + @GetMapping("/mySelf") + @ApiOperation(value="获取当前管理员信息") + public AjaxResult mySelf() { + Integer adminId = LikeAdminThreadLocal.getAdminId(); + + List roleIds = iAdminRoleService.getRoleIdAttr(adminId); + + AdminMySelfVo mySelf = iAdminService.mySelf(LikeAdminThreadLocal.getAdminId(), roleIds); + return AjaxResult.success(mySelf); + } + + @PostMapping("/editSelf") + @ApiOperation(value = "编辑当前管理员信息") + public AjaxResult editSelf(@Validated @RequestBody SystemEditSelfValidate upInfoValidate) { + Integer adminId = LikeAdminThreadLocal.getAdminId(); + iAdminService.editSelf(upInfoValidate, adminId); + return AjaxResult.success(); + } +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/channel/ChannelH5Controller.java b/yj-admin/src/main/java/com/yj/admin/controller/channel/ChannelH5Controller.java new file mode 100644 index 0000000..6d8e482 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/channel/ChannelH5Controller.java @@ -0,0 +1,38 @@ +package com.yj.admin.controller.channel; + +import com.yj.admin.aop.Log; +import com.yj.admin.service.IChannelH5ConfigService; +import com.yj.admin.validate.channel.ChannelH5Validate; +import com.yj.admin.vo.channel.ChannelH5Vo; +import com.yj.common.core.AjaxResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/adminapi/channel.web_page_setting") +@Api(tags = "移动渠道设置") +public class ChannelH5Controller { + + @Resource + IChannelH5ConfigService iChannelH5ConfigService; + + @GetMapping("/getConfig") + @ApiOperation(value="H5渠道设置详情") + public AjaxResult getConfig() { + ChannelH5Vo vo = iChannelH5ConfigService.getConfig(); + return AjaxResult.success(vo); + } + + @Log(title = "H5渠道设置保存") + @PostMapping("/setConfig") + @ApiOperation(value="H5渠道设置保存") + public AjaxResult setConfig(@Validated @RequestBody ChannelH5Validate channelH5Validate) { + iChannelH5ConfigService.setConfig(channelH5Validate); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/channel/ChannelMpController.java b/yj-admin/src/main/java/com/yj/admin/controller/channel/ChannelMpController.java new file mode 100644 index 0000000..e67a162 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/channel/ChannelMpController.java @@ -0,0 +1,38 @@ +package com.yj.admin.controller.channel; + +import com.yj.admin.aop.Log; +import com.yj.admin.service.IChannelMpConfigService; +import com.yj.admin.validate.channel.ChannelMpValidate; +import com.yj.admin.vo.channel.ChannelMpVo; +import com.yj.common.core.AjaxResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/adminapi/channel.mnp_settings") +@Api(tags = "微信程序渠道") +public class ChannelMpController { + + @Resource + IChannelMpConfigService iChannelMpConfigService; + + @GetMapping("/getConfig") + @ApiOperation(value="微信程序渠道设置详情") + public AjaxResult getConfig() { + ChannelMpVo vo = iChannelMpConfigService.getConfig(); + return AjaxResult.success(vo); + } + + @Log(title = "微信小程序渠道设置保存") + @PostMapping("/setConfig") + @ApiOperation(value="微信程序渠道设置保存") + public AjaxResult setConfig(@Validated @RequestBody ChannelMpValidate channelMpValidate) { + iChannelMpConfigService.setConfig(channelMpValidate); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/channel/ChannelOaCallBackController.java b/yj-admin/src/main/java/com/yj/admin/controller/channel/ChannelOaCallBackController.java new file mode 100644 index 0000000..381d729 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/channel/ChannelOaCallBackController.java @@ -0,0 +1,44 @@ +package com.yj.admin.controller.channel; + +import com.yj.admin.service.IChannelOaCallBackService; +import com.yj.common.aop.NotLogin; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + + +@RestController +@RequestMapping("/adminapi/channel/oa/callback") +@Api(tags = "公众号服务器验证及消息回复") +public class ChannelOaCallBackController { + + @Resource + private IChannelOaCallBackService iChannelOaCallBackService; + + @NotLogin + @GetMapping(produces = "text/plain;charset=utf-8") + @ApiOperation(value="公众号服务器地址验证") + public String authGet(@RequestParam(name = "signature", required = false) String signature, + @RequestParam(name = "timestamp", required = false) String timestamp, + @RequestParam(name = "nonce", required = false) String nonce, + @RequestParam(name = "echostr", required = false) String echostr) { + return iChannelOaCallBackService.checkSignature(signature, timestamp, nonce, echostr); + } + + + @NotLogin + @PostMapping(produces = "application/xml; charset=UTF-8") + @ApiOperation(value="公众号消息回复") + public String post(@RequestBody String requestBody, + @RequestParam("signature") String signature, + @RequestParam("timestamp") String timestamp, + @RequestParam("nonce") String nonce, + @RequestParam(name = "encrypt_type", required = false) String encType, + @RequestParam(name = "msg_signature", required = false) String msgSignature) { + return iChannelOaCallBackService.post(requestBody, signature, timestamp, nonce, encType, msgSignature); + } + + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/channel/ChannelOaController.java b/yj-admin/src/main/java/com/yj/admin/controller/channel/ChannelOaController.java new file mode 100644 index 0000000..aae93cb --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/channel/ChannelOaController.java @@ -0,0 +1,38 @@ +package com.yj.admin.controller.channel; + +import com.yj.admin.aop.Log; +import com.yj.admin.service.IChannelOaConfigService; +import com.yj.admin.validate.channel.ChannelOaValidate; +import com.yj.admin.vo.channel.ChannelOaVo; +import com.yj.common.core.AjaxResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/adminapi/channel.official_account_setting") +@Api(tags = "公众号渠道设置") +public class ChannelOaController { + + @Resource + IChannelOaConfigService iChannelOaConfigService; + + @GetMapping("/getConfig") + @ApiOperation(value="公众号渠道设置详情") + public AjaxResult getConfig() { + ChannelOaVo vo = iChannelOaConfigService.getConfig(); + return AjaxResult.success(vo); + } + + @Log(title = "公众号渠道设置保存") + @PostMapping("/setConfig") + @ApiOperation(value="公众号渠道设置保存") + public AjaxResult setConfig(@Validated @RequestBody ChannelOaValidate channelOaValidate) { + iChannelOaConfigService.setConfig(channelOaValidate); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/channel/ChannelOaMenuController.java b/yj-admin/src/main/java/com/yj/admin/controller/channel/ChannelOaMenuController.java new file mode 100644 index 0000000..2f6b59a --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/channel/ChannelOaMenuController.java @@ -0,0 +1,43 @@ +package com.yj.admin.controller.channel; + +import com.alibaba.fastjson2.JSONArray; +import com.yj.admin.service.IChannelOaMenusService; +import com.yj.common.core.AjaxResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +@RestController +@RequestMapping("/adminapi/channel.official_account_menu") +@Api(tags = "公众号菜单管理") +public class ChannelOaMenuController { + + @Resource + IChannelOaMenusService iChannelOaMenusService; + + @GetMapping("/detail") + @ApiOperation(value="菜单详情") + public AjaxResult detail() { + JSONArray detail = iChannelOaMenusService.detail(); + return AjaxResult.success(detail); + } + + @PostMapping("/save") + @ApiOperation(value="仅是保存菜单") + public AjaxResult save(@RequestBody List params) { + iChannelOaMenusService.save(params, false); + return AjaxResult.success(); + } + + + @PostMapping("/saveAndPublish") + @ApiOperation(value="saveAndPublish") + public AjaxResult publish(@RequestBody List params) { + iChannelOaMenusService.save(params, true); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/channel/ChannelOaReplyController.java b/yj-admin/src/main/java/com/yj/admin/controller/channel/ChannelOaReplyController.java new file mode 100644 index 0000000..45b6041 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/channel/ChannelOaReplyController.java @@ -0,0 +1,68 @@ +package com.yj.admin.controller.channel; + +import com.yj.admin.service.IChannelOaReplyService; +import com.yj.admin.validate.channel.ChannelRpValidate; +import com.yj.admin.validate.commons.IdValidate; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.vo.channel.ChannelRpVo; +import com.yj.common.core.AjaxResult; +import com.yj.common.core.PageResult; +import com.yj.common.validator.annotation.IDMust; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/adminapi/channel.official_account_reply") +@Api(tags = "公众号回复") +public class ChannelOaReplyController { + + @Resource + IChannelOaReplyService iChannelOaReplyService; + + @GetMapping("/lists") + @ApiOperation(value="默认回复列表") + public AjaxResult> list(@Validated PageValidate pageValidate, @RequestParam("reply_type") Integer replyType) { + PageResult list = iChannelOaReplyService.list(pageValidate, replyType); + return AjaxResult.success(list); + } + + @GetMapping("/detail") + @ApiOperation(value="默认回复详情") + public AjaxResult detail(@Validated @IDMust() @RequestParam("id") Integer id) { + ChannelRpVo vo = iChannelOaReplyService.detail(id); + return AjaxResult.success(vo); + } + + @PostMapping("/add") + @ApiOperation(value="默认回复新增") + public AjaxResult add(@Validated @RequestBody ChannelRpValidate defaultValidate) { + iChannelOaReplyService.add(defaultValidate); + return AjaxResult.success(); + } + + @PostMapping("/edit") + @ApiOperation(value="默认回复编辑") + public AjaxResult edit(@Validated @RequestBody ChannelRpValidate defaultValidate) { + iChannelOaReplyService.edit(defaultValidate); + return AjaxResult.success(); + } + + @PostMapping("/delete") + @ApiOperation(value="默认回复删除") + public AjaxResult del(@Validated @RequestBody IdValidate idValidate) { + iChannelOaReplyService.del(idValidate.getId()); + return AjaxResult.success(); + } + + @PostMapping("/status") + @ApiOperation(value="默认回复状态") + public AjaxResult status(@Validated @RequestBody IdValidate idValidate) { + iChannelOaReplyService.status(idValidate.getId()); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/channel/ChannelOpController.java b/yj-admin/src/main/java/com/yj/admin/controller/channel/ChannelOpController.java new file mode 100644 index 0000000..b25f8d6 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/channel/ChannelOpController.java @@ -0,0 +1,36 @@ +package com.yj.admin.controller.channel; + +import com.yj.admin.service.IChannelOpService; +import com.yj.admin.validate.channel.ChannelOpValidate; +import com.yj.admin.vo.channel.ChannelOpVo; +import com.yj.common.core.AjaxResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/adminapi/channel.open_setting/") +@Api(tags = "微信开放渠道") +public class ChannelOpController { + + @Resource + IChannelOpService iChannelOpService; + + @GetMapping("/getConfig") + @ApiOperation(value="开放平台设置详情") + public AjaxResult getConfig() { + ChannelOpVo vo = iChannelOpService.getConfig(); + return AjaxResult.success(vo); + } + + @PostMapping("/setConfig") + @ApiOperation(value="开放平台设置保存") + public AjaxResult save(@Validated @RequestBody ChannelOpValidate opValidate) { + iChannelOpService.setConfig(opValidate); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/decorate/DecorateDataController.java b/yj-admin/src/main/java/com/yj/admin/controller/decorate/DecorateDataController.java new file mode 100644 index 0000000..4d9ffa6 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/decorate/DecorateDataController.java @@ -0,0 +1,42 @@ +package com.yj.admin.controller.decorate; + +import com.alibaba.fastjson2.JSONObject; +import com.yj.common.aop.NotPower; +import com.yj.admin.service.IDecorateDataService; +import com.yj.admin.vo.decorate.DecorateDataArticleVo; +import com.yj.common.core.AjaxResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + +@RestController +@RequestMapping("/adminapi/decorate.data") +@Api(tags = "装修数据管理") +public class DecorateDataController { + + @Resource + IDecorateDataService iDecorateDataService; + + @NotPower + @GetMapping("/article") + @ApiOperation(value="获取文章数据") + public AjaxResult> article(@RequestParam(defaultValue = "10") Integer limit) { + List list = iDecorateDataService.article(limit); + return AjaxResult.success(list); + } + + + @GetMapping("/pc") + @ApiOperation(value="获取pc装修数据") + public AjaxResult pc() { + JSONObject pc = iDecorateDataService.pc(); + return AjaxResult.success(pc); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/decorate/DecoratePagesController.java b/yj-admin/src/main/java/com/yj/admin/controller/decorate/DecoratePagesController.java new file mode 100644 index 0000000..c54ba0c --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/decorate/DecoratePagesController.java @@ -0,0 +1,39 @@ +package com.yj.admin.controller.decorate; + +import com.yj.admin.aop.Log; +import com.yj.admin.service.IDecoratePageService; +import com.yj.admin.validate.decorate.DecoratePageValidate; +import com.yj.admin.vo.decorate.DecoratePageVo; +import com.yj.common.core.AjaxResult; +import com.yj.common.validator.annotation.IDMust; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/adminapi/decorate.page") +@Api(tags = "装修页面管理") +public class DecoratePagesController { + + @Resource + IDecoratePageService iDecoratePageService; + + @GetMapping("/detail") + @ApiOperation(value="页面装修详情") + public AjaxResult detail(@Validated @IDMust() @RequestParam("id") Integer id) { + DecoratePageVo vo = iDecoratePageService.detail(id); + return AjaxResult.success(vo); + } + + @Log(title = "页面装修保存") + @PostMapping("/save") + @ApiOperation(value="页面装修保存") + public AjaxResult save(@RequestBody DecoratePageValidate decoratePageValidate) { + iDecoratePageService.save(decoratePageValidate); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/decorate/DecorateTabbarController.java b/yj-admin/src/main/java/com/yj/admin/controller/decorate/DecorateTabbarController.java new file mode 100644 index 0000000..fe3da9d --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/decorate/DecorateTabbarController.java @@ -0,0 +1,38 @@ +package com.yj.admin.controller.decorate; + +import com.yj.admin.aop.Log; +import com.yj.admin.service.IDecorateTabbarService; +import com.yj.admin.validate.decorate.DecorateTabsValidate; +import com.yj.admin.vo.decorate.DecorateTabbarVo; +import com.yj.common.core.AjaxResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/adminapi/decorate.tabbar") +@Api(tags = "装修导航管理") +public class DecorateTabbarController { + + @Resource + IDecorateTabbarService iDecorateTabbarService; + + @GetMapping("/detail") + @ApiOperation(value="底部导航详情") + public AjaxResult detail() { + DecorateTabbarVo vo = iDecorateTabbarService.detail(); + return AjaxResult.success(vo); + } + + @Log(title = "底部导航编辑") + @PostMapping("/save") + @ApiOperation(value="底部导航编辑") + public AjaxResult save(@Validated @RequestBody DecorateTabsValidate tabsValidate) { + iDecorateTabbarService.save(tabsValidate); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/finance/FinanceRechargerController.java b/yj-admin/src/main/java/com/yj/admin/controller/finance/FinanceRechargerController.java new file mode 100644 index 0000000..0b20db5 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/finance/FinanceRechargerController.java @@ -0,0 +1,67 @@ +package com.yj.admin.controller.finance; + +import com.alibaba.fastjson2.JSONObject; +import com.yj.admin.LikeAdminThreadLocal; +import com.yj.admin.service.IFinanceRechargerService; +import com.yj.admin.validate.commons.IdValidate; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.finance.FinanceRechargeSearchValidate; +import com.yj.admin.validate.finance.FinanceRefundValidate; +import com.yj.admin.vo.finance.FinanceRechargeListVo; +import com.yj.common.core.AjaxResult; +import com.yj.common.core.PageResult; +import com.yj.common.enums.ErrorEnum; +import com.yj.common.util.StringUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping({"/adminapi/recharge/recharge", "/adminapi/recharge.recharge"}) +@Api("充值记录管理") +public class FinanceRechargerController { + + @Resource + IFinanceRechargerService iFinanceRechargerService; + + @GetMapping("/lists") + @ApiOperation("充值记录") + public AjaxResult list(@Validated PageValidate pageValidate, + @Validated FinanceRechargeSearchValidate searchValidate) { + if (StringUtils.isNotNull(searchValidate.getExport()) && searchValidate.getExport().equals(1)) { + JSONObject ret = iFinanceRechargerService.getExportData(pageValidate, searchValidate); + return AjaxResult.success(ret); + } else if (StringUtils.isNotNull(searchValidate.getExport()) && searchValidate.getExport().equals(2)) { + String path = iFinanceRechargerService.export(searchValidate); + return AjaxResult.success(2, new JSONObject() {{ + put("url", path); + }}, ErrorEnum.SHOW_MSG.getCode()); + } else { + PageResult list = iFinanceRechargerService.list(pageValidate, searchValidate); + return AjaxResult.success(list); + } + } + + @PostMapping("/refund") + @ApiOperation("发起退款") + public AjaxResult refund(@Validated @RequestBody FinanceRefundValidate financeRefundValidate) { + Integer adminId = LikeAdminThreadLocal.getAdminId(); + + iFinanceRechargerService.refund(financeRefundValidate.getRecharge_id(), adminId); + return AjaxResult.success(); + } + + @PostMapping("/refundAgain") + @ApiModelProperty("重新退款") + public AjaxResult refundAgain(@Validated @RequestBody IdValidate idValidate) { + Integer adminId = LikeAdminThreadLocal.getAdminId(); + + iFinanceRechargerService.refundAgain(idValidate.getId(), adminId); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/finance/FinanceRefundController.java b/yj-admin/src/main/java/com/yj/admin/controller/finance/FinanceRefundController.java new file mode 100644 index 0000000..cbc4211 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/finance/FinanceRefundController.java @@ -0,0 +1,53 @@ +package com.yj.admin.controller.finance; + +import com.yj.admin.service.IFinanceRefundService; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.finance.FinanceRefundSearchValidate; +import com.yj.admin.vo.finance.FinanceRefundListVo; +import com.yj.admin.vo.finance.FinanceRefundLogVo; +import com.yj.common.aop.NotPower; +import com.yj.common.core.AjaxResult; +import com.yj.common.core.PageResult; +import com.yj.common.validator.annotation.IDMust; +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.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + +@RestController +@RequestMapping("/adminapi/finance.refund") +@Api("退款记录管理") +public class FinanceRefundController { + + @Resource + IFinanceRefundService iFinanceRefundService; + + @NotPower + @GetMapping("/stat") + @ApiOperation("退还统计") + public AjaxResult stat() { + return AjaxResult.success(iFinanceRefundService.stat()); + } + + @GetMapping("/record") + @ApiOperation("退款记录") + public AjaxResult list(@Validated PageValidate pageValidate, + @Validated FinanceRefundSearchValidate searchValidate) { + PageResult list = iFinanceRefundService.list(pageValidate, searchValidate); + return AjaxResult.success(list); + } + + @GetMapping("/log") + @ApiOperation("退款日志") + public AjaxResult log(@Validated @IDMust() @RequestParam("record_id") Integer id) { + List list = iFinanceRefundService.log(id); + return AjaxResult.success(list); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/finance/FinanceWalletController.java b/yj-admin/src/main/java/com/yj/admin/controller/finance/FinanceWalletController.java new file mode 100644 index 0000000..1ad2da7 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/finance/FinanceWalletController.java @@ -0,0 +1,44 @@ +package com.yj.admin.controller.finance; + +import com.yj.admin.service.IFinanceWalletService; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.finance.FinanceWalletSearchValidate; +import com.yj.admin.vo.finance.FinanceWalletListVo; +import com.yj.common.aop.NotPower; +import com.yj.common.core.AjaxResult; +import com.yj.common.core.PageResult; +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.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Map; + +@RestController +@RequestMapping("/adminapi/finance.account_log") +@Api("余额明细管理") +public class FinanceWalletController { + + @Resource + IFinanceWalletService iFinanceWalletService; + + @GetMapping("/lists") + @ApiOperation("记录列表") + public AjaxResult list(@Validated PageValidate pageValidate, + @Validated FinanceWalletSearchValidate searchValidate) { + PageResult list = iFinanceWalletService.list(pageValidate, searchValidate); + return AjaxResult.success(list); + } + + + @NotPower + @GetMapping("/getUmChangeType") + @ApiOperation("记录列表") + public AjaxResult> getUmChangeType() { + return AjaxResult.success(iFinanceWalletService.getUmChangeType()); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/marketing/MarketingRechargeController.java b/yj-admin/src/main/java/com/yj/admin/controller/marketing/MarketingRechargeController.java new file mode 100644 index 0000000..d002763 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/marketing/MarketingRechargeController.java @@ -0,0 +1,36 @@ +package com.yj.admin.controller.marketing; + +import com.yj.admin.service.IMarketingRechargeService; +import com.yj.admin.validate.marketing.MarketingRechargeValidate; +import com.yj.admin.vo.marketing.MarketingRechargeVo; +import com.yj.common.core.AjaxResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiModelProperty; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping({"adminapi/recharge/recharge", "adminapi/recharge.recharge"}) +@Api("营销充值管理") +public class MarketingRechargeController { + + @Resource + IMarketingRechargeService iMarketingRechargeService; + + @GetMapping("/getConfig") + @ApiModelProperty(value = "充值配置详情") + public AjaxResult detail() { + MarketingRechargeVo vo = iMarketingRechargeService.detail(); + return AjaxResult.success(vo); + } + + @PostMapping("/setConfig") + @ApiModelProperty(value = "充值配置保存") + public AjaxResult save(@Validated @RequestBody MarketingRechargeValidate rechargeValidate) { + iMarketingRechargeService.save(rechargeValidate); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/monitor/MonitorCacheController.java b/yj-admin/src/main/java/com/yj/admin/controller/monitor/MonitorCacheController.java new file mode 100644 index 0000000..cff6a9c --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/monitor/MonitorCacheController.java @@ -0,0 +1,62 @@ +package com.yj.admin.controller.monitor; + + +import com.yj.admin.aop.Log; +import com.yj.common.core.AjaxResult; +import com.yj.common.util.StringUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.data.redis.connection.RedisServerCommands; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.*; + +@RestController +@RequestMapping("api/monitor") +@Api(tags = "监控缓存管理") +public class MonitorCacheController { + + @Resource + private RedisTemplate redisTemplate; + + /** + * 缓存监控 + * + * @author fzr + * @return AjaxResult + */ + @Log(title = "缓存监控") + @GetMapping("/cache") + @ApiOperation(value="缓存监控") + public AjaxResult info() { + Properties info = (Properties) redisTemplate.execute((RedisCallback) RedisServerCommands::info); + Properties commandStats = (Properties) redisTemplate.execute((RedisCallback) connection -> connection.info("commandstats")); + Object dbSize = redisTemplate.execute((RedisCallback) RedisServerCommands::dbSize); + + if (commandStats == null) { + return AjaxResult.failed("获取异常"); + } + + Map result = new HashMap<>(3); + result.put("info", info); + result.put("dbSize", dbSize); + + List> pieList = new ArrayList<>(); + commandStats.stringPropertyNames().forEach(key -> { + Map data = new HashMap<>(2); + String property = commandStats.getProperty(key); + data.put("name", StringUtils.removeStart(key, "cmdstat_")); + data.put("value", StringUtils.substringBetween(property, "calls=", ",usec")); + pieList.add(data); + }); + + result.put("commandStats", pieList); + return AjaxResult.success(result); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/monitor/MonitorServerController.java b/yj-admin/src/main/java/com/yj/admin/controller/monitor/MonitorServerController.java new file mode 100644 index 0000000..04b4443 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/monitor/MonitorServerController.java @@ -0,0 +1,33 @@ +package com.yj.admin.controller.monitor; + +import com.yj.admin.aop.Log; +import com.yj.common.core.AjaxResult; +import com.yj.common.core.ServerResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +@RestController +@RequestMapping("adminapi/setting.system.system") +@Api(tags = "监控服务管理") +public class MonitorServerController { + + /** + * 服务器信息 + * + * @author fzr + * @return AjaxResult> + */ + @Log(title = "服务监控") + @GetMapping("/info") + @ApiOperation(value="服务监控") + public AjaxResult> info() { + ServerResult server = new ServerResult(); + return AjaxResult.success(server.copyTo()); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingDictDataController.java b/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingDictDataController.java new file mode 100644 index 0000000..9305953 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingDictDataController.java @@ -0,0 +1,82 @@ +package com.yj.admin.controller.setting; + +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.yj.admin.aop.Log; +import com.yj.admin.validate.commons.IdArrayValidate; +import com.yj.common.aop.NotPower; +import com.yj.admin.service.ISettingDictDataService; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.setting.DictDataCreateValidate; +import com.yj.admin.validate.setting.DictDataUpdateValidate; +import com.yj.admin.vo.setting.SettingDictDataVo; +import com.yj.common.core.AjaxResult; +import com.yj.common.core.PageResult; +import com.yj.common.util.StringUtils; +import com.yj.common.validator.annotation.IDMust; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/adminapi/setting.dict.dict_data") +@Api(tags = "配置字典数据") +public class SettingDictDataController { + + @Resource + ISettingDictDataService iSettingDictDataService; + + @NotPower + @GetMapping("/all") + @ApiOperation(value="字典数据所有") + public AjaxResult> all(@RequestParam Map params) { + Assert.isFalse(StringUtils.isEmpty(params.get("type_id")), "type_id缺失"); + List list = iSettingDictDataService.all(params); + return AjaxResult.success(list); + } + + @GetMapping("/lists") + @ApiOperation(value="字典数据列表") + public AjaxResult> list(@Validated PageValidate pageValidate, + @RequestParam Map params) { + Assert.isFalse(StringUtils.isEmpty(params.get("type_id")), "type_id缺失"); + PageResult list = iSettingDictDataService.list(pageValidate, params); + return AjaxResult.success(list); + } + + @GetMapping("/detail") + @ApiOperation(value="字典数据详情") + public AjaxResult detail(@Validated @IDMust() @RequestParam("id") Integer id) { + SettingDictDataVo vo = iSettingDictDataService.detail(id); + return AjaxResult.success(vo); + } + + @Log(title = "字典数据新增") + @PostMapping("/add") + @ApiOperation(value="字典数据新增") + public AjaxResult add(@Validated @RequestBody DictDataCreateValidate createValidate) { + iSettingDictDataService.add(createValidate); + return AjaxResult.success("操作成功"); + } + + @Log(title = "字典数据编辑") + @PostMapping("/edit") + @ApiOperation(value="字典数据编辑") + public AjaxResult edit(@Validated @RequestBody DictDataUpdateValidate updateValidate) { + iSettingDictDataService.edit(updateValidate); + return AjaxResult.success("操作成功"); + } + + @Log(title = "字典数据删除") + @PostMapping("/delete") + @ApiOperation(value="字典数据删除") + public AjaxResult del(@Validated @RequestBody IdArrayValidate idArrayValidate) { + iSettingDictDataService.del(idArrayValidate.getId()); + return AjaxResult.success("操作成功"); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingDictTypeController.java b/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingDictTypeController.java new file mode 100644 index 0000000..3c32bd0 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingDictTypeController.java @@ -0,0 +1,78 @@ +package com.yj.admin.controller.setting; + +import com.yj.admin.aop.Log; +import com.yj.admin.validate.commons.IdValidate; +import com.yj.common.aop.NotPower; +import com.yj.admin.service.ISettingDictTypeService; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.setting.DictTypeCreateValidate; +import com.yj.admin.validate.setting.DictTypeUpdateValidate; +import com.yj.admin.vo.setting.SettingDictTypeVo; +import com.yj.common.core.AjaxResult; +import com.yj.common.core.PageResult; +import com.yj.common.validator.annotation.IDMust; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/adminapi/setting.dict.dict_type") +@Api(tags = "配置字典类型") +public class SettingDictTypeController { + + @Resource + ISettingDictTypeService iSettingDictTypeService; + + @NotPower + @GetMapping("/all") + @ApiOperation(value="字典类型所有") + public AjaxResult> all() { + List list = iSettingDictTypeService.all(); + return AjaxResult.success(list); + } + + @GetMapping("/lists") + @ApiOperation(value="字典类型列表") + public AjaxResult> list(@Validated PageValidate pageValidate, + @RequestParam Map params) { + PageResult list = iSettingDictTypeService.list(pageValidate, params); + return AjaxResult.success(list); + } + + @GetMapping("/detail") + @ApiOperation(value="字典类型详情") + public AjaxResult detail(@Validated @IDMust() @RequestParam("id") Integer id) { + SettingDictTypeVo vo = iSettingDictTypeService.detail(id); + return AjaxResult.success(vo); + } + + @Log(title = "字典类型新增") + @PostMapping("/add") + @ApiOperation(value="字典类型新增") + public AjaxResult add(@Validated @RequestBody DictTypeCreateValidate createValidate) { + iSettingDictTypeService.add(createValidate); + return AjaxResult.success(); + } + + @Log(title = "字典类型编辑") + @PostMapping("/edit") + @ApiOperation(value="字典类型编辑") + public AjaxResult edit(@Validated @RequestBody DictTypeUpdateValidate updateValidate) { + iSettingDictTypeService.edit(updateValidate); + return AjaxResult.success(); + } + + @Log(title = "字典类型删除") + @PostMapping("/delete") + @ApiOperation(value="字典类型删除") + public AjaxResult del(@Validated @RequestBody IdValidate idValidate) { + iSettingDictTypeService.del(idValidate.getId()); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingLoginController.java b/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingLoginController.java new file mode 100644 index 0000000..2324421 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingLoginController.java @@ -0,0 +1,38 @@ +package com.yj.admin.controller.setting; + +import com.yj.admin.aop.Log; +import com.yj.admin.service.ISettingLoginService; +import com.yj.admin.validate.setting.SettingLoginValidate; +import com.yj.admin.vo.setting.SettingLoginVo; +import com.yj.common.core.AjaxResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/adminapi/setting.user.user") +@Api(tags = "配置用户登录") +public class SettingLoginController { + + @Resource + ISettingLoginService iSettingLoginService; + + @GetMapping("/getRegisterConfig") + @ApiOperation(value="登录设置详情") + public AjaxResult getRegisterConfig() { + SettingLoginVo vo = iSettingLoginService.getRegisterConfig(); + return AjaxResult.success(vo); + } + + @Log(title = "登录设置编辑") + @PostMapping("/setRegisterConfig") + @ApiOperation(value="登录设置编辑") + public AjaxResult setRegisterConfig(@Validated @RequestBody SettingLoginValidate loginValidate) { + iSettingLoginService.setRegisterConfig(loginValidate); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingNoticeController.java b/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingNoticeController.java new file mode 100644 index 0000000..59eae50 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingNoticeController.java @@ -0,0 +1,50 @@ +package com.yj.admin.controller.setting; + +import com.alibaba.fastjson2.JSONObject; +import com.yj.admin.aop.Log; +import com.yj.admin.service.ISettingNoticeService; +import com.yj.admin.vo.setting.SettingNoticeDetailVo; +import com.yj.admin.vo.setting.SettingNoticeListedVo; +import com.yj.common.core.AjaxResult; +import com.yj.common.validator.annotation.IDMust; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +@RestController +@RequestMapping("/adminapi/notice.notice") +@Api(tags = "配置消息通知") +public class SettingNoticeController { + + @Resource + ISettingNoticeService iSettingNoticeService; + + @GetMapping("/settingLists") + @ApiOperation(value="通知设置列表") + public AjaxResult list(@RequestParam Integer recipient) { + List list = iSettingNoticeService.list(recipient); + JSONObject result = new JSONObject(); + result.put("lists", list); + return AjaxResult.success(result); + } + + @GetMapping("/detail") + @ApiOperation(value="通知设置详情") + public AjaxResult detail(@Validated @IDMust() @RequestParam("id") Integer id) { + SettingNoticeDetailVo vo = iSettingNoticeService.detail(id); + return AjaxResult.success(vo); + } + + @Log(title = "通知设置编辑") + @PostMapping("/set") + @ApiOperation(value="通知设置编辑") + public AjaxResult save(@RequestBody JSONObject params) { + iSettingNoticeService.save(params); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingPayConfigController.java b/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingPayConfigController.java new file mode 100644 index 0000000..5d6105e --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingPayConfigController.java @@ -0,0 +1,47 @@ +package com.yj.admin.controller.setting; + + +import com.alibaba.fastjson2.JSONObject; +import com.yj.admin.service.ISettingPaymentService; +import com.yj.admin.validate.setting.SettingPayConfigValidate; +import com.yj.common.core.AjaxResult; +import com.yj.common.entity.setting.DevPayConfig; +import com.yj.common.validator.annotation.IDMust; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/adminapi/setting.pay.pay_config") +@Api(tags = "配置支付参数") +public class SettingPayConfigController { + + @Resource + ISettingPaymentService iSettingPaymentService; + + @GetMapping("/lists") + @ApiOperation(value="支付配置列表") + public AjaxResult list() { + JSONObject result = iSettingPaymentService.list(); + return AjaxResult.success(result); + } + + @GetMapping("/getConfig") + @ApiOperation(value="支付配置详情") + public AjaxResult getConfig(@Validated @IDMust() @RequestParam("id") Integer id) { + DevPayConfig vo = iSettingPaymentService.getConfig(id); + return AjaxResult.success(vo); + } + + @PostMapping("/setConfig") + @ApiOperation(value="支付配置编辑") + public AjaxResult setConfig(@Validated @RequestBody SettingPayConfigValidate configValidate) { + iSettingPaymentService.setConfig(configValidate); + return AjaxResult.success(); + } + + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingPayWayController.java b/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingPayWayController.java new file mode 100644 index 0000000..b5c933a --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingPayWayController.java @@ -0,0 +1,38 @@ +package com.yj.admin.controller.setting; + + +import com.yj.admin.service.ISettingPaymentService; +import com.yj.admin.vo.setting.SettingPaymentMethodVo; +import com.yj.common.core.AjaxResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + +@RestController +@RequestMapping("/adminapi/setting.pay.pay_way") +@Api(tags = "配置支付参数") +public class SettingPayWayController { + + @Resource + ISettingPaymentService iSettingPaymentService; + + @GetMapping("/getPayWay") + @ApiOperation(value="支付方式列表") + public AjaxResult method() { + HashMap list = iSettingPaymentService.getPayWay(); + return AjaxResult.success(list); + } + + @PostMapping("/setPayWay") + @ApiOperation(value="支付方式编辑") + public AjaxResult setPayWay(@Validated @RequestBody HashMap> data) { + iSettingPaymentService.setPayWay(data); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingSearchController.java b/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingSearchController.java new file mode 100644 index 0000000..b2337f2 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingSearchController.java @@ -0,0 +1,38 @@ +package com.yj.admin.controller.setting; + +import com.yj.admin.aop.Log; +import com.yj.admin.service.ISettingSearchService; +import com.yj.admin.validate.setting.SettingSearchValidate; +import com.yj.admin.vo.setting.SettingSearchDetailVo; +import com.yj.common.core.AjaxResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/adminapi/setting.hot_search") +@Api(tags = "配置热门搜索") +public class SettingSearchController { + + @Resource + ISettingSearchService iSettingSearchService; + + @GetMapping("/getConfig") + @ApiOperation(value="热门搜索详情") + public AjaxResult getConfig() { + SettingSearchDetailVo vo = iSettingSearchService.getConfig(); + return AjaxResult.success(vo); + } + + @Log(title = "热门搜索编辑") + @PostMapping("/setConfig") + @ApiOperation(value="热门搜索编辑") + public AjaxResult setConfig(@Validated @RequestBody SettingSearchValidate searchValidate) { + iSettingSearchService.setConfig(searchValidate); + return AjaxResult.success("操作成功"); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingSmsController.java b/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingSmsController.java new file mode 100644 index 0000000..a2345e9 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingSmsController.java @@ -0,0 +1,48 @@ +package com.yj.admin.controller.setting; + +import com.alibaba.fastjson2.JSONObject; +import com.yj.admin.aop.Log; +import com.yj.admin.service.ISettingSmsService; +import com.yj.common.core.AjaxResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; + +/** + * 短信设置管理 + */ +@RestController +@RequestMapping("/adminapi/notice.sms_config") +@Api(tags = "配置短信引擎") +public class SettingSmsController { + + @Resource + ISettingSmsService iSettingSmsService; + + @GetMapping("/getConfig") + @ApiOperation(value="短信引擎列表") + public AjaxResult>> getConfig() { + List> list = iSettingSmsService.getConfig(); + return AjaxResult.success(list); + } + + @GetMapping("/detail") + @ApiOperation(value="短信引擎详情") + public AjaxResult> detail(String type) { + Map map = iSettingSmsService.detail(type); + return AjaxResult.success(map); + } + + @Log(title = "短信引擎编辑") + @PostMapping("/setConfig") + @ApiOperation(value="短信引擎编辑") + public AjaxResult setConfig(@RequestBody JSONObject params) { + iSettingSmsService.setConfig(params); + return AjaxResult.success("操作成功"); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingStorageController.java b/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingStorageController.java new file mode 100644 index 0000000..d905eb2 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingStorageController.java @@ -0,0 +1,57 @@ +package com.yj.admin.controller.setting; + +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.yj.admin.aop.Log; +import com.yj.admin.service.ISettingStorageService; +import com.yj.common.core.AjaxResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/adminapi/setting.storage") +@Api(tags = "配置存储方式") +public class SettingStorageController { + + @Resource + ISettingStorageService iSettingStorageService; + + @GetMapping("/lists") + @ApiOperation(value="存储列表") + public AjaxResult>> list() { + List> list = iSettingStorageService.list(); + return AjaxResult.success(list); + } + + @GetMapping("/detail") + @ApiOperation(value="存储详情") + public AjaxResult> detail(String engine) { + Map map = iSettingStorageService.detail(engine); + return AjaxResult.success(map); + } + + @Log(title = "存储编辑") + @PostMapping("/setup") + @ApiOperation(value="存储编辑") + public AjaxResult setup(@RequestBody Map params) { + iSettingStorageService.setup(params); + return AjaxResult.success(); + } + + @Log(title = "存储切换") + @PostMapping("/change") + @ApiOperation(value="存储切换") + public AjaxResult change(@RequestBody Map params) { + Assert.notNull(params.get("alias"), "alias参数缺失"); + Assert.notNull(params.get("status"), "status参数缺失"); + String alias = params.get("alias"); + Integer status = Integer.parseInt(params.get("status")); + iSettingStorageService.change(alias, status); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingUserController.java b/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingUserController.java new file mode 100644 index 0000000..6328ac6 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingUserController.java @@ -0,0 +1,38 @@ +package com.yj.admin.controller.setting; + +import com.yj.admin.aop.Log; +import com.yj.admin.service.ISettingUserService; +import com.yj.admin.validate.setting.SettingUserValidate; +import com.yj.admin.vo.setting.SettingUserVo; +import com.yj.common.core.AjaxResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/adminapi/setting.user.user") +@Api(tags = "配置用户参数") +public class SettingUserController { + + @Resource + ISettingUserService iSettingUserService; + + @GetMapping("/getConfig") + @ApiOperation(value="用户设置详情") + public AjaxResult detail() { + SettingUserVo vo = iSettingUserService.getConfig(); + return AjaxResult.success(vo); + } + + @Log(title = "用户设置编辑") + @PostMapping("/setConfig") + @ApiOperation(value="用户设置编辑") + public AjaxResult setConfig(@Validated @RequestBody SettingUserValidate userValidate) { + iSettingUserService.setConfig(userValidate); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingWebsiteController.java b/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingWebsiteController.java new file mode 100644 index 0000000..e2547b3 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/setting/SettingWebsiteController.java @@ -0,0 +1,103 @@ +package com.yj.admin.controller.setting; + +import com.yj.admin.aop.Log; +import com.yj.admin.service.ISettingCopyrightService; +import com.yj.admin.service.ISettingProtocolService; +import com.yj.admin.service.ISettingWebsiteService; +import com.yj.admin.validate.setting.SettingCopyrightValidate; +import com.yj.admin.validate.setting.SettingAgreementValidate; +import com.yj.admin.validate.setting.SettingSiteStatisticsValidate; +import com.yj.admin.validate.setting.SettingWebsiteValidate; +import com.yj.admin.vo.setting.SettingCopyrightVo; +import com.yj.admin.vo.setting.SettingAgreementVo; +import com.yj.admin.vo.setting.SettingSiteStatisticsVo; +import com.yj.admin.vo.setting.SettingWebsiteVo; +import com.yj.common.core.AjaxResult; +import com.yj.common.util.ConfigUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +@RestController +@RequestMapping("adminapi/setting.web.web_setting") +@Api(tags = "配置网站信息") +public class SettingWebsiteController { + + @Resource + ISettingWebsiteService iSettingWebsiteService; + + @Resource + ISettingCopyrightService iSettingCopyrightService; + + @Resource + ISettingProtocolService iSettingProtocolService; + + @GetMapping("/getWebsite") + @ApiOperation(value="网站配置信息") + public AjaxResult getWebsite() { + SettingWebsiteVo detail = iSettingWebsiteService.getWebsite(); + return AjaxResult.success(detail); + } + + @Log(title = "网站配置编辑") + @PostMapping("/setWebsite") + @ApiOperation(value="网站配置编辑") + public AjaxResult setWebsite(@Validated @RequestBody SettingWebsiteValidate websiteValidate) { + iSettingWebsiteService.setWebsite(websiteValidate); + return AjaxResult.success(); + } + + + + @GetMapping("/getCopyright") + @ApiOperation(value="网站版权信息") + public AjaxResult> getCopyright() { + List list = iSettingCopyrightService.getCopyright(); + return AjaxResult.success(list); + } + + @Log(title = "网站版权编辑") + @PostMapping("/setCopyright") + @ApiOperation(value="网站版权编辑") + public AjaxResult setCopyright(@Validated @RequestBody SettingCopyrightValidate copyrightValidate) { + iSettingCopyrightService.setCopyright(copyrightValidate); + return AjaxResult.success(); + } + + @GetMapping("/getAgreement") + @ApiOperation(value="政策协议信息") + public AjaxResult getAgreement() { + SettingAgreementVo detail = iSettingProtocolService.getAgreement(); + return AjaxResult.success(detail); + } + + @Log(title = "政策协议编辑") + @PostMapping("/setAgreement") + @ApiOperation(value="政策协议编辑") + public AjaxResult setAgreement(@Validated @RequestBody SettingAgreementValidate protocolValidate) { + iSettingProtocolService.setAgreement(protocolValidate); + return AjaxResult.success(); + } + + + @GetMapping("/getSiteStatistics") + @ApiOperation(value="获取站点统计配置") + public AjaxResult getSiteStatistics() { + SettingSiteStatisticsVo vo = new SettingSiteStatisticsVo(); + vo.setClarityCode(ConfigUtils.get("siteStatistics", "clarity_code", "")); + return AjaxResult.success(vo); + } + + @Log(title = "站点统计配置") + @PostMapping("/setSiteStatistics") + @ApiOperation(value="站点统计配置") + public AjaxResult setSiteStatistics(@Validated @RequestBody SettingSiteStatisticsValidate settingSiteStatisticsValidate) { + ConfigUtils.set("siteStatistics", "clarity_code", settingSiteStatisticsValidate.getClarityCode()); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/system/DeptController.java b/yj-admin/src/main/java/com/yj/admin/controller/system/DeptController.java new file mode 100644 index 0000000..582721d --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/system/DeptController.java @@ -0,0 +1,71 @@ +package com.yj.admin.controller.system; + +import com.alibaba.fastjson2.JSONArray; +import com.yj.admin.service.system.IDeptService; +import com.yj.common.aop.NotPower; +import com.yj.admin.validate.commons.IdValidate; +import com.yj.admin.validate.system.DeptCreateValidate; +import com.yj.admin.validate.system.DeptSearchValidate; +import com.yj.admin.validate.system.DeptUpdateValidate; +import com.yj.admin.vo.system.DeptVo; +import com.yj.common.core.AjaxResult; +import com.yj.common.validator.annotation.IDMust; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/adminapi/dept.dept") +@Api(tags = "系统部门管理") +public class DeptController { + + @Resource + IDeptService deptService; + + @NotPower + @GetMapping("/all") + @ApiOperation(value="部门所有") + public AjaxResult all() { + JSONArray list = deptService.all(); + return AjaxResult.success(list); + } + + @GetMapping("/lists") + @ApiOperation(value="部门列表") + public AjaxResult list(@Validated DeptSearchValidate searchValidate) { + JSONArray list = deptService.list(searchValidate); + return AjaxResult.success(list); + } + + @GetMapping("/detail") + @ApiOperation(value="部门详情") + public AjaxResult detail(@Validated @IDMust() @RequestParam("id") Integer id) { + DeptVo vo = deptService.detail(id); + return AjaxResult.success(vo); + } + + @PostMapping("/add") + @ApiOperation(value="部门新增") + public AjaxResult add(@Validated @RequestBody DeptCreateValidate createValidate) { + deptService.add(createValidate); + return AjaxResult.success(); + } + + @PostMapping("/edit") + @ApiOperation(value="部门编辑") + public AjaxResult edit(@Validated @RequestBody DeptUpdateValidate updateValidate) { + deptService.edit(updateValidate); + return AjaxResult.success(); + } + + @PostMapping("/delete") + @ApiOperation(value="部门删除") + public AjaxResult del(@Validated @RequestBody IdValidate idValidate) { + deptService.del(idValidate.getId()); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/system/JobsController.java b/yj-admin/src/main/java/com/yj/admin/controller/system/JobsController.java new file mode 100644 index 0000000..232c129 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/system/JobsController.java @@ -0,0 +1,87 @@ +package com.yj.admin.controller.system; + +import com.alibaba.fastjson2.JSONObject; +import com.yj.admin.service.system.IJobsService; +import com.yj.common.aop.NotPower; +import com.yj.admin.validate.commons.IdValidate; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.system.JobsCreateValidate; +import com.yj.admin.validate.system.JobsSearchValidate; +import com.yj.admin.validate.system.JobsUpdateValidate; +import com.yj.admin.vo.system.JobsVo; +import com.yj.common.core.AjaxResult; +import com.yj.common.core.PageResult; +import com.yj.common.enums.ErrorEnum; +import com.yj.common.util.StringUtils; +import com.yj.common.validator.annotation.IDMust; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +@RestController +@RequestMapping("/adminapi/dept.jobs") +@Api(tags = "系统岗位管理") +public class JobsController { + + @Resource + IJobsService iJobsService; + + @NotPower + @GetMapping("/all") + @ApiOperation(value="所有岗位") + public AjaxResult> all() { + List list = iJobsService.all(); + return AjaxResult.success(list); + } + + @GetMapping("/lists") + @ApiOperation(value="岗位列表") + public AjaxResult list(@Validated PageValidate pageValidate, + @Validated JobsSearchValidate searchValidate) { + if (StringUtils.isNotNull(searchValidate.getExport()) && searchValidate.getExport().equals(1)) { + JSONObject ret = iJobsService.getExportData(pageValidate, searchValidate); + return AjaxResult.success(ret); + } else if (StringUtils.isNotNull(searchValidate.getExport()) && searchValidate.getExport().equals(2)) { + String path = iJobsService.export(searchValidate); + return AjaxResult.success(2, new JSONObject() {{ + put("url", path); + }}, ErrorEnum.SHOW_MSG.getCode()); + } else { + PageResult list = iJobsService.list(pageValidate, searchValidate); + return AjaxResult.success(list); + } + } + + @GetMapping("/detail") + @ApiOperation(value="岗位详情") + public AjaxResult detail(@Validated @IDMust() @RequestParam("id") Integer id) { + JobsVo vo = iJobsService.detail(id); + return AjaxResult.success(vo); + } + + @PostMapping("/add") + @ApiOperation(value="岗位新增") + public AjaxResult add(@Validated @RequestBody JobsCreateValidate createValidate) { + iJobsService.add(createValidate); + return AjaxResult.success(); + } + + @PostMapping("/edit") + @ApiOperation(value="岗位编辑") + public AjaxResult edit(@Validated @RequestBody JobsUpdateValidate updateValidate) { + iJobsService.edit(updateValidate); + return AjaxResult.success(); + } + + @PostMapping("/delete") + @ApiOperation(value="岗位删除") + public AjaxResult del(@Validated @RequestBody IdValidate idValidate) { + iJobsService.del(idValidate.getId()); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/system/SystemAuthAdminController.java b/yj-admin/src/main/java/com/yj/admin/controller/system/SystemAuthAdminController.java new file mode 100644 index 0000000..1f9c2b9 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/system/SystemAuthAdminController.java @@ -0,0 +1,116 @@ +package com.yj.admin.controller.system; + +import com.alibaba.fastjson2.JSONObject; +import com.yj.admin.LikeAdminThreadLocal; +import com.yj.admin.aop.Log; +import com.yj.common.aop.NotPower; +import com.yj.admin.service.admin.IAdminService; +import com.yj.admin.validate.commons.IdValidate; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.system.SystemAdminCreateValidate; +import com.yj.admin.validate.system.SystemAdminSearchValidate; +import com.yj.admin.validate.system.SystemAdminUpInfoValidate; +import com.yj.admin.validate.system.SystemAdminUpdateValidate; +import com.yj.admin.vo.system.SystemAuthAdminDetailVo; +import com.yj.admin.vo.system.SystemAuthAdminListedVo; +import com.yj.admin.vo.system.SystemAuthAdminSelvesVo; +import com.yj.common.core.AjaxResult; +import com.yj.common.core.PageResult; +import com.yj.common.enums.ErrorEnum; +import com.yj.common.util.StringUtils; +import com.yj.common.validator.annotation.IDMust; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/adminapi/auth.admin") +@Api(tags = "系统用户管理") +public class SystemAuthAdminController { + + @Resource + IAdminService iSystemAuthAdminService; + + @GetMapping("/lists") + @ApiOperation(value="管理员列表") + public AjaxResult list(@Validated PageValidate pageValidate, + @Validated SystemAdminSearchValidate searchValidate) { + if (StringUtils.isNotNull(searchValidate.getExport()) && searchValidate.getExport().equals(1)) { + JSONObject ret = iSystemAuthAdminService.getExportData(pageValidate, searchValidate); + return AjaxResult.success(ret); + } else if (StringUtils.isNotNull(searchValidate.getExport()) && searchValidate.getExport().equals(2)) { + String path = iSystemAuthAdminService.export(searchValidate); + return AjaxResult.success(2, new JSONObject() {{ + put("url", path); + }}, ErrorEnum.SHOW_MSG.getCode()); + } else { + PageResult list = iSystemAuthAdminService.list(pageValidate, searchValidate); + return AjaxResult.success(list); + } + } + + @NotPower + @GetMapping("/self") + @ApiOperation(value="管理员信息") + public AjaxResult self() { + Integer adminId = LikeAdminThreadLocal.getAdminId(); + SystemAuthAdminSelvesVo vo = iSystemAuthAdminService.self(adminId); + return AjaxResult.success(vo); + } + + @GetMapping("/detail") + @ApiOperation(value="管理员详情") + public AjaxResult detail(@Validated @IDMust() @RequestParam("id") Integer id) { + SystemAuthAdminDetailVo vo = iSystemAuthAdminService.detail(id); + return AjaxResult.success(vo); + } + + @Log(title = "管理员新增") + @PostMapping("/add") + @ApiOperation(value="管理员新增") + public AjaxResult add(@Validated @RequestBody SystemAdminCreateValidate createValidate) { + iSystemAuthAdminService.add(createValidate); + return AjaxResult.success(); + } + + @Log(title = "管理员编辑") + @PostMapping("/edit") + @ApiOperation(value="管理员编辑") + public AjaxResult edit(@Validated @RequestBody SystemAdminUpdateValidate updateValidate) { + Integer adminId = LikeAdminThreadLocal.getAdminId(); + iSystemAuthAdminService.edit(updateValidate, adminId); + return AjaxResult.success(); + } + + @NotPower + @Log(title = "管理员更新") + @PostMapping("/upInfo") + @ApiOperation(value="当前管理员更新") + public AjaxResult upInfo(@Validated @RequestBody SystemAdminUpInfoValidate upInfoValidate) { + Integer adminId = LikeAdminThreadLocal.getAdminId(); + iSystemAuthAdminService.upInfo(upInfoValidate, adminId); + return AjaxResult.success(); + } + + @Log(title = "管理员删除") + @PostMapping("/delete") + @ApiOperation(value="管理员删除") + public AjaxResult del(@Validated @RequestBody IdValidate idValidate) { + Integer adminId = LikeAdminThreadLocal.getAdminId(); + iSystemAuthAdminService.del(idValidate.getId(), adminId); + return AjaxResult.success(); + } + + @Log(title = "管理员状态") + @PostMapping("/disable") + @ApiOperation(value="管理员状态切换") + public AjaxResult disable(@Validated @RequestBody IdValidate idValidate) { + Integer adminId = LikeAdminThreadLocal.getAdminId(); + iSystemAuthAdminService.disable(idValidate.getId(), adminId); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/system/SystemAuthMenuController.java b/yj-admin/src/main/java/com/yj/admin/controller/system/SystemAuthMenuController.java new file mode 100644 index 0000000..fa69d5b --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/system/SystemAuthMenuController.java @@ -0,0 +1,97 @@ +package com.yj.admin.controller.system; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.yj.admin.LikeAdminThreadLocal; +import com.yj.admin.aop.Log; +import com.yj.common.aop.NotPower; +import com.yj.admin.service.system.ISystemMenuService; +import com.yj.admin.validate.commons.IdValidate; +import com.yj.admin.validate.system.SystemMenuCreateValidate; +import com.yj.admin.validate.system.SystemMenuUpdateValidate; +import com.yj.admin.vo.system.SystemAuthMenuVo; +import com.yj.common.core.AjaxResult; +import com.yj.common.validator.annotation.IDMust; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +@RestController +@RequestMapping("/adminapi/auth.menu") +@Api(tags = "系统菜单管理") +public class SystemAuthMenuController { + + @Resource + ISystemMenuService iSystemAuthMenuService; + + @NotPower + @GetMapping("/route") + @ApiOperation(value="获取菜单路由") + public AjaxResult route() { + List roleIds = LikeAdminThreadLocal.getRoleIds(); + JSONArray lists = iSystemAuthMenuService.selectMenuByRoleId(roleIds); + return AjaxResult.success(lists); + } + + @NotPower + @GetMapping("/lists") + @ApiOperation(value="获取菜单列表") + public AjaxResult list() { + JSONObject result = iSystemAuthMenuService.list(); + return AjaxResult.success(result); + } + + @NotPower + @GetMapping("/systemMenuLists") + @ApiOperation(value="获取菜单列表") + public AjaxResult systemMenuLists() { + JSONArray result = iSystemAuthMenuService.systemMenuLists(); + return AjaxResult.success(result); + } + + + + @NotPower + @GetMapping("/all") + @ApiOperation(value="获取菜单列表") + public AjaxResult all() { + JSONArray result = iSystemAuthMenuService.all(); + return AjaxResult.success(result); + } + + @GetMapping("/detail") + @ApiOperation(value="获取菜单详情") + public AjaxResult detail(@Validated @IDMust() @RequestParam("id") Integer id) { + SystemAuthMenuVo vo = iSystemAuthMenuService.detail(id); + return AjaxResult.success(vo); + } + + @Log(title = "菜单新增") + @PostMapping("/add") + @ApiOperation(value="新增菜单") + public AjaxResult add(@Validated @RequestBody SystemMenuCreateValidate createValidate) { + iSystemAuthMenuService.add(createValidate); + return AjaxResult.success(); + } + + @Log(title = "菜单编辑") + @PostMapping("/edit") + @ApiOperation(value="菜单编辑") + public AjaxResult edit(@Validated @RequestBody SystemMenuUpdateValidate updateValidate) { + iSystemAuthMenuService.edit(updateValidate); + return AjaxResult.success(); + } + + @Log(title = "菜单删除") + @PostMapping("/delete") + @ApiOperation(value="菜单删除") + public AjaxResult del(@Validated @RequestBody IdValidate idValidate) { + iSystemAuthMenuService.del(idValidate.getId()); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/system/SystemAuthRoleController.java b/yj-admin/src/main/java/com/yj/admin/controller/system/SystemAuthRoleController.java new file mode 100644 index 0000000..7e070ed --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/system/SystemAuthRoleController.java @@ -0,0 +1,78 @@ +package com.yj.admin.controller.system; + +import com.yj.admin.aop.Log; +import com.yj.common.aop.NotPower; +import com.yj.admin.service.system.ISystemRoleService; +import com.yj.admin.validate.commons.IdValidate; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.system.SystemRoleCreateValidate; +import com.yj.admin.validate.system.SystemRoleUpdateValidate; +import com.yj.admin.vo.system.SystemAuthRoleVo; +import com.yj.common.core.AjaxResult; +import com.yj.common.core.PageResult; +import com.yj.common.validator.annotation.IDMust; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +@RestController +@RequestMapping("/adminapi/auth.role") +@Api(tags = "系统角色管理") +public class SystemAuthRoleController { + + @Resource + ISystemRoleService iSystemAuthRoleService; + + @NotPower + @GetMapping("/all") + @ApiOperation(value="所有角色") + public AjaxResult> all() { + List list = iSystemAuthRoleService.all(); + return AjaxResult.success(list); + } + + @Log(title = "角色列表") + @GetMapping("/lists") + @ApiOperation(value="角色列表") + public AjaxResult> list(@Validated PageValidate pageValidate) { + PageResult list = iSystemAuthRoleService.list(pageValidate); + return AjaxResult.success(list); + } + + @Log(title = "角色详情") + @GetMapping("/detail") + @ApiOperation(value="角色详情") + public AjaxResult detail(@Validated @IDMust() @RequestParam("id") Integer id) { + SystemAuthRoleVo vo = iSystemAuthRoleService.detail(id); + return AjaxResult.success(vo); + } + + @Log(title = "角色新增") + @PostMapping("/add") + @ApiOperation(value="角色新增") + public AjaxResult add(@Validated @RequestBody SystemRoleCreateValidate createValidate) { + iSystemAuthRoleService.add(createValidate); + return AjaxResult.success(); + } + + @Log(title = "角色编辑") + @PostMapping("/edit") + @ApiOperation(value="角色编辑") + public AjaxResult edit(@Validated @RequestBody SystemRoleUpdateValidate updateValidate) { + iSystemAuthRoleService.edit(updateValidate); + return AjaxResult.success(); + } + + @Log(title = "角色删除") + @PostMapping("/delete") + @ApiOperation(value="角色删除") + public AjaxResult del(@Validated @RequestBody IdValidate idValidate) { + iSystemAuthRoleService.del(idValidate.getId()); + return AjaxResult.success(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/system/SystemCacheController.java b/yj-admin/src/main/java/com/yj/admin/controller/system/SystemCacheController.java new file mode 100644 index 0000000..a466d79 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/system/SystemCacheController.java @@ -0,0 +1,30 @@ +package com.yj.admin.controller.system; + + +import com.yj.admin.aop.Log; +import com.yj.admin.service.system.ISystemCacheService; +import com.yj.common.core.AjaxResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/adminapi/setting.system.cache") +@Api(tags = "系统缓存管理") +public class SystemCacheController { + + @Resource + ISystemCacheService iSystemCacheService; + + @Log(title = "清除系统缓存") + @PostMapping("/clear") + @ApiOperation(value = "清除系统缓存") + public AjaxResult clear() { + iSystemCacheService.clear(); + return AjaxResult.success(); + } + + +} diff --git a/yj-admin/src/main/java/com/yj/admin/controller/system/SystemLogsController.java b/yj-admin/src/main/java/com/yj/admin/controller/system/SystemLogsController.java new file mode 100644 index 0000000..0bca8f5 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/controller/system/SystemLogsController.java @@ -0,0 +1,44 @@ +package com.yj.admin.controller.system; + +import com.yj.admin.service.system.ISystemLogsServer; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.system.SystemSearchLoginsValidate; +import com.yj.admin.validate.system.SystemSearchOperateValidate; +import com.yj.admin.vo.system.SystemLogLoginVo; +import com.yj.admin.vo.system.SystemLogOperateVo; +import com.yj.common.core.AjaxResult; +import com.yj.common.core.PageResult; +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.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/adminapi/setting.system.log") +@Api(tags = "系统日志管理") +public class SystemLogsController { + + @Resource + ISystemLogsServer iSystemLogsServer; + + @GetMapping("/lists") + @ApiOperation(value="系统操作日志") + public AjaxResult> lists(@Validated PageValidate pageValidate, + @Validated SystemSearchOperateValidate searchValidate) { + PageResult list = iSystemLogsServer.operate(pageValidate, searchValidate); + return AjaxResult.success(list); + } + + @GetMapping("/login") + @ApiOperation(value="系统登录日志") + public AjaxResult> login(@Validated PageValidate pageValidate, + @Validated SystemSearchLoginsValidate searchValidate) { + PageResult list = iSystemLogsServer.login(pageValidate, searchValidate); + return AjaxResult.success(list); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/crontab/MyJob.java b/yj-admin/src/main/java/com/yj/admin/crontab/MyJob.java new file mode 100644 index 0000000..5b00218 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/crontab/MyJob.java @@ -0,0 +1,17 @@ +package com.yj.admin.crontab; + + +import org.springframework.stereotype.Component; + + +/** + * 具体的定时任务 + */ +@Component("myJob") +public class MyJob { + + public void handle(String s) { + System.out.println("有参数定时任务执行逻辑 : " + s); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/IArtCateService.java b/yj-admin/src/main/java/com/yj/admin/service/IArtCateService.java new file mode 100644 index 0000000..0b46c7c --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/IArtCateService.java @@ -0,0 +1,75 @@ +package com.yj.admin.service; + +import com.yj.admin.validate.article.ArtCateCreateValidate; +import com.yj.admin.validate.article.ArtCateUpdateValidate; +import com.yj.admin.validate.article.ArtCateSearchValidate; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.vo.article.ArticleCateVo; +import com.yj.common.core.PageResult; + +import java.util.List; + +/** + * 文章分类服接口务类 + */ +public interface IArtCateService { + + /** + * 分类所有 + * + * @author fzr + * @return List + */ + List all(); + + /** + * 分类列表 + * + * @author fzr + * @param pageValidate 分页参数 + * @param searchValidate 搜索参数 + * @return PageResult + */ + PageResult list(PageValidate pageValidate, ArtCateSearchValidate searchValidate); + + /** + * 分类详情 + * + * @author fzr + * @param id 分类ID + */ + ArticleCateVo detail(Integer id); + + /** + * 分类新增 + * + * @author fzr + * @param createValidate 参数 + */ + void add(ArtCateCreateValidate createValidate); + + /** + * 分类编辑 + * + * @author fzr + * @param updateValidate 参数 + */ + void edit(ArtCateUpdateValidate updateValidate); + + /** + * 分类删除 + * + * @author fzr + * @param id 分类ID + */ + void del(Integer id); + + /** + * 分类状态 + * + * @author fzr + * @param id 分类ID + */ + void change(Integer id); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/IArticleService.java b/yj-admin/src/main/java/com/yj/admin/service/IArticleService.java new file mode 100644 index 0000000..aa6806d --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/IArticleService.java @@ -0,0 +1,66 @@ +package com.yj.admin.service; + +import com.yj.admin.validate.article.ArticleCreateValidate; +import com.yj.admin.validate.article.ArticleSearchValidate; +import com.yj.admin.validate.article.ArticleUpdateValidate; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.vo.article.ArticleDetailVo; +import com.yj.admin.vo.article.ArticleListedVo; +import com.yj.common.core.PageResult; + +/** + * 文章服务接口类 + */ +public interface IArticleService { + + /** + * 文章列表 + * + * @author fzr + * @param pageValidate 分页参数 + * @param searchValidate 搜索参数 + * @return PageResult + */ + PageResult list(PageValidate pageValidate, ArticleSearchValidate searchValidate); + + /** + * 文章详情 + * + * @author fzr + * @param id 主键ID + */ + ArticleDetailVo detail(Integer id); + + /** + * 文章新增 + * + * @author fzr + * @param createValidate 参数 + */ + void add(ArticleCreateValidate createValidate); + + /** + * 文章编辑 + * + * @author fzr + * @param updateValidate 参数 + */ + void edit(ArticleUpdateValidate updateValidate); + + /** + * 文章删除 + * + * @author fzr + * @param id 文章主键 + */ + void del(Integer id); + + /** + * 文章状态 + * + * @author fzr + * @param id 文章主键 + */ + void change(Integer id); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/IChannelH5ConfigService.java b/yj-admin/src/main/java/com/yj/admin/service/IChannelH5ConfigService.java new file mode 100644 index 0000000..d6bdc4c --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/IChannelH5ConfigService.java @@ -0,0 +1,27 @@ +package com.yj.admin.service; + +import com.yj.admin.validate.channel.ChannelH5Validate; +import com.yj.admin.vo.channel.ChannelH5Vo; + +/** + * H5渠道设置服务接口类 + */ +public interface IChannelH5ConfigService { + + /** + * H5设置详情 + * + * @author fzr + * @return ChannelH5Vo + */ + ChannelH5Vo getConfig(); + + /** + * H5设置保存 + * + * @author fzr + * @param channelH5Validate 参数 + */ + void setConfig(ChannelH5Validate channelH5Validate); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/IChannelMpConfigService.java b/yj-admin/src/main/java/com/yj/admin/service/IChannelMpConfigService.java new file mode 100644 index 0000000..faa8f7c --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/IChannelMpConfigService.java @@ -0,0 +1,27 @@ +package com.yj.admin.service; + +import com.yj.admin.validate.channel.ChannelMpValidate; +import com.yj.admin.vo.channel.ChannelMpVo; + +/** + * 微信小程序渠道服务接口类 + */ +public interface IChannelMpConfigService { + + /** + * 微信小程序设置详情 + * + * @author fzr + * @return ChannelMpVo + */ + ChannelMpVo getConfig(); + + /** + * 微信小程序设置保存 + * + * @author fzr + * @param channelMpValidate 参数 + */ + void setConfig(ChannelMpValidate channelMpValidate); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/IChannelOaCallBackService.java b/yj-admin/src/main/java/com/yj/admin/service/IChannelOaCallBackService.java new file mode 100644 index 0000000..4faa390 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/IChannelOaCallBackService.java @@ -0,0 +1,29 @@ +package com.yj.admin.service; + + +/** + * 公众号服务器回调 + */ +public interface IChannelOaCallBackService { + + + /** + * 服务器验证 + */ + String checkSignature(String signature, String timestamp, String nonce, String echostr); + + + /** + * 消息回复 + * + * @param requestBody + * @param signature + * @param timestamp + * @param nonce + * @param encType + * @param msgSignature + * @return + */ + String post(String requestBody, String signature, String timestamp, String nonce, String encType, String msgSignature); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/IChannelOaConfigService.java b/yj-admin/src/main/java/com/yj/admin/service/IChannelOaConfigService.java new file mode 100644 index 0000000..f0ad85e --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/IChannelOaConfigService.java @@ -0,0 +1,28 @@ +package com.yj.admin.service; + +import com.yj.admin.validate.channel.ChannelOaValidate; +import com.yj.admin.vo.channel.ChannelOaVo; + + +/** + * 公众号渠道设置服务接口类 + */ +public interface IChannelOaConfigService { + + /** + * 公众号设置详情 + * + * @author fzr + * @return ChannelOaVo + */ + ChannelOaVo getConfig(); + + /** + * 公众号设置保存 + * + * @author fzr + * @param channelOaValidate 参数 + */ + void setConfig(ChannelOaValidate channelOaValidate); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/IChannelOaMenusService.java b/yj-admin/src/main/java/com/yj/admin/service/IChannelOaMenusService.java new file mode 100644 index 0000000..592fb18 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/IChannelOaMenusService.java @@ -0,0 +1,30 @@ +package com.yj.admin.service; + +import com.alibaba.fastjson2.JSONArray; + +import java.util.List; + + +/** + * 公众号菜单服务接口类 + */ +public interface IChannelOaMenusService { + + /** + * 菜单详情 + * + * @author fzr + * @return JSONArray + */ + JSONArray detail(); + + /** + * 菜单保存 + * + * @author fzr + * @param params 参数 + * @param isPublish 是否发布 + */ + void save(List params, Boolean isPublish); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/IChannelOaReplyService.java b/yj-admin/src/main/java/com/yj/admin/service/IChannelOaReplyService.java new file mode 100644 index 0000000..d554ece --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/IChannelOaReplyService.java @@ -0,0 +1,63 @@ +package com.yj.admin.service; + +import com.yj.admin.validate.channel.ChannelRpValidate; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.vo.channel.ChannelRpVo; +import com.yj.common.core.PageResult; + +/** + * 公众号默认回复服务接口类 + */ +public interface IChannelOaReplyService { + + /** + * 默认回复列表 + * + * @author fzr + * @param pageValidate 分页参数 + * @return PageResult + */ + PageResult list(PageValidate pageValidate, Integer replyType); + + /** + * 默认回复详情 + * + * @author fzr + * @param id 主键 + * @return ChannelRpDefaultVo + */ + ChannelRpVo detail(Integer id); + + /** + * 默认回复新增 + * + * @author fzr + * @param defaultValidate 参数 + */ + void add(ChannelRpValidate defaultValidate); + + /** + * 默认回复编辑 + * + * @author fzr + * @param defaultValidate 参数 + */ + void edit(ChannelRpValidate defaultValidate); + + /** + * 默认回复删除 + * + * @author fzr + * @param id 主键 + */ + void del(Integer id); + + /** + * 默认回复状态 + * + * @author fzr + * @param id 主键 + */ + void status(Integer id); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/IChannelOpService.java b/yj-admin/src/main/java/com/yj/admin/service/IChannelOpService.java new file mode 100644 index 0000000..43d1bf9 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/IChannelOpService.java @@ -0,0 +1,27 @@ +package com.yj.admin.service; + +import com.yj.admin.validate.channel.ChannelOpValidate; +import com.yj.admin.vo.channel.ChannelOpVo; + +/** + * 微信开放渠道设置接口服务类 + */ +public interface IChannelOpService { + + /** + * 开放平台设置详情 + * + * @author fzr + * @return ChannelOpVo + */ + ChannelOpVo getConfig(); + + /** + * 开放平台设置保存 + * + * @author fzr + * @param opValidate 参数 + */ + void setConfig(ChannelOpValidate opValidate); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/ICrontabService.java b/yj-admin/src/main/java/com/yj/admin/service/ICrontabService.java new file mode 100644 index 0000000..76740ff --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/ICrontabService.java @@ -0,0 +1,58 @@ +package com.yj.admin.service; + +import com.yj.admin.validate.crontab.CrontabCreateValidate; +import com.yj.admin.validate.crontab.CrontabUpdateValidate; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.vo.CrontabDetailVo; +import com.yj.admin.vo.CrontabListedVo; +import com.yj.common.core.PageResult; +import org.quartz.SchedulerException; + +/** + * 计划任务服务接口类 + */ +public interface ICrontabService { + + /** + * 计划任务列表 + * + * @author fzr + * @param pageValidate 分页参数 + * @return PageResult + */ + PageResult list(PageValidate pageValidate); + + /** + * 计划任务详情 + * + * @author fzr + * @param id 主键 + * @return CrontabDetailVo + */ + CrontabDetailVo detail(Integer id); + + /** + * 计划任务新增 + * + * @author fzr + * @param createValidate 参数 + */ + void add(CrontabCreateValidate createValidate) throws SchedulerException; + + /** + * 计划任务编辑 + * + * @author fzr + * @param updateValidate 参数 + */ + void edit(CrontabUpdateValidate updateValidate) throws SchedulerException; + + /** + * 计划任务删除 + * + * @author fzr + * @param id 主键 + */ + void del(Integer id) throws SchedulerException; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/IDecorateDataService.java b/yj-admin/src/main/java/com/yj/admin/service/IDecorateDataService.java new file mode 100644 index 0000000..8c9391c --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/IDecorateDataService.java @@ -0,0 +1,23 @@ +package com.yj.admin.service; + +import com.alibaba.fastjson2.JSONObject; +import com.yj.admin.vo.decorate.DecorateDataArticleVo; + +import java.util.List; + +/** + * 装修数据服务接口类 + */ +public interface IDecorateDataService { + + /** + * 获取文章数据 + * + * @author fzr + * @param limit 条数 + * @return List + */ + List article(Integer limit); + + JSONObject pc(); +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/IDecoratePageService.java b/yj-admin/src/main/java/com/yj/admin/service/IDecoratePageService.java new file mode 100644 index 0000000..4957bdb --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/IDecoratePageService.java @@ -0,0 +1,24 @@ +package com.yj.admin.service; + +import com.yj.admin.validate.decorate.DecoratePageValidate; +import com.yj.admin.vo.decorate.DecoratePageVo; + +public interface IDecoratePageService { + + /** + * 页面装修详情 + * + * @author fzr + * @param id 主键 + * @return DecoratePageVo + */ + DecoratePageVo detail(Integer id); + + /** + * 页面装修保存 + * + * @author fzr + * @param decoratePageValidate 参数 + */ + void save(DecoratePageValidate decoratePageValidate); +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/IDecorateTabbarService.java b/yj-admin/src/main/java/com/yj/admin/service/IDecorateTabbarService.java new file mode 100644 index 0000000..fa09861 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/IDecorateTabbarService.java @@ -0,0 +1,27 @@ +package com.yj.admin.service; + +import com.yj.admin.validate.decorate.DecorateTabsValidate; +import com.yj.admin.vo.decorate.DecorateTabbarVo; + +/** + * 底部导航服务接口类 + */ +public interface IDecorateTabbarService { + + /** + * 底部导航详情 + * + * @author fzr + * @return DecorateTabbarVo + */ + DecorateTabbarVo detail(); + + /** + * 底部导航保存 + * + * @author fzr + * @param tabsValidate 参数 + */ + void save(DecorateTabsValidate tabsValidate); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/IFileService.java b/yj-admin/src/main/java/com/yj/admin/service/IFileService.java new file mode 100644 index 0000000..2e85743 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/IFileService.java @@ -0,0 +1,95 @@ +package com.yj.admin.service; + +import com.alibaba.fastjson2.JSONObject; +import com.yj.admin.validate.file.FileCateValidate; +import com.yj.admin.validate.file.FileSearchValidate; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.vo.album.FileVo; +import com.yj.common.core.PageResult; + +import java.util.List; +import java.util.Map; + +/** + * 文件服务接口类 + */ +public interface IFileService { + + /** + * 文件列表 + * + * @author fzr + * @param pageValidate 分页参数 + * @param searchValidate 其他搜索参数 + * @return PageResult + */ + PageResult fileList(PageValidate pageValidate, FileSearchValidate searchValidate); + + /** + * 文件重命名 + * + * @param id 文件ID + * @param name 文件名称 + */ + void fileRename(Integer id, String name); + + /** + * 文件移动 + * + * @author fzr + * @param ids 文件ID + * @param cid 类目ID + */ + void fileMove(List ids, Integer cid); + + /** + * 文件新增 + * + * @author fzr + * @param params 文件信息参数 + */ + Integer fileAdd(Map params); + + /** + * 文件删除 + * + * @author fzr + * @param ids 文件ID + */ + void fileDel(List ids); + + /** + * 分类列表 + * + * @author fzr + * @param searchValidate 搜索参数 + * @return JSONArray + */ + JSONObject cateList(FileSearchValidate searchValidate); + + /** + * 分类新增 + * + * @author fzr + * @param cateValidate 分类参数 + */ + void cateAdd(FileCateValidate cateValidate); + + /** + * 分类编辑 + * + * @author fzr + * @param id 分类ID + * @param name 分类名称 + */ + void cateRename(Integer id, String name); + + /** + * 分类删除 + * + * @author fzr + * @param id 分类ID + */ + void cateDel(Integer id); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/IFinanceRechargerService.java b/yj-admin/src/main/java/com/yj/admin/service/IFinanceRechargerService.java new file mode 100644 index 0000000..7600881 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/IFinanceRechargerService.java @@ -0,0 +1,52 @@ +package com.yj.admin.service; + +import com.alibaba.fastjson2.JSONObject; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.finance.FinanceRechargeSearchValidate; +import com.yj.admin.vo.finance.FinanceRechargeListVo; +import com.yj.common.core.PageResult; + +/** + * 充值记录服务接口类 + */ +public interface IFinanceRechargerService { + + /** + * 充值记录 + * + * @author fzr + * @param pageValidate 分页参数 + * @param searchValidate 搜索参数 + * @return PageResult + */ + PageResult list(PageValidate pageValidate, FinanceRechargeSearchValidate searchValidate); + + /** + * 发起退款 + * + * @author fzr + * @param orderId 订单ID + * @param adminId 管理员ID + */ + void refund(Integer orderId, Integer adminId); + + /** + * 重新退款 + * + * @author fzr + * @param recordId 记录ID + * @param adminId 管理员ID + */ + void refundAgain(Integer recordId, Integer adminId); + + /** + * 返回导出格式 + * @return + */ + JSONObject getExportData(PageValidate pageValidate, FinanceRechargeSearchValidate searchValidate); + + /** + * 导出 + */ + String export(FinanceRechargeSearchValidate searchValidate); +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/IFinanceRefundService.java b/yj-admin/src/main/java/com/yj/admin/service/IFinanceRefundService.java new file mode 100644 index 0000000..92d9248 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/IFinanceRefundService.java @@ -0,0 +1,36 @@ +package com.yj.admin.service; + +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.finance.FinanceRefundSearchValidate; +import com.yj.admin.vo.finance.FinanceRefundListVo; +import com.yj.admin.vo.finance.FinanceRefundLogVo; +import com.yj.common.core.PageResult; + +import java.util.List; +import java.util.Map; + +/** + * 退款记录服务接口类 + */ +public interface IFinanceRefundService { + + /** + * 退款记录列表 + * + * @author fzr + * @param pageValidate 分页参数 + * @param searchValidate 搜索参数 + * @return PageResult + */ + PageResult list(PageValidate pageValidate, FinanceRefundSearchValidate searchValidate); + + /** + * 退款日志 + * + * @param recordId 退款日志ID + * @return List + */ + List log(Integer recordId); + + Map stat(); +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/IFinanceWalletService.java b/yj-admin/src/main/java/com/yj/admin/service/IFinanceWalletService.java new file mode 100644 index 0000000..9245df5 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/IFinanceWalletService.java @@ -0,0 +1,26 @@ +package com.yj.admin.service; + +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.finance.FinanceWalletSearchValidate; +import com.yj.admin.vo.finance.FinanceWalletListVo; +import com.yj.common.core.PageResult; + +import java.util.Map; + +/** + * 用户余额记录服务接口类 + */ +public interface IFinanceWalletService { + + /** + * 余额明细列表 + * + * @author fzr + * @param pageValidate 分页参数 + * @param searchValidate 搜索参数 + * @return PageResult + */ + PageResult list(PageValidate pageValidate, FinanceWalletSearchValidate searchValidate); + + Map getUmChangeType(); +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/IIndexService.java b/yj-admin/src/main/java/com/yj/admin/service/IIndexService.java new file mode 100644 index 0000000..ea4f1cf --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/IIndexService.java @@ -0,0 +1,25 @@ +package com.yj.admin.service; + +import java.util.Map; + +/** + * 主页服务接口类 + */ +public interface IIndexService { + + /** + * 控制台数据 + * + * @author fzr + * @return Map + */ + Map index(); + + /** + * 公共配置 + */ + Map config(); + + + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/IMarketingRechargeService.java b/yj-admin/src/main/java/com/yj/admin/service/IMarketingRechargeService.java new file mode 100644 index 0000000..815ab9b --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/IMarketingRechargeService.java @@ -0,0 +1,27 @@ +package com.yj.admin.service; + +import com.yj.admin.validate.marketing.MarketingRechargeValidate; +import com.yj.admin.vo.marketing.MarketingRechargeVo; + +/** + * 营销充值服务接口类 + */ +public interface IMarketingRechargeService { + + /** + * 充值配置详情 + * + * @author fzr + * @return MarketingRechargeVo + */ + MarketingRechargeVo detail(); + + /** + * 充值配置保存 + * + * @author fzr + * @param rechargeValidate 充值参数 + */ + void save(MarketingRechargeValidate rechargeValidate); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/ISettingCopyrightService.java b/yj-admin/src/main/java/com/yj/admin/service/ISettingCopyrightService.java new file mode 100644 index 0000000..2cdbe9f --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/ISettingCopyrightService.java @@ -0,0 +1,29 @@ +package com.yj.admin.service; + +import com.yj.admin.validate.setting.SettingCopyrightValidate; +import com.yj.admin.vo.setting.SettingCopyrightVo; + +import java.util.List; + +/** + * 网站备案服务接口类 + */ +public interface ISettingCopyrightService { + + /** + * 获取网站备案信息 + * + * @author fzr + * @return List + */ + List getCopyright(); + + /** + * 保存网站备案信息 + * + * @author fzr + * @param copyrightValidate 参数 + */ + void setCopyright(SettingCopyrightValidate copyrightValidate); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/ISettingDictDataService.java b/yj-admin/src/main/java/com/yj/admin/service/ISettingDictDataService.java new file mode 100644 index 0000000..fc761a9 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/ISettingDictDataService.java @@ -0,0 +1,68 @@ +package com.yj.admin.service; + +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.setting.DictDataCreateValidate; +import com.yj.admin.validate.setting.DictDataUpdateValidate; +import com.yj.admin.vo.setting.SettingDictDataVo; +import com.yj.common.core.PageResult; + +import java.util.List; +import java.util.Map; + +/** + * 字典数据服务接口类 + */ +public interface ISettingDictDataService { + + /** + * 字典数据所有 + * + * @author fzr + * @return List + */ + List all(Map params); + + /** + * 字典数据列表 + * + * @author fzr + * @param pageValidate 分页参数 + * @param params 搜索参数 + * @return PageResult + */ + PageResult list(PageValidate pageValidate, Map params); + + /** + * 字典数据详情 + * + * @author fzr + * @param id 主键 + * @return DictDataVo + */ + SettingDictDataVo detail(Integer id); + + /** + * 字典数据新增 + * + * @author fzr + * @param createValidate 参数 + */ + void add(DictDataCreateValidate createValidate); + + /** + * 字典数据编辑 + * + * @author fzr + * @param updateValidate 参数 + */ + void edit(DictDataUpdateValidate updateValidate); + + /** + * 字典数据删除 + * + * @author fzr + * @param ids 主键 + */ + void del(List ids); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/ISettingDictTypeService.java b/yj-admin/src/main/java/com/yj/admin/service/ISettingDictTypeService.java new file mode 100644 index 0000000..bbb5ce5 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/ISettingDictTypeService.java @@ -0,0 +1,68 @@ +package com.yj.admin.service; + +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.setting.DictTypeCreateValidate; +import com.yj.admin.validate.setting.DictTypeUpdateValidate; +import com.yj.admin.vo.setting.SettingDictTypeVo; +import com.yj.common.core.PageResult; + +import java.util.List; +import java.util.Map; + +/** + * 字典类型服务接口类 + */ +public interface ISettingDictTypeService { + + /** + * 字典类型所有 + * + * @author fzr + * @return List + */ + List all(); + + /** + * 字典类型列表 + * + * @author fzr + * @param pageValidate 分页参数 + * @param params 搜索参数 + * @return PageResult + */ + PageResult list(PageValidate pageValidate, Map params); + + /** + * 字典类型详情 + * + * @author fzr + * @param id 主键 + * @return DictDataVo + */ + SettingDictTypeVo detail(Integer id); + + /** + * 字典类型新增 + * + * @author fzr + * @param createValidate 参数 + */ + void add(DictTypeCreateValidate createValidate); + + /** + * 字典类型编辑 + * + * @author fzr + * @param updateValidate 参数 + */ + void edit(DictTypeUpdateValidate updateValidate); + + /** + * 字典类型删除 + * + * @author fzr + * @param ids 主键 + */ + void del(Integer ids); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/ISettingLoginService.java b/yj-admin/src/main/java/com/yj/admin/service/ISettingLoginService.java new file mode 100644 index 0000000..16db9f9 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/ISettingLoginService.java @@ -0,0 +1,27 @@ +package com.yj.admin.service; + +import com.yj.admin.validate.setting.SettingLoginValidate; +import com.yj.admin.vo.setting.SettingLoginVo; + +/** + * 登录设置服务接口类 + */ +public interface ISettingLoginService { + + /** + * 登录设置详情 + * + * @author fzr + * @return SettingLoginVo + */ + SettingLoginVo getRegisterConfig(); + + /** + * 登录设置保存 + * + * @author fzr + * @param loginValidate 参数 + */ + void setRegisterConfig(SettingLoginValidate loginValidate); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/ISettingNoticeService.java b/yj-admin/src/main/java/com/yj/admin/service/ISettingNoticeService.java new file mode 100644 index 0000000..7ebb92f --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/ISettingNoticeService.java @@ -0,0 +1,40 @@ +package com.yj.admin.service; + +import com.alibaba.fastjson2.JSONObject; +import com.yj.admin.vo.setting.SettingNoticeDetailVo; +import com.yj.admin.vo.setting.SettingNoticeListedVo; + +import java.util.List; + +/** + * 通知设置服务接口类 + */ +public interface ISettingNoticeService { + + /** + * 通知设置列表 + * + * @author fzr + * @param recipient 1=用户, 2=平台 + * @return List + */ + List list(Integer recipient); + + /** + * 通知设置详情 + * + * @author fzr + * @param id 主键 + * @return NoticeDetailVo + */ + SettingNoticeDetailVo detail(Integer id); + + /** + * 通知设置保存 + * + * @author fzr + * @param params 参数 + */ + void save(JSONObject params); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/ISettingPaymentService.java b/yj-admin/src/main/java/com/yj/admin/service/ISettingPaymentService.java new file mode 100644 index 0000000..7baa0a5 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/ISettingPaymentService.java @@ -0,0 +1,57 @@ +package com.yj.admin.service; + +import com.alibaba.fastjson2.JSONObject; +import com.yj.admin.validate.setting.SettingPayConfigValidate; +import com.yj.admin.vo.setting.SettingPaymentMethodVo; +import com.yj.common.entity.setting.DevPayConfig; + +import java.util.HashMap; +import java.util.List; + +/** + * 支付配置服务接口类 + */ +public interface ISettingPaymentService { + + /** + * 支付方式 + * + * @author fzr + * @return List> + */ + HashMap getPayWay(); + + /** + * 配置列表 + * + * @author fzr + * @return List + */ + JSONObject list(); + + /** + * 配置详情 + * + * @author fzr + * @param id 主键 + * @return SettingPaymentMethodVo + */ + DevPayConfig getConfig(Integer id); + + /** + * 编辑支付配置 + * + * @author fzr + * @param configValidate 参数 + */ + void setConfig(SettingPayConfigValidate configValidate); + + /** + * 编辑支付方式 + * + * @author fzr + * @param data 参数 + */ + void setPayWay(HashMap> data); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/ISettingProtocolService.java b/yj-admin/src/main/java/com/yj/admin/service/ISettingProtocolService.java new file mode 100644 index 0000000..0681e19 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/ISettingProtocolService.java @@ -0,0 +1,27 @@ +package com.yj.admin.service; + +import com.yj.admin.validate.setting.SettingAgreementValidate; +import com.yj.admin.vo.setting.SettingAgreementVo; + +/** + * 政策协议服务接口类 + */ +public interface ISettingProtocolService { + + /** + * 获取政策协议信息 + * + * @author fzr + * @return SettingProtocolDetailVo + */ + SettingAgreementVo getAgreement(); + + /** + * 保存政策协议信息 + * + * @author fzr + * @param protocolValidate 参数 + */ + void setAgreement(SettingAgreementValidate protocolValidate); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/ISettingSearchService.java b/yj-admin/src/main/java/com/yj/admin/service/ISettingSearchService.java new file mode 100644 index 0000000..de2fdaa --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/ISettingSearchService.java @@ -0,0 +1,28 @@ +package com.yj.admin.service; + +import com.yj.admin.validate.setting.SettingSearchValidate; +import com.yj.admin.vo.setting.SettingSearchDetailVo; + +/** + * 热门搜索服务接口类 + */ +public interface ISettingSearchService { + + /** + * 热门搜索详情 + * + * @author fzr + * @return SettingSearchDetailVo + */ + SettingSearchDetailVo getConfig(); + + /** + * 热门搜索新增 + * + * @author fzr + * @param searchValidate 参数 + */ + void setConfig(SettingSearchValidate searchValidate); + + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/ISettingSmsService.java b/yj-admin/src/main/java/com/yj/admin/service/ISettingSmsService.java new file mode 100644 index 0000000..66a9386 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/ISettingSmsService.java @@ -0,0 +1,38 @@ +package com.yj.admin.service; + +import com.alibaba.fastjson2.JSONObject; + +import java.util.List; +import java.util.Map; + +/** + * 短信配置接口类 + */ +public interface ISettingSmsService { + + /** + * 短信引擎列表 + * + * @author fzr + * @return List> + */ + List> getConfig(); + + /** + * 短信引擎详情 + * + * @author fzr + * @param alias 别名 + * @return Map + */ + Map detail(String type); + + /** + * 短信引擎保存 + * + * @author fzr + * @param params 参数 + */ + void setConfig(JSONObject params); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/ISettingStorageService.java b/yj-admin/src/main/java/com/yj/admin/service/ISettingStorageService.java new file mode 100644 index 0000000..2621ec8 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/ISettingStorageService.java @@ -0,0 +1,45 @@ +package com.yj.admin.service; + +import java.util.List; +import java.util.Map; + +/** + * 存储配置服务接口类 + */ +public interface ISettingStorageService { + + /** + * 存储列表 + * + * @author fzr + * @return List> + */ + List> list(); + + /** + * 存储详情 + * + * @author fzr + * @param alias 引擎别名 + * @return Map + */ + Map detail(String engine); + + /** + * 存储编辑 + * + * @author fzr + * @param params 参数 + */ + void setup(Map params); + + /** + * 存储切换 + * + * @author fzr + * @param alias 引擎别名 + * @param status 状态 + */ + void change(String alias, Integer status); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/ISettingUserService.java b/yj-admin/src/main/java/com/yj/admin/service/ISettingUserService.java new file mode 100644 index 0000000..85b612c --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/ISettingUserService.java @@ -0,0 +1,27 @@ +package com.yj.admin.service; + +import com.yj.admin.validate.setting.SettingUserValidate; +import com.yj.admin.vo.setting.SettingUserVo; + +/** + * 用户设置服务接口类 + */ +public interface ISettingUserService { + + /** + * 用户设置详情 + * + * @author fzr + * @return SettingUserVo + */ + SettingUserVo getConfig(); + + /** + * 用户设置保存 + * + * @author fzr + * @param userValidate 参数 + */ + void setConfig(SettingUserValidate userValidate); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/ISettingWebsiteService.java b/yj-admin/src/main/java/com/yj/admin/service/ISettingWebsiteService.java new file mode 100644 index 0000000..66370e8 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/ISettingWebsiteService.java @@ -0,0 +1,27 @@ +package com.yj.admin.service; + +import com.yj.admin.validate.setting.SettingWebsiteValidate; +import com.yj.admin.vo.setting.SettingWebsiteVo; + +/** + * 网站信息服务接口类 + */ +public interface ISettingWebsiteService { + + /** + * 获取网站信息 + * + * @author fzr + * @return SettingWebsiteVo + */ + SettingWebsiteVo getWebsite(); + + /** + * 保存网站信息 + * + * @author fzr + * @param websiteValidate 参数 + */ + void setWebsite(SettingWebsiteValidate websiteValidate); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/IUserService.java b/yj-admin/src/main/java/com/yj/admin/service/IUserService.java new file mode 100644 index 0000000..88c10c5 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/IUserService.java @@ -0,0 +1,61 @@ +package com.yj.admin.service; + +import com.alibaba.fastjson2.JSONObject; +import com.yj.admin.validate.user.UserSearchValidate; +import com.yj.admin.validate.user.UserUpdateValidate; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.user.UserWalletValidate; +import com.yj.admin.vo.user.UserVo; +import com.yj.common.core.PageResult; + +/** + * 用户服务接口类 + */ +public interface IUserService { + + /** + * 用户列表 + * + * @author fzr + * @param pageValidate (分页参数) + * @param searchValidate (搜索参数) + * @return PageResult + */ + PageResult list(PageValidate pageValidate, UserSearchValidate searchValidate); + + /** + * 用户详情 + * + * @author fzr + * @param id 主键 + * @return UserVo + */ + UserVo detail(Integer id); + + /** + * 用户编辑 + * + * @author fzr + * @param updateValidate 参数 + */ + void edit(UserUpdateValidate updateValidate); + + /** + * 余额调整 + * + * @author fzr + * @param userWalletValidate 余额 + */ + void adjustWallet(UserWalletValidate userWalletValidate); + + /** + * 返回导出格式 + * @return + */ + JSONObject getExportData(PageValidate pageValidate, UserSearchValidate searchValidate); + + /** + * 导出 + */ + String export(UserSearchValidate searchValidate); +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/admin/IAdminDeptService.java b/yj-admin/src/main/java/com/yj/admin/service/admin/IAdminDeptService.java new file mode 100644 index 0000000..84a0019 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/admin/IAdminDeptService.java @@ -0,0 +1,29 @@ +package com.yj.admin.service.admin; + +import java.util.List; + +/** + * 部门关联接口类 + */ +public interface IAdminDeptService { + + /** + * 关联部门id + * + * @author damonyuan + */ + List getDeptIdAttr(Integer adminId); + + /** + * 批量添加部门 + * @param adminId + * @param deptIds + */ + void batchInsert(Integer adminId, List deptIds); + + /** + * 删除关联部门 + * @param adminId + */ + void deleteByAdminId(Integer adminId); +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/admin/IAdminJobsService.java b/yj-admin/src/main/java/com/yj/admin/service/admin/IAdminJobsService.java new file mode 100644 index 0000000..8df915c --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/admin/IAdminJobsService.java @@ -0,0 +1,29 @@ +package com.yj.admin.service.admin; + +import java.util.List; + +/** + * 岗位关联接口类 + */ +public interface IAdminJobsService { + + /** + * 关联岗位id + * + * @author damonyuan + */ + List getJobIdAttr(Integer adminId); + + /** + * 批量添加岗位 + * @param adminId + * @param jobsIds + */ + void batchInsert(Integer adminId, List jobsIds); + + /** + * 删除关联岗位 + * @param adminId + */ + void deleteByAdminId(Integer adminId); +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/admin/IAdminRoleService.java b/yj-admin/src/main/java/com/yj/admin/service/admin/IAdminRoleService.java new file mode 100644 index 0000000..7d3a712 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/admin/IAdminRoleService.java @@ -0,0 +1,35 @@ +package com.yj.admin.service.admin; + +import com.yj.common.entity.admin.AdminRole; + +import java.util.List; + +/** + * 角色关联接口类 + */ +public interface IAdminRoleService { + + /** + * 关联角色id + * + * @author damonyuan + */ + List getRoleIdAttr(Integer adminId); + + + List getAdminIdByRoleId(Integer roleId); + + + /** + * 批量设置部门 + * @param adminId + * @param deptIds + */ + void batchInsert(Integer adminId, List deptIds); + + /** + * 删除关联角色 + * @param adminId + */ + void deleteByAdminId(Integer adminId); +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/admin/IAdminService.java b/yj-admin/src/main/java/com/yj/admin/service/admin/IAdminService.java new file mode 100644 index 0000000..2063655 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/admin/IAdminService.java @@ -0,0 +1,111 @@ +package com.yj.admin.service.admin; + +import com.alibaba.fastjson2.JSONObject; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.system.*; +import com.yj.admin.vo.auth.AdminMySelfVo; +import com.yj.admin.vo.system.SystemAuthAdminDetailVo; +import com.yj.admin.vo.system.SystemAuthAdminListedVo; +import com.yj.admin.vo.system.SystemAuthAdminSelvesVo; +import com.yj.common.core.PageResult; + +import java.util.List; + +/** + * 系统管理员服务接口类 + */ +public interface IAdminService { + + /** + * 管理员列表 + * + * @author fzr + * @param pageValidate 分页参数 + * @param searchValidate 搜索参数 + * @return PageResult + */ + PageResult list(PageValidate pageValidate, SystemAdminSearchValidate searchValidate); + + /** + * 当前管理员 + * + * @author fzr + * @return SystemSelfVo + */ + SystemAuthAdminSelvesVo self(Integer adminId); + + /** + * 管理员详情 + * + * @author fzr + * @param id 主键参数 + * @return SystemAuthAdminDetailVo + */ + SystemAuthAdminDetailVo detail(Integer id); + + /** + * 管理员新增 + * + * @author fzr + * @param createValidate 参数 + */ + void add(SystemAdminCreateValidate createValidate); + + /** + * 管理员编辑 + * + * @author fzr + * @param updateValidate 参数 + * @param adminId 管理员ID + */ + void edit(SystemAdminUpdateValidate updateValidate, Integer adminId); + + /** + * 当前管理员更新 + * + * @author fzr + * @param upInfoValidate 参数 + * @param adminId 管理员ID + */ + void upInfo(SystemAdminUpInfoValidate upInfoValidate, Integer adminId); + + /** + * 管理员删除 + * + * @author fzr + * @param id 主键参数 + * @param adminId 管理员ID + */ + void del(Integer id, Integer adminId); + + /** + * 管理员状态切换 + * + * @author fzr + * @param id 主键参数 + */ + void disable(Integer id, Integer adminId); + + /** + * 查看管理员详情 + * @param id + * @return + */ + AdminMySelfVo mySelf(Integer id, List roleIds); + + /** + * 返回导出格式 + * @return + */ + JSONObject getExportData(PageValidate pageValidate, SystemAdminSearchValidate searchValidate); + + /** + * 导出 + */ + String export(SystemAdminSearchValidate searchValidate); + + /** + * 编辑自己信息 + */ + void editSelf(SystemEditSelfValidate upInfoValidate, Integer adminId); +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/admin/IAuthService.java b/yj-admin/src/main/java/com/yj/admin/service/admin/IAuthService.java new file mode 100644 index 0000000..241a041 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/admin/IAuthService.java @@ -0,0 +1,17 @@ +package com.yj.admin.service.admin; + +import java.util.List; + +/** + * 权限功能类 + */ +public interface IAuthService { + + /** + * @notes 获取当前管理员角色按钮权限 + * @return mixed + * @author damonyuan + * @date 2022/7/1 16:10 + */ + List getBtnAuthByRoleId(Integer adminId); +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/ArtCateServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/ArtCateServiceImpl.java new file mode 100644 index 0000000..c041c51 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/ArtCateServiceImpl.java @@ -0,0 +1,224 @@ +package com.yj.admin.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yj.admin.service.IArtCateService; +import com.yj.admin.validate.article.ArtCateCreateValidate; +import com.yj.admin.validate.article.ArtCateUpdateValidate; +import com.yj.admin.validate.article.ArtCateSearchValidate; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.vo.article.ArticleCateVo; +import com.yj.common.core.PageResult; +import com.yj.common.entity.article.Article; +import com.yj.common.entity.article.ArticleCate; +import com.yj.common.mapper.article.ArticleCateMapper; +import com.yj.common.mapper.article.ArticleMapper; +import com.yj.common.util.TimeUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * 文章分类服务实现类 + */ +@Service +public class ArtCateServiceImpl implements IArtCateService { + + @Resource + ArticleCateMapper articleCategoryMapper; + + @Resource + ArticleMapper articleMapper; + + /** + * 分类所有 + * + * @author fzr + * @return List + */ + @Override + public List all() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("id", "name", "sort", "is_show", "create_time", "update_time") + .isNull("delete_time") + .orderByDesc(Arrays.asList("sort", "id")); + + List lists = articleCategoryMapper.selectList(queryWrapper); + + List vos = new ArrayList<>(); + for (ArticleCate category : lists) { + ArticleCateVo vo = new ArticleCateVo(); + BeanUtils.copyProperties(category, vo); + + vo.setCreateTime(TimeUtils.timestampToDate(vo.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(vo.getUpdateTime())); + vos.add(vo); + } + + return vos; + } + + /** + * 分类列表 + * + * @param pageValidate 分页参数 + * @param searchValidate 搜索参数 + * @return PageResult + */ + @Override + public PageResult list(PageValidate pageValidate, ArtCateSearchValidate searchValidate) { + Integer pageNo = pageValidate.getPage_no(); + Integer pageSize = pageValidate.getPage_size(); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("id", "name", "sort", "is_show", "create_time", "update_time") + .isNull("delete_time") + .orderByDesc(Arrays.asList("sort", "id")); + + articleCategoryMapper.setSearch(queryWrapper, searchValidate, new String[]{ + "like:name:str", + "=:isShow@is_show:int" + }); + + IPage iPage = articleCategoryMapper.selectPage(new Page<>(pageNo, pageSize), queryWrapper); + + List list = new ArrayList<>(); + for (ArticleCate category : iPage.getRecords()) { + ArticleCateVo vo = new ArticleCateVo(); + BeanUtils.copyProperties(category, vo); + + Long number = articleMapper.selectCount(new QueryWrapper
() + .eq("cid", category.getId()) + .isNull("delete_time")); + + vo.setArticleCount(number); + vo.setCreateTime(TimeUtils.timestampToDate(vo.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(vo.getUpdateTime())); + list.add(vo); + } + + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list); + } + + /** + * 分类详情 + * + * @author fzr + * @param id 分类ID + * @return CategoryVo + */ + @Override + public ArticleCateVo detail(Integer id) { + ArticleCate model = articleCategoryMapper.selectOne( + new QueryWrapper() + .select(ArticleCate.class, info-> + !info.getColumn().equals("delete_time")) + .eq("id", id) + .isNull("delete_time")); + + Assert.notNull(model, "分类不存在"); + + ArticleCateVo vo = new ArticleCateVo(); + BeanUtils.copyProperties(model, vo); + vo.setCreateTime(TimeUtils.timestampToDate(model.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(model.getUpdateTime())); + + return vo; + } + + /** + * 分类新增 + * + * @author fzr + * @param createValidate 分类参数 + */ + @Override + public void add(ArtCateCreateValidate createValidate) { + ArticleCate model = new ArticleCate(); + model.setName(createValidate.getName()); + model.setSort(createValidate.getSort()); + model.setIsShow(createValidate.getIsShow()); + model.setCreateTime(TimeUtils.timestamp()); + model.setUpdateTime(TimeUtils.timestamp()); + articleCategoryMapper.insert(model); + } + + /** + * 分类编辑 + * + * @author fzr + * @param updateValidate 参数 + */ + @Override + public void edit(ArtCateUpdateValidate updateValidate) { + ArticleCate model = articleCategoryMapper.selectOne( + new QueryWrapper() + .select(ArticleCate.class, info-> + !info.getColumn().equals("delete_time")) + .eq("id", updateValidate.getId()) + .isNull("delete_time")); + + Assert.notNull(model, "分类不存在"); + + model.setName(updateValidate.getName()); + model.setSort(updateValidate.getSort()); + model.setIsShow(updateValidate.getIsShow()); + model.setUpdateTime(TimeUtils.timestamp()); + articleCategoryMapper.updateById(model); + } + + /** + * 分类参数 + * + * @author fzr + * @param id 分类ID + */ + @Override + public void del(Integer id) { + ArticleCate model = articleCategoryMapper.selectOne( + new QueryWrapper() + .select("id,is_show") + .eq("id", id) + .isNull("delete_time")); + + Assert.notNull(model, "分类不存在"); + + Article article = articleMapper.selectOne(new QueryWrapper
() + .eq("cid", id) + .isNull("delete_time") + .last("limit 1")); + + Assert.isNull(article, "当前分类已被文章使用,请先移除!"); + + model.setDeleteTime(TimeUtils.timestamp()); + articleCategoryMapper.updateById(model); + } + + /** + * 分类状态 + * + * @author fzr + * @param id 分类ID + */ + @Override + public void change(Integer id) { + ArticleCate model = articleCategoryMapper.selectOne( + new QueryWrapper() + .select("id,is_show") + .eq("id", id) + .isNull("delete_time")); + + Assert.notNull(model, "分类不存在"); + + model.setIsShow(model.getIsShow()==0?1:0); + model.setUpdateTime(TimeUtils.timestamp()); + articleCategoryMapper.updateById(model); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/ArticleServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/ArticleServiceImpl.java new file mode 100644 index 0000000..55438c6 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/ArticleServiceImpl.java @@ -0,0 +1,218 @@ +package com.yj.admin.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.query.MPJQueryWrapper; +import com.yj.admin.service.IArticleService; +import com.yj.admin.validate.article.ArticleCreateValidate; +import com.yj.admin.validate.article.ArticleSearchValidate; +import com.yj.admin.validate.article.ArticleUpdateValidate; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.vo.article.ArticleDetailVo; +import com.yj.admin.vo.article.ArticleListedVo; +import com.yj.common.config.GlobalConfig; +import com.yj.common.core.PageResult; +import com.yj.common.entity.article.Article; +import com.yj.common.entity.article.ArticleCate; +import com.yj.common.mapper.article.ArticleCateMapper; +import com.yj.common.mapper.article.ArticleMapper; +import com.yj.common.util.StringUtils; +import com.yj.common.util.TimeUtils; +import com.yj.common.util.UrlUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.util.Arrays; + +/** + * 文章服务实现类 + */ +@Service +public class ArticleServiceImpl implements IArticleService { + + @Resource + ArticleMapper articleMapper; + + @Resource + ArticleCateMapper articleCategoryMapper; + + /** + * 文章列表 + * + * @author fzr + * @param pageValidate 分页参数 + * @param searchValidate 搜索参数 + * @return PageResult + */ + @Override + public PageResult list(PageValidate pageValidate, ArticleSearchValidate searchValidate) { + Integer pageNo = pageValidate.getPage_no(); + Integer pageSize = pageValidate.getPage_size(); + + MPJQueryWrapper
mpjQueryWrapper = new MPJQueryWrapper
() + .selectAll(Article.class) + .select("ac.name as cateName") + .innerJoin("?_article_cate ac ON ac.id=t.cid".replace("?_", GlobalConfig.tablePrefix)) + .isNull("t.delete_time") + .orderByDesc(Arrays.asList("t.sort", "t.id")); + + articleMapper.setSearch(mpjQueryWrapper, searchValidate, new String[]{ + "like:title@t.title:str", + "=:cid@t.cid:int", + "=:is_show@t.is_show:int", + "datetime:startTime-endTime@t.create_time:str" + }); + + IPage iPage = articleMapper.selectJoinPage( + new Page<>(pageNo, pageSize), + ArticleListedVo.class, + mpjQueryWrapper); + + for (ArticleListedVo vo : iPage.getRecords()) { + vo.setImage(UrlUtils.toAdminAbsoluteUrl(vo.getImage())); + + Integer clickActual = vo.getClickActual() != null ? vo.getClickActual() : 0; + + Integer clickVirtual = vo.getClickVirtual() != null ? vo.getClickVirtual() : 0; + + Integer click = clickActual + clickVirtual; + + vo.setClick(click); + + vo.setCreateTime(TimeUtils.timestampToDate(vo.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(vo.getUpdateTime())); + } + + return PageResult.iPageHandle(iPage); + } + + /** + * 文章详情 + * + * @author fzr + * @param id 主键ID + */ + @Override + public ArticleDetailVo detail(Integer id) { + Article model = articleMapper.selectOne( + new QueryWrapper
() + .select(Article.class, info-> + !info.getColumn().equals("delete_time")) + .eq("id", id) + .isNull("delete_time")); + + Assert.notNull(model, "文章不存在"); + + ArticleDetailVo vo = new ArticleDetailVo(); + BeanUtils.copyProperties(model, vo); + vo.setContent(StringUtils.isNull(model.getContent()) ? "" : model.getContent()); + vo.setImage(UrlUtils.toAdminAbsoluteUrl(model.getImage())); + vo.setCreateTime(TimeUtils.timestampToDate(model.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(model.getUpdateTime())); + + return vo; + } + + /** + * 文章新增 + * + * @author fzr + * @param createValidate 文章参数 + */ + @Override + public void add(ArticleCreateValidate createValidate) { + Article model = new Article(); + model.setCid(createValidate.getCid()); + model.setTitle(createValidate.getTitle()); + model.setImage(UrlUtils.toRelativeUrl(createValidate.getImage())); + model.setContent(createValidate.getContent()); + model.setSort(createValidate.getSort()); + model.setIsShow(createValidate.getIsShow()); + model.setAuthor(createValidate.getAuthor()); + model.setAbstractField(createValidate.getAbstractFied()); + model.setDesc(createValidate.getDesc()); + + model.setCreateTime(TimeUtils.timestamp()); + model.setUpdateTime(TimeUtils.timestamp()); + model.setClickVirtual(createValidate.getClick_virtual()); + articleMapper.insert(model); + } + + /** + * 文章编辑 + * + * @author fzr + * @param updateValidate 文章参数 + */ + @Override + public void edit(ArticleUpdateValidate updateValidate) { + Article model = articleMapper.selectOne( + new QueryWrapper
() + .eq("id", updateValidate.getId()) + .isNull("delete_time")); + + Assert.notNull(model, "文章不存在!"); + + Assert.notNull(articleCategoryMapper.selectOne( + new QueryWrapper() + .eq("id", updateValidate.getCid()) + .isNull("delete_time")), "分类不存在"); + + model.setCid(updateValidate.getCid()); + model.setTitle(updateValidate.getTitle()); + model.setImage(UrlUtils.toRelativeUrl(updateValidate.getImage())); + model.setContent(updateValidate.getContent()); + model.setIsShow(updateValidate.getIsShow()); + model.setAuthor(updateValidate.getAuthor()); + model.setSort(updateValidate.getSort()); + model.setAbstractField(updateValidate.getAbstractFied()); + model.setDesc(updateValidate.getDesc()); + model.setUpdateTime(TimeUtils.timestamp()); + model.setClickVirtual(updateValidate.getClick_virtual()); + articleMapper.updateById(model); + } + + /** + * 文章删除 + * + * @author fzr + * @param id 文章ID + */ + @Override + public void del(Integer id) { + Article article = articleMapper.selectOne( + new QueryWrapper
() + .select("id, is_show") + .eq("id", id) + .isNull("delete_time")); + + Assert.notNull(article, "文章不存在!"); + article.setDeleteTime(TimeUtils.timestamp()); + articleMapper.updateById(article); + } + + /** + * 文章状态 + * + * @author fzr + * @param id 文章主键 + */ + @Override + public void change(Integer id) { + Article article = articleMapper.selectOne( + new QueryWrapper
() + .select("id, is_show") + .eq("id", id) + .isNull("delete_time")); + + Assert.notNull(article, "文章不存在!"); + + article.setIsShow(article.getIsShow() == 0 ? 1:0); + article.setUpdateTime(TimeUtils.timestamp()); + articleMapper.updateById(article); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/ChannelH5ConfigServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/ChannelH5ConfigServiceImpl.java new file mode 100644 index 0000000..2a9e798 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/ChannelH5ConfigServiceImpl.java @@ -0,0 +1,55 @@ +package com.yj.admin.service.impl; + +import com.yj.admin.service.IChannelH5ConfigService; +import com.yj.admin.validate.channel.ChannelH5Validate; +import com.yj.admin.vo.channel.ChannelH5Vo; +import com.yj.common.util.ConfigUtils; +import com.yj.common.util.StringUtils; +import com.yj.common.util.YmlUtils; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * H5渠道设置服务实现类 + */ +@Service +public class ChannelH5ConfigServiceImpl implements IChannelH5ConfigService { + + /** + * H5渠道配置详情 + * + * @author fzr + * @return ChannelH5Vo + */ + @Override + public ChannelH5Vo getConfig() { + Map config = ConfigUtils.get("web_page"); + ChannelH5Vo vo = new ChannelH5Vo(); + vo.setStatus(Integer.parseInt(config.getOrDefault("status", "1"))); + vo.setPageStatus(Integer.parseInt(config.getOrDefault("page_status", "1"))); + + String url = YmlUtils.get("like.front-url"); + + url = StringUtils.isNotEmpty(url) && url.endsWith("/") ? url + "/moblie" : url + "moblie"; + + vo.setUrl(config.getOrDefault("url", url)); + vo.setPageUrl(config.getOrDefault("page_url", "")); + return vo; + } + + /** + * H5渠道配置保存 + * + * @author fzr + * @param channelH5Validate 参数 + */ + @Override + public void setConfig(ChannelH5Validate channelH5Validate) { + ConfigUtils.set("web_page", "status", String.valueOf(channelH5Validate.getStatus())); + ConfigUtils.set("web_page", "page_status", String.valueOf(channelH5Validate.getPageStatus())); + ConfigUtils.set("web_page", "url", channelH5Validate.getUrl()); + ConfigUtils.set("web_page", "page_url", channelH5Validate.getPageUrl()); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/ChannelMpConfigServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/ChannelMpConfigServiceImpl.java new file mode 100644 index 0000000..a7a7a89 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/ChannelMpConfigServiceImpl.java @@ -0,0 +1,64 @@ +package com.yj.admin.service.impl; + +import com.yj.admin.service.IChannelMpConfigService; +import com.yj.admin.validate.channel.ChannelMpValidate; +import com.yj.admin.vo.channel.ChannelMpVo; +import com.yj.common.util.*; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * 微信小程序渠道服务实现类 + */ +@Service +public class ChannelMpConfigServiceImpl implements IChannelMpConfigService { + + /** + * 微信小程序渠道详情 + * + * @author fzr + * @return ChannelMpVo + */ + @Override + public ChannelMpVo getConfig() { + Map config = ConfigUtils.get("mnp_setting"); + + String env = YmlUtils.get("like.production"); + boolean envStatus = StringUtils.isNotNull(env) && env.equals("true"); + + ChannelMpVo vo = new ChannelMpVo(); + vo.setName(config.getOrDefault("name", "")); + vo.setOriginalId(config.getOrDefault("original_id", "")); + vo.setAppId(envStatus ? "******" : config.getOrDefault("app_id", "")); + vo.setAppSecret(envStatus ? "******" : config.getOrDefault("app_secret", "")); + vo.setQrCode(UrlUtils.toAdminAbsoluteUrl(config.getOrDefault("qr_code", ""))); + + String domain = RequestUtils.domain(); + vo.setRequestDomain(domain); + vo.setSocketDomain(domain.replace("https://", "wss://").replace("http://", "wss://")); + vo.setUploadFileDomain(domain); + vo.setDownloadFileDomain(domain); + vo.setUdpDomain(domain.replace("https://", "udp://").replace("http://", "udp://")); + vo.setTcpDomain(domain); + vo.setBusinessDomain(domain); + + return vo; + } + + /** + * 微信小程序渠道保存 + * + * @author fzr + * @param channelMpValidate 参数 + */ + @Override + public void setConfig(ChannelMpValidate channelMpValidate) { + ConfigUtils.set("mnp_setting", "name", channelMpValidate.getName()); + ConfigUtils.set("mnp_setting", "original_id", channelMpValidate.getOriginalId()); + ConfigUtils.set("mnp_setting", "app_id", channelMpValidate.getAppId()); + ConfigUtils.set("mnp_setting", "app_secret", channelMpValidate.getAppSecret()); + ConfigUtils.set("mnp_setting", "qr_code", UrlUtils.toRelativeUrl(channelMpValidate.getQrCode())); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/ChannelOaCallBackServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/ChannelOaCallBackServiceImpl.java new file mode 100644 index 0000000..3f3dd49 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/ChannelOaCallBackServiceImpl.java @@ -0,0 +1,199 @@ +package com.yj.admin.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.admin.service.IChannelOaCallBackService; +import com.yj.common.entity.OfficialAccountReply; +import com.yj.common.exception.OperateException; +import com.yj.common.mapper.OfficialAccountReplyMapper; +import com.yj.common.plugin.wechat.WxMnpDriver; +import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +import static me.chanjar.weixin.common.api.WxConsts.EventType.SUBSCRIBE; + +@Service +public class ChannelOaCallBackServiceImpl implements IChannelOaCallBackService { + + + @Resource + private OfficialAccountReplyMapper officialAccountReplyMapper; + + + /** + * 服务器验证 + * + * @param signature 微信加密签名 + * @param timestamp 时间戳 + * @param nonce 随机数 + * @param echostr 随机字符串 + * @return String + */ + @Override + public String checkSignature(String signature, String timestamp, String nonce, String echostr) { + WxMpService wxMpService = WxMnpDriver.oa(); + if (wxMpService.checkSignature(timestamp, nonce, signature)) { + return echostr; + } + return "非法请求"; + } + + + /** + * 消息回复 + * + * @param requestBody 请求数据 + * @param signature 微信加密签名 + * @param timestamp 时间戳 + * @param nonce 随机数 + * @param encType 加密类型 + * @param msgSignature 加密签名 + * @return String + */ + @Override + public String post(String requestBody, String signature, String timestamp, String nonce, String encType, String msgSignature) { + + WxMpService wxMpService = WxMnpDriver.oa(); + if (!wxMpService.checkSignature(timestamp, nonce, signature)) { + throw new IllegalArgumentException("非法请求,可能属于伪造的请求!"); + } + + String outMsg = null; + if (encType == null) { + // 明文传输的消息 + WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(requestBody); + WxMpXmlOutMessage outMessage = this.msgHandler(inMessage); + if (outMessage == null) { + return ""; + } + outMsg = outMessage.toXml(); + + } else if ("aes".equalsIgnoreCase(encType)) { + // aes加密的消息 + WxMpXmlMessage inMessage = WxMpXmlMessage.fromEncryptedXml( + requestBody, + wxMpService.getWxMpConfigStorage(), + timestamp, + nonce, + msgSignature); + + WxMpXmlOutMessage outMessage = this.msgHandler(inMessage); + if (outMessage == null) { + return ""; + } + outMsg = outMessage.toEncryptedXml(wxMpService.getWxMpConfigStorage()); + } + + return outMsg; + } + + /** + * 消息处理 + * + * @param wxMessage 微信回调信息 + * @return WxMpXmlOutMessage + */ + private WxMpXmlOutMessage msgHandler(WxMpXmlMessage wxMessage) { + try { + // 文本消息 + if (wxMessage.getMsgType().equals(WxConsts.XmlMsgType.TEXT)) { + String msg = keyMsg(wxMessage); + return textBuild(msg, wxMessage); + } + + // 事件消息 + if (wxMessage.getMsgType().equals(WxConsts.XmlMsgType.EVENT)) { + if (wxMessage.getEvent().equals(SUBSCRIBE)) { + // 关注回复 + String msg = subMsg(); + return textBuild(msg, wxMessage); + } + } + } catch (Exception e) { + throw new OperateException("公众号消息回调错误" + e.getMessage()); + } + return null; + } + + /** + * 返回文本消息 + * + * @param content 文本内容 + * @param wxMessage 微信回调信息 + * @return WxMpXmlOutMessage + */ + private WxMpXmlOutMessage textBuild(String content, WxMpXmlMessage wxMessage) { + return WxMpXmlOutMessage.TEXT().content(content) + .fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()) + .build(); + } + + /** + * 关键词回复 + * + * @param wxMessage 微信回调信息 + * @return String + */ + private String keyMsg(WxMpXmlMessage wxMessage) { + List oaReplyList = officialAccountReplyMapper.selectList( + new QueryWrapper() + .eq("reply_type", 2) + .isNull("delete_time") + .eq("status", 1) + .orderByAsc("id")); + + String msg = null; + for (OfficialAccountReply oaReply : oaReplyList) { + // 全匹配 + if (oaReply.getMatchingType() == 1 && oaReply.getKeyword().equals(wxMessage.getContent())) { + msg = oaReply.getContent(); + } + // 模糊匹配 + if (oaReply.getMatchingType() == 2 && wxMessage.getContent().contains(oaReply.getKeyword())) { + msg = oaReply.getContent(); + } + } + + return msg == null ? defaultMsg() : msg; + } + + /** + * 默认回复 + * + * @return String + */ + private String defaultMsg() { + OfficialAccountReply officialAccountReply = officialAccountReplyMapper.selectOne(new QueryWrapper() + .eq("reply_type", 3) + .isNull("delete_time") + .eq("status", 1) + .last("limit 1")); + if (officialAccountReply == null) { + return null; + } + return officialAccountReply.getContent(); + } + + /** + * 关注回复内容 + * + * @return String + */ + private String subMsg() { + OfficialAccountReply officialAccountReply = officialAccountReplyMapper.selectOne(new QueryWrapper() + .eq("reply_type", 1) + .isNull("delete_time") + .eq("status", 1) + .last("limit 1")); + if (officialAccountReply == null) { + return defaultMsg(); + } + return officialAccountReply.getContent(); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/ChannelOaConfigServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/ChannelOaConfigServiceImpl.java new file mode 100644 index 0000000..388e627 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/ChannelOaConfigServiceImpl.java @@ -0,0 +1,68 @@ +package com.yj.admin.service.impl; + +import com.yj.admin.service.IChannelOaConfigService; +import com.yj.admin.validate.channel.ChannelOaValidate; +import com.yj.admin.vo.channel.ChannelOaVo; +import com.yj.common.util.*; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * 公众号渠道设置服务实现类 + */ +@Service +public class ChannelOaConfigServiceImpl implements IChannelOaConfigService { + + /** + * 公众号渠道设置详情 + * + * @author fzr + * @return ChannelOaVo + */ + @Override + public ChannelOaVo getConfig() { + Map config = ConfigUtils.get("oa_setting"); + ChannelOaVo vo = new ChannelOaVo(); + + String env = YmlUtils.get("like.production"); + boolean envStatus = StringUtils.isNotNull(env) && env.equals("true"); + String domain = RequestUtils.domain(); + + vo.setQrCode(UrlUtils.toAdminAbsoluteUrl(config.getOrDefault("qr_code", ""))); + vo.setName(config.getOrDefault("name", "")); + vo.setOriginalId(config.getOrDefault("original_id", "")); + vo.setAppId(envStatus ? "******" : config.getOrDefault("app_id", "")); + vo.setAppSecret(envStatus ? "******" : config.getOrDefault("app_secret", "")); + vo.setUrl(domain + (StringUtils.isNotEmpty(config.getOrDefault("url", "")) ? config.getOrDefault("url", "") : "/adminapi/channel/oa/callback")); + vo.setToken(config.getOrDefault("token", "")); + vo.setEncodingAesKey(config.getOrDefault("encoding_aes_key", "")); + vo.setEncryptionType(Integer.parseInt(config.getOrDefault("encryption_type", "1"))); + + vo.setBusinessDomain(domain); + vo.setJsSecureDomain(domain); + vo.setWebAuthDomain(domain); + + return vo; + } + + /** + * 公众号渠道设置保存 + * + * @author fzr + * @param channelOaValidate 参数 + */ + @Override + public void setConfig(ChannelOaValidate channelOaValidate) { + ConfigUtils.set("oa_setting", "name", channelOaValidate.getName()); + ConfigUtils.set("oa_setting", "original_id", channelOaValidate.getOriginalId()); + ConfigUtils.set("oa_setting", "qr_code", UrlUtils.toRelativeUrl(channelOaValidate.getQrCode())); + ConfigUtils.set("oa_setting", "app_id", channelOaValidate.getAppId()); + ConfigUtils.set("oa_setting", "app_secret", channelOaValidate.getAppSecret()); +// ConfigUtils.set("oa_setting", "url", channelOaValidate.getUrl()); + ConfigUtils.set("oa_setting", "token", channelOaValidate.getToken()); + ConfigUtils.set("oa_setting", "encoding_aes_key", channelOaValidate.getEncodingAesKey()); + ConfigUtils.set("oa_setting", "encryption_type", String.valueOf(channelOaValidate.getEncryptionType())); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/ChannelOaMenusServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/ChannelOaMenusServiceImpl.java new file mode 100644 index 0000000..75e7976 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/ChannelOaMenusServiceImpl.java @@ -0,0 +1,134 @@ +package com.yj.admin.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.yj.admin.service.IChannelOaMenusService; +import com.yj.common.exception.OperateException; +import com.yj.common.plugin.wechat.WxMnpDriver; +import com.yj.common.util.*; +import me.chanjar.weixin.common.bean.menu.WxMenu; +import me.chanjar.weixin.common.bean.menu.WxMenuButton; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpMenuService; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.impl.WxMpMenuServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +@Service +public class ChannelOaMenusServiceImpl implements IChannelOaMenusService { + + /** + * 菜单详情 + * + * @author fzr + * @return JSONArray + */ + @Override + public JSONArray detail() { + String json = ConfigUtils.get("oa_setting", "menus", "[]"); + return JSONArray.parseArray(json); + } + + /** + * 菜单保存 + * + * @author fzr + * @param objs 参数 + * @param isPublish 是否发布 + */ + @Override + public void save(List objs, Boolean isPublish) { + if (objs.size() > 3) { + throw new OperateException("一级菜单超出限制(最多3个)"); + } + + List> params = new LinkedList<>(); + for (Object o : objs) { + params.add(MapUtils.objectToMap(o)); + } + + List menuButtons = new LinkedList<>(); + for (Map item : params) { + // 一级菜单 + Assert.notNull(item.get("name"), "一级菜单名称不能为空"); + WxMenuButton wxMenuButton = new WxMenuButton(); + wxMenuButton.setName(item.get("name")); + if (String.valueOf(item.get("has_menu")).equals("false")) { + Assert.notNull(item.get("type"), "一级菜单type参数缺失"); + if (item.get("type").equals("miniprogram")) { + Assert.notNull(item.get("appid"), "一级菜单appId参数缺失"); + Assert.notNull(item.get("url"), "一级菜单url数缺失"); + Assert.notNull(item.get("pagepath"), "一级菜单pagePath数缺失"); + wxMenuButton.setType(item.get("type")); + wxMenuButton.setAppId(item.get("appid")); + wxMenuButton.setUrl(item.get("url")); + wxMenuButton.setPagePath(item.get("pagepath")); + } else { + Assert.notNull(item.get("url"), "一级菜单url数缺失"); + wxMenuButton.setType(item.get("type")); + wxMenuButton.setUrl(item.get("url")); + wxMenuButton.setAppId(item.getOrDefault("appid", "")); + } + menuButtons.add(wxMenuButton); + } + + // 子级菜单 + if (String.valueOf(item.get("has_menu")).equals("true")) { + Assert.notNull(item.get("sub_button"), "子级菜单不能为空"); + List> subButtons = ListUtils.stringToListAsMapStr(item.get("sub_button")); + + List subMenuButtons = new ArrayList<>(); + if (subButtons.size() > 5) { + throw new OperateException("子级菜单超出限制(最多5个)"); + } + for (Map subItem : subButtons) { + WxMenuButton subMenuButton = new WxMenuButton(); + Assert.notNull(subItem.get("type"), "子级菜单type参数缺失!"); + if (subItem.get("type").equals("miniprogram")) { + Assert.notNull(subItem.get("appid"), "子级菜单appId参数缺失!"); + Assert.notNull(subItem.get("url"), "子级菜单url数缺失!"); + Assert.notNull(subItem.get("pagepath"), "子级菜单pagePath数缺失!"); + subMenuButton.setType(subItem.get("type")); + subMenuButton.setName(subItem.get("name")); + subMenuButton.setAppId(subItem.get("appid")); + subMenuButton.setUrl(subItem.get("url")); + subMenuButton.setPagePath(subItem.get("pagepath")); + } else { + Assert.notNull(subItem.get("url"), "子级菜单url数缺失"); + subMenuButton.setType(subItem.get("type")); + subMenuButton.setName(subItem.get("name")); + subMenuButton.setUrl(subItem.get("url")); + } + + subMenuButtons.add(subMenuButton); + + } + wxMenuButton.setType("click"); + wxMenuButton.setSubButtons(subMenuButtons); + menuButtons.add(wxMenuButton); + } + } + + ConfigUtils.set("oa_setting", "menus", JSON.toJSONString(objs)); + + if (isPublish) { + try { + WxMenu wxMenu = new WxMenu(); + wxMenu.setButtons(menuButtons); + + WxMpService wxMpService = WxMnpDriver.oa(); + WxMpMenuService wxMpMenuService = new WxMpMenuServiceImpl(wxMpService); + wxMpMenuService.menuCreate(wxMenu); + } catch (WxErrorException e) { + throw new OperateException(e.getError().getErrorCode() + ": " + e.getError().getErrorMsg()); + } + } + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/ChannelOaReplyServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/ChannelOaReplyServiceImpl.java new file mode 100644 index 0000000..7f79098 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/ChannelOaReplyServiceImpl.java @@ -0,0 +1,207 @@ +package com.yj.admin.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yj.admin.service.IChannelOaReplyService; +import com.yj.admin.validate.channel.ChannelRpValidate; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.vo.channel.ChannelRpVo; +import com.yj.common.core.PageResult; +import com.yj.common.entity.OfficialAccountReply; +import com.yj.common.mapper.OfficialAccountReplyMapper; +import com.yj.common.util.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; + +/** + * 公众号默认回复服务实现类 + */ +@Service +public class ChannelOaReplyServiceImpl implements IChannelOaReplyService { + + @Resource + OfficialAccountReplyMapper officialAccountReplyMapper; + + /** + * 默认回复列表 + * + * @author fzr + * @param pageValidate 分页参数 + * @return PageResult + */ + @Override + public PageResult list(PageValidate pageValidate, Integer replyType) { + Integer pageNo = pageValidate.getPage_no(); + Integer pageSize = pageValidate.getPage_size(); + + IPage iPage = officialAccountReplyMapper.selectPage(new Page<>(pageNo, pageSize), + new QueryWrapper() + .eq("reply_type", replyType) + .isNull("delete_time") + .orderByDesc(Arrays.asList("sort", "id"))); + + List list = new LinkedList<>(); + for (OfficialAccountReply officialAccountReply : iPage.getRecords()) { + ChannelRpVo vo = new ChannelRpVo(); + BeanUtils.copyProperties(officialAccountReply, vo); + list.add(vo); + } + + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list); + } + + /** + * 默认回复详情 + * + * @author fzr + * @param id 主键 + * @return ChannelOaReplyDefaultVo + */ + @Override + public ChannelRpVo detail(Integer id) { + OfficialAccountReply officialAccountReply = officialAccountReplyMapper.selectOne(new QueryWrapper() + .eq("id", id) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(officialAccountReply, "默认数据不存在!"); + + ChannelRpVo vo = new ChannelRpVo(); + BeanUtils.copyProperties(officialAccountReply, vo); + return vo; + } + + /** + * 默认回复新 + * + * @author fzr + * @param defaultValidate 参数 + */ + @Override + public void add(ChannelRpValidate defaultValidate) { + + if (defaultValidate.getReplyType().equals(3)) { + if (defaultValidate.getStatus().equals(1)) { + OfficialAccountReply reply = new OfficialAccountReply(); + reply.setStatus(0); + officialAccountReplyMapper.update(reply, new QueryWrapper().eq("reply_type", 3)); + } + } + + if (defaultValidate.getReplyType().equals(2)) { + Assert.isTrue(StringUtils.isNotEmpty(defaultValidate.getKeyword()), "关键词不能为空"); + } + + + OfficialAccountReply officialAccountReply = new OfficialAccountReply(); + officialAccountReply.setReplyType(defaultValidate.getReplyType()); + officialAccountReply.setContent(defaultValidate.getContent()); + officialAccountReply.setName(defaultValidate.getName()); + officialAccountReply.setContentType(defaultValidate.getContentType()); + officialAccountReply.setStatus(defaultValidate.getStatus()); + officialAccountReply.setKeyword(defaultValidate.getKeyword()); + officialAccountReply.setMatchingType(defaultValidate.getMatchingType()); + officialAccountReply.setSort(defaultValidate.getSort()); + officialAccountReply.setUpdateTime(System.currentTimeMillis() / 1000); + officialAccountReply.setCreateTime(System.currentTimeMillis() / 1000); + officialAccountReplyMapper.insert(officialAccountReply); + } + + /** + * 默认回复编辑 + * + * @author fzr + * @param defaultValidate 参数 + */ + @Transactional + @Override + public void edit(ChannelRpValidate defaultValidate) { + OfficialAccountReply officialAccountReply = officialAccountReplyMapper.selectOne(new QueryWrapper() + .eq("id", defaultValidate.getId()) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(officialAccountReply, "默认回复数据不存在!"); + + if (defaultValidate.getReplyType().equals(3)) { + if (defaultValidate.getStatus().equals(1)) { + OfficialAccountReply reply = new OfficialAccountReply(); + reply.setStatus(0); + officialAccountReplyMapper.update(reply, new QueryWrapper().eq("reply_type", officialAccountReply.getReplyType())); + } + } + + if (defaultValidate.getReplyType().equals(2)) { + Assert.isTrue(StringUtils.isNotEmpty(defaultValidate.getKeyword()), "关键词不能为空"); + } + + officialAccountReply.setId(defaultValidate.getId()); + officialAccountReply.setName(defaultValidate.getName()); + officialAccountReply.setContent(defaultValidate.getContent()); + officialAccountReply.setContentType(defaultValidate.getContentType()); + officialAccountReply.setStatus(defaultValidate.getStatus()); + officialAccountReply.setSort(defaultValidate.getSort()); + officialAccountReply.setKeyword(defaultValidate.getKeyword()); + officialAccountReply.setMatchingType(defaultValidate.getMatchingType()); +// officialAccountReply.setReplyType(defaultValidate.getReplyType()); + officialAccountReply.setCreateTime(System.currentTimeMillis() / 1000); + officialAccountReply.setUpdateTime(System.currentTimeMillis() / 1000); + officialAccountReplyMapper.updateById(officialAccountReply); + } + + /** + * 默认回复删除 + * + * @author fzr + * @param id 主键 + */ + @Override + public void del(Integer id) { + OfficialAccountReply officialAccountReply = officialAccountReplyMapper.selectOne(new QueryWrapper() + .eq("id", id) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(officialAccountReply, "默认回复数据不存在了!"); + + officialAccountReply.setDeleteTime(System.currentTimeMillis() / 1000); + officialAccountReplyMapper.updateById(officialAccountReply); + } + + /** + * 默认回复状态 + * + * @author fzr + * @param id 主键 + */ + @Override + public void status(Integer id) { + OfficialAccountReply officialAccountReply = officialAccountReplyMapper.selectOne(new QueryWrapper() + .isNull("delete_time") + .eq("id", id) + .last("limit 1")); + + Assert.notNull(officialAccountReply, "默认回复数据不存在!"); + + int status = officialAccountReply.getStatus() == 1 ? 0 : 1; + if (status == 1) { + OfficialAccountReply reply = new OfficialAccountReply(); + reply.setStatus(0); + reply.setUpdateTime(System.currentTimeMillis() / 1000); + officialAccountReplyMapper.update(reply, new QueryWrapper() + .eq("reply_type", officialAccountReply.getReplyType())); + } + + officialAccountReply.setId(id); + officialAccountReply.setStatus(status); + officialAccountReply.setUpdateTime(System.currentTimeMillis() / 1000); + officialAccountReplyMapper.updateById(officialAccountReply); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/ChannelOpServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/ChannelOpServiceImpl.java new file mode 100644 index 0000000..ebcb81f --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/ChannelOpServiceImpl.java @@ -0,0 +1,49 @@ +package com.yj.admin.service.impl; + +import com.yj.admin.service.IChannelOpService; +import com.yj.admin.validate.channel.ChannelOpValidate; +import com.yj.admin.vo.channel.ChannelOpVo; +import com.yj.common.util.ConfigUtils; +import com.yj.common.util.StringUtils; +import com.yj.common.util.YmlUtils; +import org.springframework.stereotype.Service; + +/** + * 开放平台设置服务类 + */ +@Service +public class ChannelOpServiceImpl implements IChannelOpService { + + /** + * 开放平台设置详情 + * + * @author fzr + * @return ChannelOpVo + */ + @Override + public ChannelOpVo getConfig() { + String appId = ConfigUtils.get("open_platform", "app_id", ""); + String appSecret = ConfigUtils.get("open_platform", "app_secret", ""); + + String env = YmlUtils.get("like.production"); + boolean envStatus = StringUtils.isNotNull(env) && env.equals("true"); + + ChannelOpVo vo = new ChannelOpVo(); + vo.setAppId(envStatus ? "******" : appId); + vo.setAppSecret(envStatus ? "******" : appSecret); + return vo; + } + + /** + * 开放平台设置保存 + * + * @author fzr + * @param opValidate 参数 + */ + @Override + public void setConfig(ChannelOpValidate opValidate) { + ConfigUtils.set("open_platform", "app_id", opValidate.getAppId()); + ConfigUtils.set("open_platform", "app_secret", opValidate.getAppSecret()); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/CrontabServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/CrontabServiceImpl.java new file mode 100644 index 0000000..9ec359c --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/CrontabServiceImpl.java @@ -0,0 +1,189 @@ +package com.yj.admin.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yj.admin.config.quartz.QuartzUtils; +import com.yj.admin.service.ICrontabService; +import com.yj.admin.validate.crontab.CrontabCreateValidate; +import com.yj.admin.validate.crontab.CrontabUpdateValidate; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.vo.CrontabDetailVo; +import com.yj.admin.vo.CrontabListedVo; +import com.yj.common.core.PageResult; +import com.yj.common.entity.DevCrontab; +import com.yj.common.mapper.DevCrontabMapper; +import org.quartz.*; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.LinkedList; +import java.util.List; + +/** + * 计划任务服务实现类 + */ +@Service +public class CrontabServiceImpl implements ICrontabService { + + @Resource + Scheduler scheduler; + + @Resource + DevCrontabMapper crontabMapper; + + /** + * 项目启动初始化任务 + * + * @author fzr + * @throws SchedulerException 异常 + */ + @PostConstruct + public void init() throws SchedulerException { + scheduler.clear(); + List jobs = crontabMapper.selectList(new QueryWrapper().isNull("delete_time")); + for (DevCrontab crontab : jobs) { + QuartzUtils.createScheduleJob(scheduler, crontab); + } + } + + /** + * 计划任务列表 + * + * @author fzr + * @param pageValidate 分页参数 + * @return PageResult + */ + @Override + public PageResult list(PageValidate pageValidate) { + Integer pageNo = pageValidate.getPage_no(); + Integer pageSize = pageValidate.getPage_size(); + + IPage iPage = crontabMapper.selectPage(new Page<>(pageNo, pageSize), + new QueryWrapper() + .isNull("delete_time") + .orderByDesc("id")); + + List list = new LinkedList<>(); + for (DevCrontab crontab : iPage.getRecords()) { + CrontabListedVo vo = new CrontabListedVo(); + BeanUtils.copyProperties(crontab, vo); + + vo.setTypeDesc("定时任务"); + vo.setStatusDesc(vo.getStatus() == null ? "未运行" : (vo.getStatus().equals(1) ? "运行" : (vo.getStatus().equals(2) ? "停止" : "错误"))); + + list.add(vo); + } + + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list); + } + + /** + * 计划任务详情 + * + * @author fzr + * @param id 主键 + * @return CrontabDetailVo + */ + @Override + public CrontabDetailVo detail(Integer id) { + DevCrontab crontab = crontabMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(crontab, "数据不存在!"); + + CrontabDetailVo vo = new CrontabDetailVo(); + BeanUtils.copyProperties(crontab, vo); + return vo; + } + + /** + * 计划任务新增 + * + * @author fzr + * @param createValidate 参数 + */ + @Override + @Transactional + public void add(CrontabCreateValidate createValidate) throws SchedulerException { + DevCrontab crontab = new DevCrontab(); + crontab.setName(createValidate.getName()); + crontab.setType(createValidate.getType()); + crontab.setCommand(createValidate.getCommand()); + crontab.setExpression(createValidate.getExpression()); + crontab.setStatus(createValidate.getStatus()); + crontab.setRemark(createValidate.getRemark()); + crontab.setParams(createValidate.getParams()); + crontab.setCreateTime(System.currentTimeMillis() / 1000); + crontab.setUpdateTime(System.currentTimeMillis() / 1000); + crontabMapper.insert(crontab); + if (createValidate.getStatus() != null && createValidate.getStatus().equals(1)) { + QuartzUtils.createScheduleJob(scheduler, crontab); + } + } + + /** + * 计划任务编辑 + * + * @author fzr + * @param updateValidate 参数 + */ + @Override + @Transactional + public void edit(CrontabUpdateValidate updateValidate) throws SchedulerException { + DevCrontab crontab = crontabMapper.selectOne( + new QueryWrapper() + .eq("id", updateValidate.getId()) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(crontab, "数据不存在!"); + + crontab.setName(updateValidate.getName()); + crontab.setCommand(updateValidate.getCommand()); + crontab.setType(updateValidate.getType()); + crontab.setExpression(updateValidate.getExpression()); + crontab.setStatus(updateValidate.getStatus()); + crontab.setRemark(updateValidate.getRemark()); + crontab.setParams(updateValidate.getParams()); + crontab.setUpdateTime(System.currentTimeMillis() / 1000); + crontabMapper.updateById(crontab); + if (updateValidate.getStatus() != null && updateValidate.getStatus().equals(1)) { + QuartzUtils.createScheduleJob(scheduler, crontab); + } else { + scheduler.deleteJob(QuartzUtils.getJobKey(crontab.getId(), crontab.getType().toString())); + } + + } + + /** + * 计划任务删除 + * + * @author fzr + * @param id 主键 + */ + @Override + @Transactional + public void del(Integer id) throws SchedulerException { + DevCrontab crontab = crontabMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(crontab, "数据不存在!"); + + crontab.setDeleteTime(System.currentTimeMillis() / 1000); + crontabMapper.updateById(crontab); + + scheduler.deleteJob(QuartzUtils.getJobKey(crontab.getId(), crontab.getType().toString())); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/DecorateDataServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/DecorateDataServiceImpl.java new file mode 100644 index 0000000..1ba7f53 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/DecorateDataServiceImpl.java @@ -0,0 +1,87 @@ +package com.yj.admin.service.impl; + +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.yj.admin.service.IDecorateDataService; +import com.yj.admin.vo.decorate.DecorateDataArticleVo; +import com.yj.common.entity.article.Article; +import com.yj.common.entity.decorate.DecoratePage; +import com.yj.common.mapper.article.ArticleMapper; +import com.yj.common.mapper.decorate.DecoratePageMapper; +import com.yj.common.util.StringUtils; +import com.yj.common.util.TimeUtils; +import com.yj.common.util.UrlUtils; +import com.yj.common.util.YmlUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.LinkedList; +import java.util.List; + +/** + * 装修数据服务实现类 + */ +@Service +public class DecorateDataServiceImpl implements IDecorateDataService { + + @Resource + ArticleMapper articleMapper; + + @Resource + DecoratePageMapper decoratePageMapper; + + /** + * 获取文章数据 + * + * @author fzr + * @param limit 条数 + * @return List + */ + @Override + public List article(Integer limit) { + + List
articles = articleMapper.selectList(new QueryWrapper
() + .eq("is_show", 1) + .orderByDesc("id") + .last("limit " + limit)); + + List list = new LinkedList<>(); + for (Article article : articles) { + DecorateDataArticleVo vo = new DecorateDataArticleVo(); + BeanUtils.copyProperties(article, vo); + vo.setImage(UrlUtils.toAdminAbsoluteUrl(vo.getImage())); + + Integer clickActual = vo.getClickActual() != null ? vo.getClickActual() : 0; + + Integer clickVirtual = vo.getClickVirtual() != null ? vo.getClickVirtual() : 0; + + Integer click = clickActual + clickVirtual; + + vo.setClick(click); + + vo.setCreateTime(TimeUtils.timestampToDate(vo.getCreateTime())); + list.add(vo); + } + + return list; + } + + @Override + public JSONObject pc() { + + JSONObject pc = new JSONObject(); + DecoratePage decoratePage = decoratePageMapper.selectById(4); + Assert.notNull(decoratePage, "数据不存在!"); + + + String frontUrl = YmlUtils.get("like.front-url"); + + frontUrl = StringUtils.isNotEmpty(frontUrl) && frontUrl.endsWith("/") ? frontUrl + "pc" : frontUrl + "/pc"; + + pc.put("update_time", TimeUtils.timestampToDate(decoratePage.getUpdateTime())); + pc.put("pc_url", frontUrl); + return pc; + } +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/DecoratePageServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/DecoratePageServiceImpl.java new file mode 100644 index 0000000..36094e9 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/DecoratePageServiceImpl.java @@ -0,0 +1,62 @@ +package com.yj.admin.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.yj.admin.service.IDecoratePageService; +import com.yj.admin.validate.decorate.DecoratePageValidate; +import com.yj.admin.vo.decorate.DecoratePageVo; +import com.yj.common.entity.decorate.DecoratePage; +import com.yj.common.mapper.decorate.DecoratePageMapper; +import com.yj.common.util.TimeUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +public class DecoratePageServiceImpl implements IDecoratePageService { + + @Resource + DecoratePageMapper decoratePageMapper; + + /** + * 页面装修详情 + * + * @author fzr + * @param id 主键 + * @return DecoratePageVo + */ + @Override + public DecoratePageVo detail(Integer id) { + DecoratePage decoratePage = decoratePageMapper.selectById(id); + Assert.notNull(decoratePage, "数据不存在!"); + DecoratePageVo vo = new DecoratePageVo(); + vo.setId(decoratePage.getId()); + vo.setName(decoratePage.getName()); + vo.setType(decoratePage.getType()); + vo.setData(decoratePage.getData()); + vo.setMeta(decoratePage.getMeta()); + + vo.setCreateTime(TimeUtils.timestampToDate(decoratePage.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(decoratePage.getUpdateTime())); + return vo; + } + + /** + * 页面装修保存 + * + * @author fzr + * @param decoratePageValidate 参数 + */ + @Override + public void save(DecoratePageValidate decoratePageValidate) { + DecoratePage decoratePage = decoratePageMapper.selectById(decoratePageValidate.getId()); + Assert.notNull(decoratePage, "数据不存在!"); + + decoratePage.setName(decoratePageValidate.getName()); + decoratePage.setType(decoratePageValidate.getType()); + decoratePage.setMeta(decoratePageValidate.getMeta()); + decoratePage.setData(decoratePageValidate.getData()); + decoratePage.setUpdateTime(System.currentTimeMillis() / 1000); + decoratePageMapper.updateById(decoratePage); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/DecorateTabbarServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/DecorateTabbarServiceImpl.java new file mode 100644 index 0000000..0906d27 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/DecorateTabbarServiceImpl.java @@ -0,0 +1,96 @@ +package com.yj.admin.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.admin.service.IDecorateTabbarService; +import com.yj.admin.validate.decorate.DecorateTabsValidate; +import com.yj.admin.vo.decorate.DecorateTabsListsVo; +import com.yj.admin.vo.decorate.DecorateTabbarVo; +import com.yj.admin.vo.decorate.DecorateTabsStyleVo; +import com.yj.common.entity.decorate.DecorateTabbar; +import com.yj.common.mapper.decorate.DecorateTabbarMapper; +import com.yj.common.util.*; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * 底部导航服务实现类 + */ +@Service +public class DecorateTabbarServiceImpl implements IDecorateTabbarService { + + @Resource + DecorateTabbarMapper decorateTabbarMapper; + + /** + * 底部导航详情 + * + * @author fzr + * @return DecorateTabbarVo + */ + @Override + public DecorateTabbarVo detail() { + + List list = decorateTabbarMapper.selectList( + new QueryWrapper() + .orderByAsc("id")); + + List tabList = new LinkedList<>(); + for (DecorateTabbar tab: list) { + DecorateTabsListsVo vo = new DecorateTabsListsVo(); + vo.setId(tab.getId()); + vo.setName(tab.getName()); + vo.setSelected(tab.getSelected()); + vo.setUnselected(tab.getUnselected()); + vo.setLink(JSON.parse(tab.getLink())); + vo.setIsShow(tab.getIsShow()); + vo.setCreateTime(TimeUtils.timestampToDate(tab.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(tab.getUpdateTime())); + tabList.add(vo); + } + + String tabbar = ConfigUtils.get("tabbar", "style", "{}"); + + DecorateTabbarVo response = new DecorateTabbarVo(); + DecorateTabsStyleVo styleVo = new DecorateTabsStyleVo(); + Map styleMap = MapUtils.jsonToMap(tabbar); + styleVo.setDefaultColor(styleMap.get("defaultColor")); + styleVo.setSelectedColor(styleMap.get("selectedColor")); + response.setStyle(styleVo); + response.setList(tabList); + return response; + } + + /** + * 底部导航保存 + * + * @author fzr + * @param tabsValidate 参数 + */ + @Override + @Transactional + public void save(DecorateTabsValidate tabsValidate) { + decorateTabbarMapper.delete(new QueryWrapper().gt("id", 0)); + + for (DecorateTabsListsVo obj : tabsValidate.getList()) { + DecorateTabbar model = new DecorateTabbar(); + model.setName(obj.getName()); + model.setLink(JSON.toJSONString(obj.getLink())); + model.setSelected(obj.getSelected()); + model.setUnselected(obj.getUnselected()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setUpdateTime(System.currentTimeMillis() / 1000); + decorateTabbarMapper.insert(model); + } + + if (StringUtils.isNotNull(tabsValidate.getStyle())) { + ConfigUtils.set("tabbar", "style", JSON.toJSONString(tabsValidate.getStyle())); + } + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/FileServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/FileServiceImpl.java new file mode 100644 index 0000000..0f10dcb --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/FileServiceImpl.java @@ -0,0 +1,308 @@ +package com.yj.admin.service.impl; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yj.admin.service.IFileService; +import com.yj.admin.validate.file.FileCateValidate; +import com.yj.admin.validate.file.FileSearchValidate; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.vo.album.FileCateVo; +import com.yj.admin.vo.album.FileVo; +import com.yj.common.config.GlobalConfig; +import com.yj.common.core.PageResult; +import com.yj.common.entity.file.File; +import com.yj.common.entity.file.FileCate; +import com.yj.common.mapper.album.FileCateMapper; +import com.yj.common.mapper.album.FileMapper; +import com.yj.common.plugin.storage.StorageDriver; +import com.yj.common.util.*; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * 文件服务实现类 + */ +@Service +public class FileServiceImpl implements IFileService { + + @Resource + FileMapper fileMapper; + + @Resource + FileCateMapper fileCateMapper; + + /** + * 相册文件列表 + * + * @author fzr + * @param pageValidate 分页参数 + * @param searchValidate 搜索参数 + * @return PageResult + */ + @Override + public PageResult fileList(PageValidate pageValidate, FileSearchValidate searchValidate) { + Integer page = pageValidate.getPage_no(); + Integer limit = pageValidate.getPage_size(); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select(File.class, info-> + !info.getColumn().equals("aid") && + !info.getColumn().equals("uid") && + !info.getColumn().equals("delete_time")) + .isNull("delete_time") + .orderByDesc("id"); + + if (StringUtils.isNotNull(searchValidate.getCid())) { + queryWrapper.eq("cid", searchValidate.getCid()); + } + + fileMapper.setSearch(queryWrapper, searchValidate, new String[]{ + "=:type:int", + "like:name@name:str", + "=:source:int" + }); + + IPage iPage = fileMapper.selectPage(new Page<>(page, limit), queryWrapper); + + String engine = ConfigUtils.get("storage", "default", "local"); + engine = engine.equals("") ? "local" : engine; + + List list = new ArrayList<>(); + for (File file : iPage.getRecords()) { + FileVo vo = new FileVo(); + BeanUtils.copyProperties(file, vo); + vo.setUrl(UrlUtils.toAdminAbsoluteUrl(file.getUri())); + + if (engine.equals("local")) { + vo.setUri(GlobalConfig.adminPublicPrefix + "/" + file.getUri()); + } else { + vo.setUri(file.getUri()); + } + + vo.setCreateTime(TimeUtils.timestampToDate(file.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(file.getUpdateTime())); + list.add(vo); + } + + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list); + } + + /** + * 文件重命名 + * + * @author fzr + * @param id 文件ID + * @param name 文件名称 + */ + @Override + public void fileRename(Integer id, String name) { + File file = fileMapper.selectOne(new QueryWrapper() + .select("id", "name") + .eq("id", id) + .isNull("delete_time")); + + Assert.notNull(file, "文件丢失!"); + + file.setName(name); + file.setUpdateTime(System.currentTimeMillis() / 1000); + fileMapper.updateById(file); + } + + /** + * 文件移动 + * + * @author fzr + * @param ids 文件ID + * @param cid 类目ID + */ + @Override + public void fileMove(List ids, Integer cid) { + List files = fileMapper.selectList(new QueryWrapper() + .select("id", "name") + .in("id", ids) + .isNull("delete_time")); + + Assert.notNull(files, "文件丢失!"); + + if (cid > 0) { + Assert.notNull(fileCateMapper.selectOne( + new QueryWrapper() + .eq("id", cid) + .isNull("delete_time") + ), "类目已不存在!"); + } + + for (File file : files) { + file.setCid(cid); + file.setUpdateTime(System.currentTimeMillis() / 1000); + fileMapper.updateById(file); + } + } + + /** + * 文件新增 + * + * @author fzr + * @param params 文件信息参数 + */ + @Override + public Integer fileAdd(Map params) { + String name = params.get("name"); + if (name.length() >= 100) { + name = name.substring(0, 99); + } + + File album = new File(); + album.setCid(Integer.parseInt(params.get("cid") == null ? "0" : params.get("cid"))); + album.setSourceId(Integer.parseInt(params.get("uid") == null ? "0" : params.get("uid"))); + album.setType(Integer.parseInt(params.get("type"))); + album.setName(name); + album.setUri(params.get("url")); + album.setCreateTime(System.currentTimeMillis() / 1000); + album.setUpdateTime(System.currentTimeMillis() / 1000); + fileMapper.insert(album); + return album.getId(); + } + + /** + * 相册文件删除 + * + * @author fzr + * @param ids 文件ID + */ + @Override + public void fileDel(List ids) { + List files = fileMapper.selectList(new QueryWrapper() + .in("id", ids) + .isNull("delete_time")); + + Assert.notNull(files, "文件丢失!"); + + for (File file : files) { + StorageDriver driver = new StorageDriver(); + driver.deleteFile(file.getUri()); + file.setDeleteTime(System.currentTimeMillis() / 1000); + fileMapper.updateById(file); + } + } + + /** + * 相册分类列表 + * + * @param searchValidate 搜索参数 + * @return JSONArray + */ + @Override + public JSONObject cateList(FileSearchValidate searchValidate) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select(FileCate.class, info-> + !info.getColumn().equals("delete_time")) + .isNull("delete_time") + .orderByDesc("id"); + + if (StringUtils.isNotNull(searchValidate.getType()) && searchValidate.getType() > 0) { + queryWrapper.eq("type", searchValidate.getType()); + } + + if (StringUtils.isNotNull(searchValidate.getName()) && StringUtils.isNotEmpty(searchValidate.getName())) { + queryWrapper.like("name", searchValidate.getName()); + } + + List fileCateList = fileCateMapper.selectList(queryWrapper); + + List lists = new LinkedList<>(); + for (FileCate fileCate : fileCateList) { + FileCateVo vo = new FileCateVo(); + BeanUtils.copyProperties(fileCate, vo); + + vo.setCreateTime(TimeUtils.timestampToDate(fileCate.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(fileCate.getUpdateTime())); + lists.add(vo); + } + + JSONArray jsonArray = JSONArray.parseArray(JSONArray.toJSONString(lists)); + + JSONObject result = new JSONObject(); + + result.put("lists", ListUtils.listToTree(jsonArray, "id", "pid", "children")); + + return result; + } + + /** + * 分类新增 + * + * @author fzr + * @param cateValidate 分类参数 + */ + @Override + public void cateAdd(FileCateValidate cateValidate) { + FileCate albumCate = new FileCate(); + albumCate.setType(cateValidate.getType()); + albumCate.setPid(cateValidate.getPid()); + albumCate.setName(cateValidate.getName()); + albumCate.setCreateTime(System.currentTimeMillis() / 1000); + albumCate.setUpdateTime(System.currentTimeMillis() / 1000); + fileCateMapper.insert(albumCate); + } + + /** + * 分类重命名 + * + * @author fzr + * @param id 分类ID + * @param name 分类名称 + */ + @Override + public void cateRename(Integer id, String name) { + FileCate fileCate = fileCateMapper.selectOne( + new QueryWrapper() + .select("id", "name") + .eq("id", id) + .isNull("delete_time")); + + Assert.notNull(fileCate, "分类已不存在!"); + + fileCate.setName(name); + fileCate.setUpdateTime(System.currentTimeMillis() / 1000); + fileCateMapper.updateById(fileCate); + } + + /** + * 分类删除 + * + * @author fzr + * @param id 分类ID + */ + @Override + public void cateDel(Integer id) { + FileCate albumCate = fileCateMapper.selectOne( + new QueryWrapper() + .select("id", "name") + .eq("id", id) + .isNull("delete_time")); + + Assert.notNull(albumCate, "分类已不存在!"); + + Assert.isNull(fileMapper.selectOne(new QueryWrapper() + .select("id", "cid", "name") + .eq("cid", id) + .isNull("delete_time") + .last("limit 1") + ), "当前分类正被使用中,不能删除!"); + + albumCate.setDeleteTime(System.currentTimeMillis() / 1000); + fileCateMapper.updateById(albumCate); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/FinanceRechargerServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/FinanceRechargerServiceImpl.java new file mode 100644 index 0000000..8e3175d --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/FinanceRechargerServiceImpl.java @@ -0,0 +1,438 @@ +package com.yj.admin.service.impl; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.support.ExcelTypeEnum; +import com.alibaba.fastjson2.JSONObject; +import com.alipay.api.AlipayClient; +import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.domain.AlipayTradeRefundModel; +import com.alipay.api.request.AlipayTradeRefundRequest; +import com.alipay.api.response.AlipayTradeRefundResponse; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.yulichang.query.MPJQueryWrapper; +import com.yj.admin.service.IFinanceRechargerService; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.finance.FinanceRechargeSearchValidate; +import com.yj.admin.vo.finance.FinanceRechargeListExportVo; +import com.yj.admin.vo.finance.FinanceRechargeListVo; +import com.yj.common.config.AlipayConfig; +import com.yj.common.config.GlobalConfig; +import com.yj.common.core.PageResult; +import com.yj.common.entity.RechargeOrder; +import com.yj.common.entity.RefundLog; +import com.yj.common.entity.RefundRecord; +import com.yj.common.entity.user.User; +import com.yj.common.enums.LogMoneyEnum; +import com.yj.common.enums.PaymentEnum; +import com.yj.common.enums.RefundEnum; +import com.yj.common.exception.OperateException; +import com.yj.common.mapper.RechargeOrderMapper; +import com.yj.common.mapper.RefundLogMapper; +import com.yj.common.mapper.RefundRecordMapper; +import com.yj.common.mapper.log.UserAccountLogMapper; +import com.yj.common.mapper.user.UserMapper; +import com.yj.common.plugin.wechat.WxPayDriver; +import com.yj.common.plugin.wechat.request.RefundRequestV3; +import com.yj.common.util.*; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.stereotype.Service; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.TransactionStatus; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.io.File; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; + +/** + * 充值记录服务实现类 + */ +@Service +public class FinanceRechargerServiceImpl implements IFinanceRechargerService { + + @Resource + RechargeOrderMapper rechargeOrderMapper; + + @Resource + UserMapper userMapper; + + @Resource + UserAccountLogMapper userAccountLogMapper; + + @Resource + RefundRecordMapper refundRecordMapper; + + @Resource + RefundLogMapper refundLogMapper; + + @Resource + DataSourceTransactionManager transactionManager ; + + @Resource + TransactionDefinition transactionDefinition; + + /** + * 充值记录 + * + * @author fzr + * @param pageValidate 分页参数 + * @param searchValidate 搜索参数 + * @return PageResult + */ + @Override + public PageResult list(PageValidate pageValidate, FinanceRechargeSearchValidate searchValidate) { + Integer pageNo = pageValidate.getPage_no(); + Integer pageSize = pageValidate.getPage_size(); + + MPJQueryWrapper mpjQueryWrapper = new MPJQueryWrapper<>(); + mpjQueryWrapper.selectAll(RechargeOrder.class) + .select("U.id as user_id,U.account ,U.nickname,U.avatar, t.sn AS sn") + .leftJoin("?_user U ON U.id=t.user_id".replace("?_", GlobalConfig.tablePrefix)) + .orderByDesc("id"); + + rechargeOrderMapper.setSearch(mpjQueryWrapper, searchValidate, new String[]{ + "like:sn@t.sn:str", + "=:pay_way@t.pay_way:int", + "=:pay_status@t.pay_status:int", + "datetime:start_time-end_time@t.create_time:str", + }); + + if (StringUtils.isNotEmpty(searchValidate.getUser_info())) { + String keyword = searchValidate.getUser_info(); + mpjQueryWrapper.nested(wq->wq + .like("U.nickname", keyword).or() + .like("U.account", keyword).or() + .like("U.sn", keyword).or() + .like("U.mobile", keyword)); + } + + IPage iPage = rechargeOrderMapper.selectJoinPage( + new Page<>(pageNo, pageSize), + FinanceRechargeListVo.class, + mpjQueryWrapper); + + for (FinanceRechargeListVo vo : iPage.getRecords()) { + vo.setCreateTime(TimeUtils.timestampToDate(vo.getCreateTime())); + vo.setPayTime(StringUtils.isNull(vo.getPayTime()) ? "-" : TimeUtils.timestampToDate(vo.getPayTime())); + vo.setAvatar(UrlUtils.toAdminAbsoluteUrl(vo.getAvatar())); + vo.setPayWay(vo.getPayWay()); + vo.setPayWayText(PaymentEnum.getPayWayMsg(Integer.parseInt(vo.getPayWay()))); + vo.setPayStatusText(PaymentEnum.getPayStatusMsg(vo.getPayStatus())); + } + + return PageResult.iPageHandle(iPage); + } + + /** + * 发起退款 + * + * @author fzr + * @param orderId 订单ID + * @param adminId 管理员ID + */ + @Override + public void refund(Integer orderId, Integer adminId) { + RechargeOrder rechargeOrder = rechargeOrderMapper.selectById(orderId); + + Assert.notNull(rechargeOrder, "充值订单不存在!"); + if (!rechargeOrder.getPayStatus().equals(PaymentEnum.OK_PAID.getCode())) { + throw new OperateException("当前订单不可退款!"); + } + + if (rechargeOrder.getRefundStatus().equals(1)) { + throw new OperateException("订单已发起退款,退款失败请到退款记录重新退款!"); + } + + User user = userMapper.selectById(rechargeOrder.getUserId()); + if (user.getUserMoney().compareTo(rechargeOrder.getOrderAmount()) < 0) { + throw new OperateException("退款失败:用户余额已不足退款金额!"); + } + + // 开启事务 + TransactionStatus transactionStatus = transactionManager.getTransaction(transactionDefinition); + + RefundRecord refundRecord = null; + RefundLog log = null; + try { + // 标记退款状态 + rechargeOrder.setRefundStatus(1); + rechargeOrderMapper.updateById(rechargeOrder); + + // 记录余额日志 + userAccountLogMapper.dec( + user.getId(), + LogMoneyEnum.UM_DEC_RECHARGE.getCode(), + rechargeOrder.getOrderAmount(), + rechargeOrder.getId(), + rechargeOrder.getSn(), + "充值订单退款", + null + ); + + + // 更新用户余额 + user.setUserMoney(user.getUserMoney().subtract(rechargeOrder.getOrderAmount())); + userMapper.updateById(user); + + // 生成退款记录 + String refundSn = refundRecordMapper.randMakeOrderSn("sn"); + refundRecord = new RefundRecord(); + refundRecord.setSn(refundSn); + refundRecord.setUserId(rechargeOrder.getUserId()); + refundRecord.setOrderId(rechargeOrder.getId()); + refundRecord.setOrderSn(rechargeOrder.getSn()); + refundRecord.setOrderType(RefundEnum.getOrderType(RefundEnum.ORDER_TYPE_RECHARGE.getCode())); + refundRecord.setOrderAmount(rechargeOrder.getOrderAmount()); + refundRecord.setRefundAmount(rechargeOrder.getOrderAmount()); + refundRecord.setRefundType(RefundEnum.TYPE_ADMIN.getCode()); + refundRecord.setTransactionId(refundRecord.getTransactionId()); + refundRecord.setRefundWay(rechargeOrder.getPayWay()); + refundRecordMapper.insert(refundRecord); + + // 生成退款日志 + log = new RefundLog(); + log.setSn(refundLogMapper.randMakeOrderSn("sn")); + log.setRecordId(refundRecord.getId()); + log.setUserId(rechargeOrder.getUserId()); + log.setHandleId(adminId); + log.setOrderAmount(rechargeOrder.getOrderAmount()); + log.setRefundAmount(refundRecord.getRefundAmount()); + log.setRefundStatus(RefundEnum.REFUND_ING.getCode()); + log.setCreateTime(System.currentTimeMillis() / 1000); + log.setUpdateTime(System.currentTimeMillis() / 1000); + refundLogMapper.insert(log); + + // 发起退款请求 + String refundResponse = null; + if (rechargeOrder.getPayWay().equals(PaymentEnum.ALI_PAY.getCode())) { //支付宝退款 + refundResponse = this.aliPayRefund(rechargeOrder, refundSn); + } else { //微信 + refundResponse = this.wxPayRefund(rechargeOrder, refundSn); + } + + // 退款记录更新 + refundRecord.setRefundStatus(RefundEnum.REFUND_SUCCESS.getCode()); + refundRecord.setCreateTime(System.currentTimeMillis() / 1000); + refundRecord.setUpdateTime(System.currentTimeMillis() / 1000); + refundRecord.setTransactionId(rechargeOrder.getTransactionId()); + refundRecordMapper.updateById(refundRecord); + + // 退款日志更新 + log.setRefundStatus(RefundEnum.REFUND_SUCCESS.getCode()); + log.setUpdateTime(System.currentTimeMillis() / 1000); + if (StringUtils.isNotNull(refundResponse)) { + log.setRefundMsg(refundResponse); + } + refundLogMapper.updateById(log); + + transactionManager.commit(transactionStatus); + } catch (Exception e) { + // 事务回滚 + transactionManager.rollback(transactionStatus); + + if (StringUtils.isNotNull(refundRecord)) { + refundRecord.setRefundStatus(RefundEnum.REFUND_ERROR.getCode()); + refundRecordMapper.updateById(refundRecord); + } + + if (StringUtils.isNotNull(log)) { + log.setRefundStatus(RefundEnum.REFUND_ERROR.getCode()); + refundLogMapper.updateById(log); + } + throw new OperateException(e.getMessage()); + } + } + + /** + * 支付宝退款 + * @param rechargeOrder + * @param refundSn + */ + private String aliPayRefund(RechargeOrder rechargeOrder, String refundSn) throws Exception { + String gateWay = StringUtils.isNotNull(YmlUtils.get("like.alidebug")) && YmlUtils.get("like.alidebug").equals("true") ? AlipayConfig.GATEWAY_URL_DEBUG : AlipayConfig.GATEWAY_URL; + AlipayClient alipayClient = new DefaultAlipayClient(gateWay, ConfigUtils.getAliDevPay("app_id"), ConfigUtils.getAliDevPay("private_key"), "json", AlipayConfig.CHARSET, ConfigUtils.getAliDevPay("ali_public_key"), AlipayConfig.SIGN_TYPE); + AlipayTradeRefundRequest aliRequest = new AlipayTradeRefundRequest(); + AlipayTradeRefundModel alipayTradeRefundModel = new AlipayTradeRefundModel(); + alipayTradeRefundModel.setTradeNo(rechargeOrder.getTransactionId()); + alipayTradeRefundModel.setRefundAmount(rechargeOrder.getOrderAmount().toString()); + alipayTradeRefundModel.setOutRequestNo(rechargeOrder.getSn()); + aliRequest.setBizModel(alipayTradeRefundModel); + AlipayTradeRefundResponse response = alipayClient.execute(aliRequest); + if(response.isSuccess()) { + String ret = JSONObject.toJSONString(response); + if (StringUtils.isNotNull(ret)) { + JSONObject refundResponseJSON = JSONObject.parseObject(ret); + rechargeOrder.setRefundTransactionId(refundResponseJSON.getBigInteger("tradeNo")); + rechargeOrderMapper.updateById(rechargeOrder); + } + return ret; + } else { + throw new Exception(response.getBody()); + } + } + + /** + * w微信退款 + * @param rechargeOrder + * @param refundSn + * @throws WxPayException + */ + private String wxPayRefund(RechargeOrder rechargeOrder, String refundSn) throws WxPayException { + String refundTransactionId = null; + RefundRequestV3 requestV3 = new RefundRequestV3(); + requestV3.setTransactionId(rechargeOrder.getTransactionId()); + requestV3.setOutTradeNo(rechargeOrder.getSn()); + requestV3.setOutRefundNo(refundSn); + requestV3.setTotalAmount(AmountUtil.yuan2Fen(rechargeOrder.getOrderAmount().toString())); + requestV3.setRefundAmount(AmountUtil.yuan2Fen(rechargeOrder.getOrderAmount().toString())); + WxPayRefundV3Result result = WxPayDriver.refund(requestV3); + + refundTransactionId = result.getTransactionId(); + rechargeOrder.setRefundTransactionId(new BigInteger(refundTransactionId)); + rechargeOrderMapper.updateById(rechargeOrder); + + return JSONObject.toJSONString(result); + } + + /** + * 重新退款 + * + * @author fzr + * @param recordId 记录ID + * @param adminId 管理员ID + */ + @Override + public void refundAgain(Integer recordId, Integer adminId) { + // 开启事务 + TransactionStatus transactionStatus = transactionManager.getTransaction(transactionDefinition); + + RefundLog log = null; + try { + RefundRecord refundRecord = refundRecordMapper.selectById(recordId); + RechargeOrder rechargeOrder = rechargeOrderMapper.selectById(refundRecord.getOrderId()); + + Assert.notNull(rechargeOrder, "充值订单丢失!"); + + log = refundLogMapper.selectOne(new QueryWrapper() + .eq("record_id", recordId) + .last("limit 1")); + + log.setRefundStatus(RefundEnum.REFUND_ING.getCode()); + refundLogMapper.updateById(log); + + // 发起退款请求 + RefundRequestV3 requestV3 = new RefundRequestV3(); + requestV3.setTransactionId(refundRecord.getTransactionId()); + requestV3.setOutTradeNo(refundRecord.getOrderSn()); + requestV3.setOutRefundNo(refundRecord.getSn()); + requestV3.setTotalAmount(AmountUtil.yuan2Fen(rechargeOrder.getOrderAmount().toString())); + requestV3.setRefundAmount(AmountUtil.yuan2Fen(refundRecord.getOrderAmount().toString())); + WxPayDriver.refund(requestV3); + + log.setRefundStatus(RefundEnum.REFUND_SUCCESS.getCode()); + refundLogMapper.updateById(log); + transactionManager.commit(transactionStatus); + } catch (Exception e) { + transactionManager.rollback(transactionStatus); + if (StringUtils.isNotNull(log)) { + log.setRefundStatus(RefundEnum.REFUND_ERROR.getCode()); + refundLogMapper.updateById(log); + } + throw new OperateException(e.getMessage()); + } + } + + @Override + public JSONObject getExportData(PageValidate pageValidate, FinanceRechargeSearchValidate searchValidate) { + Integer page = pageValidate.getPage_no(); + Integer limit = pageValidate.getPage_size(); + PageResult userVoPageResult = this.list(pageValidate, searchValidate); + JSONObject ret = ToolUtils.getExportData(userVoPageResult.getCount(), limit, searchValidate.getPage_start(), searchValidate.getPage_end(),"充值列表"); + return ret; + } + + @Override + public String export(FinanceRechargeSearchValidate searchValidate) { + PageValidate pageValidate = new PageValidate(); + if (StringUtils.isNotNull(searchValidate.getPage_start())) { + pageValidate.setPage_no(searchValidate.getPage_start()); + } else { + pageValidate.setPage_no(1); + } + + if (StringUtils.isNotNull(searchValidate.getPage_end()) && StringUtils.isNotNull(searchValidate.getPage_size())) { + pageValidate.setPage_size(searchValidate.getPage_end() * searchValidate.getPage_size()); + } else { + pageValidate.setPage_size(20); + } + Boolean isAll = StringUtils.isNull(searchValidate.getPage_type()) || searchValidate.getPage_type().equals(0) ? true : false; + List excellist = this.getExcellist(isAll, pageValidate, searchValidate); + String fileName = StringUtils.isNull(searchValidate.getFile_name()) ? ToolUtils.makeUUID() : searchValidate.getFile_name(); + String folderPath = "/excel/export/"+ TimeUtils.timestampToDay(System.currentTimeMillis() / 1000) +"/" ; + String path = folderPath + fileName +".xlsx"; + String filePath = YmlUtils.get("like.upload-directory") + path; + File folder = new File(YmlUtils.get("like.upload-directory") + folderPath); + if (!folder.exists()) { + if (!folder.mkdirs()) { + throw new OperateException("创建文件夹失败"); + } + } + EasyExcel.write(filePath) + .head(FinanceRechargeListExportVo.class) + .excelType(ExcelTypeEnum.XLSX) + .sheet("充值记录") + .doWrite(excellist); + return UrlUtils.toAdminAbsoluteUrl(path); + } + + private List getExcellist(boolean isAll, PageValidate pageValidate, FinanceRechargeSearchValidate searchValidate) { + Integer pageNo = pageValidate.getPage_no(); + Integer pageSize = pageValidate.getPage_size(); + + MPJQueryWrapper mpjQueryWrapper = new MPJQueryWrapper<>(); + mpjQueryWrapper.selectAll(RechargeOrder.class) + .select("U.id as user_id,U.account,U.nickname,U.avatar,t.sn AS sn") + .leftJoin("?_user U ON U.id=t.user_id".replace("?_", GlobalConfig.tablePrefix)) + .orderByDesc("id"); + + rechargeOrderMapper.setSearch(mpjQueryWrapper, searchValidate, new String[]{ + "like:sn@t.sn:str", + "=:pay_way@t.pay_way:int", + "=:pay_status@t.pay_status:int", + "datetime:start_time-end_time@create_time:long", + }); + + if (StringUtils.isNotEmpty(searchValidate.getUser_info())) { + String keyword = searchValidate.getUser_info(); + mpjQueryWrapper.nested(wq->wq + .like("U.nickname", keyword).or() + .like("U.sn", keyword).or() + .like("U.mobile", keyword)); + } + List retList = new ArrayList<>(); + if (isAll) { + retList = rechargeOrderMapper.selectJoinList(FinanceRechargeListExportVo.class, mpjQueryWrapper); + } else { + IPage iPage = rechargeOrderMapper.selectJoinPage( + new Page<>(pageNo, pageSize), + FinanceRechargeListExportVo.class, + mpjQueryWrapper); + retList = iPage.getRecords(); + } + for (FinanceRechargeListExportVo vo : retList) { + vo.setCreateTime(TimeUtils.timestampToDate(vo.getCreateTime())); + vo.setPayTime(TimeUtils.timestampToDate(vo.getPayTime())); + vo.setAvatar(UrlUtils.toAdminAbsoluteUrl(vo.getAvatar())); + vo.setPayWay(vo.getPayWay()); + vo.setPayWayText(PaymentEnum.getPayWayMsg(Integer.parseInt(vo.getPayWay()))); + vo.setPayStatusText(PaymentEnum.getPayStatusMsg(vo.getPayStatus())); + } + return retList; + } +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/FinanceRefundServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/FinanceRefundServiceImpl.java new file mode 100644 index 0000000..b2de66a --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/FinanceRefundServiceImpl.java @@ -0,0 +1,143 @@ +package com.yj.admin.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.query.MPJQueryWrapper; +import com.yj.admin.service.IFinanceRefundService; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.finance.FinanceRefundSearchValidate; +import com.yj.admin.vo.finance.FinanceRefundListVo; +import com.yj.admin.vo.finance.FinanceRefundLogVo; +import com.yj.common.config.GlobalConfig; +import com.yj.common.core.PageResult; +import com.yj.common.entity.RefundLog; +import com.yj.common.entity.RefundRecord; +import com.yj.common.enums.PaymentEnum; +import com.yj.common.enums.RefundEnum; +import com.yj.common.mapper.RefundLogMapper; +import com.yj.common.mapper.RefundRecordMapper; +import com.yj.common.util.StringUtils; +import com.yj.common.util.TimeUtils; +import com.yj.common.util.UrlUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * 退款记录服务实现类 + */ +@Service +public class FinanceRefundServiceImpl implements IFinanceRefundService { + + @Resource + RefundRecordMapper refundRecordMapper; + + @Resource + RefundLogMapper refundLogMapper; + + /** + * 退款记录列表 + * + * @author fzr + * @param pageValidate 分页参数 + * @param searchValidate 搜索参数 + * @return PageResult + */ + @Override + public PageResult list(PageValidate pageValidate, FinanceRefundSearchValidate searchValidate) { + Integer pageNo = pageValidate.getPage_no(); + Integer pageSize = pageValidate.getPage_size(); + + MPJQueryWrapper mpjQueryWrapper = new MPJQueryWrapper<>(); + mpjQueryWrapper.selectAll(RefundRecord.class) + .select("U.id as user_id,U.nickname,U.avatar, U.account") + .leftJoin("?_user U ON U.id=t.user_id".replace("?_", GlobalConfig.tablePrefix)) + .orderByDesc("id"); + + refundRecordMapper.setSearch(mpjQueryWrapper, searchValidate, new String[]{ + "like:sn@t.sn:str", + "like:order_sn@t.order_sn:str", + "=:refund_type@t.refund_type:int", + "=:refund_status@t.refund_status:int", + "datetime:start_time-end_time@t.create_time:str", + }); + + + if (StringUtils.isNotEmpty(searchValidate.getUser_info())) { + String keyword = searchValidate.getUser_info(); + mpjQueryWrapper.nested(wq->wq + .like("U.nickname", keyword).or() + .like("U.account", keyword).or() + .like("U.sn", keyword).or() + .like("U.mobile", keyword)); + } + + IPage iPage = refundRecordMapper.selectJoinPage( + new Page<>(pageNo, pageSize), + FinanceRefundListVo.class, + mpjQueryWrapper); + + for (FinanceRefundListVo vo : iPage.getRecords()) { + vo.setRefundTypeText(RefundEnum.getRefundTypeMsg(vo.getRefundType())); + vo.setRefundStatusText(RefundEnum.getRefundStatusMsg(vo.getRefundStatus())); + vo.setRefundWayText(PaymentEnum.getPayWayMsg(vo.getRefundWay())); + vo.setCreateTime(TimeUtils.timestampToDate(vo.getCreateTime())); + vo.setAvatar(UrlUtils.toAdminAbsoluteUrl(vo.getAvatar())); + } + + Map extend = new LinkedHashMap<>(); + extend.put("total", refundRecordMapper.selectCount(null)); + extend.put("ing", refundRecordMapper.selectCount(new QueryWrapper().eq("refund_status", 0))); + extend.put("success", refundRecordMapper.selectCount(new QueryWrapper().eq("refund_status", 1))); + extend.put("error", refundRecordMapper.selectCount(new QueryWrapper().eq("refund_status", 2))); + + Map stat = new LinkedHashMap<>(); + stat.put("totalRefundAmount", refundRecordMapper.sum("order_amount", new QueryWrapper<>())); + stat.put("ingRefundAmount", refundRecordMapper.sum("order_amount", new QueryWrapper().eq("refund_status", 0))); + stat.put("successRefundAmount", refundRecordMapper.sum("order_amount", new QueryWrapper().eq("refund_status", 1))); + stat.put("errorRefundAmount", refundRecordMapper.sum("order_amount", new QueryWrapper().eq("refund_status", 2))); + extend.put("stat", stat); + + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), iPage.getRecords(), extend); + } + + /** + * 退款日志 + * + * @author fzr + * @param recordId 记录ID + * @return List + */ + @Override + public List log(Integer recordId) { + MPJQueryWrapper mpjQueryWrapper = new MPJQueryWrapper<>(); + mpjQueryWrapper.selectAll(RefundLog.class) + .select("sa.name as handler") + .eq("t.record_id", recordId) + .innerJoin("?_admin sa ON sa.id=t.handle_id".replace("?_", GlobalConfig.tablePrefix)) + .orderByDesc("t.id"); + + List list = refundLogMapper.selectJoinList(FinanceRefundLogVo.class, mpjQueryWrapper); + + for (FinanceRefundLogVo vo : list) { + vo.setRefundStatusText(RefundEnum.getRefundStatusMsg(vo.getRefundStatus())); + vo.setCreateTime(TimeUtils.timestampToDate(vo.getCreateTime())); + } + + return list; + } + + @Override + public Map stat() { + Map stat = new LinkedHashMap<>(); + stat.put("total", refundRecordMapper.sum("order_amount", new QueryWrapper<>())); + stat.put("ing", refundRecordMapper.sum("order_amount", new QueryWrapper().eq("refund_status", 0))); + stat.put("success", refundRecordMapper.sum("order_amount", new QueryWrapper().eq("refund_status", 1))); + stat.put("error", refundRecordMapper.sum("order_amount", new QueryWrapper().eq("refund_status", 2))); + return stat; + } +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/FinanceWalletServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/FinanceWalletServiceImpl.java new file mode 100644 index 0000000..82d844f --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/FinanceWalletServiceImpl.java @@ -0,0 +1,79 @@ +package com.yj.admin.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.query.MPJQueryWrapper; +import com.yj.admin.service.IFinanceWalletService; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.finance.FinanceWalletSearchValidate; +import com.yj.admin.vo.finance.FinanceWalletListVo; +import com.yj.common.config.GlobalConfig; +import com.yj.common.core.PageResult; +import com.yj.common.entity.log.UserAccountLog; +import com.yj.common.enums.LogMoneyEnum; +import com.yj.common.mapper.log.UserAccountLogMapper; +import com.yj.common.util.StringUtils; +import com.yj.common.util.TimeUtils; +import com.yj.common.util.UrlUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 用户余额记录服务实现类 + */ +@Service +public class FinanceWalletServiceImpl implements IFinanceWalletService { + + @Resource + UserAccountLogMapper logMoneyMapper; + + @Override + public PageResult list(PageValidate pageValidate, FinanceWalletSearchValidate searchValidate) { + Integer pageNo = pageValidate.getPage_no(); + Integer pageSize = pageValidate.getPage_size(); + + MPJQueryWrapper mpjQueryWrapper = new MPJQueryWrapper<>(); + mpjQueryWrapper.selectAll(UserAccountLog.class) + .select("U.id as user_id,U.sn as sn,U.nickname,U.avatar, U.account, U.mobile") + .leftJoin("?_user U ON U.id=t.user_id".replace("?_", GlobalConfig.tablePrefix)) + .orderByDesc("id"); + + logMoneyMapper.setSearch(mpjQueryWrapper, searchValidate, new String[]{ + "=:change_type@t.change_type:int", + "datetime:start_time-end_time@t.create_time:str", + }); + + if (StringUtils.isNotEmpty(searchValidate.getUser_info())) { + String keyword = searchValidate.getUser_info(); + mpjQueryWrapper.nested(wq->wq + .like("U.nickname", keyword).or() + .like("U.account", keyword).or() + .like("U.sn", keyword).or() + .like("U.mobile", keyword)); + } + + IPage iPage = logMoneyMapper.selectJoinPage( + new Page<>(pageNo, pageSize), + FinanceWalletListVo.class, + mpjQueryWrapper); + + for (FinanceWalletListVo vo : iPage.getRecords()) { + vo.setCreateTime(TimeUtils.timestampToDate(vo.getCreateTime())); + vo.setChangeTypeDesc(LogMoneyEnum.getMsgByCode(Integer.parseInt(vo.getChangeType()))); + vo.setAvatar(UrlUtils.toAdminAbsoluteUrl(vo.getAvatar())); + } + + Map extend = new LinkedHashMap<>(); + extend.put("changeType", LogMoneyEnum.getTypeList()); + + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), iPage.getRecords(), extend); + } + + @Override + public Map getUmChangeType() { + return LogMoneyEnum.getTypeList(); + } +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/IndexServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/IndexServiceImpl.java new file mode 100644 index 0000000..a7f6e0a --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/IndexServiceImpl.java @@ -0,0 +1,150 @@ +package com.yj.admin.service.impl; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.yj.admin.service.IIndexService; +import com.yj.common.config.GlobalConfig; +import com.yj.common.util.*; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * 主页服务实现类 + */ +@Service +public class IndexServiceImpl implements IIndexService { + + /** + * 控制台数据 + * + * @author fzr + * @return Map + */ + @Override + public Map index() { + Map console = new LinkedHashMap<>(); + + // 版本信息 + Map version = new LinkedHashMap<>(); + version.put("name", ConfigUtils.get("website", "name", "LikeAdmin-Java")); + version.put("version", GlobalConfig.version); + version.put("website", "www.likeadmin.cn"); + version.put("based", "Vue3.x、ElementUI、MySQL"); + Map channel = new LinkedHashMap<>(); + channel.put("gitee", "https://gitee.com/likeadmin/likeadmin_java"); + channel.put("website", "https://www.likeadmin.cn"); + version.put("channel", channel); + console.put("version", version); + + // 今日数据 + Map today = new LinkedHashMap<>(); + today.put("time", "2022-08-11 15:08:29"); + today.put("today_visitor", 10); // 访问量(人) + today.put("total_visitor", 100); // 总访问量 + today.put("today_sales", 30); // 销售额(元) + today.put("total_sales", 65); // 总销售额 + today.put("order_num", 12); // 订单量(笔) + today.put("order_sum", 255); // 总订单量 + today.put("today_new_user", 120); // 新增用户 + today.put("total_new_user", 360); // 总访用户 + console.put("today", today); + + // 访客图表 + Map visitor = new LinkedHashMap<>(); + visitor.put("date", TimeUtils.daysAgoDate(15)); + visitor.put("list", new JSONArray() {{ + add(new JSONObject() {{ + put("name", "访客数"); + put("data", Arrays.asList(12,13,11,5,8,22,14,9,456,62,78,12,18,22,46)); + }}); + }}); + console.put("visitor", visitor); + + console.put("menu", new JSONArray() {{ + + add(new JSONObject() {{ + put("name", "管理员"); + put("image", UrlUtils.toAdminAbsoluteUrl("/api/static/menu_admin.png")); + put("url", "/permission/admin"); + }}); + + add(new JSONObject() {{ + put("name", "角色管理"); + put("image", UrlUtils.toAdminAbsoluteUrl("/api/static/menu_role.png")); + put("url", "/permission/role"); + }}); + + add(new JSONObject() {{ + put("name", "部门管理"); + put("image", UrlUtils.toAdminAbsoluteUrl("/api/static/menu_dept.png")); + put("url", "/organization/department"); + }}); + + add(new JSONObject() {{ + put("name", "字典管理"); + put("image", UrlUtils.toAdminAbsoluteUrl("/api/static/menu_dict.png")); + put("url", "/dev_tools/dict"); + }}); + + add(new JSONObject() {{ + put("name", "代码生成器"); + put("image", UrlUtils.toAdminAbsoluteUrl("/api/static/menu_generator.png")); + put("url", "/dev_tools/code"); + }}); + + add(new JSONObject() {{ + put("name", "素材中心"); + put("image", UrlUtils.toAdminAbsoluteUrl("/api/static/menu_file.png")); + put("url", "/material/index"); + }}); + + add(new JSONObject() {{ + put("name", "菜单权限"); + put("image", UrlUtils.toAdminAbsoluteUrl("/api/static/menu_auth.png")); + put("url", "/permission/menu"); + }}); + + add(new JSONObject() {{ + put("name", "网站信息"); + put("image", UrlUtils.toAdminAbsoluteUrl("/api/static/menu_website.png")); + put("url", "/setting/website/information"); + }}); + + }}); + + + return console; + } + + /** + * 公共配置 + * + * @author fzr + * @return Map + */ + @Override + public Map config() { + Map website = ConfigUtils.get("website"); + String copyright = ConfigUtils.get("copyright", "config", ""); + + String captchaStatus = YmlUtils.get("like.captcha.status"); + + Map map = new LinkedHashMap<>(); + // 文件域名 + map.put("oss_domain", UrlUtils.domain()); + //map.put("loginCaptcha", StringUtils.isNotNull(captchaStatus) && captchaStatus.equals("true")); + // 网站名称 + map.put("web_name", website.getOrDefault("name", "")); + // 网站图标 + map.put("web_favicon", UrlUtils.toAdminAbsoluteUrl(website.getOrDefault("web_favicon", ""))); + // 网站logo + map.put("web_logo", UrlUtils.toAdminAbsoluteUrl(website.getOrDefault("web_logo", ""))); + // 登录页 + map.put("login_image", UrlUtils.toAdminAbsoluteUrl(website.getOrDefault("login_image", ""))); + // 版权信息 + map.put("copyright_config", ListUtils.stringToListAsMapStr(copyright)); + return map; + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/MarketingRechargeServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/MarketingRechargeServiceImpl.java new file mode 100644 index 0000000..a23dbe8 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/MarketingRechargeServiceImpl.java @@ -0,0 +1,46 @@ +package com.yj.admin.service.impl; + +import com.yj.admin.service.IMarketingRechargeService; +import com.yj.admin.validate.marketing.MarketingRechargeValidate; +import com.yj.admin.vo.marketing.MarketingRechargeVo; +import com.yj.common.util.ConfigUtils; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.Map; + +/** + * 营销充值服务实现类 + */ +@Service +public class MarketingRechargeServiceImpl implements IMarketingRechargeService { + + /** + * 充值配置详情 + * + * @author fzr + * @return MarketingRechargeVo + */ + @Override + public MarketingRechargeVo detail() { + Map config = ConfigUtils.get("recharge"); + + MarketingRechargeVo vo = new MarketingRechargeVo(); + vo.setStatus(Integer.parseInt(config.getOrDefault("status", "0"))); + vo.setMinAmount(new BigDecimal(config.getOrDefault("min_amount", "0"))); + return vo; + } + + /** + * 充值配置保存 + * + * @author fzr + * @param rechargeValidate 充值参数 + */ + @Override + public void save(MarketingRechargeValidate rechargeValidate) { + ConfigUtils.set("recharge", "status", rechargeValidate.getStatus().toString()); + ConfigUtils.set("recharge", "min_amount", rechargeValidate.getMinAmount().toString()); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/SettingCopyrightServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingCopyrightServiceImpl.java new file mode 100644 index 0000000..c4cb925 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingCopyrightServiceImpl.java @@ -0,0 +1,53 @@ +package com.yj.admin.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.yj.admin.service.ISettingCopyrightService; +import com.yj.admin.validate.setting.SettingCopyrightValidate; +import com.yj.admin.vo.setting.SettingCopyrightVo; +import com.yj.common.util.ListUtils; +import com.yj.common.util.ConfigUtils; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * 网站备案服务实现类 + */ +@Service +public class SettingCopyrightServiceImpl implements ISettingCopyrightService { + + /** + * 获取网站备案信息 + * + * @author fzr + * @return List + */ + @Override + public List getCopyright() { + String config = ConfigUtils.get("copyright", "config", "[]"); + List> copyright = ListUtils.stringToListAsMapStr(config); + + List list = new LinkedList<>(); + for (Map map : copyright) { + SettingCopyrightVo vo = new SettingCopyrightVo(); + vo.setKey(map.getOrDefault("key", "")); + vo.setValue(map.getOrDefault("value", "")); + list.add(vo); + } + + return list; + } + + /** + * 保存网站备案信息 + * + * @author fzr + * @param copyrightValidate 参数 + */ + @Override + public void setCopyright(SettingCopyrightValidate copyrightValidate) { + String s = JSON.toJSONString(copyrightValidate.getConfig()); + ConfigUtils.set("copyright", "config", s); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/SettingDictDataServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingDictDataServiceImpl.java new file mode 100644 index 0000000..5b8cdbe --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingDictDataServiceImpl.java @@ -0,0 +1,232 @@ +package com.yj.admin.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yj.admin.service.ISettingDictDataService; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.setting.DictDataCreateValidate; +import com.yj.admin.validate.setting.DictDataUpdateValidate; +import com.yj.admin.vo.setting.SettingDictDataVo; +import com.yj.common.core.PageResult; +import com.yj.common.entity.setting.DictData; +import com.yj.common.entity.setting.DictType; +import com.yj.common.mapper.setting.DictDataMapper; +import com.yj.common.mapper.setting.DictTypeMapper; +import com.yj.common.util.StringUtils; +import com.yj.common.util.TimeUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * 字典数据服务实现类 + */ +@Service +public class SettingDictDataServiceImpl implements ISettingDictDataService { + + @Resource + DictDataMapper dictDataMapper; + + @Resource + DictTypeMapper dictTypeMapper; + + /** + * 字典数据所有 + * + * @author fzr + * @return List + */ + @Override + public List all(Map params) { + DictType dictType = dictTypeMapper.selectOne(new QueryWrapper() + .eq("dict_type", params.get("dictType")) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(dictType, "该字典类型不存在!"); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("id,type_id,name,type_value, value,remark,sort,status,create_time,update_time"); + queryWrapper.isNull("delete_time"); + queryWrapper.eq("type_id", dictType.getId()); + queryWrapper.orderByDesc("id"); + + dictDataMapper.setSearch(queryWrapper, params, new String[]{ + "like:name:str", + "like:value:str", + "=:status:int", + }); + + List dictDataList = dictDataMapper.selectList(queryWrapper); + + List list = new LinkedList<>(); + for (DictData dictData : dictDataList) { + SettingDictDataVo vo = new SettingDictDataVo(); + BeanUtils.copyProperties(dictData, vo); + + vo.setCreateTime(TimeUtils.timestampToDate(dictData.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(dictData.getUpdateTime())); + list.add(vo); + } + + return list; + } + + /** + * 字典数据列表 + * + * @author fzr + * @param pageValidate 分页参数 + * @param params 搜索参数 + * @return PageResult + */ + @Override + public PageResult list(PageValidate pageValidate, Map params) { + Integer page = pageValidate.getPage_no(); + Integer limit = pageValidate.getPage_size(); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("id,type_id,name,type_value,value,remark,sort,status,create_time,update_time"); + + queryWrapper.isNull("delete_time"); + queryWrapper.orderByDesc("id"); + + if (StringUtils.isNotEmpty(params.get("type_id"))) { + DictType dictType = dictTypeMapper.selectOne(new QueryWrapper() + .isNull("delete_time") + .eq("id", params.get("type_id")) + .last("limit 1")); + + Assert.notNull(dictType, "该字典类型不存在!"); + + queryWrapper.eq("type_id", dictType.getId()); + } + + + dictDataMapper.setSearch(queryWrapper, params, new String[]{ + "like:name:str", + "like:value:str", + "=:status:int", + }); + + IPage iPage = dictDataMapper.selectPage(new Page<>(page, limit), queryWrapper); + + List list = new LinkedList<>(); + for (DictData dictData : iPage.getRecords()) { + SettingDictDataVo vo = new SettingDictDataVo(); + BeanUtils.copyProperties(dictData, vo); + + vo.setCreateTime(TimeUtils.timestampToDate(dictData.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(dictData.getUpdateTime())); + list.add(vo); + } + + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list); + } + + /** + * 字典数据详情 + * + * @author fzr + * @param id 主键 + * @return DictDataVo + */ + @Override + public SettingDictDataVo detail(Integer id) { + DictData dictData = dictDataMapper.selectOne(new QueryWrapper() + .select("id,type_id,name,value,remark,sort,status,create_time,update_time") + .eq("id", id) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(dictData, "字典数据不存在!"); + + SettingDictDataVo vo = new SettingDictDataVo(); + BeanUtils.copyProperties(dictData, vo); + vo.setCreateTime(TimeUtils.timestampToDate(dictData.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(dictData.getUpdateTime())); + return vo; + } + + /** + * 字典数据新增 + * + * @author fzr + * @param createValidate 参数 + */ + @Override + public void add(DictDataCreateValidate createValidate) { + Assert.isNull(dictDataMapper.selectOne(new QueryWrapper() + .select("id") + .eq("name", createValidate.getName()) + .isNull("delete_time") + .last("limit 1")), "字典数据已存在!"); + + DictData model = new DictData(); + model.setTypeId(createValidate.getTypeId()); + model.setName(createValidate.getName()); + model.setValue(createValidate.getValue()); + model.setTypeValue(createValidate.getTypeValue()); + model.setRemark(createValidate.getRemark()); + model.setSort(createValidate.getSort()); + model.setStatus(createValidate.getStatus()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setUpdateTime(System.currentTimeMillis() / 1000); + dictDataMapper.insert(model); + } + + /** + * 字典数据编辑 + * + * @author fzr + * @param updateValidate 参数 + */ + @Override + public void edit(DictDataUpdateValidate updateValidate) { + DictData model = dictDataMapper.selectOne(new QueryWrapper() + .eq("id", updateValidate.getId()) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(model, "字典数据不存在!"); + + Assert.isNull(dictDataMapper.selectOne(new QueryWrapper() + .select("id") + .ne("id", updateValidate.getId()) + .eq("name", updateValidate.getName()) + .isNull("delete_time") + .last("limit 1")), "字典数据已存在!"); + + model.setName(updateValidate.getName()); + model.setValue(updateValidate.getValue()); + model.setTypeValue(updateValidate.getTypeValue()); + model.setRemark(updateValidate.getRemark()); + model.setSort(updateValidate.getSort()); + model.setStatus(updateValidate.getStatus()); + model.setUpdateTime(System.currentTimeMillis() / 1000); + dictDataMapper.updateById(model); + } + + /** + * 字典数据删除 + * + * @author fzr + * @param ids 主键 + */ + @Override + public void del(List ids) { + for (Integer id : ids) { + DictData model = new DictData(); + model.setId(id); + model.setDeleteTime(System.currentTimeMillis() / 1000); + dictDataMapper.updateById(model); + } + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/SettingDictTypeServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingDictTypeServiceImpl.java new file mode 100644 index 0000000..6c35b29 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingDictTypeServiceImpl.java @@ -0,0 +1,202 @@ +package com.yj.admin.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yj.admin.service.ISettingDictTypeService; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.setting.DictTypeCreateValidate; +import com.yj.admin.validate.setting.DictTypeUpdateValidate; +import com.yj.admin.vo.setting.SettingDictTypeVo; +import com.yj.common.core.PageResult; +import com.yj.common.entity.setting.DictType; +import com.yj.common.mapper.setting.DictTypeMapper; +import com.yj.common.util.TimeUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * 字典类型服务实现类 + */ +@Service +public class SettingDictTypeServiceImpl implements ISettingDictTypeService { + + @Resource + DictTypeMapper dictTypeMapper; + + /** + * 字典类型所有 + * + * @author fzr + * @return List + */ + @Override + public List all() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("id,name,type,remark,status,create_time,update_time"); + queryWrapper.isNull("delete_time"); + queryWrapper.orderByDesc("id"); + + List dictTypeList = dictTypeMapper.selectList(queryWrapper); + + List list = new LinkedList<>(); + for (DictType dictType : dictTypeList) { + SettingDictTypeVo vo = new SettingDictTypeVo(); + BeanUtils.copyProperties(dictType, vo); + + vo.setCreateTime(TimeUtils.timestampToDate(dictType.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(dictType.getUpdateTime())); + list.add(vo); + } + + return list; + } + + /** + * 字典类型列表 + * + * @author fzr + * @param pageValidate 分页参数 + * @param params 搜索参数 + * @return PageResult + */ + @Override + public PageResult list(PageValidate pageValidate, Map params) { + Integer page = pageValidate.getPage_no(); + Integer limit = pageValidate.getPage_size(); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("id,name,type,remark,status,create_time,update_time"); + queryWrapper.isNull("delete_time"); + queryWrapper.orderByDesc("id"); + + dictTypeMapper.setSearch(queryWrapper, params, new String[]{ + "like:name@name:str", + "like:type@type:str", + "=:status@status:int", + }); + + IPage iPage = dictTypeMapper.selectPage(new Page<>(page, limit), queryWrapper); + + List list = new LinkedList<>(); + for (DictType dictType : iPage.getRecords()) { + SettingDictTypeVo vo = new SettingDictTypeVo(); + BeanUtils.copyProperties(dictType, vo); + vo.setCreateTime(TimeUtils.timestampToDate(dictType.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(dictType.getUpdateTime())); + list.add(vo); + } + + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list); + } + + /** + * 字典类型详情 + * + * @author fzr + * @param id 主键 + * @return DictDataVo + */ + @Override + public SettingDictTypeVo detail(Integer id) { + DictType dictType = dictTypeMapper.selectOne(new QueryWrapper() + .select("id,name,type,remark,status,create_time,update_time") + .eq("id", id) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(dictType, "字典类型不存在!"); + + SettingDictTypeVo vo = new SettingDictTypeVo(); + BeanUtils.copyProperties(dictType, vo); + vo.setCreateTime(TimeUtils.timestampToDate(dictType.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(dictType.getUpdateTime())); + return vo; + } + + /** + * 字典类型新增 + * + * @author fzr + * @param createValidate 参数 + */ + @Override + public void add(DictTypeCreateValidate createValidate) { + Assert.isNull(dictTypeMapper.selectOne(new QueryWrapper() + .select("id") + .eq("name", createValidate.getName()) + .isNull("delete_time") + .last("limit 1")), "字典名称已存在!"); + + Assert.isNull(dictTypeMapper.selectOne(new QueryWrapper() + .select("id") + .eq("type", createValidate.getType()) + .isNull("delete_time") + .last("limit 1")), "字典类型已存在!"); + + DictType model = new DictType(); + model.setName(createValidate.getName()); + model.setType(createValidate.getType()); + model.setRemark(createValidate.getRemark()); + model.setStatus(createValidate.getStatus()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setUpdateTime(System.currentTimeMillis() / 1000); + dictTypeMapper.insert(model); + } + + /** + * 字典类型编辑 + * + * @author fzr + * @param updateValidate 参数 + */ + @Override + public void edit(DictTypeUpdateValidate updateValidate) { + DictType model = dictTypeMapper.selectOne(new QueryWrapper() + .eq("id", updateValidate.getId()) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(model, "字典类型不存在!"); + + Assert.isNull(dictTypeMapper.selectOne(new QueryWrapper() + .ne("id", updateValidate.getId()) + .eq("name", updateValidate.getName()) + .isNull("delete_time") + .last("limit 1")), "字典类型已存在!"); + + Assert.isNull(dictTypeMapper.selectOne(new QueryWrapper() + .ne("id", updateValidate.getId()) + .eq("type", updateValidate.getType()) + .isNull("delete_time") + .last("limit 1")), "字典类型已存在!"); + + model.setName(updateValidate.getName()); + model.setType(updateValidate.getType()); + model.setRemark(updateValidate.getRemark()); + model.setStatus(updateValidate.getStatus()); + model.setUpdateTime(System.currentTimeMillis() / 1000); + dictTypeMapper.updateById(model); + } + + /** + * 字典类型删除 + * + * @author fzr + * @param id 主键 + */ + @Override + public void del(Integer id) { + DictType model = new DictType(); + model.setId(id); + model.setDeleteTime(System.currentTimeMillis() / 1000); + dictTypeMapper.updateById(model); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/SettingLoginServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingLoginServiceImpl.java new file mode 100644 index 0000000..5072225 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingLoginServiceImpl.java @@ -0,0 +1,61 @@ +package com.yj.admin.service.impl; + +import com.alibaba.fastjson2.JSONArray; +import com.yj.admin.service.ISettingLoginService; +import com.yj.admin.validate.setting.SettingLoginValidate; +import com.yj.admin.vo.setting.SettingLoginVo; +import com.yj.common.util.ConfigUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import java.util.Map; + +/** + * 登录设置服务接口类 + */ +@Service +public class SettingLoginServiceImpl implements ISettingLoginService { + + /** + * 登录设置详情 + * + * @author fzr + * @return SettingLoginVo + */ + @Override + public SettingLoginVo getRegisterConfig() { + Map config = ConfigUtils.get("login"); + + SettingLoginVo vo = new SettingLoginVo(); + vo.setLoginWay(JSONArray.parse(config.getOrDefault("login_way", ""))); + vo.setCoerceMobile(Integer.parseInt(config.getOrDefault("coerce_mobile", "0"))); + vo.setLoginAgreement(Integer.parseInt(config.getOrDefault("login_agreement", "0"))); + vo.setThirdAuth(Integer.parseInt(config.getOrDefault("third_auth", "0"))); + vo.setWechatAuth(Integer.parseInt(config.getOrDefault("wechat_auth", "0"))); + vo.setQqAuth(Integer.parseInt(config.getOrDefault("qq_auth", "0"))); + return vo; + } + + /** + * 登录设置保存 + * + * @author fzr + * @param loginValidate 参数 + */ + @Override + public void setRegisterConfig(SettingLoginValidate loginValidate) { + + JSONArray loginway = loginValidate.getLoginWay(); + + Assert.isTrue(loginway != null && loginway.size() > 0, "系统通用登录方式,至少选择一项"); + + + ConfigUtils.set("login", "login_way", loginValidate.getLoginWay().toJSONString()); + ConfigUtils.set("login", "coerce_mobile", String.valueOf(loginValidate.getCoerceMobile())); + ConfigUtils.set("login", "login_agreement", String.valueOf(loginValidate.getLoginAgreement())); + ConfigUtils.set("login", "third_auth", String.valueOf(loginValidate.getThirdAuth())); + ConfigUtils.set("login", "wechat_auth", String.valueOf(loginValidate.getWechatAuth())); + ConfigUtils.set("login", "qq_auth", String.valueOf(loginValidate.getQqAuth())); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/SettingNoticeServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingNoticeServiceImpl.java new file mode 100644 index 0000000..c503659 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingNoticeServiceImpl.java @@ -0,0 +1,125 @@ +package com.yj.admin.service.impl; + +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.admin.service.ISettingNoticeService; +import com.yj.admin.vo.setting.SettingNoticeDetailVo; +import com.yj.admin.vo.setting.SettingNoticeListedVo; +import com.yj.common.entity.notice.NoticeSetting; +import com.yj.common.mapper.notice.NoticeSettingMapper; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.LinkedList; +import java.util.List; + +/** + * 通知设置服务实现类 + */ +@Service +public class SettingNoticeServiceImpl implements ISettingNoticeService { + + @Resource + NoticeSettingMapper noticeSettingMapper; + + /** + * 通知设置列表 + * + * @author fzr + * @param recipient 1=用户, 2=平台 + * @return List + */ + @Override + public List list(Integer recipient) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("recipient", recipient); + queryWrapper.orderByAsc("id"); + + List noticeSettings = noticeSettingMapper.selectList(queryWrapper); + List list = new LinkedList<>(); + for (NoticeSetting n : noticeSettings) { + SettingNoticeListedVo vo = new SettingNoticeListedVo(); + BeanUtils.copyProperties(n, vo); + JSONObject systemNotice = JSONObject.parse(n.getSystemNotice()); + JSONObject smsNotice = JSONObject.parse(n.getSmsNotice()); + JSONObject oaNotice = JSONObject.parse(n.getOaNotice()); + JSONObject mnpNotice = JSONObject.parse(n.getMnpNotice()); + if (systemNotice != null && "1".equals(systemNotice.getString("status"))) { + vo.setSmsNotice(systemNotice); + } + + if (smsNotice != null && "1".equals(smsNotice.getString("status"))) { + vo.setSmsNotice(smsNotice); + } + + if (oaNotice != null && "1".equals(oaNotice.getString("status"))) { + vo.setSmsNotice(oaNotice); + } + + if (mnpNotice != null && "1".equals(mnpNotice.getString("status"))) { + vo.setSmsNotice(mnpNotice); + } + vo.setTypeDesc(n.getType()==1?"业务通知":"验证码"); + list.add(vo); + } + + return list; + } + + /** + * 通知设置详情 + * + * @author fzr + * @param id 主键 + * @return NoticeSettingDetailVo + * + */ + @Override + public SettingNoticeDetailVo detail(Integer id) { + NoticeSetting noticeSetting = noticeSettingMapper.selectOne(new QueryWrapper() + .select(NoticeSetting.class, info -> + !info.getColumn().equals("update_time") + ) + .eq("id", id) + .last("limit 1")); + + + SettingNoticeDetailVo vo = new SettingNoticeDetailVo(); + BeanUtils.copyProperties(noticeSetting, vo); + vo.setType(noticeSetting.getType().equals(1)?"业务通知":"验证码"); + vo.setSystemNotice(JSONObject.parse(noticeSetting.getSystemNotice())); + vo.setOaNotice(JSONObject.parse(noticeSetting.getOaNotice())); + vo.setMnpNotice(JSONObject.parse(noticeSetting.getMnpNotice())); + vo.setSmsNotice(JSONObject.parse(noticeSetting.getSmsNotice())); + return vo; + } + + /** + * 通知设置保存 + * + * @author fzr + * @param params 参数 + */ + @Override + public void save(JSONObject params) { + Integer id = Integer.parseInt(params.get("id").toString()); + NoticeSetting noticeSetting = noticeSettingMapper.selectOne(new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + JSONObject template = params.getJSONObject("template"); + JSONObject mnp_notice = template.getJSONObject("mnp_notice"); + JSONObject oa_notice = template.getJSONObject("oa_notice"); + JSONObject sms_notice = template.getJSONObject("sms_notice"); + JSONObject system_notice = template.getJSONObject("system_notice"); + + noticeSetting.setSystemNotice(system_notice.toJSONString()); + noticeSetting.setSmsNotice(sms_notice.toJSONString()); + noticeSetting.setOaNotice(oa_notice.toJSONString()); + noticeSetting.setMnpNotice(mnp_notice.toJSONString()); + noticeSetting.setUpdateTime(System.currentTimeMillis() / 1000); + noticeSettingMapper.updateById(noticeSetting); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/SettingPaymentServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingPaymentServiceImpl.java new file mode 100644 index 0000000..1f98caf --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingPaymentServiceImpl.java @@ -0,0 +1,172 @@ +package com.yj.admin.service.impl; + +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.admin.service.ISettingPaymentService; +import com.yj.admin.validate.setting.SettingPayConfigValidate; +import com.yj.admin.vo.setting.SettingPaymentMethodVo; +import com.yj.common.entity.setting.DevPayConfig; +import com.yj.common.entity.setting.DevPayWay; +import com.yj.common.enums.PaymentEnum; +import com.yj.common.mapper.setting.DevPayConfigMapper; +import com.yj.common.mapper.setting.DevPayWayMapper; +import com.yj.common.util.UrlUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.util.*; + +/** + * 支付配置服务实现类 + */ +@Service +public class SettingPaymentServiceImpl implements ISettingPaymentService { + + @Resource + DevPayConfigMapper devPayConfigMapper; + + @Resource + DevPayWayMapper devPayWayMapper; + + /** + * 支付配置方式 + * + * @author fzr + * @return List> + */ + public HashMap getPayWay() { + List lists = devPayWayMapper.selectList(null); + + //List> result = new LinkedList<>(); + HashMap result = new LinkedHashMap(); + List mnp = new LinkedList<>(); + List oa = new LinkedList<>(); + List h5 = new LinkedList<>(); + + for (DevPayWay devPayWay : lists) { + DevPayConfig devPayConfig = devPayConfigMapper.selectOne( + new QueryWrapper() + .eq("id", devPayWay.getPayConfigId()) + .last("limit 1")); + + SettingPaymentMethodVo vo = new SettingPaymentMethodVo(); + BeanUtils.copyProperties(devPayWay, vo); + vo.setPayWayName(PaymentEnum.getPayWayMsg(devPayConfig.getPayWay())); + vo.setIcon(UrlUtils.toAdminAbsoluteUrl(devPayConfig.getIcon())); + + switch (devPayWay.getScene()) { + case 1: // 微信小程序 + mnp.add(vo); + break; + case 2: // 微信公众号 + oa.add(vo); + break; + case 3: + h5.add(vo); + break; + } + } + + result.put(1, mnp); + result.put(2, oa); + result.put(3, h5); + return result; + } + + /** + * 支付配置列表 + * + * @author fzr + * @return List + */ + @Override + public JSONObject list() { + List devPayConfigs = devPayConfigMapper.selectList( + new QueryWrapper() + .orderByDesc(Arrays.asList("sort", "id"))); + + for (DevPayConfig dev : devPayConfigs) { + dev.setPayWayName(PaymentEnum.getPayWayMsg(dev.getPayWay())); + dev.setName(dev.getName()); + dev.setConfig(JSONObject.parse("{}")); + dev.setIcon(UrlUtils.toAdminAbsoluteUrl(dev.getIcon())); + } + + JSONObject result = new JSONObject() {{ + put("lists", devPayConfigs); + }}; + return result; + } + + /** + * 支付配置详情 + * + * @author fzr + * @param id 主键 + * @return DevPayConfig + */ + @Override + public DevPayConfig getConfig(Integer id) { + DevPayConfig devPayConfig = devPayConfigMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + devPayConfig.setName(PaymentEnum.getPayWayMsg(devPayConfig.getPayWay())); + devPayConfig.setPayWayName(devPayConfig.getName()); + devPayConfig.setConfig(JSONObject.parse(devPayConfig.getConfig().toString())); + devPayConfig.setIcon(UrlUtils.toAdminAbsoluteUrl(devPayConfig.getIcon())); + return devPayConfig; + } + + /** + * 支付配置编辑 + * + * @author fzr + * @param configValidate 参数 + */ + @Override + public void setConfig(SettingPayConfigValidate configValidate) { + DevPayConfig devPayConfig = devPayConfigMapper.selectOne( + new QueryWrapper() + .eq("id", configValidate.getId()) + .last("limit 1")); + + Assert.notNull(devPayConfig, "数据不存在!"); + + devPayConfig.setName(configValidate.getName()); + devPayConfig.setIcon(UrlUtils.toRelativeUrl(configValidate.getIcon())); + devPayConfig.setSort(configValidate.getSort()); + devPayConfig.setRemark(configValidate.getRemark()); + if (devPayConfig.getPayWay().equals(1)) { + devPayConfig.setConfig("{}"); + } else { + devPayConfig.setConfig(configValidate.getConfig().toJSONString()); + } + devPayConfigMapper.updateById(devPayConfig); + } + + /** + * 支付方式编辑 + * + * @author fzr + * @param data 参数 + */ + @Override + @Transactional + public void setPayWay(HashMap> data) { + for (Integer key : data.keySet()) { + List list = data.get(key); + for (SettingPaymentMethodVo vo : list) { + DevPayWay way = new DevPayWay(); + way.setIsDefault(vo.getIsDefault()); + way.setStatus(vo.getStatus()); + devPayWayMapper.update(way, new QueryWrapper().eq("id", vo.getId())); + } + } + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/SettingProtocolServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingProtocolServiceImpl.java new file mode 100644 index 0000000..bf9b057 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingProtocolServiceImpl.java @@ -0,0 +1,45 @@ +package com.yj.admin.service.impl; + +import com.yj.admin.service.ISettingProtocolService; +import com.yj.admin.validate.setting.SettingAgreementValidate; +import com.yj.admin.vo.setting.SettingAgreementVo; +import com.yj.common.util.ConfigUtils; +import org.springframework.stereotype.Service; + +/** + * 政策接口服务实现类 + */ +@Service +public class SettingProtocolServiceImpl implements ISettingProtocolService { + + /** + * 获取政策协议信息 + * + * @author fzr + * @return SettingProtocolDetailVo + */ + @Override + public SettingAgreementVo getAgreement() { + SettingAgreementVo vo = new SettingAgreementVo(); + vo.setServiceTitle(ConfigUtils.get("agreement", "service_title", "")); + vo.setServiceContent(ConfigUtils.get("agreement", "service_content", "")); + vo.setPrivacyTitle(ConfigUtils.get("agreement", "privacy_title", "")); + vo.setPrivacyContent(ConfigUtils.get("agreement", "privacy_content", "")); + return vo; + } + + /** + * 保存政策协议信息 + * + * @author fzr + * @param protocolValidate 参数 + */ + @Override + public void setAgreement(SettingAgreementValidate protocolValidate) { + ConfigUtils.set("agreement","service_title", protocolValidate.getServiceTitle()); + ConfigUtils.set("agreement","service_content", protocolValidate.getServiceContent()); + ConfigUtils.set("agreement","privacy_title", protocolValidate.getPrivacyTitle()); + ConfigUtils.set("agreement","privacy_content", protocolValidate.getPrivacyContent()); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/SettingSearchServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingSearchServiceImpl.java new file mode 100644 index 0000000..468f01a --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingSearchServiceImpl.java @@ -0,0 +1,62 @@ +package com.yj.admin.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.admin.service.ISettingSearchService; +import com.yj.admin.validate.setting.SettingSearchValidate; +import com.yj.admin.vo.setting.SettingSearchDetailVo; +import com.yj.admin.vo.setting.SettingSearchObjectVo; +import com.yj.common.entity.setting.HotSearch; +import com.yj.common.mapper.setting.HotSearchMapper; +import com.yj.common.util.ConfigUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 热门搜索服务实现类 + */ +@Service +public class SettingSearchServiceImpl implements ISettingSearchService { + + @Resource + HotSearchMapper hotSearchMapper; + + /** + * 热门搜索详情 + * + * @author fzr + * @return SettingSearchDetailVo + */ + @Override + public SettingSearchDetailVo getConfig() { + Integer status = Integer.parseInt(ConfigUtils.get("hot_search", "status", "0")); + List list = hotSearchMapper.selectList(new QueryWrapper().orderByDesc("sort")); + + SettingSearchDetailVo vo = new SettingSearchDetailVo(); + vo.setStatus(status); + vo.setData(list); + return vo; + } + + /** + * 热门搜索新增 + * + * @author fzr + * @param searchValidate 参数 + */ + @Override + public void setConfig(SettingSearchValidate searchValidate) { + String isHotSearch = String.valueOf(searchValidate.getStatus()); + ConfigUtils.set("hot_search", "status", isHotSearch); + + hotSearchMapper.delete(new QueryWrapper().ge("id", 0)); + for (SettingSearchObjectVo vo : searchValidate.getData()) { + HotSearch hotSearch = new HotSearch(); + hotSearch.setName(vo.getName()); + hotSearch.setSort(vo.getSort()); + hotSearchMapper.insert(hotSearch); + } + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/SettingSmsServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingSmsServiceImpl.java new file mode 100644 index 0000000..2b7c382 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingSmsServiceImpl.java @@ -0,0 +1,102 @@ +package com.yj.admin.service.impl; + +import com.alibaba.fastjson2.JSONObject; +import com.yj.admin.service.ISettingSmsService; +import com.yj.common.util.ConfigUtils; +import com.yj.common.util.StringUtils; +import com.yj.common.util.YmlUtils; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * 短信配置服务实现类 + */ +@Service +public class SettingSmsServiceImpl implements ISettingSmsService { + + /** + * 短信引擎列表 + * + * @author fzr + * @return List> + */ + @Override + public List> getConfig() { + String engine = ConfigUtils.get("sms", "engine", "ali"); + List> list = new LinkedList<>(); + + Map aliyun = new LinkedHashMap<>(); + aliyun.put("name", "阿里云短信"); + aliyun.put("type", "ali"); + aliyun.put("status", engine.equalsIgnoreCase("ali") ? 1 : 0); + list.add(aliyun); + + Map tencent = new LinkedHashMap<>(); + tencent.put("name", "腾讯云短信"); + tencent.put("type", "tencent"); + tencent.put("status", engine.equalsIgnoreCase("tencent") ? 1 : 0); + list.add(tencent); + return list; + } + + /** + * 短信引擎详情 + * + * @author fzr + * @param alias 别名 + * @return Map + */ + @Override + public Map detail(String type) { + String env = YmlUtils.get("like.production"); + boolean envStatus = StringUtils.isNotNull(env) && env.equals("true"); + + String engine = ConfigUtils.get("sms", "engine", "ali"); + Map config = ConfigUtils.getMap("sms", type); + config = StringUtils.isNotNull(config) ? config : Collections.emptyMap(); + + Map map = new LinkedHashMap<>(); + map.put("name", config.getOrDefault("name", "")); + map.put("status", engine.equalsIgnoreCase(type) ? 1 : 0); + map.put("type", type); + map.put("sign", config.getOrDefault("sign", "")); + + switch (type) { + case "ali": + map.put("app_key", envStatus ? "******" : config.getOrDefault("app_key", "")); + map.put("secret_key", envStatus ? "******" : config.getOrDefault("secret_key", "")); + break; + case "tencent": + map.put("app_id", envStatus ? "******" : config.getOrDefault("app_id", "")); + map.put("secret_id", envStatus ? "******" : config.getOrDefault("secret_id", "")); + map.put("secret_key", envStatus ? "******" : config.getOrDefault("secret_key", "")); + break; + case "huawei": + break; + } + + return map; + } + + /** + * 短信引擎保存 + * + * @author fzr + * @param params 参数 + */ + @Override + public void setConfig(JSONObject params) { + String type = params.getString("type"); + + ConfigUtils.set("sms", type, params.toJSONString()); + + String engine = ConfigUtils.get("sms", "engine", ""); + if (Integer.parseInt(params.getString("status")) == 1) { + ConfigUtils.set("sms", "engine", type); + } else if (engine.equals(type) && Integer.parseInt(params.getString("status")) == 0) { + ConfigUtils.set("sms", "engine", ""); + } + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/SettingStorageServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingStorageServiceImpl.java new file mode 100644 index 0000000..e6f6436 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingStorageServiceImpl.java @@ -0,0 +1,157 @@ +package com.yj.admin.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.yj.admin.service.ISettingStorageService; +import com.yj.common.util.ConfigUtils; +import com.yj.common.util.StringUtils; +import com.yj.common.util.YmlUtils; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * 存储配置服务实现类 + */ +@Service +public class SettingStorageServiceImpl implements ISettingStorageService { + + /** + * 存储列表 + * + * @author fzr + * @return List> + */ + @Override + public List> list() { + String engine = ConfigUtils.get("storage", "default", "local"); + List> list = new LinkedList<>(); + + Map local = new LinkedHashMap<>(); + local.put("name", "本地存储"); + local.put("engine", "local"); + local.put("path", "存储在本地服务器"); + local.put("status", engine.equals("local") ? 1 : 0); + list.add(local); + + Map qiniu = new LinkedHashMap<>(); + qiniu.put("name", "七牛云存储"); + qiniu.put("engine", "qiniu"); + qiniu.put("path", "存储在七牛云,请前往七牛云开通存储服务"); + qiniu.put("status", engine.equals("qiniu") ? 1 : 0); + list.add(qiniu); + + Map aliyun = new LinkedHashMap<>(); + aliyun.put("name", "阿里云OSS"); + aliyun.put("engine", "aliyun"); + aliyun.put("path", "存储在阿里云,请前往阿里云开通存储服务"); + aliyun.put("status", engine.equals("aliyun") ? 1 : 0); + list.add(aliyun); + + Map qcloud = new LinkedHashMap<>(); + qcloud.put("name", "腾讯云COS"); + qcloud.put("engine", "qcloud"); + qcloud.put("path", "存储在腾讯云,请前往腾讯云开通存储服务"); + qcloud.put("status", engine.equals("qcloud") ? 1 : 0); + list.add(qcloud); + + return list; + } + + /** + * 存储详情 + * + * @author fzr + * @param engine 存储别名 + * @return Map + */ + @Override + public Map detail(String engine) { + String env = YmlUtils.get("like.production"); + boolean envStatus = StringUtils.isNotNull(env) && env.equals("true"); + + String defaultEngine = ConfigUtils.get("storage", "default", "local"); + Map config = ConfigUtils.getMap("storage", engine); + config = StringUtils.isNotNull(config) ? config : Collections.emptyMap(); + + Map map = new LinkedHashMap<>(); + map.put("name", config.getOrDefault("name", "")); + map.put("engine", engine); + map.put("status", defaultEngine.equals(engine) ? 1 : 0); + if (!engine.equals("local")) { + map.put("bucket", config.getOrDefault("bucket", "")); + map.put("secret_key", envStatus ? "******" : config.getOrDefault("secret_key", "")); + map.put("access_key", envStatus ? "******" : config.getOrDefault("access_key", "")); + map.put("domain", config.getOrDefault("domain", "")); + if (engine.equals("qcloud")) { + map.put("region", config.getOrDefault("region", "")); + } + if (engine.equals("aliyun")) { + map.put("endpoint", config.getOrDefault("endpoint", "")); + } + } + + return map; + } + + /** + * 存储编辑 + * + * @author fzr + * @param params 参数 + */ + @Override + public void setup(Map params) { + Assert.notNull(params.get("engine"), "engine参数缺失"); + Assert.notNull(params.get("status"), "status参数缺失"); + Map map = new LinkedHashMap<>(); + + map.put("name", "本地存储"); + if (!params.get("engine").equals("local")) { + map.put("bucket", params.getOrDefault("bucket", "")); + map.put("secret_key", params.getOrDefault("secret_key", "")); + map.put("access_key", params.getOrDefault("access_key", "")); + map.put("domain", params.getOrDefault("domain", "")); + switch (params.get("engine")) { + case "qcloud": + map.put("name", "腾讯云存储"); + map.put("region", params.getOrDefault("region", "")); + break; + case "qiniu": + map.put("name", "七牛云存储"); + break; + case "aliyun": + map.put("name", "阿里云存储"); + map.put("endpoint", params.getOrDefault("endpoint", "")); + break; + } + } + + ConfigUtils.set("storage", params.get("engine"), JSON.toJSONString(map)); + + String engine = ConfigUtils.get("storage", "default", "local"); + if (Integer.parseInt(params.get("status")) == 1) { + ConfigUtils.set("storage", "default", params.get("engine")); + } else if (engine.equals(params.get("engine")) && Integer.parseInt(params.get("status")) == 0) { + ConfigUtils.set("storage", "default", ""); + } + } + + /** + * 引擎切换 + * + * @author fzr + * @param alias 引擎别名 + * @param status 状态 + */ + @Override + public void change(String alias, Integer status) { + String engine = ConfigUtils.get("storage", "default", "local"); + if (engine.equals(alias) && status == 0) { + ConfigUtils.set("storage", "default", ""); + } else { + ConfigUtils.set("storage", "default", alias); + } + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/SettingUserServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingUserServiceImpl.java new file mode 100644 index 0000000..d825ff6 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingUserServiceImpl.java @@ -0,0 +1,41 @@ +package com.yj.admin.service.impl; + +import com.yj.admin.service.ISettingUserService; +import com.yj.admin.validate.setting.SettingUserValidate; +import com.yj.admin.vo.setting.SettingUserVo; +import com.yj.common.util.ConfigUtils; +import com.yj.common.util.UrlUtils; +import org.springframework.stereotype.Service; + +/** + * 用户设置服务实现类 + */ +@Service +public class SettingUserServiceImpl implements ISettingUserService { + + /** + * 用户设置详情 + * + * @author fzr + * @return SettingUserVo + */ + @Override + public SettingUserVo getConfig() { + String defaultAvatar = ConfigUtils.get("default_image", "user_avatar", ""); + SettingUserVo vo = new SettingUserVo(); + vo.setDefaultAvatar(UrlUtils.toAdminAbsoluteUrl(defaultAvatar)); + return vo; + } + + /** + * 用户设置保存 + * + * @author fzr + * @param userValidate 参数 + */ + @Override + public void setConfig(SettingUserValidate userValidate) { + ConfigUtils.set("default_image", "user_avatar", UrlUtils.toRelativeUrl(userValidate.getDefaultAvatar())); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/SettingWebsiteServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingWebsiteServiceImpl.java new file mode 100644 index 0000000..fe7853c --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/SettingWebsiteServiceImpl.java @@ -0,0 +1,67 @@ +package com.yj.admin.service.impl; + +import com.yj.admin.service.ISettingWebsiteService; +import com.yj.admin.validate.setting.SettingWebsiteValidate; +import com.yj.admin.vo.setting.SettingWebsiteVo; +import com.yj.common.util.ConfigUtils; +import com.yj.common.util.UrlUtils; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * 网站信息配置服务实现类 + */ +@Service +public class SettingWebsiteServiceImpl implements ISettingWebsiteService { + + /** + * 获取网站信息 + * + * @author fzr + * @return Map + */ + @Override + public SettingWebsiteVo getWebsite() { + Map config = ConfigUtils.get("website"); + SettingWebsiteVo vo = new SettingWebsiteVo(); + vo.setName(config.getOrDefault("name", "")); + vo.setWebFavicon(UrlUtils.toAdminAbsoluteUrl(config.getOrDefault("web_favicon", ""))); + vo.setWebLogo(UrlUtils.toAdminAbsoluteUrl(config.getOrDefault("web_logo", ""))); + vo.setLoginImage(UrlUtils.toAdminAbsoluteUrl(config.getOrDefault("login_image", ""))); + vo.setShopName(config.getOrDefault("shop_name", "")); + vo.setShopLogo(UrlUtils.toAdminAbsoluteUrl(config.getOrDefault("shop_logo", ""))); + vo.setPcLogo(UrlUtils.toAdminAbsoluteUrl(config.getOrDefault("pc_logo", ""))); + vo.setPcTitle(config.getOrDefault("pc_title", "")); + vo.setPcIco(UrlUtils.toAdminAbsoluteUrl(config.getOrDefault("pc_ico", ""))); + vo.setPcDesc(config.getOrDefault("pc_desc", "")); + vo.setPcKeywords(config.getOrDefault("pc_keywords", "")); + vo.setH5Favicon(UrlUtils.toAdminAbsoluteUrl(config.getOrDefault("h5_favicon", ""))); + return vo; + } + + /** + * 保存网站信息 + * + * @author fzr + * @param websiteValidate 参数 + */ + @Override + public void setWebsite(SettingWebsiteValidate websiteValidate) { + ConfigUtils.set("website", "name", websiteValidate.getName()); + ConfigUtils.set("website", "web_logo", UrlUtils.toRelativeUrl(websiteValidate.getWebLogo())); + ConfigUtils.set("website", "web_favicon", UrlUtils.toRelativeUrl(websiteValidate.getWebFavicon())); + ConfigUtils.set("website", "login_image", UrlUtils.toRelativeUrl(websiteValidate.getLoginImage())); + ConfigUtils.set("website", "h5_favicon", UrlUtils.toRelativeUrl(websiteValidate.getH5Favicon())); + + ConfigUtils.set("website", "shop_name", websiteValidate.getShopName()); + ConfigUtils.set("website", "shop_logo", UrlUtils.toRelativeUrl(websiteValidate.getShopLogo())); + + ConfigUtils.set("website", "pc_logo", UrlUtils.toRelativeUrl(websiteValidate.getPcLogo())); + ConfigUtils.set("website", "pc_ico", UrlUtils.toRelativeUrl(websiteValidate.getPcIco())); + ConfigUtils.set("website", "pc_title", websiteValidate.getPcTitle()); + ConfigUtils.set("website", "pc_desc", websiteValidate.getPcDesc()); + ConfigUtils.set("website", "pc_keywords", websiteValidate.getPcKeywords()); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/UserServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..e2899c5 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/UserServiceImpl.java @@ -0,0 +1,337 @@ +package com.yj.admin.service.impl; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.support.ExcelTypeEnum; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yj.admin.service.IUserService; +import com.yj.admin.validate.user.UserSearchValidate; +import com.yj.admin.validate.user.UserUpdateValidate; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.user.UserWalletValidate; +import com.yj.admin.vo.user.UserListExportVo; +import com.yj.admin.vo.user.UserVo; +import com.yj.common.core.PageResult; +import com.yj.common.entity.user.User; +import com.yj.common.enums.ClientEnum; +import com.yj.common.enums.LogMoneyEnum; +import com.yj.common.exception.OperateException; +import com.yj.common.mapper.log.UserAccountLogMapper; +import com.yj.common.mapper.user.UserMapper; +import com.yj.common.util.*; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.io.File; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.regex.Pattern; + +/** + * 用户服务实现类 + */ +@Service +public class UserServiceImpl implements IUserService { + + @Resource + UserMapper userMapper; + + @Resource + UserAccountLogMapper logMoneyMapper; + + /** + * 用户列表 + * + * @author fzr + * @param pageValidate (分页参数) + * @param searchValidate (搜索参数) + * @return PageResult + */ + @Override + public PageResult list(PageValidate pageValidate, UserSearchValidate searchValidate) { + Integer pageNo = pageValidate.getPage_no(); + Integer pageSize = pageValidate.getPage_size(); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.isNull("delete_time"); + queryWrapper.orderByDesc("id"); + queryWrapper.select(User.class, info-> + !info.getColumn().equals("delete_time") && + !info.getColumn().equals("update_time") && + !info.getColumn().equals("password") && + !info.getColumn().equals("salt") + ); + + if (StringUtils.isNotNull(searchValidate.getKeyword()) && StringUtils.isNotEmpty(searchValidate.getKeyword())) { + String keyword = searchValidate.getKeyword(); + queryWrapper.nested(wq->wq + .like("sn", keyword).or() + .like("account", keyword).or() + .like("nickname", keyword).or() + .like("mobile", keyword)); + } + + userMapper.setSearch(queryWrapper, searchValidate, new String[]{ + "=:channel:int", + "datetime:create_time_start-create_time_end@create_time:str" + }); + + IPage iPage = userMapper.selectPage( new Page<>(pageNo, pageSize), queryWrapper); + + List list = new LinkedList<>(); + for (User user : iPage.getRecords()) { + UserVo vo = new UserVo(); + BeanUtils.copyProperties(user, vo); + + vo.setSex(user.getSex()); + vo.setChannel(ClientEnum.getMsgByCode(user.getChannel())); + vo.setAvatar(UrlUtils.toAdminAbsoluteUrl(user.getAvatar())); + vo.setLoginTime(TimeUtils.timestampToDate(user.getLoginTime())); + vo.setCreateTime(TimeUtils.timestampToDate(user.getCreateTime())); + list.add(vo); + } + + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list); + } + + /** + * 用户详情 + * + * @author fzr + * @param id 主键 + * @return UserVo + */ + @Override + public UserVo detail(Integer id) { + Assert.notNull( + userMapper.selectOne(new QueryWrapper() + .select("id") + .eq("id", id) + .isNull("delete_time") + .last("limit 1") + ), "数据不存在!"); + + + User user = userMapper.selectOne(new QueryWrapper() + .select(User.class, info-> + !info.getColumn().equals("delete_time") && + !info.getColumn().equals("update_time") && + !info.getColumn().equals("password") && + !info.getColumn().equals("salt") + ) + .eq("id", id) + .last("limit 1")); + + UserVo vo = new UserVo(); + BeanUtils.copyProperties(user, vo); + + vo.setSex(user.getSex()); + vo.setAvatar(UrlUtils.toAdminAbsoluteUrl(user.getAvatar())); + vo.setChannel(ClientEnum.getMsgByCode(user.getChannel())); + vo.setCreateTime(TimeUtils.timestampToDate(user.getCreateTime())); + if (user.getLoginTime() <= 0) { + vo.setLoginTime("无"); + } else { + vo.setLoginTime(TimeUtils.timestampToDate(user.getLoginTime())); + } + return vo; + } + + /** + * 用户编辑 + * + * @author fzr + * @param updateValidate 参数 + */ + @Override + public void edit(UserUpdateValidate updateValidate) { + Integer id = updateValidate.getId(); + String field = updateValidate.getField(); + String value = updateValidate.getValue(); + + User user = userMapper.selectOne(new QueryWrapper() + .eq("id", id) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(user, "用户不存在!"); + + switch (field) { + case "account": + if (!user.getAccount().equals(value)) { + User u = userMapper.selectOne(new QueryWrapper() + .eq("account", value) + .isNull("delete_time") + .last("limit 1")); + + if (StringUtils.isNotNull(u) && !u.getId().equals(id)) { + throw new OperateException("当前账号已存在!"); + } + } + Assert.isTrue(value.length() <= 32,"账号不能超过32个字符"); + user.setAccount(value); + break; + case "real_name": + Assert.isTrue(value.length() <= 32,"真实姓名不能超过32个字符"); + user.setRealName(value); + break; + case "sex": + user.setSex(Integer.parseInt(value)); + break; + case "mobile": + if (!Pattern.matches("^[1][3-9][0-9]{9}$", value)) { + throw new OperateException("手机号格式不正确!"); + } + User uMobile = userMapper.selectOne(new QueryWrapper() + .eq("mobile", value) + .isNull("delete_time") + .last("limit 1")); + if (StringUtils.isNotNull(uMobile) && uMobile.getId().equals(id) == false) { + throw new OperateException("手机号已被其它账号绑定!"); + } + user.setMobile(value); + break; + default: + throw new OperateException("不被支持的字段类型!"); + } + + user.setUpdateTime(System.currentTimeMillis() / 1000); + userMapper.updateById(user); + } + + /** + * 余额调整 + * + * @author cjh + * @param userWalletValidate 余额 + */ + @Override + @Transactional + public void adjustWallet(UserWalletValidate userWalletValidate) { + User user = userMapper.selectOne(new QueryWrapper() + .eq("id", userWalletValidate.getUserId()) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(user,"用户不存在!"); + + BigDecimal userMoney = user.getUserMoney(); + BigDecimal amount = userWalletValidate.getNum(); + BigDecimal surplusAmount; + int changeType; + + if(userWalletValidate.getAction().equals(2) ){ + surplusAmount = userMoney.subtract(amount); + if(surplusAmount.compareTo(BigDecimal.ZERO) < 0){ + throw new OperateException("用户余额仅剩:"+ userMoney); + } + changeType = LogMoneyEnum.UM_DEC_ADMIN.getCode(); + logMoneyMapper.dec(user.getId(), changeType, amount, 0, "", userWalletValidate.getRemark(), null); + }else{ + surplusAmount = userMoney.add(amount); + changeType = LogMoneyEnum.UM_INC_ADMIN.getCode(); + logMoneyMapper.add(user.getId(), changeType, amount, 0, "", userWalletValidate.getRemark(), null); + } + + user.setUserMoney(surplusAmount); + userMapper.updateById(user); + } + + @Override + public JSONObject getExportData(PageValidate pageValidate, UserSearchValidate searchValidate) { + Integer page = pageValidate.getPage_no(); + Integer limit = pageValidate.getPage_size(); + PageResult userVoPageResult = this.list(pageValidate, searchValidate); + JSONObject ret = ToolUtils.getExportData(userVoPageResult.getCount(), limit, searchValidate.getPage_start(), searchValidate.getPage_end(),"用户记录列表"); + return ret; + } + + @Override + public String export(UserSearchValidate searchValidate) { + PageValidate pageValidate = new PageValidate(); + if (StringUtils.isNotNull(searchValidate.getPage_start())) { + pageValidate.setPage_no(searchValidate.getPage_start()); + } else { + pageValidate.setPage_no(1); + } + + if (StringUtils.isNotNull(searchValidate.getPage_end()) && StringUtils.isNotNull(searchValidate.getPage_size())) { + pageValidate.setPage_size(searchValidate.getPage_end() * searchValidate.getPage_size()); + } else { + pageValidate.setPage_size(20); + } + Boolean isAll = StringUtils.isNull(searchValidate.getPage_type()) || searchValidate.getPage_type().equals(0) ? true : false; + List excellist = this.getExcellist(isAll, pageValidate, searchValidate); + String fileName = StringUtils.isNull(searchValidate.getFile_name()) ? ToolUtils.makeUUID() : searchValidate.getFile_name(); + String folderPath = "/excel/export/"+ TimeUtils.timestampToDay(System.currentTimeMillis() / 1000) +"/" ; + String path = folderPath + fileName +".xlsx"; + String filePath = YmlUtils.get("like.upload-directory") + path; + File folder = new File(YmlUtils.get("like.upload-directory") + folderPath); + if (!folder.exists()) { + if (!folder.mkdirs()) { + throw new OperateException("创建文件夹失败"); + } + } + EasyExcel.write(filePath) + .head(UserListExportVo.class) + .excelType(ExcelTypeEnum.XLSX) + .sheet("用户记录") + .doWrite(excellist); + return UrlUtils.toAdminAbsoluteUrl(path); + } + + private List getExcellist(boolean isAll, PageValidate pageValidate, UserSearchValidate searchValidate) { + Integer page = pageValidate.getPage_no(); + Integer limit = pageValidate.getPage_size(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.isNull("delete_time"); + queryWrapper.orderByDesc("id"); + queryWrapper.select(User.class, info-> + !info.getColumn().equals("delete_time") && + !info.getColumn().equals("update_time") && + !info.getColumn().equals("password") && + !info.getColumn().equals("salt") + ); + + if (StringUtils.isNotNull(searchValidate.getKeyword()) && StringUtils.isNotEmpty(searchValidate.getKeyword())) { + String keyword = searchValidate.getKeyword(); + queryWrapper.nested(wq->wq + .like("sn", keyword).or() + .like("nickname", keyword).or() + .like("mobile", keyword)); + } + + userMapper.setSearch(queryWrapper, searchValidate, new String[]{ + "=:channel:int", + "datetime:createTimeStart-createTimeEnd@create_time:str" + }); + + List retList = new ArrayList<>(); + List userList = new ArrayList<>(); + if (isAll) { + userList = userMapper.selectList(queryWrapper); + } else { + IPage iPage = userMapper.selectPage( new Page<>(page, limit), queryWrapper); + userList = iPage.getRecords(); + } + for (User user : userList) { + UserListExportVo vo = new UserListExportVo(); + BeanUtils.copyProperties(user, vo); + vo.setSex(user.getSex()); + vo.setChannel(ClientEnum.getMsgByCode(user.getChannel())); + vo.setAvatar(UrlUtils.toAdminAbsoluteUrl(user.getAvatar())); + vo.setLoginTime(TimeUtils.timestampToDate(user.getLoginTime())); + vo.setCreateTime(TimeUtils.timestampToDate(user.getCreateTime())); + retList.add(vo); + } + + return retList; + } +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/admin/AdminDeptServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/admin/AdminDeptServiceImpl.java new file mode 100644 index 0000000..4d0630e --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/admin/AdminDeptServiceImpl.java @@ -0,0 +1,50 @@ +package com.yj.admin.service.impl.admin; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.admin.service.admin.IAdminDeptService; +import com.yj.common.entity.admin.AdminDept; +import com.yj.common.mapper.admin.AdminDeptMapper; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * 系统部门关联实现类 + */ +@Service +public class AdminDeptServiceImpl implements IAdminDeptService { + + @Resource + AdminDeptMapper adminDeptMapper; + @Override + public List getDeptIdAttr(Integer adminId) { + List ret = new ArrayList(); + List rolesList = adminDeptMapper.selectList(new QueryWrapper().eq("admin_id", adminId).select("dept_id")); + if (rolesList.size() > 0) { + for (AdminDept adminDept : rolesList) { + ret.add(adminDept.getDeptId()); + } + } + return ret; + } + + @Override + public void batchInsert(Integer adminId, List deptIds) { + this.deleteByAdminId(adminId); + if (deptIds != null && !deptIds.isEmpty()) { + deptIds.forEach(item-> { + this.adminDeptMapper.insert(new AdminDept(){{ + setAdminId(adminId); + setDeptId(item); + }}); + }); + } + } + + @Override + public void deleteByAdminId(Integer adminId) { + this.adminDeptMapper.delete(new QueryWrapper().eq("admin_id", adminId)); + } +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/admin/AdminJobsServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/admin/AdminJobsServiceImpl.java new file mode 100644 index 0000000..10ea78a --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/admin/AdminJobsServiceImpl.java @@ -0,0 +1,50 @@ +package com.yj.admin.service.impl.admin; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.admin.service.admin.IAdminJobsService; +import com.yj.common.entity.admin.AdminJobs; +import com.yj.common.mapper.admin.AdminJobsMapper; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * 系统岗位实现类 + */ +@Service +public class AdminJobsServiceImpl implements IAdminJobsService { + + @Resource + AdminJobsMapper adminJobsMapper; + @Override + public List getJobIdAttr(Integer adminId) { + List ret = new ArrayList(); + List rolesList = adminJobsMapper.selectList(new QueryWrapper().eq("admin_id", adminId).select("jobs_id")); + if (rolesList.size() > 0) { + for (AdminJobs adminJobs : rolesList) { + ret.add(adminJobs.getJobsId()); + } + } + return ret; + } + + @Override + public void batchInsert(Integer adminId, List jobsIds) { + this.deleteByAdminId(adminId); + if (jobsIds != null && !jobsIds.isEmpty()) { + jobsIds.forEach(item-> { + this.adminJobsMapper.insert(new AdminJobs(){{ + setAdminId(adminId); + setJobsId(item); + }}); + }); + } + } + + @Override + public void deleteByAdminId(Integer adminId) { + this.adminJobsMapper.delete(new QueryWrapper().eq("admin_id", adminId)); + } +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/admin/AdminRoleServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/admin/AdminRoleServiceImpl.java new file mode 100644 index 0000000..b40d0b1 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/admin/AdminRoleServiceImpl.java @@ -0,0 +1,55 @@ +package com.yj.admin.service.impl.admin; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.admin.service.admin.IAdminRoleService; +import com.yj.common.entity.admin.AdminRole; +import com.yj.common.mapper.admin.AdminRoleMapper; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; + +/** + * 系统角色服务实现类 + */ +@Service +public class AdminRoleServiceImpl implements IAdminRoleService { + + @Resource + AdminRoleMapper adminRoleMapper; + @Override + public List getRoleIdAttr(Integer adminId) { + List ret = new ArrayList<>(); + List rolesList = adminRoleMapper.selectList(new QueryWrapper().eq("admin_id", adminId).select("role_id")); + if (rolesList.size() > 0) { + for (AdminRole adminRole : rolesList) { + ret.add(adminRole.getRoleId()); + } + } + return ret; + } + + @Override + public List getAdminIdByRoleId(Integer roleId) { + List result = adminRoleMapper.selectList(new QueryWrapper().eq("role_id", roleId).select("admin_id")); + return result; + } + + @Override + public void batchInsert(Integer adminId, List roleIds) { + this.deleteByAdminId(adminId); + if (roleIds != null && !roleIds.isEmpty()) { + roleIds.forEach(item-> { + this.adminRoleMapper.insert(new AdminRole(){{ + setAdminId(adminId); + setRoleId(item); + }}); + }); + } + } + + @Override + public void deleteByAdminId(Integer adminId) { + this.adminRoleMapper.delete(new QueryWrapper().eq("admin_id", adminId)); + } +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/admin/AdminServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/admin/AdminServiceImpl.java new file mode 100644 index 0000000..30e694d --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/admin/AdminServiceImpl.java @@ -0,0 +1,713 @@ +package com.yj.admin.service.impl.admin; + +import cn.dev33.satoken.stp.StpUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.support.ExcelTypeEnum; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.query.MPJQueryWrapper; +import com.yj.admin.service.admin.*; +import com.yj.admin.service.system.ISystemMenuService; +import com.yj.admin.service.system.ISystemRoleMenuService; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.system.*; +import com.yj.admin.vo.auth.AdminMySelfVo; +import com.yj.admin.vo.auth.AuthMySelfVo; +import com.yj.admin.vo.system.*; +import com.yj.common.core.PageResult; +import com.yj.common.entity.admin.Admin; +import com.yj.common.entity.admin.Dept; +import com.yj.common.entity.admin.Jobs; +import com.yj.common.entity.system.SystemMenu; +import com.yj.common.entity.system.SystemRole; +import com.yj.common.exception.OperateException; +import com.yj.common.mapper.admin.AdminMapper; +import com.yj.common.mapper.admin.DeptMapper; +import com.yj.common.mapper.admin.JobsMapper; +import com.yj.common.mapper.system.SystemMenuMapper; +import com.yj.common.mapper.system.SystemRoleMapper; +import com.yj.common.util.*; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.io.File; +import java.util.*; + +/** + * 系统管理员服务实现类 + */ +@Service +public class AdminServiceImpl implements IAdminService { + + @Resource + AdminMapper systemAuthAdminMapper; + + @Resource + SystemMenuMapper systemAuthMenuMapper; + + @Resource + SystemRoleMapper systemAuthRoleMapper; + + @Resource + ISystemRoleMenuService iSystemRoleMenuService; + @Resource + IAdminRoleService iAdminRoleService; + @Resource + IAdminDeptService iAdminDeptService; + @Resource + IAdminJobsService iAdminJobsService; + + @Resource + JobsMapper jobsMapper; + + @Resource + DeptMapper deptMapper; + + @Resource + IAuthService iAuthService; + + @Resource + ISystemMenuService systemMenuService; + + /** + * 管理员列表 + * + * @author fzr + * @param pageValidate 分页参数 + * @param searchValidate 搜索参数 + * @return PageResult + */ + @Override + public PageResult list(PageValidate pageValidate, + SystemAdminSearchValidate searchValidate) { + Integer page = pageValidate.getPage_no(); + Integer limit = pageValidate.getPage_size(); + + MPJQueryWrapper mpjQueryWrapper = new MPJQueryWrapper<>(); + mpjQueryWrapper.select("distinct t.id,t.account,t.name,t.avatar," + + "t.multipoint_login," + + "t.disable,t.login_ip,t.login_time,t.create_time,t.update_time") + .leftJoin("yj_admin_role lar ON lar.admin_id = t.id") + .isNull("t.delete_time") + .orderByDesc(Arrays.asList("t.id")); + + systemAuthAdminMapper.setSearch(mpjQueryWrapper, searchValidate, new String[] { + "like:account:str", + "like:name:str" + }); + + if (StringUtils.isNotNull(searchValidate.getRole_id())) { + mpjQueryWrapper.in("lar.role_id", searchValidate.getRole_id()); + } + + IPage iPage = systemAuthAdminMapper.selectJoinPage( + new Page<>(page, limit), + SystemAuthAdminListedVo.class, + mpjQueryWrapper); + + for (SystemAuthAdminListedVo vo : iPage.getRecords()) { + if (vo.getId().equals(1)) { + vo.setRoleName("系统管理员"); + vo.setDeptName("-"); + } else { + + List roles = systemAuthRoleMapper.getByAdminId(vo.getId()); + List roleIds = new ArrayList<>(); + List roleNames = new ArrayList<>(); + if (!roles.isEmpty()) { + roles.forEach(item -> { + roleIds.add(item.getId()); + roleNames.add(item.getName()); + + }); + vo.setRoleId(roleIds); + vo.setRoleName(StringUtils.join(roleNames, ",")); + } + + List jobs = jobsMapper.getByAdminId(vo.getId()); + List jobsId = new ArrayList<>(); + List jobsNames = new ArrayList<>(); + if (!jobs.isEmpty()) { + jobs.forEach(item -> { + jobsId.add(item.getId()); + jobsNames.add(item.getName()); + }); + vo.setJobsId(jobsId); + vo.setJobsName(StringUtils.join(jobsNames, ",")); + } + + List depts = deptMapper.getByAdminId(vo.getId()); + List deptIds = new ArrayList<>(); + List deptNames = new ArrayList<>(); + if (!depts.isEmpty()) { + depts.forEach(item -> { + deptIds.add(item.getId()); + deptNames.add(item.getName()); + }); + vo.setDeptId(deptIds); + vo.setDeptName(StringUtils.join(deptNames, ",")); + + } + } + + vo.setDisableDesc(vo.getDisable() != null && vo.getDisable().equals(0) ? "启用" : "禁用"); + vo.setAvatar(UrlUtils.toAdminAbsoluteUrl(vo.getAvatar())); + vo.setCreateTime(TimeUtils.timestampToDate(vo.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(vo.getUpdateTime())); + vo.setLoginTime(TimeUtils.timestampToDate(vo.getLoginTime())); + } + + return PageResult.iPageHandle(iPage); + } + + /** + * 当前管理员 + * + * @author fzr + * @param adminId 管理员ID + * @return SystemAuthAdminSelvesVo + */ + @Override + public SystemAuthAdminSelvesVo self(Integer adminId) { + // 管理员信息 + Admin sysAdmin = systemAuthAdminMapper.selectOne(new QueryWrapper() + .select(Admin.class, info -> !info.getColumn().equals("password") && + !info.getColumn().equals("delete_time")) + .isNull("delete_time") + .eq("id", adminId) + .last("limit 1")); + + SystemAuthAdminInformVo systemAuthAdminInformVo = new SystemAuthAdminInformVo(); + BeanUtils.copyProperties(sysAdmin, systemAuthAdminInformVo); + systemAuthAdminInformVo.setAvatar(UrlUtils.toAdminAbsoluteUrl(sysAdmin.getAvatar())); + systemAuthAdminInformVo.setUpdateTime(TimeUtils.timestampToDate(sysAdmin.getUpdateTime())); + systemAuthAdminInformVo.setCreateTime(TimeUtils.timestampToDate(sysAdmin.getCreateTime())); + systemAuthAdminInformVo.setLastLoginTime(TimeUtils.timestampToDate(sysAdmin.getLoginTime())); + + // 角色权限 + List auths = new LinkedList<>(); + if (adminId > 1) { + List roleIds = new ArrayList(); + List menuIds = iSystemRoleMenuService.selectMenuIdsByRoleId(roleIds); + if (menuIds.size() > 0) { + List systemAuthMenus = systemAuthMenuMapper.selectList(new QueryWrapper() + .eq("is_disable", 0) + .in("id", menuIds) + .in("menu_type", Arrays.asList("C", "A")) + .orderByAsc(Arrays.asList("menu_sort", "id"))); + + // 处理权限 + for (SystemMenu item : systemAuthMenus) { + if (StringUtils.isNotNull(item.getPerms()) && StringUtils.isNotEmpty(item.getPerms())) { + auths.add(item.getPerms().trim()); + } + } + } + // 没有权限 + if (auths.size() <= 0) { + auths.add(""); + } + } else { + // 所有权限 + auths.add("*"); + } + + // 返回数据 + SystemAuthAdminSelvesVo vo = new SystemAuthAdminSelvesVo(); + vo.setUser(systemAuthAdminInformVo); + vo.setPermissions(auths); + return vo; + } + + /** + * 管理员详细 + * + * @author fzr + * @param id 主键 + * @return SystemAuthAdminDetailVo + */ + @Override + public SystemAuthAdminDetailVo detail(Integer id) { + Admin sysAdmin = systemAuthAdminMapper.selectOne(new QueryWrapper() + .eq("id", id) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(sysAdmin, "账号已不存在!"); + + SystemAuthAdminDetailVo vo = new SystemAuthAdminDetailVo(); + BeanUtils.copyProperties(sysAdmin, vo); + vo.setAvatar(UrlUtils.toAdminAbsoluteUrl(sysAdmin.getAvatar())); + vo.setCreateTime(TimeUtils.timestampToDate(sysAdmin.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(sysAdmin.getUpdateTime())); + vo.setLoginTime(TimeUtils.timestampToDate(sysAdmin.getLoginTime())); + vo.setRoleId(iAdminRoleService.getRoleIdAttr(sysAdmin.getId())); + vo.setJobsId(iAdminJobsService.getJobIdAttr(sysAdmin.getId())); + vo.setDeptId(iAdminDeptService.getDeptIdAttr(sysAdmin.getId())); + vo.setFirstLogin(sysAdmin.getFirstLogin()); + return vo; + } + + /** + * 管理员新增 + * + * @author fzr + * @param createValidate 参数 + */ + @Override + public void add(SystemAdminCreateValidate createValidate) { + String[] field = { "id", "account", "name" }; + Assert.isNull(systemAuthAdminMapper.selectOne(new QueryWrapper() + .select(field) + .isNull("delete_time") + .eq("account", createValidate.getAccount()) + .last("limit 1")), "账号已存在换一个吧!"); + + Assert.isNull(systemAuthAdminMapper.selectOne(new QueryWrapper() + .select(field) + .isNull("delete_time") + .eq("name", createValidate.getName()) + .last("limit 1")), "昵称已存在换一个吧!"); + + String pwd = ToolUtils.makePassword(createValidate.getPassword().trim()); + + String createAvatar = createValidate.getAvatar(); + String defaultAvatar = "/api/static/backend_avatar.png"; + String avatar = StringUtils.isNotEmpty(createValidate.getAvatar()) ? UrlUtils.toRelativeUrl(createAvatar) + : defaultAvatar; + + Admin model = new Admin(); + model.setAccount(createValidate.getAccount()); + model.setName(createValidate.getName()); + model.setAvatar(avatar); + model.setPassword(pwd); + model.setMultipointLogin(createValidate.getMultipointLogin()); + model.setDisable(createValidate.getDisable()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setUpdateTime(System.currentTimeMillis() / 1000); + systemAuthAdminMapper.insert(model); + + List deptIds = createValidate.getDeptId(); + List jobsIds = createValidate.getJobsId(); + List roleIds = createValidate.getRoleId(); + + this.iAdminDeptService.batchInsert(model.getId(), deptIds); + + this.iAdminJobsService.batchInsert(model.getId(), jobsIds); + + this.iAdminRoleService.batchInsert(model.getId(), roleIds); + + } + + /** + * 管理员更新 + * + * @author fzr + * @param updateValidate 参数 + * @param adminId 管理员ID + */ + @Override + public void edit(SystemAdminUpdateValidate updateValidate, Integer adminId) { + if (!adminId.equals(1) && updateValidate.getId().equals(1)) { + throw new OperateException("您无权限编辑系统管理员!"); + } + + boolean isEditInfo = false; + if (updateValidate.getPassword() != null) { + isEditInfo = true; + } + + String[] field = { "id", "account", "name" }; + Assert.notNull(systemAuthAdminMapper.selectOne(new QueryWrapper() + .select(field) + .eq("id", updateValidate.getId()) + .isNull("delete_time") + .last("limit 1")), "账号不存在了!"); + + Assert.isNull(systemAuthAdminMapper.selectOne(new QueryWrapper() + .select(field) + .isNull("delete_time") + .eq("account", updateValidate.getAccount()) + .ne("id", updateValidate.getId()) + .last("limit 1")), "账号已存在换一个吧!"); + + Assert.isNull(systemAuthAdminMapper.selectOne(new QueryWrapper() + .select(field) + .isNull("delete_time") + .eq("name", updateValidate.getName()) + .ne("id", updateValidate.getId()) + .last("limit 1")), "昵称已存在换一个吧!"); + + Admin admin = systemAuthAdminMapper + .selectOne(new QueryWrapper().eq("id", updateValidate.getId()).isNull("delete_time")); + + if (admin.getRoot().equals(1) && updateValidate.getDisable().equals(1)) { + throw new OperateException("超级管理员不能设为停用"); + } + + Admin model = new Admin(); + + model.setId(updateValidate.getId()); + + if (isEditInfo) { + + model.setName(updateValidate.getName()); + model.setAvatar(UrlUtils.toRelativeUrl(updateValidate.getAvatar())); + model.setMultipointLogin(updateValidate.getMultipointLogin()); + model.setUpdateTime(System.currentTimeMillis() / 1000); + + if (!updateValidate.getId().equals(1)) { + model.setAccount(updateValidate.getAccount()); + } + + if (StringUtils.isNotNull(updateValidate.getPassword()) + && StringUtils.isNotEmpty(updateValidate.getPassword())) { + String pwd = ToolUtils.makePassword(updateValidate.getPassword().trim()); + model.setPassword(pwd); + } + } else { + model.setDisable(updateValidate.getDisable()); + } + + systemAuthAdminMapper.updateById(model); + + if (isEditInfo) { + + if (StringUtils.isNotNull(updateValidate.getPassword()) + && StringUtils.isNotEmpty(updateValidate.getPassword())) { + StpUtil.kickout(updateValidate.getId()); + } + + List deptIds = updateValidate.getDeptId(); + List jobsIds = updateValidate.getJobsId(); + List roleIds = updateValidate.getRoleId(); + + this.iAdminDeptService.batchInsert(updateValidate.getId(), deptIds); + + this.iAdminJobsService.batchInsert(updateValidate.getId(), jobsIds); + + this.iAdminRoleService.batchInsert(updateValidate.getId(), roleIds); + } + + } + + /** + * 当前管理员更新 + * + * @author fzr + * @param upInfoValidate 参数 + */ + @Override + public void upInfo(SystemAdminUpInfoValidate upInfoValidate, Integer adminId) { + Admin model = systemAuthAdminMapper.selectOne(new QueryWrapper() + .select("id,username,nickname,password,salt") + .eq("id", adminId) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(model, "账号不存在了!"); + + String createAvatar = upInfoValidate.getAvatar(); + String defaultAvatar = "/api/static/backend_avatar.png"; + String avatar = StringUtils.isNotEmpty(upInfoValidate.getAvatar()) ? UrlUtils.toRelativeUrl(createAvatar) + : defaultAvatar; + + model.setAvatar(avatar); + model.setName(upInfoValidate.getNickname()); + model.setUpdateTime(System.currentTimeMillis() / 1000); + + if (StringUtils.isNotNull(upInfoValidate.getPassword()) + && StringUtils.isNotEmpty(upInfoValidate.getPassword())) { + String currPassword = ToolUtils.makePassword(upInfoValidate.getCurrPassword()); + Assert.isFalse(!currPassword.equals(model.getPassword()), "当前密码不正确!"); + if (upInfoValidate.getPassword().length() > 64) { + throw new OperateException("密码不能超出64个字符"); + } + String pwd = ToolUtils.makePassword(upInfoValidate.getPassword().trim()); + model.setPassword(pwd); + } + + systemAuthAdminMapper.updateById(model); + if (StringUtils.isNotNull(upInfoValidate.getPassword()) + && StringUtils.isNotEmpty(upInfoValidate.getPassword())) { + StpUtil.kickout(adminId); + } + } + + /** + * 管理员删除 + * + * @author fzr + * @param id 主键 + * @param adminId 管理员ID + */ + @Override + public void del(Integer id, Integer adminId) { + String[] field = { "id", "account", "name" }; + Assert.notNull(systemAuthAdminMapper.selectOne(new QueryWrapper() + .select(field) + .eq("id", id) + .isNull("delete_time") + .last("limit 1")), "账号已不存在!"); + + Assert.isFalse(id.equals(1), "系统管理员不允许删除!"); + Assert.isFalse(id.equals(adminId), "不能删除自己!"); + + Admin model = new Admin(); + model.setId(id); + model.setDeleteTime(System.currentTimeMillis() / 1000); + systemAuthAdminMapper.updateById(model); + + this.iAdminRoleService.deleteByAdminId(id); + this.iAdminJobsService.deleteByAdminId(id); + this.iAdminDeptService.deleteByAdminId(id); + StpUtil.kickout(id); + } + + /** + * 管理员状态切换 + * + * @author fzr + * @param id 主键参数 + * @param adminId 管理员ID + */ + @Override + public void disable(Integer id, Integer adminId) { + Admin systemAuthAdmin = systemAuthAdminMapper.selectOne(new QueryWrapper() + .select("id,username,nickname,is_disable") + .eq("id", id) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(systemAuthAdmin, "账号已不存在!"); + Assert.isFalse(id.equals(adminId), "不能禁用自己!"); + + Integer disable = systemAuthAdmin.getDisable() == 1 ? 0 : 1; + systemAuthAdmin.setDisable(disable); + systemAuthAdmin.setUpdateTime(TimeUtils.timestamp()); + systemAuthAdminMapper.updateById(systemAuthAdmin); + + if (disable.equals(1)) { + StpUtil.kickout(id); + } + } + + @Override + public AdminMySelfVo mySelf(Integer id, List roleIds) { + AdminMySelfVo ret = new AdminMySelfVo(); + // 当前管理员角色拥有的菜单 + ret.setMenu(systemMenuService.selectMenuByRoleId(roleIds)); + // 当前管理员橘色拥有的按钮权限 + ret.setPermissions(iAuthService.getBtnAuthByRoleId(id)); + SystemAuthAdminDetailVo admin = detail(id); + AuthMySelfVo user = new AuthMySelfVo(); + BeanUtils.copyProperties(admin, user); + user.setDeptId(admin.getDeptId()); + user.setJobsId(admin.getJobsId()); + user.setRoleId(admin.getRoleId()); + ret.setUser(user); + + ret.setFirstLogin(admin.getFirstLogin()); + return ret; + } + + @Override + public JSONObject getExportData(PageValidate pageValidate, SystemAdminSearchValidate searchValidate) { + Integer page = pageValidate.getPage_no(); + Integer limit = pageValidate.getPage_size(); + PageResult userVoPageResult = this.list(pageValidate, searchValidate); + JSONObject ret = ToolUtils.getExportData(userVoPageResult.getCount(), limit, searchValidate.getPage_start(), + searchValidate.getPage_end(), "管理员记录列表"); + return ret; + } + + @Override + public String export(SystemAdminSearchValidate searchValidate) { + PageValidate pageValidate = new PageValidate(); + if (StringUtils.isNotNull(searchValidate.getPage_start())) { + pageValidate.setPage_no(searchValidate.getPage_start()); + } else { + pageValidate.setPage_no(1); + } + + if (StringUtils.isNotNull(searchValidate.getPage_end()) + && StringUtils.isNotNull(searchValidate.getPage_size())) { + pageValidate.setPage_size(searchValidate.getPage_end() * searchValidate.getPage_size()); + } else { + pageValidate.setPage_size(20); + } + Boolean isAll = StringUtils.isNull(searchValidate.getPage_type()) || searchValidate.getPage_type().equals(0) + ? true + : false; + List excellist = this.getExcellist(isAll, pageValidate, searchValidate); + String fileName = StringUtils.isNull(searchValidate.getFile_name()) ? ToolUtils.makeUUID() + : searchValidate.getFile_name(); + String folderPath = "/excel/export/" + TimeUtils.timestampToDay(System.currentTimeMillis() / 1000) + "/"; + String path = folderPath + fileName + ".xlsx"; + String filePath = YmlUtils.get("like.upload-directory") + path; + File folder = new File(YmlUtils.get("like.upload-directory") + folderPath); + if (!folder.exists()) { + if (!folder.mkdirs()) { + throw new OperateException("创建文件夹失败"); + } + } + EasyExcel.write(filePath) + .head(SystemAuthAdminListedExportVo.class) + .excelType(ExcelTypeEnum.XLSX) + .sheet("管理员记录") + .doWrite(excellist); + return UrlUtils.toAdminAbsoluteUrl(path); + } + + @Override + @Transactional + public void editSelf(SystemEditSelfValidate updateValidate, Integer adminId) { + Admin model = systemAuthAdminMapper.selectOne(new QueryWrapper() + .eq("id", adminId) + .isNull("delete_time") + .last("limit 1")); + model.setName(updateValidate.getName()); + model.setAvatar(UrlUtils.toRelativeUrl(updateValidate.getAvatar())); + model.setUpdateTime(System.currentTimeMillis() / 1000); + + if (StringUtils.isNotNull(updateValidate.getPassword()) + && StringUtils.isNotEmpty(updateValidate.getPassword())) { + String newPassword = updateValidate.getPassword().trim(); + if (StringUtils.isNotEmpty(newPassword)) { + this.validatePassword(newPassword); + String pwd = ToolUtils.makePassword(newPassword); + model.setPassword(pwd); + } + } + + model.setFirstLogin(0); + systemAuthAdminMapper.updateById(model); + } + + /** + * 校验密码强度 + * + * @author damonyuan + * @date 2025-12-26 + * @param password 密码 + */ + private void validatePassword(String password) { + if (password.length() < 8) { + throw new OperateException("密码长度不能少于8位"); + } + + int count = 0; + // 大写字母 + if (password.matches(".*[A-Z].*")) { + count++; + } + // 小写字母 + if (password.matches(".*[a-z].*")) { + count++; + } + // 数字 + if (password.matches(".*[0-9].*")) { + count++; + } + // 特殊符号 + if (password.matches(".*[^a-zA-Z0-9].*")) { + count++; + } + + if (count < 3) { + throw new OperateException("密码必须包含大小写字母、数字、特殊符号中的至少3种"); + } + } + + private List getExcellist(boolean isAll, PageValidate pageValidate, + SystemAdminSearchValidate searchValidate) { + Integer page = pageValidate.getPage_no(); + Integer limit = pageValidate.getPage_size(); + + MPJQueryWrapper mpjQueryWrapper = new MPJQueryWrapper<>(); + mpjQueryWrapper.select("distinct t.id,t.account,t.name,t.avatar," + + "t.multipoint_login," + + "t.disable,t.login_ip,t.login_time,t.create_time,t.update_time") + .leftJoin("yj_admin_role lar ON lar.admin_id = t.id") + .isNull("t.delete_time") + .orderByDesc(Arrays.asList("t.id")); + + systemAuthAdminMapper.setSearch(mpjQueryWrapper, searchValidate, new String[] { + "like:account:str", + "like:name:str" + }); + + if (StringUtils.isNotNull(searchValidate.getRole_id())) { + mpjQueryWrapper.in("lar.role_id", searchValidate.getRole_id()); + } + + List retList = new ArrayList<>(); + if (isAll) { + retList = systemAuthAdminMapper.selectJoinList(SystemAuthAdminListedExportVo.class, mpjQueryWrapper); + } else { + IPage iPage = systemAuthAdminMapper.selectJoinPage( + new Page<>(page, limit), + SystemAuthAdminListedExportVo.class, + mpjQueryWrapper); + retList = iPage.getRecords(); + } + + for (SystemAuthAdminListedExportVo vo : retList) { + if (vo.getId().equals(1)) { + vo.setRoleName("系统管理员"); + vo.setDeptName("-"); + } else { + + List roles = systemAuthRoleMapper.getByAdminId(vo.getId()); + List roleIds = new ArrayList<>(); + List roleNames = new ArrayList<>(); + if (!roles.isEmpty()) { + roles.forEach(item -> { + roleIds.add(item.getId()); + roleNames.add(item.getName()); + + }); + vo.setRoleId(roleIds); + vo.setRoleName(StringUtils.join(roleNames, ",")); + } + + List jobs = jobsMapper.getByAdminId(vo.getId()); + List jobsId = new ArrayList<>(); + List jobsNames = new ArrayList<>(); + if (!jobs.isEmpty()) { + jobs.forEach(item -> { + jobsId.add(item.getId()); + jobsNames.add(item.getName()); + }); + vo.setJobsId(jobsId); + vo.setJobsName(StringUtils.join(jobsNames, ",")); + } + + List depts = deptMapper.getByAdminId(vo.getId()); + List deptIds = new ArrayList<>(); + List deptNames = new ArrayList<>(); + if (!depts.isEmpty()) { + depts.forEach(item -> { + deptIds.add(item.getId()); + deptNames.add(item.getName()); + }); + vo.setDeptId(deptIds); + vo.setDeptName(StringUtils.join(deptNames, ",")); + + } + } + + vo.setDisableDesc(vo.getDisable() != null && vo.getDisable().equals(0) ? "启用" : "禁用"); + vo.setAvatar(UrlUtils.toAdminAbsoluteUrl(vo.getAvatar())); + vo.setCreateTime(TimeUtils.timestampToDate(vo.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(vo.getUpdateTime())); + vo.setLoginTime(TimeUtils.timestampToDate(vo.getLoginTime())); + } + return retList; + } +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/admin/AuthServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/admin/AuthServiceImpl.java new file mode 100644 index 0000000..bb78fb6 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/admin/AuthServiceImpl.java @@ -0,0 +1,42 @@ +package com.yj.admin.service.impl.admin; + +import com.yj.admin.service.admin.IAdminService; +import com.yj.admin.service.admin.IAuthService; +import com.yj.admin.vo.system.SystemAuthAdminDetailVo; +import com.yj.common.mapper.system.SystemMenuMapper; +import com.yj.common.mapper.system.SystemRoleMenuMapper; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * 权限功能类 + */ +@Service +public class AuthServiceImpl implements IAuthService { + + @Resource + IAdminService iAdminService; + + @Resource + SystemMenuMapper systemMenuMapper; + + @Resource + SystemRoleMenuMapper SystemRoleMenuMapper; + + @Override + public List getBtnAuthByRoleId(Integer adminId) { + List ret = new ArrayList(); + SystemAuthAdminDetailVo admin = iAdminService.detail(adminId); + if (admin.getRoot().equals(1)) { + ret.add("*"); + return ret; + } else { + List menuIds = SystemRoleMenuMapper.getMenuIds(adminId); + ret = this.systemMenuMapper.getPerms(menuIds); + } + return ret; + } +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/system/DeptServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/system/DeptServiceImpl.java new file mode 100644 index 0000000..6476071 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/system/DeptServiceImpl.java @@ -0,0 +1,225 @@ +package com.yj.admin.service.impl.system; + +import com.alibaba.fastjson2.JSONArray; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.yj.admin.service.system.IDeptService; +import com.yj.admin.validate.system.DeptCreateValidate; +import com.yj.admin.validate.system.DeptSearchValidate; +import com.yj.admin.validate.system.DeptUpdateValidate; +import com.yj.admin.vo.system.DeptVo; +import com.yj.common.entity.admin.Admin; +import com.yj.common.entity.admin.Dept; +import com.yj.common.mapper.admin.AdminMapper; +import com.yj.common.mapper.admin.DeptMapper; +import com.yj.common.util.ListUtils; +import com.yj.common.util.TimeUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; + +/** + * 系统部门服务实现类 + */ +@Service +public class DeptServiceImpl implements IDeptService { + + @Resource + DeptMapper deptMapper; + + @Resource + AdminMapper adminMapper; + + /** + * 岗位所有 + * + * @author fzr + * @return List + */ + @Override + public JSONArray all() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.isNull("delete_time"); + queryWrapper.orderByDesc(Arrays.asList("sort", "id")); + queryWrapper.select(Dept.class, info -> + !info.getColumn().equals("delete_time")); + + + List systemAuthDeptList = deptMapper.selectList(queryWrapper); + + List list = new LinkedList<>(); + for (Dept systemAuthDept : systemAuthDeptList) { + DeptVo vo = new DeptVo(); + BeanUtils.copyProperties(systemAuthDept, vo); + vo.setStatusDesc(systemAuthDept.getStatus() != null && systemAuthDept.getStatus().intValue() == 1 ? "正常" : "禁用"); + vo.setCreateTime(TimeUtils.timestampToDate(systemAuthDept.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(systemAuthDept.getUpdateTime())); + list.add(vo); + } + + JSONArray jsonArray = JSONArray.parseArray(JSONArray.toJSONString(list)); + return ListUtils.listToTree(jsonArray, "id", "pid", "children"); + } + + /** + * 部门列表 + * + * @author fzr + * @param searchValidate 搜索参数 + * @return JSONArray + */ + @Override + public JSONArray list(DeptSearchValidate searchValidate) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.isNull("delete_time"); + queryWrapper.orderByDesc(Arrays.asList("sort", "id")); + queryWrapper.select(Dept.class, info -> + !info.getColumn().equals("delete_time")); + + deptMapper.setSearch(queryWrapper, searchValidate, new String[]{ + "like:name:str", + "=:status@status:int" + }); + + List systemAuthDeptList = deptMapper.selectList(queryWrapper); + + List list = new LinkedList<>(); + for (Dept systemAuthDept : systemAuthDeptList) { + DeptVo vo = new DeptVo(); + BeanUtils.copyProperties(systemAuthDept, vo); + vo.setStatusDesc(systemAuthDept.getStatus() != null && systemAuthDept.getStatus().intValue() == 1 ? "正常" : "禁用"); + vo.setCreateTime(TimeUtils.timestampToDate(systemAuthDept.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(systemAuthDept.getUpdateTime())); + list.add(vo); + } + + JSONArray jsonArray = JSONArray.parseArray(JSONArray.toJSONString(list)); + return ListUtils.listToTree(jsonArray, "id", "pid", "children"); + } + + /** + * 部门详情 + * + * @author fzr + * @param id 主键 + * @return SystemDeptVo + */ + @Override + public DeptVo detail(Integer id) { + Dept systemAuthDept = deptMapper.selectOne( + new QueryWrapper() + .select(Dept.class, info -> + !info.getColumn().equals("delete_time")) + .eq("id", id) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(systemAuthDept, "部门已不存在!"); + + DeptVo vo = new DeptVo(); + BeanUtils.copyProperties(systemAuthDept, vo); + vo.setCreateTime(TimeUtils.timestampToDate(systemAuthDept.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(systemAuthDept.getUpdateTime())); + + return vo; + } + + /** + * 部门新增 + * + * @author fzr + * @param createValidate 参数 + */ + @Override + public void add(DeptCreateValidate createValidate) { + if (createValidate.getPid().equals(0)) { + Dept systemAuthDept = deptMapper.selectOne( + new QueryWrapper() + .select("id,pid,name") + .eq("pid", 0) + .isNull("delete_time") + .last("limit 1")); + + Assert.isNull(systemAuthDept, "顶级部门只允许有一个"); + } + + Dept model = new Dept(); + model.setPid(createValidate.getPid()); + model.setName(createValidate.getName()); + model.setLeader(createValidate.getLeader()); + model.setMobile(createValidate.getMobile()); + model.setSort(createValidate.getSort()); + model.setStatus(createValidate.getStatus()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setUpdateTime(System.currentTimeMillis() / 1000); + deptMapper.insert(model); + } + + /** + * 部门编辑 + * + * @author fzr + * @param updateValidate 参数 + */ + @Override + public void edit(DeptUpdateValidate updateValidate) { + Dept model = deptMapper.selectOne( + new QueryWrapper() + .select(Dept.class, info -> + !info.getColumn().equals("delete_time")) + .eq("id", updateValidate.getId()) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(model, "部门不存在"); + Assert.isFalse((model.getPid().equals(0) && updateValidate.getPid()>0), "顶级部门不能修改上级"); + Assert.isFalse(updateValidate.getId().equals(updateValidate.getPid()), "上级部门不能是自己"); + + model.setPid(updateValidate.getPid()); + model.setName(updateValidate.getName()); + model.setLeader(updateValidate.getLeader()); + model.setMobile(updateValidate.getMobile()); + model.setSort(updateValidate.getSort()); + model.setStatus(updateValidate.getStatus()); + model.setUpdateTime(System.currentTimeMillis() / 1000); + deptMapper.updateById(model); + } + + /** + * 部门删除 + * + * @author fzr + * @param id 主键 + */ + @Override + public void del(Integer id) { + Dept model = deptMapper.selectOne( + new QueryWrapper() + .select("id,pid,name") + .eq("id", id) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(model, "部门不存在"); + Assert.isFalse((model.getPid() == 0), "顶级部门不能删除"); + + Dept pModel = deptMapper.selectOne( + new QueryWrapper() + .select("id,pid,name") + .eq("pid", id) + .isNull("delete_time") + .last("limit 1")); + + Assert.isNull(pModel, "请先删除子级部门"); + + List admins = adminMapper.getByDept(id); + + Assert.isTrue(admins.isEmpty(), "该部门已被管理员使用,请先移除"); + + model.setDeleteTime(System.currentTimeMillis() / 1000); + deptMapper.updateById(model); + } + +} \ No newline at end of file diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/system/JobsServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/system/JobsServiceImpl.java new file mode 100644 index 0000000..4317a3f --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/system/JobsServiceImpl.java @@ -0,0 +1,299 @@ +package com.yj.admin.service.impl.system; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.support.ExcelTypeEnum; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yj.admin.service.system.IJobsService; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.system.JobsCreateValidate; +import com.yj.admin.validate.system.JobsSearchValidate; +import com.yj.admin.validate.system.JobsUpdateValidate; +import com.yj.admin.vo.system.JobsExportVo; +import com.yj.admin.vo.system.JobsVo; +import com.yj.common.core.PageResult; +import com.yj.common.entity.admin.Admin; +import com.yj.common.entity.admin.Jobs; +import com.yj.common.exception.OperateException; +import com.yj.common.mapper.admin.AdminMapper; +import com.yj.common.mapper.admin.JobsMapper; +import com.yj.common.util.*; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * 系统岗位服务实现类 + */ +@Service +public class JobsServiceImpl implements IJobsService { + + @Resource + JobsMapper jobsMapper; + + @Resource + AdminMapper adminMapper; + + /** + * 岗位所有 + * + * @author fzr + * @return List + */ + @Override + public List all() { + List jobs = jobsMapper.selectList(new QueryWrapper() + .isNull("delete_time") + .orderByDesc((Arrays.asList("sort", "id")))); + + List adminVoArrayList = new ArrayList<>(); + for (Jobs job : jobs) { + JobsVo vo = new JobsVo(); + BeanUtils.copyProperties(job, vo); + + vo.setCreateTime(TimeUtils.timestampToDate(job.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(job.getUpdateTime())); + adminVoArrayList.add(vo); + } + + return adminVoArrayList; + } + + /** + * 岗位列表 + * + * @author fzr + * @param pageValidate 分页参数 + * @param searchValidate 搜索参数 + * @return PageResult + */ + @Override + public PageResult list(PageValidate pageValidate, JobsSearchValidate searchValidate) { + Integer page = pageValidate.getPage_no(); + Integer limit = pageValidate.getPage_size(); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select(Jobs.class, info-> + !info.getColumn().equals("delete_time")) + .isNull("delete_time") + .orderByDesc(Arrays.asList("sort", "id")); + + jobsMapper.setSearch(queryWrapper, searchValidate, new String[]{ + "like:code:str", + "like:name:str", + "=:status@status:int" + }); + + IPage iPage = jobsMapper.selectPage(new Page<>(page, limit), queryWrapper); + + List list = new ArrayList<>(); + for (Jobs job : iPage.getRecords()) { + JobsVo vo = new JobsVo(); + BeanUtils.copyProperties(job, vo); + vo.setStatusDesc(job.getStatus() != null && job.getStatus().intValue() == 1 ? "正常" : "停用"); + vo.setCreateTime(TimeUtils.timestampToDate(job.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(job.getUpdateTime())); + list.add(vo); + } + + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list); + } + + /** + * 岗位详情 + * + * @author fzr + * @param id 主键 + * @return SystemPostVo + */ + @Override + public JobsVo detail(Integer id) { + Jobs systemAuthPost = jobsMapper.selectOne(new QueryWrapper() + .select(Jobs.class, info -> + !info.getColumn().equals("delete_time")) + .eq("id", id) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(systemAuthPost, "岗位不存在"); + + JobsVo vo = new JobsVo(); + BeanUtils.copyProperties(systemAuthPost, vo); + vo.setCreateTime(TimeUtils.timestampToDate(systemAuthPost.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(systemAuthPost.getUpdateTime())); + + return vo; + } + + /** + * 岗位新增 + * + * @author fzr + * @param createValidate 参数 + */ + @Override + public void add(JobsCreateValidate createValidate) { + Assert.isNull(jobsMapper.selectOne(new QueryWrapper() + .select("id,code,name") + .nested( + wq->wq.eq("code", createValidate.getCode()) + .or() + .eq("name", createValidate.getName()) + ) + .isNull("delete_time") + .last("limit 1")), "该岗位已存在"); + + Jobs model = new Jobs(); + model.setCode(createValidate.getCode()); + model.setName(createValidate.getName()); + model.setSort(createValidate.getSort()); + model.setRemark(createValidate.getRemark()); + model.setStatus(createValidate.getStatus()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setUpdateTime(System.currentTimeMillis() / 1000); + jobsMapper.insert(model); + } + + /** + * 岗位编辑 + * + * @author fzr + * @param updateValidate 参数 + */ + @Override + public void edit(JobsUpdateValidate updateValidate) { + Jobs model = jobsMapper.selectOne(new QueryWrapper() + .select(Jobs.class, info -> + !info.getColumn().equals("delete_time")) + .eq("id", updateValidate.getId()) + .isNull("delete_time") + .last("limit 1")); + Assert.notNull(model, "岗位不存在"); + Assert.isNull(jobsMapper.selectOne(new QueryWrapper() + .select("id,code,name") + .ne("id", updateValidate.getId()) + .nested( + wq->wq.eq("code", updateValidate.getCode()) + .or() + .eq("name", updateValidate.getName()) + ) + .isNull("delete_time") + .last("limit 1")), "该岗位已存在"); + model.setCode(updateValidate.getCode()); + model.setName(updateValidate.getName()); + model.setSort(updateValidate.getSort()); + model.setRemark(updateValidate.getRemark()); + model.setStatus(updateValidate.getStatus()); + model.setUpdateTime(System.currentTimeMillis() / 1000); + jobsMapper.updateById(model); + } + + /** + * 岗位删除 + * + * @author fzr + * @param id 主键 + */ + @Override + public void del(Integer id) { + Jobs model = jobsMapper.selectOne(new QueryWrapper() + .select("id,code,name") + .eq("id", id) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(model, "岗位不存在"); + + List admins = adminMapper.getByJobs(id); + + Assert.isTrue(admins.isEmpty(), "该岗位已被管理员使用,请先移除"); + + model.setDeleteTime(System.currentTimeMillis() / 1000); + jobsMapper.updateById(model); + } + + @Override + public JSONObject getExportData(PageValidate pageValidate, JobsSearchValidate searchValidate) { + Integer page = pageValidate.getPage_no(); + Integer limit = pageValidate.getPage_size(); + PageResult userVoPageResult = this.list(pageValidate, searchValidate); + JSONObject ret = ToolUtils.getExportData(userVoPageResult.getCount(), limit, searchValidate.getPage_start(), searchValidate.getPage_end(),"岗位记录列表"); + return ret; + } + + @Override + public String export(JobsSearchValidate searchValidate) { + PageValidate pageValidate = new PageValidate(); + if (StringUtils.isNotNull(searchValidate.getPage_start())) { + pageValidate.setPage_no(searchValidate.getPage_start()); + } else { + pageValidate.setPage_no(1); + } + + if (StringUtils.isNotNull(searchValidate.getPage_end()) && StringUtils.isNotNull(searchValidate.getPage_size())) { + pageValidate.setPage_size(searchValidate.getPage_end() * searchValidate.getPage_size()); + } else { + pageValidate.setPage_size(20); + } + Boolean isAll = StringUtils.isNull(searchValidate.getPage_type()) || searchValidate.getPage_type().equals(0) ? true : false; + List excellist = this.getExcellist(isAll, pageValidate, searchValidate); + String fileName = StringUtils.isNull(searchValidate.getFile_name()) ? ToolUtils.makeUUID() : searchValidate.getFile_name(); + String folderPath = "/excel/export/"+ TimeUtils.timestampToDay(System.currentTimeMillis() / 1000) +"/" ; + String path = folderPath + fileName +".xlsx"; + String filePath = YmlUtils.get("like.upload-directory") + path; + File folder = new File(YmlUtils.get("like.upload-directory") + folderPath); + if (!folder.exists()) { + if (!folder.mkdirs()) { + throw new OperateException("创建文件夹失败"); + } + } + EasyExcel.write(filePath) + .head(JobsExportVo.class) + .excelType(ExcelTypeEnum.XLSX) + .sheet("用户记录") + .doWrite(excellist); + return UrlUtils.toAdminAbsoluteUrl(path); + } + private List getExcellist(boolean isAll, PageValidate pageValidate, JobsSearchValidate searchValidate) { + Integer page = pageValidate.getPage_no(); + Integer limit = pageValidate.getPage_size(); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select(Jobs.class, info-> + !info.getColumn().equals("delete_time")) + .isNull("delete_time") + .orderByDesc(Arrays.asList("sort", "id")); + + jobsMapper.setSearch(queryWrapper, searchValidate, new String[]{ + "like:code:str", + "like:name:str", + "=:status@status:int" + }); + List jobsList = new ArrayList<>(); + if (isAll) { + jobsList = jobsMapper.selectList(queryWrapper); + } else { + IPage iPage = jobsMapper.selectPage(new Page<>(page, limit), queryWrapper); + jobsList = iPage.getRecords(); + } + + List list = new ArrayList<>(); + for (Jobs job : jobsList) { + JobsExportVo vo = new JobsExportVo(); + BeanUtils.copyProperties(job, vo); + vo.setStatusDesc(job.getStatus() != null && job.getStatus().intValue() == 1 ? "正常" : "停用"); + vo.setCreateTime(TimeUtils.timestampToDate(job.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(job.getUpdateTime())); + list.add(vo); + } + return list; + } +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/system/SystemCacheServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/system/SystemCacheServiceImpl.java new file mode 100644 index 0000000..a15984b --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/system/SystemCacheServiceImpl.java @@ -0,0 +1,22 @@ +package com.yj.admin.service.impl.system; + +import com.yj.admin.service.system.ISystemCacheService; +import com.yj.common.cache.ConfigCache; +import org.springframework.stereotype.Service; + +/** + * 系统缓存实现类 + */ +@Service +public class SystemCacheServiceImpl implements ISystemCacheService { + + /** + * 清除系统缓存 + */ + @Override + public void clear() { + ConfigCache.clear(); + } + + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/system/SystemLoginServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/system/SystemLoginServiceImpl.java new file mode 100644 index 0000000..3bc0e06 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/system/SystemLoginServiceImpl.java @@ -0,0 +1,185 @@ +package com.yj.admin.service.impl.system; + +import cn.dev33.satoken.stp.StpUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.admin.cache.CaptchaCache; +import com.yj.admin.service.system.ISystemLoginService; +import com.yj.admin.service.system.ISystemRoleService; +import com.yj.admin.validate.system.SystemAdminLoginsValidate; +import com.yj.admin.vo.system.SystemCaptchaVo; +import com.yj.admin.vo.system.SystemLoginVo; +import com.yj.common.entity.admin.Admin; +import com.yj.common.entity.system.SystemLogLogin; +import com.yj.common.enums.ErrorEnum; +import com.yj.common.exception.LoginException; +import com.yj.common.exception.OperateException; +import com.yj.common.mapper.admin.AdminMapper; +import com.yj.common.mapper.system.SystemLogLoginMapper; +import com.yj.common.util.*; +import com.google.code.kaptcha.Producer; +import nl.bitwalker.useragentutils.UserAgent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.util.FastByteArrayOutputStream; + +import javax.annotation.Resource; +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletRequest; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.*; + +/** + * 系统登录服务实现类 + */ +@Service +public class SystemLoginServiceImpl implements ISystemLoginService { + + @Resource + ISystemRoleService iSystemRoleService; + @Resource + Producer captchaProducer; + + @Resource + SystemLogLoginMapper systemLogLoginMapper; + + @Resource + AdminMapper adminMapper; + + private static final Logger log = LoggerFactory.getLogger(SystemLoginServiceImpl.class); + + /** + * 验证码 + * + * @author fzr + * @return SystemCaptchaVo + */ + @Override + public SystemCaptchaVo captcha() { + // 验证码信息 + String capStr, code; + BufferedImage image; + String uuid = ToolUtils.makeUUID(); + + // 生成验证码 + capStr = code = captchaProducer.createText(); + image = captchaProducer.createImage(capStr); + FastByteArrayOutputStream os = new FastByteArrayOutputStream(); + try { + ImageIO.write(image, "jpg", os); + } catch (IOException e) { + log.error("verifyCode Error:" + e.getMessage()); + throw new OperateException(e.getMessage()); + } + + // 缓存验证码 + CaptchaCache.set(code, uuid); + + // 返回验证码 + String base64 = "data:image/jpeg;base64,"+ Base64Util.encode(os.toByteArray()); + SystemCaptchaVo vo = new SystemCaptchaVo(); + vo.setUuid(uuid); + vo.setImg(base64); + return vo; + } + + /** + * 登录 + * + * @author fzr + * @param loginsValidate 登录参数 + * @return SystemLoginVo + */ + @Override + public SystemLoginVo login(SystemAdminLoginsValidate loginsValidate) { + String username = loginsValidate.getAccount(); + String password = loginsValidate.getPassword(); + + Admin sysAdmin = adminMapper.selectOne(new QueryWrapper() + .eq("account", username) + .last("limit 1")); + + if (StringUtils.isNull(sysAdmin)) { + throw new OperateException("账号不存在"); + } + + if (sysAdmin.getDisable().equals(1)) { + this.recordLoginLog(sysAdmin.getId(), loginsValidate.getAccount(), ErrorEnum.FAILED.getMsg()); + throw new LoginException(ErrorEnum.FAILED.getCode(), ErrorEnum.LOGIN_DISABLE_ERROR.getMsg()); + } + String md5Pwd = ToolUtils.makePassword(password); + if (!md5Pwd.equals(sysAdmin.getPassword())) { + this.recordLoginLog(sysAdmin.getId(), loginsValidate.getAccount(), ErrorEnum.FAILED.getMsg()); + throw new LoginException(ErrorEnum.FAILED.getCode(), ErrorEnum.LOGIN_ACCOUNT_ERROR.getMsg()); + } + + try { + // 禁止多处登录 + if (sysAdmin.getMultipointLogin().equals(0)) { + StpUtil.logout(sysAdmin.getId()); + } + + // 实现账号登录 + StpUtil.login(sysAdmin.getId()); + + // 更新登录信息 + sysAdmin.setLoginIp(IpUtils.getIpAddress()); + sysAdmin.setLoginTime(System.currentTimeMillis() / 1000); + adminMapper.updateById(sysAdmin); + + // 记录登录日志 +// this.recordLoginLog(sysAdmin.getId(), loginsValidate.getAccount(), ""); + + // 响应登录信息 + String defaultAvatar = "/api/static/backend_avatar.png"; + String avatar = StringUtils.isNotEmpty(sysAdmin.getAvatar()) ? UrlUtils.toRelativeUrl(sysAdmin.getAvatar()) : defaultAvatar; + SystemLoginVo vo = new SystemLoginVo(); + vo.setId(sysAdmin.getId()); + vo.setName(sysAdmin.getName()); + vo.setAvatar(UrlUtils.toAdminAbsoluteUrl(avatar)); + vo.setToken(StpUtil.getTokenValue()); + vo.setRoleName(ListUtils.listToStringByStr(iSystemRoleService.getRoleNameByAdminId(sysAdmin.getId()), "/")); + return vo; + } catch (Exception e) { + Integer adminId = StringUtils.isNotNull(sysAdmin.getId()) ? sysAdmin.getId() : 0; + String error = StringUtils.isEmpty(e.getMessage()) ? "未知错误" : e.getMessage(); +// this.recordLoginLog(adminId, loginsValidate.getAccount(), error); + throw new OperateException(e.getMessage()); + } + } + + /** + * 退出 + * + * @author fzr + * @param token 令牌 + */ + @Override + public void logout(String token) { +// RedisUtil.del(AdminConfig.backstageTokenKey + token); + } + + /** + * 记录登录日志 + */ + private void recordLoginLog(Integer adminId, String username, String error) { + try { + HttpServletRequest request = Objects.requireNonNull(RequestUtils.handler()); + final UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent")); + + SystemLogLogin model = new SystemLogLogin(); + model.setAdminId(adminId); + model.setUsername(username); + model.setIp(IpUtils.getIpAddress()); + model.setOs(userAgent.getOperatingSystem().getName()); + model.setBrowser(userAgent.getBrowser().getName()); + model.setStatus(StringUtils.isEmpty(error) ? 1 : 0); + model.setCreateTime(System.currentTimeMillis() / 1000); + systemLogLoginMapper.insert(model); + } catch (Exception e) { + log.error("记录登录日志异常 {}" + e.getMessage()); + } + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/system/SystemLogsServerImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/system/SystemLogsServerImpl.java new file mode 100644 index 0000000..b37b26d --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/system/SystemLogsServerImpl.java @@ -0,0 +1,114 @@ +package com.yj.admin.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.query.MPJQueryWrapper; +import com.yj.admin.service.system.ISystemLogsServer; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.system.SystemSearchLoginsValidate; +import com.yj.admin.validate.system.SystemSearchOperateValidate; +import com.yj.admin.vo.system.SystemLogLoginVo; +import com.yj.admin.vo.system.SystemLogOperateVo; +import com.yj.common.config.GlobalConfig; +import com.yj.common.core.PageResult; +import com.yj.common.entity.system.SystemLogLogin; +import com.yj.common.entity.system.OperationLog; +import com.yj.common.mapper.system.SystemLogLoginMapper; +import com.yj.common.mapper.system.SystemLogOperateMapper; +import com.yj.common.util.TimeUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.LinkedList; +import java.util.List; + +/** + * 系统日志服务实现类 + */ +@Service +public class SystemLogsServerImpl implements ISystemLogsServer { + + @Resource + SystemLogOperateMapper logOperateMapper; + + @Resource + SystemLogLoginMapper logLoginMapper; + + /** + * 系统操作日志 + * + * @author fzr + * @param pageValidate 分页参数 + * @param searchValidate 搜索参数 + * @return PageResult + */ + @Override + public PageResult operate(PageValidate pageValidate, SystemSearchOperateValidate searchValidate) { + Integer pageNo = pageValidate.getPage_no(); + Integer pageSize = pageValidate.getPage_size(); + + MPJQueryWrapper mpjQueryWrapper = new MPJQueryWrapper() + .selectAll(OperationLog.class) + .select("sa.account as username,sa.name nickname") + .leftJoin("?_admin sa ON sa.id=t.admin_id".replace("?_", GlobalConfig.tablePrefix)) + .orderByDesc("id"); + + logOperateMapper.setSearch(mpjQueryWrapper, searchValidate, new String[]{ + "like:action:str", + "like:username@sa.name:str", + "like:ip:str", + "=:type:str", + "=:url:str", + "datetime:start_time-end_time@t.create_time:str" + }); + + IPage iPage = logOperateMapper.selectJoinPage( + new Page<>(pageNo, pageSize), + SystemLogOperateVo.class, + mpjQueryWrapper); + + for (SystemLogOperateVo vo : iPage.getRecords()) { + vo.setCreateTime(TimeUtils.timestampToDate(vo.getCreateTime())); + } + + return PageResult.iPageHandle(iPage); + } + + /** + * 系统登录日志 + * + * @author fzr + * @param pageValidate 分页参数 + * @param searchValidate 搜索参数 + * @return PageResult + */ + @Override + public PageResult login(PageValidate pageValidate, SystemSearchLoginsValidate searchValidate) { + Integer pageNo = pageValidate.getPage_no(); + Integer pageSize = pageValidate.getPage_size(); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc("id"); + logLoginMapper.setSearch(queryWrapper, searchValidate, new String[]{ + "like:username:str", + "=:status:int", + "datetime:startTime-endTime@create_time:str" + }); + + IPage iPage = logLoginMapper.selectPage(new Page<>(pageNo, pageSize), queryWrapper); + + List list = new LinkedList<>(); + for (SystemLogLogin item : iPage.getRecords()) { + SystemLogLoginVo vo = new SystemLogLoginVo(); + BeanUtils.copyProperties(item, vo); + + vo.setCreateTime(TimeUtils.timestampToDate(item.getCreateTime())); + list.add(vo); + } + + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/system/SystemMenuServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/system/SystemMenuServiceImpl.java new file mode 100644 index 0000000..64755c0 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/system/SystemMenuServiceImpl.java @@ -0,0 +1,235 @@ +package com.yj.admin.service.impl.system; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.yj.admin.LikeAdminThreadLocal; +import com.yj.admin.service.system.ISystemMenuService; +import com.yj.admin.service.system.ISystemRoleMenuService; +import com.yj.admin.validate.system.SystemMenuCreateValidate; +import com.yj.admin.validate.system.SystemMenuUpdateValidate; +import com.yj.admin.vo.system.SystemAuthMenuVo; +import com.yj.admin.vo.system.SystemMenuListedVo; +import com.yj.common.entity.system.SystemMenu; +import com.yj.common.mapper.system.SystemMenuMapper; +import com.yj.common.util.ListUtils; +import com.yj.common.util.TimeUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * 系统菜单服务实现类 + */ +@Service +public class SystemMenuServiceImpl implements ISystemMenuService { + + @Resource + SystemMenuMapper systemAuthMenuMapper; + + @Resource + ISystemRoleMenuService iSystemRoleMenuService; + + /** + * 根据角色ID获取菜单 + * + * @author fzr + * @param roleIds 角色ID + * @return JSONArray + */ + @Override + public JSONArray selectMenuByRoleId(List roleIds) { + Integer adminId = LikeAdminThreadLocal.getAdminId(); + List menuIds = iSystemRoleMenuService.selectMenuIdsByRoleId(roleIds); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("type", Arrays.asList("M", "C")); +// queryWrapper.eq("is_disable", 0); + queryWrapper.orderByDesc("sort"); + queryWrapper.orderByAsc("id"); + if (!adminId.equals(1)) { + if (menuIds.size() <= 0) { + menuIds.add(0); + } + queryWrapper.in("id", menuIds); + } + + List systemAuthMenus = systemAuthMenuMapper.selectList(queryWrapper); + + List lists = new ArrayList<>(); + for (SystemMenu systemAuthMenu : systemAuthMenus) { + SystemAuthMenuVo vo = new SystemAuthMenuVo(); + BeanUtils.copyProperties(systemAuthMenu, vo); + vo.setUpdateTime(TimeUtils.timestampToDate(systemAuthMenu.getUpdateTime())); + vo.setCreateTime(TimeUtils.timestampToDate(systemAuthMenu.getCreateTime())); + lists.add(vo); + } + + JSONArray jsonArray = JSONArray.parseArray(JSONArray.toJSONString(lists)); + return ListUtils.listToTree(jsonArray, "id", "pid", "children"); + } + + /** + * 菜单列表 + * + * @author fzr + * @return JSONArray + */ + @Override + public JSONObject list() { + return new JSONObject() {{ + put("lists", all()); + }}; + } + + @Override + public JSONArray systemMenuLists() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc("sort"); + queryWrapper.orderByAsc("id"); + + List systemAuthMenus = systemAuthMenuMapper.selectList(queryWrapper); + + List lists = new ArrayList<>(); + for (SystemMenu systemAuthMenu : systemAuthMenus) { + SystemMenuListedVo vo = new SystemMenuListedVo(); + BeanUtils.copyProperties(systemAuthMenu, vo); + + vo.setCreateTime(TimeUtils.timestampToDate(systemAuthMenu.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(systemAuthMenu.getUpdateTime())); + lists.add(vo); + } + + JSONArray jsonArray = JSONArray.parseArray(JSONArray.toJSONString(lists)); + return ListUtils.listToTree(jsonArray, "id", "pid", "children"); + } + + @Override + public JSONArray all() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc("sort"); + queryWrapper.orderByAsc("id"); + + List systemAuthMenus = systemAuthMenuMapper.selectList(queryWrapper); + + List lists = new ArrayList<>(); + for (SystemMenu systemAuthMenu : systemAuthMenus) { + SystemAuthMenuVo vo = new SystemAuthMenuVo(); + BeanUtils.copyProperties(systemAuthMenu, vo); + + vo.setCreateTime(TimeUtils.timestampToDate(systemAuthMenu.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(systemAuthMenu.getUpdateTime())); + lists.add(vo); + } + + JSONArray jsonArray = JSONArray.parseArray(JSONArray.toJSONString(lists)); + + return ListUtils.listToTree(jsonArray, "id", "pid", "children"); + } + + /** + * 菜单详情 + * + * @author fzr + * @param id 主键参数 + * @return SysMenu + */ + @Override + public SystemAuthMenuVo detail(Integer id) { + SystemMenu systemAuthMenu = systemAuthMenuMapper.selectOne(new QueryWrapper().eq("id", id)); + Assert.notNull(systemAuthMenu, "菜单已不存在!"); + + SystemAuthMenuVo vo = new SystemAuthMenuVo(); + BeanUtils.copyProperties(systemAuthMenu, vo); + vo.setCreateTime(TimeUtils.timestampToDate(systemAuthMenu.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(systemAuthMenu.getUpdateTime())); + + return vo; + } + + /** + * 新增菜单 + * + * @author fzr + * @param createValidate 参数 + */ + @Override + public void add(SystemMenuCreateValidate createValidate) { + SystemMenu model = new SystemMenu(); + model.setPid(createValidate.getPid()); + model.setType(createValidate.getType()); + model.setName(createValidate.getName()); + model.setIcon(createValidate.getIcon()); + model.setSort(createValidate.getSort()); + model.setPerms(createValidate.getPerms()); + model.setPaths(createValidate.getPaths()); + model.setComponent(createValidate.getComponent()); + model.setSelected(createValidate.getSelected()); + model.setParams(createValidate.getParams()); + model.setIsCache(createValidate.getIsCache()); + model.setIsShow(createValidate.getIsShow()); + model.setIsDisable(createValidate.getIsDisable()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setUpdateTime(System.currentTimeMillis() / 1000); + systemAuthMenuMapper.insert(model); + } + + /** + * 编辑菜单 + * + * @author fzr + * @param updateValidate 菜单 + */ + @Override + public void edit(SystemMenuUpdateValidate updateValidate) { + SystemMenu model = systemAuthMenuMapper.selectOne(new QueryWrapper().eq("id", updateValidate.getId())); + Assert.notNull(model, "菜单已不存在!"); + + model.setType(updateValidate.getType()); + model.setName(updateValidate.getName()); + model.setIcon(updateValidate.getIcon()); + model.setSort(updateValidate.getSort()); + model.setPaths(updateValidate.getPaths()); + model.setPerms(updateValidate.getPerms()); + model.setComponent(updateValidate.getComponent()); + model.setPid(updateValidate.getPid()); + model.setSelected(updateValidate.getSelected()); + model.setParams(updateValidate.getParams()); + model.setIsCache(updateValidate.getIsCache()); + model.setIsShow(updateValidate.getIsShow()); + model.setIsDisable(updateValidate.getIsDisable()); + model.setUpdateTime(System.currentTimeMillis() / 1000); + systemAuthMenuMapper.updateById(model); + } + + /** + * 删除菜单 + * + * @author fzr + * @param id 主键参数 + */ + @Override + public void del(Integer id) { + SystemMenu model = systemAuthMenuMapper.selectOne( + new QueryWrapper() + .select("id,pid,name") + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "菜单已不存在!"); + Assert.isNull(systemAuthMenuMapper.selectOne( + new QueryWrapper() + .eq("pid", id) + .last("limit 1")), + "请先删除子菜单再操作!"); + + systemAuthMenuMapper.deleteById(id); + iSystemRoleMenuService.batchDeleteByMenuId(id); + } + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/system/SystemRoleMenuServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/system/SystemRoleMenuServiceImpl.java new file mode 100644 index 0000000..1dc2ff5 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/system/SystemRoleMenuServiceImpl.java @@ -0,0 +1,105 @@ +package com.yj.admin.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.admin.service.system.ISystemRoleMenuService; +import com.yj.common.entity.system.SystemRole; +import com.yj.common.entity.system.SystemRoleMenu; +import com.yj.common.mapper.system.SystemRoleMapper; +import com.yj.common.mapper.system.SystemRoleMenuMapper; +import com.yj.common.util.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.LinkedList; +import java.util.List; + +/** + * 角色菜单关系实现类 + */ +@Service +public class SystemRoleMenuServiceImpl implements ISystemRoleMenuService { + + + @Resource + SystemRoleMenuMapper systemRoleMenuMapper; + + @Resource + SystemRoleMapper systemAuthRoleMapper; + + /** + * 根据角色ID获取菜单ID + * + * @param roleIds 角色ID + * @return List + */ + @Override + public List selectMenuIdsByRoleId(List roleIds) { + List menus = new LinkedList<>(); + + if (roleIds.isEmpty()) { + return menus; + } + + SystemRole systemAuthRole = systemAuthRoleMapper.selectOne(new QueryWrapper() + .in("id", roleIds) +// .eq("is_disable", 0) + .last("limit 1")); + + if (StringUtils.isNull(systemAuthRole)) { + return menus; + } + + List systemRoleMenus = systemRoleMenuMapper.selectList( + new QueryWrapper() + .in("role_id", roleIds)); + + for (SystemRoleMenu systemRoleMenu : systemRoleMenus) { + menus.add(systemRoleMenu.getMenuId()); + } + + return menus; + } + + /** + * 批量写入角色菜单 + * + * @author fzr + * @param roleId 角色ID + * @param menuIds 菜单ID组 + */ + @Override + @Transactional + public void batchSaveByMenuIds(Integer roleId, List menuIds) { + if (menuIds != null && !menuIds.isEmpty()) { + menuIds.forEach(item-> { + SystemRoleMenu model = new SystemRoleMenu(); + model.setRoleId(roleId); + model.setMenuId(item); + systemRoleMenuMapper.insert(model); + }); + } + } + + /** + * 批量删除角色菜单(根据角色ID) + * + * @author fzr + * @param roleId 角色ID + */ + @Override + public void batchDeleteByRoleId(Integer roleId) { + systemRoleMenuMapper.delete(new QueryWrapper().eq("role_id", roleId)); + } + + /** + * 批量删除角色菜单(根据菜单ID) + * + * @author fzr + * @param menuId 菜单ID + */ + @Override + public void batchDeleteByMenuId(Integer menuId) { + systemRoleMenuMapper.delete(new QueryWrapper().eq("menu_id", menuId)); + } +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/impl/system/SystemRoleServiceImpl.java b/yj-admin/src/main/java/com/yj/admin/service/impl/system/SystemRoleServiceImpl.java new file mode 100644 index 0000000..92276aa --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/impl/system/SystemRoleServiceImpl.java @@ -0,0 +1,256 @@ +package com.yj.admin.service.impl.system; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yj.admin.service.admin.IAdminRoleService; +import com.yj.admin.service.system.ISystemRoleMenuService; +import com.yj.admin.service.system.ISystemRoleService; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.system.SystemRoleCreateValidate; +import com.yj.admin.validate.system.SystemRoleUpdateValidate; +import com.yj.admin.vo.system.SystemAuthRoleVo; +import com.yj.common.core.PageResult; +import com.yj.common.entity.admin.Admin; +import com.yj.common.entity.admin.AdminRole; +import com.yj.common.entity.system.SystemRole; +import com.yj.common.mapper.admin.AdminMapper; +import com.yj.common.mapper.system.SystemRoleMapper; +import com.yj.common.util.StringUtils; +import com.yj.common.util.TimeUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.*; + +/** + * 系统角色服务实现类 + */ +@Service +public class SystemRoleServiceImpl implements ISystemRoleService { + + @Resource + AdminMapper adminMapper; + + @Resource + SystemRoleMapper systemRoleMapper; + + @Resource + ISystemRoleMenuService iSystemRoleMenuService; + @Resource + IAdminRoleService iAdminRoleService; + + /** + * 角色所有 + * + * @author fzr + * @return List + */ + @Override + public List all() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("id,name,sort,create_time,update_time"); + queryWrapper.orderByDesc(Arrays.asList("sort", "id")); + queryWrapper.isNull("delete_time"); + List systemAuthRoles = systemRoleMapper.selectList(queryWrapper); + + List list = new ArrayList<>(); + for (SystemRole systemAuthRole : systemAuthRoles) { + SystemAuthRoleVo vo = new SystemAuthRoleVo(); + + vo.setId(systemAuthRole.getId()); + vo.setName(systemAuthRole.getName()); + vo.setSort(systemAuthRole.getSort()); + vo.setCreateTime(TimeUtils.timestampToDate(systemAuthRole.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(systemAuthRole.getUpdateTime())); + vo.setNum(0); + vo.setDesc(""); + vo.setMenusId(Collections.EMPTY_LIST); + list.add(vo); + } + + return list; + } + + /** + * 角色列表 + * + * @author fzr + * @param pageValidate 参数 + * @return PageResult + */ + @Override + public PageResult list(@Validated PageValidate pageValidate) { + Integer page = pageValidate.getPage_no(); + Integer limit = pageValidate.getPage_size(); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc(Arrays.asList("sort", "id")); + queryWrapper.isNull("delete_time"); + + IPage iPage = systemRoleMapper.selectPage(new Page<>(page, limit), queryWrapper); + + List list = new ArrayList<>(); + for (SystemRole systemAuthRole : iPage.getRecords()) { + SystemAuthRoleVo vo = new SystemAuthRoleVo(); + BeanUtils.copyProperties(systemAuthRole, vo); + vo.setMenusId(new ArrayList<>()); + vo.setNum(adminMapper.getCountByRoleId(systemAuthRole.getId())); + vo.setCreateTime(TimeUtils.timestampToDate(systemAuthRole.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(systemAuthRole.getUpdateTime())); + list.add(vo); + } + + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list); + } + + /** + * 角色详情 + * + * @author fzr + * @param id 主键参数 + * @return SysRole + */ + @Override + public SystemAuthRoleVo detail(Integer id) { + SystemRole systemAuthRole = systemRoleMapper.selectOne(new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(systemAuthRole, "角色已不存在!"); + + List roleIds = new LinkedList<>(); + roleIds.add(systemAuthRole.getId()); + + SystemAuthRoleVo vo = new SystemAuthRoleVo(); + BeanUtils.copyProperties(systemAuthRole, vo); + vo.setNum(0); + vo.setMenusId(iSystemRoleMenuService.selectMenuIdsByRoleId(roleIds)); + vo.setCreateTime(TimeUtils.timestampToDate(systemAuthRole.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(systemAuthRole.getUpdateTime())); + + return vo; + } + + /** + * 新增角色 + * + * @author fzr + * @param createValidate 参数 + */ + @Override + @Transactional + public void add(SystemRoleCreateValidate createValidate) { + Assert.isNull(systemRoleMapper.selectOne(new QueryWrapper() + .select("id,name") + .eq("name", createValidate.getName().trim()).isNull("delete_time") + .last("limit 1")), "角色名称已存在!"); + + SystemRole model = new SystemRole(); + model.setName(createValidate.getName().trim()); + model.setDesc(createValidate.getDesc()); + model.setSort(createValidate.getSort()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setUpdateTime(System.currentTimeMillis() / 1000); + systemRoleMapper.insert(model); +// iSystemAuthPermService.batchSaveByMenuIds(model.getId(), createValidate.getMenuIds()); + } + + /** + * 编辑角色 + * + * @author fzr + * @param updateValidate 参数 + */ + @Override + @Transactional + public void edit(SystemRoleUpdateValidate updateValidate) { + Assert.notNull(systemRoleMapper.selectOne(new QueryWrapper() + .select("id,name") + .eq("id", updateValidate.getId()).isNull("delete_time") + .last("limit 1")), "角色已不存在!"); + + Assert.isNull(systemRoleMapper.selectOne(new QueryWrapper() + .select("id,name") + .ne("id", updateValidate.getId()) + .eq("name", updateValidate.getName().trim()).isNull("delete_time") + .last("limit 1")), "角色名称已存在!"); + + SystemRole model = new SystemRole(); + model.setId(updateValidate.getId()); + model.setName(updateValidate.getName().trim()); + model.setDesc(updateValidate.getDesc()); + model.setSort(updateValidate.getSort()); + model.setUpdateTime(System.currentTimeMillis() / 1000); + systemRoleMapper.updateById(model); + + iSystemRoleMenuService.batchDeleteByRoleId(updateValidate.getId()); + iSystemRoleMenuService.batchSaveByMenuIds(updateValidate.getId(), updateValidate.getMenuId()); + } + + /** + * 删除角色 + * + * @author fzr + * @param id 主键参数 + */ + @Override + @Transactional + public void del(Integer id) { + Assert.notNull( + systemRoleMapper.selectOne(new QueryWrapper() + .select("id", "name") + .eq("id", id) + .last("limit 1")), + "角色已不存在!"); + + + List adminRoles = iAdminRoleService.getAdminIdByRoleId(id); + Assert.isTrue( adminRoles != null && adminRoles.isEmpty(), + "角色已被管理员使用,请先移除"); + + systemRoleMapper.deleteById(id); + iSystemRoleMenuService.batchDeleteByRoleId(id); + } + + @Override + public List getRoleNameByAdminId(Integer adminId) { + List ret = new ArrayList<>(); + Admin admin = adminMapper.selectOne(new QueryWrapper().eq("id", adminId).isNull("delete_time")); + if (StringUtils.isNull(admin)) { + return ret; + } else { + if (admin.getRoot().equals(1)) { + ret.add("系统管理员"); + } else { + List roleIds = iAdminRoleService.getRoleIdAttr(adminId); + if (roleIds.size() > 0) { + ret = getNamesByIds(roleIds); + } else { + return ret; + } + } + } + return ret; + } + + /** + * 根据ids 返回 + * @param ids + * @return + */ + private List getNamesByIds(List ids) { + List ret = new ArrayList(); + List adminRoleList = systemRoleMapper.selectList(new QueryWrapper().in("id", ids).isNull("delete_time")); + if (adminRoleList.size() > 0) { + for (SystemRole item : adminRoleList) { + ret.add(item.getName()); + } + } + return ret; + } +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/system/IDeptService.java b/yj-admin/src/main/java/com/yj/admin/service/system/IDeptService.java new file mode 100644 index 0000000..6839527 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/system/IDeptService.java @@ -0,0 +1,64 @@ +package com.yj.admin.service.system; + +import com.alibaba.fastjson2.JSONArray; +import com.yj.admin.validate.system.DeptCreateValidate; +import com.yj.admin.validate.system.DeptSearchValidate; +import com.yj.admin.validate.system.DeptUpdateValidate; +import com.yj.admin.vo.system.DeptVo; + +/** + * 系统部门服务接口类 + */ +public interface IDeptService { + + /** + * 部门列表 + * + * @author fzr + * @param searchValidate 搜索参数 + * @return JSONArray + */ + JSONArray list(DeptSearchValidate searchValidate); + + /** + * 部门所有 + * + * @author fzr + * @return JSONArray + */ + JSONArray all(); + + /** + * 部门详情 + * + * @author fzr + * @param id 主键 + * @return SysMenu + */ + DeptVo detail(Integer id); + + /** + * 部门新增 + * + * @author fzr + * @param createValidate 参数 + */ + void add(DeptCreateValidate createValidate); + + /** + * 部门编辑 + * + * @author fzr + * @param updateValidate 参数 + */ + void edit(DeptUpdateValidate updateValidate); + + /** + * 部门删除 + * + * @author fzr + * @param id 主键 + */ + void del(Integer id); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/system/IJobsService.java b/yj-admin/src/main/java/com/yj/admin/service/system/IJobsService.java new file mode 100644 index 0000000..51293d8 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/system/IJobsService.java @@ -0,0 +1,79 @@ +package com.yj.admin.service.system; + +import com.alibaba.fastjson2.JSONObject; +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.system.JobsCreateValidate; +import com.yj.admin.validate.system.JobsSearchValidate; +import com.yj.admin.validate.system.JobsUpdateValidate; +import com.yj.admin.vo.system.JobsVo; +import com.yj.common.core.PageResult; + +import java.util.List; + +/** + * 系统岗位服务接口类 + */ +public interface IJobsService { + + /** + * 岗位所有 + * + * @author fzr + * @return List + */ + List all(); + + /** + * 岗位列表 + * + * @author fzr + * @param pageValidate 分页参数 + * @param searchValidate 搜索参数 + * @return PageResult + */ + PageResult list(PageValidate pageValidate, JobsSearchValidate searchValidate); + + /** + * 岗位详情 + * + * @author fzr + * @param id 主键 + * @return SystemPostVo + */ + JobsVo detail(Integer id); + + /** + * 岗位新增 + * + * @author fzr + * @param createValidate 参数 + */ + void add(JobsCreateValidate createValidate); + + /** + * 岗位编辑 + * + * @author fzr + * @param updateValidate 参数 + */ + void edit(JobsUpdateValidate updateValidate); + + /** + * 岗位删除 + * + * @author fzr + * @param id 主键 + */ + void del(Integer id); + + /** + * 返回导出格式 + * @return + */ + JSONObject getExportData(PageValidate pageValidate, JobsSearchValidate searchValidate); + + /** + * 导出 + */ + String export(JobsSearchValidate searchValidate); +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/system/ISystemCacheService.java b/yj-admin/src/main/java/com/yj/admin/service/system/ISystemCacheService.java new file mode 100644 index 0000000..4c495a9 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/system/ISystemCacheService.java @@ -0,0 +1,14 @@ +package com.yj.admin.service.system; + +/** + * 系统缓存接口类 + */ +public interface ISystemCacheService { + + /** + * 清除系统缓存 + * + */ + void clear(); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/system/ISystemLoginService.java b/yj-admin/src/main/java/com/yj/admin/service/system/ISystemLoginService.java new file mode 100644 index 0000000..97167ed --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/system/ISystemLoginService.java @@ -0,0 +1,37 @@ +package com.yj.admin.service.system; + +import com.yj.admin.validate.system.SystemAdminLoginsValidate; +import com.yj.admin.vo.system.SystemCaptchaVo; +import com.yj.admin.vo.system.SystemLoginVo; + +/** + * 系统登录服务接口类 + */ +public interface ISystemLoginService { + + /** + * 验证码 + * + * @author fzr + * @return SystemCaptchaVo + */ + SystemCaptchaVo captcha(); + + /** + * 登录 + * + * @author fzr + * @param loginsValidate 登录参数 + * @return SystemLoginVo + */ + SystemLoginVo login(SystemAdminLoginsValidate loginsValidate); + + /** + * 退出 + * + * @author fzr + * @param token 令牌 + */ + void logout(String token); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/system/ISystemLogsServer.java b/yj-admin/src/main/java/com/yj/admin/service/system/ISystemLogsServer.java new file mode 100644 index 0000000..99a25a2 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/system/ISystemLogsServer.java @@ -0,0 +1,34 @@ +package com.yj.admin.service.system; + +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.system.SystemSearchLoginsValidate; +import com.yj.admin.validate.system.SystemSearchOperateValidate; +import com.yj.admin.vo.system.SystemLogLoginVo; +import com.yj.admin.vo.system.SystemLogOperateVo; +import com.yj.common.core.PageResult; + +/** + * 系统日志服务类接口类 + */ +public interface ISystemLogsServer { + + /** + * 系统操作日志 + * + * @author fzr + * @param pageValidate 分页参数 + * @param searchValidate 搜索参数 + * @return PageResult + */ + PageResult operate(PageValidate pageValidate, SystemSearchOperateValidate searchValidate); + + /** + * 系统登录日志 + * + * @param pageValidate 分页参数 + * @param searchValidate 搜索参数 + * @return PageResult + */ + PageResult login(PageValidate pageValidate, SystemSearchLoginsValidate searchValidate); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/system/ISystemMenuService.java b/yj-admin/src/main/java/com/yj/admin/service/system/ISystemMenuService.java new file mode 100644 index 0000000..88ee392 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/system/ISystemMenuService.java @@ -0,0 +1,81 @@ +package com.yj.admin.service.system; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.yj.admin.validate.system.SystemMenuCreateValidate; +import com.yj.admin.validate.system.SystemMenuUpdateValidate; +import com.yj.admin.vo.system.SystemAuthMenuVo; + +import java.util.List; + +/** + * 系统菜单服务接口类 + */ +public interface ISystemMenuService { + + /** + * 根据角色获取菜单 + * + * @author fzr + * @return JSONArray + */ + JSONArray selectMenuByRoleId(List roleId); + + /** + * 菜单列表 + * + * @author fzr + * @return JSONArray + */ + JSONObject list(); + + /** + * 菜单列表 + * + * @author fzr + * @return JSONArray + */ + JSONArray systemMenuLists(); + + /** + * 菜单列表 + * + * @author fzr + * @return JSONArray + */ + JSONArray all(); + + /** + * 菜单详情 + * + * @author fzr + * @param id 主键 + * @return SysMenu + */ + SystemAuthMenuVo detail(Integer id); + + /** + * 菜单新增 + * + * @author fzr + * @param createValidate 参数 + */ + void add(SystemMenuCreateValidate createValidate); + + /** + * 菜单编辑 + * + * @author fzr + * @param updateValidate 参数 + */ + void edit(SystemMenuUpdateValidate updateValidate); + + /** + * 菜单删除 + * + * @author fzr + * @param id 主键 + */ + void del(Integer id); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/system/ISystemRoleMenuService.java b/yj-admin/src/main/java/com/yj/admin/service/system/ISystemRoleMenuService.java new file mode 100644 index 0000000..99e5391 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/system/ISystemRoleMenuService.java @@ -0,0 +1,44 @@ +package com.yj.admin.service.system; + + +import java.util.List; + +/** + * 角色菜单关系接口类 + */ +public interface ISystemRoleMenuService { + + + /** + * 根据角色ID获取菜单ID + * + * @param roleIds 角色ID + * @return List + */ + List selectMenuIdsByRoleId(List roleIds); + + /** + * 批量写入角色菜单 + * + * @author fzr + * @param roleId 角色ID + * @param menuIds 菜单ID组 + */ + void batchSaveByMenuIds(Integer roleId, List menuIds); + + /** + * 根据角色ID批量删除角色菜单 + * + * @author fzr + * @param roleId 角色ID + */ + void batchDeleteByRoleId(Integer roleId); + + /** + * 根据菜单ID批量删除角色菜单 + * + * @author fzr + * @param menuId 菜单ID + */ + void batchDeleteByMenuId(Integer menuId); +} diff --git a/yj-admin/src/main/java/com/yj/admin/service/system/ISystemRoleService.java b/yj-admin/src/main/java/com/yj/admin/service/system/ISystemRoleService.java new file mode 100644 index 0000000..6c0da4a --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/service/system/ISystemRoleService.java @@ -0,0 +1,73 @@ +package com.yj.admin.service.system; + +import com.yj.admin.validate.commons.PageValidate; +import com.yj.admin.validate.system.SystemRoleCreateValidate; +import com.yj.admin.validate.system.SystemRoleUpdateValidate; +import com.yj.admin.vo.system.SystemAuthRoleVo; +import com.yj.common.core.PageResult; +import org.springframework.validation.annotation.Validated; + +import java.util.List; + +/** + * 系统角色服务接口类 + */ +public interface ISystemRoleService { + + /** + * 角色所有 + * + * @author fzr + * @return List + */ + List all(); + + /** + * 角色列表 + * + * @author fzr + * @param pageValidate 参数 + * @return PageResult + */ + PageResult list(@Validated PageValidate pageValidate); + + /** + * 角色详情 + * + * @author fzr + * @param id 主键参数 + * @return SysRole + */ + SystemAuthRoleVo detail(Integer id); + + /** + * 角色新增 + * + * @author fzr + * @param createValidate 参数 + */ + void add(SystemRoleCreateValidate createValidate); + + /** + * 角色更新 + * + * @author fzr + * @param updateValidate 参数 + */ + void edit(SystemRoleUpdateValidate updateValidate); + + /** + * 角色删除 + * + * @author fzr + * @param id 主键参数 + */ + void del(Integer id); + + /** + * 根据adminID 返回角色名称 + * @param adminId + */ + List getRoleNameByAdminId(Integer adminId); + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/article/ArtCateCreateValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/article/ArtCateCreateValidate.java new file mode 100644 index 0000000..0978355 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/article/ArtCateCreateValidate.java @@ -0,0 +1,35 @@ +package com.yj.admin.validate.article; + +import com.yj.common.validator.annotation.IntegerContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("文章分类创建参数") +public class ArtCateCreateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotEmpty(message = "分类名称不能为空") + @Length(min = 1, max = 60, message = "分类名称不能大于60个字符") + @ApiModelProperty(value = "分类名称", required = true) + private String name; + + @NotNull(message = "排序号不能为空") + @DecimalMin(value = "0", message = "排序号值不能少于0") + @ApiModelProperty(value = "排序", required = true) + private Integer sort; + + @NotNull(message = "缺少isShow参数") + @IntegerContains(values = {0, 1}, message = "isShow不是合法值") + @ApiModelProperty(value = "是否显示", required = true) + private Integer isShow; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/article/ArtCateSearchValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/article/ArtCateSearchValidate.java new file mode 100644 index 0000000..4f62385 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/article/ArtCateSearchValidate.java @@ -0,0 +1,21 @@ +package com.yj.admin.validate.article; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("文章分类搜索参数") +public class ArtCateSearchValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "分类名称") + private String name; + + @ApiModelProperty(value = "是否显示") + private Integer isShow; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/article/ArtCateUpdateValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/article/ArtCateUpdateValidate.java new file mode 100644 index 0000000..bb99cfb --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/article/ArtCateUpdateValidate.java @@ -0,0 +1,40 @@ +package com.yj.admin.validate.article; + +import com.yj.common.validator.annotation.IDMust; +import com.yj.common.validator.annotation.IntegerContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("文章分类更新参数") +public class ArtCateUpdateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @IDMust(message = "id参数必传且需大于0") + @ApiModelProperty(value = "id", required = true) + private Integer id; + + @NotEmpty(message = "分类名称不能为空") + @Length(min = 1, max = 60, message = "分类名称不能大于60个字符") + @ApiModelProperty(value = "分类名称", required = true) + private String name; + + @NotNull(message = "排序号不能为空") + @DecimalMin(value = "0", message = "排序号值不能少于0") + @ApiModelProperty(value = "排序", required = true) + private Integer sort; + + @NotNull(message = "缺少isShow参数") + @IntegerContains(values = {0, 1}, message = "isShow不是合法值") + @ApiModelProperty(value = "是否显示", required = true) + private Integer isShow; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/article/ArticleCreateValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/article/ArticleCreateValidate.java new file mode 100644 index 0000000..abac230 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/article/ArticleCreateValidate.java @@ -0,0 +1,64 @@ +package com.yj.admin.validate.article; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.yj.common.validator.annotation.IDMust; +import com.yj.common.validator.annotation.IntegerContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("文章创建参数") +public class ArticleCreateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @IDMust(message = "cid参数必传且需大于0") + @ApiModelProperty(value = "分类ID", required = true) + private Integer cid; + + @NotEmpty(message = "文章标题不能为空") + @Length(min = 1, max = 200, message = "文章标题不能大于200个字符") + @ApiModelProperty(value = "文章标题", required = true) + private String title; + + @Length(max = 200, message = "简介不能超出200个字符") + @ApiModelProperty(value = "文章简介") + @JsonProperty("abstract") + private String abstractFied = ""; + + @Length(max = 200, message = "图片链接过长不能超200个字符") + @ApiModelProperty(value = "封面图片") + private String image = ""; + + @Length(max = 32, message = "作者名称不能超32个字符") + @ApiModelProperty(value = "作者姓名") + private String author = ""; + + @NotNull(message = "排序号不能为空") + @DecimalMin(value = "0", message = "排序号值不能少于0") + @ApiModelProperty(value = "排序", required = true) + private Integer sort; + + @NotNull(message = "缺少isShow参数") + @IntegerContains(values = {0, 1}, message = "isShow不是合法值") + @ApiModelProperty(value = "是否显示", required = true) + private Integer isShow; + + @ApiModelProperty(value = "文章内容") + private String content = ""; + + @ApiModelProperty(value = "文章描述") + private String desc = ""; + + @DecimalMin(value = "0", message = "初始浏览量不能少于0") + @ApiModelProperty(value = "初始浏览量") + private Integer click_virtual = 0; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/article/ArticleSearchValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/article/ArticleSearchValidate.java new file mode 100644 index 0000000..8bdbfce --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/article/ArticleSearchValidate.java @@ -0,0 +1,30 @@ +package com.yj.admin.validate.article; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("文章搜索参数") +public class ArticleSearchValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "文章标题") + private String title; + + @ApiModelProperty(value = "文章分类") + private Integer cid; + + @ApiModelProperty(value = "是否显示") + private Integer is_show; + + @ApiModelProperty(value = "开始时间") + private String startTime; + + @ApiModelProperty(value = "结束时间") + private String endTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/article/ArticleUpdateValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/article/ArticleUpdateValidate.java new file mode 100644 index 0000000..e0c6949 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/article/ArticleUpdateValidate.java @@ -0,0 +1,68 @@ +package com.yj.admin.validate.article; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.yj.common.validator.annotation.IDMust; +import com.yj.common.validator.annotation.IntegerContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("文章更新参数") +public class ArticleUpdateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @IDMust(message = "id参数必传且需大于0") + @ApiModelProperty(value = "id", required = true) + private Integer id; + + @IDMust(message = "cid参数必传且需大于0") + @ApiModelProperty(value = "分类ID", required = true) + private Integer cid; + + @NotEmpty(message = "文章标题不能为空") + @Length(min = 1, max = 200, message = "文章标题不能大于200个字符") + @ApiModelProperty(value = "文章标题", required = true) + private String title; + + @Length(max = 200, message = "简介不能超出200个字符") + @ApiModelProperty(value = "文章简介") + @JsonProperty("abstract") + private String abstractFied = ""; + + @Length(max = 200, message = "图片链接过长不能超200个字符") + @ApiModelProperty(value = "封面图片") + private String image = ""; + + @Length(max = 32, message = "作者名称不能超32个字符") + @ApiModelProperty(value = "作者姓名") + private String author = ""; + + @NotNull(message = "排序号不能为空") + @DecimalMin(value = "0", message = "排序号值不能少于0") + @ApiModelProperty(value = "排序", required = true) + private Integer sort; + + @NotNull(message = "缺少isShow参数") + @IntegerContains(values = {0, 1}, message = "isShow不是合法值") + @ApiModelProperty(value = "是否显示", required = true) + private Integer isShow; + + @ApiModelProperty(value = "文章内容") + private String content = ""; + + @ApiModelProperty(value = "文章描述") + private String desc = ""; + + @DecimalMin(value = "0", message = "初始浏览量不能少于0") + @ApiModelProperty(value = "初始浏览量") + private Integer click_virtual = 0; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/channel/ChannelH5Validate.java b/yj-admin/src/main/java/com/yj/admin/validate/channel/ChannelH5Validate.java new file mode 100644 index 0000000..fdbd16e --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/channel/ChannelH5Validate.java @@ -0,0 +1,37 @@ +package com.yj.admin.validate.channel; + +import com.yj.common.validator.annotation.IntegerContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("H5渠道参数") +public class ChannelH5Validate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "渠道开关参数缺失") + @IntegerContains(values = {0, 1}, message = "渠道开关不是合法值") + @ApiModelProperty(value = "渠道开关", required = true) + private Integer status; + + @NotNull(message = "pageStatus参数缺失") + @IntegerContains(values = {0, 1}, message = "页面状态不是合法值") + @ApiModelProperty(value = "状态", required = true) + private Integer pageStatus; + + + @Length(max = 500, message = "url不能超500个字符") + @ApiModelProperty(value = "关闭链接") + private String url; + + @Length(max = 500, message = "pageUrl不能超500个字符") + @ApiModelProperty(value = "自定义链接") + private String pageUrl; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/channel/ChannelMpValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/channel/ChannelMpValidate.java new file mode 100644 index 0000000..8ba0b5e --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/channel/ChannelMpValidate.java @@ -0,0 +1,36 @@ +package com.yj.admin.validate.channel; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import java.io.Serializable; + +@Data +@ApiModel("小程序渠道参数") +public class ChannelMpValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @Length(max = 100, message = "小程序名称不能超100个字符") + @ApiModelProperty(value = "小程序名称") + private String name = ""; + + @Length(max = 100, message = "原始ID不能超100个字符") + @ApiModelProperty(value = "原始ID") + private String originalId = ""; + + @Length(max = 100, message = "appId不能超100个字符") + @ApiModelProperty(value = "appId") + private String appId = ""; + + @Length(max = 200, message = "appSecret不能超100个字符") + @ApiModelProperty(value = "appSecret") + private String appSecret = ""; + + @Length(max = 300, message = "小程序码不能超300个字符") + @ApiModelProperty(value = "二维码") + private String qrCode = ""; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/channel/ChannelOaValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/channel/ChannelOaValidate.java new file mode 100644 index 0000000..d32f168 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/channel/ChannelOaValidate.java @@ -0,0 +1,53 @@ +package com.yj.admin.validate.channel; + +import com.yj.common.validator.annotation.IntegerContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import java.io.Serializable; + +@Data +@ApiModel("公众号渠道参数") +public class ChannelOaValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @Length(max = 100, message = "小程序名称不能超100个字符") + @ApiModelProperty(value = "公众号名称") + private String name = ""; + + @Length(max = 100, message = "原始ID不能超100个字符") + @ApiModelProperty(value = "原始ID") + private String originalId = ""; + + @Length(max = 100, message = "appId不能超100个字符") + @ApiModelProperty(value = "appId") + private String appId = ""; + + @Length(max = 200, message = "appSecret不能超100个字符") + @ApiModelProperty(value = "appSecret") + private String appSecret = ""; + + @Length(max = 300, message = "小程序码不能超300个字符") + @ApiModelProperty(value = "二维码") + private String qrCode = ""; + + @Length(max = 300, message = "URL不能超300个字符") + @ApiModelProperty(value = "URL") + private String url = ""; + + @Length(max = 200, message = "Token不能超200个字符") + @ApiModelProperty(value = "Token") + private String token = ""; + + @Length(max = 43, message = "EncodingAESKey不能超43个字符") + @ApiModelProperty(value = "EncodingAESKey") + private String encodingAesKey = ""; + + @IntegerContains(values = {1, 2, 3}, message = "encryptionType不是合法值") + @ApiModelProperty(value = "消息加密方式") + private Integer encryptionType = 1; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/channel/ChannelOpValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/channel/ChannelOpValidate.java new file mode 100644 index 0000000..02c5ffb --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/channel/ChannelOpValidate.java @@ -0,0 +1,21 @@ +package com.yj.admin.validate.channel; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("开发平台渠道参数") +public class ChannelOpValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "appId") + private String appId; + + @ApiModelProperty(value = "appSecret") + private String appSecret; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/channel/ChannelRpValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/channel/ChannelRpValidate.java new file mode 100644 index 0000000..80fb81d --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/channel/ChannelRpValidate.java @@ -0,0 +1,56 @@ +package com.yj.admin.validate.channel; + +import com.yj.common.validator.annotation.IntegerContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("公众号默认回复参数") +public class ChannelRpValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer id; + + @NotNull(message = "name参数缺失") + @NotEmpty(message = "规则名称不能为空") + @ApiModelProperty(value = "名称", required = true) + private String name; + + @NotNull(message = "content参数缺失") + @NotEmpty(message = "回复内容不能为空") + @ApiModelProperty(value = "回复内容", required = true) + private String content; + + @NotNull(message = "contentType参数缺失") + @IntegerContains(values = {1, 2}, message = "contentType值不符合规范") + @ApiModelProperty(value = "内容类型", required = true) + private Integer contentType; + + @NotNull(message = "replyType参数缺失") + @IntegerContains(values = {1, 2, 3}, message = "replyType值不符合规范") + @ApiModelProperty(value = "回复词类型", required = true) + private Integer replyType; + + @NotNull(message = "status参数缺失") + @IntegerContains(values = {0, 1}, message = "状态选择异常") + @ApiModelProperty(value = "状态", required = true) + private Integer status; + + @ApiModelProperty(value = "关键词", required = true) + private String keyword; + + @ApiModelProperty(value = "模式", required = true) + private Integer matchingType; + + + @NotNull(message = "sort参数缺失") + @ApiModelProperty(value = "排序", required = true) + private Integer sort; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/commons/IdArrayValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/commons/IdArrayValidate.java new file mode 100644 index 0000000..a4fb255 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/commons/IdArrayValidate.java @@ -0,0 +1,21 @@ +package com.yj.admin.validate.commons; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +@Data +@ApiModel("IDS参数") +public class IdArrayValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "ids参数缺失") + @ApiModelProperty(value = "ID数组", required = true) + private List id; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/commons/IdValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/commons/IdValidate.java new file mode 100644 index 0000000..eaae24e --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/commons/IdValidate.java @@ -0,0 +1,20 @@ +package com.yj.admin.validate.commons; + +import com.yj.common.validator.annotation.IDMust; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("ID参数") +public class IdValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @IDMust(message = "id参数必传且需大于0") + @ApiModelProperty(value = "ID", required = true) + private Integer id; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/commons/IdsValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/commons/IdsValidate.java new file mode 100644 index 0000000..f7a4f05 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/commons/IdsValidate.java @@ -0,0 +1,21 @@ +package com.yj.admin.validate.commons; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +@Data +@ApiModel("IDS参数") +public class IdsValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "ids参数缺失") + @ApiModelProperty(value = "ID数组", required = true) + private List ids; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/commons/PageValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/commons/PageValidate.java new file mode 100644 index 0000000..1a5bf63 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/commons/PageValidate.java @@ -0,0 +1,25 @@ +package com.yj.admin.validate.commons; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import javax.validation.constraints.DecimalMax; +import javax.validation.constraints.DecimalMin; +import java.io.Serializable; + +@Data +@ApiModel("分页参数") +public class PageValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + // 当前分页 + @DecimalMin(value = "1", message = "pageNo参数必须大于0的数字") + public Integer page_no = 1; + + // 每页条数 + @DecimalMin(value = "1", message = "pageSize参数必须是大于0的数字") + @DecimalMax(value = "60", message = "pageSize参数必须是小于60的数字") + private Integer page_size = 20; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/crontab/CrontabCreateValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/crontab/CrontabCreateValidate.java new file mode 100644 index 0000000..f274a38 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/crontab/CrontabCreateValidate.java @@ -0,0 +1,56 @@ +package com.yj.admin.validate.crontab; + +import com.yj.common.validator.annotation.IntegerContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("计划任务创建参数") +public class CrontabCreateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "name参数缺失") + @ApiModelProperty(value = "任务名称", required = true) + private String name; + + @NotNull(message = "types参数缺失") + @ApiModelProperty("类型 1-定时任务") + private Integer type; + + @NotNull(message = "command参数缺失") + @ApiModelProperty(value = "执行指令", required = true) + private String command; + + @NotNull(message = "rules参数缺失") + @ApiModelProperty(value = "执行规则", required = true) + private String expression; + + @Length(max = 200, message = "remark参数不能超出200个字符") + @ApiModelProperty(value = "备注") + private String remark; + + @NotNull(message = "status参数缺失") + @IntegerContains(values = {1, 2, 3}, message = "status参数取值异常") + @ApiModelProperty(value = "状态") + private Integer status; + + @ApiModelProperty(" 参数") + private String params; + +// @NotNull(message = "strategy参数缺失") +// @IntegerContains(values = {1, 2, 3}, message = "strategy参数取值异常") +// @ApiModelProperty(value = "strategy", required = true) +// private Integer strategy; +// +// @NotNull(message = "concurrent参数缺失") +// @IntegerContains(values = {0, 1}, message = "concurrent参数取值异常") +// @ApiModelProperty(value = "concurrent", required = true) +// private Integer concurrent; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/crontab/CrontabUpdateValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/crontab/CrontabUpdateValidate.java new file mode 100644 index 0000000..5b24849 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/crontab/CrontabUpdateValidate.java @@ -0,0 +1,52 @@ +package com.yj.admin.validate.crontab; + +import com.yj.common.validator.annotation.IDMust; +import com.yj.common.validator.annotation.IntegerContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("计划任务更新参数") +public class CrontabUpdateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @IDMust(message = "id参数必传且需大于0") + @ApiModelProperty(value = "id", required = true) + private Integer id; + + @NotNull(message = "name参数缺失") + @ApiModelProperty(value = "任务名称", required = true) + private String name; + + @NotNull(message = "types参数缺失") + @ApiModelProperty("类型 1-定时任务") + private Integer type; + + @NotNull(message = "command参数缺失") + @ApiModelProperty(value = "执行指令", required = true) + private String command; + + @NotNull(message = "rules参数缺失") + @ApiModelProperty(value = "执行规则", required = true) + private String expression; + + @Length(max = 200, message = "remark参数不能超出200个字符") + @ApiModelProperty(value = "备注") + private String remark; + + @NotNull(message = "status参数缺失") + @IntegerContains(values = {1, 2, 3}, message = "status参数取值异常") + @ApiModelProperty(value = "状态") + private Integer status; + + @ApiModelProperty(" 参数") + private String params; + + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/decorate/DecoratePageValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/decorate/DecoratePageValidate.java new file mode 100644 index 0000000..2617d0c --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/decorate/DecoratePageValidate.java @@ -0,0 +1,33 @@ +package com.yj.admin.validate.decorate; + +import com.yj.common.validator.annotation.IDMust; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("页面装修参数") +public class DecoratePageValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @IDMust(message = "id参数必传且需大于0") + @ApiModelProperty(value = "id", required = true) + private Integer id; + + private String name; + + private Integer type; + + @NotNull(message = "pageData参数缺失") + @ApiModelProperty(value = "装修数据", required = true) + private String data; + + @NotNull(message = "pageMeta") + @ApiModelProperty(value = "装修数据", required = true) + private String meta; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/decorate/DecorateTabsValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/decorate/DecorateTabsValidate.java new file mode 100644 index 0000000..052f40d --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/decorate/DecorateTabsValidate.java @@ -0,0 +1,27 @@ +package com.yj.admin.validate.decorate; + +import com.yj.admin.vo.decorate.DecorateTabsListsVo; +import com.yj.admin.vo.decorate.DecorateTabsStyleVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 底部导航装修参数 + */ +@Data +@ApiModel("底部装修参数") +public class DecorateTabsValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "样式") + private DecorateTabsStyleVo style; + + @ApiModelProperty(value = "列表") + private List list; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/file/FileCateValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/file/FileCateValidate.java new file mode 100644 index 0000000..078cecd --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/file/FileCateValidate.java @@ -0,0 +1,35 @@ +package com.yj.admin.validate.file; + +import com.yj.common.validator.annotation.IntegerContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("附件分类参数") +public class FileCateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "缺少pid参数") + @Min(value = 0, message = "pid参数必须为数字") + @ApiModelProperty(value = "上级ID", required = true) + private Integer pid; + + @NotNull(message = "缺少type参数") + @IntegerContains(values = {10, 20, 30}, message = "type不在合法值内") + @ApiModelProperty(value = "附件类型", required = true) + private Integer type; + + @NotEmpty(message = "名称不能为空") + @Length(min = 1, max = 30, message = "名称不能大于30个字符") + @ApiModelProperty(value = "附件名称", required = true) + private String name; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/file/FileMoveValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/file/FileMoveValidate.java new file mode 100644 index 0000000..413acb7 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/file/FileMoveValidate.java @@ -0,0 +1,25 @@ +package com.yj.admin.validate.file; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +@Data +@ApiModel("附件移动参数") +public class FileMoveValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "ids参数缺失") + @ApiModelProperty(value = "附件ID", required = true) + private List ids; + + @NotNull(message = "cid参数缺失") + @ApiModelProperty(value = "类目ID", required = true) + private Integer cid; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/file/FileRenameValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/file/FileRenameValidate.java new file mode 100644 index 0000000..31b99dd --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/file/FileRenameValidate.java @@ -0,0 +1,26 @@ +package com.yj.admin.validate.file; + +import com.yj.common.validator.annotation.IDMust; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import javax.validation.constraints.NotEmpty; +import java.io.Serializable; + +@Data +@ApiModel("附件重命名参数") +public class FileRenameValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @IDMust(message = "id参数必传且需大于0") + @ApiModelProperty(value = "附件ID", required = true) + private Integer id; + + @NotEmpty(message = "名称不能为空") + @Length(min = 1, max = 30, message = "名称不能大于30个字符") + @ApiModelProperty(value = "附件名称", required = true) + private String name; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/file/FileSearchValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/file/FileSearchValidate.java new file mode 100644 index 0000000..6d4f2bd --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/file/FileSearchValidate.java @@ -0,0 +1,27 @@ +package com.yj.admin.validate.file; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("附件搜索参数") +public class FileSearchValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "分类ID") + private Integer cid; + + @ApiModelProperty(value = "类型") + private Integer type; + + @ApiModelProperty(value = "来源") + private Integer source; + + @ApiModelProperty(value = "关键词") + private String name; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/finance/FinanceRechargeSearchValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/finance/FinanceRechargeSearchValidate.java new file mode 100644 index 0000000..de88f07 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/finance/FinanceRechargeSearchValidate.java @@ -0,0 +1,50 @@ +package com.yj.admin.validate.finance; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("充值订单搜索参数") +public class FinanceRechargeSearchValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "订单编号") + private String sn; + + @ApiModelProperty(value = "关键词") + private String user_info; + + @ApiModelProperty(value = "支付方式") + private Integer pay_way; + + @ApiModelProperty(value = "支付状态") + private Integer pay_status; + + @ApiModelProperty(value = "开始时间") + private String start_time; + + @ApiModelProperty(value = "结束时间") + private String end_time; + + @ApiModelProperty(value = "导出信息") + private Integer export; + @ApiModelProperty(value = "file_name") + private String file_name; + + @ApiModelProperty(value = "page_start") + private Integer page_start; + + @ApiModelProperty(value = "page_end") + private Integer page_end; + + @ApiModelProperty(value = "page_size") + private Integer page_size; + + @ApiModelProperty(value = "page_type") + private Integer page_type; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/finance/FinanceRefundSearchValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/finance/FinanceRefundSearchValidate.java new file mode 100644 index 0000000..94542a5 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/finance/FinanceRefundSearchValidate.java @@ -0,0 +1,35 @@ +package com.yj.admin.validate.finance; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("退款记录搜索参数") +public class FinanceRefundSearchValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("筛选类型: -1=全部, 0=退款中, 1=退款成功, 2=退款失败") + private Integer refund_type; + + @ApiModelProperty("用户信息") + private String user_info; + + @ApiModelProperty("退款单号") + private String sn; + + @ApiModelProperty("来源单号") + private String order_sn; + + private Integer refund_status; + + @ApiModelProperty("开始时间") + private String start_time; + + @ApiModelProperty("结束时间") + private String end_time; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/finance/FinanceRefundValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/finance/FinanceRefundValidate.java new file mode 100644 index 0000000..f8609e6 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/finance/FinanceRefundValidate.java @@ -0,0 +1,19 @@ +package com.yj.admin.validate.finance; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("退款记录搜索参数") +public class FinanceRefundValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("充值订单id") + private Integer recharge_id; + + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/finance/FinanceWalletSearchValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/finance/FinanceWalletSearchValidate.java new file mode 100644 index 0000000..ab2207f --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/finance/FinanceWalletSearchValidate.java @@ -0,0 +1,27 @@ +package com.yj.admin.validate.finance; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("余额记录搜索参数") +public class FinanceWalletSearchValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "关键词") + private String user_info; + + @ApiModelProperty(value = "类型") + private Integer change_type; + + @ApiModelProperty(value = "创建时间") + private String start_time; + + @ApiModelProperty(value = "结束时间") + private String end_time; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/marketing/MarketingRechargeValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/marketing/MarketingRechargeValidate.java new file mode 100644 index 0000000..7db0789 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/marketing/MarketingRechargeValidate.java @@ -0,0 +1,25 @@ +package com.yj.admin.validate.marketing; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel("订单搜索参数") +public class MarketingRechargeValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "status参数缺失") + @ApiModelProperty("是否开启充值: 0=否,1=是") + private Integer status; + + @NotNull(message = "minRechargeMoney参数缺失") + @ApiModelProperty("最低充值金额") + private BigDecimal minAmount; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/setting/DictDataCreateValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/setting/DictDataCreateValidate.java new file mode 100644 index 0000000..e8bb0d5 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/setting/DictDataCreateValidate.java @@ -0,0 +1,48 @@ +package com.yj.admin.validate.setting; + +import com.yj.common.validator.annotation.IDMust; +import com.yj.common.validator.annotation.IntegerContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("字典数据创建参数") +public class DictDataCreateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @IDMust(message = "typeId参数必传且需大于0") + @ApiModelProperty(value = "类型ID", required = true) + private Integer typeId; + + private String typeValue; + + @NotNull(message = "name参数缺失") + @ApiModelProperty(value = "键", required = true) + private String name; + + @NotNull(message = "value参数缺失") + @Length(max = 100, message = "键名不能超出100个字符") + @ApiModelProperty(value = "值", required = true) + private String value; + + @Length(max = 200, message = "数值不能超出200个字符") + @ApiModelProperty(value = "备注") + private String remark; + + @DecimalMin(value = "0", message = "排序号值不能少于0") + @ApiModelProperty(value = "排序") + private Integer sort; + + @NotNull(message = "status参数缺失") + @IntegerContains(values = {0, 1}, message = "status参数不在合法值内") + @ApiModelProperty(value = "状态", required = true) + private Integer status; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/setting/DictDataUpdateValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/setting/DictDataUpdateValidate.java new file mode 100644 index 0000000..1a411a5 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/setting/DictDataUpdateValidate.java @@ -0,0 +1,52 @@ +package com.yj.admin.validate.setting; + +import com.yj.common.validator.annotation.IDMust; +import com.yj.common.validator.annotation.IntegerContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("字典数据更新参数") +public class DictDataUpdateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @IDMust(message = "id参数必传且需大于0") + @ApiModelProperty(value = "ID", required = true) + private Integer id; + + @IDMust(message = "typeId参数必传且需大于0") + @ApiModelProperty(value = "类型ID", required = true) + private Integer typeId; + + @NotNull(message = "name参数缺失") + @ApiModelProperty(value = "键", required = true) + private String name; + + private String typeValue; + + @NotNull(message = "value参数缺失") + @Length(max = 100, message = "键名不能超出100个字符") + @ApiModelProperty(value = "值", required = true) + private String value; + + @Length(max = 200, message = "数值不能超出200个字符") + @ApiModelProperty(value = "备注") + private String remark; + + @DecimalMin(value = "0", message = "排序号值不能少于0") + @ApiModelProperty(value = "排序") + private Integer sort; + + @NotNull(message = "status参数缺失") + @IntegerContains(values = {0, 1}, message = "status参数不在合法值内") + @ApiModelProperty(value = "状态", required = true) + private Integer status; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/setting/DictTypeCreateValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/setting/DictTypeCreateValidate.java new file mode 100644 index 0000000..d04eef7 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/setting/DictTypeCreateValidate.java @@ -0,0 +1,37 @@ +package com.yj.admin.validate.setting; + +import com.yj.common.validator.annotation.IntegerContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("字典类型创建参数") +public class DictTypeCreateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "name参数缺失") + @Length(max = 200, message = "名称不能超出200个字符") + @ApiModelProperty(value = "名称", required = true) + private String name; + + @NotNull(message = "type参数缺失") + @Length(max = 200, message = "类型不能超出200个字符") + @ApiModelProperty(value = "类型", required = true) + private String type; + + @Length(max = 200, message = "备注不能超出200个字符") + @ApiModelProperty(value = "备注") + private String remark; + + @NotNull(message = "status参数缺失") + @IntegerContains(values = {0, 1}, message = "dictStatus参数不在合法值内") + @ApiModelProperty(value = "状态", required = true) + private Integer status; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/setting/DictTypeUpdateValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/setting/DictTypeUpdateValidate.java new file mode 100644 index 0000000..03bdb6c --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/setting/DictTypeUpdateValidate.java @@ -0,0 +1,42 @@ +package com.yj.admin.validate.setting; + +import com.yj.common.validator.annotation.IDMust; +import com.yj.common.validator.annotation.IntegerContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("字典类型更新参数") +public class DictTypeUpdateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @IDMust(message = "id参数必传且需大于0") + @ApiModelProperty(value = "ID", required = true) + private Integer id; + + @NotNull(message = "name参数缺失") + @Length(max = 200, message = "名称不能超出200个字符") + @ApiModelProperty(value = "名称", required = true) + private String name; + + @NotNull(message = "type参数缺失") + @Length(max = 200, message = "类型不能超出200个字符") + @ApiModelProperty(value = "类型", required = true) + private String type; + + @Length(max = 200, message = "备注不能超出200个字符") + @ApiModelProperty(value = "备注") + private String remark; + + @NotNull(message = "dictStatus参数缺失") + @IntegerContains(values = {0, 1}, message = "dictStatus参数不在合法值内") + @ApiModelProperty(value = "状态", required = true) + private Integer status; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingAgreementValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingAgreementValidate.java new file mode 100644 index 0000000..040756b --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingAgreementValidate.java @@ -0,0 +1,27 @@ +package com.yj.admin.validate.setting; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("政策协议设置参数") +public class SettingAgreementValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "服务协议标题") + private String serviceTitle; + + @ApiModelProperty(value = "服务协议内容") + private String serviceContent; + + @ApiModelProperty(value = "服务协议标题") + private String privacyTitle; + + @ApiModelProperty(value = "服务协议内容") + private String privacyContent; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingCopyrightValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingCopyrightValidate.java new file mode 100644 index 0000000..1c4a83e --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingCopyrightValidate.java @@ -0,0 +1,20 @@ +package com.yj.admin.validate.setting; + +import com.yj.admin.vo.setting.SettingCopyrightVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +@ApiModel("版权信息设置参数") +public class SettingCopyrightValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "版权列表") + private List config; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingLoginValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingLoginValidate.java new file mode 100644 index 0000000..5c62c13 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingLoginValidate.java @@ -0,0 +1,34 @@ +package com.yj.admin.validate.setting; + +import com.alibaba.fastjson2.JSONArray; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("登录信息设置参数") +public class SettingLoginValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "登录方式") + private JSONArray loginWay; + + @ApiModelProperty(value = "强制绑定手机") + private Integer coerceMobile = 0; + + @ApiModelProperty(value = "政策协议") + private Integer loginAgreement = 0; + + @ApiModelProperty(value = "第三方登录") + private Integer thirdAuth = 0; + + @ApiModelProperty(value = "微信登录") + private Integer wechatAuth; + + @ApiModelProperty(value = "qq登录") + private Integer qqAuth; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingPayConfigValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingPayConfigValidate.java new file mode 100644 index 0000000..b4d50a2 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingPayConfigValidate.java @@ -0,0 +1,38 @@ +package com.yj.admin.validate.setting; + +import com.alibaba.fastjson2.JSONObject; +import com.yj.common.validator.annotation.IDMust; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +@ApiModel("支付渠道设置参数") +public class SettingPayConfigValidate { + + @IDMust(message = "id参数必传且需大于0") + @ApiModelProperty(value = "ID", required = true) + private Integer id; + + @NotNull(message = "name参数缺失") + @ApiModelProperty(value = "模版名称", required = true) + private String name; + + @ApiModelProperty(value = "模版名称") + private String icon; + + @ApiModelProperty(value = "排序编号") + private Integer sort; + + @ApiModelProperty(value = "备注信息") + private String remark; + + @ApiModelProperty(value = "domain") + private String domian; + + @ApiModelProperty(value = "配置参数") + private JSONObject config; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingPayMethodValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingPayMethodValidate.java new file mode 100644 index 0000000..03a05ee --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingPayMethodValidate.java @@ -0,0 +1,15 @@ +package com.yj.admin.validate.setting; + +import com.yj.admin.vo.setting.SettingPaymentMethodVo; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import java.util.List; + +@Data +@ApiModel("支付方式设置参数") +public class SettingPayMethodValidate { + + List> data; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingSearchValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingSearchValidate.java new file mode 100644 index 0000000..0086c7a --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingSearchValidate.java @@ -0,0 +1,23 @@ +package com.yj.admin.validate.setting; + +import com.yj.admin.vo.setting.SettingSearchObjectVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +@ApiModel("热门搜索设置参数") +public class SettingSearchValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "是否开启热门搜索") + private Integer status; + + @ApiModelProperty(value = "关键词列表") + private List data; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingSiteStatisticsValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingSiteStatisticsValidate.java new file mode 100644 index 0000000..d1d76a1 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingSiteStatisticsValidate.java @@ -0,0 +1,18 @@ +package com.yj.admin.validate.setting; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("站点统计设置参数") +public class SettingSiteStatisticsValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "clarityCode") + private String clarityCode; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingUserValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingUserValidate.java new file mode 100644 index 0000000..0ad4c98 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingUserValidate.java @@ -0,0 +1,18 @@ +package com.yj.admin.validate.setting; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("用户设置参数") +public class SettingUserValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "默认头像") + private String defaultAvatar = ""; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingWebsiteValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingWebsiteValidate.java new file mode 100644 index 0000000..3541e52 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/setting/SettingWebsiteValidate.java @@ -0,0 +1,40 @@ +package com.yj.admin.validate.setting; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("基础设置参数") +public class SettingWebsiteValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "网站名称") + private String name = ""; + @ApiModelProperty(value = "网站logo") + private String webLogo = ""; + @ApiModelProperty(value = "网站图标") + private String webFavicon = ""; + @ApiModelProperty(value = "h5图标") + private String h5Favicon = ""; + @ApiModelProperty(value = "登录页广告图") + private String loginImage = ""; + @ApiModelProperty(value = "商城名称") + private String shopName = ""; + @ApiModelProperty(value = "商城LOGO") + private String shopLogo = ""; + @ApiModelProperty(value = "PC端LOGO") + private String pcLogo = ""; + @ApiModelProperty(value = "网站标题") + private String pcTitle = ""; + @ApiModelProperty(value = "网站图标") + private String pcIco = ""; + @ApiModelProperty(value = "网站描述") + private String pcDesc = ""; + @ApiModelProperty(value = "网站关键词") + private String pcKeywords = ""; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/system/DeptCreateValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/system/DeptCreateValidate.java new file mode 100644 index 0000000..7fd2d1e --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/system/DeptCreateValidate.java @@ -0,0 +1,50 @@ +package com.yj.admin.validate.system; + +import com.yj.common.validator.annotation.IntegerContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMax; +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import java.io.Serializable; + +@Data +@ApiModel("系统部门创建参数") +public class DeptCreateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "pid参数缺失") + @DecimalMin(value = "0", message = "上级值不能少于0") + @ApiModelProperty(value = "上级ID", required = true) + private Integer pid; + + @NotNull(message = "name参数缺失") + @Length(min = 1, max = 100, message = "部门名称必须在1~100个字符内") + @ApiModelProperty(value = "部门名称", required = true) + private String name; + + @Length(min = 1, max = 30, message = "负责人名称必须在1~30个字符内") + private String leader = ""; + + @Length(min = 11, max = 11, message = "手机号只能为11位") + @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手机号格式有误") + @ApiModelProperty(value = "手机号码") + private String mobile; + + @NotNull(message = "请选择状态") + @IntegerContains(values = {0, 1}) + @ApiModelProperty(value = "状态", required = true) + private Integer status; + + @NotNull(message = "排序号不能为空") + @DecimalMin(value = "0", message = "排序号值不能少于0") + @DecimalMax(value = "9999", message = "排序号值不能大于9999") + @ApiModelProperty(value = "排序") + private Integer sort; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/system/DeptSearchValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/system/DeptSearchValidate.java new file mode 100644 index 0000000..683684d --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/system/DeptSearchValidate.java @@ -0,0 +1,21 @@ +package com.yj.admin.validate.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("系统部门搜索参数") +public class DeptSearchValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "名称") + private String name; + + @ApiModelProperty(value = "是否停用") + private Integer status; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/system/DeptUpdateValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/system/DeptUpdateValidate.java new file mode 100644 index 0000000..ecb0f8e --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/system/DeptUpdateValidate.java @@ -0,0 +1,54 @@ +package com.yj.admin.validate.system; + +import com.yj.common.validator.annotation.IDMust; +import com.yj.common.validator.annotation.IntegerContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMax; +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import java.io.Serializable; + +@Data +@ApiModel("系统部门更新参数") +public class DeptUpdateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @IDMust(message = "id参数必传且需大于0") + @ApiModelProperty(value = "id", required = true) + private Integer id; + + @NotNull(message = "pid参数缺失") + @DecimalMin(value = "0", message = "上级值不能少于0") + @ApiModelProperty(value = "上级ID", required = true) + private Integer pid; + + @NotNull(message = "name参数缺失") + @Length(min = 1, max = 100, message = "部门名称必须在1~100个字符内") + @ApiModelProperty(value = "部门名称") + private String name; + + @Length(min = 1, max = 30, message = "负责人名称必须在1~30个字符内") + private String leader = ""; + + @Length(min = 11, max = 11, message = "手机号只能为11位") + @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手机号格式有误") + @ApiModelProperty(value = "手机号码") + private String mobile; + + @NotNull(message = "请选择状态") + @IntegerContains(values = {0, 1}) + @ApiModelProperty(value = "状态") + private Integer status; + + @DecimalMin(value = "0", message = "排序号值不能少于0") + @DecimalMax(value = "9999", message = "排序号值不能大于9999") + @ApiModelProperty(value = "排序") + private Integer sort; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/system/JobsCreateValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/system/JobsCreateValidate.java new file mode 100644 index 0000000..e6ecd7f --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/system/JobsCreateValidate.java @@ -0,0 +1,43 @@ +package com.yj.admin.validate.system; + +import com.yj.common.validator.annotation.IntegerContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("系统岗位创建参数") +public class JobsCreateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "code参数缺失") + @Length(min = 1, max = 30, message = "岗位编码必须在1~30个字符内") + @ApiModelProperty(value = "编码", required = true) + private String code; + + @NotNull(message = "name参数缺失") + @Length(min = 1, max = 30, message = "岗位名称必须在1~30个字符内") + @ApiModelProperty(value = "岗位名称", required = true) + private String name; + + @NotNull(message = "请选择状态") + @IntegerContains(values = {0, 1}) + @ApiModelProperty(value = "是否停用", required = true) + private Integer status = 0; + + @Length( max = 250, message = "岗位备注不能大于250个字符内") + @ApiModelProperty(value = "备注信息") + private String remark = ""; + + @NotNull(message = "排序号不能为空") + @DecimalMin(value = "0", message = "排序号值不能少于0") + @ApiModelProperty(value = "排序", required = true) + private Integer sort = 0; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/system/JobsSearchValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/system/JobsSearchValidate.java new file mode 100644 index 0000000..acaf969 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/system/JobsSearchValidate.java @@ -0,0 +1,41 @@ +package com.yj.admin.validate.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("系统岗位搜索参数") +public class JobsSearchValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "编码") + private String code; + + @ApiModelProperty(value = "岗位名称") + private String name; + + @ApiModelProperty(value = "是否停用") + private Integer status; + + @ApiModelProperty(value = "导出信息") + private Integer export; + @ApiModelProperty(value = "file_name") + private String file_name; + + @ApiModelProperty(value = "page_start") + private Integer page_start; + + @ApiModelProperty(value = "page_end") + private Integer page_end; + + @ApiModelProperty(value = "page_size") + private Integer page_size; + + @ApiModelProperty(value = "page_type") + private Integer page_type; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/system/JobsUpdateValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/system/JobsUpdateValidate.java new file mode 100644 index 0000000..2556d3e --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/system/JobsUpdateValidate.java @@ -0,0 +1,48 @@ +package com.yj.admin.validate.system; + +import com.yj.common.validator.annotation.IDMust; +import com.yj.common.validator.annotation.IntegerContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("系统岗位更新参数") +public class JobsUpdateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @IDMust(message = "id参数必传且需大于0") + @ApiModelProperty(value = "id", required = true) + private Integer id; + + @NotNull(message = "code参数缺失") + @Length(min = 1, max = 30, message = "岗位编码必须在1~30个字符内") + @ApiModelProperty(value = "岗位编码", required = true) + private String code; + + @NotNull(message = "name参数缺失") + @Length(min = 1, max = 30, message = "岗位名称必须在1~30个字符内") + @ApiModelProperty(value = "岗位名称", required = true) + private String name; + + @NotNull(message = "请选择状态") + @IntegerContains(values = {0, 1}) + @ApiModelProperty(value = "是否停用", required = true) + private Integer status; + + @Length( max = 250, message = "岗位备注不能大于250个字符内") + @ApiModelProperty(value = "岗位备注") + private String remark; + + @NotNull(message = "排序号不能为空") + @DecimalMin(value = "0", message = "排序号值不能少于0") + @ApiModelProperty(value = "排序", required = true) + private Integer sort; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/system/SystemAdminCreateValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemAdminCreateValidate.java new file mode 100644 index 0000000..b4afdce --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemAdminCreateValidate.java @@ -0,0 +1,65 @@ +package com.yj.admin.validate.system; + +import com.yj.common.validator.annotation.IntegerContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +@Data +@ApiModel("系统管理员创建参数") +public class SystemAdminCreateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotEmpty(message = "账号不能为空") + @Length(min = 2, max = 20, message = "账号必须在2~20个字符内") + @ApiModelProperty(value = "登录账号", required = true) + private String account; + + @NotEmpty(message = "昵称不能为空") + @Length(min = 2, max = 30, message = "昵称必须在2~30个字符内") + @ApiModelProperty(value = "用户昵称", required = true) + private String name; + + @NotEmpty(message = "密码不能为空") + @Length(min = 6, max = 32, message = "密码必须在6~32个字符内") + @ApiModelProperty(value = "登录密码", required = true) + private String password; + + @NotNull(message = "请选择是否禁用") + @IntegerContains(values = {0, 1}) + @ApiModelProperty(value = "是否禁用", required = true) + private Integer disable; + + @NotNull(message = "请选择是否支持多端登录") + @IntegerContains(values = {0, 1}) + @ApiModelProperty(value = "支持多端", required = true) + private Integer multipointLogin; + + @NotNull(message = "排序号不能为空") + @DecimalMin(value = "0", message = "排序号值不能少于0") + @ApiModelProperty(value = "排序", required = true) + private Integer sort = 0; + + @Length(max = 200, message = "头像不能超出200个字符") + @ApiModelProperty(value = "头像") + private String avatar = ""; + + @NotNull(message = "请选择角色") + @ApiModelProperty(value = "角色ID", required = true) + private List roleId; + + @ApiModelProperty(value = "部门ID") + private List deptId; + + @ApiModelProperty(value = "岗位ID") + private List jobsId; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/system/SystemAdminLoginsValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemAdminLoginsValidate.java new file mode 100644 index 0000000..0cc4c23 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemAdminLoginsValidate.java @@ -0,0 +1,33 @@ +package com.yj.admin.validate.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.checkerframework.checker.units.qual.A; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("系统登录参数") +public class SystemAdminLoginsValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotEmpty(message = "账号不能为空") + @Length(min = 2, max = 20, message = "账号或密码错误") + @ApiModelProperty(value = "登录账号", required = true) + private String account; + + @NotEmpty(message = "密码不能为空") + @Length(min = 6, max = 64, message = "账号或密码错误") + @ApiModelProperty(value = "登录密码", required = true) + private String password; + + @NotNull(message = "请选择设备类型") + @ApiModelProperty(value = "设备类型", required = true) + private Integer terminal; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/system/SystemAdminSearchValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemAdminSearchValidate.java new file mode 100644 index 0000000..e24b6b8 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemAdminSearchValidate.java @@ -0,0 +1,41 @@ +package com.yj.admin.validate.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("系统管理员搜索参数") +public class SystemAdminSearchValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "登录账号") + private String account; + + @ApiModelProperty(value = "用户昵称") + private String name; + + @ApiModelProperty(value = "角色ID") + private Integer role_id; + + @ApiModelProperty(value = "导出信息") + private Integer export; + @ApiModelProperty(value = "file_name") + private String file_name; + + @ApiModelProperty(value = "page_start") + private Integer page_start; + + @ApiModelProperty(value = "page_end") + private Integer page_end; + + @ApiModelProperty(value = "page_size") + private Integer page_size; + + @ApiModelProperty(value = "page_type") + private Integer page_type; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/system/SystemAdminUpInfoValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemAdminUpInfoValidate.java new file mode 100644 index 0000000..bc94cb7 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemAdminUpInfoValidate.java @@ -0,0 +1,31 @@ +package com.yj.admin.validate.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.hibernate.validator.constraints.Length; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import java.io.Serializable; + +@Data +@ApiModel("系统管理员自更新参数") +public class SystemAdminUpInfoValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotEmpty(message = "昵称不能为空") + @Length(min = 2, max = 30, message = "昵称必须在2~30个字符内") + @ApiModelProperty(value = "用户昵称") + private String nickname; + + @Length(max = 64, message = "密码必须在6~32个字符内") + private String password=""; + + @Length(max = 64, message = "当前密码错误") + private String currPassword=""; + + @Length(max = 200, message = "头像不能超出200个字符") + private String avatar = ""; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/system/SystemAdminUpdateValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemAdminUpdateValidate.java new file mode 100644 index 0000000..d22e1f3 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemAdminUpdateValidate.java @@ -0,0 +1,70 @@ +package com.yj.admin.validate.system; + +import com.yj.common.validator.annotation.IDMust; +import com.yj.common.validator.annotation.IntegerContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +@Data +@ApiModel("系统管理员更新参数") +public class SystemAdminUpdateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @IDMust(message = "id参数必传且需大于0") + @ApiModelProperty(value = "ID", required = true) + private Integer id; + + @NotEmpty(message = "账号不能为空") + @Length(min = 2, max = 20, message = "账号必须在2~20个字符内") + @ApiModelProperty(value = "登录账号", required = true) + private String account; + + @NotEmpty(message = "昵称不能为空") + @Length(min = 2, max = 30, message = "昵称必须在2~30个字符内") + @ApiModelProperty(value = "用户昵称", required = true) + private String name; + + @ApiModelProperty(value = "登录密码") + private String password; + + @NotNull(message = "请选择是否禁用") + @IntegerContains(values = {0, 1}) + @ApiModelProperty(value = "是否禁用", required = true) + private Integer disable; + + @NotNull(message = "请选择是否支持多端登录") + @IntegerContains(values = {0, 1}) + @ApiModelProperty(value = "支持多端", required = true) + private Integer multipointLogin; + + @NotNull(message = "排序号不能为空") + @DecimalMin(value = "0", message = "排序号值不能少于0") + @ApiModelProperty(value = "排序", required = true) + private Integer sort = 0; + + @Length(max = 200, message = "头像不能超出200个字符") + @ApiModelProperty(value = "头像") + private String avatar = ""; + +// @NotNull(message = "请选择角色") + @ApiModelProperty(value = "角色ID") + private List roleId; + + @ApiModelProperty(value = "部门ID") + private List deptId; + + @ApiModelProperty(value = "岗位ID") + private List jobsId; + + private Integer root; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/system/SystemEditSelfValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemEditSelfValidate.java new file mode 100644 index 0000000..f26a257 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemEditSelfValidate.java @@ -0,0 +1,40 @@ +package com.yj.admin.validate.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; +import java.io.Serializable; + +@Data +@ApiModel("系统管理员自更新参数") +public class SystemEditSelfValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotEmpty(message = "昵称不能为空") + @Length(min = 2, max = 30, message = "昵称必须在2~30个字符内") + @ApiModelProperty(value = "用户昵称") + private String account; + + @NotEmpty(message = "昵称不能为空") + @Length(min = 2, max = 30, message = "昵称必须在2~30个字符内") + @ApiModelProperty(value = "用户昵称") + private String name; + + @Length(max = 200, message = "头像不能超出200个字符") + private String avatar = ""; + + @Length(max = 64, message = "密码必须在6~32个字符内") + private String password=""; + + @Length(max = 64, message = "当前密码错误") + private String password_confirm=""; + + @Length(max = 64, message = "旧密码错误") + private String password_old; + + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/system/SystemMenuCreateValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemMenuCreateValidate.java new file mode 100644 index 0000000..4805738 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemMenuCreateValidate.java @@ -0,0 +1,79 @@ +package com.yj.admin.validate.system; + +import com.yj.common.validator.annotation.IntegerContains; +import com.yj.common.validator.annotation.StringContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("系统菜单创建参数") +public class SystemMenuCreateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "上级菜单不能为空") + @DecimalMin(value = "0", message = "上级菜单值不能少于0") + @ApiModelProperty(value = "上级ID", required = true) + private Integer pid; + + @NotNull(message = "menuType参数缺失") + @StringContains(values = {"M", "C", "A"}, message = "菜单类型不是合法值(M,C,A)") + @ApiModelProperty(value = "菜单类型", required = true) + private String type; + + @NotNull(message = "缺少参数menuName") + @Length(min = 1, max = 30, message = "菜单名称必须在1~30个字符内") + @ApiModelProperty(value = "菜单名称", required = true) + private String name; + + @Length(max = 100, message = "图标名称不能超过100个字符") + @ApiModelProperty(value = "菜单图标") + private String icon; + + @NotNull(message = "排序号不能为空") + @DecimalMin(value = "0", message = "排序号值不能少于0") + @ApiModelProperty(value = "菜单排序") + private Integer sort; + + @Length(max = 100, message = "权限字符不能超过100个字符") + @ApiModelProperty(value = "权限字符") + private String perms; + + @Length(max = 200, message = "路由地址不能超过200个字符") + @ApiModelProperty(value = "路由地址") + private String paths; + + @Length(max = 200, message = "前端组件不能超过200个字符") + @ApiModelProperty(value = "前端组件") + private String component; + + @Length(max = 200, message = "选中菜单路径不能超过200个字符") + @ApiModelProperty(value = "选中菜单") + private String selected; + + @Length(max = 200, message = "路由参数不能超过200个字符") + @ApiModelProperty(value = "路由参数") + private String params; + + @NotNull(message = "请选择缓存状态") + @IntegerContains(values = {0, 1}) + @ApiModelProperty(value = "缓存状态", required = true) + private Integer isCache; + + @NotNull(message = "请选择显示状态") + @IntegerContains(values = {0, 1}) + @ApiModelProperty(value = "显示状态", required = true) + private Integer isShow; + + @NotNull(message = "请选择菜单状态") + @IntegerContains(values = {0, 1}) + @ApiModelProperty(value = "菜单状态", required = true) + private Integer isDisable; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/system/SystemMenuUpdateValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemMenuUpdateValidate.java new file mode 100644 index 0000000..7dba266 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemMenuUpdateValidate.java @@ -0,0 +1,84 @@ +package com.yj.admin.validate.system; + +import com.yj.common.validator.annotation.IDMust; +import com.yj.common.validator.annotation.IntegerContains; +import com.yj.common.validator.annotation.StringContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("系统菜单更新参数") +public class SystemMenuUpdateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @IDMust(message = "id参数必传且需大于0") + @ApiModelProperty(value = "id", required = true) + private Integer id; + + @NotNull(message = "上级菜单不能为空") + @DecimalMin(value = "0", message = "上级菜单值不能少于0") + @ApiModelProperty(value = "上级ID", required = true) + private Integer pid; + + @NotNull(message = "menuType参数缺失") + @StringContains(values = {"M", "C", "A"}, message = "菜单类型不是合法值(M,C,A)") + @ApiModelProperty(value = "菜单类型", required = true) + private String type; + + @NotNull(message = "缺少参数menuName") + @Length(min = 1, max = 30, message = "菜单名称必须在1~30个字符内") + @ApiModelProperty(value = "菜单名称", required = true) + private String name; + + @Length(max = 100, message = "图标名称不能超过100个字符") + @ApiModelProperty(value = "菜单图标") + private String icon; + + @NotNull(message = "排序号不能为空") + @DecimalMin(value = "0", message = "排序号值不能少于0") + @ApiModelProperty(value = "菜单排序") + private Integer sort; + + @Length(max = 100, message = "权限字符不能超过100个字符") + @ApiModelProperty(value = "权限字符") + private String perms; + + @Length(max = 200, message = "路由地址不能超过200个字符") + @ApiModelProperty(value = "路由地址") + private String paths; + + @Length(max = 200, message = "前端组件不能超过200个字符") + @ApiModelProperty(value = "前端组件") + private String component; + + @Length(max = 200, message = "选中菜单路径不能超过200个字符") + @ApiModelProperty(value = "菜单路径") + private String selected; + + @Length(max = 200, message = "路由参数不能超过200个字符") + @ApiModelProperty(value = "路由参数") + private String params; + + @NotNull(message = "请选择缓存状态") + @IntegerContains(values = {0, 1}) + @ApiModelProperty(value = "缓存状态", required = true) + private Integer isCache; + + @NotNull(message = "请选择显示状态") + @IntegerContains(values = {0, 1}) + @ApiModelProperty(value = "显示状态", required = true) + private Integer isShow; + + @NotNull(message = "请选择菜单状态") + @IntegerContains(values = {0, 1}) + @ApiModelProperty(value = "菜单状态", required = true) + private Integer isDisable; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/system/SystemRoleCreateValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemRoleCreateValidate.java new file mode 100644 index 0000000..957478f --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemRoleCreateValidate.java @@ -0,0 +1,35 @@ +package com.yj.admin.validate.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +@Data +@ApiModel("系统角色创建参数") +public class SystemRoleCreateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "缺少参数name") + @Length(min = 1, max = 30, message = "角色名称必须在1~30个字符内") + @ApiModelProperty(value = "角色名称", required = true) + private String name; + + @Length(max = 200, message = "描述信息不能超过200个字符") + @ApiModelProperty(value = "描述", required = true) + private String desc; + + @DecimalMin(value = "0", message = "排序号值不能少于0") + @ApiModelProperty(value = "排序", required = true) + private Integer sort = 0; + + @ApiModelProperty(value = "菜单权限") + private List menuId; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/system/SystemRoleUpdateValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemRoleUpdateValidate.java new file mode 100644 index 0000000..036b339 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemRoleUpdateValidate.java @@ -0,0 +1,41 @@ +package com.yj.admin.validate.system; + +import com.yj.common.validator.annotation.IDMust; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +@Data +@ApiModel("系统角色更新参数") +public class SystemRoleUpdateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @IDMust(message = "id参数必传且需大于0") + @ApiModelProperty(value = "id", required = true) + private Integer id; + + @NotNull(message = "缺少参数name") + @Length(min = 1, max = 30, message = "角色名称必须在1~30个字符内") + @ApiModelProperty(value = "角色名称", required = true) + private String name; + + @Length(max = 200, message = "描述信息不能超过200个字符") + @ApiModelProperty(value = "描述", required = true) + private String desc; + + @DecimalMin(value = "0", message = "排序号值不能少于0") + @ApiModelProperty(value = "排序") + private Integer sort = 0; + + + @ApiModelProperty(value = "菜单权限") + private List menuId; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/system/SystemSearchLoginsValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemSearchLoginsValidate.java new file mode 100644 index 0000000..bd9b8b7 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemSearchLoginsValidate.java @@ -0,0 +1,27 @@ +package com.yj.admin.validate.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("系统登录日志搜索参数") +public class SystemSearchLoginsValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "账号") + private String username; + + @ApiModelProperty(value = "状态") + private Integer status; + + @ApiModelProperty(value = "开始时间") + private String startTime; + + @ApiModelProperty(value = "结束时间") + private String endTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/system/SystemSearchOperateValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemSearchOperateValidate.java new file mode 100644 index 0000000..a945d91 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/system/SystemSearchOperateValidate.java @@ -0,0 +1,37 @@ +package com.yj.admin.validate.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("系统操作日志搜索参数") +public class SystemSearchOperateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "标题") + private String action; + + @ApiModelProperty(value = "账号") + private String username; + + @ApiModelProperty(value = "IP") + private String ip; + + @ApiModelProperty(value = "类型") + private String type; + + + @ApiModelProperty(value = "路由") + private String url; + + @ApiModelProperty(value = "开始时间") + private String start_time; + + @ApiModelProperty(value = "结束时间") + private String end_time; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/user/UserSearchValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/user/UserSearchValidate.java new file mode 100644 index 0000000..1a3744d --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/user/UserSearchValidate.java @@ -0,0 +1,44 @@ +package com.yj.admin.validate.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("用户搜索参数") +public class UserSearchValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "渠道") + private Integer channel; + + @ApiModelProperty(value = "关键词") + private String keyword; + + @ApiModelProperty(value = "开始时间") + private String create_time_start; + + @ApiModelProperty(value = "结束时间") + private String create_time_end; + + @ApiModelProperty(value = "导出信息") + private Integer export; + @ApiModelProperty(value = "file_name") + private String file_name; + + @ApiModelProperty(value = "page_start") + private Integer page_start; + + @ApiModelProperty(value = "page_end") + private Integer page_end; + + @ApiModelProperty(value = "page_size") + private Integer page_size; + + @ApiModelProperty(value = "page_type") + private Integer page_type; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/user/UserUpdateValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/user/UserUpdateValidate.java new file mode 100644 index 0000000..05a618b --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/user/UserUpdateValidate.java @@ -0,0 +1,24 @@ +package com.yj.admin.validate.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("用户更新参数") +public class UserUpdateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "id") + private Integer id; + + @ApiModelProperty(value = "字段") + private String field; + + @ApiModelProperty(value = "值") + private String value; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/validate/user/UserWalletValidate.java b/yj-admin/src/main/java/com/yj/admin/validate/user/UserWalletValidate.java new file mode 100644 index 0000000..05c036f --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/validate/user/UserWalletValidate.java @@ -0,0 +1,29 @@ +package com.yj.admin.validate.user; + +import com.yj.common.validator.annotation.IntegerContains; +import lombok.Data; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class UserWalletValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "缺少用户id参数") + @Min(value = 0, message = "用户id必须为数字") + private Integer userId; + + @NotNull(message = "请输入变动类型") + @IntegerContains(values = {2,1}, message = "变动类型错误") + private Integer action; + + @NotNull(message = "请输入变动金额") + private BigDecimal num; + + private String remark; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/CrontabDetailVo.java b/yj-admin/src/main/java/com/yj/admin/vo/CrontabDetailVo.java new file mode 100644 index 0000000..25c3e78 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/CrontabDetailVo.java @@ -0,0 +1,42 @@ +package com.yj.admin.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("计划任务详情Vo") +public class CrontabDetailVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID") + private Integer id; + + @ApiModelProperty("任务名称") + private String name; + + @ApiModelProperty("类型 1-定时任务") + private Integer type; + + @ApiModelProperty("是否系统任务 0-否 1-是") + private Integer system; + + @ApiModelProperty("备注信息") + private String remark; + + @ApiModelProperty("执行命令") + private String command; + + @ApiModelProperty(" 执行状态: 1=正在运行, 2=任务停止, 3=发生错误") + private Integer status; + + @ApiModelProperty(" 参数") + private String params; + + @ApiModelProperty("执行规则") + private String expression; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/CrontabListedVo.java b/yj-admin/src/main/java/com/yj/admin/vo/CrontabListedVo.java new file mode 100644 index 0000000..6693d69 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/CrontabListedVo.java @@ -0,0 +1,67 @@ +package com.yj.admin.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("计划任务列表Vo") +public class CrontabListedVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("任务名称") + private String name; + + @ApiModelProperty("类型 1-定时任务") + private Integer type; + + private String typeDesc; + + @ApiModelProperty("是否系统任务 0-否 1-是") + private Integer system; + + @ApiModelProperty("备注信息") + private String remark; + + @ApiModelProperty("执行命令") + private String command; + + @ApiModelProperty(" 执行状态: 1=正在运行, 2=任务停止, 3=发生错误") + private Integer status; + + private String statusDesc; + + @ApiModelProperty(" 参数") + private String params; + + @ApiModelProperty("执行规则") + private String expression; + + @ApiModelProperty("错误信息") + private String error; + + @ApiModelProperty("结束时间") + private Long lastTime; + + @ApiModelProperty("最大执行时长") + private Long time; + + @ApiModelProperty("最大执行时长") + private Long maxTime; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + + @ApiModelProperty("删除时间") + private Long deleteTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/album/FileCateVo.java b/yj-admin/src/main/java/com/yj/admin/vo/album/FileCateVo.java new file mode 100644 index 0000000..6cae966 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/album/FileCateVo.java @@ -0,0 +1,30 @@ +package com.yj.admin.vo.album; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("文件分类Vo") +public class FileCateVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + private Integer id; + + @ApiModelProperty(value = "类目父级") + private Integer pid; + + @ApiModelProperty(value = "类目名称") + private String name; + + @ApiModelProperty(value = "创建时间") + private String createTime; + + @ApiModelProperty(value = "更新时间") + private String updateTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/album/FileVo.java b/yj-admin/src/main/java/com/yj/admin/vo/album/FileVo.java new file mode 100644 index 0000000..69f0fcc --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/album/FileVo.java @@ -0,0 +1,39 @@ +package com.yj.admin.vo.album; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("文件Vo") +public class FileVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + private Integer id; + + @ApiModelProperty(value = "所属类目") + private Integer cid; + + @ApiModelProperty(value = "类型") + private Integer type; + + @ApiModelProperty(value = "文件名称") + private String name; + + @ApiModelProperty(value = "文件路径") + private String url; + + @ApiModelProperty(value = "相对路径") + private String uri; + + @ApiModelProperty(value = "创建时间") + private String createTime; + + @ApiModelProperty(value = "更新时间") + private String updateTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/article/ArticleCateVo.java b/yj-admin/src/main/java/com/yj/admin/vo/article/ArticleCateVo.java new file mode 100644 index 0000000..19bd503 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/article/ArticleCateVo.java @@ -0,0 +1,36 @@ +package com.yj.admin.vo.article; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("文章分类Vo") +public class ArticleCateVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + private Integer id; + + @ApiModelProperty(value = "分类名称") + private String name; + + @ApiModelProperty(value = "文章数量") + private Long articleCount; + + @ApiModelProperty(value = "排序编号") + private Integer sort; + + @ApiModelProperty(value = "是否显示") + private Integer isShow; + + @ApiModelProperty(value = "创建时间") + private String createTime; + + @ApiModelProperty(value = "更新时间") + private String updateTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/article/ArticleDetailVo.java b/yj-admin/src/main/java/com/yj/admin/vo/article/ArticleDetailVo.java new file mode 100644 index 0000000..359b2e3 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/article/ArticleDetailVo.java @@ -0,0 +1,64 @@ +package com.yj.admin.vo.article; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("文章详情Vo") +public class ArticleDetailVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + private Integer id; + + @ApiModelProperty(value = "分类") + private Integer cid; + + @ApiModelProperty(value = "标题") + private String title; + + @ApiModelProperty(value = "图片") + private String image; + + @ApiModelProperty(value = "作者") + private String author; + + @ApiModelProperty("简介") + @TableField(value = "`desc`") + private String desc; + + @ApiModelProperty("摘要") + @JsonProperty("abstract") + private String abstractField; + + @ApiModelProperty(value = "访问") + private Integer click; + + @ApiModelProperty("内容") + private String content; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty("虚拟浏览量") + private Integer clickVirtual; + + @ApiModelProperty("实际浏览量") + private Integer clickActual; + + @ApiModelProperty(value = "是否显示") + private Integer isShow; + + @ApiModelProperty(value = "创建时间") + private String createTime; + + @ApiModelProperty(value = "更新时间") + private String updateTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/article/ArticleListedVo.java b/yj-admin/src/main/java/com/yj/admin/vo/article/ArticleListedVo.java new file mode 100644 index 0000000..1c0653b --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/article/ArticleListedVo.java @@ -0,0 +1,64 @@ +package com.yj.admin.vo.article; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("文章列表Vo") +public class ArticleListedVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + private Integer id; + + @ApiModelProperty(value = "分类") + private String cateName; + + @ApiModelProperty(value = "标题") + private String title; + + @ApiModelProperty(value = "图片") + private String image; + + @ApiModelProperty(value = "作者") + private String author; + + @ApiModelProperty("简介") + @TableField(value = "`desc`") + private String desc; + + @ApiModelProperty("摘要") + @JsonProperty("abstract") + private String abstractField; + + @ApiModelProperty(value = "访问") + private Integer click; + + @ApiModelProperty("内容") + private String content; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty("虚拟浏览量") + private Integer clickVirtual; + + @ApiModelProperty("实际浏览量") + private Integer clickActual; + + @ApiModelProperty(value = "是否显示") + private Integer isShow; + + @ApiModelProperty(value = "创建时间") + private String createTime; + + @ApiModelProperty(value = "更新时间") + private String updateTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/auth/AdminMySelfVo.java b/yj-admin/src/main/java/com/yj/admin/vo/auth/AdminMySelfVo.java new file mode 100644 index 0000000..7ec167e --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/auth/AdminMySelfVo.java @@ -0,0 +1,31 @@ +package com.yj.admin.vo.auth; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +@ApiModel("adminVo") +public class AdminMySelfVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "当前管理员角色拥有的菜单") + private JSONArray menu; + + @ApiModelProperty(value = "当前管理员橘色拥有的按钮权限") + private List permissions; + + @ApiModelProperty(value = "user") + private AuthMySelfVo user; + + @ApiModelProperty(value = "是否初次登录") + @JsonProperty("first_login") + private Integer firstLogin; +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/auth/AuthMySelfVo.java b/yj-admin/src/main/java/com/yj/admin/vo/auth/AuthMySelfVo.java new file mode 100644 index 0000000..8133f10 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/auth/AuthMySelfVo.java @@ -0,0 +1,46 @@ +package com.yj.admin.vo.auth; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +@ApiModel("管理员") +public class AuthMySelfVo implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer id; + @ApiModelProperty(value = "账号") + private String account; + + @ApiModelProperty(value = "用户头像") + private String avatar; + @ApiModelProperty(value = "部门关联ID") + @JsonProperty(value = "dept_id") + private List deptId; + @ApiModelProperty(value = "当前管理员角色拥有的菜单") + private Integer disable; + @ApiModelProperty(value = "当前管理员角色拥有的菜单") + @JsonProperty(value = "jobs_id") + private List jobsId; + + @ApiModelProperty(value = "当前管理员角色拥有的菜单") + @JsonProperty(value = "multipoint_login") + private Integer multipointLogin; + @ApiModelProperty(value = "当前管理员角色拥有的菜单") + private String name; + + @ApiModelProperty(value = "当前管理员角色拥有的菜单") + @JsonProperty(value = "role_id") + private List roleId; + + @ApiModelProperty(value = "当前管理员角色拥有的菜单") + private Integer root; +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/channel/ChannelH5Vo.java b/yj-admin/src/main/java/com/yj/admin/vo/channel/ChannelH5Vo.java new file mode 100644 index 0000000..976378b --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/channel/ChannelH5Vo.java @@ -0,0 +1,27 @@ +package com.yj.admin.vo.channel; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("H5渠道Vo") +public class ChannelH5Vo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "是否关闭") + private Integer status; + + @ApiModelProperty(value = "关闭类型") + private Integer pageStatus; + + @ApiModelProperty(value = "关闭访问") + private String url; + + @ApiModelProperty(value = "文件页面地址") + private String pageUrl; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/channel/ChannelMpVo.java b/yj-admin/src/main/java/com/yj/admin/vo/channel/ChannelMpVo.java new file mode 100644 index 0000000..b17f5a7 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/channel/ChannelMpVo.java @@ -0,0 +1,41 @@ +package com.yj.admin.vo.channel; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("小程序渠道Vo") +public class ChannelMpVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "小程序名称") + private String name; + @ApiModelProperty(value = "原始ID") + private String originalId; + @ApiModelProperty(value = "appId") + private String appId; + @ApiModelProperty(value = "appSecret") + private String appSecret; + @ApiModelProperty(value = "二维码") + private String qrCode; + + @ApiModelProperty(value = "request合法域名") + private String requestDomain; + @ApiModelProperty(value = "socket合法域名") + private String socketDomain; + @ApiModelProperty(value = "uploadFile合法域名") + private String uploadFileDomain; + @ApiModelProperty(value = "downloadFile合法域名") + private String downloadFileDomain; + @ApiModelProperty(value = "udp合法域名") + private String udpDomain; + @ApiModelProperty(value = "tcp合法域名") + private String tcpDomain; + @ApiModelProperty(value = "业务域名") + private String businessDomain; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/channel/ChannelOaVo.java b/yj-admin/src/main/java/com/yj/admin/vo/channel/ChannelOaVo.java new file mode 100644 index 0000000..f6836ee --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/channel/ChannelOaVo.java @@ -0,0 +1,41 @@ +package com.yj.admin.vo.channel; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("公众号渠道Vo") +public class ChannelOaVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "公众号名称") + private String name; + @ApiModelProperty(value = "原始ID") + private String originalId; + @ApiModelProperty(value = "appId") + private String appId; + @ApiModelProperty(value = "appSecret") + private String appSecret; + @ApiModelProperty(value = "二维码") + private String qrCode; + @ApiModelProperty(value = "URL") + private String url; + @ApiModelProperty(value = "Token") + private String token; + @ApiModelProperty(value = "EncodingAESKey") + private String encodingAesKey ; + @ApiModelProperty(value = "消息加密方式") + private Integer encryptionType; + + @ApiModelProperty(value = "业务域名") + private String businessDomain; + @ApiModelProperty(value = "JS接口安全域名") + private String jsSecureDomain; + @ApiModelProperty(value = "网页授权域名") + private String webAuthDomain; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/channel/ChannelOpVo.java b/yj-admin/src/main/java/com/yj/admin/vo/channel/ChannelOpVo.java new file mode 100644 index 0000000..cb1dea3 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/channel/ChannelOpVo.java @@ -0,0 +1,21 @@ +package com.yj.admin.vo.channel; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("开发平台Vo") +public class ChannelOpVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "appId") + private String appId; + + @ApiModelProperty(value = "appSecret") + private String appSecret; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/channel/ChannelRpVo.java b/yj-admin/src/main/java/com/yj/admin/vo/channel/ChannelRpVo.java new file mode 100644 index 0000000..4f35dcb --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/channel/ChannelRpVo.java @@ -0,0 +1,39 @@ +package com.yj.admin.vo.channel; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("公众号回复Vo") +public class ChannelRpVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "id") + private Integer id; + + @ApiModelProperty(value = "规则名") + private String name; + + @ApiModelProperty(value = "回复内容") + private String content; + + @ApiModelProperty(value = "关键词") + private String keyword; + + @ApiModelProperty(value = "匹配方式: [1=全匹配, 2=模糊匹配]") + private Integer matchingType; + + @ApiModelProperty(value = "内容类型: [1=文本]") + private Integer contentType; + + @ApiModelProperty(value = "排序编号") + private Integer sort; + + @ApiModelProperty(value = "启动状态: [1=启动, 0=关闭]") + private Integer status; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/decorate/DecorateDataArticleVo.java b/yj-admin/src/main/java/com/yj/admin/vo/decorate/DecorateDataArticleVo.java new file mode 100644 index 0000000..b1a9439 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/decorate/DecorateDataArticleVo.java @@ -0,0 +1,61 @@ +package com.yj.admin.vo.decorate; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("装修文章数据Vo") +public class DecorateDataArticleVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + private Integer id; + + @ApiModelProperty(value = "分类") + private String cateName; + + @ApiModelProperty(value = "标题") + private String title; + + @ApiModelProperty(value = "图片") + private String image; + + @ApiModelProperty(value = "作者") + private String author; + + @ApiModelProperty("简介") + @TableField(value = "`desc`") + private String desc; + + @ApiModelProperty("摘要") + @JsonProperty("abstract") + private String abstractField; + + @ApiModelProperty(value = "访问") + private Integer click; + + @ApiModelProperty("内容") + private String content; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty("虚拟浏览量") + private Integer clickVirtual; + + @ApiModelProperty("实际浏览量") + private Integer clickActual; + + @ApiModelProperty(value = "是否显示") + private Integer isShow; + + @ApiModelProperty(value = "创建时间") + private String createTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/decorate/DecoratePageVo.java b/yj-admin/src/main/java/com/yj/admin/vo/decorate/DecoratePageVo.java new file mode 100644 index 0000000..59499c1 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/decorate/DecoratePageVo.java @@ -0,0 +1,34 @@ +package com.yj.admin.vo.decorate; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("装修页面Vo") +public class DecoratePageVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "id") + private Integer id; + + @ApiModelProperty(value = "页面类型") + private Integer type; + + @ApiModelProperty(value = "名称") + private String name; + + @ApiModelProperty(value = "页面数据") + private String data; + + @ApiModelProperty(value = "页面数据") + private String meta; + + private String createTime; + + private String updateTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/decorate/DecorateTabbarVo.java b/yj-admin/src/main/java/com/yj/admin/vo/decorate/DecorateTabbarVo.java new file mode 100644 index 0000000..0bc0740 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/decorate/DecorateTabbarVo.java @@ -0,0 +1,23 @@ +package com.yj.admin.vo.decorate; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +@Data +@ApiModel("装修底部导航Vo") +public class DecorateTabbarVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "样式") + private DecorateTabsStyleVo style; + + @ApiModelProperty(value = "列表") + private List list; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/decorate/DecorateTabsListsVo.java b/yj-admin/src/main/java/com/yj/admin/vo/decorate/DecorateTabsListsVo.java new file mode 100644 index 0000000..c9d3787 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/decorate/DecorateTabsListsVo.java @@ -0,0 +1,41 @@ +package com.yj.admin.vo.decorate; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +@Data +@ApiModel("装修底部导航列表Vo") +public class DecorateTabsListsVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "id") + private Integer id; + + @ApiModelProperty(value = "导航名称") + private String name; + + @ApiModelProperty(value = "已选图标") + private String selected; + + @ApiModelProperty(value = "未选图标") + private String unselected; + + @ApiModelProperty(value = "id") + private Object link; + + @ApiModelProperty(value = "是否显示") + private Integer isShow; + + @ApiModelProperty(value = "创建时间") + private String createTime; + + @ApiModelProperty(value = "更新时间") + private String updateTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/decorate/DecorateTabsStyleVo.java b/yj-admin/src/main/java/com/yj/admin/vo/decorate/DecorateTabsStyleVo.java new file mode 100644 index 0000000..b360175 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/decorate/DecorateTabsStyleVo.java @@ -0,0 +1,21 @@ +package com.yj.admin.vo.decorate; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("装修底部导航样式Vo") +public class DecorateTabsStyleVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "默认颜色") + private String defaultColor; + + @ApiModelProperty(value = "选中颜色") + private String selectedColor; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/finance/FinanceRechargeListExportVo.java b/yj-admin/src/main/java/com/yj/admin/vo/finance/FinanceRechargeListExportVo.java new file mode 100644 index 0000000..007b939 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/finance/FinanceRechargeListExportVo.java @@ -0,0 +1,83 @@ +package com.yj.admin.vo.finance; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel("导出充值记录列表Vo") +public class FinanceRechargeListExportVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + @ExcelProperty("ID") + @ColumnWidth(50) + private Integer id; + + @ApiModelProperty("用户昵称") + @ExcelProperty("用户昵称") + @ColumnWidth(50) + private String nickname; + + @ApiModelProperty("用户头像") + @ExcelProperty("用户头像") + @ColumnWidth(50) + private String avatar; + + @ApiModelProperty("账号") + @ExcelProperty("账号") + @ColumnWidth(50) + private String account; + + @ApiModelProperty("订单编号") + @ExcelProperty("订单编号") + @ColumnWidth(50) + private String sn; + + @ApiModelProperty("支付方式: [2=微信支付, 3=支付宝支付]") + @ExcelProperty("支付方式: [2=微信支付, 3=支付宝支付]") + @ColumnWidth(50) + private String payWay; + + @ApiModelProperty("支付状态: [0=待支付, 1=已支付]") + @ExcelProperty("支付状态: [0=待支付, 1=已支付]") + @ColumnWidth(50) + private Integer payStatus; + + @ApiModelProperty("退款状态: [0=未退款 , 1=已退款]") + @ExcelProperty("退款状态: [0=未退款 , 1=已退款]") + @ColumnWidth(50) + private Integer refundStatus; + + @ApiModelProperty("支付状态: [0=待支付, 1=已支付]") + @ExcelProperty("支付状态: [0=待支付, 1=已支付]") + @ColumnWidth(50) + private String payStatusText; + + @ApiModelProperty("支付方式") + @ExcelProperty("支付方式") + @ColumnWidth(50) + private String payWayText; + + @ApiModelProperty("支付金额") + @ExcelProperty("支付金额") + @ColumnWidth(50) + private BigDecimal orderAmount; + + @ApiModelProperty("支付时间") + @ExcelProperty("支付时间") + @ColumnWidth(50) + private String payTime; + + @ApiModelProperty("创建时间") + @ExcelProperty("创建时间") + @ColumnWidth(50) + private String createTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/finance/FinanceRechargeListVo.java b/yj-admin/src/main/java/com/yj/admin/vo/finance/FinanceRechargeListVo.java new file mode 100644 index 0000000..522dac5 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/finance/FinanceRechargeListVo.java @@ -0,0 +1,55 @@ +package com.yj.admin.vo.finance; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel("充值记录列表Vo") +public class FinanceRechargeListVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("用户昵称") + private String nickname; + + @ApiModelProperty("用户头像") + private String avatar; + + @ApiModelProperty("账号") + private String acount; + + @ApiModelProperty("订单编号") + private String sn; + + @ApiModelProperty("支付方式: [2=微信支付, 3=支付宝支付]") + private String payWay; + + @ApiModelProperty("支付状态: [0=待支付, 1=已支付]") + private Integer payStatus; + + @ApiModelProperty("退款状态: [0=未退款 , 1=已退款]") + private Integer refundStatus; + + @ApiModelProperty("支付状态: [0=待支付, 1=已支付]") + private String payStatusText; + + @ApiModelProperty("支付方式") + private String payWayText; + + @ApiModelProperty("支付金额") + private BigDecimal orderAmount; + + @ApiModelProperty("支付时间") + private String payTime; + + @ApiModelProperty("创建时间") + private String createTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/finance/FinanceRefundListVo.java b/yj-admin/src/main/java/com/yj/admin/vo/finance/FinanceRefundListVo.java new file mode 100644 index 0000000..f1effb8 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/finance/FinanceRefundListVo.java @@ -0,0 +1,56 @@ +package com.yj.admin.vo.finance; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel("退款记录列表Vo") +public class FinanceRefundListVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("记录ID") + private Integer id; + + @ApiModelProperty("退款编号") + private String sn; + + @ApiModelProperty("用户头像") + private String avatar; + + @ApiModelProperty("用户昵称") + private String nickname; + + @ApiModelProperty("来源单号SN") + private String orderSn; + + @ApiModelProperty("总应付款金额") + private BigDecimal orderAmount; + + @ApiModelProperty("本次退款金额") + private BigDecimal refundAmount; + + @ApiModelProperty("退款类型: 1=后台退款") + private Integer refundType; + + @ApiModelProperty("退款状态: 0=退款中, 1=退款成功, 2=退款失败") + private Integer refundStatus; + + private Integer refundWay; + + @ApiModelProperty("退款类型描述") + private String refundTypeText; + + @ApiModelProperty("退款状态描述") + private String refundStatusText; + + private String refundWayText; + + @ApiModelProperty("记录时间") + private String createTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/finance/FinanceRefundLogVo.java b/yj-admin/src/main/java/com/yj/admin/vo/finance/FinanceRefundLogVo.java new file mode 100644 index 0000000..653055a --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/finance/FinanceRefundLogVo.java @@ -0,0 +1,43 @@ +package com.yj.admin.vo.finance; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel("退款记录日志Vo") +public class FinanceRefundLogVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("流水号") + private String sn; + + @ApiModelProperty("订单金额") + private BigDecimal orderAmount; + + @ApiModelProperty("退款金额") + private BigDecimal refundAmount; + + @ApiModelProperty("退款状态: [0=退款中, 1=退款成功, 2=退款失败]") + private Integer refundStatus; + + @ApiModelProperty("退款状态描述") + private String refundStatusText; + + @ApiModelProperty("退款信息") + private String refundMsg; + + @ApiModelProperty("操作人") + private String handler; + + @ApiModelProperty("创建时间") + private String createTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/finance/FinanceWalletListVo.java b/yj-admin/src/main/java/com/yj/admin/vo/finance/FinanceWalletListVo.java new file mode 100644 index 0000000..7668b07 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/finance/FinanceWalletListVo.java @@ -0,0 +1,51 @@ +package com.yj.admin.vo.finance; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel("余额记录列表Vo") +public class FinanceWalletListVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "记录ID") + private Integer id; + + @ApiModelProperty(value = "用户编号") + private String sn; + + private String account; + + private String mobile; + + private Integer action; + + @ApiModelProperty(value = "u屏幕估计头皮屑") + private String avatar; + + @ApiModelProperty(value = "用户昵称") + private String nickname; + + @ApiModelProperty(value = "变动金额") + private BigDecimal changeAmount; + + @ApiModelProperty(value = "剩余金额") + private BigDecimal leftAmount; + + @ApiModelProperty(value = "变动类型") + private String changeType; + + private String changeTypeDesc; + + @ApiModelProperty(value = "来源单号") + private String sourceSn; + + @ApiModelProperty(value = "记录时间") + private String createTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/marketing/MarketingRechargeVo.java b/yj-admin/src/main/java/com/yj/admin/vo/marketing/MarketingRechargeVo.java new file mode 100644 index 0000000..da1d0c3 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/marketing/MarketingRechargeVo.java @@ -0,0 +1,22 @@ +package com.yj.admin.vo.marketing; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel("营销充值Vo") +public class MarketingRechargeVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("是否开启充值: 0=否,1=是") + private Integer status; + + @ApiModelProperty("最低充值金额") + private BigDecimal minAmount; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingAgreementVo.java b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingAgreementVo.java new file mode 100644 index 0000000..dd1c610 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingAgreementVo.java @@ -0,0 +1,27 @@ +package com.yj.admin.vo.setting; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("政策协议详情Vo") +public class SettingAgreementVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "服务协议标题") + private String serviceTitle; + + @ApiModelProperty(value = "服务协议内容") + private String serviceContent; + + @ApiModelProperty(value = "服务协议标题") + private String privacyTitle; + + @ApiModelProperty(value = "服务协议内容") + private String privacyContent; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingCopyrightVo.java b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingCopyrightVo.java new file mode 100644 index 0000000..07760bc --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingCopyrightVo.java @@ -0,0 +1,21 @@ +package com.yj.admin.vo.setting; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("版权设置Vo") +public class SettingCopyrightVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "名称") + private String key; + + @ApiModelProperty(value = "链接") + private String value; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingDictDataVo.java b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingDictDataVo.java new file mode 100644 index 0000000..26e7a53 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingDictDataVo.java @@ -0,0 +1,44 @@ +package com.yj.admin.vo.setting; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("字典数据Vo") +public class SettingDictDataVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + private Integer id; + + @ApiModelProperty(value = "类型") + private Integer typeId; + + private String typeValue; + + @ApiModelProperty(value = "键") + private String name; + + @ApiModelProperty(value = "值") + private String value; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "是否停用") + private Integer status; + + @ApiModelProperty(value = "创建时间") + private String createTime; + + @ApiModelProperty(value = "更新时间") + private String updateTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingDictTypeVo.java b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingDictTypeVo.java new file mode 100644 index 0000000..97caeea --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingDictTypeVo.java @@ -0,0 +1,36 @@ +package com.yj.admin.vo.setting; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("字典类型Vo") +public class SettingDictTypeVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + private Integer id; + + @ApiModelProperty(value = "字典名称") + private String name; + + @ApiModelProperty(value = "字典类型") + private String type; + + @ApiModelProperty(value = "字典备注") + private String remark; + + @ApiModelProperty(value = "字典状态") + private Integer status; + + @ApiModelProperty(value = "创建时间") + private String createTime; + + @ApiModelProperty(value = "更新时间") + private String updateTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingLoginVo.java b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingLoginVo.java new file mode 100644 index 0000000..67fe230 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingLoginVo.java @@ -0,0 +1,35 @@ +package com.yj.admin.vo.setting; + +import com.alibaba.fastjson2.JSONArray; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +@ApiModel("登录设置Vo") +public class SettingLoginVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "登录方式") + private JSONArray loginWay; + + @ApiModelProperty(value = "强制绑定手机") + private Integer coerceMobile; + + @ApiModelProperty(value = "是否开启协议") + private Integer loginAgreement; + + @ApiModelProperty(value = "第三方的登录") + private Integer thirdAuth; + + @ApiModelProperty(value = "微信登录") + private Integer wechatAuth; + + @ApiModelProperty(value = "qq登录") + private Integer qqAuth; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingNoticeDetailVo.java b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingNoticeDetailVo.java new file mode 100644 index 0000000..52d1511 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingNoticeDetailVo.java @@ -0,0 +1,43 @@ +package com.yj.admin.vo.setting; + +import com.alibaba.fastjson2.JSONObject; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("通知设置详情Vo") +public class SettingNoticeDetailVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "id") + private Integer id; + + @ApiModelProperty(value = "senceId") + private Integer senceId; + + @ApiModelProperty(value = "场景名称") + private String sceneName; + + @ApiModelProperty(value = "通知类型: [1=业务, 2=验证]") + private String type; + + @ApiModelProperty(value = "场景描述") + private String sceneDesc; + + @ApiModelProperty(value = "系统的通知设置") + private JSONObject systemNotice; + + @ApiModelProperty(value = "公众号通知设置") + private JSONObject oaNotice; + + @ApiModelProperty(value = "小程序通知设置") + private JSONObject mnpNotice; + + @ApiModelProperty(value = "短信的通知设置") + private JSONObject smsNotice; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingNoticeListedVo.java b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingNoticeListedVo.java new file mode 100644 index 0000000..b211460 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingNoticeListedVo.java @@ -0,0 +1,34 @@ +package com.yj.admin.vo.setting; + +import com.alibaba.fastjson2.JSONObject; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("通知设置列表Vo") +public class SettingNoticeListedVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + private Integer id; + + @ApiModelProperty(value = "通知名称") + private String sceneName; + + @ApiModelProperty(value = "通知类型") + private String type; + + @ApiModelProperty(value = "通知类型") + private String typeDesc; + + @ApiModelProperty(value = "通知状态") + private String smsStatusDesc; + + @ApiModelProperty(value = "通知对象") + private JSONObject smsNotice; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingPaymentDetailVo.java b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingPaymentDetailVo.java new file mode 100644 index 0000000..13a90be --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingPaymentDetailVo.java @@ -0,0 +1,14 @@ +package com.yj.admin.vo.setting; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class SettingPaymentDetailVo implements Serializable { + + private static final long serialVersionUID = 1L; + + + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingPaymentMethodVo.java b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingPaymentMethodVo.java new file mode 100644 index 0000000..128a3a1 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingPaymentMethodVo.java @@ -0,0 +1,26 @@ +package com.yj.admin.vo.setting; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class SettingPaymentMethodVo implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer id; + + private String payWayName; + + private Integer payConfigId; + + private String icon; + + private Integer scene; + + private Integer status; + + private Integer isDefault; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingSearchDetailVo.java b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingSearchDetailVo.java new file mode 100644 index 0000000..412852d --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingSearchDetailVo.java @@ -0,0 +1,23 @@ +package com.yj.admin.vo.setting; + +import com.yj.common.entity.setting.HotSearch; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +@ApiModel("热门搜索详情Vo") +public class SettingSearchDetailVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "是否开起热门搜索") + private Integer status; + + @ApiModelProperty(value = "热门搜索关键词") + private List data; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingSearchObjectVo.java b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingSearchObjectVo.java new file mode 100644 index 0000000..0f21d25 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingSearchObjectVo.java @@ -0,0 +1,21 @@ +package com.yj.admin.vo.setting; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("热门搜索对象Vo") +public class SettingSearchObjectVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "关键词") + private String name; + + @ApiModelProperty(value = "排序") + private Integer sort; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingSiteStatisticsVo.java b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingSiteStatisticsVo.java new file mode 100644 index 0000000..a43146a --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingSiteStatisticsVo.java @@ -0,0 +1,18 @@ +package com.yj.admin.vo.setting; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("站点统计配置信息Vo") +public class SettingSiteStatisticsVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "clarityCode") + private String clarityCode; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingUserVo.java b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingUserVo.java new file mode 100644 index 0000000..4900b30 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingUserVo.java @@ -0,0 +1,18 @@ +package com.yj.admin.vo.setting; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("用户设置Vo") +public class SettingUserVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "默认头像") + private String defaultAvatar; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingWebsiteVo.java b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingWebsiteVo.java new file mode 100644 index 0000000..15c1daf --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/setting/SettingWebsiteVo.java @@ -0,0 +1,43 @@ +package com.yj.admin.vo.setting; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 基础设置Vo + */ +@Data +@ApiModel("基础设置Vo") +public class SettingWebsiteVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "网站名称") + private String name; + @ApiModelProperty(value = "网站logo") + private String webLogo; + @ApiModelProperty(value = "网站图标") + private String webFavicon; + @ApiModelProperty(value = "登录页广告图") + private String loginImage; + @ApiModelProperty(value = "商城名称") + private String shopName; + @ApiModelProperty(value = "商城LOGO") + private String shopLogo; + @ApiModelProperty(value = "PC端LOGO") + private String pcLogo; + @ApiModelProperty(value = "网站标题") + private String pcTitle; + @ApiModelProperty(value = "网站图标") + private String pcIco; + @ApiModelProperty(value = "网站描述") + private String pcDesc; + @ApiModelProperty(value = "网站关键词") + private String pcKeywords; + @ApiModelProperty(value = "h5图标") + private String h5Favicon; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/system/DeptVo.java b/yj-admin/src/main/java/com/yj/admin/vo/system/DeptVo.java new file mode 100644 index 0000000..7c64ee8 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/system/DeptVo.java @@ -0,0 +1,48 @@ +package com.yj.admin.vo.system; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("部门Vo") +public class DeptVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + private Integer id; + + @ApiModelProperty(value = "部门父级") + private Integer pid; + + @ApiModelProperty(value = "部门名称") + private String name; + + @ApiModelProperty(value = "负责人") + private String leader; + + @ApiModelProperty(value = "联系电话") + private String mobile; + + @ApiModelProperty(value = "排序编号") + private Integer sort; + + @ApiModelProperty(value = "是否停用: [0=否, 1=是]") + private Integer status; + + @JsonProperty("status_desc") + private String statusDesc; + + @ApiModelProperty(value = "创建时间") + @JsonProperty("create_time") + private String createTime; + + @ApiModelProperty(value = "更新时间") + @JsonProperty("update_time") + private String updateTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/system/JobsExportVo.java b/yj-admin/src/main/java/com/yj/admin/vo/system/JobsExportVo.java new file mode 100644 index 0000000..02f3064 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/system/JobsExportVo.java @@ -0,0 +1,62 @@ +package com.yj.admin.vo.system; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("系统岗位导出Vo") +public class JobsExportVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + @ExcelProperty("ID") + @ColumnWidth(50) + private Integer id; + + @ApiModelProperty(value = "岗位编号") + @ExcelProperty("岗位编号") + @ColumnWidth(50) + private String code; + + @ApiModelProperty(value = "岗位名称") + @ExcelProperty("岗位名称") + @ColumnWidth(50) + private String name; + + @ApiModelProperty(value = "岗位备注") + @ExcelProperty("岗位备注") + @ColumnWidth(50) + private String remark; + + @ApiModelProperty(value = "岗位排序") + @ExcelProperty("岗位排序") + @ColumnWidth(50) + private Integer sort; + + @ApiModelProperty(value = "是否停用: [0=否, 1=是]") + @ExcelProperty("是否停用: [0=否, 1=是]") + @ColumnWidth(50) + private Integer status; + + @ApiModelProperty(value = "状态描述") + @ExcelProperty("状态描述") + @ColumnWidth(50) + private String statusDesc; + + @ApiModelProperty(value = "创建时间") + @ExcelProperty("创建时间") + @ColumnWidth(50) + private String createTime; + + @ApiModelProperty(value = "更新时间") + @ExcelProperty("更新时间") + @ColumnWidth(50) + private String updateTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/system/JobsVo.java b/yj-admin/src/main/java/com/yj/admin/vo/system/JobsVo.java new file mode 100644 index 0000000..e429f4e --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/system/JobsVo.java @@ -0,0 +1,42 @@ +package com.yj.admin.vo.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("系统岗位Vo") +public class JobsVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + private Integer id; + + @ApiModelProperty(value = "岗位编号") + private String code; + + @ApiModelProperty(value = "岗位名称") + private String name; + + @ApiModelProperty(value = "岗位备注") + private String remark; + + @ApiModelProperty(value = "岗位排序") + private Integer sort; + + @ApiModelProperty(value = "是否停用: [0=否, 1=是]") + private Integer status; + + @ApiModelProperty(value = "状态描述") + private String statusDesc; + + @ApiModelProperty(value = "创建时间") + private String createTime; + + @ApiModelProperty(value = "更新时间") + private String updateTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/system/SystemAuthAdminDetailVo.java b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemAuthAdminDetailVo.java new file mode 100644 index 0000000..7cfc468 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemAuthAdminDetailVo.java @@ -0,0 +1,61 @@ +package com.yj.admin.vo.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +@ApiModel("管理员详情Vo") +public class SystemAuthAdminDetailVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + private Integer id; + + @ApiModelProperty(value = "是否超级管理员 0-否 1-是") + private Integer root; + + @ApiModelProperty(value = "角色ID") + private List roleId; + + @ApiModelProperty(value = "部门ID") + private List deptId; + + @ApiModelProperty(value = "岗位ID") + private List jobsId; + + @ApiModelProperty(value = "账号") + private String account; + + @ApiModelProperty(value = "昵称") + private String name; + + @ApiModelProperty(value = "头像") + private String avatar; + + @ApiModelProperty(value = "是否禁用: [0=否, 1=是]") + private Integer disable; + + @ApiModelProperty(value = "最后登录IP") + private String loginIp; + + @ApiModelProperty(value = "最后登录时间") + private String loginTime; + + @ApiModelProperty(value = "创建时间") + private String createTime; + + @ApiModelProperty(value = "更新时间") + private String updateTime; + + @ApiModelProperty(value = "是否支持多处登录:1-是;0-否;") + private Integer multipointLogin; + + @ApiModelProperty(value = "是否为首次登录") + private Integer firstLogin; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/system/SystemAuthAdminInformVo.java b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemAuthAdminInformVo.java new file mode 100644 index 0000000..b25f438 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemAuthAdminInformVo.java @@ -0,0 +1,51 @@ +package com.yj.admin.vo.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("管理员信息Vo") +public class SystemAuthAdminInformVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + private Integer id; + + @ApiModelProperty(value = "部门ID") + private Integer deptId; + + @ApiModelProperty(value = "岗位ID") + private Integer postId; + + @ApiModelProperty(value = "账号") + private String username; + + @ApiModelProperty(value = "昵称") + private String nickname; + + @ApiModelProperty(value = "头像") + private String avatar; + + @ApiModelProperty(value = "多端登录: [0=否, 1=是]") + private Integer isMultipoint; + + @ApiModelProperty(value = "是否禁用: [0=否, 1=是]") + private Integer isDisable; + + @ApiModelProperty(value = "最后登录IP") + private String lastLoginIp; + + @ApiModelProperty(value = "最后登录时间") + private String lastLoginTime; + + @ApiModelProperty(value = "创建时间") + private String createTime; + + @ApiModelProperty(value = "更新时间") + private String updateTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/system/SystemAuthAdminListedExportVo.java b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemAuthAdminListedExportVo.java new file mode 100644 index 0000000..c8f2639 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemAuthAdminListedExportVo.java @@ -0,0 +1,108 @@ +package com.yj.admin.vo.system; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +@ApiModel("管理员导出列表Vo") +public class SystemAuthAdminListedExportVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + @ExcelProperty("主键") + @ColumnWidth(50) + private Integer id; + + @ApiModelProperty(value = "账号") + @ExcelProperty("账号") + @ColumnWidth(50) + private String account; + + @ApiModelProperty(value = "昵称") + @ExcelProperty("昵称") + @ColumnWidth(50) + private String name; + + @ApiModelProperty(value = "头像") + @ExcelProperty("头像") + @ColumnWidth(50) + private String avatar; + + @ApiModelProperty(value = "部门") + @ExcelProperty("部门") + @ColumnWidth(50) + private String deptName; + + @ApiModelProperty(value = "部门") + @ExcelProperty("部门") + @ColumnWidth(50) + private String roleName; + + @ApiModelProperty(value = "部门") + @ExcelProperty("部门") + @ColumnWidth(50) + private String jobsName; + + @ApiModelProperty(value = "角色ID") + @ExcelProperty("角色ID") + @ColumnWidth(50) + private List roleId; + + @ApiModelProperty(value = "部门ID") + @ExcelProperty("部门ID") + @ColumnWidth(50) + private List deptId; + + @ApiModelProperty(value = "岗位ID") + @ExcelProperty("ID") + @ColumnWidth(50) + private List jobsId; + + @ApiModelProperty(value = "多端登录: [0=否, 1=是]") + @ExcelProperty("多端登录: [0=否, 1=是]") + @ColumnWidth(50) + private Integer multipointLogin; + + @ApiModelProperty(value = "是否禁用: [0=否, 1=是]") + @ExcelProperty("是否禁用: [0=否, 1=是]") + @ColumnWidth(50) + private Integer disable; + + @ApiModelProperty(value = "是否禁用") + @ExcelProperty("是否禁用") + @ColumnWidth(50) + private String disableDesc; + + @ApiModelProperty(value = "root") + @ExcelProperty("root") + @ColumnWidth(50) + private Integer root; + + @ApiModelProperty(value = "最后登录IP") + @ExcelProperty("最后登录IP") + @ColumnWidth(50) + private String loginIp; + + @ApiModelProperty(value = "最后登录时间") + @ExcelProperty("最后登录时间") + @ColumnWidth(50) + private String loginTime; + + @ApiModelProperty(value = "创建时间") + @ExcelProperty("创建时间") + @ColumnWidth(50) + private String createTime; + + @ApiModelProperty(value = "更新时间") + @ExcelProperty("更新时间") + @ColumnWidth(50) + private String updateTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/system/SystemAuthAdminListedVo.java b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemAuthAdminListedVo.java new file mode 100644 index 0000000..e5f91c1 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemAuthAdminListedVo.java @@ -0,0 +1,65 @@ +package com.yj.admin.vo.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +@ApiModel("管理员列表Vo") +public class SystemAuthAdminListedVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + private Integer id; + + @ApiModelProperty(value = "账号") + private String account; + + @ApiModelProperty(value = "昵称") + private String name; + + @ApiModelProperty(value = "头像") + private String avatar; + + @ApiModelProperty(value = "部门") + private String deptName; + + @ApiModelProperty(value = "角色") + private String roleName; + + @ApiModelProperty(value = "岗位") + private String jobsName; + + private List roleId; + + private List deptId; + + private List jobsId; + + @ApiModelProperty(value = "多端登录: [0=否, 1=是]") + private Integer multipointLogin; + + @ApiModelProperty(value = "是否禁用: [0=否, 1=是]") + private Integer disable; + + private String disableDesc; + + private Integer root; + + @ApiModelProperty(value = "最后登录IP") + private String loginIp; + + @ApiModelProperty(value = "最后登录时间") + private String loginTime; + + @ApiModelProperty(value = "创建时间") + private String createTime; + + @ApiModelProperty(value = "更新时间") + private String updateTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/system/SystemAuthAdminSelvesVo.java b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemAuthAdminSelvesVo.java new file mode 100644 index 0000000..8858966 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemAuthAdminSelvesVo.java @@ -0,0 +1,17 @@ +package com.yj.admin.vo.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("当前系统管理员Vo") +public class SystemAuthAdminSelvesVo { + + @ApiModelProperty(value = "用户信息") + private Object user; + + @ApiModelProperty(value = "权限集合: [[*]=>所有权限, ['article:add']=>部分权限]") + private Object permissions; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/system/SystemAuthMenuVo.java b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemAuthMenuVo.java new file mode 100644 index 0000000..6ab2514 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemAuthMenuVo.java @@ -0,0 +1,69 @@ +package com.yj.admin.vo.system; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("系统菜单Vo") +public class SystemAuthMenuVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + private Integer id; + + @ApiModelProperty(value = "上级菜单") + private Integer pid; + + @ApiModelProperty(value = "权限类型: [M=目录, C=菜单, A=按钮]") + private String type; + + @ApiModelProperty(value = "菜单名称") + private String name; + + @ApiModelProperty(value = "菜单图标") + private String icon; + + @ApiModelProperty(value = "菜单排序") + private Integer sort; + + @ApiModelProperty(value = "权限标识") + private String perms; + + @ApiModelProperty(value = "路由地址") + private String paths; + + @ApiModelProperty(value = "前端组件") + private String component; + + @ApiModelProperty(value = "选中路径") + private String selected; + + @ApiModelProperty(value = "路由参数") + private String params; + + @ApiModelProperty(value = "是否缓存: [0=否, 1=是]") + @JsonProperty("is_cache") + private Integer isCache; + + @ApiModelProperty(value = "是否显示: [0=否, 1=是]") + @JsonProperty("is_show") + private Integer isShow; + + @ApiModelProperty(value = "是否禁用: [0=否, 1=是]") + @JsonProperty("is_disable") + private Integer isDisable; + + @ApiModelProperty(value = "创建时间") + @JsonProperty("create_time") + private String createTime; + + @ApiModelProperty(value = "更新时间") + @JsonProperty("update_time") + private String updateTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/system/SystemAuthRoleVo.java b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemAuthRoleVo.java new file mode 100644 index 0000000..690a239 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemAuthRoleVo.java @@ -0,0 +1,42 @@ +package com.yj.admin.vo.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("系统角色Vo") +public class SystemAuthRoleVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + private Integer id; + + @ApiModelProperty(value = "角色名称") + private String name; + + @ApiModelProperty(value = "角色备注") + private String desc; + + @ApiModelProperty(value = "关联菜单") + private Object menusId; + + @ApiModelProperty(value = "成员数量") + private Integer num; + + @ApiModelProperty(value = "角色排序") + private Integer sort; + + @ApiModelProperty(value = "是否禁用: [0=否, 1=是]") + private Integer isDisable; + + @ApiModelProperty(value = "创建时间") + private String createTime; + + @ApiModelProperty(value = "更新时间") + private String updateTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/system/SystemCaptchaVo.java b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemCaptchaVo.java new file mode 100644 index 0000000..f9ff7af --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemCaptchaVo.java @@ -0,0 +1,17 @@ +package com.yj.admin.vo.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("验证码") +public class SystemCaptchaVo { + + @ApiModelProperty(value = "标识") + private String uuid; + + @ApiModelProperty(value = "图片") + private String img; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/system/SystemLogLoginVo.java b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemLogLoginVo.java new file mode 100644 index 0000000..47801a5 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemLogLoginVo.java @@ -0,0 +1,36 @@ +package com.yj.admin.vo.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("登录日志Vo") +public class SystemLogLoginVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + private Integer id; + + @ApiModelProperty(value = "登录账号") + private String username; + + @ApiModelProperty(value = "来源IP") + private String ip; + + @ApiModelProperty(value = "操作系统") + private String os; + + @ApiModelProperty(value = "浏览器") + private String browser; + + @ApiModelProperty(value = "操作状态: [1=成功, 2=失败]") + private Integer status; + + @ApiModelProperty(value = "创建时间") + private String createTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/system/SystemLogOperateVo.java b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemLogOperateVo.java new file mode 100644 index 0000000..c582ed9 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemLogOperateVo.java @@ -0,0 +1,46 @@ +package com.yj.admin.vo.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("操作日志Vo") +public class SystemLogOperateVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("操作人ID") + private Integer adminId; + + private String adminName; + + private String account; + + @ApiModelProperty("操作标题") + private String action; + + @ApiModelProperty("请求类型: GET/POST/PUT") + private String type; + + @ApiModelProperty("请求接口") + private String url; + + @ApiModelProperty("请求参数") + private String params; + + @ApiModelProperty("请求结果") + private String result; + + @ApiModelProperty("请求IP") + private String ip; + + @ApiModelProperty("创建时间") + private String createTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/system/SystemLoginVo.java b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemLoginVo.java new file mode 100644 index 0000000..a0bb8ef --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemLoginVo.java @@ -0,0 +1,30 @@ +package com.yj.admin.vo.system; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("系统登录Vo") +public class SystemLoginVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "管理员ID") + private Integer id; + + @ApiModelProperty(value = "登录令牌") + private String token; + + @ApiModelProperty(value = "名称") + private String name; + + @ApiModelProperty(value = "用户头像") + private String avatar; + @ApiModelProperty(value = "用户头像") + @JsonProperty("role_name") + private String roleName; +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/system/SystemMenuListedVo.java b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemMenuListedVo.java new file mode 100644 index 0000000..5a1c567 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/system/SystemMenuListedVo.java @@ -0,0 +1,68 @@ +package com.yj.admin.vo.system; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("系统菜单Vo") +public class SystemMenuListedVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + private Integer id; + + @ApiModelProperty(value = "上级菜单") + private Integer pid; + + @ApiModelProperty(value = "权限类型: [M=目录, C=菜单, A=按钮]") + @JsonProperty("menuType") + private String type; + + @ApiModelProperty(value = "菜单名称") + @JsonProperty("menuName") + private String name; + + @ApiModelProperty(value = "菜单图标") + @JsonProperty("menuIcon") + private String icon; + + @ApiModelProperty(value = "菜单排序") + @JsonProperty("menuSort") + private Integer sort; + + @ApiModelProperty(value = "权限标识") + private String perms; + + @ApiModelProperty(value = "路由地址") + private String paths; + + @ApiModelProperty(value = "前端组件") + private String component; + + @ApiModelProperty(value = "选中路径") + private String selected; + + @ApiModelProperty(value = "路由参数") + private String params; + + @ApiModelProperty(value = "是否缓存: [0=否, 1=是]") + private Integer isCache; + + @ApiModelProperty(value = "是否显示: [0=否, 1=是]") + private Integer isShow; + + @ApiModelProperty(value = "是否禁用: [0=否, 1=是]") + private Integer isDisable; + + @ApiModelProperty(value = "创建时间") + private String createTime; + + @ApiModelProperty(value = "更新时间") + private String updateTime; + +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/user/UserListExportVo.java b/yj-admin/src/main/java/com/yj/admin/vo/user/UserListExportVo.java new file mode 100644 index 0000000..9d1e102 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/user/UserListExportVo.java @@ -0,0 +1,80 @@ +package com.yj.admin.vo.user; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +@Data +@ApiModel("用户记录列表Vo") +public class UserListExportVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "用户ID") + @ExcelProperty("ID") + @ColumnWidth(50) + private Integer id; + @ApiModelProperty(value = "用户编码") + @ExcelProperty("用户编码") + @ColumnWidth(50) + private Integer sn; + @ApiModelProperty(value = "用户头像") + @ExcelProperty("用户头像") + @ColumnWidth(50) + private String avatar; + @ApiModelProperty(value = "真实姓名") + @ExcelProperty("真实姓名") + @ColumnWidth(50) + private String realName; + @ApiModelProperty(value = "用户昵称") + @ExcelProperty("用户昵称") + @ColumnWidth(50) + private String nickname; + @ApiModelProperty(value = "登录账号") + @ExcelProperty("登录账号") + @ColumnWidth(50) + private String account; + @ApiModelProperty(value = "手机号码") + @ExcelProperty("手机号码") + @ColumnWidth(50) + private String mobile; + @ApiModelProperty(value = "用户性别") + @ExcelProperty("用户性别") + @ColumnWidth(50) + private String sex; + @ApiModelProperty(value = "注册渠道") + @ExcelProperty("注册渠道") + @ColumnWidth(50) + private String channel; + @ApiModelProperty(value = "最后登录IP") + @ExcelProperty("最后登录IP") + @ColumnWidth(50) + private String loginIp; + + @ApiModelProperty(value = "最后登录时间") + @ExcelProperty("最后登录时间") + @ColumnWidth(50) + private String loginTime; + + @ApiModelProperty(value = "创建时间") + @ExcelProperty("创建时间") + @ColumnWidth(50) + private String createTime; + public void setSex(Integer sex) { + switch (sex) { + case 0: + this.sex = "未知"; + break; + case 1: + this.sex = "男"; + break; + case 2: + this.sex = "女"; + break; + } + } +} diff --git a/yj-admin/src/main/java/com/yj/admin/vo/user/UserVo.java b/yj-admin/src/main/java/com/yj/admin/vo/user/UserVo.java new file mode 100644 index 0000000..5bb29b7 --- /dev/null +++ b/yj-admin/src/main/java/com/yj/admin/vo/user/UserVo.java @@ -0,0 +1,69 @@ +package com.yj.admin.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel("用户Vo") +public class UserVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "用户ID") + private Integer id; + + @ApiModelProperty(value = "用户编码") + private Integer sn; + + @ApiModelProperty(value = "用户头像") + private String avatar; + + @ApiModelProperty(value = "真实姓名") + private String realName; + + @ApiModelProperty(value = "用户昵称") + private String nickname; + + @ApiModelProperty(value = "登录账号") + private String account; + + @ApiModelProperty(value = "手机号码") + private String mobile; + + @ApiModelProperty(value = "用户性别") + private String sex; + + @ApiModelProperty(value = "注册渠道") + private String channel; + + @ApiModelProperty(value = "最后登录IP") + private String loginIp; + + @ApiModelProperty(value = "用户余额") + private BigDecimal userMoney; + + @ApiModelProperty(value = "最后登录时间") + private String loginTime; + + @ApiModelProperty(value = "创建时间") + private String createTime; + + public void setSex(Integer sex) { + switch (sex) { + case 0: + this.sex = "未知"; + break; + case 1: + this.sex = "男"; + break; + case 2: + this.sex = "女"; + break; + } + } + +} diff --git a/yj-admin/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/yj-admin/src/main/resources/META-INF/additional-spring-configuration-metadata.json new file mode 100644 index 0000000..0a1ed15 --- /dev/null +++ b/yj-admin/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -0,0 +1,39 @@ +{ + "properties": [ + { + "name": "like.upload-directory", + "type": "java.lang.String", + "description": "Description for like.upload-directory." + }, + { + "name": "like.production", + "type": "java.lang.String", + "description": "Description for like.production." + }, + { + "name": "like.captcha.status", + "type": "java.lang.String", + "description": "Description for like.captcha.status." + }, + { + "name": "like.captcha.expire", + "type": "java.lang.String", + "description": "Description for like.captcha.expire." + }, + { + "name": "like.captcha.token", + "type": "java.lang.String", + "description": "Description for like.captcha.token." + }, + { + "name": "like.swagger.enabled", + "type": "java.lang.String", + "description": "Description for like.swagger.enabled." + }, + { + "name": "like.swagger.pathMapping", + "type": "java.lang.String", + "description": "Description for like.swagger.pathMapping." + } + ] +} \ No newline at end of file diff --git a/yj-admin/src/main/resources/application-dev-example.yml b/yj-admin/src/main/resources/application-dev-example.yml new file mode 100644 index 0000000..dc0c920 --- /dev/null +++ b/yj-admin/src/main/resources/application-dev-example.yml @@ -0,0 +1,27 @@ +# 项目配置 +like: + upload-directory: /www/uploads/likeadmin-java/ # 上传目录 + unique-identification: WHsAs2rtaav7hor8LdGy #密码盐 + +# 框架配置 +spring: + jackson: + property-naming-strategy: SNAKE_CASE #下划线返回值和获取值 + # 数据源配置 + datasource: + url: jdbc:mysql://localhost:3306/【库名称】?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false + type: com.zaxxer.hikari.HikariDataSource # 数据源类型 + driver-class-name: com.mysql.jdbc.Driver # MySql的驱动 + username: root # 数据库账号 + password: root # 数据库密码 + # Redis配置 + redis: + host: localhost # Redis服务地址 + port: 6379 # Redis端口 + password: # Redis密码 + database: 0 # 数据库索引 + +# Mybatis-plus配置 【是否开启SQL日志输出】 +#mybatis-plus: +# configuration: +# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl \ No newline at end of file diff --git a/yj-admin/src/main/resources/application.yml b/yj-admin/src/main/resources/application.yml new file mode 100644 index 0000000..31959e0 --- /dev/null +++ b/yj-admin/src/main/resources/application.yml @@ -0,0 +1,91 @@ +# 项目配置 +like: + upload-directory: /www/uploads/likeadmin-java/ # 上传目录 + # 验证码配置 + captcha: + # 是否开启验证码 + status: true + # 验证码有效时长 + expire: 120 + # 验证码缓存键名 + token: "captcha:key:" + # Swagger配置 + swagger: + # 是否开启swagger + enabled: true + # 请求前缀 + pathMapping: /dev-api + +# 服务配置 +server: + port: 8082 + servlet: + context-path: / + +# 框架配置 +spring: + profiles: + active: dev + mvc: + static-path-pattern: /adminapi/static/** + throw-exception-if-no-handler-found: true + pathmatch: + matching-strategy: ant_path_matcher + # 数据源配置 + datasource: + url: jdbc:mysql://localhost:3306/likeadmin?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false + type: com.zaxxer.hikari.HikariDataSource # 数据源类型 + driver-class-name: com.mysql.jdbc.Driver # MySql的驱动 + username: root # 数据库账号 + password: root # 数据库密码 + hikari: + connection-timeout: 30000 # 等待连接分配连接的最大时长(毫秒),超出时长还没可用连接则发送SQLException,默认30秒 + minimum-idle: 5 # 最小连接数 + maximum-pool-size: 20 # 最大连接数 + auto-commit: true # 自动提交 + idle-timeout: 600000 # 连接超时的最大时长(毫秒),超时则被释放(retired),默认10分钟 + pool-name: DateSourceHikariCP # 连接池名称 + max-lifetime: 1800000 # 连接的生命时长(毫秒),超时而且没被使用则被释放,默认30分钟(1800000ms) + connection-init-sql: SELECT 1 # 连接时发起SQL测试脚本 + # 限制配置 + servlet: + multipart: + max-file-size: 100MB # 文件上传大小限制 + max-request-size: 100MB # 文件最大请求限制 + enabled: true + # Redis配置 + redis: + host: localhost # Redis服务地址 + port: 6379 # Redis端口 + password: # Redis密码 + database: 0 # 数据库索引 + timeout: 5000 # 连接超时 + lettuce: + pool: + max-wait: 30000 # 连接池最大阻塞等待时间(使用负数表示没有限制,默认-1) + max-active: 100 # 连接池最大连接数(使用负数表示没有限制,默认8) + max-idle: 20 # 连接池中的最大空闲连接(默认8) + min-idle: 0 # 连接池中的最小空闲连接(默认0) + main: + allow-circular-references: true +# Mybatis-plus配置 +mybatis-plus: + mapper-locations: classpath*:/mapper/**Mapper.xml + typeAliasesPackage: com.yj.**.mapper + global-config: + banner: false + db-config: + table-prefix: yj_ + configuration-properties: + prefix: yj_ + +# Sa-token配置 +sa-token: + token-name: token # token的名称 + timeout: 2592000 # token有效期单位s(默认30天,-1代表永不过期) + activity-timeout: -1 # token临时有效期(指定时间无操作掉线) + is-concurrent: true # 是否允许同一账号并发登录 + is-share: false # 多人同登账号共用token + token-style: random-64 # token生成的风格 + is-print: false # 打印版本字符画 + is-log: false # 是否输出操作日志 \ No newline at end of file diff --git a/yj-admin/src/main/resources/banner.txt b/yj-admin/src/main/resources/banner.txt new file mode 100644 index 0000000..e6c8979 --- /dev/null +++ b/yj-admin/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +/////////////////////////////////////////////////////// +// _ _ _ _ _ _ // +// | | (_) | __ / \ __| |_ __ ___ (_)_ __ // +// | | | | |/ / / _ \ / _` | '_ ` _ \| | '_ \ // +// | |___| | < / ___ \ (_| | | | | | | | | | | // +// |_____|_|_|\_\/_/ \_\__,_|_| |_| |_|_|_| |_| // +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // +// 佛祖保佑 永不宕机 永无BUG // +////////////////////////////////////////////////////// \ No newline at end of file diff --git a/yj-admin/src/main/resources/log4j2-spring.xml b/yj-admin/src/main/resources/log4j2-spring.xml new file mode 100644 index 0000000..de5a9a7 --- /dev/null +++ b/yj-admin/src/main/resources/log4j2-spring.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/yj-common/pom.xml b/yj-common/pom.xml new file mode 100644 index 0000000..a45fd5e --- /dev/null +++ b/yj-common/pom.xml @@ -0,0 +1,230 @@ + + + + + + org.yj + yunjiao-server + 1.0.0 + + + + 4.0.0 + yj-common + yj-common + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.10.0 + + 1.8 + 1.8 + + + + + + + + + + org.springframework.boot + spring-boot-autoconfigure + + + + + org.springframework.boot + spring-boot-configuration-processor + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-logging + + + + + + + org.springframework.boot + spring-boot-starter-log4j2 + + + + + org.springframework.boot + spring-boot-starter-aop + + + + + org.springframework.boot + spring-boot-starter-validation + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + mysql + mysql-connector-java + + + + + com.baomidou + mybatis-plus-boot-starter + + + + + com.github.yulichang + mybatis-plus-join + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + + + + + org.apache.commons + commons-pool2 + + + + + org.projectlombok + lombok + + + + + com.alibaba.fastjson2 + fastjson2 + + + com.squareup.okhttp3 + okhttp + 4.9.3 + + + com.alipay.sdk + alipay-sdk-java + 4.39.246.ALL + + + com.squareup.okhttp3 + okhttp + + + + + + com.google.code.gson + gson + + + + + nl.bitwalker + UserAgentUtils + + + + + org.apache.commons + commons-lang3 + + + + + commons-io + commons-io + + + + + com.qiniu + qiniu-java-sdk + + + + + com.qcloud + cos_api + + + + + com.aliyun.oss + aliyun-sdk-oss + + + + + com.tencentcloudapi + tencentcloud-sdk-java + + + + + com.aliyun + aliyun-java-sdk-core + + + + + com.alibaba + easyexcel + + + + + com.github.oshi + oshi-core + + + + + io.springfox + springfox-boot-starter + + + + + com.github.binarywang + weixin-java-miniapp + + + + + com.github.binarywang + weixin-java-mp + + + + + com.github.binarywang + weixin-java-pay + + + + + \ No newline at end of file diff --git a/yj-common/src/main/java/com/yj/common/aop/NotLogin.java b/yj-common/src/main/java/com/yj/common/aop/NotLogin.java new file mode 100644 index 0000000..03833b9 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/aop/NotLogin.java @@ -0,0 +1,13 @@ +package com.yj.common.aop; + +import java.lang.annotation.*; + +/** + * 免登录校验注解类 + * PS: 改注解无需实现类,由拦截器监听 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface NotLogin { +} diff --git a/yj-common/src/main/java/com/yj/common/aop/NotPower.java b/yj-common/src/main/java/com/yj/common/aop/NotPower.java new file mode 100644 index 0000000..be1bde4 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/aop/NotPower.java @@ -0,0 +1,13 @@ +package com.yj.common.aop; + +import java.lang.annotation.*; + +/** + * 免权限校验注解类 + * PS: 改注解无需实现类,由拦截器监听 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface NotPower { +} diff --git a/yj-common/src/main/java/com/yj/common/cache/ConfigCache.java b/yj-common/src/main/java/com/yj/common/cache/ConfigCache.java new file mode 100644 index 0000000..f8d0eb1 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/cache/ConfigCache.java @@ -0,0 +1,113 @@ +package com.yj.common.cache; + +import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.common.entity.Config; +import com.yj.common.mapper.ConfigMapper; +import com.yj.common.util.*; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 系统配置缓存 + */ +public class ConfigCache { + + private static final String cacheKey = "config"; + + /** + * 设置缓存配置 + */ + public static void set() { + ConfigMapper model = SpringUtils.getBean(ConfigMapper.class); + // 查询全部配置项,设置缓存 + List configs = model.selectList( + new QueryWrapper() + .select("id", "type", "name", "value") + ); + List typeList = configs.stream().map(Config::getType) + .collect(Collectors.toList()) + .stream().distinct() + .collect(Collectors.toList()); + + Map map = new LinkedHashMap<>(); + Map subMap = new LinkedHashMap<>(); + for (String typeItem : typeList) { + subMap.clear(); + for (Config configItem : configs) { + if (configItem.getType().equals(typeItem)) { + subMap.put(configItem.getName(), configItem.getValue()); + } + } + map.put(typeItem, JSON.toJSONString(subMap)); + } + RedisUtils.set(cacheKey, JSON.toJSONString(map)); + } + + /** + * 获取配置缓存 返回字符串 + * + * @param type 类型 + * @param name 名称 + * @return String + */ + public static String get(String type, String name) { + Object configs = RedisUtils.get(cacheKey); + if (!StringUtils.isNull(configs) && !StringUtils.isEmpty(configs.toString())) { + Map configType = MapUtils.jsonToMap(configs.toString()); + if (!StringUtils.isEmpty(configType)) { + Map configData = MapUtils.jsonToMap(configType.get(type)); + if (StringUtils.isNotNull(configData)) { + return configData.get(name); + } + } + } + return null; + } + + /** + * 根据type获取配置缓存 返回map + * + * @param type 类型 + * @return Map + */ + public static Map get(String type) { + // 读取缓存 + Map cacheConfig = getConfigCache(); + if (!cacheConfig.isEmpty()) { + Object cacheConfigObj = cacheConfig.get(type); + if (cacheConfigObj != null) { + Map cacheConfigMap = MapUtils.jsonToMap(cacheConfigObj.toString()); + if (!cacheConfigMap.isEmpty()) { + return cacheConfigMap; + } + } + } + return new LinkedHashMap<>(); + } + + /** + * 获取配置 + * + * @return Map + */ + public static Map getConfigCache() { + // 获取缓存 + Object config = RedisUtils.get(cacheKey); + if (!StringUtils.isNull(config) && !StringUtils.isEmpty(config.toString())) { + return MapUtils.jsonToMapAsObj(config.toString()); + } + return new LinkedHashMap<>(); + } + + /** + * 清除缓存 + */ + public static void clear() { + RedisUtils.del(cacheKey); + } + +} diff --git a/yj-common/src/main/java/com/yj/common/config/AlipayConfig.java b/yj-common/src/main/java/com/yj/common/config/AlipayConfig.java new file mode 100644 index 0000000..3032f49 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/config/AlipayConfig.java @@ -0,0 +1,26 @@ +package com.yj.common.config; + +public class AlipayConfig +{ + + // 支付宝网关 + public static String GATEWAY_URL = "https://openapi.alipay.com/gateway.do"; + public static String GATEWAY_URL_DEBUG = "https://openapi-sandbox.dl.alipaydev.com/gateway.do"; + // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号 + public static String APP_ID = ""; + // 商户私钥,您的PKCS8格式RSA2私钥 + public static String MERCHANT_PRIVATE_KEY = ""; + // https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。 + public static String ALIPAY_PUBLIC_KEY = ""; + // 服务器异步通知页面路径 需http://格式的完整路径,由自己系统开发实现 + public static String NOTIFY_URL = ""; + + // 页面跳转同步通知页面路径 需http://格式的完整路径,由自己系统开发实现 + public static String RETURN_URL = ""; + + // 签名方式 + public static String SIGN_TYPE = "RSA2"; + + // 字符编码格式 + public static String CHARSET = "utf-8"; +} diff --git a/yj-common/src/main/java/com/yj/common/config/GlobalConfig.java b/yj-common/src/main/java/com/yj/common/config/GlobalConfig.java new file mode 100644 index 0000000..efb6620 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/config/GlobalConfig.java @@ -0,0 +1,42 @@ +package com.yj.common.config; + +/** + * 全局配置 + */ +public class GlobalConfig { + + // 开启调试模式 + public static Boolean debug = true; + + // 获取地址开关 + public static Boolean isAddressEnabled = false; + + // 当前代码版本 + public static String version = "v1.9.1"; + + // 系统加密字符 + public static String secret = "UVTIyzCy"; + + // Mysql表前缀 + public static String tablePrefix = "yj_"; + + // Redis键前缀 + public static String redisPrefix = "like:"; + + // 资源访问前缀 + public static String publicPrefix = "api/uploads"; + public static String adminPublicPrefix = "adminapi/uploads"; + + // 上传图片限制 + public static Integer uploadImageSize = 1024 * 1024 * 10; + + // 上传视频限制 + public static Integer uploadVideoSize = 1024 * 1024 * 30; + + // 上传图片扩展 + public static String[] uploadImageExt = new String[] {"png", "jpg", "jpeg", "gif", "ico", "bmp"}; + + // 上传视频扩展 + public static String[] uploadVideoExt = new String[] {"mp4", "mp3", "avi", "flv", "rmvb", "mov"}; + +} diff --git a/yj-common/src/main/java/com/yj/common/config/ProjectConfig.java b/yj-common/src/main/java/com/yj/common/config/ProjectConfig.java new file mode 100644 index 0000000..e4056bb --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/config/ProjectConfig.java @@ -0,0 +1,15 @@ +package com.yj.common.config; + +import java.util.HashMap; +import java.util.Map; + +/** + * 全局配置 + */ +public class ProjectConfig { + // 列表页 + public static Map lists = new HashMap(){{ + put("pageSizeMax", 25000); + put("pageSize", 25); + }}; +} diff --git a/yj-common/src/main/java/com/yj/common/config/RedisConfig.java b/yj-common/src/main/java/com/yj/common/config/RedisConfig.java new file mode 100644 index 0000000..30396b9 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/config/RedisConfig.java @@ -0,0 +1,31 @@ +package com.yj.common.config; + +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.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +/** + * Redis配置 + */ +@Configuration +public class RedisConfig { + + @Bean(name = "redisTemplate") + public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){ + RedisTemplate redisTemplate = new RedisTemplate<>(); + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + GenericJackson2JsonRedisSerializer JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); + + redisTemplate.setConnectionFactory(redisConnectionFactory); + redisTemplate.setValueSerializer(JsonRedisSerializer); + redisTemplate.setKeySerializer(stringRedisSerializer); + redisTemplate.setHashKeySerializer(stringRedisSerializer); + redisTemplate.setHashValueSerializer(JsonRedisSerializer); + + return redisTemplate; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/config/ThreadPoolConfig.java b/yj-common/src/main/java/com/yj/common/config/ThreadPoolConfig.java new file mode 100644 index 0000000..ebbf5d4 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/config/ThreadPoolConfig.java @@ -0,0 +1,38 @@ +package com.yj.common.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; + +/** + * 异步线程池配置 + */ +@Configuration +@EnableAsync +public class ThreadPoolConfig { + + @Bean("taskExecutor") + public Executor asyncServiceExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + // 设置核心线程数 + executor.setCorePoolSize(5); + // 设置最大线程数 + executor.setMaxPoolSize(20); + // 配置队列大小 + executor.setQueueCapacity(Integer.MAX_VALUE); + // 设置线程活跃时间(秒) + executor.setKeepAliveSeconds(60); + // 设置默认线程名称 + executor.setThreadNamePrefix("LIKE"); + // 等待所有任务结束后再关闭线程 + executor.setWaitForTasksToCompleteOnShutdown(true); + // 执行初始化 + executor.initialize(); + // 返回构建对象 + return executor; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/config/wechat/WxMnpConfiguration.java b/yj-common/src/main/java/com/yj/common/config/wechat/WxMnpConfiguration.java new file mode 100644 index 0000000..56a6ffe --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/config/wechat/WxMnpConfiguration.java @@ -0,0 +1,98 @@ +package com.yj.common.config.wechat; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; +import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.github.binarywang.wxpay.service.WxPayService; +import com.yj.common.entity.Config; +import com.yj.common.mapper.ConfigMapper; +import lombok.AllArgsConstructor; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; +import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.Resource; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * @author panweiliang + */ +@Configuration +@ConditionalOnClass(WxPayService.class) +@AllArgsConstructor +public class WxMnpConfiguration { + + @Resource + private final ConfigMapper systemConfigMapper; + + /** + * 微信小程序配置 + * + * @author fzr + * @return WxMaService + */ + @Bean + @ConditionalOnMissingBean + public WxMaService wxMnpService() { + Map config = this.getChannelConfig("mnp_setting"); + + WxMaDefaultConfigImpl wxConfig = new WxMaDefaultConfigImpl(); + wxConfig.setAppid(config.getOrDefault("app_id", "")); + wxConfig.setSecret(config.getOrDefault("app_secret", "")); + + WxMaService wxService = new WxMaServiceImpl(); + wxService.setWxMaConfig(wxConfig); + return wxService; + } + + /** + * 微信公众号配置 + * + * @author zr + * @return WxMpService + */ + @Bean + @ConditionalOnMissingBean + public WxMpService wxOaService() { + Map config = this.getChannelConfig("oa_setting"); + + WxMpDefaultConfigImpl wxMpDefaultConfig = new WxMpDefaultConfigImpl(); + wxMpDefaultConfig.setAppId(config.getOrDefault("app_id", "").trim()); + wxMpDefaultConfig.setSecret(config.getOrDefault("app_secret", "").trim()); + wxMpDefaultConfig.setToken(config.getOrDefault("token", "").trim()); + wxMpDefaultConfig.setAesKey(config.getOrDefault("encoding_aes_key", "").trim()); + + WxMpService wxService = new WxMpServiceImpl(); + wxService.setWxMpConfigStorage(wxMpDefaultConfig); + return wxService; + } + + /** + * 配置读取 + * + * @author fzr + * @param type 类型 + * @return Map + */ + private Map getChannelConfig(String type) { + List configs = systemConfigMapper.selectList( + new QueryWrapper() + .select("id", "type", "name", "value") + .eq("type", type)); + + Map map = new LinkedHashMap<>(); + for (Config config : configs) { + map.put(config.getName(), config.getValue()); + } + + return map; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/config/wechat/WxPayConfiguration.java b/yj-common/src/main/java/com/yj/common/config/wechat/WxPayConfiguration.java new file mode 100644 index 0000000..4106393 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/config/wechat/WxPayConfiguration.java @@ -0,0 +1,112 @@ +package com.yj.common.config.wechat; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.github.binarywang.wxpay.config.WxPayConfig; +import com.github.binarywang.wxpay.service.WxPayService; +import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; +import com.yj.common.entity.setting.DevPayConfig; +import com.yj.common.entity.Config; +import com.yj.common.enums.PaymentEnum; +import com.yj.common.mapper.setting.DevPayConfigMapper; +import com.yj.common.mapper.ConfigMapper; +import com.yj.common.util.MapUtils; +import com.yj.common.util.StringUtils; +import lombok.AllArgsConstructor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.Resource; +import java.util.Map; + +@Configuration +@ConditionalOnClass(WxPayService.class) +@AllArgsConstructor +public class WxPayConfiguration { + + @Resource + DevPayConfigMapper devPayConfigMapper; + + @Resource + ConfigMapper systemConfigMapper; + + /** + * 微信小程序支付配置 + * + * @author fzr + * @return WxPayService + */ + @Bean + @ConditionalOnMissingBean + public WxPayService mnpPayService() { + DevPayConfig config = devPayConfigMapper.selectOne( + new QueryWrapper() + .eq("pay_way", PaymentEnum.WX_PAY.getCode()) + .last("limit 1")); + + Config systemConfig = systemConfigMapper.selectOne(new QueryWrapper() + .eq("type", "mnp_setting") + .eq("name", "app_id") + .last("limit 1")); + + String paramJson = StringUtils.isNull(config.getConfig()) ? "{}" : config.getConfig().toString(); + Map params = MapUtils.jsonToMap(paramJson); + String appId = StringUtils.isNull(systemConfig) ? "" : systemConfig.getValue(); + String mchId = params.getOrDefault("mch_id", ""); + String paySignKey = params.getOrDefault("pay_sign_key", ""); + byte[] privateKey = params.getOrDefault("private_key", "").getBytes(); + byte[] privateCert = params.getOrDefault("private_cert", "").getBytes(); + + WxPayConfig payConfig = new WxPayConfig(); + payConfig.setAppId(appId); + payConfig.setMchId(mchId); + payConfig.setApiV3Key(paySignKey); + payConfig.setPrivateKeyContent(privateKey); + payConfig.setPrivateCertContent(privateCert); + payConfig.setUseSandboxEnv(false); + WxPayService wxPayService = new WxPayServiceImpl(); + wxPayService.setConfig(payConfig); + return wxPayService; + } + + /** + * 微信公众号支付配置 + * + * @author fzr + * @return WxPayService + */ + @Bean + @ConditionalOnMissingBean + public WxPayService wxOaService() { + DevPayConfig config = devPayConfigMapper.selectOne( + new QueryWrapper() + .eq("pay_way", PaymentEnum.WX_PAY.getCode()) + .last("limit 1")); + + Config systemConfig = systemConfigMapper.selectOne(new QueryWrapper() + .eq("name", "app_id") + .eq("type", "oa_setting") + .last("limit 1")); + + String paramJson = StringUtils.isNull(config.getConfig()) ? "{}" : config.getConfig().toString(); + Map params = MapUtils.jsonToMap(paramJson); + String appId = StringUtils.isNull(systemConfig) ? "" : systemConfig.getValue(); + String mchId = params.getOrDefault("mch_id", ""); + String paySignKey = params.getOrDefault("pay_sign_key", ""); + byte[] privateKey = params.getOrDefault("private_key", "").getBytes(); + byte[] privateCert = params.getOrDefault("private_cert", "").getBytes(); + + WxPayConfig payConfig = new WxPayConfig(); + payConfig.setMchId(mchId); + payConfig.setAppId(appId); + payConfig.setApiV3Key(paySignKey); + payConfig.setPrivateKeyContent(privateKey); + payConfig.setPrivateCertContent(privateCert); + payConfig.setUseSandboxEnv(false); + WxPayService wxPayService = new WxPayServiceImpl(); + wxPayService.setConfig(payConfig); + return wxPayService; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/core/AjaxResult.java b/yj-common/src/main/java/com/yj/common/core/AjaxResult.java new file mode 100644 index 0000000..1a3dd2b --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/core/AjaxResult.java @@ -0,0 +1,218 @@ +package com.yj.common.core; + +import com.yj.common.enums.ErrorEnum; +import lombok.Data; + +import java.util.ArrayList; + +@Data +public class AjaxResult { + + /** 状态码 **/ + private Integer code; + + /** 提示信息 **/ + private String msg; + + /** 响应数据 **/ + private T data; + + /** 是否显示错误信息 **/ + private Integer show; + + /** 无参构造 **/ + protected AjaxResult() {} + + /** + * 带参构造 + * + * @author fzr + * @param code 状态码 + * @param msg 提示信息 + * @param data 响应数据 + */ + public AjaxResult(Integer code, String msg, T data, Integer show) { + this.code = code; + this.msg = msg; + this.data = data; + this.show = show; + } + + /** + * 成功返回结果 + * + * @author fzr + * @return AjaxResult + */ + public static AjaxResult success() { + return new AjaxResult<>(ErrorEnum.SUCCESS.getCode(), ErrorEnum.SUCCESS.getMsg(), new ArrayList<>(), ErrorEnum.SHOW_MSG.getCode()); + } + + /** + * 成功返回结果 + * + * @author fzr + * @param code 状态码 + * @return AjaxResult + */ + public static AjaxResult success(Integer code) { + return new AjaxResult<>(code, ErrorEnum.SUCCESS.getMsg(), new ArrayList<>(), ErrorEnum.SHOW_MSG.getCode()); + } + + /** + * 成功返回结果 + * + * @author fzr + * @param msg 提示信息 + * @return AjaxResult + */ + public static AjaxResult success(String msg) { + return new AjaxResult<>(ErrorEnum.SUCCESS.getCode(), msg, new ArrayList<>(), ErrorEnum.SHOW_MSG.getCode()); + } + + /** + * 成功返回结果 + * + * @author fzr + * @param msg 提示信息 + * @return AjaxResult + */ + public static AjaxResult success(String msg, Integer show) { + return new AjaxResult<>(ErrorEnum.SUCCESS.getCode(), msg, new ArrayList<>(), show); + } + + /** + * 成功返回结果 + * + * @author fzr + * @param data 响应数据 + * @return AjaxResult + */ + public static AjaxResult success(T data) { + return new AjaxResult<>(ErrorEnum.SUCCESS.getCode(), ErrorEnum.SUCCESS.getMsg(), data, ErrorEnum.HIDE_MSG.getCode()); + } + + /** + * 成功返回结果 + * + * @author fzr + * @param code 状态码 + * @param msg 提示信息 + * @return AjaxResult + */ + public static AjaxResult success(Integer code, String msg) { + return new AjaxResult<>(code, msg, new ArrayList<>(), ErrorEnum.SHOW_MSG.getCode()); + } + + /** + * 成功返回结果 + * + * @author fzr + * @param code 状态码 + * @param msg 提示信息 + * @return AjaxResult + */ + public static AjaxResult success(Integer code, String msg, Integer show) { + return new AjaxResult<>(code, msg, new ArrayList<>(), show); + } + + public static AjaxResult success(Integer code, T data, Integer show) { + return new AjaxResult<>(code, ErrorEnum.SUCCESS.getMsg(), data, show); + } + + /** + * 成功返回结果 + * + * @author fzr + * @param msg 提示信息 + * @param data 响应数据 + * @return AjaxResult + */ + public static AjaxResult success(String msg, T data) { + return new AjaxResult<>(ErrorEnum.SUCCESS.getCode(), msg, data, ErrorEnum.SHOW_MSG.getCode()); + } + + /** + * 成功返回结果 + * + * @author fzr + * @param code 状态码 + * @param msg 提示信息 + * @param data 响应数据 + * @return AjaxResult + */ + public static AjaxResult success(Integer code, String msg, T data) { + return new AjaxResult<>(code, msg, data, ErrorEnum.SHOW_MSG.getCode()); + } + + /** + * 响应失败结果 + * + * @author fzr + * @param code 状态码 + * @return AjaxResult + */ + public static AjaxResult failed(Integer code) { + return new AjaxResult<>(code, ErrorEnum.FAILED.getMsg(), new ArrayList<>(), ErrorEnum.SHOW_MSG.getCode()); + } + + /** + * 响应失败结果 + * + * @author fzr + * @param msg 提示信息 + * @return AjaxResult + */ + public static AjaxResult failed(String msg) { + return new AjaxResult<>(ErrorEnum.FAILED.getCode(), msg, new ArrayList<>(), ErrorEnum.SHOW_MSG.getCode()); + } + + /** + * 响应失败结果 + * + * @author fzr + * @param data 响应数据 + * @return AjaxResult + */ + public static AjaxResult failed(T data) { + return new AjaxResult(ErrorEnum.FAILED.getCode(), ErrorEnum.FAILED.getMsg(), data, ErrorEnum.SHOW_MSG.getCode()); + } + + /** + * 响应失败结果 + * + * @author fzr + * @param code 状态码 + * @param msg 提示信息 + * @return AjaxResult + */ + public static AjaxResult failed(Integer code, String msg) { + return new AjaxResult<>(code, msg, new ArrayList<>(), ErrorEnum.SHOW_MSG.getCode()); + } + + /** + * 响应失败结果 + * + * @author fzr + * @param code 状态码 + * @param msg 提示信息 + * @param data 响应数据 + * @return AjaxResult + */ + public static AjaxResult failed(Integer code, String msg, T data) { + return new AjaxResult<>(code, msg, data, ErrorEnum.SHOW_MSG.getCode()); + } + + /** + * 响应失败结果 + * + * @author fzr + * @param code 状态码 + * @param msg 提示信息 + * @param data 响应数据 + * @return AjaxResult + */ + public static AjaxResult failed(Integer code, String msg, T data, Integer show) { + return new AjaxResult<>(code, msg, data, show); + } +} diff --git a/yj-common/src/main/java/com/yj/common/core/PageResult.java b/yj-common/src/main/java/com/yj/common/core/PageResult.java new file mode 100644 index 0000000..a1ee706 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/core/PageResult.java @@ -0,0 +1,122 @@ +package com.yj.common.core; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.github.pagehelper.PageInfo; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class PageResult { + + /** 总记录数 **/ + private Long count; + + /** 当前页码 **/ + private Integer page_no; + + /** 每页条数 **/ + private Integer page_size; + + /** 扩展字段 **/ + private Map extend; + + /** 数据列表 **/ + private List lists; + + /** + * PageHelper分页 + * + * @author fzr + * @param list (分页数据集) + * @param (泛型) + * @return PageList + */ + public static PageResult pageHelper(List list) { + PageResult pageResult = new PageResult<>(); + PageInfo pageInfo = new PageInfo<>(list); + pageResult.setCount(pageInfo.getTotal()); + pageResult.setPage_no(pageInfo.getPageNum()); + pageResult.setPage_size(pageInfo.getPageSize()); + pageResult.setLists(pageInfo.getList()); + return pageResult; + } + + /** + * PageHelper分页(数据额外处理) + * + * @author fzr + * @param list (分页数据集) + * @param (泛型) + * @return PageList + */ + public static PageResult pageHelper(List list, List data) { + PageResult pageResult = new PageResult<>(); + PageInfo pageInfo = new PageInfo<>(list); + pageResult.setCount(pageInfo.getTotal()); + pageResult.setPage_no(pageInfo.getPageSize()); + pageResult.setPage_size(pageInfo.getPageNum()); + pageResult.setLists(data); + return pageResult; + } + + /** + * MyBatisPlus分页 + * + * @author fzr + * @param iPage (分页) + * @param (泛型) + * @return PageList + */ + public static PageResult iPageHandle(IPage iPage) { + PageResult pageResult = new PageResult<>(); + pageResult.setCount(iPage.getTotal()); + pageResult.setPage_no((int) iPage.getCurrent()); + pageResult.setPage_size((int) iPage.getSize()); + pageResult.setLists(iPage.getRecords()); + return pageResult; + } + + /** + * MyBatisPlus分页(数据额外处理) + * + * @author fzr + * @param total (总条数) + * @param pageNo (当前页码) + * @param size (每页条数) + * @param list (列表数据) + * @param (泛型) + * @return PageList + */ + public static PageResult iPageHandle(Long total, Long pageNo, Long size, List list) { + PageResult pageResult = new PageResult<>(); + pageResult.setCount(total); + pageResult.setPage_no(Math.toIntExact(pageNo)); + pageResult.setPage_size(Math.toIntExact(size)); + pageResult.setLists(list); + return pageResult; + } + + /** + * MyBatisPlus分页(数据额外处理) + * + * @param total (总条数) + * @param pageNo (当前页码) + * @param size (每页条数) + * @param list (列表数据) + * @param extend (扩展字段) + * @param (泛型) + * @return PageResult + */ + public static PageResult iPageHandle(Long total, Long pageNo, Long size, List list, Map extend) { + PageResult pageResult = new PageResult<>(); + pageResult.setCount(total); + pageResult.setPage_no(Math.toIntExact(pageNo)); + pageResult.setPage_size(Math.toIntExact(size)); + pageResult.setLists(list); + pageResult.setExtend(extend); + return pageResult; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/core/ServerResult.java b/yj-common/src/main/java/com/yj/common/core/ServerResult.java new file mode 100644 index 0000000..ae5aaf2 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/core/ServerResult.java @@ -0,0 +1,169 @@ +package com.yj.common.core; + +import com.yj.common.entity.server.*; +import com.yj.common.util.ArithUtils; +import com.yj.common.util.IpUtils; +import com.yj.common.util.TimeUtils; +import oshi.SystemInfo; +import oshi.hardware.CentralProcessor; +import oshi.hardware.CentralProcessor.TickType; +import oshi.hardware.GlobalMemory; +import oshi.hardware.HardwareAbstractionLayer; +import oshi.software.os.FileSystem; +import oshi.software.os.OSFileStore; +import oshi.software.os.OperatingSystem; +import oshi.util.Util; + +import java.lang.management.ManagementFactory; +import java.text.SimpleDateFormat; +import java.util.*; + + +/** + * 服务器相关信息 + */ +public class ServerResult { + + private static final int OSHI_WAIT_SECOND = 1000; + private final Cpu cpu = new Cpu(); // CPU相关信息 + private final Mem mem = new Mem(); // 內存相关信息 + private final Jvm jvm = new Jvm(); // JVM相关信息 + private final Sys sys = new Sys(); // 服务器相关信息 + private final List disk = new LinkedList<>(); // 磁盘相关信息 + + /** + * 拷贝数据 + */ + public Map copyTo() { + SystemInfo si = new SystemInfo(); + HardwareAbstractionLayer hal = si.getHardware(); + setCpuInfo(hal.getProcessor()); + setMemInfo(hal.getMemory()); + setSysInfo(); + setJvmInfo(); + setSysFiles(si.getOperatingSystem()); + + Map map = new LinkedHashMap<>(); + map.put("cpu", this.cpu); + map.put("mem", this.mem); + map.put("sys", this.sys); + map.put("disk", this.disk); + map.put("jvm", this.jvm); + return map; + } + + /** + * 设置CPU信息 + */ + private void setCpuInfo(CentralProcessor processor) { + long[] prevTicks = processor.getSystemCpuLoadTicks(); + Util.sleep(OSHI_WAIT_SECOND); + long[] ticks = processor.getSystemCpuLoadTicks(); + long nice = ticks[TickType.NICE.getIndex()] - prevTicks[TickType.NICE.getIndex()]; + long irq = ticks[TickType.IRQ.getIndex()] - prevTicks[TickType.IRQ.getIndex()]; + long softer = ticks[TickType.SOFTIRQ.getIndex()] - prevTicks[TickType.SOFTIRQ.getIndex()]; + long steal = ticks[TickType.STEAL.getIndex()] - prevTicks[TickType.STEAL.getIndex()]; + long cSys = ticks[TickType.SYSTEM.getIndex()] - prevTicks[TickType.SYSTEM.getIndex()]; + long user = ticks[TickType.USER.getIndex()] - prevTicks[TickType.USER.getIndex()]; + long ioWait = ticks[TickType.IOWAIT.getIndex()] - prevTicks[TickType.IOWAIT.getIndex()]; + long idle = ticks[TickType.IDLE.getIndex()] - prevTicks[TickType.IDLE.getIndex()]; + long totalCpu = user + nice + cSys + idle + ioWait + irq + softer + steal; + cpu.setCpuNum(processor.getLogicalProcessorCount()); + cpu.setTotal(ArithUtils.round(ArithUtils.mul(totalCpu, 100), 2)); + cpu.setSys(ArithUtils.round(ArithUtils.mul(cSys / cpu.getTotal(), 100), 2)); + cpu.setUsed(ArithUtils.round(ArithUtils.mul(user / cpu.getTotal(), 100), 2)); + cpu.setWait(ArithUtils.round(ArithUtils.mul(ioWait / cpu.getTotal(), 100), 2)); + cpu.setFree( ArithUtils.round(ArithUtils.mul(idle / cpu.getTotal(), 100), 2)); + } + + /** + * 设置内存信息 + */ + private void setMemInfo(GlobalMemory memory) { + int number = (1024 * 1024 * 1024); + mem.setTotal(ArithUtils.div(memory.getTotal(), number, 2)); + mem.setUsed(ArithUtils.div(memory.getTotal() - memory.getAvailable(), number, 2)); + mem.setFree(ArithUtils.div(memory.getAvailable(), number, 2)); + mem.setUsage(ArithUtils.mul(ArithUtils.div(mem.getUsed(), memory.getTotal(), 4), 100)); + } + + /** + * 设置服务器信息 + */ + private void setSysInfo() { + Properties props = System.getProperties(); + sys.setComputerName(IpUtils.getHostName()); + sys.setComputerIp(IpUtils.getHostIp()); + sys.setOsName(props.getProperty("os.name")); + sys.setOsArch(props.getProperty("os.arch")); + sys.setUserDir(props.getProperty("user.dir")); + } + + /** + * 设置Java虚拟机 + */ + private void setJvmInfo() { + Properties props = System.getProperties(); + jvm.setTotal(ArithUtils.div(Runtime.getRuntime().totalMemory(), (1024 * 1024), 2)); + jvm.setMax(ArithUtils.div(Runtime.getRuntime().maxMemory(), (1024 * 1024), 2)); + jvm.setFree(ArithUtils.div(Runtime.getRuntime().freeMemory(), (1024 * 1024), 2)); + jvm.setUsage(ArithUtils.mul(ArithUtils.div(jvm.getTotal() - jvm.getFree(), jvm.getTotal(), 4), 100)); + jvm.setVersion(props.getProperty("java.version")); + jvm.setHome(props.getProperty("java.home")); + jvm.setName(ManagementFactory.getRuntimeMXBean().getVmName()); + jvm.setInputArgs(ManagementFactory.getRuntimeMXBean().getInputArguments().toString()); + jvm.setRunTime(TimeUtils.datePoor(TimeUtils.nowDate(), TimeUtils.serverStartDate())); + jvm.setStartTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(TimeUtils.serverStartDate())); + } + + /** + * 设置磁盘信息 + */ + private void setSysFiles(OperatingSystem os) { + FileSystem fileSystem = os.getFileSystem(); + List fsArray = fileSystem.getFileStores(); + for (OSFileStore fs : fsArray) + { + long free = fs.getUsableSpace(); + long total = fs.getTotalSpace(); + long used = total - free; + Disk sysFile = new Disk(); + sysFile.setDirName(fs.getMount()); + sysFile.setSysTypeName(fs.getType()); + sysFile.setTypeName(fs.getName()); + sysFile.setTotal(convertFileSize(total)); + sysFile.setFree(convertFileSize(free)); + sysFile.setUsed(convertFileSize(used)); + sysFile.setUsage(ArithUtils.mul(ArithUtils.div(used, total, 4), 100)); + disk.add(sysFile); + } + } + + /** + * 字节转换 + */ + public String convertFileSize(long size) { + long kb = 1024; + long mb = kb * 1024; + long gb = mb * 1024; + if (size >= gb) + { + return String.format("%.1f GB", (float) size / gb); + } + else if (size >= mb) + { + float f = (float) size / mb; + return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f); + } + else if (size >= kb) + { + float f = (float) size / kb; + return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f); + } + else + { + return String.format("%d B", size); + } + } + +} diff --git a/yj-common/src/main/java/com/yj/common/core/basics/IBaseMapper.java b/yj-common/src/main/java/com/yj/common/core/basics/IBaseMapper.java new file mode 100644 index 0000000..58aa530 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/core/basics/IBaseMapper.java @@ -0,0 +1,317 @@ +package com.yj.common.core.basics; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.github.yulichang.base.MPJBaseMapper; +import com.github.yulichang.query.MPJQueryWrapper; +import com.google.gson.reflect.TypeToken; +import com.yj.common.util.TimeUtils; +import org.apache.ibatis.annotations.Mapper; + +import java.lang.reflect.Type; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + + +/** + * 基类Mapper + * @param + */ +@Mapper +public interface IBaseMapper extends MPJBaseMapper { + + /** + * 求和聚合 + * + * @param field 字段名 + * @param queryWrapper 条件构造器 + * @return Long + */ + default BigDecimal sum(String field, QueryWrapper queryWrapper) { + queryWrapper.select("IFNULL(sum("+field+"), 0) as totalValue"); + List objects = this.selectObjs(queryWrapper); + if (objects.size() > 0) { + return (BigDecimal) objects.get(0); + } + return new BigDecimal(0); + } + + /** + * 设置搜索条件 + * + * @author fzr + * @param queryWrapper 条件构造器 + * @param param 参数[条件:键@数据库字段:类型] + * @param conditions 条件[ new String[]{"like:username:str", "=:role:int"} ] + */ + default void setSearch(MPJQueryWrapper queryWrapper, Object param, String[] conditions) { + Type types = new TypeToken>() {}.getType(); + Map params = JSON.parseObject(JSONObject.toJSONString(param), types); + + for (String condition : conditions) { + String[] array = condition.split(":"); + String type = array.length > 2 ? array[2].trim() : ""; + String[] keyArr = array[1].trim().split("@"); + String where = array[0].trim(); + String key = keyArr[0].trim(); + String value = params.getOrDefault(key, ""); + String field = keyArr.length > 1 ? keyArr[1].trim() : keyArr[0].trim(); + + if (!where.equals("datetime") && (value == null || value.equals(""))) { + continue; + } + + if ((!type.equals("") && !Arrays.asList("long", "str", "int").contains(type))) { + System.out.println("搜索参数类型不在固定值内[int,long,str]"); + continue; + } + + Object val = value; + switch (where) { + case "=": + case "<>": + case ">=": + case ">": + case "<=": + case "<": + if (type.equals("int")) { + val = Integer.parseInt(value); + } else if (type.equals("long")) { + val = Long.parseLong(value); + } + break; + case "notIn": + case "in": + if (type.equals("long")){ + List longData = new ArrayList<>(); + for (String v : value.split(",")) { + longData.add(Long.parseLong(v.trim())); + } + val = longData; + } else if (type.equals("int")) { + List intData = new ArrayList<>(); + for (String v : value.split(",")) { + intData.add(Integer.parseInt(v.trim())); + } + val = intData; + } + break; + } + + switch (where) { + case "<>": + queryWrapper.ne(field, val); + break; + case "=": + queryWrapper.eq(field, val); + break; + case ">": + queryWrapper.gt(field, val); + break; + case ">=": + queryWrapper.ge(field, val); + break; + case "<": + queryWrapper.lt(field, val); + break; + case "<=": + queryWrapper.le(field, val); + break; + case "between": + String[] betArr = value.split(","); + if (!type.equals("") && type.equals("int")) { + queryWrapper.between(field, Integer.parseInt(betArr[0]), Integer.parseInt(betArr[1])); + } else if (type.equals("long")){ + queryWrapper.between(field, Long.parseLong(betArr[0]), Long.parseLong(betArr[1])); + } else { + queryWrapper.between(field, betArr[0], betArr[1]); + } + break; + case "notBetween": + String[] notBetArr = value.split(","); + if (!type.equals("") && type.equals("int")) { + queryWrapper.notBetween(field, Integer.parseInt(notBetArr[0]), Integer.parseInt(notBetArr[1])); + } else if (type.equals("long")){ + queryWrapper.notBetween(field, Long.parseLong(notBetArr[0]), Long.parseLong(notBetArr[1])); + } else { + queryWrapper.notBetween(field, notBetArr[0], notBetArr[1]); + } + break; + case "like": + queryWrapper.like(field, val); + break; + case "notLike": + queryWrapper.notLike(field, val); + break; + case "likeLeft": + queryWrapper.likeLeft(field, val); + break; + case "likeRight": + queryWrapper.likeRight(field, val); + break; + case "in": + queryWrapper.in(field, val); + break; + case "notIn": + queryWrapper.notIn(field, val); + break; + case "datetime": + String[] dateKeys = key.split("-"); + String dateStart = params.getOrDefault(dateKeys[0].trim(), ""); + String dateEnd = dateKeys.length > 1 ? params.getOrDefault(dateKeys[1].trim(), "") : ""; + + if (type.equals("long")) { + if (!dateEnd.equals("")) { queryWrapper.le(field, Long.parseLong(dateEnd)); } + if (!dateStart.equals("")) { queryWrapper.ge(field, Long.parseLong(dateStart)); } + } else { + if (!dateStart.equals("")) { queryWrapper.ge(field, TimeUtils.dateToTimestamp(dateStart)); } + if (!dateEnd.equals("")) { queryWrapper.le(field, TimeUtils.dateToTimestamp(dateEnd)); } + } + break; + } + } + } + + + /** + * 设置搜索条件 + * + * @author fzr + * @param queryWrapper 条件构造器 + * @param param 参数[条件:键@数据库字段:类型] + * @param conditions 条件[ new String[]{"like:username:str", "=:role:int"} ] + */ + default void setSearch(QueryWrapper queryWrapper, Object param, String[] conditions) { + Type types = new TypeToken>() {}.getType(); + Map params = JSON.parseObject(JSONObject.toJSONString(param), types); + + for (String condition : conditions) { + String[] array = condition.split(":"); + String type = array.length > 2 ? array[2].trim() : ""; + String where = array[0].trim(); + String[] keyArr = array[1].trim().split("@"); + String key = keyArr[0].trim(); + String field = keyArr.length > 1 ? keyArr[1].trim() : keyArr[0].trim(); + String value = params.getOrDefault(key, ""); + + if (value.equals("") && !where.equals("datetime")) { + continue; + } + + if ((!type.equals("") && !Arrays.asList("int", "long", "str").contains(type))) { + System.out.println("搜索参数类型不在固定值内[int,long,str]"); + continue; + } + + Object val = value; + switch (where) { + case "=": + case "<>": + case ">": + case ">=": + case "<": + case "<=": + if (type.equals("int")) { + val = Integer.parseInt(value); + } else if (type.equals("long")) { + val = Long.parseLong(value); + } + break; + case "in": + case "notIn": + if (type.equals("int")) { + List intData = new ArrayList<>(); + for (String v : value.split(",")) { + intData.add(Integer.parseInt(v.trim())); + } + val = intData; + } else if (type.equals("long")){ + List longData = new ArrayList<>(); + for (String v : value.split(",")) { + longData.add(Long.parseLong(v.trim())); + } + val = longData; + } + break; + } + + switch (where) { + case "=": + queryWrapper.eq(field, val); + break; + case "<>": + queryWrapper.ne(field, val); + break; + case ">": + queryWrapper.gt(field, val); + break; + case ">=": + queryWrapper.ge(field, val); + break; + case "<": + queryWrapper.lt(field, val); + break; + case "<=": + queryWrapper.le(field, val); + break; + case "between": + String[] betArr = value.split(","); + if (type.equals("int")) { + queryWrapper.between(field, Integer.parseInt(betArr[0]), Integer.parseInt(betArr[1])); + } else if (type.equals("long")){ + queryWrapper.between(field, Long.parseLong(betArr[0]), Long.parseLong(betArr[1])); + } else { + queryWrapper.between(field, betArr[0], betArr[1]); + } + break; + case "notBetween": + String[] notBetArr = value.split(","); + if (type.equals("int")) { + queryWrapper.notBetween(field, Integer.parseInt(notBetArr[0]), Integer.parseInt(notBetArr[1])); + } else if (type.equals("long")){ + queryWrapper.notBetween(field, Long.parseLong(notBetArr[0]), Long.parseLong(notBetArr[1])); + } else { + queryWrapper.notBetween(field, notBetArr[0], notBetArr[1]); + } + break; + case "like": + queryWrapper.like(field, val); + break; + case "notLike": + queryWrapper.notLike(field, val); + break; + case "likeLeft": + queryWrapper.likeLeft(field, val); + break; + case "likeRight": + queryWrapper.likeRight(field, val); + break; + case "in": + queryWrapper.in(field, val); + break; + case "notIn": + queryWrapper.notIn(field, val); + break; + case "datetime": + String[] dateKeys = key.split("-"); + String dateStart = params.getOrDefault(dateKeys[0].trim(), ""); + String dateEnd = dateKeys.length > 1 ? params.getOrDefault(dateKeys[1].trim(), "") : ""; + + if (type.equals("long")) { + if (!dateStart.equals("")) { queryWrapper.ge(field, Long.parseLong(dateStart)); } + if (!dateEnd.equals("")) { queryWrapper.le(field, Long.parseLong(dateEnd)); } + } else { + if (!dateStart.equals("")) { queryWrapper.ge(field, TimeUtils.dateToTimestamp(dateStart)); } + if (!dateEnd.equals("")) { queryWrapper.le(field, TimeUtils.dateToTimestamp(dateEnd)); } + } + break; + } + } + } + + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/Config.java b/yj-common/src/main/java/com/yj/common/entity/Config.java new file mode 100644 index 0000000..1d5a85a --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/Config.java @@ -0,0 +1,36 @@ +package com.yj.common.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("系统配置实体") +public class Config implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("类型") + private String type; + + @ApiModelProperty("键") + private String name; + + @ApiModelProperty("值") + private String value; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/DevCrontab.java b/yj-common/src/main/java/com/yj/common/entity/DevCrontab.java new file mode 100644 index 0000000..d569e15 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/DevCrontab.java @@ -0,0 +1,74 @@ +package com.yj.common.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("计划任务实体") +public class DevCrontab implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("任务名称") + private String name; + + @ApiModelProperty("类型 1-定时任务") + private Integer type; + + @ApiModelProperty("是否系统任务 0-否 1-是") + @TableField("`system`") + private Integer system; + + @ApiModelProperty("备注信息") + private String remark; + + @ApiModelProperty("执行命令") + private String command; + + @ApiModelProperty(" 执行状态: 1=正在运行, 2=任务停止, 3=发生错误") + private Integer status; + + @ApiModelProperty(" 参数") + private String params; + + @ApiModelProperty("执行规则") + private String expression; + + @ApiModelProperty("错误信息") + private String error; + + @ApiModelProperty("结束时间") + private Long lastTime; + +// @ApiModelProperty("执行策略: 1=立即执行, 2=执行一次, 3=放弃执行") +// private Integer strategy; +// +// @ApiModelProperty("并发执行: 0=否, 1=是") +// private Integer concurrent; + + @ApiModelProperty("最大执行时长") + private Long time; + + @ApiModelProperty("最大执行时长") + private Long maxTime; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + + @ApiModelProperty("删除时间") + private Long deleteTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/OfficialAccountReply.java b/yj-common/src/main/java/com/yj/common/entity/OfficialAccountReply.java new file mode 100644 index 0000000..ea87e70 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/OfficialAccountReply.java @@ -0,0 +1,54 @@ +package com.yj.common.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("公众号回复实体") +public class OfficialAccountReply implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("规则名") + private String name; + + @ApiModelProperty("关键词") + private String keyword; + + @ApiModelProperty("回复类型: [1=关注回复 2=关键字回复, 3=默认回复]") + private Integer replyType; + + @ApiModelProperty("匹配方式: [1=全匹配, 2=模糊匹配]") + private Integer matchingType; + + @ApiModelProperty("内容类型: [1=文本]") + private Integer contentType; + + @ApiModelProperty("启动状态: [1=启动, 0=关闭]") + private Integer status; + + @ApiModelProperty("回复内容") + private String content; + + @ApiModelProperty("排序编号") + private Integer sort; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + + @ApiModelProperty("删除时间") + private Long deleteTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/RechargeOrder.java b/yj-common/src/main/java/com/yj/common/entity/RechargeOrder.java new file mode 100644 index 0000000..48e7752 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/RechargeOrder.java @@ -0,0 +1,62 @@ +package com.yj.common.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.math.BigInteger; + +@Data +@ApiModel("充值订单实体类") +public class RechargeOrder { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("订单编号") + private String sn; + + @ApiModelProperty("支付编号") + private String paySn; + + @ApiModelProperty("支付方式: [2=微信支付, 3=支付宝支付]") + private Integer payWay; + + @ApiModelProperty("支付状态: [0=待支付, 1=已支付]") + private Integer payStatus; + + @ApiModelProperty("支付时间") + private Long payTime; + + @ApiModelProperty("充值金额") + private BigDecimal orderAmount; + + @ApiModelProperty("下单终端") + private Integer orderTerminal; + + @ApiModelProperty("交易流水") + private String transactionId; + + @ApiModelProperty("退款状态: [0=未退款 , 1=已退款]") + private Integer refundStatus; + @ApiModelProperty("退款交易流水号") + private BigInteger refundTransactionId; + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + + @ApiModelProperty("删除时间") + private Long deleteTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/RefundLog.java b/yj-common/src/main/java/com/yj/common/entity/RefundLog.java new file mode 100644 index 0000000..e5da4fd --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/RefundLog.java @@ -0,0 +1,52 @@ +package com.yj.common.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel("退款日志实体") +public class RefundLog implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("编号") + private String sn; + + @ApiModelProperty("退款记录ID") + private Integer recordId; + + @ApiModelProperty("关联用户ID") + private Integer userId; + + @ApiModelProperty("处理管理ID") + private Integer handleId; + + @ApiModelProperty("总应付的金额") + private BigDecimal orderAmount; + + @ApiModelProperty("本次退款金额") + private BigDecimal refundAmount; + + @ApiModelProperty("退款状态: [0=退款中, 1=退款成功, 2=退款失败]") + private Integer refundStatus; + + @ApiModelProperty("退款信息") + private String refundMsg; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/RefundRecord.java b/yj-common/src/main/java/com/yj/common/entity/RefundRecord.java new file mode 100644 index 0000000..afa8dbe --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/RefundRecord.java @@ -0,0 +1,61 @@ +package com.yj.common.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel("退款记录实体") +public class RefundRecord implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty(value = "退款编号") + private String sn; + + @ApiModelProperty("关联用户ID") + private Integer userId; + + @ApiModelProperty("来源订单ID") + private Integer orderId; + + @ApiModelProperty("来源单号SN") + private String orderSn; + + @ApiModelProperty("订单类型: [order=商品订单, recharge=充值订单]") + private String orderType; + + @ApiModelProperty("总应付款金额") + private BigDecimal orderAmount; + + @ApiModelProperty("本次退款金额") + private BigDecimal refundAmount; + + @ApiModelProperty("平台交易流水号") + private String transactionId; + + @ApiModelProperty("退款方式: 1=线上退款, 2=线下退款") + private Integer refundWay; + + @ApiModelProperty("退款类型: 1=后台退款") + private Integer refundType; + + @ApiModelProperty("退款状态: 0=退款中, 1=退款成功, 2=退款失败") + private Integer refundStatus; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/admin/Admin.java b/yj-common/src/main/java/com/yj/common/entity/admin/Admin.java new file mode 100644 index 0000000..dd41d06 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/admin/Admin.java @@ -0,0 +1,59 @@ +package com.yj.common.entity.admin; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("系统管理员实体") +public class Admin implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type=IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("是否超级管理员 0-否 1-是") + private Integer root; + + @ApiModelProperty("用户账号") + private String name; + + @ApiModelProperty("用户头像") + private String avatar; + + @ApiModelProperty("用户昵称") + private String account; + + @ApiModelProperty("用户密码") + private String password; + + @ApiModelProperty("多端登录: [0=否, 1=是]") + private Integer multipointLogin; + + @ApiModelProperty("是否禁用: [0=否, 1=是]") + private Integer disable; + + @ApiModelProperty("最后登录IP") + private String loginIp; + + @ApiModelProperty("最后登录时间") + private Long loginTime; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + + @ApiModelProperty("删除时间") + private Long deleteTime; + + @ApiModelProperty("firstLogin") + private Integer firstLogin; +} diff --git a/yj-common/src/main/java/com/yj/common/entity/admin/AdminDept.java b/yj-common/src/main/java/com/yj/common/entity/admin/AdminDept.java new file mode 100644 index 0000000..7c16b52 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/admin/AdminDept.java @@ -0,0 +1,22 @@ +package com.yj.common.entity.admin; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("部门关联表实体") +public class AdminDept implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("管理员id") + private Integer adminId; + + @ApiModelProperty("部门id") + private Integer deptId; + + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/admin/AdminJobs.java b/yj-common/src/main/java/com/yj/common/entity/admin/AdminJobs.java new file mode 100644 index 0000000..b8b42c2 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/admin/AdminJobs.java @@ -0,0 +1,22 @@ +package com.yj.common.entity.admin; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("岗位关联表实体") +public class AdminJobs implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("管理员id") + private Integer adminId; + + @ApiModelProperty("岗位id") + private Integer jobsId; + + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/admin/AdminRole.java b/yj-common/src/main/java/com/yj/common/entity/admin/AdminRole.java new file mode 100644 index 0000000..ed0dc49 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/admin/AdminRole.java @@ -0,0 +1,24 @@ +package com.yj.common.entity.admin; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("角色关联表实体") +public class AdminRole implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("管理员id") + private Integer adminId; + + @ApiModelProperty("角色id") + private Integer roleId; + + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/admin/Dept.java b/yj-common/src/main/java/com/yj/common/entity/admin/Dept.java new file mode 100644 index 0000000..a1c6d85 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/admin/Dept.java @@ -0,0 +1,48 @@ +package com.yj.common.entity.admin; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("系统岗位实体") +public class Dept implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("上级部门") + private Integer pid; + + @ApiModelProperty("部门名称") + private String name; + + @ApiModelProperty("负责人名") + private String leader; + + @ApiModelProperty("联系电话") + private String mobile; + + @ApiModelProperty("排序编号") + private Integer sort; + + @ApiModelProperty("是否禁用: [0=否, 1=是]") + private Integer status; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + + @ApiModelProperty("删除时间") + private Long deleteTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/admin/Jobs.java b/yj-common/src/main/java/com/yj/common/entity/admin/Jobs.java new file mode 100644 index 0000000..cc2d7ba --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/admin/Jobs.java @@ -0,0 +1,45 @@ +package com.yj.common.entity.admin; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("系统岗位管理") +public class Jobs implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("岗位编码") + private String code; + + @ApiModelProperty("岗位名称") + private String name; + + @ApiModelProperty("岗位备注") + private String remark; + + @ApiModelProperty("岗位排序") + private Integer sort; + + @ApiModelProperty("是否停用: [0=否, 1=是]") + private Integer status; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + + @ApiModelProperty("删除时间") + private Long deleteTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/article/Article.java b/yj-common/src/main/java/com/yj/common/entity/article/Article.java new file mode 100644 index 0000000..387d1e3 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/article/Article.java @@ -0,0 +1,67 @@ +package com.yj.common.entity.article; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("文章实体") +public class Article implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("分类") + private Integer cid; + + @ApiModelProperty("标题") + private String title; + + @ApiModelProperty("简介") + @TableField(value = "`desc`") + private String desc; + + @ApiModelProperty("摘要") + @TableField(value = "abstract") + private String abstractField; + + @ApiModelProperty("封面") + private String image; + + @ApiModelProperty("内容") + private String content; + + @ApiModelProperty("作者") + private String author; + + @ApiModelProperty("虚拟浏览量") + private Integer clickVirtual; + + @ApiModelProperty("实际浏览量") + private Integer clickActual; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("是否显示: [0=否, 1=是]") + private Integer isShow; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + + @ApiModelProperty("删除时间") + private Long deleteTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/article/ArticleCate.java b/yj-common/src/main/java/com/yj/common/entity/article/ArticleCate.java new file mode 100644 index 0000000..d5dd17e --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/article/ArticleCate.java @@ -0,0 +1,39 @@ +package com.yj.common.entity.article; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("文章分类实体") +public class ArticleCate implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("主键") + private Integer id; + + @ApiModelProperty("名称") + private String name; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("是否显示: [0=否, 1=是]") + private Integer isShow; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + + @ApiModelProperty("删除时间") + private Long deleteTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/article/ArticleCollect.java b/yj-common/src/main/java/com/yj/common/entity/article/ArticleCollect.java new file mode 100644 index 0000000..e3661a8 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/article/ArticleCollect.java @@ -0,0 +1,38 @@ +package com.yj.common.entity.article; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("文章实体类") +public class ArticleCollect implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("文章ID") + private Integer articleId; + + @ApiModelProperty("收藏状态 0-未收藏 1-已收藏") + private Integer status; + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + + @ApiModelProperty("删除时间") + private Long deleteTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/decorate/DecoratePage.java b/yj-common/src/main/java/com/yj/common/entity/decorate/DecoratePage.java new file mode 100644 index 0000000..2e1b3fd --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/decorate/DecoratePage.java @@ -0,0 +1,39 @@ +package com.yj.common.entity.decorate; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("页面装修实体") +public class DecoratePage implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("页面类型") + private Integer type; + + @ApiModelProperty("页面名称") + private String name; + + @ApiModelProperty("页面数据") + private String data; + + @ApiModelProperty("页面设置") + private String meta; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/decorate/DecorateTabbar.java b/yj-common/src/main/java/com/yj/common/entity/decorate/DecorateTabbar.java new file mode 100644 index 0000000..35b03a5 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/decorate/DecorateTabbar.java @@ -0,0 +1,42 @@ +package com.yj.common.entity.decorate; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("底部导航实体") +public class DecorateTabbar implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("导航名称") + private String name; + + @ApiModelProperty("未选图标") + private String selected; + + @ApiModelProperty("已选图标") + private String unselected; + + @ApiModelProperty("链接地址") + private String link; + + @ApiModelProperty("是否显示") + private Integer isShow; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/file/File.java b/yj-common/src/main/java/com/yj/common/entity/file/File.java new file mode 100644 index 0000000..9b34785 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/file/File.java @@ -0,0 +1,48 @@ +package com.yj.common.entity.file; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("文件实体") +public class File implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("主键ID") + private Integer id; + + @ApiModelProperty("类目ID") + private Integer cid; + + @ApiModelProperty("上传者id") + private Integer sourceId; + + @ApiModelProperty("来源类型[0-后台,1-用户]") + private Integer source; + + @ApiModelProperty("文件类型: [10=图片, 20=视频]") + private Integer type; + + @ApiModelProperty("文件名称") + private String name; + + @ApiModelProperty("文件路径") + private String uri; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + + @ApiModelProperty("删除时间") + private Long deleteTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/file/FileCate.java b/yj-common/src/main/java/com/yj/common/entity/file/FileCate.java new file mode 100644 index 0000000..1a980e0 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/file/FileCate.java @@ -0,0 +1,39 @@ +package com.yj.common.entity.file; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("文件分类实体") +public class FileCate implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("主键ID") + private Integer id; + + @ApiModelProperty("父级ID") + private Integer pid; + + @ApiModelProperty("分类类型: [10=图片,20=视频]") + private Integer type; + + @ApiModelProperty("分类名称") + private String name; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + + @ApiModelProperty("删除时间") + private Long deleteTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/log/UserAccountLog.java b/yj-common/src/main/java/com/yj/common/entity/log/UserAccountLog.java new file mode 100644 index 0000000..a84f091 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/log/UserAccountLog.java @@ -0,0 +1,58 @@ +package com.yj.common.entity.log; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@ApiModel("账户变动实体") +public class UserAccountLog { + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("主键") + private Integer id; + + @ApiModelProperty("流水号") + private String sn; + + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("变动对象") + private Integer changeObject; + + @ApiModelProperty("关联单号") + private String sourceSn; + + @ApiModelProperty("变动类型") + private Integer changeType; + + @ApiModelProperty("变动数量") + private BigDecimal changeAmount; + + @ApiModelProperty("变动后数量") + private BigDecimal leftAmount; + + @ApiModelProperty("变动类型: [1=增加, 2=减少]") + private Integer action; + + @ApiModelProperty("备注信息") + private String remark; + + @ApiModelProperty("预留字段") + private String extra; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + + @ApiModelProperty("删除时间") + private Long deleteTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/notice/NoticeRecord.java b/yj-common/src/main/java/com/yj/common/entity/notice/NoticeRecord.java new file mode 100644 index 0000000..f6d8ae4 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/notice/NoticeRecord.java @@ -0,0 +1,56 @@ +package com.yj.common.entity.notice; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("通知记录实体") +public class NoticeRecord implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("主键") + private Integer id; + + @ApiModelProperty("用户") + private Integer userId; + + @ApiModelProperty("编码") + private String title; + + @ApiModelProperty("内容") + private String content; + + @ApiModelProperty("场景") + private Integer sceneId; + + @ApiModelProperty("已读状态: [0=未读, 1=已读]") + @TableField(value = "`read`") + private Integer read; + + @ApiModelProperty("通知接收对象类型;1-会员;2-商家;3-平台;4-游客(未注册用户)") + private Integer recipient; + + @ApiModelProperty("通知发送类型 1-系统通知 2-短信通知 3-微信模板 4-微信小程序") + private Integer sendType; + @ApiModelProperty("通知类型 1-业务通知 2-验证码") + private Integer noticeType; + @ApiModelProperty("其他") + private String extra; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + + @ApiModelProperty("删除时间") + private Long deleteTime; +} diff --git a/yj-common/src/main/java/com/yj/common/entity/notice/NoticeSetting.java b/yj-common/src/main/java/com/yj/common/entity/notice/NoticeSetting.java new file mode 100644 index 0000000..3614849 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/notice/NoticeSetting.java @@ -0,0 +1,51 @@ +package com.yj.common.entity.notice; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("通知设置实体") +public class NoticeSetting implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("场景编号") + private Integer sceneId; + + @ApiModelProperty("场景名称") + private String sceneName; + + @ApiModelProperty("场景描述") + private String sceneDesc; + + @ApiModelProperty("接收人员: [1=用户, 2=平台]") + private Integer recipient; + + @ApiModelProperty("通知类型: [1=业务, 2=验证码]") + private Integer type; + + @ApiModelProperty("系统的通知设置") + private String systemNotice; + + @ApiModelProperty("短信的通知设置") + private String smsNotice; + + @ApiModelProperty("公众号通知设置") + private String oaNotice; + + @ApiModelProperty("小程序通知设置") + private String mnpNotice; + + @ApiModelProperty("更新时间") + private Long updateTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/server/Cpu.java b/yj-common/src/main/java/com/yj/common/entity/server/Cpu.java new file mode 100644 index 0000000..f592f10 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/server/Cpu.java @@ -0,0 +1,33 @@ +package com.yj.common.entity.server; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("CPU相关信息实体") +public class Cpu implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("核心数") + private int cpuNum; + + @ApiModelProperty("CPU总的使用率") + private double total; + + @ApiModelProperty("CPU系统使用率") + private double sys; + + @ApiModelProperty("CPU用户使用率") + private double used; + + @ApiModelProperty("CPU当前等待率") + private double wait; + + @ApiModelProperty("CPU当前空闲率") + private double free; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/server/Disk.java b/yj-common/src/main/java/com/yj/common/entity/server/Disk.java new file mode 100644 index 0000000..64c8685 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/server/Disk.java @@ -0,0 +1,36 @@ +package com.yj.common.entity.server; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("系统文件信息实体") +public class Disk implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("盘符路径") + private String dirName; + + @ApiModelProperty("盘符类型") + private String sysTypeName; + + @ApiModelProperty("文件类型") + private String typeName; + + @ApiModelProperty("总大小") + private String total; + + @ApiModelProperty("剩余大小") + private String free; + + @ApiModelProperty("已经使用量") + private String used; + + @ApiModelProperty("资源的使用率") + private double usage; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/server/Jvm.java b/yj-common/src/main/java/com/yj/common/entity/server/Jvm.java new file mode 100644 index 0000000..eb37777 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/server/Jvm.java @@ -0,0 +1,44 @@ +package com.yj.common.entity.server; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("JVM相关信息实体") +public class Jvm implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("当前JVM占用的内存总数(M)") + private double total; + + @ApiModelProperty("JVM最大可用内存总数(M)") + private double max; + + @ApiModelProperty("JVM空闲内存(M)") + private double free; + + @ApiModelProperty("JVM内存使用率") + private double usage; + + @ApiModelProperty("JDK版本") + private String version; + + @ApiModelProperty("JDK路径") + private String home; + + @ApiModelProperty("JDK名称") + private String name; + + @ApiModelProperty("运行参数") + private String inputArgs; + + @ApiModelProperty("JDK运行时间") + private String runTime; + + @ApiModelProperty("JDK启动时间") + private String startTime; +} diff --git a/yj-common/src/main/java/com/yj/common/entity/server/Mem.java b/yj-common/src/main/java/com/yj/common/entity/server/Mem.java new file mode 100644 index 0000000..ab90ab7 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/server/Mem.java @@ -0,0 +1,27 @@ +package com.yj.common.entity.server; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("內存相关信息实体") +public class Mem implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("内存总量") + private double total; + + @ApiModelProperty("已用内存") + private double used; + + @ApiModelProperty("剩余内存") + private double free; + + @ApiModelProperty("使用率") + private double usage; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/server/Sys.java b/yj-common/src/main/java/com/yj/common/entity/server/Sys.java new file mode 100644 index 0000000..c82dbe6 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/server/Sys.java @@ -0,0 +1,30 @@ +package com.yj.common.entity.server; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("系统相关信息实体") +public class Sys implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("服务器名称") + private String computerName; + + @ApiModelProperty("服务器Ip") + private String computerIp; + + @ApiModelProperty("项目路径") + private String userDir; + + @ApiModelProperty("操作系统") + private String osName; + + @ApiModelProperty("系统架构") + private String osArch; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/setting/DevPayConfig.java b/yj-common/src/main/java/com/yj/common/entity/setting/DevPayConfig.java new file mode 100644 index 0000000..b60cef6 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/setting/DevPayConfig.java @@ -0,0 +1,44 @@ +package com.yj.common.entity.setting; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("支付配置实体") +public class DevPayConfig implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("模版名称") + private String name; + + @TableField(exist = false) + @ApiModelProperty("显示名称") + private String payWayName; + + @ApiModelProperty("渠道图标") + private String icon; + + @ApiModelProperty("支付方式: [1=余额支付, 2=微信支付, 3=支付宝支付]") + private Integer payWay; + + @ApiModelProperty("排序编号") + private Integer sort; + + @ApiModelProperty("备注信息") + private String remark; + + @ApiModelProperty("配置参数") + private Object config; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/setting/DevPayWay.java b/yj-common/src/main/java/com/yj/common/entity/setting/DevPayWay.java new file mode 100644 index 0000000..4227100 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/setting/DevPayWay.java @@ -0,0 +1,31 @@ +package com.yj.common.entity.setting; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("支付方式实体") +public class DevPayWay implements Serializable { + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("支付配置ID") + private Integer payConfigId; + + @ApiModelProperty("场景编码: [1=微信小程序, 2=微信公众号, 3=H5, 4=PC, 5=APP]") + private Integer scene; + + @ApiModelProperty("默认支付: [0=否的, 1=是的]") + private Integer isDefault; + + @ApiModelProperty("方式状态: [0=关闭, 1=开启]") + private Integer status; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/setting/DictData.java b/yj-common/src/main/java/com/yj/common/entity/setting/DictData.java new file mode 100644 index 0000000..ead7a25 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/setting/DictData.java @@ -0,0 +1,51 @@ +package com.yj.common.entity.setting; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("字典数据实体") +public class DictData implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("类型") + private Integer typeId; + + @ApiModelProperty("类型值") + private String typeValue; + + @ApiModelProperty("键名") + private String name; + + @ApiModelProperty("数值") + private String value; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("状态: [0=停用, 1-正常]") + private Integer status; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + + @ApiModelProperty("删除时间") + private Long deleteTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/setting/DictType.java b/yj-common/src/main/java/com/yj/common/entity/setting/DictType.java new file mode 100644 index 0000000..db00dff --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/setting/DictType.java @@ -0,0 +1,42 @@ +package com.yj.common.entity.setting; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("字典类型实体") +public class DictType implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("字典名称") + private String name; + + @ApiModelProperty("字典类型") + private String type; + + @ApiModelProperty("字典备注") + private String remark; + + @ApiModelProperty("字典状态: [0=停用, 1=正常]") + private Integer status; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + + @ApiModelProperty("删除时间") + private Long deleteTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/setting/HotSearch.java b/yj-common/src/main/java/com/yj/common/entity/setting/HotSearch.java new file mode 100644 index 0000000..6e8e8ce --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/setting/HotSearch.java @@ -0,0 +1,27 @@ +package com.yj.common.entity.setting; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("热门搜索实体") +public class HotSearch implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("关键词") + private String name; + + @ApiModelProperty("排序") + private Integer sort; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/smsLog/SmsLog.java b/yj-common/src/main/java/com/yj/common/entity/smsLog/SmsLog.java new file mode 100644 index 0000000..0ad952d --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/smsLog/SmsLog.java @@ -0,0 +1,56 @@ +package com.yj.common.entity.smsLog; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("短信记录实体") +public class SmsLog implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("主键") + private Integer id; + + @ApiModelProperty("场景") + private Integer sceneId; + + @ApiModelProperty("手机号码") + private String mobile; + + @ApiModelProperty("发送内容") + private String content; + + @ApiModelProperty("发送关键字(注册、找回密码)") + private String code; + + @ApiModelProperty("是否已验证;0-否;1-是") + private Integer isVerify; + + @ApiModelProperty("验证次数") + private Integer checkNum; + + @ApiModelProperty("发送状态:0-发送中;1-发送成功;2-发送失败") + private Integer sendStatus; + + @ApiModelProperty("发送时间") + private Long sendTime; + + @ApiModelProperty("短信结果") + private String results; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + + @ApiModelProperty("删除时间") + private Long deleteTime; +} diff --git a/yj-common/src/main/java/com/yj/common/entity/system/OperationLog.java b/yj-common/src/main/java/com/yj/common/entity/system/OperationLog.java new file mode 100644 index 0000000..e4d56c8 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/system/OperationLog.java @@ -0,0 +1,49 @@ +package com.yj.common.entity.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("系统操作日志实体") +public class OperationLog implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("操作人ID") + private Integer adminId; + + private String adminName; + + private String account; + + @ApiModelProperty("操作标题") + private String action; + + @ApiModelProperty("请求类型: GET/POST/PUT") + private String type; + + @ApiModelProperty("请求接口") + private String url; + + @ApiModelProperty("请求参数") + private String params; + + @ApiModelProperty("请求结果") + private String result; + + @ApiModelProperty("请求IP") + private String ip; + + @ApiModelProperty("创建时间") + private Long createTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/system/SystemLogLogin.java b/yj-common/src/main/java/com/yj/common/entity/system/SystemLogLogin.java new file mode 100644 index 0000000..10b60b1 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/system/SystemLogLogin.java @@ -0,0 +1,42 @@ +package com.yj.common.entity.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("系统登录日志实体") +public class SystemLogLogin implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("管理员ID") + private Integer adminId; + + @ApiModelProperty("登录账号") + private String username; + + @ApiModelProperty("登录IP") + private String ip; + + @ApiModelProperty("操作系统") + private String os; + + @ApiModelProperty("浏览器") + private String browser; + + @ApiModelProperty("操作状态: [1=成功, 2=失败]") + private Integer status; + + @ApiModelProperty("创建时间") + private Long createTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/system/SystemMenu.java b/yj-common/src/main/java/com/yj/common/entity/system/SystemMenu.java new file mode 100644 index 0000000..548efa5 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/system/SystemMenu.java @@ -0,0 +1,66 @@ +package com.yj.common.entity.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("系统菜单实体") +public class SystemMenu implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("上级菜单") + private Integer pid; + + @ApiModelProperty("权限类型: [M=目录, C=菜单, A=按钮]") + private String type; + + @ApiModelProperty("菜单名称") + private String name; + + @ApiModelProperty("菜单图标") + private String icon; + + @ApiModelProperty("菜单排序") + private Integer sort; + + @ApiModelProperty("权限标识") + private String perms; + + @ApiModelProperty("路由地址") + private String paths; + + @ApiModelProperty("前端组件") + private String component; + + @ApiModelProperty("选中路径") + private String selected; + + @ApiModelProperty("路由参数") + private String params; + + @ApiModelProperty("是否缓存: [0=否, 1=是]") + private Integer isCache; + + @ApiModelProperty("是否显示: [0=否, 1=是]") + private Integer isShow; + + @ApiModelProperty("是否禁用: [0=否, 1=是]") + private Integer isDisable; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/system/SystemRole.java b/yj-common/src/main/java/com/yj/common/entity/system/SystemRole.java new file mode 100644 index 0000000..eaa5516 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/system/SystemRole.java @@ -0,0 +1,41 @@ +package com.yj.common.entity.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.lettuce.core.dynamic.annotation.Key; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("系统角色实体") +public class SystemRole implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("角色名称") + private String name; + + @ApiModelProperty("描述") + @TableField(value = "`desc`") + private String desc; + + @ApiModelProperty("角色排序") + private Integer sort; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + + @ApiModelProperty("删除时间") + private Long deleteTime; +} diff --git a/yj-common/src/main/java/com/yj/common/entity/system/SystemRoleMenu.java b/yj-common/src/main/java/com/yj/common/entity/system/SystemRoleMenu.java new file mode 100644 index 0000000..9fb076b --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/system/SystemRoleMenu.java @@ -0,0 +1,23 @@ +package com.yj.common.entity.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("角色菜单关系实体") +public class SystemRoleMenu implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("角色ID") + private Integer roleId; + + @ApiModelProperty("菜单ID") + private Integer menuId; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/user/User.java b/yj-common/src/main/java/com/yj/common/entity/user/User.java new file mode 100644 index 0000000..c29fc10 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/user/User.java @@ -0,0 +1,78 @@ +package com.yj.common.entity.user; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel("用户信息实体") +public class User implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("编号") + private Integer sn; + + @ApiModelProperty("用户头像") + private String avatar; + + @ApiModelProperty("真实姓名") + private String realName; + + @ApiModelProperty("用户昵称") + private String nickname; + + @ApiModelProperty("用户账号") + private String account; + + @ApiModelProperty("用户密码") + private String password; + + @ApiModelProperty("用户电话") + private String mobile; + + @ApiModelProperty("用户性别: [1=男, 2=女]") + private Integer sex; + + @ApiModelProperty("注册渠道") + private Integer channel; + + @ApiModelProperty("是否禁用: [0=否, 1=是]") + private Integer isDisable; + + @ApiModelProperty("用户钱包") + private BigDecimal userMoney; + + @ApiModelProperty("累计充值") + private BigDecimal totalRechargeAmount; + +// @ApiModelProperty("加密盐巴") +// private String salt; + @ApiModelProperty("最后登录IP") + private String loginIp; + + @ApiModelProperty("最后登录时间") + private Long loginTime; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + + @ApiModelProperty("删除时间") + private Long deleteTime; + + @ApiModelProperty("是否为新用户: [0=否, 1=是]") + private Integer isNewUser; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/user/UserAuth.java b/yj-common/src/main/java/com/yj/common/entity/user/UserAuth.java new file mode 100644 index 0000000..5d7aa54 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/user/UserAuth.java @@ -0,0 +1,39 @@ +package com.yj.common.entity.user; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("用户授权实体") +public class UserAuth implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("Openid") + private String openid; + + @ApiModelProperty("Unionid") + private String unionid; + + @ApiModelProperty("客户端类型: [1=微信小程序, 2=微信公众号, 3=手机H5, 4=电脑PC, 5=苹果APP, 6=安卓APP]") + private Integer terminal; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新时间") + private Long updateTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/entity/user/UserSession.java b/yj-common/src/main/java/com/yj/common/entity/user/UserSession.java new file mode 100644 index 0000000..5c36e4a --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/entity/user/UserSession.java @@ -0,0 +1,36 @@ +package com.yj.common.entity.user; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("用户会话实体") +public class UserSession implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("客户端类型:1-微信小程序;2-微信公众号;3-手机H5;4-电脑PC;5-苹果APP;6-安卓APP") + private Integer terminal; + + @ApiModelProperty("令牌") + private String token; + + @ApiModelProperty("创建时间") + private Long updateTime; + + @ApiModelProperty("更新时间") + private Long expireTime; + +} diff --git a/yj-common/src/main/java/com/yj/common/enums/AccountLogEnum.java b/yj-common/src/main/java/com/yj/common/enums/AccountLogEnum.java new file mode 100644 index 0000000..9d328f4 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/enums/AccountLogEnum.java @@ -0,0 +1,109 @@ +package com.yj.common.enums; + +import com.alibaba.fastjson2.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +/** + * 通知枚举类 + */ +public enum AccountLogEnum { + + /** + * 变动对象 + * UM 用户余额(user_money) + */ + UM(1, "变动对象"), + /** + * 动作 + * INC 增加 + * DEC 减少 + */ + INC(1, "增加"), + DEC(2, "减少"), + /** + * 用户余额减少类型 + */ + UM_DEC_ADMIN(100, "平台减少余额"), + UM_DEC_RECHARGE_REFUND(101, "充值订单退款减少余额"), + + UM_INC_ADMIN(200, "平台增加余额"), + UM_INC_RECHARGE(201, "充值增加余额"); + + /** + * 构造方法 + */ + private final int code; + private final String msg; + AccountLogEnum(int code, String msg) { + this.code = code; + this.msg = msg; + } + + /** + * @notes 变动类型描述 + * @param $changeType + * @param false $flag + * @return string|string[] + * @author 段誉 + * @date 2023/2/23 10:07 + */ + public static String getChangeTypeDesc(Integer changeType) { + JSONObject ret = new JSONObject(); + ret.put(String.valueOf(UM_DEC_ADMIN.getCode()), UM_DEC_ADMIN.getMsg()); + ret.put(String.valueOf(UM_INC_ADMIN.getCode()), UM_INC_ADMIN.getMsg()); + ret.put(String.valueOf(UM_INC_RECHARGE.getCode()), UM_INC_RECHARGE.getMsg()); + ret.put(String.valueOf(UM_DEC_RECHARGE_REFUND.getCode()), UM_DEC_RECHARGE_REFUND.getMsg()); + + return ret.getString(String.valueOf(changeType)); + } + + /** + * @notes 获取变动对象 + * @param changeType + * @return false + * @author damonyuan + */ + public static Integer getChangeObject(Integer changeType) { + List typeList = getUserMoneyChangeType(); + if (typeList.contains(changeType)) { + return UM.getCode(); + } else { + return 0; + } + } + + /** + * 获取状态码 + * + * @author fzr + * @return Long + */ + public int getCode() { + return this.code; + } + + /** + * 获取提示 + * + * @author fzr + * @return String + */ + public String getMsg() { + return this.msg; + } + + /** + * 验证码场景 + */ + public static List getUserMoneyChangeType() { + List ret = new ArrayList<>(); + ret.add(UM_DEC_ADMIN.getCode()); + ret.add(UM_DEC_RECHARGE_REFUND.getCode()); + ret.add(UM_INC_ADMIN.getCode()); + ret.add(UM_INC_RECHARGE.getCode()); + return ret; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/enums/AlbumEnum.java b/yj-common/src/main/java/com/yj/common/enums/AlbumEnum.java new file mode 100644 index 0000000..9b2aeb3 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/enums/AlbumEnum.java @@ -0,0 +1,42 @@ +package com.yj.common.enums; + +/** + * 相册枚举 + */ +public enum AlbumEnum { + + IMAGE(10, "图片"), + Video(20, "视频"), + Doc(30, "文件"); + + /** + * 构造方法 + */ + private final int code; + private final String msg; + AlbumEnum(int code, String msg) { + this.code = code; + this.msg = msg; + } + + /** + * 获取状态码 + * + * @author fzr + * @return Long + */ + public int getCode() { + return this.code; + } + + /** + * 获取提示 + * + * @author fzr + * @return String + */ + public String getMsg() { + return this.msg; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/enums/ClientEnum.java b/yj-common/src/main/java/com/yj/common/enums/ClientEnum.java new file mode 100644 index 0000000..b4a7d05 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/enums/ClientEnum.java @@ -0,0 +1,93 @@ +package com.yj.common.enums; + +/** + * 客户端枚举类 + */ +public enum ClientEnum { + + MNP(1, "微信小程序"), + OA(2, "微信公众号"), + H5(3, "手机H5"), + PC(4, "电脑PC"), + IOS(5, "苹果APP"), + APK(6, "安卓APP"); + + /** + * 构造方法 + */ + private final int code; + private final String msg; + ClientEnum(int code, String msg) { + this.code = code; + this.msg = msg; + } + + /** + * 根据类型获取Code + * + * @author fzr + * @param type 类型 + * @return Integer + */ + public static Integer getCodeByType(String type){ + for(ClientEnum enumItem: ClientEnum.values()) { + if (enumItem.toString().equals(type.toUpperCase())) { + return enumItem.getCode(); + } + } + return null; + } + + /** + * 根据类型获取Msg + * + * @author fzr + * @param type 类型 + * @return String + */ + public static String getMsgByType(String type){ + for(ClientEnum enumItem: ClientEnum.values()) { + if (enumItem.toString().equals(type)) { + return enumItem.getMsg(); + } + } + return null; + } + + /** + * 根据编码获取Msg + * + * @author fzr + * @param code 类型 + * @return String + */ + public static String getMsgByCode(Integer code){ + for(ClientEnum enumItem: ClientEnum.values()) { + if (enumItem.getCode() == code) { + return enumItem.getMsg(); + } + } + return null; + } + + /** + * 获取状态码 + * + * @author fzr + * @return Long + */ + public int getCode() { + return this.code; + } + + /** + * 获取提示 + * + * @author fzr + * @return String + */ + public String getMsg() { + return this.msg; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/enums/ErrorEnum.java b/yj-common/src/main/java/com/yj/common/enums/ErrorEnum.java new file mode 100644 index 0000000..7e1696e --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/enums/ErrorEnum.java @@ -0,0 +1,57 @@ +package com.yj.common.enums; + +public enum ErrorEnum { + + SHOW_MSG(1, "显示信息"), + HIDE_MSG(0, "隐藏信息"), + SUCCESS(1, "成功"), + FAILED(0, "失败"), + PARAMS_VALID_ERROR(0, "参数校验错误"), + PARAMS_TYPE_ERROR(0, "参数类型错误"), + REQUEST_METHOD_ERROR(0, "请求方法错误"), + ASSERT_ARGUMENT_ERROR(0, "断言参数错误"), + ASSERT_MYBATIS_ERROR(0, "断言Mybatis错误"), + + LOGIN_ACCOUNT_ERROR(0, "登录账号或密码错误"), + LOGIN_DISABLE_ERROR(0, "登录账号已被禁用了"), + TOKEN_EMPTY(0, "登录超时,请重新登录"), + TOKEN_INVALID(-1, "token参数无效"), + CAPTCHA_ERROR(0, "验证码错误"), + PAYMENT_ERROR(0, "发起支付失败"), + + NO_PERMISSION(0, "无相关权限"), + REQUEST_404_ERROR(0, "请求接口不存在"), + + SYSTEM_ERROR(0, "系统错误"); + + /** + * 构造方法 + */ + private final int code; + private final String msg; + ErrorEnum(int code, String msg) { + this.code = code; + this.msg = msg; + } + + /** + * 获取状态码 + * + * @author fzr + * @return Long + */ + public int getCode() { + return this.code; + } + + /** + * 获取提示 + * + * @author fzr + * @return String + */ + public String getMsg() { + return this.msg; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/enums/FileEnum.java b/yj-common/src/main/java/com/yj/common/enums/FileEnum.java new file mode 100644 index 0000000..a64b636 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/enums/FileEnum.java @@ -0,0 +1,46 @@ +package com.yj.common.enums; + +/** + * 相册枚举 + */ +public enum FileEnum { + + IMAGE_TYPE(10, "图片类型"), + VIDEO_TYPE(20, "视频类型"), + FILE_TYPE(30, "文件类型"), + + // 图片来源 + SOURCE_ADMIN(0, "后台"), + SOURCE_USER(1, "用户"); + + /** + * 构造方法 + */ + private final int code; + private final String msg; + FileEnum(int code, String msg) { + this.code = code; + this.msg = msg; + } + + /** + * 获取状态码 + * + * @author fzr + * @return Long + */ + public int getCode() { + return this.code; + } + + /** + * 获取提示 + * + * @author fzr + * @return String + */ + public String getMsg() { + return this.msg; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/enums/LogMoneyEnum.java b/yj-common/src/main/java/com/yj/common/enums/LogMoneyEnum.java new file mode 100644 index 0000000..e5cab32 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/enums/LogMoneyEnum.java @@ -0,0 +1,76 @@ +package com.yj.common.enums; + +import java.util.LinkedHashMap; +import java.util.Map; + +public enum LogMoneyEnum { + + /** + * 用户余额类型 + */ + UM_INC_ADMIN(200, "平台增加余额"), + UM_DEC_ADMIN(100, "平台减少余额"), + UM_INC_RECHARGE(201, "充值增加余额"), + UM_DEC_RECHARGE(101, "充值订单退款减少余额"); + + /** + * 构造方法 + */ + private final int code; + private final String msg; + LogMoneyEnum(int code, String msg) { + this.code = code; + this.msg = msg; + } + + /** + * 获取状态码 + * + * @author fzr + * @return Long + */ + public int getCode() { + return this.code; + } + + /** + * 获取提示 + * + * @author fzr + * @return String + */ + public String getMsg() { + return this.msg; + } + + /** + * 根据编码获取Msg + * + * @author fzr + * @param code 类型 + * @return String + */ + public static String getMsgByCode(Integer code){ + for(LogMoneyEnum enumItem : LogMoneyEnum.values()) { + if (enumItem.getCode() == code) { + return enumItem.getMsg(); + } + } + return null; + } + + /** + * 获取所有类型 + * + * @author fzr + * @return String + */ + public static Map getTypeList(){ + Map map = new LinkedHashMap<>(); + for(LogMoneyEnum enumItem : LogMoneyEnum.values()) { + map.put(enumItem.getCode(), enumItem.getMsg()); + } + return map; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/enums/LoginEnum.java b/yj-common/src/main/java/com/yj/common/enums/LoginEnum.java new file mode 100644 index 0000000..988b0ee --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/enums/LoginEnum.java @@ -0,0 +1,43 @@ +package com.yj.common.enums; + +/** + * 相册枚举 + */ +public enum LoginEnum { + + ACCOUNT_PASSWORD(1, "账号/手机号密码登录"), + MOBILE_CAPTCHA(2, "手机验证码登录"), + + THIRD_LOGIN(3, "第三方登录"); + + /** + * 构造方法 + */ + private final int code; + private final String msg; + LoginEnum(int code, String msg) { + this.code = code; + this.msg = msg; + } + + /** + * 获取状态码 + * + * @author fzr + * @return Long + */ + public int getCode() { + return this.code; + } + + /** + * 获取提示 + * + * @author fzr + * @return String + */ + public String getMsg() { + return this.msg; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/enums/NoticeEnum.java b/yj-common/src/main/java/com/yj/common/enums/NoticeEnum.java new file mode 100644 index 0000000..ba2feb8 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/enums/NoticeEnum.java @@ -0,0 +1,92 @@ +package com.yj.common.enums; + +import com.alibaba.fastjson2.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +/** + * 通知枚举类 + */ +public enum NoticeEnum { + + STATUS_WAIT(0, "等待"), + STATUS_OK(1, "成功"), + STATUS_FAIL(2, "失败"), + + VIEW_UNREAD(0, "未读"), + VIEW_READ(0, "已读"), + + SENDER_SYS(1, "系统类型"), + SENDER_SMS(2, "短信类型"), + SENDER_MNP(3, "小程序类型"), + SENDER_OA(4, "公众号类型"), + + LOGIN_CAPTCHA(101, "登录验证码"), + BIND_MOBILE_CAPTCHA(102, "绑定手机验证码"), + CHANGE_MOBILE_CAPTCHA(103, "变更手机验证码"), + FIND_LOGIN_PASSWORD_CAPTCHA(104, "找回登录密码验证码"); + + /** + * 构造方法 + */ + private final int code; + private final String msg; + NoticeEnum(int code, String msg) { + this.code = code; + this.msg = msg; + } + + /** + * 获取状态码 + * + * @author fzr + * @return Long + */ + public int getCode() { + return this.code; + } + + /** + * 获取提示 + * + * @author fzr + * @return String + */ + public String getMsg() { + return this.msg; + } + + /** + * @notes 更具标记获取场景 + * @param $tag + * @return int|string + * @author damonyuan + */ + public static Integer getSceneByTag( String tag ) { + JSONObject scene = new JSONObject(); + // 手机验证码登录 + scene.put("YZMDL", LOGIN_CAPTCHA.getCode()); + // 绑定手机号验证码 + scene.put("BDSJHM", BIND_MOBILE_CAPTCHA.getCode()); + // 变更手机号验证码 + scene.put("BGSJHM", CHANGE_MOBILE_CAPTCHA.getCode()); + // 找回登录密码 + scene.put("ZHDLMM", FIND_LOGIN_PASSWORD_CAPTCHA.getCode()); + + return scene.getInteger(tag); + } + + /** + * 验证码场景 + */ + public static List getSmsScene() { + List ret = new ArrayList<>(); + ret.add(LOGIN_CAPTCHA.getCode()); + ret.add(BIND_MOBILE_CAPTCHA.getCode()); + ret.add(CHANGE_MOBILE_CAPTCHA.getCode()); + ret.add(FIND_LOGIN_PASSWORD_CAPTCHA.getCode()); + return ret; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/enums/PaymentEnum.java b/yj-common/src/main/java/com/yj/common/enums/PaymentEnum.java new file mode 100644 index 0000000..9581a89 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/enums/PaymentEnum.java @@ -0,0 +1,80 @@ +package com.yj.common.enums; + +/** + * 支付枚举 + */ +public enum PaymentEnum { + + UN_PAID(0, "未支付"), + OK_PAID(1, "已支付"), + + WALLET_PAY(1, "余额支付"), + WX_PAY(2, "微信支付"), + ALI_PAY(3, "支付宝支付"); + + /** + * 构造方法 + */ + private final int code; + private final String msg; + PaymentEnum(int code, String msg) { + this.code = code; + this.msg = msg; + } + + /** + * 获取状态码 + * + * @author fzr + * @return Long + */ + public int getCode() { + return this.code; + } + + /** + * 获取提示 + * + * @author fzr + * @return String + */ + public String getMsg() { + return this.msg; + } + + /** + * 根据编码获取Msg + * + * @author fzr + * @param code 类型 + * @return String + */ + public static String getPayWayMsg(Integer code){ + switch (code) { + case 1: + return "余额支付"; + case 2: + return "微信支付"; + case 3: + return "支付宝支付"; + } + return "未知"; + } + + /** + * + * @author fzr + * @param status 支付状态 + * @return String + */ + public static String getPayStatusMsg(Integer status){ + switch (status) { + case 0: + return "未支付"; + case 1: + return "已支付"; + } + return "未知"; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/enums/RefundEnum.java b/yj-common/src/main/java/com/yj/common/enums/RefundEnum.java new file mode 100644 index 0000000..f491cb6 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/enums/RefundEnum.java @@ -0,0 +1,98 @@ +package com.yj.common.enums; + +public enum RefundEnum { + + // 退款类型 + TYPE_ADMIN(1, "后台退款"), + + // 退款状态 + REFUND_ING(0, "退款中"), + REFUND_SUCCESS(1, "退款成功"), + REFUND_ERROR(2, "退款失败"), + + // 退款订单类型 + ORDER_TYPE_ORDER(1, "普通订单"), + ORDER_TYPE_RECHARGE(2, "充值订单"); + + /** + * 构造方法 + */ + private final int code; + private final String msg; + RefundEnum(int code, String msg) { + this.code = code; + this.msg = msg; + } + + /** + * 获取状态码 + * + * @author fzr + * @return Long + */ + public int getCode() { + return this.code; + } + + /** + * 获取提示 + * + * @author fzr + * @return String + */ + public String getMsg() { + return this.msg; + } + + /** + * 订单类型标识 + * + * @author fzr + * @param code 编码 + * @return String + */ + public static String getOrderType(Integer code){ + switch (code) { + case 1: + return "order"; + case 2: + return "recharge"; + } + return "未知"; + } + + /** + * 退款类型描述 + * + * @author fzr + * @param code 编码 + * @return String + */ + public static String getRefundTypeMsg(Integer code) + { + if (code == 1) { + return RefundEnum.TYPE_ADMIN.getMsg(); + } + return "未知"; + } + + /** + * 退款状态描述 + * + * @author fzr + * @param code 编码 + * @return String + */ + public static String getRefundStatusMsg(Integer code){ + switch (code) { + case 0: + return RefundEnum.REFUND_ING.getMsg(); + case 1: + return RefundEnum.REFUND_SUCCESS.getMsg(); + case 2: + return RefundEnum.REFUND_ERROR.getMsg(); + } + return "未知"; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/enums/SmsEnum.java b/yj-common/src/main/java/com/yj/common/enums/SmsEnum.java new file mode 100644 index 0000000..d2caca3 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/enums/SmsEnum.java @@ -0,0 +1,42 @@ +package com.yj.common.enums; + +/** + * 短信枚举 + */ +public enum SmsEnum { + + SEND_ING(0, "发送中"), + SEND_SUCCESS(1, "发送成功"), + SEND_FAIL(2, "发送失败"); + + /** + * 构造方法 + */ + private final int code; + private final String msg; + SmsEnum(int code, String msg) { + this.code = code; + this.msg = msg; + } + + /** + * 获取状态码 + * + * @author fzr + * @return Long + */ + public int getCode() { + return this.code; + } + + /** + * 获取提示 + * + * @author fzr + * @return String + */ + public String getMsg() { + return this.msg; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/enums/UserEnum.java b/yj-common/src/main/java/com/yj/common/enums/UserEnum.java new file mode 100644 index 0000000..ebc6baf --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/enums/UserEnum.java @@ -0,0 +1,58 @@ +package com.yj.common.enums; + +public enum UserEnum { + + // 退款类型 + SEX_OTHER(0, "未知"), + SEX_MEN(1, "男"), + SEX_WOMAN(2, "女"); + + /** + * 构造方法 + */ + private final int code; + private final String msg; + UserEnum(int code, String msg) { + this.code = code; + this.msg = msg; + } + + /** + * 获取状态码 + * + * @author fzr + * @return Long + */ + public int getCode() { + return this.code; + } + + /** + * 获取提示 + * + * @author fzr + * @return String + */ + public String getMsg() { + return this.msg; + } + + /** + * 订单类型标识 + * + * @author fzr + * @param code 编码 + * @return String + */ + public static String getSexDesc(Integer code){ + switch (code) { + case 1: + return "男"; + case 2: + return "女"; + } + return "未知"; + } + + +} diff --git a/yj-common/src/main/java/com/yj/common/enums/YesNoEnum.java b/yj-common/src/main/java/com/yj/common/enums/YesNoEnum.java new file mode 100644 index 0000000..d6ebd14 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/enums/YesNoEnum.java @@ -0,0 +1,41 @@ +package com.yj.common.enums; + +/** + * 相册枚举 + */ +public enum YesNoEnum { + + YES(1, "是"), + NO(0, "否"); + + /** + * 构造方法 + */ + private final int code; + private final String msg; + YesNoEnum(int code, String msg) { + this.code = code; + this.msg = msg; + } + + /** + * 获取状态码 + * + * @author fzr + * @return Long + */ + public int getCode() { + return this.code; + } + + /** + * 获取提示 + * + * @author fzr + * @return String + */ + public String getMsg() { + return this.msg; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/exception/BaseException.java b/yj-common/src/main/java/com/yj/common/exception/BaseException.java new file mode 100644 index 0000000..0ffe308 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/exception/BaseException.java @@ -0,0 +1,22 @@ +package com.yj.common.exception; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 异常基类 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class BaseException extends RuntimeException { + + private Integer code; + private String msg; + private Integer show; + + public BaseException(Integer code, String msg, Integer show) { + this.code = code; + this.msg = msg; + this.show = show; + } +} diff --git a/yj-common/src/main/java/com/yj/common/exception/GlobalException.java b/yj-common/src/main/java/com/yj/common/exception/GlobalException.java new file mode 100644 index 0000000..b16fbd0 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/exception/GlobalException.java @@ -0,0 +1,150 @@ +package com.yj.common.exception; + +import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; +import com.yj.common.config.GlobalConfig; +import com.yj.common.core.AjaxResult; +import com.yj.common.enums.ErrorEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.validation.BindException; +import org.springframework.validation.BindingResult; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingServletRequestParameterException; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.NoHandlerFoundException; + +import java.util.Objects; + +/** + * 全局异常处理 + */ +@Slf4j +@ControllerAdvice +public class GlobalException { + + /** + * 处理所有不可知异常 + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(Exception.class) + @ResponseBody + public AjaxResult handleException(Exception e) { + if (GlobalConfig.debug) { + e.printStackTrace(); + } + log.error("系统异常 {}", e.getMessage()); + return AjaxResult.failed(ErrorEnum.SYSTEM_ERROR.getCode(), e.getMessage()); + } + + /** + * 拦截404异常 + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(NoHandlerFoundException.class) + @ResponseBody + public AjaxResult handleNoHandlerFoundException(NoHandlerFoundException e){ + return AjaxResult.failed(ErrorEnum.REQUEST_404_ERROR.getCode(), e.getMessage()); + } + + /** + * 拦截自定义抛出异常 + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(BaseException.class) + @ResponseBody + public AjaxResult handleException(BaseException e) { + int code = e.getCode(); + String msg = e.getMsg(); + int show = e.getShow(); + return AjaxResult.failed(code, msg); + } + + /** + * 拦截表单参数校验FROM + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(BindException.class) + @ResponseBody + public AjaxResult handleBindException(BindException e) { + BindingResult bindingResult = e.getBindingResult(); + Integer code = ErrorEnum.PARAMS_VALID_ERROR.getCode(); + String msg = Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage(); + return AjaxResult.failed(code, msg); + } + + /** + * 拦截路径参数校验PATH + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(MissingServletRequestParameterException.class) + @ResponseBody + public AjaxResult handlePathException(MissingServletRequestParameterException e) { + Integer code = ErrorEnum.PARAMS_VALID_ERROR.getCode(); + String msg = Objects.requireNonNull(e.getMessage()); + return AjaxResult.failed(code, msg); + } + + /** + * 拦截JSON参数校验 + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(MethodArgumentNotValidException.class) + @ResponseBody + public AjaxResult handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + BindingResult bindingResult = e.getBindingResult(); + Integer code = ErrorEnum.PARAMS_VALID_ERROR.getCode(); + String msg = Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage(); + return AjaxResult.failed(code, msg); + } + + /** + * 拦截参数类型不正确 + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(HttpMessageNotReadableException.class) + @ResponseBody + public AjaxResult handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { + Integer code = ErrorEnum.PARAMS_TYPE_ERROR.getCode(); + String msg = Objects.requireNonNull(e.getMessage()); + return AjaxResult.failed(code, msg.split(";")[0]); + } + + /** + * 拦截请求方法 + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + @ResponseBody + public AjaxResult handleRequestMethodException(HttpRequestMethodNotSupportedException e) { + Integer code = ErrorEnum.REQUEST_METHOD_ERROR.getCode(); + String msg = Objects.requireNonNull(e.getMessage()); + return AjaxResult.failed(code, msg); + } + + /** + * 拦截断言异常 + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(IllegalArgumentException.class) + @ResponseBody + public AjaxResult handleIllegalArgumentException(IllegalArgumentException e) { + Integer code = ErrorEnum.ASSERT_ARGUMENT_ERROR.getCode(); + String msg = Objects.requireNonNull(e.getMessage()); + return AjaxResult.failed(code, msg); + } + + /** + * 拦截MybatisPlus异常 + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(MybatisPlusException.class) + @ResponseBody + public AjaxResult handleMybatisPlusException(MybatisPlusException e) { + Integer code = ErrorEnum.ASSERT_MYBATIS_ERROR.getCode(); + String msg = Objects.requireNonNull(e.getMessage()); + return AjaxResult.failed(code, msg); + } + +} diff --git a/yj-common/src/main/java/com/yj/common/exception/LoginException.java b/yj-common/src/main/java/com/yj/common/exception/LoginException.java new file mode 100644 index 0000000..266fe71 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/exception/LoginException.java @@ -0,0 +1,18 @@ +package com.yj.common.exception; + +import com.yj.common.enums.ErrorEnum; + +/** + * 登录异常类 + */ +public class LoginException extends BaseException { + + public LoginException(Integer code, String msg) { + super(code, msg, ErrorEnum.SHOW_MSG.getCode()); + } + + public LoginException(Integer code, String msg, Integer show) { + super(code, msg, show); + } + +} diff --git a/yj-common/src/main/java/com/yj/common/exception/OperateException.java b/yj-common/src/main/java/com/yj/common/exception/OperateException.java new file mode 100644 index 0000000..71bf84d --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/exception/OperateException.java @@ -0,0 +1,21 @@ +package com.yj.common.exception; + +import com.yj.common.enums.ErrorEnum; + +/** + * 操作系统异常 + */ +public class OperateException extends BaseException { + + public OperateException(String msg) { + super(ErrorEnum.FAILED.getCode(), msg, ErrorEnum.SHOW_MSG.getCode()); + } + + public OperateException(String msg, Integer errCode) { + super(errCode, msg, ErrorEnum.SHOW_MSG.getCode()); + } + + public OperateException(String msg, Integer errCode, Integer showCode) { + super(errCode, msg, showCode); + } +} diff --git a/yj-common/src/main/java/com/yj/common/exception/PaymentException.java b/yj-common/src/main/java/com/yj/common/exception/PaymentException.java new file mode 100644 index 0000000..8f8e37b --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/exception/PaymentException.java @@ -0,0 +1,18 @@ +package com.yj.common.exception; + +import com.yj.common.enums.ErrorEnum; + +/** + * 支付失败异常 + */ +public class PaymentException extends BaseException { + + public PaymentException(String msg) { + super(ErrorEnum.FAILED.getCode(), msg, ErrorEnum.SHOW_MSG.getCode()); + } + + public PaymentException(String msg, Integer errCode) { + super(errCode, msg, ErrorEnum.SHOW_MSG.getCode()); + } + +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/ConfigMapper.java b/yj-common/src/main/java/com/yj/common/mapper/ConfigMapper.java new file mode 100644 index 0000000..915d502 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/ConfigMapper.java @@ -0,0 +1,12 @@ +package com.yj.common.mapper; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.Config; +import org.apache.ibatis.annotations.Mapper; + +/** + * 系统配置 + */ +@Mapper +public interface ConfigMapper extends IBaseMapper { +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/DevCrontabMapper.java b/yj-common/src/main/java/com/yj/common/mapper/DevCrontabMapper.java new file mode 100644 index 0000000..34e4e4f --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/DevCrontabMapper.java @@ -0,0 +1,12 @@ +package com.yj.common.mapper; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.DevCrontab; +import org.apache.ibatis.annotations.Mapper; + +/** + * 计划任务Mapper + */ +@Mapper +public interface DevCrontabMapper extends IBaseMapper { +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/OfficialAccountReplyMapper.java b/yj-common/src/main/java/com/yj/common/mapper/OfficialAccountReplyMapper.java new file mode 100644 index 0000000..1b32de2 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/OfficialAccountReplyMapper.java @@ -0,0 +1,12 @@ +package com.yj.common.mapper; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.OfficialAccountReply; +import org.apache.ibatis.annotations.Mapper; + +/** + * 公众号回复Mapper + */ +@Mapper +public interface OfficialAccountReplyMapper extends IBaseMapper { +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/RechargeOrderMapper.java b/yj-common/src/main/java/com/yj/common/mapper/RechargeOrderMapper.java new file mode 100644 index 0000000..37d9f45 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/RechargeOrderMapper.java @@ -0,0 +1,38 @@ +package com.yj.common.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.RechargeOrder; +import com.yj.common.util.TimeUtils; +import com.yj.common.util.ToolUtils; + +/** + * 充值订单Mapper + */ +public interface RechargeOrderMapper extends IBaseMapper { + + /** + * 生成唯一单号 + * + * @author fzr + * @param field 字段名 + * @return String + */ + default String randMakeOrderSn(String field) { + String date = TimeUtils.timestampToDate(System.currentTimeMillis()/1000, "yyyyMyjHHmmss"); + String sn; + while (true) { + sn = date + ToolUtils.randomInt(12); + RechargeOrder snModel = this.selectOne( + new QueryWrapper() + .select("id") + .eq(field, sn) + .last("limit 1")); + if (snModel == null) { + break; + } + } + return sn; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/RefundLogMapper.java b/yj-common/src/main/java/com/yj/common/mapper/RefundLogMapper.java new file mode 100644 index 0000000..38c2163 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/RefundLogMapper.java @@ -0,0 +1,40 @@ +package com.yj.common.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.RefundLog; +import com.yj.common.util.TimeUtils; +import com.yj.common.util.ToolUtils; +import org.apache.ibatis.annotations.Mapper; + +/** + * 退款日志Mapper + */ +@Mapper +public interface RefundLogMapper extends IBaseMapper { + + /** + * 生成唯一单号 + * + * @author fzr + * @param field 字段名 + * @return String + */ + default String randMakeOrderSn(String field) { + String date = TimeUtils.timestampToDate(System.currentTimeMillis()/1000, "yyyyMyjHHmmss"); + String sn; + while (true) { + sn = date + ToolUtils.randomInt(12); + RefundLog snModel = this.selectOne( + new QueryWrapper() + .select("id") + .eq(field, sn) + .last("limit 1")); + if (snModel == null) { + break; + } + } + return sn; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/RefundRecordMapper.java b/yj-common/src/main/java/com/yj/common/mapper/RefundRecordMapper.java new file mode 100644 index 0000000..b58b089 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/RefundRecordMapper.java @@ -0,0 +1,40 @@ +package com.yj.common.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.RefundRecord; +import com.yj.common.util.TimeUtils; +import com.yj.common.util.ToolUtils; +import org.apache.ibatis.annotations.Mapper; + +/** + * 退款记录Mapper + */ +@Mapper +public interface RefundRecordMapper extends IBaseMapper { + + /** + * 生成唯一单号 + * + * @author fzr + * @param field 字段名 + * @return String + */ + default String randMakeOrderSn(String field) { + String date = TimeUtils.timestampToDate(System.currentTimeMillis()/1000, "yyyyMyjHHmmss"); + String sn; + while (true) { + sn = date + ToolUtils.randomInt(12); + RefundRecord snModel = this.selectOne( + new QueryWrapper() + .select("id") + .eq(field, sn) + .last("limit 1")); + if (snModel == null) { + break; + } + } + return sn; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/admin/AdminDeptMapper.java b/yj-common/src/main/java/com/yj/common/mapper/admin/AdminDeptMapper.java new file mode 100644 index 0000000..bb9e301 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/admin/AdminDeptMapper.java @@ -0,0 +1,13 @@ +package com.yj.common.mapper.admin; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.admin.AdminDept; +import org.apache.ibatis.annotations.Mapper; + +/** + * 角色关联表Mapper + */ +@Mapper +public interface AdminDeptMapper extends IBaseMapper { + +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/admin/AdminJobsMapper.java b/yj-common/src/main/java/com/yj/common/mapper/admin/AdminJobsMapper.java new file mode 100644 index 0000000..aa02840 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/admin/AdminJobsMapper.java @@ -0,0 +1,15 @@ +package com.yj.common.mapper.admin; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.admin.AdminJobs; +import org.apache.ibatis.annotations.Mapper; + +/** + * 角色关联表Mapper + */ +@Mapper +public interface AdminJobsMapper extends IBaseMapper { + + + +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/admin/AdminMapper.java b/yj-common/src/main/java/com/yj/common/mapper/admin/AdminMapper.java new file mode 100644 index 0000000..73dd239 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/admin/AdminMapper.java @@ -0,0 +1,29 @@ +package com.yj.common.mapper.admin; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.admin.Admin; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 系统管理员Mapper + */ +@Mapper +public interface AdminMapper extends IBaseMapper { + + + @Select("SELECT * FROM yj_admin admin INNER JOIN yj_admin_dept lad ON admin.id = lad.admin_id WHERE lad.dept_id = #{deptId} AND admin.delete_time IS NULL") + List getByDept(@Param("deptId") Integer deptId); + + @Select("SELECT * FROM yj_admin admin INNER JOIN yj_admin_jobs lad ON admin.id = lad.admin_id WHERE lad.jobs_id = #{jobId} AND admin.delete_time IS NULL") + List getByJobs(@Param("jobId") Integer jobId); + + + @Select("SELECT count(*) FROM yj_admin admin INNER JOIN yj_admin_role lad ON admin.id = lad.admin_id WHERE lad.role_id = #{roleId} AND admin.delete_time IS NULL") + Integer getCountByRoleId(@Param("roleId") Integer roleId); + + +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/admin/AdminRoleMapper.java b/yj-common/src/main/java/com/yj/common/mapper/admin/AdminRoleMapper.java new file mode 100644 index 0000000..3bf16d4 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/admin/AdminRoleMapper.java @@ -0,0 +1,13 @@ +package com.yj.common.mapper.admin; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.admin.AdminRole; +import org.apache.ibatis.annotations.Mapper; + +/** + * 角色关联表Mapper + */ +@Mapper +public interface AdminRoleMapper extends IBaseMapper { + +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/admin/DeptMapper.java b/yj-common/src/main/java/com/yj/common/mapper/admin/DeptMapper.java new file mode 100644 index 0000000..9c35f76 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/admin/DeptMapper.java @@ -0,0 +1,20 @@ +package com.yj.common.mapper.admin; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.admin.Dept; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 部门表Mapper + */ +@Mapper +public interface DeptMapper extends IBaseMapper { + + @Select("SELECT * FROM yj_dept dept INNER JOIN yj_admin_dept lad ON lad.dept_id = dept.id WHERE lad.admin_id = #{adminId} AND dept.delete_time IS NULL") + List getByAdminId(@Param("adminId") Integer adminId); + +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/admin/JobsMapper.java b/yj-common/src/main/java/com/yj/common/mapper/admin/JobsMapper.java new file mode 100644 index 0000000..e4ef748 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/admin/JobsMapper.java @@ -0,0 +1,20 @@ +package com.yj.common.mapper.admin; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.admin.Jobs; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 岗位表Mapper + */ +@Mapper +public interface JobsMapper extends IBaseMapper { + + @Select("SELECT * FROM yj_jobs jobs INNER JOIN yj_admin_jobs laj ON laj.jobs_id = jobs.id WHERE laj.admin_id = #{adminId} AND jobs.delete_time IS NULL") + List getByAdminId(@Param("adminId") Integer adminId); + +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/album/FileCateMapper.java b/yj-common/src/main/java/com/yj/common/mapper/album/FileCateMapper.java new file mode 100644 index 0000000..0bffa92 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/album/FileCateMapper.java @@ -0,0 +1,12 @@ +package com.yj.common.mapper.album; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.file.FileCate; +import org.apache.ibatis.annotations.Mapper; + +/** + * 相册分类 + */ +@Mapper +public interface FileCateMapper extends IBaseMapper { +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/album/FileMapper.java b/yj-common/src/main/java/com/yj/common/mapper/album/FileMapper.java new file mode 100644 index 0000000..344db5e --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/album/FileMapper.java @@ -0,0 +1,12 @@ +package com.yj.common.mapper.album; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.file.File; +import org.apache.ibatis.annotations.Mapper; + +/** + * 相册 + */ +@Mapper +public interface FileMapper extends IBaseMapper { +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/article/ArticleCateMapper.java b/yj-common/src/main/java/com/yj/common/mapper/article/ArticleCateMapper.java new file mode 100644 index 0000000..a54bd03 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/article/ArticleCateMapper.java @@ -0,0 +1,12 @@ +package com.yj.common.mapper.article; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.article.ArticleCate; +import org.apache.ibatis.annotations.Mapper; + +/** + * 文章分类 + */ +@Mapper +public interface ArticleCateMapper extends IBaseMapper { +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/article/ArticleCollectMapper.java b/yj-common/src/main/java/com/yj/common/mapper/article/ArticleCollectMapper.java new file mode 100644 index 0000000..6648044 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/article/ArticleCollectMapper.java @@ -0,0 +1,12 @@ +package com.yj.common.mapper.article; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.article.ArticleCollect; +import org.apache.ibatis.annotations.Mapper; + +/** + * 文章收藏Mapper + */ +@Mapper +public interface ArticleCollectMapper extends IBaseMapper { +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/article/ArticleMapper.java b/yj-common/src/main/java/com/yj/common/mapper/article/ArticleMapper.java new file mode 100644 index 0000000..d2db1bb --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/article/ArticleMapper.java @@ -0,0 +1,12 @@ +package com.yj.common.mapper.article; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.article.Article; +import org.apache.ibatis.annotations.Mapper; + +/** + * 文章 + */ +@Mapper +public interface ArticleMapper extends IBaseMapper
{ +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/decorate/DecoratePageMapper.java b/yj-common/src/main/java/com/yj/common/mapper/decorate/DecoratePageMapper.java new file mode 100644 index 0000000..68cba05 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/decorate/DecoratePageMapper.java @@ -0,0 +1,12 @@ +package com.yj.common.mapper.decorate; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.decorate.DecoratePage; +import org.apache.ibatis.annotations.Mapper; + +/** + * 页面装修Mapper + */ +@Mapper +public interface DecoratePageMapper extends IBaseMapper { +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/decorate/DecorateTabbarMapper.java b/yj-common/src/main/java/com/yj/common/mapper/decorate/DecorateTabbarMapper.java new file mode 100644 index 0000000..4c8c4c8 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/decorate/DecorateTabbarMapper.java @@ -0,0 +1,12 @@ +package com.yj.common.mapper.decorate; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.decorate.DecorateTabbar; +import org.apache.ibatis.annotations.Mapper; + +/** + * 底部导航Mapper + */ +@Mapper +public interface DecorateTabbarMapper extends IBaseMapper { +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/log/UserAccountLogMapper.java b/yj-common/src/main/java/com/yj/common/mapper/log/UserAccountLogMapper.java new file mode 100644 index 0000000..c5b9183 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/log/UserAccountLogMapper.java @@ -0,0 +1,126 @@ +package com.yj.common.mapper.log; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.log.UserAccountLog; +import com.yj.common.entity.user.User; +import com.yj.common.enums.AccountLogEnum; +import com.yj.common.mapper.user.UserMapper; +import com.yj.common.util.SpringUtils; +import com.yj.common.util.StringUtils; +import com.yj.common.util.TimeUtils; +import com.yj.common.util.ToolUtils; +import org.apache.ibatis.annotations.Mapper; + +import java.math.BigDecimal; + +/** + * 账户变动Mapper + */ +@Mapper +public interface UserAccountLogMapper extends IBaseMapper { + + /** + * 增加 + * + * @param userId 用户ID + * @param changeType 变动类型 + * @param changeAmount 变动金额 + * @param sourceId 来源ID + * @param sourceSn 来源订单 + * @param remark 备注信息 + * @param extra 预留字段 + */ + default void add(Integer userId, Integer changeType, BigDecimal changeAmount, + Integer sourceId, String sourceSn, String remark, String extra) { + + for (int i=0; i<=0; i++) { + UserMapper userMapper = SpringUtils.getBean(UserMapper.class); + User user = userMapper.selectById(userId); + if (StringUtils.isNull(user)) { + break; + } + + Integer changeObject = AccountLogEnum.getChangeObject(changeType); + + BigDecimal leftAmount = user.getUserMoney().add(changeAmount); + UserAccountLog logMoney = new UserAccountLog(); + logMoney.setSn(this.randMakeOrderSn()); + logMoney.setUserId(userId); + logMoney.setSourceSn(sourceSn); + logMoney.setChangeObject(changeObject); + logMoney.setChangeType(changeType); + logMoney.setChangeAmount(changeAmount); + logMoney.setLeftAmount(leftAmount); + logMoney.setAction(1); + logMoney.setRemark(remark); + logMoney.setExtra(extra); + logMoney.setCreateTime(System.currentTimeMillis() / 1000); + logMoney.setUpdateTime(System.currentTimeMillis() / 1000); + this.insert(logMoney); + } + } + + /** + * 减少 + * + * @param userId 用户ID + * @param changeType 变动类型 + * @param changeAmount 变动金额 + * @param sourceId 来源ID + * @param sourceSn 来源订单 + * @param remark 备注信息 + * @param extra 预留字段 + */ + default void dec(Integer userId, Integer changeType, BigDecimal changeAmount, + Integer sourceId, String sourceSn, String remark, String extra) { + + for (int i=0; i<=0; i++) { + UserMapper userMapper = SpringUtils.getBean(UserMapper.class); + User user = userMapper.selectById(userId); + if (StringUtils.isNull(user)) { + break; + } + + BigDecimal leftAmount = user.getUserMoney().subtract(changeAmount); + + UserAccountLog logMoney = new UserAccountLog(); + logMoney.setSn(this.randMakeOrderSn()); + logMoney.setUserId(userId); + logMoney.setSourceSn(sourceSn); + logMoney.setChangeType(changeType); + logMoney.setChangeAmount(changeAmount); + logMoney.setLeftAmount(leftAmount); + logMoney.setAction(2); + logMoney.setRemark(remark); + logMoney.setExtra(extra); + logMoney.setCreateTime(System.currentTimeMillis() / 1000); + logMoney.setUpdateTime(System.currentTimeMillis() / 1000); + this.insert(logMoney); + } + } + + /** + * 生成唯一流水号 + * + * @author fzr + * @return String + */ + default String randMakeOrderSn() { + String date = TimeUtils.timestampToDate(System.currentTimeMillis()/1000, "yyyyMyjHHmmss"); + String sn; + while (true) { + sn = date + ToolUtils.randomInt(12); + UserAccountLog snModel = this.selectOne( + new QueryWrapper() + .select("id") + .eq("sn", sn) + .last("limit 1")); + if (snModel == null) { + break; + } + } + return sn; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/notice/NoticeRecordMapper.java b/yj-common/src/main/java/com/yj/common/mapper/notice/NoticeRecordMapper.java new file mode 100644 index 0000000..77b04d3 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/notice/NoticeRecordMapper.java @@ -0,0 +1,12 @@ +package com.yj.common.mapper.notice; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.notice.NoticeRecord; +import org.apache.ibatis.annotations.Mapper; + +/** + * 通知记录Mapper + */ +@Mapper +public interface NoticeRecordMapper extends IBaseMapper { +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/notice/NoticeSettingMapper.java b/yj-common/src/main/java/com/yj/common/mapper/notice/NoticeSettingMapper.java new file mode 100644 index 0000000..c1a525f --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/notice/NoticeSettingMapper.java @@ -0,0 +1,12 @@ +package com.yj.common.mapper.notice; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.notice.NoticeSetting; +import org.apache.ibatis.annotations.Mapper; + +/** + * 通知设置Mapper + */ +@Mapper +public interface NoticeSettingMapper extends IBaseMapper { +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/setting/DevPayConfigMapper.java b/yj-common/src/main/java/com/yj/common/mapper/setting/DevPayConfigMapper.java new file mode 100644 index 0000000..afd78c3 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/setting/DevPayConfigMapper.java @@ -0,0 +1,12 @@ +package com.yj.common.mapper.setting; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.setting.DevPayConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * 支付配置Mapper + */ +@Mapper +public interface DevPayConfigMapper extends IBaseMapper { +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/setting/DevPayWayMapper.java b/yj-common/src/main/java/com/yj/common/mapper/setting/DevPayWayMapper.java new file mode 100644 index 0000000..bde6581 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/setting/DevPayWayMapper.java @@ -0,0 +1,12 @@ +package com.yj.common.mapper.setting; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.setting.DevPayWay; +import org.apache.ibatis.annotations.Mapper; + +/** + * 支付方式Mapper + */ +@Mapper +public interface DevPayWayMapper extends IBaseMapper { +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/setting/DictDataMapper.java b/yj-common/src/main/java/com/yj/common/mapper/setting/DictDataMapper.java new file mode 100644 index 0000000..0943e24 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/setting/DictDataMapper.java @@ -0,0 +1,12 @@ +package com.yj.common.mapper.setting; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.setting.DictData; +import org.apache.ibatis.annotations.Mapper; + +/** + * 字典数据Mapper + */ +@Mapper +public interface DictDataMapper extends IBaseMapper { +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/setting/DictTypeMapper.java b/yj-common/src/main/java/com/yj/common/mapper/setting/DictTypeMapper.java new file mode 100644 index 0000000..49d2562 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/setting/DictTypeMapper.java @@ -0,0 +1,12 @@ +package com.yj.common.mapper.setting; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.setting.DictType; +import org.apache.ibatis.annotations.Mapper; + +/** + * 字典类型Mapper + */ +@Mapper +public interface DictTypeMapper extends IBaseMapper { +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/setting/HotSearchMapper.java b/yj-common/src/main/java/com/yj/common/mapper/setting/HotSearchMapper.java new file mode 100644 index 0000000..71647c2 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/setting/HotSearchMapper.java @@ -0,0 +1,12 @@ +package com.yj.common.mapper.setting; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.setting.HotSearch; +import org.apache.ibatis.annotations.Mapper; + +/** + * 热门搜索Mapper + */ +@Mapper +public interface HotSearchMapper extends IBaseMapper { +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/smsLog/SmsLogMapper.java b/yj-common/src/main/java/com/yj/common/mapper/smsLog/SmsLogMapper.java new file mode 100644 index 0000000..f20c015 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/smsLog/SmsLogMapper.java @@ -0,0 +1,12 @@ +package com.yj.common.mapper.smsLog; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.smsLog.SmsLog; +import org.apache.ibatis.annotations.Mapper; + +/** + * 短信记录 + */ +@Mapper +public interface SmsLogMapper extends IBaseMapper { +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/system/SystemLogLoginMapper.java b/yj-common/src/main/java/com/yj/common/mapper/system/SystemLogLoginMapper.java new file mode 100644 index 0000000..6b77dee --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/system/SystemLogLoginMapper.java @@ -0,0 +1,12 @@ +package com.yj.common.mapper.system; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.system.SystemLogLogin; +import org.apache.ibatis.annotations.Mapper; + +/** + * 系统登录日志 + */ +@Mapper +public interface SystemLogLoginMapper extends IBaseMapper { +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/system/SystemLogOperateMapper.java b/yj-common/src/main/java/com/yj/common/mapper/system/SystemLogOperateMapper.java new file mode 100644 index 0000000..ead1c30 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/system/SystemLogOperateMapper.java @@ -0,0 +1,12 @@ +package com.yj.common.mapper.system; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.system.OperationLog; +import org.apache.ibatis.annotations.Mapper; + +/** + * 系统操作日志 + */ +@Mapper +public interface SystemLogOperateMapper extends IBaseMapper { +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/system/SystemMenuMapper.java b/yj-common/src/main/java/com/yj/common/mapper/system/SystemMenuMapper.java new file mode 100644 index 0000000..fcd9dc8 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/system/SystemMenuMapper.java @@ -0,0 +1,30 @@ +package com.yj.common.mapper.system; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.system.SystemMenu; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 系统菜单Mapper + */ +@Mapper +public interface SystemMenuMapper extends IBaseMapper { + + @Select({""}) + List getPerms(@Param("items") List menuIds); + + + + +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/system/SystemRoleMapper.java b/yj-common/src/main/java/com/yj/common/mapper/system/SystemRoleMapper.java new file mode 100644 index 0000000..85ca711 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/system/SystemRoleMapper.java @@ -0,0 +1,21 @@ +package com.yj.common.mapper.system; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.system.SystemRole; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 系统角色Mapper + */ +@Mapper +public interface SystemRoleMapper extends IBaseMapper { + + + @Select("SELECT * FROM yj_system_role role INNER JOIN yj_admin_role lar ON lar.role_id = role.id WHERE lar.admin_id = #{adminId} AND role.delete_time IS NULL") + List getByAdminId(@Param("adminId") Integer adminId); + +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/system/SystemRoleMenuMapper.java b/yj-common/src/main/java/com/yj/common/mapper/system/SystemRoleMenuMapper.java new file mode 100644 index 0000000..6744397 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/system/SystemRoleMenuMapper.java @@ -0,0 +1,23 @@ +package com.yj.common.mapper.system; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.system.SystemRoleMenu; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 系统菜单Mapper + */ +@Mapper +public interface SystemRoleMenuMapper extends IBaseMapper { + + + @Select("SELECT DISTINCT menuR.menu_id FROM yj_system_role_menu menuR INNER JOIN yj_system_role role ON menuR.role_id = role.id INNER JOIN yj_admin_role lar ON lar.role_id = role.id WHERE lar.admin_id = #{adminId} AND role.delete_time IS NULL") + List getMenuIds(@Param("adminId") Integer adminId); + + + +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/user/UserAuthMapper.java b/yj-common/src/main/java/com/yj/common/mapper/user/UserAuthMapper.java new file mode 100644 index 0000000..f21c0da --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/user/UserAuthMapper.java @@ -0,0 +1,12 @@ +package com.yj.common.mapper.user; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.user.UserAuth; +import org.apache.ibatis.annotations.Mapper; + +/** + * 用户授权Mapper + */ +@Mapper +public interface UserAuthMapper extends IBaseMapper { +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/user/UserMapper.java b/yj-common/src/main/java/com/yj/common/mapper/user/UserMapper.java new file mode 100644 index 0000000..a8da8f9 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/user/UserMapper.java @@ -0,0 +1,12 @@ +package com.yj.common.mapper.user; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.user.User; +import org.apache.ibatis.annotations.Mapper; + +/** + * 用户Mapper + */ +@Mapper +public interface UserMapper extends IBaseMapper { +} diff --git a/yj-common/src/main/java/com/yj/common/mapper/user/UserSessionMapper.java b/yj-common/src/main/java/com/yj/common/mapper/user/UserSessionMapper.java new file mode 100644 index 0000000..21e47ae --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/mapper/user/UserSessionMapper.java @@ -0,0 +1,12 @@ +package com.yj.common.mapper.user; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.common.entity.user.UserSession; +import org.apache.ibatis.annotations.Mapper; + +/** + * 用户授权Mapper + */ +@Mapper +public interface UserSessionMapper extends IBaseMapper { +} diff --git a/yj-common/src/main/java/com/yj/common/plugin/notice/NoticeCheck.java b/yj-common/src/main/java/com/yj/common/plugin/notice/NoticeCheck.java new file mode 100644 index 0000000..14d0cb3 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/plugin/notice/NoticeCheck.java @@ -0,0 +1,53 @@ +package com.yj.common.plugin.notice; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.common.entity.smsLog.SmsLog; +import com.yj.common.enums.NoticeEnum; +import com.yj.common.enums.SmsEnum; +import com.yj.common.enums.YesNoEnum; +import com.yj.common.mapper.smsLog.SmsLogMapper; +import com.yj.common.util.SpringUtils; +import com.yj.common.util.StringUtils; + +/** + * 通知验证码验证器 + */ +public class NoticeCheck { + + public static Boolean verify(Integer sceneId, String code, String mobile) { + + SmsLogMapper smsLogMapper = SpringUtils.getBean(SmsLogMapper.class); + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("mobile", mobile); + queryWrapper.eq("send_status", SmsEnum.SEND_SUCCESS.getCode()); + queryWrapper.in("scene_id", NoticeEnum.getSmsScene()); + queryWrapper.eq("is_verify", YesNoEnum.NO.getCode()); + if (sceneId.equals(0) == false) { + queryWrapper.eq("scene_id", sceneId); + } + queryWrapper.orderByDesc("send_time"); + queryWrapper.last("limit 1"); + SmsLog smsLog = smsLogMapper.selectOne(queryWrapper); + + if (StringUtils.isNull(smsLog)) { + return false; + } + + // 没有验证码 或 最新验证码已校验 或 已过期(有效期:5分钟) + if (smsLog.getIsVerify().equals(1) || smsLog.getSendTime() < System.currentTimeMillis() / 1000 - (5*60)) { + return false; + } + + // 更新校验状态 + smsLog.setCheckNum(smsLog.getCheckNum() + 1); + if (smsLog.getCode().equals(code)) { + smsLog.setIsVerify(YesNoEnum.YES.getCode()); + smsLogMapper.updateById(smsLog); + return true; + } else { + smsLogMapper.updateById(smsLog); + return false; + } + } + +} diff --git a/yj-common/src/main/java/com/yj/common/plugin/notice/NoticeDriver.java b/yj-common/src/main/java/com/yj/common/plugin/notice/NoticeDriver.java new file mode 100644 index 0000000..b018723 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/plugin/notice/NoticeDriver.java @@ -0,0 +1,40 @@ +package com.yj.common.plugin.notice; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.common.entity.notice.NoticeSetting; +import com.yj.common.exception.OperateException; +import com.yj.common.mapper.notice.NoticeSettingMapper; +import com.yj.common.plugin.notice.engine.SmsNoticeHandle; +import com.yj.common.plugin.notice.template.SmsTemplate; +import com.yj.common.plugin.notice.vo.NoticeSmsVo; +import com.yj.common.util.SpringUtils; +import com.yj.common.util.StringUtils; + +/** + * 通知驱动 + */ +public class NoticeDriver { + + public static void handle(NoticeSmsVo noticeSmsVo) { + // 场景模板 + NoticeSettingMapper noticeSettingMapper = SpringUtils.getBean(NoticeSettingMapper.class); + NoticeSetting noticeSetting = noticeSettingMapper.selectOne( + new QueryWrapper() + .eq("scene_id", noticeSmsVo.getScene()) + .last("limit 1")); + + if (StringUtils.isNull(noticeSetting)) { + throw new OperateException("消息场景不存在!"); + } + + // 短信通知 + SmsTemplate smsTemplate = new SmsTemplate(); + smsTemplate.setName(noticeSetting.getSceneName()); + smsTemplate.setType(noticeSetting.getType()); + smsTemplate.setParams(noticeSetting.getSmsNotice()); + if (StringUtils.isNotNull(smsTemplate.getStatus()) && smsTemplate.getStatus().equals(1)) { + (new SmsNoticeHandle()).send(noticeSmsVo, smsTemplate); + } + } + +} diff --git a/yj-common/src/main/java/com/yj/common/plugin/notice/engine/MpNoticeHandle.java b/yj-common/src/main/java/com/yj/common/plugin/notice/engine/MpNoticeHandle.java new file mode 100644 index 0000000..7d0aa93 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/plugin/notice/engine/MpNoticeHandle.java @@ -0,0 +1,11 @@ +package com.yj.common.plugin.notice.engine; + +import java.util.Map; + +public class MpNoticeHandle { + + public void send(Map config, Map params, Map smsTemplate) { + + } + +} diff --git a/yj-common/src/main/java/com/yj/common/plugin/notice/engine/OaNoticeHandle.java b/yj-common/src/main/java/com/yj/common/plugin/notice/engine/OaNoticeHandle.java new file mode 100644 index 0000000..d53e92d --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/plugin/notice/engine/OaNoticeHandle.java @@ -0,0 +1,11 @@ +package com.yj.common.plugin.notice.engine; + +import java.util.Map; + +public class OaNoticeHandle { + + public void send(Map config, Map params, Map smsTemplate) { + + } + +} diff --git a/yj-common/src/main/java/com/yj/common/plugin/notice/engine/SmsNoticeHandle.java b/yj-common/src/main/java/com/yj/common/plugin/notice/engine/SmsNoticeHandle.java new file mode 100644 index 0000000..c51bb4c --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/plugin/notice/engine/SmsNoticeHandle.java @@ -0,0 +1,178 @@ +package com.yj.common.plugin.notice.engine; + +import com.yj.common.entity.notice.NoticeRecord; +import com.yj.common.entity.smsLog.SmsLog; +import com.yj.common.enums.NoticeEnum; +import com.yj.common.exception.OperateException; +import com.yj.common.mapper.notice.NoticeRecordMapper; +import com.yj.common.mapper.smsLog.SmsLogMapper; +import com.yj.common.plugin.notice.vo.NoticeSmsVo; +import com.yj.common.plugin.notice.template.SmsTemplate; +import com.yj.common.plugin.sms.SmsDriver; +import com.yj.common.util.ConfigUtils; +import com.yj.common.util.SpringUtils; +import com.yj.common.util.StringUtils; + +import java.util.*; + +/** + * 短信通知 + */ +public class SmsNoticeHandle { + + /** + * 发送短信通知 + * + * @author fzr + * @param noticeSmsVo 基础配置 + * @param smsTemplate 短信模板 + */ + public void send(NoticeSmsVo noticeSmsVo, SmsTemplate smsTemplate) { + // 基础参数 + String mobile = noticeSmsVo.getMobile(); + Integer scene = noticeSmsVo.getScene(); + + // 模板参数 + Map params = new LinkedHashMap<>(); + if (StringUtils.isNotNull(noticeSmsVo.getParams())) { + for (String s : noticeSmsVo.getParams()) { + String[] arr = s.split(":"); + String key = arr[0].trim(); + String val = arr[1].trim(); + params.put(key, val); + } + } + + // 消息记录 + NoticeRecordMapper noticeRecordMapper = SpringUtils.getBean(NoticeRecordMapper.class); + int expire = StringUtils.isNull(noticeSmsVo.getExpire()) ? 0 : noticeSmsVo.getExpire(); + NoticeRecord noticeRecord = new NoticeRecord(); + noticeRecord.setSceneId(scene); + noticeRecord.setUserId(0); + noticeRecord.setTitle(smsTemplate.getName()); + noticeRecord.setContent(this.getContent(params, smsTemplate.getContent())); + noticeRecord.setRecipient(NoticeEnum.SENDER_SMS.getCode()); + noticeRecord.setRead(NoticeEnum.VIEW_UNREAD.getCode()); + noticeRecord.setCreateTime(System.currentTimeMillis() / 1000); + noticeRecord.setUpdateTime(System.currentTimeMillis() / 1000); + noticeRecord.setNoticeType(NoticeEnum.SENDER_SMS.getCode()); + noticeRecordMapper.insert(noticeRecord); + + //记录到sms log + SmsLogMapper smsLogMapper = SpringUtils.getBean(SmsLogMapper.class); + SmsLog smsLog = new SmsLog(); + smsLog.setSceneId(noticeSmsVo.getScene()); + smsLog.setMobile(noticeSmsVo.getMobile()); + smsLog.setContent(this.getContent(params, smsTemplate.getContent())); + smsLog.setCode(noticeSmsVo.getCode()); + + // 消息发送 + if (StringUtils.isNotEmpty(mobile)) { + try { + (new SmsDriver()) + .setMobile(mobile) + .setTemplateCode(smsTemplate.getTemplateId()) + .setTemplateParam(this.getSmsParams(params, smsTemplate.getContent())) + .sendSms(); + + noticeRecord.setUpdateTime(System.currentTimeMillis() / 1000); + noticeRecordMapper.updateById(noticeRecord); + + //记录到log + smsLog.setIsVerify(0); + smsLog.setCheckNum(0); + smsLog.setSendStatus(1); + smsLog.setSendTime(System.currentTimeMillis() / 1000); + smsLog.setCreateTime(System.currentTimeMillis() / 1000); + smsLog.setUpdateTime(System.currentTimeMillis() / 1000); + smsLogMapper.insert(smsLog); + + } catch (OperateException e) { + noticeRecord.setUpdateTime(System.currentTimeMillis() / 1000); + noticeRecordMapper.updateById(noticeRecord); + + //记录到log + smsLog.setIsVerify(0); + smsLog.setCheckNum(0); + smsLog.setSendStatus(2); + smsLog.setResults(e.getMsg()); + smsLog.setSendTime(System.currentTimeMillis() / 1000); + smsLog.setCreateTime(System.currentTimeMillis() / 1000); + smsLog.setUpdateTime(System.currentTimeMillis() / 1000); + smsLogMapper.insert(smsLog); + + throw new OperateException(e.getMsg()); + } + } + } + + /** + * 获取短信内容 + * + * @author fzr + * @param params 短信参数 + * @param content 短信模板 + * @return String 短信内容 + */ + private String getContent(Map params, String content) { + for (Map.Entry entry : params.entrySet()) { + String searchReplace = "\\$\\{" + entry.getKey() + "}"; + content = content.replaceAll(searchReplace, entry.getValue()); + } + + return content; + } + + /** + * 腾讯云参数处理 + * + * @author fzr + * @param params 短信参数 + * @param content 短信内容 + * @return Map + */ + private Map getSmsParams(Map params, String content) { + String engine = ConfigUtils.get("sms", "default", ""); + if (!engine.equals("tencent")) { + return params; + } + + // 获取内容变量 + List arr = new LinkedList<>(); + for (Map.Entry entry : params.entrySet()) { + String search = "\\$\\{" + entry.getKey() + "}"; + if (content.indexOf(search) != 1 && !arr.contains(entry.getKey())) { + arr.add(entry.getKey()); + } + } + + // 获取变量名称 + List arrIndex = new LinkedList<>(); + Map arr2 = new LinkedHashMap<>(); + if (arr.size() > 0) { + for (String v: arr) { + int k = content.indexOf(v); + arrIndex.add(k); + arr2.put(k, v); + } + } + + // 从小到大排序 + List arr3 = new LinkedList<>(); + Collections.sort(arrIndex); + for (Integer i : arrIndex) { + arr3.add(arr2.get(i)); + } + + // 取变量对应值 + Map arr4 = new LinkedHashMap<>(); + for (String v : arr3) { + if (StringUtils.isNotNull(params.get(v))) { + arr4.put(params.get(v), ""); + } + } + + return arr4; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/plugin/notice/template/SmsTemplate.java b/yj-common/src/main/java/com/yj/common/plugin/notice/template/SmsTemplate.java new file mode 100644 index 0000000..a45b4bd --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/plugin/notice/template/SmsTemplate.java @@ -0,0 +1,36 @@ +package com.yj.common.plugin.notice.template; + +import com.yj.common.util.MapUtils; +import lombok.Data; + +import java.util.Map; + +@Data +public class SmsTemplate { + + /** 通知名称 */ + private String name; + + /** 通知类型: 1=业务,2=验证码 */ + private Integer type; + + /** 短信模板内容 */ + private String templateId; + + /** 短信模板内容 */ + private String content; + + /** 短信模板状态 */ + private Integer status; + + /** + * 设置参数 + */ + public void setParams(String smsNotice) { + Map config = MapUtils.jsonToMap(smsNotice); + this.setTemplateId(config.getOrDefault("template_id", "")); + this.setContent(config.getOrDefault("content", "")); + this.setStatus(Integer.parseInt(config.getOrDefault("status", "0"))); + } + +} diff --git a/yj-common/src/main/java/com/yj/common/plugin/notice/vo/NoticeSmsVo.java b/yj-common/src/main/java/com/yj/common/plugin/notice/vo/NoticeSmsVo.java new file mode 100644 index 0000000..d6b75c5 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/plugin/notice/vo/NoticeSmsVo.java @@ -0,0 +1,17 @@ +package com.yj.common.plugin.notice.vo; + +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +public class NoticeSmsVo { + + private Integer scene; + private String mobile; + private Integer expire; + private String[] params; + + private String code; + +} diff --git a/yj-common/src/main/java/com/yj/common/plugin/sms/SmsDriver.java b/yj-common/src/main/java/com/yj/common/plugin/sms/SmsDriver.java new file mode 100644 index 0000000..163c51e --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/plugin/sms/SmsDriver.java @@ -0,0 +1,99 @@ +package com.yj.common.plugin.sms; + +import com.alibaba.fastjson2.JSON; +import com.yj.common.exception.OperateException; +import com.yj.common.plugin.sms.engine.AliSms; +import com.yj.common.plugin.sms.engine.TencentSms; +import com.yj.common.util.ConfigUtils; + +import java.util.Map; + +public class SmsDriver { + + private String mobile; // 手机号码 + private String templateCode; // 短信模板 + private Map templateParam; // 短信参数 + private final String engine; // 短信引擎 + private final Map config; // 短信配置 + + /** + * 构造方法 + */ + public SmsDriver() { + this.engine = ConfigUtils.get("sms", "engine", ""); + this.config = ConfigUtils.getMap("sms", this.engine); + } + + /** + * 设置手机号 + * + * @author fzr + * @param mobile 手机号 + * @return SmsDriver + */ + public SmsDriver setMobile(String mobile) { + this.mobile = mobile; + return this; + } + + /** + * 设置模板编号 + * + * @author fzr + * @param code 短信编码 + * @return SmsDriver + */ + public SmsDriver setTemplateCode(String code) { + this.templateCode = code; + return this; + } + + /** + * 设置模板参数 + * + * @author fzr + * @param param 参数 + * @return SmsDriver + */ + public SmsDriver setTemplateParam(Map param) { + this.templateParam = param; + return this; + } + + /** + * 发送短信 + * + * @author fzr + */ + public void sendSms() { + String templateParam = JSON.toJSONString(this.templateParam); + Integer sendResult = 0; + String results = ""; + switch (this.engine) { + case "ali": + AliSms aliSms = new AliSms(this.config); + results = aliSms.setMobile(this.mobile) + .setTemplateId(this.templateCode) + .setTemplateParams(templateParam) + .send(); + + sendResult = aliSms.getSendResult(); + break; + case "tencent": + TencentSms tencentSms = new TencentSms(this.config); + results = tencentSms.setMobile(this.mobile) + .setTemplateId(this.templateCode) + .setTemplateParams(this.templateParam) + .send(); + sendResult = tencentSms.getSendResult(); + break; + default: + throw new OperateException("短信类型错误"); + } + + if (sendResult == 2) { + throw new OperateException(results); + } + } + +} diff --git a/yj-common/src/main/java/com/yj/common/plugin/sms/engine/AliSms.java b/yj-common/src/main/java/com/yj/common/plugin/sms/engine/AliSms.java new file mode 100644 index 0000000..e8d72c0 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/plugin/sms/engine/AliSms.java @@ -0,0 +1,116 @@ +package com.yj.common.plugin.sms.engine; + +import com.alibaba.fastjson2.JSONObject; +import com.aliyuncs.CommonRequest; +import com.aliyuncs.CommonResponse; +import com.aliyuncs.DefaultAcsClient; +import com.aliyuncs.IAcsClient; +import com.aliyuncs.http.MethodType; +import com.aliyuncs.profile.DefaultProfile; + +import java.util.Map; + +/** + * 阿里云短信 + */ +public class AliSms { + + private Integer sendResult; // 发送结果 + private String mobile; // 手机号码 + private String templateId; // 短信模板 + private String templateParams; // 短信参数 + private final Map config; // 短信配置 + + /** + * 构造方法 + * + * @author fzr + * @param config 短信配置 + */ + public AliSms(Map config) { + this.config = config; + } + + /** + * 设置手机号 + * + * @author fzr + * @param mobile 手机号码 + * @return AliSms + */ + public AliSms setMobile(String mobile) { + this.mobile = mobile; + return this; + } + + /** + * 设置模板id + * + * @author fzr + * @param templateId 模板id + * @return AliSms + */ + public AliSms setTemplateId(String templateId) { + this.templateId = templateId; + return this; + } + + /** + * 设置模板参数 + * + * @author fzr + * @param templateParams 模板参数 + * @return AliSms + */ + public AliSms setTemplateParams(String templateParams) { + this.templateParams = templateParams; + return this; + } + + /** + * 获取发送结果 + * + * @author fzr + * @return Integer [1=成功, 2=失败] + */ + public Integer getSendResult() { + return this.sendResult; + } + + /** + * 发送短信 + * + * @author fzr + * @return String + */ + public String send() { + DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", this.config.get("app_key"), this.config.get("secret_key")); + IAcsClient client = new DefaultAcsClient(profile); + + CommonRequest request = new CommonRequest(); + request.setSysMethod(MethodType.POST); + request.setSysDomain("dysmsapi.aliyuncs.com"); + request.setSysVersion("2017-05-25"); + request.setSysAction("SendSms"); + request.putQueryParameter("PhoneNumbers", this.mobile); + request.putQueryParameter("SignName", this.config.get("sign")); + request.putQueryParameter("TemplateCode", this.templateId); + request.putQueryParameter("TemplateParam", this.templateParams); + try { + CommonResponse response = client.getCommonResponse(request); + JSONObject res = JSONObject.parseObject(response.getData()); + + if (!res.get("Code").equals("OK") || !res.get("Message").equals("OK")) { + this.sendResult = 2; + return res.get("Message").toString(); + } + + this.sendResult = 1; + return response.getData(); + } catch (Exception e) { + this.sendResult = 2; + return e.getMessage(); + } + } + +} diff --git a/yj-common/src/main/java/com/yj/common/plugin/sms/engine/HuaweiSms.java b/yj-common/src/main/java/com/yj/common/plugin/sms/engine/HuaweiSms.java new file mode 100644 index 0000000..a53dbda --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/plugin/sms/engine/HuaweiSms.java @@ -0,0 +1,278 @@ +package com.yj.common.plugin.sms.engine; + +import com.yj.common.util.ToolUtils; + +import javax.net.ssl.*; +import java.io.*; +import java.net.URL; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.cert.X509Certificate; +import java.text.SimpleDateFormat; +import java.util.Base64; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 华为云短信 + */ +public class HuaweiSms { + private static final String WSSE_HEADER_FORMAT = "UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\""; + private static final String AUTH_HEADER_VALUE = "WSSE realm=\"SDP\",profile=\"UsernameToken\",type=\"Appkey\""; + + private Integer sendResult; // 发送结果 + private String mobile; // 手机号码 + private String templateId; // 短信模板 + private String templateParams; // 短信参数 + private final Map config; // 短信配置 + + /** + * 构造方法 + * + * @author fzr + * @param config 短信配置 + */ + public HuaweiSms(Map config) { + this.config = config; + } + + /** + * 设置手机号 + * + * @author fzr + * @param mobile 手机号码 + * @return AliSms + */ + public HuaweiSms setMobile(String mobile) { + this.mobile = mobile; + return this; + } + + /** + * 设置模板id + * + * @author fzr + * @param templateId 模板id + * @return AliSms + */ + public HuaweiSms setTemplateId(String templateId) { + this.templateId = templateId; + return this; + } + + /** + * 设置模板参数 + * + * @author fzr + * @param templateParams 模板参数 + * @return AliSms + */ + public HuaweiSms setTemplateParams(String templateParams) { + this.templateParams = templateParams; + return this; + } + + /** + * 获取发送结果 + * + * @author fzr + * @return Integer [1=成功, 2=失败] + */ + public Integer getSendResult() { + return this.sendResult; + } + + /** + * 发送短信 + * + * @author fzr + * @return String + */ + public String send() throws Exception { + String url = ""; // APP接入地址(在控制台"应用管理"页面获取)+接口访问URI + String appKey = "xx"; // APP_Key + String appSecret = "xx"; // APP_Secret + String sender = ""; // 国内短信签名通道号或国际/港澳台短信通道号 + String templateId = ""; // 模板ID + String signature = ""; // 签名名称 + String templateParas = "[\""+"ff"+"\"]"; // 模板变量 + String receiver = "+86" + "18927154977"; // 短信接收人号码 + String statusCallBack = ""; // 接收报告地址,为空不报告 + + // 请求Body + String body = buildRequestBody(sender, receiver, templateId, templateParas, statusCallBack, signature); + if (null == body || body.isEmpty()) { + System.out.println("body is null."); + } + + // 请求Headers + String wsseHeader = buildWsseHeader(appKey, appSecret); + if (null == wsseHeader || wsseHeader.isEmpty()) { + System.out.println("wsse header is null."); + } + + HostnameVerifier hv = (hostname, session) -> true; + trustAllHttpsCertificates(); + + Writer out = null; + InputStream is = null; + BufferedReader in = null; + StringBuilder result = new StringBuilder(); + HttpsURLConnection connection; + try { + URL realUrl = new URL(url); + connection = (HttpsURLConnection) realUrl.openConnection(); + connection.setHostnameVerifier(hv); + connection.setDoOutput(true); + connection.setDoInput(true); + connection.setUseCaches(true); + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + connection.setRequestProperty("Authorization", AUTH_HEADER_VALUE); + connection.setRequestProperty("X-WSSE", wsseHeader); + connection.connect(); + + out = new OutputStreamWriter(connection.getOutputStream()); + out.write(body); + out.flush(); + out.close(); + + int status = connection.getResponseCode(); + if (200 == status) { //200 + is = connection.getInputStream(); + } else { //400/401 + is = connection.getErrorStream(); + } + + String line; + in = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); + while ((line = in.readLine()) != null) { + result.append(line); + } + + System.out.println(result); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (null != out) { + out.close(); + } + if (null != is) { + is.close(); + } + if (null != in) { + in.close(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + return ""; + } + + /** + * 构造请求体Body + * + * @author fzr + * @param sender (国内短信签名通道号或国际/港澳台短信通道号) + * @param receiver (短信接收人号码) + * @param templateId (模板编号) + * @param templateParas (模板参数) + * @param statusCallBack (短信状态报告接收地址,推荐使用域名,为空表示不接收状态报告) + * @param signature (签名名称,使用国内短信通用模板时填写) + * @return String + */ + static String buildRequestBody(String sender, String receiver, String templateId, String templateParas, + String statusCallBack, String signature) { + if (null == sender || null == receiver || null == templateId || sender.isEmpty() || receiver.isEmpty() || templateId.isEmpty()) { + System.out.println("buildRequestBody(): sender, receiver or templateId is null."); + return null; + } + + Map map = new HashMap<>(); + map.put("from", sender); + map.put("to", receiver); + map.put("templateId", templateId); + + if (null != templateParas && !templateParas.isEmpty()) { + map.put("templateParas", templateParas); + } + + if (null != statusCallBack && !statusCallBack.isEmpty()) { + map.put("statusCallback", statusCallBack); + } + + if (null != signature && !signature.isEmpty()) { + map.put("signature", signature); + } + + String temp = ""; + StringBuilder sb = new StringBuilder(); + for (String s : map.keySet()) { + try { + temp = URLEncoder.encode(map.get(s), "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + sb.append(s).append("=").append(temp).append("&"); + } + + return sb.deleteCharAt(sb.length()-1).toString(); + } + + /** + * 构造X-WSSE参数值 + * + * @author fzr + * @param appKey (令牌) + * @param appSecret (密码) + * @return String + */ + static String buildWsseHeader(String appKey, String appSecret) { + if (null == appKey || null == appSecret || appKey.isEmpty() || appSecret.isEmpty()) { + System.out.println("buildWsseHeader(): appKey or appSecret is null."); + return null; + } + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); + String time = sdf.format(new Date()); //Created + String nonce = ToolUtils.makeUUID().replace("-", ""); + + MessageDigest md; + byte[] passwordDigest = null; + try { + md = MessageDigest.getInstance("SHA-256"); + md.update((nonce + time + appSecret).getBytes()); + passwordDigest = md.digest(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + String passwordDigestBase64Str = Base64.getEncoder().encodeToString(passwordDigest); + return String.format(WSSE_HEADER_FORMAT, appKey, passwordDigestBase64Str, nonce, time); + } + + /** + * 信任所有证书 + */ + static void trustAllHttpsCertificates() throws Exception { + TrustManager[] trustAllCerts = new TrustManager[] { + new X509TrustManager() { + public void checkClientTrusted(X509Certificate[] chain, String authType) { } + public void checkServerTrusted(X509Certificate[] chain, String authType) { } + public X509Certificate[] getAcceptedIssuers() { + return null; + } + } + }; + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, trustAllCerts, null); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } + +} diff --git a/yj-common/src/main/java/com/yj/common/plugin/sms/engine/TencentSms.java b/yj-common/src/main/java/com/yj/common/plugin/sms/engine/TencentSms.java new file mode 100644 index 0000000..c85cce4 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/plugin/sms/engine/TencentSms.java @@ -0,0 +1,126 @@ +package com.yj.common.plugin.sms.engine; + +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.profile.ClientProfile; +import com.tencentcloudapi.common.profile.HttpProfile; +import com.tencentcloudapi.sms.v20210111.SmsClient; +import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest; +import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse; + +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * 腾讯短信驱 + */ +public class TencentSms { + + private Integer sendResult; // 发送结果 + private String mobile; // 手机号码 + private String templateId; // 模板编号 + private String[] templateParams; // 模板参数 + private final Map config; + + public TencentSms(Map config) { + this.config = config; + } + + /** + * 设置手机号 + * @author fzr + * @param mobile 手机号码 + * @return AliSms + */ + public TencentSms setMobile(String mobile) { + this.mobile = mobile; + return this; + } + + /** + * 设置模板id + * @author fzr + * @param templateId 模板id + * @return AliSms + */ + public TencentSms setTemplateId(String templateId) { + this.templateId = templateId; + return this; + } + + /** + * 设置模板参数 + * @author fzr + * @param templateParams 模板参数 + * @return AliSms + */ + public TencentSms setTemplateParams(Map templateParams) { + List params = new LinkedList<>(); + for (Map.Entry entry : templateParams.entrySet()) { + params.add(entry.getKey()); + + } + this.templateParams = params.toArray(new String[0]); + return this; + } + + /** + * 获取发送结果 + * + * @author fzr + * @return Integer [1=成功, 2=失败] + */ + public Integer getSendResult() { + return this.sendResult; + } + + /** + * 发送短信 + * + * @return String + */ + public String send() { + try { + /*认证对象*/ + Credential cred = new Credential(this.config.get("secret_id"), config.get("secret_key")); + HttpProfile httpProfile = new HttpProfile(); + httpProfile.setReqMethod("POST"); + httpProfile.setConnTimeout(60); + httpProfile.setEndpoint("sms.tencentcloudapi.com"); + + /*客户端配置*/ + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setSignMethod("HmacSHA256"); + clientProfile.setHttpProfile(httpProfile); + + /*参数配置*/ + SmsClient client = new SmsClient(cred, "ap-guangzhou",clientProfile); + SendSmsRequest req = new SendSmsRequest(); + req.setSignName(config.get("sign")); + req.setSmsSdkAppId(config.get("app_id")); + req.setTemplateId(this.templateId); + + /*手机号码*/ + String[] phoneNumberSet = {"+86"+this.mobile}; + req.setPhoneNumberSet(phoneNumberSet); + + /*模板参数*/ + String[] templateParamSet = this.templateParams; + req.setTemplateParamSet(templateParamSet); + /*发起请求*/ + SendSmsResponse res = client.SendSms(req); + System.out.println(res); + if (!res.getSendStatusSet()[0].getCode().equals("Ok")) { + this.sendResult = 2; + return res.getSendStatusSet()[0].getMessage(); + } + + this.sendResult = 1; + return res.getSendStatusSet()[0].getMessage(); + } catch (Exception e) { + this.sendResult = 2; + return e.getMessage(); + } + } + +} diff --git a/yj-common/src/main/java/com/yj/common/plugin/storage/StorageDriver.java b/yj-common/src/main/java/com/yj/common/plugin/storage/StorageDriver.java new file mode 100644 index 0000000..51abdb5 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/plugin/storage/StorageDriver.java @@ -0,0 +1,153 @@ +package com.yj.common.plugin.storage; + +import com.yj.common.config.GlobalConfig; +import com.yj.common.exception.OperateException; +import com.yj.common.plugin.storage.engine.AliyunStorage; +import com.yj.common.plugin.storage.engine.LocalStorage; +import com.yj.common.plugin.storage.engine.QcloudStorage; +import com.yj.common.plugin.storage.engine.QiniuStorage; +import com.yj.common.util.ConfigUtils; +import com.yj.common.util.TimeUtils; +import com.yj.common.util.UrlUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.util.*; + +public class StorageDriver { + + /** + * 当前存储引擎 + */ + private final String engine; + + /** + * 存储引擎配置 + */ + private final Map config; + + /** + * 构造方法 + */ + public StorageDriver() { + this.engine = ConfigUtils.get("storage", "default", "local"); + + Map config; + config = ConfigUtils.getMap("storage", this.engine); + if (config == null) { + config = new HashMap<>(); + } + + this.config = config; + } + + /** + * 根据引擎类型上传文件 + * + * @author fzr + * @param multipartFile 文件对象 + * @param folder 文件夹 + * @param type 类型: 10=图片, 20=视频 + * @return UploadFilesVo + */ + public UploadFilesVo upload(MultipartFile multipartFile, String folder, Integer type) { + this.checkFile(multipartFile, type); + String key = this.buildSaveName(multipartFile); + switch (this.engine) { + case "local": + LocalStorage local = new LocalStorage(); + local.upload(multipartFile, key, folder); + break; + case "qiniu": + QiniuStorage qiniu = new QiniuStorage(this.config); + qiniu.upload(multipartFile, folder + "/" + key); + break; + case "aliyun": + AliyunStorage aliyun = new AliyunStorage(this.config); + aliyun.upload(multipartFile, folder + "/" + key); + break; + case "qcloud": + QcloudStorage qcloud = new QcloudStorage(this.config); + qcloud.upload(multipartFile, folder + "/" + key); + break; + } + + String origFileName = Objects.requireNonNull(multipartFile.getOriginalFilename()); + String origFileExt = origFileName.substring(origFileName.lastIndexOf(".")).replace(".", ""); + String newFileName = folder + "/" + key; + + UploadFilesVo vo = new UploadFilesVo(); + vo.setId(0); + vo.setName(multipartFile.getOriginalFilename()); + vo.setSize(multipartFile.getSize()); + vo.setExt(origFileExt.toLowerCase()); + vo.setUrl(newFileName); + vo.setPath(UrlUtils.toAbsoluteUrl(newFileName)); + return vo; + } + + /** + * 生成文件名称 + * + * @author fzr + * @param multipartFile 文件对象 + * @return String + */ + private String buildSaveName(MultipartFile multipartFile) { + String name = multipartFile.getOriginalFilename(); + String ext = Objects.requireNonNull(name).substring(name.lastIndexOf(".")); + String date = TimeUtils.timestampToDate(TimeUtils.timestamp(), "yyyyMyj"); + return date + "/" + UUID.randomUUID() + ext.toLowerCase(); + } + + /** + * 文件验证 + * + * @author fzr + * @param multipartFile 文件对象 + * @param type 类型: 10=图片, 20=视频 + */ + private void checkFile(MultipartFile multipartFile, Integer type) { + String fileName = Objects.requireNonNull(multipartFile.getOriginalFilename()); + String fileExt = fileName.substring(fileName.lastIndexOf(".")).replace(".", "").toLowerCase(); + long fileSize = multipartFile.getSize(); + + if (type == 10) { + if (!Arrays.asList(GlobalConfig.uploadImageExt).contains(fileExt)) { + throw new OperateException("不被支持的扩展:" + fileExt); + } + if (fileSize > GlobalConfig.uploadImageSize) { + throw new OperateException("上传图片不能超出限制:" + (GlobalConfig.uploadImageSize / 1024 / 1024) + "M"); + } + } else if (type == 20) { + if (!Arrays.asList(GlobalConfig.uploadVideoExt).contains(fileExt)) { + throw new OperateException("不被支持的扩展:" + fileExt); + } + if (fileSize > GlobalConfig.uploadVideoSize) { + throw new OperateException("上传视频不能超出限制:" + (GlobalConfig.uploadVideoSize / 1024 / 1024) + "M"); + } + } + } + + + public void deleteFile(String filePath) { + switch (this.engine) { + case "local": + LocalStorage local = new LocalStorage(); + local.delete(filePath); + break; + case "qiniu": + QiniuStorage qiniu = new QiniuStorage(this.config); + qiniu.delete(filePath); + break; + case "aliyun": + AliyunStorage aliyun = new AliyunStorage(this.config); + aliyun.delete(filePath); + break; + case "qcloud": + QcloudStorage qcloud = new QcloudStorage(this.config); + qcloud.delete(filePath); + break; + } + } + +} diff --git a/yj-common/src/main/java/com/yj/common/plugin/storage/UploadFilesVo.java b/yj-common/src/main/java/com/yj/common/plugin/storage/UploadFilesVo.java new file mode 100644 index 0000000..a99b343 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/plugin/storage/UploadFilesVo.java @@ -0,0 +1,19 @@ +package com.yj.common.plugin.storage; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class UploadFilesVo implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer id; + private String name; + private Long size; + private String ext; + private String url; + private String path; + +} diff --git a/yj-common/src/main/java/com/yj/common/plugin/storage/engine/AliyunStorage.java b/yj-common/src/main/java/com/yj/common/plugin/storage/engine/AliyunStorage.java new file mode 100644 index 0000000..dba9ccb --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/plugin/storage/engine/AliyunStorage.java @@ -0,0 +1,71 @@ +package com.yj.common.plugin.storage.engine; + +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.OSSException; +import com.aliyun.oss.model.PutObjectRequest; +import com.yj.common.exception.OperateException; +import org.springframework.web.multipart.MultipartFile; + +import java.io.ByteArrayInputStream; +import java.util.Map; + +/** + * 阿里云存储 + */ +public class AliyunStorage { + + /** + * 存储配置 + */ + private final Map config; + + /** + * 构造方法 + */ + public AliyunStorage(Map config) { + this.config = config; + } + + /** + * 鉴权令牌 + * + * @author fzr + * @return String + */ + public OSS ossClient() { + String endpoint = this.config.get("endpoint"); + String accessKeyId = this.config.get("access_key"); + String accessKeySecret = this.config.get("secret_key"); + return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); + } + + /** + * 上传文件 + * + * @param multipartFile 文件对象 + * @param key 文件名称 20220331/11.png + */ + public void upload(MultipartFile multipartFile, String key) { + try { + PutObjectRequest putObjectRequest = new PutObjectRequest( + this.config.get("bucket"), key, + new ByteArrayInputStream(multipartFile.getBytes()) + ); + this.ossClient().putObject(putObjectRequest); + } catch (OSSException oe) { + throw new OperateException(oe.getMessage()); + } catch (Exception ce) { + throw new OperateException(ce.getMessage()); + } finally { + if (this.ossClient() != null) { + this.ossClient().shutdown(); + } + } + } + + public void delete(String key) { + this.ossClient().deleteObject(this.config.get("bucket"), key); + } + +} diff --git a/yj-common/src/main/java/com/yj/common/plugin/storage/engine/LocalStorage.java b/yj-common/src/main/java/com/yj/common/plugin/storage/engine/LocalStorage.java new file mode 100644 index 0000000..a23ce7d --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/plugin/storage/engine/LocalStorage.java @@ -0,0 +1,57 @@ +package com.yj.common.plugin.storage.engine; + +import com.yj.common.exception.OperateException; +import com.yj.common.util.YmlUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; + +/** + * 本地存储 + */ +public class LocalStorage { + + /** + * 本地上传 + * + * @author fzr + * @param multipartFile 上传对象 + * @param key 文件名称 20220331/122.jpg + * @param folder 文件夹 + */ + public void upload(MultipartFile multipartFile, String key, String folder) { + // 映射目录 + String directory = YmlUtils.get("like.upload-directory"); + if (directory == null || directory.equals("")) { + throw new OperateException("请配置上传目录like.upload-directory"); + } + + // 文件信息 + String saveName = key.split("/")[1]; + String savePath = (directory + folder + "/" + key.split("/")[0]).replace("\\", "/"); + + // 创建目录 + File fileExist = new File(savePath); + if (!fileExist.exists()) { + if (!fileExist.mkdirs()) { + throw new OperateException("创建上传目录失败"); + } + } + + // 保存文件 + try { + File dest = new File(savePath, saveName); + multipartFile.transferTo(dest); + } catch (Exception e) { + throw new OperateException("上传文件失败:"+e.getMessage()); + } + + } + + public void delete(String filePath) { + String directory = YmlUtils.get("like.upload-directory"); + File file = new File(directory + filePath); + file.delete(); + } + +} diff --git a/yj-common/src/main/java/com/yj/common/plugin/storage/engine/QcloudStorage.java b/yj-common/src/main/java/com/yj/common/plugin/storage/engine/QcloudStorage.java new file mode 100644 index 0000000..b97fe40 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/plugin/storage/engine/QcloudStorage.java @@ -0,0 +1,77 @@ +package com.yj.common.plugin.storage.engine; + +import com.yj.common.exception.OperateException; +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.HttpProtocol; +import com.qcloud.cos.model.ObjectMetadata; +import com.qcloud.cos.model.PutObjectRequest; +import com.qcloud.cos.region.Region; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; +import java.util.Map; + +/** + * 腾讯云存储 + */ +public class QcloudStorage { + + /** + * 存储配置 + */ + private final Map config; + + /** + * 构造方法 + */ + public QcloudStorage(Map config) { + this.config = config; + } + + /** + * 鉴权客户端 + * + * @author fzr + * @return String + */ + public COSClient cosClient() { + String secretId = this.config.get("access_key"); + String secretKey = this.config.get("secret_key"); + COSCredentials cred = new BasicCOSCredentials(secretId, secretKey); + Region region = new Region(this.config.get("region")); + ClientConfig clientConfig = new ClientConfig(region); + clientConfig.setHttpProtocol(HttpProtocol.https); + return new COSClient(cred, clientConfig); + } + + /** + * 上传文件 + * + * @param multipartFile 文件对象 + * @param key 文件名称 20220331/11.png + */ + public void upload(MultipartFile multipartFile, String key) { + try { + byte[] data = multipartFile.getBytes(); + InputStream inputStream = new ByteArrayInputStream(data); + ObjectMetadata objectMetadata = new ObjectMetadata(); + objectMetadata.setContentLength(multipartFile.getSize()); + + PutObjectRequest putObjectRequest = new PutObjectRequest(this.config.get("bucket"), key, inputStream, objectMetadata); + this.cosClient().putObject(putObjectRequest); + } catch (CosClientException e) { + e.printStackTrace(); + } catch (Exception e) { + throw new OperateException(e.getMessage()); + } + } + + public void delete(String filePath) { + this.cosClient().deleteObject(this.config.get("bucket"), filePath); + } + +} diff --git a/yj-common/src/main/java/com/yj/common/plugin/storage/engine/QiniuStorage.java b/yj-common/src/main/java/com/yj/common/plugin/storage/engine/QiniuStorage.java new file mode 100644 index 0000000..3e9c9da --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/plugin/storage/engine/QiniuStorage.java @@ -0,0 +1,82 @@ +package com.yj.common.plugin.storage.engine; + +import com.google.gson.Gson; +import com.yj.common.exception.OperateException; +import com.qiniu.common.QiniuException; +import com.qiniu.http.Response; +import com.qiniu.storage.BucketManager; +import com.qiniu.storage.Configuration; +import com.qiniu.storage.Region; +import com.qiniu.storage.UploadManager; +import com.qiniu.storage.model.DefaultPutRet; +import com.qiniu.util.Auth; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Map; + +/** + * 七牛云存储 + */ +public class QiniuStorage { + + /** + * 存储配置 + */ + private final Map config; + + /** + * 构造方法 + */ + public QiniuStorage(Map config) { + this.config = config; + } + + /** + * 鉴权令牌 + * + * @author fzr + * @return String + */ + public String upToken() { + String accessKey = this.config.getOrDefault("access_key", ""); + String secretKey = this.config.getOrDefault("secret_key", ""); + String bucket = this.config.getOrDefault("bucket", ""); + Auth auth = Auth.create(accessKey, secretKey); + return auth.uploadToken(bucket); + } + + /** + * 上传文件 + * + * @author fzr + * @param multipartFile 文件对象 + * @param key 保存文件的名称 + */ + public void upload(MultipartFile multipartFile, String key) { + Configuration cfg = new Configuration(Region.region2()); + UploadManager uploadManager = new UploadManager(cfg); + try { + Response response = uploadManager.put(multipartFile.getBytes(), key, this.upToken()); + DefaultPutRet ret = new Gson().fromJson(response.bodyString(), DefaultPutRet.class); + System.out.println(ret); + } catch (IOException ex) { + throw new OperateException(ex.getMessage()); + } + } + + public void delete(String filePath) { + String accessKey = this.config.getOrDefault("access_key", ""); + String secretKey = this.config.getOrDefault("secret_key", ""); + String bucket = this.config.getOrDefault("bucket", ""); + Auth auth = Auth.create(accessKey, secretKey); + Configuration cfg = new Configuration(Region.region2()); + BucketManager bucketManager = new BucketManager(auth, cfg); + try { + Response response = bucketManager.delete(bucket, filePath); + System.out.println(response); + } catch (QiniuException e) { + throw new RuntimeException(e); + } + } +} diff --git a/yj-common/src/main/java/com/yj/common/plugin/wechat/WxMnpDriver.java b/yj-common/src/main/java/com/yj/common/plugin/wechat/WxMnpDriver.java new file mode 100644 index 0000000..743a008 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/plugin/wechat/WxMnpDriver.java @@ -0,0 +1,183 @@ +package com.yj.common.plugin.wechat; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl; +import com.yj.common.util.ConfigUtils; +import com.yj.common.util.HttpUtils; +import com.yj.common.util.MapUtils; +import com.yj.common.util.StringUtils; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.security.MessageDigest; +import java.util.Map; + +/** + * 微信基础驱动 + */ +@Component +public class WxMnpDriver { + + private static WxMaService wxMaService; + + private static WxMpService wxMpService; + + /** + * 微信小程序依赖注入 + */ + @Resource + public void setWxMaService(WxMaService wxMaService) { + WxMnpDriver.wxMaService = wxMaService; + } + + /** + * 微信公众号依赖注入 + */ + @Resource + public void setWxOaService(WxMpService wxMpService) { + WxMnpDriver.wxMpService = wxMpService; + } + + + /** + * 微信小程序 + * + * @author fzr + * @return WxMaService + */ + public static WxMaService mnp() { + Map config = ConfigUtils.get("mnp_setting"); + + WxMaDefaultConfigImpl wxConfig = new WxMaDefaultConfigImpl(); + wxConfig.setAppid(config.getOrDefault("app_id", "")); + wxConfig.setSecret(config.getOrDefault("app_secret", "")); + wxMaService.setWxMaConfig(wxConfig); + + return wxMaService; + } + + /** + * 微信公众号 + * + * @author fzr + * @return WxMpService + */ + public static WxMpService oa() { + Map config = ConfigUtils.get("oa_setting"); + + WxMpDefaultConfigImpl wxMpDefaultConfig = new WxMpDefaultConfigImpl(); + wxMpDefaultConfig.setAppId(config.getOrDefault("app_id", "").trim()); + wxMpDefaultConfig.setSecret(config.getOrDefault("app_secret", "").trim()); + wxMpDefaultConfig.setToken(config.getOrDefault("token", "").trim()); + wxMpDefaultConfig.setAesKey(config.getOrDefault("encoding_aes_key", "").trim()); + wxMpService.setWxMpConfigStorage(wxMpDefaultConfig); + + return wxMpService; + } + + /** + * 微信开放平台 + * + * @author fzr + * @return WxMpService + */ + public static WxMpService openSetting() { + Map config = ConfigUtils.get("open_platform"); + + WxMpDefaultConfigImpl wxMpDefaultConfig = new WxMpDefaultConfigImpl(); + wxMpDefaultConfig.setAppId(config.getOrDefault("app_id", "").trim()); + wxMpDefaultConfig.setSecret(config.getOrDefault("app_secret", "").trim()); + wxMpDefaultConfig.setToken(config.getOrDefault("token", "").trim()); + wxMpDefaultConfig.setAesKey(config.getOrDefault("encoding_aes_key", "").trim()); + wxMpService.setWxMpConfigStorage(wxMpDefaultConfig); + + return wxMpService; + } + + /** + * 获取授权页ticket + * + * @author fzr + * @param accessToken token + * @return String + */ + public static String getJsSdkGetTicket(String accessToken) { + String jsSdkGetTicketUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi"; + String url = String.format(jsSdkGetTicketUrl, accessToken); + String results = HttpUtils.sendGet(url); + Map resultMap = MapUtils.jsonToMap(results); + String jsapi_ticket = null; + if (resultMap != null && StringUtils.isNotNull(resultMap.get("ticket"))) { + jsapi_ticket = resultMap.get("ticket"); + } + return jsapi_ticket; + } + + /** + * 构建JsSDK + * + * @author fzr + * @param ticket ticket + * @param timestamp 时间戳 + * @param nonceStr 串 + * @param url 地址 + * @return String + * @throws Exception 异常 + */ + public static String buildJSSDKSignature(String ticket, String timestamp, String nonceStr, String url) throws Exception { + String orderedString = "jsapi_ticket=" + ticket + + "&noncestr=" + nonceStr + + "×tamp=" + timestamp + + "&url=" + url; + return sha1(orderedString); + } + + /** + * Sha1算法 + * + * @author fzr + * @param orderedString 字符串 + * @return String + * @throws Exception 异常 + */ + private static String sha1(String orderedString) throws Exception { + String ciphertext; + MessageDigest md = MessageDigest.getInstance("SHA-1"); + byte[] digest = md.digest(orderedString.getBytes()); + ciphertext = byteToStr(digest); + return ciphertext.toLowerCase(); + } + + /** + * 字节转字符 + * + * @author fzr + * @param byteArray 字节 + * @return String + */ + private static String byteToStr(byte[] byteArray) { + StringBuilder strDigest = new StringBuilder(); + for (byte b : byteArray) { + strDigest.append(byteToHexStr(b)); + } + return strDigest.toString(); + } + + /** + * 字节转Hex + * + * @author fzr + * @param mByte 字节 + * @return String + */ + private static String byteToHexStr(byte mByte) { + char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + char[] tempArr = new char[2]; + tempArr[0] = Digit[(mByte >>> 4) & 0X0F]; + tempArr[1] = Digit[mByte & 0X0F]; + return new String(tempArr); + } + +} diff --git a/yj-common/src/main/java/com/yj/common/plugin/wechat/WxPayDriver.java b/yj-common/src/main/java/com/yj/common/plugin/wechat/WxPayDriver.java new file mode 100644 index 0000000..ebe26de --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/plugin/wechat/WxPayDriver.java @@ -0,0 +1,198 @@ +package com.yj.common.plugin.wechat; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request; +import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request; +import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result; +import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; +import com.github.binarywang.wxpay.config.WxPayConfig; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import com.yj.common.entity.setting.DevPayConfig; +import com.yj.common.enums.ClientEnum; +import com.yj.common.mapper.setting.DevPayConfigMapper; +import com.yj.common.plugin.wechat.request.PaymentRequestV3; +import com.yj.common.plugin.wechat.request.RefundRequestV3; +import com.yj.common.util.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.Map; + +/** + * 微信支付驱动 + */ +@Component +public class WxPayDriver { + + private static DevPayConfigMapper devPayConfigMapper; + + private static WxPayService wxPayService; + private static WxPayService wxPayMnpService; + + /** + * 注入支付配置依赖 + */ + @Resource + public void setDevPayConfigMapper(DevPayConfigMapper devPayConfigMapper) { + WxPayDriver.devPayConfigMapper = devPayConfigMapper; + } + + /** + * 注入微信支付依赖 + */ + @Resource + public void setWxPayService(WxPayService wxPayService) { + WxPayDriver.wxPayService = wxPayService; + } + + @Autowired + public void setWxPayMnpService(WxPayService wxPayMnpService) { + WxPayDriver.wxPayMnpService = wxPayMnpService; + } + + /** + * 微信统一下单 + * + * @param requestV3 请求参数 + * @return WxPayUnifiedOrderV3Result.JsapiResult + * @throws Exception 异常 + */ + public static Object unifiedOrder(PaymentRequestV3 requestV3) throws Exception { + // 订单参数 + Integer terminal = requestV3.getTerminal(); + String openId = requestV3.getOpenId(); + String attach = requestV3.getAttach(); + String outTradeNo = requestV3.getOutTradeNo(); + BigDecimal orderAmount = requestV3.getOrderAmount(); + String description = requestV3.getDescription(); + + // 失效时间 + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + Long expireTime = System.currentTimeMillis() + (30 * 60 * 1000); + String timeExpire = format.format(expireTime) + "+08:00"; + + // 订单信息 + WxPayUnifiedOrderV3Request wxPayUnifiedOrderV3Request = new WxPayUnifiedOrderV3Request(); + wxPayUnifiedOrderV3Request.setOutTradeNo(outTradeNo); + wxPayUnifiedOrderV3Request.setDescription(description); + wxPayUnifiedOrderV3Request.setTimeExpire(timeExpire); + wxPayUnifiedOrderV3Request.setAttach(attach); + wxPayUnifiedOrderV3Request.setNotifyUrl(RequestUtils.uri() + "/api/pay/notifyMnp"); + + // 订单金额 + WxPayUnifiedOrderV3Request.Amount amount = new WxPayUnifiedOrderV3Request.Amount(); + amount.setTotal(AmountUtil.yuan2Fen(orderAmount.toPlainString())); + amount.setCurrency("CNY"); + wxPayUnifiedOrderV3Request.setAmount(amount); + + // 付款人员 + WxPayUnifiedOrderV3Request.Payer payer = new WxPayUnifiedOrderV3Request.Payer(); + payer.setOpenid(openId); + + // H5平台 + TradeTypeEnum tradeTypeEnum = TradeTypeEnum.JSAPI; + + if (terminal == ClientEnum.H5.getCode()) { + tradeTypeEnum = TradeTypeEnum.H5; + WxPayUnifiedOrderV3Request.SceneInfo sceneInfo = new WxPayUnifiedOrderV3Request.SceneInfo(); + WxPayUnifiedOrderV3Request.H5Info h5Info = new WxPayUnifiedOrderV3Request.H5Info(); + h5Info.setType(RequestUtils.device()); + sceneInfo.setH5Info(h5Info); + sceneInfo.setPayerClientIp(IpUtils.getHostIp()); + wxPayUnifiedOrderV3Request.setSceneInfo(sceneInfo); + } + + // PC平台 + if (terminal == ClientEnum.PC.getCode()) { + payer.setOpenid(null); + tradeTypeEnum = TradeTypeEnum.NATIVE; + } + + // 发起订单 + WxPayService wxPayService = WxPayDriver.handler(terminal); + wxPayUnifiedOrderV3Request.setPayer(payer); + return wxPayService.createOrderV3(tradeTypeEnum, wxPayUnifiedOrderV3Request); + } + + /** + * 微信支付-申请退款 + * 文档地址: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4 + * 接口链接: https://api.mch.weixin.qq.com/secapi/pay/refund + * + * @param request 请求参数 + * @return WxPayRefundV3Result 退款结果 + * @throws WxPayException 退款异常 + */ + public static WxPayRefundV3Result refund(RefundRequestV3 request) throws WxPayException { + WxPayRefundV3Request requestObj = new WxPayRefundV3Request(); + requestObj.setTransactionId(request.getTransactionId()); + requestObj.setOutTradeNo(request.getOutTradeNo()); + requestObj.setOutRefundNo(request.getOutRefundNo()); + requestObj.setReason(request.getReason()); + requestObj.setNotifyUrl(request.getNotifyUrl()); + requestObj.setSubMchid(request.getSubMchid()); + requestObj.setGoodsDetails(request.getGoodsDetails()); + WxPayRefundV3Request.Amount amount = new WxPayRefundV3Request.Amount(); + amount.setRefund(request.getRefundAmount()); + amount.setTotal(request.getTotalAmount()); + amount.setCurrency(StringUtils.isEmpty(request.getCurrency()) ? "CNY" : request.getCurrency()); + requestObj.setAmount(amount); + + WxPayService wxPayService = WxPayDriver.handler(4); + return wxPayService.refundV3(requestObj); + } + + /** + * 对象句柄 + * + * @author fzr + * @return WxPayService + */ + public static WxPayService handler(Integer terminal) { + if (ClientEnum.MNP.getCode() == terminal) { + resetConfig("mnp"); + return wxPayMnpService; + } else { + resetConfig("oa"); + return wxPayService; + } + } + + /** + * 重设配置 + * + * @author fzr + * @param type 类型 + */ + private static void resetConfig(String type) { + DevPayConfig config = devPayConfigMapper.selectOne( + new QueryWrapper() + .eq("pay_way", 2) + .last("limit 1")); + String scene = type.equals("oa") ? "oa_setting" : "mnp_setting"; + String appId = ConfigUtils.get(scene, "app_id", ""); + Map params = MapUtils.jsonToMap(config.getConfig().toString()); + String mchId = params.get("mch_id"); + String paySignKey = params.get("pay_sign_key"); + byte[] privateCert = params.getOrDefault("apiclient_cert", "").getBytes(); + byte[] privateKey = params.getOrDefault("apiclient_key", "").getBytes(); + + WxPayConfig payConfig = new WxPayConfig(); + payConfig.setAppId(appId); + payConfig.setMchId(mchId); + payConfig.setApiV3Key(paySignKey); + payConfig.setPrivateKeyContent(privateKey); + payConfig.setPrivateCertContent(privateCert); + payConfig.setUseSandboxEnv(false); + if (!type.equals("oa")) { + wxPayMnpService.setConfig(payConfig); + } else { + wxPayService.setConfig(payConfig); + } + } + +} diff --git a/yj-common/src/main/java/com/yj/common/plugin/wechat/request/PaymentRequestV3.java b/yj-common/src/main/java/com/yj/common/plugin/wechat/request/PaymentRequestV3.java new file mode 100644 index 0000000..44d238a --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/plugin/wechat/request/PaymentRequestV3.java @@ -0,0 +1,31 @@ +package com.yj.common.plugin.wechat.request; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class PaymentRequestV3 implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 支付终端 */ + private Integer terminal; + + /** 用户身份 */ + private String openId; + + /** 扩展字段 */ + private String attach; + + /** 订单编号 */ + private String outTradeNo; + + /** 订单金额 */ + private BigDecimal orderAmount; + + /** 订单描述 */ + private String description; + +} diff --git a/yj-common/src/main/java/com/yj/common/plugin/wechat/request/RefundRequestV3.java b/yj-common/src/main/java/com/yj/common/plugin/wechat/request/RefundRequestV3.java new file mode 100644 index 0000000..8fc82ff --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/plugin/wechat/request/RefundRequestV3.java @@ -0,0 +1,46 @@ +package com.yj.common.plugin.wechat.request; + +import com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request; +import com.google.gson.annotations.SerializedName; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class RefundRequestV3 implements Serializable { + + private static final long serialVersionUID = -1L; + + /** 订单流水号: (必须) */ + private String transactionId; + + /** 订单单号: (必须) */ + private String outTradeNo; + + /** 退款单号: (必须) */ + @SerializedName("out_refund_no") + private String outRefundNo; + + /** 退款金额 : (必须)*/ + private Integer refundAmount; + + /** 订单总额: (必须) */ + private Integer totalAmount; + + /** 退款原因: 非必须 */ + private String reason; + + /** 通知接口: 非必须 */ + private String notifyUrl; + + /** 退款币种: 非必须 */ + private String currency; + + /** 商品信息: 非必须 */ + private List goodsDetails; + + /** 子商户号: 非必须 */ + private String subMchid; + +} diff --git a/yj-common/src/main/java/com/yj/common/util/AmountUtil.java b/yj-common/src/main/java/com/yj/common/util/AmountUtil.java new file mode 100644 index 0000000..357164b --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/util/AmountUtil.java @@ -0,0 +1,61 @@ +package com.yj.common.util; + +import com.baomidou.mybatisplus.core.toolkit.Assert; + +import java.math.BigDecimal; + +/** + * 金额处理工具 + */ +public class AmountUtil { + + private AmountUtil() {} + + /** + * 将单位为元的金额转换为单位为分 + * + * @param yuan 单位为元的字符型值 + * @return int + */ + public static int yuan2Fen(String yuan) { + int value; + + try { + BigDecimal var1 = new BigDecimal(yuan); + BigDecimal var2 = new BigDecimal(100); + BigDecimal var3 = var1.multiply(var2); + value = Integer.parseInt(var3.stripTrailingZeros().toPlainString()); + } catch (Exception e) { + throw new IllegalArgumentException(String.format("非法金额[%s]", yuan)); + } + + Assert.isTrue(value >= 0, String.format("非法金额[%s]", yuan)); + return value; + } + + /** + * 将单位为分的金额转换为单位为元 + * + * @param fen 单位为分的字符型值 + * @return String + */ + public static String fen2Yuan(int fen) { + BigDecimal var1 = new BigDecimal(fen); + BigDecimal var2 = new BigDecimal(100); + BigDecimal var3 = var1.divide(var2, 3); + return var3.stripTrailingZeros().toPlainString(); + } + + /** + * 将单位为分的金额转换为单位为元 + * + * @param fen 单位为分的字符型值 + * @return BigDecimal + */ + public static BigDecimal fen2YuanDecimal(int fen) { + BigDecimal var1 = new BigDecimal(fen); + BigDecimal var2 = new BigDecimal(100); + return var1.divide(var2, 3); + } + +} diff --git a/yj-common/src/main/java/com/yj/common/util/ArithUtils.java b/yj-common/src/main/java/com/yj/common/util/ArithUtils.java new file mode 100644 index 0000000..9356d7d --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/util/ArithUtils.java @@ -0,0 +1,110 @@ +package com.yj.common.util; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * 算术运算工具 + */ +public class ArithUtils { + + /** 默认除法运算精度 */ + private static final int DEF_DIV_SCALE = 10; + + /** 这个类不能实例化 */ + private ArithUtils() {} + + /** + * 提供精确的加法运算 + * + * @param v1 被加数 + * @param v2 加数 + * @return 两个参数的和 + */ + public static double add(double v1, double v2) { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.add(b2).doubleValue(); + } + + /** + * 提供精确的减法运算 + * + * @param v1 被减数 + * @param v2 减数 + * @return 两个参数的差 + */ + public static double sub(double v1, double v2) { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.subtract(b2).doubleValue(); + } + + /** + * 提供精确的乘法运算 + * + * @param v1 被乘数 + * @param v2 乘数 + * @return 两个参数的积 + */ + public static double mul(double v1, double v2) { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.multiply(b2).doubleValue(); + } + + /** + * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 + * 小数点以后10位,以后的数字四舍五入 + * + * @param v1 被除数 + * @param v2 除数 + * @return 两个参数的商 + */ + public static double div(double v1, double v2) { + return div(v1, v2, DEF_DIV_SCALE); + } + + /** + * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 + * 定精度,以后的数字四舍五入。 + * + * @param v1 被除数 + * @param v2 除数 + * @param scale 表示表示需要精确到小数点以后几位。 + * @return 两个参数的商 + */ + public static double div(double v1, double v2, int scale) { + if (scale < 0) + { + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + if (b1.compareTo(BigDecimal.ZERO) == 0) + { + return BigDecimal.ZERO.doubleValue(); + } + return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue(); + } + + /** + * 提供精确的小数位四舍五入处理 + * + * @param v 需要四舍五入的数字 + * @param scale 小数点后保留几位 + * @return 四舍五入后的结果 + */ + public static double round(double v, int scale) { + if (scale < 0) + { + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal b = new BigDecimal(Double.toString(v)); + BigDecimal one = BigDecimal.ONE; + return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue(); + } + +} diff --git a/yj-common/src/main/java/com/yj/common/util/Base64Util.java b/yj-common/src/main/java/com/yj/common/util/Base64Util.java new file mode 100644 index 0000000..740cb15 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/util/Base64Util.java @@ -0,0 +1,266 @@ +package com.yj.common.util; + +/** + * Base64工具类 + */ +public final class Base64Util +{ + static private final int BASE_LENGTH = 128; + static private final int LOOK_UP_LENGTH = 64; + static private final int TWENTY_FOUR_BIT_GROUP = 24; + static private final int EIGHT_BIT = 8; + static private final int SIXTEEN_BIT = 16; + static private final int FOUR_BYTE = 4; + static private final int SIGN = -128; + static private final char PAD = '='; + static final private byte[] base64Alphabet = new byte[BASE_LENGTH]; + static final private char[] lookUpBase64Alphabet = new char[LOOK_UP_LENGTH]; + + static { + for (int i = 0; i < BASE_LENGTH; ++i) { + base64Alphabet[i] = -1; + } + + for (int i = 'Z'; i >= 'A'; i--) { + base64Alphabet[i] = (byte) (i - 'A'); + } + + for (int i = 'z'; i >= 'a'; i--) { + base64Alphabet[i] = (byte) (i - 'a' + 26); + } + + for (int i = '9'; i >= '0'; i--) { + base64Alphabet[i] = (byte) (i - '0' + 52); + } + + base64Alphabet['+'] = 62; + base64Alphabet['/'] = 63; + + for (int i = 0; i <= 25; i++) { + lookUpBase64Alphabet[i] = (char) ('A' + i); + } + + for (int i = 26, j = 0; i <= 51; i++, j++) { + lookUpBase64Alphabet[i] = (char) ('a' + j); + } + + for (int i = 52, j = 0; i <= 61; i++, j++) { + lookUpBase64Alphabet[i] = (char) ('0' + j); + } + + lookUpBase64Alphabet[62] = '+'; + lookUpBase64Alphabet[63] = '/'; + } + + /** + * 转码 + * + * @param binaryData 未转码数据 + * @return 转码后数据串 + */ + public static String encode(byte[] binaryData) { + if (binaryData == null) { + return null; + } + + int lengthDataBits = binaryData.length * EIGHT_BIT; + if (lengthDataBits == 0) { + return ""; + } + + int fewerThan24bits = lengthDataBits % TWENTY_FOUR_BIT_GROUP; + int numberTriplets = lengthDataBits / TWENTY_FOUR_BIT_GROUP; + int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets; + char[] encodedData; + + encodedData = new char[numberQuartet * 4]; + + byte k, l, b1, b2, b3; + int encodedIndex = 0; + int dataIndex = 0; + + for (int i = 0; i < numberTriplets; i++) { + b1 = binaryData[dataIndex++]; + b2 = binaryData[dataIndex++]; + b3 = binaryData[dataIndex++]; + + k = (byte) (b1 & 0x03); + l = (byte) (b2 & 0x0f); + + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); + byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc); + + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f]; + } + + if (fewerThan24bits == EIGHT_BIT) { + b1 = binaryData[dataIndex]; + k = (byte) (b1 & 0x03); + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4]; + encodedData[encodedIndex++] = PAD; + encodedData[encodedIndex++] = PAD; + } else if (fewerThan24bits == SIXTEEN_BIT) { + b1 = binaryData[dataIndex]; + b2 = binaryData[dataIndex + 1]; + l = (byte) (b2 & 0x0f); + k = (byte) (b1 & 0x03); + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); + + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2]; + encodedData[encodedIndex++] = PAD; + } + return new String(encodedData); + } + + /** + * 解码 + * + * @param encoded 已转码数据 + * @return 解码后数据 + */ + public static byte[] decode(String encoded) { + if (encoded == null) { + return null; + } + + char[] base64Data = encoded.toCharArray(); + int len = removeWhiteSpace(base64Data); + + if (len % FOUR_BYTE != 0) { + return null; + } + + int numberQuadruple = (len / FOUR_BYTE); + if (numberQuadruple == 0) { + return new byte[0]; + } + + byte[] decodedData; + byte b1, b2, b3, b4; + char d1, d2, d3, d4; + + int i = 0; + int encodedIndex = 0; + int dataIndex = 0; + decodedData = new byte[(numberQuadruple) * 3]; + + for (; i < numberQuadruple - 1; i++) { + + if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++])) + || !isData((d3 = base64Data[dataIndex++])) || !isData((d4 = base64Data[dataIndex++]))) + { + return null; + } + + b1 = base64Alphabet[d1]; + b2 = base64Alphabet[d2]; + b3 = base64Alphabet[d3]; + b4 = base64Alphabet[d4]; + + decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + decodedData[encodedIndex++] = (byte) (b3 << 6 | b4); + } + + if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))) { + return null; + } + + b1 = base64Alphabet[d1]; + b2 = base64Alphabet[d2]; + d3 = base64Data[dataIndex++]; + d4 = base64Data[dataIndex++]; + if (!isData((d3)) || !isData((d4))) { + if (isPad(d3) && isPad(d4)) { + if ((b2 & 0xf) != 0) { + return null; + } + byte[] tmp = new byte[i * 3 + 1]; + System.arraycopy(decodedData, 0, tmp, 0, i * 3); + tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4); + return tmp; + } else if (!isPad(d3) && isPad(d4)) { + b3 = base64Alphabet[d3]; + if ((b3 & 0x3) != 0) { + return null; + } + byte[] tmp = new byte[i * 3 + 2]; + System.arraycopy(decodedData, 0, tmp, 0, i * 3); + tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + return tmp; + } else { + return null; + } + } else { + b3 = base64Alphabet[d3]; + b4 = base64Alphabet[d4]; + decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + decodedData[encodedIndex++] = (byte) (b4 | b3 << 6); + + } + return decodedData; + } + + /** + * 是否空白 + * + * @param octEct 位 + * @return boolean + */ + private static boolean isWhiteSpace(char octEct) { + return (octEct == 0x20 || octEct == 0xd || octEct == 0xa || octEct == 0x9); + } + + /** + * 是否填充 + * + * @param octEct 位 + * @return boolean + */ + private static boolean isPad(char octEct) { + return (octEct == PAD); + } + + /** + * 是否数据 + * + * @param octEct 位 + * @return Boolean + */ + private static Boolean isData(char octEct) { + return (octEct < BASE_LENGTH && base64Alphabet[octEct] != -1); + } + + /** + * 移除空白 + * + * @param data 数据 + * @return int + */ + private static int removeWhiteSpace(char[] data) { + if (data == null) { + return 0; + } + + int newSize = 0; + int len = data.length; + for (int i = 0; i < len; i++) { + if (!isWhiteSpace(data[i])) { + data[newSize++] = data[i]; + } + } + return newSize; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/util/ConfigUtils.java b/yj-common/src/main/java/com/yj/common/util/ConfigUtils.java new file mode 100644 index 0000000..db3f251 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/util/ConfigUtils.java @@ -0,0 +1,184 @@ +package com.yj.common.util; + +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.common.cache.ConfigCache; +import com.yj.common.entity.Config; +import com.yj.common.entity.setting.DevPayConfig; +import com.yj.common.enums.PaymentEnum; +import com.yj.common.mapper.ConfigMapper; +import com.yj.common.mapper.setting.DevPayConfigMapper; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * 数据库配置操作工具 + */ +public class ConfigUtils { + + /** + * 根据类型获取配置 + * + * @author fzr + * @param type 类型 + * @return Map + */ + public static Map get(String type) { + Map cache = ConfigCache.get(type); + if (!cache.isEmpty()) { + return cache; + } + + ConfigMapper model = SpringUtils.getBean(ConfigMapper.class); + List configs = model.selectList( + new QueryWrapper() + .select("id", "type"+"", "name", "value") + .eq("type", type)); + + Map map = new LinkedHashMap<>(); + for (Config config : configs) { + map.put(config.getName(), config.getValue()); + } + + ConfigCache.set(); + return map; + } + + /** + * 根据类型和名称获取配置 + * + * @author fzr + * @param type 类型 + * @param name 名称 + * @return String + */ + public static String get(String type, String name) { + String cache = ConfigCache.get(type, name); + if (!StringUtils.isNull(cache) && !StringUtils.isEmpty(cache)) { + return cache; + } + + ConfigMapper model = SpringUtils.getBean(ConfigMapper.class); + Config config = model.selectOne( + new QueryWrapper() + .select("id", "type", "name", "value") + .eq("name", name) + .eq("type", type)); + + ConfigCache.set(); + return config.getValue(); + } + + /** + * 根据类型和名称获取配置 + * + * @author fzr + * @param type 类型 + * @param name 名称 + * @return String + */ + public static String get(String type, String name, String defaults) { + String cache = ConfigCache.get(type, name); + if (!StringUtils.isNull(cache) && !StringUtils.isEmpty(cache)) { + return cache; + } + + ConfigMapper model = SpringUtils.getBean(ConfigMapper.class); + Config config = model.selectOne( + new QueryWrapper() + .select("id", "type", "name", "value") + .eq("type", type) + .eq("name", name)); + + if (config == null) { + return defaults; + } + + ConfigCache.set(); + return config.getValue(); + } + + /** + * 根据类型和名称获取配置(JSON自定转Map) + * + * @author fzr + * @param type 类型 + * @param name 名称 + * @return String + */ + public static Map getMap(String type, String name) { + String cache = ConfigCache.get(type, name); + if (!StringUtils.isNull(cache) && !StringUtils.isEmpty(cache)) { + cache = "[]".equals(cache) ? "{}" : cache; + return MapUtils.jsonToMap(cache); + } + + ConfigMapper model = SpringUtils.getBean(ConfigMapper.class); + + Config config = model.selectOne( + new QueryWrapper() + .select("id", "type", "name", "value") + .eq("type", type) + .eq("name", name)); + + if (config == null) { + return null; + } + + if (config.getValue().equals("") || config.getValue().equals("[]") || config.getValue().equals("{}")) { + return new LinkedHashMap<>(); + } + + ConfigCache.set(); + return MapUtils.jsonToMap(config.getValue()); + } + + /** + * 设置配置的值 + * + * @author fzr + * @param type 类型 + * @param name 名称 + * @param val 值 + */ + public static void set(String type, String name, String val) { + ConfigMapper model = SpringUtils.getBean(ConfigMapper.class); + Config config = model.selectOne( + new QueryWrapper() + .eq("type", type) + .eq("name", name)); + + if (config != null) { + config.setValue(val); + config.setUpdateTime(System.currentTimeMillis() / 1000); + model.updateById(config); + } else { + Config systemConfig = new Config(); + systemConfig.setType(type); + systemConfig.setName(name); + systemConfig.setValue(val); + systemConfig.setCreateTime(System.currentTimeMillis() / 1000); + systemConfig.setUpdateTime(System.currentTimeMillis() / 1000); + model.insert(systemConfig); + } + + ConfigCache.set(); + } + + //返回支付宝配置信息 + public static String getAliDevPay(String field) { + DevPayConfigMapper model = SpringUtils.getBean(DevPayConfigMapper.class); + DevPayConfig devPay = model.selectOne( + new QueryWrapper() + .eq("pay_way", PaymentEnum.ALI_PAY.getCode())); + if (StringUtils.isNull(devPay)) { + return ""; + } else { + JSONObject jsonObject = JSONObject.parseObject(devPay.getConfig().toString()); + return StringUtils.isNull(jsonObject.getString(field)) ? "" : jsonObject.getString(field); + } + + } +} diff --git a/yj-common/src/main/java/com/yj/common/util/HttpUtils.java b/yj-common/src/main/java/com/yj/common/util/HttpUtils.java new file mode 100644 index 0000000..81a0e86 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/util/HttpUtils.java @@ -0,0 +1,223 @@ +package com.yj.common.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.net.ssl.*; +import java.io.*; +import java.net.*; +import java.nio.charset.StandardCharsets; +import java.security.cert.X509Certificate; + +/** + * HTTP工具类 + */ +public class HttpUtils { + + private static final Logger log = LoggerFactory.getLogger(HttpUtils.class); + + /** + * 向指定URL发送GET方法的请求 (不带参) + * + * @param url 发送请求的 URL + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url) { + return sendGet(url, StringUtils.EMPTY); + } + + /** + * 向指定URL发送GET方法的请求 (带参固定编码) + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url, String param) { + return sendGet(url, param, "UTF-8"); + } + + /** + * 向指定URL发送GET方法的请求 (带参指定编码) + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @param contentType 编码类型 + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url, String param, String contentType) { + StringBuilder result = new StringBuilder(); + BufferedReader in = null; + try { + String urlNameString = StringUtils.isNotBlank(param) ? url + "?" + param : url; + log.info("sendGet - {}", urlNameString); + URL realUrl = new URL(urlNameString); + URLConnection connection = realUrl.openConnection(); + connection.setRequestProperty("accept", "*/*"); + connection.setRequestProperty("connection", "Keep-Alive"); + connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + connection.connect(); + in = new BufferedReader(new InputStreamReader(connection.getInputStream(), contentType)); + String line; + while ((line = in.readLine()) != null) { + result.append(line); + } + log.info("rev - {}", result); + } catch (ConnectException e) { + log.error("调用HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e); + } catch (SocketTimeoutException e) { + log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e); + } catch (IOException e) { + log.error("调用HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e); + } catch (Exception e) { + log.error("调用HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e); + } finally { + try { + if (in != null) { + in.close(); + } + } catch (Exception ex) { + log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); + } + } + return result.toString(); + } + + /** + * 向指定 URL 发送POST方法的请求 + * + * @author fzr + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @return 所代表远程资源的响应结果 + */ + public static String sendPost(String url, String param) { + PrintWriter out = null; + BufferedReader in = null; + StringBuilder result = new StringBuilder(); + try { + log.info("sendPost - {}", url); + URL realUrl = new URL(url); + URLConnection conn = realUrl.openConnection(); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("contentType", "utf-8"); + conn.setDoOutput(true); + conn.setDoInput(true); + out = new PrintWriter(conn.getOutputStream()); + out.print(param); + out.flush(); + in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)); + String line; + while ((line = in.readLine()) != null) { + result.append(line); + } + log.info("rev - {}", result); + } + catch (ConnectException e) { + log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e); + } catch (SocketTimeoutException e) { + log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e); + } catch (IOException e) { + log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e); + } + catch (Exception e) { + log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e); + } finally { + try { + if (out != null) { + out.close(); + } + if (in != null) { + in.close(); + } + } catch (IOException ex) { + log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); + } + } + return result.toString(); + } + + /** + * 发送SSL的POST请求 + * + * @author fzr + * @param url 请求地址 + * @param param 请求参数 + * @return String + */ + public static String sendSSLPost(String url, String param) { + StringBuilder result = new StringBuilder(); + String urlNameString = url + "?" + param; + try { + log.info("sendSSLPost - {}", urlNameString); + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom()); + URL console = new URL(urlNameString); + HttpsURLConnection conn = (HttpsURLConnection) console.openConnection(); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("contentType", "utf-8"); + conn.setDoOutput(true); + conn.setDoInput(true); + + conn.setSSLSocketFactory(sc.getSocketFactory()); + conn.setHostnameVerifier(new TrustAnyHostnameVerifier()); + conn.connect(); + InputStream is = conn.getInputStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + String ret; + while ((ret = br.readLine()) != null) { + if (!"".equals(ret.trim())) { + result.append(new String(ret.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8)); + } + } + log.info("rev - {}", result); + conn.disconnect(); + br.close(); + } + catch (ConnectException e) { + log.error("调用HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e); + } catch (SocketTimeoutException e) { + log.error("调用HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e); + } catch (IOException e) { + log.error("调用HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e); + } catch (Exception e) { + log.error("调用HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e); + } + return result.toString(); + } + + /** + * SSL证书协议接口 + */ + private static class TrustAnyTrustManager implements X509TrustManager { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) { + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) { + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[] {}; + } + } + + /** + * POST请求安全接口 + */ + private static class TrustAnyHostnameVerifier implements HostnameVerifier { + @Override + public boolean verify(String hostname, SSLSession session) { + return true; + } + } + +} diff --git a/yj-common/src/main/java/com/yj/common/util/IpUtils.java b/yj-common/src/main/java/com/yj/common/util/IpUtils.java new file mode 100644 index 0000000..1375e93 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/util/IpUtils.java @@ -0,0 +1,268 @@ +package com.yj.common.util; + +import com.alibaba.fastjson2.JSONObject; +import com.yj.common.config.GlobalConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.http.HttpServletRequest; +import java.net.InetAddress; +import java.net.UnknownHostException; + +/** + * IP工具类 + */ +public class IpUtils { + + private static final Logger log = LoggerFactory.getLogger(IpUtils.class); + + /** + * 获取客户端IP + * + * @author fzr + * @return IP地址 (113.67.10.194) + */ + public static String getIpAddress() { + HttpServletRequest request = RequestUtils.handler(); + if (request == null) { + return "unknown"; + } + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("X-Forwarded-For"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("X-Real-IP"); + } + + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + + return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip); + } + + /** + * 根据IP获取所在地址 + * + * @author fzr + * @param ip Ip地址 + * @return String (广州省 广州市) + */ + public static String getRealAddressByIP(String ip) { + String IP_URL = "https://whois.pconline.com.cn/ipJson.jsp"; + String UNKNOWN = "XX XX"; + + // 内网不查询 + if (IpUtils.internalIp(ip)) { + return "内网IP"; + } + if (GlobalConfig.isAddressEnabled) { + try { + String rspStr = HttpUtils.sendGet(IP_URL, "ip=" + ip + "&json=true", "GBK"); + if (StringUtils.isEmpty(rspStr)) { + log.error("获取地理位置异常 {}", ip); + return UNKNOWN; + } + JSONObject obj = JSONObject.parseObject(rspStr); + String region = obj.getString("pro"); + String city = obj.getString("city"); + return String.format("%s %s", region, city); + } + catch (Exception e) { + log.error("获取地理位置异常 {}", ip); + } + } + return UNKNOWN; + } + + /** + * 检查是否为内部IP地址 + * + * @param ip IP地址 + * @return 结果 + */ + public static boolean internalIp(String ip) { + byte[] address = textToNumericFormatV4(ip); + return internalIp(address) || "127.0.0.1".equals(ip); + } + + /** + * 检查是否为内部IP地址 + * + * @author fzr + * @param address byte地址 + * @return 结果 + */ + private static boolean internalIp(byte[] address) { + if (address == null || address.length < 2) { + return true; + } + final byte b0 = address[0]; + final byte b1 = address[1]; + // 10.x.x.x/8 + final byte SECTION_1 = 0x0A; + // 172.16.x.x/12 + final byte SECTION_2 = (byte) 0xAC; + final byte SECTION_3 = (byte) 0x10; + final byte SECTION_4 = (byte) 0x1F; + // 192.168.x.x/16 + final byte SECTION_5 = (byte) 0xC0; + final byte SECTION_6 = (byte) 0xA8; + switch (b0) { + case SECTION_1: + return true; + case SECTION_2: + if (b1 >= SECTION_3 && b1 <= SECTION_4) { + return true; + } + case SECTION_5: + if (b1 == SECTION_6) { + return true; + } + default: + return false; + } + } + + /** + * 将IPv4地址转换成字节 + * + * @author fzr + * @param text IPv4地址 + * @return byte 字节 + */ + public static byte[] textToNumericFormatV4(String text) { + if (text.length() == 0) { + return null; + } + + byte[] bytes = new byte[4]; + String[] elements = text.split("\\.", -1); + try { + long l; + int i; + switch (elements.length) { + case 1: + l = Long.parseLong(elements[0]); + if ((l < 0L) || (l > 4294967295L)) { + return null; + } + bytes[0] = (byte) (int) (l >> 24 & 0xFF); + bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF); + bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 2: + l = Integer.parseInt(elements[0]); + if ((l < 0L) || (l > 255L)) { + return null; + } + bytes[0] = (byte) (int) (l & 0xFF); + l = Integer.parseInt(elements[1]); + if ((l < 0L) || (l > 16777215L)) { + return null; + } + bytes[1] = (byte) (int) (l >> 16 & 0xFF); + bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 3: + for (i = 0; i < 2; ++i) { + l = Integer.parseInt(elements[i]); + if ((l < 0L) || (l > 255L)) { + return null; + } + bytes[i] = (byte) (int) (l & 0xFF); + } + l = Integer.parseInt(elements[2]); + if ((l < 0L) || (l > 65535L)) { + return null; + } + bytes[2] = (byte) (int) (l >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 4: + for (i = 0; i < 4; ++i) { + l = Integer.parseInt(elements[i]); + if ((l < 0L) || (l > 255L)) { + return null; + } + bytes[i] = (byte) (int) (l & 0xFF); + } + break; + default: + return null; + } + } catch (NumberFormatException e) { + return null; + } + return bytes; + } + + /** + * 获取IP地址 + * + * @author fzr + * @return 本地IP地址 + */ + public static String getHostIp() { + try { + return InetAddress.getLocalHost().getHostAddress(); + } + catch (UnknownHostException ignored) { } + return "127.0.0.1"; + } + + /** + * 获取主机名 + * + * @author fzr + * @return 本地主机名 + */ + public static String getHostName() { + try { + return InetAddress.getLocalHost().getHostName(); + } + catch (UnknownHostException ignored) {} + return "未知"; + } + + /** + * 从多级反向代理中获得第一个非unknown IP地址 + * + * @author fzr + * @param ip 获得的IP地址 + * @return 第一个非unknown IP地址 + */ + public static String getMultistageReverseProxyIp(String ip) { + if (ip != null && ip.indexOf(",") > 0) { + final String[] ips = ip.trim().split(","); + for (String subIp : ips) { + if (!isUnknown(subIp)) { + ip = subIp; + break; + } + } + } + return ip; + } + + /** + * 检测给定字符串是否为未知,多用于检测HTTP请求相关 + * + * @author fzr + * @param checkString 被检测的字符串 + * @return 是否未知 + */ + public static boolean isUnknown(String checkString) { + return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString); + } + +} diff --git a/yj-common/src/main/java/com/yj/common/util/ListUtils.java b/yj-common/src/main/java/com/yj/common/util/ListUtils.java new file mode 100644 index 0000000..80cc0a8 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/util/ListUtils.java @@ -0,0 +1,312 @@ +package com.yj.common.util; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.reflect.TypeToken; + +import java.lang.reflect.Type; +import java.util.*; + +/** + * 列表工具类 + */ +public class ListUtils { + + /** + * JSONArray转树形结构 + * + * @author fzr + * @param arr JSON数组 + * @param id 主键字段名 + * @param pid 上级字段名 + * @param child 子级字段名 + * @return JSONArray + */ + public static JSONArray listToTree(JSONArray arr, String id, String pid, String child) { + JSONArray r = new JSONArray(); + JSONObject hash = new JSONObject(); + //将数组转为Object的形式,key为数组中的id + for (Object o : arr) { + JSONObject json = (JSONObject) o; + hash.put(json.getString(id), json); + } + //遍历结果集 + for (Object o : arr) { + //单条记录 + JSONObject aVal = (JSONObject) o; + + //在hash中取出key为单条记录中pid的值 + JSONObject hashVP = (JSONObject) hash.get(aVal.get(pid).toString()); + //如果记录的pid存在,则说明它有父节点,将她添加到孩子节点的集合中 + if (hashVP != null) { + //检查是否有child属性 + if (hashVP.get(child) != null) { + JSONArray ch = (JSONArray) hashVP.get(child); + ch.add(aVal); + hashVP.put(child, ch); + } else { + JSONArray ch = new JSONArray(); + ch.add(aVal); + hashVP.put(child, ch); + } + } else { + r.add(aVal); + } + } + + return r; + } + + /** + * List去重,不打乱原来顺序,泛型list对象 + * 对象重写hashCode和equals + * + * @author fzr + * @param 泛型 + * @param list 列表 + * @return List + */ + public static List uniqueBySetOrder(List list){ + Set set = new HashSet(); + List newList = new ArrayList(); + for(T t: list){ + if(set.add(t)){ + newList.add(t); + } + } + return newList; + } + + /** + * List去重,可能打乱原来顺序,泛型list对象 + * 对象重写hashCode和equals + * + * @author fzr + * @param list 列表 + * @return List + */ + public static List uniqueBySet(List list){ + return new ArrayList(new HashSet(list)); + } + + /** + * 列表转字符串 + * + * @author fzr + * @param list 列表 [1, 2, 4] -> 1,2,3 + * @param separator 分割符号 + * @return String + */ + public static String listToStringByLong(List list, String separator) { + StringBuilder sb = new StringBuilder(); + for (Object o : list) { + sb.append(o).append(separator); + } + return list.isEmpty() ? "" : sb.substring(0, sb.toString().length() - 1); + } + + /** + * 列表转字符串 + * + * @author fzr + * @param list 列表 [1, 2, 4] -> 1,2,3 + * @param separator 分割符号 + * @return String + */ + public static String listToStringByInt(List list, String separator) { + StringBuilder sb = new StringBuilder(); + for (Object o : list) { + sb.append(o).append(separator); + } + return list.isEmpty() ? "" : sb.substring(0, sb.toString().length() - 1); + } + + /** + * 列表转字符串 + * + * @author fzr + * @param list 列表 ["1", "2", "3"] -> 1,2,3 + * @param separator 分割符号 + * @return String + */ + public static String listToStringByStr(List list, String separator) { + StringBuilder sb = new StringBuilder(); + for (Object o : list) { + sb.append(o).append(separator); + } + return list.isEmpty() ? "" : sb.substring(0, sb.toString().length() - 1); + } + + /** + * 字符串分割,转化为数组 + * + * @author fzr + * @param str 字符串 + * @param regex 分隔符 + * @return List + */ + public static List stringToListAsLong(String str, String regex){ + List list = new ArrayList<>(); + if (str.contains(regex)){ + String[] split = str.split(regex); + for (String value : split) { + if(!StringUtils.isBlank(value)){ + list.add(Long.parseLong(value.trim())); + } + } + }else { + list.add(Long.parseLong(str)); + } + return list; + } + + /** + * 字符串分割,转化为数组 + * + * @author fzr + * @param str 字符串 + * @param regex 分隔符 + * @return List + */ + public static List stringToListAsInt(String str, String regex){ + List list = new ArrayList<>(); + if (str.equals("")) { + return list; + } + if (str.contains(regex)){ + String[] split = str.split(regex); + for (String value : split) { + if(!StringUtils.isBlank(value)){ + list.add(Integer.parseInt(value.trim())); + } + } + }else { + list.add(Integer.parseInt(str)); + } + return list; + } + + /** + * 字符串分割,转化为数组 + * + * @author fzr + * @param str 字符串 + * @param regex 分隔符 + * @return List + */ + public static List stringToListAsStr(String str, String regex){ + List list = new ArrayList<>(); + if (str.contains(regex)){ + String[] split = str.split(regex); + for (String value : split) { + if(!StringUtils.isBlank(value)){ + list.add(value.trim()); + } + } + }else { + list.add(str); + } + return list; + } + + /** + * 字符串转列表Map + * + * @author fzr + * @param s 字符串 + * @return Map + */ + public static List> stringToListAsMapLong(String s) { + Type type = new TypeToken>>() {}.getType(); + return JSON.parseObject(s, type); + } + + /** + * 字符串转列表Map + * + * @author fzr + * @param s 字符串 + * @return Map + */ + public static List> stringToListAsMapInt(String s) { + Type type = new TypeToken>>() {}.getType(); + return JSON.parseObject(s, type); + } + + /** + * 字符串转列表Map + * + * @author fzr + * @param s 字符串 + * @return Map + */ + public static List> stringToListAsMapObj(String s) { + if (StringUtils.isEmpty(s)) { + return Collections.emptyList(); + } + Type type = new TypeToken>>() {}.getType(); + return JSON.parseObject(s, type); + } + + /** + * 字符串转列表Map + * + * @author fzr + * @param s 字符串 + * @return Map + */ + public static List> stringToListAsMapStr(String s) { + if (StringUtils.isEmpty(s)) { + return Collections.emptyList(); + } + Type type = new TypeToken>>() {}.getType(); + return JSON.parseObject(s, type); + } + + /** + * 对象转List + * + * @author fzr + * @param object 对象 + * @return List + */ + public static List objectToListAsLong(Object object) { + if (StringUtils.isNull(object)) { + return Collections.emptyList(); + } + Type type = new TypeToken>() {}.getType(); + return JSON.parseObject(JSONObject.toJSONString(object), type); + } + + /** + * 对象转List + * + * @author fzr + * @param object 对象 + * @return List + */ + public static List objectToListAsInt(Object object) { + if (StringUtils.isNull(object)) { + return Collections.emptyList(); + } + Type type = new TypeToken>() {}.getType(); + return JSON.parseObject(JSONObject.toJSONString(object), type); + } + + /** + * 对象转List + * + * @author fzr + * @param object 对象 + * @return List + */ + public static List objectToListAsStr(Object object) { + if (StringUtils.isNull(object)) { + return Collections.emptyList(); + } + Type type = new TypeToken>() {}.getType(); + return JSON.parseObject(JSONObject.toJSONString(object), type); + } + +} diff --git a/yj-common/src/main/java/com/yj/common/util/MapUtils.java b/yj-common/src/main/java/com/yj/common/util/MapUtils.java new file mode 100644 index 0000000..8d1cbeb --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/util/MapUtils.java @@ -0,0 +1,82 @@ +package com.yj.common.util; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.reflect.TypeToken; + +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.Map; + +/** + * Map工具类 + */ +public class MapUtils { + + /** + * JSON转 Map + * + * @author fzr + * @param json 对象 + * @return Map + */ + public static Map jsonToMap(String json){ + Type type = new TypeToken>() {}.getType(); + return JSON.parseObject(json, type); + } + + /** + * JSON转 Map + * + * @author fzr + * @param json 对象 + * @return Map + */ + public static Map jsonToMapAsObj(String json){ + Type type = new TypeToken>() {}.getType(); + return JSON.parseObject(json, type); + } + + /** + * JSON转Map + * + * @author fzr + * @param object 对象 + * @return Map + */ + public static Map objectToMap(Object object){ + Type type = new TypeToken>() {}.getType(); + return JSON.parseObject(JSONObject.toJSONString(object), type); + } + + + /** + * 对象类型Map合并 + * + * @author fzr + * @param map 对象 + * @return Map + */ + public static Map mergeMapByObj(Map map, Map map1){ + HashMap map2 = new HashMap<>(); + map2.putAll(map); + map2.putAll(map1); + return map2; + } + + + /** + * 字符串类型Map合并 + * + * @author fzr + * @param map 对象 + * @return Map + */ + public static Map mergeMapByStr(Map map, Map map1){ + HashMap map2 = new HashMap<>(); + map2.putAll(map); + map2.putAll(map1); + return map2; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/util/RedisUtils.java b/yj-common/src/main/java/com/yj/common/util/RedisUtils.java new file mode 100644 index 0000000..8db8ff5 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/util/RedisUtils.java @@ -0,0 +1,665 @@ +package com.yj.common.util; + +import com.yj.common.config.GlobalConfig; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.data.redis.core.Cursor; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ScanOptions; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.concurrent.TimeUnit; + +/** + * Redis工具 + */ +@Component +public class RedisUtils { + + private static RedisTemplate redisTemplate; + private static final String redisPrefix = GlobalConfig.redisPrefix; + + /** + * 注入Redis + * + * @author fzr + * @param redisTemplate Redis对象 + */ + @Resource + public void setRedisTemplate(RedisTemplate redisTemplate) { + RedisUtils.redisTemplate = redisTemplate; + } + + /** + * 对象句柄 + * + * @author fzr + * @return RedisTemplate + */ + public static RedisTemplate handler() { + return redisTemplate; + } + + /** + * 指定缓存失效时间 + * + * @author fzr + * @param key 键 + * @param second 时间(秒) + */ + public static void expire(String key, Long second) { + key = redisPrefix + key; + redisTemplate.expire(key, second, TimeUnit.SECONDS); + } + + /** + * 指定缓存失效时间 + * + * @author fzr + * @param key 键 + * @param millisecond 时间(毫秒) + */ + public static void pExpire(String key, Long millisecond) { + key = redisPrefix + key; + redisTemplate.expire(key, millisecond, TimeUnit.MILLISECONDS); + } + + /** + * 指定缓存永久有效 + * + * @author fzr + * @param key 键 + */ + public static void persist(String key) { + key = redisPrefix + key; + redisTemplate.persist(key); + } + + /** + * 根据key获取过期时间 + * + * @author fzr + * @param key 键不能为null + * @return 返回0代表为永久有效(秒) + */ + public static Long ttl(String key) { + key = redisPrefix + key; + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 根据key获取过期时间 + * + * @author fzr + * @param key 键不能为null + * @return 返回0代表为永久有效(毫秒) + */ + public static Long pTtl(String key) { + key = redisPrefix + key; + return redisTemplate.getExpire(key, TimeUnit.MILLISECONDS); + } + + /** + * 判断key是否存在 + * + * @author fzr + * @param key 键 + * @return true=存在,false=不存在 + */ + public static Boolean exists(String key) { + key = redisPrefix + key; + return redisTemplate.hasKey(key); + } + + /** + * 删除1个或多个键 + * + * @author fzr + * @param key 键(一个或多个) + */ + @SuppressWarnings("unchecked") + public static void del(String... key) { + if (key.length == 1) { + key[0] = redisPrefix + key[0]; + redisTemplate.delete(key[0]); + } else { + for (int i=0; key.length > i; i++) { + key[i] = redisPrefix + key[i]; + } + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + + /** + * 给key赋值一个新的key名 + * + * @author fzr + * @param oldKey 旧的key + * @param newKey 新的key + */ + public static void rename(String oldKey, String newKey) { + oldKey = redisPrefix + oldKey; + newKey = redisPrefix + newKey; + redisTemplate.rename(oldKey, newKey); + } + + /** + * 将当前数据库的key移动到给定的数据库db当中 + * + * @author fzr + * @param key 键 + * @param db 库 + * @return Boolean + */ + public static Boolean move(String key, int db) { + key = redisPrefix + key; + return redisTemplate.move(key, db); + } + + /** + * 获取匹配的key值 + * + * @author fzr + * @author fzr + * @param pattern 通配符(*, ?, []) + * @return Set + */ + public static Set keys(String pattern) { + return redisTemplate.keys(pattern); + } + + /** + * 随机返回一个key + * + * @author fzr + * @author fzr + * @return String + */ + public static String randomKey() { + return redisTemplate.randomKey(); + } + + /* ***************** common end *************** */ + + /** + * 按匹配获取或有KEY + * + * @author fzr + * @param pattern 规则 + * @return Set + */ + public static Set matchSet(String pattern) { + Set keys = new LinkedHashSet<>(); + RedisUtils.handler().execute((RedisConnection connection) -> { + try (Cursor cursor = connection.scan( + ScanOptions.scanOptions() + .count(Long.MAX_VALUE) + .match(pattern) + .build() + )) { + cursor.forEachRemaining(item -> { + keys.add(RedisSerializer.string().deserialize(item)); + }); + return null; + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + + return keys; + } + + /** + * 获取key的值 + * + * @author fzr + * @param key 键 + * @return Object + */ + public static Object get(String key) { + key = redisPrefix + key; + return redisTemplate.opsForValue().get(key); + } + + /** + * 获取旧值并设置新值 + * + * @author fzr + * @param key 键 + * @param newVal 新值 + * @return Object + */ + public static Object getSet(String key, Object newVal) { + key = redisPrefix + key; + return redisTemplate.opsForValue().getAndSet(key, newVal); + } + + /** + * 设置键值对 + * + * @author fzr + * @param key 键 + * @param value 值 + */ + public static void set(String key, Object value) { + key = redisPrefix + key; + redisTemplate.opsForValue().set(key, value); + } + + /** + * 设置键值对并设置时间 + * + * @author fzr + * @param key 键 + * @param value 值 + * @param time time要大于0 如果time小于等于0 将设置无限期 + */ + public static void set(String key, Object value, long time) { + key = redisPrefix + key; + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + } + + /** + * 递增 + * + * @author fzr + * @param key 键 + * @param delta 要增加几(大于0) + * @return Long + */ + public static Long incr(String key, long delta) { + if (delta < 0) { + throw new RuntimeException("递增因子必须大于0"); + } + key = redisPrefix + key; + return redisTemplate.opsForValue().increment(key, delta); + } + + /** + * 递减 + * + * @author fzr + * @param key 键 + * @param delta 要减少几(小于0) + * @return Long + */ + public static Long decr(String key, long delta) { + if (delta < 0) { + throw new RuntimeException("递减因子必须大于0"); + } + key = redisPrefix + key; + return redisTemplate.opsForValue().increment(key, -delta); + } + + /* ***************** String end *************** */ + + /** + * 获取key中field域的值 + * + * @author fzr + * @param key 键 不能为null + * @param field 项 不能为null + * @return 值 + */ + public static Object hGet(String key, String field) { + key = redisPrefix + key; + return redisTemplate.opsForHash().get(key, field); + } + + /** + * 判断key中有没有field域名 + * + * @author fzr + * @param key 键 + * @param field 字段 + * @return Boolean + */ + public static Boolean hExists(String key, Object field) { + key = redisPrefix + key; + return redisTemplate.opsForHash().hasKey(key, field); + } + + /** + * 获取hashKey对应的所有键值 + * + * @author fzr + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmGet(String key) { + key = redisPrefix + key; + return redisTemplate.opsForHash().entries(key); + } + + /** + * 设置field1->N个域,对应的值是value1->N + * + * @author fzr + * @param key 键 + * @param map 对应多个键值 + */ + public static void hmSet(String key, Map map) { + key = redisPrefix + key; + redisTemplate.opsForHash().putAll(key, map); + } + + /** + * HashSet 并设置时间 + * + * @author fzr + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + */ + public static void hmSet(String key, Map map, long time) { + key = redisPrefix + key; + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @author fzr + * @param key 键 + * @param item 项 + * @param value 值 + */ + public static void hSet(String key, String item, Object value) { + key = redisPrefix + key; + redisTemplate.opsForHash().put(key, item, value); + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @author fzr + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public static boolean hSet(String key, String item, Object value, long time) { + key = redisPrefix + key; + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } + + /** + * 删除hash表中的值 + * + * @author fzr + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public static void hDel(String key, Object... item) { + key = redisPrefix + key; + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @author fzr + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public static boolean hHasKey(String key, String item) { + key = redisPrefix + key; + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * hash递增 如果不存在,就会创建一个并把新增后的值返回 + * + * @author fzr + * @param key 键 + * @param item 项 + * @param by 要增加几(大于0) + * @return double + */ + public static double hIncr(String key, String item, long by) { + key = redisPrefix + key; + return redisTemplate.opsForHash().increment(key, item, by); + } + + /** + * hash递减 + * + * @author fzr + * @param key 键 + * @param item 项 + * @param by 要减少记(小于0) + * @return double + */ + public static double hDecr(String key, String item, long by) { + key = redisPrefix + key; + return redisTemplate.opsForHash().increment(key, item, -by); + } + + /* ***************** Map end *************** */ + + /** + * 根据key获取Set中的所有值 + * + * @author fzr + * @param key 键 + * @return Set + */ + public static Set sGet(String key) { + key = redisPrefix + key; + return redisTemplate.opsForSet().members(key); + } + + /** + * 根据value从一个set中查询,是否存在 + * + * @author fzr + * @param key 键 + * @param value 值 + * @return true 存在 false不存在 + */ + public Boolean sHasKey(String key, Object value) { + key = redisPrefix + key; + return redisTemplate.opsForSet().isMember(key, value); + } + + /** + * 将数据放入set缓存 + * + * @author fzr + * @param key 键 + * @param values 值 可以是多个 + * @return 成功个数 + */ + public static Long sSet(String key, Object... values) { + key = redisPrefix + key; + return redisTemplate.opsForSet().add(key, values); + } + + /** + * 将set数据放入缓存 + * + * @author fzr + * @param key 键 + * @param time 时间(秒) + * @param values 值 可以是多个 + * @return 成功个数 + */ + public Long sSetAndTime(String key, long time, Object... values) { + key = redisPrefix + key; + return redisTemplate.opsForSet().add(key, values); + } + + /** + * 获取set缓存的长度 + * + * @author fzr + * @param key 键 + * @return Long + */ + public Long sGetSetSize(String key) { + key = redisPrefix + key; + return redisTemplate.opsForSet().size(key); + } + + /** + * 移除值为value的 + * + * @author fzr + * @param key 键 + * @param values 值 可以是多个 + * @return 移除的个数 + */ + public Long setRemove(String key, Object... values) { + key = redisPrefix + key; + return redisTemplate.opsForSet().remove(key, values); + } + + /* ***************** Set end *************** */ + + /** + * 获取list缓存的内容 + * + * @author fzr + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return List + */ + public List lGet(String key, long start, long end) { + key = redisPrefix + key; + return redisTemplate.opsForList().range(key, start, end); + } + + /** + * 获取list缓存的长度 + * + * @author fzr + * @param key 键 + * @return Long + */ + public Long lGetListSize(String key) { + key = redisPrefix + key; + return redisTemplate.opsForList().size(key); + } + + /** + * 通过索引获取list中的值 + * + * @author fzr + * @param key 键 + * @param index 索引 index>=0时,0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 + * @return Object + */ + public Object lGetIndex(String key, long index) { + key = redisPrefix + key; + return redisTemplate.opsForList().index(key, index); + } + + /** + * 将list放入缓存 + * + * @author fzr + * @param key 键 + * @param value 值 + * @return boolean + */ + public boolean lSet(String key, Object value) { + key = redisPrefix + key; + redisTemplate.opsForList().rightPush(key, value); + return true; + } + + /** + * 将list放入缓存 + * + * @author fzr + * @param key 键 + * @param value 值 + * @param second 时间(秒) + * @return boolean + */ + public boolean lSet(String key, Object value, long second) { + key = redisPrefix + key; + redisTemplate.opsForList().rightPush(key, value); + if (second > 0) + expire(key, second); + return true; + } + + /** + * 将list放入缓存 + * + * @author fzr + * @param key 键 + * @param value 值 + * @return boolean + */ + public boolean lSet(String key, List value) { + key = redisPrefix + key; + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } + + /** + * 将list放入缓存 + * + * @author fzr + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return boolean + */ + public boolean lSet(String key, List value, Long time) { + key = redisPrefix + key; + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } + + /** + * 根据索引修改list中的某条数据 + * + * @author fzr + * @param key 键 + * @param index 索引 + * @param value 值 + * @return boolean + */ + public boolean lUpdateIndex(String key, Long index, Object value) { + key = redisPrefix + key; + redisTemplate.opsForList().set(key, index, value); + return true; + } + + /** + * 移除N个值为value + * + * @author fzr + * @param key 键 + * @param count 移除多少个 + * @param value 值 + * @return 移除的个数 + */ + public Long lRemove(String key, Long count, Object value) { + key = redisPrefix + key; + return redisTemplate.opsForList().remove(key, count, value); + } + +} diff --git a/yj-common/src/main/java/com/yj/common/util/RequestUtils.java b/yj-common/src/main/java/com/yj/common/util/RequestUtils.java new file mode 100644 index 0000000..c74dee1 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/util/RequestUtils.java @@ -0,0 +1,195 @@ +package com.yj.common.util; + +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.util.Arrays; +import java.util.List; + +/** + * 请求工具类 + */ +public class RequestUtils { + + /** + * 获取请求对象 + * + * @author fzr + * @return HttpServletRequest + */ + public static HttpServletRequest handler() { + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (servletRequestAttributes != null) { + return servletRequestAttributes.getRequest(); + } + return null; + } + + /** + * 获取不带参请求URl + * 示例: https://127.0.0.1:8082/api/system/menu/menus + * + * @author fzr + * @return String + */ + public static String url() { + HttpServletRequest request = RequestUtils.handler(); + if (request != null) { + return request.getRequestURL().toString(); + } + return ""; + } + + /** + * 获取带端口的请求地址 + * 示例: https://127.0.0.1:8082 + * + * @author fzr + * @return String + */ + public static String uri() { + String domain = RequestUtils.domain(); + if (!Arrays.asList(443,80,0).contains(RequestUtils.port())) { + domain += ":" + RequestUtils.port(); + } + + return domain; + } + + /** + * 获取请求路由 + * 示例: /api/system/menu/menus + * + * @author fzr + * @return String + */ + public static String route() { + HttpServletRequest request = RequestUtils.handler(); + if (request != null) { + return request.getRequestURI(); + } + return ""; + } + + /** + * 获取请求端口 + * 示例: 443/80 + * + * @author fzr + * @return Integer + */ + public static Integer port() { + HttpServletRequest request = RequestUtils.handler(); + if (request != null) { + return request.getServerPort(); + } + return 0; + } + + /** + * 获取请求域名 + * 示例: https://127.0.0.1 + * + * @author fzr + * @return String + */ + public static String domain() { + HttpServletRequest request = RequestUtils.handler(); + if (request != null) { + String requestUrl = request.getRequestURL().toString(); + List urls = Arrays.asList(requestUrl.split("/")); + + String agree = "http:"; + if (request.getServerPort() == 443) { + agree = "https:"; + } + + return agree + "//" + urls.get(2).split(":")[0]; + } + return null; + } + + /** + * 获取设备标识 + * + * @author fzr + * @return String + */ + public static String device() { + HttpServletRequest request = RequestUtils.handler(); + if (request != null) { + String userAgent = request.getHeader("User-Agent"); + if(userAgent.contains("Android")) { + return "Android"; + }else if(userAgent.contains("iPhone") || userAgent.contains("iPod") || userAgent.contains("iPad")) { + return "IOS"; + } else { + return "wap"; + } + } + + return "wap"; + } + + /** + * 判断是否是GET请求 + * + * @author fzr + * @return Boolean + */ + public static Boolean isGet() { + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (servletRequestAttributes != null) { + HttpServletRequest request = servletRequestAttributes.getRequest(); + return request.getMethod().equals("GET"); + } + return false; + } + + /** + * 判断是否是POST请求 + * + * @author fzr + * @return Boolean + */ + public static Boolean isPost() { + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (servletRequestAttributes != null) { + HttpServletRequest request = servletRequestAttributes.getRequest(); + return request.getMethod().equals("POST"); + } + return false; + } + + /** + * 判断是否是PUT请求 + * + * @author fzr + * @return Boolean + */ + public static Boolean isPUT() { + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (servletRequestAttributes != null) { + HttpServletRequest request = servletRequestAttributes.getRequest(); + return request.getMethod().equals("PUT"); + } + return false; + } + + /** + * 判断是否是DELETE请求 + * + * @author fzr + * @return Boolean + */ + public static Boolean isDelete() { + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (servletRequestAttributes != null) { + HttpServletRequest request = servletRequestAttributes.getRequest(); + return request.getMethod().equals("DELETE"); + } + return false; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/util/SpringUtils.java b/yj-common/src/main/java/com/yj/common/util/SpringUtils.java new file mode 100644 index 0000000..6519919 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/util/SpringUtils.java @@ -0,0 +1,70 @@ +package com.yj.common.util; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +@Component +public class SpringUtils implements ApplicationContextAware { + + private static ApplicationContext applicationContext; + + /** + * 设置容器对象 + * + * @author fzr + * @param applicationContext applicationContext + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + if(SpringUtils.applicationContext == null) { + SpringUtils.applicationContext = applicationContext; + } + } + + /** + * 获取applicationContext + * + * @author fzr + * @return ApplicationContext + */ + public static ApplicationContext getApplicationContext(){ + return applicationContext; + } + + /** + * 通过name获取Bean + * + * @author fzr + * @param name 名称 + * @return Object + */ + public static Object getBean(String name){ + return getApplicationContext().getBean(name); + } + + /** + * 通过class获取Bean. + * + * @author fzr + * @param clazz 类 + * @return + */ + public static T getBean(Class clazz){ + return getApplicationContext().getBean(clazz); + } + + /** + * 通过name和Clazz返回指定的Bean + * + * @author fzr + * @param name 名称 + * @param clazz 类 + * @return + */ + public static T getBean(String name, Class clazz){ + return getApplicationContext().getBean(name, clazz); + } + +} diff --git a/yj-common/src/main/java/com/yj/common/util/StringUtils.java b/yj-common/src/main/java/com/yj/common/util/StringUtils.java new file mode 100644 index 0000000..e663996 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/util/StringUtils.java @@ -0,0 +1,555 @@ +package com.yj.common.util; + +import com.alibaba.fastjson2.JSONArray; +import org.springframework.util.AntPathMatcher; + +import java.util.*; + +/** + * 字符串工具类 + */ +public class StringUtils extends org.apache.commons.lang3.StringUtils { + /** + * 空字符串 + */ + private static final String NULL_STR = ""; + + /** + * 下划线 + */ + private static final char SEPARATOR = '_'; + + /** + * 获取参数不为空值 + * + * @param value defaultValue 要判断的value + * @return value 返回值 + */ + public static T nvl(T value, T defaultValue) { + return value != null ? value : defaultValue; + } + + /** + * 判断一个Collection是否为空,包含List, Set, Queue + * + * @param coll 要判断的Collection + * @return true=为空, false=非空 + */ + public static boolean isEmpty(Collection coll) { + return isNull(coll) || coll.isEmpty(); + } + + /** + * 判断一个Collection是否非空,包含List, Set, Queue + * + * @param coll 要判断的Collection + * @return true=非空, false=空 + */ + public static boolean isNotEmpty(Collection coll) { + return !isEmpty(coll); + } + + /** + * 判断一个对象数组是否为空 + * + * @param objects 要判断的对象数组 + * @return true=为空, false=非空 + */ + public static boolean isEmpty(Object[] objects) { + return isNull(objects) || (objects.length == 0); + } + + /** + * 判断一个对象数组是否非空 + * + * @param objects 要判断的对象数组 + * @return true=非空, false=空 + */ + public static boolean isNotEmpty(Object[] objects) { + return !isEmpty(objects); + } + + /** + * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true=为空, false=非空 + */ + public static boolean isEmpty(Map map) { + return isNull(map) || map.isEmpty(); + } + + /** + * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true=非空, false=空 + */ + public static boolean isNotEmpty(Map map) { + return !isEmpty(map); + } + + /** + * 判断一个字符串是否为空串 + * + * @param str String + * @return true=为空, false=非空 + */ + public static boolean isEmpty(String str) { + return isNull(str) || NULL_STR.equals(str.trim()); + } + + /** + * 判断一个字符串是否为非空串 + * + * @param str String + * @return true=非空串, false=空串 + */ + public static boolean isNotEmpty(String str) { + return !isEmpty(str); + } + + /** + * 判断一个对象是否为空 + * + * @param object Object + * @return true=为空, false=非空 + */ + public static boolean isNull(Object object) { + return object == null; + } + + /** + * 判断一个对象是否非空 + * + * @param object Object + * @return true=非空, false=空 + */ + public static boolean isNotNull(Object object) { + return !isNull(object); + } + + /** + * 判断一个对象是否是数组类型(Java基本型别的数组) + * + * @param object 对象 + * @return true=是数组, false=不是数组 + */ + public static boolean isArray(Object object) { + return isNotNull(object) && object.getClass().isArray(); + } + + /** + * 去空格 + */ + public static String trim(String str) { + return (str == null ? "" : str.trim()); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @return 结果 + */ + public static String substring(final String str, int start) { + if (str == null) { + return NULL_STR; + } + + if (start < 0) { + start = str.length() + start; + } + + if (start < 0) { + start = 0; + } + + if (start > str.length()) { + return NULL_STR; + } + + return str.substring(start); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @param end 结束 + * @return 结果 + */ + public static String substring(final String str, int start, int end) { + if (str == null) { + return NULL_STR; + } + + if (end < 0) { + end = str.length() + end; + } + + if (start < 0) { + start = str.length() + start; + } + + if (end > str.length()) { + end = str.length(); + } + + if (start > end) { + return NULL_STR; + } + + if (start < 0) { + start = 0; + } + + if (end < 0) { + end = 0; + } + + return str.substring(start, end); + } + + + /** + * 字符串转set + * + * @param str 字符串 + * @param sep 分隔符 + * @return set集合 + */ + public static Set str2Set(String str, String sep) { + return new HashSet(str2List(str, sep, true, false)); + } + + /** + * 字符串转list + * + * @param str 字符串 + * @param sep 分隔符 + * @param filterBlank 过滤纯空白 + * @param trim 去掉首尾空白 + * @return list集合 + */ + public static List str2List(String str, String sep, boolean filterBlank, boolean trim) { + List list = new ArrayList(); + if (StringUtils.isEmpty(str)) { + return list; + } + + // 过滤空白字符串 + if (filterBlank && StringUtils.isBlank(str)) { + return list; + } + + String[] split = str.split(sep); + for (String string : split) { + if (filterBlank && StringUtils.isBlank(string)) { + continue; + } + if (trim) { + string = string.trim(); + } + list.add(string); + } + + return list; + } + + /** + * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 + * + * @param cs 指定字符串 + * @param searchCharSequences 需要检查的字符串数组 + * @return 是否包含任意一个字符串 + */ + public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) { + if (isEmpty(cs) || isEmpty(searchCharSequences)) + { + return false; + } + for (CharSequence testStr : searchCharSequences) + { + if (containsIgnoreCase(cs, testStr)) + { + return true; + } + } + return false; + } + + /** + * 驼峰转下划线命名 + */ + public static String toUnderScoreCase(String str) { + if (str == null) { + return null; + } + StringBuilder sb = new StringBuilder(); + // 前置字符是否大写 + boolean preCharIsUpperCase = true; + // 当前字符是否大写 + boolean cureCharIsUpperCase = true; + // 下一字符是否大写 + boolean nextCharIsUpperCase = true; + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + if (i > 0) { + preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); + } else { + preCharIsUpperCase = false; + } + + cureCharIsUpperCase = Character.isUpperCase(c); + + if (i < (str.length() - 1)) { + nextCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); + } + + if (preCharIsUpperCase && cureCharIsUpperCase && !nextCharIsUpperCase) { + sb.append(SEPARATOR); + } else if ((i != 0 && !preCharIsUpperCase) && cureCharIsUpperCase) + { + sb.append(SEPARATOR); + } + sb.append(Character.toLowerCase(c)); + } + + return sb.toString(); + } + + /** + * 是否包含字符串 + * + * @param str 验证字符串 + * @param strArr 字符串组 + * @return 包含返回true + */ + public static boolean inStringIgnoreCase(String str, String... strArr) { + if (str != null && strArr != null) { + for (String s : strArr) { + if (str.equalsIgnoreCase(trim(s))) { + return true; + } + } + } + return false; + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。 + * 如果转换前的下划线大写方式命名的字符串为空, + * 则返回空字符串。 例如:HELLO_WORLD->HelloWorld + * + * @param name 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String convertToCamelCase(String name) { + StringBuilder result = new StringBuilder(); + // 快速检查 + if (name == null || name.isEmpty()) { + // 没必要转换 + return ""; + } + else if (!name.contains("_")) { + // 不含下划线,仅将首字母大写 + return name.substring(0, 1).toUpperCase() + name.substring(1); + } + // 用下划线将原始字符串分割 + String[] camels = name.split("_"); + for (String camel : camels) { + // 跳过原始字符串中开头、结尾的下换线或双重下划线 + if (camel.isEmpty()) { + continue; + } + // 首字母大写 + result.append(camel.substring(0, 1).toUpperCase()); + result.append(camel.substring(1).toLowerCase()); + } + return result.toString(); + } + + /** + * 驼峰式命名法 例如:user_name->userName + * + * @param s 字符串 + * @return 驼峰字符串 + */ + public static String toCamelCase(String s) { + if (s == null) { + return null; + } + s = s.toLowerCase(); + StringBuilder sb = new StringBuilder(s.length()); + boolean upperCase = false; + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + + if (c == SEPARATOR) { + upperCase = true; + } else if (upperCase) { + sb.append(Character.toUpperCase(c)); + upperCase = false; + } else { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 + * + * @param str 指定字符串 + * @param strArr 需要检查的字符串数组 + * @return 是否匹配 + */ + public static boolean matches(String str, List strArr) { + if (isEmpty(str) || isEmpty(strArr)) { + return false; + } + for (String pattern : strArr) { + if (isMatch(pattern, str)) { + return true; + } + } + return false; + } + + /** + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; + * ** 表示任意层路径; + * + * @param pattern 匹配规则 + * @param url 需要匹配的url + * @return boolean + */ + public static boolean isMatch(String pattern, String url) { + AntPathMatcher matcher = new AntPathMatcher(); + return matcher.match(pattern, url); + } + + /** + * 数字左边补齐0,使之达到指定长度。 + * 注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。 + * + * @param num 数字对象 + * @param size 字符串指定长度 + * @return 返回数字的字符串格式,该字符串为指定长度。 + */ + public static String padL(final Number num, final int size) { + return padL(num.toString(), size, '0'); + } + + /** + * 字符串左补齐 + * 如果原始字符串s长度大于size,则只保留最后size个字符。 + * + * @param s 原始字符串 + * @param size 字符串指定长度 + * @param c 用于补齐的字符 + * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。 + */ + public static String padL(final String s, final int size, final char c) { + final StringBuilder sb = new StringBuilder(size); + if (s != null) { + final int len = s.length(); + if (s.length() <= size) { + for (int i = size - len; i > 0; i--) { + sb.append(c); + } + sb.append(s); + } else { + return s.substring(len - size, len); + } + } else { + for (int i = size; i > 0; i--) { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 格式化文本, {} 表示占位符
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param strPattern 文本模板,被替换的部分用 {} 表示 + * @param argArray 参数值 + * @return 格式化后的文本 + */ + public static String format(String strPattern, Object... argArray) { + String EMPTY_JSON = "{}"; + char C_BACKSLASH = '\\'; + char C_DELIM_START = '{'; + + if (isEmpty(argArray) || isEmpty(strPattern)) { + return strPattern; + } + + final int strPatternLength = strPattern.length(); + StringBuilder sbuf = new StringBuilder(strPatternLength + 50); + int handledPosition = 0; + int delimIndex; + for (int argIndex = 0; argIndex < argArray.length; argIndex++) { + delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition); + if (delimIndex == -1) { + if (handledPosition == 0) { + return strPattern; + } else { + sbuf.append(strPattern, handledPosition, strPatternLength); + return sbuf.toString(); + } + } else { + if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) { + if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) { + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(argArray[argIndex]); + handledPosition = delimIndex + 2; + } else { + // 占位符被转义 + argIndex--; + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(C_DELIM_START); + handledPosition = delimIndex + 1; + } + } else { + // 正常占位符 + sbuf.append(strPattern, handledPosition, delimIndex); + sbuf.append(argArray[argIndex]); + handledPosition = delimIndex + 2; + } + } + } + + sbuf.append(strPattern, handledPosition, strPattern.length()); + return sbuf.toString(); + } + + /** + * 判断是否jsonArray + * @param jsonString + * @return + */ + public static boolean isJsonArrayString(String jsonString) { + if (StringUtils.isNull(jsonString) || StringUtils.isEmpty(jsonString)) { + return false; + } + try { + JSONArray.parseArray(jsonString); + return true; + } catch (Exception e) { + return false; + } + } +} diff --git a/yj-common/src/main/java/com/yj/common/util/TimeUtils.java b/yj-common/src/main/java/com/yj/common/util/TimeUtils.java new file mode 100644 index 0000000..7195d33 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/util/TimeUtils.java @@ -0,0 +1,554 @@ +package com.yj.common.util; + + +import java.lang.management.ManagementFactory; +import java.text.DateFormat; +import java.text.ParsePosition; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; +import java.util.*; +import java.util.regex.Pattern; + +public class TimeUtils { + + /** + * 时间戳转日期(默认格式) + * + * @author fzr + * @param time 时间戳 + * @return String + */ + public static String timestampToDate(Long time) { + if (time != null) { + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(time * 1000)); + } + return "-"; + } + + /** + * 时间戳转日期(默认格式) + * + * @author fzr + * @param time 时间戳 + * @return String + */ + public static String timestampToDate(String time) { + if (time == null) { + time = "0"; + } + long longTime = Long.parseLong(time); + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(longTime * 1000)); + } + + /** + * 时间戳转日期(指定格式) + * + * @author fzr + * @param time 时间戳 + * @param format 格式串 + * @return String + */ + public static String timestampToDate(Long time, String format) { + return new SimpleDateFormat(format).format(new Date(time * 1000)); + } + + /** + * 时间戳转日期(指定格式) + * + * @author fzr + * @param time 时间戳 + * @param format 格式串 + * @return String + */ + public static String timestampToDate(String time, String format) { + long longTime = Long.parseLong(time); + return new SimpleDateFormat(format).format(new Date(longTime * 1000)); + } + + /** + * 日期转时间戳 + * + * @author fzr + * @param date 日期 + * @return Long + */ + public static Long dateToTimestamp(String date) { + String dateTime = TimeUtils.formatDate(date); + return (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).parse(dateTime, new ParsePosition(0)).getTime() / 1000; + } + + /** + * 毫秒转日期时间 + * + * @author fzr + * @param time 毫秒 + * @return String + */ + public static String millisecondToDate(Long time) { + Date date = new Date(); + date.setTime(time); + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } + + /** + * 毫秒转日期时间 + * + * @author fzr + * @param time 毫秒 + * @return String + */ + public static String millisecondToDate(String time) { + Date date = new Date(); + date.setTime(Long.parseLong(time)); + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } + + /** + * 毫秒转日期时间 + * + * @author fzr + * @param time 毫秒 + * @param format 格式串 + * @return String + */ + public static String millisecondToDate(Long time, String format) { + Date date = new Date(); + date.setTime(time); + return new SimpleDateFormat(format).format(date); + } + + /** + * 毫秒转日期时间 + * + * @author fzr + * @param time 毫秒 + * @param format 格式串 + * @return String + */ + public static String millisecondToDate(String time, String format) { + Date date = new Date(); + date.setTime(Long.parseLong(time)); + return new SimpleDateFormat(format).format(date); + } + + /** + * 日期转固定格式 yyyy-MM-dd HH:mm:ss + * + * @author fzr + * @param dateStr 日期时间 + * @return String + */ + public static String formatDate(String dateStr){ + dateStr = dateStr.trim(); + HashMap dateRegFormat = new HashMap<>(); + dateRegFormat.put("^\\d{4}\\D+\\d{1,2}\\D+\\d{1,2}\\D+\\d{1,2}\\D+\\d{1,2}\\D+\\d{1,2}\\D*$", "yyyy-MM-dd-HH-mm-ss");//2014年3月12日 13时5分34秒,2014-03-12 12:05:34,2014/3/12 12:5:34 + dateRegFormat.put("^\\d{4}\\D+\\d{2}\\D+\\d{2}\\D+\\d{2}\\D+\\d{2}$", "yyyy-MM-dd-HH-mm");//2014-03-12 12:05 + dateRegFormat.put("^\\d{4}\\D+\\d{2}\\D+\\d{2}\\D+\\d{2}$", "yyyy-MM-dd-HH");//2014-03-12 12 + dateRegFormat.put("^\\d{4}\\D+\\d{2}\\D+\\d{2}$", "yyyy-MM-dd");//2014-03-12 + dateRegFormat.put("^\\d{4}\\D+\\d{2}$", "yyyy-MM");//2014-03 + dateRegFormat.put("^\\d{4}$", "yyyy");//2014 + dateRegFormat.put("^\\d{14}$", "yyyyMyjHHmmss");//20140312120534 + dateRegFormat.put("^\\d{12}$", "yyyyMyjHHmm");//201403121205 + dateRegFormat.put("^\\d{10}$", "yyyyMyjHH");//2014031212 + dateRegFormat.put("^\\d{8}$", "yyyyMyj");//20140312 + dateRegFormat.put("^\\d{6}$", "yyyyMM");//201403 + dateRegFormat.put("^\\d{2}\\s*:\\s*\\d{2}\\s*:\\s*\\d{2}$", "yyyy-MM-dd-HH-mm-ss");//13:05:34 拼接当前日期 + dateRegFormat.put("^\\d{2}\\s*:\\s*\\d{2}$", "yyyy-MM-dd-HH-mm");//13:05 拼接当前日期 + dateRegFormat.put("^\\d{2}\\D+\\d{1,2}\\D+\\d{1,2}$", "yy-MM-dd");//14.10.18(年.月.日) + dateRegFormat.put("^\\d{1,2}\\D+\\d{1,2}$", "yyyy-dd-MM");//30.12(日.月) 拼接当前年份 + dateRegFormat.put("^\\d{1,2}\\D+\\d{1,2}\\D+\\d{4}$", "dd-MM-yyyy");//12.21.2013(日.月.年) + + String curDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + DateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + DateFormat formatter2; + String dateReplace; + String strSuccess = ""; + try { + for (String key : dateRegFormat.keySet()) { + if (Pattern.compile(key).matcher(dateStr).matches()) { + formatter2 = new SimpleDateFormat(dateRegFormat.get(key)); + if (key.equals("^\\d{2}\\s*:\\s*\\d{2}\\s*:\\s*\\d{2}$") || key.equals("^\\d{2}\\s*:\\s*\\d{2}$")) { + // 13:05:34 或 13:05 拼接当前日期 + dateStr = curDate + "-" + dateStr; + } else if (key.equals("^\\d{1,2}\\D+\\d{1,2}$")) { + //21.1 (日.月) 拼接当前年份 + dateStr = curDate.substring(0, 4) + "-" + dateStr; + } + dateReplace = dateStr.replaceAll("\\D+", "-"); + strSuccess = formatter1.format(formatter2.parse(dateReplace)); + break; + } + } + return strSuccess; + } catch (Exception ignored) { } + return ""; + } + + /** + * 返回当前时间戳 + * + * @author fzr + * @return Long + */ + public static Long timestamp() { + return System.currentTimeMillis() / 1000; + } + + /** + * 返回当前Date型日期 + * + * @author fzr + * @return Date() 当前日期 + */ + public static Date nowDate() { + return new Date(); + } + + /** + * 返回今日开始和结束的时间戳 + * + * @author fzr + * @return List + */ + public static List today() { + List list = new ArrayList<>(); + // 开始时间 + LocalDateTime startOfDay = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS); + ZonedDateTime zonedDateTimeStart = startOfDay.atZone(ZoneId.systemDefault()); + long startTimestamp = Date.from(zonedDateTimeStart.toInstant()).getTime() / 1000; + list.add(startTimestamp); + + // 结束时间 + Calendar todayEnd = Calendar.getInstance(); + todayEnd.set(Calendar.HOUR_OF_DAY, 23); + todayEnd.set(Calendar.MINUTE, 59); + todayEnd.set(Calendar.SECOND, 59); + todayEnd.set(Calendar.MILLISECOND, 999); + list.add(todayEnd.getTime().getTime() / 1000); + + return list; + } + + /** + * 返回昨日开始和结束的时间戳 + * + * @author fzr + * @return List + */ + public static List yesterday() { + List today = TimeUtils.today(); + List list = new ArrayList<>(); + list.add(today.get(0) - 86400); + list.add(today.get(1) - 86400); + return list; + } + + /** + * 返回本周开始和结束的时间戳 + * + * @author fzr + * @return List + */ + public static List week() { + List list = new ArrayList<>(); + // 开始时间 + Calendar cal = Calendar.getInstance(); + cal.set(cal.get(Calendar.YEAR),cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0,0); + cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); + list.add(cal.getTimeInMillis() / 1000); + // 结束时间 + list.add(list.get(0) + ((7 * 24 * 60 * 60 * 1000) / 1000)-1); + return list; + } + + /** + * 返回上周开始和结束的时间戳 + * + * @author fzr + * @return List + */ + public static List lastWeek() { + List week = TimeUtils.week(); + List list = new ArrayList<>(); + list.add(week.get(0) - 604800); + list.add(week.get(1) - 604800); + return list; + } + + /** + * 返回今天是周几 + * + * @author fzr + * @return Long + */ + public static Long dayOfWeek() { + Date date = new Date(); + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + boolean isFirstSunday = (cal.getFirstDayOfWeek() == Calendar.SUNDAY); + long week = cal.get(Calendar.DAY_OF_WEEK); + if(isFirstSunday){ + week = (week -1) == 0? 7:(week - 1); + } + return week; + } + + /** + * 返回本月开始和结束的时间戳 + * + * @author fzr + * @return List + */ + public static List month() { + List list = new ArrayList<>(); + // 开始时间 + Calendar calStart = Calendar.getInstance(); + calStart.set(calStart.get(Calendar.YEAR),calStart.get(Calendar.MONTH), calStart.get(Calendar.DAY_OF_MONTH), 0, 0,0); + calStart.set(Calendar.DAY_OF_MONTH,calStart.getActualMinimum(Calendar.DAY_OF_MONTH)); + list.add(calStart.getTimeInMillis() / 1000); + + // 结束时间 + Calendar calEnd = Calendar.getInstance(); + calEnd.set(calEnd.get(Calendar.YEAR),calEnd.get(Calendar.MONTH), calEnd.get(Calendar.DAY_OF_MONTH), 0, 0,0); + calEnd.set(Calendar.DAY_OF_MONTH, calEnd.getActualMaximum(Calendar.DAY_OF_MONTH)); + calEnd.set(Calendar.HOUR_OF_DAY, 24); + list.add(calEnd.getTimeInMillis() / 1000 - 1); + return list; + } + + /** + * 返回上个月开始和结束的时间戳 + * + * @author fzr + * @return List + */ + public static List lastMonth() { + List list = new ArrayList<>(); + // 开始时间 + Calendar calStart = Calendar.getInstance(); + calStart.add(Calendar.MONTH, -1); + calStart.set(Calendar.DAY_OF_MONTH,1); + calStart.set(Calendar.HOUR, 0); + calStart.set(Calendar.MINUTE, 0); + calStart.set(Calendar.SECOND, 0); + calStart.set(Calendar.MILLISECOND, 0); + list.add((calStart.getTimeInMillis() / 1000) - 43200); + + // 结束时间 + Calendar calEnd = Calendar.getInstance(); + calEnd.set(calEnd.get(Calendar.YEAR),calEnd.get(Calendar.MONTH), calEnd.get(Calendar.DAY_OF_MONTH), 0, 0,0); + calEnd.set(Calendar.DAY_OF_MONTH,calEnd.getActualMinimum(Calendar.DAY_OF_MONTH)); + list.add((calEnd.getTimeInMillis() / 1000)-1); + return list; + } + + /** + * 返回今年开始和结束的时间戳 + * + * @author fzr + * @return List + */ + public static List year() { + List list = new ArrayList<>(); + // 开始时间 + Calendar calStart = Calendar.getInstance(); + calStart.add(Calendar.YEAR, 0); + calStart.add(Calendar.DATE, 0); + calStart.add(Calendar.MONTH, 0); + calStart.set(Calendar.DAY_OF_YEAR, 1); + calStart.set(Calendar.HOUR_OF_DAY, 0); + calStart.set(Calendar.MINUTE, 0); + calStart.set(Calendar.SECOND, 0); + calStart.set(Calendar.MILLISECOND, 0); + list.add(calStart.getTimeInMillis() / 1000); + + // 结束时间 + Calendar calEnd = Calendar.getInstance(); + int year = calEnd.get(Calendar.YEAR); + calEnd.clear(); + calEnd.set(Calendar.YEAR, year); + calEnd.set(Calendar.HOUR_OF_DAY, 23); + calEnd.set(Calendar.MINUTE, 59); + calEnd.set(Calendar.SECOND, 59); + calEnd.set(Calendar.MILLISECOND, 999); + calEnd.roll(Calendar.DAY_OF_YEAR, -1); + list.add(calEnd.getTimeInMillis() / 1000); + return list; + } + + /** + * 返回去年开始和结束的时间戳 + * + * @author fzr + * @return List + */ + public static List lastYear() { + List list = new ArrayList<>(); + // 开始时间 + Calendar calStart = Calendar.getInstance(); + calStart.add(Calendar.YEAR, -1); + calStart.set(Calendar.HOUR_OF_DAY, 0); + calStart.set(Calendar.DAY_OF_YEAR, 1); + calStart.set(Calendar.MINUTE, 0); + calStart.set(Calendar.SECOND, 0); + calStart.set(Calendar.MILLISECOND, 0); + list.add(calStart.getTimeInMillis() / 1000); + + // 结束时间 + Calendar calEnd = Calendar.getInstance(); + calEnd.add(Calendar.YEAR, -1); + calEnd.set(Calendar.MONTH, calEnd.getActualMaximum(Calendar.MONTH)); + calEnd.set(Calendar.DAY_OF_MONTH, calEnd.getActualMaximum(Calendar.DAY_OF_MONTH)); + calEnd.set(Calendar.HOUR_OF_DAY, 23); + calEnd.set(Calendar.MINUTE, 59); + calEnd.set(Calendar.SECOND, 59); + calEnd.set(Calendar.MILLISECOND, 999); + list.add(calEnd.getTimeInMillis() / 1000); + return list; + } + + /** + * 获取几天前零点到现在/昨日结束的时间戳 + * + * @author fzr + * @return List + */ + public static List dayToNow(int day) { + List today = TimeUtils.today(); + List list = new ArrayList<>(); + list.add(today.get(0) - day * 86400L); + list.add(today.get(0) -1); + return list; + } + + /** + * 返回几天前的时间戳 + * + * @author fzr + * @param day (天) + * @return Long + */ + public Long daysAgo(long day) { + long currTime = System.currentTimeMillis() / 1000; + return currTime - (day * 86400); + } + + /** + * 返回几天后的时间戳 + * + * @author fzr + * @param day (天) + * @return Long + */ + public Long daysAfter(long day) { + long currTime = System.currentTimeMillis() / 1000; + return currTime + (day * 86400); + } + + /** + * 返回月份第几天 + * + * @author fzr + * @return int + */ + public static Integer monthDay(){ + Date date = new Date(); + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + return cal.get(Calendar.DAY_OF_MONTH); + } + + /** + * 获取几天前的日期列表 + * + * @author fzr + * @param day 获取多少天 + * @return [2022-03-29, 2022-03-30, 2022-03-31, 2022-04-01] + */ + public static List daysAgoDate(Integer day) { + long time = TimeUtils.today().get(0); + + List data = new ArrayList<>(); + for (int i=0; i daysAgoTime(Integer day) { + long time = TimeUtils.today().get(0); + + List data = new ArrayList<>(); + for (int i=0; i config = ConfigUtils.getMap("storage", engine); + if (config != null) { + return config.getOrDefault("domain", "") + url; + } + return url; + } + + /** + * 转绝对路径 + * 转前: uploads/11.png + * 转后: https://127.0.0.1/uploads/11.png + * + * @author fzr + * @param url 相对路径 + * @return String + */ + public static String toAdminAbsoluteUrl(String url) { + if (url == null || url.equals("")) { + return ""; + } + + if(url.indexOf("/") != 0) { + url = "/" + url; + } + + if (url.startsWith("/adminapi/static/")) { + return RequestUtils.uri() + url; + } + + if (url.startsWith("/api/static/")) { + return RequestUtils.uri() + url.replace("/api/static/", "/adminapi/static/"); + } + + String engine = ConfigUtils.get("storage", "default", "local"); + engine = engine.equals("") ? "local" : engine; + if (engine.equals("local")) { + if (url.startsWith("/adminapi/uploads/")) { + return RequestUtils.uri() + url; + } else { + return RequestUtils.uri() + "/" + uploadAdminPrefix + url; + } + } + + Map config = ConfigUtils.getMap("storage", engine); + if (config != null) { + return config.getOrDefault("domain", "") + url; + } + return url; + } + /** + * 转相对路径 + * 转前: https://127.0.0.1/uploads/11.png + * 转后: uploads/11.png + * + * @author fzr + * @param url 绝对路径 + * @return String + */ + public static String toRelativeUrl(String url) { + if (url == null || url.equals("")) { + return ""; + } + + String engine = ConfigUtils.get("storage", "default", "local"); + engine = engine.equals("") ? "local" : engine; + if (engine.equals("local")) { + return url.replace(RequestUtils.uri(), "") + .replace("/" + uploadPrefix + "/", ""); + } + + Map config = ConfigUtils.getMap("storage", engine); + if (config != null) { + return url.replace(config.getOrDefault("domain", ""), "") + .replace( "/" + uploadPrefix + "/", ""); + } + + return url; + } + + /** + * 获取存储域名 + * 示例: https://127.0.0.1/ + * + * @author fzr + * @return String + */ + public static String domain() { + String engine = ConfigUtils.get("storage", "default", "local"); + engine = engine.equals("") ? "local" : engine; + if (engine.equals("local")) { + return RequestUtils.uri() + "/"; + } + + Map config = ConfigUtils.getMap("storage", engine); + if (config != null) { + return config.getOrDefault("domain", "") + "/"; + } + return ""; + } + + /** + * 获取域名 + * 示例: https://127.0.0.1/ + * + * @author fzr + * @return String + */ + public static String localDomain(String url){ + return RequestUtils.uri() + url; + } + + /** + * 为了避免负载均衡而导致的域名失效,增加该方法 + * @return + */ + public static String getRequestUrl() { + if (StringUtils.isNull(YmlUtils.get("like.url"))) { + return RequestUtils.uri(); + } else { + return YmlUtils.get("like.url"); + } + } +} diff --git a/yj-common/src/main/java/com/yj/common/util/YmlUtils.java b/yj-common/src/main/java/com/yj/common/util/YmlUtils.java new file mode 100644 index 0000000..669042d --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/util/YmlUtils.java @@ -0,0 +1,37 @@ +package com.yj.common.util; + +import org.springframework.context.EnvironmentAware; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +/** + * 系统文件配置操作工具 + */ +@Component +public class YmlUtils implements EnvironmentAware { + + private static Environment env; + + /** + * 设置环境变量 + * + * @author fzr + * @param environment 环境变量 + */ + @Override + public void setEnvironment(Environment environment) { + YmlUtils.env = environment; + } + + /** + * 根据Key获取值 + * + * @author fzr + * @param key 键 + * @return String + */ + public static String get(String key) { + return env.getProperty(key); + } + +} diff --git a/yj-common/src/main/java/com/yj/common/validator/IDMustValidator.java b/yj-common/src/main/java/com/yj/common/validator/IDMustValidator.java new file mode 100644 index 0000000..62fda5c --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/validator/IDMustValidator.java @@ -0,0 +1,23 @@ +package com.yj.common.validator; + +import com.yj.common.validator.annotation.IDMust; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +/** + * 验证主键ID参数 + */ +public class IDMustValidator implements ConstraintValidator { + + @Override + public void initialize(IDMust constraintAnnotation) { + ConstraintValidator.super.initialize(constraintAnnotation); + } + + @Override + public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) { + return value != null && value > 0; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/validator/IntArrayEmptyValidator.java b/yj-common/src/main/java/com/yj/common/validator/IntArrayEmptyValidator.java new file mode 100644 index 0000000..7bf6558 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/validator/IntArrayEmptyValidator.java @@ -0,0 +1,28 @@ +package com.yj.common.validator; + +import com.yj.common.validator.annotation.IntArrayEmpty; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + + +/** + * 验证整数数组是否为空 + */ +public class IntArrayEmptyValidator implements ConstraintValidator { + + @Override + public void initialize(IntArrayEmpty constraintAnnotation) { + ConstraintValidator.super.initialize(constraintAnnotation); + } + + @Override + public boolean isValid(int[] value, ConstraintValidatorContext context) { + if (value == null) { + return false; + } + + return value.length > 0; + } + +} diff --git a/yj-common/src/main/java/com/yj/common/validator/IntegerContainsValidator.java b/yj-common/src/main/java/com/yj/common/validator/IntegerContainsValidator.java new file mode 100644 index 0000000..af6943a --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/validator/IntegerContainsValidator.java @@ -0,0 +1,35 @@ +package com.yj.common.validator; + +import com.yj.common.validator.annotation.IntegerContains; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.HashSet; +import java.util.Set; + +/** + * 验证数字是否在数组中 + */ +public class IntegerContainsValidator implements ConstraintValidator { + + private Set limitValues; + + @Override + public void initialize (IntegerContains integerContains) { + HashSet set = new HashSet<>(); + for (int i : integerContains.values()) { + set.add(i); + } + limitValues = set; + } + + @Override + public boolean isValid(Integer value, ConstraintValidatorContext context) { + if (value == null) { + return true; + } + + return limitValues.contains(value); + } + +} diff --git a/yj-common/src/main/java/com/yj/common/validator/StringContainsValidator.java b/yj-common/src/main/java/com/yj/common/validator/StringContainsValidator.java new file mode 100644 index 0000000..3272587 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/validator/StringContainsValidator.java @@ -0,0 +1,32 @@ +package com.yj.common.validator; + +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.yj.common.validator.annotation.StringContains; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 验证字符串是否在数组中 + */ +public class StringContainsValidator implements ConstraintValidator { + + private Set limitValues; + + @Override + public void initialize (StringContains stringContains) { + limitValues = Arrays.stream(stringContains.values()).collect(Collectors.toSet()); + } + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + if (StringUtils.isBlank(value)) { + return true; + } + return limitValues.contains(value.trim()); + } + +} diff --git a/yj-common/src/main/java/com/yj/common/validator/annotation/IDMust.java b/yj-common/src/main/java/com/yj/common/validator/annotation/IDMust.java new file mode 100644 index 0000000..d70d036 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/validator/annotation/IDMust.java @@ -0,0 +1,21 @@ +package com.yj.common.validator.annotation; + +import com.yj.common.validator.IDMustValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +@Documented +@Constraint(validatedBy = IDMustValidator.class) +@Target({ ElementType.PARAMETER,ElementType.FIELD }) +@Retention(RetentionPolicy.RUNTIME) +public @interface IDMust { + + String message() default "id参数必须存在且大于0"; + + Class[] groups() default {}; + + Class[] payload() default { }; + +} diff --git a/yj-common/src/main/java/com/yj/common/validator/annotation/IntArrayEmpty.java b/yj-common/src/main/java/com/yj/common/validator/annotation/IntArrayEmpty.java new file mode 100644 index 0000000..a45f9fc --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/validator/annotation/IntArrayEmpty.java @@ -0,0 +1,20 @@ +package com.yj.common.validator.annotation; + +import com.yj.common.validator.IntArrayEmptyValidator; +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +@Documented +@Constraint(validatedBy = IntArrayEmptyValidator.class) +@Target({ ElementType.PARAMETER,ElementType.FIELD }) +@Retention(RetentionPolicy.RUNTIME) +public @interface IntArrayEmpty { + + String message() default "数组不允许为空"; + + Class[] groups() default {}; + + Class[] payload() default { }; + +} diff --git a/yj-common/src/main/java/com/yj/common/validator/annotation/IntegerContains.java b/yj-common/src/main/java/com/yj/common/validator/annotation/IntegerContains.java new file mode 100644 index 0000000..b79ad9d --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/validator/annotation/IntegerContains.java @@ -0,0 +1,23 @@ +package com.yj.common.validator.annotation; + +import com.yj.common.validator.IntegerContainsValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +@Documented +@Constraint(validatedBy = IntegerContainsValidator.class) +@Target({ ElementType.PARAMETER,ElementType.FIELD }) +@Retention(RetentionPolicy.RUNTIME) +public @interface IntegerContains { + + String message() default "数值不符合规则"; + + int[] values() default {}; + + Class[] groups() default {}; + + Class[] payload() default { }; + +} diff --git a/yj-common/src/main/java/com/yj/common/validator/annotation/StringContains.java b/yj-common/src/main/java/com/yj/common/validator/annotation/StringContains.java new file mode 100644 index 0000000..ad9c385 --- /dev/null +++ b/yj-common/src/main/java/com/yj/common/validator/annotation/StringContains.java @@ -0,0 +1,23 @@ +package com.yj.common.validator.annotation; + +import com.yj.common.validator.StringContainsValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +@Documented +@Constraint(validatedBy = StringContainsValidator.class) +@Target({ ElementType.PARAMETER,ElementType.FIELD }) +@Retention(RetentionPolicy.RUNTIME) +public @interface StringContains { + + String message() default "字符串不符合规则"; + + String[] values() default {}; + + Class[] groups() default {}; + + Class[] payload() default { }; + +} diff --git a/yj-common/src/main/resources/static/ad01.jpg b/yj-common/src/main/resources/static/ad01.jpg new file mode 100644 index 0000000..3ac345d Binary files /dev/null and b/yj-common/src/main/resources/static/ad01.jpg differ diff --git a/yj-common/src/main/resources/static/admin_logo.jpg b/yj-common/src/main/resources/static/admin_logo.jpg new file mode 100644 index 0000000..f4073c9 Binary files /dev/null and b/yj-common/src/main/resources/static/admin_logo.jpg differ diff --git a/yj-common/src/main/resources/static/ali_pay.png b/yj-common/src/main/resources/static/ali_pay.png new file mode 100644 index 0000000..d752ec4 Binary files /dev/null and b/yj-common/src/main/resources/static/ali_pay.png differ diff --git a/yj-common/src/main/resources/static/article01.png b/yj-common/src/main/resources/static/article01.png new file mode 100644 index 0000000..ad176e7 Binary files /dev/null and b/yj-common/src/main/resources/static/article01.png differ diff --git a/yj-common/src/main/resources/static/article02.jpeg b/yj-common/src/main/resources/static/article02.jpeg new file mode 100644 index 0000000..3cc6f49 Binary files /dev/null and b/yj-common/src/main/resources/static/article02.jpeg differ diff --git a/yj-common/src/main/resources/static/article03.png b/yj-common/src/main/resources/static/article03.png new file mode 100644 index 0000000..3c62d41 Binary files /dev/null and b/yj-common/src/main/resources/static/article03.png differ diff --git a/yj-common/src/main/resources/static/avatar.png b/yj-common/src/main/resources/static/avatar.png new file mode 100644 index 0000000..2051719 Binary files /dev/null and b/yj-common/src/main/resources/static/avatar.png differ diff --git a/yj-common/src/main/resources/static/backend_avatar.png b/yj-common/src/main/resources/static/backend_avatar.png new file mode 100644 index 0000000..2051719 Binary files /dev/null and b/yj-common/src/main/resources/static/backend_avatar.png differ diff --git a/yj-common/src/main/resources/static/backend_backdrop.png b/yj-common/src/main/resources/static/backend_backdrop.png new file mode 100644 index 0000000..a302011 Binary files /dev/null and b/yj-common/src/main/resources/static/backend_backdrop.png differ diff --git a/yj-common/src/main/resources/static/backend_favicon.ico b/yj-common/src/main/resources/static/backend_favicon.ico new file mode 100644 index 0000000..7c00219 Binary files /dev/null and b/yj-common/src/main/resources/static/backend_favicon.ico differ diff --git a/yj-common/src/main/resources/static/backend_logo.png b/yj-common/src/main/resources/static/backend_logo.png new file mode 100644 index 0000000..cb2f6d5 Binary files /dev/null and b/yj-common/src/main/resources/static/backend_logo.png differ diff --git a/yj-common/src/main/resources/static/balance_pay.png b/yj-common/src/main/resources/static/balance_pay.png new file mode 100644 index 0000000..ed87615 Binary files /dev/null and b/yj-common/src/main/resources/static/balance_pay.png differ diff --git a/yj-common/src/main/resources/static/banner001.png b/yj-common/src/main/resources/static/banner001.png new file mode 100644 index 0000000..4d9292a Binary files /dev/null and b/yj-common/src/main/resources/static/banner001.png differ diff --git a/yj-common/src/main/resources/static/banner001_bg.png b/yj-common/src/main/resources/static/banner001_bg.png new file mode 100644 index 0000000..ae0cd58 Binary files /dev/null and b/yj-common/src/main/resources/static/banner001_bg.png differ diff --git a/yj-common/src/main/resources/static/banner002.png b/yj-common/src/main/resources/static/banner002.png new file mode 100644 index 0000000..4948056 Binary files /dev/null and b/yj-common/src/main/resources/static/banner002.png differ diff --git a/yj-common/src/main/resources/static/banner002_bg.png b/yj-common/src/main/resources/static/banner002_bg.png new file mode 100644 index 0000000..19a1e2f Binary files /dev/null and b/yj-common/src/main/resources/static/banner002_bg.png differ diff --git a/yj-common/src/main/resources/static/banner003.png b/yj-common/src/main/resources/static/banner003.png new file mode 100644 index 0000000..2dda207 Binary files /dev/null and b/yj-common/src/main/resources/static/banner003.png differ diff --git a/yj-common/src/main/resources/static/banner003_bg.png b/yj-common/src/main/resources/static/banner003_bg.png new file mode 100644 index 0000000..0af5b68 Binary files /dev/null and b/yj-common/src/main/resources/static/banner003_bg.png differ diff --git a/yj-common/src/main/resources/static/banner01.png b/yj-common/src/main/resources/static/banner01.png new file mode 100644 index 0000000..5894291 Binary files /dev/null and b/yj-common/src/main/resources/static/banner01.png differ diff --git a/yj-common/src/main/resources/static/banner02.png b/yj-common/src/main/resources/static/banner02.png new file mode 100644 index 0000000..0c2d334 Binary files /dev/null and b/yj-common/src/main/resources/static/banner02.png differ diff --git a/yj-common/src/main/resources/static/banner03.png b/yj-common/src/main/resources/static/banner03.png new file mode 100644 index 0000000..3ac345d Binary files /dev/null and b/yj-common/src/main/resources/static/banner03.png differ diff --git a/yj-common/src/main/resources/static/chat_example.png b/yj-common/src/main/resources/static/chat_example.png new file mode 100644 index 0000000..015e462 Binary files /dev/null and b/yj-common/src/main/resources/static/chat_example.png differ diff --git a/yj-common/src/main/resources/static/chat_logo.png b/yj-common/src/main/resources/static/chat_logo.png new file mode 100644 index 0000000..0231ac3 Binary files /dev/null and b/yj-common/src/main/resources/static/chat_logo.png differ diff --git a/yj-common/src/main/resources/static/cs_app.png b/yj-common/src/main/resources/static/cs_app.png new file mode 100644 index 0000000..a081f31 Binary files /dev/null and b/yj-common/src/main/resources/static/cs_app.png differ diff --git a/yj-common/src/main/resources/static/customer_service.jpg b/yj-common/src/main/resources/static/customer_service.jpg new file mode 100644 index 0000000..0187212 Binary files /dev/null and b/yj-common/src/main/resources/static/customer_service.jpg differ diff --git a/yj-common/src/main/resources/static/default_avatar.png b/yj-common/src/main/resources/static/default_avatar.png new file mode 100644 index 0000000..64d50e7 Binary files /dev/null and b/yj-common/src/main/resources/static/default_avatar.png differ diff --git a/yj-common/src/main/resources/static/dialogue_backdend01.png b/yj-common/src/main/resources/static/dialogue_backdend01.png new file mode 100644 index 0000000..d319c47 Binary files /dev/null and b/yj-common/src/main/resources/static/dialogue_backdend01.png differ diff --git a/yj-common/src/main/resources/static/dialogue_backdend02.png b/yj-common/src/main/resources/static/dialogue_backdend02.png new file mode 100644 index 0000000..14a09bb Binary files /dev/null and b/yj-common/src/main/resources/static/dialogue_backdend02.png differ diff --git a/yj-common/src/main/resources/static/index_ad01.png b/yj-common/src/main/resources/static/index_ad01.png new file mode 100644 index 0000000..a3cd640 Binary files /dev/null and b/yj-common/src/main/resources/static/index_ad01.png differ diff --git a/yj-common/src/main/resources/static/invite_backdend01.png b/yj-common/src/main/resources/static/invite_backdend01.png new file mode 100644 index 0000000..d32c298 Binary files /dev/null and b/yj-common/src/main/resources/static/invite_backdend01.png differ diff --git a/yj-common/src/main/resources/static/invite_backdend02.png b/yj-common/src/main/resources/static/invite_backdend02.png new file mode 100644 index 0000000..cb398d7 Binary files /dev/null and b/yj-common/src/main/resources/static/invite_backdend02.png differ diff --git a/yj-common/src/main/resources/static/kefu01.png b/yj-common/src/main/resources/static/kefu01.png new file mode 100644 index 0000000..213b08a Binary files /dev/null and b/yj-common/src/main/resources/static/kefu01.png differ diff --git a/yj-common/src/main/resources/static/kf_icon.png b/yj-common/src/main/resources/static/kf_icon.png new file mode 100644 index 0000000..e7b64fb Binary files /dev/null and b/yj-common/src/main/resources/static/kf_icon.png differ diff --git a/yj-common/src/main/resources/static/kf_online.png b/yj-common/src/main/resources/static/kf_online.png new file mode 100644 index 0000000..6641c70 Binary files /dev/null and b/yj-common/src/main/resources/static/kf_online.png differ diff --git a/yj-common/src/main/resources/static/kf_qr.png b/yj-common/src/main/resources/static/kf_qr.png new file mode 100644 index 0000000..2dc4d76 Binary files /dev/null and b/yj-common/src/main/resources/static/kf_qr.png differ diff --git a/yj-common/src/main/resources/static/login_image.png b/yj-common/src/main/resources/static/login_image.png new file mode 100644 index 0000000..a302011 Binary files /dev/null and b/yj-common/src/main/resources/static/login_image.png differ diff --git a/yj-common/src/main/resources/static/menu_admin.png b/yj-common/src/main/resources/static/menu_admin.png new file mode 100644 index 0000000..404eb7d Binary files /dev/null and b/yj-common/src/main/resources/static/menu_admin.png differ diff --git a/yj-common/src/main/resources/static/menu_auth.png b/yj-common/src/main/resources/static/menu_auth.png new file mode 100644 index 0000000..102499f Binary files /dev/null and b/yj-common/src/main/resources/static/menu_auth.png differ diff --git a/yj-common/src/main/resources/static/menu_dept.png b/yj-common/src/main/resources/static/menu_dept.png new file mode 100644 index 0000000..614555e Binary files /dev/null and b/yj-common/src/main/resources/static/menu_dept.png differ diff --git a/yj-common/src/main/resources/static/menu_dict.png b/yj-common/src/main/resources/static/menu_dict.png new file mode 100644 index 0000000..7fecd89 Binary files /dev/null and b/yj-common/src/main/resources/static/menu_dict.png differ diff --git a/yj-common/src/main/resources/static/menu_file.png b/yj-common/src/main/resources/static/menu_file.png new file mode 100644 index 0000000..b74ab8b Binary files /dev/null and b/yj-common/src/main/resources/static/menu_file.png differ diff --git a/yj-common/src/main/resources/static/menu_finance.png b/yj-common/src/main/resources/static/menu_finance.png new file mode 100644 index 0000000..70ab8b5 Binary files /dev/null and b/yj-common/src/main/resources/static/menu_finance.png differ diff --git a/yj-common/src/main/resources/static/menu_generator.png b/yj-common/src/main/resources/static/menu_generator.png new file mode 100644 index 0000000..2d3b114 Binary files /dev/null and b/yj-common/src/main/resources/static/menu_generator.png differ diff --git a/yj-common/src/main/resources/static/menu_keys.png b/yj-common/src/main/resources/static/menu_keys.png new file mode 100644 index 0000000..eb09ace Binary files /dev/null and b/yj-common/src/main/resources/static/menu_keys.png differ diff --git a/yj-common/src/main/resources/static/menu_make.png b/yj-common/src/main/resources/static/menu_make.png new file mode 100644 index 0000000..01993ec Binary files /dev/null and b/yj-common/src/main/resources/static/menu_make.png differ diff --git a/yj-common/src/main/resources/static/menu_notice.png b/yj-common/src/main/resources/static/menu_notice.png new file mode 100644 index 0000000..6bef885 Binary files /dev/null and b/yj-common/src/main/resources/static/menu_notice.png differ diff --git a/yj-common/src/main/resources/static/menu_order.png b/yj-common/src/main/resources/static/menu_order.png new file mode 100644 index 0000000..28a163d Binary files /dev/null and b/yj-common/src/main/resources/static/menu_order.png differ diff --git a/yj-common/src/main/resources/static/menu_role.png b/yj-common/src/main/resources/static/menu_role.png new file mode 100644 index 0000000..549d5f5 Binary files /dev/null and b/yj-common/src/main/resources/static/menu_role.png differ diff --git a/yj-common/src/main/resources/static/menu_type.png b/yj-common/src/main/resources/static/menu_type.png new file mode 100644 index 0000000..27c7ab7 Binary files /dev/null and b/yj-common/src/main/resources/static/menu_type.png differ diff --git a/yj-common/src/main/resources/static/menu_user.png b/yj-common/src/main/resources/static/menu_user.png new file mode 100644 index 0000000..4163385 Binary files /dev/null and b/yj-common/src/main/resources/static/menu_user.png differ diff --git a/yj-common/src/main/resources/static/menu_web.png b/yj-common/src/main/resources/static/menu_web.png new file mode 100644 index 0000000..e21afe4 Binary files /dev/null and b/yj-common/src/main/resources/static/menu_web.png differ diff --git a/yj-common/src/main/resources/static/menu_website.png b/yj-common/src/main/resources/static/menu_website.png new file mode 100644 index 0000000..2f1f5a7 Binary files /dev/null and b/yj-common/src/main/resources/static/menu_website.png differ diff --git a/yj-common/src/main/resources/static/model_example.png b/yj-common/src/main/resources/static/model_example.png new file mode 100644 index 0000000..8f386e4 Binary files /dev/null and b/yj-common/src/main/resources/static/model_example.png differ diff --git a/yj-common/src/main/resources/static/nav01.png b/yj-common/src/main/resources/static/nav01.png new file mode 100644 index 0000000..c198426 Binary files /dev/null and b/yj-common/src/main/resources/static/nav01.png differ diff --git a/yj-common/src/main/resources/static/nav02.png b/yj-common/src/main/resources/static/nav02.png new file mode 100644 index 0000000..5c3f810 Binary files /dev/null and b/yj-common/src/main/resources/static/nav02.png differ diff --git a/yj-common/src/main/resources/static/nav03.png b/yj-common/src/main/resources/static/nav03.png new file mode 100644 index 0000000..a9d0a21 Binary files /dev/null and b/yj-common/src/main/resources/static/nav03.png differ diff --git a/yj-common/src/main/resources/static/nav04.png b/yj-common/src/main/resources/static/nav04.png new file mode 100644 index 0000000..6eab45b Binary files /dev/null and b/yj-common/src/main/resources/static/nav04.png differ diff --git a/yj-common/src/main/resources/static/nav05.png b/yj-common/src/main/resources/static/nav05.png new file mode 100644 index 0000000..744b038 Binary files /dev/null and b/yj-common/src/main/resources/static/nav05.png differ diff --git a/yj-common/src/main/resources/static/page_mate_title.png b/yj-common/src/main/resources/static/page_mate_title.png new file mode 100644 index 0000000..015f79c Binary files /dev/null and b/yj-common/src/main/resources/static/page_mate_title.png differ diff --git a/yj-common/src/main/resources/static/page_meta_bg01.png b/yj-common/src/main/resources/static/page_meta_bg01.png new file mode 100644 index 0000000..24c4056 Binary files /dev/null and b/yj-common/src/main/resources/static/page_meta_bg01.png differ diff --git a/yj-common/src/main/resources/static/pay_alipay.png b/yj-common/src/main/resources/static/pay_alipay.png new file mode 100644 index 0000000..b3af0b6 Binary files /dev/null and b/yj-common/src/main/resources/static/pay_alipay.png differ diff --git a/yj-common/src/main/resources/static/pay_balance.png b/yj-common/src/main/resources/static/pay_balance.png new file mode 100644 index 0000000..ed87615 Binary files /dev/null and b/yj-common/src/main/resources/static/pay_balance.png differ diff --git a/yj-common/src/main/resources/static/pay_wechat.png b/yj-common/src/main/resources/static/pay_wechat.png new file mode 100644 index 0000000..bb48336 Binary files /dev/null and b/yj-common/src/main/resources/static/pay_wechat.png differ diff --git a/yj-common/src/main/resources/static/pc_favicon.ico b/yj-common/src/main/resources/static/pc_favicon.ico new file mode 100644 index 0000000..2434b86 Binary files /dev/null and b/yj-common/src/main/resources/static/pc_favicon.ico differ diff --git a/yj-common/src/main/resources/static/pc_logo.png b/yj-common/src/main/resources/static/pc_logo.png new file mode 100644 index 0000000..b08e70a Binary files /dev/null and b/yj-common/src/main/resources/static/pc_logo.png differ diff --git a/yj-common/src/main/resources/static/problem01.png b/yj-common/src/main/resources/static/problem01.png new file mode 100644 index 0000000..74e6526 Binary files /dev/null and b/yj-common/src/main/resources/static/problem01.png differ diff --git a/yj-common/src/main/resources/static/problem02.png b/yj-common/src/main/resources/static/problem02.png new file mode 100644 index 0000000..65fa0d1 Binary files /dev/null and b/yj-common/src/main/resources/static/problem02.png differ diff --git a/yj-common/src/main/resources/static/problem03.png b/yj-common/src/main/resources/static/problem03.png new file mode 100644 index 0000000..f66bd5b Binary files /dev/null and b/yj-common/src/main/resources/static/problem03.png differ diff --git a/yj-common/src/main/resources/static/qq_group.png b/yj-common/src/main/resources/static/qq_group.png new file mode 100644 index 0000000..2bc75c1 Binary files /dev/null and b/yj-common/src/main/resources/static/qq_group.png differ diff --git a/yj-common/src/main/resources/static/qrcode.png b/yj-common/src/main/resources/static/qrcode.png new file mode 100644 index 0000000..76475e8 Binary files /dev/null and b/yj-common/src/main/resources/static/qrcode.png differ diff --git a/yj-common/src/main/resources/static/robot_chat.png b/yj-common/src/main/resources/static/robot_chat.png new file mode 100644 index 0000000..0231ac3 Binary files /dev/null and b/yj-common/src/main/resources/static/robot_chat.png differ diff --git a/yj-common/src/main/resources/static/robot_icon.gif b/yj-common/src/main/resources/static/robot_icon.gif new file mode 100644 index 0000000..2f423d2 Binary files /dev/null and b/yj-common/src/main/resources/static/robot_icon.gif differ diff --git a/yj-common/src/main/resources/static/robot_icon.png b/yj-common/src/main/resources/static/robot_icon.png new file mode 100644 index 0000000..eb44385 Binary files /dev/null and b/yj-common/src/main/resources/static/robot_icon.png differ diff --git a/yj-common/src/main/resources/static/shop_logo.png b/yj-common/src/main/resources/static/shop_logo.png new file mode 100644 index 0000000..58f7800 Binary files /dev/null and b/yj-common/src/main/resources/static/shop_logo.png differ diff --git a/yj-common/src/main/resources/static/tabbar_home.png b/yj-common/src/main/resources/static/tabbar_home.png new file mode 100644 index 0000000..46c2031 Binary files /dev/null and b/yj-common/src/main/resources/static/tabbar_home.png differ diff --git a/yj-common/src/main/resources/static/tabbar_home_sel.png b/yj-common/src/main/resources/static/tabbar_home_sel.png new file mode 100644 index 0000000..314b747 Binary files /dev/null and b/yj-common/src/main/resources/static/tabbar_home_sel.png differ diff --git a/yj-common/src/main/resources/static/tabbar_me.png b/yj-common/src/main/resources/static/tabbar_me.png new file mode 100644 index 0000000..d493389 Binary files /dev/null and b/yj-common/src/main/resources/static/tabbar_me.png differ diff --git a/yj-common/src/main/resources/static/tabbar_me_sel.png b/yj-common/src/main/resources/static/tabbar_me_sel.png new file mode 100644 index 0000000..7c17151 Binary files /dev/null and b/yj-common/src/main/resources/static/tabbar_me_sel.png differ diff --git a/yj-common/src/main/resources/static/tabbar_text.png b/yj-common/src/main/resources/static/tabbar_text.png new file mode 100644 index 0000000..cc326b2 Binary files /dev/null and b/yj-common/src/main/resources/static/tabbar_text.png differ diff --git a/yj-common/src/main/resources/static/tabbar_text_sel.png b/yj-common/src/main/resources/static/tabbar_text_sel.png new file mode 100644 index 0000000..a320995 Binary files /dev/null and b/yj-common/src/main/resources/static/tabbar_text_sel.png differ diff --git a/yj-common/src/main/resources/static/user_about.png b/yj-common/src/main/resources/static/user_about.png new file mode 100644 index 0000000..733d570 Binary files /dev/null and b/yj-common/src/main/resources/static/user_about.png differ diff --git a/yj-common/src/main/resources/static/user_ad01.png b/yj-common/src/main/resources/static/user_ad01.png new file mode 100644 index 0000000..a3cd640 Binary files /dev/null and b/yj-common/src/main/resources/static/user_ad01.png differ diff --git a/yj-common/src/main/resources/static/user_ad02.png b/yj-common/src/main/resources/static/user_ad02.png new file mode 100644 index 0000000..4948056 Binary files /dev/null and b/yj-common/src/main/resources/static/user_ad02.png differ diff --git a/yj-common/src/main/resources/static/user_avatar.jpeg b/yj-common/src/main/resources/static/user_avatar.jpeg new file mode 100644 index 0000000..00f86e2 Binary files /dev/null and b/yj-common/src/main/resources/static/user_avatar.jpeg differ diff --git a/yj-common/src/main/resources/static/user_collect.png b/yj-common/src/main/resources/static/user_collect.png new file mode 100644 index 0000000..c5484f4 Binary files /dev/null and b/yj-common/src/main/resources/static/user_collect.png differ diff --git a/yj-common/src/main/resources/static/user_kefu.png b/yj-common/src/main/resources/static/user_kefu.png new file mode 100644 index 0000000..f8370fc Binary files /dev/null and b/yj-common/src/main/resources/static/user_kefu.png differ diff --git a/yj-common/src/main/resources/static/user_money.png b/yj-common/src/main/resources/static/user_money.png new file mode 100644 index 0000000..5b4da15 Binary files /dev/null and b/yj-common/src/main/resources/static/user_money.png differ diff --git a/yj-common/src/main/resources/static/user_setting.png b/yj-common/src/main/resources/static/user_setting.png new file mode 100644 index 0000000..c4bcf5a Binary files /dev/null and b/yj-common/src/main/resources/static/user_setting.png differ diff --git a/yj-common/src/main/resources/static/wallet.png b/yj-common/src/main/resources/static/wallet.png new file mode 100644 index 0000000..5b4da15 Binary files /dev/null and b/yj-common/src/main/resources/static/wallet.png differ diff --git a/yj-common/src/main/resources/static/web_favicon.ico b/yj-common/src/main/resources/static/web_favicon.ico new file mode 100644 index 0000000..2434b86 Binary files /dev/null and b/yj-common/src/main/resources/static/web_favicon.ico differ diff --git a/yj-common/src/main/resources/static/web_logo.jpg b/yj-common/src/main/resources/static/web_logo.jpg new file mode 100644 index 0000000..f4073c9 Binary files /dev/null and b/yj-common/src/main/resources/static/web_logo.jpg differ diff --git a/yj-common/src/main/resources/static/web_logo.png b/yj-common/src/main/resources/static/web_logo.png new file mode 100644 index 0000000..402e12e Binary files /dev/null and b/yj-common/src/main/resources/static/web_logo.png differ diff --git a/yj-common/src/main/resources/static/wechat_pay.png b/yj-common/src/main/resources/static/wechat_pay.png new file mode 100644 index 0000000..bb48336 Binary files /dev/null and b/yj-common/src/main/resources/static/wechat_pay.png differ diff --git a/yj-front/pom.xml b/yj-front/pom.xml new file mode 100644 index 0000000..f211c29 --- /dev/null +++ b/yj-front/pom.xml @@ -0,0 +1,56 @@ + + + + + + yunjiao-server + org.yj + 1.0.0 + + + + 4.0.0 + yj-front + jar + + + + + + org.yj + yj-common + + + + + cn.dev33 + sa-token-spring-boot-starter + + + + + cn.dev33 + sa-token-dao-redis-jackson + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + \ No newline at end of file diff --git a/yj-front/src/main/java/com/yj/front/LikeFrontApplication.java b/yj-front/src/main/java/com/yj/front/LikeFrontApplication.java new file mode 100644 index 0000000..e4de022 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/LikeFrontApplication.java @@ -0,0 +1,25 @@ +package com.yj.front; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * 启动器 + */ +@Configuration +@ComponentScan(basePackages = {"com.yj"}) +@MapperScan(basePackages = {"com.yj.*.mapper"}) +@EnableTransactionManagement +@SpringBootApplication(exclude = {RedisRepositoriesAutoConfiguration.class}) +public class LikeFrontApplication { + + public static void main(String[] args) { + SpringApplication.run(LikeFrontApplication.class, args); + } + +} diff --git a/yj-front/src/main/java/com/yj/front/LikeFrontInterceptor.java b/yj-front/src/main/java/com/yj/front/LikeFrontInterceptor.java new file mode 100644 index 0000000..9784c28 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/LikeFrontInterceptor.java @@ -0,0 +1,223 @@ +package com.yj.front; + +import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.common.aop.NotLogin; +import com.yj.common.core.AjaxResult; +import com.yj.common.entity.user.User; +import com.yj.common.entity.user.UserSession; +import com.yj.common.enums.ClientEnum; +import com.yj.common.enums.ErrorEnum; +import com.yj.common.exception.LoginException; +import com.yj.common.mapper.user.UserMapper; +import com.yj.common.mapper.user.UserSessionMapper; +import com.yj.common.util.StringUtils; +import com.yj.common.util.YmlUtils; +import com.yj.front.cache.TokenLoginCache; +import org.jetbrains.annotations.NotNull; +import org.springframework.lang.NonNull; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.lang.reflect.Method; + +/** + * 拦截器 + */ +@Component +public class LikeFrontInterceptor implements HandlerInterceptor { + + @Resource + UserMapper userMapper; + @Resource + UserSessionMapper userSessionMapper; + + /** + * 前置处理器 + * + * @param request 请求 + * @param response 响应 + * @param handler 处理 + * @return boolean + * @throws Exception 异常 + */ + @Override + public boolean preHandle(@NonNull HttpServletRequest request, + @NonNull HttpServletResponse response, + @NonNull Object handler) throws Exception { + + // 判断请求接口 + response.setContentType("application/json;charset=utf-8"); + String reqUri = request.getRequestURI(); + if (!(handler instanceof HandlerMethod) || !reqUri.startsWith("/api")) { + return HandlerInterceptor.super.preHandle(request, response, handler); + } + + // 读取请求令牌 + String token = request.getHeader(YmlUtils.get("sa-token.token-name")); + LikeFrontThreadLocal.put("token", token); + // 登录权限校验 + try { + // 记录当前平台 + String terminal = request.getHeader("terminal"); + if (StringUtils.isEmpty(terminal)) { + //userSessionMapper. + if (StringUtils.isEmpty(token)) { + LikeFrontThreadLocal.put("terminal", ClientEnum.PC.getCode()); + } else { + UserSession userSession = userSessionMapper.selectOne(new QueryWrapper().eq("token", token).gt("expire_time", System.currentTimeMillis() / 1000).orderByDesc("id").last("limit 1")); + LikeFrontThreadLocal.put("terminal", StringUtils.isNull(userSession) ? ClientEnum.H5.getCode() : userSession.getTerminal()); + } + } else { + LikeFrontThreadLocal.put("terminal", terminal); + } + + Method method = this.obtainAop(handler); + this.checkLogin(method, token); + + } catch (LoginException e) { + AjaxResult result = AjaxResult.failed(e.getCode(), e.getMsg()); + response.getWriter().print(JSON.toJSONString(result)); + return false; + } + + // 验证通过继续操作 + return HandlerInterceptor.super.preHandle(request, response, handler); + } + + /** + * 后置处理器 + * + * @param request 请求 + * @param response 响应 + * @param handler 处理 + * @param ex 异常 + * @throws Exception 异常 + */ + @Override + public void afterCompletion(@NonNull HttpServletRequest request, + @NonNull HttpServletResponse response, + @NonNull Object handler, Exception ex) throws Exception { + LikeFrontThreadLocal.remove(); + HandlerInterceptor.super.afterCompletion(request, response, handler, ex); + } + + /** + * 提取注解 + * + * @param handler 处理器 + * @return Method + * @throws Exception 异常 + */ + private Method obtainAop(@NotNull Object handler) throws Exception { + String[] objArr = handler.toString().split("#"); + String methodStr = objArr[1].split("\\(")[0]; + String classStr = objArr[0]; + Class clazz = Class.forName(classStr); + + Method[] methods = clazz.getDeclaredMethods(); + for (Method method : methods) { + if (method.getName().equals(methodStr)) { + return method; + } + } + + return null; + } + + /** + * 登录验证 + * + * @param method 方法类 + * @author fzr + */ + private void checkLogin(Method method, String token) { + for (int i=0; i<=0; i++) { + // 免登校验 + if (StringUtils.isNotNull(method) && method.isAnnotationPresent(NotLogin.class)) { + try { + //Object id = StpUtil.getLoginId(); + Integer userId = TokenLoginCache.get(); + //if (StringUtils.isNotNull(id)) { + if (userId > 0) { + User user = userMapper.selectOne(new QueryWrapper() + .select("id,sn,account") + .eq("id", userId) + .eq("is_disable", 0) + .isNull("delete_time") + .last("limit 1")); + + Integer uid = StringUtils.isNull(user) ? 0 : userId; + LikeFrontThreadLocal.put("userId", uid); + } + } catch (Exception ignored) {} + break; + } + + // 令牌校验 +// String token = StpUtil.getTokenValue(); +// if (StringUtils.isNull(token) || StringUtils.isBlank(token)) { +// Integer errCode = ErrorEnum.TOKEN_EMPTY.getCode(); +// String errMsg = ErrorEnum.TOKEN_EMPTY.getMsg(); +// throw new LoginException(errCode, errMsg); +// } +// +// // 登录校验 +// Object id = StpUtil.getLoginId(); +// if (StringUtils.isNull(id)) { +// Integer errCode = ErrorEnum.TOKEN_INVALID.getCode(); +// String errMsg = ErrorEnum.TOKEN_INVALID.getMsg(); +// throw new LoginException(errCode, errMsg); +// } + + // 令牌校验 + if (StringUtils.isNull(token) || StringUtils.isBlank(token)) { + Integer errCode = ErrorEnum.TOKEN_EMPTY.getCode(); + String errMsg = ErrorEnum.TOKEN_EMPTY.getMsg(); + throw new LoginException(errCode, errMsg); + } + + // 登录校验 + Integer userId = TokenLoginCache.get(); + if (userId <= 0) { + Integer errCode = ErrorEnum.TOKEN_INVALID.getCode(); + String errMsg = ErrorEnum.TOKEN_INVALID.getMsg(); + throw new LoginException(errCode, errMsg); + } + + // 用户信息缓存 + //Integer userId = Integer.parseInt(id.toString()); + User user = userMapper.selectOne(new QueryWrapper() + .select("id,sn,account,nickname,mobile,is_disable") + .eq("id", userId) + .isNull("delete_time") + .last("limit 1")); + + // 删除校验 + if (StringUtils.isNull(user)) { + Integer errCode = ErrorEnum.TOKEN_INVALID.getCode(); + String errMsg = ErrorEnum.TOKEN_INVALID.getMsg(); + throw new LoginException(errCode, errMsg); + } + + // 禁用校验 + if (user.getIsDisable().equals(1)) { + Integer errCode = ErrorEnum.LOGIN_DISABLE_ERROR.getCode(); + String errMsg = ErrorEnum.LOGIN_DISABLE_ERROR.getMsg(); + throw new LoginException(errCode, errMsg); + } + + // 写入线程 + LikeFrontThreadLocal.put("userId", user.getId()); + LikeFrontThreadLocal.put("userSn", user.getSn()); + LikeFrontThreadLocal.put("username", user.getAccount()); + LikeFrontThreadLocal.put("nickname", user.getNickname()); + LikeFrontThreadLocal.put("mobile", user.getMobile()); + } + } + +} diff --git a/yj-front/src/main/java/com/yj/front/LikeFrontThreadLocal.java b/yj-front/src/main/java/com/yj/front/LikeFrontThreadLocal.java new file mode 100644 index 0000000..82181d7 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/LikeFrontThreadLocal.java @@ -0,0 +1,89 @@ +package com.yj.front; + +import com.yj.common.util.StringUtils; + +import java.util.Map; +import java.util.concurrent.ConcurrentSkipListMap; + +public class LikeFrontThreadLocal { + + /** + * 构造方法 + */ + public LikeFrontThreadLocal() {} + + /** + * 取得本地线程对象 + */ + private static final java.lang.ThreadLocal> MY_LOCAL = new java.lang.ThreadLocal<>(); + + /** + * 写入本地线程 + */ + public static void put(String key, Object val) { + Map map = MY_LOCAL.get(); + if (map == null) { + synchronized (MY_LOCAL) { + map = new ConcurrentSkipListMap<>(); + } + } + if (StringUtils.isNull(val)) { + return; + } + map.put(key, val); + MY_LOCAL.set(map); + } + + /** + * 获取本地线程 + */ + public static Object get(String key) { + Map map = MY_LOCAL.get(); + if (map == null) { + return null; + } + return map.getOrDefault(key, ""); + } + + /** + * 获取用户ID + */ + public static Integer getUserId() { + Object adminId = LikeFrontThreadLocal.get("userId"); + if (adminId == null || adminId.toString().equals("")) { + return 0; + } + return Integer.parseInt(adminId.toString()); + } + + /** + * 获取平台标识 + */ + public static Integer getTerminal() { + Object adminId = LikeFrontThreadLocal.get("terminal"); + if (adminId == null || adminId.toString().equals("")) { + return 0; + } + return Integer.parseInt(adminId.toString()); + } + + + /** + * 获取登录令牌 + */ + public static String getToken() { + Object token = LikeFrontThreadLocal.get("token"); + if (token == null || token.toString().equals("")) { + return ""; + } + return token.toString(); + } + + /** + * 删除本地线程 + */ + public static void remove() { + MY_LOCAL.remove(); + } + +} diff --git a/yj-front/src/main/java/com/yj/front/cache/ScanLoginCache.java b/yj-front/src/main/java/com/yj/front/cache/ScanLoginCache.java new file mode 100644 index 0000000..d607598 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/cache/ScanLoginCache.java @@ -0,0 +1,27 @@ +package com.yj.front.cache; + +import com.yj.common.util.RedisUtils; +import com.yj.common.util.StringUtils; + +/** + * 微信扫码登录缓存 + */ +public class ScanLoginCache { + + private static final String KEY = "wechat:scan:login:"; + + public static String get(String sessionId) { + Object o = RedisUtils.get(KEY+sessionId); + if (StringUtils.isNull(o)) { + return ""; + } + + RedisUtils.del(KEY+sessionId); + return o.toString(); + } + + public static void set(String sessionId, String state) { + RedisUtils.set(KEY+sessionId, state, 600); + } + +} diff --git a/yj-front/src/main/java/com/yj/front/cache/TokenLoginCache.java b/yj-front/src/main/java/com/yj/front/cache/TokenLoginCache.java new file mode 100644 index 0000000..85233b2 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/cache/TokenLoginCache.java @@ -0,0 +1,59 @@ +package com.yj.front.cache; + +import com.yj.common.util.RedisUtils; +import com.yj.common.util.StringUtils; +import com.yj.common.util.YmlUtils; +import com.yj.front.LikeFrontThreadLocal; + +/** + * 登录令牌缓存 + */ +public class TokenLoginCache { + + private static final String KEY = "login:front:token:"; + + public static Integer get() { + Integer terminal = LikeFrontThreadLocal.getTerminal(); + String token = LikeFrontThreadLocal.getToken(); + String key = KEY + terminal + ":" + token; + Object o = RedisUtils.get(key); + if (StringUtils.isNull(o)) { + return 0; + } + + return Integer.parseInt(o.toString()); + } + + public static void set(String token, Object id) { + int timeout = 7200; + if (StringUtils.isNotNull(YmlUtils.get("like.login.timeout"))) { + timeout = Integer.parseInt(YmlUtils.get("like.login.timeout")); + } + + Integer terminal = LikeFrontThreadLocal.getTerminal(); + String key = KEY + terminal + ":" + token; + RedisUtils.set(key, id, timeout); + } + + public static void set(String token, Object id, String terminal) { + int timeout = 7200; + if (StringUtils.isNotNull(YmlUtils.get("like.login.timeout"))) { + timeout = Integer.parseInt(YmlUtils.get("like.login.timeout")); + } + String key = KEY + terminal + ":" + token; + RedisUtils.set(key, id, timeout); + } + + public static void del() { + Integer terminal = LikeFrontThreadLocal.getTerminal(); + String token = LikeFrontThreadLocal.getToken(); + del(terminal, token); + } + + public static void del(Integer terminal, String token) { + String key = KEY + terminal + ":" + token; + System.out.println(key); + RedisUtils.del(key); + } + +} diff --git a/yj-front/src/main/java/com/yj/front/config/MybatisPlusConfig.java b/yj-front/src/main/java/com/yj/front/config/MybatisPlusConfig.java new file mode 100644 index 0000000..b5eb0d9 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/config/MybatisPlusConfig.java @@ -0,0 +1,21 @@ +package com.yj.front.config; + +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class MybatisPlusConfig { + + /** + * 分页插件集成 + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); + return interceptor; + } + +} diff --git a/yj-front/src/main/java/com/yj/front/config/SwaggerConfig.java b/yj-front/src/main/java/com/yj/front/config/SwaggerConfig.java new file mode 100644 index 0000000..b0e2b4f --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/config/SwaggerConfig.java @@ -0,0 +1,48 @@ +package com.yj.front.config; + +import com.yj.common.config.GlobalConfig; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.oas.annotations.EnableOpenApi; +import springfox.documentation.service.*; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; + +@Configuration +@EnableOpenApi +public class SwaggerConfig { + + @Value("${like.swagger.enabled}") + private boolean enabled; + + @Value("${like.swagger.pathMapping}") + private String pathMapping; + + @Bean + public Docket createRestApi(){ + return new Docket(DocumentationType.OAS_30) + .apiInfo(apiInfo()) + .enable(enabled) + .select() + .apis(RequestHandlerSelectors.basePackage("com.yj.front")) + .build() + .pathMapping(pathMapping); + } + + private ApiInfo apiInfo(){ + String author = "FZR"; + String url = "https://gitee.com/likeadmin/likeadmin_java"; + String email = "tinyants@163.com"; + + return new ApiInfoBuilder() + .title("LikeAdmin【前台】接口文档") + .description("likeadmin是一套使用流行的技术栈的快速开发管理后台") + .version(GlobalConfig.version) + .contact(new Contact(author, url, email)) + .build(); + } + +} diff --git a/yj-front/src/main/java/com/yj/front/config/WebMvcConfig.java b/yj-front/src/main/java/com/yj/front/config/WebMvcConfig.java new file mode 100644 index 0000000..da381b6 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/config/WebMvcConfig.java @@ -0,0 +1,51 @@ +package com.yj.front.config; + +import com.yj.common.config.GlobalConfig; +import com.yj.common.util.YmlUtils; +import com.yj.front.LikeFrontInterceptor; +import org.springframework.context.annotation.Configuration; +import org.springframework.lang.NonNull; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +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 javax.annotation.Resource; + +@Configuration +public class WebMvcConfig implements WebMvcConfigurer { + + @Resource + LikeFrontInterceptor likeFrontInterceptor; + + /** + * 配置允许跨域 + */ + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("*") + .allowedHeaders("*") + .allowedMethods("GET", "POST", "DELETE", "PUT") + .maxAge(3600); + } + + /** + * 登录拦截器 + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(likeFrontInterceptor).addPathPatterns("/**"); + } + + /** + * 资源目录映射 + */ + @Override + public void addResourceHandlers(@NonNull ResourceHandlerRegistry registry) { + String directory = YmlUtils.get("like.upload-directory"); + registry.addResourceHandler("/"+ GlobalConfig.publicPrefix +"/**") + .addResourceLocations("file:" + directory); + } + +} diff --git a/yj-front/src/main/java/com/yj/front/config/stp/StpInException.java b/yj-front/src/main/java/com/yj/front/config/stp/StpInException.java new file mode 100644 index 0000000..9960db3 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/config/stp/StpInException.java @@ -0,0 +1,42 @@ +package com.yj.front.config.stp; + +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.exception.NotPermissionException; +import com.yj.common.core.AjaxResult; +import com.yj.common.enums.ErrorEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +/** + * Sa-Token的异常拦截 + */ +@Slf4j +@ControllerAdvice +public class StpInException { + + /** + * 拦截登录异常 + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(NotLoginException.class) + @ResponseBody + public AjaxResult handleNotLoginException(NotLoginException e){ + String msg = e.getMessage().startsWith("Token无效") ? "尚未登录,请先登录!" : e.getMessage(); + return AjaxResult.failed(ErrorEnum.TOKEN_INVALID.getCode(), msg); + } + + /** + * 拦截权限异常 + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(NotPermissionException.class) + @ResponseBody + public AjaxResult handleNotPermissionException(){ + return AjaxResult.failed(ErrorEnum.NO_PERMISSION.getCode(), ErrorEnum.NO_PERMISSION.getMsg()); + } + +} diff --git a/yj-front/src/main/java/com/yj/front/controller/AccountLogController.java b/yj-front/src/main/java/com/yj/front/controller/AccountLogController.java new file mode 100644 index 0000000..c09eb7e --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/controller/AccountLogController.java @@ -0,0 +1,33 @@ +package com.yj.front.controller; + +import com.yj.common.core.AjaxResult; +import com.yj.common.core.PageResult; +import com.yj.front.LikeFrontThreadLocal; +import com.yj.front.service.IUserAccountLogService; +import com.yj.front.validate.common.PageValidate; +import com.yj.front.validate.users.UserAccountLogSearchValidate; +import com.yj.front.vo.user.UserAccountListVo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/api/account_log") +@Api(tags = "用户资金变更管理") +public class AccountLogController { + + @Resource + IUserAccountLogService iUserAccountLogService; + + @GetMapping("/lists") + @ApiOperation(value="用户资金变更列表") + public AjaxResult> lists(@Validated PageValidate pageValidate, + @Validated UserAccountLogSearchValidate searchValidate) { + searchValidate.setUserId(LikeFrontThreadLocal.getUserId()); + PageResult list = iUserAccountLogService.lists(pageValidate, searchValidate); + return AjaxResult.success(list); + } +} diff --git a/yj-front/src/main/java/com/yj/front/controller/AliPayController.java b/yj-front/src/main/java/com/yj/front/controller/AliPayController.java new file mode 100644 index 0000000..aee082f --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/controller/AliPayController.java @@ -0,0 +1,109 @@ +package com.yj.front.controller; + +import com.alibaba.fastjson2.JSONObject; +import com.alipay.api.internal.util.AlipaySignature; +import com.yj.common.aop.NotLogin; +import com.yj.common.config.AlipayConfig; +import com.yj.common.util.ConfigUtils; +import com.yj.front.service.IRechargeService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + + +/** + * @author panweiliang + */ +@Slf4j +@RestController +@RequestMapping("/api/pay/ali") +public class AliPayController { + @Resource + IRechargeService iRechargeService; + // 支付回调通知处理 + @PostMapping("/notify/order") + @NotLogin + public void notifyUrl(HttpServletRequest request, HttpServletResponse response) throws Exception { + //log.info("异步通知"); + PrintWriter out = response.getWriter(); + try { + //乱码解决,这段代码在出现乱码时使用 + request.setCharacterEncoding("utf-8"); + //获取支付宝POST过来反馈信息 + Map params = new HashMap<>(8); + Map requestParams = request.getParameterMap(); + for (Map.Entry stringEntry : requestParams.entrySet()) { + String[] values = stringEntry.getValue(); + String valueStr = ""; + for (int i = 0; i < values.length; i++) { + valueStr = (i == values.length - 1) ? valueStr + values[i] + : valueStr + values[i] + ","; + } + params.put(stringEntry.getKey(), valueStr); + } + + //调用SDK验证签名 + boolean signVerified = AlipaySignature.rsaCheckV1(params, ConfigUtils.getAliDevPay("ali_public_key"), AlipayConfig.CHARSET, AlipayConfig.SIGN_TYPE); + + if (!signVerified) { + log.error("验签失败"); + out.print("fail"); + return; + } + // 通知ID + String notifyId = new String(params.get("notify_id").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); + // 通知时间 + String notifyTime = new String(params.get("notify_time").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); + //商户订单号,之前生成的带用户ID的订单号 + String outTradeNo = new String(params.get("out_trade_no").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); + //支付宝交易号 + String tradeNo = new String(params.get("trade_no").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); + //付款金额 + String totalAmount = new String(params.get("total_amount").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); + //交易状态 + String tradeStatus = new String(params.get("trade_status").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); + + //自定义参数 + JSONObject passbackParams = JSONObject.parseObject(new String(params.get("passback_params").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8)); + String from = passbackParams.getString("from"); + /* + * 交易状态 + * TRADE_SUCCESS 交易完成 + * TRADE_FINISHED 支付成功 + * WAIT_BUYER_PAY 交易创建 + * TRADE_CLOSED 交易关闭 + */ + //log.info("tradeStatus:" + tradeStatus); + + if ("TRADE_FINISHED".equals(tradeStatus)) { + /*此处可自由发挥*/ + //判断该笔订单是否在商户网站中已经做过处理 + //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 + //如果有做过处理,不执行商户的业务程序 + //注意: + //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知 + } else if ("TRADE_SUCCESS".equals(tradeStatus)) { + if (from.equals("recharge")) { + iRechargeService.updatePayOrderStatusToPaid(outTradeNo, tradeNo); + } + + if (from.equals("member")) { + return; + } + } + } finally { + out.print("fail"); + } + //out.print("success"); + } +} + diff --git a/yj-front/src/main/java/com/yj/front/controller/ArticleController.java b/yj-front/src/main/java/com/yj/front/controller/ArticleController.java new file mode 100644 index 0000000..ce54ab3 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/controller/ArticleController.java @@ -0,0 +1,90 @@ +package com.yj.front.controller; + +import com.yj.common.aop.NotLogin; +import com.yj.common.core.AjaxResult; +import com.yj.common.core.PageResult; +import com.yj.common.validator.annotation.IDMust; +import com.yj.front.LikeFrontThreadLocal; +import com.yj.front.service.IArticleService; +import com.yj.front.validate.article.ArticleCollectValidate; +import com.yj.front.validate.article.ArticleSearchValidate; +import com.yj.front.validate.common.PageValidate; +import com.yj.front.vo.article.ArticleCateVo; +import com.yj.front.vo.article.ArticleCollectVo; +import com.yj.front.vo.article.ArticleDetailVo; +import com.yj.front.vo.article.ArticleListedVo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +@RestController +@RequestMapping("/api/article") +@Api(tags = "文章管理") +public class ArticleController { + + @Resource + IArticleService iArticleService; + + @NotLogin + @GetMapping("/cate") + @ApiOperation(value="文章分类") + public AjaxResult> category() { + List list = iArticleService.category(); + return AjaxResult.success(list); + } + + @NotLogin + @GetMapping("/lists") + @ApiOperation(value="文章列表") + public AjaxResult> lists(@Validated PageValidate pageValidate, + @Validated ArticleSearchValidate searchValidate) { + Integer userId = LikeFrontThreadLocal.getUserId(); + + PageResult list = iArticleService.list(userId, pageValidate, searchValidate); + return AjaxResult.success(list); + } + + @NotLogin + @GetMapping("/detail") + @ApiOperation(value="文章详情") + public AjaxResult detail(@Validated @IDMust() @RequestParam("id") Integer id) { + Integer userId = LikeFrontThreadLocal.getUserId(); + + ArticleDetailVo vo = iArticleService.detail(id, userId); + return AjaxResult.success(vo); + } + + @GetMapping("/collect") + @ApiOperation(value="收藏列表") + public AjaxResult> collect(@Validated PageValidate pageValidate) { + Integer userId = LikeFrontThreadLocal.getUserId(); + + PageResult list = iArticleService.collect(pageValidate, userId); + return AjaxResult.success(list); + } + + @PostMapping("/addCollect") + @ApiOperation(value="收藏加入") + public AjaxResult addCollect(@Validated @RequestBody ArticleCollectValidate collectValidate) { + Integer articleId = collectValidate.getId(); + Integer userId = LikeFrontThreadLocal.getUserId(); + + iArticleService.addCollect(articleId, userId); + return AjaxResult.success(); + } + + @PostMapping("/cancelCollect") + @ApiOperation(value="收藏取消") + public AjaxResult cancelCollect(@Validated @RequestBody ArticleCollectValidate collectValidate) { + Integer articleId = collectValidate.getId(); + Integer userId = LikeFrontThreadLocal.getUserId(); + + iArticleService.cancelCollect(articleId, userId); + return AjaxResult.success(); + } + +} diff --git a/yj-front/src/main/java/com/yj/front/controller/IndexController.java b/yj-front/src/main/java/com/yj/front/controller/IndexController.java new file mode 100644 index 0000000..f5564dd --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/controller/IndexController.java @@ -0,0 +1,67 @@ +package com.yj.front.controller; + +import com.yj.common.aop.NotLogin; +import com.yj.common.core.AjaxResult; +import com.yj.common.mapper.notice.NoticeRecordMapper; +import com.yj.common.validator.annotation.IDMust; +import com.yj.front.service.IIndexService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/api/index") +@Api(tags = "主页管理") +public class IndexController { + + @Resource + NoticeRecordMapper noticeRecordMapper; + + @Resource + IIndexService iIndexService; + + @NotLogin + @GetMapping("/index") + @ApiOperation(value="首页数据") + public AjaxResult> index() { + Map detail = iIndexService.index(); + return AjaxResult.success(detail); + } + + @NotLogin + @GetMapping("/decorate") + @ApiOperation(value="装修数据") + public AjaxResult> decorate(@Validated @IDMust() @RequestParam("id") Integer id) { + Map detail = iIndexService.decorate(id); + return AjaxResult.success(detail); + } + + @NotLogin + @GetMapping("/config") + @ApiOperation(value="公共配置") + public AjaxResult> config() { + Map map = iIndexService.config(); + return AjaxResult.success(map); + } + + @NotLogin + @GetMapping("/policy") + @ApiOperation(value="政策协议") + public AjaxResult> policy(@RequestParam String type) { + Map map = iIndexService.policy(type); + return AjaxResult.success(map); + } + + @NotLogin + @GetMapping("/hotSearch") + @ApiOperation(value="热门搜索") + public AjaxResult> hotSearch() { + List list = iIndexService.hotSearch(); + return AjaxResult.success(list); + } +} diff --git a/yj-front/src/main/java/com/yj/front/controller/LoginController.java b/yj-front/src/main/java/com/yj/front/controller/LoginController.java new file mode 100644 index 0000000..3710544 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/controller/LoginController.java @@ -0,0 +1,155 @@ +package com.yj.front.controller; + +import com.yj.common.aop.NotLogin; +import com.yj.common.core.AjaxResult; +import com.yj.common.enums.ClientEnum; +import com.yj.common.util.StringUtils; +import com.yj.front.LikeFrontThreadLocal; +import com.yj.front.service.ILoginService; +import com.yj.front.service.IUserService; +import com.yj.front.validate.login.*; +import com.yj.front.validate.users.UserBindWechatValidate; +import com.yj.front.vo.login.LoginUrlsVo; +import com.yj.front.vo.login.LoginTokenVo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpSession; +import javax.validation.constraints.NotNull; + +@Slf4j +@RestController +@RequestMapping("/api/login") +@Api(tags = "登录管理") +public class LoginController { + + @Resource + ILoginService iLoginService; + @Resource + IUserService iUserService; + + @NotLogin + @PostMapping("/register") + @ApiOperation(value="注册账号") + public AjaxResult register(@Validated @RequestBody RegisterValidate registerValidate) { + Integer terminal = LikeFrontThreadLocal.getTerminal(); + if (StringUtils.isNull(registerValidate.getTerminal())) { + terminal = LikeFrontThreadLocal.getTerminal(); + } + String account = registerValidate.getAccount(); + String password = registerValidate.getPassword(); + + iLoginService.register(account, password, terminal); + return AjaxResult.success(); + } + + @NotLogin + @PostMapping("/account") + @ApiOperation(value="账号登录") + public AjaxResult account(@Validated @RequestBody LoginPwdValidate loginPwdValidate) { + if (StringUtils.isNull(loginPwdValidate.getTerminal())) { + loginPwdValidate.setTerminal(LikeFrontThreadLocal.getTerminal()); + } + LoginTokenVo vo = iLoginService.accountLogin(loginPwdValidate); + return AjaxResult.success(vo); + } + +// @NotLogin +// @PostMapping("/mobileLogin") +// @ApiOperation(value="手机登录") +// public AjaxResult mobileLogin(@Validated @RequestBody LoginPhoneValidate loginPhoneValidate) { +// Integer terminal = LikeFrontThreadLocal.getTerminal(); +// String mobile = loginPhoneValidate.getMobile(); +// String code = loginPhoneValidate.getCode(); +// +// LoginTokenVo vo = iLoginService.mobileLogin(mobile, code, terminal); +// return AjaxResult.success(vo); +// } + + @NotLogin + @PostMapping("/mnpLogin") + @ApiOperation(value="微信登录") + public AjaxResult mnpLogin(@Validated @RequestBody LoginCodeValidate loginCodeValidate) { + Integer terminal = ClientEnum.MNP.getCode(); + + String code = loginCodeValidate.getCode(); + + LoginTokenVo vo = iLoginService.mnpLogin(code, terminal); + return AjaxResult.success(vo); + } + + @NotLogin + @PostMapping("/oaLogin") + @ApiOperation(value="公众号登录") + public AjaxResult oaLogin(@Validated @RequestBody LoginCodeValidate loginCodeValidate) { + Integer terminal = ClientEnum.OA.getCode(); + String code = loginCodeValidate.getCode(); +// if (StringUtils.isNull(loginCodeValidate.getTerminal())) { +// terminal = LikeFrontThreadLocal.getTerminal(); +// } + LoginTokenVo vo = iLoginService.officeLogin(code, terminal); + return AjaxResult.success(vo); + } + @NotLogin + @GetMapping("/codeUrl") + @ApiOperation(value="公众号链接") + public AjaxResult codeUrl(@Validated @NotNull() @RequestParam("url") String url) { + LoginUrlsVo vo = new LoginUrlsVo(); + vo.setUrl(iLoginService.oaCodeUrl(url)); + return AjaxResult.success(vo); + } + + + @NotLogin + @GetMapping("/getScanCode") + @ApiOperation(value="PC扫码链接") + public AjaxResult scanCodeUrl(@Validated @NotNull() @RequestParam("url") String url, HttpSession session) { + String qrcodeUrl = iLoginService.scanCodeUrl(url, session); + LoginUrlsVo vo = new LoginUrlsVo(); + vo.setUrl(qrcodeUrl); + return AjaxResult.success(vo); + } + + @NotLogin + @PostMapping("/scanLogin") + @ApiOperation(value="PC扫码登录") + public AjaxResult scanLogin(@Validated @RequestBody LoginScanValidate loginScanValidate, HttpSession session) { + Integer terminal = LikeFrontThreadLocal.getTerminal(); + String code = loginScanValidate.getCode(); + String state = loginScanValidate.getState(); + + LoginTokenVo vo = iLoginService.scanLogin(code, state, terminal, session); + return AjaxResult.success(vo); + } + + @NotLogin + @PostMapping("/logout") + @ApiOperation(value="退出登录") + public AjaxResult logout() { + iLoginService.logout(); + return AjaxResult.success(); + } + + @NotLogin + @PostMapping("/oaAuthBind") + @ApiOperation(value="绑定微信公众号") + public AjaxResult oaAuthBind(@Validated @RequestBody UserBindWechatValidate BindOaValidate) { + Integer userId = LikeFrontThreadLocal.getUserId(); + iUserService.bindOa(BindOaValidate, userId); + return AjaxResult.success(); + } + + + @PostMapping("/mnpAuthBind") + @ApiOperation(value="绑定小程序") + public AjaxResult mnpAuthBind(@Validated @RequestBody UserBindWechatValidate BindOaValidate) { + Integer userId = LikeFrontThreadLocal.getUserId(); + iUserService.bindMnp(BindOaValidate, userId); + return AjaxResult.success(); + } + +} diff --git a/yj-front/src/main/java/com/yj/front/controller/LogsController.java b/yj-front/src/main/java/com/yj/front/controller/LogsController.java new file mode 100644 index 0000000..d4c3ded --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/controller/LogsController.java @@ -0,0 +1,38 @@ +package com.yj.front.controller; + +import com.yj.common.core.AjaxResult; +import com.yj.common.core.PageResult; +import com.yj.front.LikeFrontThreadLocal; +import com.yj.front.service.ILogsService; +import com.yj.front.validate.common.PageValidate; +import com.yj.front.vo.RechargeRecordVo; +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.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/api/logs") +@Api(tags = "日志管理") +public class LogsController { + + @Resource + ILogsService iLogsService; + + @GetMapping("/userMoney") + @ApiOperation("用户金额变动日志") + public AjaxResult userMoney(@Validated PageValidate pageValidate, + @RequestParam(defaultValue = "0") Integer type) { + + Integer userId = LikeFrontThreadLocal.getUserId(); + + PageResult list = iLogsService.userMoney(pageValidate, userId, type); + return AjaxResult.success(list); + } + +} diff --git a/yj-front/src/main/java/com/yj/front/controller/PayController.java b/yj-front/src/main/java/com/yj/front/controller/PayController.java new file mode 100644 index 0000000..0481a57 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/controller/PayController.java @@ -0,0 +1,131 @@ +package com.yj.front.controller; + +import com.github.binarywang.wxpay.bean.notify.SignatureHeader; +import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyV3Result; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import com.yj.common.aop.NotLogin; +import com.yj.common.core.AjaxResult; +import com.yj.common.entity.RechargeOrder; +import com.yj.common.enums.ClientEnum; +import com.yj.common.enums.PaymentEnum; +import com.yj.common.exception.OperateException; +import com.yj.common.mapper.RechargeOrderMapper; +import com.yj.common.plugin.wechat.WxPayDriver; +import com.yj.common.util.StringUtils; +import com.yj.front.LikeFrontThreadLocal; +import com.yj.front.service.IPayService; +import com.yj.front.validate.PaymentValidate; +import com.yj.front.vo.pay.PayStatusVo; +import com.yj.front.vo.pay.PayWayListVo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.util.Assert; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.validation.constraints.NotNull; + +@RestController +@RequestMapping("/api/pay") +@Api(tags = "支付管理") +public class PayController { + + @Resource + RechargeOrderMapper rechargeOrderMapper; + + @Resource + IPayService iPayService; + + @GetMapping("/payWay") + @ApiOperation("支付方式") + public AjaxResult payWay(@Validated @NotNull(message = "from参数丢失") @RequestParam String from, + @Validated @NotNull(message = "orderId参数丢失") @RequestParam Integer order_id) { + Integer terminal = LikeFrontThreadLocal.getTerminal(); + + PayWayListVo list = iPayService.payWay(from, order_id, terminal); + return AjaxResult.success(list); + } + + @GetMapping("/payStatus") + @ApiOperation(("支付状态")) + public AjaxResult payStatus(@Validated @NotNull(message = "from参数丢失") @RequestParam String from, + @Validated @NotNull(message = "orderId参数丢失") @RequestParam Integer order_id) { + PayStatusVo vo = iPayService.payStatus(from, order_id); + return AjaxResult.success(vo); + } + + @PostMapping("/prepay") + @ApiOperation("发起支付") + public AjaxResult prepay(@Validated @RequestBody PaymentValidate requestObj) { + // 接收参数 + if (StringUtils.isNull(requestObj.getScene())) { + requestObj.setScene("recharge"); + } + String scene = requestObj.getScene(); + Integer payWay = requestObj.getPayWay(); + Integer orderId = requestObj.getOrderId(); + Integer terminal = LikeFrontThreadLocal.getTerminal(); + String code = requestObj.getCode(); + requestObj.setTerminal(terminal); + + // 订单处理 + int payStatus = 0; + switch (scene) { + case "recharge": + RechargeOrder rechargeOrder = rechargeOrderMapper.selectById(orderId); + + Assert.notNull(rechargeOrder, "订单不存在"); + Assert.isTrue(!payWay.equals(PaymentEnum.WALLET_PAY.getCode()), "支付类型不被支持"); + + requestObj.setUserId(rechargeOrder.getUserId()); + requestObj.setOutTradeNo(rechargeOrder.getSn()); + requestObj.setOrderAmount(rechargeOrder.getOrderAmount()); + requestObj.setDescription("余额充值"); + requestObj.setAttach("recharge"); + payStatus = rechargeOrder.getPayStatus(); + + rechargeOrder.setPayWay(payWay); + rechargeOrderMapper.updateById(rechargeOrder); + break; + case "order": + break; + } + + // 订单校验 + if (payStatus != 0) { + throw new OperateException("订单已支付"); + } + // 发起支付 + Object result = iPayService.prepay(requestObj, terminal, code); + return AjaxResult.success(result); + } + + @NotLogin + @PostMapping("/notifyMnp") + @ApiOperation("微信支付回调") + public AjaxResult notifyMnp(@RequestBody String jsonData, HttpServletRequest request) throws WxPayException { + // 构建签名 + SignatureHeader signatureHeader = new SignatureHeader(); + signatureHeader.setSignature(request.getHeader("wechatpay-signature")); + signatureHeader.setNonce(request.getHeader("wechatpay-nonce")); + signatureHeader.setSerial(request.getHeader("wechatpay-serial")); + signatureHeader.setTimeStamp(request.getHeader("wechatpay-timestamp")); + + // 解密数据 + WxPayService wxPayService = WxPayDriver.handler(ClientEnum.MNP.getCode()); + WxPayOrderNotifyV3Result.DecryptNotifyResult notifyResult = wxPayService.parseOrderNotifyV3Result(jsonData, signatureHeader).getResult(); + + // 取出数据 + String transactionId = notifyResult.getTransactionId(); + String outTradeNo = notifyResult.getOutTradeNo(); + String attach = notifyResult.getAttach(); + + // 处理回调 + iPayService.handlePaidNotify(attach, outTradeNo, transactionId); + return AjaxResult.success(); + } + +} diff --git a/yj-front/src/main/java/com/yj/front/controller/PcController.java b/yj-front/src/main/java/com/yj/front/controller/PcController.java new file mode 100644 index 0000000..a032e67 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/controller/PcController.java @@ -0,0 +1,64 @@ +package com.yj.front.controller; + +import com.yj.common.aop.NotLogin; +import com.yj.common.core.AjaxResult; +import com.yj.common.validator.annotation.IDMust; +import com.yj.front.LikeFrontThreadLocal; +import com.yj.front.service.IPcService; +import com.yj.front.vo.article.PcArticleCenterVo; +import com.yj.front.vo.article.PcArticleDetailVo; +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.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/api/pc") +@Api(tags = "电脑管理") +public class PcController { + + @Resource + IPcService iPcService; + + @NotLogin + @GetMapping("/index") + @ApiOperation(value="主页数据") + public AjaxResult> index() { + Map index = iPcService.index(); + return AjaxResult.success(index); + } + + @NotLogin + @GetMapping("/config") + @ApiOperation(value="公共配置") + public AjaxResult> getConfig() { + Map config = iPcService.getConfig(); + return AjaxResult.success(config); + } + + @NotLogin + @GetMapping("/infoCenter") + @ApiOperation(value="资讯中心") + public AjaxResult> infoCenter() { + List list = iPcService.infoCenter(); + return AjaxResult.success(list); + } + + @NotLogin + @GetMapping("/articleDetail") + @ApiOperation(value="文章详情") + public AjaxResult articleDetail(@Validated @IDMust() @RequestParam("id") Integer id) { + Integer userId = LikeFrontThreadLocal.getUserId(); + + PcArticleDetailVo vo = iPcService.articleDetail(id, userId); + return AjaxResult.success(vo); + } + +} diff --git a/yj-front/src/main/java/com/yj/front/controller/RechargeController.java b/yj-front/src/main/java/com/yj/front/controller/RechargeController.java new file mode 100644 index 0000000..ad907df --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/controller/RechargeController.java @@ -0,0 +1,55 @@ +package com.yj.front.controller; + +import com.yj.common.core.AjaxResult; +import com.yj.common.core.PageResult; +import com.yj.front.LikeFrontThreadLocal; +import com.yj.front.service.IRechargeService; +import com.yj.front.validate.RechargeValidate; +import com.yj.front.validate.common.PageValidate; +import com.yj.front.vo.RechargeConfigVo; +import com.yj.front.vo.RechargeRecordVo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.Map; + +@RestController +@RequestMapping("/api/recharge") +@Api(tags = "充值管理") +public class RechargeController { + + @Resource + IRechargeService iRechargeService; + + @GetMapping("/config") + @ApiOperation(value = "充值配置") + public AjaxResult config() { + Integer userId = LikeFrontThreadLocal.getUserId(); + + RechargeConfigVo vo = iRechargeService.config(userId); + return AjaxResult.success(vo); + } + + @GetMapping("/lists") + @ApiOperation(value = "充值记录") + public AjaxResult lists(@Validated PageValidate pageValidate) { + Integer userId = LikeFrontThreadLocal.getUserId(); + + PageResult list = iRechargeService.record(userId, pageValidate); + return AjaxResult.success(list); + } + + @PostMapping("/recharge") + @ApiOperation(value = "充值下单") + public AjaxResult recharge(@Validated @RequestBody RechargeValidate rechargeValidate) { + Integer userId = LikeFrontThreadLocal.getUserId(); + Integer terminal = LikeFrontThreadLocal.getTerminal(); + + Map result = iRechargeService.placeOrder(userId, terminal, rechargeValidate); + return AjaxResult.success(result); + } + +} diff --git a/yj-front/src/main/java/com/yj/front/controller/SearchController.java b/yj-front/src/main/java/com/yj/front/controller/SearchController.java new file mode 100644 index 0000000..24e9c47 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/controller/SearchController.java @@ -0,0 +1,32 @@ +package com.yj.front.controller; + +import com.alibaba.fastjson.JSONObject; +import com.yj.common.aop.NotLogin; +import com.yj.common.core.AjaxResult; +import com.yj.front.service.ISearchService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/api/search") +@Api(tags = "搜索") +public class SearchController { + + + @Resource + ISearchService iSearchService; + + @NotLogin + @GetMapping("/hotLists") + @ApiOperation(value="搜索列表") + public AjaxResult hotLists() { + JSONObject result = iSearchService.hotLists(); + return AjaxResult.success(result); + } + +} diff --git a/yj-front/src/main/java/com/yj/front/controller/SmsController.java b/yj-front/src/main/java/com/yj/front/controller/SmsController.java new file mode 100644 index 0000000..33c1bdb --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/controller/SmsController.java @@ -0,0 +1,67 @@ +package com.yj.front.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.common.aop.NotLogin; +import com.yj.common.core.AjaxResult; +import com.yj.common.entity.smsLog.SmsLog; +import com.yj.common.enums.NoticeEnum; +import com.yj.common.enums.SmsEnum; +import com.yj.common.enums.YesNoEnum; +import com.yj.common.exception.OperateException; +import com.yj.common.mapper.smsLog.SmsLogMapper; +import com.yj.common.plugin.notice.NoticeDriver; +import com.yj.common.plugin.notice.vo.NoticeSmsVo; +import com.yj.common.util.StringUtils; +import com.yj.common.util.ToolUtils; +import com.yj.front.validate.common.SmsValidate; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/api/sms") +@Api(tags = "主页管理") +public class SmsController { + + @Resource + SmsLogMapper smsLogMapper; + + @NotLogin + @PostMapping("/sendCode") + @ApiOperation(value="发送短信") + public AjaxResult sendSms(@Validated @RequestBody SmsValidate smsValidate) { + QueryWrapper smsLogQueryWrapper = new QueryWrapper(); + smsLogQueryWrapper.eq("mobile", smsValidate.getMobile()); + smsLogQueryWrapper.eq("send_status", SmsEnum.SEND_SUCCESS.getCode()); + smsLogQueryWrapper.in("scene_id", NoticeEnum.getSmsScene()); + smsLogQueryWrapper.eq("is_verify", YesNoEnum.NO.getCode()); + if (StringUtils.isNotNull(smsValidate.getScene())) { + smsLogQueryWrapper.eq("scene_id", NoticeEnum.getSceneByTag(smsValidate.getScene())); + } + smsLogQueryWrapper.orderByDesc("send_time"); + smsLogQueryWrapper.last("limit 1"); + SmsLog smsLog = smsLogMapper.selectOne(smsLogQueryWrapper); + if (StringUtils.isNotNull(smsLog)) { + if (smsLog.getSendTime() + 5 * 60 > System.currentTimeMillis() / 1000 ) { + throw new OperateException("已有短信记录,请勿重复发送"); + } + } + + String code = ToolUtils.randomInt(4); + NoticeSmsVo params = new NoticeSmsVo() + .setScene(NoticeEnum.getSceneByTag(smsValidate.getScene())) + .setMobile(smsValidate.getMobile()) + .setExpire(900) + .setParams(new String[] { + "code:" + code + }) + .setCode(code); + + NoticeDriver.handle(params); + return AjaxResult.success(); + } + +} diff --git a/yj-front/src/main/java/com/yj/front/controller/UploadController.java b/yj-front/src/main/java/com/yj/front/controller/UploadController.java new file mode 100644 index 0000000..a4d0aec --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/controller/UploadController.java @@ -0,0 +1,78 @@ +package com.yj.front.controller; + +import com.yj.common.aop.NotLogin; +import com.yj.common.core.AjaxResult; +import com.yj.common.enums.AlbumEnum; +import com.yj.common.enums.FileEnum; +import com.yj.common.exception.OperateException; +import com.yj.common.plugin.storage.StorageDriver; +import com.yj.common.plugin.storage.UploadFilesVo; +import com.yj.common.util.StringUtils; +import com.yj.front.LikeFrontThreadLocal; +import com.yj.front.service.IFileService; +import com.yj.front.vo.upload.UploadImagesVo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartRequest; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("/api/upload") +@Api(tags = "上传管理") +public class UploadController { + + @Resource + IFileService iFileService; + + @NotLogin + @PostMapping("/image") + @ApiOperation(value="上传图片") + public AjaxResult image(HttpServletRequest request) { + MultipartFile multipartFile; + try { + multipartFile = ((MultipartRequest) request).getFile("file"); + } catch (Exception e) { + throw new OperateException("请正确选择上传图片!"); + } + + if (multipartFile == null) { + throw new OperateException("请选择上传图片!"); + } + + String folder = "image"; + if (StringUtils.isNotEmpty(request.getParameter("dir"))) { + folder += "/" + request.getParameter("dir"); + } + + StorageDriver storageDriver = new StorageDriver(); + UploadFilesVo vo = storageDriver.upload(multipartFile, folder, AlbumEnum.IMAGE.getCode()); + System.out.println(vo); + + Map params = new HashMap<>(); + params.put("cid", "0"); + params.put("uid", String.valueOf(LikeFrontThreadLocal.getUserId())); + params.put("source", String.valueOf(FileEnum.SOURCE_USER.getCode())); + params.put("type", String.valueOf(FileEnum.IMAGE_TYPE.getCode())); + params.put("name", vo.getName()); + params.put("url", vo.getUrl()); + Integer id = iFileService.fileAdd(params); + + UploadImagesVo upVo = new UploadImagesVo(); + upVo.setUrl(vo.getUrl()); + upVo.setUri(vo.getPath()); + upVo.setId(id); + upVo.setType(FileEnum.IMAGE_TYPE.getCode()); + upVo.setName(vo.getName()); + upVo.setCid(0); + return AjaxResult.success(upVo); + } + +} diff --git a/yj-front/src/main/java/com/yj/front/controller/UserController.java b/yj-front/src/main/java/com/yj/front/controller/UserController.java new file mode 100644 index 0000000..b7238c0 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/controller/UserController.java @@ -0,0 +1,130 @@ +package com.yj.front.controller; + +import com.yj.common.aop.NotLogin; +import com.yj.common.core.AjaxResult; +import com.yj.common.exception.OperateException; +import com.yj.front.LikeFrontThreadLocal; +import com.yj.front.service.IUserService; +import com.yj.front.validate.users.*; +import com.yj.front.vo.user.UserCenterVo; +import com.yj.front.vo.user.UserInfoVo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("api/user") +@Api(tags = "用户管理") +public class UserController { + + @Resource + IUserService iUserService; + + @GetMapping("/center") + @ApiOperation(value="个人中心") + public AjaxResult center() { + Integer userId = LikeFrontThreadLocal.getUserId(); + Integer terminal = LikeFrontThreadLocal.getTerminal(); + + UserCenterVo vo = iUserService.center(userId, terminal); + return AjaxResult.success(vo); + } + + @GetMapping("/info") + @ApiOperation(value="个人信息") + public AjaxResult info() { + Integer userId = LikeFrontThreadLocal.getUserId(); + + UserInfoVo vo = iUserService.info(userId); + return AjaxResult.success(vo); + } + + @PostMapping("/setInfo") + @ApiOperation(value="编辑信息") + public AjaxResult setInfo(@Validated @RequestBody UserUpdateValidate updateValidate) { + Integer userId = LikeFrontThreadLocal.getUserId(); + + iUserService.setInfo(updateValidate, userId); + return AjaxResult.success(); + } + + @PostMapping("/changePassword") + @ApiOperation(value="修改密码") + public AjaxResult changePassword(@Validated @RequestBody UserChangePwdValidate passwordValidate) { + Integer userId = LikeFrontThreadLocal.getUserId(); + + if (passwordValidate.getPassword().equals(passwordValidate.getPasswordConfirm()) == false) { + throw new OperateException("两次输入的密码不一致"); + } + iUserService.changePwd(passwordValidate.getPassword(), passwordValidate.getOldPassword(), userId); + return AjaxResult.success(); + } + + @NotLogin + @PostMapping("/resetPassword") + @ApiOperation(value="重置密码") + public AjaxResult resetPassword(@Validated @RequestBody ResetPasswordValidate passwordValidate) { + iUserService.resetPassword(passwordValidate); + return AjaxResult.success(); + } + + + + @NotLogin + @PostMapping("/forgotPwd") + @ApiOperation(value="忘记密码") + public AjaxResult forgotPwd(@Validated @RequestBody UserForgetPwdValidate userForgetPwdValidate) { + String password = userForgetPwdValidate.getPassword(); + String mobile = userForgetPwdValidate.getMobile(); + String code = userForgetPwdValidate.getCode(); + + iUserService.forgotPwd(password, mobile, code); + return AjaxResult.success(); + } + + @PostMapping("/bindMobile") + @ApiOperation(value="绑定手机") + public AjaxResult bindMobile(@Validated @RequestBody UserPhoneBindValidate mobileValidate) { + Integer userId = LikeFrontThreadLocal.getUserId(); + + iUserService.bindMobile(mobileValidate, userId); + return AjaxResult.success(); + } + + @PostMapping("/getMobileByMnp") + @ApiOperation(value="微信手机号") + public AjaxResult mnpMobile(@Validated @RequestBody UserPhoneMnpValidate mobileValidate) { + iUserService.mnpMobile(mobileValidate.getCode().trim()); + return AjaxResult.success(); + } + + @PostMapping("/updateUser") + @ApiOperation(value="更新新用户信息") + public AjaxResult updateData(@Validated @RequestBody NewUserUpdateValidate newUserUpdateValidate) { + Integer userId = LikeFrontThreadLocal.getUserId(); + iUserService.updateNewUserInfo(newUserUpdateValidate, userId); + return AjaxResult.success(); + } + + @PostMapping("/bindMnp") + @ApiOperation(value="绑定小程序") + public AjaxResult bindMnp(@Validated @RequestBody UserBindWechatValidate BindMnpValidate) { + Integer userId = LikeFrontThreadLocal.getUserId(); + + iUserService.bindMnp(BindMnpValidate, userId); + return AjaxResult.success(); + } + + @PostMapping("/bindOa") + @ApiOperation(value="绑定微信公众号") + public AjaxResult bindOa(@Validated @RequestBody UserBindWechatValidate BindOaValidate) { + Integer userId = LikeFrontThreadLocal.getUserId(); + + iUserService.bindOa(BindOaValidate, userId); + return AjaxResult.success(); + } + +} diff --git a/yj-front/src/main/java/com/yj/front/controller/WechatController.java b/yj-front/src/main/java/com/yj/front/controller/WechatController.java new file mode 100644 index 0000000..94ad226 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/controller/WechatController.java @@ -0,0 +1,34 @@ +package com.yj.front.controller; + +import com.yj.common.aop.NotLogin; +import com.yj.common.core.AjaxResult; +import com.yj.front.service.IWechatService; +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.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.validation.constraints.NotEmpty; +import java.util.Map; + +@RestController +@RequestMapping("api/wechat") +@Api(tags = "微信管理") +public class WechatController { + + @Resource + IWechatService iWechatService; + + @NotLogin + @GetMapping("/jsConfig") + @ApiOperation("微信jsConfig") + public AjaxResult jsConfig(@Validated @NotEmpty() @RequestParam("url") String url) throws Exception { + Map map = iWechatService.jsConfig(url); + return AjaxResult.success(map); + } + +} diff --git a/yj-front/src/main/java/com/yj/front/service/IArticleService.java b/yj-front/src/main/java/com/yj/front/service/IArticleService.java new file mode 100644 index 0000000..f587ed4 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/IArticleService.java @@ -0,0 +1,75 @@ +package com.yj.front.service; + +import com.yj.common.core.PageResult; +import com.yj.front.validate.article.ArticleSearchValidate; +import com.yj.front.validate.common.PageValidate; +import com.yj.front.vo.article.ArticleCateVo; +import com.yj.front.vo.article.ArticleCollectVo; +import com.yj.front.vo.article.ArticleDetailVo; +import com.yj.front.vo.article.ArticleListedVo; + +import java.util.List; + +/** + * 文章服务接口类 + */ +public interface IArticleService { + + /** + * 文章分类 + * + * @author fzr + * @return List + */ + List category(); + + /** + * 文章分类 + * + * @author fzr + * @param userId 用户ID + * @param pageValidate 分页参数 + * @param searchValidate 搜索参数 + * @return PageResult + */ + PageResult list(Integer userId, PageValidate pageValidate, ArticleSearchValidate searchValidate); + + /** + * 文章详情 + * + * @author fzr + * @param id 文章主键 + * @param userId 用户ID + * @return ArticleDetailVo + */ + ArticleDetailVo detail(Integer id, Integer userId); + + /** + * 文章收藏 + * + * @author fzr + * @param pageValidate 分页参数 + * @param userId 用户ID + * @return PageResult + */ + PageResult collect(PageValidate pageValidate, Integer userId); + + /** + * 加入收藏 + * + * @author fzr + * @param articleId 文章ID + * @param userId 用户ID + */ + void addCollect(Integer articleId, Integer userId); + + /** + * 取消收藏 + * + * @author fzr + * @param articleId 主键 + * @param userId 用户ID + */ + void cancelCollect(Integer articleId, Integer userId); + +} diff --git a/yj-front/src/main/java/com/yj/front/service/IDecorateTabbarService.java b/yj-front/src/main/java/com/yj/front/service/IDecorateTabbarService.java new file mode 100644 index 0000000..c8193a7 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/IDecorateTabbarService.java @@ -0,0 +1,19 @@ +package com.yj.front.service; + +import com.yj.front.vo.decorateTabbar.DecorateTabbarVo; + +import java.util.List; + +/** + * 底部导航服务接口类 + */ +public interface IDecorateTabbarService { + + /** + * @notes 获取底部导航列表 + * @return array + * @author damonyuan + */ + List getTabbarLists(); + +} diff --git a/yj-front/src/main/java/com/yj/front/service/IFileService.java b/yj-front/src/main/java/com/yj/front/service/IFileService.java new file mode 100644 index 0000000..206e208 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/IFileService.java @@ -0,0 +1,16 @@ +package com.yj.front.service; + +import java.util.Map; + +/** + * 文件服务接口类 + */ +public interface IFileService { + /** + * 文件新增 + * + * @author fzr + * @param params 文件信息参数 + */ + Integer fileAdd(Map params); +} diff --git a/yj-front/src/main/java/com/yj/front/service/IIndexService.java b/yj-front/src/main/java/com/yj/front/service/IIndexService.java new file mode 100644 index 0000000..9b6b4b9 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/IIndexService.java @@ -0,0 +1,53 @@ +package com.yj.front.service; + +import java.util.List; +import java.util.Map; + +/** + * 首页服务接口类 + */ +public interface IIndexService { + + /** + * 首页 + * + * @author fzr + * @return Map + */ + Map index(); + + /** + * 装修 + * + * @author fzr + * @param id 装修ID + * @return Map + */ + Map decorate(Integer id); + + /** + * 配置 + * + * @author fzr + * @return Map + */ + Map config(); + + /** + * 政策 + * + * @author fzr + * @param type 类型 service=服务协议,privacy=隐私协议 + * @return Map + */ + Map policy(String type); + + /** + * 热搜 + * + * @author fzr + * @return List + */ + List hotSearch(); + +} diff --git a/yj-front/src/main/java/com/yj/front/service/ILoginService.java b/yj-front/src/main/java/com/yj/front/service/ILoginService.java new file mode 100644 index 0000000..7659de4 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/ILoginService.java @@ -0,0 +1,101 @@ +package com.yj.front.service; + +import com.yj.front.validate.login.LoginPwdValidate; +import com.yj.front.vo.login.LoginTokenVo; + +import javax.servlet.http.HttpSession; + +/** + * 登录服务接口类 + */ +public interface ILoginService { + + /** + * 账号注册 + * + * @author fzr + * @param username 账号 + * @param password 密码 + * @param terminal 终端 + */ + void register(String account, String password, Integer terminal); + + /** + * 账号登录 + * + * @author fzr + * @param account 账号 + * @param password 密码 + * @param terminal 终端 + * @return LoginTokenVo + */ + LoginTokenVo accountLogin(LoginPwdValidate loginPwdValidate); + + /** + * 手机登录 + * + * @author fzr + * @param mobile 手机号 + * @param code 验证码 + * @param terminal 终端 + * @return LoginTokenVo + */ + LoginTokenVo mobileLogin(String mobile, String code, Integer terminal, Integer sceneId); + + /** + * 微信登录 + * + * @author fzr + * @param code 微信code + * @param terminal 终端 + * @return LoginTokenVo + */ + LoginTokenVo mnpLogin(String code, Integer terminal); + + /** + * 公众号登录 + * + * @author fzr + * @param code 微信Code + * @param terminal 终端 + * @return LoginTokenVo + */ + LoginTokenVo officeLogin(String code, Integer terminal); + + /** + * 公众号跳转url + * + * @author fzr + * @param url 连接 + * @return String + */ + String oaCodeUrl(String url); + + /** + * 扫码链接 + * + * @author fzr + * @param session session + * @return String + */ + String scanCodeUrl(String url, HttpSession session); + + /** + * 扫码登录 + * + * @param code 编码 + * @param state 标识 + * @param terminal 终端 + * @param session 会话 + * @return LoginTokenVo + */ + LoginTokenVo scanLogin(String code, String state, Integer terminal, HttpSession session); + + /** + * @notes 退出登录 + * @param $userInfo + * @return bool + * @author damonyuan + */ + void logout(); +} diff --git a/yj-front/src/main/java/com/yj/front/service/ILogsService.java b/yj-front/src/main/java/com/yj/front/service/ILogsService.java new file mode 100644 index 0000000..ed08be6 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/ILogsService.java @@ -0,0 +1,14 @@ +package com.yj.front.service; + +import com.yj.common.core.PageResult; +import com.yj.front.validate.common.PageValidate; +import com.yj.front.vo.RechargeRecordVo; + +/** + * 日志接口服务类 + */ +public interface ILogsService { + + PageResult userMoney(PageValidate pageValidate, Integer userId, Integer type); + +} diff --git a/yj-front/src/main/java/com/yj/front/service/IPayService.java b/yj-front/src/main/java/com/yj/front/service/IPayService.java new file mode 100644 index 0000000..f1fab29 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/IPayService.java @@ -0,0 +1,57 @@ +package com.yj.front.service; + +import com.alibaba.fastjson2.JSONObject; +import com.alipay.api.AlipayApiException; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.yj.front.validate.PaymentValidate; +import com.yj.front.vo.pay.PayStatusVo; +import com.yj.front.vo.pay.PayWayListVo; + + +/** + * 支付接口服务类 + */ +public interface IPayService { + + /** + * 支付方式 + * + * @author fzr + * @param from 场景 + * @param orderId 订单ID + * @param terminal 终端 + * @return List + */ + PayWayListVo payWay(String from, Integer orderId, Integer terminal); + + /** + * 支付状态 + * + * @author fzr + * @param from 场景 + * @param orderId 订单ID + * @return PayStatusVo + */ + PayStatusVo payStatus(String from, Integer orderId); + + /** + * 发起支付 + * + * @param params 参数 + * @param terminal 终端 + * @return Object + */ + Object prepay(PaymentValidate params, Integer terminal, String code); + + /** + * 支付回调处理 + * + * @param attach 场景码 + * @param outTradeNo 订单编号 + * @param transactionId 流水号 + */ + void handlePaidNotify(String attach, String outTradeNo, String transactionId) throws WxPayException; + + JSONObject createAliH5Order(PaymentValidate params) throws AlipayApiException; + +} diff --git a/yj-front/src/main/java/com/yj/front/service/IPcService.java b/yj-front/src/main/java/com/yj/front/service/IPcService.java new file mode 100644 index 0000000..94785da --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/IPcService.java @@ -0,0 +1,43 @@ +package com.yj.front.service; + +import com.yj.front.vo.article.PcArticleCenterVo; +import com.yj.front.vo.article.PcArticleDetailVo; + +import java.util.List; +import java.util.Map; + +public interface IPcService { + + /** + * 配置 + * @author cjh + * @return Map + */ + Map index(); + + /** + * 配置 + * @author cjh + * @return Map + */ + Map getConfig(); + + /** + * 资讯中心 + * + * @author fzr + * @return PcArticleCenterVo + */ + List infoCenter(); + + /** + * 文章详情 + * + * @author fzr + * @param id 文章ID + * @param userId 用户ID + * @return PcArticleDetailVo + */ + PcArticleDetailVo articleDetail(Integer id, Integer userId); + +} diff --git a/yj-front/src/main/java/com/yj/front/service/IRechargeService.java b/yj-front/src/main/java/com/yj/front/service/IRechargeService.java new file mode 100644 index 0000000..aa66a88 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/IRechargeService.java @@ -0,0 +1,54 @@ +package com.yj.front.service; + +import com.yj.common.core.PageResult; +import com.yj.front.validate.RechargeValidate; +import com.yj.front.validate.common.PageValidate; +import com.yj.front.vo.RechargeConfigVo; +import com.yj.front.vo.RechargeRecordVo; + +import java.util.Map; + +/** + * 充值余额接口服务类 + */ +public interface IRechargeService { + + /** + * 充值配置 + * + * @author fzr + * @param userId 用户ID + * @return RechargeConfigVo + */ + RechargeConfigVo config(Integer userId); + + /** + * 充值记录 + * + * @author fzr + * @param userId 用户ID + * @param pageValidate 分页参数 + * @return PageResult + */ + PageResult record(Integer userId, PageValidate pageValidate); + + /** + * 充值下单 + * + * @param userId 用户ID + * @param terminal 总端 + * @param rechargeValidate 充值参数 + * @return Map + */ + Map placeOrder(Integer userId, Integer terminal, RechargeValidate rechargeValidate); + + /** + * @notes 阿里支付后更新状态 + * @return array + * @throws @\think\db\exception\DataNotFoundException + * @throws @\think\db\exception\DbException + * @throws @\think\db\exception\ModelNotFoundException + * @author damonyuan + */ + void updatePayOrderStatusToPaid(String outTradeNo, String tradeNo); +} diff --git a/yj-front/src/main/java/com/yj/front/service/ISearchService.java b/yj-front/src/main/java/com/yj/front/service/ISearchService.java new file mode 100644 index 0000000..e4fb7e9 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/ISearchService.java @@ -0,0 +1,17 @@ +package com.yj.front.service; + +import com.alibaba.fastjson.JSONObject; + +/** + * 搜索接口类 + */ +public interface ISearchService { + + /** + * 热搜 + * + * @author fzr + */ + JSONObject hotLists(); + +} diff --git a/yj-front/src/main/java/com/yj/front/service/IUserAccountLogService.java b/yj-front/src/main/java/com/yj/front/service/IUserAccountLogService.java new file mode 100644 index 0000000..edfe80d --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/IUserAccountLogService.java @@ -0,0 +1,19 @@ +package com.yj.front.service; + +import com.yj.common.core.PageResult; +import com.yj.front.validate.common.PageValidate; +import com.yj.front.validate.users.*; +import com.yj.front.vo.user.UserAccountListVo; + +/** + * 用户服务接口类 + */ +public interface IUserAccountLogService { + + /** + * @notes 获取列表 + * @return array + * @author damonyuan + */ + PageResult lists(PageValidate pageValidate, UserAccountLogSearchValidate searchValidate); +} diff --git a/yj-front/src/main/java/com/yj/front/service/IUserService.java b/yj-front/src/main/java/com/yj/front/service/IUserService.java new file mode 100644 index 0000000..876dd70 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/IUserService.java @@ -0,0 +1,108 @@ +package com.yj.front.service; + +import com.yj.front.validate.users.*; +import com.yj.front.vo.user.UserCenterVo; +import com.yj.front.vo.user.UserInfoVo; + +/** + * 用户服务接口类 + */ +public interface IUserService { + + /** + * 个人中心 + * + * @author fzr + * @param userId 用户ID + * @param terminal 用户终端 + * @return UserCenterVo + */ + UserCenterVo center(Integer userId, Integer terminal); + + /** + * 个人信息 + * + * @author fzr + * @param userId 用户ID + * @return UserInfoVo + */ + UserInfoVo info(Integer userId); + + /** + * 编辑信息 + * + * @author fzr + * @param updateValidate 参数 + * @param userId 用户ID + */ + void setInfo(UserUpdateValidate updateValidate, Integer userId); + + /** + * 修改密码 + * + * @author fzr + * @param password 新密码 + * @param oldPassword 旧密码 + * @param userId 用户ID + */ + void changePwd(String password, String oldPassword, Integer userId); + + /** + * 忘记密码 + * + * @author fzr + * @param password 新密码 + * @param mobile 手机号 + * @param code 验证码 + */ + void forgotPwd(String password, String mobile, String code); + + /** + * 绑定手机 + * + * @author fzr + * @param mobileValidate 参数 + * @param userId 用户ID + */ + void bindMobile(UserPhoneBindValidate mobileValidate, Integer userId); + + /** + * 微信手机 + * + * @author fzr + * @param code 获取手机号的Code + */ + void mnpMobile(String code); + + /** + * 更新新用户信息 + * + * @param newUserUpdateValidate 参数 + * @param userId 用户id + */ + void updateNewUserInfo(NewUserUpdateValidate newUserUpdateValidate, Integer userId); + + /** + * 绑定微信小程序 + * + * @param bindMnpValidate 参数 + * @param userId 用户ID + */ + void bindMnp(UserBindWechatValidate bindMnpValidate, Integer userId); + + /** + * 绑定微信公众号 + * + * @param bindOaValidate 参数 + * @param userId 用户ID + */ + void bindOa(UserBindWechatValidate bindOaValidate, Integer userId); + + /** + * @notes 重置登录密码 + * @param $params + * @return bool + * @author damonyuan + */ + void resetPassword(ResetPasswordValidate passwordValidate); +} diff --git a/yj-front/src/main/java/com/yj/front/service/IWechatService.java b/yj-front/src/main/java/com/yj/front/service/IWechatService.java new file mode 100644 index 0000000..88a3cef --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/IWechatService.java @@ -0,0 +1,9 @@ +package com.yj.front.service; + +import java.util.Map; + +public interface IWechatService { + + Map jsConfig(String url) throws Exception; + +} diff --git a/yj-front/src/main/java/com/yj/front/service/impl/ArticleServiceImpl.java b/yj-front/src/main/java/com/yj/front/service/impl/ArticleServiceImpl.java new file mode 100644 index 0000000..55a81b5 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/impl/ArticleServiceImpl.java @@ -0,0 +1,282 @@ +package com.yj.front.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.query.MPJQueryWrapper; +import com.yj.common.config.GlobalConfig; +import com.yj.common.core.PageResult; +import com.yj.common.entity.article.Article; +import com.yj.common.entity.article.ArticleCate; +import com.yj.common.entity.article.ArticleCollect; +import com.yj.common.enums.YesNoEnum; +import com.yj.common.mapper.article.ArticleCateMapper; +import com.yj.common.mapper.article.ArticleCollectMapper; +import com.yj.common.mapper.article.ArticleMapper; +import com.yj.common.util.StringUtils; +import com.yj.common.util.TimeUtils; +import com.yj.common.util.UrlUtils; +import com.yj.front.service.IArticleService; +import com.yj.front.validate.article.ArticleSearchValidate; +import com.yj.front.validate.common.PageValidate; +import com.yj.front.vo.article.ArticleCateVo; +import com.yj.front.vo.article.ArticleCollectVo; +import com.yj.front.vo.article.ArticleDetailVo; +import com.yj.front.vo.article.ArticleListedVo; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +/** + * 文章服务实现类 + */ +@Service +public class ArticleServiceImpl implements IArticleService { + + @Resource + ArticleMapper articleMapper; + + @Resource + ArticleCateMapper articleCategoryMapper; + + @Resource + ArticleCollectMapper articleCollectMapper; + + /** + * 文章分类 + * + * @author fzr + * @return List + */ + @Override + public List category() { + List articleCateVos = articleCategoryMapper.selectList( + new QueryWrapper() + .select("id,name") + .eq("is_show", 1) + .isNull("delete_time") + .orderByDesc(Arrays.asList("sort", "id"))); + + List list = new LinkedList<>(); + for (ArticleCate category: articleCateVos) { + ArticleCateVo vo = new ArticleCateVo(); + BeanUtils.copyProperties(category, vo); + list.add(vo); + } + + return list; + } + + /** + * 文章列表 + * + * @author fzr + * @param userId 用户ID + * @param pageValidate 分页参数 + * @param searchValidate 搜索参数 + * @return PageResult + */ + @Override + public PageResult list( Integer userId, PageValidate pageValidate, ArticleSearchValidate searchValidate) { + Integer pageNo = pageValidate.getPage_no(); + Integer pageSize = pageValidate.getPage_size(); + + QueryWrapper
queryWrapper = new QueryWrapper<>(); + queryWrapper.select("id,cid,title,`desc`,image,click_virtual,click_actual,create_time"); + queryWrapper.isNull("delete_time"); + queryWrapper.eq("is_show", 1); + + articleMapper.setSearch(queryWrapper, searchValidate, new String[]{ + "like:keyword@title:str" + }); + + if (StringUtils.isNotNull(searchValidate.getCid()) && searchValidate.getCid() > 0) { + queryWrapper.eq("cid", searchValidate.getCid()); + } + + if (StringUtils.isNotNull(searchValidate.getSort())) { + switch (searchValidate.getSort()) { + case "hot": // 最热 + //queryWrapper.orderByDesc(Arrays.asList("click_actual + click_virtual", "id")); + queryWrapper.orderByDesc("click_actual + click_virtual").orderByDesc("id"); + break; + case "new": // 最新 + queryWrapper.orderByDesc("id"); + break; + default: // 默认 + queryWrapper.orderByDesc(Arrays.asList("sort", "id")); + } + } + + IPage
iPage = articleMapper.selectPage(new Page<>(pageNo, pageSize), queryWrapper); + + List ids = new LinkedList<>(); + List list = new LinkedList<>(); + for (Article article : iPage.getRecords()) { + ArticleListedVo vo = new ArticleListedVo(); + BeanUtils.copyProperties(article, vo); + vo.setCollect(false); + vo.setImage(UrlUtils.toAbsoluteUrl(article.getImage())); + vo.setCreateTime(TimeUtils.timestampToDate(article.getCreateTime())); + vo.setClick(article.getClickActual() + article.getClickVirtual()); + list.add(vo); + + ids.add(article.getId()); + } + + if (userId != null && userId > 0 && ids.size() > 0) { + List articleCollects = articleCollectMapper.selectList( + new QueryWrapper() + .eq("user_id", userId) + .isNull("delete_time") + .eq("status", YesNoEnum.YES.getCode()) + .in("article_id", ids)); + + List collects = new LinkedList<>(); + for (ArticleCollect c : articleCollects) { + collects.add(c.getArticleId()); + } + + for (ArticleListedVo vo : list) { + vo.setCollect(collects.contains(vo.getId())); + } + } + + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list); + } + + /** + * 文章详情 + * + * @author fzr + * @param id 文章主键 + * @param userId 用户ID + * @return ArticleDetailVo + */ + @Override + public ArticleDetailVo detail(Integer id, Integer userId) { + Article article = articleMapper.selectOne(new QueryWrapper
() + .eq("id", id) + .eq("is_show", 1) + .isNull("delete_time" ) + .last("limit 1")); + + Assert.notNull(article, "数据不存在!"); + + ArticleCollect articleCollect = articleCollectMapper.selectOne(new QueryWrapper() + .eq("user_id", userId) + .eq("article_id", article.getId()) + .isNull("delete_time") + .eq("status", YesNoEnum.YES.getCode()) + .last("limit 1")); + + ArticleDetailVo vo = new ArticleDetailVo(); + BeanUtils.copyProperties(article, vo); + vo.setCollect(articleCollect != null); + vo.setImage(UrlUtils.toAbsoluteUrl(article.getImage())); + vo.setCreateTime(TimeUtils.timestampToDate(article.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(article.getUpdateTime())); + vo.setClick(article.getClickActual() + article.getClickVirtual()); + + article.setClickActual(article.getClickActual() + 1); + articleMapper.updateById(article); + + return vo; + } + + /** + * 收藏列表 + * + * @author fzr + * @param pageValidate 分页参数 + * @param userId 用户ID + * @return PageResult + */ + @Override + public PageResult collect(PageValidate pageValidate, Integer userId) { + Integer pageNo = pageValidate.getPage_no(); + Integer pageSize = pageValidate.getPage_size(); + + MPJQueryWrapper
mpjQueryWrapper = new MPJQueryWrapper<>(); + mpjQueryWrapper.setAlias("a").select("c.id,c.article_id,a.title,a.image,a.desc,a.is_show,a.click_virtual, a.click_actual,a.create_time, c.create_time as collect_time") + .eq("c.user_id", userId) + .isNull("c.delete_time") + .isNull("a.delete_time") + .eq("c.status", YesNoEnum.YES.getCode()) + .eq("a.is_show", YesNoEnum.YES.getCode()) + .orderByDesc("c.id") + .innerJoin("?_article_collect c ON c.article_id=a.id".replace("?_", GlobalConfig.tablePrefix)); + + IPage iPage = articleMapper.selectJoinPage( + new Page<>(pageNo, pageSize), + ArticleCollectVo.class, + mpjQueryWrapper); + + for (ArticleCollectVo vo : iPage.getRecords()) { + vo.setImage(UrlUtils.toAbsoluteUrl(vo.getImage())); + vo.setCreateTime(TimeUtils.timestampToDate(Long.valueOf(vo.getCreateTime().toString()))); + vo.setCollectTime(TimeUtils.timestampToDate(Long.valueOf(vo.getCollectTime().toString()))); + } + return PageResult.iPageHandle(iPage); + } + + /** + * 加入收藏 + * + * @author fzr + * @param articleId 主键 + * @param userId 用户ID + */ + @Override + public void addCollect(Integer articleId, Integer userId) { + ArticleCollect articleCollect = articleCollectMapper.selectOne( + new QueryWrapper() + .eq("article_id", articleId) + .eq("user_id", userId) + .isNull("delete_time") + .last("limit 1")); + + if (StringUtils.isNotNull(articleCollect)) { + articleCollect.setUpdateTime(System.currentTimeMillis() / 1000); + articleCollect.setStatus(YesNoEnum.YES.getCode()); + articleCollectMapper.updateById(articleCollect); + } else { + ArticleCollect model = new ArticleCollect(); + model.setArticleId(articleId); + model.setUserId(userId); + model.setStatus(YesNoEnum.YES.getCode()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setUpdateTime(System.currentTimeMillis() / 1000); + articleCollectMapper.insert(model); + } + } + + /** + * 取消收藏 + * + * @author fzr + * @param articleId 文章ID + * @param userId 用户ID + */ + @Override + public void cancelCollect(Integer articleId, Integer userId) { + ArticleCollect articleCollect = articleCollectMapper.selectOne( + new QueryWrapper() + .eq("article_id", articleId) + .eq("user_id", userId) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(articleCollect, "收藏不存在!"); + + articleCollect.setStatus(YesNoEnum.NO.getCode()); + articleCollect.setUpdateTime(System.currentTimeMillis() / 1000); + articleCollectMapper.updateById(articleCollect); + } + +} diff --git a/yj-front/src/main/java/com/yj/front/service/impl/DecorateTabbarServiceImpl.java b/yj-front/src/main/java/com/yj/front/service/impl/DecorateTabbarServiceImpl.java new file mode 100644 index 0000000..c640af1 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/impl/DecorateTabbarServiceImpl.java @@ -0,0 +1,54 @@ +package com.yj.front.service.impl; + +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.common.entity.decorate.DecorateTabbar; +import com.yj.common.enums.YesNoEnum; +import com.yj.common.mapper.decorate.DecorateTabbarMapper; +import com.yj.common.util.*; +import com.yj.front.service.IDecorateTabbarService; +import com.yj.front.vo.decorateTabbar.DecorateTabbarVo; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * 底部导航服务实现类 + */ +@Service +public class DecorateTabbarServiceImpl implements IDecorateTabbarService { + + @Resource + DecorateTabbarMapper decorateTabbarMapper; + + + @Override + public List getTabbarLists() { + List list = decorateTabbarMapper.selectList(new QueryWrapper().eq("is_show", YesNoEnum.YES.getCode())); + List ret = new ArrayList(); + if (list.size() == 0) { + return ret; + } + + for (DecorateTabbar item : list) { + DecorateTabbarVo vo = new DecorateTabbarVo(); + BeanUtils.copyProperties(item, vo); + if (StringUtils.isNotEmpty(item.getSelected())) { + vo.setSelected(UrlUtils.toAbsoluteUrl(item.getSelected())); + } + + if (StringUtils.isNotEmpty(item.getUnselected())) { + vo.setUnselected(UrlUtils.toAbsoluteUrl(item.getUnselected())); + } + + vo.setCreateTime(TimeUtils.timestampToDate(item.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(item.getUpdateTime())); + vo.setLink(StringUtils.isEmpty(item.getLink()) ? new JSONObject() : JSONObject.parse(item.getLink())); + ret.add(vo); + } + return ret; + } +} diff --git a/yj-front/src/main/java/com/yj/front/service/impl/FileServiceImpl.java b/yj-front/src/main/java/com/yj/front/service/impl/FileServiceImpl.java new file mode 100644 index 0000000..a138157 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/impl/FileServiceImpl.java @@ -0,0 +1,50 @@ +package com.yj.front.service.impl; + +import com.yj.common.entity.file.File; +import com.yj.common.mapper.album.FileCateMapper; +import com.yj.common.mapper.album.FileMapper; +import com.yj.front.service.IFileService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Map; + +/** + * 文件服务实现类 + */ +@Service +public class FileServiceImpl implements IFileService { + + @Resource + FileMapper fileMapper; + + @Resource + FileCateMapper fileCateMapper; + + /** + * 文件新增 + * + * @author fzr + * @param params 文件信息参数 + */ + @Override + public Integer fileAdd(Map params) { + String name = params.get("name"); + if (name.length() >= 100) { + name = name.substring(0, 99); + } + + File album = new File(); + album.setCid(Integer.parseInt(params.get("cid") == null ? "0" : params.get("cid"))); + album.setSourceId(Integer.parseInt(params.get("uid") == null ? "0" : params.get("uid"))); + album.setType(Integer.parseInt(params.get("type"))); + album.setSource(Integer.parseInt(params.get("source") == null ? "0" : params.get("source"))); + album.setName(name); + album.setUri(params.get("url")); + album.setCreateTime(System.currentTimeMillis() / 1000); + album.setUpdateTime(System.currentTimeMillis() / 1000); + fileMapper.insert(album); + return album.getId(); + } + +} diff --git a/yj-front/src/main/java/com/yj/front/service/impl/IndexServiceImpl.java b/yj-front/src/main/java/com/yj/front/service/impl/IndexServiceImpl.java new file mode 100644 index 0000000..4ed55cb --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/impl/IndexServiceImpl.java @@ -0,0 +1,270 @@ +package com.yj.front.service.impl; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.yj.common.config.GlobalConfig; +import com.yj.common.entity.article.Article; +import com.yj.common.entity.decorate.DecoratePage; +import com.yj.common.entity.setting.HotSearch; +import com.yj.common.mapper.article.ArticleMapper; +import com.yj.common.mapper.decorate.DecoratePageMapper; +import com.yj.common.mapper.decorate.DecorateTabbarMapper; +import com.yj.common.mapper.setting.HotSearchMapper; +import com.yj.common.util.*; +import com.yj.front.service.IDecorateTabbarService; +import com.yj.front.service.IIndexService; +import com.yj.front.vo.decorateTabbar.DecorateTabbarVo; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; + +/** + * 首页服务实现类 + */ +@Service +public class IndexServiceImpl implements IIndexService { + + @Resource + IDecorateTabbarService iDecorateTabbarService; + @Resource + DecoratePageMapper decoratePageMapper; + + @Resource + DecorateTabbarMapper decorateTabbarMapper; + + @Resource + HotSearchMapper hotSearchMapper; + + @Resource + ArticleMapper articleMapper; + + /** + * 首页 + * + * @author fzr + * @return Map + */ + @Override + public Map index() { + Map response = new LinkedHashMap<>(); + DecoratePage decoratePage = decoratePageMapper.selectOne( + new QueryWrapper() + .eq("id", 1) + .last("limit 1")); + + List> articleList = new LinkedList<>(); + List
articles = articleMapper.selectList(new QueryWrapper
() + .eq("is_show", 1) + .isNull("delete_time") + .orderByDesc("id") + .last("limit 20")); + + for (Article article : articles) { + Map map = new LinkedHashMap<>(); + map.put("id", article.getId()); + map.put("title", article.getTitle()); + map.put("desc", article.getDesc()); + map.put("abstract", article.getAbstractField()); + map.put("image", UrlUtils.toAbsoluteUrl(article.getImage())); + map.put("author", article.getAuthor()); + map.put("click", article.getClickActual() + article.getClickVirtual()); + map.put("create_time", TimeUtils.timestampToDate(article.getCreateTime())); + articleList.add(map); + } + + String data = decoratePage.getData(); + JSONArray dataArray = JSONArray.parseArray(data); + for (int i = 0; i < dataArray.size() ; i++) { + JSONObject dataJson = dataArray.getJSONObject(i); + JSONArray tempArray = dataJson.getJSONObject("content").getJSONArray("data"); + if (StringUtils.isNull(tempArray)) { + JSONObject tempJSON = dataJson.getJSONObject("content"); + if (StringUtils.isNull(tempJSON)) { + continue; + } else { + if (StringUtils.isNotNull(tempJSON.getString("image"))) { + tempJSON.put("image", UrlUtils.toAbsoluteUrl(tempJSON.getString("image"))); + } + if (StringUtils.isNotNull(tempJSON.getString("bg"))) { + tempJSON.put("bg", UrlUtils.toAbsoluteUrl(tempJSON.getString("bg"))); + } + if (StringUtils.isNotNull(tempJSON.getString("qrcode"))) { + tempJSON.put("qrcode", UrlUtils.toAbsoluteUrl(tempJSON.getString("qrcode"))); + } + } + } else { + for (int j = 0; j < tempArray.size(); j++) { + JSONObject tempImageJson = tempArray.getJSONObject(j); + tempImageJson.put("image", UrlUtils.toAbsoluteUrl(tempImageJson.getString("image"))); + tempImageJson.put("bg", UrlUtils.toAbsoluteUrl(tempImageJson.getString("bg"))); + } + } + } + decoratePage.setData(dataArray.toJSONString()); + + response.put("domain", UrlUtils.domain()); + response.put("page", decoratePage); + response.put("article", articleList); + return response; + } + + /** + * 装修 + * + * @author fzr + * @param id 主键 + * @return Map + */ + @Override + public Map decorate(Integer id) { + DecoratePage decoratePage = decoratePageMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(decoratePage, "数据不存在!"); + + String data = decoratePage.getData(); + if (StringUtils.isJsonArrayString(data)) { + JSONArray dataArray = JSONArray.parseArray(data); + for (int i = 0; i < dataArray.size(); i++) { + JSONObject dataJson = dataArray.getJSONObject(i); + JSONArray tempArray = dataJson.getJSONObject("content").getJSONArray("data"); + if (StringUtils.isNull(tempArray)) { + JSONObject tempJSON = dataJson.getJSONObject("content"); + if (StringUtils.isNull(tempJSON)) { + continue; + } else { + if (StringUtils.isNotNull(tempJSON.getString("image"))) { + tempJSON.put("image", UrlUtils.toAbsoluteUrl(tempJSON.getString("image"))); + } + if (StringUtils.isNotNull(tempJSON.getString("bg"))) { + tempJSON.put("bg", UrlUtils.toAbsoluteUrl(tempJSON.getString("bg"))); + } + if (StringUtils.isNotNull(tempJSON.getString("qrcode"))) { + tempJSON.put("qrcode", UrlUtils.toAbsoluteUrl(tempJSON.getString("qrcode"))); + } + } + } else { + for (int j = 0; j < tempArray.size(); j++) { + JSONObject tempImageJson = tempArray.getJSONObject(j); + tempImageJson.put("image", UrlUtils.toAbsoluteUrl(tempImageJson.getString("image"))); + tempImageJson.put("bg", UrlUtils.toAbsoluteUrl(tempImageJson.getString("bg"))); + } + } + } + decoratePage.setData(dataArray.toJSONString()); + } + + Map response = new LinkedHashMap<>(); + response.put("type", decoratePage.getType()); + response.put("name", decoratePage.getName()); + response.put("data", decoratePage.getData()); + response.put("meta", decoratePage.getMeta()); + return response; + } + + /** + * 配置 + * + * @author fzr + * @return Map + */ + @Override + public Map config() { + Map response = new LinkedHashMap<>(); + + // 底部导航 + List tabbar = iDecorateTabbarService.getTabbarLists(); + + // 导航颜色 + JSONObject style = JSONObject.parse(ConfigUtils.get("tabbar", "style")); + + // 登录配置 + JSONObject loginMap = new JSONObject(); + Map loginConfig = ConfigUtils.get("login"); + // 登录方式 + loginMap.put("login_way", JSONArray.parseArray(loginConfig.getOrDefault("login_way", "[]"))); + // 注册强制绑定手机 + loginMap.put("coerce_mobile", Integer.parseInt(loginConfig.getOrDefault("coerce_mobile", "0"))); + // 政策协议 + loginMap.put("login_agreement", Integer.parseInt(loginConfig.getOrDefault("login_agreement", "0"))); + // 第三方登录 开关 + loginMap.put("third_auth", Integer.parseInt(loginConfig.getOrDefault("third_auth", "0"))); + // 微信授权登录 + loginMap.put("wechat_auth", Integer.parseInt(loginConfig.getOrDefault("wechat_auth", "0"))); + // qq授权登录 + loginMap.put("qq_auth", Integer.parseInt(loginConfig.getOrDefault("qq_auth", "0"))); + + // 网站信息 + JSONObject website = new JSONObject(); + website.put("h5_favicon", UrlUtils.toAbsoluteUrl(ConfigUtils.get("website", "h5_favicon", ""))); + website.put("shop_name", ConfigUtils.get("website", "shop_name", "")); + website.put("shop_logo", UrlUtils.toAbsoluteUrl(ConfigUtils.get("website", "shop_logo", ""))); + + // 备案信息 + Map websiteConfig = ConfigUtils.get("copyright"); + String copyright = websiteConfig.getOrDefault("config", "[]"); + List> copyrightMap = ListUtils.stringToListAsMapStr(copyright); + + // H5配置 + JSONObject webPage = new JSONObject(); + webPage.put("status", Integer.valueOf(ConfigUtils.get("web_page", "status", "1"))); + webPage.put("page_status", Integer.valueOf(ConfigUtils.get("web_page", "page_status", "0"))); + webPage.put("page_url", ConfigUtils.get("web_page", "page_url", "")); + webPage.put("url", UrlUtils.domain() + "/mobile"); + + response.put("domain", UrlUtils.domain()); + response.put("style", style); + response.put("tabbar", tabbar); + response.put("login", loginMap); + response.put("website", website); + response.put("webPage", webPage); + response.put("version", GlobalConfig.version); + response.put("copyright", copyrightMap); + return response; + } + + /** + * 政策 + * + * @author fzr + * @param type 类型 service=服务协议,privacy=隐私协议 + * @return Map + */ + @Override + public Map policy(String type) { + Map map = new HashMap<>(); + map.put("title", ConfigUtils.get("agreement", type + "_title", "")); + map.put("content", ConfigUtils.get("agreement", type + "_content", "")); + return map; + } + + /** + * 热搜 + * + * @author fzr + * @return List + */ + @Override + public List hotSearch() { + String isHotSearch = ConfigUtils.get("search", "isHotSearch", "0"); + + List list = new LinkedList<>(); + if (Integer.parseInt(isHotSearch) == 1) { + List hotSearches = hotSearchMapper.selectList( + new QueryWrapper() + .orderByDesc(Arrays.asList("sort", "id"))); + + for (HotSearch hotSearch : hotSearches) { + list.add(hotSearch.getName()); + } + } + + return list; + } + +} diff --git a/yj-front/src/main/java/com/yj/front/service/impl/LoginServiceImpl.java b/yj-front/src/main/java/com/yj/front/service/impl/LoginServiceImpl.java new file mode 100644 index 0000000..34b961f --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/impl/LoginServiceImpl.java @@ -0,0 +1,508 @@ +package com.yj.front.service.impl; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; +import com.alibaba.fastjson2.JSONArray; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.yj.common.entity.user.User; +import com.yj.common.entity.user.UserAuth; +import com.yj.common.entity.user.UserSession; +import com.yj.common.enums.LoginEnum; +import com.yj.common.enums.NoticeEnum; +import com.yj.common.exception.OperateException; +import com.yj.common.mapper.user.UserAuthMapper; +import com.yj.common.mapper.user.UserMapper; +import com.yj.common.mapper.user.UserSessionMapper; +import com.yj.common.plugin.notice.NoticeCheck; +import com.yj.common.plugin.wechat.WxMnpDriver; +import com.yj.common.util.*; +import com.yj.front.cache.ScanLoginCache; +import com.yj.front.cache.TokenLoginCache; +import com.yj.front.service.ILoginService; +import com.yj.front.validate.login.LoginPwdValidate; +import com.yj.front.vo.login.LoginTokenVo; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.impl.WxMpOAuth2ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.Map; + +/** + * 登录服务实现类 + */ +@Slf4j +@Service +public class LoginServiceImpl implements ILoginService { + + @Resource + UserMapper userMapper; + + @Resource + UserAuthMapper userAuthMapper; + @Resource + UserSessionMapper userSessionMapper; + + /** + * 注册账号 + * + * @author fzr + * @param account 账号 + * @param password 密码 + * @param terminal 总端 + */ + @Override + public void register(String account, String password, Integer terminal) { + User model = userMapper.selectOne(new QueryWrapper() + .select("id,sn,account") + .eq("account", account) + .isNull("delete_time") + .last("limit 1")); + + Assert.isNull(model, "账号已存在,换一个吧!"); + + Integer sn = this.__generateSn(); +// String salt = ToolUtils.randomString(5); + String pwd = ToolUtils.makePassword(password); + + User user = new User(); + user.setSn(sn); + user.setNickname("用户"+sn); + user.setAccount(account); + user.setPassword(pwd); + + String defaultAvatar = ConfigUtils.get("default_image", "user_avatar", "/api/static/default_avatar.png"); + + user.setAvatar(defaultAvatar); + user.setChannel(terminal); + user.setIsNewUser(1); + user.setCreateTime(System.currentTimeMillis() / 1000); + user.setUpdateTime(System.currentTimeMillis() / 1000); + userMapper.insert(user); + } + + /** + * 账号登录 + * + * @author fzr + * @return LoginTokenVo + */ + @Override + @Transactional + public LoginTokenVo accountLogin(LoginPwdValidate loginPwdValidate) { + JSONArray config = JSONArray.parseArray(ConfigUtils.get("login", "login_way", "[]")); + if (config.contains(loginPwdValidate.getScene().toString()) == false) { + throw new OperateException("不支持的登录方式"); + } + + String account = loginPwdValidate.getAccount(); + String password = loginPwdValidate.getPassword(); + Integer terminal = loginPwdValidate.getTerminal(); + String code = loginPwdValidate.getCode(); + Integer sceneId = loginPwdValidate.getScene(); + // 账号密码登录 + if (loginPwdValidate.getScene().equals(LoginEnum.ACCOUNT_PASSWORD.getCode())) { + User user = userMapper.selectOne(new QueryWrapper() + .nested(wq->wq + .eq("account", account).or() + .eq("mobile", account).or() + ) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(user, "账号不存在!"); + String pwd = ToolUtils.makePassword(password); + Assert.isFalse(!pwd.equals(user.getPassword()), "账号或密码错误!"); + Assert.isFalse(!user.getIsDisable().equals(0), "账号已被禁用!"); + + return this.__loginToken(user.getId(), user.getMobile(), user.getIsNewUser(), terminal); + } else { + return mobileLogin(account, code, terminal, sceneId); + } + } + + /** + * 手机号登录 + * + * @author fzr + * @param mobile 手机号 + * @param code 验证码 + * @return LoginTokenVo + */ + @Override + public LoginTokenVo mobileLogin(String mobile, String code, Integer terminal, Integer sceneId) { + // 校验验证码 + int sceneCode = NoticeEnum.LOGIN_CAPTCHA.getCode(); + if (!NoticeCheck.verify(sceneCode, code, mobile)) { + throw new OperateException("验证码错误!"); + } + + // 查询手机号 + User user = userMapper.selectOne(new QueryWrapper() + .select("id,account,mobile,is_disable,is_new_user") + .eq("mobile", mobile) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(user, "账号不存在!"); + Assert.isFalse(user.getIsDisable() != 0, "账号已禁用!"); + + return this.__loginToken(user.getId(), user.getMobile(), user.getIsNewUser(), terminal); + } + + /** + * 微信小程序登录 + * + * @author fzr + * @param code 编码 + * @param terminal 终端 + * @return LoginTokenVo + */ + @Override + @Transactional + public LoginTokenVo mnpLogin(String code, Integer terminal) { + try { + WxMaService wxMaService = WxMnpDriver.mnp(); + WxMaJscode2SessionResult sessionResult = wxMaService.getUserService().getSessionInfo(code); + String openId = sessionResult.getOpenid(); + String uniId = sessionResult.getUnionid(); + String unionId = uniId == null ? "0" : uniId; + + return this.__wxLoginHandle(openId, unionId, "", "", terminal); + } catch (WxErrorException e) { + throw new OperateException(e.getError().getErrorCode() + ", " + e.getError().getErrorMsg()); + } + } + + /** + * 公众号登录 + * + * @author fzr + * @param code 编码 + * @param terminal 终端 + * @return LoginTokenVo + */ + @Override + public LoginTokenVo officeLogin(String code, Integer terminal) { + try { + WxMpService wxMpService = WxMnpDriver.oa(); + WxOAuth2AccessToken wxOAuth2AccessToken = wxMpService.getOAuth2Service().getAccessToken(code); + String uniId = wxOAuth2AccessToken.getUnionId(); + String openId = wxOAuth2AccessToken.getOpenId(); + String unionId = uniId == null ? "0" : uniId; + + String avatar = ""; + String nickname = ""; + try { + String accessToken = wxOAuth2AccessToken.getAccessToken(); + String userInfoUri = "https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s"; + String userInfoUrl = String.format(userInfoUri, accessToken, openId); + String resultInfo = HttpUtils.sendGet(userInfoUrl); + Map resultMap = MapUtils.jsonToMap(resultInfo); + avatar = resultMap.get("headimgurl"); + nickname = resultMap.get("nickname"); + } catch (Exception ignored) {} + + return this.__wxLoginHandle(openId, unionId, avatar, nickname, terminal); + } catch (WxErrorException e) { + throw new OperateException(e.getError().getErrorCode() + ", " + e.getError().getErrorMsg()); + } + } + + /** + * 公众号跳转url + * + * @author fzr + * @param url 连接 + * @return String + */ + @Override + public String oaCodeUrl(String url) { + WxMpService wxMpService = WxMnpDriver.oa(); + WxMpOAuth2ServiceImpl wxMpOAuth2Service = new WxMpOAuth2ServiceImpl(wxMpService); + String state = ToolUtils.makeMd5(ToolUtils.makeToken()); + return wxMpOAuth2Service.buildAuthorizationUrl(url, WxConsts.OAuth2Scope.SNSAPI_USERINFO, state); + } + + /** + * 扫码链接 + * + * @author fzr + * @param session session + * @return String + */ + @Override + public String scanCodeUrl(String url, HttpSession session) { + // 获取AppId + String appId = ConfigUtils.get("open_platform", "app_id", ""); + + // 微信开放平台授权 + String baseUrl = "https://open.weixin.qq.com/connect/qrconnect" + + "?appid=%s" + + "&redirect_uri=%s" + + "&response_type=code" + + "&scope=snsapi_login" + + "&state=%s" + + "#wechat_redirect"; + + // 回调地址 + String redirectUrl = url; + try { + redirectUrl = URLEncoder.encode(redirectUrl, "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new OperateException(e.getMessage()); + } + + // 防止csrf攻击 + String state = ToolUtils.makeUUID().replaceAll("-", ""); + ScanLoginCache.set(session.getId(), state); + System.out.println(baseUrl); + System.out.println(appId); + System.out.println(redirectUrl); + System.out.println(state); + System.out.println(String.format(baseUrl, appId, redirectUrl, state)); + //生成QrcodeUrl + return String.format(baseUrl, appId, redirectUrl, state); + } + + /** + * 扫码登录 + * + * @author fzr + * @param code 编码 + * @param state 标识 + * @param terminal 终端 + * @param session 会话 + */ + @Override + public LoginTokenVo scanLogin(String code, String state, Integer terminal, HttpSession session) { + if (!ScanLoginCache.get(session.getId()).equals(state)) { + throw new OperateException("二维码已失效或不存在,请重新操作"); + } + + // 得到配置和授权临时票据code + String appId = ConfigUtils.get("open_platform", "app_id", ""); + String appSecret = ConfigUtils.get("open_platform", "app_secret", ""); + + //向认证服务器发送请求换取access_token + String baseAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token" + + "?appid=%s" + + "&secret=%s" + + "&code=%s" + + "&grant_type=authorization_code"; + + Map resultMap; + try { + String accessTokenUrl = String.format(baseAccessTokenUrl, appId, appSecret, code); + String result = HttpUtils.sendGet(accessTokenUrl); + resultMap = MapUtils.jsonToMap(result); + } catch (Exception e) { + throw new OperateException("获取access_token失败:"+e.getMessage()); + } + + // 访问微信获取用户信息 (openId,unionId,昵称,头像等) + String accessToken = resultMap.get("access_token"); + String openid = resultMap.get("openid"); + String baseUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s"; + String userInfoUrl = String.format(baseUserInfoUrl, accessToken, openid); + Map userinfoMap; + try { + String resultUserInfo = HttpUtils.sendGet(userInfoUrl); + userinfoMap = MapUtils.jsonToMap(resultUserInfo); + } catch (Exception e) { + throw new OperateException("获取用户信息失败:"+e.getMessage()); + } + + String openId = userinfoMap.get("openid"); + String uniId = userinfoMap.get("unionid"); + String unionId = uniId == null ? "0" : uniId; + String avatar = resultMap.getOrDefault("headimgurl", ""); + String nickname = resultMap.getOrDefault("nickname", ""); + + return this.__wxLoginHandle(openId, unionId, avatar, nickname, terminal); + } + + @Override + public void logout() { + TokenLoginCache.del(); + } + + /** + * 处理微信登录 + * + * @param openId (openId) + * @param unionId (unionId) + * @param terminal (terminal) + * @param avatar (用户头像) + * @param nickname (用户昵称) + * @return LoginTokenVo + */ + private LoginTokenVo __wxLoginHandle(String openId, String unionId, String avatar, String nickname, Integer terminal) { + + // 查询授权 + QueryWrapper queryWrapper = new QueryWrapper(); + + if (StringUtils.equals(unionId, "0") == false) { + queryWrapper = new QueryWrapper() + .nested(wq->wq + .eq("unionid", unionId).or() + .eq("openid", openId) + ).last("limit 1"); + } else { + queryWrapper = new QueryWrapper() + .nested(wq->wq + .eq("openid", openId) + ).last("limit 1"); + } + UserAuth userAuth = userAuthMapper.selectOne(queryWrapper); + + // 查询用户 + User user = null; + if (StringUtils.isNotNull(userAuth)) { + user = userMapper.selectOne(new QueryWrapper() + .isNull("delete_time") + .eq("id", userAuth.getUserId()) + .last("limit 1")); + } + + String defaultAvatar = ConfigUtils.get("default_image", "user_avatar", "/api/static/default_avatar.png"); + // 创建用户 + if (StringUtils.isNull(user)) { + Integer sn = this.__generateSn(); + //user.setAvatar(defaultAvatar); + String defaultNickname = "用户" + sn; + if (StringUtils.isNotEmpty(avatar)) { + try { + Long time = System.currentTimeMillis(); + String date = TimeUtils.millisecondToDate(time, "yyyyMyj"); + String name = ToolUtils.makeMd5(ToolUtils.makeUUID()+time) + ".jpg"; + String path = "avatar" + date + "/" + name; + String savePath = YmlUtils.get("like.upload-directory") + path; + ToolUtils.download(avatar, savePath); + defaultAvatar = path; + } catch (IOException ignored) { + } + } + + if (StringUtils.isNotEmpty(nickname)) { + defaultNickname = nickname; + } + + User model = new User(); + model.setSn(sn); + model.setAvatar(defaultAvatar); + model.setNickname(defaultNickname); + model.setAccount("u" + sn); + model.setChannel(terminal); + model.setSex(0); + model.setLoginIp(IpUtils.getHostIp()); + model.setLoginTime(System.currentTimeMillis() / 1000); + model.setUpdateTime(System.currentTimeMillis() / 1000); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setIsNewUser(1); + userMapper.insert(model); + user = model; + } + + // 终端授权 + UserAuth auth = userAuthMapper.selectOne( + new QueryWrapper() + .eq("openid", openId) + //.eq("terminal", terminal) + .last("limit 1")); + + // 创建授权 + if (StringUtils.isNull(auth)) { + UserAuth authModel = new UserAuth(); + authModel.setUserId(user.getId()); + authModel.setUnionid(unionId); + authModel.setOpenid(openId); + authModel.setTerminal(terminal); + authModel.setCreateTime(System.currentTimeMillis() / 1000); + authModel.setUpdateTime(System.currentTimeMillis() / 1000); + userAuthMapper.insert(authModel); + } else if (StringUtils.isEmpty(auth.getUnionid())) { + auth.setUnionid(unionId); + auth.setUpdateTime(System.currentTimeMillis() / 1000); + userAuthMapper.updateById(auth); + } + + return this.__loginToken(user.getId(), user.getMobile(), user.getIsNewUser(), terminal); + } + + /** + * 处理录令牌 + * + * @author fzr + * @param userId 用户ID + * @param mobile 用户手机 + * @param terminal 终端 + * @return LoginTokenVo + */ + private LoginTokenVo __loginToken(Integer userId, String mobile, Integer isNew, Integer terminal) { + // 实现账号登录 + //StpUtil.login(userId); + + String token = ToolUtils.makeToken(); + TokenLoginCache.set(token, userId, String.valueOf(terminal)); + + // 更新登录信息 + User user = new User(); + user.setLoginIp(IpUtils.getHostIp()); + user.setLoginTime(System.currentTimeMillis() / 1000); + userMapper.update(user, new QueryWrapper().eq("id", userId)); + + // 返回登录信息 + LoginTokenVo vo = new LoginTokenVo(); + vo.setId(userId); + vo.setIsBindMobile(!StringUtils.isEmpty(mobile)); + vo.setToken(token); + vo.setIsNew(isNew); + vo.setMobile(mobile); + + //保存登录信息到session + userSessionMapper.delete(new QueryWrapper().eq("user_id", userId).eq("terminal", terminal)); + + UserSession userSession = new UserSession(); + userSession.setUserId(userId); + userSession.setToken(token); + userSession.setTerminal(terminal); + userSession.setUpdateTime(System.currentTimeMillis() / 1000); + userSession.setExpireTime(System.currentTimeMillis() / 1000 + Long.valueOf(YmlUtils.get("sa-token.timeout"))); + userSessionMapper.insert(userSession); + + return vo; + } + + /** + * 生成用户编号 + * + * @author fzr + * @return Integer + */ + private Integer __generateSn() { + Integer sn; + while (true) { + sn = Integer.parseInt(ToolUtils.randomInt(8)); + User snModel = userMapper.selectOne(new QueryWrapper() + .select("id,sn") + .eq("sn", sn) + .last("limit 1")); + if (snModel == null) { + break; + } + } + return sn; + } + +} diff --git a/yj-front/src/main/java/com/yj/front/service/impl/LogsServiceImpl.java b/yj-front/src/main/java/com/yj/front/service/impl/LogsServiceImpl.java new file mode 100644 index 0000000..9692b3f --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/impl/LogsServiceImpl.java @@ -0,0 +1,55 @@ +package com.yj.front.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yj.common.core.PageResult; +import com.yj.common.entity.log.UserAccountLog; +import com.yj.common.enums.LogMoneyEnum; +import com.yj.common.mapper.log.UserAccountLogMapper; +import com.yj.common.util.TimeUtils; +import com.yj.front.service.ILogsService; +import com.yj.front.validate.common.PageValidate; +import com.yj.front.vo.RechargeRecordVo; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.LinkedList; +import java.util.List; + +@Service +public class LogsServiceImpl implements ILogsService { + + @Resource + UserAccountLogMapper userAccountLogMapper; + + @Override + public PageResult userMoney(PageValidate pageValidate, Integer userId, Integer type) { + Integer pageNo = pageValidate.getPage_no(); + Integer pageSize = pageValidate.getPage_size(); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_id", userId); + queryWrapper.orderByDesc("id"); + if (type > 0) { + queryWrapper.eq("action", type); + } + + IPage iPage = userAccountLogMapper.selectPage(new Page<>(pageNo, pageSize), queryWrapper); + + List list = new LinkedList<>(); + for (UserAccountLog logMoney : iPage.getRecords()) { + RechargeRecordVo vo = new RechargeRecordVo(); + + vo.setId(logMoney.getId()); + vo.setAction(logMoney.getAction()); + vo.setOrderAmount(logMoney.getChangeAmount()); + vo.setTips(LogMoneyEnum.getMsgByCode(logMoney.getChangeType())); + vo.setCreateTime(TimeUtils.timestampToDate(logMoney.getCreateTime())); + list.add(vo); + } + + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list); + } + +} diff --git a/yj-front/src/main/java/com/yj/front/service/impl/PayServiceImpl.java b/yj-front/src/main/java/com/yj/front/service/impl/PayServiceImpl.java new file mode 100644 index 0000000..70d6824 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/impl/PayServiceImpl.java @@ -0,0 +1,382 @@ +package com.yj.front.service.impl; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; +import com.alibaba.fastjson2.JSONObject; +import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayClient; +import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.request.AlipayTradePagePayRequest; +import com.alipay.api.request.AlipayTradeWapPayRequest; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.common.config.AlipayConfig; +import com.yj.common.entity.RechargeOrder; +import com.yj.common.entity.setting.DevPayConfig; +import com.yj.common.entity.setting.DevPayWay; +import com.yj.common.entity.user.User; +import com.yj.common.entity.user.UserAuth; +import com.yj.common.enums.*; +import com.yj.common.exception.OperateException; +import com.yj.common.exception.PaymentException; +import com.yj.common.mapper.log.UserAccountLogMapper; +import com.yj.common.mapper.RechargeOrderMapper; +import com.yj.common.mapper.setting.DevPayConfigMapper; +import com.yj.common.mapper.setting.DevPayWayMapper; +import com.yj.common.mapper.user.UserAuthMapper; +import com.yj.common.mapper.user.UserMapper; +import com.yj.common.plugin.wechat.WxMnpDriver; +import com.yj.common.plugin.wechat.WxPayDriver; +import com.yj.common.plugin.wechat.request.PaymentRequestV3; +import com.yj.common.util.*; +import com.yj.front.service.IPayService; +import com.yj.front.validate.PaymentValidate; +import com.yj.front.vo.pay.PayStatusVo; +import com.yj.front.vo.pay.PayWayInfoVo; +import com.yj.front.vo.pay.PayWayListVo; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken; +import me.chanjar.weixin.mp.api.WxMpService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; + +@Slf4j +@Service +public class PayServiceImpl implements IPayService { + + @Resource + UserMapper userMapper; + + @Resource + UserAuthMapper userAuthMapper; + + @Resource + DevPayWayMapper devPayWayMapper; + + @Resource + DevPayConfigMapper devPayConfigMapper; + + @Resource + RechargeOrderMapper rechargeOrderMapper; + + @Resource + UserAccountLogMapper logMoneyMapper; + @Value("${ali.pay.order-notify-url}") + private String aliPayNotifyUrl; + + /** + * 支付方式 + * + * @author fzr + * @param from 场景 + * @param orderId 订单ID + * @param terminal 终端 + * @return List + */ + @Override + public PayWayListVo payWay(String from, Integer orderId, Integer terminal) { + List devPayWays = devPayWayMapper.selectList( + new QueryWrapper() + .eq("scene", terminal) + .eq("status", YesNoEnum.YES.getCode()).orderByDesc("id")); + + PayWayListVo vo = new PayWayListVo(); + if (from.equals("recharge")) { + RechargeOrder rechargeOrder = rechargeOrderMapper.selectById(orderId); + vo.setOrderAmount(rechargeOrder.getOrderAmount()); + } + + Integer walletType = PaymentEnum.WALLET_PAY.getCode(); + List list = new LinkedList<>(); + for (DevPayWay way : devPayWays) { + if (from.equals("recharge") && way.getPayConfigId().equals(walletType)) { + continue; + } + + DevPayConfig devPayConfig = devPayConfigMapper.selectById(way.getPayConfigId()); + PayWayInfoVo infoVo = new PayWayInfoVo(); + infoVo.setId(devPayConfig.getId()); + infoVo.setName(devPayConfig.getName()); + infoVo.setIcon(UrlUtils.toAbsoluteUrl(devPayConfig.getIcon())); + infoVo.setIsDefault(way.getIsDefault()); + infoVo.setSort(devPayConfig.getSort()); + infoVo.setRemark(devPayConfig.getRemark()); + infoVo.setPayWay(devPayConfig.getPayWay()); + if (devPayConfig.getPayWay().equals(PaymentEnum.WX_PAY.getCode())) { + infoVo.setExtra("微信快捷支付"); + } + if (devPayConfig.getPayWay().equals(PaymentEnum.ALI_PAY.getCode())) { + infoVo.setExtra("支付宝快捷支付"); + } + list.add(infoVo); + } + + Collections.sort(list, Comparator.comparing(PayWayInfoVo::getSort).reversed() + .thenComparing(Comparator.comparingInt(PayWayInfoVo::getId).reversed())); + vo.setLists(list); + return vo; + } + + /** + * 订单状态 + * + * @author fzr + * @param from 场景 + * @param orderId 订单ID + * @return PayStatusVo + */ + @Override + public PayStatusVo payStatus(String from, Integer orderId) { + PayStatusVo vo = new PayStatusVo(); + boolean orderExist = false; + + switch (from) { + case "recharge": + RechargeOrder rechargeOrder = rechargeOrderMapper.selectById(orderId); + if (StringUtils.isNotNull(rechargeOrder)) { + orderExist = true; + vo.setPayStatus(rechargeOrder.getPayStatus()); + vo.setOrderId(rechargeOrder.getId()); + JSONObject order = new JSONObject(); + order.put("order_amount", rechargeOrder.getOrderAmount()); + order.put("order_sn", rechargeOrder.getSn()); + order.put("pay_time", StringUtils.isNotNull(rechargeOrder.getPayTime()) ? TimeUtils.timestampToDate(rechargeOrder.getPayTime()) : ""); + order.put("pay_way", PaymentEnum.getPayWayMsg(rechargeOrder.getPayWay())); + vo.setOrder(order); + } + break; + case "order": + break; + } + + if (!orderExist) { + throw new OperateException("订单不存在!"); + } + + return vo; + } + + /** + * 发起支付 + * + * @param params 参数 + * @param terminal 终端 + * @return Object + */ + public Object prepay(PaymentValidate params, Integer terminal, String code) { + try { + params.setTerminal(terminal); + String openId = null; + UserAuth userAuth = userAuthMapper.selectOne(new QueryWrapper() + .eq("user_id", params.getUserId()) + //.eq("terminal", terminal) + .last("limit 1")); + + if (StringUtils.isNotNull(userAuth)) { + openId = userAuth.getOpenid(); + } else { + if(terminal.intValue() != ClientEnum.PC.getCode()) { + if (StringUtils.isNotEmpty(code)) { + if (ClientEnum.OA.getCode() == terminal.intValue()) { + WxMpService wxMpService = WxMnpDriver.oa(); + WxOAuth2AccessToken wxOAuth2AccessToken = wxMpService.getOAuth2Service().getAccessToken(code); + openId = wxOAuth2AccessToken.getOpenId(); + } else if (ClientEnum.MNP.getCode() == terminal.intValue()) { + WxMaService wxMaService = WxMnpDriver.mnp(); + WxMaJscode2SessionResult sessionResult = wxMaService.getUserService().getSessionInfo(code); + openId = sessionResult.getOpenid(); + } + } + } + } + + switch (params.getPayWay()) { + case 1: // 余额支付 + String attach = params.getAttach(); + String orderSn = params.getOutTradeNo(); + this.handlePaidNotify(attach, orderSn, null); + return Collections.emptyList(); + case 2: // 微信支付 + PaymentRequestV3 requestV3 = new PaymentRequestV3(); + requestV3.setTerminal(terminal); + requestV3.setOpenId(openId); + requestV3.setAttach(params.getAttach()); + requestV3.setOutTradeNo(params.getOutTradeNo()); + requestV3.setOrderAmount(params.getOrderAmount()); + requestV3.setDescription(params.getDescription()); + Object result = WxPayDriver.unifiedOrder(requestV3); + if (terminal == ClientEnum.H5.getCode()) { + Assert.notNull(params.getRedirect(), "redirectUrl参数缺失"); + JSONObject ret = new JSONObject(); + String h5Url = result.toString(); + ret.put("config", WxPayDriver.unifiedOrder(requestV3)); + ret.put("pay_way", 2); + return ret; + } + JSONObject ret = new JSONObject(); + JSONObject config = JSONObject.parseObject(JSONObject.toJSONString(WxPayDriver.unifiedOrder(requestV3))); + config.put("package", config.getString("packageValue")); + config.remove("packageValue"); + ret.put("config", config); + ret.put("pay_way", 2); + return ret; + //return WxPayDriver.unifiedOrder(requestV3); + case 3: //支付宝 + return this.createAliH5Order(params); + } + } catch (Exception e) { + throw new OperateException(e.toString()); + } + + throw new PaymentException("支付发起异常"); + } + + /** + * 支付回调处理 + * + * @author fzr + * @param attach 场景码 + * @param outTradeNo 订单编号 + * @param transactionId 流水号 + */ + @Override + @Transactional + public void handlePaidNotify(String attach, String outTradeNo, String transactionId) { + switch (attach) { + case "order": + break; + case "recharge": + this.rechargeCallback(outTradeNo, transactionId); + break; + } + } + + @Override + public JSONObject createAliH5Order(PaymentValidate params) throws AlipayApiException { + JSONObject ret = new JSONObject(); + // 订单编号 + String orderSn = ""; + // 订单状态 + Integer orderStatus = 0; + // 订单金额 + BigDecimal orderAmount = BigDecimal.ZERO; + Long orderId = 0L; + String payReturnUrl = ""; + switch (params.getScene()){ + case "member": + break; + case "recharge": + RechargeOrder rechargeOrder = rechargeOrderMapper.selectOne(new QueryWrapper() + .eq("id", params.getOrderId()) + .eq("pay_status", PaymentEnum.UN_PAID.getCode()) + .eq("user_id", params.getUserId()) + .last("limit 1")); + orderSn = rechargeOrder.getSn(); + orderStatus = rechargeOrder.getPayStatus(); + orderAmount = rechargeOrder.getOrderAmount(); + orderId = Long.valueOf(rechargeOrder.getId()); + payReturnUrl = UrlUtils.localDomain(params.getRedirect()); + Assert.notNull(rechargeOrder, "订单不存在"); + break; + default: + throw new OperateException("不支持当前订单类型"); + } + + Assert.isTrue(orderStatus != null && orderStatus == PaymentEnum.UN_PAID.getCode(), "订单非待支付状态,不能创建支付单"); + + String gateWay = StringUtils.isNotNull(YmlUtils.get("like.alidebug")) && YmlUtils.get("like.alidebug").equals("true") ? AlipayConfig.GATEWAY_URL_DEBUG : AlipayConfig.GATEWAY_URL; + AlipayClient alipayClient = new DefaultAlipayClient(gateWay, ConfigUtils.getAliDevPay("app_id"), ConfigUtils.getAliDevPay("private_key"), "json", AlipayConfig.CHARSET, ConfigUtils.getAliDevPay("ali_public_key"), AlipayConfig.SIGN_TYPE); + //2、封装 Request + String form = ""; + JSONObject bizContent = new JSONObject(); + bizContent.put("out_trade_no", orderSn); + bizContent.put("total_amount", orderAmount); + bizContent.put("subject", params.getDescription()); + bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY"); + bizContent.put("app_pay", "Y"); + bizContent.put("passback_params", JSONObject.toJSONString(new JSONObject(){{ + put("from", params.getScene()); + }})); + if (params.getTerminal().equals(ClientEnum.H5.getCode()) || params.getTerminal().equals(ClientEnum.OA.getCode())) { + AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest(); + //alipayRequest.setNotifyUrl("http://y4f8ud.natappfree.cc" + aliPayNotifyUrl); + alipayRequest.setNotifyUrl(UrlUtils.getRequestUrl() + aliPayNotifyUrl); + alipayRequest.setReturnUrl(payReturnUrl); + alipayRequest.setBizContent(bizContent.toString()); + + try { + form = alipayClient.pageExecute(alipayRequest).getBody(); + ret.put("config", form); + ret.put("pay_way", params.getPayWay()); + return ret; + } catch (Exception e) { + throw new PaymentException(e.getMessage()); + } + } else { + AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); + //alipayRequest.setNotifyUrl("http://y4f8ud.natappfree.cc" + aliPayNotifyUrl); + alipayRequest.setNotifyUrl(UrlUtils.getRequestUrl() + aliPayNotifyUrl); + alipayRequest.setReturnUrl(payReturnUrl); + alipayRequest.setBizContent(bizContent.toString()); + + try { + form = alipayClient.pageExecute(alipayRequest).getBody(); + ret.put("config", form); + ret.put("pay_way", params.getPayWay()); + return ret; + } catch (Exception e) { + throw new OperateException(e.getMessage()); + } + } + } + + /** + * 余额充值回调 + * + * @author fzr + * @param outTradeNo 订单号 + * @param transactionId 流水号 + */ + private void rechargeCallback(String outTradeNo, String transactionId) { + for (int i=0; i<=0; i++) { + RechargeOrder rechargeOrder = rechargeOrderMapper.selectOne( + new QueryWrapper() + .eq("sn", outTradeNo).isNull("delete_time") + .last("limit 1")); + + if (StringUtils.isNull(rechargeOrder)) { + log.error("充值订单不存在: {} : {}", outTradeNo, transactionId); + break; + } + + if (rechargeOrder.getPayStatus().equals(PaymentEnum.OK_PAID.getCode())) { + log.error("充值订单已支付: {} : {}", outTradeNo, transactionId); + break; + } + + rechargeOrder.setPayStatus(1); + rechargeOrder.setTransactionId(transactionId); + rechargeOrder.setPayTime(System.currentTimeMillis() / 1000); + rechargeOrder.setUpdateTime(System.currentTimeMillis() / 1000); + rechargeOrderMapper.updateById(rechargeOrder); + + + logMoneyMapper.add(rechargeOrder.getUserId(), + AccountLogEnum.UM_INC_RECHARGE.getCode(), + rechargeOrder.getOrderAmount(), + rechargeOrder.getId(), + rechargeOrder.getSn(), + "用户充值余额", null); + + User user = userMapper.selectById(rechargeOrder.getUserId()); + user.setUserMoney(user.getUserMoney().add(rechargeOrder.getOrderAmount())); + user.setUpdateTime(System.currentTimeMillis() / 1000); + userMapper.updateById(user); + } + } +} diff --git a/yj-front/src/main/java/com/yj/front/service/impl/PcServiceImpI.java b/yj-front/src/main/java/com/yj/front/service/impl/PcServiceImpI.java new file mode 100644 index 0000000..a180991 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/impl/PcServiceImpI.java @@ -0,0 +1,377 @@ +package com.yj.front.service.impl; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.common.config.GlobalConfig; +import com.yj.common.entity.article.ArticleCate; +import com.yj.common.entity.decorate.DecoratePage; +import com.yj.common.entity.article.Article; +import com.yj.common.entity.article.ArticleCollect; +import com.yj.common.enums.YesNoEnum; +import com.yj.common.exception.OperateException; +import com.yj.common.mapper.article.ArticleCateMapper; +import com.yj.common.mapper.decorate.DecoratePageMapper; +import com.yj.common.mapper.article.ArticleCollectMapper; +import com.yj.common.mapper.article.ArticleMapper; +import com.yj.common.util.*; +import com.yj.front.service.IPcService; +import com.yj.front.vo.article.PcArticleCenterVo; +import com.yj.front.vo.article.PcArticleDetailVo; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; + +@Service +public class PcServiceImpI implements IPcService { + + @Resource + DecoratePageMapper decoratePageMapper; + + @Resource + ArticleCateMapper articleCategoryMapper; + + @Resource + ArticleCollectMapper articleCollectMapper; + + @Resource + ArticleMapper articleMapper; + + /** + * 主页 + * + * @author cjh + * @return Map + */ + @Override + public Map index() { + Map indexData = new LinkedHashMap<>(); + DecoratePage decoratePage = decoratePageMapper.selectOne( + new QueryWrapper() + .eq("id", 4) + .last("limit 1")); + //全部资讯 + List
articlesAll = articleMapper.selectList(new QueryWrapper
() + .eq("is_show", 1) + .isNull("delete_time") + .orderByDesc("sort") + .orderByDesc("id") + .last("limit 5")); + List> articlesAllList = new LinkedList<>(); + for (Article article : articlesAll) { + Map map = new LinkedHashMap<>(); + map.put("id", article.getId()); + map.put("cid", article.getCid()); + map.put("author", article.getAuthor()); + map.put("title", article.getTitle()); + map.put("abstract", article.getAbstractField()); + map.put("click", article.getClickActual() + article.getClickVirtual()); + map.put("create_time", TimeUtils.timestampToDate(article.getCreateTime())); + map.put("desc", article.getDesc()); + map.put("image", UrlUtils.toAbsoluteUrl(article.getImage())); + articlesAllList.add(map); + } + + //最新资讯 + List
articlesNew = articleMapper.selectList(new QueryWrapper
() + .eq("is_show", 1) + .isNull("delete_time") + .orderByDesc("id") + .last("limit 7")); + List> articlesNewList = new LinkedList<>(); + for (Article article : articlesNew) { + Map map = new LinkedHashMap<>(); + map.put("id", article.getId()); + map.put("cid", article.getCid()); + map.put("author", article.getAuthor()); + map.put("title", article.getTitle()); + map.put("abstract", article.getAbstractField()); + map.put("click", article.getClickActual() + article.getClickVirtual()); + map.put("create_time", TimeUtils.timestampToDate(article.getCreateTime())); + map.put("desc", article.getDesc()); + map.put("image", UrlUtils.toAbsoluteUrl(article.getImage())); + articlesNewList.add(map); + } + + //热门资讯 + List
articlesHot = articleMapper.selectList(new QueryWrapper
() + .eq("is_show", 1) + .isNull("delete_time") + .orderByDesc("click_actual") + .last("limit 7")); + List> articlesHostList = new LinkedList<>(); + for (Article article : articlesHot) { + Map map = new LinkedHashMap<>(); + map.put("id", article.getId()); + map.put("cid", article.getCid()); + map.put("author", article.getAuthor()); + map.put("title", article.getTitle()); + map.put("abstract", article.getAbstractField()); + map.put("click", article.getClickActual() + article.getClickVirtual()); + map.put("create_time", TimeUtils.timestampToDate(article.getCreateTime())); + map.put("desc", article.getDesc()); + map.put("image", UrlUtils.toAbsoluteUrl(article.getImage())); + articlesHostList.add(map); + } + + + String data = decoratePage.getData(); + JSONArray dataArray = JSONArray.parseArray(data); + + for (int i = 0; i < dataArray.size() ; i++) { + JSONObject dataJson = dataArray.getJSONObject(i); + JSONArray tempArray = dataJson.getJSONObject("content").getJSONArray("data"); + if (StringUtils.isNull(tempArray)) { + + JSONObject tempJSON = dataJson.getJSONObject("content"); + if (StringUtils.isNull(tempJSON)) { + continue; + } else { + if (StringUtils.isNotNull(tempJSON.getString("image"))) { + tempJSON.put("image", UrlUtils.toAbsoluteUrl(tempJSON.getString("image"))); + } + if (StringUtils.isNotNull(tempJSON.getString("qrcode"))) { + tempJSON.put("qrcode", UrlUtils.toAbsoluteUrl(tempJSON.getString("qrcode"))); + } + } + } else { + for (int j = 0; j < tempArray.size(); j++) { + JSONObject tempImageJson = tempArray.getJSONObject(j); + tempImageJson.put("image", UrlUtils.toAbsoluteUrl(tempImageJson.getString("image"))); + } + } + } + + decoratePage.setData(dataArray.toJSONString()); + + indexData.put("page", decoratePage); + indexData.put("all", articlesAllList); + indexData.put("new", articlesNewList); + indexData.put("hot", articlesHostList); + return indexData; + } + + /** + * 配置 + * + * @author cjh + * @return Map + */ + @Override + public Map getConfig() { + Map response = new LinkedHashMap<>(); + + // 登录配置 + Map loginMap = new LinkedHashMap<>(); + Map loginConfig = ConfigUtils.get("login"); + // 登录方式 + loginMap.put("login_way", JSONArray.parseArray(loginConfig.getOrDefault("login_way", "[]"))); + // 注册强制绑定手机 + loginMap.put("coerce_mobile", Integer.parseInt(loginConfig.getOrDefault("coerce_mobile", "0"))); + // 政策协议 + loginMap.put("login_agreement", Integer.parseInt(loginConfig.getOrDefault("login_agreement", "0"))); + // 第三方登录 开关 + loginMap.put("third_auth", Integer.parseInt(loginConfig.getOrDefault("third_auth", "0"))); + // 微信授权登录 + loginMap.put("wechat_auth", Integer.parseInt(loginConfig.getOrDefault("wechat_auth", "0"))); + // qq授权登录 + loginMap.put("qq_auth", Integer.parseInt(loginConfig.getOrDefault("qq_auth", "0"))); + + // 站点统计 + String siteStatistics = ConfigUtils.get("siteStatistics", "clarity_code", ""); + + // 备案信息 + Map websiteConfig = ConfigUtils.get("copyright"); + String copyright = websiteConfig.getOrDefault("config", "[]"); + List> copyrightMap = ListUtils.stringToListAsMapStr(copyright); + + // 公众号二维码 + String oaQrCode = ConfigUtils.get("oa_setting", "qr_code", ""); + oaQrCode = StringUtils.isEmpty(oaQrCode) ? "" : UrlUtils.toAbsoluteUrl(oaQrCode); + + // 小程序二维码 + String mnpQrCode = ConfigUtils.get("mnp_setting", "qr_code", ""); + mnpQrCode = StringUtils.isEmpty(mnpQrCode) ? "" : UrlUtils.toAbsoluteUrl(mnpQrCode); + + JSONObject qrcode = new JSONObject(); + qrcode.put("oa", oaQrCode); + qrcode.put("mnp", mnpQrCode); + + // 网站信息 + JSONObject website = new JSONObject(); + website.put("shop_name", ConfigUtils.get("website", "shop_name", "")); + website.put("shop_logo", UrlUtils.toAbsoluteUrl(ConfigUtils.get("website", "shop_logo", ""))); + website.put("pc_logo", UrlUtils.toAbsoluteUrl(ConfigUtils.get("website", "pc_logo", ""))); + website.put("pc_title", ConfigUtils.get("website", "pc_title", "")); + website.put("pc_ico", UrlUtils.toAbsoluteUrl(ConfigUtils.get("website", "pc_ico", ""))); + website.put("pc_desc", ConfigUtils.get("website", "pc_desc", "")); + website.put("pc_keywords", ConfigUtils.get("website", "pc_keywords", "")); + + + response.put("admin_url", "2"); + response.put("copyright", copyrightMap); + response.put("domain", UrlUtils.domain()); + response.put("login", loginMap); + response.put("version", GlobalConfig.version); + response.put("siteStatistics", siteStatistics); + response.put("website", website); + response.put("qrcode", qrcode); + return response; + } + + /** + * 资讯中心 + * + * @author fzr + * @return List + */ + @Override + public List infoCenter() { + List articleCategoryList = articleCategoryMapper.selectList( + new QueryWrapper() + .eq("is_show", 1) + .isNull("delete_time") + .orderByDesc(Arrays.asList("sort", "id"))); + + List list = new LinkedList<>(); + for (ArticleCate articleCategory : articleCategoryList) { + List
articleList = articleMapper.selectList(new QueryWrapper
() + .eq("cid", articleCategory.getId()) + .eq("is_show", 1) + .isNull("delete_time") + .orderByDesc(Arrays.asList("sort", "id")) + .last("limit 10")); + + List> articles = new LinkedList<>(); + for (Article article : articleList) { + Map map = new LinkedHashMap<>(); + map.put("id", article.getId()); + map.put("cid", article.getCid()); + map.put("author", article.getAuthor()); + map.put("title", article.getTitle()); + map.put("abstract", article.getAbstractField()); + map.put("click", article.getClickActual() + article.getClickVirtual()); + map.put("create_time", TimeUtils.timestampToDate(article.getCreateTime())); + map.put("desc", article.getDesc()); + map.put("image", UrlUtils.toAbsoluteUrl(article.getImage())); + map.put("is_show", article.getIsShow()); + map.put("sort", article.getSort()); + map.put("update_time", TimeUtils.timestampToDate(article.getUpdateTime())); + articles.add(map); + } + + PcArticleCenterVo vo = new PcArticleCenterVo(); + vo.setId(articleCategory.getId()); + vo.setName(articleCategory.getName()); + vo.setArticle(articles); + list.add(vo); + } + + return list; + } + + /** + * 文章详情 + * + * @author fzr + * @param id 文章主键 + * @param userId 用户ID + * @return PcArticleDetailVo + */ + @Override + public PcArticleDetailVo articleDetail(Integer id, Integer userId) { + // 文章详情 + Article article = articleMapper.selectOne(new QueryWrapper
() + .eq("id", id) + .isNull("delete_time") + .eq("is_show", YesNoEnum.YES.getCode()) + .last("limit 1")); + + if (StringUtils.isNull(article)) { + throw new OperateException("文章数据不存在!"); + } + + // 分类名称 + ArticleCate articleCategory = articleCategoryMapper.selectOne( + new QueryWrapper() + .eq("id", article.getCid()) + .isNull("delete_time")); + + // 上一条记录 + Article prev = articleMapper.selectOne(new QueryWrapper
() + .select("id,title") + .lt("id", id) + .isNull("delete_time") + .orderByDesc(Arrays.asList("sort", "id")) + .last("limit 1")); + + // 下一条记录 + Article next = articleMapper.selectOne(new QueryWrapper
() + .select("id,title") + .gt("id", id) + .isNull("delete_time") + .orderByDesc(Arrays.asList("sort", "id")) + .last("limit 1")); + + // 是否收藏 + ArticleCollect collect = articleCollectMapper.selectOne(new QueryWrapper() + .eq("article_id", article.getId()) + .eq("user_id", userId) + .eq("status", YesNoEnum.YES.getCode()) + .isNull("delete_time") + .last("limit 1")); + + // 最新资讯 + List
news = articleMapper.selectList(new QueryWrapper
() + .select("id,title,image,create_time,update_time") + .eq("cid", article.getCid()) + .isNull("delete_time") + .orderByDesc("id") + .last("limit 8")); + + List> newsList = new LinkedList<>(); + for (Article newArticle : news) { + Map newsMap = new LinkedHashMap<>(); + newsMap.put("id", newArticle.getId()); + newsMap.put("title", newArticle.getTitle()); + newsMap.put("image", UrlUtils.toAbsoluteUrl(newArticle.getImage())); + newsMap.put("createTime", TimeUtils.timestampToDate(newArticle.getCreateTime())); + newsMap.put("updateTime", TimeUtils.timestampToDate(newArticle.getUpdateTime())); + newsList.add(newsMap); + } + + // 处理数据 + PcArticleDetailVo vo = new PcArticleDetailVo(); + BeanUtils.copyProperties(article, vo); + vo.setCreateTime(TimeUtils.timestampToDate(article.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(article.getUpdateTime())); + vo.setCateName(StringUtils.isNotNull(articleCategory) ? articleCategory.getName() : ""); + vo.setCollect(StringUtils.isNotNull(collect) ? true : false); + vo.setIsShow(article.getIsShow()); + vo.setClick(article.getClickActual() + article.getClickVirtual()); + vo.setNews(newsList); + vo.setLast(new JSONArray()); + vo.setNext(new JSONArray()); + + if (StringUtils.isNotNull(prev)) { + Map prevMap = new LinkedHashMap<>(); + prevMap.put("id", prev.getId()); + prevMap.put("title", prev.getTitle()); + vo.setLast(prevMap); + } + + if (StringUtils.isNotNull(next)) { + Map nextMap = new LinkedHashMap<>(); + nextMap.put("id", next.getId()); + nextMap.put("title", next.getTitle()); + vo.setNext(nextMap); + } + + article.setClickActual(article.getClickActual() + 1); + articleMapper.updateById(article); + + return vo; + } +} diff --git a/yj-front/src/main/java/com/yj/front/service/impl/RechargeServiceImpl.java b/yj-front/src/main/java/com/yj/front/service/impl/RechargeServiceImpl.java new file mode 100644 index 0000000..2947774 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/impl/RechargeServiceImpl.java @@ -0,0 +1,164 @@ +package com.yj.front.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yj.common.core.PageResult; +import com.yj.common.entity.RechargeOrder; +import com.yj.common.entity.user.User; +import com.yj.common.enums.AccountLogEnum; +import com.yj.common.enums.PaymentEnum; +import com.yj.common.exception.OperateException; +import com.yj.common.mapper.RechargeOrderMapper; +import com.yj.common.mapper.log.UserAccountLogMapper; +import com.yj.common.mapper.user.UserMapper; +import com.yj.common.util.ConfigUtils; +import com.yj.common.util.StringUtils; +import com.yj.common.util.TimeUtils; +import com.yj.front.service.IRechargeService; +import com.yj.front.validate.RechargeValidate; +import com.yj.front.validate.common.PageValidate; +import com.yj.front.vo.RechargeConfigVo; +import com.yj.front.vo.RechargeRecordVo; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * 充值余额服务实现类 + */ +@Service +public class RechargeServiceImpl implements IRechargeService { + + @Resource + UserAccountLogMapper userAccountLogMapper; + @Resource + RechargeOrderMapper rechargeOrderMapper; + + @Resource + UserMapper userMapper; + + /** + * 充值配置 + * + * @author fzr + * @param userId 用户ID + * @return RechargeConfigVo + */ + @Override + public RechargeConfigVo config(Integer userId) { + User user = userMapper.selectById(userId); + Map config = ConfigUtils.get("recharge"); + + RechargeConfigVo vo = new RechargeConfigVo(); + vo.setStatus(Integer.parseInt(config.getOrDefault("status", "0"))); + vo.setMinAmount(new BigDecimal(config.getOrDefault("min_amount", "0"))); + vo.setUserMoney(user.getUserMoney()); + return vo; + } + + /** + * 充值记录 + * + * @author fzr + * @param userId 用户ID + * @param pageValidate 分页参数 + * @return PageResult + */ + @Override + public PageResult record(Integer userId, PageValidate pageValidate) { + Integer pageNo = pageValidate.getPage_no(); + Integer pageSize = pageValidate.getPage_size(); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_id", userId); + queryWrapper.eq("pay_status", PaymentEnum.OK_PAID.getCode()); + queryWrapper.orderByDesc("id"); + + IPage iPage = rechargeOrderMapper.selectPage(new Page<>(pageNo, pageSize), queryWrapper); + + List list = new LinkedList<>(); + for (RechargeOrder rechargeOrder : iPage.getRecords()) { + RechargeRecordVo vo = new RechargeRecordVo(); + vo.setId(rechargeOrder.getId()); + vo.setAction(1); + vo.setOrderAmount(rechargeOrder.getOrderAmount()); + vo.setCreateTime(TimeUtils.timestampToDate(rechargeOrder.getPayTime())); + vo.setTips("充值" + vo.getOrderAmount() + "元"); + list.add(vo); + } + + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list); + } + + /** + * 创建充值订单 + * + * @author fzr + * @param userId 用户ID + * @param terminal 设备端 + * @param rechargeValidate 参数 + * @return Map + */ + @Override + public Map placeOrder(Integer userId, Integer terminal, RechargeValidate rechargeValidate) { + RechargeConfigVo config = this.config(userId); + if (config.getStatus().equals(0)) { + throw new OperateException("充值功能已关闭"); + } + + if (rechargeValidate.getMoney().compareTo(config.getMinAmount()) < 0) { + throw new OperateException("充值金额不能少于" + config.getMinAmount()); + } + + RechargeOrder order = new RechargeOrder(); + order.setUserId(userId); + order.setOrderTerminal(terminal); + order.setSn(rechargeOrderMapper.randMakeOrderSn("sn")); + order.setPayStatus(0); + order.setRefundStatus(0); + order.setOrderAmount(rechargeValidate.getMoney()); + order.setCreateTime(System.currentTimeMillis() / 1000); + order.setUpdateTime(System.currentTimeMillis() / 1000); + rechargeOrderMapper.insert(order); + + Map response = new LinkedHashMap<>(); + response.put("order_id", order.getId()); + response.put("from", "recharge"); + return response; + } + + @Override + @Transactional + public void updatePayOrderStatusToPaid(String outTradeNo, String tradeNo) { + RechargeOrder order = rechargeOrderMapper.selectOne(new QueryWrapper().eq("sn", outTradeNo).isNull("delete_time")); + if (StringUtils.isNull(order)) { + return; + } + + if (order.getPayStatus().equals(PaymentEnum.OK_PAID.getCode())) { //如果是已支付的状态,则不会再更新 + return; + } + Integer userId = order.getUserId(); + String orderSn = outTradeNo; + + User user = userMapper.selectById(order.getUserId()); + user.setUserMoney(user.getUserMoney().add(order.getOrderAmount())); + user.setTotalRechargeAmount(user.getTotalRechargeAmount().add(order.getOrderAmount())); + userMapper.updateById(user); + + //add account log + userAccountLogMapper.add(userId, AccountLogEnum.UM_INC_RECHARGE.getCode(), order.getOrderAmount(), order.getId(), order.getSn(), "", ""); + + order.setTransactionId(tradeNo); + order.setPayStatus(PaymentEnum.OK_PAID.getCode()); + order.setPayTime(System.currentTimeMillis() / 1000); + rechargeOrderMapper.updateById(order); + } +} diff --git a/yj-front/src/main/java/com/yj/front/service/impl/SearchServiceImpl.java b/yj-front/src/main/java/com/yj/front/service/impl/SearchServiceImpl.java new file mode 100644 index 0000000..9171750 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/impl/SearchServiceImpl.java @@ -0,0 +1,35 @@ +package com.yj.front.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.common.entity.setting.HotSearch; +import com.yj.common.mapper.setting.HotSearchMapper; +import com.yj.common.util.*; +import com.yj.front.service.ISearchService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; + +/** + * 首页服务实现类 + */ +@Service +public class SearchServiceImpl implements ISearchService { + + + @Resource + HotSearchMapper hotSearchMapper; + + @Override + public JSONObject hotLists() { + + List hotSearches = hotSearchMapper.selectList(new QueryWrapper().orderByDesc("sort")); + JSONObject result = new JSONObject(){{ + put("status", ConfigUtils.get("hot_search", "status", "0")); + put("data", hotSearches); + }}; + + return result; + } +} diff --git a/yj-front/src/main/java/com/yj/front/service/impl/UserAccountLogServiceImpl.java b/yj-front/src/main/java/com/yj/front/service/impl/UserAccountLogServiceImpl.java new file mode 100644 index 0000000..79a23e5 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/impl/UserAccountLogServiceImpl.java @@ -0,0 +1,62 @@ +package com.yj.front.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yj.common.core.PageResult; +import com.yj.common.entity.log.UserAccountLog; +import com.yj.common.enums.AccountLogEnum; +import com.yj.common.mapper.log.UserAccountLogMapper; +import com.yj.common.util.*; +import com.yj.front.service.IUserAccountLogService; +import com.yj.front.validate.common.PageValidate; +import com.yj.front.validate.users.*; +import com.yj.front.vo.user.UserAccountListVo; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.LinkedList; +import java.util.List; + +/** + * 用户服务实现类 + */ +@Service +public class UserAccountLogServiceImpl implements IUserAccountLogService { + + @Resource + UserAccountLogMapper userAccountLogMapper; + + @Override + public PageResult lists(PageValidate pageValidate, UserAccountLogSearchValidate searchValidate) { + Integer pageNo = pageValidate.getPage_no(); + Integer pageSize = pageValidate.getPage_size(); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.isNull("delete_time"); + queryWrapper.eq("user_id", searchValidate.getUserId()); + if (StringUtils.isNotEmpty(searchValidate.getType()) && searchValidate.getType().equals("um")) { + queryWrapper.in("change_type", AccountLogEnum.getUserMoneyChangeType()); + } + + if (StringUtils.isNotNull(searchValidate.getAction())) { + queryWrapper.eq("action", searchValidate.getAction()); + } + + queryWrapper.orderByDesc("id"); + IPage iPage = userAccountLogMapper.selectPage(new Page<>(pageNo, pageSize), queryWrapper); + List list = new LinkedList<>(); + for (UserAccountLog item : iPage.getRecords()) { + UserAccountListVo vo = new UserAccountListVo(); + BeanUtils.copyProperties(item, vo); + vo.setTypeDesc(AccountLogEnum.getChangeTypeDesc(item.getChangeType())); + String symbol = item.getAction().equals(AccountLogEnum.DEC.getCode()) ? "-" : "+"; + vo.setChangeAmountDesc(symbol + item.getChangeAmount()); + vo.setCreateTime(TimeUtils.timestampToDate(item.getCreateTime())); + list.add(vo); + } + + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list); + } +} diff --git a/yj-front/src/main/java/com/yj/front/service/impl/UserServiceImpl.java b/yj-front/src/main/java/com/yj/front/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..0ec1530 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/impl/UserServiceImpl.java @@ -0,0 +1,486 @@ +package com.yj.front.service.impl; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; +import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; +import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; +import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yj.common.config.GlobalConfig; +import com.yj.common.entity.user.User; +import com.yj.common.entity.user.UserAuth; +import com.yj.common.enums.ClientEnum; +import com.yj.common.enums.NoticeEnum; +import com.yj.common.enums.UserEnum; +import com.yj.common.exception.OperateException; +import com.yj.common.mapper.user.UserAuthMapper; +import com.yj.common.mapper.user.UserMapper; +import com.yj.common.plugin.notice.NoticeCheck; +import com.yj.common.plugin.wechat.WxMnpDriver; +import com.yj.common.util.*; +import com.yj.front.LikeFrontThreadLocal; +import com.yj.front.service.IUserService; +import com.yj.front.validate.users.*; +import com.yj.front.vo.user.UserCenterVo; +import com.yj.front.vo.user.UserInfoVo; +import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpService; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.util.Map; + +/** + * 用户服务实现类 + */ +@Service +public class UserServiceImpl implements IUserService { + + @Resource + UserMapper userMapper; + + @Resource + UserAuthMapper userAuthMapper; + + /** + * 个人中心 + * + * @author fzr + * @param userId 用户ID + * @return UserCenterVo + */ + @Override + public UserCenterVo center(Integer userId, Integer terminal) { + User user = userMapper.selectOne(new QueryWrapper() + .select("id,sn,sex,account,nickname,real_name,avatar,mobile,create_time,is_new_user,user_money,password") + .eq("id", userId).isNull("delete_time") + .last("limit 1")); + + UserCenterVo vo = new UserCenterVo(); + BeanUtils.copyProperties(user, vo); + if (user.getAvatar().equals("")) { + String avatar = ConfigUtils.get("user", "defaultAvatar", ""); + vo.setAvatar(UrlUtils.toAbsoluteUrl(avatar)); + } else { + vo.setAvatar(UrlUtils.toAbsoluteUrl(user.getAvatar())); + } + +// vo.setIsAuth(false); +// if (terminal.equals(ClientEnum.OA.getCode()) || terminal.equals(ClientEnum.MNP.getCode()) || terminal.equals(ClientEnum.H5.getCode())) { + UserAuth userAuth = userAuthMapper.selectOne(new QueryWrapper() + .select("id,openid,terminal") + .eq("user_id", userId) + //.eq("terminal", terminal) + .last("limit 1")); + vo.setIsAuth(userAuth != null); + //} + + // 是否有设置登录密码 + vo.setHasPassword(StringUtils.isNotBlank(user.getPassword())); + vo.setCreateTime(TimeUtils.timestampToDate(user.getCreateTime())); + vo.setSex(UserEnum.getSexDesc(user.getSex())); + return vo; + } + + /** + * 个人信息 + * + * @author fzr + * @param userId 用户ID + * @return UserInfoVo + */ + @Override + public UserInfoVo info(Integer userId) { + User user = userMapper.selectOne(new QueryWrapper() + .select("id,sn,sex,account,password,nickname,real_name,avatar,mobile,create_time,user_money") + .eq("id", userId) + .last("limit 1")); + + UserAuth userAuth = userAuthMapper.selectOne(new QueryWrapper() + .select("id,openid") + .eq("user_id", userId) + .last("limit 1")); + + UserInfoVo vo = new UserInfoVo(); + BeanUtils.copyProperties(user, vo); + vo.setHasPassword(!user.getPassword().equals("")); + vo.setHasAuth(userAuth != null); + vo.setVersion(GlobalConfig.version); + vo.setSex(UserEnum.getSexDesc(user.getSex())); + vo.setCreateTime(TimeUtils.timestampToDate(user.getCreateTime())); + + if (!user.getAvatar().equals("")) { + vo.setAvatar(UrlUtils.toAbsoluteUrl(user.getAvatar())); + } else { + String avatar = ConfigUtils.get("user", "defaultAvatar", ""); + vo.setAvatar(UrlUtils.toAbsoluteUrl(avatar)); + } + + return vo; + } + + /** + * 编辑信息 + * + * @author fzr + * @param updateValidate 参数 + * @param userId 用户ID + */ + @Override + public void setInfo(UserUpdateValidate updateValidate, Integer userId) { + String field = updateValidate.getField(); + String value = updateValidate.getValue(); + + switch (field) { + case "avatar": + User avatarUser = new User(); + avatarUser.setId(userId); + avatarUser.setAvatar(UrlUtils.toRelativeUrl(value)); + avatarUser.setUpdateTime(System.currentTimeMillis() / 1000); + userMapper.updateById(avatarUser); + break; + case "account": + User usernameUser = userMapper.selectOne(new QueryWrapper() + .select("id,account") + .eq("account", value) + .isNull("delete_time") + .last("limit 1")); + + if (StringUtils.isNotNull(usernameUser) && !usernameUser.getId().equals(userId)) { + throw new OperateException("账号已被使用!"); + } + + if (StringUtils.isNotNull(usernameUser) && usernameUser.getAccount().equals(value)) { + throw new OperateException("新账号与旧账号一致,修改失败!"); + } + + User u = new User(); + u.setId(userId); + u.setAccount(value); + u.setUpdateTime(System.currentTimeMillis() / 1000); + userMapper.updateById(u); + break; + case "nickname": + User nicknameUser = new User(); + nicknameUser.setId(userId); + nicknameUser.setNickname(value); + nicknameUser.setUpdateTime(System.currentTimeMillis() / 1000); + userMapper.updateById(nicknameUser); + break; + case "sex": + User sexUser = new User(); + sexUser.setId(userId); + sexUser.setSex(Integer.parseInt(value)); + sexUser.setUpdateTime(System.currentTimeMillis() / 1000); + userMapper.updateById(sexUser); + break; + default: + throw new OperateException("不被支持的类型"); + } + } + + /** + * 修改密码 + * + * @author fzr + * @param password 新密码 + * @param userId 用户ID + */ + @Override + public void changePwd(String password, String oldPassword, Integer userId) { + User user = userMapper.selectOne(new QueryWrapper() + .select("id,password") + .eq("id", userId) + .isNull("delete_time") + .last("limit 1")); + + Assert.notNull(user, "用户不存在"); + + if (!user.getPassword().equals("")) { + Assert.notNull(oldPassword, "oldPassword参数缺失"); + String oldPwd = ToolUtils.makePassword(oldPassword.trim()); + if (!oldPwd.equals(user.getPassword())) { + throw new OperateException("原密码不正确!"); + } + } + + String pwd = ToolUtils.makePassword(password.trim()); + + User u = new User(); + u.setId(userId); + u.setPassword(pwd); + u.setUpdateTime(System.currentTimeMillis() / 1000); + userMapper.updateById(u); + } + + /** + * 忘记密码 + * + * @author fzr + * @param password 新密码 + * @param mobile 手机号 + * @param code 验证码 + */ + @Override + public void forgotPwd(String password, String mobile, String code) { + // 校验验证码 + int sceneCode = NoticeEnum.FIND_LOGIN_PASSWORD_CAPTCHA.getCode(); + if (!NoticeCheck.verify(sceneCode, code, mobile)) { + throw new OperateException("验证码错误!"); + } + + // 查询手机号 + User user = userMapper.selectOne(new QueryWrapper() + .select("id,account,mobile,is_disable") + .isNull("delete_time") + .eq("mobile", mobile) + .last("limit 1")); + + // 验证账号 + com.baomidou.mybatisplus.core.toolkit.Assert.notNull(user, "账号不存在!"); + +// String salt = ToolUtils.randomString(5); + String pwd = ToolUtils.makePassword(password.trim()); + + // 更新密码 + user.setPassword(pwd); + user.setUpdateTime(System.currentTimeMillis() / 1000); + userMapper.updateById(user); + } + + /** + * 绑定手机 + * + * @author fzr + * @param mobileValidate 参数 + * @param userId 用户ID + */ + @Override + public void bindMobile(UserPhoneBindValidate mobileValidate, Integer userId) { + String type = mobileValidate.getType(); + String mobile = mobileValidate.getMobile(); + String code = mobileValidate.getCode().toLowerCase(); + + // 校验验证码 +// int sceneCode = type.equals("bind") ? NoticeEnum.BIND_MOBILE_CAPTCHA.getCode() : NoticeEnum.CHANGE_MOBILE_CAPTCHA.getCode() ; +// if (!NoticeCheck.verify(sceneCode, code, mobile)) { +// throw new OperateException("验证码错误!"); +// } + + User user = userMapper.selectOne(new QueryWrapper() + .select("id,account,mobile") + .eq("mobile", mobile) + .isNull("delete_time") + .last("limit 1")); + + if (StringUtils.isNotNull(user) && user.getId().equals(userId) == false) { + throw new OperateException("手机号已被其它账号绑定!"); + } + + User u = new User(); + u.setId(userId); + u.setMobile(mobile); + u.setUpdateTime(System.currentTimeMillis() / 1000); + userMapper.updateById(u); + } + + /** + * 微信手机号 + * + * @author fzr + * @param code 获取手机号的Code + */ + @Override + public void mnpMobile(String code) { + Map config = ConfigUtils.get("mnp_setting"); + WxMaService wxMaService = new WxMaServiceImpl(); + WxMaDefaultConfigImpl wxConfig = new WxMaDefaultConfigImpl(); + wxConfig.setSecret(config.getOrDefault("app_secret", "")); + wxConfig.setAppid(config.getOrDefault("app_id", "")); + wxMaService.setWxMaConfig(wxConfig); + + try { + WxMaPhoneNumberInfo wxMaPhoneNumberInfo = wxMaService.getUserService().getNewPhoneNoInfo(code); + + Integer userId = LikeFrontThreadLocal.getUserId(); + + User userCheck = userMapper.selectOne(new QueryWrapper() + .select("id,account,mobile") + .eq("mobile", wxMaPhoneNumberInfo.getPhoneNumber()) + .isNull("delete_time") + .last("limit 1")); + + if (StringUtils.isNotNull(userCheck) && userCheck.getId().equals(userId) == false) { + throw new OperateException("手机号已被其它账号绑定!"); + } + + User user = new User(); + user.setId(userId); + user.setMobile(wxMaPhoneNumberInfo.getPhoneNumber()); + user.setUpdateTime(System.currentTimeMillis() / 1000); + userMapper.updateById(user); + } catch (WxErrorException e) { + throw new OperateException(e.getError().getErrorCode() + ", " + e.getError().getErrorMsg()); + } + } + + + /** + * 更新新用户昵称头像等信息 + * + * @param newUserUpdateValidate 参数 + * @param userId 用户id + */ + @Override + public void updateNewUserInfo(NewUserUpdateValidate newUserUpdateValidate, Integer userId) { + User user = new User(); + user.setId(userId); + user.setNickname(newUserUpdateValidate.getNickname()); + user.setAvatar(UrlUtils.toRelativeUrl(newUserUpdateValidate.getAvatar())); + user.setIsNewUser(0); + user.setUpdateTime(System.currentTimeMillis() / 1000); + userMapper.updateById(user); + } + + /** + * 绑定小程序 + * + * @param bindMnpValidate 参数 + * @param userId 用户ID + */ + @Override + public void bindMnp(UserBindWechatValidate bindMnpValidate, Integer userId) { + try { + // 通过code获取微信信息 + String code = bindMnpValidate.getCode(); + WxMaService wxMaService = WxMnpDriver.mnp(); + WxMaJscode2SessionResult sessionResult = wxMaService.getUserService().getSessionInfo(code); + String openId = sessionResult.getOpenid(); + String uniId = sessionResult.getUnionid(); + String unionId = uniId == null ? "0" : uniId; + + // 授权校验,未授权创建授权,已授权返回 + bindWechatAuth(openId, unionId, ClientEnum.MNP.getCode(), userId); + + } catch (WxErrorException e) { + throw new OperateException(e.getError().getErrorCode() + ", " + e.getError().getErrorMsg()); + } + } + + /** + * 绑定公众号 + * + * @param bindOaValidate 参数 + * @param userId 用户ID + */ + @Override + public void bindOa(UserBindWechatValidate bindOaValidate, Integer userId) { + try { + // 通过code获取微信信息 + WxMpService wxMpService = WxMnpDriver.oa(); + WxOAuth2AccessToken wxOAuth2AccessToken = wxMpService.getOAuth2Service().getAccessToken(bindOaValidate.getCode()); + String uniId = wxOAuth2AccessToken.getUnionId(); + String openId = wxOAuth2AccessToken.getOpenId(); + String unionId = uniId == null ? "0" : uniId; + Integer terminal = LikeFrontThreadLocal.getTerminal(); + String key = bindOaValidate.getKey(); + + // 授权校验,未授权创建授权,已授权返回 + bindWechatAuth(openId, unionId, terminal, userId); + + } catch (WxErrorException e) { + throw new OperateException(e.getError().getErrorCode() + ", " + e.getError().getErrorMsg()); + } + } + + @Override + @Transactional + public void resetPassword(ResetPasswordValidate passwordValidate) { + String code = passwordValidate.getCode(); + String mobile = passwordValidate.getMobile(); + String password = passwordValidate.getPassword(); + // 校验验证码 + int sceneCode = NoticeEnum.FIND_LOGIN_PASSWORD_CAPTCHA.getCode(); + if (!NoticeCheck.verify(sceneCode, code, mobile)) { + throw new OperateException("验证码错误!"); + } + + // 查询手机号 + User user = userMapper.selectOne(new QueryWrapper() + .select("id,account,mobile,is_disable") + .isNull("delete_time") + .eq("mobile", mobile) + .last("limit 1")); + + // 验证账号 + com.baomidou.mybatisplus.core.toolkit.Assert.notNull(user, "账号不存在!"); + + String pwd = ToolUtils.makePassword(password.trim()); + + // 更新密码 + user.setPassword(pwd); + user.setUpdateTime(System.currentTimeMillis() / 1000); + userMapper.updateById(user); + } + + /** + * 绑定微信授权 + * + * @param openId openId + * @param unionId unionId + * @param terminal 客户端端 + * @param userId 用户ID + */ + public void bindWechatAuth(String openId, String unionId, Integer terminal, Integer userId) { + // 授权表中查找授权记录 + UserAuth userAuthOpenId = userAuthMapper.selectOne(new QueryWrapper() + .eq("openid", openId) + .last("limit 1")); + + if (userAuthOpenId != null) { + // 该微信已绑定 + throw new OperateException("该微信已绑定"); + } + + // 已有授权,返回已绑定微信。 没有授权,绑定微信 + if (!StringUtils.isBlank(unionId)) { + if (unionId.equals("0") == false) { + UserAuth userAuthUnionId = userAuthMapper.selectOne(new QueryWrapper() + .eq("unionid", unionId) + .last("limit 1")); + + if (userAuthUnionId != null && !userId.equals(userAuthUnionId.getUserId())) { + // 该微信已绑定 + throw new OperateException("该微信已绑定"); + } + } + } + + if (StringUtils.isNotNull(unionId)) { + if (unionId.equals("0") == false) { + //在用unionid找记录,防止生成两个账号,同个unionid的问题 + UserAuth userAuth = userAuthMapper.selectOne(new QueryWrapper() + .eq("unionid", unionId) + .last("limit 1")); + if (StringUtils.isNotNull(userAuth)) { + throw new OperateException("该微信已被绑定"); + } + } + } + + // 记录微信授权 + UserAuth authModel = new UserAuth(); + authModel.setUserId(userId); + authModel.setUnionid(unionId); + authModel.setOpenid(openId); + authModel.setTerminal(terminal); + authModel.setCreateTime(System.currentTimeMillis() / 1000); + authModel.setUpdateTime(System.currentTimeMillis() / 1000); + userAuthMapper.insert(authModel); + } + +} diff --git a/yj-front/src/main/java/com/yj/front/service/impl/WechatServiceImpl.java b/yj-front/src/main/java/com/yj/front/service/impl/WechatServiceImpl.java new file mode 100644 index 0000000..6819482 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/service/impl/WechatServiceImpl.java @@ -0,0 +1,55 @@ +package com.yj.front.service.impl; + +import com.alibaba.fastjson2.JSONArray; +import com.yj.common.enums.ErrorEnum; +import com.yj.common.exception.OperateException; +import com.yj.common.plugin.wechat.WxMnpDriver; +import com.yj.common.util.ConfigUtils; +import com.yj.front.service.IWechatService; +import org.springframework.stereotype.Service; + +import java.util.*; + +@Service +public class WechatServiceImpl implements IWechatService { + + @Override + public Map jsConfig(String url) throws Exception { + try { + String appId = ConfigUtils.get("oa_setting", "app_id"); + String accessToken = WxMnpDriver.oa().getAccessToken(); + String jsapiTicket = WxMnpDriver.getJsSdkGetTicket(accessToken); + String timestamp = Long.toString(System.currentTimeMillis() / 1000); + String nonceStr = UUID.randomUUID().toString(); + String signature = WxMnpDriver.buildJSSDKSignature(jsapiTicket,timestamp,nonceStr,url); + + List array = Arrays.asList( + "onMenuShareTimeline", + "onMenuShareAppMessage", + "onMenuShareQQ", + "onMenuShareWeibo", + "onMenuShareQZone", + "openLocation", + "getLocation", + "chooseWXPay", + "updateAppMessageShareData", + "updateTimelineShareData", + "openAddress", + "scanQRCode"); + + Map map = new HashMap<>(); + map.put("url", url); + map.put("jsapi_ticket", jsapiTicket); + map.put("nonceStr", nonceStr); + map.put("timestamp", timestamp); + map.put("signature", signature); + map.put("appId", appId); + map.put("jsApiList", array); + map.put("openTagList", new JSONArray()); + map.put("debug", false); + return map; + } catch (Exception e) { + throw new OperateException(e.getMessage(), ErrorEnum.FAILED.getCode(), -1); + } + } +} diff --git a/yj-front/src/main/java/com/yj/front/validate/PaymentValidate.java b/yj-front/src/main/java/com/yj/front/validate/PaymentValidate.java new file mode 100644 index 0000000..a72ddaa --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/validate/PaymentValidate.java @@ -0,0 +1,53 @@ +package com.yj.front.validate; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel("预支付订单参数") +public class PaymentValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + //@NotNull(message = "scene参数缺失") + @ApiModelProperty("支付场景: [recharge=充值,order=普通订单]") + private String scene; + + @NotNull(message = "payWay参数缺失") + @ApiModelProperty("支付方式: [1=余额支付,2=微信支付,3=支付宝支付]") + private Integer payWay; + + @NotNull(message = "orderId参数缺失") + @ApiModelProperty("订单ID") + private Integer orderId; + + @ApiModelProperty(value = "重定向链接: H5端需要") + private String redirect; + + @ApiModelProperty(value = "用户ID", notes = "该参数无需传递") + private Integer userId; + + @ApiModelProperty(value = "订单类型", notes = "该参数无需传递") + private String attach; + + @ApiModelProperty(value = "订单编号", notes = "该参数无需传递") + private String outTradeNo; + + @ApiModelProperty(value = "订单金额", notes = "该参数无需传递") + private BigDecimal orderAmount; + + @ApiModelProperty(value = "用户描述", notes = "该参数无需传递") + private String description; + + @ApiModelProperty(value = "Terminal") + private Integer Terminal; + + @ApiModelProperty(value = "微信授权code") + private String code; + +} diff --git a/yj-front/src/main/java/com/yj/front/validate/RechargeValidate.java b/yj-front/src/main/java/com/yj/front/validate/RechargeValidate.java new file mode 100644 index 0000000..6b979e9 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/validate/RechargeValidate.java @@ -0,0 +1,19 @@ +package com.yj.front.validate; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel("新用户更新信息参数") +public class RechargeValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "money参数缺失") + private BigDecimal money; + +} diff --git a/yj-front/src/main/java/com/yj/front/validate/article/ArticleCollectValidate.java b/yj-front/src/main/java/com/yj/front/validate/article/ArticleCollectValidate.java new file mode 100644 index 0000000..68e1390 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/validate/article/ArticleCollectValidate.java @@ -0,0 +1,22 @@ +package com.yj.front.validate.article; + +import com.yj.common.validator.annotation.IDMust; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("文章收藏参数") +public class ArticleCollectValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "articleId参数缺失") + @IDMust(message = "articleId参数必须大于0") + @ApiModelProperty(value = "文章ID", required = true) + private Integer id; + +} diff --git a/yj-front/src/main/java/com/yj/front/validate/article/ArticleSearchValidate.java b/yj-front/src/main/java/com/yj/front/validate/article/ArticleSearchValidate.java new file mode 100644 index 0000000..4fd1ea1 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/validate/article/ArticleSearchValidate.java @@ -0,0 +1,27 @@ +package com.yj.front.validate.article; + +import com.yj.common.validator.annotation.StringContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import java.io.Serializable; + +@Data +@ApiModel("文章搜索参数") +public class ArticleSearchValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer cid; + + @Length(max = 100, message = "关键词过长了") + @ApiModelProperty(value = "关键词") + private String keyword; + + @StringContains(values = {"hot", "new", "default"}) + @ApiModelProperty(value = "排序号") + private String sort; + +} diff --git a/yj-front/src/main/java/com/yj/front/validate/common/PageValidate.java b/yj-front/src/main/java/com/yj/front/validate/common/PageValidate.java new file mode 100644 index 0000000..40c61c7 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/validate/common/PageValidate.java @@ -0,0 +1,25 @@ +package com.yj.front.validate.common; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import javax.validation.constraints.DecimalMax; +import javax.validation.constraints.DecimalMin; +import java.io.Serializable; + +@Data +@ApiModel("分页参数") +public class PageValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + // 当前分页 + @DecimalMin(value = "1", message = "pageNo参数必须大于0的数字") + public Integer page_no = 1; + + // 每页条数 + @DecimalMin(value = "1", message = "pageSize参数必须是大于0的数字") + @DecimalMax(value = "60", message = "pageSize参数必须是小于60的数字") + private Integer page_size = 20; + +} diff --git a/yj-front/src/main/java/com/yj/front/validate/common/SmsValidate.java b/yj-front/src/main/java/com/yj/front/validate/common/SmsValidate.java new file mode 100644 index 0000000..5f49ea7 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/validate/common/SmsValidate.java @@ -0,0 +1,30 @@ +package com.yj.front.validate.common; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import java.io.Serializable; + +@Data +@ApiModel("短信发送参数") +public class SmsValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "scene参数缺失") + @ApiModelProperty(value = "场景码") + private String scene; + + @NotNull(message = "mobile参数缺失") + @NotEmpty(message = "手机号不能为空") + @Length(min = 11, max = 11, message = "手机号只能为11位") + @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手机号格式有误") + @ApiModelProperty(value = "手机号") + private String mobile; + +} diff --git a/yj-front/src/main/java/com/yj/front/validate/login/LoginCodeValidate.java b/yj-front/src/main/java/com/yj/front/validate/login/LoginCodeValidate.java new file mode 100644 index 0000000..5e2407e --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/validate/login/LoginCodeValidate.java @@ -0,0 +1,20 @@ +package com.yj.front.validate.login; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +@ApiModel("微信登录参数") +public class LoginCodeValidate { + + @NotNull(message = "code参数缺失") + @ApiModelProperty(value = "微信code", required = true) + private String code; + + @ApiModelProperty(value = "终端") + private Integer terminal; + +} diff --git a/yj-front/src/main/java/com/yj/front/validate/login/LoginPhoneValidate.java b/yj-front/src/main/java/com/yj/front/validate/login/LoginPhoneValidate.java new file mode 100644 index 0000000..e2219d7 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/validate/login/LoginPhoneValidate.java @@ -0,0 +1,29 @@ +package com.yj.front.validate.login; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; + +@Data +@ApiModel("手机号登录参数") +public class LoginPhoneValidate { + + @NotNull(message = "mobile参数缺失") + @NotEmpty(message = "手机号不能为空") + @Length(min = 11, max = 11, message = "手机号只能为11位") + @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手机号格式有误") + @ApiModelProperty(value = "手机号", required = true) + private String mobile; + + @NotNull(message = "code参数缺失") + @NotEmpty(message = "code不能为空") + @Length(min = 4, max = 6, message = "验证码长度不符合") + @ApiModelProperty(value = "验证码", required = true) + private String code; + +} diff --git a/yj-front/src/main/java/com/yj/front/validate/login/LoginPwdValidate.java b/yj-front/src/main/java/com/yj/front/validate/login/LoginPwdValidate.java new file mode 100644 index 0000000..173221e --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/validate/login/LoginPwdValidate.java @@ -0,0 +1,31 @@ +package com.yj.front.validate.login; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@Data +@ApiModel("账号登录参数") +public class LoginPwdValidate { + + @NotNull(message = "username参数缺失") + @NotEmpty(message = "账号不能为空") + @ApiModelProperty(value = "登录账号", required = true) + private String account; + + @ApiModelProperty(value = "登录密码") + private String password; + + @ApiModelProperty(value = "验证码登录") + private String code; + + @ApiModelProperty(value = "终端") + private Integer scene; + + + @ApiModelProperty(value = "终端") + private Integer terminal; +} diff --git a/yj-front/src/main/java/com/yj/front/validate/login/LoginScanValidate.java b/yj-front/src/main/java/com/yj/front/validate/login/LoginScanValidate.java new file mode 100644 index 0000000..c41dfae --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/validate/login/LoginScanValidate.java @@ -0,0 +1,27 @@ +package com.yj.front.validate.login; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("扫码登录验证") +public class LoginScanValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "code参数缺失") + @NotEmpty(message = "code不能为空") + @ApiModelProperty(value = "微信code", required = true) + private String code; + + @NotNull(message = "二维码已失效或不存在,请重新操作") + @NotEmpty(message = "二维码已失效或不存在,请重新操作") + @ApiModelProperty(value = "state码", required = true) + private String state; + +} diff --git a/yj-front/src/main/java/com/yj/front/validate/login/RegisterValidate.java b/yj-front/src/main/java/com/yj/front/validate/login/RegisterValidate.java new file mode 100644 index 0000000..e492cf9 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/validate/login/RegisterValidate.java @@ -0,0 +1,34 @@ +package com.yj.front.validate.login; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import java.io.Serializable; + +@Data +@ApiModel("注册账号参数") +public class RegisterValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "账号缺失") + @NotEmpty(message = "账号不能为空") + @Length(min = 3, max = 12, message = "账号必须在3~12个字符内") + @Pattern(message = "账号应该为3-12位数字、字母组合", regexp="^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{3,12}$") + @ApiModelProperty(value = "登录账号", required = true) + private String account; + + @NotNull(message = "password参数缺失") + @NotEmpty(message = "密码不能为空") + @Length(min = 6, max = 12, message = "密码必须在6~12个字符内") + @ApiModelProperty(value = "登录密码", required = true) + private String password; + + @ApiModelProperty(value = "终端") + private Integer terminal; +} diff --git a/yj-front/src/main/java/com/yj/front/validate/users/NewUserUpdateValidate.java b/yj-front/src/main/java/com/yj/front/validate/users/NewUserUpdateValidate.java new file mode 100644 index 0000000..26e7fc4 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/validate/users/NewUserUpdateValidate.java @@ -0,0 +1,24 @@ +package com.yj.front.validate.users; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("新用户更新信息参数") +public class NewUserUpdateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "昵称参数缺失") + @ApiModelProperty(value = "昵称", required = true) + private String nickname; + + @NotNull(message = "头像参数缺失") + @ApiModelProperty(value = "头像", required = true) + private String avatar; + +} diff --git a/yj-front/src/main/java/com/yj/front/validate/users/ResetPasswordValidate.java b/yj-front/src/main/java/com/yj/front/validate/users/ResetPasswordValidate.java new file mode 100644 index 0000000..47acb77 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/validate/users/ResetPasswordValidate.java @@ -0,0 +1,34 @@ +package com.yj.front.validate.users; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import java.io.Serializable; + +@Data +@ApiModel("修改密码参数") +public class ResetPasswordValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "password参数缺失") + @Pattern(message = "密码必须是6-20字母+数字组合!", regexp="^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$") + @ApiModelProperty(value = "新密码", required = true) + private String password; + + @NotNull(message = "请确认密码") + @Pattern(message = "确认密码密码必须是6-20字母+数字组合!", regexp="^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$") + @ApiModelProperty(value = "确认密码", required = true) + private String passwordConfirm; + + @NotNull(message = "验证码不能为空") + @ApiModelProperty(value = "code", required = true) + private String code; + + @NotNull(message = "手机号不能为空") + @ApiModelProperty(value = "mobile", required = true) + private String mobile; +} diff --git a/yj-front/src/main/java/com/yj/front/validate/users/UserAccountLogSearchValidate.java b/yj-front/src/main/java/com/yj/front/validate/users/UserAccountLogSearchValidate.java new file mode 100644 index 0000000..c1670ef --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/validate/users/UserAccountLogSearchValidate.java @@ -0,0 +1,17 @@ +package com.yj.front.validate.users; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("用户资金变更参数") +public class UserAccountLogSearchValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer userId; + private String type; + private Integer action; +} diff --git a/yj-front/src/main/java/com/yj/front/validate/users/UserBindWechatValidate.java b/yj-front/src/main/java/com/yj/front/validate/users/UserBindWechatValidate.java new file mode 100644 index 0000000..36fd5c1 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/validate/users/UserBindWechatValidate.java @@ -0,0 +1,22 @@ +package com.yj.front.validate.users; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("绑定微信小程序或公众号") +public class UserBindWechatValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "code参数缺失") + @ApiModelProperty(value = "微信code", required = true) + private String code; + + @ApiModelProperty(value = "key") + private String key; +} diff --git a/yj-front/src/main/java/com/yj/front/validate/users/UserChangePwdValidate.java b/yj-front/src/main/java/com/yj/front/validate/users/UserChangePwdValidate.java new file mode 100644 index 0000000..64ce4fc --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/validate/users/UserChangePwdValidate.java @@ -0,0 +1,32 @@ +package com.yj.front.validate.users; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import java.io.Serializable; + +@Data +@ApiModel("修改密码参数") +public class UserChangePwdValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "password参数缺失") + @Pattern(message = "密码必须是6-20字母+数字组合!", regexp="^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$") + @ApiModelProperty(value = "新密码", required = true) + private String password; + + @NotNull(message = "请确认密码") + @Pattern(message = "确认密码密码必须是6-20字母+数字组合!", regexp="^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$") + @ApiModelProperty(value = "确认密码", required = true) + private String passwordConfirm; + + @NotNull(message = "oldPassword参数缺失") + @NotNull(message = "旧密码不能为空") + @ApiModelProperty(value = "旧密码", required = true) + private String oldPassword=""; + +} diff --git a/yj-front/src/main/java/com/yj/front/validate/users/UserForgetPwdValidate.java b/yj-front/src/main/java/com/yj/front/validate/users/UserForgetPwdValidate.java new file mode 100644 index 0000000..467d6ab --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/validate/users/UserForgetPwdValidate.java @@ -0,0 +1,36 @@ +package com.yj.front.validate.users; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import java.io.Serializable; + +@Data +@ApiModel("忘记密码参数") +public class UserForgetPwdValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "mobile参数缺失") + @NotEmpty(message = "手机号不能为空") + @Length(min = 11, max = 11, message = "手机号只能为11位") + @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手机号格式有误") + @ApiModelProperty(value = "手机号", required = true) + private String mobile; + + @NotNull(message = "code参数缺失") + @NotEmpty(message = "验证码不能为空") + @ApiModelProperty(value = "验证码", required = true) + private String code; + + @NotNull(message = "password参数缺失") + @NotEmpty(message = "新密码不能为空") + @ApiModelProperty(value = "新密码", required = true) + private String password; + +} \ No newline at end of file diff --git a/yj-front/src/main/java/com/yj/front/validate/users/UserPhoneBindValidate.java b/yj-front/src/main/java/com/yj/front/validate/users/UserPhoneBindValidate.java new file mode 100644 index 0000000..5032359 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/validate/users/UserPhoneBindValidate.java @@ -0,0 +1,37 @@ +package com.yj.front.validate.users; + +import com.yj.common.validator.annotation.StringContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import java.io.Serializable; + +@Data +@ApiModel("绑定手机参数") +public class UserPhoneBindValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "type参数缺失") + @StringContains(values = {"bind", "change"}) + @ApiModelProperty(value = "操作类型", required = true, example = "bind=绑定,change=修改") + private String type; + + @NotNull(message = "mobile参数缺失") + @NotEmpty(message = "手机号不能为空") + @Length(min = 11, max = 11, message = "手机号只能为11位") + @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手机号格式有误") + @ApiModelProperty(value = "手机号", required = true) + private String mobile; + + @NotNull(message = "code参数缺失") + @NotEmpty(message = "验证码不能为空") + @ApiModelProperty(value = "验证码", required = true) + private String code; + +} diff --git a/yj-front/src/main/java/com/yj/front/validate/users/UserPhoneMnpValidate.java b/yj-front/src/main/java/com/yj/front/validate/users/UserPhoneMnpValidate.java new file mode 100644 index 0000000..d1e0ae5 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/validate/users/UserPhoneMnpValidate.java @@ -0,0 +1,20 @@ +package com.yj.front.validate.users; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("微信手机参数") +public class UserPhoneMnpValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "code参数缺失") + @ApiModelProperty(value = "微信code", required = true) + private String code; + +} diff --git a/yj-front/src/main/java/com/yj/front/validate/users/UserUpdateValidate.java b/yj-front/src/main/java/com/yj/front/validate/users/UserUpdateValidate.java new file mode 100644 index 0000000..2660ea2 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/validate/users/UserUpdateValidate.java @@ -0,0 +1,26 @@ +package com.yj.front.validate.users; + +import com.yj.common.validator.annotation.StringContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("用户更新参数") +public class UserUpdateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "field参数缺失") + @StringContains(values = {"avatar", "account", "nickname", "sex"}) + @ApiModelProperty(value = "操作字段", required = true, example = "avatar,account,nickname,sex") + private String field; + + @NotNull(message = "value参数缺失") + @ApiModelProperty(value = "变更的值", required = true) + private String value; + +} diff --git a/yj-front/src/main/java/com/yj/front/vo/RechargeConfigVo.java b/yj-front/src/main/java/com/yj/front/vo/RechargeConfigVo.java new file mode 100644 index 0000000..17ae3ba --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/vo/RechargeConfigVo.java @@ -0,0 +1,25 @@ +package com.yj.front.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel(value = "充值配置Vo") +public class RechargeConfigVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("是否开启充值: 0=否,1=是") + private Integer status; + + @ApiModelProperty("最低充值金额") + private BigDecimal minAmount; + + @ApiModelProperty("用户钱包") + private BigDecimal userMoney; + +} diff --git a/yj-front/src/main/java/com/yj/front/vo/RechargeRecordVo.java b/yj-front/src/main/java/com/yj/front/vo/RechargeRecordVo.java new file mode 100644 index 0000000..8f70e47 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/vo/RechargeRecordVo.java @@ -0,0 +1,31 @@ +package com.yj.front.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel(value = "充值记录Vo") +public class RechargeRecordVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "ID") + private Integer id; + + @ApiModelProperty(value = "金额") + private BigDecimal orderAmount; + + @ApiModelProperty(value = "描述") + private String tips; + + @ApiModelProperty(value = "操作") + private Integer action; + + @ApiModelProperty(value = "时间") + private String createTime; + +} diff --git a/yj-front/src/main/java/com/yj/front/vo/article/ArticleCateVo.java b/yj-front/src/main/java/com/yj/front/vo/article/ArticleCateVo.java new file mode 100644 index 0000000..34f0f49 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/vo/article/ArticleCateVo.java @@ -0,0 +1,21 @@ +package com.yj.front.vo.article; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel(value = "文章分类Vo") +public class ArticleCateVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "分类ID") + private Integer id; + + @ApiModelProperty(value = "分类名称") + private String name; + +} diff --git a/yj-front/src/main/java/com/yj/front/vo/article/ArticleCollectVo.java b/yj-front/src/main/java/com/yj/front/vo/article/ArticleCollectVo.java new file mode 100644 index 0000000..3f74a58 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/vo/article/ArticleCollectVo.java @@ -0,0 +1,53 @@ +package com.yj.front.vo.article; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel(value = "文章收藏Vo") +public class ArticleCollectVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "收藏主键") + private Integer id; + + @ApiModelProperty(value = "文章ID") + private Integer articleId; + + @ApiModelProperty(value = "文章标题") + private String title; + + @ApiModelProperty(value = "文章封面") + private String image; + + @ApiModelProperty(value = "文章简介") + private String desc; + + @ApiModelProperty(value = "是否显示:1-是.0-否") + private Integer isShow; + + @ApiModelProperty(value = "虚拟浏览量") + private Integer clickVirtual; + + @ApiModelProperty(value = "实际浏览量") + private Integer clickActual; + + @ApiModelProperty(value = "创建时间") + private Object createTime; + + @ApiModelProperty(value = "收集时间") + private Object collectTime; + +// @ApiModelProperty(value = "创建时间") +// @JsonProperty("create_time") +// private String createTimeStr; +// +// @ApiModelProperty(value = "收集时间") +// @JsonProperty("collect_time") +// private String collectTimeStr; +} diff --git a/yj-front/src/main/java/com/yj/front/vo/article/ArticleDetailVo.java b/yj-front/src/main/java/com/yj/front/vo/article/ArticleDetailVo.java new file mode 100644 index 0000000..d23e132 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/vo/article/ArticleDetailVo.java @@ -0,0 +1,47 @@ +package com.yj.front.vo.article; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel(value = "文章详情Vo") +public class ArticleDetailVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "文章ID") + private Integer id; + + @ApiModelProperty("摘要") + @JsonProperty(value = "abstract") + private String abstractField; + @ApiModelProperty(value = "文章作者") + private String author; + @ApiModelProperty(value = "分类ID") + private Integer cid; + @ApiModelProperty(value = "浏览数量") + private Integer click; + @ApiModelProperty(value = "文章标题") + private String title; + @ApiModelProperty(value = "是否收藏") + private Boolean collect; + @ApiModelProperty(value = "文章内容") + private String content; + @ApiModelProperty(value = "创建时间") + private String createTime; + @ApiModelProperty(value = "更新时间") + private String updateTime; + @ApiModelProperty("简介") + private String desc; + @ApiModelProperty(value = "文章封面") + private String image; + @ApiModelProperty("是否显示: [0=否, 1=是]") + private Integer isShow; + @ApiModelProperty(value = "排序编号") + private Integer sort; + +} diff --git a/yj-front/src/main/java/com/yj/front/vo/article/ArticleListedVo.java b/yj-front/src/main/java/com/yj/front/vo/article/ArticleListedVo.java new file mode 100644 index 0000000..b8917a9 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/vo/article/ArticleListedVo.java @@ -0,0 +1,39 @@ +package com.yj.front.vo.article; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel(value = "文章列表Vo") +public class ArticleListedVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "文章ID") + private Integer id; + + @ApiModelProperty(value = "分类ID") + private Integer cid; + + @ApiModelProperty(value = "文章标题") + private String title; + + @ApiModelProperty(value = "文章封面") + private String image; + + @ApiModelProperty(value = "文章简介") + private String desc; + + @ApiModelProperty(value = "浏览数量") + private Integer click; + + @ApiModelProperty(value = "是否收藏") + private Boolean collect; + + @ApiModelProperty(value = "创建时间") + private String createTime; + +} diff --git a/yj-front/src/main/java/com/yj/front/vo/article/PcArticleCenterVo.java b/yj-front/src/main/java/com/yj/front/vo/article/PcArticleCenterVo.java new file mode 100644 index 0000000..b0d688f --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/vo/article/PcArticleCenterVo.java @@ -0,0 +1,22 @@ +package com.yj.front.vo.article; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel(value = "PC资讯中心Vo") +public class PcArticleCenterVo implements Serializable { + + @ApiModelProperty(value = "ID") + private Integer id; + + @ApiModelProperty(value = "名称") + private String name; + + @ApiModelProperty(value = "文章") + private Object article; + +} diff --git a/yj-front/src/main/java/com/yj/front/vo/article/PcArticleDetailVo.java b/yj-front/src/main/java/com/yj/front/vo/article/PcArticleDetailVo.java new file mode 100644 index 0000000..1c1c1a7 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/vo/article/PcArticleDetailVo.java @@ -0,0 +1,55 @@ +package com.yj.front.vo.article; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel(value = "PC文章详情Vo") +public class PcArticleDetailVo implements Serializable { + + @ApiModelProperty(value = "文章ID") + private Integer id; + + @ApiModelProperty("摘要") + @JsonProperty(value = "abstract") + private String abstractField; + @ApiModelProperty(value = "文章作者") + private String author; + @ApiModelProperty(value = "分类名称") + private String cateName; + @ApiModelProperty(value = "分类ID") + private Integer cid; + @ApiModelProperty(value = "浏览数量") + private Integer click; + @ApiModelProperty(value = "文章标题") + private String title; + @ApiModelProperty(value = "是否收藏") + private Boolean collect; + @ApiModelProperty(value = "文章内容") + private String content; + @ApiModelProperty(value = "创建时间") + private String createTime; + @ApiModelProperty(value = "更新时间") + private String updateTime; + @ApiModelProperty("简介") + private String desc; + @ApiModelProperty(value = "文章封面") + private String image; + @ApiModelProperty("是否显示: [0=否, 1=是]") + private Integer isShow; + @ApiModelProperty(value = "排序编号") + private Integer sort; + @ApiModelProperty(value = "上一页") + private Object last; + @ApiModelProperty(value = "下一页") + private Object next; + @ApiModelProperty(value = "最新推荐") + @JsonProperty("new") + private Object news; + +} diff --git a/yj-front/src/main/java/com/yj/front/vo/decorateTabbar/DecorateTabbarVo.java b/yj-front/src/main/java/com/yj/front/vo/decorateTabbar/DecorateTabbarVo.java new file mode 100644 index 0000000..8434144 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/vo/decorateTabbar/DecorateTabbarVo.java @@ -0,0 +1,45 @@ +package com.yj.front.vo.decorateTabbar; + +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel(value = "底部导航服务Vo") +public class DecorateTabbarVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("导航名称") + private String name; + + @ApiModelProperty("未选图标") + private String selected; + + @ApiModelProperty("已选图标") + private String unselected; + + @ApiModelProperty("链接地址") + private JSONObject link; + + @ApiModelProperty("是否显示") + private Integer isShow; + + @ApiModelProperty("创建时间") + private String createTime; + + @ApiModelProperty("更新时间") + private String updateTime; + + +} diff --git a/yj-front/src/main/java/com/yj/front/vo/login/LoginTokenVo.java b/yj-front/src/main/java/com/yj/front/vo/login/LoginTokenVo.java new file mode 100644 index 0000000..762df4f --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/vo/login/LoginTokenVo.java @@ -0,0 +1,30 @@ +package com.yj.front.vo.login; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel(value = "系统登录Vo") +public class LoginTokenVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "用户ID") + private Integer id; + + @ApiModelProperty(value = "绑定手机") + private Boolean isBindMobile; + + @ApiModelProperty(value = "绑定手机") + private String mobile; + + @ApiModelProperty(value = "登录令牌") + private String token; + + @ApiModelProperty(value = "是否为新用户") + private Integer isNew; + +} diff --git a/yj-front/src/main/java/com/yj/front/vo/login/LoginUrlsVo.java b/yj-front/src/main/java/com/yj/front/vo/login/LoginUrlsVo.java new file mode 100644 index 0000000..002bfb8 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/vo/login/LoginUrlsVo.java @@ -0,0 +1,18 @@ +package com.yj.front.vo.login; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel(value = "跳转链接Vo") +public class LoginUrlsVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "http链接") + private String url; + +} diff --git a/yj-front/src/main/java/com/yj/front/vo/pay/PayStatusVo.java b/yj-front/src/main/java/com/yj/front/vo/pay/PayStatusVo.java new file mode 100644 index 0000000..0183df2 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/vo/pay/PayStatusVo.java @@ -0,0 +1,38 @@ +package com.yj.front.vo.pay; + +import com.alibaba.fastjson2.JSONObject; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.models.auth.In; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel(value = "支付状态Vo") +public class PayStatusVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "订单信息") + private JSONObject order; + @ApiModelProperty(value = "支付状态: [0=待支付, 1=已支付]") + private Integer payStatus; + +// @ApiModelProperty(value = "支付状态: [0=待支付, 1=已支付]") +// private String payWay; + +// @ApiModelProperty(value = "支付时间") +// private String payTime; + + @ApiModelProperty(value = "订单ID") + private Integer orderId; + +// @ApiModelProperty(value = "订单编号") +// private String orderSn; + +// @ApiModelProperty(value = "订单金额") +// private BigDecimal orderAmount; + +} diff --git a/yj-front/src/main/java/com/yj/front/vo/pay/PayWayInfoVo.java b/yj-front/src/main/java/com/yj/front/vo/pay/PayWayInfoVo.java new file mode 100644 index 0000000..1c57ada --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/vo/pay/PayWayInfoVo.java @@ -0,0 +1,32 @@ +package com.yj.front.vo.pay; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel(value = "支付方式信息Vo") +public class PayWayInfoVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "ID") + private Integer id; + + @ApiModelProperty(value = "名称") + private String name; + + @ApiModelProperty(value = "图标") + private String icon; + + @ApiModelProperty(value = "是否默认: [0=否, 1=是]") + private Integer isDefault; + + private String extra; + private Integer payWay; + private String remark; + private Integer sort; + +} diff --git a/yj-front/src/main/java/com/yj/front/vo/pay/PayWayListVo.java b/yj-front/src/main/java/com/yj/front/vo/pay/PayWayListVo.java new file mode 100644 index 0000000..6adcf11 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/vo/pay/PayWayListVo.java @@ -0,0 +1,21 @@ +package com.yj.front.vo.pay; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +@Data +@ApiModel(value = "支付方式列表Vo") +public class PayWayListVo implements Serializable { + + @ApiModelProperty(value = "订单金额") + private BigDecimal orderAmount; + + @ApiModelProperty(value = "方式列表") + private List lists; + +} diff --git a/yj-front/src/main/java/com/yj/front/vo/upload/UploadImagesVo.java b/yj-front/src/main/java/com/yj/front/vo/upload/UploadImagesVo.java new file mode 100644 index 0000000..71dc3d6 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/vo/upload/UploadImagesVo.java @@ -0,0 +1,19 @@ +package com.yj.front.vo.upload; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class UploadImagesVo implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer id; + private Integer cid; + private Integer type; + private String name; + private String url; + private String uri; + +} diff --git a/yj-front/src/main/java/com/yj/front/vo/user/UserAccountListVo.java b/yj-front/src/main/java/com/yj/front/vo/user/UserAccountListVo.java new file mode 100644 index 0000000..f76b884 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/vo/user/UserAccountListVo.java @@ -0,0 +1,39 @@ +package com.yj.front.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel(value = "用户资金变更Vo") +public class UserAccountListVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "用户ID") + private Integer id; + @ApiModelProperty("变动类型") + private Integer changeType; + + @ApiModelProperty("变动类型字符串") + private String typeDesc; + + @ApiModelProperty("变动数量") + private BigDecimal changeAmount; + + @ApiModelProperty("变动数量字符串") + private String changeAmountDesc; + + @ApiModelProperty("变动类型: [1=增加, 2=减少]") + private Integer action; + @ApiModelProperty("备注信息") + private String remark; + + @ApiModelProperty("创建时间") + private String createTime; + + +} diff --git a/yj-front/src/main/java/com/yj/front/vo/user/UserCenterVo.java b/yj-front/src/main/java/com/yj/front/vo/user/UserCenterVo.java new file mode 100644 index 0000000..d627289 --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/vo/user/UserCenterVo.java @@ -0,0 +1,55 @@ +package com.yj.front.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel(value = "个人中心Vo") +public class UserCenterVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "用户ID") + private Integer id; + + @ApiModelProperty(value = "用户编号") + private Integer sn; + @ApiModelProperty("用户头像") + private String avatar; + + @ApiModelProperty("真实姓名") + private String realName; + + @ApiModelProperty("用户昵称") + private String nickname; + + @ApiModelProperty("用户账号") + private String account; + + @ApiModelProperty("用户电话") + private String mobile; + + @ApiModelProperty("创建时间") + private String createTime; + + @ApiModelProperty("是否为新用户: [0=否, 1=是]") + private Integer isNewUser; + + @ApiModelProperty("有密码") + private Boolean hasPassword; + + @ApiModelProperty("用户性别: [1=男, 2=女]") + private String sex; + + @ApiModelProperty("用户钱包") + private BigDecimal userMoney; + + @ApiModelProperty("是否绑定微信") + private Boolean isAuth; + + +} diff --git a/yj-front/src/main/java/com/yj/front/vo/user/UserInfoVo.java b/yj-front/src/main/java/com/yj/front/vo/user/UserInfoVo.java new file mode 100644 index 0000000..872a5bf --- /dev/null +++ b/yj-front/src/main/java/com/yj/front/vo/user/UserInfoVo.java @@ -0,0 +1,57 @@ +package com.yj.front.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel(value = "个人信息Vo") +public class UserInfoVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "用户ID") + private Integer id; + + @ApiModelProperty(value = "用户编号") + private Integer sn; + @ApiModelProperty("用户头像") + private String avatar; + + @ApiModelProperty("真实姓名") + private String realName; + + @ApiModelProperty("用户昵称") + private String nickname; + + @ApiModelProperty("用户账号") + private String account; + + @ApiModelProperty("用户电话") + private String mobile; + + @ApiModelProperty("创建时间") + private String createTime; + + @ApiModelProperty("是否为新用户: [0=否, 1=是]") + private Integer isNewUser; + + @ApiModelProperty("有密码") + private Boolean hasPassword; + + @ApiModelProperty("用户性别: [1=男, 2=女]") + private String sex; + + @ApiModelProperty("用户钱包") + private BigDecimal userMoney; + + @ApiModelProperty("是否绑定微信") + private Boolean hasAuth; + + @ApiModelProperty("版本") + private String version; + +} diff --git a/yj-front/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/yj-front/src/main/resources/META-INF/additional-spring-configuration-metadata.json new file mode 100644 index 0000000..d216ccd --- /dev/null +++ b/yj-front/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -0,0 +1,19 @@ +{ + "properties": [ + { + "name": "like.upload-directory", + "type": "java.lang.String", + "description": "Description for like.upload-directory." + }, + { + "name": "like.swagger.enabled", + "type": "java.lang.String", + "description": "Description for like.swagger.enabled." + }, + { + "name": "like.swagger.pathMapping", + "type": "java.lang.String", + "description": "Description for like.swagger.pathMapping." + } + ] +} \ No newline at end of file diff --git a/yj-front/src/main/resources/application-dev-example.yml b/yj-front/src/main/resources/application-dev-example.yml new file mode 100644 index 0000000..61ec0e2 --- /dev/null +++ b/yj-front/src/main/resources/application-dev-example.yml @@ -0,0 +1,27 @@ +# 项目配置 +like: + upload-directory: /www/uploads/likeadmin-java/ # 上传目录 + +# 框架配置 +spring: + jackson: + property-naming-strategy: SNAKE_CASE #下划线返回值和获取值 + # 数据源配置 + datasource: + url: jdbc:mysql://localhost:3306/【库名称】?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false + type: com.zaxxer.hikari.HikariDataSource # 数据源类型 + driver-class-name: com.mysql.jdbc.Driver # MySql的驱动 + username: root # 数据库账号 + password: root # 数据库密码 + # Redis配置 + redis: + host: localhost # Redis服务地址 + port: 6379 # Redis端口 + password: # Redis密码 + database: 0 # 数据库索引 + + +# Mybatis-plus配置 【是否开启SQL日志输出】 +#mybatis-plus: +# configuration: +# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl \ No newline at end of file diff --git a/yj-front/src/main/resources/application.yml b/yj-front/src/main/resources/application.yml new file mode 100644 index 0000000..0e24cfe --- /dev/null +++ b/yj-front/src/main/resources/application.yml @@ -0,0 +1,86 @@ +# 项目配置 +like: + # 上传目录 + upload-directory: /www/uploads/likeadmin-java/ + # Swagger配置 + swagger: + # 是否开启swagger + enabled: true + # 请求前缀 + pathMapping: /dev-api + +# 服务配置 +server: + port: 8084 +# servlet: +# context-path: / + +# 框架配置 +spring: + profiles: + active: dev + mvc: + static-path-pattern: /api/static/** + throw-exception-if-no-handler-found: true + pathmatch: + matching-strategy: ant_path_matcher + # 数据源配置 + datasource: + url: jdbc:mysql://localhost:3306/local_likeadmin?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false + type: com.zaxxer.hikari.HikariDataSource # 数据源类型 + driver-class-name: com.mysql.jdbc.Driver # MySql的驱动 + username: root # 数据库账号 + password: root # 数据库密码 + hikari: + connection-timeout: 30000 # 等待连接分配连接的最大时长(毫秒),超出时长还没可用连接则发送SQLException,默认30秒 + minimum-idle: 5 # 最小连接数 + maximum-pool-size: 20 # 最大连接数 + auto-commit: true # 自动提交 + idle-timeout: 600000 # 连接超时的最大时长(毫秒),超时则被释放(retired),默认10分钟 + pool-name: DateSourceHikariCP # 连接池名称 + max-lifetime: 1800000 # 连接的生命时长(毫秒),超时而且没被使用则被释放,默认30分钟(1800000ms) + connection-init-sql: SELECT 1 # 连接时发起SQL测试脚本 + # 限制配置 + servlet: + multipart: + max-file-size: 100MB # 文件上传大小限制 + max-request-size: 100MB # 文件最大请求限制 + enabled: true + # Redis配置 + redis: + host: localhost # Redis服务地址 + port: 6379 # Redis端口 + password: # Redis密码 + database: 0 # 数据库索引 + timeout: 5000 # 连接超时 + lettuce: + pool: + max-wait: 30000 # 连接池最大阻塞等待时间(使用负数表示没有限制,默认-1) + max-active: 100 # 连接池最大连接数(使用负数表示没有限制,默认8) + max-idle: 20 # 连接池中的最大空闲连接(默认8) + min-idle: 0 # 连接池中的最小空闲连接(默认0) + +# Mybatis-plus配置 +mybatis-plus: + mapper-locations: classpath*:/mapper/**Mapper.xml + typeAliasesPackage: com.yj.**.mapper + global-config: + banner: false + db-config: + table-prefix: yj_ + configuration-properties: + prefix: yj_ + +# Sa-token配置 +sa-token: + token-name: token # token的名称 + timeout: 2592000 # token有效期单位s(默认30天,-1代表永不过期) + activity-timeout: -1 # token临时有效期(指定时间无操作掉线) + is-concurrent: true # 是否允许同一账号并发登录 + is-share: false # 多人同登账号共用token + token-style: random-64 # token生成的风格 + is-print: false # 打印版本字符画 + is-log: false # 是否输出操作日志 +ali: + pay: + order-notify-url: /api/pay/ali/notify/order \ No newline at end of file diff --git a/yj-front/src/main/resources/banner.txt b/yj-front/src/main/resources/banner.txt new file mode 100644 index 0000000..e6c8979 --- /dev/null +++ b/yj-front/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +/////////////////////////////////////////////////////// +// _ _ _ _ _ _ // +// | | (_) | __ / \ __| |_ __ ___ (_)_ __ // +// | | | | |/ / / _ \ / _` | '_ ` _ \| | '_ \ // +// | |___| | < / ___ \ (_| | | | | | | | | | | // +// |_____|_|_|\_\/_/ \_\__,_|_| |_| |_|_|_| |_| // +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // +// 佛祖保佑 永不宕机 永无BUG // +////////////////////////////////////////////////////// \ No newline at end of file diff --git a/yj-front/src/main/resources/log4j2-spring.xml b/yj-front/src/main/resources/log4j2-spring.xml new file mode 100644 index 0000000..fd0db18 --- /dev/null +++ b/yj-front/src/main/resources/log4j2-spring.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/yj-generator/pom.xml b/yj-generator/pom.xml new file mode 100644 index 0000000..5497e15 --- /dev/null +++ b/yj-generator/pom.xml @@ -0,0 +1,36 @@ + + + + + yunjiao-server + org.yj + 1.0.0 + + + 4.0.0 + yj-generator + + + + + + org.yj + yj-common + + + + commons-collections + commons-collections + 3.2.2 + + + + org.apache.velocity + velocity-engine-core + 2.3 + + + + \ No newline at end of file diff --git a/yj-generator/src/main/java/com/yj/generator/config/GenConfig.java b/yj-generator/src/main/java/com/yj/generator/config/GenConfig.java new file mode 100644 index 0000000..5343c9e --- /dev/null +++ b/yj-generator/src/main/java/com/yj/generator/config/GenConfig.java @@ -0,0 +1,20 @@ +package com.yj.generator.config; + +public class GenConfig { + + // 基础包名 + public static String packageName = "com.yj"; + + // 后台应用 + public static String adminPackage = "yj-admin/src/main/java/com/yj/admin"; + + // 公共应用 + public static String commonPackage = "yj-common/src/main/java/com/yj/common"; + + // 是否去除表前缀 + public static Boolean isRemoveTablePrefix = true; + + // 注释类型[top=顶, right=右] + public static String notesType = "right"; + +} diff --git a/yj-generator/src/main/java/com/yj/generator/constant/GenConstants.java b/yj-generator/src/main/java/com/yj/generator/constant/GenConstants.java new file mode 100644 index 0000000..8e7fe57 --- /dev/null +++ b/yj-generator/src/main/java/com/yj/generator/constant/GenConstants.java @@ -0,0 +1,23 @@ +package com.yj.generator.constant; + +public class GenConstants { + + /** UTF-8 字符集 */ + public static final String UTF8 = "UTF-8"; + + /** 单表 (增删改查) */ + public static final String TPL_CRUD = "crud"; + + /** 树表 (增删改查) */ + public static final String TPL_TREE = "tree"; + + /** 模糊查询 */ + public static final String QUERY_LIKE = "LIKE"; + + /** 相等查询 */ + public static final String QUERY_EQ = "="; + + /** 需要的 */ + public static final Integer REQUIRE = 1; + +} diff --git a/yj-generator/src/main/java/com/yj/generator/constant/HtmlConstants.java b/yj-generator/src/main/java/com/yj/generator/constant/HtmlConstants.java new file mode 100644 index 0000000..9e9d76c --- /dev/null +++ b/yj-generator/src/main/java/com/yj/generator/constant/HtmlConstants.java @@ -0,0 +1,29 @@ +package com.yj.generator.constant; + +public class HtmlConstants { + + /** 文本框 */ + public static final String HTML_INPUT = "input"; + + /** 文本域 */ + public static final String HTML_TEXTAREA = "textarea"; + + /** 下拉框 */ + public static final String HTML_SELECT = "select"; + + /** 单选框 */ + public static final String HTML_RADIO = "radio"; + + /** 日期控件 */ + public static final String HTML_DATETIME = "datetime"; + + /** 图片上传控件 */ + public static final String HTML_IMAGE_UPLOAD = "imageUpload"; + + /** 文件上传控件 */ + public static final String HTML_FILE_UPLOAD = "fileUpload"; + + /** 富文本控件 */ + public static final String HTML_EDITOR = "editor"; + +} diff --git a/yj-generator/src/main/java/com/yj/generator/constant/JavaConstants.java b/yj-generator/src/main/java/com/yj/generator/constant/JavaConstants.java new file mode 100644 index 0000000..567050a --- /dev/null +++ b/yj-generator/src/main/java/com/yj/generator/constant/JavaConstants.java @@ -0,0 +1,20 @@ +package com.yj.generator.constant; + +public class JavaConstants { + + /** 字符串类型 */ + public static final String TYPE_STRING = "String"; + + /** 整型 */ + public static final String TYPE_INTEGER = "Integer"; + + /** 长整型 */ + public static final String TYPE_LONG = "Long"; + + /** 高精度计算类型 */ + public static final String TYPE_BIG_DECIMAL = "BigDecimal"; + + /** 时间类型 */ + public static final String TYPE_DATE = "Date"; + +} diff --git a/yj-generator/src/main/java/com/yj/generator/constant/SqlConstants.java b/yj-generator/src/main/java/com/yj/generator/constant/SqlConstants.java new file mode 100644 index 0000000..fb6196c --- /dev/null +++ b/yj-generator/src/main/java/com/yj/generator/constant/SqlConstants.java @@ -0,0 +1,32 @@ +package com.yj.generator.constant; + +public class SqlConstants { + + /** 数据库字符串类型 */ + public static final String[] COLUMN_TYPE_STR = {"char", "varchar", "nvarchar", "varchar2"}; + + /** 数据库文本类型 */ + public static final String[] COLUMN_TYPE_TEXT = {"tinytext", "text", "mediumtext", "longtext"}; + + /** 数据库时间类型 */ + public static final String[] COLUMN_TYPE_TIME = {"datetime", "time", "date", "timestamp"}; + + /** 数据库数字类型 */ + public static final String[] COLUMN_TYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "number", "integer", "bit", "bigint", "float", "double", "decimal"}; + + /** 时间日期字段名 */ + public static final String[] COLUMN_TIME_NAME = {"create_time", "update_time", "delete_time", "start_time", "end_time"}; + + /** 页面不需要插入字段 */ + public static final String[] COLUMN_NAME_NOT_ADD = {"id", "is_delete", "create_time", "update_time", "delete_time"}; + + /** 页面不需要编辑字段 */ + public static final String[] COLUMN_NAME_NOT_EDIT = {"is_delete", "create_time", "update_time", "delete_time"}; + + /** 页面不需要列表字段 */ + public static final String[] COLUMN_NAME_NOT_LIST = {"id", "intro", "content", "is_delete", "delete_time"}; + + /** 页面不需要查询字段 */ + public static final String[] COLUMN_NAME_NOT_QUERY = {"is_delete", "create_time", "update_time", "delete_time"}; + +} diff --git a/yj-generator/src/main/java/com/yj/generator/controller/GenController.java b/yj-generator/src/main/java/com/yj/generator/controller/GenController.java new file mode 100644 index 0000000..eedb354 --- /dev/null +++ b/yj-generator/src/main/java/com/yj/generator/controller/GenController.java @@ -0,0 +1,213 @@ +package com.yj.generator.controller; + +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.yj.common.aop.NotPower; +import com.yj.common.core.AjaxResult; +import com.yj.common.core.PageResult; +import com.yj.common.exception.OperateException; +import com.yj.common.util.StringUtils; +import com.yj.common.util.YmlUtils; +import com.yj.common.validator.annotation.IDMust; +import com.yj.generator.service.IGenerateService; +import com.yj.generator.validate.GenParam; +import com.yj.generator.validate.PageParam; +import com.yj.generator.vo.DbColumnVo; +import com.yj.generator.vo.DbTableVo; +import com.yj.generator.vo.GenTableVo; +import org.apache.commons.io.IOUtils; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/adminapi/gen") +public class GenController { + + @Resource + IGenerateService iGenerateService; + + /** + * 库列表 + * + * @author fzr + * @param pageParam 分页参数 + * @param params 搜索参数 + * @return Object + */ + @GetMapping("/db") + public AjaxResult> db(@Validated PageParam pageParam, + @RequestParam Map params) { + PageResult list = iGenerateService.db(pageParam, params); + return AjaxResult.success(list); + } + + /** + * 所有库表 + * + * @author fzr + * @param params 搜索参数 + * @return Object + */ + @NotPower + @GetMapping("/dbAll") + public AjaxResult> dbAll(@RequestParam Map params) { + List list = iGenerateService.dbAll(params); + return AjaxResult.success(list); + } + + /** + * 根据表名查字段 + * + * @param tableName 表名 + * @return List + */ + @NotPower + @GetMapping("/dbColumn") + public AjaxResult> dbColumn(@RequestParam String tableName) { + List list = iGenerateService.dbColumn(tableName); + return AjaxResult.success(list); + } + + /** + * 生成列表 + * + * @author fzr + * @param pageParam 分页参数 + * @param params 搜索参数 + * @return Object + */ + @GetMapping("/list") + public AjaxResult> list(@Validated PageParam pageParam, + @RequestParam Map params) { + PageResult list = iGenerateService.list(pageParam, params); + return AjaxResult.success(list); + } + + /** + * 生成详情 + * + * @author fzr + * @param id 主键 + * @return Object + */ + @GetMapping("/detail") + public AjaxResult> detail(@Validated @IDMust() @RequestParam("id") Integer id) { + Map maps = iGenerateService.detail(id); + return AjaxResult.success(200, "成功", maps); + } + + /** + * 导入表结构 + * + * @param tables 参数 + * @return Object + */ + @PostMapping("/importTable") + public AjaxResult importTable(String tables) { + Assert.notNull(tables, "请选择要导入的表"); + String[] tableNames = tables.split(","); + iGenerateService.importTable(tableNames); + return AjaxResult.success("成功", 0); + } + + /** + * 编辑表结构 + * + * @author fzr + * @param genParam 参数 + * @return Object + */ + @PostMapping("/editTable") + public AjaxResult editTable(@Validated() @RequestBody GenParam genParam) { + iGenerateService.editTable(genParam); + return AjaxResult.success("成功", 0); + } + + /** + * 删除表结构 + * + * @author fzr + * @param genParam 参数 + * @return Object + */ + @PostMapping("/delTable") + public AjaxResult deleteTable(@Validated(value = GenParam.delete.class) @RequestBody GenParam genParam) { + iGenerateService.deleteTable(genParam.getIds()); + return AjaxResult.success("成功", 0); + } + + /** + * 同步表结构 + * + * @author fzr + * @param id 主键 + * @return Object + */ + @PostMapping("/syncTable") + public AjaxResult syncTable(@Validated @IDMust() @RequestParam("id") Integer id) { + iGenerateService.syncTable(id); + return AjaxResult.success("成功", 0); + } + + /** + * 预览代码 + * + * @author fzr + * @param id 主键 + * @return Object + */ + @GetMapping("/previewCode") + public AjaxResult> previewCode(@Validated @IDMust() @RequestParam("id") Integer id) { + Map map = iGenerateService.previewCode(id); + return AjaxResult.success(map); + } + + /** + * 生成代码 + * + * @author fzr + * @param tables 表名 + */ + @GetMapping("/genCode") + public AjaxResult genCode(String tables) { + String production = YmlUtils.get("like.production"); + if (StringUtils.isNotEmpty(production) && production.equals("true")) { + throw new OperateException("抱歉,演示环境不允许操作!"); + } + + Assert.notNull(tables, "请选择要生成的表"); + String[] tableNames = tables.split(","); + for (String tableName : tableNames) { + iGenerateService.genCode(tableName); + } + return AjaxResult.success(); + } + + /** + * 下载代码 + * + * @param response 响应对象 + * @param tables 表名 + * @throws IOException 异常 + */ + @GetMapping("/downloadCode") + public void downloadCode(HttpServletResponse response, String tables) throws IOException { + Assert.notNull(tables, "请选择要生成的表"); + String[] tableNames = tables.split(","); + byte[] data = iGenerateService.downloadCode(tableNames); + + response.reset(); + response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.setHeader("Content-Disposition", "attachment; filename=\"likeadmin-curd.zip\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + IOUtils.write(data, response.getOutputStream()); + } + +} diff --git a/yj-generator/src/main/java/com/yj/generator/entity/GenTable.java b/yj-generator/src/main/java/com/yj/generator/entity/GenTable.java new file mode 100644 index 0000000..c356552 --- /dev/null +++ b/yj-generator/src/main/java/com/yj/generator/entity/GenTable.java @@ -0,0 +1,41 @@ +package com.yj.generator.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serializable; + +/** + * 代码生成业务实体 + */ +@Data +public class GenTable implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + private Integer id; + private String tableName; + private String tableComment; + private String subTableName; + private String subTableFk; + private String subTableFr; + private String authorName; + private String entityName; + private String moduleName; + private String functionName; + private String treePrimary; + private String treeParent; + private String treeName; + private String genTpl; + private Integer genType; + private String genPath; + private Integer menuStatus; + private Integer menuPid; + private String menuName; + private String remarks; + private Long createTime; + private Long updateTime; + +} diff --git a/yj-generator/src/main/java/com/yj/generator/entity/GenTableColumn.java b/yj-generator/src/main/java/com/yj/generator/entity/GenTableColumn.java new file mode 100644 index 0000000..3e6a28c --- /dev/null +++ b/yj-generator/src/main/java/com/yj/generator/entity/GenTableColumn.java @@ -0,0 +1,40 @@ +package com.yj.generator.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serializable; + +/** + * 代码生成表列实体类 + */ +@Data +public class GenTableColumn implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + private Integer id; + private Integer tableId; + private String columnName; + private String columnComment; + private String columnLength; + private String columnType; + private String javaType; + private String javaField; + private Integer isPk; + private Integer isIncrement; + private Integer isRequired; + private Integer isInsert; + private Integer isEdit; + private Integer isList; + private Integer isQuery; + private String queryType; + private String htmlType; + private String dictType; + private Integer sort; + private Long createTime; + private Long updateTime; + +} diff --git a/yj-generator/src/main/java/com/yj/generator/mapper/GenTableColumnMapper.java b/yj-generator/src/main/java/com/yj/generator/mapper/GenTableColumnMapper.java new file mode 100644 index 0000000..55eb350 --- /dev/null +++ b/yj-generator/src/main/java/com/yj/generator/mapper/GenTableColumnMapper.java @@ -0,0 +1,12 @@ +package com.yj.generator.mapper; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.generator.entity.GenTableColumn; +import org.apache.ibatis.annotations.Mapper; + +/** + * 代码生成表列 + */ +@Mapper +public interface GenTableColumnMapper extends IBaseMapper { +} diff --git a/yj-generator/src/main/java/com/yj/generator/mapper/GenTableMapper.java b/yj-generator/src/main/java/com/yj/generator/mapper/GenTableMapper.java new file mode 100644 index 0000000..0b4bc33 --- /dev/null +++ b/yj-generator/src/main/java/com/yj/generator/mapper/GenTableMapper.java @@ -0,0 +1,97 @@ +package com.yj.generator.mapper; + +import com.yj.common.core.basics.IBaseMapper; +import com.yj.generator.entity.GenTable; +import com.yj.generator.entity.GenTableColumn; +import com.yj.generator.vo.DbTableVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; +import java.util.Map; + +/** + * 代码生成表 + */ +@Mapper +public interface GenTableMapper extends IBaseMapper { + + /** + * 查询库中的数据表 + * + * @author fzr + * @param params 参数 + * @return List> + */ + @Select({""}) + List selectDbTableList(Map params); + + /** + * 查询库中的数据表 + * + * @author fzr + * @param params 参数 + * @return List> + */ + @Select({""}) + List selectDbTableAllList(Map params); + + /** + * 根据表名集查询表 + * + * @author fzr + * @param tableNames 表名集 + * @return List> + */ + @Select({""}) + List selectDbTableListByNames(String[] tableNames); + + /** + * 根据表名查询列信息 + * + * @author fzr + * @param tableName 表名 + * @return List + */ + @Select({""}) + List selectDbTableColumnsByName(String tableName); + +} diff --git a/yj-generator/src/main/java/com/yj/generator/service/IGenerateService.java b/yj-generator/src/main/java/com/yj/generator/service/IGenerateService.java new file mode 100644 index 0000000..5748911 --- /dev/null +++ b/yj-generator/src/main/java/com/yj/generator/service/IGenerateService.java @@ -0,0 +1,121 @@ +package com.yj.generator.service; + +import com.yj.common.core.PageResult; +import com.yj.generator.validate.GenParam; +import com.yj.generator.validate.PageParam; +import com.yj.generator.vo.DbColumnVo; +import com.yj.generator.vo.DbTableVo; +import com.yj.generator.vo.GenTableVo; + +import java.util.List; +import java.util.Map; + +/** + * 代码生成接口服务类 + */ +public interface IGenerateService { + + /** + * 库列表 + * + * @author fzr + * @param pageParam 分页参数 + * @param params 搜索参数 + * @return PageResult> + */ + PageResult db(PageParam pageParam, Map params); + + /** + * 所有库表 + * + * @author fzr + * @param params 搜索参数 + * @return PageResult> + */ + List dbAll(Map params); + + /** + * 根据表名查字段 + * + * @param tableName 表名 + * @return List + */ + List dbColumn(String tableName); + + /** + * 生成列表 + * + * @author fzr + * @param pageParam 分页参数 + * @param params 搜索参数 + * @return Object + */ + PageResult list(PageParam pageParam, Map params); + + /** + * 生成详情 + * + * @author fzr + * @param id 主键 + * @return Object + */ + Map detail(Integer id); + + /** + * 导入表结构 + * + * @author fzr + * @param tableNames 参数 + */ + void importTable(String[] tableNames); + + /** + * 编辑表结构 + * + * @param genParam 参数 + * @author fzr + */ + void editTable(GenParam genParam); + + /** + * 删除表结构 + * + * @param ids 主键 + * @author fzr + */ + void deleteTable(List ids); + + /** + * 同步数据表 + * + * @param id 主键 + * @author fzr + */ + void syncTable(Integer id); + + /** + * 预览代码 + * + * @author fzr + * @return Map + */ + Map previewCode(Integer id); + + /** + * 生成代码 + * + * @author fzr + * @param tableName 表名 + */ + void genCode(String tableName); + + /** + * 下载代码 + * + * @author fzr + * @param tableNames 表名集合 + * @return Object + */ + byte[] downloadCode(String[] tableNames); + +} diff --git a/yj-generator/src/main/java/com/yj/generator/service/impl/GenerateServiceImpl.java b/yj-generator/src/main/java/com/yj/generator/service/impl/GenerateServiceImpl.java new file mode 100644 index 0000000..b1e1070 --- /dev/null +++ b/yj-generator/src/main/java/com/yj/generator/service/impl/GenerateServiceImpl.java @@ -0,0 +1,590 @@ +package com.yj.generator.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.pagehelper.PageHelper; +import com.yj.common.core.PageResult; + +import com.yj.common.entity.system.SystemMenu; +import com.yj.common.exception.OperateException; +import com.yj.common.mapper.system.SystemMenuMapper; +import com.yj.common.util.StringUtils; +import com.yj.common.util.TimeUtils; +import com.yj.generator.constant.GenConstants; +import com.yj.generator.entity.GenTable; +import com.yj.generator.entity.GenTableColumn; +import com.yj.generator.mapper.GenTableColumnMapper; +import com.yj.generator.mapper.GenTableMapper; +import com.yj.generator.service.IGenerateService; +import com.yj.generator.util.GenUtil; +import com.yj.generator.util.VelocityUtil; +import com.yj.generator.validate.GenParam; +import com.yj.generator.validate.PageParam; +import com.yj.generator.vo.DbColumnVo; +import com.yj.generator.vo.DbTableVo; +import com.yj.generator.vo.GenColumnVo; +import com.yj.generator.vo.GenTableVo; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * 代码生成器服务实现类 + */ +@Service +public class GenerateServiceImpl implements IGenerateService { + + private static final Logger log = LoggerFactory.getLogger(GenerateServiceImpl.class); + + @Resource + GenTableMapper genTableMapper; + + @Resource + GenTableColumnMapper genTableColumnMapper; + + @Resource + SystemMenuMapper systemAuthMenuMapper; + + /** + * 库列表 + * + * @author fzr + * @param pageParam 分页参数 + * @param params 搜索参数 + * @return PageResult> + */ + @Override + public PageResult db(PageParam pageParam, Map params) { + Integer page = pageParam.getPage_no(); + Integer limit = pageParam.getPage_size(); + + PageHelper.startPage(page, limit); + List tables = genTableMapper.selectDbTableList(params); + + for (DbTableVo vo : tables) { + if (vo.getUpdateTime() == null) { + vo.setUpdateTime(""); + } + } + + return PageResult.pageHelper(tables); + } + + /** + * 库列表 + * + * @author fzr + * @param params 搜索参数 + * @return PageResult> + */ + @Override + public List dbAll(Map params) { + List tables = genTableMapper.selectDbTableAllList(params); + for (DbTableVo vo : tables) { + if (vo.getUpdateTime() == null) { + vo.setUpdateTime(""); + } + } + + return tables; + } + + /** + * 根据表名查字段 + * + * @param tableName 表名 + * @return List + */ + @Override + public List dbColumn(String tableName) { + List columns = genTableMapper.selectDbTableColumnsByName(tableName); + + List list = new LinkedList<>(); + for (GenTableColumn col : columns) { + DbColumnVo vo = new DbColumnVo(); + vo.setColumnName(col.getColumnName()); + vo.setColumnType(col.getColumnType()); + vo.setColumnComment(col.getColumnComment()); + list.add(vo); + } + + return list; + } + + /** + * 生成列表 + * + * @param pageParam 分页参数 + * @param params 搜索参数 + * @return PageResult> + */ + @Override + public PageResult list(PageParam pageParam, Map params) { + Integer page = pageParam.getPage_no(); + Integer limit = pageParam.getPage_size(); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc("id"); + queryWrapper.select("id,gen_type,table_name,table_comment,create_time,update_time"); + + genTableMapper.setSearch(queryWrapper, params, new String[]{ + "like:tableName@table_name:str", + "like:tableComment@table_comment:str", + "datetime:startTime-endTime@create_time:str" + }); + + IPage iPage = genTableMapper.selectPage(new Page<>(page, limit), queryWrapper); + + List list = new LinkedList<>(); + for (GenTable item : iPage.getRecords()) { + GenTableVo vo = new GenTableVo(); + BeanUtils.copyProperties(item, vo); + vo.setCreateTime(TimeUtils.timestampToDate(item.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(item.getUpdateTime())); + list.add(vo); + } + + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list); + } + + /** + * 生成详情 + * + * @author fzr + * @return Object + */ + @Override + public Map detail(Integer id) { + Map maps = new LinkedHashMap<>(); + GenTable genTable = genTableMapper.selectById(id); + Assert.notNull(genTable, "查询的数据不存在"); + + // 基本信息 + Map base = new LinkedHashMap<>(); + base.put("id", genTable.getId()); + base.put("tableName", genTable.getTableName()); + base.put("tableComment", genTable.getTableComment()); + base.put("entityName", genTable.getEntityName()); + base.put("authorName", genTable.getAuthorName()); + base.put("remarks", genTable.getRemarks()); + base.put("createTime", TimeUtils.timestampToDate(genTable.getCreateTime())); + base.put("updateTime", TimeUtils.timestampToDate(genTable.getUpdateTime())); + maps.put("base", base); + + // 生成信息 + Map gen = new LinkedHashMap<>(); + gen.put("genTpl", genTable.getGenTpl()); + gen.put("genType", genTable.getGenType()); + gen.put("genPath", genTable.getGenPath()); + gen.put("moduleName", genTable.getModuleName()); + gen.put("functionName", genTable.getFunctionName()); + gen.put("treePrimary", genTable.getTreePrimary()); + gen.put("treeParent", genTable.getTreeParent()); + gen.put("treeName", genTable.getTreeName()); + gen.put("subTableName", genTable.getSubTableName()); + gen.put("subTableFk", genTable.getSubTableFk()); + gen.put("subTableFr", genTable.getSubTableFr()); + gen.put("menuStatus", genTable.getMenuStatus()); + gen.put("menuPid", genTable.getMenuPid()); + gen.put("menuName", genTable.getMenuName()); + maps.put("gen", gen); + + // 字段信息 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("table_id", id); + queryWrapper.orderByAsc("sort"); + List columns = new LinkedList<>(); + for (GenTableColumn item : genTableColumnMapper.selectList(queryWrapper)) { + GenColumnVo vo = new GenColumnVo(); + BeanUtils.copyProperties(item, vo); + vo.setCreateTime(TimeUtils.timestampToDate(item.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(item.getUpdateTime())); + columns.add(vo); + } + + maps.put("column", columns); + + return maps; + } + + /** + * 导入表结构 + * + * @author fzr + * @param tableNames 参数 + */ + @Override + @Transactional + public void importTable(String[] tableNames) { + try { + List tables = genTableMapper.selectDbTableListByNames(tableNames); + if (tables.size() <= 0) { + throw new Exception("表不存在!"); + } + for (DbTableVo map : tables) { + // 生成表信息 + GenTable table = new GenTable(); + GenUtil.initTable(table, map); + int row = genTableMapper.insert(table); + + // 生成列信息 + if (row > 0) { + String tableName = map.getTableName(); + List genTableColumns = genTableMapper.selectDbTableColumnsByName(tableName); + for (GenTableColumn column : genTableColumns) { + GenUtil.initColumn(column, table); + genTableColumnMapper.insert(column); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + throw new OperateException("导入失败:" + e.getMessage()); + } + } + + /** + * 编辑表结构 + * + * @author fzr + * @param genParam 参数 + */ + @Override + @Transactional + public void editTable(GenParam genParam) { + if (genParam.getGenTpl().equals(GenConstants.TPL_TREE)) { + Assert.isFalse(genParam.getTreePrimary().equals(""), "树主ID不能为空"); + Assert.isFalse(genParam.getTreeParent().equals(""), "树父ID不能为空"); + } + + GenTable model = genTableMapper.selectById(genParam.getId()); + Assert.notNull(model, "数据已丢失"); + + model.setTableName(genParam.getTableName()); + model.setTableComment(genParam.getTableComment()); + model.setAuthorName(genParam.getAuthorName()); + model.setEntityName(genParam.getEntityName()); + model.setModuleName(genParam.getModuleName()); + model.setFunctionName(genParam.getFunctionName()); + model.setTreePrimary(genParam.getTreePrimary()); + model.setTreeParent(genParam.getTreeParent()); + model.setTreeName(genParam.getTreeName()); + model.setRemarks(genParam.getRemarks()); + model.setGenTpl(genParam.getGenTpl()); + model.setGenType(genParam.getGenType()); + model.setGenPath(genParam.getGenPath()); + model.setSubTableFk(genParam.getSubTableFk()); + model.setSubTableFr(genParam.getSubTableFr()); + model.setSubTableName(genParam.getSubTableName()); + model.setMenuStatus(genParam.getMenuStatus()); + model.setMenuPid(genParam.getMenuPid()); + model.setMenuName(genParam.getMenuName()); + genTableMapper.updateById(model); + + for (Map item : genParam.getColumn()) { + Integer id = Integer.parseInt(item.get("id")); + GenTableColumn column = genTableColumnMapper.selectById(id); + column.setColumnComment(item.get("columnComment")); + column.setJavaType(item.get("javaType")); + column.setJavaField(item.get("javaField")); + column.setIsRequired(Integer.parseInt(item.get("isRequired"))); + column.setIsInsert(Integer.parseInt(item.get("isInsert"))); + column.setIsEdit(Integer.parseInt(item.get("isEdit"))); + column.setIsList(Integer.parseInt(item.get("isList"))); + column.setIsQuery(Integer.parseInt(item.get("isQuery"))); + column.setQueryType(item.get("queryType")); + column.setHtmlType(item.get("htmlType")); + column.setDictType(item.get("dictType")); + genTableColumnMapper.updateById(column); + } + } + + /** + * 删除表结构 + * + * @author fzr + * @param ids 主键 + */ + @Override + @Transactional + public void deleteTable(List ids) { + for (Integer id : ids) { + genTableMapper.deleteById(id); + genTableColumnMapper.delete(new QueryWrapper().eq("table_id" , id)); + } + } + + /** + * 同步数据表 + * + * @author fzr + * @param id 主键 + */ + @Override + @Transactional + public void syncTable(Integer id) { + // 生成的数据 + GenTable genTable = genTableMapper.selectById(id); + Assert.notNull(genTable, "生成数据不存在!"); + + // 旧表的数据 + List genTableColumns = genTableColumnMapper.selectList( + new QueryWrapper() + .eq("table_id", id) + .orderByAsc("sort")); + Assert.isFalse(StringUtils.isEmpty(genTableColumns), "旧数据异常!"); + + // 原表转Map + Map tableColumnMap = genTableColumns + .stream().collect(Collectors.toMap(GenTableColumn::getColumnName, Function.identity())); + + + // 新表数据 + List columns = genTableMapper.selectDbTableColumnsByName(genTable.getTableName()); + if (StringUtils.isNull(columns)) { + throw new OperateException("同步结构失败,原表结构不存在!"); + } + + // 处理更新字段 + columns.forEach(column -> { + GenUtil.initColumn(column, genTable); + if (tableColumnMap.containsKey(column.getColumnName())) { + GenTableColumn prevColumn = tableColumnMap.get(column.getColumnName()); + column.setId(prevColumn.getId()); + + if (column.getIsList() != null && column.getIsList() == 1) { + column.setDictType(prevColumn.getDictType()); + column.setQueryType(prevColumn.getQueryType()); + } + + if (prevColumn.getIsRequired() == 1 + && prevColumn.getIsPk() == 0 + && (prevColumn.getIsInsert() == 1 || prevColumn.getIsEdit() == 1)) { + column.setHtmlType(prevColumn.getHtmlType()); + column.setIsRequired(prevColumn.getIsRequired()); + } + + genTableColumnMapper.updateById(column); + } else { + genTableColumnMapper.insert(column); + } + }); + + // 删除弃用字段 + List dbTableColumnNames = columns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); + List delColumns = genTableColumns.stream() + .filter(column -> !dbTableColumnNames.contains(column.getColumnName())) + .collect(Collectors.toList()); + if (StringUtils.isNotEmpty(delColumns)) { + for (GenTableColumn item : delColumns) { + genTableColumnMapper.deleteById(item); + } + } + } + + /** + * 预览代码 + * + * @author fzr + * @param id 主键 + * @return Map + */ + @Override + public Map previewCode(Integer id) { + GenTable table = genTableMapper.selectById(id); + Assert.notNull(table, "记录丢失!"); + + List columns = genTableColumnMapper.selectList( + new QueryWrapper() + .eq("table_id", id) + .orderByAsc("sort")); + + // 初始模板 + VelocityUtil.initVelocity(); + VelocityContext context = VelocityUtil.prepareContext(table, columns); + + // 渲染模板 + Map map = new LinkedHashMap<>(); + List templates = VelocityUtil.getTemplateList(table.getGenTpl(), columns); + for (String template : templates) { + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, GenConstants.UTF8); + tpl.merge(context, sw); + map.put(template.replace(".vm", ""), sw.toString()); + } + + return map; + } + + /** + * 下载代码 + * + * @author fzr + * @param tableNames 表名集合 + * @return byte[] + */ + @Override + public byte[] downloadCode(String[] tableNames) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + for (String tableName : tableNames) { + genZipCode(tableName, zip); + } + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + + /** + * 生成代码 (自定义路径) + * + * @author fzr + * @param tableName 表名 + */ + @Override + public void genCode(String tableName) { + // 查表信息 + GenTable table = genTableMapper.selectOne(new QueryWrapper() + .eq("table_name", tableName) + .last("limit 1")); + + // 查列信息 + Integer tableId = table.getId(); + List columns = genTableColumnMapper.selectList( + new QueryWrapper() + .orderByAsc("sort") + .eq("table_id", tableId)); + + // 初始模板 + VelocityUtil.initVelocity(); + VelocityContext context = VelocityUtil.prepareContext(table, columns); + + // 渲染模板 + List templates = VelocityUtil.getTemplateList(table.getGenTpl(), columns); + for (String template : templates) { + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, GenConstants.UTF8); + tpl.merge(context, sw); + try { + String basePath = VelocityUtil.getGenPath(table); + String tplPaths = VelocityUtil.getFileName(template, table); + if (tplPaths.startsWith("vue")) { + continue; + } + + String filePath = basePath + VelocityUtil.getFileName(template, table); + filePath = filePath.replaceFirst("java/", ""); + FileUtils.writeStringToFile(new File(filePath), sw.toString(), GenConstants.UTF8); + } catch (IOException e) { + log.error("生成渲染模板失败: " + e.getMessage()); + } + } + + // 生成菜单 + this.genAutoMenu(table); + } + + /** + * 生成代码 (压缩包下载) + * + * @author fzr + * @param tableName 表名 + * @param zip 压缩包 + */ + private void genZipCode(String tableName, ZipOutputStream zip) { + // 查表信息 + GenTable table = genTableMapper.selectOne(new QueryWrapper() + .eq("table_name", tableName) + .last("limit 1")); + + // 查列信息 + List columns = genTableColumnMapper.selectList( + new QueryWrapper() + .orderByAsc("sort") + .eq("table_id", table.getId())); + + // 初始模板 + VelocityUtil.initVelocity(); + VelocityContext context = VelocityUtil.prepareContext(table, columns); + + // 渲染模板 + List templates = VelocityUtil.getTemplateList(table.getGenTpl(), columns); + for (String template : templates) { + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, GenConstants.UTF8); + tpl.merge(context, sw); + try { + zip.putNextEntry(new ZipEntry(VelocityUtil.getFileName(template, table))); + IOUtils.write(sw.toString(), zip, GenConstants.UTF8); + zip.flush(); + zip.closeEntry(); + } catch (IOException e) { + log.error("生成渲染模板失败: " + e.getMessage()); + } + } + } + + /** + * 自动构建菜单 + */ + private void genAutoMenu(GenTable table) { + if (table.getMenuStatus().equals(1)) { + SystemMenu authMenu = new SystemMenu(); + authMenu.setPid(table.getMenuPid()); + authMenu.setType("C"); + authMenu.setName(table.getMenuName()); + authMenu.setPaths(table.getModuleName()); + authMenu.setPerms(table.getModuleName() + ":list"); + authMenu.setComponent(table.getModuleName() + "/index"); + authMenu.setName(table.getMenuName()); + authMenu.setCreateTime(System.currentTimeMillis() / 1000); + authMenu.setUpdateTime(System.currentTimeMillis() / 1000); + systemAuthMenuMapper.insert(authMenu); + + for (String op : Arrays.asList("detail", "add", "edit", "del")) { + String menuName = ""; + switch (op) { + case "detail": + menuName = "详情"; + break; + case "add": + menuName = "新增"; + break; + case "edit": + menuName = "编辑"; + break; + case "del": + menuName = "删除"; + } + String perms = table.getModuleName() + ":" + op; + SystemMenu systemAuthMenu = new SystemMenu(); + systemAuthMenu.setPid(authMenu.getId()); + systemAuthMenu.setType("A"); + systemAuthMenu.setPerms(perms); + systemAuthMenu.setName(table.getMenuName() + menuName); + systemAuthMenu.setCreateTime(System.currentTimeMillis() / 1000); + systemAuthMenu.setUpdateTime(System.currentTimeMillis() / 1000); + systemAuthMenuMapper.insert(systemAuthMenu); + } + } + } +} diff --git a/yj-generator/src/main/java/com/yj/generator/util/GenUtil.java b/yj-generator/src/main/java/com/yj/generator/util/GenUtil.java new file mode 100644 index 0000000..d59a245 --- /dev/null +++ b/yj-generator/src/main/java/com/yj/generator/util/GenUtil.java @@ -0,0 +1,268 @@ +package com.yj.generator.util; + +import com.yj.common.config.GlobalConfig; +import com.yj.generator.constant.GenConstants; +import com.yj.common.util.StringUtils; +import com.yj.generator.config.GenConfig; +import com.yj.generator.constant.HtmlConstants; +import com.yj.generator.constant.JavaConstants; +import com.yj.generator.constant.SqlConstants; +import com.yj.generator.entity.GenTable; +import com.yj.generator.entity.GenTableColumn; +import com.yj.generator.vo.DbTableVo; +import org.apache.commons.lang3.RegExUtils; + +import java.util.Arrays; + +public class GenUtil { + + /** + * 初始化表 + * + * @author fzr + * @param table 表 + * @param map 参数 + */ + public static void initTable(GenTable table, DbTableVo map) { + String tableName = map.getTableName(); + String tableDesc = map.getTableComment(); + table.setTableName(tableName); + table.setTableComment(tableDesc); + table.setAuthorName(StringUtils.isEmpty(map.getAuthorName()) ? "LikeAdmin" : map.getAuthorName()); + table.setEntityName(GenUtil.toClassName(tableName)); + table.setModuleName(GenUtil.toModuleName(tableName)); + table.setFunctionName(GenUtil.replaceText(tableDesc)); + table.setCreateTime(System.currentTimeMillis() / 1000); + table.setUpdateTime(System.currentTimeMillis() / 1000); + } + + /** + * 初始化字段列 + * + * @author fzr + * @param column 列 + * @param table 表 + */ + public static void initColumn(GenTableColumn column, GenTable table) { + column.setTableId(table.getId()); + String columnName = column.getColumnName(); + String columnType = GenUtil.getDbType(column.getColumnType()); + column.setColumnLength(GenUtil.getColumnLength(column.getColumnType())); + column.setJavaField(StringUtils.toCamelCase(columnName)); + column.setJavaType(JavaConstants.TYPE_STRING); + column.setQueryType(GenConstants.QUERY_EQ); + column.setUpdateTime(table.getUpdateTime()); + column.setCreateTime(table.getCreateTime()); + + // 文本域组 + if (GenUtil.isArraysContains(SqlConstants.COLUMN_TYPE_STR, columnType) || + GenUtil.isArraysContains(SqlConstants.COLUMN_TYPE_TEXT, columnType)) { + String columnLength = GenUtil.getColumnLength(column.getColumnType()); + String htmlType = Integer.parseInt(columnLength) >= 500 || GenUtil.isArraysContains(SqlConstants.COLUMN_TYPE_TEXT, columnType) + ? HtmlConstants.HTML_TEXTAREA + : HtmlConstants.HTML_INPUT; + column.setHtmlType(htmlType); + } + + // 日期字段 + else if (GenUtil.isArraysContains(SqlConstants.COLUMN_TYPE_TIME, columnType)) { + column.setJavaType(JavaConstants.TYPE_DATE); + column.setHtmlType(HtmlConstants.HTML_DATETIME); + } + + // 时间字段 + else if (GenUtil.isArraysContains(SqlConstants.COLUMN_TIME_NAME, columnName)) { + column.setJavaType(JavaConstants.TYPE_LONG); + column.setHtmlType(HtmlConstants.HTML_DATETIME); + } + + // 数字字段 + else if (GenUtil.isArraysContains(SqlConstants.COLUMN_TYPE_NUMBER, columnType)) { + column.setHtmlType(HtmlConstants.HTML_INPUT); // 输入框 + String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), ","); + if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) { + column.setJavaType(JavaConstants.TYPE_BIG_DECIMAL); // 浮点形 + } else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 11) { + column.setJavaType(JavaConstants.TYPE_INTEGER); // 整数形 + } else { + column.setJavaType(JavaConstants.TYPE_LONG); // 长整形 + } + } + + // 非必填字段 + if (GenUtil.isArraysContains(SqlConstants.COLUMN_NAME_NOT_EDIT, columnName)) { + column.setIsRequired(0); + } + + // 需插入字段 + if (!GenUtil.isArraysContains(SqlConstants.COLUMN_NAME_NOT_ADD, columnName)) { + column.setIsInsert(GenConstants.REQUIRE); + } + + // 需编辑字段 + if (!GenUtil.isArraysContains(SqlConstants.COLUMN_NAME_NOT_EDIT, columnName)) { + column.setIsEdit(GenConstants.REQUIRE); + column.setIsRequired(GenConstants.REQUIRE); + } + + // 需列表字段 + if (!GenUtil.isArraysContains(SqlConstants.COLUMN_NAME_NOT_LIST, columnName) && column.getIsPk() == 0) { + column.setIsList(GenConstants.REQUIRE); + } + + // 需查询字段 + if (!GenUtil.isArraysContains(SqlConstants.COLUMN_NAME_NOT_QUERY, columnName) && column.getIsPk() == 0) { + column.setIsQuery(GenConstants.REQUIRE); + } + + // 模糊查字段 + if (StringUtils.endsWithIgnoreCase(columnName, "name") || + columnName.equals("nickname") || + columnName.equals("username") || + columnName.equals("title") || + columnName.equals("mobile")) { + column.setQueryType(GenConstants.QUERY_LIKE); + } + + // 根据字段设置 + if (StringUtils.endsWithIgnoreCase(columnName, "status") + || columnName.equals("isShow") + || columnName.equals("isDisable")) { + // 状态字段设置单选框 + column.setHtmlType(HtmlConstants.HTML_RADIO); + } else if (StringUtils.endsWithIgnoreCase(columnName, "type") || + StringUtils.endsWithIgnoreCase(columnName, "sex")) { + // 类型&性别字段设置下拉框 + column.setHtmlType(HtmlConstants.HTML_SELECT); + } else if (StringUtils.endsWithIgnoreCase(columnName, "image")) { + // 图片字段设置图片上传控件 + column.setHtmlType(HtmlConstants.HTML_IMAGE_UPLOAD); + } else if (StringUtils.endsWithIgnoreCase(columnName, "file")) { + // 文件字段设置文件上传控件 + column.setHtmlType(HtmlConstants.HTML_FILE_UPLOAD); + } else if (StringUtils.endsWithIgnoreCase(columnName, "content")) { + // 内容字段的设置富文本控件 + column.setHtmlType(HtmlConstants.HTML_EDITOR); + } + } + + /** + * 转业务名 + * + * @author fzr + * @param tableName 表名 + * @return 业务名 + */ + public static String toModuleName(String tableName) { + int lastIndex = tableName.lastIndexOf("_"); + int nameLength = tableName.length(); + return StringUtils.substring(tableName, lastIndex + 1, nameLength); + } + + /** + * 表名转Java类名 + * + * @author fzr + * @param tableName 表名称 + * @return 类名 + */ + public static String toClassName(String tableName) { + String tablePrefix = GlobalConfig.tablePrefix; + if (GenConfig.isRemoveTablePrefix && StringUtils.isNotEmpty(tablePrefix)) { + String[] searchList = StringUtils.split(tablePrefix, ","); + tableName = replaceFirst(tableName, searchList); + } + return StringUtils.convertToCamelCase(tableName); + } + + /** + * 批量替换前缀 + * + * @author fzr + * @param replaceVal 替换值 + * @param searchList 替换列表 + * @return String + */ + public static String replaceFirst(String replaceVal, String[] searchList) { + String text = replaceVal; + for (String searchString : searchList) { + if (replaceVal.startsWith(searchString)) { + text = replaceVal.replaceFirst(searchString, ""); + break; + } + } + return text; + } + + /** + * 关键字替换 + * + * @author fzr + * @param text 需要被替换的名字 + * @return 替换后的名字 + */ + public static String replaceText(String text) { + return RegExUtils.replaceAll(text, "(?:表)", ""); + } + + /** + * 校验数组是否包含指定值 + * + * @author fzr + * @param arr 数组 + * @param targetValue 值 + * @return Boolean + */ + public static Boolean isArraysContains(String[] arr, String targetValue) { + return Arrays.asList(arr).contains(targetValue); + } + + /** + * 获取数据库类型字段 + * + * @author fzr + * @param columnType 列类型 + * @return String + */ + public static String getDbType(String columnType) { + if (StringUtils.indexOf(columnType, "(") > 0) { + return StringUtils.substringBefore(columnType, "("); + } + else { + return columnType; + } + } + + /** + * 获取字段长度 + * + * @author fzr + * @param columnType 列类型 + * @return 截取后的列类型 + */ + public static String getColumnLength(String columnType) { + if (StringUtils.indexOf(columnType, "(") > 0) { + return StringUtils.substringBetween(columnType, "(", ")"); + } else { + return "0"; + } + } + + /** + * 获取表的别名 + * + * @param tableName 表名 + * @return String + */ + public static String getTableAlias(String tableName) { + if (StringUtils.isNull(tableName) || StringUtils.isEmpty(tableName)) { + return ""; + } + + StringBuilder val = new StringBuilder(); + for (String name : tableName.split("_")) { + val.append(name.charAt(0)); + } + return val.toString(); + } +} diff --git a/yj-generator/src/main/java/com/yj/generator/util/VelocityUtil.java b/yj-generator/src/main/java/com/yj/generator/util/VelocityUtil.java new file mode 100644 index 0000000..a14dc38 --- /dev/null +++ b/yj-generator/src/main/java/com/yj/generator/util/VelocityUtil.java @@ -0,0 +1,212 @@ +package com.yj.generator.util; + +import com.yj.common.config.GlobalConfig; +import com.yj.common.util.StringUtils; +import com.yj.generator.config.GenConfig; +import com.yj.generator.constant.GenConstants; +import com.yj.generator.constant.SqlConstants; +import com.yj.generator.entity.GenTable; +import com.yj.generator.entity.GenTableColumn; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.apache.velocity.runtime.RuntimeConstants; +import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader; + +import java.io.File; +import java.util.LinkedList; +import java.util.List; +import java.util.Properties; + +public class VelocityUtil { + + /** + * 初始化vm方法 + */ + public static void initVelocity() { + try { + Properties p = new Properties(); + p.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath"); + p.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName()); + p.setProperty(Velocity.INPUT_ENCODING, "UTF-8"); + Velocity.init(p); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * 设置模板变量信息 + * + * @author fzr + * @return VelocityContext + */ + public static VelocityContext prepareContext(GenTable table, List columns) { + boolean isSearch = false; // 是否需要搜索 + String primaryKey = "id"; // 主键字段名称 + String primaryField = "id"; // 主键字段 + List allFields = new LinkedList<>(); // 所有字段 + List listFields = new LinkedList<>(); // 列表字段 + List detailFields = new LinkedList<>(); // 详情字段 + List dictFields = new LinkedList<>(); // 字段字段 + for (GenTableColumn column : columns) { + allFields.add(column.getColumnName()); + if (column.getIsList() == 1) { + listFields.add(column.getColumnName()); + } + if (column.getIsEdit() == 1) { + detailFields.add(column.getColumnName()); + } + if (column.getIsQuery() == 1) { + isSearch = true; + } + if (column.getIsPk() == 1) { + primaryKey = column.getJavaField(); + primaryField = column.getColumnName(); + } + if (StringUtils.isNotEmpty(column.getDictType()) && !dictFields.contains(column.getDictType())) { + dictFields.add(column.getDictType()); + } + } + + // 替换前缀 + table.setSubTableName(table.getSubTableName().replace(GlobalConfig.tablePrefix, "")); + + // 设置模板变量 + VelocityContext velocityContext = new VelocityContext(); + velocityContext.put("genTpl", table.getGenTpl()); + velocityContext.put("tableName", table.getTableName()); + velocityContext.put("authorName", table.getAuthorName()); + velocityContext.put("packageName", GenConfig.packageName); + velocityContext.put("EntityName", table.getEntityName()); + velocityContext.put("entityName", StringUtils.uncapitalize(table.getEntityName())); + velocityContext.put("moduleName", table.getModuleName()); + velocityContext.put("functionName", StringUtils.isNotEmpty(table.getFunctionName()) ? table.getFunctionName() : "【请填写功能名称】"); + velocityContext.put("notesType", GenConfig.notesType); + velocityContext.put("table", table); + velocityContext.put("columns", columns); + velocityContext.put("subTableAlias", GenUtil.getTableAlias(table.getSubTableName())); + velocityContext.put("dateFields", SqlConstants.COLUMN_TIME_NAME); + velocityContext.put("primaryKey", primaryKey); + velocityContext.put("primaryField", primaryField); + velocityContext.put("allFields", allFields); + velocityContext.put("listFields", listFields); + velocityContext.put("detailFields", detailFields); + velocityContext.put("dictFields", dictFields); + velocityContext.put("isSearch", isSearch); + return velocityContext; + } + + /** + * 获取生成路径 + * + * @author fzr + * @param table 表 + * @return String + */ + public static String getGenPath(GenTable table) { + String genPath = table.getGenPath(); + if (StringUtils.equals(genPath, "/")) { + return System.getProperty("user.dir") + File.separator + "src" + File.separator; + } + return genPath + File.separator; + } + + /** + * 获取模板列表 + * + * @author fzr + * @return List + */ + public static List getTemplateList(String genTpl, List columns) { + List templates = new LinkedList<>(); + templates.add("java/controller.java.vm"); + templates.add("java/service.java.vm"); + templates.add("java/serviceImpl.java.vm"); + templates.add("java/validateCreate.java.vm"); + templates.add("java/validateUpdate.java.vm"); + templates.add("java/validateSearch.java.vm"); + templates.add("java/voListed.java.vm"); + templates.add("java/voDetail.java.vm"); + templates.add("java/entity.java.vm"); + templates.add("java/mapper.java.vm"); + templates.add("vue/api.ts.vm"); + templates.add("vue/edit.vue.vm"); + if (GenConstants.TPL_CRUD.equals(genTpl)) { + templates.add("vue/index.vue.vm"); + } + + else if (GenConstants.TPL_TREE.equals(genTpl)) { + templates.add("vue/index-tree.vue.vm"); + } + + return templates; + } + + /** + * 获取文件名 + */ + public static String getFileName(String template, GenTable genTable) { + String fileName = ""; + String entityName = genTable.getEntityName(); + String moduleName = genTable.getModuleName(); + + if (template.contains("controller.java.vm")) { + fileName = StringUtils.format("java/{}/controller/{}Controller.java", GenConfig.adminPackage, entityName); + } + + else if (template.contains("service.java.vm")) { + fileName = StringUtils.format("java/{}/service/I{}Service.java", GenConfig.adminPackage, entityName); + } + + else if (template.contains("serviceImpl.java.vm")) { + fileName = StringUtils.format("java/{}/service/impl/{}ServiceImpl.java", GenConfig.adminPackage, entityName); + } + + else if (template.contains("validateCreate.java.vm")) { + fileName = StringUtils.format("java/{}/validate/{}CreateValidate.java", GenConfig.adminPackage, entityName); + } + + else if (template.contains("validateUpdate.java.vm")) { + fileName = StringUtils.format("java/{}/validate/{}UpdateValidate.java", GenConfig.adminPackage, entityName); + } + + else if (template.contains("validateSearch.java.vm")) { + fileName = StringUtils.format("java/{}/validate/{}SearchValidate.java", GenConfig.adminPackage, entityName); + } + + else if (template.contains("voListed.java.vm")) { + fileName = StringUtils.format("java/{}/vo/{}ListedVo.java", GenConfig.adminPackage, entityName); + } + + else if (template.contains("voDetail.java.vm")) { + fileName = StringUtils.format("java/{}/vo/{}DetailVo.java", GenConfig.adminPackage, entityName); + } + + else if (template.contains("entity.java.vm")) { + fileName = StringUtils.format("java/{}/entity/{}.java", GenConfig.commonPackage, entityName); + } + + else if (template.contains("mapper.java.vm")) { + fileName = StringUtils.format("java/{}/mapper/{}Mapper.java", GenConfig.commonPackage, entityName); + } + + else if (template.contains("vue/api.ts.vm")) { + fileName = StringUtils.format("vue/api/{}.ts", moduleName); + } + + else if (template.contains("vue/edit.vue.vm")) { + fileName = StringUtils.format("vue/views/{}/edit.vue", moduleName); + } + + else if (template.contains("vue/index.vue.vm")) { + fileName = StringUtils.format("vue/views/{}/index.vue", moduleName); + } + + else if (template.contains("vue/index-tree.vue.vm")) { + fileName = StringUtils.format("vue/views/{}/index.vue", moduleName); + } + + return fileName; + } + +} diff --git a/yj-generator/src/main/java/com/yj/generator/validate/GenParam.java b/yj-generator/src/main/java/com/yj/generator/validate/GenParam.java new file mode 100644 index 0000000..7b27e65 --- /dev/null +++ b/yj-generator/src/main/java/com/yj/generator/validate/GenParam.java @@ -0,0 +1,114 @@ +package com.yj.generator.validate; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.yj.common.validator.annotation.IDMust; +import com.yj.common.validator.annotation.IntegerContains; +import com.yj.common.validator.annotation.StringContains; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 生成参数 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class GenParam implements Serializable { + + public interface delete{} + + @IDMust(message = "id参数必传且需大于0") + private Integer id; + + @NotNull(message = "ids参数缺失", groups = {delete.class}) + private List ids; + + @NotNull(message = "tableName参数缺失") + @NotEmpty(message = "表名称不能为空") + @Length(min = 1, max = 200, message = "名称不能大于200个字符") + @JsonProperty("tableName") + private String tableName; + + @NotNull(message = "entityName参数缺失") + @NotEmpty(message = "实体类名称不能为空") + @Length(min = 1, max = 200, message = "实体类名称不能大于200个字符") + @JsonProperty("entityName") + private String entityName; + + @NotNull(message = "tableComment参数缺失") + @NotEmpty(message = "表描述不能为空") + @Length(min = 1, max = 200, message = "表描述不能大于200个字符") + @JsonProperty("tableComment") + private String tableComment; + + @NotNull(message = "authorName参数缺失") + @NotEmpty(message = "作者名称不能为空") + @Length(min = 1, max = 100, message = "作者名称不能大于60个字符") + @JsonProperty("authorName") + private String authorName; + + @Length(max = 60, message = "备注不能大于200个字符") + private String remarks; + + @NotNull(message = "genTpl参数缺失") + @NotEmpty(message = "请选择生成模板") + @StringContains(values = {"crud", "tree"}, message = "选择的生成模板不符合") + @JsonProperty("genTpl") + private String genTpl; + + @NotNull(message = "moduleName参数缺失") + @NotEmpty(message = "生成模块名不能为空") + @Length(min = 1, max = 60, message = "生成模块名不能大于60个字符") + @JsonProperty("moduleName") + private String moduleName; + + @NotNull(message = "functionName参数缺失") + @NotEmpty(message = "生成功能名不能为空") + @Length(min = 1, max = 60, message = "生成功能名不能大于60个字符") + @JsonProperty("functionName") + private String functionName; + + @NotNull(message = "genType参数缺失") + @IntegerContains(values = {0, 1}, message = "选择的生成代码方式不符合") + @JsonProperty("genType") + private Integer genType; + + @Length(max = 200, message = "生成代码路径不能大于200个字符") + @JsonProperty("genPath") + private String genPath = "/"; + + private List> column = new ArrayList<>(); + + @JsonProperty("treePrimary") + private String treePrimary = ""; + @JsonProperty("treeParent") + private String treeParent = ""; + @JsonProperty("treeName") + private String treeName = ""; + + @JsonProperty("subTableName") + private String subTableName = ""; + @JsonProperty("subTableFk") + private String subTableFk = ""; + + @JsonProperty("subTableFr") + private String subTableFr = ""; + + @JsonProperty("menuStatus") + private Integer menuStatus = 2; + @JsonProperty("menuPid") + private Integer menuPid = 0; + + @JsonProperty("menuName") + private String menuName = ""; + +} diff --git a/yj-generator/src/main/java/com/yj/generator/validate/PageParam.java b/yj-generator/src/main/java/com/yj/generator/validate/PageParam.java new file mode 100644 index 0000000..724cb7c --- /dev/null +++ b/yj-generator/src/main/java/com/yj/generator/validate/PageParam.java @@ -0,0 +1,28 @@ +package com.yj.generator.validate; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.DecimalMax; +import javax.validation.constraints.DecimalMin; +import java.io.Serializable; + +/** + * 分页参数 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class PageParam implements Serializable { + + // 当前分页 + @DecimalMin(value = "1", message = "pageNo参数必须大于0的数字") + public Integer page_no = 1; + + // 每页条数 + @DecimalMin(value = "1", message = "pageSize参数必须是大于0的数字") + @DecimalMax(value = "60", message = "pageSize参数必须是小于60的数字") + private Integer page_size = 20; + +} diff --git a/yj-generator/src/main/java/com/yj/generator/vo/DbColumnVo.java b/yj-generator/src/main/java/com/yj/generator/vo/DbColumnVo.java new file mode 100644 index 0000000..5d724ae --- /dev/null +++ b/yj-generator/src/main/java/com/yj/generator/vo/DbColumnVo.java @@ -0,0 +1,20 @@ +package com.yj.generator.vo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +public class DbColumnVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonProperty("columnName") + private String columnName; // 字段名称 + @JsonProperty("columnComment") + private String columnComment; // 字段描述 + @JsonProperty("columnType") + private String columnType; // 字段类型 + +} diff --git a/yj-generator/src/main/java/com/yj/generator/vo/DbTableVo.java b/yj-generator/src/main/java/com/yj/generator/vo/DbTableVo.java new file mode 100644 index 0000000..a67b46f --- /dev/null +++ b/yj-generator/src/main/java/com/yj/generator/vo/DbTableVo.java @@ -0,0 +1,27 @@ +package com.yj.generator.vo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.io.Serializable; + +/*** + * 表实体 + */ +@Data +public class DbTableVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonProperty("tableName") + private String tableName; // 表的名称 + @JsonProperty("tableComment") + private String tableComment; // 表的描述 + @JsonProperty("authorName") + private String authorName; // 作者名称 + @JsonProperty("createTime") + private String createTime; // 创建时间 + @JsonProperty("updateTime") + private String updateTime; // 更新时间 + +} diff --git a/yj-generator/src/main/java/com/yj/generator/vo/GenColumnVo.java b/yj-generator/src/main/java/com/yj/generator/vo/GenColumnVo.java new file mode 100644 index 0000000..b0270c2 --- /dev/null +++ b/yj-generator/src/main/java/com/yj/generator/vo/GenColumnVo.java @@ -0,0 +1,50 @@ +package com.yj.generator.vo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.io.Serializable; + +/*** + * 列实体 + */ +@Data +public class GenColumnVo implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer id; // 字段主键 + @JsonProperty("columnName") + private String columnName; // 字段名称 + @JsonProperty("columnComment") + private String columnComment; // 字段描述 + @JsonProperty("columnLength") + private Integer columnLength; // 字段长度 + @JsonProperty("columnType") + private String columnType; // 字段类型 + @JsonProperty("javaType") + private String javaType; // JAVA类型 + @JsonProperty("javaField") + private String javaField; // JAVA字段 + @JsonProperty("isRequired") + private Integer isRequired; // 是否必填 + @JsonProperty("isInsert") + private Integer isInsert; // 是否插入字段 + @JsonProperty("isEdit") + private Integer isEdit; // 是否编辑字段 + @JsonProperty("isList") + private Integer isList; // 是否列表字段 + @JsonProperty("isQuery") + private Integer isQuery; // 是否查询字段 + @JsonProperty("queryType") + private String queryType; // 查询方式: [等于、不等于、大于、小于、范围] + @JsonProperty("htmlType") + private String htmlType; // 显示类型: [文本框、文本域、下拉框、复选框、单选框、日期控件] + @JsonProperty("dictType") + private String dictType; // 字典类型 + @JsonProperty("createTime") + private String createTime; // 创建时间 + @JsonProperty("updateTime") + private String updateTime; // 更新时间 + +} diff --git a/yj-generator/src/main/java/com/yj/generator/vo/GenTableVo.java b/yj-generator/src/main/java/com/yj/generator/vo/GenTableVo.java new file mode 100644 index 0000000..8e0bb8e --- /dev/null +++ b/yj-generator/src/main/java/com/yj/generator/vo/GenTableVo.java @@ -0,0 +1,28 @@ +package com.yj.generator.vo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 生成列表Vo + */ +@Data +public class GenTableVo implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer id; // 生成主键 + @JsonProperty("genType") + private Integer genType; // 生成类型: [0=zip压缩包, 1=自定义路径] + @JsonProperty("tableName") + private String tableName; // 表的名称 + @JsonProperty("tableComment") + private String tableComment; // 表的描述 + @JsonProperty("createTime") + private String createTime; // 创建时间 + @JsonProperty("updateTime") + private String updateTime; // 删除时间 + +} diff --git a/yj-generator/src/main/resources/java/controller.java.vm b/yj-generator/src/main/resources/java/controller.java.vm new file mode 100644 index 0000000..8831ee9 --- /dev/null +++ b/yj-generator/src/main/resources/java/controller.java.vm @@ -0,0 +1,86 @@ +package ${packageName}.admin.controller; + +#if(!$table.genTpl.equals("crud")) +import com.alibaba.fastjson2.JSONArray; +#end +import ${packageName}.admin.aop.Log; +import ${packageName}.admin.service.I${EntityName}Service; +import ${packageName}.admin.validate.commons.IdValidate; +import ${packageName}.admin.validate.${EntityName}CreateValidate; +import ${packageName}.admin.validate.${EntityName}UpdateValidate; +import ${packageName}.admin.validate.${EntityName}SearchValidate; +#if($table.genTpl.equals("crud")) +import ${packageName}.admin.validate.commons.PageValidate; +import ${packageName}.admin.vo.${EntityName}ListedVo; +#end +import ${packageName}.admin.vo.${EntityName}DetailVo; +import ${packageName}.common.core.AjaxResult; +#if($table.genTpl.equals("crud")) +import ${packageName}.common.core.PageResult; +#end +import ${packageName}.common.validator.annotation.IDMust; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("api/${moduleName}") +@Api(tags = "${functionName}管理") +public class ${EntityName}Controller { + + @Resource + I${EntityName}Service i${EntityName}Service; + + #if($table.genTpl.equals("crud")) + @GetMapping("/list") + @ApiOperation(value="${functionName}列表") + public AjaxResult> list(@Validated PageValidate pageValidate, + @Validated ${EntityName}SearchValidate searchValidate) { + PageResult<${EntityName}ListedVo> list = i${EntityName}Service.list(pageValidate, searchValidate); + return AjaxResult.success(list); + } + #else + @GetMapping("/list") + @ApiOperation(value="${functionName}列表") + public AjaxResult list(@Validated ${EntityName}SearchValidate searchValidate) { + JSONArray list = i${EntityName}Service.list(searchValidate); + return AjaxResult.success(list); + } + #end + + @GetMapping("/detail") + @ApiOperation(value="${functionName}详情") + public AjaxResult<${EntityName}DetailVo> detail(@Validated @IDMust() @RequestParam("id") Integer id) { + ${EntityName}DetailVo detail = i${EntityName}Service.detail(id); + return AjaxResult.success(detail); + } + + @Log(title = "${functionName}新增") + @PostMapping("/add") + @ApiOperation(value="${functionName}新增") + public AjaxResult add(@Validated @RequestBody ${EntityName}CreateValidate createValidate) { + i${EntityName}Service.add(createValidate); + return AjaxResult.success(); + } + + @Log(title = "${functionName}编辑") + @PostMapping("/edit") + @ApiOperation(value="${functionName}编辑") + public AjaxResult edit(@Validated @RequestBody ${EntityName}UpdateValidate updateValidate) { + i${EntityName}Service.edit(updateValidate); + return AjaxResult.success(); + } + + @Log(title = "${functionName}删除") + @PostMapping("/del") + @ApiOperation(value="${functionName}删除") + public AjaxResult del(@Validated @RequestBody IdValidate idValidate) { + #set($AttrName=$primaryKey.substring(0,1).toUpperCase() + ${primaryKey.substring(1)}) + i${EntityName}Service.del(idValidate.getId()); + return AjaxResult.success(); + } + +} diff --git a/yj-generator/src/main/resources/java/entity.java.vm b/yj-generator/src/main/resources/java/entity.java.vm new file mode 100644 index 0000000..d143fcc --- /dev/null +++ b/yj-generator/src/main/resources/java/entity.java.vm @@ -0,0 +1,33 @@ +package ${packageName}.common.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +#foreach ($column in $columns) +#if ($column.javaType.equals("BigDecimal")) +import java.math.BigDecimal; +#end +#if ($column.javaType.equals("Date")) +import java.util.Date; +#end +#end + +@Data +@ApiModel("${functionName}实体") +public class ${EntityName} implements Serializable { + + private static final long serialVersionUID = 1L; + + #foreach ($column in $columns) + #if($column.isPk) + @TableId(value="${column.columnName}", type= IdType.AUTO) + #end + @ApiModelProperty(value = "${column.columnComment}") + private ${column.javaType} ${column.javaField}; + + #end +} \ No newline at end of file diff --git a/yj-generator/src/main/resources/java/mapper.java.vm b/yj-generator/src/main/resources/java/mapper.java.vm new file mode 100644 index 0000000..c7a369c --- /dev/null +++ b/yj-generator/src/main/resources/java/mapper.java.vm @@ -0,0 +1,16 @@ +package ${packageName}.common.mapper; + +import ${packageName}.common.core.basics.IBaseMapper; +import ${packageName}.common.entity.${EntityName}; +import org.apache.ibatis.annotations.Mapper; + +#set($isAuthor = !$authorName.equals("")) +/** + * ${functionName}Mapper +#if($isAuthor) + * @author ${authorName} +#end + */ +@Mapper +public interface ${EntityName}Mapper extends IBaseMapper<${EntityName}> { +} diff --git a/yj-generator/src/main/resources/java/service.java.vm b/yj-generator/src/main/resources/java/service.java.vm new file mode 100644 index 0000000..7b52c4f --- /dev/null +++ b/yj-generator/src/main/resources/java/service.java.vm @@ -0,0 +1,95 @@ +package ${packageName}.admin.service; + +#if(!$table.genTpl.equals("crud")) +import com.alibaba.fastjson2.JSONArray; +#end +#if($table.genTpl.equals("crud")) +import ${packageName}.admin.validate.commons.PageValidate; +#end +import ${packageName}.admin.validate.${EntityName}CreateValidate; +import ${packageName}.admin.validate.${EntityName}UpdateValidate; +import ${packageName}.admin.validate.${EntityName}SearchValidate; +#if($table.genTpl.equals("crud")) +import ${packageName}.admin.vo.${EntityName}ListedVo; +#end +import ${packageName}.admin.vo.${EntityName}DetailVo; +#if($table.genTpl.equals("crud")) +import ${packageName}.common.core.PageResult; +#end + +#set($isAuthor = !$authorName.equals("")) +/** + * ${functionName}服务接口类 +#if($isAuthor) + * @author ${authorName} +#end + */ +public interface I${EntityName}Service { + + #if($table.genTpl=="crud") + /** + * ${functionName}列表 + * + #if(!$authorName.equals("")) + * @author ${authorName} + #end + * @param pageValidate 分页参数 + * @param searchValidate 搜索参数 + * @return PageResult<${EntityName}ListedVo> + */ + PageResult<${EntityName}ListedVo> list(PageValidate pageValidate, ${EntityName}SearchValidate searchValidate); +#elseif($table.genTpl=="tree") + /** + * ${functionName}列表 + * + #if(!$authorName.equals("")) + * @author ${authorName} + #end + * @param searchValidate 搜索参数 + * @return JSONArray + */ + JSONArray list(${EntityName}SearchValidate searchValidate); + #end + + /** + * ${functionName}详情 + * + #if(!$authorName.equals("")) + * @author ${authorName} + #end + * @param id 主键ID + * @return ${EntityName}DetailVo + */ + ${EntityName}DetailVo detail(Integer id); + + /** + * ${functionName}新增 + * + #if(!$authorName.equals("")) + * @author ${authorName} + #end + * @param createValidate 参数 + */ + void add(${EntityName}CreateValidate createValidate); + + /** + * ${functionName}编辑 + * + #if(!$authorName.equals("")) + * @author ${authorName} + #end + * @param updateValidate 参数 + */ + void edit(${EntityName}UpdateValidate updateValidate); + + /** + * ${functionName}删除 + * + #if(!$authorName.equals("")) + * @author ${authorName} + #end + * @param id 主键ID + */ + void del(Integer id); + +} diff --git a/yj-generator/src/main/resources/java/serviceImpl.java.vm b/yj-generator/src/main/resources/java/serviceImpl.java.vm new file mode 100644 index 0000000..33dc57e --- /dev/null +++ b/yj-generator/src/main/resources/java/serviceImpl.java.vm @@ -0,0 +1,409 @@ +package ${packageName}.admin.service.impl; + +#if(!$table.genTpl.equals("crud")) +import com.alibaba.fastjson2.JSONArray; +#end +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.github.yulichang.query.MPJQueryWrapper; +#if($table.genTpl.equals("crud")) +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import ${packageName}.admin.validate.commons.PageValidate; +#end +import ${packageName}.admin.service.I${EntityName}Service; +import ${packageName}.admin.validate.${EntityName}CreateValidate; +import ${packageName}.admin.validate.${EntityName}UpdateValidate; +import ${packageName}.admin.validate.${EntityName}SearchValidate; +import ${packageName}.admin.vo.${EntityName}ListedVo; +import ${packageName}.admin.vo.${EntityName}DetailVo; +import config.com.y'j.common.GlobalConfig; +#if($table.genTpl.equals("crud")) +import ${packageName}.common.core.PageResult; +#end +import ${packageName}.common.entity.${EntityName}; +import ${packageName}.common.mapper.${EntityName}Mapper; +import ${packageName}.common.util.ListUtils; +import ${packageName}.common.util.TimeUtils; +import ${packageName}.common.util.UrlUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.util.*; + +#set($isAuthor = !$authorName.equals("")) +/** + * ${functionName}实现类 +#if($isAuthor) + * @author ${authorName} +#end + */ +@Service +public class ${EntityName}ServiceImpl implements I${EntityName}Service { + ## 设置模板方式的变量 + #if($table.genTpl.equals("crud")) + #set($genTpl = "PageResult<${EntityName}ListedVo>") + #if($isSearch) + #set($isSearchParam = true) + #set($genParam = "PageValidate pageValidate, ${EntityName}SearchValidate searchValidate") + #else + #set($isSearchParam = false) + #set($genParam = "PageValidate pageValidate") + #end + #else + #set($genTpl = "JSONArray") + #if($isSearch) + #set($isSearchParam = true) + #set($genParam = "${EntityName}SearchValidate searchValidate") + #else + #set($isSearchParam = false) + #set($genParam = "") + #end + #end + ## 设置基本的参数变量 + #set($pageParam = "@param pageValidate 分页参数") + #set($searchparams = "@param searchValidate 搜索参数") + + @Resource + ${EntityName}Mapper ${entityName}Mapper; + + /** + * ${functionName}列表 + * + #if($isAuthor) + * @author ${authorName} + #end + #if($table.genTpl.equals("crud")) + * ${pageParam} + #end + #if($isSearchParam) + * ${searchparams} + #end + * @return $genTpl + */ + @Override + public $genTpl list($genParam) { + #if($table.genTpl.equals("crud")) + Integer page = pageValidate.getPage_no(); + Integer limit = pageValidate.getPage_size(); + #end + + #if(!$table.subTableName.equals("") && !$table.subTableFk.equals("")) + #set($queryWrapper = "mpjQueryWrapper") + MPJQueryWrapper<${EntityName}> mpjQueryWrapper = new MPJQueryWrapper<>(); + mpjQueryWrapper.selectAll(${EntityName}.class); + mpjQueryWrapper.innerJoin("?_$table.subTableName $subTableAlias ON $subTableAlias.$table.SubTableFk=t.$table.SubTableFr".replace("?_", GlobalConfig.tablePrefix)); + #if($allFields.contains("is_delete")) + mpjQueryWrapper.eq("t.is_delete", 0); + #end + #if($allFields.contains("sort")) + mpjQueryWrapper.orderByDesc(Arrays.asList("t.sort", "t.${primaryField}")); + #else + mpjQueryWrapper.orderByDesc("${primaryField}"); + #end + #else + #set($queryWrapper = "queryWrapper") + QueryWrapper<${EntityName}> queryWrapper = new QueryWrapper<>(); + #if($allFields.contains("is_delete")) + queryWrapper.eq("is_delete", 0); + #end + #if($allFields.contains("sort")) + queryWrapper.orderByDesc(Arrays.asList("sort", "${primaryField}")); + #else + queryWrapper.orderByDesc("${primaryField}"); + #end + #end + + #if($isSearch) + ${entityName}Mapper.setSearch($queryWrapper, searchValidate, new String[]{ + #foreach ($column in $columns) + #if($column.isQuery) + #if($dateFields.contains($column.columnName)) + "datetime:${column.javaField}Start-${column.javaField}End@${column.columnName}:str", + #elseif($column.javaType=="Integer") + #if($column.javaField.equals($column.columnName)) + "${column.queryType.toLowerCase()}:${column.javaField}:int", + #else + "${column.queryType.toLowerCase()}:${column.javaField}@${column.columnName}:int", + #end + #elseif($column.javaType=="Long") + #if($column.javaField.equals($column.columnName)) + "${column.queryType.toLowerCase()}:${column.javaField}:long", + #else + "${column.queryType.toLowerCase()}:${column.javaField}@${column.columnName}:long", + #end + #else + #if($column.javaField.equals($column.columnName)) + "${column.queryType.toLowerCase()}:${column.javaField}:str", + #else + "${column.queryType.toLowerCase()}:${column.javaField}@${column.columnName}:str", + #end + #end + #end + #end + }); + #end + + #if(!$table.subTableName.equals("") && !$table.subTableFk.equals("")) + #set($isJoin = true) + #set($joinCrudList = "${EntityName}ListedVo") + #set($joinCrudName = "iPage.getRecords()") + #if($table.genTpl.equals("crud")) + IPage<${EntityName}ListedVo> iPage = ${entityName}Mapper.selectJoinPage( + new Page<>(page, limit), + ${EntityName}ListedVo.class, + $queryWrapper); + #else + #set($joinCrudName = "array") + List<${EntityName}ListedVo> array = ${entityName}Mapper.selectJoinList( + ${EntityName}ListedVo.class, + $queryWrapper); + #end + #else + #set($isJoin = false) + #set($joinCrudList = "${EntityName}") + #if($table.genTpl.equals("crud")) + #set($joinCrudName = "iPage.getRecords()") + IPage<${EntityName}> iPage = ${entityName}Mapper.selectPage(new Page<>(page, limit), $queryWrapper); + #else + #set($joinCrudName = "array") + List<${EntityName}> array = ${entityName}Mapper.selectList($queryWrapper); + #end + #end + + #if(!$isJoin) + List<${EntityName}ListedVo> list = new LinkedList<>(); + #end + for($joinCrudList item : $joinCrudName) { + #if(!$isJoin) + ${EntityName}ListedVo vo = new ${EntityName}ListedVo(); + BeanUtils.copyProperties(item, vo); + #if($listFields.contains("image")) + vo.setImage(UrlUtils.toAbsoluteUrl(item.getImage())); + #end + #if($listFields.contains("avatar")) + vo.setAvatar(UrlUtils.toAbsoluteUrl(item.getAvatar())); + #end + #if($listFields.contains("logo")) + vo.setLogo(UrlUtils.toAbsoluteUrl(item.getLogo())); + #end + #if($listFields.contains("img")) + vo.setImg(UrlUtils.toAbsoluteUrl(item.getImg())); + #end + #if($listFields.contains("create_time")) + vo.setCreateTime(TimeUtils.timestampToDate(item.getCreateTime())); + #end + #if($listFields.contains("update_time")) + vo.setUpdateTime(TimeUtils.timestampToDate(item.getUpdateTime())); + #end + #if($listFields.contains("delete_time")) + vo.setDeleteTime(TimeUtils.timestampToDate(item.getDeleteTime())); + #end + #if($listFields.contains("start_time")) + vo.setStartTime(TimeUtils.timestampToDate(item.getStartTime())); + #end + #if($listFields.contains("end_time")) + vo.setEndTime(TimeUtils.timestampToDate(item.getEndTime())); + #end + list.add(vo); + #else + #if($listFields.contains("image")) + item.setImage(UrlUtils.toAbsoluteUrl(item.getImage())); + #end + #if($listFields.contains("avatar")) + item.setAvatar(UrlUtils.toAbsoluteUrl(item.getAvatar())); + #end + #if($listFields.contains("logo")) + item.setLogo(UrlUtils.toAbsoluteUrl(item.getLogo())); + #end + #if($listFields.contains("img")) + item.setImg(UrlUtils.toAbsoluteUrl(item.getImg())); + #end + #if($listFields.contains("create_time")) + item.setCreateTime(TimeUtils.timestampToDate(item.getCreateTime())); + #end + #if($listFields.contains("update_time")) + item.setUpdateTime(TimeUtils.timestampToDate(item.getUpdateTime())); + #end + #if($listFields.contains("delete_time")) + item.setDeleteTime(TimeUtils.timestampToDate(item.getDeleteTime())); + #end + #if($listFields.contains("start_time")) + item.setStartTime(TimeUtils.timestampToDate(item.getStartTime())); + #end + #if($listFields.contains("end_time")) + item.setEndTime(TimeUtils.timestampToDate(item.getEndTime())); + #end + #end + } + + #if($table.genTpl.equals("crud")) + #if($isJoin) + return PageResult.iPageHandle(iPage); + #else + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list); + #end + #else + #if($filter) + JSONArray jsonArray = JSONArray.parseArray(JSONArray.toJSONString(list)); + #else + JSONArray jsonArray = JSONArray.parseArray(JSONArray.toJSONString(array)); + #end + return ArrayUtils.listToTree(jsonArray, "${table.treePrimary}", "${table.treeParent}", "children"); + #end + } + + /** + * ${functionName}详情 + * + #if($isAuthor) + * @author ${authorName} + #end + * @param id 主键参数 + * @return ${EntityName} + */ + @Override + public ${EntityName}DetailVo detail(Integer id) { + ${EntityName} model = ${entityName}Mapper.selectOne( + new QueryWrapper<${EntityName}>() + .eq("${primaryField}", id) + #if($allFields.contains("is_delete")) + .eq("is_delete", 0) + #end + .last("limit 1")); + + Assert.notNull(model, "数据不存在"); + + ${EntityName}DetailVo vo = new ${EntityName}DetailVo(); + BeanUtils.copyProperties(model, vo); + #if($detailFields.contains("create_time") || $detailFields.contains("update_time") || + $detailFields.contains("delete_time") || $detailFields.contains("start_time") || + $detailFields.contains("end_time") || $detailFields.contains("image") || + $detailFields.contains("avatar") || $detailFields.contains("logo") || + $detailFields.contains("img")) + #if($detailFields.contains("image")) + vo.setImage(UrlUtils.toAbsoluteUrl(model.getImage())); + #end + #if($detailFields.contains("avatar")) + vo.setAvatar(UrlUtils.toAbsoluteUrl(model.getAvatar())); + #end + #if($detailFields.contains("logo")) + vo.setLogo(UrlUtils.toAbsoluteUrl(model.getLogo())); + #end + #if($detailFields.contains("img")) + vo.setImg(UrlUtils.toAbsoluteUrl(model.getImg())); + #end + #if($detailFields.contains("create_time")) + vo.setCreateTime(TimeUtils.timestampToDate(model.getCreateTime())); + #end + #if($detailFields.contains("update_time")) + vo.setUpdateTime(TimeUtils.timestampToDate(model.getUpdateTime())); + #end + #if($detailFields.contains("delete_time")) + vo.setDeleteTime(TimeUtils.timestampToDate(model.getDeleteTime())); + #end + #if($detailFields.contains("start_time")) + vo.setStartTime(TimeUtils.timestampToDate(model.getStartTime())); + #end + #if($detailFields.contains("end_time")) + vo.setEndTime(TimeUtils.timestampToDate(model.getEndTime())); + #end + #end + return vo; + } + + /** + * ${functionName}新增 + * + #if($isAuthor) + * @author ${authorName} + #end + * @param createValidate 参数 + */ + @Override + public void add(${EntityName}CreateValidate createValidate) { + ${EntityName} model = new ${EntityName}(); + #foreach ($column in $columns) + #if(($column.isInsert || $column.columnName.equals("create_time") || $column.columnName.equals("update_time")) && !$column.columnName.equals($primaryField)) + #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) + #if($column.javaField.equals("image") || $column.javaField.equals("avatar") || $column.javaField.equals("logo") || $column.javaField.equals("img")) + model.set${AttrName}(UrlUtils.toRelativeUrl(createValidate.get${AttrName}())); + #elseif(!$dateFields.contains($column.columnName) and !$column.javaField.equals("isDelete")) + model.set${AttrName}(createValidate.get${AttrName}()); + #elseif($column.htmlType=="datetime") + model.set${AttrName}(System.currentTimeMillis() / 1000); + #end + #end + #end + ${entityName}Mapper.insert(model); + } + + /** + * ${functionName}编辑 + * + #if($isAuthor) + * @author ${authorName} + #end + * @param updateValidate 参数 + */ + @Override + public void edit(${EntityName}UpdateValidate updateValidate) { + #set($AttrName=$primaryKey.substring(0,1).toUpperCase() + ${primaryKey.substring(1)}) + ${EntityName} model = ${entityName}Mapper.selectOne( + new QueryWrapper<${EntityName}>() + .eq("${primaryField}", updateValidate.get${AttrName}()) + #if($allFields.contains("is_delete")) + .eq("is_delete", 0) + #end + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + + #foreach ($column in $columns) + #if($column.isEdit==1 || $column.columnName.equals("update_time")) + #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) + #if($column.javaField.equals("image") || $column.javaField.equals("avatar") || $column.javaField.equals("logo") || $column.javaField.equals("img")) + model.set${AttrName}(UrlUtils.toRelativeUrl(updateValidate.get${AttrName}())); + #elseif(!$dateFields.contains($column.columnName) and !$column.javaField.equals("isDelete")) + model.set${AttrName}(updateValidate.get${AttrName}()); + #elseif($column.htmlType=="datetime" && $column.columnName.equals("update_time")) + model.set${AttrName}(System.currentTimeMillis() / 1000); + #end + #end + #end + ${entityName}Mapper.updateById(model); + } + + /** + * ${functionName}删除 + * + #if($isAuthor) + * @author ${authorName} + #end + * @param id 主键ID + */ + @Override + public void del(Integer id) { + ${EntityName} model = ${entityName}Mapper.selectOne( + new QueryWrapper<${EntityName}>() + .eq("${primaryField}", id) + #if($allFields.contains("is_delete")) + .eq("is_delete", 0) + #end + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + + #if($allFields.contains("is_delete")) + model.setIsDelete(1); + #if($allFields.contains("delete_time")) + model.setDeleteTime(System.currentTimeMillis() / 1000); + #end + ${entityName}Mapper.updateById(model); + #else + ${entityName}Mapper.delete(new QueryWrapper<${EntityName}>().eq("${primaryField}", id)); + #end + } + +} diff --git a/yj-generator/src/main/resources/java/validateCreate.java.vm b/yj-generator/src/main/resources/java/validateCreate.java.vm new file mode 100644 index 0000000..cbfe3e8 --- /dev/null +++ b/yj-generator/src/main/resources/java/validateCreate.java.vm @@ -0,0 +1,33 @@ +package ${packageName}.admin.validate; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +#foreach ($column in $columns) +#if ($column.javaType.equals("BigDecimal")) +import java.math.BigDecimal; +#end +#if ($column.javaType.equals("Date")) +import java.util.Date; +#end +#end +import javax.validation.constraints.*; + +@Data +@ApiModel("${functionName}创建参数") +public class ${EntityName}CreateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if($column.isInsert==1) + #if($column.isRequired==1) + @NotNull(message = "${column.javaField}参数缺失") + #end + @ApiModelProperty(value = "${column.columnComment}") + private ${column.javaType} ${column.javaField}; + +#end +#end +} diff --git a/yj-generator/src/main/resources/java/validateSearch.java.vm b/yj-generator/src/main/resources/java/validateSearch.java.vm new file mode 100644 index 0000000..6efd617 --- /dev/null +++ b/yj-generator/src/main/resources/java/validateSearch.java.vm @@ -0,0 +1,37 @@ +package ${packageName}.admin.validate; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +#foreach ($column in $columns) +#if ($column.javaType.equals("BigDecimal")) +import java.math.BigDecimal; +#end +#if ($column.javaType.equals("Date")) +import java.util.Date; +#end +#end + +@Data +@ApiModel("${functionName}搜素参数") +public class ${EntityName}SearchValidate implements Serializable { + + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if($column.isQuery==1) + #if ($column.columnName.equals("create_time") || $column.columnName.equals("update_time") || $column.columnName.equals("delete_time")) + @ApiModelProperty(value = "开始时间") + private String ${column.javaField}Start; + + @ApiModelProperty(value = "结束时间") + private String ${column.javaField}End; + #else + @ApiModelProperty(value = "${column.columnComment}") + private ${column.javaType} ${column.javaField}; + #end + +#end +#end +} diff --git a/yj-generator/src/main/resources/java/validateUpdate.java.vm b/yj-generator/src/main/resources/java/validateUpdate.java.vm new file mode 100644 index 0000000..9bd0f15 --- /dev/null +++ b/yj-generator/src/main/resources/java/validateUpdate.java.vm @@ -0,0 +1,44 @@ +package ${packageName}.admin.validate; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; +import javax.validation.constraints.*; +#foreach ($column in $columns) +#if ($column.javaType.equals("BigDecimal")) +import java.math.BigDecimal; +#end +#if ($column.javaType.equals("Date")) +import java.util.Date; +#end +#end +import ${packageName}.common.validator.annotation.IDMust; + +#set($isAuthor = !$authorName.equals("")) +/** + * ${functionName}参数 +#if($isAuthor) + * @author ${authorName} +#end + */ +@Data +@ApiModel("${functionName}更新参数") +public class ${EntityName}UpdateValidate implements Serializable { + + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if($column.isEdit==1) + #if($column.isRequired==1 && $column.isPk==0) + @NotNull(message = "${column.javaField}参数缺失") + #end + #if($column.isPk==1) + @IDMust(message = "${column.javaField}参数必传且需大于0") + #end + @ApiModelProperty(value = "${column.columnComment}") + private ${column.javaType} ${column.javaField}; + +#end +#end +} diff --git a/yj-generator/src/main/resources/java/voDetail.java.vm b/yj-generator/src/main/resources/java/voDetail.java.vm new file mode 100644 index 0000000..7d9936c --- /dev/null +++ b/yj-generator/src/main/resources/java/voDetail.java.vm @@ -0,0 +1,36 @@ +package ${packageName}.admin.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +#foreach ($column in $columns) +#if ($column.javaType.equals("BigDecimal")) +import java.math.BigDecimal; +#end +#if ($column.javaType.equals("Date")) +import java.util.Date; +#end +#end + +@Data +@ApiModel("${functionName}详情Vo") +public class ${EntityName}DetailVo implements Serializable { + + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if($column.isEdit==1 || $column.isPk==1) + #if($dateFields.contains($column.columnName)) + @ApiModelProperty(value = "${column.columnComment}") + private String ${column.javaField}; + #else + @ApiModelProperty(value = "${column.columnComment}") + private ${column.javaType} ${column.javaField}; + #end + +#end +#end + +} diff --git a/yj-generator/src/main/resources/java/voListed.java.vm b/yj-generator/src/main/resources/java/voListed.java.vm new file mode 100644 index 0000000..b7f75dd --- /dev/null +++ b/yj-generator/src/main/resources/java/voListed.java.vm @@ -0,0 +1,37 @@ +package ${packageName}.admin.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +#foreach ($column in $columns) +#if ($column.javaType.equals("BigDecimal")) +import java.math.BigDecimal; +#end +#if ($column.javaType.equals("Date")) +import java.util.Date; +#end +#end + +@Data +@ApiModel("${functionName}列表Vo") +public class ${EntityName}ListedVo implements Serializable { + + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if($column.isList==1 || $column.isPk==1) + #if($dateFields.contains($column.columnName)) + @ApiModelProperty(value = "${column.columnComment}") + private String ${column.javaField}; + + #else + @ApiModelProperty(value = "${column.columnComment}") + private ${column.javaType} ${column.javaField}; + + #end +#end +#end + +} diff --git a/yj-generator/src/main/resources/vue/api.ts.vm b/yj-generator/src/main/resources/vue/api.ts.vm new file mode 100644 index 0000000..79297b8 --- /dev/null +++ b/yj-generator/src/main/resources/vue/api.ts.vm @@ -0,0 +1,26 @@ +import request from '@/utils/request' + +// ${functionName}列表 +export function ${moduleName}Lists(params?: Record) { + return request.get({ url: '/${moduleName}/list', params }) +} + +// ${functionName}详情 +export function ${moduleName}Detail(params: Record) { + return request.get({ url: '/${moduleName}/detail', params }) +} + +// ${functionName}新增 +export function ${moduleName}Add(params: Record) { + return request.post({ url: '/${moduleName}/add', params }) +} + +// ${functionName}编辑 +export function ${moduleName}Edit(params: Record) { + return request.post({ url: '/${moduleName}/edit', params }) +} + +// ${functionName}删除 +export function ${moduleName}Delete(params: Record) { + return request.post({ url: '/${moduleName}/del', params }) +} diff --git a/yj-generator/src/main/resources/vue/edit.vue.vm b/yj-generator/src/main/resources/vue/edit.vue.vm new file mode 100644 index 0000000..8e62ff4 --- /dev/null +++ b/yj-generator/src/main/resources/vue/edit.vue.vm @@ -0,0 +1,249 @@ + + diff --git a/yj-generator/src/main/resources/vue/index-tree.vue.vm b/yj-generator/src/main/resources/vue/index-tree.vue.vm new file mode 100644 index 0000000..14213a9 --- /dev/null +++ b/yj-generator/src/main/resources/vue/index-tree.vue.vm @@ -0,0 +1,227 @@ + + diff --git a/yj-generator/src/main/resources/vue/index.vue.vm b/yj-generator/src/main/resources/vue/index.vue.vm new file mode 100644 index 0000000..93b6ca6 --- /dev/null +++ b/yj-generator/src/main/resources/vue/index.vue.vm @@ -0,0 +1,183 @@ + +