diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..b4dad81 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,4 @@ +### 1.0.0 + +*2019-07-02* + diff --git a/README.md b/README.md new file mode 100644 index 0000000..6798acb --- /dev/null +++ b/README.md @@ -0,0 +1,108 @@ +一个基于spring boot、spring oauth2.0、mybatis、redis的轻量级、前后端分离、拥有完整sku和下单流程的完全开源商城 + + + +该项目仅供学习参考、可供个人学习使用、如需商用联系作者进行授权,否则必将追究法律责任 + + + +## 前言 + +`亚米商城`项目致力于为中小企业打造一个完整、易于维护的开源的电商系统,采用现阶段流行技术实现。后台管理系统包含商品管理、订单管理、运费模板、规格管理、会员管理、运营管理、内容管理、统计报表、权限管理、设置等模块。 + + + +## 项目链接 + +java后台:https://gitee.com/gz-yami/mall4j + +vue后台:https://gitee.com/gz-yami/mall4v + +小程序:https://gitee.com/gz-yami/mall4m + + + +## 演示地址 + +后台: 账号:admin/123456 + +小程序:1. 扫描二维码 + +![小程序](https://gitee.com/gz-yami/mall4j/raw/master/screenshot/miniQrcode.jpg) + +​ 2. 搜索小程序 **亚米商城** + +## 技术选型 + +| 技术 | 版本 | 说明 | +| ---------------------- | ------ | --------------------------------------- | +| Spring Boot | 2.1.6 | MVC核心框架 | +| Spring Security oauth2 | 2.1.5 | 认证和授权框架 | +| MyBatis | 3.5.0 | ORM框架 | +| MyBatisPlus | 3.1.0 | 基于mybatis,使用lambda表达式的 | +| Swagger-UI | 2.9.2 | 文档生产工具 | +| Hibernator-Validator | 6.0.17 | 验证框架 | +| redisson | 3.10.6 | 对redis进行封装、集成分布式锁等 | +| hikari | 3.2.0 | 数据库连接池 | +| log4j2 | 2.11.2 | 更快的log日志工具 | +| fst | 2.57 | 更快的序列化和反序列化工具 | +| orika | 1.5.4 | 更快的bean复制工具 | +| lombok | 1.18.8 | 简化对象封装工具 | +| hutool | 4.5.0 | 更适合国人的java工具集 | +| swagger-bootstrap | 1.9.3 | 基于swagger,更便于国人使用的swagger ui | + + + +## 部署教程 + + + +### 1.开发环境 + +| 工具 | 版本 | +| ----- | ---- | +| jdk | 1.8+ | +| mysql | 5.7+ | +| redis | 3.2+ | + +### 2.启动 + +- 推荐使用idea,安装lombok插件后,使用idea导入maven项目 +- 将shop.sql导入到mysql中,修改`application-dev.yml`更改 datasource.url、user、password +- 通过修改`ma.properties` 修改微信小程序信息 +- 通过修改`mp.properties` 修改微信公众号信息 +- 通过修改`pay.properties` 修改微信支付信息 +- 通过修改`shop.properties` 修改七牛云、阿里大于等信息 +- 修改`api.properties` 修改当前接口所在域名,用于支付回调 +- 启动redis,端口6379 +- 通过`WebApplication`启动项目后台接口,`ApiApplication` 启动项目前端接口 + + + + + +## 相关截图 + +![登陆](https://gitee.com/gz-yami/mall4j/raw/master/screenshot/login.png) + +![订单](https://gitee.com/gz-yami/mall4j/raw/master/screenshot/order.png) + +![商品列表](https://gitee.com/gz-yami/mall4j/raw/master/screenshot/prodList.png) + +![sku](https://gitee.com/gz-yami/mall4j/raw/master/screenshot/sku.png) + +![运费模板](https://gitee.com/gz-yami/mall4j/raw/master/screenshot/transport.png) + + + +## 提交反馈 + +提问之前,请先阅读[提问的智慧](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md): + +- QQ群:722835385 + + ![QQ群](https://gitee.com/gz-yami/mall4j/raw/master/screenshot/qqGroup.png) + +- 论坛: + +- 商务邮箱:yamitech@163.com diff --git a/db/yami_shop.sql b/db/yami_shop.sql new file mode 100644 index 0000000..062baf1 --- /dev/null +++ b/db/yami_shop.sql @@ -0,0 +1,6351 @@ +/* +SQLyog Ultimate v12.5.1 (64 bit) +MySQL - 5.7.23 : Database - mall4j +********************************************************************* +*/ + +/*!40101 SET NAMES utf8 */; + +/*!40101 SET SQL_MODE=''*/; + +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +/*Table structure for table `qrtz_blob_triggers` */ + +DROP TABLE IF EXISTS `qrtz_blob_triggers`; + +CREATE TABLE `qrtz_blob_triggers` ( + `SCHED_NAME` varchar(120) NOT NULL, + `TRIGGER_NAME` varchar(200) NOT NULL, + `TRIGGER_GROUP` varchar(200) NOT NULL, + `BLOB_DATA` blob, + PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), + KEY `SCHED_NAME` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), + CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `qrtz_blob_triggers` */ + +/*Table structure for table `qrtz_calendars` */ + +DROP TABLE IF EXISTS `qrtz_calendars`; + +CREATE TABLE `qrtz_calendars` ( + `SCHED_NAME` varchar(120) NOT NULL, + `CALENDAR_NAME` varchar(200) NOT NULL, + `CALENDAR` blob NOT NULL, + PRIMARY KEY (`SCHED_NAME`,`CALENDAR_NAME`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `qrtz_calendars` */ + +/*Table structure for table `qrtz_cron_triggers` */ + +DROP TABLE IF EXISTS `qrtz_cron_triggers`; + +CREATE TABLE `qrtz_cron_triggers` ( + `SCHED_NAME` varchar(120) NOT NULL, + `TRIGGER_NAME` varchar(200) NOT NULL, + `TRIGGER_GROUP` varchar(200) NOT NULL, + `CRON_EXPRESSION` varchar(120) NOT NULL, + `TIME_ZONE_ID` varchar(80) DEFAULT NULL, + PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), + CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `qrtz_cron_triggers` */ + +insert into `qrtz_cron_triggers`(`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`,`CRON_EXPRESSION`,`TIME_ZONE_ID`) values +('clusteredScheduler','TASK_10','DEFAULT','0 0 0/1 * * ?','Asia/Shanghai'), +('clusteredScheduler','TASK_11','DEFAULT','0 0 0/1 * * ?','Asia/Shanghai'), +('clusteredScheduler','TASK_12','DEFAULT','0 0 0/1 * * ?','Asia/Shanghai'), +('clusteredScheduler','TASK_13','DEFAULT','0 0 0/1 * * ?','Asia/Shanghai'); + +/*Table structure for table `qrtz_fired_triggers` */ + +DROP TABLE IF EXISTS `qrtz_fired_triggers`; + +CREATE TABLE `qrtz_fired_triggers` ( + `SCHED_NAME` varchar(120) NOT NULL, + `ENTRY_ID` varchar(95) NOT NULL, + `TRIGGER_NAME` varchar(200) NOT NULL, + `TRIGGER_GROUP` varchar(200) NOT NULL, + `INSTANCE_NAME` varchar(200) NOT NULL, + `FIRED_TIME` bigint(13) NOT NULL, + `SCHED_TIME` bigint(13) NOT NULL, + `PRIORITY` int(11) NOT NULL, + `STATE` varchar(16) NOT NULL, + `JOB_NAME` varchar(200) DEFAULT NULL, + `JOB_GROUP` varchar(200) DEFAULT NULL, + `IS_NONCONCURRENT` varchar(1) DEFAULT NULL, + `REQUESTS_RECOVERY` varchar(1) DEFAULT NULL, + PRIMARY KEY (`SCHED_NAME`,`ENTRY_ID`), + KEY `IDX_QRTZ_FT_TRIG_INST_NAME` (`SCHED_NAME`,`INSTANCE_NAME`), + KEY `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY` (`SCHED_NAME`,`INSTANCE_NAME`,`REQUESTS_RECOVERY`), + KEY `IDX_QRTZ_FT_J_G` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`), + KEY `IDX_QRTZ_FT_JG` (`SCHED_NAME`,`JOB_GROUP`), + KEY `IDX_QRTZ_FT_T_G` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), + KEY `IDX_QRTZ_FT_TG` (`SCHED_NAME`,`TRIGGER_GROUP`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `qrtz_fired_triggers` */ + +/*Table structure for table `qrtz_job_details` */ + +DROP TABLE IF EXISTS `qrtz_job_details`; + +CREATE TABLE `qrtz_job_details` ( + `SCHED_NAME` varchar(120) NOT NULL, + `JOB_NAME` varchar(200) NOT NULL, + `JOB_GROUP` varchar(200) NOT NULL, + `DESCRIPTION` varchar(250) DEFAULT NULL, + `JOB_CLASS_NAME` varchar(250) NOT NULL, + `IS_DURABLE` varchar(1) NOT NULL, + `IS_NONCONCURRENT` varchar(1) NOT NULL, + `IS_UPDATE_DATA` varchar(1) NOT NULL, + `REQUESTS_RECOVERY` varchar(1) NOT NULL, + `JOB_DATA` blob, + PRIMARY KEY (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`), + KEY `IDX_QRTZ_J_REQ_RECOVERY` (`SCHED_NAME`,`REQUESTS_RECOVERY`), + KEY `IDX_QRTZ_J_GRP` (`SCHED_NAME`,`JOB_GROUP`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `qrtz_job_details` */ + +insert into `qrtz_job_details`(`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`,`DESCRIPTION`,`JOB_CLASS_NAME`,`IS_DURABLE`,`IS_NONCONCURRENT`,`IS_UPDATE_DATA`,`REQUESTS_RECOVERY`,`JOB_DATA`) values +('clusteredScheduler','TASK_10','DEFAULT',NULL,'com.yami.shop.quartz.config.QuartzJob','0','1','0','0','¬í\0sr\0org.quartz.JobDataMapŸ°ƒ迩°Ë\0\0xr\0&org.quartz.utils.StringKeyDirtyFlagMap‚èÃûÅ](\0Z\0allowsTransientDataxr\0org.quartz.utils.DirtyFlagMapæ.­(v\nÎ\0Z\0dirtyL\0mapt\0Ljava/util/Map;xpsr\0java.util.HashMapÚÁÃ`Ñ\0F\0\nloadFactorI\0 thresholdxp?@\0\0\0\0\0 w\0\0\0\0\0\0t\0\rJOB_PARAM_KEYsr\0&com.yami.shop.quartz.model.ScheduleJob~ûdꂑ« \0L\0beanNamet\0Ljava/lang/String;L\0\ncreateTimet\0Ljava/util/Date;L\0cronExpressionq\0~\0 L\0jobIdt\0Ljava/lang/Long;L\0\nmethodNameq\0~\0 L\0paramsq\0~\0 L\0remarkq\0~\0 L\0statust\0Ljava/lang/Integer;xpt\0\ncouponTasksr\0java.util.Datehj�KYt\0\0xpw\0\0kds×sxt\0\r0 0 0/0 * * ?sr\0java.lang.Long;‹ä�̏#ß\0J\0valuexr\0java.lang.Number†¬• ”à‹\0\0xp\0\0\0\0\0\0\0\nt\0 changeCoupont\0\0q\0~\0sr\0java.lang.Integer⠤÷�‡8\0I\0valuexq\0~\0\0\0\0\0x\0'), +('clusteredScheduler','TASK_11','DEFAULT',NULL,'com.yami.shop.quartz.config.QuartzJob','0','1','0','0','¬í\0sr\0org.quartz.JobDataMapŸ°ƒ迩°Ë\0\0xr\0&org.quartz.utils.StringKeyDirtyFlagMap‚èÃûÅ](\0Z\0allowsTransientDataxr\0org.quartz.utils.DirtyFlagMapæ.­(v\nÎ\0Z\0dirtyL\0mapt\0Ljava/util/Map;xpsr\0java.util.HashMapÚÁÃ`Ñ\0F\0\nloadFactorI\0 thresholdxp?@\0\0\0\0\0 w\0\0\0\0\0\0t\0\rJOB_PARAM_KEYsr\0&com.yami.shop.quartz.model.ScheduleJob~ûdꂑ« \0L\0beanNamet\0Ljava/lang/String;L\0\ncreateTimet\0Ljava/util/Date;L\0cronExpressionq\0~\0 L\0jobIdt\0Ljava/lang/Long;L\0\nmethodNameq\0~\0 L\0paramsq\0~\0 L\0remarkq\0~\0 L\0statust\0Ljava/lang/Integer;xpt\0\ncouponTasksr\0java.util.Datehj�KYt\0\0xpw\0\0kdu0Sxt\0\r0 0 0/1 * * ?sr\0java.lang.Long;‹ä�̏#ß\0J\0valuexr\0java.lang.Number†¬• ”à‹\0\0xp\0\0\0\0\0\0\0 t\0deleteCouponUsert\0\0t\0)删除用户失效30天以上的优惠券sr\0java.lang.Integer⠤÷�‡8\0I\0valuexq\0~\0\0\0\0\0x\0'), +('clusteredScheduler','TASK_12','DEFAULT',NULL,'com.yami.shop.quartz.config.QuartzJob','0','1','0','0','¬í\0sr\0org.quartz.JobDataMapŸ°ƒ迩°Ë\0\0xr\0&org.quartz.utils.StringKeyDirtyFlagMap‚èÃûÅ](\0Z\0allowsTransientDataxr\0org.quartz.utils.DirtyFlagMapæ.­(v\nÎ\0Z\0dirtyL\0mapt\0Ljava/util/Map;xpsr\0java.util.HashMapÚÁÃ`Ñ\0F\0\nloadFactorI\0 thresholdxp?@\0\0\0\0\0 w\0\0\0\0\0\0t\0\rJOB_PARAM_KEYsr\0&com.yami.shop.quartz.model.ScheduleJob~ûdꂑ« \0L\0beanNamet\0Ljava/lang/String;L\0\ncreateTimet\0Ljava/util/Date;L\0cronExpressionq\0~\0 L\0jobIdt\0Ljava/lang/Long;L\0\nmethodNameq\0~\0 L\0paramsq\0~\0 L\0remarkq\0~\0 L\0statust\0Ljava/lang/Integer;xpt\0\ncouponTasksr\0java.util.Datehj�KYt\0\0xpw\0\0kdu¶üxt\0\r0 0 0/1 * * ?sr\0java.lang.Long;‹ä�̏#ß\0J\0valuexr\0java.lang.Number†¬• ”à‹\0\0xp\0\0\0\0\0\0\0 t\0changeCouponUsert\0\0t\02改变用户优惠券的状态(设为失效状态)sr\0java.lang.Integer⠤÷�‡8\0I\0valuexq\0~\0\0\0\0\0x\0'), +('clusteredScheduler','TASK_13','DEFAULT',NULL,'com.yami.shop.quartz.config.QuartzJob','0','1','0','0','¬í\0sr\0org.quartz.JobDataMapŸ°ƒ迩°Ë\0\0xr\0&org.quartz.utils.StringKeyDirtyFlagMap‚èÃûÅ](\0Z\0allowsTransientDataxr\0org.quartz.utils.DirtyFlagMapæ.­(v\nÎ\0Z\0dirtyL\0mapt\0Ljava/util/Map;xpsr\0java.util.HashMapÚÁÃ`Ñ\0F\0\nloadFactorI\0 thresholdxp?@\0\0\0\0\0 w\0\0\0\0\0\0t\0\rJOB_PARAM_KEYsr\0&com.yami.shop.quartz.model.ScheduleJob~ûdꂑ« \0L\0beanNamet\0Ljava/lang/String;L\0\ncreateTimet\0Ljava/util/Date;L\0cronExpressionq\0~\0 L\0jobIdt\0Ljava/lang/Long;L\0\nmethodNameq\0~\0 L\0paramsq\0~\0 L\0remarkq\0~\0 L\0statust\0Ljava/lang/Integer;xpt\0\ncouponTasksr\0java.util.Datehj�KYt\0\0xpw\0\0kdv\n×xt\0\r0 0 0/1 * * ?sr\0java.lang.Long;‹ä�̏#ß\0J\0valuexr\0java.lang.Number†¬• ”à‹\0\0xp\0\0\0\0\0\0\0\rt\0 putOnCoupont\0\0t\0投放优惠券sr\0java.lang.Integer⠤÷�‡8\0I\0valuexq\0~\0\0\0\0\0x\0'); + +/*Table structure for table `qrtz_locks` */ + +DROP TABLE IF EXISTS `qrtz_locks`; + +CREATE TABLE `qrtz_locks` ( + `SCHED_NAME` varchar(120) NOT NULL, + `LOCK_NAME` varchar(40) NOT NULL, + PRIMARY KEY (`SCHED_NAME`,`LOCK_NAME`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `qrtz_locks` */ + +insert into `qrtz_locks`(`SCHED_NAME`,`LOCK_NAME`) values +('clusteredScheduler','STATE_ACCESS'), +('clusteredScheduler','TRIGGER_ACCESS'); + +/*Table structure for table `qrtz_paused_trigger_grps` */ + +DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`; + +CREATE TABLE `qrtz_paused_trigger_grps` ( + `SCHED_NAME` varchar(120) NOT NULL, + `TRIGGER_GROUP` varchar(200) NOT NULL, + PRIMARY KEY (`SCHED_NAME`,`TRIGGER_GROUP`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `qrtz_paused_trigger_grps` */ + +/*Table structure for table `qrtz_scheduler_state` */ + +DROP TABLE IF EXISTS `qrtz_scheduler_state`; + +CREATE TABLE `qrtz_scheduler_state` ( + `SCHED_NAME` varchar(120) NOT NULL, + `INSTANCE_NAME` varchar(200) NOT NULL, + `LAST_CHECKIN_TIME` bigint(13) NOT NULL, + `CHECKIN_INTERVAL` bigint(13) NOT NULL, + PRIMARY KEY (`SCHED_NAME`,`INSTANCE_NAME`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `qrtz_scheduler_state` */ + +insert into `qrtz_scheduler_state`(`SCHED_NAME`,`INSTANCE_NAME`,`LAST_CHECKIN_TIME`,`CHECKIN_INTERVAL`) values +('clusteredScheduler','izwz95bzimx383fx9d3foaz1561972471765',1562155479328,10000); + +/*Table structure for table `qrtz_simple_triggers` */ + +DROP TABLE IF EXISTS `qrtz_simple_triggers`; + +CREATE TABLE `qrtz_simple_triggers` ( + `SCHED_NAME` varchar(120) NOT NULL, + `TRIGGER_NAME` varchar(200) NOT NULL, + `TRIGGER_GROUP` varchar(200) NOT NULL, + `REPEAT_COUNT` bigint(7) NOT NULL, + `REPEAT_INTERVAL` bigint(12) NOT NULL, + `TIMES_TRIGGERED` bigint(10) NOT NULL, + PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), + CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `qrtz_simple_triggers` */ + +/*Table structure for table `qrtz_simprop_triggers` */ + +DROP TABLE IF EXISTS `qrtz_simprop_triggers`; + +CREATE TABLE `qrtz_simprop_triggers` ( + `SCHED_NAME` varchar(120) NOT NULL, + `TRIGGER_NAME` varchar(200) NOT NULL, + `TRIGGER_GROUP` varchar(200) NOT NULL, + `STR_PROP_1` varchar(512) DEFAULT NULL, + `STR_PROP_2` varchar(512) DEFAULT NULL, + `STR_PROP_3` varchar(512) DEFAULT NULL, + `INT_PROP_1` int(11) DEFAULT NULL, + `INT_PROP_2` int(11) DEFAULT NULL, + `LONG_PROP_1` bigint(20) DEFAULT NULL, + `LONG_PROP_2` bigint(20) DEFAULT NULL, + `DEC_PROP_1` decimal(13,4) DEFAULT NULL, + `DEC_PROP_2` decimal(13,4) DEFAULT NULL, + `BOOL_PROP_1` varchar(1) DEFAULT NULL, + `BOOL_PROP_2` varchar(1) DEFAULT NULL, + PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), + CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `qrtz_simprop_triggers` */ + +/*Table structure for table `qrtz_triggers` */ + +DROP TABLE IF EXISTS `qrtz_triggers`; + +CREATE TABLE `qrtz_triggers` ( + `SCHED_NAME` varchar(120) NOT NULL, + `TRIGGER_NAME` varchar(200) NOT NULL, + `TRIGGER_GROUP` varchar(200) NOT NULL, + `JOB_NAME` varchar(200) NOT NULL, + `JOB_GROUP` varchar(200) NOT NULL, + `DESCRIPTION` varchar(250) DEFAULT NULL, + `NEXT_FIRE_TIME` bigint(13) DEFAULT NULL, + `PREV_FIRE_TIME` bigint(13) DEFAULT NULL, + `PRIORITY` int(11) DEFAULT NULL, + `TRIGGER_STATE` varchar(16) NOT NULL, + `TRIGGER_TYPE` varchar(8) NOT NULL, + `START_TIME` bigint(13) NOT NULL, + `END_TIME` bigint(13) DEFAULT NULL, + `CALENDAR_NAME` varchar(200) DEFAULT NULL, + `MISFIRE_INSTR` smallint(2) DEFAULT NULL, + `JOB_DATA` blob, + PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), + KEY `IDX_QRTZ_T_J` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`), + KEY `IDX_QRTZ_T_JG` (`SCHED_NAME`,`JOB_GROUP`), + KEY `IDX_QRTZ_T_C` (`SCHED_NAME`,`CALENDAR_NAME`), + KEY `IDX_QRTZ_T_G` (`SCHED_NAME`,`TRIGGER_GROUP`), + KEY `IDX_QRTZ_T_STATE` (`SCHED_NAME`,`TRIGGER_STATE`), + KEY `IDX_QRTZ_T_N_STATE` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`), + KEY `IDX_QRTZ_T_N_G_STATE` (`SCHED_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`), + KEY `IDX_QRTZ_T_NEXT_FIRE_TIME` (`SCHED_NAME`,`NEXT_FIRE_TIME`), + KEY `IDX_QRTZ_T_NFT_ST` (`SCHED_NAME`,`TRIGGER_STATE`,`NEXT_FIRE_TIME`), + KEY `IDX_QRTZ_T_NFT_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`), + KEY `IDX_QRTZ_T_NFT_ST_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_STATE`), + KEY `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_GROUP`,`TRIGGER_STATE`), + CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `qrtz_job_details` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `qrtz_triggers` */ + +insert into `qrtz_triggers`(`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`,`JOB_NAME`,`JOB_GROUP`,`DESCRIPTION`,`NEXT_FIRE_TIME`,`PREV_FIRE_TIME`,`PRIORITY`,`TRIGGER_STATE`,`TRIGGER_TYPE`,`START_TIME`,`END_TIME`,`CALENDAR_NAME`,`MISFIRE_INSTR`,`JOB_DATA`) values +('clusteredScheduler','TASK_10','DEFAULT','TASK_10','DEFAULT',NULL,1561359600000,1561356000000,5,'PAUSED','CRON',1560758441000,0,NULL,1,'¬í\0sr\0org.quartz.JobDataMapŸ°ƒ迩°Ë\0\0xr\0&org.quartz.utils.StringKeyDirtyFlagMap‚èÃûÅ](\0Z\0allowsTransientDataxr\0org.quartz.utils.DirtyFlagMapæ.­(v\nÎ\0Z\0dirtyL\0mapt\0Ljava/util/Map;xpsr\0java.util.HashMapÚÁÃ`Ñ\0F\0\nloadFactorI\0 thresholdxp?@\0\0\0\0\0 w\0\0\0\0\0\0t\0\rJOB_PARAM_KEYsr\0&com.yami.shop.quartz.model.ScheduleJob~ûdꂑ« \0L\0beanNamet\0Ljava/lang/String;L\0\ncreateTimet\0Ljava/util/Date;L\0cronExpressionq\0~\0 L\0jobIdt\0Ljava/lang/Long;L\0\nmethodNameq\0~\0 L\0paramsq\0~\0 L\0remarkq\0~\0 L\0statust\0Ljava/lang/Integer;xpt\0\ncouponTaskpt\0\r0 0 0/1 * * ?sr\0java.lang.Long;‹ä�̏#ß\0J\0valuexr\0java.lang.Number†¬• ”à‹\0\0xp\0\0\0\0\0\0\0\nt\0 changeCoupont\0\0q\0~\0sr\0java.lang.Integer⠤÷�‡8\0I\0valuexq\0~\0\0\0\0\0x\0'), +('clusteredScheduler','TASK_11','DEFAULT','TASK_11','DEFAULT',NULL,1561359600000,1561356000000,5,'PAUSED','CRON',1560758530000,0,NULL,1,''), +('clusteredScheduler','TASK_12','DEFAULT','TASK_12','DEFAULT',NULL,1561359600000,1561356000000,5,'PAUSED','CRON',1560758564000,0,NULL,1,''), +('clusteredScheduler','TASK_13','DEFAULT','TASK_13','DEFAULT',NULL,1561359600000,1561356000000,5,'PAUSED','CRON',1560758586000,0,NULL,1,''); + +/*Table structure for table `tz_app_connect` */ + +DROP TABLE IF EXISTS `tz_app_connect`; + +CREATE TABLE `tz_app_connect` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `user_id` varchar(36) NOT NULL COMMENT '本系统userId', + `app_id` tinyint(2) DEFAULT NULL COMMENT '第三方系统id 1:微信小程序', + `nick_name` varchar(64) DEFAULT NULL COMMENT '第三方系统昵称', + `image_url` varchar(500) DEFAULT NULL COMMENT '第三方系统头像', + `biz_user_id` varchar(255) DEFAULT NULL COMMENT '第三方系统userid', + `biz_unionid` varchar(255) DEFAULT NULL COMMENT '第三方系统unionid', + PRIMARY KEY (`id`), + KEY `user_app_id` (`user_id`,`app_id`) COMMENT '用户id和appid联合索引' +) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8; + +/*Data for the table `tz_app_connect` */ + +insert into `tz_app_connect`(`id`,`user_id`,`app_id`,`nick_name`,`image_url`,`biz_user_id`,`biz_unionid`) values +(48,'51540df5255e4d22903b0f83921095ff',1,NULL,NULL,'o-lgc5CUDIn2nkk8512hKumBnjMI','o92Yz1cLnHuo70epfneTG8SaRY0c'), +(49,'5f159317be5b4dc4bf3188f1a3da0369',1,NULL,NULL,'o-lgc5IHLX-RuR1aw5qwP9bpGDuQ','o92Yz1bmhLV8CKMwQkuPk5C8lFfg'); + +/*Table structure for table `tz_area` */ + +DROP TABLE IF EXISTS `tz_area`; + +CREATE TABLE `tz_area` ( + `area_id` bigint(20) NOT NULL AUTO_INCREMENT, + `area_name` varchar(50) DEFAULT NULL, + `parent_id` bigint(20) DEFAULT NULL, + `level` int(1) DEFAULT NULL, + PRIMARY KEY (`area_id`), + KEY `parent_id` (`parent_id`) COMMENT '上级id' +) ENGINE=InnoDB AUTO_INCREMENT=659006000001 DEFAULT CHARSET=utf8; + +/*Data for the table `tz_area` */ + +insert into `tz_area`(`area_id`,`area_name`,`parent_id`,`level`) values +(110000000000,'北京市',0,1), +(110100000000,'市辖区',110000000000,2), +(110101000000,'东城区',110100000000,3), +(110102000000,'西城区',110100000000,3), +(110105000000,'朝阳区',110100000000,3), +(110106000000,'丰台区',110100000000,3), +(110107000000,'石景山区',110100000000,3), +(110108000000,'海淀区',110100000000,3), +(110109000000,'门头沟区',110100000000,3), +(110111000000,'房山区',110100000000,3), +(110112000000,'通州区',110100000000,3), +(110113000000,'顺义区',110100000000,3), +(110114000000,'昌平区',110100000000,3), +(110115000000,'大兴区',110100000000,3), +(110116000000,'怀柔区',110100000000,3), +(110117000000,'平谷区',110100000000,3), +(110118000000,'密云区',110100000000,3), +(110119000000,'延庆区',110100000000,3), +(120000000000,'天津市',0,1), +(120100000000,'市辖区',120000000000,2), +(120101000000,'和平区',120100000000,3), +(120102000000,'河东区',120100000000,3), +(120103000000,'河西区',120100000000,3), +(120104000000,'南开区',120100000000,3), +(120105000000,'河北区',120100000000,3), +(120106000000,'红桥区',120100000000,3), +(120110000000,'东丽区',120100000000,3), +(120111000000,'西青区',120100000000,3), +(120112000000,'津南区',120100000000,3), +(120113000000,'北辰区',120100000000,3), +(120114000000,'武清区',120100000000,3), +(120115000000,'宝坻区',120100000000,3), +(120116000000,'滨海新区',120100000000,3), +(120117000000,'宁河区',120100000000,3), +(120118000000,'静海区',120100000000,3), +(120119000000,'蓟州区',120100000000,3), +(130000000000,'河北省',0,1), +(130100000000,'石家庄市',130000000000,2), +(130101000000,'市辖区',130100000000,3), +(130102000000,'长安区',130100000000,3), +(130104000000,'桥西区',130100000000,3), +(130105000000,'新华区',130100000000,3), +(130107000000,'井陉矿区',130100000000,3), +(130108000000,'裕华区',130100000000,3), +(130109000000,'藁城区',130100000000,3), +(130110000000,'鹿泉区',130100000000,3), +(130111000000,'栾城区',130100000000,3), +(130121000000,'井陉县',130100000000,3), +(130123000000,'正定县',130100000000,3), +(130125000000,'行唐县',130100000000,3), +(130126000000,'灵寿县',130100000000,3), +(130127000000,'高邑县',130100000000,3), +(130128000000,'深泽县',130100000000,3), +(130129000000,'赞皇县',130100000000,3), +(130130000000,'无极县',130100000000,3), +(130131000000,'平山县',130100000000,3), +(130132000000,'元氏县',130100000000,3), +(130133000000,'赵县',130100000000,3), +(130171000000,'石家庄高新技术产业开发区',130100000000,3), +(130172000000,'石家庄循环化工园区',130100000000,3), +(130181000000,'辛集市',130100000000,3), +(130183000000,'晋州市',130100000000,3), +(130184000000,'新乐市',130100000000,3), +(130200000000,'唐山市',130000000000,2), +(130201000000,'市辖区',130200000000,3), +(130202000000,'路南区',130200000000,3), +(130203000000,'路北区',130200000000,3), +(130204000000,'古冶区',130200000000,3), +(130205000000,'开平区',130200000000,3), +(130207000000,'丰南区',130200000000,3), +(130208000000,'丰润区',130200000000,3), +(130209000000,'曹妃甸区',130200000000,3), +(130224000000,'滦南县',130200000000,3), +(130225000000,'乐亭县',130200000000,3), +(130227000000,'迁西县',130200000000,3), +(130229000000,'玉田县',130200000000,3), +(130271000000,'唐山市芦台经济技术开发区',130200000000,3), +(130272000000,'唐山市汉沽管理区',130200000000,3), +(130273000000,'唐山高新技术产业开发区',130200000000,3), +(130274000000,'河北唐山海港经济开发区',130200000000,3), +(130281000000,'遵化市',130200000000,3), +(130283000000,'迁安市',130200000000,3), +(130284000000,'滦州市',130200000000,3), +(130300000000,'秦皇岛市',130000000000,2), +(130301000000,'市辖区',130300000000,3), +(130302000000,'海港区',130300000000,3), +(130303000000,'山海关区',130300000000,3), +(130304000000,'北戴河区',130300000000,3), +(130306000000,'抚宁区',130300000000,3), +(130321000000,'青龙满族自治县',130300000000,3), +(130322000000,'昌黎县',130300000000,3), +(130324000000,'卢龙县',130300000000,3), +(130371000000,'秦皇岛市经济技术开发区',130300000000,3), +(130372000000,'北戴河新区',130300000000,3), +(130400000000,'邯郸市',130000000000,2), +(130401000000,'市辖区',130400000000,3), +(130402000000,'邯山区',130400000000,3), +(130403000000,'丛台区',130400000000,3), +(130404000000,'复兴区',130400000000,3), +(130406000000,'峰峰矿区',130400000000,3), +(130407000000,'肥乡区',130400000000,3), +(130408000000,'永年区',130400000000,3), +(130423000000,'临漳县',130400000000,3), +(130424000000,'成安县',130400000000,3), +(130425000000,'大名县',130400000000,3), +(130426000000,'涉县',130400000000,3), +(130427000000,'磁县',130400000000,3), +(130430000000,'邱县',130400000000,3), +(130431000000,'鸡泽县',130400000000,3), +(130432000000,'广平县',130400000000,3), +(130433000000,'馆陶县',130400000000,3), +(130434000000,'魏县',130400000000,3), +(130435000000,'曲周县',130400000000,3), +(130471000000,'邯郸经济技术开发区',130400000000,3), +(130473000000,'邯郸冀南新区',130400000000,3), +(130481000000,'武安市',130400000000,3), +(130500000000,'邢台市',130000000000,2), +(130501000000,'市辖区',130500000000,3), +(130502000000,'桥东区',130500000000,3), +(130503000000,'桥西区',130500000000,3), +(130521000000,'邢台县',130500000000,3), +(130522000000,'临城县',130500000000,3), +(130523000000,'内丘县',130500000000,3), +(130524000000,'柏乡县',130500000000,3), +(130525000000,'隆尧县',130500000000,3), +(130526000000,'任县',130500000000,3), +(130527000000,'南和县',130500000000,3), +(130528000000,'宁晋县',130500000000,3), +(130529000000,'巨鹿县',130500000000,3), +(130530000000,'新河县',130500000000,3), +(130531000000,'广宗县',130500000000,3), +(130532000000,'平乡县',130500000000,3), +(130533000000,'威县',130500000000,3), +(130534000000,'清河县',130500000000,3), +(130535000000,'临西县',130500000000,3), +(130571000000,'河北邢台经济开发区',130500000000,3), +(130581000000,'南宫市',130500000000,3), +(130582000000,'沙河市',130500000000,3), +(130600000000,'保定市',130000000000,2), +(130601000000,'市辖区',130600000000,3), +(130602000000,'竞秀区',130600000000,3), +(130606000000,'莲池区',130600000000,3), +(130607000000,'满城区',130600000000,3), +(130608000000,'清苑区',130600000000,3), +(130609000000,'徐水区',130600000000,3), +(130623000000,'涞水县',130600000000,3), +(130624000000,'阜平县',130600000000,3), +(130626000000,'定兴县',130600000000,3), +(130627000000,'唐县',130600000000,3), +(130628000000,'高阳县',130600000000,3), +(130629000000,'容城县',130600000000,3), +(130630000000,'涞源县',130600000000,3), +(130631000000,'望都县',130600000000,3), +(130632000000,'安新县',130600000000,3), +(130633000000,'易县',130600000000,3), +(130634000000,'曲阳县',130600000000,3), +(130635000000,'蠡县',130600000000,3), +(130636000000,'顺平县',130600000000,3), +(130637000000,'博野县',130600000000,3), +(130638000000,'雄县',130600000000,3), +(130671000000,'保定高新技术产业开发区',130600000000,3), +(130672000000,'保定白沟新城',130600000000,3), +(130681000000,'涿州市',130600000000,3), +(130682000000,'定州市',130600000000,3), +(130683000000,'安国市',130600000000,3), +(130684000000,'高碑店市',130600000000,3), +(130700000000,'张家口市',130000000000,2), +(130701000000,'市辖区',130700000000,3), +(130702000000,'桥东区',130700000000,3), +(130703000000,'桥西区',130700000000,3), +(130705000000,'宣化区',130700000000,3), +(130706000000,'下花园区',130700000000,3), +(130708000000,'万全区',130700000000,3), +(130709000000,'崇礼区',130700000000,3), +(130722000000,'张北县',130700000000,3), +(130723000000,'康保县',130700000000,3), +(130724000000,'沽源县',130700000000,3), +(130725000000,'尚义县',130700000000,3), +(130726000000,'蔚县',130700000000,3), +(130727000000,'阳原县',130700000000,3), +(130728000000,'怀安县',130700000000,3), +(130730000000,'怀来县',130700000000,3), +(130731000000,'涿鹿县',130700000000,3), +(130732000000,'赤城县',130700000000,3), +(130771000000,'张家口市高新技术产业开发区',130700000000,3), +(130772000000,'张家口市察北管理区',130700000000,3), +(130773000000,'张家口市塞北管理区',130700000000,3), +(130800000000,'承德市',130000000000,2), +(130801000000,'市辖区',130800000000,3), +(130802000000,'双桥区',130800000000,3), +(130803000000,'双滦区',130800000000,3), +(130804000000,'鹰手营子矿区',130800000000,3), +(130821000000,'承德县',130800000000,3), +(130822000000,'兴隆县',130800000000,3), +(130824000000,'滦平县',130800000000,3), +(130825000000,'隆化县',130800000000,3), +(130826000000,'丰宁满族自治县',130800000000,3), +(130827000000,'宽城满族自治县',130800000000,3), +(130828000000,'围场满族蒙古族自治县',130800000000,3), +(130871000000,'承德高新技术产业开发区',130800000000,3), +(130881000000,'平泉市',130800000000,3), +(130900000000,'沧州市',130000000000,2), +(130901000000,'市辖区',130900000000,3), +(130902000000,'新华区',130900000000,3), +(130903000000,'运河区',130900000000,3), +(130921000000,'沧县',130900000000,3), +(130922000000,'青县',130900000000,3), +(130923000000,'东光县',130900000000,3), +(130924000000,'海兴县',130900000000,3), +(130925000000,'盐山县',130900000000,3), +(130926000000,'肃宁县',130900000000,3), +(130927000000,'南皮县',130900000000,3), +(130928000000,'吴桥县',130900000000,3), +(130929000000,'献县',130900000000,3), +(130930000000,'孟村回族自治县',130900000000,3), +(130971000000,'河北沧州经济开发区',130900000000,3), +(130972000000,'沧州高新技术产业开发区',130900000000,3), +(130973000000,'沧州渤海新区',130900000000,3), +(130981000000,'泊头市',130900000000,3), +(130982000000,'任丘市',130900000000,3), +(130983000000,'黄骅市',130900000000,3), +(130984000000,'河间市',130900000000,3), +(131000000000,'廊坊市',130000000000,2), +(131001000000,'市辖区',131000000000,3), +(131002000000,'安次区',131000000000,3), +(131003000000,'广阳区',131000000000,3), +(131022000000,'固安县',131000000000,3), +(131023000000,'永清县',131000000000,3), +(131024000000,'香河县',131000000000,3), +(131025000000,'大城县',131000000000,3), +(131026000000,'文安县',131000000000,3), +(131028000000,'大厂回族自治县',131000000000,3), +(131071000000,'廊坊经济技术开发区',131000000000,3), +(131081000000,'霸州市',131000000000,3), +(131082000000,'三河市',131000000000,3), +(131100000000,'衡水市',130000000000,2), +(131101000000,'市辖区',131100000000,3), +(131102000000,'桃城区',131100000000,3), +(131103000000,'冀州区',131100000000,3), +(131121000000,'枣强县',131100000000,3), +(131122000000,'武邑县',131100000000,3), +(131123000000,'武强县',131100000000,3), +(131124000000,'饶阳县',131100000000,3), +(131125000000,'安平县',131100000000,3), +(131126000000,'故城县',131100000000,3), +(131127000000,'景县',131100000000,3), +(131128000000,'阜城县',131100000000,3), +(131171000000,'河北衡水高新技术产业开发区',131100000000,3), +(131172000000,'衡水滨湖新区',131100000000,3), +(131182000000,'深州市',131100000000,3), +(140000000000,'山西省',0,1), +(140100000000,'太原市',140000000000,2), +(140101000000,'市辖区',140100000000,3), +(140105000000,'小店区',140100000000,3), +(140106000000,'迎泽区',140100000000,3), +(140107000000,'杏花岭区',140100000000,3), +(140108000000,'尖草坪区',140100000000,3), +(140109000000,'万柏林区',140100000000,3), +(140110000000,'晋源区',140100000000,3), +(140121000000,'清徐县',140100000000,3), +(140122000000,'阳曲县',140100000000,3), +(140123000000,'娄烦县',140100000000,3), +(140171000000,'山西转型综合改革示范区',140100000000,3), +(140181000000,'古交市',140100000000,3), +(140200000000,'大同市',140000000000,2), +(140201000000,'市辖区',140200000000,3), +(140212000000,'新荣区',140200000000,3), +(140213000000,'平城区',140200000000,3), +(140214000000,'云冈区',140200000000,3), +(140215000000,'云州区',140200000000,3), +(140221000000,'阳高县',140200000000,3), +(140222000000,'天镇县',140200000000,3), +(140223000000,'广灵县',140200000000,3), +(140224000000,'灵丘县',140200000000,3), +(140225000000,'浑源县',140200000000,3), +(140226000000,'左云县',140200000000,3), +(140271000000,'山西大同经济开发区',140200000000,3), +(140300000000,'阳泉市',140000000000,2), +(140301000000,'市辖区',140300000000,3), +(140302000000,'城区',140300000000,3), +(140303000000,'矿区',140300000000,3), +(140311000000,'郊区',140300000000,3), +(140321000000,'平定县',140300000000,3), +(140322000000,'盂县',140300000000,3), +(140400000000,'长治市',140000000000,2), +(140401000000,'市辖区',140400000000,3), +(140412000000,'潞州区',140400000000,3), +(140413000000,'上党区',140400000000,3), +(140414000000,'屯留区',140400000000,3), +(140415000000,'潞城区',140400000000,3), +(140423000000,'襄垣县',140400000000,3), +(140425000000,'平顺县',140400000000,3), +(140426000000,'黎城县',140400000000,3), +(140427000000,'壶关县',140400000000,3), +(140428000000,'长子县',140400000000,3), +(140429000000,'武乡县',140400000000,3), +(140430000000,'沁县',140400000000,3), +(140431000000,'沁源县',140400000000,3), +(140471000000,'山西长治高新技术产业园区',140400000000,3), +(140500000000,'晋城市',140000000000,2), +(140501000000,'市辖区',140500000000,3), +(140502000000,'城区',140500000000,3), +(140521000000,'沁水县',140500000000,3), +(140522000000,'阳城县',140500000000,3), +(140524000000,'陵川县',140500000000,3), +(140525000000,'泽州县',140500000000,3), +(140581000000,'高平市',140500000000,3), +(140600000000,'朔州市',140000000000,2), +(140601000000,'市辖区',140600000000,3), +(140602000000,'朔城区',140600000000,3), +(140603000000,'平鲁区',140600000000,3), +(140621000000,'山阴县',140600000000,3), +(140622000000,'应县',140600000000,3), +(140623000000,'右玉县',140600000000,3), +(140671000000,'山西朔州经济开发区',140600000000,3), +(140681000000,'怀仁市',140600000000,3), +(140700000000,'晋中市',140000000000,2), +(140701000000,'市辖区',140700000000,3), +(140702000000,'榆次区',140700000000,3), +(140721000000,'榆社县',140700000000,3), +(140722000000,'左权县',140700000000,3), +(140723000000,'和顺县',140700000000,3), +(140724000000,'昔阳县',140700000000,3), +(140725000000,'寿阳县',140700000000,3), +(140726000000,'太谷县',140700000000,3), +(140727000000,'祁县',140700000000,3), +(140728000000,'平遥县',140700000000,3), +(140729000000,'灵石县',140700000000,3), +(140781000000,'介休市',140700000000,3), +(140800000000,'运城市',140000000000,2), +(140801000000,'市辖区',140800000000,3), +(140802000000,'盐湖区',140800000000,3), +(140821000000,'临猗县',140800000000,3), +(140822000000,'万荣县',140800000000,3), +(140823000000,'闻喜县',140800000000,3), +(140824000000,'稷山县',140800000000,3), +(140825000000,'新绛县',140800000000,3), +(140826000000,'绛县',140800000000,3), +(140827000000,'垣曲县',140800000000,3), +(140828000000,'夏县',140800000000,3), +(140829000000,'平陆县',140800000000,3), +(140830000000,'芮城县',140800000000,3), +(140881000000,'永济市',140800000000,3), +(140882000000,'河津市',140800000000,3), +(140900000000,'忻州市',140000000000,2), +(140901000000,'市辖区',140900000000,3), +(140902000000,'忻府区',140900000000,3), +(140921000000,'定襄县',140900000000,3), +(140922000000,'五台县',140900000000,3), +(140923000000,'代县',140900000000,3), +(140924000000,'繁峙县',140900000000,3), +(140925000000,'宁武县',140900000000,3), +(140926000000,'静乐县',140900000000,3), +(140927000000,'神池县',140900000000,3), +(140928000000,'五寨县',140900000000,3), +(140929000000,'岢岚县',140900000000,3), +(140930000000,'河曲县',140900000000,3), +(140931000000,'保德县',140900000000,3), +(140932000000,'偏关县',140900000000,3), +(140971000000,'五台山风景名胜区',140900000000,3), +(140981000000,'原平市',140900000000,3), +(141000000000,'临汾市',140000000000,2), +(141001000000,'市辖区',141000000000,3), +(141002000000,'尧都区',141000000000,3), +(141021000000,'曲沃县',141000000000,3), +(141022000000,'翼城县',141000000000,3), +(141023000000,'襄汾县',141000000000,3), +(141024000000,'洪洞县',141000000000,3), +(141025000000,'古县',141000000000,3), +(141026000000,'安泽县',141000000000,3), +(141027000000,'浮山县',141000000000,3), +(141028000000,'吉县',141000000000,3), +(141029000000,'乡宁县',141000000000,3), +(141030000000,'大宁县',141000000000,3), +(141031000000,'隰县',141000000000,3), +(141032000000,'永和县',141000000000,3), +(141033000000,'蒲县',141000000000,3), +(141034000000,'汾西县',141000000000,3), +(141081000000,'侯马市',141000000000,3), +(141082000000,'霍州市',141000000000,3), +(141100000000,'吕梁市',140000000000,2), +(141101000000,'市辖区',141100000000,3), +(141102000000,'离石区',141100000000,3), +(141121000000,'文水县',141100000000,3), +(141122000000,'交城县',141100000000,3), +(141123000000,'兴县',141100000000,3), +(141124000000,'临县',141100000000,3), +(141125000000,'柳林县',141100000000,3), +(141126000000,'石楼县',141100000000,3), +(141127000000,'岚县',141100000000,3), +(141128000000,'方山县',141100000000,3), +(141129000000,'中阳县',141100000000,3), +(141130000000,'交口县',141100000000,3), +(141181000000,'孝义市',141100000000,3), +(141182000000,'汾阳市',141100000000,3), +(150000000000,'内蒙古自治区',0,1), +(150100000000,'呼和浩特市',150000000000,2), +(150101000000,'市辖区',150100000000,3), +(150102000000,'新城区',150100000000,3), +(150103000000,'回民区',150100000000,3), +(150104000000,'玉泉区',150100000000,3), +(150105000000,'赛罕区',150100000000,3), +(150121000000,'土默特左旗',150100000000,3), +(150122000000,'托克托县',150100000000,3), +(150123000000,'和林格尔县',150100000000,3), +(150124000000,'清水河县',150100000000,3), +(150125000000,'武川县',150100000000,3), +(150171000000,'呼和浩特金海工业园区',150100000000,3), +(150172000000,'呼和浩特经济技术开发区',150100000000,3), +(150200000000,'包头市',150000000000,2), +(150201000000,'市辖区',150200000000,3), +(150202000000,'东河区',150200000000,3), +(150203000000,'昆都仑区',150200000000,3), +(150204000000,'青山区',150200000000,3), +(150205000000,'石拐区',150200000000,3), +(150206000000,'白云鄂博矿区',150200000000,3), +(150207000000,'九原区',150200000000,3), +(150221000000,'土默特右旗',150200000000,3), +(150222000000,'固阳县',150200000000,3), +(150223000000,'达尔罕茂明安联合旗',150200000000,3), +(150271000000,'包头稀土高新技术产业开发区',150200000000,3), +(150300000000,'乌海市',150000000000,2), +(150301000000,'市辖区',150300000000,3), +(150302000000,'海勃湾区',150300000000,3), +(150303000000,'海南区',150300000000,3), +(150304000000,'乌达区',150300000000,3), +(150400000000,'赤峰市',150000000000,2), +(150401000000,'市辖区',150400000000,3), +(150402000000,'红山区',150400000000,3), +(150403000000,'元宝山区',150400000000,3), +(150404000000,'松山区',150400000000,3), +(150421000000,'阿鲁科尔沁旗',150400000000,3), +(150422000000,'巴林左旗',150400000000,3), +(150423000000,'巴林右旗',150400000000,3), +(150424000000,'林西县',150400000000,3), +(150425000000,'克什克腾旗',150400000000,3), +(150426000000,'翁牛特旗',150400000000,3), +(150428000000,'喀喇沁旗',150400000000,3), +(150429000000,'宁城县',150400000000,3), +(150430000000,'敖汉旗',150400000000,3), +(150500000000,'通辽市',150000000000,2), +(150501000000,'市辖区',150500000000,3), +(150502000000,'科尔沁区',150500000000,3), +(150521000000,'科尔沁左翼中旗',150500000000,3), +(150522000000,'科尔沁左翼后旗',150500000000,3), +(150523000000,'开鲁县',150500000000,3), +(150524000000,'库伦旗',150500000000,3), +(150525000000,'奈曼旗',150500000000,3), +(150526000000,'扎鲁特旗',150500000000,3), +(150571000000,'通辽经济技术开发区',150500000000,3), +(150581000000,'霍林郭勒市',150500000000,3), +(150600000000,'鄂尔多斯市',150000000000,2), +(150601000000,'市辖区',150600000000,3), +(150602000000,'东胜区',150600000000,3), +(150603000000,'康巴什区',150600000000,3), +(150621000000,'达拉特旗',150600000000,3), +(150622000000,'准格尔旗',150600000000,3), +(150623000000,'鄂托克前旗',150600000000,3), +(150624000000,'鄂托克旗',150600000000,3), +(150625000000,'杭锦旗',150600000000,3), +(150626000000,'乌审旗',150600000000,3), +(150627000000,'伊金霍洛旗',150600000000,3), +(150700000000,'呼伦贝尔市',150000000000,2), +(150701000000,'市辖区',150700000000,3), +(150702000000,'海拉尔区',150700000000,3), +(150703000000,'扎赉诺尔区',150700000000,3), +(150721000000,'阿荣旗',150700000000,3), +(150722000000,'莫力达瓦达斡尔族自治旗',150700000000,3), +(150723000000,'鄂伦春自治旗',150700000000,3), +(150724000000,'鄂温克族自治旗',150700000000,3), +(150725000000,'陈巴尔虎旗',150700000000,3), +(150726000000,'新巴尔虎左旗',150700000000,3), +(150727000000,'新巴尔虎右旗',150700000000,3), +(150781000000,'满洲里市',150700000000,3), +(150782000000,'牙克石市',150700000000,3), +(150783000000,'扎兰屯市',150700000000,3), +(150784000000,'额尔古纳市',150700000000,3), +(150785000000,'根河市',150700000000,3), +(150800000000,'巴彦淖尔市',150000000000,2), +(150801000000,'市辖区',150800000000,3), +(150802000000,'临河区',150800000000,3), +(150821000000,'五原县',150800000000,3), +(150822000000,'磴口县',150800000000,3), +(150823000000,'乌拉特前旗',150800000000,3), +(150824000000,'乌拉特中旗',150800000000,3), +(150825000000,'乌拉特后旗',150800000000,3), +(150826000000,'杭锦后旗',150800000000,3), +(150900000000,'乌兰察布市',150000000000,2), +(150901000000,'市辖区',150900000000,3), +(150902000000,'集宁区',150900000000,3), +(150921000000,'卓资县',150900000000,3), +(150922000000,'化德县',150900000000,3), +(150923000000,'商都县',150900000000,3), +(150924000000,'兴和县',150900000000,3), +(150925000000,'凉城县',150900000000,3), +(150926000000,'察哈尔右翼前旗',150900000000,3), +(150927000000,'察哈尔右翼中旗',150900000000,3), +(150928000000,'察哈尔右翼后旗',150900000000,3), +(150929000000,'四子王旗',150900000000,3), +(150981000000,'丰镇市',150900000000,3), +(152200000000,'兴安盟',150000000000,2), +(152201000000,'乌兰浩特市',152200000000,3), +(152202000000,'阿尔山市',152200000000,3), +(152221000000,'科尔沁右翼前旗',152200000000,3), +(152222000000,'科尔沁右翼中旗',152200000000,3), +(152223000000,'扎赉特旗',152200000000,3), +(152224000000,'突泉县',152200000000,3), +(152500000000,'锡林郭勒盟',150000000000,2), +(152501000000,'二连浩特市',152500000000,3), +(152502000000,'锡林浩特市',152500000000,3), +(152522000000,'阿巴嘎旗',152500000000,3), +(152523000000,'苏尼特左旗',152500000000,3), +(152524000000,'苏尼特右旗',152500000000,3), +(152525000000,'东乌珠穆沁旗',152500000000,3), +(152526000000,'西乌珠穆沁旗',152500000000,3), +(152527000000,'太仆寺旗',152500000000,3), +(152528000000,'镶黄旗',152500000000,3), +(152529000000,'正镶白旗',152500000000,3), +(152530000000,'正蓝旗',152500000000,3), +(152531000000,'多伦县',152500000000,3), +(152571000000,'乌拉盖管委会',152500000000,3), +(152900000000,'阿拉善盟',150000000000,2), +(152921000000,'阿拉善左旗',152900000000,3), +(152922000000,'阿拉善右旗',152900000000,3), +(152923000000,'额济纳旗',152900000000,3), +(152971000000,'内蒙古阿拉善经济开发区',152900000000,3), +(210000000000,'辽宁省',0,1), +(210100000000,'沈阳市',210000000000,2), +(210101000000,'市辖区',210100000000,3), +(210102000000,'和平区',210100000000,3), +(210103000000,'沈河区',210100000000,3), +(210104000000,'大东区',210100000000,3), +(210105000000,'皇姑区',210100000000,3), +(210106000000,'铁西区',210100000000,3), +(210111000000,'苏家屯区',210100000000,3), +(210112000000,'浑南区',210100000000,3), +(210113000000,'沈北新区',210100000000,3), +(210114000000,'于洪区',210100000000,3), +(210115000000,'辽中区',210100000000,3), +(210123000000,'康平县',210100000000,3), +(210124000000,'法库县',210100000000,3), +(210181000000,'新民市',210100000000,3), +(210200000000,'大连市',210000000000,2), +(210201000000,'市辖区',210200000000,3), +(210202000000,'中山区',210200000000,3), +(210203000000,'西岗区',210200000000,3), +(210204000000,'沙河口区',210200000000,3), +(210211000000,'甘井子区',210200000000,3), +(210212000000,'旅顺口区',210200000000,3), +(210213000000,'金州区',210200000000,3), +(210214000000,'普兰店区',210200000000,3), +(210224000000,'长海县',210200000000,3), +(210281000000,'瓦房店市',210200000000,3), +(210283000000,'庄河市',210200000000,3), +(210300000000,'鞍山市',210000000000,2), +(210301000000,'市辖区',210300000000,3), +(210302000000,'铁东区',210300000000,3), +(210303000000,'铁西区',210300000000,3), +(210304000000,'立山区',210300000000,3), +(210311000000,'千山区',210300000000,3), +(210321000000,'台安县',210300000000,3), +(210323000000,'岫岩满族自治县',210300000000,3), +(210381000000,'海城市',210300000000,3), +(210400000000,'抚顺市',210000000000,2), +(210401000000,'市辖区',210400000000,3), +(210402000000,'新抚区',210400000000,3), +(210403000000,'东洲区',210400000000,3), +(210404000000,'望花区',210400000000,3), +(210411000000,'顺城区',210400000000,3), +(210421000000,'抚顺县',210400000000,3), +(210422000000,'新宾满族自治县',210400000000,3), +(210423000000,'清原满族自治县',210400000000,3), +(210500000000,'本溪市',210000000000,2), +(210501000000,'市辖区',210500000000,3), +(210502000000,'平山区',210500000000,3), +(210503000000,'溪湖区',210500000000,3), +(210504000000,'明山区',210500000000,3), +(210505000000,'南芬区',210500000000,3), +(210521000000,'本溪满族自治县',210500000000,3), +(210522000000,'桓仁满族自治县',210500000000,3), +(210600000000,'丹东市',210000000000,2), +(210601000000,'市辖区',210600000000,3), +(210602000000,'元宝区',210600000000,3), +(210603000000,'振兴区',210600000000,3), +(210604000000,'振安区',210600000000,3), +(210624000000,'宽甸满族自治县',210600000000,3), +(210681000000,'东港市',210600000000,3), +(210682000000,'凤城市',210600000000,3), +(210700000000,'锦州市',210000000000,2), +(210701000000,'市辖区',210700000000,3), +(210702000000,'古塔区',210700000000,3), +(210703000000,'凌河区',210700000000,3), +(210711000000,'太和区',210700000000,3), +(210726000000,'黑山县',210700000000,3), +(210727000000,'义县',210700000000,3), +(210781000000,'凌海市',210700000000,3), +(210782000000,'北镇市',210700000000,3), +(210800000000,'营口市',210000000000,2), +(210801000000,'市辖区',210800000000,3), +(210802000000,'站前区',210800000000,3), +(210803000000,'西市区',210800000000,3), +(210804000000,'鲅鱼圈区',210800000000,3), +(210811000000,'老边区',210800000000,3), +(210881000000,'盖州市',210800000000,3), +(210882000000,'大石桥市',210800000000,3), +(210900000000,'阜新市',210000000000,2), +(210901000000,'市辖区',210900000000,3), +(210902000000,'海州区',210900000000,3), +(210903000000,'新邱区',210900000000,3), +(210904000000,'太平区',210900000000,3), +(210905000000,'清河门区',210900000000,3), +(210911000000,'细河区',210900000000,3), +(210921000000,'阜新蒙古族自治县',210900000000,3), +(210922000000,'彰武县',210900000000,3), +(211000000000,'辽阳市',210000000000,2), +(211001000000,'市辖区',211000000000,3), +(211002000000,'白塔区',211000000000,3), +(211003000000,'文圣区',211000000000,3), +(211004000000,'宏伟区',211000000000,3), +(211005000000,'弓长岭区',211000000000,3), +(211011000000,'太子河区',211000000000,3), +(211021000000,'辽阳县',211000000000,3), +(211081000000,'灯塔市',211000000000,3), +(211100000000,'盘锦市',210000000000,2), +(211101000000,'市辖区',211100000000,3), +(211102000000,'双台子区',211100000000,3), +(211103000000,'兴隆台区',211100000000,3), +(211104000000,'大洼区',211100000000,3), +(211122000000,'盘山县',211100000000,3), +(211200000000,'铁岭市',210000000000,2), +(211201000000,'市辖区',211200000000,3), +(211202000000,'银州区',211200000000,3), +(211204000000,'清河区',211200000000,3), +(211221000000,'铁岭县',211200000000,3), +(211223000000,'西丰县',211200000000,3), +(211224000000,'昌图县',211200000000,3), +(211281000000,'调兵山市',211200000000,3), +(211282000000,'开原市',211200000000,3), +(211300000000,'朝阳市',210000000000,2), +(211301000000,'市辖区',211300000000,3), +(211302000000,'双塔区',211300000000,3), +(211303000000,'龙城区',211300000000,3), +(211321000000,'朝阳县',211300000000,3), +(211322000000,'建平县',211300000000,3), +(211324000000,'喀喇沁左翼蒙古族自治县',211300000000,3), +(211381000000,'北票市',211300000000,3), +(211382000000,'凌源市',211300000000,3), +(211400000000,'葫芦岛市',210000000000,2), +(211401000000,'市辖区',211400000000,3), +(211402000000,'连山区',211400000000,3), +(211403000000,'龙港区',211400000000,3), +(211404000000,'南票区',211400000000,3), +(211421000000,'绥中县',211400000000,3), +(211422000000,'建昌县',211400000000,3), +(211481000000,'兴城市',211400000000,3), +(220000000000,'吉林省',0,1), +(220100000000,'长春市',220000000000,2), +(220101000000,'市辖区',220100000000,3), +(220102000000,'南关区',220100000000,3), +(220103000000,'宽城区',220100000000,3), +(220104000000,'朝阳区',220100000000,3), +(220105000000,'二道区',220100000000,3), +(220106000000,'绿园区',220100000000,3), +(220112000000,'双阳区',220100000000,3), +(220113000000,'九台区',220100000000,3), +(220122000000,'农安县',220100000000,3), +(220171000000,'长春经济技术开发区',220100000000,3), +(220172000000,'长春净月高新技术产业开发区',220100000000,3), +(220173000000,'长春高新技术产业开发区',220100000000,3), +(220174000000,'长春汽车经济技术开发区',220100000000,3), +(220182000000,'榆树市',220100000000,3), +(220183000000,'德惠市',220100000000,3), +(220200000000,'吉林市',220000000000,2), +(220201000000,'市辖区',220200000000,3), +(220202000000,'昌邑区',220200000000,3), +(220203000000,'龙潭区',220200000000,3), +(220204000000,'船营区',220200000000,3), +(220211000000,'丰满区',220200000000,3), +(220221000000,'永吉县',220200000000,3), +(220271000000,'吉林经济开发区',220200000000,3), +(220272000000,'吉林高新技术产业开发区',220200000000,3), +(220273000000,'吉林中国新加坡食品区',220200000000,3), +(220281000000,'蛟河市',220200000000,3), +(220282000000,'桦甸市',220200000000,3), +(220283000000,'舒兰市',220200000000,3), +(220284000000,'磐石市',220200000000,3), +(220300000000,'四平市',220000000000,2), +(220301000000,'市辖区',220300000000,3), +(220302000000,'铁西区',220300000000,3), +(220303000000,'铁东区',220300000000,3), +(220322000000,'梨树县',220300000000,3), +(220323000000,'伊通满族自治县',220300000000,3), +(220381000000,'公主岭市',220300000000,3), +(220382000000,'双辽市',220300000000,3), +(220400000000,'辽源市',220000000000,2), +(220401000000,'市辖区',220400000000,3), +(220402000000,'龙山区',220400000000,3), +(220403000000,'西安区',220400000000,3), +(220421000000,'东丰县',220400000000,3), +(220422000000,'东辽县',220400000000,3), +(220500000000,'通化市',220000000000,2), +(220501000000,'市辖区',220500000000,3), +(220502000000,'东昌区',220500000000,3), +(220503000000,'二道江区',220500000000,3), +(220521000000,'通化县',220500000000,3), +(220523000000,'辉南县',220500000000,3), +(220524000000,'柳河县',220500000000,3), +(220581000000,'梅河口市',220500000000,3), +(220582000000,'集安市',220500000000,3), +(220600000000,'白山市',220000000000,2), +(220601000000,'市辖区',220600000000,3), +(220602000000,'浑江区',220600000000,3), +(220605000000,'江源区',220600000000,3), +(220621000000,'抚松县',220600000000,3), +(220622000000,'靖宇县',220600000000,3), +(220623000000,'长白朝鲜族自治县',220600000000,3), +(220681000000,'临江市',220600000000,3), +(220700000000,'松原市',220000000000,2), +(220701000000,'市辖区',220700000000,3), +(220702000000,'宁江区',220700000000,3), +(220721000000,'前郭尔罗斯蒙古族自治县',220700000000,3), +(220722000000,'长岭县',220700000000,3), +(220723000000,'乾安县',220700000000,3), +(220771000000,'吉林松原经济开发区',220700000000,3), +(220781000000,'扶余市',220700000000,3), +(220800000000,'白城市',220000000000,2), +(220801000000,'市辖区',220800000000,3), +(220802000000,'洮北区',220800000000,3), +(220821000000,'镇赉县',220800000000,3), +(220822000000,'通榆县',220800000000,3), +(220871000000,'吉林白城经济开发区',220800000000,3), +(220881000000,'洮南市',220800000000,3), +(220882000000,'大安市',220800000000,3), +(222400000000,'延边朝鲜族自治州',220000000000,2), +(222401000000,'延吉市',222400000000,3), +(222402000000,'图们市',222400000000,3), +(222403000000,'敦化市',222400000000,3), +(222404000000,'珲春市',222400000000,3), +(222405000000,'龙井市',222400000000,3), +(222406000000,'和龙市',222400000000,3), +(222424000000,'汪清县',222400000000,3), +(222426000000,'安图县',222400000000,3), +(230000000000,'黑龙江省',0,1), +(230100000000,'哈尔滨市',230000000000,2), +(230101000000,'市辖区',230100000000,3), +(230102000000,'道里区',230100000000,3), +(230103000000,'南岗区',230100000000,3), +(230104000000,'道外区',230100000000,3), +(230108000000,'平房区',230100000000,3), +(230109000000,'松北区',230100000000,3), +(230110000000,'香坊区',230100000000,3), +(230111000000,'呼兰区',230100000000,3), +(230112000000,'阿城区',230100000000,3), +(230113000000,'双城区',230100000000,3), +(230123000000,'依兰县',230100000000,3), +(230124000000,'方正县',230100000000,3), +(230125000000,'宾县',230100000000,3), +(230126000000,'巴彦县',230100000000,3), +(230127000000,'木兰县',230100000000,3), +(230128000000,'通河县',230100000000,3), +(230129000000,'延寿县',230100000000,3), +(230183000000,'尚志市',230100000000,3), +(230184000000,'五常市',230100000000,3), +(230200000000,'齐齐哈尔市',230000000000,2), +(230201000000,'市辖区',230200000000,3), +(230202000000,'龙沙区',230200000000,3), +(230203000000,'建华区',230200000000,3), +(230204000000,'铁锋区',230200000000,3), +(230205000000,'昂昂溪区',230200000000,3), +(230206000000,'富拉尔基区',230200000000,3), +(230207000000,'碾子山区',230200000000,3), +(230208000000,'梅里斯达斡尔族区',230200000000,3), +(230221000000,'龙江县',230200000000,3), +(230223000000,'依安县',230200000000,3), +(230224000000,'泰来县',230200000000,3), +(230225000000,'甘南县',230200000000,3), +(230227000000,'富裕县',230200000000,3), +(230229000000,'克山县',230200000000,3), +(230230000000,'克东县',230200000000,3), +(230231000000,'拜泉县',230200000000,3), +(230281000000,'讷河市',230200000000,3), +(230300000000,'鸡西市',230000000000,2), +(230301000000,'市辖区',230300000000,3), +(230302000000,'鸡冠区',230300000000,3), +(230303000000,'恒山区',230300000000,3), +(230304000000,'滴道区',230300000000,3), +(230305000000,'梨树区',230300000000,3), +(230306000000,'城子河区',230300000000,3), +(230307000000,'麻山区',230300000000,3), +(230321000000,'鸡东县',230300000000,3), +(230381000000,'虎林市',230300000000,3), +(230382000000,'密山市',230300000000,3), +(230400000000,'鹤岗市',230000000000,2), +(230401000000,'市辖区',230400000000,3), +(230402000000,'向阳区',230400000000,3), +(230403000000,'工农区',230400000000,3), +(230404000000,'南山区',230400000000,3), +(230405000000,'兴安区',230400000000,3), +(230406000000,'东山区',230400000000,3), +(230407000000,'兴山区',230400000000,3), +(230421000000,'萝北县',230400000000,3), +(230422000000,'绥滨县',230400000000,3), +(230500000000,'双鸭山市',230000000000,2), +(230501000000,'市辖区',230500000000,3), +(230502000000,'尖山区',230500000000,3), +(230503000000,'岭东区',230500000000,3), +(230505000000,'四方台区',230500000000,3), +(230506000000,'宝山区',230500000000,3), +(230521000000,'集贤县',230500000000,3), +(230522000000,'友谊县',230500000000,3), +(230523000000,'宝清县',230500000000,3), +(230524000000,'饶河县',230500000000,3), +(230600000000,'大庆市',230000000000,2), +(230601000000,'市辖区',230600000000,3), +(230602000000,'萨尔图区',230600000000,3), +(230603000000,'龙凤区',230600000000,3), +(230604000000,'让胡路区',230600000000,3), +(230605000000,'红岗区',230600000000,3), +(230606000000,'大同区',230600000000,3), +(230621000000,'肇州县',230600000000,3), +(230622000000,'肇源县',230600000000,3), +(230623000000,'林甸县',230600000000,3), +(230624000000,'杜尔伯特蒙古族自治县',230600000000,3), +(230671000000,'大庆高新技术产业开发区',230600000000,3), +(230700000000,'伊春市',230000000000,2), +(230701000000,'市辖区',230700000000,3), +(230702000000,'伊春区',230700000000,3), +(230703000000,'南岔区',230700000000,3), +(230704000000,'友好区',230700000000,3), +(230705000000,'西林区',230700000000,3), +(230706000000,'翠峦区',230700000000,3), +(230707000000,'新青区',230700000000,3), +(230708000000,'美溪区',230700000000,3), +(230709000000,'金山屯区',230700000000,3), +(230710000000,'五营区',230700000000,3), +(230711000000,'乌马河区',230700000000,3), +(230712000000,'汤旺河区',230700000000,3), +(230713000000,'带岭区',230700000000,3), +(230714000000,'乌伊岭区',230700000000,3), +(230715000000,'红星区',230700000000,3), +(230716000000,'上甘岭区',230700000000,3), +(230722000000,'嘉荫县',230700000000,3), +(230781000000,'铁力市',230700000000,3), +(230800000000,'佳木斯市',230000000000,2), +(230801000000,'市辖区',230800000000,3), +(230803000000,'向阳区',230800000000,3), +(230804000000,'前进区',230800000000,3), +(230805000000,'东风区',230800000000,3), +(230811000000,'郊区',230800000000,3), +(230822000000,'桦南县',230800000000,3), +(230826000000,'桦川县',230800000000,3), +(230828000000,'汤原县',230800000000,3), +(230881000000,'同江市',230800000000,3), +(230882000000,'富锦市',230800000000,3), +(230883000000,'抚远市',230800000000,3), +(230900000000,'七台河市',230000000000,2), +(230901000000,'市辖区',230900000000,3), +(230902000000,'新兴区',230900000000,3), +(230903000000,'桃山区',230900000000,3), +(230904000000,'茄子河区',230900000000,3), +(230921000000,'勃利县',230900000000,3), +(231000000000,'牡丹江市',230000000000,2), +(231001000000,'市辖区',231000000000,3), +(231002000000,'东安区',231000000000,3), +(231003000000,'阳明区',231000000000,3), +(231004000000,'爱民区',231000000000,3), +(231005000000,'西安区',231000000000,3), +(231025000000,'林口县',231000000000,3), +(231071000000,'牡丹江经济技术开发区',231000000000,3), +(231081000000,'绥芬河市',231000000000,3), +(231083000000,'海林市',231000000000,3), +(231084000000,'宁安市',231000000000,3), +(231085000000,'穆棱市',231000000000,3), +(231086000000,'东宁市',231000000000,3), +(231100000000,'黑河市',230000000000,2), +(231101000000,'市辖区',231100000000,3), +(231102000000,'爱辉区',231100000000,3), +(231121000000,'嫩江县',231100000000,3), +(231123000000,'逊克县',231100000000,3), +(231124000000,'孙吴县',231100000000,3), +(231181000000,'北安市',231100000000,3), +(231182000000,'五大连池市',231100000000,3), +(231200000000,'绥化市',230000000000,2), +(231201000000,'市辖区',231200000000,3), +(231202000000,'北林区',231200000000,3), +(231221000000,'望奎县',231200000000,3), +(231222000000,'兰西县',231200000000,3), +(231223000000,'青冈县',231200000000,3), +(231224000000,'庆安县',231200000000,3), +(231225000000,'明水县',231200000000,3), +(231226000000,'绥棱县',231200000000,3), +(231281000000,'安达市',231200000000,3), +(231282000000,'肇东市',231200000000,3), +(231283000000,'海伦市',231200000000,3), +(232700000000,'大兴安岭地区',230000000000,2), +(232701000000,'漠河市',232700000000,3), +(232721000000,'呼玛县',232700000000,3), +(232722000000,'塔河县',232700000000,3), +(232761000000,'加格达奇区',232700000000,3), +(232762000000,'松岭区',232700000000,3), +(232763000000,'新林区',232700000000,3), +(232764000000,'呼中区',232700000000,3), +(310000000000,'上海市',0,1), +(310100000000,'市辖区',310000000000,2), +(310101000000,'黄浦区',310100000000,3), +(310104000000,'徐汇区',310100000000,3), +(310105000000,'长宁区',310100000000,3), +(310106000000,'静安区',310100000000,3), +(310107000000,'普陀区',310100000000,3), +(310109000000,'虹口区',310100000000,3), +(310110000000,'杨浦区',310100000000,3), +(310112000000,'闵行区',310100000000,3), +(310113000000,'宝山区',310100000000,3), +(310114000000,'嘉定区',310100000000,3), +(310115000000,'浦东新区',310100000000,3), +(310116000000,'金山区',310100000000,3), +(310117000000,'松江区',310100000000,3), +(310118000000,'青浦区',310100000000,3), +(310120000000,'奉贤区',310100000000,3), +(310151000000,'崇明区',310100000000,3), +(320000000000,'江苏省',0,1), +(320100000000,'南京市',320000000000,2), +(320101000000,'市辖区',320100000000,3), +(320102000000,'玄武区',320100000000,3), +(320104000000,'秦淮区',320100000000,3), +(320105000000,'建邺区',320100000000,3), +(320106000000,'鼓楼区',320100000000,3), +(320111000000,'浦口区',320100000000,3), +(320113000000,'栖霞区',320100000000,3), +(320114000000,'雨花台区',320100000000,3), +(320115000000,'江宁区',320100000000,3), +(320116000000,'六合区',320100000000,3), +(320117000000,'溧水区',320100000000,3), +(320118000000,'高淳区',320100000000,3), +(320200000000,'无锡市',320000000000,2), +(320201000000,'市辖区',320200000000,3), +(320205000000,'锡山区',320200000000,3), +(320206000000,'惠山区',320200000000,3), +(320211000000,'滨湖区',320200000000,3), +(320213000000,'梁溪区',320200000000,3), +(320214000000,'新吴区',320200000000,3), +(320281000000,'江阴市',320200000000,3), +(320282000000,'宜兴市',320200000000,3), +(320300000000,'徐州市',320000000000,2), +(320301000000,'市辖区',320300000000,3), +(320302000000,'鼓楼区',320300000000,3), +(320303000000,'云龙区',320300000000,3), +(320305000000,'贾汪区',320300000000,3), +(320311000000,'泉山区',320300000000,3), +(320312000000,'铜山区',320300000000,3), +(320321000000,'丰县',320300000000,3), +(320322000000,'沛县',320300000000,3), +(320324000000,'睢宁县',320300000000,3), +(320371000000,'徐州经济技术开发区',320300000000,3), +(320381000000,'新沂市',320300000000,3), +(320382000000,'邳州市',320300000000,3), +(320400000000,'常州市',320000000000,2), +(320401000000,'市辖区',320400000000,3), +(320402000000,'天宁区',320400000000,3), +(320404000000,'钟楼区',320400000000,3), +(320411000000,'新北区',320400000000,3), +(320412000000,'武进区',320400000000,3), +(320413000000,'金坛区',320400000000,3), +(320481000000,'溧阳市',320400000000,3), +(320500000000,'苏州市',320000000000,2), +(320501000000,'市辖区',320500000000,3), +(320505000000,'虎丘区',320500000000,3), +(320506000000,'吴中区',320500000000,3), +(320507000000,'相城区',320500000000,3), +(320508000000,'姑苏区',320500000000,3), +(320509000000,'吴江区',320500000000,3), +(320571000000,'苏州工业园区',320500000000,3), +(320581000000,'常熟市',320500000000,3), +(320582000000,'张家港市',320500000000,3), +(320583000000,'昆山市',320500000000,3), +(320585000000,'太仓市',320500000000,3), +(320600000000,'南通市',320000000000,2), +(320601000000,'市辖区',320600000000,3), +(320602000000,'崇川区',320600000000,3), +(320611000000,'港闸区',320600000000,3), +(320612000000,'通州区',320600000000,3), +(320623000000,'如东县',320600000000,3), +(320671000000,'南通经济技术开发区',320600000000,3), +(320681000000,'启东市',320600000000,3), +(320682000000,'如皋市',320600000000,3), +(320684000000,'海门市',320600000000,3), +(320685000000,'海安市',320600000000,3), +(320700000000,'连云港市',320000000000,2), +(320701000000,'市辖区',320700000000,3), +(320703000000,'连云区',320700000000,3), +(320706000000,'海州区',320700000000,3), +(320707000000,'赣榆区',320700000000,3), +(320722000000,'东海县',320700000000,3), +(320723000000,'灌云县',320700000000,3), +(320724000000,'灌南县',320700000000,3), +(320771000000,'连云港经济技术开发区',320700000000,3), +(320772000000,'连云港高新技术产业开发区',320700000000,3), +(320800000000,'淮安市',320000000000,2), +(320801000000,'市辖区',320800000000,3), +(320803000000,'淮安区',320800000000,3), +(320804000000,'淮阴区',320800000000,3), +(320812000000,'清江浦区',320800000000,3), +(320813000000,'洪泽区',320800000000,3), +(320826000000,'涟水县',320800000000,3), +(320830000000,'盱眙县',320800000000,3), +(320831000000,'金湖县',320800000000,3), +(320871000000,'淮安经济技术开发区',320800000000,3), +(320900000000,'盐城市',320000000000,2), +(320901000000,'市辖区',320900000000,3), +(320902000000,'亭湖区',320900000000,3), +(320903000000,'盐都区',320900000000,3), +(320904000000,'大丰区',320900000000,3), +(320921000000,'响水县',320900000000,3), +(320922000000,'滨海县',320900000000,3), +(320923000000,'阜宁县',320900000000,3), +(320924000000,'射阳县',320900000000,3), +(320925000000,'建湖县',320900000000,3), +(320971000000,'盐城经济技术开发区',320900000000,3), +(320981000000,'东台市',320900000000,3), +(321000000000,'扬州市',320000000000,2), +(321001000000,'市辖区',321000000000,3), +(321002000000,'广陵区',321000000000,3), +(321003000000,'邗江区',321000000000,3), +(321012000000,'江都区',321000000000,3), +(321023000000,'宝应县',321000000000,3), +(321071000000,'扬州经济技术开发区',321000000000,3), +(321081000000,'仪征市',321000000000,3), +(321084000000,'高邮市',321000000000,3), +(321100000000,'镇江市',320000000000,2), +(321101000000,'市辖区',321100000000,3), +(321102000000,'京口区',321100000000,3), +(321111000000,'润州区',321100000000,3), +(321112000000,'丹徒区',321100000000,3), +(321171000000,'镇江新区',321100000000,3), +(321181000000,'丹阳市',321100000000,3), +(321182000000,'扬中市',321100000000,3), +(321183000000,'句容市',321100000000,3), +(321200000000,'泰州市',320000000000,2), +(321201000000,'市辖区',321200000000,3), +(321202000000,'海陵区',321200000000,3), +(321203000000,'高港区',321200000000,3), +(321204000000,'姜堰区',321200000000,3), +(321271000000,'泰州医药高新技术产业开发区',321200000000,3), +(321281000000,'兴化市',321200000000,3), +(321282000000,'靖江市',321200000000,3), +(321283000000,'泰兴市',321200000000,3), +(321300000000,'宿迁市',320000000000,2), +(321301000000,'市辖区',321300000000,3), +(321302000000,'宿城区',321300000000,3), +(321311000000,'宿豫区',321300000000,3), +(321322000000,'沭阳县',321300000000,3), +(321323000000,'泗阳县',321300000000,3), +(321324000000,'泗洪县',321300000000,3), +(321371000000,'宿迁经济技术开发区',321300000000,3), +(330000000000,'浙江省',0,1), +(330100000000,'杭州市',330000000000,2), +(330101000000,'市辖区',330100000000,3), +(330102000000,'上城区',330100000000,3), +(330103000000,'下城区',330100000000,3), +(330104000000,'江干区',330100000000,3), +(330105000000,'拱墅区',330100000000,3), +(330106000000,'西湖区',330100000000,3), +(330108000000,'滨江区',330100000000,3), +(330109000000,'萧山区',330100000000,3), +(330110000000,'余杭区',330100000000,3), +(330111000000,'富阳区',330100000000,3), +(330112000000,'临安区',330100000000,3), +(330122000000,'桐庐县',330100000000,3), +(330127000000,'淳安县',330100000000,3), +(330182000000,'建德市',330100000000,3), +(330200000000,'宁波市',330000000000,2), +(330201000000,'市辖区',330200000000,3), +(330203000000,'海曙区',330200000000,3), +(330205000000,'江北区',330200000000,3), +(330206000000,'北仑区',330200000000,3), +(330211000000,'镇海区',330200000000,3), +(330212000000,'鄞州区',330200000000,3), +(330213000000,'奉化区',330200000000,3), +(330225000000,'象山县',330200000000,3), +(330226000000,'宁海县',330200000000,3), +(330281000000,'余姚市',330200000000,3), +(330282000000,'慈溪市',330200000000,3), +(330300000000,'温州市',330000000000,2), +(330301000000,'市辖区',330300000000,3), +(330302000000,'鹿城区',330300000000,3), +(330303000000,'龙湾区',330300000000,3), +(330304000000,'瓯海区',330300000000,3), +(330305000000,'洞头区',330300000000,3), +(330324000000,'永嘉县',330300000000,3), +(330326000000,'平阳县',330300000000,3), +(330327000000,'苍南县',330300000000,3), +(330328000000,'文成县',330300000000,3), +(330329000000,'泰顺县',330300000000,3), +(330371000000,'温州经济技术开发区',330300000000,3), +(330381000000,'瑞安市',330300000000,3), +(330382000000,'乐清市',330300000000,3), +(330400000000,'嘉兴市',330000000000,2), +(330401000000,'市辖区',330400000000,3), +(330402000000,'南湖区',330400000000,3), +(330411000000,'秀洲区',330400000000,3), +(330421000000,'嘉善县',330400000000,3), +(330424000000,'海盐县',330400000000,3), +(330481000000,'海宁市',330400000000,3), +(330482000000,'平湖市',330400000000,3), +(330483000000,'桐乡市',330400000000,3), +(330500000000,'湖州市',330000000000,2), +(330501000000,'市辖区',330500000000,3), +(330502000000,'吴兴区',330500000000,3), +(330503000000,'南浔区',330500000000,3), +(330521000000,'德清县',330500000000,3), +(330522000000,'长兴县',330500000000,3), +(330523000000,'安吉县',330500000000,3), +(330600000000,'绍兴市',330000000000,2), +(330601000000,'市辖区',330600000000,3), +(330602000000,'越城区',330600000000,3), +(330603000000,'柯桥区',330600000000,3), +(330604000000,'上虞区',330600000000,3), +(330624000000,'新昌县',330600000000,3), +(330681000000,'诸暨市',330600000000,3), +(330683000000,'嵊州市',330600000000,3), +(330700000000,'金华市',330000000000,2), +(330701000000,'市辖区',330700000000,3), +(330702000000,'婺城区',330700000000,3), +(330703000000,'金东区',330700000000,3), +(330723000000,'武义县',330700000000,3), +(330726000000,'浦江县',330700000000,3), +(330727000000,'磐安县',330700000000,3), +(330781000000,'兰溪市',330700000000,3), +(330782000000,'义乌市',330700000000,3), +(330783000000,'东阳市',330700000000,3), +(330784000000,'永康市',330700000000,3), +(330800000000,'衢州市',330000000000,2), +(330801000000,'市辖区',330800000000,3), +(330802000000,'柯城区',330800000000,3), +(330803000000,'衢江区',330800000000,3), +(330822000000,'常山县',330800000000,3), +(330824000000,'开化县',330800000000,3), +(330825000000,'龙游县',330800000000,3), +(330881000000,'江山市',330800000000,3), +(330900000000,'舟山市',330000000000,2), +(330901000000,'市辖区',330900000000,3), +(330902000000,'定海区',330900000000,3), +(330903000000,'普陀区',330900000000,3), +(330921000000,'岱山县',330900000000,3), +(330922000000,'嵊泗县',330900000000,3), +(331000000000,'台州市',330000000000,2), +(331001000000,'市辖区',331000000000,3), +(331002000000,'椒江区',331000000000,3), +(331003000000,'黄岩区',331000000000,3), +(331004000000,'路桥区',331000000000,3), +(331022000000,'三门县',331000000000,3), +(331023000000,'天台县',331000000000,3), +(331024000000,'仙居县',331000000000,3), +(331081000000,'温岭市',331000000000,3), +(331082000000,'临海市',331000000000,3), +(331083000000,'玉环市',331000000000,3), +(331100000000,'丽水市',330000000000,2), +(331101000000,'市辖区',331100000000,3), +(331102000000,'莲都区',331100000000,3), +(331121000000,'青田县',331100000000,3), +(331122000000,'缙云县',331100000000,3), +(331123000000,'遂昌县',331100000000,3), +(331124000000,'松阳县',331100000000,3), +(331125000000,'云和县',331100000000,3), +(331126000000,'庆元县',331100000000,3), +(331127000000,'景宁畲族自治县',331100000000,3), +(331181000000,'龙泉市',331100000000,3), +(340000000000,'安徽省',0,1), +(340100000000,'合肥市',340000000000,2), +(340101000000,'市辖区',340100000000,3), +(340102000000,'瑶海区',340100000000,3), +(340103000000,'庐阳区',340100000000,3), +(340104000000,'蜀山区',340100000000,3), +(340111000000,'包河区',340100000000,3), +(340121000000,'长丰县',340100000000,3), +(340122000000,'肥东县',340100000000,3), +(340123000000,'肥西县',340100000000,3), +(340124000000,'庐江县',340100000000,3), +(340171000000,'合肥高新技术产业开发区',340100000000,3), +(340172000000,'合肥经济技术开发区',340100000000,3), +(340173000000,'合肥新站高新技术产业开发区',340100000000,3), +(340181000000,'巢湖市',340100000000,3), +(340200000000,'芜湖市',340000000000,2), +(340201000000,'市辖区',340200000000,3), +(340202000000,'镜湖区',340200000000,3), +(340203000000,'弋江区',340200000000,3), +(340207000000,'鸠江区',340200000000,3), +(340208000000,'三山区',340200000000,3), +(340221000000,'芜湖县',340200000000,3), +(340222000000,'繁昌县',340200000000,3), +(340223000000,'南陵县',340200000000,3), +(340225000000,'无为县',340200000000,3), +(340271000000,'芜湖经济技术开发区',340200000000,3), +(340272000000,'安徽芜湖长江大桥经济开发区',340200000000,3), +(340300000000,'蚌埠市',340000000000,2), +(340301000000,'市辖区',340300000000,3), +(340302000000,'龙子湖区',340300000000,3), +(340303000000,'蚌山区',340300000000,3), +(340304000000,'禹会区',340300000000,3), +(340311000000,'淮上区',340300000000,3), +(340321000000,'怀远县',340300000000,3), +(340322000000,'五河县',340300000000,3), +(340323000000,'固镇县',340300000000,3), +(340371000000,'蚌埠市高新技术开发区',340300000000,3), +(340372000000,'蚌埠市经济开发区',340300000000,3), +(340400000000,'淮南市',340000000000,2), +(340401000000,'市辖区',340400000000,3), +(340402000000,'大通区',340400000000,3), +(340403000000,'田家庵区',340400000000,3), +(340404000000,'谢家集区',340400000000,3), +(340405000000,'八公山区',340400000000,3), +(340406000000,'潘集区',340400000000,3), +(340421000000,'凤台县',340400000000,3), +(340422000000,'寿县',340400000000,3), +(340500000000,'马鞍山市',340000000000,2), +(340501000000,'市辖区',340500000000,3), +(340503000000,'花山区',340500000000,3), +(340504000000,'雨山区',340500000000,3), +(340506000000,'博望区',340500000000,3), +(340521000000,'当涂县',340500000000,3), +(340522000000,'含山县',340500000000,3), +(340523000000,'和县',340500000000,3), +(340600000000,'淮北市',340000000000,2), +(340601000000,'市辖区',340600000000,3), +(340602000000,'杜集区',340600000000,3), +(340603000000,'相山区',340600000000,3), +(340604000000,'烈山区',340600000000,3), +(340621000000,'濉溪县',340600000000,3), +(340700000000,'铜陵市',340000000000,2), +(340701000000,'市辖区',340700000000,3), +(340705000000,'铜官区',340700000000,3), +(340706000000,'义安区',340700000000,3), +(340711000000,'郊区',340700000000,3), +(340722000000,'枞阳县',340700000000,3), +(340800000000,'安庆市',340000000000,2), +(340801000000,'市辖区',340800000000,3), +(340802000000,'迎江区',340800000000,3), +(340803000000,'大观区',340800000000,3), +(340811000000,'宜秀区',340800000000,3), +(340822000000,'怀宁县',340800000000,3), +(340825000000,'太湖县',340800000000,3), +(340826000000,'宿松县',340800000000,3), +(340827000000,'望江县',340800000000,3), +(340828000000,'岳西县',340800000000,3), +(340871000000,'安徽安庆经济开发区',340800000000,3), +(340881000000,'桐城市',340800000000,3), +(340882000000,'潜山市',340800000000,3), +(341000000000,'黄山市',340000000000,2), +(341001000000,'市辖区',341000000000,3), +(341002000000,'屯溪区',341000000000,3), +(341003000000,'黄山区',341000000000,3), +(341004000000,'徽州区',341000000000,3), +(341021000000,'歙县',341000000000,3), +(341022000000,'休宁县',341000000000,3), +(341023000000,'黟县',341000000000,3), +(341024000000,'祁门县',341000000000,3), +(341100000000,'滁州市',340000000000,2), +(341101000000,'市辖区',341100000000,3), +(341102000000,'琅琊区',341100000000,3), +(341103000000,'南谯区',341100000000,3), +(341122000000,'来安县',341100000000,3), +(341124000000,'全椒县',341100000000,3), +(341125000000,'定远县',341100000000,3), +(341126000000,'凤阳县',341100000000,3), +(341171000000,'苏滁现代产业园',341100000000,3), +(341172000000,'滁州经济技术开发区',341100000000,3), +(341181000000,'天长市',341100000000,3), +(341182000000,'明光市',341100000000,3), +(341200000000,'阜阳市',340000000000,2), +(341201000000,'市辖区',341200000000,3), +(341202000000,'颍州区',341200000000,3), +(341203000000,'颍东区',341200000000,3), +(341204000000,'颍泉区',341200000000,3), +(341221000000,'临泉县',341200000000,3), +(341222000000,'太和县',341200000000,3), +(341225000000,'阜南县',341200000000,3), +(341226000000,'颍上县',341200000000,3), +(341271000000,'阜阳合肥现代产业园区',341200000000,3), +(341272000000,'阜阳经济技术开发区',341200000000,3), +(341282000000,'界首市',341200000000,3), +(341300000000,'宿州市',340000000000,2), +(341301000000,'市辖区',341300000000,3), +(341302000000,'埇桥区',341300000000,3), +(341321000000,'砀山县',341300000000,3), +(341322000000,'萧县',341300000000,3), +(341323000000,'灵璧县',341300000000,3), +(341324000000,'泗县',341300000000,3), +(341371000000,'宿州马鞍山现代产业园区',341300000000,3), +(341372000000,'宿州经济技术开发区',341300000000,3), +(341500000000,'六安市',340000000000,2), +(341501000000,'市辖区',341500000000,3), +(341502000000,'金安区',341500000000,3), +(341503000000,'裕安区',341500000000,3), +(341504000000,'叶集区',341500000000,3), +(341522000000,'霍邱县',341500000000,3), +(341523000000,'舒城县',341500000000,3), +(341524000000,'金寨县',341500000000,3), +(341525000000,'霍山县',341500000000,3), +(341600000000,'亳州市',340000000000,2), +(341601000000,'市辖区',341600000000,3), +(341602000000,'谯城区',341600000000,3), +(341621000000,'涡阳县',341600000000,3), +(341622000000,'蒙城县',341600000000,3), +(341623000000,'利辛县',341600000000,3), +(341700000000,'池州市',340000000000,2), +(341701000000,'市辖区',341700000000,3), +(341702000000,'贵池区',341700000000,3), +(341721000000,'东至县',341700000000,3), +(341722000000,'石台县',341700000000,3), +(341723000000,'青阳县',341700000000,3), +(341800000000,'宣城市',340000000000,2), +(341801000000,'市辖区',341800000000,3), +(341802000000,'宣州区',341800000000,3), +(341821000000,'郎溪县',341800000000,3), +(341822000000,'广德县',341800000000,3), +(341823000000,'泾县',341800000000,3), +(341824000000,'绩溪县',341800000000,3), +(341825000000,'旌德县',341800000000,3), +(341871000000,'宣城市经济开发区',341800000000,3), +(341881000000,'宁国市',341800000000,3), +(350000000000,'福建省',0,1), +(350100000000,'福州市',350000000000,2), +(350101000000,'市辖区',350100000000,3), +(350102000000,'鼓楼区',350100000000,3), +(350103000000,'台江区',350100000000,3), +(350104000000,'仓山区',350100000000,3), +(350105000000,'马尾区',350100000000,3), +(350111000000,'晋安区',350100000000,3), +(350112000000,'长乐区',350100000000,3), +(350121000000,'闽侯县',350100000000,3), +(350122000000,'连江县',350100000000,3), +(350123000000,'罗源县',350100000000,3), +(350124000000,'闽清县',350100000000,3), +(350125000000,'永泰县',350100000000,3), +(350128000000,'平潭县',350100000000,3), +(350181000000,'福清市',350100000000,3), +(350200000000,'厦门市',350000000000,2), +(350201000000,'市辖区',350200000000,3), +(350203000000,'思明区',350200000000,3), +(350205000000,'海沧区',350200000000,3), +(350206000000,'湖里区',350200000000,3), +(350211000000,'集美区',350200000000,3), +(350212000000,'同安区',350200000000,3), +(350213000000,'翔安区',350200000000,3), +(350300000000,'莆田市',350000000000,2), +(350301000000,'市辖区',350300000000,3), +(350302000000,'城厢区',350300000000,3), +(350303000000,'涵江区',350300000000,3), +(350304000000,'荔城区',350300000000,3), +(350305000000,'秀屿区',350300000000,3), +(350322000000,'仙游县',350300000000,3), +(350400000000,'三明市',350000000000,2), +(350401000000,'市辖区',350400000000,3), +(350402000000,'梅列区',350400000000,3), +(350403000000,'三元区',350400000000,3), +(350421000000,'明溪县',350400000000,3), +(350423000000,'清流县',350400000000,3), +(350424000000,'宁化县',350400000000,3), +(350425000000,'大田县',350400000000,3), +(350426000000,'尤溪县',350400000000,3), +(350427000000,'沙县',350400000000,3), +(350428000000,'将乐县',350400000000,3), +(350429000000,'泰宁县',350400000000,3), +(350430000000,'建宁县',350400000000,3), +(350481000000,'永安市',350400000000,3), +(350500000000,'泉州市',350000000000,2), +(350501000000,'市辖区',350500000000,3), +(350502000000,'鲤城区',350500000000,3), +(350503000000,'丰泽区',350500000000,3), +(350504000000,'洛江区',350500000000,3), +(350505000000,'泉港区',350500000000,3), +(350521000000,'惠安县',350500000000,3), +(350524000000,'安溪县',350500000000,3), +(350525000000,'永春县',350500000000,3), +(350526000000,'德化县',350500000000,3), +(350527000000,'金门县',350500000000,3), +(350581000000,'石狮市',350500000000,3), +(350582000000,'晋江市',350500000000,3), +(350583000000,'南安市',350500000000,3), +(350600000000,'漳州市',350000000000,2), +(350601000000,'市辖区',350600000000,3), +(350602000000,'芗城区',350600000000,3), +(350603000000,'龙文区',350600000000,3), +(350622000000,'云霄县',350600000000,3), +(350623000000,'漳浦县',350600000000,3), +(350624000000,'诏安县',350600000000,3), +(350625000000,'长泰县',350600000000,3), +(350626000000,'东山县',350600000000,3), +(350627000000,'南靖县',350600000000,3), +(350628000000,'平和县',350600000000,3), +(350629000000,'华安县',350600000000,3), +(350681000000,'龙海市',350600000000,3), +(350700000000,'南平市',350000000000,2), +(350701000000,'市辖区',350700000000,3), +(350702000000,'延平区',350700000000,3), +(350703000000,'建阳区',350700000000,3), +(350721000000,'顺昌县',350700000000,3), +(350722000000,'浦城县',350700000000,3), +(350723000000,'光泽县',350700000000,3), +(350724000000,'松溪县',350700000000,3), +(350725000000,'政和县',350700000000,3), +(350781000000,'邵武市',350700000000,3), +(350782000000,'武夷山市',350700000000,3), +(350783000000,'建瓯市',350700000000,3), +(350800000000,'龙岩市',350000000000,2), +(350801000000,'市辖区',350800000000,3), +(350802000000,'新罗区',350800000000,3), +(350803000000,'永定区',350800000000,3), +(350821000000,'长汀县',350800000000,3), +(350823000000,'上杭县',350800000000,3), +(350824000000,'武平县',350800000000,3), +(350825000000,'连城县',350800000000,3), +(350881000000,'漳平市',350800000000,3), +(350900000000,'宁德市',350000000000,2), +(350901000000,'市辖区',350900000000,3), +(350902000000,'蕉城区',350900000000,3), +(350921000000,'霞浦县',350900000000,3), +(350922000000,'古田县',350900000000,3), +(350923000000,'屏南县',350900000000,3), +(350924000000,'寿宁县',350900000000,3), +(350925000000,'周宁县',350900000000,3), +(350926000000,'柘荣县',350900000000,3), +(350981000000,'福安市',350900000000,3), +(350982000000,'福鼎市',350900000000,3), +(360000000000,'江西省',0,1), +(360100000000,'南昌市',360000000000,2), +(360101000000,'市辖区',360100000000,3), +(360102000000,'东湖区',360100000000,3), +(360103000000,'西湖区',360100000000,3), +(360104000000,'青云谱区',360100000000,3), +(360105000000,'湾里区',360100000000,3), +(360111000000,'青山湖区',360100000000,3), +(360112000000,'新建区',360100000000,3), +(360121000000,'南昌县',360100000000,3), +(360123000000,'安义县',360100000000,3), +(360124000000,'进贤县',360100000000,3), +(360200000000,'景德镇市',360000000000,2), +(360201000000,'市辖区',360200000000,3), +(360202000000,'昌江区',360200000000,3), +(360203000000,'珠山区',360200000000,3), +(360222000000,'浮梁县',360200000000,3), +(360281000000,'乐平市',360200000000,3), +(360300000000,'萍乡市',360000000000,2), +(360301000000,'市辖区',360300000000,3), +(360302000000,'安源区',360300000000,3), +(360313000000,'湘东区',360300000000,3), +(360321000000,'莲花县',360300000000,3), +(360322000000,'上栗县',360300000000,3), +(360323000000,'芦溪县',360300000000,3), +(360400000000,'九江市',360000000000,2), +(360401000000,'市辖区',360400000000,3), +(360402000000,'濂溪区',360400000000,3), +(360403000000,'浔阳区',360400000000,3), +(360404000000,'柴桑区',360400000000,3), +(360423000000,'武宁县',360400000000,3), +(360424000000,'修水县',360400000000,3), +(360425000000,'永修县',360400000000,3), +(360426000000,'德安县',360400000000,3), +(360428000000,'都昌县',360400000000,3), +(360429000000,'湖口县',360400000000,3), +(360430000000,'彭泽县',360400000000,3), +(360481000000,'瑞昌市',360400000000,3), +(360482000000,'共青城市',360400000000,3), +(360483000000,'庐山市',360400000000,3), +(360500000000,'新余市',360000000000,2), +(360501000000,'市辖区',360500000000,3), +(360502000000,'渝水区',360500000000,3), +(360521000000,'分宜县',360500000000,3), +(360600000000,'鹰潭市',360000000000,2), +(360601000000,'市辖区',360600000000,3), +(360602000000,'月湖区',360600000000,3), +(360603000000,'余江区',360600000000,3), +(360681000000,'贵溪市',360600000000,3), +(360700000000,'赣州市',360000000000,2), +(360701000000,'市辖区',360700000000,3), +(360702000000,'章贡区',360700000000,3), +(360703000000,'南康区',360700000000,3), +(360704000000,'赣县区',360700000000,3), +(360722000000,'信丰县',360700000000,3), +(360723000000,'大余县',360700000000,3), +(360724000000,'上犹县',360700000000,3), +(360725000000,'崇义县',360700000000,3), +(360726000000,'安远县',360700000000,3), +(360727000000,'龙南县',360700000000,3), +(360728000000,'定南县',360700000000,3), +(360729000000,'全南县',360700000000,3), +(360730000000,'宁都县',360700000000,3), +(360731000000,'于都县',360700000000,3), +(360732000000,'兴国县',360700000000,3), +(360733000000,'会昌县',360700000000,3), +(360734000000,'寻乌县',360700000000,3), +(360735000000,'石城县',360700000000,3), +(360781000000,'瑞金市',360700000000,3), +(360800000000,'吉安市',360000000000,2), +(360801000000,'市辖区',360800000000,3), +(360802000000,'吉州区',360800000000,3), +(360803000000,'青原区',360800000000,3), +(360821000000,'吉安县',360800000000,3), +(360822000000,'吉水县',360800000000,3), +(360823000000,'峡江县',360800000000,3), +(360824000000,'新干县',360800000000,3), +(360825000000,'永丰县',360800000000,3), +(360826000000,'泰和县',360800000000,3), +(360827000000,'遂川县',360800000000,3), +(360828000000,'万安县',360800000000,3), +(360829000000,'安福县',360800000000,3), +(360830000000,'永新县',360800000000,3), +(360881000000,'井冈山市',360800000000,3), +(360900000000,'宜春市',360000000000,2), +(360901000000,'市辖区',360900000000,3), +(360902000000,'袁州区',360900000000,3), +(360921000000,'奉新县',360900000000,3), +(360922000000,'万载县',360900000000,3), +(360923000000,'上高县',360900000000,3), +(360924000000,'宜丰县',360900000000,3), +(360925000000,'靖安县',360900000000,3), +(360926000000,'铜鼓县',360900000000,3), +(360981000000,'丰城市',360900000000,3), +(360982000000,'樟树市',360900000000,3), +(360983000000,'高安市',360900000000,3), +(361000000000,'抚州市',360000000000,2), +(361001000000,'市辖区',361000000000,3), +(361002000000,'临川区',361000000000,3), +(361003000000,'东乡区',361000000000,3), +(361021000000,'南城县',361000000000,3), +(361022000000,'黎川县',361000000000,3), +(361023000000,'南丰县',361000000000,3), +(361024000000,'崇仁县',361000000000,3), +(361025000000,'乐安县',361000000000,3), +(361026000000,'宜黄县',361000000000,3), +(361027000000,'金溪县',361000000000,3), +(361028000000,'资溪县',361000000000,3), +(361030000000,'广昌县',361000000000,3), +(361100000000,'上饶市',360000000000,2), +(361101000000,'市辖区',361100000000,3), +(361102000000,'信州区',361100000000,3), +(361103000000,'广丰区',361100000000,3), +(361121000000,'上饶县',361100000000,3), +(361123000000,'玉山县',361100000000,3), +(361124000000,'铅山县',361100000000,3), +(361125000000,'横峰县',361100000000,3), +(361126000000,'弋阳县',361100000000,3), +(361127000000,'余干县',361100000000,3), +(361128000000,'鄱阳县',361100000000,3), +(361129000000,'万年县',361100000000,3), +(361130000000,'婺源县',361100000000,3), +(361181000000,'德兴市',361100000000,3), +(370000000000,'山东省',0,1), +(370100000000,'济南市',370000000000,2), +(370101000000,'市辖区',370100000000,3), +(370102000000,'历下区',370100000000,3), +(370103000000,'市中区',370100000000,3), +(370104000000,'槐荫区',370100000000,3), +(370105000000,'天桥区',370100000000,3), +(370112000000,'历城区',370100000000,3), +(370113000000,'长清区',370100000000,3), +(370114000000,'章丘区',370100000000,3), +(370115000000,'济阳区',370100000000,3), +(370124000000,'平阴县',370100000000,3), +(370126000000,'商河县',370100000000,3), +(370171000000,'济南高新技术产业开发区',370100000000,3), +(370200000000,'青岛市',370000000000,2), +(370201000000,'市辖区',370200000000,3), +(370202000000,'市南区',370200000000,3), +(370203000000,'市北区',370200000000,3), +(370211000000,'黄岛区',370200000000,3), +(370212000000,'崂山区',370200000000,3), +(370213000000,'李沧区',370200000000,3), +(370214000000,'城阳区',370200000000,3), +(370215000000,'即墨区',370200000000,3), +(370271000000,'青岛高新技术产业开发区',370200000000,3), +(370281000000,'胶州市',370200000000,3), +(370283000000,'平度市',370200000000,3), +(370285000000,'莱西市',370200000000,3), +(370300000000,'淄博市',370000000000,2), +(370301000000,'市辖区',370300000000,3), +(370302000000,'淄川区',370300000000,3), +(370303000000,'张店区',370300000000,3), +(370304000000,'博山区',370300000000,3), +(370305000000,'临淄区',370300000000,3), +(370306000000,'周村区',370300000000,3), +(370321000000,'桓台县',370300000000,3), +(370322000000,'高青县',370300000000,3), +(370323000000,'沂源县',370300000000,3), +(370400000000,'枣庄市',370000000000,2), +(370401000000,'市辖区',370400000000,3), +(370402000000,'市中区',370400000000,3), +(370403000000,'薛城区',370400000000,3), +(370404000000,'峄城区',370400000000,3), +(370405000000,'台儿庄区',370400000000,3), +(370406000000,'山亭区',370400000000,3), +(370481000000,'滕州市',370400000000,3), +(370500000000,'东营市',370000000000,2), +(370501000000,'市辖区',370500000000,3), +(370502000000,'东营区',370500000000,3), +(370503000000,'河口区',370500000000,3), +(370505000000,'垦利区',370500000000,3), +(370522000000,'利津县',370500000000,3), +(370523000000,'广饶县',370500000000,3), +(370571000000,'东营经济技术开发区',370500000000,3), +(370572000000,'东营港经济开发区',370500000000,3), +(370600000000,'烟台市',370000000000,2), +(370601000000,'市辖区',370600000000,3), +(370602000000,'芝罘区',370600000000,3), +(370611000000,'福山区',370600000000,3), +(370612000000,'牟平区',370600000000,3), +(370613000000,'莱山区',370600000000,3), +(370634000000,'长岛县',370600000000,3), +(370671000000,'烟台高新技术产业开发区',370600000000,3), +(370672000000,'烟台经济技术开发区',370600000000,3), +(370681000000,'龙口市',370600000000,3), +(370682000000,'莱阳市',370600000000,3), +(370683000000,'莱州市',370600000000,3), +(370684000000,'蓬莱市',370600000000,3), +(370685000000,'招远市',370600000000,3), +(370686000000,'栖霞市',370600000000,3), +(370687000000,'海阳市',370600000000,3), +(370700000000,'潍坊市',370000000000,2), +(370701000000,'市辖区',370700000000,3), +(370702000000,'潍城区',370700000000,3), +(370703000000,'寒亭区',370700000000,3), +(370704000000,'坊子区',370700000000,3), +(370705000000,'奎文区',370700000000,3), +(370724000000,'临朐县',370700000000,3), +(370725000000,'昌乐县',370700000000,3), +(370772000000,'潍坊滨海经济技术开发区',370700000000,3), +(370781000000,'青州市',370700000000,3), +(370782000000,'诸城市',370700000000,3), +(370783000000,'寿光市',370700000000,3), +(370784000000,'安丘市',370700000000,3), +(370785000000,'高密市',370700000000,3), +(370786000000,'昌邑市',370700000000,3), +(370800000000,'济宁市',370000000000,2), +(370801000000,'市辖区',370800000000,3), +(370811000000,'任城区',370800000000,3), +(370812000000,'兖州区',370800000000,3), +(370826000000,'微山县',370800000000,3), +(370827000000,'鱼台县',370800000000,3), +(370828000000,'金乡县',370800000000,3), +(370829000000,'嘉祥县',370800000000,3), +(370830000000,'汶上县',370800000000,3), +(370831000000,'泗水县',370800000000,3), +(370832000000,'梁山县',370800000000,3), +(370871000000,'济宁高新技术产业开发区',370800000000,3), +(370881000000,'曲阜市',370800000000,3), +(370883000000,'邹城市',370800000000,3), +(370900000000,'泰安市',370000000000,2), +(370901000000,'市辖区',370900000000,3), +(370902000000,'泰山区',370900000000,3), +(370911000000,'岱岳区',370900000000,3), +(370921000000,'宁阳县',370900000000,3), +(370923000000,'东平县',370900000000,3), +(370982000000,'新泰市',370900000000,3), +(370983000000,'肥城市',370900000000,3), +(371000000000,'威海市',370000000000,2), +(371001000000,'市辖区',371000000000,3), +(371002000000,'环翠区',371000000000,3), +(371003000000,'文登区',371000000000,3), +(371071000000,'威海火炬高技术产业开发区',371000000000,3), +(371072000000,'威海经济技术开发区',371000000000,3), +(371073000000,'威海临港经济技术开发区',371000000000,3), +(371082000000,'荣成市',371000000000,3), +(371083000000,'乳山市',371000000000,3), +(371100000000,'日照市',370000000000,2), +(371101000000,'市辖区',371100000000,3), +(371102000000,'东港区',371100000000,3), +(371103000000,'岚山区',371100000000,3), +(371121000000,'五莲县',371100000000,3), +(371122000000,'莒县',371100000000,3), +(371171000000,'日照经济技术开发区',371100000000,3), +(371200000000,'莱芜市',370000000000,2), +(371201000000,'市辖区',371200000000,3), +(371202000000,'莱城区',371200000000,3), +(371203000000,'钢城区',371200000000,3), +(371300000000,'临沂市',370000000000,2), +(371301000000,'市辖区',371300000000,3), +(371302000000,'兰山区',371300000000,3), +(371311000000,'罗庄区',371300000000,3), +(371312000000,'河东区',371300000000,3), +(371321000000,'沂南县',371300000000,3), +(371322000000,'郯城县',371300000000,3), +(371323000000,'沂水县',371300000000,3), +(371324000000,'兰陵县',371300000000,3), +(371325000000,'费县',371300000000,3), +(371326000000,'平邑县',371300000000,3), +(371327000000,'莒南县',371300000000,3), +(371328000000,'蒙阴县',371300000000,3), +(371329000000,'临沭县',371300000000,3), +(371371000000,'临沂高新技术产业开发区',371300000000,3), +(371372000000,'临沂经济技术开发区',371300000000,3), +(371373000000,'临沂临港经济开发区',371300000000,3), +(371400000000,'德州市',370000000000,2), +(371401000000,'市辖区',371400000000,3), +(371402000000,'德城区',371400000000,3), +(371403000000,'陵城区',371400000000,3), +(371422000000,'宁津县',371400000000,3), +(371423000000,'庆云县',371400000000,3), +(371424000000,'临邑县',371400000000,3), +(371425000000,'齐河县',371400000000,3), +(371426000000,'平原县',371400000000,3), +(371427000000,'夏津县',371400000000,3), +(371428000000,'武城县',371400000000,3), +(371471000000,'德州经济技术开发区',371400000000,3), +(371472000000,'德州运河经济开发区',371400000000,3), +(371481000000,'乐陵市',371400000000,3), +(371482000000,'禹城市',371400000000,3), +(371500000000,'聊城市',370000000000,2), +(371501000000,'市辖区',371500000000,3), +(371502000000,'东昌府区',371500000000,3), +(371521000000,'阳谷县',371500000000,3), +(371522000000,'莘县',371500000000,3), +(371523000000,'茌平县',371500000000,3), +(371524000000,'东阿县',371500000000,3), +(371525000000,'冠县',371500000000,3), +(371526000000,'高唐县',371500000000,3), +(371581000000,'临清市',371500000000,3), +(371600000000,'滨州市',370000000000,2), +(371601000000,'市辖区',371600000000,3), +(371602000000,'滨城区',371600000000,3), +(371603000000,'沾化区',371600000000,3), +(371621000000,'惠民县',371600000000,3), +(371622000000,'阳信县',371600000000,3), +(371623000000,'无棣县',371600000000,3), +(371625000000,'博兴县',371600000000,3), +(371681000000,'邹平市',371600000000,3), +(371700000000,'菏泽市',370000000000,2), +(371701000000,'市辖区',371700000000,3), +(371702000000,'牡丹区',371700000000,3), +(371703000000,'定陶区',371700000000,3), +(371721000000,'曹县',371700000000,3), +(371722000000,'单县',371700000000,3), +(371723000000,'成武县',371700000000,3), +(371724000000,'巨野县',371700000000,3), +(371725000000,'郓城县',371700000000,3), +(371726000000,'鄄城县',371700000000,3), +(371728000000,'东明县',371700000000,3), +(371771000000,'菏泽经济技术开发区',371700000000,3), +(371772000000,'菏泽高新技术开发区',371700000000,3), +(410000000000,'河南省',0,1), +(410100000000,'郑州市',410000000000,2), +(410101000000,'市辖区',410100000000,3), +(410102000000,'中原区',410100000000,3), +(410103000000,'二七区',410100000000,3), +(410104000000,'管城回族区',410100000000,3), +(410105000000,'金水区',410100000000,3), +(410106000000,'上街区',410100000000,3), +(410108000000,'惠济区',410100000000,3), +(410122000000,'中牟县',410100000000,3), +(410171000000,'郑州经济技术开发区',410100000000,3), +(410172000000,'郑州高新技术产业开发区',410100000000,3), +(410173000000,'郑州航空港经济综合实验区',410100000000,3), +(410181000000,'巩义市',410100000000,3), +(410182000000,'荥阳市',410100000000,3), +(410183000000,'新密市',410100000000,3), +(410184000000,'新郑市',410100000000,3), +(410185000000,'登封市',410100000000,3), +(410200000000,'开封市',410000000000,2), +(410201000000,'市辖区',410200000000,3), +(410202000000,'龙亭区',410200000000,3), +(410203000000,'顺河回族区',410200000000,3), +(410204000000,'鼓楼区',410200000000,3), +(410205000000,'禹王台区',410200000000,3), +(410212000000,'祥符区',410200000000,3), +(410221000000,'杞县',410200000000,3), +(410222000000,'通许县',410200000000,3), +(410223000000,'尉氏县',410200000000,3), +(410225000000,'兰考县',410200000000,3), +(410300000000,'洛阳市',410000000000,2), +(410301000000,'市辖区',410300000000,3), +(410302000000,'老城区',410300000000,3), +(410303000000,'西工区',410300000000,3), +(410304000000,'瀍河回族区',410300000000,3), +(410305000000,'涧西区',410300000000,3), +(410306000000,'吉利区',410300000000,3), +(410311000000,'洛龙区',410300000000,3), +(410322000000,'孟津县',410300000000,3), +(410323000000,'新安县',410300000000,3), +(410324000000,'栾川县',410300000000,3), +(410325000000,'嵩县',410300000000,3), +(410326000000,'汝阳县',410300000000,3), +(410327000000,'宜阳县',410300000000,3), +(410328000000,'洛宁县',410300000000,3), +(410329000000,'伊川县',410300000000,3), +(410371000000,'洛阳高新技术产业开发区',410300000000,3), +(410381000000,'偃师市',410300000000,3), +(410400000000,'平顶山市',410000000000,2), +(410401000000,'市辖区',410400000000,3), +(410402000000,'新华区',410400000000,3), +(410403000000,'卫东区',410400000000,3), +(410404000000,'石龙区',410400000000,3), +(410411000000,'湛河区',410400000000,3), +(410421000000,'宝丰县',410400000000,3), +(410422000000,'叶县',410400000000,3), +(410423000000,'鲁山县',410400000000,3), +(410425000000,'郏县',410400000000,3), +(410471000000,'平顶山高新技术产业开发区',410400000000,3), +(410472000000,'平顶山市新城区',410400000000,3), +(410481000000,'舞钢市',410400000000,3), +(410482000000,'汝州市',410400000000,3), +(410500000000,'安阳市',410000000000,2), +(410501000000,'市辖区',410500000000,3), +(410502000000,'文峰区',410500000000,3), +(410503000000,'北关区',410500000000,3), +(410505000000,'殷都区',410500000000,3), +(410506000000,'龙安区',410500000000,3), +(410522000000,'安阳县',410500000000,3), +(410523000000,'汤阴县',410500000000,3), +(410526000000,'滑县',410500000000,3), +(410527000000,'内黄县',410500000000,3), +(410571000000,'安阳高新技术产业开发区',410500000000,3), +(410581000000,'林州市',410500000000,3), +(410600000000,'鹤壁市',410000000000,2), +(410601000000,'市辖区',410600000000,3), +(410602000000,'鹤山区',410600000000,3), +(410603000000,'山城区',410600000000,3), +(410611000000,'淇滨区',410600000000,3), +(410621000000,'浚县',410600000000,3), +(410622000000,'淇县',410600000000,3), +(410671000000,'鹤壁经济技术开发区',410600000000,3), +(410700000000,'新乡市',410000000000,2), +(410701000000,'市辖区',410700000000,3), +(410702000000,'红旗区',410700000000,3), +(410703000000,'卫滨区',410700000000,3), +(410704000000,'凤泉区',410700000000,3), +(410711000000,'牧野区',410700000000,3), +(410721000000,'新乡县',410700000000,3), +(410724000000,'获嘉县',410700000000,3), +(410725000000,'原阳县',410700000000,3), +(410726000000,'延津县',410700000000,3), +(410727000000,'封丘县',410700000000,3), +(410728000000,'长垣县',410700000000,3), +(410771000000,'新乡高新技术产业开发区',410700000000,3), +(410772000000,'新乡经济技术开发区',410700000000,3), +(410773000000,'新乡市平原城乡一体化示范区',410700000000,3), +(410781000000,'卫辉市',410700000000,3), +(410782000000,'辉县市',410700000000,3), +(410800000000,'焦作市',410000000000,2), +(410801000000,'市辖区',410800000000,3), +(410802000000,'解放区',410800000000,3), +(410803000000,'中站区',410800000000,3), +(410804000000,'马村区',410800000000,3), +(410811000000,'山阳区',410800000000,3), +(410821000000,'修武县',410800000000,3), +(410822000000,'博爱县',410800000000,3), +(410823000000,'武陟县',410800000000,3), +(410825000000,'温县',410800000000,3), +(410871000000,'焦作城乡一体化示范区',410800000000,3), +(410882000000,'沁阳市',410800000000,3), +(410883000000,'孟州市',410800000000,3), +(410900000000,'濮阳市',410000000000,2), +(410901000000,'市辖区',410900000000,3), +(410902000000,'华龙区',410900000000,3), +(410922000000,'清丰县',410900000000,3), +(410923000000,'南乐县',410900000000,3), +(410926000000,'范县',410900000000,3), +(410927000000,'台前县',410900000000,3), +(410928000000,'濮阳县',410900000000,3), +(410971000000,'河南濮阳工业园区',410900000000,3), +(410972000000,'濮阳经济技术开发区',410900000000,3), +(411000000000,'许昌市',410000000000,2), +(411001000000,'市辖区',411000000000,3), +(411002000000,'魏都区',411000000000,3), +(411003000000,'建安区',411000000000,3), +(411024000000,'鄢陵县',411000000000,3), +(411025000000,'襄城县',411000000000,3), +(411071000000,'许昌经济技术开发区',411000000000,3), +(411081000000,'禹州市',411000000000,3), +(411082000000,'长葛市',411000000000,3), +(411100000000,'漯河市',410000000000,2), +(411101000000,'市辖区',411100000000,3), +(411102000000,'源汇区',411100000000,3), +(411103000000,'郾城区',411100000000,3), +(411104000000,'召陵区',411100000000,3), +(411121000000,'舞阳县',411100000000,3), +(411122000000,'临颍县',411100000000,3), +(411171000000,'漯河经济技术开发区',411100000000,3), +(411200000000,'三门峡市',410000000000,2), +(411201000000,'市辖区',411200000000,3), +(411202000000,'湖滨区',411200000000,3), +(411203000000,'陕州区',411200000000,3), +(411221000000,'渑池县',411200000000,3), +(411224000000,'卢氏县',411200000000,3), +(411271000000,'河南三门峡经济开发区',411200000000,3), +(411281000000,'义马市',411200000000,3), +(411282000000,'灵宝市',411200000000,3), +(411300000000,'南阳市',410000000000,2), +(411301000000,'市辖区',411300000000,3), +(411302000000,'宛城区',411300000000,3), +(411303000000,'卧龙区',411300000000,3), +(411321000000,'南召县',411300000000,3), +(411322000000,'方城县',411300000000,3), +(411323000000,'西峡县',411300000000,3), +(411324000000,'镇平县',411300000000,3), +(411325000000,'内乡县',411300000000,3), +(411326000000,'淅川县',411300000000,3), +(411327000000,'社旗县',411300000000,3), +(411328000000,'唐河县',411300000000,3), +(411329000000,'新野县',411300000000,3), +(411330000000,'桐柏县',411300000000,3), +(411371000000,'南阳高新技术产业开发区',411300000000,3), +(411372000000,'南阳市城乡一体化示范区',411300000000,3), +(411381000000,'邓州市',411300000000,3), +(411400000000,'商丘市',410000000000,2), +(411401000000,'市辖区',411400000000,3), +(411402000000,'梁园区',411400000000,3), +(411403000000,'睢阳区',411400000000,3), +(411421000000,'民权县',411400000000,3), +(411422000000,'睢县',411400000000,3), +(411423000000,'宁陵县',411400000000,3), +(411424000000,'柘城县',411400000000,3), +(411425000000,'虞城县',411400000000,3), +(411426000000,'夏邑县',411400000000,3), +(411471000000,'豫东综合物流产业聚集区',411400000000,3), +(411472000000,'河南商丘经济开发区',411400000000,3), +(411481000000,'永城市',411400000000,3), +(411500000000,'信阳市',410000000000,2), +(411501000000,'市辖区',411500000000,3), +(411502000000,'浉河区',411500000000,3), +(411503000000,'平桥区',411500000000,3), +(411521000000,'罗山县',411500000000,3), +(411522000000,'光山县',411500000000,3), +(411523000000,'新县',411500000000,3), +(411524000000,'商城县',411500000000,3), +(411525000000,'固始县',411500000000,3), +(411526000000,'潢川县',411500000000,3), +(411527000000,'淮滨县',411500000000,3), +(411528000000,'息县',411500000000,3), +(411571000000,'信阳高新技术产业开发区',411500000000,3), +(411600000000,'周口市',410000000000,2), +(411601000000,'市辖区',411600000000,3), +(411602000000,'川汇区',411600000000,3), +(411621000000,'扶沟县',411600000000,3), +(411622000000,'西华县',411600000000,3), +(411623000000,'商水县',411600000000,3), +(411624000000,'沈丘县',411600000000,3), +(411625000000,'郸城县',411600000000,3), +(411626000000,'淮阳县',411600000000,3), +(411627000000,'太康县',411600000000,3), +(411628000000,'鹿邑县',411600000000,3), +(411671000000,'河南周口经济开发区',411600000000,3), +(411681000000,'项城市',411600000000,3), +(411700000000,'驻马店市',410000000000,2), +(411701000000,'市辖区',411700000000,3), +(411702000000,'驿城区',411700000000,3), +(411721000000,'西平县',411700000000,3), +(411722000000,'上蔡县',411700000000,3), +(411723000000,'平舆县',411700000000,3), +(411724000000,'正阳县',411700000000,3), +(411725000000,'确山县',411700000000,3), +(411726000000,'泌阳县',411700000000,3), +(411727000000,'汝南县',411700000000,3), +(411728000000,'遂平县',411700000000,3), +(411729000000,'新蔡县',411700000000,3), +(411771000000,'河南驻马店经济开发区',411700000000,3), +(419000000000,'省直辖县级行政区划',410000000000,2), +(419001000000,'济源市',419000000000,3), +(420000000000,'湖北省',0,1), +(420100000000,'武汉市',420000000000,2), +(420101000000,'市辖区',420100000000,3), +(420102000000,'江岸区',420100000000,3), +(420103000000,'江汉区',420100000000,3), +(420104000000,'硚口区',420100000000,3), +(420105000000,'汉阳区',420100000000,3), +(420106000000,'武昌区',420100000000,3), +(420107000000,'青山区',420100000000,3), +(420111000000,'洪山区',420100000000,3), +(420112000000,'东西湖区',420100000000,3), +(420113000000,'汉南区',420100000000,3), +(420114000000,'蔡甸区',420100000000,3), +(420115000000,'江夏区',420100000000,3), +(420116000000,'黄陂区',420100000000,3), +(420117000000,'新洲区',420100000000,3), +(420200000000,'黄石市',420000000000,2), +(420201000000,'市辖区',420200000000,3), +(420202000000,'黄石港区',420200000000,3), +(420203000000,'西塞山区',420200000000,3), +(420204000000,'下陆区',420200000000,3), +(420205000000,'铁山区',420200000000,3), +(420222000000,'阳新县',420200000000,3), +(420281000000,'大冶市',420200000000,3), +(420300000000,'十堰市',420000000000,2), +(420301000000,'市辖区',420300000000,3), +(420302000000,'茅箭区',420300000000,3), +(420303000000,'张湾区',420300000000,3), +(420304000000,'郧阳区',420300000000,3), +(420322000000,'郧西县',420300000000,3), +(420323000000,'竹山县',420300000000,3), +(420324000000,'竹溪县',420300000000,3), +(420325000000,'房县',420300000000,3), +(420381000000,'丹江口市',420300000000,3), +(420500000000,'宜昌市',420000000000,2), +(420501000000,'市辖区',420500000000,3), +(420502000000,'西陵区',420500000000,3), +(420503000000,'伍家岗区',420500000000,3), +(420504000000,'点军区',420500000000,3), +(420505000000,'猇亭区',420500000000,3), +(420506000000,'夷陵区',420500000000,3), +(420525000000,'远安县',420500000000,3), +(420526000000,'兴山县',420500000000,3), +(420527000000,'秭归县',420500000000,3), +(420528000000,'长阳土家族自治县',420500000000,3), +(420529000000,'五峰土家族自治县',420500000000,3), +(420581000000,'宜都市',420500000000,3), +(420582000000,'当阳市',420500000000,3), +(420583000000,'枝江市',420500000000,3), +(420600000000,'襄阳市',420000000000,2), +(420601000000,'市辖区',420600000000,3), +(420602000000,'襄城区',420600000000,3), +(420606000000,'樊城区',420600000000,3), +(420607000000,'襄州区',420600000000,3), +(420624000000,'南漳县',420600000000,3), +(420625000000,'谷城县',420600000000,3), +(420626000000,'保康县',420600000000,3), +(420682000000,'老河口市',420600000000,3), +(420683000000,'枣阳市',420600000000,3), +(420684000000,'宜城市',420600000000,3), +(420700000000,'鄂州市',420000000000,2), +(420701000000,'市辖区',420700000000,3), +(420702000000,'梁子湖区',420700000000,3), +(420703000000,'华容区',420700000000,3), +(420704000000,'鄂城区',420700000000,3), +(420800000000,'荆门市',420000000000,2), +(420801000000,'市辖区',420800000000,3), +(420802000000,'东宝区',420800000000,3), +(420804000000,'掇刀区',420800000000,3), +(420822000000,'沙洋县',420800000000,3), +(420881000000,'钟祥市',420800000000,3), +(420882000000,'京山市',420800000000,3), +(420900000000,'孝感市',420000000000,2), +(420901000000,'市辖区',420900000000,3), +(420902000000,'孝南区',420900000000,3), +(420921000000,'孝昌县',420900000000,3), +(420922000000,'大悟县',420900000000,3), +(420923000000,'云梦县',420900000000,3), +(420981000000,'应城市',420900000000,3), +(420982000000,'安陆市',420900000000,3), +(420984000000,'汉川市',420900000000,3), +(421000000000,'荆州市',420000000000,2), +(421001000000,'市辖区',421000000000,3), +(421002000000,'沙市区',421000000000,3), +(421003000000,'荆州区',421000000000,3), +(421022000000,'公安县',421000000000,3), +(421023000000,'监利县',421000000000,3), +(421024000000,'江陵县',421000000000,3), +(421071000000,'荆州经济技术开发区',421000000000,3), +(421081000000,'石首市',421000000000,3), +(421083000000,'洪湖市',421000000000,3), +(421087000000,'松滋市',421000000000,3), +(421100000000,'黄冈市',420000000000,2), +(421101000000,'市辖区',421100000000,3), +(421102000000,'黄州区',421100000000,3), +(421121000000,'团风县',421100000000,3), +(421122000000,'红安县',421100000000,3), +(421123000000,'罗田县',421100000000,3), +(421124000000,'英山县',421100000000,3), +(421125000000,'浠水县',421100000000,3), +(421126000000,'蕲春县',421100000000,3), +(421127000000,'黄梅县',421100000000,3), +(421171000000,'龙感湖管理区',421100000000,3), +(421181000000,'麻城市',421100000000,3), +(421182000000,'武穴市',421100000000,3), +(421200000000,'咸宁市',420000000000,2), +(421201000000,'市辖区',421200000000,3), +(421202000000,'咸安区',421200000000,3), +(421221000000,'嘉鱼县',421200000000,3), +(421222000000,'通城县',421200000000,3), +(421223000000,'崇阳县',421200000000,3), +(421224000000,'通山县',421200000000,3), +(421281000000,'赤壁市',421200000000,3), +(421300000000,'随州市',420000000000,2), +(421301000000,'市辖区',421300000000,3), +(421303000000,'曾都区',421300000000,3), +(421321000000,'随县',421300000000,3), +(421381000000,'广水市',421300000000,3), +(422800000000,'恩施土家族苗族自治州',420000000000,2), +(422801000000,'恩施市',422800000000,3), +(422802000000,'利川市',422800000000,3), +(422822000000,'建始县',422800000000,3), +(422823000000,'巴东县',422800000000,3), +(422825000000,'宣恩县',422800000000,3), +(422826000000,'咸丰县',422800000000,3), +(422827000000,'来凤县',422800000000,3), +(422828000000,'鹤峰县',422800000000,3), +(429000000000,'省直辖县级行政区划',420000000000,2), +(429004000000,'仙桃市',429000000000,3), +(429005000000,'潜江市',429000000000,3), +(429006000000,'天门市',429000000000,3), +(429021000000,'神农架林区',429000000000,3), +(430000000000,'湖南省',0,1), +(430100000000,'长沙市',430000000000,2), +(430101000000,'市辖区',430100000000,3), +(430102000000,'芙蓉区',430100000000,3), +(430103000000,'天心区',430100000000,3), +(430104000000,'岳麓区',430100000000,3), +(430105000000,'开福区',430100000000,3), +(430111000000,'雨花区',430100000000,3), +(430112000000,'望城区',430100000000,3), +(430121000000,'长沙县',430100000000,3), +(430181000000,'浏阳市',430100000000,3), +(430182000000,'宁乡市',430100000000,3), +(430200000000,'株洲市',430000000000,2), +(430201000000,'市辖区',430200000000,3), +(430202000000,'荷塘区',430200000000,3), +(430203000000,'芦淞区',430200000000,3), +(430204000000,'石峰区',430200000000,3), +(430211000000,'天元区',430200000000,3), +(430212000000,'渌口区',430200000000,3), +(430223000000,'攸县',430200000000,3), +(430224000000,'茶陵县',430200000000,3), +(430225000000,'炎陵县',430200000000,3), +(430271000000,'云龙示范区',430200000000,3), +(430281000000,'醴陵市',430200000000,3), +(430300000000,'湘潭市',430000000000,2), +(430301000000,'市辖区',430300000000,3), +(430302000000,'雨湖区',430300000000,3), +(430304000000,'岳塘区',430300000000,3), +(430321000000,'湘潭县',430300000000,3), +(430371000000,'湖南湘潭高新技术产业园区',430300000000,3), +(430372000000,'湘潭昭山示范区',430300000000,3), +(430373000000,'湘潭九华示范区',430300000000,3), +(430381000000,'湘乡市',430300000000,3), +(430382000000,'韶山市',430300000000,3), +(430400000000,'衡阳市',430000000000,2), +(430401000000,'市辖区',430400000000,3), +(430405000000,'珠晖区',430400000000,3), +(430406000000,'雁峰区',430400000000,3), +(430407000000,'石鼓区',430400000000,3), +(430408000000,'蒸湘区',430400000000,3), +(430412000000,'南岳区',430400000000,3), +(430421000000,'衡阳县',430400000000,3), +(430422000000,'衡南县',430400000000,3), +(430423000000,'衡山县',430400000000,3), +(430424000000,'衡东县',430400000000,3), +(430426000000,'祁东县',430400000000,3), +(430471000000,'衡阳综合保税区',430400000000,3), +(430472000000,'湖南衡阳高新技术产业园区',430400000000,3), +(430473000000,'湖南衡阳松木经济开发区',430400000000,3), +(430481000000,'耒阳市',430400000000,3), +(430482000000,'常宁市',430400000000,3), +(430500000000,'邵阳市',430000000000,2), +(430501000000,'市辖区',430500000000,3), +(430502000000,'双清区',430500000000,3), +(430503000000,'大祥区',430500000000,3), +(430511000000,'北塔区',430500000000,3), +(430521000000,'邵东县',430500000000,3), +(430522000000,'新邵县',430500000000,3), +(430523000000,'邵阳县',430500000000,3), +(430524000000,'隆回县',430500000000,3), +(430525000000,'洞口县',430500000000,3), +(430527000000,'绥宁县',430500000000,3), +(430528000000,'新宁县',430500000000,3), +(430529000000,'城步苗族自治县',430500000000,3), +(430581000000,'武冈市',430500000000,3), +(430600000000,'岳阳市',430000000000,2), +(430601000000,'市辖区',430600000000,3), +(430602000000,'岳阳楼区',430600000000,3), +(430603000000,'云溪区',430600000000,3), +(430611000000,'君山区',430600000000,3), +(430621000000,'岳阳县',430600000000,3), +(430623000000,'华容县',430600000000,3), +(430624000000,'湘阴县',430600000000,3), +(430626000000,'平江县',430600000000,3), +(430671000000,'岳阳市屈原管理区',430600000000,3), +(430681000000,'汨罗市',430600000000,3), +(430682000000,'临湘市',430600000000,3), +(430700000000,'常德市',430000000000,2), +(430701000000,'市辖区',430700000000,3), +(430702000000,'武陵区',430700000000,3), +(430703000000,'鼎城区',430700000000,3), +(430721000000,'安乡县',430700000000,3), +(430722000000,'汉寿县',430700000000,3), +(430723000000,'澧县',430700000000,3), +(430724000000,'临澧县',430700000000,3), +(430725000000,'桃源县',430700000000,3), +(430726000000,'石门县',430700000000,3), +(430771000000,'常德市西洞庭管理区',430700000000,3), +(430781000000,'津市市',430700000000,3), +(430800000000,'张家界市',430000000000,2), +(430801000000,'市辖区',430800000000,3), +(430802000000,'永定区',430800000000,3), +(430811000000,'武陵源区',430800000000,3), +(430821000000,'慈利县',430800000000,3), +(430822000000,'桑植县',430800000000,3), +(430900000000,'益阳市',430000000000,2), +(430901000000,'市辖区',430900000000,3), +(430902000000,'资阳区',430900000000,3), +(430903000000,'赫山区',430900000000,3), +(430921000000,'南县',430900000000,3), +(430922000000,'桃江县',430900000000,3), +(430923000000,'安化县',430900000000,3), +(430971000000,'益阳市大通湖管理区',430900000000,3), +(430972000000,'湖南益阳高新技术产业园区',430900000000,3), +(430981000000,'沅江市',430900000000,3), +(431000000000,'郴州市',430000000000,2), +(431001000000,'市辖区',431000000000,3), +(431002000000,'北湖区',431000000000,3), +(431003000000,'苏仙区',431000000000,3), +(431021000000,'桂阳县',431000000000,3), +(431022000000,'宜章县',431000000000,3), +(431023000000,'永兴县',431000000000,3), +(431024000000,'嘉禾县',431000000000,3), +(431025000000,'临武县',431000000000,3), +(431026000000,'汝城县',431000000000,3), +(431027000000,'桂东县',431000000000,3), +(431028000000,'安仁县',431000000000,3), +(431081000000,'资兴市',431000000000,3), +(431100000000,'永州市',430000000000,2), +(431101000000,'市辖区',431100000000,3), +(431102000000,'零陵区',431100000000,3), +(431103000000,'冷水滩区',431100000000,3), +(431121000000,'祁阳县',431100000000,3), +(431122000000,'东安县',431100000000,3), +(431123000000,'双牌县',431100000000,3), +(431124000000,'道县',431100000000,3), +(431125000000,'江永县',431100000000,3), +(431126000000,'宁远县',431100000000,3), +(431127000000,'蓝山县',431100000000,3), +(431128000000,'新田县',431100000000,3), +(431129000000,'江华瑶族自治县',431100000000,3), +(431171000000,'永州经济技术开发区',431100000000,3), +(431172000000,'永州市金洞管理区',431100000000,3), +(431173000000,'永州市回龙圩管理区',431100000000,3), +(431200000000,'怀化市',430000000000,2), +(431201000000,'市辖区',431200000000,3), +(431202000000,'鹤城区',431200000000,3), +(431221000000,'中方县',431200000000,3), +(431222000000,'沅陵县',431200000000,3), +(431223000000,'辰溪县',431200000000,3), +(431224000000,'溆浦县',431200000000,3), +(431225000000,'会同县',431200000000,3), +(431226000000,'麻阳苗族自治县',431200000000,3), +(431227000000,'新晃侗族自治县',431200000000,3), +(431228000000,'芷江侗族自治县',431200000000,3), +(431229000000,'靖州苗族侗族自治县',431200000000,3), +(431230000000,'通道侗族自治县',431200000000,3), +(431271000000,'怀化市洪江管理区',431200000000,3), +(431281000000,'洪江市',431200000000,3), +(431300000000,'娄底市',430000000000,2), +(431301000000,'市辖区',431300000000,3), +(431302000000,'娄星区',431300000000,3), +(431321000000,'双峰县',431300000000,3), +(431322000000,'新化县',431300000000,3), +(431381000000,'冷水江市',431300000000,3), +(431382000000,'涟源市',431300000000,3), +(433100000000,'湘西土家族苗族自治州',430000000000,2), +(433101000000,'吉首市',433100000000,3), +(433122000000,'泸溪县',433100000000,3), +(433123000000,'凤凰县',433100000000,3), +(433124000000,'花垣县',433100000000,3), +(433125000000,'保靖县',433100000000,3), +(433126000000,'古丈县',433100000000,3), +(433127000000,'永顺县',433100000000,3), +(433130000000,'龙山县',433100000000,3), +(433172000000,'湖南吉首经济开发区',433100000000,3), +(433173000000,'湖南永顺经济开发区',433100000000,3), +(440000000000,'广东省',0,1), +(440100000000,'广州市',440000000000,2), +(440101000000,'市辖区',440100000000,3), +(440103000000,'荔湾区',440100000000,3), +(440104000000,'越秀区',440100000000,3), +(440105000000,'海珠区',440100000000,3), +(440106000000,'天河区',440100000000,3), +(440111000000,'白云区',440100000000,3), +(440112000000,'黄埔区',440100000000,3), +(440113000000,'番禺区',440100000000,3), +(440114000000,'花都区',440100000000,3), +(440115000000,'南沙区',440100000000,3), +(440117000000,'从化区',440100000000,3), +(440118000000,'增城区',440100000000,3), +(440200000000,'韶关市',440000000000,2), +(440201000000,'市辖区',440200000000,3), +(440203000000,'武江区',440200000000,3), +(440204000000,'浈江区',440200000000,3), +(440205000000,'曲江区',440200000000,3), +(440222000000,'始兴县',440200000000,3), +(440224000000,'仁化县',440200000000,3), +(440229000000,'翁源县',440200000000,3), +(440232000000,'乳源瑶族自治县',440200000000,3), +(440233000000,'新丰县',440200000000,3), +(440281000000,'乐昌市',440200000000,3), +(440282000000,'南雄市',440200000000,3), +(440300000000,'深圳市',440000000000,2), +(440301000000,'市辖区',440300000000,3), +(440303000000,'罗湖区',440300000000,3), +(440304000000,'福田区',440300000000,3), +(440305000000,'南山区',440300000000,3), +(440306000000,'宝安区',440300000000,3), +(440307000000,'龙岗区',440300000000,3), +(440308000000,'盐田区',440300000000,3), +(440309000000,'龙华区',440300000000,3), +(440310000000,'坪山区',440300000000,3), +(440311000000,'光明区',440300000000,3), +(440400000000,'珠海市',440000000000,2), +(440401000000,'市辖区',440400000000,3), +(440402000000,'香洲区',440400000000,3), +(440403000000,'斗门区',440400000000,3), +(440404000000,'金湾区',440400000000,3), +(440500000000,'汕头市',440000000000,2), +(440501000000,'市辖区',440500000000,3), +(440507000000,'龙湖区',440500000000,3), +(440511000000,'金平区',440500000000,3), +(440512000000,'濠江区',440500000000,3), +(440513000000,'潮阳区',440500000000,3), +(440514000000,'潮南区',440500000000,3), +(440515000000,'澄海区',440500000000,3), +(440523000000,'南澳县',440500000000,3), +(440600000000,'佛山市',440000000000,2), +(440601000000,'市辖区',440600000000,3), +(440604000000,'禅城区',440600000000,3), +(440605000000,'南海区',440600000000,3), +(440606000000,'顺德区',440600000000,3), +(440607000000,'三水区',440600000000,3), +(440608000000,'高明区',440600000000,3), +(440700000000,'江门市',440000000000,2), +(440701000000,'市辖区',440700000000,3), +(440703000000,'蓬江区',440700000000,3), +(440704000000,'江海区',440700000000,3), +(440705000000,'新会区',440700000000,3), +(440781000000,'台山市',440700000000,3), +(440783000000,'开平市',440700000000,3), +(440784000000,'鹤山市',440700000000,3), +(440785000000,'恩平市',440700000000,3), +(440800000000,'湛江市',440000000000,2), +(440801000000,'市辖区',440800000000,3), +(440802000000,'赤坎区',440800000000,3), +(440803000000,'霞山区',440800000000,3), +(440804000000,'坡头区',440800000000,3), +(440811000000,'麻章区',440800000000,3), +(440823000000,'遂溪县',440800000000,3), +(440825000000,'徐闻县',440800000000,3), +(440881000000,'廉江市',440800000000,3), +(440882000000,'雷州市',440800000000,3), +(440883000000,'吴川市',440800000000,3), +(440900000000,'茂名市',440000000000,2), +(440901000000,'市辖区',440900000000,3), +(440902000000,'茂南区',440900000000,3), +(440904000000,'电白区',440900000000,3), +(440981000000,'高州市',440900000000,3), +(440982000000,'化州市',440900000000,3), +(440983000000,'信宜市',440900000000,3), +(441200000000,'肇庆市',440000000000,2), +(441201000000,'市辖区',441200000000,3), +(441202000000,'端州区',441200000000,3), +(441203000000,'鼎湖区',441200000000,3), +(441204000000,'高要区',441200000000,3), +(441223000000,'广宁县',441200000000,3), +(441224000000,'怀集县',441200000000,3), +(441225000000,'封开县',441200000000,3), +(441226000000,'德庆县',441200000000,3), +(441284000000,'四会市',441200000000,3), +(441300000000,'惠州市',440000000000,2), +(441301000000,'市辖区',441300000000,3), +(441302000000,'惠城区',441300000000,3), +(441303000000,'惠阳区',441300000000,3), +(441322000000,'博罗县',441300000000,3), +(441323000000,'惠东县',441300000000,3), +(441324000000,'龙门县',441300000000,3), +(441400000000,'梅州市',440000000000,2), +(441401000000,'市辖区',441400000000,3), +(441402000000,'梅江区',441400000000,3), +(441403000000,'梅县区',441400000000,3), +(441422000000,'大埔县',441400000000,3), +(441423000000,'丰顺县',441400000000,3), +(441424000000,'五华县',441400000000,3), +(441426000000,'平远县',441400000000,3), +(441427000000,'蕉岭县',441400000000,3), +(441481000000,'兴宁市',441400000000,3), +(441500000000,'汕尾市',440000000000,2), +(441501000000,'市辖区',441500000000,3), +(441502000000,'城区',441500000000,3), +(441521000000,'海丰县',441500000000,3), +(441523000000,'陆河县',441500000000,3), +(441581000000,'陆丰市',441500000000,3), +(441600000000,'河源市',440000000000,2), +(441601000000,'市辖区',441600000000,3), +(441602000000,'源城区',441600000000,3), +(441621000000,'紫金县',441600000000,3), +(441622000000,'龙川县',441600000000,3), +(441623000000,'连平县',441600000000,3), +(441624000000,'和平县',441600000000,3), +(441625000000,'东源县',441600000000,3), +(441700000000,'阳江市',440000000000,2), +(441701000000,'市辖区',441700000000,3), +(441702000000,'江城区',441700000000,3), +(441704000000,'阳东区',441700000000,3), +(441721000000,'阳西县',441700000000,3), +(441781000000,'阳春市',441700000000,3), +(441800000000,'清远市',440000000000,2), +(441801000000,'市辖区',441800000000,3), +(441802000000,'清城区',441800000000,3), +(441803000000,'清新区',441800000000,3), +(441821000000,'佛冈县',441800000000,3), +(441823000000,'阳山县',441800000000,3), +(441825000000,'连山壮族瑶族自治县',441800000000,3), +(441826000000,'连南瑶族自治县',441800000000,3), +(441881000000,'英德市',441800000000,3), +(441882000000,'连州市',441800000000,3), +(441900000000,'东莞市',440000000000,2), +(441900003000,'东城街道办事处',441900000000,3), +(441900004000,'南城街道办事处',441900000000,3), +(441900005000,'万江街道办事处',441900000000,3), +(441900006000,'莞城街道办事处',441900000000,3), +(441900101000,'石碣镇',441900000000,3), +(441900102000,'石龙镇',441900000000,3), +(441900103000,'茶山镇',441900000000,3), +(441900104000,'石排镇',441900000000,3), +(441900105000,'企石镇',441900000000,3), +(441900106000,'横沥镇',441900000000,3), +(441900107000,'桥头镇',441900000000,3), +(441900108000,'谢岗镇',441900000000,3), +(441900109000,'东坑镇',441900000000,3), +(441900110000,'常平镇',441900000000,3), +(441900111000,'寮步镇',441900000000,3), +(441900112000,'樟木头镇',441900000000,3), +(441900113000,'大朗镇',441900000000,3), +(441900114000,'黄江镇',441900000000,3), +(441900115000,'清溪镇',441900000000,3), +(441900116000,'塘厦镇',441900000000,3), +(441900117000,'凤岗镇',441900000000,3), +(441900118000,'大岭山镇',441900000000,3), +(441900119000,'长安镇',441900000000,3), +(441900121000,'虎门镇',441900000000,3), +(441900122000,'厚街镇',441900000000,3), +(441900123000,'沙田镇',441900000000,3), +(441900124000,'道滘镇',441900000000,3), +(441900125000,'洪梅镇',441900000000,3), +(441900126000,'麻涌镇',441900000000,3), +(441900127000,'望牛墩镇',441900000000,3), +(441900128000,'中堂镇',441900000000,3), +(441900129000,'高埗镇',441900000000,3), +(441900401000,'松山湖管委会',441900000000,3), +(441900402000,'东莞港',441900000000,3), +(441900403000,'东莞生态园',441900000000,3), +(442000000000,'中山市',440000000000,2), +(442000001000,'石岐区街道办事处',442000000000,3), +(442000002000,'东区街道办事处',442000000000,3), +(442000003000,'火炬开发区街道办事处',442000000000,3), +(442000004000,'西区街道办事处',442000000000,3), +(442000005000,'南区街道办事处',442000000000,3), +(442000006000,'五桂山街道办事处',442000000000,3), +(442000100000,'小榄镇',442000000000,3), +(442000101000,'黄圃镇',442000000000,3), +(442000102000,'民众镇',442000000000,3), +(442000103000,'东凤镇',442000000000,3), +(442000104000,'东升镇',442000000000,3), +(442000105000,'古镇镇',442000000000,3), +(442000106000,'沙溪镇',442000000000,3), +(442000107000,'坦洲镇',442000000000,3), +(442000108000,'港口镇',442000000000,3), +(442000109000,'三角镇',442000000000,3), +(442000110000,'横栏镇',442000000000,3), +(442000111000,'南头镇',442000000000,3), +(442000112000,'阜沙镇',442000000000,3), +(442000113000,'南朗镇',442000000000,3), +(442000114000,'三乡镇',442000000000,3), +(442000115000,'板芙镇',442000000000,3), +(442000116000,'大涌镇',442000000000,3), +(442000117000,'神湾镇',442000000000,3), +(445100000000,'潮州市',440000000000,2), +(445101000000,'市辖区',445100000000,3), +(445102000000,'湘桥区',445100000000,3), +(445103000000,'潮安区',445100000000,3), +(445122000000,'饶平县',445100000000,3), +(445200000000,'揭阳市',440000000000,2), +(445201000000,'市辖区',445200000000,3), +(445202000000,'榕城区',445200000000,3), +(445203000000,'揭东区',445200000000,3), +(445222000000,'揭西县',445200000000,3), +(445224000000,'惠来县',445200000000,3), +(445281000000,'普宁市',445200000000,3), +(445300000000,'云浮市',440000000000,2), +(445301000000,'市辖区',445300000000,3), +(445302000000,'云城区',445300000000,3), +(445303000000,'云安区',445300000000,3), +(445321000000,'新兴县',445300000000,3), +(445322000000,'郁南县',445300000000,3), +(445381000000,'罗定市',445300000000,3), +(450000000000,'广西壮族自治区',0,1), +(450100000000,'南宁市',450000000000,2), +(450101000000,'市辖区',450100000000,3), +(450102000000,'兴宁区',450100000000,3), +(450103000000,'青秀区',450100000000,3), +(450105000000,'江南区',450100000000,3), +(450107000000,'西乡塘区',450000000000,3), +(450108000000,'良庆区',450100000000,3), +(450109000000,'邕宁区',450100000000,3), +(450110000000,'武鸣区',450100000000,3), +(450123000000,'隆安县',450100000000,3), +(450124000000,'马山县',450100000000,3), +(450125000000,'上林县',450100000000,3), +(450126000000,'宾阳县',450100000000,3), +(450127000000,'横县',450100000000,3), +(450200000000,'柳州市',450000000000,2), +(450201000000,'市辖区',450200000000,3), +(450202000000,'城中区',450200000000,3), +(450203000000,'鱼峰区',450200000000,3), +(450204000000,'柳南区',450200000000,3), +(450205000000,'柳北区',450200000000,3), +(450206000000,'柳江区',450200000000,3), +(450222000000,'柳城县',450200000000,3), +(450223000000,'鹿寨县',450200000000,3), +(450224000000,'融安县',450200000000,3), +(450225000000,'融水苗族自治县',450200000000,3), +(450226000000,'三江侗族自治县',450200000000,3), +(450300000000,'桂林市',450000000000,2), +(450301000000,'市辖区',450300000000,3), +(450302000000,'秀峰区',450300000000,3), +(450303000000,'叠彩区',450300000000,3), +(450304000000,'象山区',450300000000,3), +(450305000000,'七星区',450300000000,3), +(450311000000,'雁山区',450300000000,3), +(450312000000,'临桂区',450300000000,3), +(450321000000,'阳朔县',450300000000,3), +(450323000000,'灵川县',450300000000,3), +(450324000000,'全州县',450300000000,3), +(450325000000,'兴安县',450300000000,3), +(450326000000,'永福县',450300000000,3), +(450327000000,'灌阳县',450300000000,3), +(450328000000,'龙胜各族自治县',450300000000,3), +(450329000000,'资源县',450300000000,3), +(450330000000,'平乐县',450300000000,3), +(450332000000,'恭城瑶族自治县',450300000000,3), +(450381000000,'荔浦市',450300000000,3), +(450400000000,'梧州市',450000000000,2), +(450401000000,'市辖区',450400000000,3), +(450403000000,'万秀区',450400000000,3), +(450405000000,'长洲区',450400000000,3), +(450406000000,'龙圩区',450400000000,3), +(450421000000,'苍梧县',450400000000,3), +(450422000000,'藤县',450400000000,3), +(450423000000,'蒙山县',450400000000,3), +(450481000000,'岑溪市',450400000000,3), +(450500000000,'北海市',450000000000,2), +(450501000000,'市辖区',450500000000,3), +(450502000000,'海城区',450500000000,3), +(450503000000,'银海区',450500000000,3), +(450512000000,'铁山港区',450500000000,3), +(450521000000,'合浦县',450500000000,3), +(450600000000,'防城港市',450000000000,2), +(450601000000,'市辖区',450600000000,3), +(450602000000,'港口区',450600000000,3), +(450603000000,'防城区',450600000000,3), +(450621000000,'上思县',450600000000,3), +(450681000000,'东兴市',450600000000,3), +(450700000000,'钦州市',450000000000,2), +(450701000000,'市辖区',450700000000,3), +(450702000000,'钦南区',450700000000,3), +(450703000000,'钦北区',450700000000,3), +(450721000000,'灵山县',450700000000,3), +(450722000000,'浦北县',450700000000,3), +(450800000000,'贵港市',450000000000,2), +(450801000000,'市辖区',450800000000,3), +(450802000000,'港北区',450800000000,3), +(450803000000,'港南区',450800000000,3), +(450804000000,'覃塘区',450800000000,3), +(450821000000,'平南县',450800000000,3), +(450881000000,'桂平市',450800000000,3), +(450900000000,'玉林市',450000000000,2), +(450901000000,'市辖区',450900000000,3), +(450902000000,'玉州区',450900000000,3), +(450903000000,'福绵区',450900000000,3), +(450921000000,'容县',450900000000,3), +(450922000000,'陆川县',450900000000,3), +(450923000000,'博白县',450900000000,3), +(450924000000,'兴业县',450900000000,3), +(450981000000,'北流市',450900000000,3), +(451000000000,'百色市',450000000000,2), +(451001000000,'市辖区',451000000000,3), +(451002000000,'右江区',451000000000,3), +(451021000000,'田阳县',451000000000,3), +(451022000000,'田东县',451000000000,3), +(451023000000,'平果县',451000000000,3), +(451024000000,'德保县',451000000000,3), +(451026000000,'那坡县',451000000000,3), +(451027000000,'凌云县',451000000000,3), +(451028000000,'乐业县',451000000000,3), +(451029000000,'田林县',451000000000,3), +(451030000000,'西林县',451000000000,3), +(451031000000,'隆林各族自治县',451000000000,3), +(451081000000,'靖西市',451000000000,3), +(451100000000,'贺州市',450000000000,2), +(451101000000,'市辖区',451100000000,3), +(451102000000,'八步区',451100000000,3), +(451103000000,'平桂区',451100000000,3), +(451121000000,'昭平县',451100000000,3), +(451122000000,'钟山县',451100000000,3), +(451123000000,'富川瑶族自治县',451100000000,3), +(451200000000,'河池市',450000000000,2), +(451201000000,'市辖区',451200000000,3), +(451202000000,'金城江区',451200000000,3), +(451203000000,'宜州区',451200000000,3), +(451221000000,'南丹县',451200000000,3), +(451222000000,'天峨县',451200000000,3), +(451223000000,'凤山县',451200000000,3), +(451224000000,'东兰县',451200000000,3), +(451225000000,'罗城仫佬族自治县',451200000000,3), +(451226000000,'环江毛南族自治县',451200000000,3), +(451227000000,'巴马瑶族自治县',451200000000,3), +(451228000000,'都安瑶族自治县',451200000000,3), +(451229000000,'大化瑶族自治县',451200000000,3), +(451300000000,'来宾市',450000000000,2), +(451301000000,'市辖区',451300000000,3), +(451302000000,'兴宾区',451300000000,3), +(451321000000,'忻城县',451300000000,3), +(451322000000,'象州县',451300000000,3), +(451323000000,'武宣县',451300000000,3), +(451324000000,'金秀瑶族自治县',451300000000,3), +(451381000000,'合山市',451300000000,3), +(451400000000,'崇左市',450000000000,2), +(451401000000,'市辖区',451400000000,3), +(451402000000,'江州区',451400000000,3), +(451421000000,'扶绥县',451400000000,3), +(451422000000,'宁明县',451400000000,3), +(451423000000,'龙州县',451400000000,3), +(451424000000,'大新县',451400000000,3), +(451425000000,'天等县',451400000000,3), +(451481000000,'凭祥市',451400000000,3), +(460000000000,'海南省',0,1), +(460100000000,'海口市',460000000000,2), +(460101000000,'市辖区',460100000000,3), +(460105000000,'秀英区',460100000000,3), +(460106000000,'龙华区',460100000000,3), +(460107000000,'琼山区',460100000000,3), +(460108000000,'美兰区',460100000000,3), +(460200000000,'三亚市',460000000000,2), +(460201000000,'市辖区',460200000000,3), +(460202000000,'海棠区',460200000000,3), +(460203000000,'吉阳区',460200000000,3), +(460204000000,'天涯区',460200000000,3), +(460205000000,'崖州区',460200000000,3), +(460300000000,'三沙市',460000000000,2), +(460321000000,'西沙群岛',460300000000,3), +(460322000000,'南沙群岛',460300000000,3), +(460323000000,'中沙群岛的岛礁及其海域',460300000000,3), +(460400000000,'儋州市',460000000000,2), +(469000000000,'省直辖县级行政区划',460000000000,2), +(469001000000,'五指山市',469000000000,3), +(469002000000,'琼海市',469000000000,3), +(469005000000,'文昌市',469000000000,3), +(469006000000,'万宁市',469000000000,3), +(469007000000,'东方市',469000000000,3), +(469021000000,'定安县',469000000000,3), +(469022000000,'屯昌县',469000000000,3), +(469023000000,'澄迈县',469000000000,3), +(469024000000,'临高县',469000000000,3), +(469025000000,'白沙黎族自治县',469000000000,3), +(469026000000,'昌江黎族自治县',469000000000,3), +(469027000000,'乐东黎族自治县',469000000000,3), +(469028000000,'陵水黎族自治县',469000000000,3), +(469029000000,'保亭黎族苗族自治县',469000000000,3), +(469030000000,'琼中黎族苗族自治县',469000000000,3), +(500000000000,'重庆市',0,1), +(500100000000,'市辖区',500000000000,2), +(500101000000,'万州区',500100000000,3), +(500102000000,'涪陵区',500100000000,3), +(500103000000,'渝中区',500100000000,3), +(500104000000,'大渡口区',500100000000,3), +(500105000000,'江北区',500100000000,3), +(500106000000,'沙坪坝区',500100000000,3), +(500107000000,'九龙坡区',500100000000,3), +(500108000000,'南岸区',500100000000,3), +(500109000000,'北碚区',500100000000,3), +(500110000000,'綦江区',500100000000,3), +(500111000000,'大足区',500100000000,3), +(500112000000,'渝北区',500100000000,3), +(500113000000,'巴南区',500100000000,3), +(500114000000,'黔江区',500100000000,3), +(500115000000,'长寿区',500100000000,3), +(500116000000,'江津区',500100000000,3), +(500117000000,'合川区',500100000000,3), +(500118000000,'永川区',500100000000,3), +(500119000000,'南川区',500100000000,3), +(500120000000,'璧山区',500100000000,3), +(500151000000,'铜梁区',500100000000,3), +(500152000000,'潼南区',500100000000,3), +(500153000000,'荣昌区',500100000000,3), +(500154000000,'开州区',500100000000,3), +(500155000000,'梁平区',500100000000,3), +(500156000000,'武隆区',500100000000,3), +(500200000000,'县',500000000000,2), +(500229000000,'城口县',500200000000,3), +(500230000000,'丰都县',500200000000,3), +(500231000000,'垫江县',500200000000,3), +(500233000000,'忠县',500200000000,3), +(500235000000,'云阳县',500200000000,3), +(500236000000,'奉节县',500200000000,3), +(500237000000,'巫山县',500200000000,3), +(500238000000,'巫溪县',500200000000,3), +(500240000000,'石柱土家族自治县',500200000000,3), +(500241000000,'秀山土家族苗族自治县',500200000000,3), +(500242000000,'酉阳土家族苗族自治县',500200000000,3), +(500243000000,'彭水苗族土家族自治县',500200000000,3), +(510000000000,'四川省',0,1), +(510100000000,'成都市',510000000000,2), +(510101000000,'市辖区',510100000000,3), +(510104000000,'锦江区',510100000000,3), +(510105000000,'青羊区',510100000000,3), +(510106000000,'金牛区',510100000000,3), +(510107000000,'武侯区',510100000000,3), +(510108000000,'成华区',510100000000,3), +(510112000000,'龙泉驿区',510100000000,3), +(510113000000,'青白江区',510100000000,3), +(510114000000,'新都区',510100000000,3), +(510115000000,'温江区',510100000000,3), +(510116000000,'双流区',510100000000,3), +(510117000000,'郫都区',510100000000,3), +(510121000000,'金堂县',510100000000,3), +(510129000000,'大邑县',510100000000,3), +(510131000000,'蒲江县',510100000000,3), +(510132000000,'新津县',510100000000,3), +(510181000000,'都江堰市',510100000000,3), +(510182000000,'彭州市',510100000000,3), +(510183000000,'邛崃市',510100000000,3), +(510184000000,'崇州市',510100000000,3), +(510185000000,'简阳市',510100000000,3), +(510300000000,'自贡市',510000000000,2), +(510301000000,'市辖区',510300000000,3), +(510302000000,'自流井区',510300000000,3), +(510303000000,'贡井区',510300000000,3), +(510304000000,'大安区',510300000000,3), +(510311000000,'沿滩区',510300000000,3), +(510321000000,'荣县',510300000000,3), +(510322000000,'富顺县',510300000000,3), +(510400000000,'攀枝花市',510000000000,2), +(510401000000,'市辖区',510400000000,3), +(510402000000,'东区',510400000000,3), +(510403000000,'西区',510400000000,3), +(510411000000,'仁和区',510400000000,3), +(510421000000,'米易县',510400000000,3), +(510422000000,'盐边县',510400000000,3), +(510500000000,'泸州市',510000000000,2), +(510501000000,'市辖区',510500000000,3), +(510502000000,'江阳区',510500000000,3), +(510503000000,'纳溪区',510500000000,3), +(510504000000,'龙马潭区',510500000000,3), +(510521000000,'泸县',510500000000,3), +(510522000000,'合江县',510500000000,3), +(510524000000,'叙永县',510500000000,3), +(510525000000,'古蔺县',510500000000,3), +(510600000000,'德阳市',510000000000,2), +(510601000000,'市辖区',510600000000,3), +(510603000000,'旌阳区',510600000000,3), +(510604000000,'罗江区',510600000000,3), +(510623000000,'中江县',510600000000,3), +(510681000000,'广汉市',510600000000,3), +(510682000000,'什邡市',510600000000,3), +(510683000000,'绵竹市',510600000000,3), +(510700000000,'绵阳市',510000000000,2), +(510701000000,'市辖区',510700000000,3), +(510703000000,'涪城区',510700000000,3), +(510704000000,'游仙区',510700000000,3), +(510705000000,'安州区',510700000000,3), +(510722000000,'三台县',510700000000,3), +(510723000000,'盐亭县',510700000000,3), +(510725000000,'梓潼县',510700000000,3), +(510726000000,'北川羌族自治县',510700000000,3), +(510727000000,'平武县',510700000000,3), +(510781000000,'江油市',510700000000,3), +(510800000000,'广元市',510000000000,2), +(510801000000,'市辖区',510800000000,3), +(510802000000,'利州区',510800000000,3), +(510811000000,'昭化区',510800000000,3), +(510812000000,'朝天区',510800000000,3), +(510821000000,'旺苍县',510800000000,3), +(510822000000,'青川县',510800000000,3), +(510823000000,'剑阁县',510800000000,3), +(510824000000,'苍溪县',510800000000,3), +(510900000000,'遂宁市',510000000000,2), +(510901000000,'市辖区',510900000000,3), +(510903000000,'船山区',510900000000,3), +(510904000000,'安居区',510900000000,3), +(510921000000,'蓬溪县',510900000000,3), +(510922000000,'射洪县',510900000000,3), +(510923000000,'大英县',510900000000,3), +(511000000000,'内江市',510000000000,2), +(511001000000,'市辖区',511000000000,3), +(511002000000,'市中区',511000000000,3), +(511011000000,'东兴区',511000000000,3), +(511024000000,'威远县',511000000000,3), +(511025000000,'资中县',511000000000,3), +(511071000000,'内江经济开发区',511000000000,3), +(511083000000,'隆昌市',511000000000,3), +(511100000000,'乐山市',510000000000,2), +(511101000000,'市辖区',511100000000,3), +(511102000000,'市中区',511100000000,3), +(511111000000,'沙湾区',511100000000,3), +(511112000000,'五通桥区',511100000000,3), +(511113000000,'金口河区',511100000000,3), +(511123000000,'犍为县',511100000000,3), +(511124000000,'井研县',511100000000,3), +(511126000000,'夹江县',511100000000,3), +(511129000000,'沐川县',511100000000,3), +(511132000000,'峨边彝族自治县',511100000000,3), +(511133000000,'马边彝族自治县',511100000000,3), +(511181000000,'峨眉山市',511100000000,3), +(511300000000,'南充市',510000000000,2), +(511301000000,'市辖区',511300000000,3), +(511302000000,'顺庆区',511300000000,3), +(511303000000,'高坪区',511300000000,3), +(511304000000,'嘉陵区',511300000000,3), +(511321000000,'南部县',511300000000,3), +(511322000000,'营山县',511300000000,3), +(511323000000,'蓬安县',511300000000,3), +(511324000000,'仪陇县',511300000000,3), +(511325000000,'西充县',511300000000,3), +(511381000000,'阆中市',511300000000,3), +(511400000000,'眉山市',510000000000,2), +(511401000000,'市辖区',511400000000,3), +(511402000000,'东坡区',511400000000,3), +(511403000000,'彭山区',511400000000,3), +(511421000000,'仁寿县',511400000000,3), +(511423000000,'洪雅县',511400000000,3), +(511424000000,'丹棱县',511400000000,3), +(511425000000,'青神县',511400000000,3), +(511500000000,'宜宾市',510000000000,2), +(511501000000,'市辖区',511500000000,3), +(511502000000,'翠屏区',511500000000,3), +(511503000000,'南溪区',511500000000,3), +(511504000000,'叙州区',511500000000,3), +(511523000000,'江安县',511500000000,3), +(511524000000,'长宁县',511500000000,3), +(511525000000,'高县',511500000000,3), +(511526000000,'珙县',511500000000,3), +(511527000000,'筠连县',511500000000,3), +(511528000000,'兴文县',511500000000,3), +(511529000000,'屏山县',511500000000,3), +(511600000000,'广安市',510000000000,2), +(511601000000,'市辖区',511600000000,3), +(511602000000,'广安区',511600000000,3), +(511603000000,'前锋区',511600000000,3), +(511621000000,'岳池县',511600000000,3), +(511622000000,'武胜县',511600000000,3), +(511623000000,'邻水县',511600000000,3), +(511681000000,'华蓥市',511600000000,3), +(511700000000,'达州市',510000000000,2), +(511701000000,'市辖区',511700000000,3), +(511702000000,'通川区',511700000000,3), +(511703000000,'达川区',511700000000,3), +(511722000000,'宣汉县',511700000000,3), +(511723000000,'开江县',511700000000,3), +(511724000000,'大竹县',511700000000,3), +(511725000000,'渠县',511700000000,3), +(511771000000,'达州经济开发区',511700000000,3), +(511781000000,'万源市',511700000000,3), +(511800000000,'雅安市',510000000000,2), +(511801000000,'市辖区',511800000000,3), +(511802000000,'雨城区',511800000000,3), +(511803000000,'名山区',511800000000,3), +(511822000000,'荥经县',511800000000,3), +(511823000000,'汉源县',511800000000,3), +(511824000000,'石棉县',511800000000,3), +(511825000000,'天全县',511800000000,3), +(511826000000,'芦山县',511800000000,3), +(511827000000,'宝兴县',511800000000,3), +(511900000000,'巴中市',510000000000,2), +(511901000000,'市辖区',511900000000,3), +(511902000000,'巴州区',511900000000,3), +(511903000000,'恩阳区',511900000000,3), +(511921000000,'通江县',511900000000,3), +(511922000000,'南江县',511900000000,3), +(511923000000,'平昌县',511900000000,3), +(511971000000,'巴中经济开发区',511900000000,3), +(512000000000,'资阳市',510000000000,2), +(512001000000,'市辖区',512000000000,3), +(512002000000,'雁江区',512000000000,3), +(512021000000,'安岳县',512000000000,3), +(512022000000,'乐至县',512000000000,3), +(513200000000,'阿坝藏族羌族自治州',510000000000,2), +(513201000000,'马尔康市',513200000000,3), +(513221000000,'汶川县',513200000000,3), +(513222000000,'理县',513200000000,3), +(513223000000,'茂县',513200000000,3), +(513224000000,'松潘县',513200000000,3), +(513225000000,'九寨沟县',513200000000,3), +(513226000000,'金川县',513200000000,3), +(513227000000,'小金县',513200000000,3), +(513228000000,'黑水县',513200000000,3), +(513230000000,'壤塘县',513200000000,3), +(513231000000,'阿坝县',513200000000,3), +(513232000000,'若尔盖县',513200000000,3), +(513233000000,'红原县',513200000000,3), +(513300000000,'甘孜藏族自治州',510000000000,2), +(513301000000,'康定市',513300000000,3), +(513322000000,'泸定县',513300000000,3), +(513323000000,'丹巴县',513300000000,3), +(513324000000,'九龙县',513300000000,3), +(513325000000,'雅江县',513300000000,3), +(513326000000,'道孚县',513300000000,3), +(513327000000,'炉霍县',513300000000,3), +(513328000000,'甘孜县',513300000000,3), +(513329000000,'新龙县',513300000000,3), +(513330000000,'德格县',513300000000,3), +(513331000000,'白玉县',513300000000,3), +(513332000000,'石渠县',513300000000,3), +(513333000000,'色达县',513300000000,3), +(513334000000,'理塘县',513300000000,3), +(513335000000,'巴塘县',513300000000,3), +(513336000000,'乡城县',513300000000,3), +(513337000000,'稻城县',513300000000,3), +(513338000000,'得荣县',513300000000,3), +(513400000000,'凉山彝族自治州',510000000000,2), +(513401000000,'西昌市',513400000000,3), +(513422000000,'木里藏族自治县',513400000000,3), +(513423000000,'盐源县',513400000000,3), +(513424000000,'德昌县',513400000000,3), +(513425000000,'会理县',513400000000,3), +(513426000000,'会东县',513400000000,3), +(513427000000,'宁南县',513400000000,3), +(513428000000,'普格县',513400000000,3), +(513429000000,'布拖县',513400000000,3), +(513430000000,'金阳县',513400000000,3), +(513431000000,'昭觉县',513400000000,3), +(513432000000,'喜德县',513400000000,3), +(513433000000,'冕宁县',513400000000,3), +(513434000000,'越西县',513400000000,3), +(513435000000,'甘洛县',513400000000,3), +(513436000000,'美姑县',513400000000,3), +(513437000000,'雷波县',513400000000,3), +(520000000000,'贵州省',0,1), +(520100000000,'贵阳市',520000000000,2), +(520101000000,'市辖区',520100000000,3), +(520102000000,'南明区',520100000000,3), +(520103000000,'云岩区',520100000000,3), +(520111000000,'花溪区',520100000000,3), +(520112000000,'乌当区',520100000000,3), +(520113000000,'白云区',520100000000,3), +(520115000000,'观山湖区',520100000000,3), +(520121000000,'开阳县',520100000000,3), +(520122000000,'息烽县',520100000000,3), +(520123000000,'修文县',520100000000,3), +(520181000000,'清镇市',520100000000,3), +(520200000000,'六盘水市',520000000000,2), +(520201000000,'钟山区',520200000000,3), +(520203000000,'六枝特区',520200000000,3), +(520221000000,'水城县',520200000000,3), +(520281000000,'盘州市',520200000000,3), +(520300000000,'遵义市',520000000000,2), +(520301000000,'市辖区',520300000000,3), +(520302000000,'红花岗区',520300000000,3), +(520303000000,'汇川区',520300000000,3), +(520304000000,'播州区',520300000000,3), +(520322000000,'桐梓县',520300000000,3), +(520323000000,'绥阳县',520300000000,3), +(520324000000,'正安县',520300000000,3), +(520325000000,'道真仡佬族苗族自治县',520300000000,3), +(520326000000,'务川仡佬族苗族自治县',520300000000,3), +(520327000000,'凤冈县',520300000000,3), +(520328000000,'湄潭县',520300000000,3), +(520329000000,'余庆县',520300000000,3), +(520330000000,'习水县',520300000000,3), +(520381000000,'赤水市',520300000000,3), +(520382000000,'仁怀市',520300000000,3), +(520400000000,'安顺市',520000000000,2), +(520401000000,'市辖区',520400000000,3), +(520402000000,'西秀区',520400000000,3), +(520403000000,'平坝区',520400000000,3), +(520422000000,'普定县',520400000000,3), +(520423000000,'镇宁布依族苗族自治县',520400000000,3), +(520424000000,'关岭布依族苗族自治县',520400000000,3), +(520425000000,'紫云苗族布依族自治县',520400000000,3), +(520500000000,'毕节市',520000000000,2), +(520501000000,'市辖区',520500000000,3), +(520502000000,'七星关区',520500000000,3), +(520521000000,'大方县',520500000000,3), +(520522000000,'黔西县',520500000000,3), +(520523000000,'金沙县',520500000000,3), +(520524000000,'织金县',520500000000,3), +(520525000000,'纳雍县',520500000000,3), +(520526000000,'威宁彝族回族苗族自治县',520500000000,3), +(520527000000,'赫章县',520500000000,3), +(520600000000,'铜仁市',520000000000,2), +(520601000000,'市辖区',520600000000,3), +(520602000000,'碧江区',520600000000,3), +(520603000000,'万山区',520600000000,3), +(520621000000,'江口县',520600000000,3), +(520622000000,'玉屏侗族自治县',520600000000,3), +(520623000000,'石阡县',520600000000,3), +(520624000000,'思南县',520600000000,3), +(520625000000,'印江土家族苗族自治县',520600000000,3), +(520626000000,'德江县',520600000000,3), +(520627000000,'沿河土家族自治县',520600000000,3), +(520628000000,'松桃苗族自治县',520600000000,3), +(522300000000,'黔西南布依族苗族自治州',520000000000,2), +(522301000000,'兴义市',522300000000,3), +(522302000000,'兴仁市',522300000000,3), +(522323000000,'普安县',522300000000,3), +(522324000000,'晴隆县',522300000000,3), +(522325000000,'贞丰县',522300000000,3), +(522326000000,'望谟县',522300000000,3), +(522327000000,'册亨县',522300000000,3), +(522328000000,'安龙县',522300000000,3), +(522600000000,'黔东南苗族侗族自治州',520000000000,2), +(522601000000,'凯里市',522600000000,3), +(522622000000,'黄平县',522600000000,3), +(522623000000,'施秉县',522600000000,3), +(522624000000,'三穗县',522600000000,3), +(522625000000,'镇远县',522600000000,3), +(522626000000,'岑巩县',522600000000,3), +(522627000000,'天柱县',522600000000,3), +(522628000000,'锦屏县',522600000000,3), +(522629000000,'剑河县',522600000000,3), +(522630000000,'台江县',522600000000,3), +(522631000000,'黎平县',522600000000,3), +(522632000000,'榕江县',522600000000,3), +(522633000000,'从江县',522600000000,3), +(522634000000,'雷山县',522600000000,3), +(522635000000,'麻江县',522600000000,3), +(522636000000,'丹寨县',522600000000,3), +(522700000000,'黔南布依族苗族自治州',520000000000,2), +(522701000000,'都匀市',522700000000,3), +(522702000000,'福泉市',522700000000,3), +(522722000000,'荔波县',522700000000,3), +(522723000000,'贵定县',522700000000,3), +(522725000000,'瓮安县',522700000000,3), +(522726000000,'独山县',522700000000,3), +(522727000000,'平塘县',522700000000,3), +(522728000000,'罗甸县',522700000000,3), +(522729000000,'长顺县',522700000000,3), +(522730000000,'龙里县',522700000000,3), +(522731000000,'惠水县',522700000000,3), +(522732000000,'三都水族自治县',522700000000,3), +(530000000000,'云南省',0,1), +(530100000000,'昆明市',530000000000,2), +(530101000000,'市辖区',530100000000,3), +(530102000000,'五华区',530100000000,3), +(530103000000,'盘龙区',530100000000,3), +(530111000000,'官渡区',530100000000,3), +(530112000000,'西山区',530100000000,3), +(530113000000,'东川区',530100000000,3), +(530114000000,'呈贡区',530100000000,3), +(530115000000,'晋宁区',530100000000,3), +(530124000000,'富民县',530100000000,3), +(530125000000,'宜良县',530100000000,3), +(530126000000,'石林彝族自治县',530100000000,3), +(530127000000,'嵩明县',530100000000,3), +(530128000000,'禄劝彝族苗族自治县',530100000000,3), +(530129000000,'寻甸回族彝族自治县',530100000000,3), +(530181000000,'安宁市',530100000000,3), +(530300000000,'曲靖市',530000000000,2), +(530301000000,'市辖区',530300000000,3), +(530302000000,'麒麟区',530300000000,3), +(530303000000,'沾益区',530300000000,3), +(530304000000,'马龙区',530300000000,3), +(530322000000,'陆良县',530300000000,3), +(530323000000,'师宗县',530300000000,3), +(530324000000,'罗平县',530300000000,3), +(530325000000,'富源县',530300000000,3), +(530326000000,'会泽县',530300000000,3), +(530381000000,'宣威市',530300000000,3), +(530400000000,'玉溪市',530000000000,2), +(530401000000,'市辖区',530400000000,3), +(530402000000,'红塔区',530400000000,3), +(530403000000,'江川区',530400000000,3), +(530422000000,'澄江县',530400000000,3), +(530423000000,'通海县',530400000000,3), +(530424000000,'华宁县',530400000000,3), +(530425000000,'易门县',530400000000,3), +(530426000000,'峨山彝族自治县',530400000000,3), +(530427000000,'新平彝族傣族自治县',530400000000,3), +(530428000000,'元江哈尼族彝族傣族自治县',530400000000,3), +(530500000000,'保山市',530000000000,2), +(530501000000,'市辖区',530500000000,3), +(530502000000,'隆阳区',530500000000,3), +(530521000000,'施甸县',530500000000,3), +(530523000000,'龙陵县',530500000000,3), +(530524000000,'昌宁县',530500000000,3), +(530581000000,'腾冲市',530500000000,3), +(530600000000,'昭通市',530000000000,2), +(530601000000,'市辖区',530600000000,3), +(530602000000,'昭阳区',530600000000,3), +(530621000000,'鲁甸县',530600000000,3), +(530622000000,'巧家县',530600000000,3), +(530623000000,'盐津县',530600000000,3), +(530624000000,'大关县',530600000000,3), +(530625000000,'永善县',530600000000,3), +(530626000000,'绥江县',530600000000,3), +(530627000000,'镇雄县',530600000000,3), +(530628000000,'彝良县',530600000000,3), +(530629000000,'威信县',530600000000,3), +(530681000000,'水富市',530600000000,3), +(530700000000,'丽江市',530000000000,2), +(530701000000,'市辖区',530700000000,3), +(530702000000,'古城区',530700000000,3), +(530721000000,'玉龙纳西族自治县',530700000000,3), +(530722000000,'永胜县',530700000000,3), +(530723000000,'华坪县',530700000000,3), +(530724000000,'宁蒗彝族自治县',530700000000,3), +(530800000000,'普洱市',530000000000,2), +(530801000000,'市辖区',530800000000,3), +(530802000000,'思茅区',530800000000,3), +(530821000000,'宁洱哈尼族彝族自治县',530800000000,3), +(530822000000,'墨江哈尼族自治县',530800000000,3), +(530823000000,'景东彝族自治县',530800000000,3), +(530824000000,'景谷傣族彝族自治县',530800000000,3), +(530825000000,'镇沅彝族哈尼族拉祜族自治县',530800000000,3), +(530826000000,'江城哈尼族彝族自治县',530800000000,3), +(530827000000,'孟连傣族拉祜族佤族自治县',530800000000,3), +(530828000000,'澜沧拉祜族自治县',530800000000,3), +(530829000000,'西盟佤族自治县',530800000000,3), +(530900000000,'临沧市',530000000000,2), +(530901000000,'市辖区',530900000000,3), +(530902000000,'临翔区',530900000000,3), +(530921000000,'凤庆县',530900000000,3), +(530922000000,'云县',530900000000,3), +(530923000000,'永德县',530900000000,3), +(530924000000,'镇康县',530900000000,3), +(530925000000,'双江拉祜族佤族布朗族傣族自治县',530900000000,3), +(530926000000,'耿马傣族佤族自治县',530900000000,3), +(530927000000,'沧源佤族自治县',530900000000,3), +(532300000000,'楚雄彝族自治州',530000000000,2), +(532301000000,'楚雄市',532300000000,3), +(532322000000,'双柏县',532300000000,3), +(532323000000,'牟定县',532300000000,3), +(532324000000,'南华县',532300000000,3), +(532325000000,'姚安县',532300000000,3), +(532326000000,'大姚县',532300000000,3), +(532327000000,'永仁县',532300000000,3), +(532328000000,'元谋县',532300000000,3), +(532329000000,'武定县',532300000000,3), +(532331000000,'禄丰县',532300000000,3), +(532500000000,'红河哈尼族彝族自治州',530000000000,2), +(532501000000,'个旧市',532500000000,3), +(532502000000,'开远市',532500000000,3), +(532503000000,'蒙自市',532500000000,3), +(532504000000,'弥勒市',532500000000,3), +(532523000000,'屏边苗族自治县',532500000000,3), +(532524000000,'建水县',532500000000,3), +(532525000000,'石屏县',532500000000,3), +(532527000000,'泸西县',532500000000,3), +(532528000000,'元阳县',532500000000,3), +(532529000000,'红河县',532500000000,3), +(532530000000,'金平苗族瑶族傣族自治县',532500000000,3), +(532531000000,'绿春县',532500000000,3), +(532532000000,'河口瑶族自治县',532500000000,3), +(532600000000,'文山壮族苗族自治州',530000000000,2), +(532601000000,'文山市',532600000000,3), +(532622000000,'砚山县',532600000000,3), +(532623000000,'西畴县',532600000000,3), +(532624000000,'麻栗坡县',532600000000,3), +(532625000000,'马关县',532600000000,3), +(532626000000,'丘北县',532600000000,3), +(532627000000,'广南县',532600000000,3), +(532628000000,'富宁县',532600000000,3), +(532800000000,'西双版纳傣族自治州',530000000000,2), +(532801000000,'景洪市',532800000000,3), +(532822000000,'勐海县',532800000000,3), +(532823000000,'勐腊县',532800000000,3), +(532900000000,'大理白族自治州',530000000000,2), +(532901000000,'大理市',532900000000,3), +(532922000000,'漾濞彝族自治县',532900000000,3), +(532923000000,'祥云县',532900000000,3), +(532924000000,'宾川县',532900000000,3), +(532925000000,'弥渡县',532900000000,3), +(532926000000,'南涧彝族自治县',532900000000,3), +(532927000000,'巍山彝族回族自治县',532900000000,3), +(532928000000,'永平县',532900000000,3), +(532929000000,'云龙县',532900000000,3), +(532930000000,'洱源县',532900000000,3), +(532931000000,'剑川县',532900000000,3), +(532932000000,'鹤庆县',532900000000,3), +(533100000000,'德宏傣族景颇族自治州',530000000000,2), +(533102000000,'瑞丽市',533100000000,3), +(533103000000,'芒市',533100000000,3), +(533122000000,'梁河县',533100000000,3), +(533123000000,'盈江县',533100000000,3), +(533124000000,'陇川县',533100000000,3), +(533300000000,'怒江傈僳族自治州',530000000000,2), +(533301000000,'泸水市',533300000000,3), +(533323000000,'福贡县',533300000000,3), +(533324000000,'贡山独龙族怒族自治县',533300000000,3), +(533325000000,'兰坪白族普米族自治县',533300000000,3), +(533400000000,'迪庆藏族自治州',530000000000,2), +(533401000000,'香格里拉市',533400000000,3), +(533422000000,'德钦县',533400000000,3), +(533423000000,'维西傈僳族自治县',533400000000,3), +(540000000000,'西藏自治区',0,1), +(540100000000,'拉萨市',540000000000,2), +(540101000000,'市辖区',540100000000,3), +(540102000000,'城关区',540100000000,3), +(540103000000,'堆龙德庆区',540100000000,3), +(540104000000,'达孜区',540100000000,3), +(540121000000,'林周县',540100000000,3), +(540122000000,'当雄县',540100000000,3), +(540123000000,'尼木县',540100000000,3), +(540124000000,'曲水县',540100000000,3), +(540127000000,'墨竹工卡县',540100000000,3), +(540171000000,'格尔木藏青工业园区',540100000000,3), +(540172000000,'拉萨经济技术开发区',540100000000,3), +(540173000000,'西藏文化旅游创意园区',540100000000,3), +(540174000000,'达孜工业园区',540100000000,3), +(540200000000,'日喀则市',540000000000,2), +(540202000000,'桑珠孜区',540200000000,3), +(540221000000,'南木林县',540200000000,3), +(540222000000,'江孜县',540200000000,3), +(540223000000,'定日县',540200000000,3), +(540224000000,'萨迦县',540200000000,3), +(540225000000,'拉孜县',540200000000,3), +(540226000000,'昂仁县',540200000000,3), +(540227000000,'谢通门县',540200000000,3), +(540228000000,'白朗县',540200000000,3), +(540229000000,'仁布县',540200000000,3), +(540230000000,'康马县',540200000000,3), +(540231000000,'定结县',540200000000,3), +(540232000000,'仲巴县',540200000000,3), +(540233000000,'亚东县',540200000000,3), +(540234000000,'吉隆县',540200000000,3), +(540235000000,'聂拉木县',540200000000,3), +(540236000000,'萨嘎县',540200000000,3), +(540237000000,'岗巴县',540200000000,3), +(540300000000,'昌都市',540000000000,2), +(540302000000,'卡若区',540300000000,3), +(540321000000,'江达县',540300000000,3), +(540322000000,'贡觉县',540300000000,3), +(540323000000,'类乌齐县',540300000000,3), +(540324000000,'丁青县',540300000000,3), +(540325000000,'察雅县',540300000000,3), +(540326000000,'八宿县',540300000000,3), +(540327000000,'左贡县',540300000000,3), +(540328000000,'芒康县',540300000000,3), +(540329000000,'洛隆县',540300000000,3), +(540330000000,'边坝县',540300000000,3), +(540400000000,'林芝市',540000000000,2), +(540402000000,'巴宜区',540400000000,3), +(540421000000,'工布江达县',540400000000,3), +(540422000000,'米林县',540400000000,3), +(540423000000,'墨脱县',540400000000,3), +(540424000000,'波密县',540400000000,3), +(540425000000,'察隅县',540400000000,3), +(540426000000,'朗县',540400000000,3), +(540500000000,'山南市',540000000000,2), +(540501000000,'市辖区',540500000000,3), +(540502000000,'乃东区',540500000000,3), +(540521000000,'扎囊县',540500000000,3), +(540522000000,'贡嘎县',540500000000,3), +(540523000000,'桑日县',540500000000,3), +(540524000000,'琼结县',540500000000,3), +(540525000000,'曲松县',540500000000,3), +(540526000000,'措美县',540500000000,3), +(540527000000,'洛扎县',540500000000,3), +(540528000000,'加查县',540500000000,3), +(540529000000,'隆子县',540500000000,3), +(540530000000,'错那县',540500000000,3), +(540531000000,'浪卡子县',540500000000,3), +(540600000000,'那曲市',540000000000,2), +(540602000000,'色尼区',540600000000,3), +(540621000000,'嘉黎县',540600000000,3), +(540622000000,'比如县',540600000000,3), +(540623000000,'聂荣县',540600000000,3), +(540624000000,'安多县',540600000000,3), +(540625000000,'申扎县',540600000000,3), +(540626000000,'索县',540600000000,3), +(540627000000,'班戈县',540600000000,3), +(540628000000,'巴青县',540600000000,3), +(540629000000,'尼玛县',540600000000,3), +(540630000000,'双湖县',540600000000,3), +(542500000000,'阿里地区',540000000000,2), +(542521000000,'普兰县',542500000000,3), +(542522000000,'札达县',542500000000,3), +(542523000000,'噶尔县',542500000000,3), +(542524000000,'日土县',542500000000,3), +(542525000000,'革吉县',542500000000,3), +(542526000000,'改则县',542500000000,3), +(542527000000,'措勤县',542500000000,3), +(610000000000,'陕西省',0,1), +(610100000000,'西安市',610000000000,2), +(610101000000,'市辖区',610100000000,3), +(610102000000,'新城区',610100000000,3), +(610103000000,'碑林区',610100000000,3), +(610104000000,'莲湖区',610100000000,3), +(610111000000,'灞桥区',610100000000,3), +(610112000000,'未央区',610100000000,3), +(610113000000,'雁塔区',610100000000,3), +(610114000000,'阎良区',610100000000,3), +(610115000000,'临潼区',610100000000,3), +(610116000000,'长安区',610100000000,3), +(610117000000,'高陵区',610100000000,3), +(610118000000,'鄠邑区',610100000000,3), +(610122000000,'蓝田县',610100000000,3), +(610124000000,'周至县',610100000000,3), +(610200000000,'铜川市',610000000000,2), +(610201000000,'市辖区',610200000000,3), +(610202000000,'王益区',610200000000,3), +(610203000000,'印台区',610200000000,3), +(610204000000,'耀州区',610200000000,3), +(610222000000,'宜君县',610200000000,3), +(610300000000,'宝鸡市',610000000000,2), +(610301000000,'市辖区',610300000000,3), +(610302000000,'渭滨区',610300000000,3), +(610303000000,'金台区',610300000000,3), +(610304000000,'陈仓区',610300000000,3), +(610322000000,'凤翔县',610300000000,3), +(610323000000,'岐山县',610300000000,3), +(610324000000,'扶风县',610300000000,3), +(610326000000,'眉县',610300000000,3), +(610327000000,'陇县',610300000000,3), +(610328000000,'千阳县',610300000000,3), +(610329000000,'麟游县',610300000000,3), +(610330000000,'凤县',610300000000,3), +(610331000000,'太白县',610300000000,3), +(610400000000,'咸阳市',610000000000,2), +(610401000000,'市辖区',610400000000,3), +(610402000000,'秦都区',610400000000,3), +(610403000000,'杨陵区',610400000000,3), +(610404000000,'渭城区',610400000000,3), +(610422000000,'三原县',610400000000,3), +(610423000000,'泾阳县',610400000000,3), +(610424000000,'乾县',610400000000,3), +(610425000000,'礼泉县',610400000000,3), +(610426000000,'永寿县',610400000000,3), +(610428000000,'长武县',610400000000,3), +(610429000000,'旬邑县',610400000000,3), +(610430000000,'淳化县',610400000000,3), +(610431000000,'武功县',610400000000,3), +(610481000000,'兴平市',610400000000,3), +(610482000000,'彬州市',610400000000,3), +(610500000000,'渭南市',610000000000,2), +(610501000000,'市辖区',610500000000,3), +(610502000000,'临渭区',610500000000,3), +(610503000000,'华州区',610500000000,3), +(610522000000,'潼关县',610500000000,3), +(610523000000,'大荔县',610500000000,3), +(610524000000,'合阳县',610500000000,3), +(610525000000,'澄城县',610500000000,3), +(610526000000,'蒲城县',610500000000,3), +(610527000000,'白水县',610500000000,3), +(610528000000,'富平县',610500000000,3), +(610581000000,'韩城市',610500000000,3), +(610582000000,'华阴市',610500000000,3), +(610600000000,'延安市',610000000000,2), +(610601000000,'市辖区',610600000000,3), +(610602000000,'宝塔区',610600000000,3), +(610603000000,'安塞区',610600000000,3), +(610621000000,'延长县',610600000000,3), +(610622000000,'延川县',610600000000,3), +(610623000000,'子长县',610600000000,3), +(610625000000,'志丹县',610600000000,3), +(610626000000,'吴起县',610600000000,3), +(610627000000,'甘泉县',610600000000,3), +(610628000000,'富县',610600000000,3), +(610629000000,'洛川县',610600000000,3), +(610630000000,'宜川县',610600000000,3), +(610631000000,'黄龙县',610600000000,3), +(610632000000,'黄陵县',610600000000,3), +(610700000000,'汉中市',610000000000,2), +(610701000000,'市辖区',610700000000,3), +(610702000000,'汉台区',610700000000,3), +(610703000000,'南郑区',610700000000,3), +(610722000000,'城固县',610700000000,3), +(610723000000,'洋县',610700000000,3), +(610724000000,'西乡县',610700000000,3), +(610725000000,'勉县',610700000000,3), +(610726000000,'宁强县',610700000000,3), +(610727000000,'略阳县',610700000000,3), +(610728000000,'镇巴县',610700000000,3), +(610729000000,'留坝县',610700000000,3), +(610730000000,'佛坪县',610700000000,3), +(610800000000,'榆林市',610000000000,2), +(610801000000,'市辖区',610800000000,3), +(610802000000,'榆阳区',610800000000,3), +(610803000000,'横山区',610800000000,3), +(610822000000,'府谷县',610800000000,3), +(610824000000,'靖边县',610800000000,3), +(610825000000,'定边县',610800000000,3), +(610826000000,'绥德县',610800000000,3), +(610827000000,'米脂县',610800000000,3), +(610828000000,'佳县',610800000000,3), +(610829000000,'吴堡县',610800000000,3), +(610830000000,'清涧县',610800000000,3), +(610831000000,'子洲县',610800000000,3), +(610881000000,'神木市',610800000000,3), +(610900000000,'安康市',610000000000,2), +(610901000000,'市辖区',610900000000,3), +(610902000000,'汉滨区',610900000000,3), +(610921000000,'汉阴县',610900000000,3), +(610922000000,'石泉县',610900000000,3), +(610923000000,'宁陕县',610900000000,3), +(610924000000,'紫阳县',610900000000,3), +(610925000000,'岚皋县',610900000000,3), +(610926000000,'平利县',610900000000,3), +(610927000000,'镇坪县',610900000000,3), +(610928000000,'旬阳县',610900000000,3), +(610929000000,'白河县',610900000000,3), +(611000000000,'商洛市',610000000000,2), +(611001000000,'市辖区',611000000000,3), +(611002000000,'商州区',611000000000,3), +(611021000000,'洛南县',611000000000,3), +(611022000000,'丹凤县',611000000000,3), +(611023000000,'商南县',611000000000,3), +(611024000000,'山阳县',611000000000,3), +(611025000000,'镇安县',611000000000,3), +(611026000000,'柞水县',611000000000,3), +(620000000000,'甘肃省',0,1), +(620100000000,'兰州市',620000000000,2), +(620101000000,'市辖区',620100000000,3), +(620102000000,'城关区',620100000000,3), +(620103000000,'七里河区',620100000000,3), +(620104000000,'西固区',620100000000,3), +(620105000000,'安宁区',620100000000,3), +(620111000000,'红古区',620100000000,3), +(620121000000,'永登县',620100000000,3), +(620122000000,'皋兰县',620100000000,3), +(620123000000,'榆中县',620100000000,3), +(620171000000,'兰州新区',620100000000,3), +(620200000000,'嘉峪关市',620000000000,2), +(620201000000,'市辖区',620200000000,3), +(620300000000,'金昌市',620000000000,2), +(620301000000,'市辖区',620300000000,3), +(620302000000,'金川区',620300000000,3), +(620321000000,'永昌县',620300000000,3), +(620400000000,'白银市',620000000000,2), +(620401000000,'市辖区',620400000000,3), +(620402000000,'白银区',620400000000,3), +(620403000000,'平川区',620400000000,3), +(620421000000,'靖远县',620400000000,3), +(620422000000,'会宁县',620400000000,3), +(620423000000,'景泰县',620400000000,3), +(620500000000,'天水市',620000000000,2), +(620501000000,'市辖区',620500000000,3), +(620502000000,'秦州区',620500000000,3), +(620503000000,'麦积区',620500000000,3), +(620521000000,'清水县',620500000000,3), +(620522000000,'秦安县',620500000000,3), +(620523000000,'甘谷县',620500000000,3), +(620524000000,'武山县',620500000000,3), +(620525000000,'张家川回族自治县',620500000000,3), +(620600000000,'武威市',620000000000,2), +(620601000000,'市辖区',620600000000,3), +(620602000000,'凉州区',620600000000,3), +(620621000000,'民勤县',620600000000,3), +(620622000000,'古浪县',620600000000,3), +(620623000000,'天祝藏族自治县',620600000000,3), +(620700000000,'张掖市',620000000000,2), +(620701000000,'市辖区',620700000000,3), +(620702000000,'甘州区',620700000000,3), +(620721000000,'肃南裕固族自治县',620700000000,3), +(620722000000,'民乐县',620700000000,3), +(620723000000,'临泽县',620700000000,3), +(620724000000,'高台县',620700000000,3), +(620725000000,'山丹县',620700000000,3), +(620800000000,'平凉市',620000000000,2), +(620801000000,'市辖区',620800000000,3), +(620802000000,'崆峒区',620800000000,3), +(620821000000,'泾川县',620800000000,3), +(620822000000,'灵台县',620800000000,3), +(620823000000,'崇信县',620800000000,3), +(620825000000,'庄浪县',620800000000,3), +(620826000000,'静宁县',620800000000,3), +(620881000000,'华亭市',620800000000,3), +(620900000000,'酒泉市',620000000000,2), +(620901000000,'市辖区',620900000000,3), +(620902000000,'肃州区',620900000000,3), +(620921000000,'金塔县',620900000000,3), +(620922000000,'瓜州县',620900000000,3), +(620923000000,'肃北蒙古族自治县',620900000000,3), +(620924000000,'阿克塞哈萨克族自治县',620900000000,3), +(620981000000,'玉门市',620900000000,3), +(620982000000,'敦煌市',620900000000,3), +(621000000000,'庆阳市',620000000000,2), +(621001000000,'市辖区',621000000000,3), +(621002000000,'西峰区',621000000000,3), +(621021000000,'庆城县',621000000000,3), +(621022000000,'环县',621000000000,3), +(621023000000,'华池县',621000000000,3), +(621024000000,'合水县',621000000000,3), +(621025000000,'正宁县',621000000000,3), +(621026000000,'宁县',621000000000,3), +(621027000000,'镇原县',621000000000,3), +(621100000000,'定西市',620000000000,2), +(621101000000,'市辖区',621100000000,3), +(621102000000,'安定区',621100000000,3), +(621121000000,'通渭县',621100000000,3), +(621122000000,'陇西县',621100000000,3), +(621123000000,'渭源县',621100000000,3), +(621124000000,'临洮县',621100000000,3), +(621125000000,'漳县',621100000000,3), +(621126000000,'岷县',621100000000,3), +(621200000000,'陇南市',620000000000,2), +(621201000000,'市辖区',621200000000,3), +(621202000000,'武都区',621200000000,3), +(621221000000,'成县',621200000000,3), +(621222000000,'文县',621200000000,3), +(621223000000,'宕昌县',621200000000,3), +(621224000000,'康县',621200000000,3), +(621225000000,'西和县',621200000000,3), +(621226000000,'礼县',621200000000,3), +(621227000000,'徽县',621200000000,3), +(621228000000,'两当县',621200000000,3), +(622900000000,'临夏回族自治州',620000000000,2), +(622901000000,'临夏市',622900000000,3), +(622921000000,'临夏县',622900000000,3), +(622922000000,'康乐县',622900000000,3), +(622923000000,'永靖县',622900000000,3), +(622924000000,'广河县',622900000000,3), +(622925000000,'和政县',622900000000,3), +(622926000000,'东乡族自治县',622900000000,3), +(622927000000,'积石山保安族东乡族撒拉族自治县',622900000000,3), +(623000000000,'甘南藏族自治州',620000000000,2), +(623001000000,'合作市',623000000000,3), +(623021000000,'临潭县',623000000000,3), +(623022000000,'卓尼县',623000000000,3), +(623023000000,'舟曲县',623000000000,3), +(623024000000,'迭部县',623000000000,3), +(623025000000,'玛曲县',623000000000,3), +(623026000000,'碌曲县',623000000000,3), +(623027000000,'夏河县',623000000000,3), +(630000000000,'青海省',0,1), +(630100000000,'西宁市',630000000000,2), +(630101000000,'市辖区',630100000000,3), +(630102000000,'城东区',630100000000,3), +(630103000000,'城中区',630100000000,3), +(630104000000,'城西区',630100000000,3), +(630105000000,'城北区',630100000000,3), +(630121000000,'大通回族土族自治县',630100000000,3), +(630122000000,'湟中县',630100000000,3), +(630123000000,'湟源县',630100000000,3), +(630200000000,'海东市',630000000000,2), +(630202000000,'乐都区',630200000000,3), +(630203000000,'平安区',630200000000,3), +(630222000000,'民和回族土族自治县',630200000000,3), +(630223000000,'互助土族自治县',630200000000,3), +(630224000000,'化隆回族自治县',630200000000,3), +(630225000000,'循化撒拉族自治县',630200000000,3), +(632200000000,'海北藏族自治州',630000000000,2), +(632221000000,'门源回族自治县',632200000000,3), +(632222000000,'祁连县',632200000000,3), +(632223000000,'海晏县',632200000000,3), +(632224000000,'刚察县',632200000000,3), +(632300000000,'黄南藏族自治州',630000000000,2), +(632321000000,'同仁县',632300000000,3), +(632322000000,'尖扎县',632300000000,3), +(632323000000,'泽库县',632300000000,3), +(632324000000,'河南蒙古族自治县',632300000000,3), +(632500000000,'海南藏族自治州',630000000000,2), +(632521000000,'共和县',632500000000,3), +(632522000000,'同德县',632500000000,3), +(632523000000,'贵德县',632500000000,3), +(632524000000,'兴海县',632500000000,3), +(632525000000,'贵南县',632500000000,3), +(632600000000,'果洛藏族自治州',630000000000,2), +(632621000000,'玛沁县',632600000000,3), +(632622000000,'班玛县',632600000000,3), +(632623000000,'甘德县',632600000000,3), +(632624000000,'达日县',632600000000,3), +(632625000000,'久治县',632600000000,3), +(632626000000,'玛多县',632600000000,3), +(632700000000,'玉树藏族自治州',630000000000,2), +(632701000000,'玉树市',632700000000,3), +(632722000000,'杂多县',632700000000,3), +(632723000000,'称多县',632700000000,3), +(632724000000,'治多县',632700000000,3), +(632725000000,'囊谦县',632700000000,3), +(632726000000,'曲麻莱县',632700000000,3), +(632800000000,'海西蒙古族藏族自治州',630000000000,2), +(632801000000,'格尔木市',632800000000,3), +(632802000000,'德令哈市',632800000000,3), +(632803000000,'茫崖市',632800000000,3), +(632821000000,'乌兰县',632800000000,3), +(632822000000,'都兰县',632800000000,3), +(632823000000,'天峻县',632800000000,3), +(632857000000,'大柴旦行政委员会',632800000000,3), +(640000000000,'宁夏回族自治区',0,1), +(640100000000,'银川市',640000000000,2), +(640101000000,'市辖区',640100000000,3), +(640104000000,'兴庆区',640100000000,3), +(640105000000,'西夏区',640100000000,3), +(640106000000,'金凤区',640100000000,3), +(640121000000,'永宁县',640100000000,3), +(640122000000,'贺兰县',640100000000,3), +(640181000000,'灵武市',640100000000,3), +(640200000000,'石嘴山市',640000000000,2), +(640201000000,'市辖区',640200000000,3), +(640202000000,'大武口区',640200000000,3), +(640205000000,'惠农区',640200000000,3), +(640221000000,'平罗县',640200000000,3), +(640300000000,'吴忠市',640000000000,2), +(640301000000,'市辖区',640300000000,3), +(640302000000,'利通区',640300000000,3), +(640303000000,'红寺堡区',640300000000,3), +(640323000000,'盐池县',640300000000,3), +(640324000000,'同心县',640300000000,3), +(640381000000,'青铜峡市',640300000000,3), +(640400000000,'固原市',640000000000,2), +(640401000000,'市辖区',640400000000,3), +(640402000000,'原州区',640400000000,3), +(640422000000,'西吉县',640400000000,3), +(640423000000,'隆德县',640400000000,3), +(640424000000,'泾源县',640400000000,3), +(640425000000,'彭阳县',640400000000,3), +(640500000000,'中卫市',640000000000,2), +(640501000000,'市辖区',640500000000,3), +(640502000000,'沙坡头区',640500000000,3), +(640521000000,'中宁县',640500000000,3), +(640522000000,'海原县',640500000000,3), +(650000000000,'新疆维吾尔自治区',0,1), +(650100000000,'乌鲁木齐市',650000000000,2), +(650101000000,'市辖区',650100000000,3), +(650102000000,'天山区',650100000000,3), +(650103000000,'沙依巴克区',650100000000,3), +(650104000000,'新市区',650100000000,3), +(650105000000,'水磨沟区',650100000000,3), +(650106000000,'头屯河区',650100000000,3), +(650107000000,'达坂城区',650100000000,3), +(650109000000,'米东区',650100000000,3), +(650121000000,'乌鲁木齐县',650100000000,3), +(650171000000,'乌鲁木齐经济技术开发区',650100000000,3), +(650172000000,'乌鲁木齐高新技术产业开发区',650100000000,3), +(650200000000,'克拉玛依市',650000000000,2), +(650201000000,'市辖区',650200000000,3), +(650202000000,'独山子区',650200000000,3), +(650203000000,'克拉玛依区',650200000000,3), +(650204000000,'白碱滩区',650200000000,3), +(650205000000,'乌尔禾区',650200000000,3), +(650400000000,'吐鲁番市',650000000000,2), +(650402000000,'高昌区',650400000000,3), +(650421000000,'鄯善县',650400000000,3), +(650422000000,'托克逊县',650400000000,3), +(650500000000,'哈密市',650000000000,2), +(650502000000,'伊州区',650500000000,3), +(650521000000,'巴里坤哈萨克自治县',650500000000,3), +(650522000000,'伊吾县',650500000000,3), +(652300000000,'昌吉回族自治州',650000000000,2), +(652301000000,'昌吉市',652300000000,3), +(652302000000,'阜康市',652300000000,3), +(652323000000,'呼图壁县',652300000000,3), +(652324000000,'玛纳斯县',652300000000,3), +(652325000000,'奇台县',652300000000,3), +(652327000000,'吉木萨尔县',652300000000,3), +(652328000000,'木垒哈萨克自治县',652300000000,3), +(652700000000,'博尔塔拉蒙古自治州',650000000000,2), +(652701000000,'博乐市',652700000000,3), +(652702000000,'阿拉山口市',652700000000,3), +(652722000000,'精河县',652700000000,3), +(652723000000,'温泉县',652700000000,3), +(652800000000,'巴音郭楞蒙古自治州',650000000000,2), +(652801000000,'库尔勒市',652800000000,3), +(652822000000,'轮台县',652800000000,3), +(652823000000,'尉犁县',652800000000,3), +(652824000000,'若羌县',652800000000,3), +(652825000000,'且末县',652800000000,3), +(652826000000,'焉耆回族自治县',652800000000,3), +(652827000000,'和静县',652800000000,3), +(652828000000,'和硕县',652800000000,3), +(652829000000,'博湖县',652800000000,3), +(652871000000,'库尔勒经济技术开发区',652800000000,3), +(652900000000,'阿克苏地区',650000000000,2), +(652901000000,'阿克苏市',652900000000,3), +(652922000000,'温宿县',652900000000,3), +(652923000000,'库车县',652900000000,3), +(652924000000,'沙雅县',652900000000,3), +(652925000000,'新和县',652900000000,3), +(652926000000,'拜城县',652900000000,3), +(652927000000,'乌什县',652900000000,3), +(652928000000,'阿瓦提县',652900000000,3), +(652929000000,'柯坪县',652900000000,3), +(653000000000,'克孜勒苏柯尔克孜自治州',650000000000,2), +(653001000000,'阿图什市',653000000000,3), +(653022000000,'阿克陶县',653000000000,3), +(653023000000,'阿合奇县',653000000000,3), +(653024000000,'乌恰县',653000000000,3), +(653100000000,'喀什地区',650000000000,2), +(653101000000,'喀什市',653100000000,3), +(653121000000,'疏附县',653100000000,3), +(653122000000,'疏勒县',653100000000,3), +(653123000000,'英吉沙县',653100000000,3), +(653124000000,'泽普县',653100000000,3), +(653125000000,'莎车县',653100000000,3), +(653126000000,'叶城县',653100000000,3), +(653127000000,'麦盖提县',653100000000,3), +(653128000000,'岳普湖县',653100000000,3), +(653129000000,'伽师县',653100000000,3), +(653130000000,'巴楚县',653100000000,3), +(653131000000,'塔什库尔干塔吉克自治县',653100000000,3), +(653200000000,'和田地区',650000000000,2), +(653201000000,'和田市',653200000000,3), +(653221000000,'和田县',653200000000,3), +(653222000000,'墨玉县',653200000000,3), +(653223000000,'皮山县',653200000000,3), +(653224000000,'洛浦县',653200000000,3), +(653225000000,'策勒县',653200000000,3), +(653226000000,'于田县',653200000000,3), +(653227000000,'民丰县',653200000000,3), +(654000000000,'伊犁哈萨克自治州',650000000000,2), +(654002000000,'伊宁市',654000000000,3), +(654003000000,'奎屯市',654000000000,3), +(654004000000,'霍尔果斯市',654000000000,3), +(654021000000,'伊宁县',654000000000,3), +(654022000000,'察布查尔锡伯自治县',654000000000,3), +(654023000000,'霍城县',654000000000,3), +(654024000000,'巩留县',654000000000,3), +(654025000000,'新源县',654000000000,3), +(654026000000,'昭苏县',654000000000,3), +(654027000000,'特克斯县',654000000000,3), +(654028000000,'尼勒克县',654000000000,3), +(654200000000,'塔城地区',650000000000,2), +(654201000000,'塔城市',654200000000,3), +(654202000000,'乌苏市',654200000000,3), +(654221000000,'额敏县',654200000000,3), +(654223000000,'沙湾县',654200000000,3), +(654224000000,'托里县',654200000000,3), +(654225000000,'裕民县',654200000000,3), +(654226000000,'和布克赛尔蒙古自治县',654200000000,3), +(654300000000,'阿勒泰地区',650000000000,2), +(654301000000,'阿勒泰市',654300000000,3), +(654321000000,'布尔津县',654300000000,3), +(654322000000,'富蕴县',654300000000,3), +(654323000000,'福海县',654300000000,3), +(654324000000,'哈巴河县',654300000000,3), +(654325000000,'青河县',654300000000,3), +(654326000000,'吉木乃县',654300000000,3), +(659000000000,'自治区直辖县级行政区划',650000000000,2), +(659001000000,'石河子市',659000000000,3), +(659002000000,'阿拉尔市',659000000000,3), +(659003000000,'图木舒克市',659000000000,3), +(659004000000,'五家渠市',659000000000,3), +(659006000000,'铁门关市',659000000000,3); + +/*Table structure for table `tz_attach_file` */ + +DROP TABLE IF EXISTS `tz_attach_file`; + +CREATE TABLE `tz_attach_file` ( + `file_id` bigint(20) NOT NULL AUTO_INCREMENT, + `file_path` varchar(255) DEFAULT NULL COMMENT '文件路径', + `file_type` varchar(20) DEFAULT NULL COMMENT '文件类型', + `file_size` int(10) DEFAULT NULL COMMENT '文件大小', + `upload_time` datetime DEFAULT NULL COMMENT '上传时间', + `file_join_id` bigint(20) DEFAULT NULL COMMENT '文件关联的表主键id', + `file_join_type` tinyint(2) DEFAULT NULL COMMENT '文件关联表类型:1 商品表 FileJoinType', + PRIMARY KEY (`file_id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4; + +/*Data for the table `tz_attach_file` */ + +insert into `tz_attach_file`(`file_id`,`file_path`,`file_type`,`file_size`,`upload_time`,`file_join_id`,`file_join_type`) values +(1,'2019/07/6aeea212368e4796ad83e17381d62c38.png','png',26409,'2019-07-01 17:26:44',NULL,NULL), +(2,'2019/07/44097d528be24d48bf54eb0bd596ebc0.jpg','jpg',22379,'2019-07-02 11:30:16',NULL,NULL), +(3,'2019/07/ec73013a82d44306ac477c7bfbaad209.jpg','jpg',41935,'2019-07-02 11:30:26',NULL,NULL), +(4,'2019/07/94a2a3b53b9b4643ad80fec10ef96e28.jpg','jpg',19692,'2019-07-02 11:30:47',NULL,NULL), +(5,'2019/07/ac0b289260174f0b9757afce4da9c115.jpg','jpg',25583,'2019-07-02 11:31:14',NULL,NULL), +(6,'2019/07/5f3cd673cee046218c5916e004346d4c.jpg','jpg',25583,'2019-07-02 11:32:30',NULL,NULL), +(7,'2019/07/44a492a2ec1942a9b7fefe813ba27b78.jpg','jpg',40107,'2019-07-02 17:14:38',NULL,NULL); + +/*Table structure for table `tz_basket` */ + +DROP TABLE IF EXISTS `tz_basket`; + +CREATE TABLE `tz_basket` ( + `basket_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `shop_id` bigint(20) NOT NULL COMMENT '店铺ID', + `prod_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '产品ID', + `sku_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'SkuID', + `user_id` varchar(50) NOT NULL COMMENT '用户ID', + `basket_count` int(11) NOT NULL DEFAULT '0' COMMENT '购物车产品个数', + `basket_date` datetime NOT NULL COMMENT '购物时间', + `discount_id` bigint(20) DEFAULT NULL COMMENT '满减活动ID', + `distribution_card_no` varchar(36) DEFAULT NULL COMMENT '分销推广人卡号', + PRIMARY KEY (`basket_id`), + UNIQUE KEY `uk_user_shop_sku` (`sku_id`,`user_id`,`shop_id`), + KEY `shop_id` (`shop_id`), + KEY `user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='购物车'; + +/*Data for the table `tz_basket` */ + +/*Table structure for table `tz_brand` */ + +DROP TABLE IF EXISTS `tz_brand`; + +CREATE TABLE `tz_brand` ( + `brand_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `brand_name` varchar(30) NOT NULL DEFAULT '' COMMENT '品牌名称', + `brand_pic` varchar(255) DEFAULT NULL COMMENT '图片路径', + `user_id` varchar(36) NOT NULL DEFAULT '' COMMENT '用户ID', + `memo` varchar(50) DEFAULT NULL COMMENT '备注', + `seq` int(11) DEFAULT '1' COMMENT '顺序', + `status` int(1) NOT NULL DEFAULT '1' COMMENT '默认是1,表示正常状态,0为下线状态', + `brief` varchar(100) DEFAULT NULL COMMENT '简要描述', + `content` text COMMENT '内容', + `rec_time` datetime DEFAULT NULL COMMENT '记录时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `first_char` varchar(1) DEFAULT NULL COMMENT '品牌首字母', + PRIMARY KEY (`brand_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='品牌表'; + +/*Data for the table `tz_brand` */ + +/*Table structure for table `tz_category` */ + +DROP TABLE IF EXISTS `tz_category`; + +CREATE TABLE `tz_category` ( + `category_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '类目ID', + `shop_id` bigint(20) NOT NULL COMMENT '店铺ID', + `parent_id` bigint(20) unsigned NOT NULL COMMENT '父节点', + `category_name` varchar(50) NOT NULL DEFAULT '' COMMENT '产品类目名称', + `icon` varchar(255) DEFAULT NULL COMMENT '类目图标', + `pic` varchar(300) DEFAULT NULL COMMENT '类目的显示图片', + `seq` int(5) NOT NULL COMMENT '排序', + `status` int(1) NOT NULL DEFAULT '1' COMMENT '默认是1,表示正常状态,0为下线状态', + `rec_time` datetime NOT NULL COMMENT '记录时间', + `grade` int(2) NOT NULL COMMENT '分类层级', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`category_id`), + KEY `parent_id` (`parent_id`), + KEY `shop_id` (`shop_id`) +) ENGINE=InnoDB AUTO_INCREMENT=97 DEFAULT CHARSET=utf8 COMMENT='产品类目'; + +/*Data for the table `tz_category` */ + +insert into `tz_category`(`category_id`,`shop_id`,`parent_id`,`category_name`,`icon`,`pic`,`seq`,`status`,`rec_time`,`grade`,`update_time`) values +(85,1,0,'手机数码',NULL,'2019/04/4f148d81d60941b695cb77370a073653.jpg',1,1,'2019-04-21 17:28:32',0,'2019-04-27 11:22:09'), +(87,1,0,'美妆护肤',NULL,'2019/04/84f1a591a9ed46f68d46eee55c130b34.jpg',1,1,'2019-04-21 17:30:45',0,'2019-04-27 10:46:12'), +(88,1,0,'运动服饰',NULL,'2019/04/68f081f04c2644319d882a8828f4741c.jpg',1,1,'2019-04-21 17:31:12',0,'2019-04-27 10:38:31'), +(93,1,85,'手机通讯',NULL,'2019/04/647401fe37b04c19a74adc2353085a24.jpg',1,1,'2019-04-21 18:04:03',0,NULL), +(94,1,85,'智能设备',NULL,'2019/04/b5f5f75e0e4f4669a2f079be1f2c4418.jpg',1,1,'2019-04-21 18:04:32',0,NULL), +(95,1,0,'美味零食',NULL,'2019/04/3483eafc86674a74bcf9da6100769a9a.jpg',1,1,'2019-04-21 21:46:01',0,'2019-04-27 11:23:27'), +(96,1,85,'珠宝钟表',NULL,'2019/04/f2f502eae04c4e9ab5982d57cc4e6333.jpg',1,1,'2019-04-26 17:20:49',0,NULL); + +/*Table structure for table `tz_category_brand` */ + +DROP TABLE IF EXISTS `tz_category_brand`; + +CREATE TABLE `tz_category_brand` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `category_id` bigint(20) DEFAULT NULL COMMENT '分类id', + `brand_id` bigint(20) DEFAULT NULL COMMENT '品牌id', + PRIMARY KEY (`id`), + KEY `category_id` (`category_id`), + KEY `brand_id` (`brand_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +/*Data for the table `tz_category_brand` */ + +/*Table structure for table `tz_category_prop` */ + +DROP TABLE IF EXISTS `tz_category_prop`; + +CREATE TABLE `tz_category_prop` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `category_id` bigint(20) DEFAULT NULL COMMENT '分类id', + `prop_id` bigint(20) DEFAULT NULL COMMENT '商品属性id即表tz_prod_prop中的prop_id', + PRIMARY KEY (`id`), + KEY `category_id` (`category_id`), + KEY `prop_id` (`prop_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +/*Data for the table `tz_category_prop` */ + +/*Table structure for table `tz_delivery` */ + +DROP TABLE IF EXISTS `tz_delivery`; + +CREATE TABLE `tz_delivery` ( + `dvy_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `dvy_name` varchar(50) NOT NULL DEFAULT '' COMMENT '物流公司名称', + `company_home_url` varchar(255) DEFAULT NULL COMMENT '公司主页', + `rec_time` datetime NOT NULL COMMENT '建立时间', + `modify_time` datetime NOT NULL COMMENT '修改时间', + `query_url` varchar(520) NOT NULL COMMENT '物流查询接口', + PRIMARY KEY (`dvy_id`) +) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8 COMMENT='物流公司'; + +/*Data for the table `tz_delivery` */ + +insert into `tz_delivery`(`dvy_id`,`dvy_name`,`company_home_url`,`rec_time`,`modify_time`,`query_url`) values +(14,'顺丰快递公司','http://www.sf-express.com','2015-08-20 11:58:03','2017-03-22 17:12:27','http://www.kuaidi100.com/query?type=shunfeng&postid={dvyFlowId}&id=11'), +(15,'申通快递公司','http://www.sto-express.com','2015-08-20 11:58:24','2015-08-20 12:04:23','http://www.kuaidi100.com/query?type=shentong&postid={dvyFlowId}&id=11'), +(16,'中通速递','http://www.zto.cn','2015-08-20 11:58:48','2015-08-20 12:04:31','http://www.kuaidi100.com/query?type=zhongtong&postid={dvyFlowId}&id=11'), +(17,'安信达','http://www.anxinda.com','2015-12-22 10:19:33','2015-12-22 10:37:26','http://www.kuaidi100.com/query?type=anxindakuaixi&postid={dvyFlowId}&id=11'), +(18,'EMS','http://www.ems.com.cn','2015-12-22 10:38:15','2015-12-22 10:38:15','http://www.kuaidi100.com/query?type=ems&postid={dvyFlowId}&id=11'), +(19,'凡客如风达','http://www.rufengda.com','2015-12-22 10:38:55','2015-12-22 10:38:55','http://www.kuaidi100.com/query?type=rufengda&postid={dvyFlowId}&id=11'), +(20,'汇通快递','http://www.htky365.com','2015-12-22 10:39:46','2015-12-22 10:39:46','http://www.kuaidi100.com/query?type=huitongkuaidi&postid={dvyFlowId}&id=11'), +(21,'天天快递','http://www.ttkdex.com','2015-12-22 10:40:44','2015-12-22 10:40:44','http://www.kuaidi100.com/query?type=tiantian&postid={dvyFlowId}&id=11'), +(22,'佳吉快运','http://www.jiaji.com','2015-12-22 10:42:55','2015-12-22 10:42:55','http://www.kuaidi100.com/query?type=jiajiwuliu&postid={dvyFlowId}&id=11'), +(23,'速尔快递','http://www.sure56.com','2015-12-22 10:43:35','2015-12-22 10:43:35','http://www.kuaidi100.com/query?type=suer&postid={dvyFlowId}&id=11'), +(24,'信丰物流','http://www.xf-express.com.cn','2015-12-22 10:44:17','2015-12-22 10:44:17','http://www.kuaidi100.com/query?type=xinfengwuliu&postid={dvyFlowId}&id=11'), +(25,'韵达快递','http://www.yundaex.com','2015-12-22 10:44:51','2015-12-22 10:44:51','http://www.kuaidi100.com/query?type=yunda&postid={dvyFlowId}&id=11'), +(26,'优速快递','http://www.uc56.com','2015-12-22 10:45:20','2015-12-22 10:45:20','http://www.kuaidi100.com/query?type=youshuwuliu&postid={dvyFlowId}&id=11'), +(27,'中邮物流','http://www.cnpl.com.cn','2015-12-22 10:45:58','2015-12-22 10:45:58','http://www.kuaidi100.com/query?type=zhongyouwuliu&postid={dvyFlowId}&id=11'), +(28,'圆通快递','http://www.yto.net.cn','2015-12-22 11:44:18','2015-12-22 11:44:18','http://www.kuaidi100.com/query?type=yuantong&postid={dvyFlowId}&id=11'), +(29,'宅急送','http://www.zjs.com.cn','2015-12-22 11:45:55','2015-12-22 11:45:55','http://www.kuaidi100.com/query?type=zhaijisong&postid={dvyFlowId}&id=11'); + +/*Table structure for table `tz_hot_search` */ + +DROP TABLE IF EXISTS `tz_hot_search`; + +CREATE TABLE `tz_hot_search` ( + `hot_search_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `shop_id` bigint(20) DEFAULT NULL COMMENT '店铺ID 0为全局热搜', + `content` varchar(255) NOT NULL COMMENT '内容', + `rec_date` datetime NOT NULL COMMENT '录入时间', + `seq` int(11) DEFAULT NULL COMMENT '顺序', + `status` tinyint(2) NOT NULL DEFAULT '1' COMMENT '状态 0下线 1上线', + `title` varchar(255) NOT NULL COMMENT '热搜标题', + PRIMARY KEY (`hot_search_id`) USING BTREE, + KEY `shop_id` (`shop_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='热搜'; + +/*Data for the table `tz_hot_search` */ + +/*Table structure for table `tz_index_img` */ + +DROP TABLE IF EXISTS `tz_index_img`; + +CREATE TABLE `tz_index_img` ( + `img_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `shop_id` bigint(20) DEFAULT NULL COMMENT '店铺ID', + `img_url` varchar(200) NOT NULL COMMENT '图片', + `des` varchar(200) DEFAULT '' COMMENT '说明文字,描述', + `title` varchar(200) DEFAULT NULL COMMENT '标题', + `link` varchar(200) DEFAULT NULL COMMENT '链接', + `status` tinyint(1) DEFAULT '0' COMMENT '状态', + `seq` int(11) DEFAULT '0' COMMENT '顺序', + `upload_time` datetime DEFAULT NULL COMMENT '上传时间', + `relation` bigint(20) DEFAULT NULL COMMENT '关联', + `type` int(2) DEFAULT NULL COMMENT '类型', + PRIMARY KEY (`img_id`) USING BTREE, + KEY `shop_id` (`shop_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='主页轮播图'; + +/*Data for the table `tz_index_img` */ + +insert into `tz_index_img`(`img_id`,`shop_id`,`img_url`,`des`,`title`,`link`,`status`,`seq`,`upload_time`,`relation`,`type`) values +(2,1,'2019/04/f676a8a8dbcb4e5c9bc907ef059aedb9.jpg','',NULL,NULL,1,1,'2018-12-20 15:22:19',73,0), +(4,1,'2019/04/52b0082c60c04fc99dd03288548f2841.dpg','',NULL,NULL,1,120,'2019-04-17 17:12:37',76,0), +(5,1,'2019/04/c2d830afc56d469f96825e91e464d155.jpg','',NULL,NULL,1,10,'2019-04-22 09:57:34',76,0); + +/*Table structure for table `tz_login_hist` */ + +DROP TABLE IF EXISTS `tz_login_hist`; + +CREATE TABLE `tz_login_hist` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID', + `area` varchar(100) DEFAULT NULL COMMENT '地区', + `country` varchar(100) DEFAULT NULL COMMENT '国家', + `user_id` varchar(100) DEFAULT NULL COMMENT '用户id', + `ip` varchar(64) NOT NULL DEFAULT '' COMMENT 'IP', + `login_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='登录历史表'; + +/*Data for the table `tz_login_hist` */ + +/*Table structure for table `tz_message` */ + +DROP TABLE IF EXISTS `tz_message`; + +CREATE TABLE `tz_message` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `create_time` datetime DEFAULT NULL COMMENT '留言创建时间', + `user_name` varchar(36) DEFAULT NULL COMMENT '姓名', + `email` varchar(64) DEFAULT NULL COMMENT '邮箱', + `contact` varchar(36) DEFAULT NULL COMMENT '联系方式', + `content` text COMMENT '留言内容', + `reply` text COMMENT '留言回复', + `status` tinyint(2) DEFAULT NULL COMMENT '状态:0:未审核 1审核通过', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8; + +/*Data for the table `tz_message` */ + +insert into `tz_message`(`id`,`create_time`,`user_name`,`email`,`contact`,`content`,`reply`,`status`) values +(1,'2018-10-16 00:11:02','djr','123456','nihao','

aaaaaaqqqqffff

','

??

',0), +(9,'2018-11-30 08:00:00','111','111','111','

11111dddd

','

111

',1), +(10,'2019-03-15 18:48:05','yami','643254332@qq.com','15534243444','

hello

','

hi

',0); + +/*Table structure for table `tz_notice` */ + +DROP TABLE IF EXISTS `tz_notice`; + +CREATE TABLE `tz_notice` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '公告id', + `shop_id` bigint(20) DEFAULT NULL COMMENT '店铺id', + `title` varchar(36) DEFAULT NULL COMMENT '公告标题', + `content` text COMMENT '公告内容', + `status` tinyint(1) DEFAULT NULL COMMENT '状态(1:公布 0:撤回)', + `is_top` tinyint(2) DEFAULT NULL COMMENT '是否置顶', + `publish_time` timestamp NULL DEFAULT NULL COMMENT '发布时间', + `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; + +/*Data for the table `tz_notice` */ + +insert into `tz_notice`(`id`,`shop_id`,`title`,`content`,`status`,`is_top`,`publish_time`,`update_time`) values +(1,1,'两种意见 | 早餐绝配,松软到怀疑人生的酵母面包','

这款酵母面包我吹爆,不愧是销量超900万的爆品,非常新鲜,松软到怀疑人生,感觉跟超市里卖的那种小面包不太一样。因为是用天然酵母混合面粉发酵,制作周期比人工合成的速发酵母要长很多,但很松软,是那种自然的甜味,也不容易长胖,跟咖啡搭配简直绝了,已经成了我每天早餐的绝配。

\n

 

\n

\"\"

',1,1,'2019-04-22 14:33:41','2019-04-27 15:24:27'), +(2,1,'超大容量折叠包,再也不担心旅游购物买爆','

\"\"

\n

 

\n

出国旅游,购物时很容易不小心就放飞自我,买一大堆东西,发现装不下了。这时,我就会从包里拿出严选折叠手提袋,优雅地解决“爆买”后无处安放的尴尬。

\n

这个手提袋容量巨大,双层防水面料,但非常轻,收纳起来只有手掌厚度和大小,放在包里一点不占空间。真的超能装,打开后最多能装25L,抵半个行李箱了。袋子一侧能直接套入拉杆,稳稳地放在箱子上,拖起来毫不费力。我每次长途旅行必备它,平时拿去买菜、健身房也很好用。

',1,1,'2019-04-22 15:54:55','2019-04-27 15:24:39'), +(3,1,'同是纯棉,为什么它睡起来如此舒服','

\"\"

\n

 

\n

说到床品,我一直很想要那种五星级酒店的面料,但每次都搞不懂那些纺织名词,稀里糊涂就买了,结果往往是不好睡。

\n

后来查了一下,只有贡缎才具有这种光滑细腻的质感,但织法工艺难度高,一套动辄六七百。同事推荐了严选这款四件套,是用60支的优质长绒棉,每平方英寸400根线织成的,非常细密柔软。

\n

第一天睡觉的时候我惊呆了,同样是纯棉床品,为什么它睡起来如此舒服,竟然有着丝绸一样的顺滑触感。而且厚薄适中,透气性也不错,一年四季都能用,非常推荐。

\n

 

',1,1,'2019-04-22 16:28:18','2019-04-27 15:25:00'); + +/*Table structure for table `tz_oauth_client_details` */ + +DROP TABLE IF EXISTS `tz_oauth_client_details`; + +CREATE TABLE `tz_oauth_client_details` ( + `client_id` varchar(32) CHARACTER SET utf8mb4 NOT NULL, + `client_secret` varchar(256) CHARACTER SET utf8mb4 DEFAULT NULL, + `resource_ids` varchar(256) CHARACTER SET utf8mb4 DEFAULT NULL, + `scope` varchar(256) CHARACTER SET utf8mb4 DEFAULT NULL, + `authorized_grant_types` varchar(256) CHARACTER SET utf8mb4 DEFAULT NULL, + `web_server_redirect_uri` varchar(256) CHARACTER SET utf8mb4 DEFAULT NULL, + `authorities` varchar(256) CHARACTER SET utf8mb4 DEFAULT NULL, + `access_token_validity` int(11) DEFAULT NULL, + `refresh_token_validity` int(11) DEFAULT NULL, + `additional_information` varchar(4096) CHARACTER SET utf8mb4 DEFAULT NULL, + `autoapprove` varchar(256) CHARACTER SET utf8mb4 DEFAULT NULL, + PRIMARY KEY (`client_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='终端信息表'; + +/*Data for the table `tz_oauth_client_details` */ + +insert into `tz_oauth_client_details`(`client_id`,`client_secret`,`resource_ids`,`scope`,`authorized_grant_types`,`web_server_redirect_uri`,`authorities`,`access_token_validity`,`refresh_token_validity`,`additional_information`,`autoapprove`) values +('admin','admin',NULL,'','',NULL,NULL,NULL,NULL,NULL,'true'), +('mini_app','mini_app',NULL,'','',NULL,NULL,NULL,NULL,NULL,'true'), +('weixin_mp','weixin_mp',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); + +/*Table structure for table `tz_order` */ + +DROP TABLE IF EXISTS `tz_order`; + +CREATE TABLE `tz_order` ( + `order_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '订单ID', + `shop_id` bigint(20) DEFAULT NULL COMMENT '店铺id', + `prod_name` varchar(1000) NOT NULL DEFAULT '' COMMENT '产品名称,多个产品将会以逗号隔开', + `user_id` varchar(36) NOT NULL COMMENT '订购用户ID', + `order_number` varchar(50) NOT NULL COMMENT '订购流水号', + `total` decimal(15,2) NOT NULL DEFAULT '0.00' COMMENT '总值', + `actual_total` decimal(15,2) DEFAULT NULL COMMENT '实际总值', + `pay_type` int(1) DEFAULT NULL COMMENT '支付方式 0 手动代付 1 微信支付 2 支付宝', + `remarks` varchar(1024) DEFAULT NULL COMMENT '订单备注', + `status` int(2) NOT NULL DEFAULT '0' COMMENT '订单状态 1:待付款 2:待发货 3:待收货 4:待评价 5:成功 6:失败', + `dvy_type` varchar(10) DEFAULT NULL COMMENT '配送类型', + `dvy_id` bigint(20) DEFAULT NULL COMMENT '配送方式ID', + `dvy_flow_id` varchar(100) DEFAULT '' COMMENT '物流单号', + `freight_amount` decimal(15,2) DEFAULT '0.00' COMMENT '订单运费', + `addr_order_id` bigint(20) DEFAULT NULL COMMENT '用户订单地址Id', + `product_nums` int(10) DEFAULT NULL COMMENT '订单商品总数', + `create_time` datetime NOT NULL COMMENT '订购时间', + `update_time` datetime DEFAULT NULL COMMENT '订单更新时间', + `pay_time` datetime DEFAULT NULL COMMENT '付款时间', + `dvy_time` datetime DEFAULT NULL COMMENT '发货时间', + `finally_time` datetime DEFAULT NULL COMMENT '完成时间', + `cancel_time` datetime DEFAULT NULL COMMENT '取消时间', + `is_payed` tinyint(1) DEFAULT NULL COMMENT '是否已经支付,1:已经支付过,0:,没有支付过', + `delete_status` int(1) DEFAULT '0' COMMENT '用户订单删除状态,0:没有删除, 1:回收站, 2:永久删除', + `refund_sts` int(1) DEFAULT '0' COMMENT '0:默认,1:在处理,2:处理完成', + `reduce_amount` decimal(15,2) DEFAULT NULL COMMENT '优惠总额', + `order_type` tinyint(2) DEFAULT NULL COMMENT '订单类型', + `close_type` tinyint(2) DEFAULT NULL COMMENT '订单关闭原因 1-超时未支付 2-退款关闭 4-买家取消 15-已通过货到付款交易', + PRIMARY KEY (`order_id`), + UNIQUE KEY `order_number_unique_ind` (`order_number`), + UNIQUE KEY `order_number_userid_unique_ind` (`user_id`,`order_number`), + KEY `shop_id` (`shop_id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='订单表'; + +/*Data for the table `tz_order` */ + +insert into `tz_order`(`order_id`,`shop_id`,`prod_name`,`user_id`,`order_number`,`total`,`actual_total`,`pay_type`,`remarks`,`status`,`dvy_type`,`dvy_id`,`dvy_flow_id`,`freight_amount`,`addr_order_id`,`product_nums`,`create_time`,`update_time`,`pay_time`,`dvy_time`,`finally_time`,`cancel_time`,`is_payed`,`delete_status`,`refund_sts`,`reduce_amount`,`order_type`,`close_type`) values +(1,1,'Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 深空灰色 64GB ','51540df5255e4d22903b0f83921095ff','1145634946149388288',1.01,1.01,1,'',3,NULL,14,'123656347535245',0.00,1,1,'2019-07-01 18:07:11','2019-07-01 18:07:22','2019-07-01 18:07:22','2019-07-03 11:06:57',NULL,NULL,1,0,0,0.00,NULL,NULL), +(2,1,'Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 深空灰色 64GB ','51540df5255e4d22903b0f83921095ff','1146346112622399488',1.01,1.01,NULL,'',6,NULL,NULL,'',0.00,2,1,'2019-07-03 17:13:06','2019-07-03 17:13:06',NULL,NULL,NULL,'2019-07-03 17:17:46',0,2,0,0.00,NULL,NULL), +(3,1,'Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 银色 64GB ','51540df5255e4d22903b0f83921095ff','1146346762332672000',7103.00,7103.00,NULL,'',6,NULL,NULL,'',0.00,3,1,'2019-07-03 17:15:41','2019-07-03 17:15:41',NULL,NULL,NULL,'2019-07-03 17:17:21',0,2,0,0.00,NULL,NULL), +(4,1,'Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 深空灰色 64GB ','51540df5255e4d22903b0f83921095ff','1146346992126005248',1.01,1.01,NULL,'',6,NULL,NULL,'',0.00,5,1,'2019-07-03 17:16:36','2019-07-03 17:16:36',NULL,NULL,NULL,'2019-07-03 17:17:17',0,2,0,0.00,NULL,NULL), +(5,1,'Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 深空灰色 64GB ','51540df5255e4d22903b0f83921095ff','1146347329394184192',1.01,1.01,NULL,'',1,NULL,NULL,'',0.00,6,1,'2019-07-03 17:17:56','2019-07-03 17:17:56',NULL,NULL,NULL,NULL,0,0,0,0.00,NULL,NULL); + +/*Table structure for table `tz_order_item` */ + +DROP TABLE IF EXISTS `tz_order_item`; + +CREATE TABLE `tz_order_item` ( + `order_item_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '订单项ID', + `shop_id` bigint(20) NOT NULL COMMENT '店铺id', + `order_number` varchar(50) NOT NULL COMMENT '订单order_number', + `prod_id` bigint(20) unsigned NOT NULL COMMENT '产品ID', + `sku_id` bigint(20) unsigned NOT NULL COMMENT '产品SkuID', + `prod_count` int(11) NOT NULL DEFAULT '0' COMMENT '购物车产品个数', + `prod_name` varchar(120) NOT NULL DEFAULT '' COMMENT '产品名称', + `sku_name` varchar(120) DEFAULT NULL COMMENT 'sku名称', + `pic` varchar(255) NOT NULL DEFAULT '' COMMENT '产品主图片路径', + `price` decimal(15,2) NOT NULL COMMENT '产品价格', + `user_id` varchar(36) NOT NULL DEFAULT '' COMMENT '用户Id', + `product_total_amount` decimal(15,2) NOT NULL COMMENT '商品总金额', + `rec_time` datetime NOT NULL COMMENT '购物时间', + `comm_sts` int(1) NOT NULL DEFAULT '0' COMMENT '评论状态: 0 未评价 1 已评价', + `distribution_card_no` varchar(36) DEFAULT NULL COMMENT '推广员使用的推销卡号', + `basket_date` datetime DEFAULT NULL COMMENT '加入购物车时间', + PRIMARY KEY (`order_item_id`), + KEY `order_number` (`order_number`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='订单项'; + +/*Data for the table `tz_order_item` */ + +insert into `tz_order_item`(`order_item_id`,`shop_id`,`order_number`,`prod_id`,`sku_id`,`prod_count`,`prod_name`,`sku_name`,`pic`,`price`,`user_id`,`product_total_amount`,`rec_time`,`comm_sts`,`distribution_card_no`,`basket_date`) values +(1,1,'1145634946149388288',18,314,1,'Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 深空灰色 64GB ','换修无忧版 深空灰色 64GB ','2019/04/2cd9ec641d92458983c00d87ff33ad57.jpg',1.01,'51540df5255e4d22903b0f83921095ff',1.01,'2019-07-01 18:07:11',0,NULL,'2019-07-01 18:05:54'), +(2,1,'1146346112622399488',18,314,1,'Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 深空灰色 64GB ','换修无忧版 深空灰色 64GB ','2019/04/2cd9ec641d92458983c00d87ff33ad57.jpg',1.01,'51540df5255e4d22903b0f83921095ff',1.01,'2019-07-03 17:13:06',0,NULL,'2019-07-03 17:13:05'), +(3,1,'1146346762332672000',18,317,1,'Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 银色 64GB ','换修无忧版 银色 64GB ','2019/04/eaa8c9bd3e7b41eaa310adbde10b6401.jpg',7103.00,'51540df5255e4d22903b0f83921095ff',7103.00,'2019-07-03 17:15:41',0,NULL,'2019-07-03 17:15:40'), +(4,1,'1146346992126005248',18,314,1,'Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 深空灰色 64GB ','换修无忧版 深空灰色 64GB ','2019/04/2cd9ec641d92458983c00d87ff33ad57.jpg',1.01,'51540df5255e4d22903b0f83921095ff',1.01,'2019-07-03 17:16:36',0,NULL,'2019-07-03 17:16:34'), +(5,1,'1146347329394184192',18,314,1,'Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 深空灰色 64GB ','换修无忧版 深空灰色 64GB ','2019/04/2cd9ec641d92458983c00d87ff33ad57.jpg',1.01,'51540df5255e4d22903b0f83921095ff',1.01,'2019-07-03 17:17:56',0,NULL,'2019-07-03 17:17:55'); + +/*Table structure for table `tz_order_refund` */ + +DROP TABLE IF EXISTS `tz_order_refund`; + +CREATE TABLE `tz_order_refund` ( + `refund_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `shop_id` bigint(20) NOT NULL COMMENT '店铺ID', + `order_id` bigint(20) NOT NULL COMMENT '订单ID', + `order_number` varchar(50) NOT NULL COMMENT '订单流水号', + `order_amount` double(12,2) NOT NULL COMMENT '订单总金额', + `order_item_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '订单项ID 全部退款是0', + `refund_sn` varchar(50) NOT NULL COMMENT '退款编号', + `flow_trade_no` varchar(100) NOT NULL COMMENT '订单支付流水号', + `out_refund_no` varchar(200) DEFAULT NULL COMMENT '第三方退款单号(微信退款单号)', + `pay_type` int(1) DEFAULT NULL COMMENT '订单支付方式 1 微信支付 2 支付宝', + `pay_type_name` varchar(50) DEFAULT NULL COMMENT '订单支付名称', + `user_id` varchar(50) NOT NULL COMMENT '买家ID', + `goods_num` int(11) DEFAULT NULL COMMENT '退货数量', + `refund_amount` decimal(10,2) NOT NULL COMMENT '退款金额', + `apply_type` int(1) NOT NULL DEFAULT '0' COMMENT '申请类型:1,仅退款,2退款退货', + `refund_sts` int(1) NOT NULL DEFAULT '0' COMMENT '处理状态:1为待审核,2为同意,3为不同意', + `return_money_sts` int(1) NOT NULL DEFAULT '0' COMMENT '处理退款状态: 0:退款处理中 1:退款成功 -1:退款失败', + `apply_time` datetime NOT NULL COMMENT '申请时间', + `handel_time` datetime DEFAULT NULL COMMENT '卖家处理时间', + `refund_time` datetime DEFAULT NULL COMMENT '退款时间', + `photo_files` varchar(150) DEFAULT NULL COMMENT '文件凭证json', + `buyer_msg` varchar(300) DEFAULT NULL COMMENT '申请原因', + `seller_msg` varchar(300) DEFAULT NULL COMMENT '卖家备注', + `express_name` varchar(50) DEFAULT NULL COMMENT '物流公司名称', + `express_no` varchar(50) DEFAULT NULL COMMENT '物流单号', + `ship_time` datetime DEFAULT NULL COMMENT '发货时间', + `receive_time` datetime DEFAULT NULL COMMENT '收货时间', + `receive_message` varchar(300) DEFAULT NULL COMMENT '收货备注', + PRIMARY KEY (`refund_id`), + UNIQUE KEY `refund_sn_unique` (`refund_sn`), + KEY `order_number` (`order_number`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `tz_order_refund` */ + +/*Table structure for table `tz_order_settlement` */ + +DROP TABLE IF EXISTS `tz_order_settlement`; + +CREATE TABLE `tz_order_settlement` ( + `settlement_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '支付结算单据ID', + `pay_no` varchar(36) DEFAULT NULL COMMENT '支付单号', + `biz_pay_no` varchar(255) DEFAULT NULL COMMENT '外部订单流水号', + `order_number` varchar(36) DEFAULT NULL COMMENT 'order表中的订单号', + `pay_type` int(1) DEFAULT NULL COMMENT '支付方式 1 微信支付 2 支付宝', + `pay_type_name` varchar(50) DEFAULT NULL COMMENT '支付方式名称', + `pay_amount` decimal(15,2) DEFAULT NULL COMMENT '支付金额', + `is_clearing` int(1) DEFAULT NULL COMMENT '是否清算 0:否 1:是', + `user_id` varchar(36) DEFAULT NULL COMMENT '用户ID', + `create_time` datetime NOT NULL COMMENT '创建时间', + `clearing_time` datetime DEFAULT NULL COMMENT '清算时间', + `version` int(11) DEFAULT NULL COMMENT '版本号', + `pay_status` int(1) DEFAULT NULL COMMENT '支付状态', + PRIMARY KEY (`settlement_id`), + UNIQUE KEY `primary_order_no` (`order_number`), + KEY `user_id` (`user_id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +/*Data for the table `tz_order_settlement` */ + +insert into `tz_order_settlement`(`settlement_id`,`pay_no`,`biz_pay_no`,`order_number`,`pay_type`,`pay_type_name`,`pay_amount`,`is_clearing`,`user_id`,`create_time`,`clearing_time`,`version`,`pay_status`) values +(1,'1145634947151826944',NULL,'1145634946149388288',1,NULL,1.01,0,'51540df5255e4d22903b0f83921095ff','2019-07-01 18:07:11',NULL,1,1), +(2,'1146346113691947008',NULL,'1146346112622399488',1,NULL,1.01,0,'51540df5255e4d22903b0f83921095ff','2019-07-03 17:13:06',NULL,0,0), +(3,'1146346763158949888',NULL,'1146346762332672000',1,NULL,7103.00,0,'51540df5255e4d22903b0f83921095ff','2019-07-03 17:15:41',NULL,0,0), +(4,'1146346992977448960',NULL,'1146346992126005248',1,NULL,1.01,0,'51540df5255e4d22903b0f83921095ff','2019-07-03 17:16:36',NULL,0,0), +(5,'1146347417931747328',NULL,'1146347329394184192',1,NULL,1.01,0,'51540df5255e4d22903b0f83921095ff','2019-07-03 17:17:56',NULL,0,0); + +/*Table structure for table `tz_pick_addr` */ + +DROP TABLE IF EXISTS `tz_pick_addr`; + +CREATE TABLE `tz_pick_addr` ( + `addr_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `addr_name` varchar(36) DEFAULT NULL COMMENT '自提点名称', + `addr` varchar(1000) DEFAULT NULL COMMENT '地址', + `mobile` varchar(20) DEFAULT NULL COMMENT '手机', + `province_id` bigint(20) DEFAULT NULL COMMENT '省份ID', + `province` varchar(32) DEFAULT NULL COMMENT '省份', + `city_id` bigint(20) DEFAULT NULL COMMENT '城市ID', + `city` varchar(32) DEFAULT NULL COMMENT '城市', + `area_id` bigint(20) DEFAULT NULL COMMENT '区/县ID', + `area` varchar(32) DEFAULT NULL COMMENT '区/县', + `shop_id` bigint(20) DEFAULT NULL COMMENT '店铺id', + PRIMARY KEY (`addr_id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='用户配送地址'; + +/*Data for the table `tz_pick_addr` */ + +insert into `tz_pick_addr`(`addr_id`,`addr_name`,`addr`,`mobile`,`province_id`,`province`,`city_id`,`city`,`area_id`,`area`,`shop_id`) values +(1,'测试','大学城附近','18888888888',440000000000,'广东省',440100000000,'广州市',440113000000,'番禺区',1); + +/*Table structure for table `tz_points_change` */ + +DROP TABLE IF EXISTS `tz_points_change`; + +CREATE TABLE `tz_points_change` ( + `points_change_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '积分流动记录表', + `points_wallet_id` bigint(20) DEFAULT NULL COMMENT '积分钱包id', + `add_or_reduce` tinyint(2) DEFAULT NULL COMMENT '增加或减少(增加 0 减少 1)', + `reason` tinyint(2) DEFAULT NULL COMMENT '原因(订单,邀请,签到,兑换)', + `state` tinyint(2) DEFAULT NULL COMMENT '积分状态(0:用户未收货待结算,1:已结算 2:用户退货退单)', + `points_number` double DEFAULT NULL COMMENT '积分数额', + `order_id` bigint(20) DEFAULT NULL COMMENT '关联订单id', + `merchant_order_id` bigint(20) DEFAULT NULL COMMENT '商户订单id', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`points_change_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `tz_points_change` */ + +/*Table structure for table `tz_points_prod` */ + +DROP TABLE IF EXISTS `tz_points_prod`; + +CREATE TABLE `tz_points_prod` ( + `points_prod_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '积分商品id', + `points_id` bigint(20) DEFAULT NULL COMMENT '所需积分id', + `points_number` double DEFAULT NULL COMMENT '所需积分量', + `amount` decimal(15,2) DEFAULT NULL COMMENT '所需金额', + `prod_id` bigint(20) DEFAULT NULL COMMENT '关联商品id', + `stocks` int(11) DEFAULT NULL COMMENT '库存', + `state` tinyint(2) DEFAULT NULL COMMENT '状态(0下架 1上架)', + `upper_shelf_time` datetime DEFAULT NULL COMMENT '上架时间', + `lower_shelf` datetime DEFAULT NULL COMMENT '下架时间', + PRIMARY KEY (`points_prod_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `tz_points_prod` */ + +/*Table structure for table `tz_points_wallet` */ + +DROP TABLE IF EXISTS `tz_points_wallet`; + +CREATE TABLE `tz_points_wallet` ( + `points_wallet_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '积分钱包id', + `points_id` bigint(20) DEFAULT NULL COMMENT '积分Id', + `user_id` bigint(20) DEFAULT NULL COMMENT '用户id', + `unsettled` double DEFAULT NULL COMMENT '待结算积分', + `settled` double DEFAULT NULL COMMENT '已结算积分', + `addup` double DEFAULT NULL COMMENT '积累收益积分', + `version` int(11) DEFAULT NULL COMMENT '乐观锁', + PRIMARY KEY (`points_wallet_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `tz_points_wallet` */ + +/*Table structure for table `tz_prod` */ + +DROP TABLE IF EXISTS `tz_prod`; + +CREATE TABLE `tz_prod` ( + `prod_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '产品ID', + `prod_name` varchar(300) NOT NULL DEFAULT '' COMMENT '商品名称', + `shop_id` bigint(20) DEFAULT NULL COMMENT '店铺id', + `ori_price` decimal(15,2) DEFAULT '0.00' COMMENT '原价', + `price` decimal(15,2) DEFAULT NULL COMMENT '现价', + `brief` varchar(500) DEFAULT '' COMMENT '简要描述,卖点等', + `content` text COMMENT '详细描述', + `pic` varchar(255) DEFAULT NULL COMMENT '商品主图', + `imgs` varchar(1000) DEFAULT NULL COMMENT '商品图片,以,分割', + `status` int(1) DEFAULT '0' COMMENT '默认是1,表示正常状态, -1表示删除, 0下架', + `category_id` bigint(20) unsigned DEFAULT NULL COMMENT '商品分类', + `sold_num` int(11) DEFAULT NULL COMMENT '销量', + `total_stocks` int(11) DEFAULT '0' COMMENT '总库存', + `delivery_mode` json DEFAULT NULL COMMENT '配送方式json见TransportModeVO', + `delivery_template_id` bigint(20) DEFAULT NULL COMMENT '运费模板id', + `create_time` datetime DEFAULT NULL COMMENT '录入时间', + `update_time` datetime DEFAULT NULL COMMENT '修改时间', + `putaway_time` datetime DEFAULT NULL COMMENT '上架时间', + `version` int(11) DEFAULT NULL COMMENT '版本 乐观锁', + PRIMARY KEY (`prod_id`), + KEY `shop_id` (`shop_id`) +) ENGINE=InnoDB AUTO_INCREMENT=78 DEFAULT CHARSET=utf8 COMMENT='商品'; + +/*Data for the table `tz_prod` */ + +insert into `tz_prod`(`prod_id`,`prod_name`,`shop_id`,`ori_price`,`price`,`brief`,`content`,`pic`,`imgs`,`status`,`category_id`,`sold_num`,`total_stocks`,`delivery_mode`,`delivery_template_id`,`create_time`,`update_time`,`putaway_time`,`version`) values +(18,'Apple iPhone XS Max 移动联通电信4G手机 ',1,0.00,1.01,'6.5英寸大屏,支持双卡。','
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
\"\"
\"\"
\"\"
\"\"
\"\"
\"\"
\"\"
\"\"
\"\"
\"\"
\"\"
\n
','2019/04/eaa8c9bd3e7b41eaa310adbde10b6401.jpg','2019/04/eaa8c9bd3e7b41eaa310adbde10b6401.jpg',1,93,NULL,95,'{\"hasUserPickUp\": false, \"hasShopDelivery\": true}',47,'2019-03-29 14:40:00','2019-06-22 18:28:32','2019-06-22 18:28:32',85), +(59,'兰蔻粉水清滢柔肤水400ml 爽肤水女保湿舒缓滋润嫩肤',1,0.00,420.00,'好看耐穿','

\"\"

','2019/04/ce5a32005a7a4f9483a17051bda6bd6c.jpg','2019/04/ce5a32005a7a4f9483a17051bda6bd6c.jpg,2019/04/8a8712b81a2d4f4ca3eb4a725ad229c6.jpg',1,87,NULL,0,'{\"hasUserPickUp\": false, \"hasShopDelivery\": true}',48,'2019-04-21 19:15:34','2019-04-29 14:30:44','2019-04-29 14:30:44',NULL), +(68,'【Dole都乐】菲律宾都乐非转基因木瓜1只 单只约410g',1,0.00,26.00,'包邮 肉厚籽少 独具风味','

\"\"

','2019/04/0bfd73f43d764d20b2f0b92813abdc56.jpg','2019/04/0bfd73f43d764d20b2f0b92813abdc56.jpg,2019/04/355020f27acd4b13a652cb830f03bedc.jpg',1,95,NULL,0,'{\"hasUserPickUp\": false, \"hasShopDelivery\": true}',47,'2019-04-21 21:56:38','2019-05-22 10:30:37','2019-05-22 10:30:37',NULL), +(69,'阿迪达斯官方 adidas 三叶草 NITE JOGGER 男子经典鞋BD7956',1,10.00,1199.00,' 运动鞋/休闲鞋','

\"\"

','2019/04/b3558ee506fb4589bfaa94a543226477.jpg','2019/04/b3558ee506fb4589bfaa94a543226477.jpg,2019/04/df052ea31d3149fdb5c54f7c4fc6349b.jpg',0,88,NULL,0,'{\"hasUserPickUp\": false, \"hasShopDelivery\": true}',47,'2019-04-21 22:10:04','2019-05-23 20:17:03','2019-05-22 13:37:26',NULL), +(70,'【Dole都乐】比利时Truval啤梨12只 进口水果新鲜梨 单果120g左右',1,0.00,38.00,'好吃','

\"\"

','2019/04/de0edd2aaf2d4d3c8b6c3fdfde738805.jpg','2019/04/de0edd2aaf2d4d3c8b6c3fdfde738805.jpg,2019/04/ee4530e364ca48869347e1e79915406c.jpg',1,95,NULL,15,'{\"hasUserPickUp\": false, \"hasShopDelivery\": true}',47,'2019-04-22 16:43:33','2019-06-22 09:40:24','2019-06-22 09:40:24',NULL), +(71,'旗舰店官网 自拍神器 梵高定制',1,10.00,6998.00,'梵高定制礼盒 全球限量发售 分期免息','

\"\"

\n

\"\"\"\"

','2019/04/667e4ce211b44c6da10891f42927fc11.jpg','2019/04/667e4ce211b44c6da10891f42927fc11.jpg,2019/04/31c416e7020b4fe69d491bc09baaae90.jpg',1,85,NULL,99,'{\"hasUserPickUp\": false, \"hasShopDelivery\": true}',47,'2019-04-23 15:43:26','2019-05-21 11:01:59','2019-05-21 11:01:59',NULL), +(72,'餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭',1,0.00,169.00,'创意餐厅装饰画 好好吃饭','

\"\"

','2019/04/299df42b0b404c338060aef5b1b11dd7.jpg','2019/04/299df42b0b404c338060aef5b1b11dd7.jpg,2019/04/bca5ff8e257f4db6aa0be42ed4393568.jpg',1,91,NULL,0,'{\"hasUserPickUp\": false, \"hasShopDelivery\": true}',47,'2019-04-25 10:22:21','2019-04-29 14:29:25','2019-04-29 14:29:25',NULL), +(73,'阴阳师寮办秘制 月见和菓子 184克',1,0.00,22.00,'三层夹心,Q弹有料','

\"\"

','2019/04/60c6300596504c10bd80d6365647b078.jpg','2019/04/60c6300596504c10bd80d6365647b078.jpg,2019/04/11175723eae8431cabda164e0e197cb1.jpg',1,95,NULL,77,'{\"hasUserPickUp\": false, \"hasShopDelivery\": true}',47,'2019-04-27 11:37:13','2019-05-21 13:56:10','2019-05-21 13:56:10',NULL), +(74,'旺仔牛奶',2,0.00,100.00,'测试','

测试商品

','2019/05/b1a4bf7612554dbc8395f22e22d531c8.jpg','2019/05/b1a4bf7612554dbc8395f22e22d531c8.jpg',1,95,NULL,0,'{\"hasUserPickUp\": false, \"hasShopDelivery\": true}',48,'2019-05-22 10:39:49','2019-05-22 10:39:49','2019-05-22 10:39:49',NULL), +(75,'测试商品A',1,30.00,30.00,'','

测试

','2019/05/65525bbccee04ec5a094f38ce61d6b86.jpg','2019/05/65525bbccee04ec5a094f38ce61d6b86.jpg',1,95,NULL,30,'{\"hasUserPickUp\": false, \"hasShopDelivery\": true}',47,'2019-05-23 17:23:11','2019-06-22 09:40:13','2019-06-22 09:40:13',NULL), +(76,'测试商品B',1,40.00,40.00,'BBBB','

测试

','2019/05/150d6c4a46914dbfa82690098b2ec4e7.jpg','2019/05/150d6c4a46914dbfa82690098b2ec4e7.jpg',1,95,NULL,40,'{\"hasUserPickUp\": false, \"hasShopDelivery\": true}',47,'2019-05-23 17:24:06','2019-06-22 09:40:06','2019-06-22 09:40:06',NULL), +(77,'测试商品C',1,60.00,50.00,'CCC','

CCCC

','2019/05/1bdd097dbffd477799a7aca949377b20.jpg','2019/05/1bdd097dbffd477799a7aca949377b20.jpg',1,95,NULL,50,'{\"hasUserPickUp\": false, \"hasShopDelivery\": true}',47,'2019-05-23 17:24:48','2019-06-22 09:39:59','2019-06-22 09:39:59',NULL); + +/*Table structure for table `tz_prod_comm` */ + +DROP TABLE IF EXISTS `tz_prod_comm`; + +CREATE TABLE `tz_prod_comm` ( + `prod_comm_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `prod_id` bigint(20) unsigned NOT NULL COMMENT '商品ID', + `order_item_id` bigint(20) unsigned DEFAULT NULL COMMENT '订单项ID', + `user_id` varchar(36) DEFAULT NULL COMMENT '评论用户ID', + `content` varchar(500) DEFAULT '' COMMENT '评论内容', + `reply_content` varchar(500) DEFAULT '' COMMENT '掌柜回复', + `rec_time` datetime DEFAULT NULL COMMENT '记录时间', + `reply_time` datetime DEFAULT NULL COMMENT '回复时间', + `reply_sts` int(1) DEFAULT '0' COMMENT '是否回复 0:未回复 1:已回复', + `postip` varchar(16) DEFAULT NULL COMMENT 'IP来源', + `score` tinyint(2) DEFAULT '0' COMMENT '得分,0-5分', + `useful_counts` int(11) DEFAULT '0' COMMENT '有用的计数', + `pics` varchar(1000) DEFAULT NULL COMMENT '晒图的json字符串', + `is_anonymous` int(1) DEFAULT '0' COMMENT '是否匿名(1:是 0:否)', + `status` int(1) DEFAULT NULL COMMENT '是否显示,1:为显示,0:待审核, -1:不通过审核,不显示。 如果需要审核评论,则是0,,否则1', + `evaluate` tinyint(2) DEFAULT NULL COMMENT '评价(0好评 1中评 2差评)', + PRIMARY KEY (`prod_comm_id`), + KEY `prod_id` (`prod_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品评论'; + +/*Data for the table `tz_prod_comm` */ + +/*Table structure for table `tz_prod_favorite` */ + +DROP TABLE IF EXISTS `tz_prod_favorite`; + +CREATE TABLE `tz_prod_favorite` ( + `favorite_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `prod_id` bigint(20) unsigned NOT NULL COMMENT '商品ID', + `rec_time` datetime NOT NULL COMMENT '收藏时间', + `user_id` varchar(36) NOT NULL DEFAULT '' COMMENT '用户ID', + PRIMARY KEY (`favorite_id`), + KEY `prod_id` (`prod_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品收藏表'; + +/*Data for the table `tz_prod_favorite` */ + +/*Table structure for table `tz_prod_prop` */ + +DROP TABLE IF EXISTS `tz_prod_prop`; + +CREATE TABLE `tz_prod_prop` ( + `prop_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '属性id', + `prop_name` varchar(20) DEFAULT NULL COMMENT '属性名称', + `rule` tinyint(2) DEFAULT NULL COMMENT 'ProdPropRule 1:销售属性(规格); 2:参数属性;', + `shop_id` bigint(20) DEFAULT NULL COMMENT '店铺id', + PRIMARY KEY (`prop_id`), + KEY `shop_id` (`shop_id`) +) ENGINE=InnoDB AUTO_INCREMENT=82 DEFAULT CHARSET=utf8mb4; + +/*Data for the table `tz_prod_prop` */ + +insert into `tz_prod_prop`(`prop_id`,`prop_name`,`rule`,`shop_id`) values +(80,'内存',1,1), +(81,'颜色',1,1); + +/*Table structure for table `tz_prod_prop_value` */ + +DROP TABLE IF EXISTS `tz_prod_prop_value`; + +CREATE TABLE `tz_prod_prop_value` ( + `value_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '属性值ID', + `prop_value` varchar(20) DEFAULT NULL COMMENT '属性值名称', + `prop_id` bigint(20) DEFAULT NULL COMMENT '属性ID', + PRIMARY KEY (`value_id`), + KEY `prop_id` (`prop_id`) +) ENGINE=InnoDB AUTO_INCREMENT=387 DEFAULT CHARSET=utf8mb4; + +/*Data for the table `tz_prod_prop_value` */ + +insert into `tz_prod_prop_value`(`value_id`,`prop_value`,`prop_id`) values +(381,'32G',80), +(382,'64G',80), +(383,'128G',80), +(384,'红',81), +(385,'黄',81), +(386,'蓝',81); + +/*Table structure for table `tz_prod_tag` */ + +DROP TABLE IF EXISTS `tz_prod_tag`; + +CREATE TABLE `tz_prod_tag` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分组标签id', + `title` varchar(36) DEFAULT NULL COMMENT '分组标题', + `shop_id` bigint(20) DEFAULT NULL COMMENT '店铺Id', + `status` tinyint(1) DEFAULT NULL COMMENT '状态(1为正常,0为删除)', + `is_default` tinyint(1) DEFAULT NULL COMMENT '默认类型(0:商家自定义,1:系统默认)', + `prod_count` bigint(20) DEFAULT NULL COMMENT '商品数量', + `style` int(10) DEFAULT NULL COMMENT '列表样式(0:一列一个,1:一列两个,2:一列三个)', + `seq` int(10) DEFAULT NULL COMMENT '排序', + `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间', + `update_time` timestamp NULL DEFAULT NULL COMMENT '修改时间', + `delete_time` timestamp NULL DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='商品分组表'; + +/*Data for the table `tz_prod_tag` */ + +insert into `tz_prod_tag`(`id`,`title`,`shop_id`,`status`,`is_default`,`prod_count`,`style`,`seq`,`create_time`,`update_time`,`delete_time`) values +(1,'每日上新',1,1,0,0,2,3,'2019-04-18 14:27:02','2019-04-18 14:27:06',NULL), +(2,'商城热卖',1,1,0,0,1,2,'2019-04-18 14:27:27','2019-04-18 14:27:30',NULL), +(3,'更多宝贝',1,1,1,0,0,1,'2019-04-18 10:07:17','2019-04-18 10:07:17',NULL); + +/*Table structure for table `tz_prod_tag_reference` */ + +DROP TABLE IF EXISTS `tz_prod_tag_reference`; + +CREATE TABLE `tz_prod_tag_reference` ( + `reference_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分组引用id', + `shop_id` bigint(20) DEFAULT NULL COMMENT '店铺id', + `tag_id` bigint(20) DEFAULT NULL COMMENT '标签id', + `prod_id` bigint(20) DEFAULT NULL COMMENT '商品id', + `status` tinyint(1) DEFAULT NULL COMMENT '状态(1:正常,0:删除)', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`reference_id`) +) ENGINE=InnoDB AUTO_INCREMENT=342 DEFAULT CHARSET=utf8; + +/*Data for the table `tz_prod_tag_reference` */ + +insert into `tz_prod_tag_reference`(`reference_id`,`shop_id`,`tag_id`,`prod_id`,`status`,`create_time`) values +(25,1,1,60,1,'2019-04-21 21:29:19'), +(26,1,3,60,1,'2019-04-21 21:29:19'), +(29,1,3,62,1,'2019-04-21 21:35:13'), +(30,1,1,62,1,'2019-04-21 21:35:13'), +(31,1,2,63,1,'2019-04-21 21:37:22'), +(32,1,1,63,1,'2019-04-21 21:37:22'), +(33,1,3,63,1,'2019-04-21 21:37:22'), +(34,1,1,64,1,'2019-04-21 21:48:11'), +(35,1,2,64,1,'2019-04-21 21:48:11'), +(36,1,2,65,1,'2019-04-21 21:50:23'), +(37,1,3,65,1,'2019-04-21 21:50:23'), +(38,1,1,66,1,'2019-04-21 21:52:10'), +(39,1,3,66,1,'2019-04-21 21:52:10'), +(40,1,3,67,1,'2019-04-21 21:54:20'), +(41,1,1,67,1,'2019-04-21 21:54:20'), +(203,NULL,1,61,1,'2019-04-27 09:48:16'), +(204,NULL,2,61,1,'2019-04-27 09:48:16'), +(225,NULL,1,72,1,'2019-04-29 14:29:26'), +(226,NULL,2,72,1,'2019-04-29 14:29:26'), +(241,NULL,1,59,1,'2019-04-29 14:30:44'), +(242,NULL,2,59,1,'2019-04-29 14:30:44'), +(243,NULL,3,59,1,'2019-04-29 14:30:44'), +(255,NULL,1,71,1,'2019-05-21 11:02:01'), +(256,NULL,2,71,1,'2019-05-21 11:02:01'), +(257,NULL,1,73,1,'2019-05-21 13:56:12'), +(258,NULL,3,73,1,'2019-05-21 13:56:12'), +(271,NULL,2,68,1,'2019-05-22 10:30:39'), +(272,NULL,3,68,1,'2019-05-22 10:30:39'), +(273,NULL,1,68,1,'2019-05-22 10:30:39'), +(286,1,1,74,1,'2019-05-22 10:39:51'), +(287,1,2,74,1,'2019-05-22 10:39:51'), +(288,1,3,74,1,'2019-05-22 10:39:51'), +(313,NULL,1,69,1,'2019-05-23 20:17:04'), +(314,NULL,2,69,1,'2019-05-23 20:17:04'), +(315,NULL,3,69,1,'2019-05-23 20:17:04'), +(330,NULL,1,77,1,'2019-06-22 09:39:57'), +(331,NULL,2,77,1,'2019-06-22 09:39:57'), +(332,NULL,1,76,1,'2019-06-22 09:40:04'), +(333,NULL,2,76,1,'2019-06-22 09:40:04'), +(334,NULL,1,75,1,'2019-06-22 09:40:10'), +(335,NULL,2,75,1,'2019-06-22 09:40:10'), +(336,NULL,1,70,1,'2019-06-22 09:40:22'), +(337,NULL,2,70,1,'2019-06-22 09:40:22'), +(338,NULL,3,70,1,'2019-06-22 09:40:22'), +(339,NULL,1,18,1,'2019-06-22 18:28:31'), +(340,NULL,2,18,1,'2019-06-22 18:28:31'), +(341,NULL,3,18,1,'2019-06-22 18:28:31'); + +/*Table structure for table `tz_schedule_job` */ + +DROP TABLE IF EXISTS `tz_schedule_job`; + +CREATE TABLE `tz_schedule_job` ( + `job_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务id', + `bean_name` varchar(200) DEFAULT NULL COMMENT 'spring bean名称', + `method_name` varchar(100) DEFAULT NULL COMMENT '方法名', + `params` varchar(2000) DEFAULT NULL COMMENT '参数', + `cron_expression` varchar(100) DEFAULT NULL COMMENT 'cron表达式', + `status` tinyint(4) DEFAULT NULL COMMENT '任务状态 0:正常 1:暂停', + `remark` varchar(255) DEFAULT NULL COMMENT '备注', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`job_id`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 COMMENT='定时任务'; + +/*Data for the table `tz_schedule_job` */ + +insert into `tz_schedule_job`(`job_id`,`bean_name`,`method_name`,`params`,`cron_expression`,`status`,`remark`,`create_time`) values +(14,'orderTask','cancelOrder','','0 * * * * ?',0,'取消超时未支付订单','2019-06-24 14:51:51'), +(16,'orderTask','confirmOrder','','0 0/5 * * * ?',0,'系统自动确认收货订单','2019-06-24 14:52:47'); + +/*Table structure for table `tz_schedule_job_log` */ + +DROP TABLE IF EXISTS `tz_schedule_job_log`; + +CREATE TABLE `tz_schedule_job_log` ( + `log_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务日志id', + `job_id` bigint(20) NOT NULL COMMENT '任务id', + `bean_name` varchar(200) DEFAULT NULL COMMENT 'spring bean名称', + `method_name` varchar(100) DEFAULT NULL COMMENT '方法名', + `params` varchar(2000) DEFAULT NULL COMMENT '参数', + `status` tinyint(4) NOT NULL COMMENT '任务状态 0:成功 1:失败', + `error` varchar(2000) DEFAULT NULL COMMENT '失败信息', + `times` int(11) NOT NULL COMMENT '耗时(单位:毫秒)', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`log_id`), + KEY `job_id` (`job_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='定时任务日志'; + +/*Data for the table `tz_schedule_job_log` */ + +/*Table structure for table `tz_score_log` */ + +DROP TABLE IF EXISTS `tz_score_log`; + +CREATE TABLE `tz_score_log` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '积分记录id', + `user_id` varchar(36) DEFAULT NULL COMMENT '用户id', + `type` tinyint(2) DEFAULT NULL COMMENT '0支出 1收入', + `create_time` datetime DEFAULT NULL COMMENT '记录创建时间', + `sn` varchar(36) DEFAULT NULL COMMENT '流水号', + `score_type` tinyint(2) DEFAULT NULL COMMENT '积分类型:1回收加积分 2购买减积分', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `tz_score_log` */ + +/*Table structure for table `tz_sens_word` */ + +DROP TABLE IF EXISTS `tz_sens_word`; + +CREATE TABLE `tz_sens_word` ( + `sens_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `words` varchar(255) DEFAULT NULL COMMENT '敏感字', + PRIMARY KEY (`sens_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='敏感字过滤表'; + +/*Data for the table `tz_sens_word` */ + +/*Table structure for table `tz_shop_detail` */ + +DROP TABLE IF EXISTS `tz_shop_detail`; + +CREATE TABLE `tz_shop_detail` ( + `shop_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '店铺id', + `shop_name` varchar(50) DEFAULT NULL COMMENT '店铺名称(数字、中文,英文(可混合,不可有特殊字符),可修改)、不唯一', + `user_id` varchar(36) DEFAULT NULL COMMENT '店长用户id', + `shop_type` tinyint(2) DEFAULT NULL COMMENT '店铺类型', + `intro` varchar(200) DEFAULT NULL COMMENT '店铺简介(可修改)', + `shop_notice` varchar(50) DEFAULT NULL COMMENT '店铺公告(可修改)', + `shop_industry` tinyint(2) DEFAULT NULL COMMENT '店铺行业(餐饮、生鲜果蔬、鲜花等)', + `shop_owner` varchar(20) DEFAULT NULL COMMENT '店长', + `mobile` varchar(20) DEFAULT NULL COMMENT '店铺绑定的手机(登录账号:唯一)', + `tel` varchar(20) DEFAULT NULL COMMENT '店铺联系电话', + `shop_lat` varchar(20) DEFAULT NULL COMMENT '店铺所在纬度(可修改)', + `shop_lng` varchar(20) DEFAULT NULL COMMENT '店铺所在经度(可修改)', + `shop_address` varchar(100) DEFAULT NULL COMMENT '店铺详细地址', + `province` varchar(10) DEFAULT NULL COMMENT '店铺所在省份(描述)', + `city` varchar(10) DEFAULT NULL COMMENT '店铺所在城市(描述)', + `area` varchar(10) DEFAULT NULL COMMENT '店铺所在区域(描述)', + `pca_code` varchar(20) DEFAULT NULL COMMENT '店铺省市区代码,用于回显', + `shop_logo` varchar(200) DEFAULT NULL COMMENT '店铺logo(可修改)', + `shop_photos` varchar(1000) DEFAULT NULL COMMENT '店铺相册', + `open_time` varchar(100) DEFAULT NULL COMMENT '每天营业时间段(可修改)', + `shop_status` tinyint(2) DEFAULT NULL COMMENT '店铺状态(-1:未开通 0: 停业中 1:营业中),可修改', + `transport_type` tinyint(2) DEFAULT NULL COMMENT '0:商家承担运费; 1:买家承担运费', + `fixed_freight` decimal(15,2) DEFAULT NULL COMMENT '固定运费', + `full_free_shipping` decimal(15,2) DEFAULT NULL COMMENT '满X包邮', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `is_distribution` tinyint(2) DEFAULT NULL COMMENT '分销开关(0:开启 1:关闭)', + PRIMARY KEY (`shop_id`), + UNIQUE KEY `mobile` (`mobile`), + UNIQUE KEY `shop_user_id` (`user_id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +/*Data for the table `tz_shop_detail` */ + +insert into `tz_shop_detail`(`shop_id`,`shop_name`,`user_id`,`shop_type`,`intro`,`shop_notice`,`shop_industry`,`shop_owner`,`mobile`,`tel`,`shop_lat`,`shop_lng`,`shop_address`,`province`,`city`,`area`,`pca_code`,`shop_logo`,`shop_photos`,`open_time`,`shop_status`,`transport_type`,`fixed_freight`,`full_free_shipping`,`create_time`,`update_time`,`is_distribution`) values +(1,'亚米小店1',NULL,NULL,'亚米小店 爱你哟',NULL,NULL,NULL,NULL,'020-123456',NULL,NULL,'大学城北','广东省','广州市','番禺区','44/4401/440113','2018/08/78a6a63cf02d4965912bc5047f49afa0.jpg','2018/08/c7a50f443a85462d8129d83cf0f7eb91.jpg,2018/08/79791fc749444ef1ab4d2ca56fe9363f.jpg','00:00:00 - 00:20:00',1,NULL,NULL,NULL,'2018-08-30 11:10:05',NULL,1), +(2,'亚米大店2',NULL,NULL,'亚米大店 店大大',NULL,NULL,NULL,NULL,'010-123456',NULL,NULL,'天安门哟','北京市','市辖区','东城区','11/1101/110101','2018/08/0907446e05c44431be5d27ec7c277ee6.jpg','2018/08/5f97fc62c18d4d2292f8101fa0291e85.jpg','06:00:00 - 00:00:00',1,NULL,NULL,NULL,'2018-08-31 10:16:06',NULL,NULL), +(3,'亚米3',NULL,NULL,'亚米 店铺描述',NULL,NULL,NULL,NULL,'010-211111111',NULL,NULL,'大学城北','天津市','市辖区','和平区','12/1201/120101','2018/09/4bb8b326f85a4c6aad251c561a17f0c4.png','2018/09/63c3d47beb5544f9b30103721002ca2e.jpg,2018/09/899e1ebf3c6c467d8d8630a3c18720db.jpg','00:02:00 - 00:00:00',1,NULL,NULL,NULL,'2018-09-06 18:50:00','2018-09-29 09:50:05',NULL); + +/*Table structure for table `tz_sku` */ + +DROP TABLE IF EXISTS `tz_sku`; + +CREATE TABLE `tz_sku` ( + `sku_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '单品ID', + `prod_id` bigint(20) unsigned NOT NULL COMMENT '商品ID', + `properties` varchar(2000) DEFAULT '' COMMENT '销售属性组合字符串 格式是p1:v1;p2:v2', + `ori_price` decimal(15,2) DEFAULT NULL COMMENT '原价', + `price` decimal(15,2) DEFAULT NULL COMMENT '价格', + `stocks` int(11) NOT NULL COMMENT '商品在付款减库存的状态下,该sku上未付款的订单数量', + `actual_stocks` int(11) DEFAULT NULL COMMENT '实际库存', + `update_time` datetime NOT NULL COMMENT '修改时间', + `rec_time` datetime NOT NULL COMMENT '记录时间', + `party_code` varchar(100) DEFAULT NULL COMMENT '商家编码', + `model_id` varchar(100) DEFAULT NULL COMMENT '商品条形码', + `pic` varchar(500) DEFAULT NULL COMMENT 'sku图片', + `sku_name` varchar(120) DEFAULT NULL COMMENT 'sku名称', + `prod_name` varchar(255) DEFAULT NULL COMMENT '商品名称', + `version` int(11) NOT NULL DEFAULT '0' COMMENT '版本号', + `weight` double DEFAULT NULL COMMENT '商品重量', + `volume` double DEFAULT NULL COMMENT '商品体积', + `status` tinyint(2) DEFAULT '1' COMMENT '0 禁用 1 启用', + `is_delete` tinyint(2) DEFAULT NULL COMMENT '0 正常 1 已被删除', + PRIMARY KEY (`sku_id`), + KEY `prod_id` (`prod_id`) +) ENGINE=InnoDB AUTO_INCREMENT=405 DEFAULT CHARSET=utf8 COMMENT='单品SKU表'; + +/*Data for the table `tz_sku` */ + +insert into `tz_sku`(`sku_id`,`prod_id`,`properties`,`ori_price`,`price`,`stocks`,`actual_stocks`,`update_time`,`rec_time`,`party_code`,`model_id`,`pic`,`sku_name`,`prod_name`,`version`,`weight`,`volume`,`status`,`is_delete`) values +(10,4,NULL,NULL,0.10,0,100,'2019-05-14 10:00:41','2018-09-14 14:05:52',NULL,NULL,NULL,'',NULL,10,NULL,NULL,1,NULL), +(116,13,'面积:75m²',25000000.00,25.00,2,200,'2018-11-22 11:42:59','2018-11-22 11:42:59','100001',NULL,'2018/11/d9316669736f48f7bd047a928e3b2972.jpg','75m² ','房子 75m² ',0,0,0,1,1), +(117,15,'',0.00,0.00,0,0,'2018-11-22 15:20:53','2018-11-22 15:20:53','',NULL,NULL,'','',0,0,0,1,1), +(118,16,'',0.00,0.00,0,0,'2018-11-22 15:21:22','2018-11-22 15:21:22','',NULL,NULL,'','',0,0,0,1,1), +(119,17,'',0.00,0.00,0,0,'2018-11-22 15:21:34','2018-11-22 15:21:34','',NULL,NULL,'','',0,0,0,1,1), +(120,18,'版本:公开版;颜色:金色;内存:64GB',10999.00,10999.00,3,3,'2018-12-29 13:48:46','2018-11-22 16:02:41','',NULL,NULL,'公开版 金色 64GB ','Apple iPhone XS Max 移动联通电信4G手机 公开版 金色 64GB ',3,0,0,1,1), +(121,18,'版本:换修无忧版;颜色:金色;内存:64GB',10999.00,10999.00,5,6,'2018-12-10 14:47:51','2018-11-22 16:02:41','',NULL,NULL,'换修无忧版 金色 64GB ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 金色 64GB ',1,0,0,1,1), +(122,18,'版本:原厂延保版;颜色:金色;内存:64GB',10999.00,10999.00,0,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'原厂延保版 金色 64GB ','Apple iPhone XS Max 移动联通电信4G手机 原厂延保版 金色 64GB ',0,0,0,1,1), +(123,18,'版本:公开版;颜色:深空灰色;内存:64GB',10999.00,10999.00,0,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'公开版 深空灰色 64GB ','Apple iPhone XS Max 移动联通电信4G手机 公开版 深空灰色 64GB ',0,0,0,1,1), +(124,18,'版本:换修无忧版;颜色:深空灰色;内存:64GB',10999.00,10999.00,100,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'换修无忧版 深空灰色 64GB ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 深空灰色 64GB ',0,0,0,1,1), +(125,18,'版本:原厂延保版;颜色:深空灰色;内存:64GB',10999.00,10999.00,0,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'原厂延保版 深空灰色 64GB ','Apple iPhone XS Max 移动联通电信4G手机 原厂延保版 深空灰色 64GB ',0,0,0,1,1), +(126,18,'版本:公开版;颜色:银色;内存:64GB',10999.00,10999.00,0,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'公开版 银色 64GB ','Apple iPhone XS Max 移动联通电信4G手机 公开版 银色 64GB ',0,0,0,1,1), +(127,18,'版本:换修无忧版;颜色:银色;内存:64GB',10999.00,10999.00,0,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'换修无忧版 银色 64GB ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 银色 64GB ',0,0,0,1,1), +(128,18,'版本:原厂延保版;颜色:银色;内存:64GB',10999.00,10999.00,0,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'原厂延保版 银色 64GB ','Apple iPhone XS Max 移动联通电信4G手机 原厂延保版 银色 64GB ',0,0,0,1,1), +(129,18,'版本:公开版;颜色:金色;内存:256GB',10999.00,10999.00,0,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'公开版 金色 256GB ','Apple iPhone XS Max 移动联通电信4G手机 公开版 金色 256GB ',0,0,0,1,1), +(130,18,'版本:换修无忧版;颜色:金色;内存:256GB',10999.00,10999.00,0,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'换修无忧版 金色 256GB ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 金色 256GB ',0,0,0,1,1), +(131,18,'版本:原厂延保版;颜色:金色;内存:256GB',10999.00,10999.00,0,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'原厂延保版 金色 256GB ','Apple iPhone XS Max 移动联通电信4G手机 原厂延保版 金色 256GB ',0,0,0,1,1), +(132,18,'版本:公开版;颜色:深空灰色;内存:256GB',10999.00,10999.00,0,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'公开版 深空灰色 256GB ','Apple iPhone XS Max 移动联通电信4G手机 公开版 深空灰色 256GB ',0,0,0,1,1), +(133,18,'版本:换修无忧版;颜色:深空灰色;内存:256GB',10999.00,10999.00,0,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'换修无忧版 深空灰色 256GB ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 深空灰色 256GB ',0,0,0,1,1), +(134,18,'版本:原厂延保版;颜色:深空灰色;内存:256GB',10999.00,10999.00,107,100,'2019-05-16 11:30:31','2018-11-22 16:02:41','',NULL,NULL,'原厂延保版 深空灰色 256GB ','Apple iPhone XS Max 移动联通电信4G手机 原厂延保版 深空灰色 256GB ',27,0,0,1,1), +(135,18,'版本:公开版;颜色:银色;内存:256GB',10999.00,10999.00,0,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'公开版 银色 256GB ','Apple iPhone XS Max 移动联通电信4G手机 公开版 银色 256GB ',0,0,0,1,1), +(136,18,'版本:换修无忧版;颜色:银色;内存:256GB',10999.00,10999.00,0,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'换修无忧版 银色 256GB ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 银色 256GB ',0,0,0,1,1), +(137,18,'版本:原厂延保版;颜色:银色;内存:256GB',10999.00,10999.00,0,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'原厂延保版 银色 256GB ','Apple iPhone XS Max 移动联通电信4G手机 原厂延保版 银色 256GB ',0,0,0,1,1), +(138,18,'版本:公开版;颜色:金色;内存:512GB',10999.00,10999.00,0,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'公开版 金色 512GB ','Apple iPhone XS Max 移动联通电信4G手机 公开版 金色 512GB ',0,0,0,1,1), +(139,18,'版本:换修无忧版;颜色:金色;内存:512GB',10999.00,10999.00,0,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'换修无忧版 金色 512GB ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 金色 512GB ',0,0,0,1,1), +(140,18,'版本:原厂延保版;颜色:金色;内存:512GB',10999.00,10999.00,0,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'原厂延保版 金色 512GB ','Apple iPhone XS Max 移动联通电信4G手机 原厂延保版 金色 512GB ',0,0,0,1,1), +(141,18,'版本:公开版;颜色:深空灰色;内存:512GB',10999.00,10999.00,0,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'公开版 深空灰色 512GB ','Apple iPhone XS Max 移动联通电信4G手机 公开版 深空灰色 512GB ',0,0,0,1,1), +(142,18,'版本:换修无忧版;颜色:深空灰色;内存:512GB',10999.00,10999.00,0,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'换修无忧版 深空灰色 512GB ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 深空灰色 512GB ',0,0,0,1,1), +(143,18,'版本:原厂延保版;颜色:深空灰色;内存:512GB',10999.00,10999.00,0,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'原厂延保版 深空灰色 512GB ','Apple iPhone XS Max 移动联通电信4G手机 原厂延保版 深空灰色 512GB ',0,0,0,1,1), +(144,18,'版本:公开版;颜色:银色;内存:512GB',10999.00,10999.00,0,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'公开版 银色 512GB ','Apple iPhone XS Max 移动联通电信4G手机 公开版 银色 512GB ',0,0,0,1,1), +(145,18,'版本:换修无忧版;颜色:银色;内存:512GB',10999.00,10999.00,0,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'换修无忧版 银色 512GB ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 银色 512GB ',0,0,0,1,1), +(146,18,'版本:原厂延保版;颜色:银色;内存:512GB',10999.00,10999.00,0,0,'2018-11-22 16:02:41','2018-11-22 16:02:41','',NULL,NULL,'原厂延保版 银色 512GB ','Apple iPhone XS Max 移动联通电信4G手机 原厂延保版 银色 512GB ',0,0,0,1,1), +(256,59,'',0.00,0.00,0,0,'2019-04-21 19:15:35','2019-04-21 19:15:35','',NULL,NULL,'','安踏运动鞋',0,0,0,1,1), +(257,59,'颜色:深空灰色',999.00,100.00,89,89,'2019-04-21 19:49:37','2019-04-21 19:49:37','123187',NULL,'2019/04/16c40e0a9a2c403e8fa64af68f46e330.jpg','深空灰色 ','安踏运动鞋',0,287,899,1,1), +(258,18,'版本:公开版',19999.00,12999.00,999,999,'2019-04-21 20:35:38','2019-04-21 20:35:38','123123412',NULL,'2019/04/5efab0e2610a484c925e3ec9a47719d1.jpg','公开版 ','Apple iPhone XS Max 移动联通电信4G手机 公开版 ',0,213,331,1,1), +(259,18,'版本:换修无忧版',13412.00,12312.00,232,211,'2019-04-21 20:35:38','2019-04-21 20:35:38','1142411241',NULL,'2019/04/4f4db61a05044458bf4d08fdce497f47.jpg','换修无忧版 ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 ',0,123,232,1,1), +(260,60,'颜色:金色',299.00,199.00,233,233,'2019-04-21 21:29:19','2019-04-21 21:29:19','1312151235',NULL,'2019/04/1be7d4e321f24c188bb694c50dc37a8e.jpg','金色 ','休闲鞋 底板',0,123,243,1,1), +(261,61,'颜色:深空灰色',100.00,100.00,23,23,'2019-04-21 21:33:33','2019-04-21 21:33:33','',NULL,'2019/04/3c547f3855f94894bd1058286eecb8d9.jpg','深空灰色 ','爆款女装T恤青春',0,0,0,1,1), +(262,62,'颜色:金色',400.00,358.00,122,122,'2019-04-21 21:35:13','2019-04-21 21:35:13','',NULL,'2019/04/0cabb44de08345e2b5db9c9ea98ef1f3.jpg','金色 ','工装裤',0,0,0,1,1), +(263,63,'版本:公开版',233.00,233.00,43,34,'2019-04-21 21:37:21','2019-04-21 21:37:21','',NULL,'2019/04/b98a528660e84cf680c5098992d77bf9.jpg','公开版 ','公文包',0,0,0,1,1), +(264,64,'',234.00,233.00,234,234,'2019-04-21 21:48:11','2019-04-21 21:48:11','',NULL,NULL,'','美味曲奇',0,0,0,1,1), +(265,65,'',13.00,10.00,345,345,'2019-04-21 21:50:23','2019-04-21 21:50:23','',NULL,NULL,'','大大口香糖',0,0,0,1,1), +(266,66,'',14.00,12.00,574,574,'2019-04-21 21:52:10','2019-04-21 21:52:10','',NULL,NULL,'','乐事',0,0,0,1,1), +(267,67,'',65.00,54.00,346,344,'2019-04-21 21:54:20','2019-04-21 21:54:20','',NULL,NULL,'','旺仔牛奶',0,0,0,1,1), +(268,68,'',12.00,26.00,65,65,'2019-04-21 21:56:39','2019-04-21 21:56:39','',NULL,NULL,'','【Dole都乐】菲律宾都乐非转基因木瓜1只 单只约410g',0,0,0,1,0), +(269,69,'版本:公开版',3799.00,3599.00,239,239,'2019-04-21 22:10:05','2019-04-21 22:10:05','',NULL,'2019/04/44cbf97dea4c45cda2a374d575568698.jpg','公开版 ','华为P30',0,0,0,1,1), +(270,18,'版本:公开版',0.00,0.00,0,0,'2019-04-22 10:33:51','2019-04-22 10:33:51','',NULL,NULL,'','',0,0,0,0,1), +(271,18,'版本:换修无忧版',0.00,0.00,0,0,'2019-04-22 10:33:51','2019-04-22 10:33:51','',NULL,NULL,'','',0,0,0,1,1), +(272,70,'',2.00,1.00,20,NULL,'2019-04-22 16:42:57','2019-04-22 16:42:57',NULL,NULL,NULL,'','面包面包',0,0.1,0.3,1,1), +(273,70,'',3.00,2.00,4,NULL,'2019-04-22 17:55:09','2019-04-22 17:55:09',NULL,NULL,NULL,'','面包面包',0,5,6,1,1), +(274,70,'',2.00,1.00,3,NULL,'2019-04-22 17:57:00','2019-04-22 17:57:00',NULL,NULL,NULL,'','面包面包',0,4,5,1,1), +(275,71,'颜色:金色',20.00,10.00,999,NULL,'2019-04-23 15:43:25','2019-04-23 15:43:25',NULL,NULL,NULL,'','红豆糕点',0,10,1,1,1), +(276,70,'',0.00,0.00,0,NULL,'2019-04-23 15:49:01','2019-04-23 15:49:01',NULL,NULL,NULL,'','面包面包',0,0,0,1,1), +(277,59,'颜色:深空灰色',0.00,0.00,0,NULL,'2019-04-24 08:44:28','2019-04-24 08:44:28',NULL,NULL,NULL,'深空灰色 ','安踏运动鞋',0,0,0,1,1), +(278,59,'颜色:深空灰色',0.00,0.00,0,NULL,'2019-04-24 08:44:58','2019-04-24 08:44:58',NULL,NULL,NULL,'深空灰色 ','安踏运动鞋',0,0,0,1,1), +(279,70,'',2.00,1.00,3,NULL,'2019-04-24 18:04:01','2019-04-24 18:04:01',NULL,NULL,NULL,'','面包面包',0,4,5,0,1), +(282,71,'颜色:金色',20.00,10.00,999,NULL,'2019-04-25 10:17:17','2019-04-25 10:17:17',NULL,NULL,'2019/04/de38ac60fa5c4798bf6ed3c1c6403e34.jpg','金色 ','红豆糕点',0,0.1,1,1,1), +(283,72,'颜色:金色',1.00,5.00,999,NULL,'2019-04-25 10:22:20','2019-04-25 10:22:20',NULL,NULL,'2019/04/5bbffdf1f3674a6d942319432ab4bc79.jpg','','快乐汽水',0,0.2,0.3,1,1), +(284,71,'颜色:金色',0.00,0.00,0,NULL,'2019-04-25 10:28:21','2019-04-25 10:28:21',NULL,NULL,NULL,'金色 ','红豆糕点',0,0,0,1,1), +(285,72,'颜色:金色',0.00,0.00,0,NULL,'2019-04-25 10:29:11','2019-04-25 10:29:11',NULL,NULL,NULL,'金色 ','快乐汽水',0,0,0,1,1), +(286,72,'颜色:金色',0.00,0.00,0,NULL,'2019-04-25 10:30:11','2019-04-25 10:30:11',NULL,NULL,NULL,'金色 ','快乐汽水',0,0,0,1,1), +(287,72,'颜色:金色',0.00,0.00,0,NULL,'2019-04-25 10:30:41','2019-04-25 10:30:41',NULL,NULL,NULL,'金色 ','快乐汽水',0,0,0,1,1), +(288,18,'版本:公开版',0.00,0.00,100,NULL,'2019-04-25 19:08:32','2019-04-25 19:08:32',NULL,NULL,NULL,'公开版 ','Apple iPhone XS Max 移动联通电信4G手机 公开版 ',0,0,0,1,1), +(289,18,'版本:换修无忧版',0.00,0.00,99,NULL,'2019-04-25 19:08:32','2019-04-25 19:08:32',NULL,NULL,NULL,'换修无忧版 ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 ',0,0,0,1,1), +(290,18,'版本:公开版;颜色:金色;内存:64GB',0.00,0.00,0,NULL,'2019-04-26 11:08:51','2019-04-26 11:08:51',NULL,NULL,NULL,'','',0,0,0,1,1), +(291,18,'版本:换修无忧版;颜色:金色;内存:64GB',0.00,0.00,0,NULL,'2019-04-26 11:08:51','2019-04-26 11:08:51',NULL,NULL,NULL,'','',0,0,0,1,1), +(292,18,'版本:公开版;颜色:深空灰色;内存:64GB',0.00,0.00,0,NULL,'2019-04-26 11:08:51','2019-04-26 11:08:51',NULL,NULL,NULL,'','',0,0,0,1,1), +(293,18,'版本:换修无忧版;颜色:深空灰色;内存:64GB',0.00,0.00,0,NULL,'2019-04-26 11:08:51','2019-04-26 11:08:51',NULL,NULL,NULL,'','',0,0,0,1,1), +(294,18,'版本:公开版;颜色:金色;内存:256GB',0.00,0.00,0,NULL,'2019-04-26 11:08:51','2019-04-26 11:08:51',NULL,NULL,NULL,'','',0,0,0,1,1), +(295,18,'版本:换修无忧版;颜色:金色;内存:256GB',0.00,0.00,0,NULL,'2019-04-26 11:08:51','2019-04-26 11:08:51',NULL,NULL,NULL,'','',0,0,0,1,1), +(296,18,'版本:公开版;颜色:深空灰色;内存:256GB',0.00,0.00,0,NULL,'2019-04-26 11:08:51','2019-04-26 11:08:51',NULL,NULL,NULL,'','',0,0,0,1,1), +(297,18,'版本:换修无忧版;颜色:深空灰色;内存:256GB',0.00,0.00,0,NULL,'2019-04-26 11:08:51','2019-04-26 11:08:51',NULL,NULL,NULL,'','',0,0,0,1,1), +(298,18,'版本:公开版;颜色:金色;内存:64GB',0.00,0.00,0,NULL,'2019-04-26 11:19:48','2019-04-26 11:19:48',NULL,NULL,NULL,'公开版 金色 64GB ','Apple iPhone XS Max 移动联通电信4G手机 公开版 金色 64GB ',0,0,0,1,1), +(299,18,'版本:换修无忧版;颜色:金色;内存:64GB',0.00,0.00,0,NULL,'2019-04-26 11:19:48','2019-04-26 11:19:48',NULL,NULL,NULL,'换修无忧版 金色 64GB ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 金色 64GB ',0,0,0,1,1), +(300,18,'版本:公开版;颜色:深空灰色;内存:64GB',0.00,0.00,0,NULL,'2019-04-26 11:19:48','2019-04-26 11:19:48',NULL,NULL,NULL,'公开版 深空灰色 64GB ','Apple iPhone XS Max 移动联通电信4G手机 公开版 深空灰色 64GB ',0,0,0,1,1), +(301,18,'版本:换修无忧版;颜色:深空灰色;内存:64GB',0.00,0.00,0,NULL,'2019-04-26 11:19:48','2019-04-26 11:19:48',NULL,NULL,NULL,'换修无忧版 深空灰色 64GB ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 深空灰色 64GB ',0,0,0,1,1), +(302,18,'版本:公开版;颜色:金色;内存:256GB',0.00,0.00,0,NULL,'2019-04-26 11:19:48','2019-04-26 11:19:48',NULL,NULL,NULL,'公开版 金色 256GB ','Apple iPhone XS Max 移动联通电信4G手机 公开版 金色 256GB ',0,0,0,1,1), +(303,18,'版本:换修无忧版;颜色:金色;内存:256GB',0.00,0.00,0,NULL,'2019-04-26 11:19:48','2019-04-26 11:19:48',NULL,NULL,NULL,'换修无忧版 金色 256GB ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 金色 256GB ',0,0,0,1,1), +(304,18,'版本:公开版;颜色:深空灰色;内存:256GB',0.00,0.00,0,NULL,'2019-04-26 11:19:48','2019-04-26 11:19:48',NULL,NULL,NULL,'公开版 深空灰色 256GB ','Apple iPhone XS Max 移动联通电信4G手机 公开版 深空灰色 256GB ',0,0,0,1,1), +(305,18,'版本:换修无忧版;颜色:深空灰色;内存:256GB',0.00,0.00,0,NULL,'2019-04-26 11:19:48','2019-04-26 11:19:48',NULL,NULL,NULL,'换修无忧版 深空灰色 256GB ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 深空灰色 256GB ',0,0,0,1,1), +(306,18,'内存:64GB',0.00,0.00,0,NULL,'2019-04-26 11:26:28','2019-04-26 11:26:28',NULL,NULL,NULL,'64GB ','Apple iPhone XS Max eeeeee移动联通电信4G手机 64GB ',0,0,0,1,1), +(307,18,'内存:256GB',0.00,0.00,0,NULL,'2019-04-26 11:26:28','2019-04-26 11:26:28',NULL,NULL,NULL,'256GB ','Apple iPhone XS Max 移动联通电信4G手机 256GB ',0,0,0,1,1), +(308,18,'内存:64GB',0.00,0.00,0,NULL,'2019-04-26 11:26:47','2019-04-26 11:26:47',NULL,NULL,NULL,'64GB ','Apple iPhone XS Max qqqqq 移动联通电信4G手机 64GB ',0,0,0,1,1), +(309,18,'内存:256GB',0.00,0.00,0,NULL,'2019-04-26 11:26:47','2019-04-26 11:26:47',NULL,NULL,NULL,'256GB ','Apple iPhone XS Max 移动联通电信4G手机 256GB ',0,0,0,1,1), +(310,18,'版本:公开版;颜色:金色;内存:64GB',0.00,10.00,0,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,NULL,'公开版 金色 64GB ','Apple iPhone XS Max 移动联通电信4G手机 公开版 金色 64GB ',0,0,0,0,0), +(311,18,'版本:换修无忧版;颜色:金色;内存:64GB',0.00,9.00,0,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,NULL,'换修无忧版 金色 64GB ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 金色 64GB ',0,0,0,0,0), +(312,18,'版本:原厂延保版;颜色:金色;内存:64GB',0.00,8.00,0,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,NULL,'原厂延保版 金色 64GB ','Apple iPhone XS Max 移动联通电信4G手机 原厂延保版 金色 64GB ',0,0,0,0,0), +(313,18,'版本:公开版;颜色:深空灰色;内存:64GB',0.00,7.00,0,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,NULL,'公开版 深空灰色 64GB ','Apple iPhone XS Max 移动联通电信4G手机 公开版 深空灰色 64GB ',0,0,0,0,0), +(314,18,'版本:换修无忧版;颜色:深空灰色;内存:64GB',0.00,1.01,80,NULL,'2019-07-03 17:17:56','2019-04-26 11:40:06',NULL,NULL,'2019/04/2cd9ec641d92458983c00d87ff33ad57.jpg','换修无忧版 深空灰色 64GB ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 深空灰色 64GB ',55,0,0,1,0), +(315,18,'版本:原厂延保版;颜色:深空灰色;内存:64GB',0.00,1.02,0,NULL,'2019-04-29 19:41:13','2019-04-26 11:40:06',NULL,NULL,'2019/04/bf4c40f7e6e5454e806c244ca49d3964.jpg','原厂延保版 深空灰色 64GB ','Apple iPhone XS Max 移动联通电信4G手机 原厂延保版 深空灰色 64GB ',2,0,0,1,0), +(316,18,'版本:公开版;颜色:银色;内存:64GB',0.00,7102.00,1,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,NULL,'公开版 银色 64GB ','Apple iPhone XS Max 移动联通电信4G手机 公开版 银色 64GB ',0,0,0,1,0), +(317,18,'版本:换修无忧版;颜色:银色;内存:64GB',0.00,7103.00,1,NULL,'2019-07-03 17:15:41','2019-04-26 11:40:06',NULL,NULL,NULL,'换修无忧版 银色 64GB ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 银色 64GB ',1,0,0,1,0), +(318,18,'版本:原厂延保版;颜色:银色;内存:64GB',0.00,7104.00,1,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,NULL,'原厂延保版 银色 64GB ','Apple iPhone XS Max 移动联通电信4G手机 原厂延保版 银色 64GB ',0,0,0,1,0), +(319,18,'版本:公开版;颜色:金色;内存:256GB',0.00,7600.00,1,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,'2019/04/1cfc26bed5084caaa439ed4e49b41885.jpg','公开版 金色 256GB ','Apple iPhone XS Max 移动联通电信4G手机 公开版 金色 256GB ',0,0,0,1,0), +(320,18,'版本:换修无忧版;颜色:金色;内存:256GB',0.00,7601.00,0,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,'2019/04/a25a877f99684e1882eef5a5bb9081c4.jpg','换修无忧版 金色 256GB ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 金色 256GB ',0,0,0,1,0), +(321,18,'版本:原厂延保版;颜色:金色;内存:256GB',0.00,7602.00,0,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,'2019/04/b119c50832d44622a07c7ed0ff10f647.jpg','原厂延保版 金色 256GB ','Apple iPhone XS Max 移动联通电信4G手机 原厂延保版 金色 256GB ',0,0,0,1,0), +(322,18,'版本:公开版;颜色:深空灰色;内存:256GB',0.00,7603.00,0,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,'2019/04/98b8c67212994d9bb62ac35aedd1cc08.jpg','公开版 深空灰色 256GB ','Apple iPhone XS Max 移动联通电信4G手机 公开版 深空灰色 256GB ',0,0,0,1,0), +(323,18,'版本:换修无忧版;颜色:深空灰色;内存:256GB',0.00,7604.00,0,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,'2019/04/e5cdcd2c310d4cf2b702523db1993dbd.jpg','换修无忧版 深空灰色 256GB ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 深空灰色 256GB ',0,0,0,1,0), +(324,18,'版本:原厂延保版;颜色:深空灰色;内存:256GB',0.00,7605.00,0,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,'2019/04/9edd1e5a57d345678dd52308496457bb.jpg','原厂延保版 深空灰色 256GB ','Apple iPhone XS Max 移动联通电信4G手机 原厂延保版 深空灰色 256GB ',0,0,0,1,0), +(325,18,'版本:公开版;颜色:银色;内存:256GB',0.00,7606.00,0,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,NULL,'公开版 银色 256GB ','Apple iPhone XS Max 移动联通电信4G手机 公开版 银色 256GB ',0,0,0,1,0), +(326,18,'版本:换修无忧版;颜色:银色;内存:256GB',0.00,7607.00,0,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,NULL,'换修无忧版 银色 256GB ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 银色 256GB ',0,0,0,1,0), +(327,18,'版本:原厂延保版;颜色:银色;内存:256GB',0.00,7608.00,0,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,NULL,'原厂延保版 银色 256GB ','Apple iPhone XS Max 移动联通电信4G手机 原厂延保版 银色 256GB ',0,0,0,1,0), +(328,18,'版本:公开版;颜色:金色;内存:512GB',0.00,8000.00,0,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,'2019/04/20824781b8f24771b12cf273450aaaae.jpg','公开版 金色 512GB ','Apple iPhone XS Max 移动联通电信4G手机 公开版 金色 512GB ',0,0,0,1,0), +(329,18,'版本:换修无忧版;颜色:金色;内存:512GB',0.00,8001.00,0,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,'2019/04/2c60b3e379e84d6bacfd7f04edc1a653.jpg','换修无忧版 金色 512GB ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 金色 512GB ',0,0,0,1,0), +(330,18,'版本:原厂延保版;颜色:金色;内存:512GB',0.00,8002.00,0,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,'2019/04/2e5239d4fd6e49e29c9f8e75edad7318.jpg','原厂延保版 金色 512GB ','Apple iPhone XS Max 移动联通电信4G手机 原厂延保版 金色 512GB ',0,0,0,1,0), +(331,18,'版本:公开版;颜色:深空灰色;内存:512GB',0.00,8003.00,0,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,'2019/04/525b9161f2424645bab7ca1b73e918d2.jpg','公开版 深空灰色 512GB ','Apple iPhone XS Max 移动联通电信4G手机 公开版 深空灰色 512GB ',0,0,0,1,0), +(332,18,'版本:换修无忧版;颜色:深空灰色;内存:512GB',0.00,8004.00,0,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,'2019/04/a5dd840eadaa41afadfd7d16ed05b139.jpg','换修无忧版 深空灰色 512GB ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 深空灰色 512GB ',0,0,0,1,0), +(333,18,'版本:原厂延保版;颜色:深空灰色;内存:512GB',0.00,8006.00,0,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,'2019/04/ae2c5c3b77e0437c93114cae3bfb20e0.jpg','原厂延保版 深空灰色 512GB ','Apple iPhone XS Max 移动联通电信4G手机 原厂延保版 深空灰色 512GB ',0,0,0,1,0), +(334,18,'版本:公开版;颜色:银色;内存:512GB',0.00,8000.00,0,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,NULL,'公开版 银色 512GB ','Apple iPhone XS Max 移动联通电信4G手机 公开版 银色 512GB ',0,0,0,0,0), +(335,18,'版本:换修无忧版;颜色:银色;内存:512GB',0.00,8005.00,0,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,NULL,'换修无忧版 银色 512GB ','Apple iPhone XS Max 移动联通电信4G手机 换修无忧版 银色 512GB ',0,0,0,1,0), +(336,18,'版本:原厂延保版;颜色:银色;内存:512GB',0.00,8000.00,0,NULL,'2019-04-26 11:40:06','2019-04-26 11:40:06',NULL,NULL,NULL,'原厂延保版 银色 512GB ','Apple iPhone XS Max 移动联通电信4G手机 原厂延保版 银色 512GB ',0,0,0,0,0), +(337,70,'',0.00,0.00,0,NULL,'2019-04-26 11:40:24','2019-04-26 11:40:24',NULL,NULL,NULL,'','面包面包',0,0,0,1,1), +(338,70,'',2.00,1.00,3,NULL,'2019-04-26 13:40:59','2019-04-26 13:40:59',NULL,NULL,NULL,'','面包面包',0,4,5,1,1), +(339,70,'版本:公开版',0.00,0.00,0,NULL,'2019-04-26 14:21:12','2019-04-26 14:21:12',NULL,NULL,NULL,'公开版 ','面包面包11 公开版 ',0,0,0,1,1), +(340,70,'版本:换修无忧版',0.00,0.00,0,NULL,'2019-04-26 14:21:12','2019-04-26 14:21:12',NULL,NULL,NULL,'换修无忧版 ','面包面包11 换修无忧版 ',0,0,0,1,1), +(341,70,'版本:公开版',2.00,1.00,3,NULL,'2019-04-26 14:21:33','2019-04-26 14:21:33',NULL,NULL,'2019/04/c6b85c1bce184dfebaceb9352e1bba2c.jpg','公开版 ','面包面包111 公开版 ',0,0,0,0,1), +(342,70,'版本:换修无忧版',5.00,4.00,6,NULL,'2019-04-26 14:21:33','2019-04-26 14:21:33',NULL,NULL,NULL,'换修无忧版 ','面包面包111 换修无忧版 ',0,0,0,1,1), +(343,70,'',2.00,1.00,3,NULL,'2019-04-26 15:14:04','2019-04-26 15:14:04',NULL,NULL,NULL,'','面包面包',0,4,5,1,1), +(344,70,'馅料:绿豆馅',0.00,0.00,0,NULL,'2019-04-26 15:15:44','2019-04-26 15:15:44',NULL,NULL,NULL,'绿豆馅 ','面包面包 绿豆馅 ',0,0,0,1,1), +(345,70,'馅料:红豆馅',0.00,0.00,0,NULL,'2019-04-26 15:15:44','2019-04-26 15:15:44',NULL,NULL,NULL,'红豆馅 ','面包面包 红豆馅 ',0,0,0,1,1), +(346,72,'尺寸:40*50;外框类型:曜石黑金属画框;颜色分类:金色',0.00,169.00,5,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,'2019/04/2ae8beb3fb7445589754ad959482c186.jpg','40*50 曜石黑金属画框 金色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 40*50 曜石黑金属画框 金色 ',0,0,0,1,0), +(347,72,'尺寸:50*60;外框类型:曜石黑金属画框;颜色分类:金色',0.00,175.00,6,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'50*60 曜石黑金属画框 金色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 50*60 曜石黑金属画框 金色 ',0,0,0,1,0), +(348,72,'尺寸:60*80;外框类型:曜石黑金属画框;颜色分类:金色',0.00,182.00,5,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'60*80 曜石黑金属画框 金色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 60*80 曜石黑金属画框 金色 ',0,0,0,1,0), +(349,72,'尺寸:40*50;外框类型:流砂金金属画框;颜色分类:金色',0.00,169.00,3,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,'2019/04/26bf2e07ecbf41b6a67029acb8f22cfc.jpg','40*50 流砂金金属画框 金色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 40*50 流砂金金属画框 金色 ',0,0,0,1,0), +(350,72,'尺寸:50*60;外框类型:流砂金金属画框;颜色分类:金色',0.00,175.00,3,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'50*60 流砂金金属画框 金色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 50*60 流砂金金属画框 金色 ',0,0,0,1,0), +(351,72,'尺寸:60*80;外框类型:流砂金金属画框;颜色分类:金色',0.00,182.00,3,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'60*80 流砂金金属画框 金色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 60*80 流砂金金属画框 金色 ',0,0,0,1,0), +(352,72,'尺寸:40*50;外框类型:轻奢金画框;颜色分类:金色',0.00,169.00,5,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'40*50 轻奢金画框 金色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 40*50 轻奢金画框 金色 ',0,0,0,1,0), +(353,72,'尺寸:50*60;外框类型:轻奢金画框;颜色分类:金色',0.00,175.00,6,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'50*60 轻奢金画框 金色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 50*60 轻奢金画框 金色 ',0,0,0,1,0), +(354,72,'尺寸:60*80;外框类型:轻奢金画框;颜色分类:金色',0.00,179.00,4,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'60*80 轻奢金画框 金色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 60*80 轻奢金画框 金色 ',0,0,0,1,0), +(355,72,'尺寸:40*50;外框类型:曜石黑金属画框;颜色分类:粉红色',0.00,169.00,5,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'40*50 曜石黑金属画框 粉红色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 40*50 曜石黑金属画框 粉红色 ',0,0,0,1,0), +(356,72,'尺寸:50*60;外框类型:曜石黑金属画框;颜色分类:粉红色',0.00,175.00,5,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,'2019/04/8bd6d1e21886429f87f9964c338efee8.jpg','50*60 曜石黑金属画框 粉红色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 50*60 曜石黑金属画框 粉红色 ',0,0,0,1,0), +(357,72,'尺寸:60*80;外框类型:曜石黑金属画框;颜色分类:粉红色',0.00,182.00,5,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'60*80 曜石黑金属画框 粉红色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 60*80 曜石黑金属画框 粉红色 ',0,0,0,1,0), +(358,72,'尺寸:40*50;外框类型:流砂金金属画框;颜色分类:粉红色',0.00,169.00,4,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'40*50 流砂金金属画框 粉红色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 40*50 流砂金金属画框 粉红色 ',0,0,0,1,0), +(359,72,'尺寸:50*60;外框类型:流砂金金属画框;颜色分类:粉红色',0.00,175.00,6,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'50*60 流砂金金属画框 粉红色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 50*60 流砂金金属画框 粉红色 ',0,0,0,1,0), +(360,72,'尺寸:60*80;外框类型:流砂金金属画框;颜色分类:粉红色',0.00,182.00,5,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'60*80 流砂金金属画框 粉红色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 60*80 流砂金金属画框 粉红色 ',0,0,0,1,0), +(361,72,'尺寸:40*50;外框类型:轻奢金画框;颜色分类:粉红色',0.00,169.00,5,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,'2019/04/41f7b496551149e185f92e36bb4aff79.jpg','40*50 轻奢金画框 粉红色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 40*50 轻奢金画框 粉红色 ',0,0,0,1,0), +(362,72,'尺寸:50*60;外框类型:轻奢金画框;颜色分类:粉红色',0.00,175.00,5,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'50*60 轻奢金画框 粉红色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 50*60 轻奢金画框 粉红色 ',0,0,0,1,0), +(363,72,'尺寸:60*80;外框类型:轻奢金画框;颜色分类:粉红色',0.00,182.00,5,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'60*80 轻奢金画框 粉红色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 60*80 轻奢金画框 粉红色 ',0,0,0,1,0), +(364,72,'尺寸:40*50;外框类型:曜石黑金属画框;颜色分类:银色',0.00,169.00,5,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'40*50 曜石黑金属画框 银色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 40*50 曜石黑金属画框 银色 ',0,0,0,1,0), +(365,72,'尺寸:50*60;外框类型:曜石黑金属画框;颜色分类:银色',0.00,175.00,5,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'50*60 曜石黑金属画框 银色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 50*60 曜石黑金属画框 银色 ',0,0,0,1,0), +(366,72,'尺寸:60*80;外框类型:曜石黑金属画框;颜色分类:银色',0.00,182.00,4,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'60*80 曜石黑金属画框 银色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 60*80 曜石黑金属画框 银色 ',0,0,0,1,0), +(367,72,'尺寸:40*50;外框类型:流砂金金属画框;颜色分类:银色',0.00,169.00,4,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'40*50 流砂金金属画框 银色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 40*50 流砂金金属画框 银色 ',0,0,0,1,0), +(368,72,'尺寸:50*60;外框类型:流砂金金属画框;颜色分类:银色',0.00,175.00,3,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'50*60 流砂金金属画框 银色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 50*60 流砂金金属画框 银色 ',0,0,0,1,0), +(369,72,'尺寸:60*80;外框类型:流砂金金属画框;颜色分类:银色',0.00,182.00,4,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'60*80 流砂金金属画框 银色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 60*80 流砂金金属画框 银色 ',0,0,0,1,0), +(370,72,'尺寸:40*50;外框类型:轻奢金画框;颜色分类:银色',0.00,169.00,4,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'40*50 轻奢金画框 银色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 40*50 轻奢金画框 银色 ',0,0,0,1,0), +(371,72,'尺寸:50*60;外框类型:轻奢金画框;颜色分类:银色',0.00,175.00,4,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'50*60 轻奢金画框 银色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 50*60 轻奢金画框 银色 ',0,0,0,1,0), +(372,72,'尺寸:60*80;外框类型:轻奢金画框;颜色分类:银色',0.00,182.00,5,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'60*80 轻奢金画框 银色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 60*80 轻奢金画框 银色 ',0,0,0,1,0), +(373,72,'尺寸:40*50;外框类型:曜石黑金属画框;颜色分类:暗黑色',0.00,169.00,0,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'40*50 曜石黑金属画框 暗黑色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 40*50 曜石黑金属画框 暗黑色 ',0,0,0,1,0), +(374,72,'尺寸:50*60;外框类型:曜石黑金属画框;颜色分类:暗黑色',0.00,175.00,5,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'50*60 曜石黑金属画框 暗黑色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 50*60 曜石黑金属画框 暗黑色 ',0,0,0,1,0), +(375,72,'尺寸:60*80;外框类型:曜石黑金属画框;颜色分类:暗黑色',0.00,182.00,5,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'60*80 曜石黑金属画框 暗黑色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 60*80 曜石黑金属画框 暗黑色 ',0,0,0,1,0), +(376,72,'尺寸:40*50;外框类型:流砂金金属画框;颜色分类:暗黑色',0.00,169.00,4,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'40*50 流砂金金属画框 暗黑色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 40*50 流砂金金属画框 暗黑色 ',0,0,0,0,0), +(377,72,'尺寸:50*60;外框类型:流砂金金属画框;颜色分类:暗黑色',0.00,175.00,5,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'50*60 流砂金金属画框 暗黑色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 50*60 流砂金金属画框 暗黑色 ',0,0,0,1,0), +(378,72,'尺寸:60*80;外框类型:流砂金金属画框;颜色分类:暗黑色',0.00,182.00,5,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'60*80 流砂金金属画框 暗黑色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 60*80 流砂金金属画框 暗黑色 ',0,0,0,1,0), +(379,72,'尺寸:40*50;外框类型:轻奢金画框;颜色分类:暗黑色',0.00,169.00,5,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'40*50 轻奢金画框 暗黑色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 40*50 轻奢金画框 暗黑色 ',0,0,0,1,0), +(380,72,'尺寸:50*60;外框类型:轻奢金画框;颜色分类:暗黑色',0.00,175.00,4,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'50*60 轻奢金画框 暗黑色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 50*60 轻奢金画框 暗黑色 ',0,0,0,0,0), +(381,72,'尺寸:60*80;外框类型:轻奢金画框;颜色分类:暗黑色',0.00,182.00,5,NULL,'2019-04-26 17:01:57','2019-04-26 17:01:57',NULL,NULL,NULL,'60*80 轻奢金画框 暗黑色 ','餐厅装饰画现代简约饭厅挂画墙面壁画好好吃饭 60*80 轻奢金画框 暗黑色 ',0,0,0,1,0), +(382,71,'颜色:真爱粉;尺寸:3.5英寸',0.00,0.00,0,NULL,'2019-04-26 17:49:28','2019-04-26 17:49:28',NULL,NULL,'2019/04/e50714c046364201a49120774f12b664.jpg','真爱粉 3.5英寸 ','旗舰店官网 自拍神器 梵高定制 真爱粉 3.5英寸 ',0,0,0,1,1), +(383,71,'颜色:心水金;尺寸:3.5英寸',0.00,0.00,0,NULL,'2019-04-26 17:49:28','2019-04-26 17:49:28',NULL,NULL,'2019/04/55121264771049828f024c3d79070381.jpg','心水金 3.5英寸 ','旗舰店官网 自拍神器 梵高定制 心水金 3.5英寸 ',0,0,0,1,1), +(384,71,'颜色:心水金;尺寸:3.6 寸',0.00,6999.00,100,NULL,'2019-04-26 18:02:37','2019-04-26 18:02:37',NULL,NULL,'2019/04/a570dfccaedd45adbb91cbfb2e1c5553.jpg','心水金 3.6 寸 ','旗舰店官网 自拍神器 梵高定制 心水金 3.6 寸 ',0,0,0,1,0), +(385,71,'颜色:真爱粉;尺寸:3.6 寸',0.00,6998.00,79,NULL,'2019-06-24 09:36:33','2019-04-26 18:02:37',NULL,NULL,'2019/04/17ba70d217644839a381df0dc3682b11.jpg','真爱粉 3.6 寸 ','旗舰店官网 自拍神器 梵高定制 真爱粉 3.6 寸 ',11,0,0,1,0), +(386,70,'馅料:绿豆馅',0.00,0.00,0,NULL,'2019-04-26 18:03:32','2019-04-26 18:03:32',NULL,NULL,NULL,'绿豆馅 ','面包面包',0,0,0,1,1), +(387,70,'馅料:绿豆馅',0.00,0.00,0,NULL,'2019-04-26 18:04:39','2019-04-26 18:04:39',NULL,NULL,NULL,'绿豆馅 ','面包面包',0,0,0,1,1), +(388,70,'馅料:绿豆馅',0.00,0.00,0,NULL,'2019-04-26 18:05:18','2019-04-26 18:05:18',NULL,NULL,NULL,'绿豆馅 ','面包面包',0,0,0,1,1), +(389,70,'馅料:绿豆馅',0.00,0.00,0,NULL,'2019-04-26 18:06:04','2019-04-26 18:06:04',NULL,NULL,NULL,'绿豆馅 ','面包面包 绿豆馅 ',0,0,0,1,1), +(390,70,'馅料:111',0.00,0.00,0,NULL,'2019-04-26 18:06:04','2019-04-26 18:06:04',NULL,NULL,NULL,'111 ','面包面包 111 333',0,0,0,1,1), +(391,70,'馅料:222',0.00,0.00,0,NULL,'2019-04-26 18:06:04','2019-04-26 18:06:04',NULL,NULL,NULL,'222 ','面包面包 222 ',0,0,0,1,1), +(392,70,'馅料:绿豆馅',0.00,0.00,0,NULL,'2019-04-26 18:06:15','2019-04-26 18:06:15',NULL,NULL,NULL,'绿豆馅 ','面包面包',0,0,0,1,1), +(393,59,'化妆品含量:400ml',450.00,420.00,62,NULL,'2019-04-26 19:04:28','2019-04-26 19:04:28',NULL,NULL,'2019/04/8ba6bde1cce04d5fb235d700e4dcfbef.jpg','400ml ','兰蔻粉水清滢柔肤水400ml 爽肤水女保湿舒缓滋润嫩肤',0,0,0,1,0), +(394,69,'鞋码:41;颜色分类:原灰白/浅灰/蒸汽绿',0.00,1199.00,3,NULL,'2019-04-26 19:20:31','2019-04-26 19:20:31',NULL,NULL,'2019/04/ac107d12d30e4279b53957fcac7e12e2.jpg','41 原灰白/浅灰/蒸汽绿 ','阿迪达斯官方 adidas 三叶草 NITE JOGGER 男子经典鞋BD7956 41 原灰白/浅灰/蒸汽绿 ',0,0,0,1,0), +(395,69,'鞋码:42;颜色分类:原灰白/浅灰/蒸汽绿',0.00,1199.00,5,NULL,'2019-04-26 19:20:31','2019-04-26 19:20:31',NULL,NULL,'2019/04/73acdb3c367f4c66960d579b70da5b93.jpg','42 原灰白/浅灰/蒸汽绿 ','阿迪达斯官方 adidas 三叶草 NITE JOGGER 男子经典鞋BD7956 42 原灰白/浅灰/蒸汽绿 ',0,0,0,1,0), +(396,69,'鞋码:42.5;颜色分类:原灰白/浅灰/蒸汽绿',0.00,1199.00,5,NULL,'2019-04-26 19:20:31','2019-04-26 19:20:31',NULL,NULL,'2019/04/e57dcc9f1d74498cb11c0a3ceb3c9785.jpg','42.5 原灰白/浅灰/蒸汽绿 ','阿迪达斯官方 adidas 三叶草 NITE JOGGER 男子经典鞋BD7956 42.5 原灰白/浅灰/蒸汽绿 ',0,0,0,1,0), +(397,69,'鞋码:43;颜色分类:原灰白/浅灰/蒸汽绿',0.00,1199.00,7,NULL,'2019-04-26 19:20:31','2019-04-26 19:20:31',NULL,NULL,'2019/04/90ff942af7c949d2a00e4e83c4c24ce7.jpg','43 原灰白/浅灰/蒸汽绿 ','阿迪达斯官方 adidas 三叶草 NITE JOGGER 男子经典鞋BD7956 43 原灰白/浅灰/蒸汽绿 ',0,0,0,1,0), +(398,69,'鞋码:43.5;颜色分类:原灰白/浅灰/蒸汽绿',0.00,1199.00,7,NULL,'2019-04-26 19:20:31','2019-04-26 19:20:31',NULL,NULL,'2019/04/01c585d96f2b4e2b9693833e859afd49.jpg','43.5 原灰白/浅灰/蒸汽绿 ','阿迪达斯官方 adidas 三叶草 NITE JOGGER 男子经典鞋BD7956 43.5 原灰白/浅灰/蒸汽绿 ',0,0,0,1,0), +(399,70,'',0.00,38.00,15,NULL,'2019-04-26 20:56:19','2019-04-26 20:56:19',NULL,NULL,NULL,'','【Dole都乐】比利时Truval啤梨12只 进口水果新鲜梨 单果120g左右',0,0,0,1,0), +(400,73,'规格:芒果味 184克',0.00,22.00,82,10,'2019-06-24 14:52:28','2019-04-27 11:37:12',NULL,NULL,'2019/04/8de2ccaa66874d42986c73692b25f441.jpg','芒果味 184克 ','阴阳师寮办秘制 月见和菓子 184克',22,0,0,1,0), +(401,74,'',120.00,100.00,100,NULL,'2019-05-22 10:39:51','2019-05-22 10:39:51',NULL,NULL,NULL,'','旺仔牛奶',0,1,1,1,0), +(402,75,'',30.00,30.00,30,NULL,'2019-06-19 20:25:10','2019-05-23 17:23:12',NULL,NULL,NULL,'','测试商品A',5,0,0,1,0), +(403,76,'',40.00,40.00,40,NULL,'2019-06-24 14:53:48','2019-05-23 17:24:06',NULL,NULL,NULL,'','测试商品B',5,0,0,1,0), +(404,77,'',60.00,50.00,50,NULL,'2019-05-23 17:24:48','2019-05-23 17:24:48',NULL,NULL,NULL,'','测试商品C',0,0,0,1,0); + +/*Table structure for table `tz_sms_log` */ + +DROP TABLE IF EXISTS `tz_sms_log`; + +CREATE TABLE `tz_sms_log` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `user_id` varchar(50) DEFAULT NULL COMMENT '用户id', + `user_phone` varchar(20) NOT NULL DEFAULT '' COMMENT '手机号码', + `content` varchar(100) NOT NULL DEFAULT '' COMMENT '短信内容', + `mobile_code` varchar(50) NOT NULL DEFAULT '' COMMENT '手机验证码', + `type` int(1) NOT NULL DEFAULT '0' COMMENT '短信类型 1:注册 2:验证', + `rec_date` datetime NOT NULL COMMENT '发送时间', + `response_code` varchar(50) DEFAULT NULL COMMENT '发送短信返回码', + `status` int(1) NOT NULL DEFAULT '0' COMMENT '状态 1:有效 0:失效', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COMMENT='短信记录表'; + +/*Data for the table `tz_sms_log` */ + +insert into `tz_sms_log`(`id`,`user_id`,`user_phone`,`content`,`mobile_code`,`type`,`rec_date`,`response_code`,`status`) values +(15,'25477c53-6f67-4309-9e10-a26876ebfddb','13726236870','感谢您对xxx的支持。您的验证码是129619,请勿把验证码泄漏给第三方。','129619',0,'2019-04-24 11:20:29',NULL,0); + +/*Table structure for table `tz_sys_config` */ + +DROP TABLE IF EXISTS `tz_sys_config`; + +CREATE TABLE `tz_sys_config` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `param_key` varchar(50) DEFAULT NULL COMMENT 'key', + `param_value` varchar(2000) DEFAULT NULL COMMENT 'value', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`), + UNIQUE KEY `key` (`param_key`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='系统配置信息表'; + +/*Data for the table `tz_sys_config` */ + +/*Table structure for table `tz_sys_log` */ + +DROP TABLE IF EXISTS `tz_sys_log`; + +CREATE TABLE `tz_sys_log` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `username` varchar(50) DEFAULT NULL COMMENT '用户名', + `operation` varchar(50) DEFAULT NULL COMMENT '用户操作', + `method` varchar(200) DEFAULT NULL COMMENT '请求方法', + `params` varchar(5000) DEFAULT NULL COMMENT '请求参数', + `time` bigint(20) NOT NULL COMMENT '执行时长(毫秒)', + `ip` varchar(64) DEFAULT NULL COMMENT 'IP地址', + `create_date` datetime DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=843 DEFAULT CHARSET=utf8 COMMENT='系统日志'; + +/*Data for the table `tz_sys_log` */ + +insert into `tz_sys_log`(`id`,`username`,`operation`,`method`,`params`,`time`,`ip`,`create_date`) values +(829,'admin','保存定时任务','com.yami.shop.quartz.controller.ScheduleJobController.save()','{\"jobId\":14,\"beanName\":\"orderTask\",\"methodName\":\"cancelOrder\",\"cronExpression\":\"0 * * * * ?\",\"status\":0,\"remark\":\"取消超时未支付订单\",\"createTime\":\"2019-06-24T06:51:51.074+0000\"}',167,'127.0.0.1','2019-06-24 14:51:51'), +(830,'admin','保存定时任务','com.yami.shop.quartz.controller.ScheduleJobController.save()','{\"jobId\":16,\"beanName\":\"orderTask\",\"methodName\":\"confirmOrder\",\"cronExpression\":\"0 0/5 * * * ?\",\"status\":0,\"remark\":\"系统自动确认收货订单\",\"createTime\":\"2019-06-24T06:52:47.482+0000\"}',62,'127.0.0.1','2019-06-24 14:52:48'), +(831,'admin','删除菜单','com.yami.shop.sys.controller.SysMenuController.delete()','168',8,'127.0.0.1','2019-06-26 14:04:22'), +(832,'admin','删除菜单','com.yami.shop.sys.controller.SysMenuController.delete()','229',1,'127.0.0.1','2019-06-26 14:31:31'), +(833,'admin','删除菜单','com.yami.shop.sys.controller.SysMenuController.delete()','231',6,'127.0.0.1','2019-06-26 14:31:37'), +(834,'admin','删除菜单','com.yami.shop.sys.controller.SysMenuController.delete()','232',8,'127.0.0.1','2019-06-26 14:31:38'), +(835,'admin','删除菜单','com.yami.shop.sys.controller.SysMenuController.delete()','233',25,'127.0.0.1','2019-06-26 14:31:42'), +(836,'admin','删除菜单','com.yami.shop.sys.controller.SysMenuController.delete()','229',6,'127.0.0.1','2019-06-26 14:31:46'), +(837,'admin','删除分类','com.yami.shop.admin.controller.CategoryController.delete()','92',536,'127.0.0.1','2019-07-01 11:14:38'), +(838,'admin','保存角色','com.yami.shop.sys.controller.SysRoleController.save()','{\"roleId\":1,\"roleName\":\"管理员\",\"remark\":\"测试\",\"menuIdList\":[34,70,71,72,73,74,75,136,137,138,139,140,239,240,241,242,243,306,307,308,309,310,51,57,58,59,60,63,300,301,302,303,305,131,132,133,134,135,163,164,165,166,167,174,175,176,177,178,201,202,203,204,205,206,125,126,127,128,129,130,230,91,92,93,99,100,101,107,108,146,184,185,1,312,313,314,315,316,2,15,16,17,18,3,19,20,21,22,4,23,24,25,26,6,7,8,9,10,11,12,13,14,27,29,-666666],\"createTime\":\"2019-07-03T00:39:49.339+0000\"}',106,'127.0.0.1','2019-07-03 08:39:49'), +(839,'admin','保存配置','com.yami.shop.sys.controller.SysConfigController.save()','{\"id\":1,\"paramKey\":\"测试\",\"paramValue\":\"1\",\"remark\":\"1\"}',17,'127.0.0.1','2019-07-03 08:57:59'), +(840,'admin','删除配置','com.yami.shop.sys.controller.SysConfigController.delete()','[1]',18,'127.0.0.1','2019-07-03 08:58:20'), +(841,'admin','新增公告管理','com.yami.shop.admin.controller.NoticeController.save()','{\"id\":4,\"shopId\":1,\"title\":\"测试\",\"content\":\"

1111

\",\"status\":1,\"isTop\":1,\"publishTime\":\"2019-07-03T02:05:55.730+0000\",\"updateTime\":\"2019-07-03T02:05:55.730+0000\"}',26,'127.0.0.1','2019-07-03 10:05:56'), +(842,'admin','删除公告管理','com.yami.shop.admin.controller.NoticeController.removeById()','4',37,'127.0.0.1','2019-07-03 20:00:24'); + +/*Table structure for table `tz_sys_menu` */ + +DROP TABLE IF EXISTS `tz_sys_menu`; + +CREATE TABLE `tz_sys_menu` ( + `menu_id` bigint(20) NOT NULL AUTO_INCREMENT, + `parent_id` bigint(20) DEFAULT NULL COMMENT '父菜单ID,一级菜单为0', + `name` varchar(50) DEFAULT NULL COMMENT '菜单名称', + `url` varchar(200) DEFAULT NULL COMMENT '菜单URL', + `perms` varchar(500) DEFAULT NULL COMMENT '授权(多个用逗号分隔,如:user:list,user:create)', + `type` int(11) DEFAULT NULL COMMENT '类型 0:目录 1:菜单 2:按钮', + `icon` varchar(50) DEFAULT NULL COMMENT '菜单图标', + `order_num` int(11) DEFAULT NULL COMMENT '排序', + PRIMARY KEY (`menu_id`) +) ENGINE=InnoDB AUTO_INCREMENT=317 DEFAULT CHARSET=utf8 COMMENT='菜单管理'; + +/*Data for the table `tz_sys_menu` */ + +insert into `tz_sys_menu`(`menu_id`,`parent_id`,`name`,`url`,`perms`,`type`,`icon`,`order_num`) values +(1,0,'系统管理','','',0,'system',3), +(2,1,'管理员列表','sys/user','',1,'admin',1), +(3,1,'角色管理','sys/role','',1,'role',2), +(4,1,'菜单管理','sys/menu','',1,'menu',3), +(6,1,'定时任务','sys/schedule','',1,'job',5), +(7,6,'查看',NULL,'sys:schedule:page,sys:schedule:info',2,NULL,0), +(8,6,'新增',NULL,'sys:schedule:save',2,NULL,0), +(9,6,'修改',NULL,'sys:schedule:update',2,NULL,0), +(10,6,'删除',NULL,'sys:schedule:delete',2,NULL,0), +(11,6,'暂停',NULL,'sys:schedule:pause',2,NULL,0), +(12,6,'恢复',NULL,'sys:schedule:resume',2,NULL,0), +(13,6,'立即执行',NULL,'sys:schedule:run',2,NULL,0), +(14,6,'日志列表',NULL,'sys:schedule:log',2,NULL,0), +(15,2,'查看',NULL,'sys:user:page,sys:user:info',2,NULL,0), +(16,2,'新增','','sys:user:save,sys:role:list',2,'',1), +(17,2,'修改','','sys:user:update,sys:role:list',2,'',2), +(18,2,'删除','','sys:user:delete',2,'',3), +(19,3,'查看',NULL,'sys:role:page,sys:role:info',2,NULL,0), +(20,3,'新增',NULL,'sys:role:save,sys:menu:list',2,NULL,0), +(21,3,'修改',NULL,'sys:role:update,sys:menu:list',2,NULL,0), +(22,3,'删除',NULL,'sys:role:delete',2,NULL,0), +(23,4,'查看',NULL,'sys:menu:list,sys:menu:info',2,NULL,0), +(24,4,'新增',NULL,'sys:menu:save,sys:menu:select',2,NULL,0), +(25,4,'修改',NULL,'sys:menu:update,sys:menu:select',2,NULL,0), +(26,4,'删除',NULL,'sys:menu:delete',2,NULL,0), +(27,1,'参数管理','sys/config','sys:config:page,sys:config:info,sys:config:save,sys:config:update,sys:config:delete',1,'config',6), +(29,1,'系统日志','sys/log','sys:log:page',1,'log',7), +(34,0,'产品管理','','',0,'admin',0), +(51,34,'规格管理','prod/spec','',1,'',2), +(57,51,'查看','','prod:spec:page',2,'',0), +(58,51,'添加','','prod:spec:save',2,'',1), +(59,51,'修改','','prod:spec:update,prod:spec:info',2,'',2), +(60,51,'删除','','prod:spec:delete',2,'',3), +(63,0,'门店管理','','',0,'store',0), +(70,34,'产品管理','prod/prodList','',1,NULL,0), +(71,70,'产品管理','','prod:prod:page',2,NULL,0), +(72,70,'查看产品','','prod:prod:info',2,NULL,0), +(73,70,'新增产品','','prod:prod:save',2,NULL,0), +(74,70,'修改产品','','prod:prod:update',2,NULL,0), +(75,70,'删除产品','','prod:prod:delete',2,NULL,0), +(91,0,'订单管理','','',0,'order',2), +(92,91,'订单管理','order/order','',1,NULL,1), +(93,92,'查看','','order:order:page',2,NULL,0), +(99,92,'保存','','order:order:save',2,NULL,0), +(100,92,'修改','','order:order:update',2,NULL,0), +(101,92,'删除','','order:order:delete',2,NULL,0), +(107,92,'详情','','order:order:info',2,NULL,0), +(108,92,'支付','','order:order:pay',2,NULL,0), +(125,0,'会员管理','','',0,'vip',0), +(126,125,'会员管理','user/user','',1,NULL,0), +(127,126,'查看','','admin:user:page',2,NULL,0), +(128,126,'新增','','admin:user:save',2,NULL,0), +(129,126,'修改','','admin:user:update,admin:user:info',2,NULL,0), +(130,126,'删除','','admin:user:delete',2,NULL,0), +(131,63,'自提点管理','shop/pickAddr','',1,'',0), +(132,131,'查看','','shop:pickAddr:page',2,NULL,0), +(133,131,'保存','','shop:pickAddr:save',2,NULL,0), +(134,131,'修改','','shop:pickAddr:update,shop:pickAddr:info',2,NULL,0), +(135,131,'删除','','shop:pickAddr:delete',2,NULL,0), +(136,34,'分类管理','prod/category','',1,NULL,0), +(137,136,'查看','','prod:category:page',2,NULL,0), +(138,136,'新增','','prod:category:save',2,NULL,0), +(139,136,'修改','','prod:category:info,prod:category:update',2,NULL,0), +(140,136,'删除','','prod:category:delete',2,NULL,0), +(146,92,'发货','','order:order:delivery',2,'',0), +(163,63,'运费模板','shop/transport','',1,NULL,0), +(164,163,'查看','','shop:transport:page,shop:shopDetail:info,shop:transfee:info,admin:area:page,shop:transcity:info',2,'',0), +(165,163,'修改','','shop:transport:update,shop:transport:info,shop:transfee:update,admin:area:page',2,'',0), +(166,163,'新增','','shop:transport:save,shop:transfee:save',2,'',0), +(167,163,'删除','','shop:transport:delete,shop:transfee:delete',2,'',0), +(174,63,'轮播图管理','admin/indexImg','',1,'',0), +(175,174,'查看','','admin:indexImg:page',2,'',0), +(176,174,'新增','','admin:indexImg:save',2,'',0), +(177,174,'修改','','admin:indexImg:info,admin:indexImg:update',2,'',0), +(178,174,'删除','','admin:indexImg:delete',2,'',0), +(184,92,'导出待发货订单','','order:order:waitingConsignmentExcel',2,'',0), +(185,92,'导出销售记录','','order:order:soldExcel',2,'',0), +(201,63,'热搜管理','shop/hotSearch','',1,'',0), +(202,201,'查询热搜','','admin:hotSearch:page',2,'',0), +(203,201,'查询热搜详情','','admin:hotSearch:page',2,'',0), +(204,201,'添加热搜','','admin:hotSearch:save',2,'',0), +(205,201,'修改热搜','','admin:hotSearch:update',2,'',0), +(206,201,'删除热搜','','admin:hotSearch:delete',2,'',0), +(230,126,'添加','','user:addr:save',2,'',0), +(239,34,'分组管理','prod/prodTag','prod:prodTag',1,'',0), +(240,239,'添加商品分组','','prod:prodTag:save',2,'',0), +(241,239,'修改商品分组','','prod:prodTag:update',2,'',0), +(242,239,'删除商品分组','','prod:prodTag:delete',2,'',0), +(243,239,'查看商品分组','','prod:prodTag:info,prod:prodTag:page',2,'',0), +(300,63,'公告管理','shop/notice','',1,'',0), +(301,300,'添加公告','','shop:notice:save',2,'',0), +(302,300,'修改公告','','shop:notice:update',2,'',0), +(303,300,'查看公告','','shop:notice:info,shop:notice:page',2,'',0), +(305,300,'删除公告','','shop:notice:delete',2,'',0), +(306,34,'评论管理','prod/prodComm','',1,'',1), +(307,306,'查看','','prod:prodComm:page,prod:prodComm:info',2,'',0), +(308,306,'添加','','prod:prodComm:save',2,'',0), +(309,306,'修改','','prod:prodComm:update',2,'',0), +(310,306,'删除','','prod:prodComm:delete',2,'',0), +(312,1,'地址管理','sys/area','',1,'dangdifill',0), +(313,312,'新增地址','','admin:area:save',2,'',0), +(314,312,'修改地址','','admin:area:update',2,'',0), +(315,312,'删除地址','','admin:area:delete',2,'',0), +(316,312,'查看地址','','admin:area:info,admin:area:page,admin:area:list',2,'',0); + +/*Table structure for table `tz_sys_role` */ + +DROP TABLE IF EXISTS `tz_sys_role`; + +CREATE TABLE `tz_sys_role` ( + `role_id` bigint(20) NOT NULL AUTO_INCREMENT, + `role_name` varchar(100) DEFAULT NULL COMMENT '角色名称', + `remark` varchar(100) DEFAULT NULL COMMENT '备注', + `create_user_id` bigint(20) DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`role_id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='角色'; + +/*Data for the table `tz_sys_role` */ + +insert into `tz_sys_role`(`role_id`,`role_name`,`remark`,`create_user_id`,`create_time`) values +(1,'管理员','测试',NULL,'2019-07-03 08:39:49'); + +/*Table structure for table `tz_sys_role_menu` */ + +DROP TABLE IF EXISTS `tz_sys_role_menu`; + +CREATE TABLE `tz_sys_role_menu` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `role_id` bigint(20) DEFAULT NULL COMMENT '角色ID', + `menu_id` bigint(20) DEFAULT NULL COMMENT '菜单ID', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=106 DEFAULT CHARSET=utf8 COMMENT='角色与菜单对应关系'; + +/*Data for the table `tz_sys_role_menu` */ + +insert into `tz_sys_role_menu`(`id`,`role_id`,`menu_id`) values +(1,1,34), +(2,1,70), +(3,1,71), +(4,1,72), +(5,1,73), +(6,1,74), +(7,1,75), +(8,1,136), +(9,1,137), +(10,1,138), +(11,1,139), +(12,1,140), +(13,1,239), +(14,1,240), +(15,1,241), +(16,1,242), +(17,1,243), +(18,1,306), +(19,1,307), +(20,1,308), +(21,1,309), +(22,1,310), +(23,1,51), +(24,1,57), +(25,1,58), +(26,1,59), +(27,1,60), +(28,1,63), +(29,1,300), +(30,1,301), +(31,1,302), +(32,1,303), +(33,1,305), +(34,1,131), +(35,1,132), +(36,1,133), +(37,1,134), +(38,1,135), +(39,1,163), +(40,1,164), +(41,1,165), +(42,1,166), +(43,1,167), +(44,1,174), +(45,1,175), +(46,1,176), +(47,1,177), +(48,1,178), +(49,1,201), +(50,1,202), +(51,1,203), +(52,1,204), +(53,1,205), +(54,1,206), +(55,1,125), +(56,1,126), +(57,1,127), +(58,1,128), +(59,1,129), +(60,1,130), +(61,1,230), +(62,1,91), +(63,1,92), +(64,1,93), +(65,1,99), +(66,1,100), +(67,1,101), +(68,1,107), +(69,1,108), +(70,1,146), +(71,1,184), +(72,1,185), +(73,1,1), +(74,1,312), +(75,1,313), +(76,1,314), +(77,1,315), +(78,1,316), +(79,1,2), +(80,1,15), +(81,1,16), +(82,1,17), +(83,1,18), +(84,1,3), +(85,1,19), +(86,1,20), +(87,1,21), +(88,1,22), +(89,1,4), +(90,1,23), +(91,1,24), +(92,1,25), +(93,1,26), +(94,1,6), +(95,1,7), +(96,1,8), +(97,1,9), +(98,1,10), +(99,1,11), +(100,1,12), +(101,1,13), +(102,1,14), +(103,1,27), +(104,1,29), +(105,1,-666666); + +/*Table structure for table `tz_sys_user` */ + +DROP TABLE IF EXISTS `tz_sys_user`; + +CREATE TABLE `tz_sys_user` ( + `user_id` bigint(20) NOT NULL AUTO_INCREMENT, + `username` varchar(50) NOT NULL COMMENT '用户名', + `password` varchar(100) DEFAULT NULL COMMENT '密码', + `email` varchar(100) DEFAULT NULL COMMENT '邮箱', + `mobile` varchar(100) DEFAULT NULL COMMENT '手机号', + `status` tinyint(4) DEFAULT NULL COMMENT '状态 0:禁用 1:正常', + `create_user_id` bigint(20) DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `shop_id` bigint(20) DEFAULT NULL COMMENT '用户所在的商城Id', + PRIMARY KEY (`user_id`), + UNIQUE KEY `username` (`username`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='系统用户'; + +/*Data for the table `tz_sys_user` */ + +insert into `tz_sys_user`(`user_id`,`username`,`password`,`email`,`mobile`,`status`,`create_user_id`,`create_time`,`shop_id`) values +(1,'admin','{bcrypt}$2a$10$AV9Xz.3ck4RsXiad5ArcBO5.ZKwlpcnJzs740BHY..fsSp0PnM/Zu','root@123.com','13612345678',1,1,'2016-11-11 11:11:11',1); + +/*Table structure for table `tz_sys_user_role` */ + +DROP TABLE IF EXISTS `tz_sys_user_role`; + +CREATE TABLE `tz_sys_user_role` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `user_id` bigint(20) DEFAULT NULL COMMENT '用户ID', + `role_id` bigint(20) DEFAULT NULL COMMENT '角色ID', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户与角色对应关系'; + +/*Data for the table `tz_sys_user_role` */ + +/*Table structure for table `tz_transcity` */ + +DROP TABLE IF EXISTS `tz_transcity`; + +CREATE TABLE `tz_transcity` ( + `transcity_id` bigint(20) NOT NULL AUTO_INCREMENT, + `transfee_id` bigint(20) DEFAULT NULL COMMENT '运费项id', + `city_id` bigint(20) DEFAULT NULL COMMENT '城市id', + PRIMARY KEY (`transcity_id`), + KEY `transfee_id` (`transfee_id`), + KEY `city_id` (`city_id`) +) ENGINE=InnoDB AUTO_INCREMENT=667 DEFAULT CHARSET=utf8; + +/*Data for the table `tz_transcity` */ + +insert into `tz_transcity`(`transcity_id`,`transfee_id`,`city_id`) values +(655,119,440118000000), +(656,119,440117000000), +(657,119,440115000000), +(658,119,440114000000), +(659,119,440113000000), +(660,119,440112000000), +(661,119,440111000000), +(662,119,440106000000), +(663,119,440105000000), +(664,119,440104000000), +(665,119,440103000000), +(666,119,440101000000); + +/*Table structure for table `tz_transcity_free` */ + +DROP TABLE IF EXISTS `tz_transcity_free`; + +CREATE TABLE `tz_transcity_free` ( + `transcity_free_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '指定条件包邮城市项id', + `transfee_free_id` bigint(20) DEFAULT NULL COMMENT '指定条件包邮项id', + `free_city_id` bigint(20) DEFAULT NULL COMMENT '城市id', + PRIMARY KEY (`transcity_free_id`), + KEY `transfee_free_id` (`transfee_free_id`), + KEY `city_id` (`free_city_id`) +) ENGINE=InnoDB AUTO_INCREMENT=2326 DEFAULT CHARSET=utf8; + +/*Data for the table `tz_transcity_free` */ + +insert into `tz_transcity_free`(`transcity_free_id`,`transfee_free_id`,`free_city_id`) values +(18,NULL,52994), +(19,NULL,52995), +(339,32,2376), +(1351,49,72), +(1352,49,2800), +(1353,49,2801), +(1354,49,2802), +(1355,49,2803), +(1356,49,2804), +(1357,49,2805), +(1358,49,2806), +(1359,49,2807), +(1360,49,2808), +(1361,49,2809), +(1362,49,2810), +(1363,49,2812), +(1364,49,2814), +(1365,49,2816), +(1366,49,2901), +(1367,49,2953), +(1368,49,3065), +(1369,49,78), +(1370,49,2813), +(1371,49,2815), +(1372,49,2817), +(1373,49,2820), +(1374,49,2822), +(1375,49,2823), +(1376,49,2824), +(1377,49,2825), +(1378,49,2826), +(1379,49,2830), +(1380,49,2833), +(1381,49,2834), +(1382,49,2835), +(1383,49,2837), +(1384,49,2841), +(1385,49,2919), +(1386,49,51035), +(1387,49,51036), +(1388,49,51037), +(1389,49,51038), +(1390,49,51039), +(1391,49,51040), +(1392,49,51041), +(1393,49,51042), +(1394,49,51043), +(1395,49,51044), +(1396,49,51045), +(1397,49,51046), +(1398,49,51047), +(1399,49,51048), +(1400,49,51049), +(1401,49,51050), +(1402,49,51051), +(1403,49,51052), +(1404,49,113), +(1405,49,114), +(1406,49,115), +(1407,49,119), +(1408,49,123), +(1409,49,126), +(1410,49,128), +(1411,49,129), +(1412,49,130), +(1413,49,131), +(1414,49,132), +(1415,49,133), +(1416,49,134), +(1417,49,135), +(1418,49,136), +(1419,49,137), +(1420,49,138), +(1421,49,139), +(1422,49,140), +(1423,49,141), +(1424,49,4164), +(1425,49,48131), +(1426,49,48132), +(1427,49,48133), +(1428,49,48201), +(1429,49,48202), +(1430,49,48203), +(1431,49,48204), +(1432,49,48205), +(1433,49,48206), +(1434,49,48207), +(1435,49,50950), +(1436,49,50951), +(1437,49,50952), +(1438,49,50953), +(1439,49,50954), +(1440,49,50995), +(1441,49,51026), +(1442,49,51027), +(1443,49,51028), +(1444,49,142), +(1445,49,148), +(1446,49,164), +(1447,49,199), +(1448,49,224), +(1449,49,239), +(1450,49,248), +(1451,49,258), +(1452,49,264), +(1453,49,274), +(1454,49,275), +(1455,49,412), +(1456,49,420), +(1457,49,427), +(1458,49,438), +(1459,49,446), +(1460,49,454), +(1461,49,458), +(1462,49,468), +(1463,49,475), +(1464,49,482), +(1465,49,489), +(1466,49,495), +(1467,49,502), +(1468,49,517), +(1469,49,527), +(1470,49,538), +(1471,49,549), +(1472,49,2780), +(1473,49,904), +(1474,49,911), +(1475,49,919), +(1476,49,925), +(1477,49,933), +(1478,49,939), +(1479,49,951), +(1480,49,959), +(1481,49,965), +(1482,49,972), +(1483,49,978), +(1484,49,984), +(1485,49,988), +(1486,49,1114), +(1487,49,1116), +(1488,49,1121), +(1489,49,1124), +(1490,49,1127), +(1491,49,1132), +(1492,49,1137), +(1493,49,1140), +(1494,49,1151), +(1495,49,1159), +(1496,49,1167), +(1497,49,1174), +(1498,49,1180), +(1499,49,1201), +(1500,49,1206), +(1501,49,2971), +(1502,49,1158), +(1503,49,1213), +(1504,49,1233), +(1505,49,1243), +(1506,49,1250), +(1507,49,1255), +(1508,49,1262), +(1509,49,1273), +(1510,49,1280), +(1511,49,1290), +(1512,49,1298), +(1513,49,1303), +(1514,49,1315), +(1515,49,1317), +(1516,49,1329), +(1517,49,1332), +(1518,49,1341), +(1519,49,1352), +(1520,49,1362), +(1521,49,1370), +(1522,49,1381), +(1523,49,1387), +(1524,49,1396), +(1525,49,1405), +(1526,49,1413), +(1527,49,1421), +(1528,49,1432), +(1529,49,1441), +(1530,49,1458), +(1531,49,1466), +(1532,49,1475), +(1533,49,1477), +(1534,49,1479), +(1535,49,2922), +(1536,49,2980), +(1537,49,2983), +(1538,49,3154), +(1539,49,1482), +(1540,49,1488), +(1541,49,1495), +(1542,49,1501), +(1543,49,1511), +(1544,49,1522), +(1545,49,1530), +(1546,49,1540), +(1547,49,1544), +(1548,49,1555), +(1549,49,1560), +(1550,49,1574), +(1551,49,1586), +(1552,49,1592), +(1553,49,1601), +(1554,49,1607), +(1555,49,1609), +(1556,49,1611), +(1557,49,1617), +(1558,49,1627), +(1559,49,1634), +(1560,49,1643), +(1561,49,1650), +(1562,49,1655), +(1563,49,1657), +(1564,49,1659), +(1565,49,1666), +(1566,49,1672), +(1567,49,1677), +(1568,49,1684), +(1569,49,1690), +(1570,49,1698), +(1571,49,1704), +(1572,49,1705), +(1573,49,1709), +(1574,49,1715), +(1575,49,1720), +(1576,49,1726), +(1577,49,1740), +(1578,49,1746), +(1579,49,1749), +(1580,49,1753), +(1581,49,1757), +(1582,49,1761), +(1583,49,1792), +(1584,49,1806), +(1585,49,1818), +(1586,49,3044), +(1587,49,3168), +(1588,49,1827), +(1589,49,1832), +(1590,49,1836), +(1591,49,1842), +(1592,49,1845), +(1593,49,1857), +(1594,49,1861), +(1595,49,1874), +(1596,49,1885), +(1597,49,1898), +(1598,49,1911), +(1599,49,1930), +(1600,49,1946), +(1601,49,1950), +(1602,49,1954), +(1603,49,1960), +(1604,49,1962), +(1605,49,1977), +(1606,49,1983), +(1607,49,1988), +(1608,49,1993), +(1609,49,2005), +(1610,49,2016), +(1611,49,2022), +(1612,49,2033), +(1613,49,2042), +(1614,49,2047), +(1615,49,2058), +(1616,49,2065), +(1617,49,2070), +(1618,49,2084), +(1619,49,2103), +(1620,49,2121), +(1621,49,3034), +(1622,49,3115), +(1623,49,3137), +(1624,49,3173), +(1625,49,3690), +(1626,49,3698), +(1627,49,3699), +(1628,49,3701), +(1629,49,3702), +(1630,49,3703), +(1631,49,3704), +(1632,49,3705), +(1633,49,3706), +(1634,49,3707), +(1635,49,3708), +(1636,49,3709), +(1637,49,3710), +(1638,49,3711), +(1639,49,2144), +(1640,49,2150), +(1641,49,2155), +(1642,49,2169), +(1643,49,2180), +(1644,49,2189), +(1645,49,2196), +(1646,49,2205), +(1647,49,2222), +(1648,49,2235), +(1649,49,2247), +(1650,49,2258), +(1651,49,2270), +(1652,49,2281), +(1653,49,2291), +(1654,49,2298), +(1655,49,2304), +(1656,49,2309), +(1657,49,2318), +(1658,49,2332), +(1659,49,2336), +(1660,49,2347), +(1661,49,2360), +(1662,49,2366), +(1663,49,4108), +(1975,51,72), +(1976,51,2800), +(1977,51,2801), +(1978,51,2802), +(1979,51,2803), +(1980,51,2804), +(1981,51,2805), +(1982,51,2806), +(1983,51,2807), +(1984,51,2808), +(1985,51,2809), +(1986,51,2810), +(1987,51,2812), +(1988,51,2814), +(1989,51,2816), +(1990,51,2901), +(1991,51,2953), +(1992,51,3065), +(1993,51,78), +(1994,51,2813), +(1995,51,2815), +(1996,51,2817), +(1997,51,2820), +(1998,51,2822), +(1999,51,2823), +(2000,51,2824), +(2001,51,2825), +(2002,51,2826), +(2003,51,2830), +(2004,51,2833), +(2005,51,2834), +(2006,51,2835), +(2007,51,2837), +(2008,51,2841), +(2009,51,2919), +(2010,51,51035), +(2011,51,51036), +(2012,51,51037), +(2013,51,51038), +(2014,51,51039), +(2015,51,51040), +(2016,51,51041), +(2017,51,51042), +(2018,51,51043), +(2019,51,51044), +(2020,51,51045), +(2021,51,51046), +(2022,51,51047), +(2023,51,51048), +(2024,51,51049), +(2025,51,51050), +(2026,51,51051), +(2027,51,51052), +(2028,51,113), +(2029,51,114), +(2030,51,115), +(2031,51,119), +(2032,51,123), +(2033,51,126), +(2034,51,128), +(2035,51,129), +(2036,51,130), +(2037,51,131), +(2038,51,132), +(2039,51,133), +(2040,51,134), +(2041,51,135), +(2042,51,136), +(2043,51,137), +(2044,51,138), +(2045,51,139), +(2046,51,140), +(2047,51,141), +(2048,51,4164), +(2049,51,48131), +(2050,51,48132), +(2051,51,48133), +(2052,51,48201), +(2053,51,48202), +(2054,51,48203), +(2055,51,48204), +(2056,51,48205), +(2057,51,48206), +(2058,51,48207), +(2059,51,50950), +(2060,51,50951), +(2061,51,50952), +(2062,51,50953), +(2063,51,50954), +(2064,51,50995), +(2065,51,51026), +(2066,51,51027), +(2067,51,51028), +(2068,51,142), +(2069,51,148), +(2070,51,164), +(2071,51,199), +(2072,51,224), +(2073,51,239), +(2074,51,248), +(2075,51,258), +(2076,51,264), +(2077,51,274), +(2078,51,275), +(2079,51,412), +(2080,51,420), +(2081,51,427), +(2082,51,438), +(2083,51,446), +(2084,51,454), +(2085,51,458), +(2086,51,468), +(2087,51,475), +(2088,51,482), +(2089,51,489), +(2090,51,495), +(2091,51,502), +(2092,51,517), +(2093,51,527), +(2094,51,538), +(2095,51,549), +(2096,51,2780), +(2097,51,904), +(2098,51,911), +(2099,51,919), +(2100,51,925), +(2101,51,933), +(2102,51,939), +(2103,51,951), +(2104,51,959), +(2105,51,965), +(2106,51,972), +(2107,51,978), +(2108,51,984), +(2109,51,988), +(2110,51,1000), +(2111,51,1007), +(2112,51,1016), +(2113,51,1022), +(2114,51,1025), +(2115,51,1032), +(2116,51,1042), +(2117,51,1053), +(2118,51,1058), +(2119,51,1060), +(2120,51,1072), +(2121,51,1081), +(2122,51,1090), +(2123,51,1099), +(2124,51,1108), +(2125,51,1112), +(2126,51,2900), +(2127,51,1114), +(2128,51,1116), +(2129,51,1121), +(2130,51,1124), +(2131,51,1127), +(2132,51,1132), +(2133,51,1137), +(2134,51,1140), +(2135,51,1151), +(2136,51,1159), +(2137,51,1167), +(2138,51,1174), +(2139,51,1180), +(2140,51,1201), +(2141,51,1206), +(2142,51,2971), +(2143,51,1158), +(2144,51,1213), +(2145,51,1233), +(2146,51,1243), +(2147,51,1250), +(2148,51,1255), +(2149,51,1262), +(2150,51,1273), +(2151,51,1280), +(2152,51,1290), +(2153,51,1298), +(2154,51,1303), +(2155,51,1315), +(2156,51,1317), +(2157,51,1329), +(2158,51,1332), +(2159,51,1341), +(2160,51,1352), +(2161,51,1362), +(2162,51,1370), +(2163,51,1381), +(2164,51,1387), +(2165,51,1396), +(2166,51,1405), +(2167,51,1413), +(2168,51,1421), +(2169,51,1432), +(2170,51,1441), +(2171,51,1458), +(2172,51,1466), +(2173,51,1475), +(2174,51,1477), +(2175,51,1479), +(2176,51,2922), +(2177,51,2980), +(2178,51,2983), +(2179,51,3154), +(2180,51,1482), +(2181,51,1488), +(2182,51,1495), +(2183,51,1501), +(2184,51,1511), +(2185,51,1522), +(2186,51,1530), +(2187,51,1540), +(2188,51,1544), +(2189,51,1555), +(2190,51,1560), +(2191,51,1574), +(2192,51,1586), +(2193,51,1592), +(2194,51,1601), +(2195,51,1607), +(2196,51,1609), +(2197,51,1611), +(2198,51,1617), +(2199,51,1627), +(2200,51,1634), +(2201,51,1643), +(2202,51,1650), +(2203,51,1655), +(2204,51,1657), +(2205,51,1659), +(2206,51,1666), +(2207,51,1672), +(2208,51,1677), +(2209,51,1684), +(2210,51,1690), +(2211,51,1698), +(2212,51,1704), +(2213,51,1705), +(2214,51,1709), +(2215,51,1715), +(2216,51,1720), +(2217,51,1726), +(2218,51,1740), +(2219,51,1746), +(2220,51,1749), +(2221,51,1753), +(2222,51,1757), +(2223,51,1761), +(2224,51,1792), +(2225,51,1806), +(2226,51,1818), +(2227,51,3044), +(2228,51,3168), +(2229,51,1827), +(2230,51,1832), +(2231,51,1836), +(2232,51,1842), +(2233,51,1845), +(2234,51,1857), +(2235,51,1861), +(2236,51,1874), +(2237,51,1885), +(2238,51,1898), +(2239,51,1911), +(2240,51,1930), +(2241,51,1946), +(2242,51,1950), +(2243,51,1954), +(2244,51,1960), +(2245,51,1962), +(2246,51,1977), +(2247,51,1983), +(2248,51,1988), +(2249,51,1993), +(2250,51,2005), +(2251,51,2016), +(2252,51,2022), +(2253,51,2033), +(2254,51,2042), +(2255,51,2047), +(2256,51,2058), +(2257,51,2065), +(2258,51,2070), +(2259,51,2084), +(2260,51,2103), +(2261,51,2144), +(2262,51,2150), +(2263,51,2155), +(2264,51,2169), +(2265,51,2180), +(2266,51,2189), +(2267,51,2196), +(2268,51,2205), +(2269,51,2222), +(2270,51,2235), +(2271,51,2247), +(2272,51,2258), +(2273,51,2270), +(2274,51,2281), +(2275,51,2291), +(2276,51,2298), +(2277,51,2304), +(2278,51,2309), +(2279,51,2318), +(2280,51,2332), +(2281,51,2336), +(2282,51,2347), +(2283,51,2360), +(2284,51,2366), +(2285,51,4108), +(2286,58,24145), +(2287,58,24146), +(2288,58,24147), +(2289,58,24148), +(2290,58,24149), +(2291,58,24150), +(2292,58,24151), +(2293,58,24152), +(2294,58,24153), +(2295,58,24154), +(2296,58,24155), +(2297,58,24156), +(2298,58,24157), +(2299,58,24158), +(2300,58,24159), +(2301,58,24160), +(2302,58,24161), +(2303,58,24162), +(2304,58,24163), +(2305,58,24164), +(2306,58,24165), +(2307,58,24166), +(2308,58,24167), +(2309,58,24168), +(2310,58,24169), +(2311,58,24170), +(2312,58,24171), +(2313,58,24172), +(2314,58,51839), +(2315,59,5538), +(2316,60,440301000000), +(2317,60,440303000000), +(2318,60,440304000000), +(2319,60,440305000000), +(2320,60,440306000000), +(2321,60,440307000000), +(2322,60,440308000000), +(2323,60,440309000000), +(2324,60,440310000000), +(2325,60,440311000000); + +/*Table structure for table `tz_transfee` */ + +DROP TABLE IF EXISTS `tz_transfee`; + +CREATE TABLE `tz_transfee` ( + `transfee_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '运费项id', + `transport_id` bigint(20) DEFAULT NULL COMMENT '运费模板id', + `continuous_piece` decimal(15,2) DEFAULT NULL COMMENT '续件数量', + `first_piece` decimal(15,2) DEFAULT NULL COMMENT '首件数量', + `continuous_fee` decimal(15,2) DEFAULT NULL COMMENT '续件费用', + `first_fee` decimal(15,2) DEFAULT NULL COMMENT '首件费用', + PRIMARY KEY (`transfee_id`), + KEY `transport_id` (`transport_id`) +) ENGINE=InnoDB AUTO_INCREMENT=121 DEFAULT CHARSET=utf8; + +/*Data for the table `tz_transfee` */ + +insert into `tz_transfee`(`transfee_id`,`transport_id`,`continuous_piece`,`first_piece`,`continuous_fee`,`first_fee`) values +(101,50,0.02,0.01,1.00,2.00), +(115,47,1.00,1.00,0.00,0.00), +(118,48,7.00,7.00,7.00,7.00), +(119,48,1.00,1.00,1.00,1.00), +(120,51,4.00,7.00,6.00,8.00); + +/*Table structure for table `tz_transfee_free` */ + +DROP TABLE IF EXISTS `tz_transfee_free`; + +CREATE TABLE `tz_transfee_free` ( + `transfee_free_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '指定条件包邮项id', + `transport_id` bigint(20) DEFAULT NULL COMMENT '运费模板id', + `free_type` tinyint(2) DEFAULT NULL COMMENT '包邮方式 (0 满x件/重量/体积包邮 1满金额包邮 2满x件/重量/体积且满金额包邮)', + `amount` decimal(15,2) DEFAULT NULL COMMENT '需满金额', + `piece` decimal(15,2) DEFAULT NULL COMMENT '包邮x件/重量/体积', + PRIMARY KEY (`transfee_free_id`), + KEY `transport_id` (`transport_id`) +) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8; + +/*Data for the table `tz_transfee_free` */ + +insert into `tz_transfee_free`(`transfee_free_id`,`transport_id`,`free_type`,`amount`,`piece`) values +(32,53,1,88.00,NULL), +(49,67,0,NULL,1.75), +(51,68,0,NULL,3.50), +(58,56,0,NULL,10.00), +(59,56,1,10.00,NULL), +(60,51,0,300.00,1.00); + +/*Table structure for table `tz_transport` */ + +DROP TABLE IF EXISTS `tz_transport`; + +CREATE TABLE `tz_transport` ( + `transport_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '运费模板id', + `trans_name` varchar(36) DEFAULT NULL COMMENT '运费模板名称', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `shop_id` bigint(20) DEFAULT NULL COMMENT '店铺id', + `charge_type` tinyint(2) DEFAULT NULL COMMENT '收费方式(0 按件数,1 按重量 2 按体积)', + `is_free_fee` tinyint(2) DEFAULT NULL COMMENT '是否包邮 0:不包邮 1:包邮', + `has_free_condition` tinyint(2) DEFAULT NULL COMMENT '是否含有包邮条件 0 否 1是', + PRIMARY KEY (`transport_id`), + KEY `shop_id` (`shop_id`) +) ENGINE=InnoDB AUTO_INCREMENT=52 DEFAULT CHARSET=utf8; + +/*Data for the table `tz_transport` */ + +insert into `tz_transport`(`transport_id`,`trans_name`,`create_time`,`shop_id`,`charge_type`,`is_free_fee`,`has_free_condition`) values +(47,'包邮','2018-11-21 17:17:07',1,0,1,0), +(48,'广州单独计算运费','2018-11-21 17:20:09',1,0,0,0), +(51,'深圳包邮','2019-04-13 13:42:38',1,0,0,1); + +/*Table structure for table `tz_user` */ + +DROP TABLE IF EXISTS `tz_user`; + +CREATE TABLE `tz_user` ( + `user_id` varchar(36) NOT NULL DEFAULT '' COMMENT 'ID', + `nick_name` varchar(50) DEFAULT NULL COMMENT '用户昵称', + `real_name` varchar(50) DEFAULT NULL COMMENT '真实姓名', + `user_mail` varchar(100) DEFAULT NULL COMMENT '用户邮箱', + `login_password` varchar(50) DEFAULT NULL COMMENT '登录密码', + `pay_password` varchar(50) DEFAULT NULL COMMENT '支付密码', + `user_mobile` varchar(50) DEFAULT NULL COMMENT '手机号码', + `modify_time` datetime NOT NULL COMMENT '修改时间', + `user_regtime` datetime NOT NULL COMMENT '注册时间', + `user_regip` varchar(50) DEFAULT NULL COMMENT '注册IP', + `user_lasttime` datetime DEFAULT NULL COMMENT '最后登录时间', + `user_lastip` varchar(50) DEFAULT NULL COMMENT '最后登录IP', + `user_memo` varchar(500) DEFAULT NULL COMMENT '备注', + `sex` char(1) DEFAULT 'M' COMMENT 'M(男) or F(女)', + `birth_date` char(10) DEFAULT NULL COMMENT '例如:2009-11-27', + `pic` varchar(255) DEFAULT NULL COMMENT '头像图片路径', + `status` int(1) NOT NULL DEFAULT '1' COMMENT '状态 1 正常 0 无效', + `score` int(11) DEFAULT NULL COMMENT '用户积分', + PRIMARY KEY (`user_id`), + UNIQUE KEY `ud_user_mail` (`user_mail`), + UNIQUE KEY `ud_user_unique_mobile` (`user_mobile`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表'; + +/*Data for the table `tz_user` */ + +insert into `tz_user`(`user_id`,`nick_name`,`real_name`,`user_mail`,`login_password`,`pay_password`,`user_mobile`,`modify_time`,`user_regtime`,`user_regip`,`user_lasttime`,`user_lastip`,`user_memo`,`sex`,`birth_date`,`pic`,`status`,`score`) values +('51540df5255e4d22903b0f83921095ff','.','',NULL,NULL,NULL,NULL,'2019-06-26 14:37:04','2019-06-26 14:37:04',NULL,NULL,NULL,NULL,'M',NULL,'https://wx.qlogo.cn/mmopen/vi_32/krmdRqHOnNAFoGzW2Ssy6pmzAMQryWphiaDZU5AsAR0AMvuLzlcBLtjEe8VlUAMIiah8juTPWa839BnOn1C0Oykg/132',1,NULL), +('5f159317be5b4dc4bf3188f1a3da0369','Leo','',NULL,NULL,NULL,NULL,'2019-07-02 10:56:53','2019-07-02 10:56:53',NULL,NULL,NULL,NULL,'M',NULL,'https://wx.qlogo.cn/mmopen/vi_32/hOM3grD77lIBdbdY0UXg4ql4NI1BeyJxlh1gPxgdnMbGzWCicahV4Ukt0pRkmo068d5CaSlM76xDrDDAsYFje6Q/132',1,NULL); + +/*Table structure for table `tz_user_addr` */ + +DROP TABLE IF EXISTS `tz_user_addr`; + +CREATE TABLE `tz_user_addr` ( + `addr_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `user_id` varchar(36) NOT NULL DEFAULT '0' COMMENT '用户ID', + `receiver` varchar(50) DEFAULT NULL COMMENT '收货人', + `province_id` bigint(20) DEFAULT NULL COMMENT '省ID', + `province` varchar(100) DEFAULT NULL COMMENT '省', + `city` varchar(20) DEFAULT NULL COMMENT '城市', + `city_id` bigint(20) DEFAULT NULL COMMENT '城市ID', + `area` varchar(20) DEFAULT NULL COMMENT '区', + `area_id` bigint(20) DEFAULT NULL COMMENT '区ID', + `post_code` varchar(15) DEFAULT NULL COMMENT '邮编', + `addr` varchar(1000) DEFAULT NULL COMMENT '地址', + `mobile` varchar(20) DEFAULT NULL COMMENT '手机', + `status` int(1) NOT NULL COMMENT '状态,1正常,0无效', + `common_addr` int(1) NOT NULL DEFAULT '0' COMMENT '是否默认地址 1是', + `create_time` datetime NOT NULL COMMENT '建立时间', + `version` int(5) NOT NULL DEFAULT '0' COMMENT '版本号', + `update_time` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`addr_id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='用户配送地址'; + +/*Data for the table `tz_user_addr` */ + +insert into `tz_user_addr`(`addr_id`,`user_id`,`receiver`,`province_id`,`province`,`city`,`city_id`,`area`,`area_id`,`post_code`,`addr`,`mobile`,`status`,`common_addr`,`create_time`,`version`,`update_time`) values +(3,'51540df5255e4d22903b0f83921095ff','user',110000000000,'北京市','市辖区',110100000000,'东城区',110101000000,NULL,'b613','15000000000',1,1,'2019-07-01 18:05:53',0,'2019-07-01 18:05:53'); + +/*Table structure for table `tz_user_addr_order` */ + +DROP TABLE IF EXISTS `tz_user_addr_order`; + +CREATE TABLE `tz_user_addr_order` ( + `addr_order_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `addr_id` bigint(20) unsigned NOT NULL COMMENT '地址ID', + `user_id` varchar(36) NOT NULL DEFAULT '0' COMMENT '用户ID', + `receiver` varchar(50) DEFAULT NULL COMMENT '收货人', + `province_id` bigint(20) DEFAULT NULL COMMENT '省ID', + `province` varchar(100) DEFAULT NULL COMMENT '省', + `area_id` bigint(20) DEFAULT NULL COMMENT '区域ID', + `area` varchar(20) DEFAULT NULL COMMENT '区', + `city_id` bigint(20) DEFAULT NULL COMMENT '城市ID', + `city` varchar(20) DEFAULT NULL COMMENT '城市', + `addr` varchar(1000) DEFAULT NULL COMMENT '地址', + `post_code` varchar(15) DEFAULT NULL COMMENT '邮编', + `mobile` varchar(20) DEFAULT NULL COMMENT '手机', + `create_time` datetime NOT NULL COMMENT '建立时间', + `version` int(5) NOT NULL DEFAULT '0' COMMENT '版本号', + PRIMARY KEY (`addr_order_id`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='用户订单配送地址'; + +/*Data for the table `tz_user_addr_order` */ + +insert into `tz_user_addr_order`(`addr_order_id`,`addr_id`,`user_id`,`receiver`,`province_id`,`province`,`area_id`,`area`,`city_id`,`city`,`addr`,`post_code`,`mobile`,`create_time`,`version`) values +(1,3,'51540df5255e4d22903b0f83921095ff','user',110000000000,'北京市',110101000000,'东城区',110100000000,'市辖区','b613',NULL,'15000000000','2019-07-01 18:07:11',0), +(2,3,'51540df5255e4d22903b0f83921095ff','user',110000000000,'北京市',110101000000,'东城区',110100000000,'市辖区','b613',NULL,'15000000000','2019-07-03 17:13:06',0), +(3,3,'51540df5255e4d22903b0f83921095ff','user',110000000000,'北京市',110101000000,'东城区',110100000000,'市辖区','b613',NULL,'15000000000','2019-07-03 17:15:41',0), +(5,3,'51540df5255e4d22903b0f83921095ff','user',110000000000,'北京市',110101000000,'东城区',110100000000,'市辖区','b613',NULL,'15000000000','2019-07-03 17:16:36',0), +(6,3,'51540df5255e4d22903b0f83921095ff','user',110000000000,'北京市',110101000000,'东城区',110100000000,'市辖区','b613',NULL,'15000000000','2019-07-03 17:17:56',0); + +/*Table structure for table `tz_user_collection` */ + +DROP TABLE IF EXISTS `tz_user_collection`; + +CREATE TABLE `tz_user_collection` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '收藏表', + `prod_id` bigint(20) DEFAULT NULL COMMENT '商品id', + `user_id` varchar(36) NOT NULL COMMENT '用户id', + `create_time` datetime DEFAULT NULL COMMENT '收藏时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `tz_user_collection` */ + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..c283450 --- /dev/null +++ b/pom.xml @@ -0,0 +1,209 @@ + + + 4.0.0 + com.yami.shop + yami-shop + 0.0.1-SNAPSHOT + pom + + + yami-shop-admin + yami-shop-sys + yami-shop-common + yami-shop-api + yami-shop-bean + yami-shop-service + yami-shop-security + yami-shop-quartz + yami-shop-mp + + + + 0.0.1-SNAPSHOT + UTF-8 + UTF-8 + 3.7.0 + 2.1.6.RELEASE + 2.1.5.RELEASE + 1.8 + 20.0 + 4.5.0 + 1.11.3 + 3.17 + 7.2.18 + 3.4.0 + 1.5.4 + 2.9.2 + 1.9.3 + 4.0.0 + 4.3.9 + 1.1.0 + 3.1.0 + 3.10.6 + 2.57 + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + org.springframework.security.oauth.boot + spring-security-oauth2-autoconfigure + ${security.oauth.auto.version} + + + com.github.binarywang + weixin-java-pay + ${weixin.version} + + + com.github.binarywang + weixin-java-miniapp + ${weixin.version} + + + com.github.binarywang + weixin-java-mp + ${weixin.version} + + + ma.glasnost.orika + orika-core + ${orika.version} + + + io.springfox + springfox-swagger2 + ${swagger2.version} + + + com.github.xiaoymin + swagger-bootstrap-ui + ${swagger-bootstrap.version} + + + com.aliyun + aliyun-java-sdk-core + ${aliyun-core.version} + + + com.aliyun + aliyun-java-sdk-dysmsapi + ${aliyun-dysmsapi.version} + + + com.vdurmont + emoji-java + ${emoji.version} + + + org.jsoup + jsoup + ${jsoup.version} + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + com.qiniu + qiniu-java-sdk + ${qiniu.version} + + + com.google.guava + guava + ${guava.version} + + + cn.hutool + hutool-all + ${hutool.version} + + + + org.redisson + redisson-spring-boot-starter + ${redisson.version} + + + + de.ruedigermoeller + fst + ${fst.version} + + + + + + + org.projectlombok + lombok + provided + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-logging + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + org.springframework.boot + spring-boot-starter-undertow + + + org.springframework.boot + spring-boot-starter-log4j2 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven.compiler.plugin.version} + + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + + + + + + + aliyun + aliyun + https://maven.aliyun.com/repository/public + + true + + + false + + + + diff --git a/screenshot/login.png b/screenshot/login.png new file mode 100644 index 0000000..f833e0f Binary files /dev/null and b/screenshot/login.png differ diff --git a/screenshot/miniQrcode.jpg b/screenshot/miniQrcode.jpg new file mode 100644 index 0000000..8e1db2c Binary files /dev/null and b/screenshot/miniQrcode.jpg differ diff --git a/screenshot/order.png b/screenshot/order.png new file mode 100644 index 0000000..1a262f6 Binary files /dev/null and b/screenshot/order.png differ diff --git a/screenshot/prodList.png b/screenshot/prodList.png new file mode 100644 index 0000000..fd57e6b Binary files /dev/null and b/screenshot/prodList.png differ diff --git a/screenshot/qqGroup.png b/screenshot/qqGroup.png new file mode 100644 index 0000000..55d01e4 Binary files /dev/null and b/screenshot/qqGroup.png differ diff --git a/screenshot/sku.png b/screenshot/sku.png new file mode 100644 index 0000000..6ff4592 Binary files /dev/null and b/screenshot/sku.png differ diff --git a/screenshot/transport.png b/screenshot/transport.png new file mode 100644 index 0000000..ae5114d Binary files /dev/null and b/screenshot/transport.png differ diff --git a/yami-shop-admin/pom.xml b/yami-shop-admin/pom.xml new file mode 100644 index 0000000..d709d47 --- /dev/null +++ b/yami-shop-admin/pom.xml @@ -0,0 +1,65 @@ + + 4.0.0 + yami-shop-admin + + + com.yami.shop + yami-shop + 0.0.1-SNAPSHOT + ../pom.xml + + + + + + com.yami.shop + yami-shop-service + ${yami.shop.version} + + + com.yami.shop + yami-shop-sys + ${yami.shop.version} + + + org.apache.poi + poi-ooxml + ${poi.version} + + + com.yami.shop + yami-shop-security + ${yami.shop.version} + + + com.yami.shop + yami-shop-quartz + ${yami.shop.version} + + + com.yami.shop + yami-shop-mp + ${yami.shop.version} + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/WebApplication.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/WebApplication.java new file mode 100644 index 0000000..ca9cedd --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/WebApplication.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin; + + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.ComponentScan; + +/** + * @author lgh + */ +@SpringBootApplication +@ComponentScan("com.yami.shop") +public class WebApplication extends SpringBootServletInitializer{ + + public static void main(String[] args) { + SpringApplication.run(WebApplication.class, args); + } + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { + return builder.sources(WebApplication.class); + } + +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/config/AdminBeanConfig.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/config/AdminBeanConfig.java new file mode 100644 index 0000000..dda57aa --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/config/AdminBeanConfig.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.config; + +import cn.hutool.core.lang.Snowflake; +import lombok.AllArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@AllArgsConstructor +public class AdminBeanConfig { + + private final AdminConfig adminConfig; + + @Bean + public Snowflake snowflake() { + return new Snowflake(adminConfig.getWorkerId(), adminConfig.getDatacenterId()); + } +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/config/AdminConfig.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/config/AdminConfig.java new file mode 100644 index 0000000..2891e14 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/config/AdminConfig.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + + +/** + * 商城配置文件 + * @author lgh + */ +@Data +@Component +@PropertySource("classpath:admin.properties") +@ConfigurationProperties(prefix = "admin") +public class AdminConfig { + + /** + * 数据中心ID + */ + private Integer datacenterId; + + /** + * 终端ID + */ + private Integer workerId; + +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/config/SwaggerConfiguration.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/config/SwaggerConfiguration.java new file mode 100644 index 0000000..f8c31cc --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/config/SwaggerConfiguration.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import org.springframework.context.annotation.Profile; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +/** + * Swagger文档,只有在测试环境才会使用 + * @author LGH + */ +//@Profile("dev") +@Configuration +@EnableSwagger2 +public class SwaggerConfiguration { + + @Bean + public Docket createRestApi() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .select() + .apis(RequestHandlerSelectors.basePackage("com.yami")) + .paths(PathSelectors.any()) + .build(); + } + + @Bean + public ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("亚米管理系统接口文档") + .description("亚米商城接口文档Swagger版") + .termsOfServiceUrl("https://www.gz-yami.com/") + .contact(new Contact("广州亚米信息科技有限公司","https://www.gz-yami.com/", "")) + .version("1.0") + .build(); + } +} \ No newline at end of file diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/AreaController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/AreaController.java new file mode 100644 index 0000000..d9074d8 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/AreaController.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yami.shop.common.util.PageParam; +import com.yami.shop.bean.model.Area; +import com.yami.shop.service.AreaService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; +import java.util.Map; + +/** + * @author lgh on 2018/10/26. + */ +@RestController +@RequestMapping("/admin/area") +public class AreaController { + + @Autowired + private AreaService areaService; + + /** + * 分页获取 + */ + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('admin:area:page')") + public ResponseEntity> page(Area area,PageParam page) { + IPage sysUserPage = areaService.page(page, new LambdaQueryWrapper()); + return ResponseEntity.ok(sysUserPage); + } + + /** + * 获取省市 + */ + @GetMapping("/list") + @PreAuthorize("@pms.hasPermission('admin:area:list')") + public ResponseEntity> list(Area area) { + List areas = areaService.list(new LambdaQueryWrapper() + .like(area.getAreaName() != null, Area::getAreaName, area.getAreaName())); + return ResponseEntity.ok(areas); + } + + /** + * 通过父级id获取区域列表 + */ + @GetMapping("/listByPid") + public ResponseEntity> listByPid(Long pid) { + List list = areaService.listByPid(pid); + return ResponseEntity.ok(list); + } + + /** + * 获取信息 + */ + @GetMapping("/info/{id}") + @PreAuthorize("@pms.hasPermission('admin:area:info')") + public ResponseEntity info(@PathVariable("id") Long id) { + Area area = areaService.getById(id); + return ResponseEntity.ok(area); + } + + /** + * 保存 + */ + @PostMapping + @PreAuthorize("@pms.hasPermission('admin:area:save')") + public ResponseEntity save(@Valid @RequestBody Area area) { + if (area.getParentId() != null) { + Area parentArea = areaService.getById(area.getParentId()); + area.setLevel(parentArea.getLevel() + 1); + areaService.removeAreaCacheByParentId(area.getParentId()); + } + areaService.save(area); + return ResponseEntity.ok().build(); + } + + /** + * 修改 + */ + @PutMapping + @PreAuthorize("@pms.hasPermission('admin:area:update')") + public ResponseEntity update(@Valid @RequestBody Area area) { + areaService.updateById(area); + areaService.removeAreaCacheByParentId(area.getParentId()); + return ResponseEntity.ok().build(); + } + + /** + * 删除 + */ + @DeleteMapping("/{id}") + @PreAuthorize("@pms.hasPermission('admin:area:delete')") + public ResponseEntity delete(@PathVariable Long id) { + Area area = areaService.getById(id); + areaService.removeById(id); + areaService.removeAreaCacheByParentId(area.getParentId()); + return ResponseEntity.ok().build(); + } + +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/AttributeController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/AttributeController.java new file mode 100644 index 0000000..164b8fc --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/AttributeController.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + +import java.util.Objects; + +import javax.validation.Valid; + +import com.yami.shop.common.util.PageParam; +import com.yami.shop.common.enums.YamiHttpStatus; + +import com.yami.shop.security.util.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +import com.yami.shop.bean.enums.ProdPropRule; +import com.yami.shop.bean.model.ProdProp; +import com.yami.shop.common.exception.YamiShopBindException; +import com.yami.shop.service.ProdPropService; +import com.baomidou.mybatisplus.core.metadata.IPage; + +/** + * 参数管理 + * @author lgh + */ +@RestController +@RequestMapping("/admin/attribute") +public class AttributeController { + + @Autowired + private ProdPropService prodPropService; + + /** + * 分页获取 + */ + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('admin:attribute:page')") + public ResponseEntity> page(ProdProp prodProp,PageParam page){ + prodProp.setRule(ProdPropRule.ATTRIBUTE.value()); + prodProp.setShopId(SecurityUtils.getSysUser().getShopId()); + IPage prodPropIPage = prodPropService.pagePropAndValue(prodProp,page); + return ResponseEntity.ok(prodPropIPage); + } + + /** + * 获取信息 + */ + @GetMapping("/info/{id}") + @PreAuthorize("@pms.hasPermission('admin:attribute:info')") + public ResponseEntity info(@PathVariable("id") Long id){ + ProdProp prodProp = prodPropService.getById(id); + return ResponseEntity.ok(prodProp); + } + + /** + * 保存 + */ + @PostMapping + @PreAuthorize("@pms.hasPermission('admin:attribute:save')") + public ResponseEntity save(@Valid ProdProp prodProp){ + prodProp.setRule(ProdPropRule.ATTRIBUTE.value()); + prodProp.setShopId(SecurityUtils.getSysUser().getShopId()); + prodPropService.saveProdPropAndValues(prodProp); + return ResponseEntity.ok().build(); + } + + /** + * 修改 + */ + @PutMapping + @PreAuthorize("@pms.hasPermission('admin:attribute:update')") + public ResponseEntity update(@Valid ProdProp prodProp){ + ProdProp dbProdProp = prodPropService.getById(prodProp.getPropId()); + if (!Objects.equals(dbProdProp.getShopId(), SecurityUtils.getSysUser().getShopId())) { + throw new YamiShopBindException("没有权限获取该商品规格信息"); + } + prodProp.setRule(ProdPropRule.ATTRIBUTE.value()); + prodProp.setShopId(SecurityUtils.getSysUser().getShopId()); + prodPropService.updateProdPropAndValues(prodProp); + return ResponseEntity.ok().build(); + } + + /** + * 删除 + */ + @DeleteMapping("/{id}") + @PreAuthorize("@pms.hasPermission('admin:attribute:delete')") + public ResponseEntity delete(@PathVariable Long id){ + prodPropService.deleteProdPropAndValues(id,ProdPropRule.ATTRIBUTE.value(),SecurityUtils.getSysUser().getShopId()); + return ResponseEntity.ok().build(); + } +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/BrandController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/BrandController.java new file mode 100644 index 0000000..38729a2 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/BrandController.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yami.shop.bean.model.Brand; +import com.yami.shop.common.util.PageParam; +import com.yami.shop.service.BrandService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.Objects; + + +/** + * 品牌管理 + * + * @author lgh + */ +@RestController +@RequestMapping("/admin/brand") +public class BrandController { + + @Autowired + private BrandService brandService; + + /** + * 分页获取 + */ + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('admin:brand:page')") + public ResponseEntity> page(Brand brand,PageParam page) { + page.setAsc("first_char"); + IPage brands = brandService.page(page, + new LambdaQueryWrapper() + .like(StrUtil.isNotBlank(brand.getBrandName()), Brand::getBrandName, brand.getBrandName())); + return ResponseEntity.ok(brands); + } + + /** + * 获取信息 + */ + @GetMapping("/info/{id}") + @PreAuthorize("@pms.hasPermission('admin:brand:info')") + public ResponseEntity info(@PathVariable("id") Long id) { + Brand brand = brandService.getById(id); + return ResponseEntity.ok(brand); + } + + /** + * 保存 + */ + @PostMapping + @PreAuthorize("@pms.hasPermission('admin:brand:save')") + public ResponseEntity save(@Valid Brand brand) { + Brand dbBrand = brandService.getByBrandName(brand.getBrandName()); + if (dbBrand != null) { + return ResponseEntity.badRequest().body("该品牌名称已存在"); + } + brandService.save(brand); + return ResponseEntity.ok().build(); + } + + /** + * 修改 + */ + @PutMapping + @PreAuthorize("@pms.hasPermission('admin:brand:update')") + public ResponseEntity update(@Valid Brand brand) { + Brand dbBrand = brandService.getByBrandName(brand.getBrandName()); + if (dbBrand != null && !Objects.equals(dbBrand.getBrandId(), brand.getBrandId())) { + return ResponseEntity.badRequest().body("该品牌名称已存在"); + } + brandService.updateById(brand); + return ResponseEntity.ok().build(); + } + + /** + * 删除 + */ + @DeleteMapping("/{id}") + @PreAuthorize("@pms.hasPermission('admin:brand:delete')") + public ResponseEntity delete(@PathVariable Long id) { + brandService.deleteByBrand(id); + return ResponseEntity.ok().build(); + } + +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/CategoryController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/CategoryController.java new file mode 100644 index 0000000..c284b55 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/CategoryController.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + +import java.util.Date; +import java.util.List; +import java.util.Objects; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yami.shop.security.util.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +import com.yami.shop.bean.model.Category; +import com.yami.shop.common.annotation.SysLog; +import com.yami.shop.service.BrandService; +import com.yami.shop.service.CategoryService; +import com.yami.shop.service.ProdPropService; + +import cn.hutool.core.collection.CollectionUtil; + + + +/** + * 分类管理 + * @author lgh + * + */ +@RestController +@RequestMapping("/prod/category") +public class CategoryController { + + @Autowired + private CategoryService categoryService; + + /** + * 获取菜单页面的表 + * @return + */ + @GetMapping("/table") + @PreAuthorize("@pms.hasPermission('prod:category:page')") + public ResponseEntity> table(){ + List categoryMenuList = categoryService.tableCategory(SecurityUtils.getSysUser().getShopId()); + return ResponseEntity.ok(categoryMenuList); + } + + /** + * 获取分类信息 + */ + @GetMapping("/info/{categoryId}") + public ResponseEntity info(@PathVariable("categoryId") Long categoryId){ + Category category = categoryService.getById(categoryId); + return ResponseEntity.ok(category); + } + + + + /** + * 保存分类 + */ + @SysLog("保存分类") + @PostMapping + @PreAuthorize("@pms.hasPermission('prod:category:save')") + public ResponseEntity save(@RequestBody Category category){ + category.setShopId(SecurityUtils.getSysUser().getShopId()); + category.setRecTime(new Date()); + categoryService.saveCategroy(category); + return ResponseEntity.ok().build(); + } + + /** + * 更新分类 + */ + @SysLog("更新分类") + @PutMapping + @PreAuthorize("@pms.hasPermission('prod:category:update')") + public ResponseEntity update(@RequestBody Category category){ + category.setShopId(SecurityUtils.getSysUser().getShopId()); + if (Objects.equals(category.getParentId(),category.getCategoryId())) { + return ResponseEntity.badRequest().body("分类的上级不能是自己本身"); + } + categoryService.updateCategroy(category); + return ResponseEntity.ok().build(); + } + + /** + * 删除分类 + */ + @SysLog("删除分类") + @DeleteMapping("/{categoryId}") + @PreAuthorize("@pms.hasPermission('prod:category:delete')") + public ResponseEntity delete(@PathVariable("categoryId") Long categoryId){ + if (CollectionUtil.isNotEmpty(categoryService.listByParentId(categoryId))) { + return ResponseEntity.badRequest().body("请删除子分类,再删除该分类"); + } + categoryService.deleteCategroy(categoryId); + return ResponseEntity.ok().build(); + } + + /** + * 所有的 + */ + @GetMapping("/listCategory") + public ResponseEntity> listCategory(){ + + return ResponseEntity.ok(categoryService.list(new LambdaQueryWrapper() + .le(Category::getGrade, 2) + .eq(Category::getShopId, SecurityUtils.getSysUser().getShopId()) + .orderByAsc(Category::getSeq))); + } + + /** + * 所有的产品分类 + */ + @GetMapping("/listProdCategory") + public ResponseEntity> listProdCategory(){ + List categories = categoryService.treeSelect(SecurityUtils.getSysUser().getShopId(),2); + return ResponseEntity.ok(categories); + } +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/DeliveryController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/DeliveryController.java new file mode 100644 index 0000000..37050b5 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/DeliveryController.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.yami.shop.bean.model.Delivery; +import com.yami.shop.service.DeliveryService; + +/** + * + * @author lgh on 2018/11/26. + */ +@RestController +@RequestMapping("/admin/delivery") +public class DeliveryController { + + @Autowired + private DeliveryService deliveryService; + + /** + * 分页获取 + */ + @GetMapping("/list") + public ResponseEntity> page(){ + + List list = deliveryService.list(); + return ResponseEntity.ok(list); + } + +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/FileController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/FileController.java new file mode 100644 index 0000000..96c0340 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/FileController.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + +import java.io.IOException; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +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 com.yami.shop.bean.dto.TinymceEditorDto; +import com.yami.shop.common.bean.Qiniu; +import com.yami.shop.service.AttachFileService; + +/** + * 文件上传 controller + * @author lgh + * + */ +@RestController +@RequestMapping("/admin/file") +public class FileController { + + @Autowired + private AttachFileService attachFileService; + @Autowired + private Qiniu qiniu; + + @PostMapping("/upload/element") + public ResponseEntity uploadElementFile(@RequestParam("file") MultipartFile file) throws IOException{ + if(file.isEmpty()){ + return ResponseEntity.noContent().build(); + } + String fileName = attachFileService.uploadFile(file.getBytes(),file.getOriginalFilename()); + return ResponseEntity.ok(fileName); + } + + @PostMapping("/upload/tinymceEditor") + public ResponseEntity uploadTinymceEditorImages(@RequestParam("editorFile") MultipartFile editorFile) throws IOException{ + String fileName = attachFileService.uploadFile(editorFile.getBytes(),editorFile.getOriginalFilename()); + return ResponseEntity.ok(qiniu.getResourcesUrl() + fileName); + } + +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/HotSearchController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/HotSearchController.java new file mode 100644 index 0000000..913eed9 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/HotSearchController.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + +import javax.validation.Valid; +import java.util.Date; +import java.util.List; + + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yami.shop.security.util.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import com.yami.shop.common.util.PageParam; +import com.baomidou.mybatisplus.core.metadata.IPage; + + + + + +import com.yami.shop.service.HotSearchService; +import com.yami.shop.bean.model.HotSearch; + +/** + * + * @author lgh on 2019/03/27. + */ +@RestController +@RequestMapping("/admin/hotSearch") +public class HotSearchController { + + @Autowired + private HotSearchService hotSearchService; + + /** + * 分页获取 + */ + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('admin:hotSearch:page')") + public ResponseEntity> page(HotSearch hotSearch,PageParam page){ + IPage hotSearchs = hotSearchService.page(page,new LambdaQueryWrapper() + .eq(HotSearch::getShopId, SecurityUtils.getSysUser().getShopId()) + .like(StrUtil.isNotBlank(hotSearch.getContent()), HotSearch::getContent,hotSearch.getContent()) + .like(StrUtil.isNotBlank(hotSearch.getTitle()), HotSearch::getTitle,hotSearch.getTitle()) + .eq(hotSearch.getStatus()!=null, HotSearch::getStatus,hotSearch.getStatus()) + ); + return ResponseEntity.ok(hotSearchs); + } + + /** + * 获取信息 + */ + @GetMapping("/info/{id}") + @PreAuthorize("@pms.hasPermission('admin:hotSearch:info')") + public ResponseEntity info(@PathVariable("id") Long id){ + HotSearch hotSearch = hotSearchService.getById(id); + return ResponseEntity.ok(hotSearch); + } + + /** + * 保存 + */ + @PostMapping + @PreAuthorize("@pms.hasPermission('admin:hotSearch:save')") + public ResponseEntity save(@RequestBody @Valid HotSearch hotSearch){ + hotSearch.setRecDate(new Date()); + hotSearch.setShopId(SecurityUtils.getSysUser().getShopId()); + hotSearchService.save(hotSearch); + //清除缓存 + hotSearchService.removeHotSearchDtoCacheByshopId(SecurityUtils.getSysUser().getShopId()); + return ResponseEntity.ok().build(); + } + + /** + * 修改 + */ + @PutMapping + @PreAuthorize("@pms.hasPermission('admin:hotSearch:update')") + public ResponseEntity update(@RequestBody @Valid HotSearch hotSearch){ + hotSearchService.updateById(hotSearch); + //清除缓存 + hotSearchService.removeHotSearchDtoCacheByshopId(SecurityUtils.getSysUser().getShopId()); + return ResponseEntity.ok().build(); + } + + /** + * 删除 + */ + @DeleteMapping + @PreAuthorize("@pms.hasPermission('admin:hotSearch:delete')") + public ResponseEntity delete(@RequestBody List ids){ + hotSearchService.removeByIds(ids); + //清除缓存 + hotSearchService.removeHotSearchDtoCacheByshopId(SecurityUtils.getSysUser().getShopId()); + return ResponseEntity.ok().build(); + } +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/IndexImgController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/IndexImgController.java new file mode 100644 index 0000000..7e3f379 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/IndexImgController.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yami.shop.bean.model.IndexImg; +import com.yami.shop.bean.model.Product; +import com.yami.shop.common.util.PageParam; +import com.yami.shop.security.util.SecurityUtils; +import com.yami.shop.service.IndexImgService; +import com.yami.shop.service.ProductService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.Date; +import java.util.Objects; + +/** + * @author lgh on 2018/11/26. + */ +@RestController +@RequestMapping("/admin/indexImg") +public class IndexImgController { + + @Autowired + private IndexImgService indexImgService; + + @Autowired + private ProductService productService; + + + /** + * 分页获取 + */ + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('admin:indexImg:page')") + public ResponseEntity> page(IndexImg indexImg, PageParam page) { + IPage indexImgIPage = indexImgService.page(page, + new LambdaQueryWrapper() + .eq(indexImg.getStatus() != null, IndexImg::getStatus, indexImg.getStatus()) + .orderByDesc(IndexImg::getSeq)); + return ResponseEntity.ok(indexImgIPage); + } + + /** + * 获取信息 + */ + @GetMapping("/info/{imgId}") + @PreAuthorize("@pms.hasPermission('admin:indexImg:info')") + public ResponseEntity info(@PathVariable("imgId") Long imgId) { + Long shopId = SecurityUtils.getSysUser().getShopId(); + IndexImg indexImg = indexImgService.getOne(new LambdaQueryWrapper().eq(IndexImg::getShopId, shopId).eq(IndexImg::getImgId, imgId)); + if (Objects.nonNull(indexImg.getRelation())) { + Product product = productService.getProductByProdId(indexImg.getRelation()); + indexImg.setPic(product.getPic()); + indexImg.setProdName(product.getProdName()); + } + return ResponseEntity.ok(indexImg); + } + + /** + * 保存 + */ + @PostMapping + @PreAuthorize("@pms.hasPermission('admin:indexImg:save')") + public ResponseEntity save(@RequestBody @Valid IndexImg indexImg) { + Long shopId = SecurityUtils.getSysUser().getShopId(); + indexImg.setShopId(shopId); + indexImg.setUploadTime(new Date()); + indexImgService.save(indexImg); + indexImgService.removeIndexImgs(); + return ResponseEntity.ok().build(); + } + + /** + * 修改 + */ + @PutMapping + @PreAuthorize("@pms.hasPermission('admin:indexImg:update')") + public ResponseEntity update(@RequestBody @Valid IndexImg indexImg) { + indexImgService.updateById(indexImg); + indexImgService.removeIndexImgs(); + return ResponseEntity.ok().build(); + } + + /** + * 删除 + */ + @DeleteMapping + @PreAuthorize("@pms.hasPermission('admin:indexImg:delete')") + public ResponseEntity delete(@RequestBody Long[] ids) { + indexImgService.deleteIndexImgsByIds(ids); + indexImgService.removeIndexImgs(); + return ResponseEntity.ok().build(); + } +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/MessageController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/MessageController.java new file mode 100644 index 0000000..5b5d833 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/MessageController.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + +import java.util.Arrays; +import java.util.List; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +import com.yami.shop.common.util.PageParam; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yami.shop.bean.enums.MessageStatus; +import com.yami.shop.bean.model.Message; +import com.yami.shop.service.MessageService; + +import cn.hutool.core.util.StrUtil; + + +/** + * @author lgh on 2018/10/15. + */ +@RestController +@RequestMapping("/admin/message") +public class MessageController { + + @Autowired + private MessageService messageService; + + /** + * 分页获取 + */ + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('admin:message:page')") + public ResponseEntity> page(Message message,PageParam page) { + IPage messages = messageService.page(page, new LambdaQueryWrapper() + .like(StrUtil.isNotBlank(message.getUserName()), Message::getUserName, message.getUserName()) + .eq(message.getStatus() != null, Message::getStatus, message.getStatus())); + return ResponseEntity.ok(messages); + } + + /** + * 获取信息 + */ + @GetMapping("/info/{id}") + @PreAuthorize("@pms.hasPermission('admin:message:info')") + public ResponseEntity info(@PathVariable("id") Long id) { + Message message = messageService.getById(id); + return ResponseEntity.ok(message); + } + + /** + * 保存 + */ + @PostMapping + @PreAuthorize("@pms.hasPermission('admin:message:save')") + public ResponseEntity save(@RequestBody Message message) { + messageService.save(message); + return ResponseEntity.ok().build(); + } + + /** + * 修改 + */ + @PutMapping + @PreAuthorize("@pms.hasPermission('admin:message:update')") + public ResponseEntity update(@RequestBody Message message) { + messageService.updateById(message); + return ResponseEntity.ok().build(); + } + + /** + * 公开留言 + */ + @PutMapping("/release/{id}") + @PreAuthorize("@pms.hasPermission('admin:message:release')") + public ResponseEntity release(@PathVariable("id") Long id) { + Message message = new Message(); + message.setId(id); + message.setStatus(MessageStatus.RELEASE.value()); + messageService.updateById(message); + return ResponseEntity.ok().build(); + } + + /** + * 取消公开留言 + */ + @PutMapping("/cancel/{id}") + @PreAuthorize("@pms.hasPermission('admin:message:cancel')") + public ResponseEntity cancel(@PathVariable("id") Long id) { + Message message = new Message(); + message.setId(id); + message.setStatus(MessageStatus.CANCEL.value()); + messageService.updateById(message); + return ResponseEntity.ok().build(); + } + + /** + * 删除 + */ + @DeleteMapping("/{ids}") + @PreAuthorize("@pms.hasPermission('admin:message:delete')") + public ResponseEntity delete(@PathVariable Long[] ids) { + messageService.removeByIds(Arrays.asList(ids)); + return ResponseEntity.ok().build(); + } +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/NoticeController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/NoticeController.java new file mode 100644 index 0000000..c59a222 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/NoticeController.java @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yami.shop.common.util.PageParam; +import com.yami.shop.bean.model.Notice; +import com.yami.shop.common.annotation.SysLog; +import com.yami.shop.security.util.SecurityUtils; +import com.yami.shop.service.NoticeService; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.Date; + +/** + * 公告管理 + * + * @author hzm + * @date + */ +@RestController +@AllArgsConstructor +@RequestMapping("/shop/notice") +public class NoticeController { + + private final NoticeService noticeService; + + /** + * 分页查询 + * + * @param page 分页对象 + * @param notice 公告管理 + * @return 分页数据 + */ + @GetMapping("/page") + public ResponseEntity> getNoticePage(PageParam page, Notice notice) { + IPage noticeIPage = noticeService.page(page, new LambdaQueryWrapper() + .eq(notice.getStatus() != null, Notice::getStatus, notice.getStatus()) + .like(notice.getTitle() != null, Notice::getTitle, notice.getTitle()).orderByDesc(Notice::getUpdateTime)); + return ResponseEntity.ok(noticeIPage); + } + + + /** + * 通过id查询公告管理 + * + * @param id id + * @return 单个数据 + */ + @GetMapping("/info/{id}") + public ResponseEntity getById(@PathVariable("id") Long id) { + return ResponseEntity.ok(noticeService.getById(id)); + } + + /** + * 新增公告管理 + * + * @param notice 公告管理 + * @return 是否新增成功 + */ + @SysLog("新增公告管理") + @PostMapping + @PreAuthorize("@pms.hasPermission('shop:notice:save')") + public ResponseEntity save(@RequestBody @Valid Notice notice) { + notice.setShopId(SecurityUtils.getSysUser().getShopId()); + if (notice.getStatus() == 1) { + notice.setPublishTime(new Date()); + } + notice.setUpdateTime(new Date()); + noticeService.removeNoticeList(); + return ResponseEntity.ok(noticeService.save(notice)); + } + + /** + * 修改公告管理 + * + * @param notice 公告管理 + * @return 是否修改成功 + */ + @SysLog("修改公告管理") + @PutMapping + @PreAuthorize("@pms.hasPermission('shop:notice:update')") + public ResponseEntity updateById(@RequestBody @Valid Notice notice) { + Notice oldNotice = noticeService.getById(notice.getId()); + if (oldNotice.getStatus() == 0 && notice.getStatus() == 1) { + notice.setPublishTime(new Date()); + } + notice.setUpdateTime(new Date()); + noticeService.removeNoticeList(); + noticeService.removeNoticeById(notice.getId()); + return ResponseEntity.ok(noticeService.updateById(notice)); + } + + /** + * 通过id删除公告管理 + * + * @param id id + * @return 是否删除成功 + */ + @SysLog("删除公告管理") + @DeleteMapping("/{id}") + @PreAuthorize("@pms.hasPermission('shop:notice:delete')") + public ResponseEntity removeById(@PathVariable Long id) { + noticeService.removeNoticeList(); + noticeService.removeNoticeById(id); + return ResponseEntity.ok(noticeService.removeById(id)); + } + +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/OrderController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/OrderController.java new file mode 100644 index 0000000..ea59b86 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/OrderController.java @@ -0,0 +1,297 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; + +import com.yami.shop.bean.param.OrderParam; +import com.yami.shop.common.exception.YamiShopBindException; +import com.yami.shop.security.util.SecurityUtils; +import com.yami.shop.service.*; +import org.apache.poi.ss.usermodel.Sheet; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; + + +import com.yami.shop.common.util.PageParam; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.google.common.base.Objects; +import com.yami.shop.bean.enums.OrderStatus; +import com.yami.shop.bean.model.Order; +import com.yami.shop.bean.model.OrderItem; +import com.yami.shop.bean.model.UserAddrOrder; +import com.yami.shop.bean.param.DeliveryOrderParam; + +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.poi.excel.ExcelUtil; +import cn.hutool.poi.excel.ExcelWriter; + +/** + * @author lgh on 2018/09/15. + */ +@Controller +@RequestMapping("/order/order") +public class OrderController { + + @Autowired + private OrderService orderService; + + @Autowired + private OrderItemService orderItemService; + + @Autowired + private UserAddrOrderService userAddrOrderService; + + @Autowired + private ProductService productService; + + @Autowired + private SkuService skuService; + + /** + * 分页获取 + */ + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('order:order:page')") + public ResponseEntity> page(OrderParam orderParam,PageParam page) { + Long shopId = SecurityUtils.getSysUser().getShopId(); + orderParam.setShopId(shopId); + IPage orderIPage = orderService.pageOrdersDetialByOrderParam(page, orderParam); + return ResponseEntity.ok(orderIPage); + + + } + + /** + * 获取信息 + */ + @GetMapping("/orderInfo/{orderNumber}") + @PreAuthorize("@pms.hasPermission('order:order:info')") + public ResponseEntity info(@PathVariable("orderNumber") String orderNumber) { + Long shopId = SecurityUtils.getSysUser().getShopId(); + Order order = orderService.getOrderByOrderNumber(orderNumber); + if (!Objects.equal(shopId, order.getShopId())) { + throw new YamiShopBindException("您没有权限获取该订单信息"); + } + List orderItems = orderItemService.getOrderItemsByOrderNumber(orderNumber); + order.setOrderItems(orderItems); + UserAddrOrder userAddrOrder = userAddrOrderService.getById(order.getAddrOrderId()); + order.setUserAddrOrder(userAddrOrder); + return ResponseEntity.ok(order); + } + + /** + * 发货 + */ + @PutMapping("/delivery") + @PreAuthorize("@pms.hasPermission('order:order:delivery')") + public ResponseEntity delivery(@RequestBody DeliveryOrderParam deliveryOrderParam) { + Long shopId = SecurityUtils.getSysUser().getShopId(); + Order order = orderService.getOrderByOrderNumber(deliveryOrderParam.getOrderNumber()); + if (!Objects.equal(shopId, order.getShopId())) { + throw new YamiShopBindException("您没有权限修改该订单信息"); + } + + Order orderParam = new Order(); + orderParam.setOrderId(order.getOrderId()); + orderParam.setDvyId(deliveryOrderParam.getDvyId()); + orderParam.setDvyFlowId(deliveryOrderParam.getDvyFlowId()); + orderParam.setDvyTime(new Date()); + orderParam.setStatus(OrderStatus.CONSIGNMENT.value()); + orderParam.setUserId(order.getUserId()); + + orderService.delivery(orderParam); + + List orderItems = orderItemService.getOrderItemsByOrderNumber(deliveryOrderParam.getOrderNumber()); + for (OrderItem orderItem : orderItems) { + productService.removeProductCacheByProdId(orderItem.getProdId()); + skuService.removeSkuCacheBySkuId(orderItem.getSkuId(),orderItem.getProdId()); + } + return ResponseEntity.ok().build(); + } + + /** + * 打印待发货的订单表 + * + * @param order + * @param consignmentName 发件人姓名 + * @param consignmentMobile 发货人手机号 + * @param consignmentAddr 发货地址 + */ + @GetMapping("/waitingConsignmentExcel") + @PreAuthorize("@pms.hasPermission('order:order:waitingConsignmentExcel')") + public void waitingConsignmentExcel(Order order, @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime, + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endTime, String consignmentName, String consignmentMobile, + String consignmentAddr, HttpServletResponse response) { + Long shopId = SecurityUtils.getSysUser().getShopId(); + order.setShopId(shopId); + order.setStatus(OrderStatus.PADYED.value()); + List orders = orderService.listOrdersDetialByOrder(order, startTime, endTime); + + //通过工具类创建writer + ExcelWriter writer = ExcelUtil.getWriter(); + Sheet sheet = writer.getSheet(); + sheet.setColumnWidth(0, 20 * 256); + sheet.setColumnWidth(1, 20 * 256); + sheet.setColumnWidth(2, 20 * 256); + sheet.setColumnWidth(3, 60 * 256); + sheet.setColumnWidth(4, 60 * 256); + sheet.setColumnWidth(7, 60 * 256); + sheet.setColumnWidth(8, 60 * 256); + sheet.setColumnWidth(9, 60 * 256); + // 待发货 + String[] hearder = {"订单编号", "收件人", "手机", "收货地址", "商品名称", "数量", "发件人姓名", "发件人手机号", "发货地址", "备注"}; + writer.merge(hearder.length - 1, "发货信息整理"); + writer.writeRow(Arrays.asList(hearder)); + + int row = 1; + for (Order dbOrder : orders) { + UserAddrOrder addr = dbOrder.getUserAddrOrder(); + String addrInfo = addr.getProvince() + addr.getCity() + addr.getArea() + addr.getAddr(); + List orderItems = dbOrder.getOrderItems(); + row++; + for (OrderItem orderItem : orderItems) { + // 第0列开始 + int col = 0; + writer.writeCellValue(col++, row, dbOrder.getOrderNumber()); + writer.writeCellValue(col++, row, addr.getReceiver()); + writer.writeCellValue(col++, row, addr.getMobile()); + writer.writeCellValue(col++, row, addrInfo); + writer.writeCellValue(col++, row, orderItem.getProdName()); + writer.writeCellValue(col++, row, orderItem.getProdCount()); + writer.writeCellValue(col++, row, consignmentName); + writer.writeCellValue(col++, row, consignmentMobile); + writer.writeCellValue(col++, row, consignmentAddr); + writer.writeCellValue(col++, row, dbOrder.getRemarks()); + } + } + writeExcel(response, writer); + } + + /** + * 已销售订单 + * + * @param order + */ + @GetMapping("/soldExcel") + @PreAuthorize("@pms.hasPermission('order:order:soldExcel')") + public void soldExcel(Order order, @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime, + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endTime, HttpServletResponse response) { + Long shopId = SecurityUtils.getSysUser().getShopId(); + order.setShopId(shopId); + order.setIsPayed(1); + List orders = orderService.listOrdersDetialByOrder(order, startTime, endTime); + + //通过工具类创建writer + ExcelWriter writer = ExcelUtil.getWriter(); + // 待发货 + String[] hearder = {"订单编号", "下单时间", "收件人", "手机", "收货地址", "商品名称", "数量", "订单应付", "订单运费", "订单实付"}; + Sheet sheet = writer.getSheet(); + sheet.setColumnWidth(0, 20 * 256); + sheet.setColumnWidth(1, 20 * 256); + sheet.setColumnWidth(3, 20 * 256); + sheet.setColumnWidth(4, 60 * 256); + sheet.setColumnWidth(5, 60 * 256); + + writer.merge(hearder.length - 1, "销售信息整理"); + writer.writeRow(Arrays.asList(hearder)); + + int row = 1; + for (Order dbOrder : orders) { + UserAddrOrder addr = dbOrder.getUserAddrOrder(); + String addrInfo = addr.getProvince() + addr.getCity() + addr.getArea() + addr.getAddr(); + List orderItems = dbOrder.getOrderItems(); + int firstRow = row + 1; + int lastRow = row + orderItems.size(); + int col = -1; + // 订单编号 + mergeIfNeed(writer, firstRow, lastRow, ++col, col, dbOrder.getOrderNumber()); + // 下单时间 + mergeIfNeed(writer, firstRow, lastRow, ++col, col, dbOrder.getCreateTime()); + // 收件人 + mergeIfNeed(writer, firstRow, lastRow, ++col, col, addr.getReceiver()); + // "手机" + mergeIfNeed(writer, firstRow, lastRow, ++col, col, addr.getMobile()); + // "收货地址" + mergeIfNeed(writer, firstRow, lastRow, ++col, col, addrInfo); + int prodNameCol = ++col; + int prodCountCol = ++col; + for (OrderItem orderItem : orderItems) { + row++; + // 商品名称 + writer.writeCellValue(prodNameCol, row, orderItem.getProdName()); + // 数量 + writer.writeCellValue(prodCountCol, row, orderItem.getProdCount()); + } + // 订单应付 + mergeIfNeed(writer, firstRow, lastRow, ++col, col, dbOrder.getTotal()); + // 订单运费 + mergeIfNeed(writer, firstRow, lastRow, ++col, col, dbOrder.getFreightAmount()); + // 订单实付 + mergeIfNeed(writer, firstRow, lastRow, ++col, col, dbOrder.getActualTotal()); + + } + writeExcel(response, writer); + } + + /** + * 如果需要合并的话,就合并 + */ + private void mergeIfNeed(ExcelWriter writer, int firstRow, int lastRow, int firstColumn, int lastColumn, Object content) { + if (lastRow - firstRow > 0 || lastColumn - firstColumn > 0) { + writer.merge(firstRow, lastRow, firstColumn, lastColumn, content, false); + } else { + writer.writeCellValue(firstColumn, firstRow, content); + } + + } + + private void writeExcel(HttpServletResponse response, ExcelWriter writer) { + //response为HttpServletResponse对象 + response.setContentType("application/vnd.ms-excel;charset=utf-8"); + //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码 + response.setHeader("Content-Disposition", "attachment;filename=1.xls"); + + ServletOutputStream servletOutputStream = null; + try { + servletOutputStream = response.getOutputStream(); + writer.flush(servletOutputStream); + servletOutputStream.flush(); + } catch (IORuntimeException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + writer.close(); + try { + servletOutputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/PickAddrController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/PickAddrController.java new file mode 100644 index 0000000..092a719 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/PickAddrController.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +import javax.validation.Valid; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yami.shop.common.enums.YamiHttpStatus; +import com.yami.shop.common.exception.YamiShopBindException; +import com.yami.shop.security.util.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +import com.yami.shop.common.util.PageParam; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yami.shop.bean.model.PickAddr; +import com.yami.shop.service.PickAddrService; + +import cn.hutool.core.util.StrUtil; + + + +/** + * + * @author lgh on 2018/10/17. + */ +@RestController +@RequestMapping("/shop/pickAddr") +public class PickAddrController { + + @Autowired + private PickAddrService pickAddrService; + + /** + * 分页获取 + */ + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('shop:pickAddr:page')") + public ResponseEntity> page(PickAddr pickAddr,PageParam page){ + IPage pickAddrs = pickAddrService.page(page,new LambdaQueryWrapper() + .like(StrUtil.isNotBlank(pickAddr.getAddrName()),PickAddr::getAddrName,pickAddr.getAddrName()) + .orderByDesc(PickAddr::getAddrId)); + return ResponseEntity.ok(pickAddrs); + } + + /** + * 获取信息 + */ + @GetMapping("/info/{id}") + @PreAuthorize("@pms.hasPermission('shop:pickAddr:info')") + public ResponseEntity info(@PathVariable("id") Long id){ + PickAddr pickAddr = pickAddrService.getById(id); + return ResponseEntity.ok(pickAddr); + } + + /** + * 保存 + */ + @PostMapping + @PreAuthorize("@pms.hasPermission('shop:pickAddr:save')") + public ResponseEntity save(@Valid @RequestBody PickAddr pickAddr){ + pickAddr.setShopId(SecurityUtils.getSysUser().getShopId()); + pickAddrService.save(pickAddr); + return ResponseEntity.ok().build(); + } + + /** + * 修改 + */ + @PutMapping + @PreAuthorize("@pms.hasPermission('shop:pickAddr:update')") + public ResponseEntity update(@Valid @RequestBody PickAddr pickAddr){ + PickAddr dbPickAddr = pickAddrService.getById(pickAddr.getAddrId()); + if (!Objects.equals(dbPickAddr.getShopId(),pickAddr.getShopId())) { + throw new YamiShopBindException(YamiHttpStatus.UNAUTHORIZED); + } + pickAddrService.updateById(pickAddr); + return ResponseEntity.ok().build(); + } + + /** + * 删除 + */ + @DeleteMapping + @PreAuthorize("@pms.hasPermission('shop:pickAddr:delete')") + public ResponseEntity delete(@RequestBody Long[] ids){ + pickAddrService.removeByIds(Arrays.asList(ids)); + return ResponseEntity.ok().build(); + } +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/PointsChangeController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/PointsChangeController.java new file mode 100644 index 0000000..039b7e3 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/PointsChangeController.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + +import javax.validation.Valid; +import java.util.List; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import com.yami.shop.common.util.PageParam; +import com.baomidou.mybatisplus.core.metadata.IPage; + + + + +import com.yami.shop.service.PointsChangeService; +import com.yami.shop.bean.model.PointsChange; + +/** + * + * @author lgh on 2019/04/10. + */ +@RestController +@RequestMapping("/admin/pointsChange") +public class PointsChangeController { + + @Autowired + private PointsChangeService pointsChangeService; + + /** + * 分页获取 + */ + @GetMapping("/page") +// @PreAuthorize("@pms.hasPermission('admin:pointsChange:page')") + public ResponseEntity> page(PointsChange pointsChange,PageParam page){ + IPage list = pointsChangeService.page(page,new LambdaQueryWrapper()); + return ResponseEntity.ok(list); + } + + /** + * 获取信息 + */ + @GetMapping("/info/{id}") + //@PreAuthorize("@pms.hasPermission('admin:pointsChange:info')") + public ResponseEntity info(@PathVariable("id") Long id){ + PointsChange pointsChange = pointsChangeService.getById(id); + return ResponseEntity.ok(pointsChange); + } + + /** + * 保存 + */ + @PostMapping +// @PreAuthorize("@pms.hasPermission('admin:pointsChange:save')") + public ResponseEntity save(@RequestBody @Valid PointsChange pointsChange){ + pointsChangeService.save(pointsChange); + return ResponseEntity.ok().build(); + } + + /** + * 修改 + */ + @PutMapping +// @PreAuthorize("@pms.hasPermission('admin:pointsChange:update')") + public ResponseEntity update(@RequestBody @Valid PointsChange pointsChange){ + pointsChangeService.updateById(pointsChange); + return ResponseEntity.ok().build(); + } + + /** + * 删除 + */ + @DeleteMapping("/{id}") + //@PreAuthorize("@pms.hasPermission('admin:pointsChange:delete')") + public ResponseEntity delete(@PathVariable Long id){ + pointsChangeService.removeById(id); + return ResponseEntity.ok().build(); + } +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/PointsController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/PointsController.java new file mode 100644 index 0000000..0d877b3 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/PointsController.java @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + +import javax.validation.Valid; +import java.util.Date; +import java.util.List; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yami.shop.security.util.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import com.yami.shop.common.util.PageParam; +import com.baomidou.mybatisplus.core.metadata.IPage; + + + + +import com.yami.shop.service.PointsService; +import com.yami.shop.bean.model.Points; + +/** + * + * @author lgh on 2019/04/10. + */ +@RestController +@RequestMapping("/points/points") +public class PointsController { + + @Autowired + private PointsService pointsService; + + /** + * 分页获取 + */ + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('points:points:page')") + public ResponseEntity> page(Points points,PageParam page){ + IPage list = pointsService.page(page,new LambdaQueryWrapper()); + return ResponseEntity.ok(list); + } + + + /** + * 分页获取(携带user) + */ + @GetMapping("/page/anduser") + @PreAuthorize("@pms.hasPermission('points:points:page')") + public ResponseEntity> andUserPage( Points points ,PageParam< Points> page){ + points.setShopId(SecurityUtils.getSysUser().getShopId()); + IPage list = pointsService.getPointsAndSysUserPage(page,points); + return ResponseEntity.ok(list); + } + + /** + * 分页获取(只取name和id) + */ + @GetMapping("/page/name") + @PreAuthorize("@pms.hasPermission('points:points:page')") + public ResponseEntity> nameAndIdPage(Points points){ + points.setShopId(SecurityUtils.getSysUser().getShopId()); + List list = pointsService.getNameAndId(points); + return ResponseEntity.ok(list); + } + + + /** + * 获取信息 + */ + @GetMapping("/info/{id}") + @PreAuthorize("@pms.hasPermission('points:points:info')") + public ResponseEntity info(@PathVariable("id") Long id){ + Points points = pointsService.getById(id); + return ResponseEntity.ok(points); + } + + + + /** + * 保存 + */ + @PostMapping + @PreAuthorize("@pms.hasPermission('points:points:save')") + public ResponseEntity save(@RequestBody @Valid Points points){ + points.setModifier(SecurityUtils.getSysUser().getUserId()); + points.setUpdateTime(new Date()); + points.setShopId(SecurityUtils.getSysUser().getShopId()); + pointsService.save(points); + return ResponseEntity.ok().build(); + } + + /** + * 修改 + */ + @PutMapping + @PreAuthorize("@pms.hasPermission('points:points:update')") + public ResponseEntity update(@RequestBody @Valid Points points){ + points.setModifier(SecurityUtils.getSysUser().getUserId()); + points.setUpdateTime(new Date()); + pointsService.updateById(points); + return ResponseEntity.ok().build(); + } + + /** + * 删除 + */ + @DeleteMapping + @PreAuthorize("@pms.hasPermission('points:points:delete')") + public ResponseEntity delete(@RequestBody List ids){ + pointsService.removeByIds(ids); + return ResponseEntity.ok().build(); + } +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/PointsProdController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/PointsProdController.java new file mode 100644 index 0000000..389b25a --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/PointsProdController.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + +import javax.validation.Valid; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import com.yami.shop.common.util.PageParam; +import com.baomidou.mybatisplus.core.metadata.IPage; + + + + +import com.yami.shop.service.PointsProdService; +import com.yami.shop.bean.model.PointsProd; + +/** + * + * @author lgh on 2019/04/10. + */ +@RestController +@RequestMapping("/admin/pointsProd") +public class PointsProdController { + + @Autowired + private PointsProdService pointsProdService; + + /** + * 分页获取 + */ + @GetMapping("/page") + //@PreAuthorize("@pms.hasPermission('admin:pointsProd:page')") + public ResponseEntity> page(PointsProd pointsProd,PageParam page){ + IPage list = pointsProdService.page(page,new LambdaQueryWrapper()); + return ResponseEntity.ok(list); + } + + /** + * 获取信息 + */ + @GetMapping("/info/{id}") + //@PreAuthorize("@pms.hasPermission('admin:pointsProd:info')") + public ResponseEntity info(@PathVariable("id") Long id){ + PointsProd pointsProd = pointsProdService.getById(id); + return ResponseEntity.ok(pointsProd); + } + + /** + * 保存 + */ + @PostMapping +// @PreAuthorize("@pms.hasPermission('admin:pointsProd:save')") + public ResponseEntity save(@RequestBody @Valid PointsProd pointsProd){ + pointsProdService.save(pointsProd); + return ResponseEntity.ok().build(); + } + + /** + * 修改 + */ + @PutMapping +//@PreAuthorize("@pms.hasPermission('admin:pointsProd:update')") + public ResponseEntity update(@RequestBody @Valid PointsProd pointsProd){ + pointsProdService.updateById(pointsProd); + return ResponseEntity.ok().build(); + } + + /** + * 删除 + */ + @DeleteMapping("/{id}") + //@PreAuthorize("@pms.hasPermission('admin:pointsProd:delete')") + public ResponseEntity delete(@PathVariable Long id){ + pointsProdService.removeById(id); + return ResponseEntity.ok().build(); + } +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/PointsWalletController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/PointsWalletController.java new file mode 100644 index 0000000..23570cb --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/PointsWalletController.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + +import javax.validation.Valid; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import com.yami.shop.common.util.PageParam; +import com.baomidou.mybatisplus.core.metadata.IPage; + + + +import com.yami.shop.service.PointsWalletService; +import com.yami.shop.bean.model.PointsWallet; + +/** + * + * @author lgh on 2019/04/10. + */ +@RestController +@RequestMapping("/admin/pointsWallet") +public class PointsWalletController { + + @Autowired + private PointsWalletService pointsWalletService; + + /** + * 分页获取 + */ + @GetMapping("/page") + //@PreAuthorize("@pms.hasPermission('admin:pointsWallet:page')") + public ResponseEntity> page(PointsWallet pointsWallet,PageParam page){ + IPage list = pointsWalletService.page(page,new LambdaQueryWrapper()); + return ResponseEntity.ok(list); + } + + /** + * 获取信息 + */ + @GetMapping("/info/{id}") + //@PreAuthorize("@pms.hasPermission('admin:pointsWallet:info')") + public ResponseEntity info(@PathVariable("id") Long id){ + PointsWallet pointsWallet = pointsWalletService.getById(id); + return ResponseEntity.ok(pointsWallet); + } + + /** + * 保存 + */ + @PostMapping + //@PreAuthorize("@pms.hasPermission('admin:pointsWallet:save')") + public ResponseEntity save(@RequestBody @Valid PointsWallet pointsWallet){ + pointsWalletService.save(pointsWallet); + return ResponseEntity.ok().build(); + } + + /** + * 修改 + */ + @PutMapping + //@PreAuthorize("@pms.hasPermission('admin:pointsWallet:update')") + public ResponseEntity update(@RequestBody @Valid PointsWallet pointsWallet){ + pointsWalletService.updateById(pointsWallet); + return ResponseEntity.ok().build(); + } + + /** + * 删除 + */ + @DeleteMapping("/{id}") + //@PreAuthorize("@pms.hasPermission('admin:pointsWallet:delete')") + public ResponseEntity delete(@PathVariable Long id){ + pointsWalletService.removeById(id); + return ResponseEntity.ok().build(); + } +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/ProdCommController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/ProdCommController.java new file mode 100644 index 0000000..cb1de9e --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/ProdCommController.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.yami.shop.bean.model.ProdComm; +import com.yami.shop.common.annotation.SysLog; +import com.yami.shop.common.util.Json; +import com.yami.shop.service.ProdCommService; +import lombok.AllArgsConstructor; + +import javax.validation.Valid; + +import lombok.SneakyThrows; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yami.shop.common.util.PageParam; +import com.baomidou.mybatisplus.core.metadata.IPage; + +import java.util.ArrayList; +import java.util.Date; + +/** + * 商品评论 + * + * @author xwc + * @date 2019-04-19 10:43:57 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/prod/prodComm" ) +public class ProdCommController { + + private final ProdCommService prodCommService; + + /** + * 分页查询 + * @param page 分页对象 + * @param prodComm 商品评论 + * @return 分页数据 + */ + @GetMapping("/page" ) + @PreAuthorize("@pms.hasPermission('prod:prodComm:page')" ) + public ResponseEntity> getProdCommPage(PageParam page, ProdComm prodComm) { + return ResponseEntity.ok(prodCommService.getProdCommPage(page,prodComm)); + } + + + /** + * 通过id查询商品评论 + * @param prodCommId id + * @return 单个数据 + */ + @GetMapping("/info/{prodCommId}" ) + @PreAuthorize("@pms.hasPermission('prod:prodComm:info')" ) + public ResponseEntity getById(@PathVariable("prodCommId" ) Long prodCommId) { + return ResponseEntity.ok(prodCommService.getById(prodCommId)); + } + + /** + * 新增商品评论 + * @param prodComm 商品评论 + * @return 是否新增成功 + */ + @SysLog("新增商品评论" ) + @PostMapping + @PreAuthorize("@pms.hasPermission('prod:prodComm:save')" ) + public ResponseEntity save(@RequestBody @Valid ProdComm prodComm) { + return ResponseEntity.ok(prodCommService.save(prodComm)); + } + + /** + * 修改商品评论 + * @param prodComm 商品评论 + * @return 是否修改成功 + */ + @SysLog("修改商品评论" ) + @PutMapping + @PreAuthorize("@pms.hasPermission('prod:prodComm:update')" ) + public ResponseEntity updateById(@RequestBody @Valid ProdComm prodComm) { + prodComm.setReplyTime(new Date()); + return ResponseEntity.ok(prodCommService.updateById(prodComm)); + } + + /** + * 通过id删除商品评论 + * @param prodCommId id + * @return 是否删除成功 + */ + @SysLog("删除商品评论" ) + @DeleteMapping("/{prodCommId}" ) + @PreAuthorize("@pms.hasPermission('prod:prodComm:delete')" ) + public ResponseEntity removeById(@PathVariable Long prodCommId) { + return ResponseEntity.ok(prodCommService.removeById(prodCommId)); + } + +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/ProdTagController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/ProdTagController.java new file mode 100644 index 0000000..1e87bb8 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/ProdTagController.java @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yami.shop.common.util.PageParam; +import com.yami.shop.bean.model.ProdTag; +import com.yami.shop.common.annotation.SysLog; +import com.yami.shop.common.exception.YamiShopBindException; +import com.yami.shop.security.util.SecurityUtils; +import com.yami.shop.service.ProdTagService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.Date; +import java.util.List; + +/** + * 商品分组 + * + * @author hzm + * @date 2019-04-18 09:08:36 + */ +@RestController +@RequestMapping("/prod/prodTag") +public class ProdTagController { + + @Autowired + private ProdTagService prodTagService; + + /** + * 分页查询 + * + * @param page 分页对象 + * @param prodTag 商品分组标签 + * @return 分页数据 + */ + @GetMapping("/page") + public ResponseEntity> getProdTagPage(PageParam page, ProdTag prodTag) { + IPage tagIPage = prodTagService.page( + page, new LambdaQueryWrapper() + .eq(prodTag.getStatus() != null, ProdTag::getStatus, prodTag.getStatus()) + .like(prodTag.getTitle() != null, ProdTag::getTitle, prodTag.getTitle()) + .orderByDesc(ProdTag::getSeq)); + return ResponseEntity.ok(tagIPage); + + } + + + /** + * 通过id查询商品分组标签 + * + * @param id id + * @return 单个数据 + */ + @GetMapping("/info/{id}") + public ResponseEntity getById(@PathVariable("id") Long id) { + return ResponseEntity.ok(prodTagService.getById(id)); + } + + /** + * 新增商品分组标签 + * + * @param prodTag 商品分组标签 + * @return 是否新增成功 + */ + @SysLog("新增商品分组标签") + @PostMapping + @PreAuthorize("@pms.hasPermission('prod:prodTag:save')") + public ResponseEntity save(@RequestBody @Valid ProdTag prodTag) { + prodTag.setCreateTime(new Date()); + prodTag.setUpdateTime(new Date()); + prodTag.setIsDefault(0); + prodTag.setShopId(SecurityUtils.getSysUser().getShopId()); + prodTag.setStatus(1); + prodTag.setProdCount(0L); + prodTagService.removeProdTag(); + return ResponseEntity.ok(prodTagService.save(prodTag)); + } + + /** + * 修改商品分组标签 + * + * @param prodTag 商品分组标签 + * @return 是否修改成功 + */ + @SysLog("修改商品分组标签") + @PutMapping + @PreAuthorize("@pms.hasPermission('prod:prodTag:update')") + public ResponseEntity updateById(@RequestBody @Valid ProdTag prodTag) { + prodTag.setUpdateTime(new Date()); + prodTagService.removeProdTag(); + return ResponseEntity.ok(prodTagService.updateById(prodTag)); + } + + /** + * 通过id删除商品分组标签 + * + * @param id id + * @return 是否删除成功 + */ + @SysLog("删除商品分组标签") + @DeleteMapping("/{id}") + @PreAuthorize("@pms.hasPermission('prod:prodTag:delete')") + public ResponseEntity removeById(@PathVariable Long id) { + ProdTag prodTag = prodTagService.getById(id); + if (prodTag.getIsDefault() != 0) { + throw new YamiShopBindException("默认标签不能删除"); + } + prodTagService.removeProdTag(); + return ResponseEntity.ok(prodTagService.removeById(id)); + } + + @GetMapping("/listTagList") + @PreAuthorize("@pms.hasPermission('prod:prodTag:update')") + public ResponseEntity> listTagList() { + return ResponseEntity.ok(prodTagService.list()); + + } + + +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/ProdTagReferenceController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/ProdTagReferenceController.java new file mode 100644 index 0000000..f9f7013 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/ProdTagReferenceController.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yami.shop.common.util.PageParam; +import com.yami.shop.bean.model.ProdTagReference; +import com.yami.shop.common.annotation.SysLog; +import com.yami.shop.service.ProdTagReferenceService; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +/** + * 分组标签引用 + * + * @author hzm + * @date 2019-04-18 16:28:01 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/generator/prodTagReference" ) +public class ProdTagReferenceController { + + private final ProdTagReferenceService prodTagReferenceService; + + /** + * 分页查询 + * @param page 分页对象 + * @param prodTagReference 分组标签引用 + * @return 分页数据 + */ + @GetMapping("/page" ) + public ResponseEntity> getProdTagReferencePage(PageParam page, ProdTagReference prodTagReference) { + return ResponseEntity.ok(prodTagReferenceService.page(page, new LambdaQueryWrapper())); + } + + + /** + * 通过id查询分组标签引用 + * @param referenceId id + * @return 单个数据 + */ + @GetMapping("/info/{referenceId}" ) + public ResponseEntity getById(@PathVariable("referenceId" ) Long referenceId) { + return ResponseEntity.ok(prodTagReferenceService.getById(referenceId)); + } + + /** + * 新增分组标签引用 + * @param prodTagReference 分组标签引用 + * @return 是否新增成功 + */ + @SysLog("新增分组标签引用" ) + @PostMapping + @PreAuthorize("@pms.hasPermission('generator:prodTagReference:save')" ) + public ResponseEntity save(@RequestBody @Valid ProdTagReference prodTagReference) { + return ResponseEntity.ok(prodTagReferenceService.save(prodTagReference)); + } + + /** + * 修改分组标签引用 + * @param prodTagReference 分组标签引用 + * @return 是否修改成功 + */ + @SysLog("修改分组标签引用" ) + @PutMapping + @PreAuthorize("@pms.hasPermission('generator:prodTagReference:update')" ) + public ResponseEntity updateById(@RequestBody @Valid ProdTagReference prodTagReference) { + return ResponseEntity.ok(prodTagReferenceService.updateById(prodTagReference)); + } + + /** + * 通过id删除分组标签引用 + * @param referenceId id + * @return 是否删除成功 + */ + @SysLog("删除分组标签引用" ) + @DeleteMapping("/{referenceId}" ) + @PreAuthorize("@pms.hasPermission('generator:prodTagReference:delete')" ) + public ResponseEntity removeById(@PathVariable Long referenceId) { + return ResponseEntity.ok(prodTagReferenceService.removeById(referenceId)); + } + +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/ProductController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/ProductController.java new file mode 100644 index 0000000..a86fafb --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/ProductController.java @@ -0,0 +1,230 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yami.shop.common.util.PageParam; +import com.yami.shop.bean.model.Product; +import com.yami.shop.bean.model.Sku; +import com.yami.shop.bean.param.ProductParam; +import com.yami.shop.common.enums.YamiHttpStatus; +import com.yami.shop.common.exception.YamiShopBindException; +import com.yami.shop.common.util.Json; +import com.yami.shop.security.util.SecurityUtils; +import com.yami.shop.service.BasketService; +import com.yami.shop.service.ProdTagReferenceService; +import com.yami.shop.service.ProductService; +import com.yami.shop.service.SkuService; +import ma.glasnost.orika.MapperFacade; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.Date; +import java.util.List; +import java.util.Objects; + + +/** + * 商品列表、商品发布controller + * + * @author lgh + */ +@Controller +@RequestMapping("/prod/prod") +public class ProductController { + + @Autowired + private ProductService productService; + + @Autowired + private MapperFacade mapperFacade; + + @Autowired + private SkuService skuService; + + @Autowired + private ProdTagReferenceService prodTagReferenceService; + + @Autowired + private BasketService basketService; + + /** + * 分页获取商品信息 + */ + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('prod:prod:page')") + public ResponseEntity> page(ProductParam product, PageParam page) { + IPage products = productService.page(page, + new LambdaQueryWrapper() + .like(StrUtil.isNotBlank(product.getProdName()), Product::getProdName, product.getProdName()) + .eq(Product::getShopId, SecurityUtils.getSysUser().getShopId()) + .eq(product.getStatus() != null, Product::getStatus, product.getStatus()) + .orderByDesc(Product::getPutawayTime)); + return ResponseEntity.ok(products); + } + + /** + * 获取信息 + */ + @GetMapping("/info/{prodId}") + @PreAuthorize("@pms.hasPermission('prod:prod:info')") + public ResponseEntity info(@PathVariable("prodId") Long prodId) { + Product prod = productService.getProductByProdId(prodId); + if (!Objects.equals(prod.getShopId(), SecurityUtils.getSysUser().getShopId())) { + throw new YamiShopBindException("没有权限获取该商品规格信息"); + } + List skuList = skuService.listByProdId(prodId); + prod.setSkuList(skuList); + + //获取分组标签 + List listTagId = prodTagReferenceService.listTagIdByProdId(prodId); + prod.setTagList(listTagId); + return ResponseEntity.ok(prod); + } + + /** + * 保存 + */ + @PostMapping + @PreAuthorize("@pms.hasPermission('prod:prod:save')") + public ResponseEntity save(@Valid @RequestBody ProductParam productParam) { + checkParam(productParam); + + Product product = mapperFacade.map(productParam, Product.class); + product.setDeliveryMode(Json.toJsonString(productParam.getDeliveryModeVo())); + product.setShopId(SecurityUtils.getSysUser().getShopId()); + product.setUpdateTime(new Date()); + if (product.getStatus() == 1) { + product.setPutawayTime(new Date()); + } + product.setCreateTime(new Date()); + productService.saveProduct(product); + return ResponseEntity.ok().build(); + } + + /** + * 修改 + */ + @PutMapping + @PreAuthorize("@pms.hasPermission('prod:prod:update')") + public ResponseEntity update(@Valid @RequestBody ProductParam productParam) { + checkParam(productParam); + Product dbProduct = productService.getProductByProdId(productParam.getProdId()); + if (!Objects.equals(dbProduct.getShopId(), SecurityUtils.getSysUser().getShopId())) { + return ResponseEntity.badRequest().body("无法修改非本店铺商品信息"); + } + + List dbSkus = skuService.listByProdId(dbProduct.getProdId()); + + + Product product = mapperFacade.map(productParam, Product.class); + product.setDeliveryMode(Json.toJsonString(productParam.getDeliveryModeVo())); + product.setUpdateTime(new Date()); + + if (dbProduct.getStatus() == 0 || productParam.getStatus() == 1) { + product.setPutawayTime(new Date()); + } + dbProduct.setSkuList(dbSkus); + productService.updateProduct(product, dbProduct); + + + List userIds = basketService.listUserIdByProdId(product.getProdId()); + + for (String userId : userIds) { + basketService.removeShopCartItemsCacheByUserId(userId); + } + for (Sku sku : dbSkus) { + skuService.removeSkuCacheBySkuId(sku.getSkuId(), sku.getProdId()); + } + return ResponseEntity.ok().build(); + } + + /** + * 删除 + */ + @DeleteMapping("/{prodId}") + @PreAuthorize("@pms.hasPermission('prod:prod:delete')") + public ResponseEntity delete(@PathVariable("prodId") Long prodId) { + Product dbProduct = productService.getProductByProdId(prodId); + if (!Objects.equals(dbProduct.getShopId(), SecurityUtils.getSysUser().getShopId())) { + throw new YamiShopBindException("无法获取非本店铺商品信息"); + } + List dbSkus = skuService.listByProdId(dbProduct.getProdId()); + // 删除商品 + productService.removeProductByProdId(prodId); + + for (Sku sku : dbSkus) { + skuService.removeSkuCacheBySkuId(sku.getSkuId(), sku.getProdId()); + } + + + List userIds = basketService.listUserIdByProdId(prodId); + + for (String userId : userIds) { + basketService.removeShopCartItemsCacheByUserId(userId); + } + + return ResponseEntity.ok().build(); + } + + + /** + * 更新商品状态 + */ + @PutMapping("/prodStatus") + @PreAuthorize("@pms.hasPermission('prod:prod:status')") + public ResponseEntity shopStatus(@RequestParam Long prodId, @RequestParam Integer prodStatus) { + Product product = new Product(); + product.setProdId(prodId); + product.setStatus(prodStatus); + if (prodStatus == 1) { + product.setPutawayTime(new Date()); + } + productService.updateById(product); + productService.removeProductCacheByProdId(prodId); + List userIds = basketService.listUserIdByProdId(prodId); + + for (String userId : userIds) { + basketService.removeShopCartItemsCacheByUserId(userId); + } + return ResponseEntity.ok().build(); + } + + private void checkParam(ProductParam productParam) { + if (CollectionUtil.isEmpty(productParam.getTagList())) { + throw new YamiShopBindException("请选择产品分组"); + } + + Product.DeliveryModeVO deliveryMode = productParam.getDeliveryModeVo(); + boolean hasDeliverMode = deliveryMode != null + && (deliveryMode.getHasShopDelivery() || deliveryMode.getHasUserPickUp()); + if (!hasDeliverMode) { + throw new YamiShopBindException("请选择配送方式"); + } + List skuList = productParam.getSkuList(); + boolean isAllUnUse = true; + for (Sku sku : skuList) { + if (sku.getStatus() == 1) { + isAllUnUse = false; + } + } + if (isAllUnUse) { + throw new YamiShopBindException("至少要启用一种商品规格"); + } + } +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/ShopDetailController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/ShopDetailController.java new file mode 100644 index 0000000..6f2ad53 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/ShopDetailController.java @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +import javax.validation.Valid; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yami.shop.security.util.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + + +import com.yami.shop.common.util.PageParam; +import com.baomidou.mybatisplus.core.metadata.IPage; + +import com.yami.shop.bean.model.ShopDetail; +import com.yami.shop.bean.param.ShopDetailParam; +import com.yami.shop.service.ShopDetailService; + +import cn.hutool.core.util.StrUtil; +import ma.glasnost.orika.MapperFacade; + + + +/** + * + * @author lgh on 2018/08/29. + */ +@Controller +@RequestMapping("/shop/shopDetail") +public class ShopDetailController { + + @Autowired + private ShopDetailService shopDetailService; + + @Autowired + private MapperFacade mapperFacade; + + + /** + * 修改分销开关 + */ + @PutMapping("/isDistribution") + //@PreAuthorize("@pms.hasPermission('shop:shopDetail:update')") + public ResponseEntity updateIsDistribution(@RequestParam Integer isDistribution){ + ShopDetail shopDetail=new ShopDetail(); + shopDetail.setShopId(SecurityUtils.getSysUser().getShopId()); + shopDetail.setIsDistribution(isDistribution); + shopDetailService.updateById(shopDetail); + // 更新完成后删除缓存 + shopDetailService.removeShopDetailCacheByShopId(shopDetail.getShopId()); + return ResponseEntity.ok().build(); + } + /** + * 获取信息 + */ + @GetMapping("/info") + @PreAuthorize("@pms.hasPermission('shop:shopDetail:info')") + public ResponseEntity info(){ + ShopDetail shopDetail = shopDetailService.getShopDetailByShopId(SecurityUtils.getSysUser().getShopId()); + return ResponseEntity.ok(shopDetail); + } + + + /** + * 分页获取 + */ + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('shop:shopDetail:page')") + public ResponseEntity> page(ShopDetail shopDetail,PageParam page){ + IPage shopDetails = shopDetailService.page(page, + new LambdaQueryWrapper() + .like(StrUtil.isNotBlank(shopDetail.getShopName()),ShopDetail::getShopName,shopDetail.getShopName()) + .orderByDesc(ShopDetail::getShopId)); + return ResponseEntity.ok(shopDetails); + } + + /** + * 获取信息 + */ + @GetMapping("/info/{shopId}") + @PreAuthorize("@pms.hasPermission('shop:shopDetail:info')") + public ResponseEntity info(@PathVariable("shopId") Long shopId){ + ShopDetail shopDetail = shopDetailService.getShopDetailByShopId(shopId); + // 店铺图片 + return ResponseEntity.ok(shopDetail); + } + + /** + * 保存 + */ + @PostMapping + @PreAuthorize("@pms.hasPermission('shop:shopDetail:save')") + public ResponseEntity save(@Valid ShopDetailParam shopDetailParam){ + ShopDetail shopDetail = mapperFacade.map(shopDetailParam, ShopDetail.class); + shopDetail.setCreateTime(new Date()); + shopDetail.setShopStatus(1); + shopDetailService.save(shopDetail); + return ResponseEntity.ok().build(); + } + + /** + * 修改 + */ + @PutMapping + @PreAuthorize("@pms.hasPermission('shop:shopDetail:update')") + public ResponseEntity update(@Valid ShopDetailParam shopDetailParam){ + ShopDetail daShopDetail = shopDetailService.getShopDetailByShopId(shopDetailParam.getShopId()); + ShopDetail shopDetail = mapperFacade.map(shopDetailParam, ShopDetail.class); + shopDetail.setUpdateTime(new Date()); + shopDetailService.updateShopDetail(shopDetail,daShopDetail); + return ResponseEntity.ok().build(); + } + + /** + * 删除 + */ + @DeleteMapping("/{id}") + @PreAuthorize("@pms.hasPermission('shop:shopDetail:delete')") + public ResponseEntity delete(@PathVariable Long id){ + shopDetailService.deleteShopDetailByShopId(id); + return ResponseEntity.ok().build(); + } + + /** + * 更新店铺状态 + */ + @PutMapping("/shopStatus") + @PreAuthorize("@pms.hasPermission('shop:shopDetail:shopStatus')") + public ResponseEntity shopStatus(@RequestParam Long shopId,@RequestParam Integer shopStatus){ + ShopDetail shopDetail = new ShopDetail(); + shopDetail.setShopId(shopId); + shopDetail.setShopStatus(shopStatus); + shopDetailService.updateById(shopDetail); + // 更新完成后删除缓存 + shopDetailService.removeShopDetailCacheByShopId(shopDetail.getShopId()); + return ResponseEntity.ok().build(); + } + + + /** + * 获取所有的店铺名称 + */ + @GetMapping("/listShopName") + public ResponseEntity> listShopName(){ + List list = shopDetailService.list().stream().map((dbShopDetail) ->{ + ShopDetail shopDetail = new ShopDetail(); + shopDetail.setShopId(dbShopDetail.getShopId()); + shopDetail.setShopName(dbShopDetail.getShopName()); + return shopDetail; + }).collect(Collectors.toList()); + return ResponseEntity.ok(list); + } +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/SpecController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/SpecController.java new file mode 100644 index 0000000..a1d0f8b --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/SpecController.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + +import java.util.List; +import java.util.Objects; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yami.shop.common.enums.YamiHttpStatus; + +import com.yami.shop.security.util.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.yami.shop.common.util.PageParam; +import com.baomidou.mybatisplus.core.metadata.IPage; + +import com.yami.shop.bean.enums.ProdPropRule; +import com.yami.shop.bean.model.ProdProp; +import com.yami.shop.bean.model.ProdPropValue; +import com.yami.shop.common.exception.YamiShopBindException; +import com.yami.shop.service.ProdPropService; +import com.yami.shop.service.ProdPropValueService; + +/** + * 规格管理 + * + * @author lgh + */ +@RestController +@RequestMapping("/prod/spec") +public class SpecController { + + @Autowired + private ProdPropService prodPropService; + @Autowired + private ProdPropValueService prodPropValueService; + + /** + * 分页获取 + */ + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('prod:spec:page')") + public ResponseEntity> page(ProdProp prodProp,PageParam page) { + prodProp.setRule(ProdPropRule.SPEC.value()); + prodProp.setShopId(SecurityUtils.getSysUser().getShopId()); + IPage list = prodPropService.pagePropAndValue(prodProp, page); + return ResponseEntity.ok(list); + } + + + /** + * 获取所有的规格 + */ + @GetMapping("/list") + public ResponseEntity> list() { + List list = prodPropService.list(new LambdaQueryWrapper().eq(ProdProp::getRule, ProdPropRule.SPEC.value()).eq(ProdProp::getShopId, SecurityUtils.getSysUser().getShopId())); + return ResponseEntity.ok(list); + } + + /** + * 根据规格id获取规格值 + */ + @GetMapping("/listSpecValue/{specId}") + public ResponseEntity> listSpecValue(@PathVariable("specId") Long specId) { + List list = prodPropValueService.list(new LambdaQueryWrapper().eq(ProdPropValue::getPropId, specId)); + return ResponseEntity.ok(list); + } + + /** + * 保存 + */ + @PostMapping + @PreAuthorize("@pms.hasPermission('prod:spec:save')") + public ResponseEntity save(@RequestBody ProdProp prodProp) { + prodProp.setRule(ProdPropRule.SPEC.value()); + prodProp.setShopId(SecurityUtils.getSysUser().getShopId()); + prodPropService.saveProdPropAndValues(prodProp); + return ResponseEntity.ok().build(); + } + + /** + * 修改 + */ + @PutMapping + @PreAuthorize("@pms.hasPermission('prod:spec:update')") + public ResponseEntity update(@RequestBody ProdProp prodProp) { + ProdProp dbProdProp = prodPropService.getById(prodProp.getPropId()); + if (!Objects.equals(dbProdProp.getShopId(), SecurityUtils.getSysUser().getShopId())) { + throw new YamiShopBindException("没有权限获取该商品规格信息"); + } + prodProp.setRule(ProdPropRule.SPEC.value()); + prodProp.setShopId(SecurityUtils.getSysUser().getShopId()); + prodPropService.updateProdPropAndValues(prodProp); + return ResponseEntity.ok().build(); + } + + /** + * 删除 + */ + @DeleteMapping("/{id}") + @PreAuthorize("@pms.hasPermission('prod:spec:delete')") + public ResponseEntity delete(@PathVariable Long id) { + prodPropService.deleteProdPropAndValues(id, ProdPropRule.SPEC.value(), SecurityUtils.getSysUser().getShopId()); + return ResponseEntity.ok().build(); + } +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/TransportController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/TransportController.java new file mode 100644 index 0000000..ef92ad2 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/TransportController.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + +import java.util.Date; +import java.util.List; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yami.shop.security.util.SecurityUtils; +import org.apache.commons.lang3.StringUtils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +import com.yami.shop.common.util.PageParam; +import com.baomidou.mybatisplus.core.metadata.IPage; + +import com.yami.shop.bean.model.Transport; +import com.yami.shop.service.TransportService; + +/** + * @author lgh on 2018/11/16. + */ +@RestController +@RequestMapping("/shop/transport") +public class TransportController { + + @Autowired + private TransportService transportService; + + + /** + * 分页获取 + */ + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('shop:transport:page')") + public ResponseEntity> page(Transport transport,PageParam page) { + Long shopId = SecurityUtils.getSysUser().getShopId(); + IPage transports = transportService.page(page, + new LambdaQueryWrapper() + .eq(Transport::getShopId, shopId) + .like(StringUtils.isNotBlank(transport.getTransName()), Transport::getTransName, transport.getTransName())); + return ResponseEntity.ok(transports); + } + + /** + * 获取信息 + */ + @GetMapping("/info/{id}") + @PreAuthorize("@pms.hasPermission('shop:transport:info')") + public ResponseEntity info(@PathVariable("id") Long id) { + Transport transport = transportService.getTransportAndAllItems(id); + return ResponseEntity.ok(transport); + } + + /** + * 保存 + */ + @PostMapping + @PreAuthorize("@pms.hasPermission('shop:transport:save')") + public ResponseEntity save(@RequestBody Transport transport) { + Long shopId = SecurityUtils.getSysUser().getShopId(); + transport.setShopId(shopId); + Date createTime = new Date(); + transport.setCreateTime(createTime); + transportService.insertTransportAndTransfee(transport); + return ResponseEntity.ok().build(); + } + + /** + * 修改 + */ + @PutMapping + @PreAuthorize("@pms.hasPermission('shop:transport:update')") + public ResponseEntity update(@RequestBody Transport transport) { + transportService.updateTransportAndTransfee(transport); + return ResponseEntity.ok().build(); + } + + /** + * 删除 + */ + @DeleteMapping + @PreAuthorize("@pms.hasPermission('shop:transport:delete')") + public ResponseEntity delete(@RequestBody Long[] ids) { + transportService.deleteTransportAndTransfeeAndTranscity(ids); + // 删除运费模板的缓存 + for (Long id : ids) { + transportService.removeTransportAndAllItemsCache(id); + } + return ResponseEntity.ok().build(); + } + + + /** + * 获取运费模板列表 + */ + @GetMapping("/list") + public ResponseEntity> list() { + Long shopId = SecurityUtils.getSysUser().getShopId(); + List list = transportService.list(new LambdaQueryWrapper().eq(Transport::getShopId, shopId)); + return ResponseEntity.ok(list); + } + +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/UserAddrController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/UserAddrController.java new file mode 100644 index 0000000..0da34dd --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/UserAddrController.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yami.shop.common.util.PageParam; +import com.yami.shop.bean.model.UserAddr; +import com.yami.shop.common.annotation.SysLog; +import com.yami.shop.service.UserAddrService; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +/** + * 用户地址管理 + * + * @author hzm + * @date 2019-04-15 10:49:40 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/user/addr") +public class UserAddrController { + + private final UserAddrService userAddrService; + + /** + * 分页查询 + * + * @param page 分页对象 + * @param userAddr 用户地址管理 + * @return 分页数据 + */ + @GetMapping("/page") + public ResponseEntity> getUserAddrPage(PageParam page, UserAddr userAddr) { + return ResponseEntity.ok(userAddrService.page(page, new LambdaQueryWrapper())); + } + + + /** + * 通过id查询用户地址管理 + * + * @param addrId id + * @return 单个数据 + */ + @GetMapping("/info/{addrId}") + public ResponseEntity getById(@PathVariable("addrId") Long addrId) { + return ResponseEntity.ok(userAddrService.getById(addrId)); + } + + /** + * 新增用户地址管理 + * + * @param userAddr 用户地址管理 + * @return 是否新增成功 + */ + @SysLog("新增用户地址管理") + @PostMapping + @PreAuthorize("@pms.hasPermission('user:addr:save')") + public ResponseEntity save(@RequestBody @Valid UserAddr userAddr) { + return ResponseEntity.ok(userAddrService.save(userAddr)); + } + + /** + * 修改用户地址管理 + * + * @param userAddr 用户地址管理 + * @return 是否修改成功 + */ + @SysLog("修改用户地址管理") + @PutMapping + @PreAuthorize("@pms.hasPermission('user:addr:update')") + public ResponseEntity updateById(@RequestBody @Valid UserAddr userAddr) { + return ResponseEntity.ok(userAddrService.updateById(userAddr)); + } + + /** + * 通过id删除用户地址管理 + * + * @param addrId id + * @return 是否删除成功 + */ + @SysLog("删除用户地址管理") + @DeleteMapping("/{addrId}") + @PreAuthorize("@pms.hasPermission('user:addr:delete')") + public ResponseEntity removeById(@PathVariable Long addrId) { + return ResponseEntity.ok(userAddrService.removeById(addrId)); + } + +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/UserController.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/UserController.java new file mode 100644 index 0000000..22fab83 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/controller/UserController.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.controller; + +import java.util.Arrays; +import java.util.Date; +import java.util.UUID; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +import com.yami.shop.common.util.PageParam; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yami.shop.bean.model.User; +import com.yami.shop.service.UserService; + +import cn.hutool.extra.emoji.EmojiUtil; + + +/** + * @author lgh on 2018/10/16. + */ +@RestController +@RequestMapping("/admin/user") +public class UserController { + + @Autowired + private UserService userService; + + /** + * 分页获取 + */ + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('admin:user:page')") + public ResponseEntity> page(User user,PageParam page) { + IPage userIPage = userService.page(page, new LambdaQueryWrapper() + .like(StrUtil.isNotBlank(user.getNickName()), User::getNickName, user.getNickName()) + .eq(user.getStatus() != null, User::getStatus, user.getStatus())); + for (User userResult : userIPage.getRecords()) { + userResult.setNickName(EmojiUtil.toUnicode(userResult.getNickName() == null ? "" : userResult.getNickName())); + } + return ResponseEntity.ok(userIPage); + } + + /** + * 获取信息 + */ + @GetMapping("/info/{userId}") + @PreAuthorize("@pms.hasPermission('admin:user:info')") + public ResponseEntity info(@PathVariable("userId") String userId) { + User user = userService.getById(userId); + user.setNickName(EmojiUtil.toUnicode(user.getNickName() == null ? "" : user.getNickName())); + return ResponseEntity.ok(user); + } + + /** + * 修改 + */ + @PutMapping + @PreAuthorize("@pms.hasPermission('admin:user:update')") + public ResponseEntity update(@RequestBody User user) { + user.setModifyTime(new Date()); + user.setNickName(EmojiUtil.toAlias(user.getNickName() == null ? "" : user.getNickName())); + userService.updateById(user); + return ResponseEntity.ok().build(); + } + + /** + * 删除 + */ + @DeleteMapping + @PreAuthorize("@pms.hasPermission('admin:user:delete')") + public ResponseEntity delete(@RequestBody String[] userIds) { + userService.removeByIds(Arrays.asList(userIds)); + return ResponseEntity.ok().build(); + } +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/security/AuthorizationServerConfig.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/security/AuthorizationServerConfig.java new file mode 100644 index 0000000..7fae604 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/security/AuthorizationServerConfig.java @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.security; + + +import com.yami.shop.security.constants.SecurityConstants; +import com.yami.shop.security.service.YamiClientDetailsService; +import com.yami.shop.security.service.YamiSysUser; +import com.yami.shop.security.service.YamiUser; +import com.yami.shop.security.service.YamiUserDetailsService; +import com.yami.shop.security.util.YamiTokenServices; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; +import org.springframework.context.annotation.Primary; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.ProviderManager; +import org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper; +import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; +import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; +import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer; +import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices; +import org.springframework.security.oauth2.provider.token.TokenEnhancer; +import org.springframework.security.oauth2.provider.token.TokenStore; +import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore; +import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider; + +import javax.sql.DataSource; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +@Configuration +//@Order(2) +@EnableAuthorizationServer +public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { + + @Autowired + private YamiUserDetailsService yamiUserDetailsService; + + @Autowired + private AuthenticationManager authenticationManager; + + @Autowired + private DataSource dataSource; + + @Autowired + private RedisConnectionFactory redisConnectionFactory; + + private AuthorizationServerEndpointsConfigurer endpoints; + + @Bean + public TokenStore tokenStore() { + RedisTokenStore tokenStore = new RedisTokenStore(redisConnectionFactory); + tokenStore.setPrefix(SecurityConstants.YAMI_PREFIX + SecurityConstants.OAUTH_PREFIX); + return tokenStore; + } + + @Override + public void configure(ClientDetailsServiceConfigurer clients) throws Exception { + // 使用JdbcClientDetailsService客户端详情服务 + YamiClientDetailsService clientDetailsService = new YamiClientDetailsService(dataSource); + clientDetailsService.setSelectClientDetailsSql(SecurityConstants.DEFAULT_SELECT_STATEMENT); + clientDetailsService.setFindClientDetailsSql(SecurityConstants.DEFAULT_FIND_STATEMENT); + clients.withClientDetails(clientDetailsService); + } + + + @Override + public void configure(AuthorizationServerEndpointsConfigurer endpoints) { + endpoints.authenticationManager(authenticationManager) + .tokenStore(tokenStore()) + .tokenEnhancer(tokenEnhancer()) + .reuseRefreshTokens(false) + .userDetailsService(yamiUserDetailsService); + this.endpoints = endpoints; + endpoints.tokenServices(yamiTokenServices()); + } + + @Override + public void configure(AuthorizationServerSecurityConfigurer oauthServer) { + oauthServer + // 开启/oauth/token_key验证端口无权限访问 + .tokenKeyAccess("permitAll()") + // 开启/oauth/check_token验证端口认证权限访问 + .checkTokenAccess("isAuthenticated()"); + } + + + /** + * token增强。 + * + * @return TokenEnhancer + */ + @Bean + public TokenEnhancer tokenEnhancer() { + return (accessToken, authentication) -> { + final Map additionalInfo = new HashMap<>(8); + YamiSysUser yamiSysUser = (YamiSysUser) authentication.getUserAuthentication().getPrincipal(); + additionalInfo.put("shopId", yamiSysUser.getShopId()); + additionalInfo.put("userId", yamiSysUser.getUserId()); + additionalInfo.put("authorities", yamiSysUser.getAuthorities()); + ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo); + return accessToken; + }; + } + + @Primary + @Bean + @Lazy + public AuthorizationServerTokenServices yamiTokenServices() { + YamiTokenServices tokenServices = new YamiTokenServices(); + tokenServices.setTokenStore(tokenStore()); + tokenServices.setSupportRefreshToken(true);//支持刷新token + tokenServices.setReuseRefreshToken(true); + tokenServices.setClientDetailsService(endpoints.getClientDetailsService()); + tokenServices.setTokenEnhancer(endpoints.getTokenEnhancer()); + addUserDetailsService(tokenServices); + return tokenServices; + } + + private void addUserDetailsService(YamiTokenServices tokenServices) { + PreAuthenticatedAuthenticationProvider provider = new PreAuthenticatedAuthenticationProvider(); + provider.setPreAuthenticatedUserDetailsService(new UserDetailsByNameServiceWrapper<>( + yamiUserDetailsService)); + tokenServices.setAuthenticationManager(new ProviderManager(Collections.singletonList(provider))); + } + + +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/security/ResourceServerConfiguration.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/security/ResourceServerConfiguration.java new file mode 100644 index 0000000..d36e791 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/security/ResourceServerConfiguration.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.security; + +import com.yami.shop.security.filter.LoginAuthenticationFilter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; +import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +@Configuration +@EnableResourceServer +@EnableGlobalMethodSecurity(prePostEnabled = true) +public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter { + + @Autowired + private LoginAuthenticationFilter loginAuthenticationFilter; + + @Override + public void configure(HttpSecurity http) throws Exception { + // @formatter:off + http + .addFilterBefore(loginAuthenticationFilter, UsernamePasswordAuthenticationFilter.class) + // Since we want the protected resources to be accessible in the UI as well we need + // session creation to be allowed (it's disabled by default in 2.0.6) + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) + .and() + .requestMatchers().anyRequest() + .and() + .anonymous() + .and() + .authorizeRequests() + .antMatchers( + "/webjars/**", + "/swagger/**", + "/v2/api-docs", + "/doc.html", + "/swagger-ui.html", + "/swagger-resources/**", + "/captcha.jpg").permitAll() + .and() + .authorizeRequests() + .antMatchers("/**").authenticated();//配置所有访问控制,必须认证过后才可以访问 + // @formatter:on + } + + +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/security/WebSecurityConfig.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/security/WebSecurityConfig.java new file mode 100644 index 0000000..ccbc372 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/security/WebSecurityConfig.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.security; + + +import com.yami.shop.security.filter.LoginAuthenticationFilter; +import com.yami.shop.security.handler.LoginAuthFailedHandler; +import com.yami.shop.security.handler.LoginAuthSuccessHandler; +import com.yami.shop.security.provider.AdminAuthenticationProvider; +import com.yami.shop.security.service.YamiUserDetailsService; +import lombok.SneakyThrows; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.factory.PasswordEncoderFactories; +import org.springframework.security.crypto.password.PasswordEncoder; + + +@Configuration +@Order(90) +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + private LoginAuthSuccessHandler loginAuthSuccessHandler; + @Autowired + private LoginAuthFailedHandler loginAuthFailedHandler; + @Autowired + private AdminAuthenticationProvider adminAuthenticationProvider; + + @Override + @Bean + @SneakyThrows + public AuthenticationManager authenticationManagerBean() { + return super.authenticationManagerBean(); + } + + /** + * 用户验证 + * @param auth + */ + @Override + public void configure(AuthenticationManagerBuilder auth) { + auth.authenticationProvider(adminAuthenticationProvider); + } + + @Bean + public PasswordEncoder passwordEncoder(){ + return PasswordEncoderFactories.createDelegatingPasswordEncoder(); + } + + + @Bean + public LoginAuthenticationFilter loginAuthenticationFilter() { + LoginAuthenticationFilter filter = new LoginAuthenticationFilter(); + try { + filter.setAuthenticationManager(authenticationManagerBean()); + } catch (Exception e) { + e.printStackTrace(); + } + filter.setAuthenticationSuccessHandler(loginAuthSuccessHandler); + filter.setAuthenticationFailureHandler(loginAuthFailedHandler); + return filter; + } + +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/security/YamiSysUserDetailsServiceImpl.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/security/YamiSysUserDetailsServiceImpl.java new file mode 100644 index 0000000..5ec9556 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/security/YamiSysUserDetailsServiceImpl.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.security; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yami.shop.common.util.CacheManagerUtil; +import com.yami.shop.sys.constant.Constant; +import com.yami.shop.security.enums.App; +import com.yami.shop.security.exception.UsernameNotFoundExceptionBase; +import com.yami.shop.security.model.AppConnect; +import com.yami.shop.security.service.YamiSysUser; +import com.yami.shop.security.service.YamiUser; +import com.yami.shop.security.service.YamiUserDetailsService; +import com.yami.shop.sys.dao.SysMenuMapper; +import com.yami.shop.sys.dao.SysUserMapper; +import com.yami.shop.sys.model.SysMenu; +import com.yami.shop.sys.model.SysUser; +import lombok.AllArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.AuthorityUtils; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 用户详细信息 + * + * @author + */ +@Slf4j +@Service +@AllArgsConstructor +public class YamiSysUserDetailsServiceImpl implements YamiUserDetailsService { + private final SysMenuMapper sysMenuMapper; + private final SysUserMapper sysUserMapper; + private final CacheManagerUtil cacheManagerUtil; + + /** + * 用户密码登录 + * + * @param username 用户名 + * @return + * @throws UsernameNotFoundExceptionBase + */ + @Override + @SneakyThrows + public YamiSysUser loadUserByUsername(String username) { + YamiSysUser userDetails = cacheManagerUtil.getCache("yami_sys_user", username); + if (userDetails != null) { + return userDetails; + } + + userDetails = getUserDetails(username); + cacheManagerUtil.putCache("yami_sys_user",username, userDetails); + return userDetails; + } + + + /** + * 构建userdetails + * + * @param username 用户名称 + * @return + */ + private YamiSysUser getUserDetails(String username) { + SysUser sysUser = sysUserMapper.selectByUsername(username); + + if (sysUser == null) { + throw new UsernameNotFoundExceptionBase("用户不存在"); + } + + Collection authorities + = AuthorityUtils.createAuthorityList(getUserPermissions(sysUser.getUserId()).toArray(new String[0])); + // 构造security用户 + return new YamiSysUser(sysUser.getUserId(), sysUser.getShopId(), sysUser.getUsername(), sysUser.getPassword(), sysUser.getStatus() == 1, + true, true, true , authorities); + } + + private Set getUserPermissions(Long userId) { + List permsList; + + //系统管理员,拥有最高权限 + if(userId == Constant.SUPER_ADMIN_ID){ + List menuList = sysMenuMapper.selectList(Wrappers.emptyWrapper()); + + + permsList = menuList.stream().map(SysMenu::getPerms).collect(Collectors.toList()); + }else{ + permsList = sysUserMapper.queryAllPerms(userId); + } + + + Set permsSet = permsList.stream().flatMap((perms)->{ + if (StrUtil.isBlank(perms)) { + return null; + } + return Arrays.stream(perms.trim().split(",")); + } + ).collect(Collectors.toSet()); + return permsSet; + } + + @Override + public YamiUser loadUserByAppIdAndBizUserId(App app, String bizUserId) { + return null; + } + + @Override + public void insertUserIfNecessary(AppConnect appConnect) { + + } +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/task/OrderTask.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/task/OrderTask.java new file mode 100644 index 0000000..0e02881 --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/task/OrderTask.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.task; + +import java.util.Date; +import java.util.List; + +import com.yami.shop.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.yami.shop.bean.enums.OrderStatus; +import com.yami.shop.bean.model.Order; +import com.yami.shop.bean.model.OrderItem; +import com.yami.shop.bean.model.User; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; + + + +@Component("orderTask") +public class OrderTask { + + + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private OrderService orderService; + @Autowired + private ProductService productService; + @Autowired + private SkuService skuService; + + public void cancelOrder(){ + Date now = new Date(); + logger.info("取消超时未支付订单。。。"); + // 获取30分钟之前未支付的订单 + List orders = orderService.listOrderAndOrderItems(OrderStatus.UNPAY.value(),DateUtil.offsetMinute(now, -30)); + if (CollectionUtil.isEmpty(orders)) { + return; + } + orderService.cancelOrders(orders); + for (Order order : orders) { + List orderItems = order.getOrderItems(); + for (OrderItem orderItem : orderItems) { + productService.removeProductCacheByProdId(orderItem.getProdId()); + skuService.removeSkuCacheBySkuId(orderItem.getSkuId(),orderItem.getProdId()); + } + } + } + + /** + * 确认收货 + */ + public void confirmOrder(){ + Date now = new Date(); + logger.info("系统自动确认收货订单。。。"); + // 获取15天之前未支付的订单 + List orders = orderService.listOrderAndOrderItems(OrderStatus.CONSIGNMENT.value(),DateUtil.offsetDay(now, -15)); + if (CollectionUtil.isEmpty(orders)) { + return; + } + orderService.confirmOrder(orders); + for (Order order : orders) { + List orderItems = order.getOrderItems(); + for (OrderItem orderItem : orderItems) { + productService.removeProductCacheByProdId(orderItem.getProdId()); + skuService.removeSkuCacheBySkuId(orderItem.getSkuId(),orderItem.getProdId()); + } + } + } + +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/task/TestTask.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/task/TestTask.java new file mode 100644 index 0000000..8a57dcd --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/task/TestTask.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.admin.task; + +import cn.hutool.core.date.DateUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +public class TestTask { + + public void test1(){ + System.out.println(DateUtil.now() + ": test1 running................."); + + } + + public void test2(String param){ + System.out.println(DateUtil.now() + ": test2 running................."); + } +} diff --git a/yami-shop-admin/src/main/resources/admin.properties b/yami-shop-admin/src/main/resources/admin.properties new file mode 100644 index 0000000..d8bf33e --- /dev/null +++ b/yami-shop-admin/src/main/resources/admin.properties @@ -0,0 +1,2 @@ +admin.datacenterId=1 +admin.workerId=0 diff --git a/yami-shop-admin/src/main/resources/application-dev.yml b/yami-shop-admin/src/main/resources/application-dev.yml new file mode 100644 index 0000000..9f5ed8c --- /dev/null +++ b/yami-shop-admin/src/main/resources/application-dev.yml @@ -0,0 +1,24 @@ +server: + port: 8085 +spring: + datasource: + url: jdbc:mysql://127.0.0.1:3306/yami_shops?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true + username: root + password: root + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.zaxxer.hikari.HikariDataSource + hikari: + minimum-idle: 0 + maximum-pool-size: 20 + idle-timeout: 10000 + auto-commit: true + connection-test-query: SELECT 1 + cache: + type: redis + redis: + cache-null-values: true + redis: + redisson: + config: classpath:redisson.yml +logging: + config: classpath:log4j2_dev.xml \ No newline at end of file diff --git a/yami-shop-admin/src/main/resources/application-prod.yml b/yami-shop-admin/src/main/resources/application-prod.yml new file mode 100644 index 0000000..b52534a --- /dev/null +++ b/yami-shop-admin/src/main/resources/application-prod.yml @@ -0,0 +1,20 @@ +server: + port: 8111 +spring: + datasource: + url: jdbc:mysql://127.0.0.1:3306/yami_shops?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true + username: root + password: root + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.zaxxer.hikari.HikariDataSource + hikari: + minimum-idle: 0 + maximum-pool-size: 20 + idle-timeout: 25000 + auto-commit: true + connection-test-query: SELECT 1 + redis: + redisson: + config: classpath:redisson.yml +logging: + config: classpath:log4j2_prod.xml \ No newline at end of file diff --git a/yami-shop-admin/src/main/resources/application.yml b/yami-shop-admin/src/main/resources/application.yml new file mode 100644 index 0000000..f1e8e16 --- /dev/null +++ b/yami-shop-admin/src/main/resources/application.yml @@ -0,0 +1,28 @@ +spring: + # 环境 dev|test|prod quart定时任务 + profiles: + active: dev,quartz + #文件上传设置 + servlet: + multipart: + max-file-size: 100MB + max-request-size: 100MB + enabled: true + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 + +# mybaits-plus配置 +mybatis-plus: + # MyBatis Mapper所对应的XML文件位置 + mapper-locations: classpath*:/mapper/*Mapper.xml + global-config: + # 关闭MP3.0自带的banner + banner: false + db-config: + # 主键类型 0:数据库ID自增 1.未定义 2.用户输入 3 id_worker 4.uuid 5.id_worker字符串表示 + id-type: AUTO + #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断" + field-strategy: NOT_NULL + # 默认数据库表下划线命名 + table-underline: true diff --git a/yami-shop-admin/src/main/resources/banner.txt b/yami-shop-admin/src/main/resources/banner.txt new file mode 100644 index 0000000..d09c886 --- /dev/null +++ b/yami-shop-admin/src/main/resources/banner.txt @@ -0,0 +1,11 @@ + .----------------. .----------------. .----------------. .----------------. +| .--------------. || .--------------. || .--------------. || .--------------. | +| | ____ ____ | || | __ | || | ____ ____ | || | _____ | | +| | |_ _||_ _| | || | / \ | || ||_ \ / _|| || | |_ _| | | +| | \ \ / / | || | / /\ \ | || | | \/ | | || | | | | | +| | \ \/ / | || | / ____ \ | || | | |\ /| | | || | | | | | +| | _| |_ | || | _/ / \ \_ | || | _| |_\/_| |_ | || | _| |_ | | +| | |______| | || ||____| |____|| || ||_____||_____|| || | |_____| | | +| | | || | | || | | || | | | +| '--------------' || '--------------' || '--------------' || '--------------' | + '----------------' '----------------' '----------------' '----------------' \ No newline at end of file diff --git a/yami-shop-admin/src/main/resources/log4j2_dev.xml b/yami-shop-admin/src/main/resources/log4j2_dev.xml new file mode 100644 index 0000000..355cb9b --- /dev/null +++ b/yami-shop-admin/src/main/resources/log4j2_dev.xml @@ -0,0 +1,39 @@ + + + + + ???? + %xwEx + %5p + yyyy-MM-dd HH:mm:ss.SSS + + %clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/yami-shop-admin/src/main/resources/log4j2_prod.xml b/yami-shop-admin/src/main/resources/log4j2_prod.xml new file mode 100644 index 0000000..15d24f3 --- /dev/null +++ b/yami-shop-admin/src/main/resources/log4j2_prod.xml @@ -0,0 +1,73 @@ + + + + + ???? + %xwEx + %5p + yyyy-MM-dd HH:mm:ss.SSS + + %clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD} + + %d{${LOG_DATEFORMAT_PATTERN}} ${LOG_LEVEL_PATTERN} ${sys:PID} --- [%t] %-40.40c{1.} : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD} + + 50 + 50MB + /opt/projects/mall4j + + + + + + + + + + + + + + ${sys:FILE_LOG_PATTERN} + + + + + + + + + + + + ${sys:FILE_LOG_PATTERN} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/yami-shop-admin/src/main/resources/redisson.yml b/yami-shop-admin/src/main/resources/redisson.yml new file mode 100644 index 0000000..1c8989e --- /dev/null +++ b/yami-shop-admin/src/main/resources/redisson.yml @@ -0,0 +1,31 @@ +# 单节点设置 +singleServerConfig: + address: redis://127.0.0.1:6379 + database: 0 + password: null + idleConnectionTimeout: 10000 + pingTimeout: 1000 + connectTimeout: 10000 + timeout: 3000 + retryAttempts: 3 + retryInterval: 1500 + reconnectionTimeout: 3000 + failedAttempts: 3 + clientName: null + # 发布和订阅连接的最小空闲连接数 默认1 + subscriptionConnectionMinimumIdleSize: 1 + # 发布和订阅连接池大小 默认50 + subscriptionConnectionPoolSize: 10 + # 单个连接最大订阅数量 默认5 + subscriptionsPerConnection: 5 + # 最小空闲连接数 默认32,现在暂时不需要那么多的线程 + connectionMinimumIdleSize: 4 + # connectionPoolSize 默认64,现在暂时不需要那么多的线程 + connectionPoolSize: 20 +# 这个线程池数量被所有RTopic对象监听器,RRemoteService调用者和RExecutorService任务共同共享。 +threads: 0 +# 这个线程池数量是在一个Redisson实例内,被其创建的所有分布式数据类型和服务,以及底层客户端所一同共享的线程池里保存的线程数量。 +nettyThreads: 0 +codec: + class: com.yami.shop.common.serializer.redisson.FstCodec +transportMode: NIO \ No newline at end of file diff --git a/yami-shop-api/pom.xml b/yami-shop-api/pom.xml new file mode 100644 index 0000000..d1da7cf --- /dev/null +++ b/yami-shop-api/pom.xml @@ -0,0 +1,49 @@ + + + + yami-shop + com.yami.shop + 0.0.1-SNAPSHOT + + 4.0.0 + + yami-shop-api + jar + + + + com.yami.shop + yami-shop-service + ${yami.shop.version} + + + com.yami.shop + yami-shop-security + ${yami.shop.version} + + + com.yami.shop + yami-shop-mp + ${yami.shop.version} + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/ApiApplication.java b/yami-shop-api/src/main/java/com/yami/shop/api/ApiApplication.java new file mode 100644 index 0000000..9ef503b --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/ApiApplication.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api; + + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.context.annotation.ComponentScan; + +/** + * @author lgh + */ +@SpringBootApplication +@ComponentScan(basePackages = {"com.yami.shop"}) +public class ApiApplication extends SpringBootServletInitializer{ + + public static void main(String[] args) { + SpringApplication.run(ApiApplication.class, args); + } + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { + return builder.sources(ApiApplication.class); + } +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/config/ApiBeanConfig.java b/yami-shop-api/src/main/java/com/yami/shop/api/config/ApiBeanConfig.java new file mode 100644 index 0000000..aad131f --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/config/ApiBeanConfig.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.config; + +import cn.hutool.core.lang.Snowflake; +import lombok.AllArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@AllArgsConstructor +public class ApiBeanConfig { + + private final ApiConfig apiConfig; + + @Bean + public Snowflake snowflake() { + return new Snowflake(apiConfig.getWorkerId(), apiConfig.getDatacenterId()); + } + +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/config/ApiConfig.java b/yami-shop-api/src/main/java/com/yami/shop/api/config/ApiConfig.java new file mode 100644 index 0000000..ddaf99d --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/config/ApiConfig.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + + +/** + * 商城配置文件 + * @author lgh + */ +@Data +@Component +@PropertySource("classpath:api.properties") +@ConfigurationProperties(prefix = "api") +public class ApiConfig { + + /** + * 数据中心ID + */ + private Integer datacenterId; + + /** + * 终端ID + */ + private Integer workerId; + + /** + * 域名 + */ + private String domainName; + +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/config/SwaggerConfiguration.java b/yami-shop-api/src/main/java/com/yami/shop/api/config/SwaggerConfiguration.java new file mode 100644 index 0000000..4156367 --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/config/SwaggerConfiguration.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import org.springframework.context.annotation.Profile; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +/** + * Swagger文档,只有在测试环境才会使用 + * @author LGH + */ +//@Profile("dev") +@Configuration +@EnableSwagger2 +public class SwaggerConfiguration { + + @Bean + public Docket baseRestApi() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .groupName("基础版") + .select() + .apis(RequestHandlerSelectors.basePackage("com.yami.shop.api")) + .paths(PathSelectors.any()) + .build(); + } + + @Bean + public ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("亚米商城接口文档") + .description("亚米商城接口文档Swagger版") + .termsOfServiceUrl("http://www.gz-yami.com/") + .contact(new Contact("广州亚米信息科技有限公司","https://www.gz-yami.com/", "")) + .version("1.0") + .build(); + } +} \ No newline at end of file diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/controller/AddrController.java b/yami-shop-api/src/main/java/com/yami/shop/api/controller/AddrController.java new file mode 100644 index 0000000..5994d04 --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/controller/AddrController.java @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.controller; + +import java.util.Date; +import java.util.List; + +import javax.validation.Valid; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yami.shop.common.exception.YamiShopBindException; +import com.yami.shop.security.util.SecurityUtils; +import lombok.AllArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.yami.shop.bean.app.dto.UserAddrDto; +import com.yami.shop.bean.app.param.AddrParam; +import com.yami.shop.bean.model.UserAddr; +import com.yami.shop.service.UserAddrService; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import ma.glasnost.orika.MapperFacade; + + +@RestController +@RequestMapping("/p/address") +@Api(tags = "地址接口") +@AllArgsConstructor +public class AddrController { + + @Autowired + private MapperFacade mapperFacade; + @Autowired + private UserAddrService userAddrService; + + /** + * 选择订单配送地址 + */ + @GetMapping("/list") + @ApiOperation(value = "用户地址列表", notes = "获取用户的所有地址信息") + public ResponseEntity> dvyList() { + String userId = SecurityUtils.getUser().getUserId(); + List userAddrs = userAddrService.list(new LambdaQueryWrapper().eq(UserAddr::getUserId, userId).orderByDesc(UserAddr::getCommonAddr).orderByDesc(UserAddr::getUpdateTime)); + return ResponseEntity.ok(mapperFacade.mapAsList(userAddrs, UserAddrDto.class)); + } + + /** + * 新增用户订单配送地址 + */ + @PostMapping("/addAddr") + @ApiOperation(value = "新增用户地址", notes = "新增用户地址") + public ResponseEntity addAddr(@Valid @RequestBody AddrParam addrParam) { + String userId = SecurityUtils.getUser().getUserId(); + + if (addrParam.getAddrId() != null && addrParam.getAddrId() != 0) { + return ResponseEntity.badRequest().body("该地址已存在"); + } + int addrCount = userAddrService.count(new LambdaQueryWrapper().eq(UserAddr::getUserId, userId)); + UserAddr userAddr = mapperFacade.map(addrParam, UserAddr.class); + + if (addrCount == 0) { + userAddr.setCommonAddr(1); + // 清除默认地址缓存 + userAddrService.removeUserAddrByUserId(0L, userId); + } else { + userAddr.setCommonAddr(0); + } + userAddr.setUserId(userId); + userAddr.setStatus(1); + userAddr.setCreateTime(new Date()); + userAddr.setUpdateTime(new Date()); + userAddrService.save(userAddr); + return ResponseEntity.ok("添加地址成功"); + } + + /** + * 修改订单配送地址 + */ + @PutMapping("/updateAddr") + @ApiOperation(value = "修改订单用户地址", notes = "修改用户地址") + public ResponseEntity updateAddr(@Valid @RequestBody AddrParam addrParam) { + String userId = SecurityUtils.getUser().getUserId(); + + UserAddr dbUserAddr = userAddrService.getUserAddrByUserId(addrParam.getAddrId(), userId); + if (dbUserAddr == null) { + return ResponseEntity.badRequest().body("该地址已被删除"); + } + + UserAddr userAddr = mapperFacade.map(addrParam, UserAddr.class); + userAddr.setUserId(userId); + userAddr.setUpdateTime(new Date()); + userAddrService.updateById(userAddr); + // 清除当前地址缓存 + userAddrService.removeUserAddrByUserId(addrParam.getAddrId(), userId); + // 清除默认地址缓存 + userAddrService.removeUserAddrByUserId(0L, userId); + return ResponseEntity.ok("修改地址成功"); + } + + /** + * 删除订单配送地址 + */ + @DeleteMapping("/deleteAddr/{addrId}") + @ApiOperation(value = "删除订单用户地址", notes = "根据地址id,删除用户地址") + @ApiImplicitParam(name = "addrId", value = "地址ID", required = true, dataType = "Long") + public ResponseEntity deleteDvy(@PathVariable("addrId") Long addrId) { + String userId = SecurityUtils.getUser().getUserId(); + UserAddr userAddr = userAddrService.getUserAddrByUserId(addrId, userId); + if (userAddr == null) { + return ResponseEntity.badRequest().body("该地址已被删除"); + } + if (userAddr.getCommonAddr() == 1) { + return ResponseEntity.badRequest().body("默认地址无法删除"); + } + userAddrService.removeById(addrId); + userAddrService.removeUserAddrByUserId(addrId, userId); + return ResponseEntity.ok("删除地址成功"); + } + + /** + * 设置默认地址 + */ + @PutMapping("/defaultAddr/{addrId}") + @ApiOperation(value = "设置默认地址", notes = "根据地址id,设置默认地址") + public ResponseEntity defaultAddr(@PathVariable("addrId") Long addrId) { + String userId = SecurityUtils.getUser().getUserId(); + + userAddrService.updateDefaultUserAddr(addrId, userId); + + userAddrService.removeUserAddrByUserId(0L, userId); + userAddrService.removeUserAddrByUserId(addrId, userId); + return ResponseEntity.ok("修改地址成功"); + } + + /** + * 获取地址信息订单配送地址 + */ + @GetMapping("/addrInfo/{addrId}") + @ApiOperation(value = "获取地址信息", notes = "根据地址id,获取地址信息") + @ApiImplicitParam(name = "addrId", value = "地址ID", required = true, dataType = "Long") + public ResponseEntity addrInfo(@PathVariable("addrId") Long addrId) { + String userId = SecurityUtils.getUser().getUserId(); + UserAddr userAddr = userAddrService.getUserAddrByUserId(addrId, userId); + if (userAddr == null) { + throw new YamiShopBindException("该地址已被删除"); + } + return ResponseEntity.ok(mapperFacade.map(userAddr, UserAddrDto.class)); + } + +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/controller/AreaController.java b/yami-shop-api/src/main/java/com/yami/shop/api/controller/AreaController.java new file mode 100644 index 0000000..e2e4cfb --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/controller/AreaController.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.controller; + +import java.util.List; + +import com.yami.shop.service.AreaService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.yami.shop.bean.model.Area; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; + +/** + * + * @author lgh on 2018/10/26. + */ +@RestController +@RequestMapping("/p/area") +@Api(tags="省市区接口") +public class AreaController { + + @Autowired + private AreaService areaService; + + /** + * 分页获取 + */ + @GetMapping("/listByPid") + @ApiOperation(value="获取省市区信息", notes="根据省市区的pid获取地址信息") + @ApiImplicitParam(name = "pid", value = "省市区的pid(pid为0获取所有省份)", required = true, dataType = "String") + public ResponseEntity> listByPid(Long pid){ + List list = areaService.listByPid(pid); + return ResponseEntity.ok(list); + } + +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/controller/CategoryController.java b/yami-shop-api/src/main/java/com/yami/shop/api/controller/CategoryController.java new file mode 100644 index 0000000..aad4ac0 --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/controller/CategoryController.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +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 com.yami.shop.bean.app.dto.CategoryDto; +import com.yami.shop.bean.model.Category; +import com.yami.shop.service.CategoryService; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import ma.glasnost.orika.MapperFacade; + +@RestController +@RequestMapping("/category") +@Api(tags = "分类接口") +public class CategoryController { + + @Autowired + private CategoryService categoryService; + + @Autowired + private MapperFacade mapperFacade; + + /** + * 分类信息列表接口 + */ + @GetMapping("/categoryInfo") + @ApiOperation(value = "分类信息列表", notes = "获取所有的产品分类信息,顶级分类的parentId为0,默认为顶级分类") + @ApiImplicitParam(name = "parentId", value = "分类ID", required = false, dataType = "Long") + public ResponseEntity> categoryInfo(@RequestParam(value = "parentId", defaultValue = "0") Long parentId) { + List categories = categoryService.listByParentId(parentId); + List categoryDtos = mapperFacade.mapAsList(categories, CategoryDto.class); + return ResponseEntity.ok(categoryDtos); + } + + +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/controller/DeliveryController.java b/yami-shop-api/src/main/java/com/yami/shop/api/controller/DeliveryController.java new file mode 100644 index 0000000..a5797f1 --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/controller/DeliveryController.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.controller; + +import com.yami.shop.service.OrderService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.yami.shop.bean.app.dto.DeliveryDto; +import com.yami.shop.bean.model.Delivery; +import com.yami.shop.bean.model.Order; +import com.yami.shop.common.util.Json; +import com.yami.shop.service.DeliveryService; + +import cn.hutool.http.HttpUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; + +@RestController +@RequestMapping("/delivery") +@Api(tags="查看物流接口") +public class DeliveryController { + + @Autowired + private DeliveryService deliveryService; + @Autowired + private OrderService orderService; + + /** + * 查看物流接口 + */ + @GetMapping("/check") + @ApiOperation(value="查看物流", notes="根据订单号查看物流") + @ApiImplicitParam(name = "orderNumber", value = "订单号", required = true, dataType = "String") + public ResponseEntity checkDelivery(String orderNumber) { + + Order order = orderService.getOrderByOrderNumber(orderNumber); + Delivery delivery = deliveryService.getById(order.getDvyId()); + String url = delivery.getQueryUrl().replace("{dvyFlowId}", order.getDvyFlowId()); + String deliveryJson = HttpUtil.get(url); + + DeliveryDto deliveryDto = Json.parseObject(deliveryJson, DeliveryDto.class); + deliveryDto.setDvyFlowId(order.getDvyFlowId()); + deliveryDto.setCompanyHomeUrl(delivery.getCompanyHomeUrl()); + deliveryDto.setCompanyName(delivery.getDvyName()); + return ResponseEntity.ok(deliveryDto); + } +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/controller/IndexImgController.java b/yami-shop-api/src/main/java/com/yami/shop/api/controller/IndexImgController.java new file mode 100644 index 0000000..8fa3b79 --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/controller/IndexImgController.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.controller; + +import com.yami.shop.bean.app.dto.IndexImgDto; +import com.yami.shop.bean.model.IndexImg; +import com.yami.shop.service.IndexImgService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import ma.glasnost.orika.MapperFacade; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@Api(tags = "首页轮播图接口") +public class IndexImgController { + @Autowired + private MapperFacade mapperFacade; + + @Autowired + private IndexImgService indexImgService; + + /** + * 首页轮播图接口 + */ + @GetMapping("/indexImgs") + @ApiOperation(value = "首页轮播图", notes = "获取首页轮播图列表信息") + public ResponseEntity> indexImgs() { + List indexImgList = indexImgService.listIndexImgs(); + List indexImgDtos = mapperFacade.mapAsList(indexImgList, IndexImgDto.class); + return ResponseEntity.ok(indexImgDtos); + } +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/controller/MyOrderController.java b/yami-shop-api/src/main/java/com/yami/shop/api/controller/MyOrderController.java new file mode 100644 index 0000000..3e647ce --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/controller/MyOrderController.java @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.controller; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yami.shop.common.exception.YamiShopBindException; +import com.yami.shop.common.util.PageParam; +import com.yami.shop.bean.app.dto.*; +import com.yami.shop.dao.OrderMapper; +import com.yami.shop.security.util.SecurityUtils; +import com.yami.shop.service.*; +import lombok.AllArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + + +import com.yami.shop.bean.model.Order; +import com.yami.shop.bean.model.OrderItem; +import com.yami.shop.bean.model.ShopDetail; +import com.yami.shop.bean.model.UserAddrOrder; +import com.yami.shop.common.util.Arith; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import ma.glasnost.orika.MapperFacade; + +@RestController +@RequestMapping("/p/myOrder") +@Api(tags = "我的订单接口") +@AllArgsConstructor +public class MyOrderController { + + private final OrderService orderService; + + private final MapperFacade mapperFacade; + + private final UserAddrOrderService userAddrOrderService; + + private final ProductService productService; + + private final SkuService skuService; + + private final MyOrderService myOrderService; + + private final ShopDetailService shopDetailService; + + private final OrderItemService orderItemService; + + + /** + * 订单详情信息接口 + */ + @GetMapping("/orderDetail") + @ApiOperation(value = "订单详情信息", notes = "根据订单号获取订单详情信息") + @ApiImplicitParam(name = "orderNumber", value = "订单号", required = true, dataType = "String") + public ResponseEntity orderDetail(@RequestParam(value = "orderNumber", required = true) String orderNumber) { + + String userId = SecurityUtils.getUser().getUserId(); + OrderShopDto orderShopDto = new OrderShopDto(); + + Order order = orderService.getOrderByOrderNumber(orderNumber); + + if (order == null) { + throw new RuntimeException("该订单不存在"); + } + if (!Objects.equals(order.getUserId(), userId)) { + throw new RuntimeException("你没有权限获取该订单信息"); + } + + ShopDetail shopDetail = shopDetailService.getShopDetailByShopId(order.getShopId()); + UserAddrOrder userAddrOrder = userAddrOrderService.getById(order.getAddrOrderId()); + UserAddrDto userAddrDto = mapperFacade.map(userAddrOrder, UserAddrDto.class); + List orderItems = orderItemService.getOrderItemsByOrderNumber(orderNumber); + List orderItemDtos = mapperFacade.mapAsList(orderItems, OrderItemDto.class); + + orderShopDto.setShopId(shopDetail.getShopId()); + orderShopDto.setShopName(shopDetail.getShopName()); + orderShopDto.setActualTotal(order.getActualTotal()); + orderShopDto.setUserAddrDto(userAddrDto); + orderShopDto.setOrderItemDtos(orderItemDtos); + orderShopDto.setTransfee(order.getFreightAmount()); + orderShopDto.setReduceAmount(order.getReduceAmount()); + orderShopDto.setCreateTime(order.getCreateTime()); + orderShopDto.setRemarks(order.getRemarks()); + orderShopDto.setStatus(order.getStatus()); + + double total = 0.0; + Integer totalNum = 0; + for (OrderItemDto orderItem : orderShopDto.getOrderItemDtos()) { + total = Arith.add(total, orderItem.getProductTotalAmount()); + totalNum += orderItem.getProdCount(); + } + orderShopDto.setTotal(total); + orderShopDto.setTotalNum(totalNum); + + return ResponseEntity.ok(orderShopDto); + } + + + /** + * 订单列表接口 + */ + @GetMapping("/myOrder") + @ApiOperation(value = "订单列表信息", notes = "根据订单状态获取订单列表信息,状态为0时获取所有订单") + @ApiImplicitParams({ + @ApiImplicitParam(name = "status", value = "订单状态 1:待付款 2:待发货 3:待收货 4:待评价 5:成功 6:失败", required = false, dataType = "Integer") + }) + public ResponseEntity> myOrder(@RequestParam(value = "status") Integer status,PageParam page) { + + String userId = SecurityUtils.getUser().getUserId(); + IPage myOrderDtoIpage = myOrderService.pageMyOrderByUserIdAndStatus(page, userId, status); + return ResponseEntity.ok(myOrderDtoIpage); + } + + /** + * 取消订单 + */ + @PutMapping("/cancel/{orderNumber}") + @ApiOperation(value = "根据订单号取消订单", notes = "根据订单号取消订单") + @ApiImplicitParam(name = "orderNumber", value = "订单号", required = true, dataType = "String") + public ResponseEntity cancel(@PathVariable("orderNumber") String orderNumber) { + String userId = SecurityUtils.getUser().getUserId(); + Order order = orderService.getOrderByOrderNumber(orderNumber); + if (!Objects.equals(order.getUserId(), userId)) { + throw new YamiShopBindException("你没有权限获取该订单信息"); + } + List orderItems = orderItemService.getOrderItemsByOrderNumber(orderNumber); + order.setOrderItems(orderItems); + // 取消订单 + orderService.cancelOrders(Arrays.asList(order)); + + // 清除缓存 + for (OrderItem orderItem : orderItems) { + productService.removeProductCacheByProdId(orderItem.getProdId()); + skuService.removeSkuCacheBySkuId(orderItem.getSkuId(),orderItem.getProdId()); + } + return ResponseEntity.ok().build(); + } + + + /** + * 确认收货 + */ + @PutMapping("/receipt/{orderNumber}") + @ApiOperation(value = "根据订单号确认收货", notes = "根据订单号确认收货") + public ResponseEntity receipt(@PathVariable("orderNumber") String orderNumber) { + String userId = SecurityUtils.getUser().getUserId(); + Order order = orderService.getOrderByOrderNumber(orderNumber); + if (!Objects.equals(order.getUserId(), userId)) { + throw new YamiShopBindException("你没有权限获取该订单信息"); + } + List orderItems = orderItemService.getOrderItemsByOrderNumber(orderNumber); + order.setOrderItems(orderItems); + // 确认收货 + orderService.confirmOrder(Arrays.asList(order)); + + for (OrderItem orderItem : orderItems) { + productService.removeProductCacheByProdId(orderItem.getProdId()); + skuService.removeSkuCacheBySkuId(orderItem.getSkuId(),orderItem.getProdId()); + } + return ResponseEntity.ok().build(); + } + + /** + * 删除订单 + */ + @DeleteMapping("/{orderNumber}") + @ApiOperation(value = "根据订单号删除订单", notes = "根据订单号删除订单") + @ApiImplicitParam(name = "orderNumber", value = "订单号", required = true, dataType = "String") + public ResponseEntity delete(@PathVariable("orderNumber") String orderNumber) { + String userId = SecurityUtils.getUser().getUserId(); + + Order order = orderService.getOrderByOrderNumber(orderNumber); + if (order == null) { + throw new YamiShopBindException("该订单不存在"); + } + if (!Objects.equals(order.getUserId(), userId)) { + throw new YamiShopBindException("你没有权限获取该订单信息"); + } + + // 删除订单 + orderService.deleteOrders(Arrays.asList(order)); + + return ResponseEntity.ok("删除成功"); + } + + /** + * 获取我的订单订单数量 + */ + @GetMapping("/orderCount") + @ApiOperation(value = "获取我的订单订单数量", notes = "获取我的订单订单数量") + public ResponseEntity getOrderCount() { + String userId = SecurityUtils.getUser().getUserId(); + OrderCountData orderCountMap = orderService.getOrderCount(userId); + return ResponseEntity.ok(orderCountMap); + } + + +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/controller/NoticeController.java b/yami-shop-api/src/main/java/com/yami/shop/api/controller/NoticeController.java new file mode 100644 index 0000000..f3c314c --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/controller/NoticeController.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yami.shop.common.util.PageParam; +import com.fasterxml.jackson.annotation.JsonView; +import com.sun.tracing.dtrace.ArgsAttributes; +import com.yami.shop.bean.app.dto.IndexImgDto; +import com.yami.shop.bean.app.dto.NoticeDto; +import com.yami.shop.bean.app.dto.ProductDto; +import com.yami.shop.bean.model.IndexImg; +import com.yami.shop.bean.model.Notice; +import com.yami.shop.service.NoticeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import ma.glasnost.orika.MapperFacade; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/shop/notice") +@Api(tags = "公告管理接口") +@AllArgsConstructor +public class NoticeController { + + private NoticeService noticeService; + + private MapperFacade mapperFacade; + + /** + * 置顶公告列表接口 + */ + @GetMapping("/topNoticeList") + @ApiOperation(value = "置顶公告列表信息", notes = "获取所有置顶公告列表信息") + @JsonView(NoticeDto.NoContent.class) + public ResponseEntity> getTopNoticeList() { + List noticeList = noticeService.listNotice(); + List noticeDtoList = mapperFacade.mapAsList(noticeList, NoticeDto.class); + return ResponseEntity.ok(noticeDtoList); + } + + /** + * 获取公告详情 + */ + @GetMapping("/info/{id}") + @ApiOperation(value = "公告详情", notes = "获取公告id公告详情") + @JsonView(NoticeDto.WithContent.class) + public ResponseEntity getNoticeById(@PathVariable("id") Long id) { + Notice notice = noticeService.getNoticeById(id); + NoticeDto noticeDto = mapperFacade.map(notice, NoticeDto.class); + return ResponseEntity.ok(noticeDto); + } + + /** + * 公告列表 + */ + @GetMapping("/noticeList") + @ApiOperation(value = "公告列表信息", notes = "获取所有公告列表信息") + @ApiImplicitParams({ + }) + public ResponseEntity> pageNotice(PageParam page) { + + return ResponseEntity.ok(noticeService.pageNotice(page)); + } +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderController.java b/yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderController.java new file mode 100644 index 0000000..ac25cc0 --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderController.java @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.controller; + +import java.util.*; + +import javax.validation.Valid; + +import com.yami.shop.bean.app.dto.*; +import com.yami.shop.bean.event.ConfirmOrderEvent; +import com.yami.shop.common.exception.YamiShopBindException; +import com.yami.shop.security.util.SecurityUtils; +import com.yami.shop.service.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.yami.shop.bean.app.param.OrderParam; +import com.yami.shop.bean.app.param.OrderShopParam; +import com.yami.shop.bean.app.param.SubmitOrderParam; +import com.yami.shop.bean.model.Order; +import com.yami.shop.bean.model.UserAddr; +import com.yami.shop.common.util.Arith; + +import cn.hutool.core.collection.CollectionUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import ma.glasnost.orika.MapperFacade; + +@RestController +@RequestMapping("/p/order") +@Api(tags = "订单接口") +public class OrderController { + + @Autowired + private OrderService orderService; + @Autowired + private MapperFacade mapperFacade; + @Autowired + private SkuService skuService; + @Autowired + private ProductService productService; + @Autowired + private UserAddrService userAddrService; + @Autowired + private BasketService basketService; + @Autowired + private ApplicationContext applicationContext; + + + /** + * 生成订单 + */ + @PostMapping("/confirm") + @ApiOperation(value = "结算,生成订单信息", notes = "传入下单所需要的参数进行下单") + public ResponseEntity confirm(@Valid @RequestBody OrderParam orderParam) { + String userId = SecurityUtils.getUser().getUserId(); + + // 订单的地址信息 + UserAddr userAddr = userAddrService.getUserAddrByUserId(orderParam.getAddrId(), userId); + UserAddrDto userAddrDto = mapperFacade.map(userAddr, UserAddrDto.class); + + + // 组装获取用户提交的购物车商品项 + List shopCartItems = basketService.getShopCartItemsByOrderItems(orderParam.getBasketIds(),orderParam.getOrderItem(),userId); + + if (CollectionUtil.isEmpty(shopCartItems)) { + throw new YamiShopBindException("请选择您需要的商品加入购物车"); + } + + // 根据店铺组装购车中的商品信息,返回每个店铺中的购物车商品信息 + List shopCarts = basketService.getShopCarts(shopCartItems); + + // 将要返回给前端的完整的订单信息 + ShopCartOrderMergerDto shopCartOrderMergerDto = new ShopCartOrderMergerDto(); + + shopCartOrderMergerDto.setUserAddr(userAddrDto); + + // 所有店铺的订单信息 + List shopCartOrders = new ArrayList<>(); + + double actualTotal = 0.0; + double total = 0.0; + int totalCount = 0; + double orderReduce = 0.0; +// List coupons = new ArrayList<>(); + for (ShopCartDto shopCart : shopCarts) { + + // 每个店铺的订单信息 + ShopCartOrderDto shopCartOrder = new ShopCartOrderDto(); + shopCartOrder.setShopId(shopCart.getShopId()); + shopCartOrder.setShopName(shopCart.getShopName()); + + + List shopCartItemDiscounts = shopCart.getShopCartItemDiscounts(); + + // 店铺中的所有商品项信息 + List shopAllShopCartItems = new ArrayList<>(); + for (ShopCartItemDiscountDto shopCartItemDiscount : shopCartItemDiscounts) { + List discountShopCartItems = shopCartItemDiscount.getShopCartItems(); + shopAllShopCartItems.addAll(discountShopCartItems); + } + + shopCartOrder.setShopCartItemDiscounts(shopCartItemDiscounts); + + applicationContext.publishEvent(new ConfirmOrderEvent(shopCartOrder,orderParam,shopAllShopCartItems)); + + actualTotal = Arith.add(actualTotal,shopCartOrder.getActualTotal()); + total = Arith.add(total,shopCartOrder.getTotal()); + totalCount = totalCount + shopCartOrder.getTotalCount(); + orderReduce = Arith.add(orderReduce,shopCartOrder.getShopReduce()); + shopCartOrders.add(shopCartOrder); + + + } + + shopCartOrderMergerDto.setActualTotal(actualTotal); + shopCartOrderMergerDto.setTotal(total); + shopCartOrderMergerDto.setTotalCount(totalCount); + shopCartOrderMergerDto.setShopCartOrders(shopCartOrders); + shopCartOrderMergerDto.setOrderReduce(orderReduce); + + orderService.putConfirmOrderCache(userId,shopCartOrderMergerDto); + + return ResponseEntity.ok(shopCartOrderMergerDto); + } + + /** + * 购物车/立即购买 提交订单,根据店铺拆单 + */ + @PostMapping("/submit") + @ApiOperation(value = "提交订单,返回支付流水号", notes = "根据传入的参数判断是否为购物车提交订单,同时对购物车进行删除,用户开始进行支付") + public ResponseEntity submitOrders(@Valid @RequestBody SubmitOrderParam submitOrderParam) { + String userId = SecurityUtils.getUser().getUserId(); + ShopCartOrderMergerDto mergerOrder = orderService.getConfirmOrderCache(userId); + if (mergerOrder == null) { + throw new YamiShopBindException("订单已过期,请重新下单"); + } + + List orderShopParams = submitOrderParam.getOrderShopParam(); + + List shopCartOrders = mergerOrder.getShopCartOrders(); + // 设置备注 + if (CollectionUtil.isNotEmpty(orderShopParams)) { + for (ShopCartOrderDto shopCartOrder : shopCartOrders) { + for (OrderShopParam orderShopParam : orderShopParams) { + if (Objects.equals(shopCartOrder.getShopId(), orderShopParam.getShopId())) { + shopCartOrder.setRemarks(orderShopParam.getRemarks()); + } + } + } + } + + List orders = orderService.submit(userId,mergerOrder); + + + + StringBuilder orderNumbers = new StringBuilder(); + for (Order order : orders) { + orderNumbers.append(order.getOrderNumber()).append(","); + } + orderNumbers.deleteCharAt(orderNumbers.length() - 1); + + boolean isShopCartOrder = false; + // 移除缓存 + for (ShopCartOrderDto shopCartOrder : shopCartOrders) { + for (ShopCartItemDiscountDto shopCartItemDiscount : shopCartOrder.getShopCartItemDiscounts()) { + for (ShopCartItemDto shopCartItem : shopCartItemDiscount.getShopCartItems()) { + Long basketId = shopCartItem.getBasketId(); + if (basketId != null && basketId != 0) { + isShopCartOrder = true; + } + skuService.removeSkuCacheBySkuId(shopCartItem.getSkuId(),shopCartItem.getProdId()); + productService.removeProductCacheByProdId(shopCartItem.getProdId()); + } + } + } + // 购物车提交订单时(即有购物车ID时) + if (isShopCartOrder) { + basketService.removeShopCartItemsCacheByUserId(userId); + } + orderService.removeConfirmOrderCache(userId); + return ResponseEntity.ok(new OrderNumbersDto(orderNumbers.toString())); + } + +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/controller/PayController.java b/yami-shop-api/src/main/java/com/yami/shop/api/controller/PayController.java new file mode 100644 index 0000000..90e8dfc --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/controller/PayController.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.controller; + +import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult; +import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.service.WxPayService; +import com.yami.shop.api.config.ApiConfig; +import com.yami.shop.bean.app.param.PayParam; +import com.yami.shop.bean.pay.PayInfoDto; +import com.yami.shop.common.util.Arith; +import com.yami.shop.common.util.IPHelper; +import com.yami.shop.security.service.YamiUser; +import com.yami.shop.security.util.SecurityUtils; +import com.yami.shop.service.PayService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.SneakyThrows; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/p/order") +@Api(tags = "订单接口") +@AllArgsConstructor +public class PayController { + + private final PayService payService; + + private final ApiConfig apiConfig; + + private final WxPayService wxMiniPayService; + + /** + * 支付接口 + */ + @PostMapping("/pay") + @ApiOperation(value = "根据订单号进行支付", notes = "根据订单号进行支付") + @SneakyThrows + public ResponseEntity pay(@RequestBody PayParam payParam) { + YamiUser user = SecurityUtils.getUser(); + String userId = user.getUserId(); + String openId = user.getBizUserId(); + + + PayInfoDto payInfo = payService.pay(userId, payParam); + + WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest(); + orderRequest.setBody(payInfo.getBody()); + orderRequest.setOutTradeNo(payInfo.getPayNo()); + orderRequest.setTotalFee((int) Arith.mul(payInfo.getPayAmount(), 100)); + orderRequest.setSpbillCreateIp(IPHelper.getIpAddr()); + orderRequest.setNotifyUrl(apiConfig.getDomainName() + "/notice/pay/order"); + orderRequest.setTradeType(WxPayConstants.TradeType.JSAPI); + orderRequest.setOpenid(openId); + + return ResponseEntity.ok(wxMiniPayService.createOrder(orderRequest)); + } +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/controller/PayNoticeController.java b/yami-shop-api/src/main/java/com/yami/shop/api/controller/PayNoticeController.java new file mode 100644 index 0000000..0f8f1ae --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/controller/PayNoticeController.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.controller; + +import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import com.yami.shop.service.PayService; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import springfox.documentation.annotations.ApiIgnore; + +@ApiIgnore +@RestController +@RequestMapping("/notice/pay") +@AllArgsConstructor +public class PayNoticeController { + + /** + * 小程序支付 + */ + private final WxPayService wxMiniPayService; + + private final PayService payService; + + + @RequestMapping("/order") + public ResponseEntity submit(@RequestBody String xmlData) throws WxPayException { + WxPayOrderNotifyResult parseOrderNotifyResult = wxMiniPayService.parseOrderNotifyResult(xmlData); + + String payNo = parseOrderNotifyResult.getOutTradeNo(); + String bizPayNo = parseOrderNotifyResult.getTransactionId(); + + // 根据内部订单号更新order settlement + payService.paySuccess(payNo, bizPayNo); + + + return ResponseEntity.ok().build(); + } +} \ No newline at end of file diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/controller/ProdCommController.java b/yami-shop-api/src/main/java/com/yami/shop/api/controller/ProdCommController.java new file mode 100644 index 0000000..7be65e2 --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/controller/ProdCommController.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.controller; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yami.shop.common.util.PageParam; +import com.yami.shop.bean.app.dto.ProdCommDataDto; +import com.yami.shop.bean.app.dto.ProdCommDto; +import com.yami.shop.bean.app.param.ProdCommParam; +import com.yami.shop.bean.model.ProdComm; +import com.yami.shop.common.util.Json; +import com.yami.shop.common.util.PageParam; +import com.yami.shop.security.util.SecurityUtils; +import com.yami.shop.service.ProdCommService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; + +@RestController +@RequestMapping("/prodComm") +@Api(tags = "评论接口") +@AllArgsConstructor +public class ProdCommController { + + private final ProdCommService prodCommService; + + + @GetMapping("/prodCommData") + @ApiOperation(value = "返回商品评论数据(好评率 好评数量 中评数 差评数)", notes = "根据商品id获取") + public ResponseEntity getProdCommData(Long prodId) { + return ResponseEntity.ok(prodCommService.getProdCommDataByProdId(prodId, SecurityUtils.getUser().getUserId())); + } + + @GetMapping("/prodCommPageByUser") + @ApiOperation(value = "根据用户返回评论分页数据", notes = "传入页码") + public ResponseEntity> getProdCommPage(PageParam page) { + return ResponseEntity.ok(prodCommService.getProdCommDtoPageByUserId(page, SecurityUtils.getUser().getUserId())); + } + + @GetMapping("/prodCommPageByProd") + @ApiOperation(value = "根据商品返回评论分页数据", notes = "传入商品id和页码") + @ApiImplicitParams({ + @ApiImplicitParam(name = "prodId", value = "商品id", required = true, dataType = "Long"), + @ApiImplicitParam(name = "evaluate", value = "-1或null 全部,0好评 1中评 2差评 3有图", required = true, dataType = "Long"), + }) + public ResponseEntity> getProdCommPageByProdId(PageParam page, Long prodId, Integer evaluate) { + return ResponseEntity.ok(prodCommService.getProdCommDtoPageByProdId(page, prodId, evaluate, SecurityUtils.getUser().getUserId())); + } + + @PostMapping + @ApiOperation(value = "添加评论") + public ResponseEntity saveProdCommPage(ProdCommParam prodCommParam) { + ProdComm prodComm = new ProdComm(); + prodComm.setProdId(prodCommParam.getProdId()); + prodComm.setOrderItemId(prodCommParam.getOrderItemId()); + prodComm.setUserId(SecurityUtils.getUser().getUserId()); + prodComm.setScore(prodCommParam.getScore()); + prodComm.setContent(prodCommParam.getContent()); + prodComm.setPics(prodCommParam.getPics()); + prodComm.setIsAnonymous(prodCommParam.getIsAnonymous()); + prodComm.setRecTime(new Date()); + prodComm.setStatus(0); + prodComm.setEvaluate(prodCommParam.getEvaluate()); + prodCommService.save(prodComm); + return ResponseEntity.ok().build(); + } + + @DeleteMapping + @ApiOperation(value = "删除评论", notes = "根据id删除") + public ResponseEntity deleteProdComm(Long prodCommId) { + prodCommService.removeById(prodCommId); + return ResponseEntity.ok().build(); + } +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/controller/ProdController.java b/yami-shop-api/src/main/java/com/yami/shop/api/controller/ProdController.java new file mode 100644 index 0000000..827d9d6 --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/controller/ProdController.java @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.controller; + +import java.util.List; +import java.util.stream.Collectors; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yami.shop.common.util.PageParam; +import com.fasterxml.jackson.annotation.JsonView; +import com.yami.shop.bean.app.dto.SkuDto; +import com.yami.shop.bean.app.dto.TagProductDto; +import com.yami.shop.bean.model.Basket; +import com.yami.shop.bean.model.Sku; +import com.yami.shop.common.exception.YamiShopBindException; +import com.yami.shop.security.service.YamiUser; +import com.yami.shop.service.*; +import io.swagger.annotations.ApiImplicitParams; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import com.yami.shop.bean.app.dto.ProductDto; +import com.yami.shop.bean.model.Product; +import com.yami.shop.bean.model.Transport; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import ma.glasnost.orika.MapperFacade; + +@RestController +@RequestMapping("/prod") +@Api(tags = "商品接口") +public class ProdController { + + @Autowired + private ProductService prodService; + + @Autowired + private MapperFacade mapperFacade; + + @Autowired + private SkuService skuService; + + @Autowired + private TransportService transportService; + + + @GetMapping("/pageProd") + @ApiOperation(value = "通过分类id商品列表信息", notes = "根据分类ID获取该分类下所有的商品列表信息") + @ApiImplicitParams({ + @ApiImplicitParam(name = "categoryId", value = "分类ID", required = true, dataType = "Long"), + }) + public ResponseEntity> prodList( + @RequestParam(value = "categoryId") Long categoryId,PageParam page) { + IPage productDtoIPage = prodService.pageByCategoryId(page, categoryId); + return ResponseEntity.ok(productDtoIPage); + } + + @GetMapping("/prodInfo") + @ApiOperation(value = "商品详情信息", notes = "根据商品ID(prodId)获取商品信息") + @ApiImplicitParam(name = "prodId", value = "商品ID", required = true, dataType = "Long") + public ResponseEntity prodInfo(Long prodId) { + + Product product = prodService.getProductByProdId(prodId); + if (product == null) { + return ResponseEntity.ok(null); + } + + List skuList = skuService.listByProdId(prodId); + // 启用的sku列表 + List useSkuList = skuList.stream().filter(sku -> sku.getStatus() == 1).collect(Collectors.toList()); + product.setSkuList(useSkuList); + ProductDto productDto = mapperFacade.map(product, ProductDto.class); + Transport transportAndAllItems = transportService.getTransportAndAllItems(product.getDeliveryTemplateId()); + productDto.setTransport(transportAndAllItems); + return ResponseEntity.ok(productDto); + } + + @GetMapping("/lastedProdPage") + @ApiOperation(value = "新品推荐", notes = "获取新品推荐商品列表") + @ApiImplicitParams({ + }) + public ResponseEntity> lastedProdPage(PageParam page) { + IPage productDtoIPage = prodService.pageByPutawayTime(page); + return ResponseEntity.ok(productDtoIPage); + } + + @GetMapping("/prodListByTagId") + @ApiOperation(value = "通过分组标签获取商品列表", notes = "通过分组标签id(tagId)获取商品列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "tagId", value = "当前页,默认为1", required = true, dataType = "Long"), + }) + public ResponseEntity> prodListByTagId( + @RequestParam(value = "tagId") Long tagId,PageParam page) { + IPage productDtoIPage = prodService.pageByTagId(page, tagId); + return ResponseEntity.ok(productDtoIPage); + } + + @GetMapping("/discountProdList") + @ApiOperation(value = "限时特惠", notes = "获取限时特惠商品列表") + @ApiImplicitParams({ + }) + public ResponseEntity> discountProdList(PageParam page) { + IPage productDtoIPage = prodService.discountProdList(page); + return ResponseEntity.ok(productDtoIPage); + } + + @GetMapping("/moreBuyProdList") + @ApiOperation(value = "每日疯抢", notes = "获取销量最多的商品列表") + @ApiImplicitParams({}) + public ResponseEntity> moreBuyProdList(PageParam page) { + IPage productDtoIPage = prodService.moreBuyProdList(page); + return ResponseEntity.ok(productDtoIPage); + } + + @GetMapping("/tagProdList") + @ApiOperation(value = "首页所有标签商品接口", notes = "获取首页所有标签商品接口") + public ResponseEntity> getTagProdList() { + List productDtoList = prodService.tagProdList(); + return ResponseEntity.ok(productDtoList); + } + + @GetMapping("/discountProds") + @ApiOperation(value = "根据活动id获取活动商品列表", notes = "根据活动id获取活动商品列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "discountId", value = "活动id", required = true, dataType = "Long"), + }) + public ResponseEntity> getDiscountProds( + @RequestParam(value = "discountId", required = true) Long discountId, + PageParam page) { + IPage productDtoList = prodService.pageByDiscountId(page, discountId); + return ResponseEntity.ok(productDtoList); + } + + + +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/controller/ProdTagController.java b/yami-shop-api/src/main/java/com/yami/shop/api/controller/ProdTagController.java new file mode 100644 index 0000000..c38d1ba --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/controller/ProdTagController.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yami.shop.bean.app.dto.ProdTagDto; +import com.yami.shop.bean.model.ProdTag; +import com.yami.shop.service.ProdTagService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import ma.glasnost.orika.MapperFacade; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/prod/tag") +@Api(tags = "商品分组标签接口") +@AllArgsConstructor +public class ProdTagController { + + private ProdTagService prodTagService; + + private MapperFacade mapperFacade; + + /** + * 商品分组标签列表接口 + */ + @GetMapping("/prodTagList") + @ApiOperation(value = "商品分组标签列表", notes = "获取所有的商品分组列表") + public ResponseEntity> getProdTagList() { + List prodTagList = prodTagService.listProdTag(); + List prodTagDtoList = mapperFacade.mapAsList(prodTagList, ProdTagDto.class); + return ResponseEntity.ok(prodTagDtoList); + } + +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/controller/SearchController.java b/yami-shop-api/src/main/java/com/yami/shop/api/controller/SearchController.java new file mode 100644 index 0000000..f13769b --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/controller/SearchController.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.controller; + + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yami.shop.common.util.PageParam; +import com.yami.shop.bean.dto.HotSearchDto; +import com.yami.shop.bean.dto.SearchProdDto; +import com.yami.shop.common.util.PageParam; +import com.yami.shop.service.HotSearchService; +import com.yami.shop.service.ProductService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Collections; +import java.util.List; + +@RestController +@RequestMapping("/search") +@Api(tags = "搜索接口") +@AllArgsConstructor +public class SearchController { + + private final HotSearchService hotSearchService; + + private final ProductService productService; + + @GetMapping("/hotSearchByShopId") + @ApiOperation(value = "查看店铺热搜", notes = "根据店铺id,热搜数量获取热搜") + @ApiImplicitParams({ + @ApiImplicitParam(name = "shopId", value = "店铺id", required = true, dataType = "Long"), + @ApiImplicitParam(name = "number", value = "取数", required = true, dataType = "Integer"), + @ApiImplicitParam(name = "sort", value = "是否按照顺序(0 否 1是)", required = false, dataType = "Integer"), + }) + public ResponseEntity> hotSearchByShopId(Long shopId,Integer number,Integer sort) { + List list = hotSearchService.getHotSearchDtoByshopId(shopId); + + return getListResponseEntity(number, sort, list); + } + + @GetMapping("/hotSearch") + @ApiOperation(value = "查看全局热搜", notes = "根据店铺id,热搜数量获取热搜") + @ApiImplicitParams({ + @ApiImplicitParam(name = "number", value = "取数", required = true, dataType = "Integer"), + @ApiImplicitParam(name = "sort", value = "是否按照顺序(0 否 1是)", required = false, dataType = "Integer"), + }) + public ResponseEntity> hotSearch(Integer number,Integer sort) { + List list = hotSearchService.getHotSearchDtoByshopId(0L); + return getListResponseEntity(number, sort, list); + } + + private ResponseEntity> getListResponseEntity(Integer number, Integer sort, List list) { + if(sort == null || sort == 0){ + Collections.shuffle(list); + } + if(!CollectionUtil.isNotEmpty(list) || list.size()< number){ + return ResponseEntity.ok(list); + } + return ResponseEntity.ok(list.subList(0, number)); + } + + @GetMapping("/searchProdPage") + @ApiOperation(value = "分页排序搜索商品", notes = "根据商品名搜索") + @ApiImplicitParams({ + @ApiImplicitParam(name = "prodName", value = "商品名", required = true, dataType = "String"), + @ApiImplicitParam(name = "sort", value = "排序(0 默认排序 1销量排序 2价格排序)", required = false, dataType = "Integer"), + @ApiImplicitParam(name = "orderBy", value = "排序(0升序 1降序)", required = false, dataType = "Integer"), + @ApiImplicitParam(name = "shopId", value = "店铺id", required = true, dataType = "Long"), + }) + public ResponseEntity> searchProdPage(PageParam page, String prodName, Integer sort, Integer orderBy, Long shopId) { + + return ResponseEntity.ok(productService.getSearchProdDtoPageByProdName(page,prodName,sort,orderBy)); + } + + + + +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/controller/ShopCartController.java b/yami-shop-api/src/main/java/com/yami/shop/api/controller/ShopCartController.java new file mode 100644 index 0000000..dcb1313 --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/controller/ShopCartController.java @@ -0,0 +1,246 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.controller; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ArrayUtil; +import com.google.common.collect.Lists; +import com.yami.shop.bean.app.dto.*; +import com.yami.shop.bean.app.param.ChangeShopCartParam; +import com.yami.shop.bean.app.param.ShopCartParam; +import com.yami.shop.bean.event.ShopCartEvent; +import com.yami.shop.bean.model.*; +import com.yami.shop.common.util.Arith; +import com.yami.shop.security.util.SecurityUtils; +import com.yami.shop.service.*; +import io.swagger.annotations.*; +import lombok.AllArgsConstructor; +import org.springframework.context.ApplicationContext; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.*; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/p/shopCart") +@Api(tags = "购物车接口") +@AllArgsConstructor +public class ShopCartController { + + private BasketService basketService; + + private ProductService productService; + + private SkuService skuService; + + private ApplicationContext applicationContext; + + /** + * 获取用户购物车信息 + * + * @param basketIdShopCartParamMap 购物车参数对象列表 + * @return + */ + @PostMapping("/info") + @ApiOperation(value = "获取用户购物车信息", notes = "获取用户购物车信息,参数为用户选中的活动项数组,以购物车id为key") + public ResponseEntity> info(@RequestBody Map basketIdShopCartParamMap) { + String userId = SecurityUtils.getUser().getUserId(); + + // 更新购物车信息, + if (MapUtil.isNotEmpty(basketIdShopCartParamMap)) { + basketService.updateBasketByShopCartParam(userId, basketIdShopCartParamMap); + } + + // 拿到购物车的所有item + List shopCartItems = basketService.getShopCartItems(userId); + return ResponseEntity.ok(basketService.getShopCarts(shopCartItems)); + + } + + @DeleteMapping("/deleteItem") + @ApiOperation(value = "删除用户购物车物品", notes = "通过购物车id删除用户购物车物品") + public ResponseEntity deleteItem(@RequestBody List basketIds) { + String userId = SecurityUtils.getUser().getUserId(); + basketService.deleteShopCartItemsByBasketIds(userId, basketIds); + return ResponseEntity.ok().build(); + } + + @DeleteMapping("/deleteAll") + @ApiOperation(value = "清空用户购物车所有物品", notes = "清空用户购物车所有物品") + public ResponseEntity deleteAll() { + String userId = SecurityUtils.getUser().getUserId(); + basketService.deleteAllShopCartItems(userId); + return ResponseEntity.ok("删除成功"); + } + + @PostMapping("/changeItem") + @ApiOperation(value = "添加、修改用户购物车物品", notes = "通过商品id(prodId)、skuId、店铺Id(shopId),添加/修改用户购物车商品,并传入改变的商品个数(count)," + + "当count为正值时,增加商品数量,当count为负值时,将减去商品的数量,当最终count值小于0时,会将商品从购物车里面删除") + public ResponseEntity addItem(@Valid @RequestBody ChangeShopCartParam param) { + + if (param.getCount() == 0) { + return ResponseEntity.badRequest().body("输入更改数量"); + } + + String userId = SecurityUtils.getUser().getUserId(); + List shopCartItems = basketService.getShopCartItems(userId); + Product prodParam = productService.getProductByProdId(param.getProdId()); + Sku skuParam = skuService.getSkuBySkuId(param.getSkuId()); + + // 当商品状态不正常时,不能添加到购物车 + if (prodParam.getStatus() != 1 || skuParam.getStatus() != 1) { + return ResponseEntity.badRequest().body("当前商品已下架"); + } + for (ShopCartItemDto shopCartItemDto : shopCartItems) { + if (Objects.equals(param.getSkuId(), shopCartItemDto.getSkuId())) { + Basket basket = new Basket(); + basket.setUserId(userId); + basket.setBasketCount(param.getCount() + shopCartItemDto.getProdCount()); + basket.setBasketId(shopCartItemDto.getBasketId()); + + // 防止购物车变成负数 + if (basket.getBasketCount() <= 0) { + basketService.deleteShopCartItemsByBasketIds(userId, Collections.singletonList(basket.getBasketId())); + return ResponseEntity.ok().build(); + } + + // 当sku实际库存不足时,不能添加到购物车 + if (skuParam.getStocks() < basket.getBasketCount() && shopCartItemDto.getProdCount() > 0) { + return ResponseEntity.badRequest().body("库存不足"); + } + basketService.updateShopCartItem(basket); + return ResponseEntity.ok().build(); + } + } + + // 防止购物车已被删除的情况下,添加了负数的商品 + if (param.getCount() < 0) { + return ResponseEntity.badRequest().body("商品已从购物车移除"); + } + // 当sku实际库存不足时,不能添加到购物车 + if (skuParam.getStocks() < param.getCount()) { + return ResponseEntity.badRequest().body("库存不足"); + } + // 所有都正常时 + basketService.addShopCartItem(param,userId); + return ResponseEntity.ok("添加成功"); + } + + @GetMapping("/prodCount") + @ApiOperation(value = "获取购物车商品数量", notes = "获取所有购物车商品数量") + public ResponseEntity prodCount() { + String userId = SecurityUtils.getUser().getUserId(); + List shopCartItems = basketService.getShopCartItems(userId); + if (CollectionUtil.isEmpty(shopCartItems)) { + return ResponseEntity.ok(0); + } + Integer totalCount = shopCartItems.stream().map(ShopCartItemDto::getProdCount).reduce(0, Integer::sum); + return ResponseEntity.ok(totalCount); + } + + @GetMapping("/expiryProdList") + @ApiOperation(value = "获取购物车失效商品信息", notes = "获取购物车失效商品列表") + public ResponseEntity> expiryProdList() { + String userId = SecurityUtils.getUser().getUserId(); + List shopCartItems = basketService.getShopCartExpiryItems(userId); + //根据店铺ID划分item + Map> shopCartItemDtoMap = shopCartItems.stream().collect(Collectors.groupingBy(ShopCartItemDto::getShopId)); + + // 返回一个店铺对应的所有信息 + List shopcartExpiryitems = Lists.newArrayList(); + + for (Long key : shopCartItemDtoMap.keySet()) { + ShopCartExpiryItemDto shopCartExpiryItemDto = new ShopCartExpiryItemDto(); + shopCartExpiryItemDto.setShopId(key); + List shopCartItemDtos = Lists.newArrayList(); + for (ShopCartItemDto tempShopCartItemDto : shopCartItemDtoMap.get(key)) { + shopCartExpiryItemDto.setShopName(tempShopCartItemDto.getShopName()); + shopCartItemDtos.add(tempShopCartItemDto); + } + shopCartExpiryItemDto.setShopCartItemDtoList(shopCartItemDtos); + shopcartExpiryitems.add(shopCartExpiryItemDto); + } + + return ResponseEntity.ok(shopcartExpiryitems); + } + + @DeleteMapping("/cleanExpiryProdList") + @ApiOperation(value = "清空用户失效商品", notes = "清空用户失效商品") + public ResponseEntity cleanExpiryProdList() { + String userId = SecurityUtils.getUser().getUserId(); + basketService.cleanExpiryProdList(userId); + return ResponseEntity.ok().build(); + } + + @PostMapping("/totalPay") + @ApiOperation(value = "获取选中购物项总计、选中的商品数量", notes = "获取选中购物项总计、选中的商品数量,参数为购物车id数组") + public ResponseEntity getTotalPay(@RequestBody List basketIds) { + + // 拿到购物车的所有item + List dbShopCartItems = basketService.getShopCartItems(SecurityUtils.getUser().getUserId()); + + List chooseShopCartItems = dbShopCartItems + .stream() + .filter(shopCartItemDto -> { + for (Long basketId : basketIds) { + if (Objects.equals(basketId,shopCartItemDto.getBasketId())) { + return true; + } + } + return false; + }) + .collect(Collectors.toList()); + + // 根据店铺ID划分item + Map> shopCartMap = chooseShopCartItems.stream().collect(Collectors.groupingBy(ShopCartItemDto::getShopId)); + + double total = 0.0; + int count = 0; + double reduce = 0.0; + for (Long shopId : shopCartMap.keySet()) { + //获取店铺的所有商品项 + List shopCartItemDtoList = shopCartMap.get(shopId); + // 构建每个店铺的购物车信息 + ShopCartDto shopCart = new ShopCartDto(); + shopCart.setShopId(shopId); + + applicationContext.publishEvent(new ShopCartEvent(shopCart, shopCartItemDtoList)); + + List shopCartItemDiscounts = shopCart.getShopCartItemDiscounts(); + + for (ShopCartItemDiscountDto shopCartItemDiscount : shopCartItemDiscounts) { + List shopCartItems = shopCartItemDiscount.getShopCartItems(); + ChooseDiscountItemDto chooseDiscountItemDto = shopCartItemDiscount.getChooseDiscountItemDto(); + + // 如果满足优惠活动 + if (chooseDiscountItemDto != null && chooseDiscountItemDto.getNeedAmount() <= chooseDiscountItemDto.getProdsPrice()) { + reduce = Arith.add(reduce, chooseDiscountItemDto.getReduceAmount()); + } + + for (ShopCartItemDto shopCartItem : shopCartItems) { + count = shopCartItem.getProdCount() + count; + total = Arith.add(shopCartItem.getProductTotalAmount(), total); + } + } + } + ShopCartAmountDto shopCartAmountDto = new ShopCartAmountDto(); + shopCartAmountDto.setCount(count); + shopCartAmountDto.setTotalMoney(total); + shopCartAmountDto.setSubtractMoney(reduce); + shopCartAmountDto.setFinalMoney(Arith.sub(shopCartAmountDto.getTotalMoney(), shopCartAmountDto.getSubtractMoney())); + + return ResponseEntity.ok(shopCartAmountDto); + } + +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/controller/SkuController.java b/yami-shop-api/src/main/java/com/yami/shop/api/controller/SkuController.java new file mode 100644 index 0000000..0e7cdaa --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/controller/SkuController.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yami.shop.bean.app.dto.SkuDto; +import com.yami.shop.bean.model.Sku; +import com.yami.shop.service.SkuService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import ma.glasnost.orika.MapperFacade; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/sku") +@Api(tags = "sku规格接口") +@AllArgsConstructor +public class SkuController { + + private final SkuService skuService; + + private final MapperFacade mapperFacade; + + @GetMapping("/getSkuList") + @ApiOperation(value = "通过prodId获取商品全部规格列表", notes = "通过prodId获取商品全部规格列表") + @ApiImplicitParam(name = "prodId", value = "商品id", dataType = "Long") + public ResponseEntity> getSkuListByProdId(Long prodId) { + List skus = skuService.list(new LambdaQueryWrapper() + .eq(Sku::getStatus, 1) + .eq(Sku::getIsDelete, 0) + .eq(Sku::getProdId, prodId) + ); + List skuDtoList = mapperFacade.mapAsList(skus, SkuDto.class); + return ResponseEntity.ok(skuDtoList); + } +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/controller/SmsController.java b/yami-shop-api/src/main/java/com/yami/shop/api/controller/SmsController.java new file mode 100644 index 0000000..d2a6226 --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/controller/SmsController.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.controller; + +import com.yami.shop.security.util.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.google.common.collect.Maps; +import com.yami.shop.bean.app.param.SendSmsParam; +import com.yami.shop.bean.enums.SmsType; +import com.yami.shop.service.SmsLogService; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; + +@RestController +@RequestMapping("/p/sms") +@Api(tags="发送验证码接口") +public class SmsController { + + @Autowired + private SmsLogService smsLogService; + /** + * 发送验证码接口 + */ + @PostMapping("/send") + @ApiOperation(value="发送验证码", notes="用户的发送验证码") + public ResponseEntity audit(@RequestBody SendSmsParam sendSmsParam) { + String userId = SecurityUtils.getUser().getUserId(); + smsLogService.sendSms(SmsType.VALID, userId, sendSmsParam.getMobile(),Maps.newHashMap()); + + return ResponseEntity.ok().build(); + } +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/controller/UserCollectionController.java b/yami-shop-api/src/main/java/com/yami/shop/api/controller/UserCollectionController.java new file mode 100644 index 0000000..e05b7a4 --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/controller/UserCollectionController.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.controller; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yami.shop.bean.app.dto.ProductDto; +import com.yami.shop.bean.app.dto.UserCollectionDto; +import com.yami.shop.bean.model.Product; +import com.yami.shop.bean.model.UserCollection; +import com.yami.shop.common.exception.YamiShopBindException; +import com.yami.shop.common.util.PageParam; +import com.yami.shop.security.util.SecurityUtils; +import com.yami.shop.service.ProductService; +import com.yami.shop.service.UserCollectionService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.Objects; + +@RestController +@RequestMapping("/p/user/collection") +@Api(tags = "收藏接口") +@AllArgsConstructor +public class UserCollectionController { + + private final UserCollectionService userCollectionService; + + private final ProductService productService; + + @GetMapping("/page") + @ApiOperation(value = "分页返回收藏数据", notes = "根据用户id获取") + public ResponseEntity> getUserCollectionDtoPageByUserId(PageParam page) { + return ResponseEntity.ok(userCollectionService.getUserCollectionDtoPageByUserId(page, SecurityUtils.getUser().getUserId())); + } + + @GetMapping("isCollection") + @ApiOperation(value = "根据商品id获取该商品是否在收藏夹中", notes = "传入收藏商品id") + public ResponseEntity isCollection(Long prodId) { + if (productService.count(new LambdaQueryWrapper() + .eq(Product::getProdId, prodId)) < 1) { + throw new YamiShopBindException("该商品不存在"); + } + return ResponseEntity.ok(userCollectionService.count(new LambdaQueryWrapper() + .eq(UserCollection::getProdId, prodId) + .eq(UserCollection::getUserId, SecurityUtils.getUser().getUserId())) > 0); + } + + @PostMapping("/addOrCancel") + @ApiOperation(value = "添加/取消收藏", notes = "传入收藏商品id,如果商品未收藏则收藏商品,已收藏则取消收藏") + @ApiImplicitParam(name = "prodId", value = "商品id", required = true, dataType = "Long") + public ResponseEntity addOrCancel(@RequestBody Long prodId) { + if (Objects.isNull(productService.getProductByProdId(prodId))) { + throw new YamiShopBindException("该商品不存在"); + } + String userId = SecurityUtils.getUser().getUserId(); + if (userCollectionService.count(new LambdaQueryWrapper() + .eq(UserCollection::getProdId, prodId) + .eq(UserCollection::getUserId, userId)) > 0) { + userCollectionService.remove(new LambdaQueryWrapper() + .eq(UserCollection::getProdId, prodId) + .eq(UserCollection::getUserId, userId)); + } else { + UserCollection userCollection = new UserCollection(); + userCollection.setCreateTime(new Date()); + userCollection.setUserId(userId); + userCollection.setProdId(prodId); + userCollectionService.save(userCollection); + } + return ResponseEntity.ok().build(); + } + + /** + * 查询用户收藏商品数量 + */ + @GetMapping("count") + @ApiOperation(value = "查询用户收藏商品数量", notes = "查询用户收藏商品数量") + public int findUserCollectionCount() { + String userId = SecurityUtils.getUser().getUserId(); + return userCollectionService.count(new LambdaQueryWrapper().eq(UserCollection::getUserId, userId)); + } + + @GetMapping("/prods") + @ApiOperation(value = "获取用户收藏商品列表", notes = "获取用户收藏商品列表") + public ResponseEntity> collectionProds(PageParam page) { + String userId = SecurityUtils.getUser().getUserId(); + IPage productDtoIPage = productService.collectionProds(page, userId); + return ResponseEntity.ok(productDtoIPage); + } + +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/controller/UserController.java b/yami-shop-api/src/main/java/com/yami/shop/api/controller/UserController.java new file mode 100644 index 0000000..7841800 --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/controller/UserController.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.controller; + +import cn.hutool.core.util.StrUtil; +import com.yami.shop.common.util.CacheManagerUtil; +import com.yami.shop.security.enums.App; +import com.yami.shop.security.service.YamiUser; +import com.yami.shop.security.util.SecurityUtils; +import lombok.AllArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.yami.shop.bean.app.dto.UserDto; +import com.yami.shop.bean.app.param.UserInfoParam; +import com.yami.shop.bean.model.User; +import com.yami.shop.service.UserService; + +import cn.hutool.extra.emoji.EmojiUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import ma.glasnost.orika.MapperFacade; + +@RestController +@RequestMapping("/p/user") +@Api(tags="用户接口") +@AllArgsConstructor +public class UserController { + + private final UserService userService; + + private final MapperFacade mapperFacade; + + private final CacheManagerUtil cacheManagerUtil; + /** + * 查看用户接口 + */ + @GetMapping("/userInfo") + @ApiOperation(value="查看用户信息", notes="根据用户ID(userId)获取用户信息") + public ResponseEntity userInfo() { + String userId = SecurityUtils.getUser().getUserId(); + User user = userService.getById(userId); + UserDto userDto = mapperFacade.map(user, UserDto.class); + return ResponseEntity.ok(userDto); + } + + @PutMapping("/setUserInfo") + @ApiOperation(value="设置用户信息", notes="设置用户信息") + public ResponseEntity setUserInfo(@RequestBody UserInfoParam userInfoParam) { + String userId = SecurityUtils.getUser().getUserId(); + User user = new User(); + user.setUserId(userId); + user.setPic(userInfoParam.getAvatarUrl()); + user.setNickName(EmojiUtil.toAlias(userInfoParam.getNickName())); + userService.updateById(user); + String cacheKey = App.MINI.value() + StrUtil.COLON + SecurityUtils.getUser().getBizUserId(); + cacheManagerUtil.evictCache("yami_user", cacheKey); + return ResponseEntity.ok(null); + } +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/listener/ConfirmOrderListener.java b/yami-shop-api/src/main/java/com/yami/shop/api/listener/ConfirmOrderListener.java new file mode 100644 index 0000000..d09d303 --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/listener/ConfirmOrderListener.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.listener; + +import com.google.common.collect.Lists; +import com.yami.shop.bean.app.dto.*; +import com.yami.shop.bean.app.param.OrderParam; +import com.yami.shop.bean.event.ConfirmOrderEvent; +import com.yami.shop.bean.event.ShopCartEvent; +import com.yami.shop.bean.model.Product; +import com.yami.shop.bean.model.Sku; +import com.yami.shop.bean.model.UserAddr; +import com.yami.shop.bean.order.ConfirmOrderOrder; +import com.yami.shop.bean.order.ShopCartEventOrder; +import com.yami.shop.common.exception.YamiShopBindException; +import com.yami.shop.common.util.Arith; +import com.yami.shop.security.util.SecurityUtils; +import com.yami.shop.service.ProductService; +import com.yami.shop.service.SkuService; +import com.yami.shop.service.TransportManagerService; +import com.yami.shop.service.UserAddrService; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import ma.glasnost.orika.MapperFacade; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.event.EventListener; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * 确认订单信息时的默认操作 + * @author LGH + */ +@Component("defaultConfirmOrderListener") +@AllArgsConstructor +public class ConfirmOrderListener { + + private final UserAddrService userAddrService; + + private final TransportManagerService transportManagerService; + + private final ProductService productService; + + private final SkuService skuService; + + /** + * 计算订单金额 + */ + @EventListener(ConfirmOrderEvent.class) + @Order(ConfirmOrderOrder.DEFAULT) + public void defaultConfirmOrderEvent(ConfirmOrderEvent event) { + + + ShopCartOrderDto shopCartOrderDto = event.getShopCartOrderDto(); + + OrderParam orderParam = event.getOrderParam(); + + String userId = SecurityUtils.getUser().getUserId(); + + // 订单的地址信息 + UserAddr userAddr = userAddrService.getUserAddrByUserId(orderParam.getAddrId(), userId); + + double total = 0.0; + + int totalCount = 0; + + double transfee = 0.0; + + for (ShopCartItemDto shopCartItem : event.getShopCartItems()) { + // 获取商品信息 + Product product = productService.getProductByProdId(shopCartItem.getProdId()); + // 获取sku信息 + Sku sku = skuService.getSkuBySkuId(shopCartItem.getSkuId()); + if (product == null || sku == null) { + throw new YamiShopBindException("购物车包含无法识别的商品"); + } + if (product.getStatus() != 1 || sku.getStatus() != 1) { + throw new YamiShopBindException("商品[" + sku.getProdName() + "]已下架"); + } + + totalCount = shopCartItem.getProdCount() + totalCount; + total = Arith.add(shopCartItem.getProductTotalAmount(), total); + // 用户地址如果为空,则表示该用户从未设置过任何地址相关信息 + if (userAddr != null) { + // 每个产品的运费相加 + transfee = Arith.add(transfee, transportManagerService.calculateTransfee(shopCartItem, userAddr)); + } + + shopCartItem.setActualTotal(shopCartItem.getProductTotalAmount()); + shopCartOrderDto.setActualTotal(Arith.sub(total, transfee)); + shopCartOrderDto.setTotal(total); + shopCartOrderDto.setTotalCount(totalCount); + shopCartOrderDto.setTransfee(transfee); + } + } +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/listener/ShopCartListener.java b/yami-shop-api/src/main/java/com/yami/shop/api/listener/ShopCartListener.java new file mode 100644 index 0000000..64532b8 --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/listener/ShopCartListener.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.listener; + +import com.google.common.collect.Lists; +import com.yami.shop.bean.app.dto.ShopCartDto; +import com.yami.shop.bean.app.dto.ShopCartItemDiscountDto; +import com.yami.shop.bean.app.dto.ShopCartItemDto; +import com.yami.shop.bean.event.ShopCartEvent; +import com.yami.shop.bean.order.ShopCartEventOrder; +import org.springframework.context.event.EventListener; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 默认的购物车链进行组装时的操作 + * @author LGH + */ +@Component("defaultShopCartListener") +public class ShopCartListener { + + /** + * 将店铺下的所有商品归属到该店铺的购物车当中 + * @param event#getShopCart() 购物车 + * @param event#shopCartItemDtoList 该购物车的商品 + * @return 是否继续组装 + */ + @EventListener(ShopCartEvent.class) + @Order(ShopCartEventOrder.DEFAULT) + public void defaultShopCartEvent(ShopCartEvent event) { + ShopCartDto shopCart = event.getShopCartDto(); + List shopCartItemDtoList = event.getShopCartItemDtoList(); + // 对数据进行组装 + List shopCartItemDiscountDtoList = Lists.newArrayList(); + ShopCartItemDiscountDto shopCartItemDiscountDto = new ShopCartItemDiscountDto(); + + shopCartItemDiscountDto.setShopCartItems(shopCartItemDtoList); + shopCartItemDiscountDtoList.add(shopCartItemDiscountDto); + + shopCart.setShopCartItemDiscounts(shopCartItemDiscountDtoList); + } + +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/listener/SubmitOrderListener.java b/yami-shop-api/src/main/java/com/yami/shop/api/listener/SubmitOrderListener.java new file mode 100644 index 0000000..fc5cef2 --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/listener/SubmitOrderListener.java @@ -0,0 +1,288 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.listener; + +import cn.hutool.core.lang.Snowflake; +import cn.hutool.core.util.StrUtil; +import com.yami.shop.bean.app.dto.ShopCartItemDiscountDto; +import com.yami.shop.bean.app.dto.ShopCartItemDto; +import com.yami.shop.bean.app.dto.ShopCartOrderDto; +import com.yami.shop.bean.app.dto.ShopCartOrderMergerDto; +import com.yami.shop.bean.enums.OrderStatus; +import com.yami.shop.bean.event.SubmitOrderEvent; +import com.yami.shop.bean.model.*; +import com.yami.shop.bean.order.SubmitOrderOrder; +import com.yami.shop.common.exception.YamiShopBindException; +import com.yami.shop.common.util.Arith; +import com.yami.shop.dao.*; +import com.yami.shop.security.util.SecurityUtils; +import com.yami.shop.service.ProductService; +import com.yami.shop.service.SkuService; +import com.yami.shop.service.UserAddrOrderService; +import lombok.AllArgsConstructor; +import ma.glasnost.orika.MapperFacade; +import org.springframework.context.event.EventListener; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.util.*; + +/** + * 确认订单信息时的默认操作 + * + * @author LGH + */ +@Component("defaultSubmitOrderListener") +@AllArgsConstructor +public class SubmitOrderListener { + + + private final MapperFacade mapperFacade; + + private final UserAddrOrderService userAddrOrderService; + + private final ProductService productService; + + private final SkuService skuService; + + private final Snowflake snowflake; + + private final OrderItemMapper orderItemMapper; + + private final SkuMapper skuMapper; + + private final ProductMapper productMapper; + + private final OrderMapper orderMapper; + + private final OrderSettlementMapper orderSettlementMapper; + + private final BasketMapper basketMapper; + + /** + * 计算订单金额 + */ + @EventListener(SubmitOrderEvent.class) + @Order(SubmitOrderOrder.DEFAULT) + public void defaultSubmitOrderListener(SubmitOrderEvent event) { + Date now = new Date(); + String userId = SecurityUtils.getUser().getUserId(); + + ShopCartOrderMergerDto mergerOrder = event.getMergerOrder(); + + // 订单商品参数 + List shopCartOrders = mergerOrder.getShopCartOrders(); + + List basketIds = new ArrayList<>(); + // 商品skuid为key 需要更新的sku为value的map + Map skuStocksMap = new HashMap<>(16); + // 商品productid为key 需要更新的product为value的map + Map prodStocksMap = new HashMap<>(16); + + // 把订单地址保存到数据库 + UserAddrOrder userAddrOrder = mapperFacade.map(mergerOrder.getUserAddr(), UserAddrOrder.class); + if (userAddrOrder == null) { + throw new YamiShopBindException("请填写收货地址"); + } + userAddrOrder.setUserId(userId); + userAddrOrder.setCreateTime(now); + userAddrOrderService.save(userAddrOrder); + + // 订单地址id + Long addrOrderId = userAddrOrder.getAddrOrderId(); + + + // 每个店铺生成一个订单 + for (ShopCartOrderDto shopCartOrderDto : shopCartOrders) { + // 使用雪花算法生成的订单号 + String orderNumber = String.valueOf(snowflake.nextId()); + shopCartOrderDto.setOrderNumber(orderNumber); + + Long shopId = shopCartOrderDto.getShopId(); + + // 订单商品名称 + StringBuilder orderProdName = new StringBuilder(100); + + List orderItems = new ArrayList<>(); + + List shopCartItemDiscounts = shopCartOrderDto.getShopCartItemDiscounts(); + for (ShopCartItemDiscountDto shopCartItemDiscount : shopCartItemDiscounts) { + List shopCartItems = shopCartItemDiscount.getShopCartItems(); + for (ShopCartItemDto shopCartItem : shopCartItems) { + Sku sku = checkAndGetSku(shopCartItem.getSkuId(), shopCartItem, skuStocksMap); + Product product = checkAndGetProd(shopCartItem.getProdId(), shopCartItem, prodStocksMap); + + OrderItem orderItem = new OrderItem(); + orderItem.setShopId(shopId); + orderItem.setOrderNumber(orderNumber); + orderItem.setProdId(sku.getProdId()); + orderItem.setSkuId(sku.getSkuId()); + orderItem.setSkuName(sku.getSkuName()); + orderItem.setProdCount(shopCartItem.getProdCount()); + orderItem.setProdName(sku.getProdName()); + orderItem.setPic(StrUtil.isBlank(sku.getPic()) ? product.getPic() : sku.getPic()); + orderItem.setPrice(shopCartItem.getPrice()); + orderItem.setUserId(userId); + orderItem.setProductTotalAmount(shopCartItem.getProductTotalAmount()); + orderItem.setRecTime(now); + orderItem.setCommSts(0); + orderItem.setBasketDate(shopCartItem.getBasketDate()); + orderProdName.append(orderItem.getProdName()).append(","); + //推广员卡号 + orderItem.setDistributionCardNo(shopCartItem.getDistributionCardNo()); + + orderItems.add(orderItem); + + if (shopCartItem.getBasketId() != null && shopCartItem.getBasketId() != 0) { + basketIds.add(shopCartItem.getBasketId()); + } + } + + } + + + orderProdName.subSequence(0, Math.min(orderProdName.length() - 1, 100)); + if (orderProdName.lastIndexOf(",") == orderProdName.length() - 1) { + orderProdName.deleteCharAt(orderProdName.length() - 1); + } + + + // 订单信息 + com.yami.shop.bean.model.Order order = new com.yami.shop.bean.model.Order(); + + order.setShopId(shopId); + order.setOrderNumber(orderNumber); + // 订单商品名称 + order.setProdName(orderProdName.toString()); + // 用户id + order.setUserId(userId); + // 商品总额 + order.setTotal(shopCartOrderDto.getTotal()); + // 实际总额 + order.setActualTotal(shopCartOrderDto.getActualTotal()); + order.setStatus(OrderStatus.UNPAY.value()); + order.setUpdateTime(now); + order.setCreateTime(now); + order.setIsPayed(0); + order.setDeleteStatus(0); + order.setProductNums(shopCartOrderDto.getTotalCount()); + order.setAddrOrderId(addrOrderId); + order.setReduceAmount(Arith.sub(shopCartOrderDto.getTotal(), shopCartOrderDto.getActualTotal())); + order.setFreightAmount(shopCartOrderDto.getTransfee()); + order.setRemarks(shopCartOrderDto.getRemarks()); + + order.setOrderItems(orderItems); + event.getOrders().add(order); + // 插入订单结算表 + OrderSettlement orderSettlement = new OrderSettlement(); + orderSettlement.setUserId(userId); + orderSettlement.setIsClearing(0); + orderSettlement.setCreateTime(now); + orderSettlement.setOrderNumber(orderNumber); + orderSettlement.setPayAmount(order.getActualTotal()); + orderSettlement.setPayStatus(0); + orderSettlement.setVersion(0); + orderSettlementMapper.insert(orderSettlement); + + } + + // 删除购物车的商品信息 + if (!basketIds.isEmpty()) { + basketMapper.deleteShopCartItemsByBasketIds(userId, basketIds); + + } + + + // 更新sku库存 + skuStocksMap.forEach((key, sku) -> { + + if (skuMapper.updateStocks(sku) == 0) { + skuService.removeSkuCacheBySkuId(key, sku.getProdId()); + throw new YamiShopBindException("商品:[" + sku.getProdName() + "]库存不足"); + } + }); + + // 更新商品库存 + prodStocksMap.forEach((prodId, prod) -> { + + if (productMapper.updateStocks(prod) == 0) { + productService.removeProductCacheByProdId(prodId); + throw new YamiShopBindException("商品:[" + prod.getProdName() + "]库存不足"); + } + }); + + } + + @SuppressWarnings({"Duplicates"}) + private Product checkAndGetProd(Long prodId, ShopCartItemDto shopCartItem, Map prodStocksMap) { + Product product = productService.getProductByProdId(prodId); + if (product == null) { + throw new YamiShopBindException("购物车包含无法识别的商品"); + } + + if (product.getStatus() != 1) { + throw new YamiShopBindException("商品[" + product.getProdName() + "]已下架"); + } + + // 商品需要改变的库存 + Product mapProduct = prodStocksMap.get(prodId); + + if (mapProduct == null) { + mapProduct = new Product(); + mapProduct.setTotalStocks(0); + mapProduct.setProdId(prodId); + mapProduct.setProdName(product.getProdName()); + + } + + if (product.getTotalStocks() != -1) { + mapProduct.setTotalStocks(mapProduct.getTotalStocks() + shopCartItem.getProdCount()); + prodStocksMap.put(product.getProdId(), mapProduct); + } + + // -1为无限库存 + if (product.getTotalStocks() != -1 && mapProduct.getTotalStocks() > product.getTotalStocks()) { + throw new YamiShopBindException("商品:[" + product.getProdName() + "]库存不足"); + } + + return product; + } + + @SuppressWarnings({"Duplicates"}) + private Sku checkAndGetSku(Long skuId, ShopCartItemDto shopCartItem, Map skuStocksMap) { + // 获取sku信息 + Sku sku = skuService.getSkuBySkuId(skuId); + if (sku == null) { + throw new YamiShopBindException("购物车包含无法识别的商品"); + } + + if (sku.getStatus() != 1) { + throw new YamiShopBindException("商品[" + sku.getProdName() + "]已下架"); + } + // -1为无限库存 + if (sku.getStocks() != -1 && shopCartItem.getProdCount() > sku.getStocks()) { + throw new YamiShopBindException("商品:[" + sku.getProdName() + "]库存不足"); + } + + if (sku.getStocks() != -1) { + Sku mapSku = new Sku(); + mapSku.setProdId(sku.getProdId()); + // 这里的库存是改变的库存 + mapSku.setStocks(shopCartItem.getProdCount()); + mapSku.setSkuId(sku.getSkuId()); + mapSku.setProdName(sku.getProdName()); + skuStocksMap.put(sku.getSkuId(), mapSku); + } + return sku; + } + + +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/security/AuthorizationServerConfig.java b/yami-shop-api/src/main/java/com/yami/shop/api/security/AuthorizationServerConfig.java new file mode 100644 index 0000000..5edcca4 --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/security/AuthorizationServerConfig.java @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.security; + + +import com.yami.shop.security.constants.SecurityConstants; +import com.yami.shop.security.service.YamiClientDetailsService; +import com.yami.shop.security.service.YamiUser; +import com.yami.shop.security.service.YamiUserDetailsService; +import com.yami.shop.security.util.YamiTokenServices; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; +import org.springframework.context.annotation.Primary; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.ProviderManager; +import org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; +import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; +import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer; +import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices; +import org.springframework.security.oauth2.provider.token.TokenEnhancer; +import org.springframework.security.oauth2.provider.token.TokenStore; +import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore; +import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider; + +import javax.sql.DataSource; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +/** + * + */ +@Configuration +//@Order(2) +@EnableAuthorizationServer +public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { + + @Autowired + private YamiUserDetailsService yamiUserDetailsService; + + @Autowired + private AuthenticationManager authenticationManager; + + @Autowired + private DataSource dataSource; + + @Autowired + private RedisConnectionFactory redisConnectionFactory; + + private AuthorizationServerEndpointsConfigurer endpoints; + + @Bean + public TokenStore tokenStore() { + RedisTokenStore tokenStore = new RedisTokenStore(redisConnectionFactory); + tokenStore.setPrefix(SecurityConstants.YAMI_PREFIX + SecurityConstants.OAUTH_PREFIX); + return tokenStore; + } + + @Override + public void configure(ClientDetailsServiceConfigurer clients) throws Exception { + // 使用JdbcClientDetailsService客户端详情服务 + YamiClientDetailsService clientDetailsService = new YamiClientDetailsService(dataSource); + clientDetailsService.setSelectClientDetailsSql(SecurityConstants.DEFAULT_SELECT_STATEMENT); + clientDetailsService.setFindClientDetailsSql(SecurityConstants.DEFAULT_FIND_STATEMENT); + clients.withClientDetails(clientDetailsService); + } + + + @Override + public void configure(AuthorizationServerEndpointsConfigurer endpoints) { + endpoints.authenticationManager(authenticationManager) + .tokenStore(tokenStore()) + .tokenEnhancer(tokenEnhancer()) + // refresh_token需要userDetailsService + .reuseRefreshTokens(false) + .userDetailsService(yamiUserDetailsService); + this.endpoints = endpoints; + endpoints.tokenServices(yamiTokenServices()); + } + + @Override + public void configure(AuthorizationServerSecurityConfigurer oauthServer) { + oauthServer + // 开启/oauth/token_key验证端口无权限访问 + .tokenKeyAccess("permitAll()") + // 开启/oauth/check_token验证端口认证权限访问 + .checkTokenAccess("isAuthenticated()"); + } + + + /** + * token增强。 + * + * @return TokenEnhancer + */ + @Bean + public TokenEnhancer tokenEnhancer() { + return (accessToken, authentication) -> { + Map additionalInfo = new HashMap<>(8); + YamiUser yamiUser = (YamiUser) authentication.getUserAuthentication().getPrincipal(); + additionalInfo.put("userId", yamiUser.getUserId()); + additionalInfo.put("nickName",yamiUser.getName()); + additionalInfo.put("pic",yamiUser.getPic()); + ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo); + return accessToken; + }; + } + + @Primary + @Bean + @Lazy + public AuthorizationServerTokenServices yamiTokenServices() { + YamiTokenServices tokenServices = new YamiTokenServices(); + tokenServices.setTokenStore(tokenStore()); + tokenServices.setSupportRefreshToken(true);//支持刷新token + tokenServices.setReuseRefreshToken(true); + tokenServices.setClientDetailsService(endpoints.getClientDetailsService()); + tokenServices.setTokenEnhancer(endpoints.getTokenEnhancer()); + addUserDetailsService(tokenServices); + return tokenServices; + } + + private void addUserDetailsService(YamiTokenServices tokenServices) { + PreAuthenticatedAuthenticationProvider provider = new PreAuthenticatedAuthenticationProvider(); + provider.setPreAuthenticatedUserDetailsService(new UserDetailsByNameServiceWrapper<>( + yamiUserDetailsService)); + tokenServices.setAuthenticationManager(new ProviderManager(Collections.singletonList(provider))); + } + +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/security/ResourceServerConfiguration.java b/yami-shop-api/src/main/java/com/yami/shop/api/security/ResourceServerConfiguration.java new file mode 100644 index 0000000..1f6969e --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/security/ResourceServerConfiguration.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.security; + +import com.yami.shop.security.filter.LoginAuthenticationFilter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; +import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +@Configuration +@EnableResourceServer +public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter { + + @Autowired + private LoginAuthenticationFilter loginAuthenticationFilter; + + @Override + public void configure(HttpSecurity http) throws Exception { + http + .addFilterBefore(loginAuthenticationFilter, UsernamePasswordAuthenticationFilter.class) + // Since we want the protected resources to be accessible in the UI as well we need + // session creation to be allowed (it's disabled by default in 2.0.6) + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) + .and() + .requestMatchers().anyRequest() + .and() + .anonymous() + .and() + .authorizeRequests() + //配置/p访问控制,必须认证过后才可以访问 + .antMatchers("/p/**").authenticated(); + } + + +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/security/WebSecurityConfig.java b/yami-shop-api/src/main/java/com/yami/shop/api/security/WebSecurityConfig.java new file mode 100644 index 0000000..7e5b3b8 --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/security/WebSecurityConfig.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.security; + + +import cn.binarywang.wx.miniapp.api.WxMaService; +import com.yami.shop.security.filter.LoginAuthenticationFilter; +import com.yami.shop.security.handler.LoginAuthFailedHandler; +import com.yami.shop.security.handler.LoginAuthSuccessHandler; +import com.yami.shop.security.provider.MiniAppAuthenticationProvider; +import com.yami.shop.security.service.YamiUserDetailsService; +import lombok.SneakyThrows; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.factory.PasswordEncoderFactories; +import org.springframework.security.crypto.password.PasswordEncoder; + +/** + */ +@Configuration +@Order(90) +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + /** + * 自动注入UserDetailsService + */ + @Autowired + private YamiUserDetailsService yamiUserDetailsService; + @Autowired + private LoginAuthSuccessHandler loginAuthSuccessHandler; + @Autowired + private LoginAuthFailedHandler loginAuthFailedHandler; + @Autowired + private WxMaService wxService; + @Autowired + private MiniAppAuthenticationProvider miniAppAuthenticationProvider; + + @Override + @Bean + @SneakyThrows + public AuthenticationManager authenticationManagerBean() { + return super.authenticationManagerBean(); + } + + /** + * 用户验证 + * @param auth + */ + @Override + public void configure(AuthenticationManagerBuilder auth) { + auth.authenticationProvider(miniAppAuthenticationProvider); + } + + @Bean + public PasswordEncoder passwordEncoder(){ + return PasswordEncoderFactories.createDelegatingPasswordEncoder(); + } + + @Bean + public LoginAuthenticationFilter loginAuthenticationFilter() { + LoginAuthenticationFilter filter = new LoginAuthenticationFilter(); + try { + filter.setAuthenticationManager(this.authenticationManagerBean()); + } catch (Exception e) { + e.printStackTrace(); + } + filter.setAuthenticationSuccessHandler(loginAuthSuccessHandler); + filter.setAuthenticationFailureHandler(loginAuthFailedHandler); + return filter; + } + +} diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/security/YamiUserServiceImpl.java b/yami-shop-api/src/main/java/com/yami/shop/api/security/YamiUserServiceImpl.java new file mode 100644 index 0000000..b410b22 --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/security/YamiUserServiceImpl.java @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.security; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.emoji.EmojiUtil; +import com.yami.shop.bean.model.User; +import com.yami.shop.common.annotation.RedisLock; +import com.yami.shop.common.util.CacheManagerUtil; +import com.yami.shop.dao.UserMapper; +import com.yami.shop.security.dao.AppConnectMapper; +import com.yami.shop.security.enums.App; +import com.yami.shop.security.exception.UsernameNotFoundExceptionBase; +import com.yami.shop.security.model.AppConnect; +import com.yami.shop.security.service.YamiUser; +import com.yami.shop.security.service.YamiUserDetailsService; +import lombok.AllArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Caching; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 用户详细信息 + * + * @author + */ +@Slf4j +@Service +@AllArgsConstructor +public class YamiUserServiceImpl implements YamiUserDetailsService { + + private final UserMapper userMapper; + + private final AppConnectMapper appConnectMapper; + + private final CacheManagerUtil cacheManagerUtil; + + + @Override + @SneakyThrows + public YamiUser loadUserByUsername(String username) { + if (StrUtil.isBlank(username) || !username.contains(StrUtil.COLON) ) { + throw new UsernameNotFoundExceptionBase("无法获取用户信息"); + } + String[] splitInfo = username.split(StrUtil.COLON); + App app = App.instance(Integer.valueOf(splitInfo[0])); + String bizUserId = splitInfo[1]; + return loadUserByAppIdAndBizUserId(app,bizUserId); + } + + /** + * 获取前端登陆的用户信息 + * + * @param app + * @param bizUserId openId + * @return UserDetails + * @throws UsernameNotFoundExceptionBase + */ + @Override + public YamiUser loadUserByAppIdAndBizUserId(App app, String bizUserId) { + + String cacheKey = app.value() + StrUtil.COLON + bizUserId; + + YamiUser yamiUser = cacheManagerUtil.getCache("yami_user", cacheKey); + if (yamiUser != null) { + return yamiUser; + } + + + User user = userMapper.getUserByBizUserId(app.value(), bizUserId); + if (user == null) { + throw new UsernameNotFoundExceptionBase("无法获取用户信息"); + } + String name = StrUtil.isBlank(user.getRealName()) ? user.getNickName() : user.getRealName(); + yamiUser = new YamiUser(user.getUserId(), bizUserId, app.value(), user.getStatus() == 1); + yamiUser.setName(name); + yamiUser.setPic(user.getPic()); + + cacheManagerUtil.putCache("yami_sys_user",cacheKey, yamiUser); + return yamiUser; + } + + @Override + @Transactional(rollbackFor = Exception.class) + @RedisLock(lockName = "insertUser", key = "#appConnect.appId + ':' + #appConnect.bizUserId") + @Caching(evict = { + @CacheEvict(cacheNames = "yami_user", key = "#appConnect.appId + ':' + #appConnect.bizUserId"), + @CacheEvict(cacheNames = "AppConnect", key = "#appConnect.appId + ':' + #appConnect.bizUserId") + }) + public void insertUserIfNecessary(AppConnect appConnect) { + // 进入锁后再重新判断一遍用户是否创建 + AppConnect dbAppConnect = appConnectMapper.getByBizUserId(appConnect.getBizUserId(), appConnect.getAppId()); + if(dbAppConnect != null) { + return; + } + + String bizUnionId = appConnect.getBizUnionid(); + String userId = null; + User user; + + if (StrUtil.isNotBlank(bizUnionId)) { + userId = appConnectMapper.getUserIdByUnionId(bizUnionId); + } + if (StrUtil.isBlank(userId)) { + userId = IdUtil.simpleUUID(); + Date now = new Date(); + user = new User(); + user.setUserId(userId); + user.setModifyTime(now); + user.setUserRegtime(now); + user.setStatus(1); + user.setRealName(EmojiUtil.toAlias(StrUtil.isBlank(appConnect.getNickName()) ? "" : appConnect.getNickName())); + user.setPic(appConnect.getImageUrl()); + userMapper.insert(user); + } else { + user = userMapper.selectById(userId); + } + + appConnect.setUserId(user.getUserId()); + + appConnectMapper.insert(appConnect); + } +} diff --git a/yami-shop-api/src/main/resources/api.properties b/yami-shop-api/src/main/resources/api.properties new file mode 100644 index 0000000..82620f9 --- /dev/null +++ b/yami-shop-api/src/main/resources/api.properties @@ -0,0 +1,3 @@ +api.datacenterId=1 +api.workerId=1 +api.domainName=http://xxx.com \ No newline at end of file diff --git a/yami-shop-api/src/main/resources/application-dev.yml b/yami-shop-api/src/main/resources/application-dev.yml new file mode 100644 index 0000000..ba54bd6 --- /dev/null +++ b/yami-shop-api/src/main/resources/application-dev.yml @@ -0,0 +1,20 @@ +server: + port: 8086 +spring: + datasource: + url: jdbc:mysql://127.0.0.1:3306/yami_shops?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true + username: root + password: root + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.zaxxer.hikari.HikariDataSource + hikari: + minimum-idle: 0 + maximum-pool-size: 20 + idle-timeout: 10000 + connection-test-query: select 1 + redis: + redisson: + config: classpath:redisson.yml +logging: + config: classpath:log4j2_dev.xml + diff --git a/yami-shop-api/src/main/resources/application-prod.yml b/yami-shop-api/src/main/resources/application-prod.yml new file mode 100644 index 0000000..d0852c9 --- /dev/null +++ b/yami-shop-api/src/main/resources/application-prod.yml @@ -0,0 +1,21 @@ +server: + port: 8112 + undertow: + worker-threads: 200 + +spring: + datasource: + url: jdbc:mysql://127.0.0.1:3306/yami_shops?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true + username: root + password: root + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.zaxxer.hikari.HikariDataSource + hikari: + minimum-idle: 0 + maximum-pool-size: 20 + connection-test-query: select 1 + redis: + redisson: + config: classpath:redisson.yml +logging: + config: classpath:log4j2_prod.xml \ No newline at end of file diff --git a/yami-shop-api/src/main/resources/application.yml b/yami-shop-api/src/main/resources/application.yml new file mode 100644 index 0000000..3f89780 --- /dev/null +++ b/yami-shop-api/src/main/resources/application.yml @@ -0,0 +1,52 @@ +spring: + # 环境 dev|test|prod + profiles: + active: dev + #文件上传设置 + servlet: + multipart: + max-file-size: 100MB + max-request-size: 100MB + enabled: true + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 + mvc: + formcontent: + filter: + enabled: false + autoconfigure: + exclude: org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\ + org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\ + org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ + org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\ + org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\ + org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\ + org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,\ + org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration,\ + org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\ + org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\ + org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\ + org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\ + org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\ + org.springframework.boot.actuate.autoconfigure.TraceRepositoryAutoConfiguration,\ + org.springframework.boot.actuate.autoconfigure.TraceWebFilterAutoConfiguration,\ + org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration +# mybaits-plus配置 +mybatis-plus: + # MyBatis Mapper所对应的XML文件位置 + mapper-locations: classpath*:/mapper/*Mapper.xml + global-config: + # 关闭MP3.0自带的banner + banner: false + db-config: + # 主键类型 0:数据库ID自增 1.未定义 2.用户输入 3 id_worker 4.uuid 5.id_worker字符串表示 + id-type: AUTO + #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断" + field-strategy: NOT_NULL + # 默认数据库表下划线命名 + table-underline: true + +management: + server: + add-application-context-header: false diff --git a/yami-shop-api/src/main/resources/banner.txt b/yami-shop-api/src/main/resources/banner.txt new file mode 100644 index 0000000..d09c886 --- /dev/null +++ b/yami-shop-api/src/main/resources/banner.txt @@ -0,0 +1,11 @@ + .----------------. .----------------. .----------------. .----------------. +| .--------------. || .--------------. || .--------------. || .--------------. | +| | ____ ____ | || | __ | || | ____ ____ | || | _____ | | +| | |_ _||_ _| | || | / \ | || ||_ \ / _|| || | |_ _| | | +| | \ \ / / | || | / /\ \ | || | | \/ | | || | | | | | +| | \ \/ / | || | / ____ \ | || | | |\ /| | | || | | | | | +| | _| |_ | || | _/ / \ \_ | || | _| |_\/_| |_ | || | _| |_ | | +| | |______| | || ||____| |____|| || ||_____||_____|| || | |_____| | | +| | | || | | || | | || | | | +| '--------------' || '--------------' || '--------------' || '--------------' | + '----------------' '----------------' '----------------' '----------------' \ No newline at end of file diff --git a/yami-shop-api/src/main/resources/log4j2_dev.xml b/yami-shop-api/src/main/resources/log4j2_dev.xml new file mode 100644 index 0000000..355cb9b --- /dev/null +++ b/yami-shop-api/src/main/resources/log4j2_dev.xml @@ -0,0 +1,39 @@ + + + + + ???? + %xwEx + %5p + yyyy-MM-dd HH:mm:ss.SSS + + %clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/yami-shop-api/src/main/resources/log4j2_prod.xml b/yami-shop-api/src/main/resources/log4j2_prod.xml new file mode 100644 index 0000000..54b19e4 --- /dev/null +++ b/yami-shop-api/src/main/resources/log4j2_prod.xml @@ -0,0 +1,59 @@ + + + + + ???? + %xwEx + %5p + yyyy-MM-dd HH:mm:ss.SSS + + %clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD} + + %d{${LOG_DATEFORMAT_PATTERN}} ${LOG_LEVEL_PATTERN} ${sys:PID} --- [%t] %-40.40c{1.} : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD} + + 50 + 50MB + /opt/projects/mall4j + + + + + + + + + + + + + + ${sys:FILE_LOG_PATTERN} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/yami-shop-api/src/main/resources/redisson.yml b/yami-shop-api/src/main/resources/redisson.yml new file mode 100644 index 0000000..1c8989e --- /dev/null +++ b/yami-shop-api/src/main/resources/redisson.yml @@ -0,0 +1,31 @@ +# 单节点设置 +singleServerConfig: + address: redis://127.0.0.1:6379 + database: 0 + password: null + idleConnectionTimeout: 10000 + pingTimeout: 1000 + connectTimeout: 10000 + timeout: 3000 + retryAttempts: 3 + retryInterval: 1500 + reconnectionTimeout: 3000 + failedAttempts: 3 + clientName: null + # 发布和订阅连接的最小空闲连接数 默认1 + subscriptionConnectionMinimumIdleSize: 1 + # 发布和订阅连接池大小 默认50 + subscriptionConnectionPoolSize: 10 + # 单个连接最大订阅数量 默认5 + subscriptionsPerConnection: 5 + # 最小空闲连接数 默认32,现在暂时不需要那么多的线程 + connectionMinimumIdleSize: 4 + # connectionPoolSize 默认64,现在暂时不需要那么多的线程 + connectionPoolSize: 20 +# 这个线程池数量被所有RTopic对象监听器,RRemoteService调用者和RExecutorService任务共同共享。 +threads: 0 +# 这个线程池数量是在一个Redisson实例内,被其创建的所有分布式数据类型和服务,以及底层客户端所一同共享的线程池里保存的线程数量。 +nettyThreads: 0 +codec: + class: com.yami.shop.common.serializer.redisson.FstCodec +transportMode: NIO \ No newline at end of file diff --git a/yami-shop-bean/pom.xml b/yami-shop-bean/pom.xml new file mode 100644 index 0000000..d7e375b --- /dev/null +++ b/yami-shop-bean/pom.xml @@ -0,0 +1,26 @@ + + + + yami-shop + com.yami.shop + 0.0.1-SNAPSHOT + + 4.0.0 + + yami-shop-bean + + + + + com.yami.shop + yami-shop-common + ${yami.shop.version} + + + org.springframework.boot + spring-boot-starter-validation + + + \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/SmsInfoContext.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/SmsInfoContext.java new file mode 100644 index 0000000..27701dc --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/SmsInfoContext.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean; + +import java.util.ArrayList; +import java.util.List; + +import com.yami.shop.bean.bo.SmsInfoBo; + +import cn.hutool.core.collection.CollectionUtil; + +public class SmsInfoContext { + + /** The request holder. */ + private static ThreadLocal> smsInfoHolder = new ThreadLocal>(); + + + public static List get(){ + List list = smsInfoHolder.get(); + if (CollectionUtil.isEmpty(list)) { + return new ArrayList<>(); + } + return smsInfoHolder.get(); + } + + public static void set(List smsInfoBos){ + smsInfoHolder.set(smsInfoBos); + } + + public static void put(SmsInfoBo smsInfoBo){ + List smsInfoBos = smsInfoHolder.get(); + if (CollectionUtil.isEmpty(smsInfoBos)) { + smsInfoBos = new ArrayList<>(); + } + smsInfoBos.add(smsInfoBo); + smsInfoHolder.set(smsInfoBos); + } + + public static void clean() { + if (smsInfoHolder.get() != null) { + smsInfoHolder.remove(); + } + } +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/BasketItemDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/BasketItemDto.java new file mode 100644 index 0000000..b1263fd --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/BasketItemDto.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.yami.shop.common.serializer.json.ImgJsonSerializer; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class BasketItemDto implements Serializable { + + @ApiModelProperty(value = "购物车ID", required = true) + private Long basketId; + + @ApiModelProperty(value = "店铺ID", required = true) + private Long shopId; + + /** + * 商品名称 + */ + @JsonIgnore + private String shopName; + + @ApiModelProperty(value = "产品ID", required = true) + private Long prodId; + + @ApiModelProperty(value = "skuID", required = true) + private Long skuId; + + @ApiModelProperty(value = "产品个数", required = true) + private Integer prodCount; + + @ApiModelProperty(value = "产品名称", required = true) + private String prodName; + + @ApiModelProperty(value = "产品主图", required = true) + @JsonSerialize(using = ImgJsonSerializer.class) + private String pic; + + @ApiModelProperty(value = "产品现价", required = true) + private Double price; + + @ApiModelProperty(value = "产品原价", required = true) + private Double oriPrice; + + @ApiModelProperty(value = "产品简介", required = true) + private String brief; + + @ApiModelProperty(value = "产品sku信息", required = true) + private String skuName; + + @ApiModelProperty("参与满减活动列表") + private List discounts; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/CategoryDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/CategoryDto.java new file mode 100644 index 0000000..9c05ff7 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/CategoryDto.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.yami.shop.common.serializer.json.ImgJsonSerializer; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class CategoryDto { + + @ApiModelProperty(value = "分类id",required=true) + private Long categoryId; + + @ApiModelProperty(value = "分类父id",required=true) + private Long parentId; + + @ApiModelProperty(value = "分类名称",required=true) + private String categoryName; + + @ApiModelProperty(value = "分类图片",required=true) + @JsonSerialize(using = ImgJsonSerializer.class) + private String pic; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ChooseDiscountItemDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ChooseDiscountItemDto.java new file mode 100644 index 0000000..fcd213c --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ChooseDiscountItemDto.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.models.auth.In; +import lombok.Data; + +import java.io.Serializable; + +/** + * 购物车中选中的满减活动项信息 + */ +@Data +public class ChooseDiscountItemDto implements Serializable { + + @ApiModelProperty("满减满折优惠id") + private Long discountId; + + @ApiModelProperty("优惠规则(0:满钱减钱 1:满件减钱 2:满钱打折 3:满件打折)") + private Integer discountRule; + + @ApiModelProperty(value = "优惠项id") + @JsonIgnore + private Long discountItemId; + + @ApiModelProperty(value = "所需需要金额") + private Double needAmount; + + @ApiModelProperty(value = "减免类型 0按满足最高层级减一次 1每满一次减一次") + private Integer discountType; + + @ApiModelProperty(value = "参与满减满折优惠的商品数量") + private int prodCount = 0; + + @ApiModelProperty(value = "参与满减满折优惠的商品金额") + private double prodsPrice = 0.00; + + @ApiModelProperty(value = "优惠(元/折)") + private Double discount; + + @ApiModelProperty(value = "参与满减满折优惠的金额") + private Double reduceAmount = 0.0; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/CouponDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/CouponDto.java new file mode 100644 index 0000000..091dc60 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/CouponDto.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.yami.shop.common.serializer.json.ImgJsonSerializer; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +@Data +@ApiModel("优惠券对象") +public class CouponDto implements Serializable { + + @ApiModelProperty(value = "优惠券id") + private Long couponId; + + @ApiModelProperty(value = "店铺ID") + private Long shopId; + + @ApiModelProperty(value = "店铺名称") + private String shopName; + + @ApiModelProperty(value = "优惠券名称") + private String couponName; + + @ApiModelProperty(value = "副标题") + private String subTitle; + + @ApiModelProperty(value = "优惠类型 1:代金券 2:折扣券 3:兑换券") + private Integer couponType; + + @ApiModelProperty(value = "使用条件") + private Double cashCondition; + + @ApiModelProperty(value = "减免金额") + private Double reduceAmount; + + @ApiModelProperty(value = "折扣额度") + private Double couponDiscount; + + @ApiModelProperty(value = "生效时间 1:固定时间 2:领取后生效") + private Integer validTimeType; + + @ApiModelProperty(value = "开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date startTime; + + @ApiModelProperty(value = "结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date endTime; + + @ApiModelProperty(value = "领券后X天起生效") + private Integer afterReceiveDays; + + @ApiModelProperty(value = "有效天数") + private Integer validDays; + + @ApiModelProperty(value = "库存") + private Integer stocks; + + @ApiModelProperty(value = "适用商品类型 0全部商品参与 1指定商品参与 2指定商品不参与") + private Integer suitableProdType; + + @ApiModelProperty(value = "指定商品图片") + @JsonSerialize(using = ImgJsonSerializer.class) + private String pic; + + @ApiModelProperty(value = "指定商品id") + private Long prodId; + + @ApiModelProperty(value = "指定商品价格") + private Double price; + + @ApiModelProperty(value = "每个用户领券上限") + private Integer limitNum; + + @ApiModelProperty(value = "优惠券过期状态 0:过期 1:未过期") + private Integer overdueStatus; + + @ApiModelProperty(value = "优惠券投放状态 0:未投放 1:投放") + private Integer putonStatus; + + @ApiModelProperty(value = "用户优惠券id") + private Long couponUserId; + + @ApiModelProperty(value = "领券时间") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date receiveTime; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/CouponOrderDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/CouponOrderDto.java new file mode 100644 index 0000000..2b26792 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/CouponOrderDto.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Data +public class CouponOrderDto implements Serializable { + + @ApiModelProperty(value = "优惠券id") + private Long couponId; + + @ApiModelProperty(value = "店铺ID") + private Long shopId; + + @ApiModelProperty(value = "优惠券名称") + private String couponName; + + @ApiModelProperty(value = "副标题") + private String subTitle; + + @ApiModelProperty(value = "优惠类型 1:代金券 2:折扣券 3:兑换券") + private Integer couponType; + + @ApiModelProperty(value = "使用条件") + private Double cashCondition; + + @ApiModelProperty(value = "减免金额") + private Double reduceAmount; + + @ApiModelProperty(value = "折扣") + private Double couponDiscount; + + @ApiModelProperty(value = "开始时间") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date startTime; + + @ApiModelProperty(value = "结束时间") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date endTime; + + @ApiModelProperty(value = "适用商品类型 0全部商品参与 1指定商品参与 2指定商品不参与") + private Integer suitableProdType; + + @ApiModelProperty(value = "指定的商品id") + private List prodIds; + + @ApiModelProperty(value = "选中的商品id") + private List chooseProdIds = new ArrayList<>(); + + @ApiModelProperty(value = "是否选中") + private boolean isChoose; + + @ApiModelProperty(value = "是否可用") + private boolean canUse; + + @ApiModelProperty(value = "用户优惠券id") + private Long couponUserId; + + @ApiModelProperty(value = "生效时间 1:固定时间 2:领取后生效") + private Integer validTimeType; + + @ApiModelProperty(value = "领券后X天起生效") + private Integer afterReceiveDays; + + @ApiModelProperty(value = "有效天数") + private Integer validDays; + + @ApiModelProperty(value = "领券时间") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date receiveTime; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/DeliveryDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/DeliveryDto.java new file mode 100644 index 0000000..7b8918f --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/DeliveryDto.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import java.util.List; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class DeliveryDto { + + @ApiModelProperty(value = "物流公司名称",required=true) + private String companyName; + + @ApiModelProperty(value = "物流公司官网",required=true) + private String companyHomeUrl; + + @ApiModelProperty(value = "物流订单号",required=true) + private String dvyFlowId; + + @ApiModelProperty(value = "查询出的物流信息",required=true) + private List data; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/DeliveryInfoDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/DeliveryInfoDto.java new file mode 100644 index 0000000..49536ce --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/DeliveryInfoDto.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class DeliveryInfoDto { + + @ApiModelProperty(value = "详细信息",required=true) + private String context; + + private String ftime; + + @ApiModelProperty(value = "快递所在区域",required=true) + private String location; + + @ApiModelProperty(value = "物流更新时间",required=true) + private String time; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/DiscountDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/DiscountDto.java new file mode 100644 index 0000000..f1b615e --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/DiscountDto.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +public class DiscountDto implements Serializable { + + @ApiModelProperty("满减满折优惠id") + private Long discountId; + + @ApiModelProperty("店铺ID") + private Long shopId; + + @ApiModelProperty("活动名称") + private String discountName; + + @ApiModelProperty("优惠规则(0:满钱减钱 1:满件减钱 2:满钱打折 3:满件打折)") + private Integer discountRule; + + @ApiModelProperty("减免类型(0:按满足最高层级减一次 1:每满一次减一次)") + private Integer discountType; + + @ApiModelProperty("适用商品类型(0:通用券 1:商品券)") + private Integer suitableProdType; + + @ApiModelProperty("最多减多少") + private Double maxReduceAmount; + + @ApiModelProperty("开始时间") + private Date startTime; + + @ApiModelProperty("结束时间") + private Date endTime; + + private List discountItems; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/DiscountItemDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/DiscountItemDto.java new file mode 100644 index 0000000..02ac914 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/DiscountItemDto.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +public class DiscountItemDto implements Serializable { + + @ApiModelProperty(value = "优惠项id") + private Long discountItemId; + + @ApiModelProperty(value = "优惠活动id") + private Long discountId; + + @ApiModelProperty(value = "所需需要金额") + private Double needAmount; + + @ApiModelProperty(value = "优惠(元/折)") + private Double discount; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/IndexImgDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/IndexImgDto.java new file mode 100644 index 0000000..8614ddb --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/IndexImgDto.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.yami.shop.common.serializer.json.ImgJsonSerializer; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +@ApiModel("首页图片对象") +@Data +public class IndexImgDto { + + /** + * 图片 + */ + @JsonSerialize(using = ImgJsonSerializer.class) + @ApiModelProperty(value = "图片Url", required = true) + private String imgUrl; + + /** + * 顺序 + */ + @ApiModelProperty(value = "图片顺序", required = true) + private Integer seq; + + /** + * 上传时间 + */ + @ApiModelProperty(value = "上传时间", required = true) + private Date uploadTime; + + /** + * 类型 + */ + @ApiModelProperty(value = "类型", required = true) + private int type; + + /** + * 关联id + */ + @ApiModelProperty(value = "关联id", required = true) + private Long relation; + + + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/MyOrderDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/MyOrderDto.java new file mode 100644 index 0000000..64a8833 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/MyOrderDto.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import java.util.List; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("我的订单") +public class MyOrderDto { + + @ApiModelProperty(value = "订单项",required=true) + private List orderItemDtos; + + @ApiModelProperty(value = "订单号",required=true) + private String orderNumber; + + @ApiModelProperty(value = "总价",required=true) + private Double actualTotal; + + @ApiModelProperty(value = "订单状态",required=true) + private Integer status; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/MyOrderItemDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/MyOrderItemDto.java new file mode 100644 index 0000000..cd18e74 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/MyOrderItemDto.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.yami.shop.common.serializer.json.ImgJsonSerializer; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("我的订单-订单项") +@Data +public class MyOrderItemDto { + + @ApiModelProperty(value = "商品图片", required = true) + @JsonSerialize(using = ImgJsonSerializer.class) + private String pic; + + @ApiModelProperty(value = "商品名称", required = true) + private String prodName; + + @ApiModelProperty(value = "商品数量", required = true) + private Integer prodCount; + + @ApiModelProperty(value = "商品价格", required = true) + private Double price; + + @ApiModelProperty(value = "skuName", required = true) + private String skuName; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/NoticeDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/NoticeDto.java new file mode 100644 index 0000000..d4066f9 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/NoticeDto.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +@ApiModel("公告对象") +@Data +public class NoticeDto { + + @JsonView(NoContent.class) + @ApiModelProperty(value = "公告id") + private Long id; + + @JsonView(NoContent.class) + @ApiModelProperty(value = "店铺id") + private Long shopId; + + @JsonView(NoContent.class) + @ApiModelProperty(value = "标题") + private String title; + + @ApiModelProperty(value = "公告内容") + @JsonView(WithContent.class) + private String content; + + @JsonView(NoContent.class) + @ApiModelProperty(value = "公告发布时间") + private Date publishTime; + + public static interface NoContent{} + + public static interface WithContent extends NoContent{} + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/OrderCountData.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/OrderCountData.java new file mode 100644 index 0000000..dead41c --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/OrderCountData.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("我的订单数量") +public class OrderCountData { + + @ApiModelProperty(value = "所有订单数量") + private Integer allCount; + + @ApiModelProperty(value = "待付款") + private Integer unPay; + + @ApiModelProperty(value = "待发货") + private Integer payed; + + @ApiModelProperty(value = "待收货") + private Integer consignment; + + @ApiModelProperty(value = "待评价") + private Integer confirm; + + @ApiModelProperty(value = "成功") + private Integer success; + + @ApiModelProperty(value = "失败") + private Integer close; + + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/OrderItemDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/OrderItemDto.java new file mode 100644 index 0000000..1fdd5ba --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/OrderItemDto.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * @author LGH + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class OrderItemDto extends ProductItemDto implements Serializable { + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/OrderNumbersDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/OrderNumbersDto.java new file mode 100644 index 0000000..c14266f --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/OrderNumbersDto.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class OrderNumbersDto { + + @ApiModelProperty(value = "多个订单号拼接的字符串",required=true) + private String orderNumbers; + + public OrderNumbersDto(String orderNumbers) { + this.orderNumbers = orderNumbers; + } +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/OrderShopDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/OrderShopDto.java new file mode 100644 index 0000000..94f2063 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/OrderShopDto.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import io.swagger.annotations.ApiModelProperty; + +/** + * 订单下的每个店铺 + * + * @author YaMi + */ +@Data +public class OrderShopDto implements Serializable { + + /** + * 店铺ID + **/ + @ApiModelProperty(value = "店铺id", required = true) + private Long shopId; + + /** + * 店铺名称 + **/ + @ApiModelProperty(value = "店铺名称", required = true) + private String shopName; + + @ApiModelProperty(value = "实际总值", required = true) + private Double actualTotal; + + @ApiModelProperty(value = "商品总值", required = true) + private Double total; + + @ApiModelProperty(value = "商品总数", required = true) + private Integer totalNum; + + @ApiModelProperty(value = "地址Dto", required = true) + private UserAddrDto userAddrDto; + + @ApiModelProperty(value = "产品信息", required = true) + private List orderItemDtos; + + @ApiModelProperty(value = "运费", required = true) + private Double transfee; + + @ApiModelProperty(value = "优惠总额", required = true) + private Double reduceAmount; + + @ApiModelProperty(value = "促销活动优惠金额", required = true) + private Double discountMoney; + + @ApiModelProperty(value = "优惠券优惠金额", required = true) + private Double couponMoney; + + /** + * 创建时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "订单创建时间", required = true) + private Date createTime; + + /** + * 订单备注信息 + */ + @ApiModelProperty(value = "订单备注信息", required = true) + private String remarks; + + /** + * 订单状态 + */ + @ApiModelProperty(value = "订单状态", required = true) + private Integer status; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProdCommDataDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProdCommDataDto.java new file mode 100644 index 0000000..b69937d --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProdCommDataDto.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +@ApiModel("商品评论数据") +@Data +public class ProdCommDataDto { + + @ApiModelProperty(value = "好评率") + private Double positiveRating; + + @ApiModelProperty(value = "评论数量") + private Integer number; + + @ApiModelProperty(value = "好评数") + private Integer praiseNumber; + + @ApiModelProperty(value = "中评数") + private Integer secondaryNumber; + + @ApiModelProperty(value = "差评数") + private Integer negativeNumber; + + @ApiModelProperty(value = "有图数") + private Integer picNumber; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProdCommDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProdCommDto.java new file mode 100644 index 0000000..70d4801 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProdCommDto.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.yami.shop.common.serializer.json.EmojiJsonSerializer; +import com.yami.shop.common.serializer.json.ImgJsonSerializer; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; +import java.util.List; + +@ApiModel("评论对象") +@Data +public class ProdCommDto { + + @ApiModelProperty(value = "id") + private Long prodCommId; + + /** + * 得分,0-5分 + */ + @ApiModelProperty(value = "得分,0-5分") + private Integer score; + + /** + * 是否匿名(1:是 0:否) + */ + @ApiModelProperty(value = "是否匿名(1:是 0:否)") + private Integer isAnonymous; + + /** + * 掌柜回复 + */ + @ApiModelProperty(value = "掌柜回复") + private String replyContent; + + /** + * 记录时间 + */ + @ApiModelProperty(value = "记录时间") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date recTime; + + /** + * 回复时间 + */ + @ApiModelProperty(value = "回复时间") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date replyTime; + + @JsonSerialize(using = EmojiJsonSerializer.class) + @ApiModelProperty(value = "用户昵称") + private String nickName; + + /** + * 头像图片路径 + */ + @ApiModelProperty(value = "头像图片路径") + private String pic; + + /** + * 是否回复 0:未回复 1:已回复 + */ + @ApiModelProperty(value = "商家是否回复 0:未回复 1:已回复") + private Integer replySts; + + /** + * 评论图片 + */ + @JsonSerialize(using = ImgJsonSerializer.class) + @ApiModelProperty(value = "评论图片") + private String pics; + + /** + * 评价等级 + */ + @ApiModelProperty(value = "0好评 1中评 2差评") + private Byte evaluate; + + @ApiModelProperty(value = "评论内容") + private String content; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProdCouponDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProdCouponDto.java new file mode 100644 index 0000000..19e0dae --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProdCouponDto.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.yami.shop.common.serializer.json.ImgJsonSerializer; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("商品优惠券对象") +@Data +public class ProdCouponDto { + + @ApiModelProperty(value = "商品id") + private Long prodId; + + @ApiModelProperty(value = "店铺id") + private Long shopId; + + @ApiModelProperty(value = "商品名称") + private String prodName; + + @ApiModelProperty(value = "原价") + private Double oriPrice; + + @ApiModelProperty(value = "现价") + private Double price; + + @ApiModelProperty(value = "商品主图") + @JsonSerialize(using = ImgJsonSerializer.class) + private String pic; + + @ApiModelProperty(value = "优惠券ID") + private Long couponId; + + @ApiModelProperty(value = "优惠券名称") + private String couponName; + + @ApiModelProperty(value = "副标题") + private String subTitle; + + @ApiModelProperty(value = " 优惠类型 1:代金券 2:折扣券 3:兑换券") + private Integer couponType; + + @ApiModelProperty(value = "使用条件金额") + private Double cashCondition; + + @ApiModelProperty(value = "减免金额") + private Double reduceAmount; + + @ApiModelProperty(value = "折扣额度") + private Double couponDiscount; + + @ApiModelProperty(value = "库存") + private Integer stocks; + + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProdTagDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProdTagDto.java new file mode 100644 index 0000000..a618003 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProdTagDto.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ProdTagDto { + + @ApiModelProperty(value = "分组标签id") + private Long id; + + @ApiModelProperty(value = "分组标签标题") + private String title; + + @ApiModelProperty(value = "排序(数值越高越靠前)") + private String seq; + + @ApiModelProperty(value = "列表样式(0:一列一个,1:一列两个,2:一列三个)") + private String style; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProductDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProductDto.java new file mode 100644 index 0000000..8a9fa08 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProductDto.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import java.util.List; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.yami.shop.bean.model.Transport; + +import com.yami.shop.common.serializer.json.ImgJsonSerializer; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ProductDto { + /** + * 店铺ID + */ + @ApiModelProperty(value = "店铺ID", required = true) + private Long shopId; + + /** + * 店铺名称 + */ + @ApiModelProperty(value = "店铺名称", required = true) + private String shopName; + + /** + * 商品ID + */ + @ApiModelProperty(value = "商品ID", required = true) + private Long prodId; + + /** + * 商品名称 + */ + @ApiModelProperty(value = "商品名称") + private String prodName; + + /** + * 商品价格 + */ + @ApiModelProperty(value = "商品价格", required = true) + private Double price; + + /** + * 商品详情 + */ + @ApiModelProperty(value = "详细描述") + private String content; + + /** + * 商品原价 + */ + @ApiModelProperty(value = "商品原价", required = true) + private Double oriPrice; + + /** + * 库存量 + */ + @ApiModelProperty(value = "库存量", required = true) + private Integer totalStocks; + + /** + * 简要描述,卖点等 + */ + @ApiModelProperty(value = "简要描述,卖点等", required = true) + private String brief; + + /** + * 商品主图 + */ + @JsonSerialize(using = ImgJsonSerializer.class) + @ApiModelProperty(value = "商品主图", required = true) + private String pic; + + @JsonSerialize(using = ImgJsonSerializer.class) + @ApiModelProperty(value = "商品图片列表,以逗号分割", required = true) + private String imgs; + + /** + * 商品分类 + */ + @ApiModelProperty(value = "商品分类id", required = true) + private Long categoryId; + + @ApiModelProperty(value = "sku列表") + private List skuList; + + @ApiModelProperty(value = "运费信息", required = true) + private Transport transport; + + public static interface WithNoContent{} + + public static interface WithContent extends WithNoContent{} + + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProductItemDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProductItemDto.java new file mode 100644 index 0000000..7fedc0f --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ProductItemDto.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.yami.shop.common.serializer.json.ImgJsonSerializer; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * @author LGH + */ +@Data +public class ProductItemDto implements Serializable { + + @ApiModelProperty(value = "产品名称",required=true) + private String prodName; + + @ApiModelProperty(value = "产品个数",required=true) + private Integer prodCount; + + @ApiModelProperty(value = "产品图片路径",required=true) + @JsonSerialize(using = ImgJsonSerializer.class) + private String pic; + + @ApiModelProperty(value = "产品价格",required=true) + private Double price; + + @ApiModelProperty(value = "商品总金额",required=true) + private Double productTotalAmount; + + @ApiModelProperty(value = "产品ID",required=true) + private Long prodId; + + @ApiModelProperty(value = "skuId",required=true) + private Long skuId; + + @ApiModelProperty(value = "规格名称", required = true) + private String skuName; + + @ApiModelProperty(value = "basketId",required=true) + private Long basketId; + + @ApiModelProperty(value = "商品实际金额 = 商品总金额 - 分摊的优惠金额") + private Double actualTotal; + + @ApiModelProperty(value = "满减满折优惠id,0不主动参与活动(用户没有主动参与该活动),-1主动不参与活动") + private Long discountId = 0L; + + @ApiModelProperty(value = "分摊的优惠金额") + private Double shareReduce; + + @ApiModelProperty("参与满减活动列表") + private List discounts = new ArrayList<>(); +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartAmountDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartAmountDto.java new file mode 100644 index 0000000..52c24db --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartAmountDto.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("购物车合计") +public class ShopCartAmountDto { + + @ApiModelProperty("总额") + private Double totalMoney; + + @ApiModelProperty("总计") + private Double finalMoney; + + @ApiModelProperty("减额") + private Double subtractMoney; + + @ApiModelProperty("商品数量") + private Integer count; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartDto.java new file mode 100644 index 0000000..ea5ddea --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartDto.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class ShopCartDto implements Serializable { + + @ApiModelProperty(value = "店铺ID", required = true) + private Long shopId; + + @ApiModelProperty(value = "店铺名称", required = true) + private String shopName; + + @ApiModelProperty(value = "购物车商品", required = true) + private List shopCartItemDiscounts; + + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartExpiryItemDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartExpiryItemDto.java new file mode 100644 index 0000000..4f5a2b7 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartExpiryItemDto.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +@ApiModel("购物车失效商品对象") +public class ShopCartExpiryItemDto { + @ApiModelProperty(value = "店铺ID", required = true) + private Long shopId; + + @ApiModelProperty(value = "店铺名称", required = true) + private String shopName; + + @ApiModelProperty(value = "商品项", required = true) + private List shopCartItemDtoList; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartItemDiscountDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartItemDiscountDto.java new file mode 100644 index 0000000..76380a6 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartItemDiscountDto.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class ShopCartItemDiscountDto implements Serializable { + + + @ApiModelProperty(value = "已选满减项", required = true) + private ChooseDiscountItemDto chooseDiscountItemDto; + + @ApiModelProperty(value = "商品列表") + private List shopCartItems; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartItemDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartItemDto.java new file mode 100644 index 0000000..56e992f --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartItemDto.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.yami.shop.common.serializer.json.ImgJsonSerializer; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author LGH + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class ShopCartItemDto extends ProductItemDto implements Serializable { + private static final long serialVersionUID = -8284981156242930909L; + + @ApiModelProperty(value = "购物车ID", required = true) + private Long basketId; + + @ApiModelProperty(value = "店铺ID", required = true) + private Long shopId; + + @ApiModelProperty(value = "规格名称", required = true) + private String skuName; + + @ApiModelProperty(value = "店铺名称", required = true) + private String shopName; + + @ApiModelProperty(value = "商品原价", required = true) + private Double oriPrice; + + @ApiModelProperty(value = "推广员使用的推销卡号") + private String distributionCardNo; + + @ApiModelProperty(value = "加入购物车的时间") + private Date basketDate; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartOrderDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartOrderDto.java new file mode 100644 index 0000000..fcb10a3 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartOrderDto.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 单个店铺的订单信息 + */ +@Data +public class ShopCartOrderDto implements Serializable{ + + @ApiModelProperty(value = "店铺id", required = true) + private Long shopId; + + @ApiModelProperty(value = "店铺名称", required = true) + private String shopName; + + @ApiModelProperty(value = "实际总值", required = true) + private Double actualTotal; + + @ApiModelProperty(value = "商品总值", required = true) + private Double total; + + @ApiModelProperty(value = "商品总数", required = true) + private Integer totalCount; + + @ApiModelProperty(value = "运费", required = true) + private Double transfee; + + @ApiModelProperty(value = "促销活动优惠金额", required = true) + private Double discountReduce; + + @ApiModelProperty(value = "优惠券优惠金额", required = true) + private Double couponReduce; + + @ApiModelProperty(value = "店铺优惠金额(促销活动 + 优惠券 + 其他)", required = true) + private Double shopReduce = 0.0; + + @ApiModelProperty(value = "订单备注信息", required = true) + private String remarks; + + @ApiModelProperty(value = "购物车商品", required = true) + private List shopCartItemDiscounts; + + @ApiModelProperty(value = "整个店铺可以使用的优惠券列表", required = true) + private List coupons; + + @ApiModelProperty(value = "订单编号", required = true) + private String orderNumber; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartOrderMergerDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartOrderMergerDto.java new file mode 100644 index 0000000..69a3d55 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartOrderMergerDto.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 多个店铺订单合并在一起的合并类 + * "/confirm" 使用 + */ +@Data +public class ShopCartOrderMergerDto implements Serializable{ + + @ApiModelProperty(value = "实际总值", required = true) + private Double actualTotal; + + @ApiModelProperty(value = "商品总值", required = true) + private Double total; + + @ApiModelProperty(value = "商品总数", required = true) + private Integer totalCount; + + @ApiModelProperty(value = "订单优惠金额(所有店铺优惠金额相加)", required = true) + private Double orderReduce; + + @ApiModelProperty(value = "地址Dto", required = true) + private UserAddrDto userAddr; + + @ApiModelProperty(value = "每个店铺的购物车信息", required = true) + private List shopCartOrders; + + @ApiModelProperty(value = "整个订单可以使用的优惠券列表", required = true) + private List coupons; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/SkuDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/SkuDto.java new file mode 100644 index 0000000..48c8aec --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/SkuDto.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.yami.shop.common.serializer.json.ImgJsonSerializer; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +public class SkuDto implements Serializable { + + private static final long serialVersionUID = 6457261945829470666L; + + @ApiModelProperty(value = "skuId", required = true) + private Long skuId; + @ApiModelProperty(value = "价格", required = true) + private Double price; + + @ApiModelProperty(value = "库存(-1表示无穷)", required = true) + private Integer stocks; + + @ApiModelProperty(value = "sku名称", required = true) + private String skuName; + + @ApiModelProperty(value = "图片") + @JsonSerialize(using = ImgJsonSerializer.class) + private String pic; + + @ApiModelProperty(value = "销售属性组合字符串,格式是p1:v1;p2:v2", required = true) + private String properties; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/TagProductDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/TagProductDto.java new file mode 100644 index 0000000..346c570 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/TagProductDto.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import com.yami.shop.bean.model.ProdTag; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class TagProductDto { + + @ApiModelProperty(value = "分组标签id") + private Long id; + + @ApiModelProperty(value = "分组标签标题") + private String title; + + @ApiModelProperty(value = "排序(数值越高越靠前)") + private String seq; + + @ApiModelProperty(value = "列表样式(0:一列一个,1:一列两个,2:一列三个)") + private String style; + + private List productDtoList; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/UserAddrDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/UserAddrDto.java new file mode 100644 index 0000000..d3cc349 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/UserAddrDto.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +public class UserAddrDto implements Serializable { + @ApiModelProperty(value = "地址id", required = true) + private Long addrId; + + @ApiModelProperty(value = "收货人", required = true) + private String receiver; + + @ApiModelProperty(value = "省", required = true) + private String province; + + @ApiModelProperty(value = "城市", required = true) + private String city; + + @ApiModelProperty(value = "区", required = true) + private String area; + + @ApiModelProperty(value = "地址", required = true) + private String addr; + + @ApiModelProperty(value = "手机", required = true) + private String mobile; + + @ApiModelProperty(value = "是否默认地址(1:是 0:否) ", required = true) + private Integer commonAddr; + + /** + * 省ID + */ + @ApiModelProperty(value = "省ID", required = true) + private Long provinceId; + + /** + * 城市ID + */ + @ApiModelProperty(value = "城市ID", required = true) + private Long cityId; + + /** + * 区域ID + */ + @ApiModelProperty(value = "区域ID", required = true) + private Long areaId; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/UserCollectionDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/UserCollectionDto.java new file mode 100644 index 0000000..d719b69 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/UserCollectionDto.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +@ApiModel("收藏对象") +@Data +public class UserCollectionDto { + + @ApiModelProperty(value = "收藏id") + private Long id; + + @ApiModelProperty(value = "商品名称") + private String prodName; + + @ApiModelProperty(value = "收藏时间") + private Date createTime; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/UserDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/UserDto.java new file mode 100644 index 0000000..ecfc06b --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/UserDto.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.dto; + +import io.swagger.annotations.ApiModelProperty; + +public class UserDto { + + + @ApiModelProperty(value = "用户状态:0禁用 1正常",required=true) + private Integer status; + @ApiModelProperty(value = "token",required=true) + private String token; + + public Integer getStatus() { + return status; + } + public void setStatus(Integer status) { + this.status = status; + } + public String getToken() { + return token; + } + public void setToken(String token) { + this.token = token; + } + +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/AddrParam.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/AddrParam.java new file mode 100644 index 0000000..30cba06 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/AddrParam.java @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.param; + +import javax.validation.constraints.NotNull; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +@ApiModel(value= "地址参数") +public class AddrParam { + + @ApiModelProperty(value = "地址ID",required=true) + private Long addrId; + + @NotNull(message = "收货人不能为空") + @ApiModelProperty(value = "收货人",required=true) + private String receiver; + + @NotNull(message = "地址不能为空") + @ApiModelProperty(value = "地址",required=true) + private String addr; + + @ApiModelProperty(value = "邮编",required=false) + private String postCode; + + @NotNull(message = "手机不能为空") + @ApiModelProperty(value = "手机",required=true) + private String mobile; + + @NotNull(message = "省ID不能为空") + @ApiModelProperty(value = "省ID",required=true) + private Long provinceId; + + @NotNull(message = "城市ID不能为空") + @ApiModelProperty(value = "城市ID",required=true) + private Long cityId; + + @NotNull(message = "区ID不能为空") + @ApiModelProperty(value = "区ID",required=true) + private Long areaId; + + @NotNull(message = "省不能为空") + @ApiModelProperty(value = "省",required=true) + private String province; + + @NotNull(message = "城市不能为空") + @ApiModelProperty(value = "城市",required=true) + private String city; + + @NotNull(message = "区不能为空") + @ApiModelProperty(value = "区",required=true) + private String area; + + + public Long getAddrId() { + return addrId; + } + + public void setAddrId(Long addrId) { + this.addrId = addrId; + } + + public String getReceiver() { + return receiver; + } + + public void setReceiver(String receiver) { + this.receiver = receiver; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + public String getPostCode() { + return postCode; + } + + public void setPostCode(String postCode) { + this.postCode = postCode; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/ChangeShopCartParam.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/ChangeShopCartParam.java new file mode 100644 index 0000000..ec165df --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/ChangeShopCartParam.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.param; + +import javax.validation.constraints.NotNull; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author LGH + */ +@Data +public class ChangeShopCartParam { + + @ApiModelProperty(value = "购物车ID", required = true) + private Long basketId; + + @NotNull(message = "商品ID不能为空") + @ApiModelProperty(value = "商品ID", required = true) + private Long prodId; + + @NotNull(message = "skuId不能为空") + @ApiModelProperty(value = "skuId", required = true) + private Long skuId; + + @NotNull(message = "店铺ID不能为空") + @ApiModelProperty(value = "店铺ID", required = true) + private Long shopId; + + @NotNull(message = "商品个数不能为空") + @ApiModelProperty(value = "商品个数", required = true) + private Integer count; + + @ApiModelProperty(value = "分销推广人卡号") + private String distributionCardNo; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/LoginParam.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/LoginParam.java new file mode 100644 index 0000000..b82d67f --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/LoginParam.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.param; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +@ApiModel(value= "登陆参数") +public class LoginParam { + + @ApiModelProperty(value = "小程序登陆时返回的code(使用code登陆必填)",required=true) + private String code; + @ApiModelProperty(value = "登陆时的用户名(账号密码登陆必填)",required=true) + private String mobile; + @ApiModelProperty(value = "登陆时的密码(账号密码登陆必填)",required=true) + private String password; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/OrderItemParam.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/OrderItemParam.java new file mode 100644 index 0000000..444c51e --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/OrderItemParam.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.param; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value= "购物车物品参数") +public class OrderItemParam { + + @NotNull(message = "产品ID不能为空") + @ApiModelProperty(value = "产品ID",required=true) + private Long prodId; + + @NotNull(message = "skuId不能为空") + @ApiModelProperty(value = "skuId",required=true) + private Long skuId; + + @NotNull(message = "产品数量不能为空") + @Min(value = 1,message = "产品数量不能为空") + @ApiModelProperty(value = "产品数量",required=true) + private Integer prodCount; + + @NotNull(message = "店铺id不能为空") + @ApiModelProperty(value = "店铺id",required=true) + private Long shopId; + + @ApiModelProperty(value = "推广员使用的推销卡号") + private String distributionCardNo; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/OrderParam.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/OrderParam.java new file mode 100644 index 0000000..a97d621 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/OrderParam.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.param; + +import java.util.List; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +import com.yami.shop.bean.enums.OrderEntry; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value= "订单参数") +public class OrderParam { + + + @ApiModelProperty(value = "购物车id 数组") + private List basketIds; + + @ApiModelProperty(value = "立即购买时提交的商品项") + private OrderItemParam orderItem; + + @ApiModelProperty(value = "地址ID,0为默认地址",required=true) + @NotNull(message = "地址不能为空") + private Long addrId; + + @ApiModelProperty(value = "用户是否改变了优惠券的选择,如果用户改变了优惠券的选择,则完全根据传入参数进行优惠券的选择") + private Integer userChangeCoupon; + + @ApiModelProperty(value = "优惠券id数组") + private List couponIds; + +// @ApiModelProperty(value = "每次订单提交时的uuid") +// private String uuid; +// @ApiModelProperty(value = "订单入口 SHOP_CART购物车,BUY_NOW立即购买") +// private OrderEntry orderEntry; + + + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/OrderRefundExpressParam.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/OrderRefundExpressParam.java new file mode 100644 index 0000000..b784d77 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/OrderRefundExpressParam.java @@ -0,0 +1,24 @@ +package com.yami.shop.bean.app.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; + +@Data +public class OrderRefundExpressParam { + + @ApiModelProperty(value = "退款编号名称", required = true) + @NotEmpty(message = "退款编号不能为空") + private String refundSn; + + @ApiModelProperty(value = "物流公司名称", required = true) + @NotEmpty(message = "物流公司名称不能为空") + private String expressName; + + @ApiModelProperty(value = "物流单号", required = true) + @NotEmpty(message = "物流单号不能为空") + private String expressNo; + + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/OrderRefundParam.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/OrderRefundParam.java new file mode 100644 index 0000000..4515042 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/OrderRefundParam.java @@ -0,0 +1,39 @@ +package com.yami.shop.bean.app.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@Data +public class OrderRefundParam { + + @ApiModelProperty(value = "订单编号", required = true) + @NotEmpty(message = "订单编号不能为空") + private String orderNumber; + + @ApiModelProperty(value = "申请类型(1:仅退款 2退款退货)", required = true) + @NotNull(message = "申请类型不能为空") + private Integer applyType; + +// @ApiModelProperty(value = "订单金额", required = true) +// @NotNull(message = "订单金额不能为空") +// private Double orderAmount; + + @ApiModelProperty(value = "订单项id(全部退款是0)", required = true) + @NotNull(message = "订单项id不能为空") + private Long orderItemId; + +// @ApiModelProperty(value = "退款金额", required = true) +// @NotNull(message = "退款金额不能为空") +// private BigDecimal refundAmount; + + @ApiModelProperty(value = "凭证图片列表", required = true) + private String photoFiles; + + @ApiModelProperty(value = "申请原因", required = true) + @NotEmpty(message = "订单编号不能为空") + private String buyerMsg; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/OrderShopParam.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/OrderShopParam.java new file mode 100644 index 0000000..f68b5c4 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/OrderShopParam.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.param; + +import io.swagger.annotations.ApiModelProperty; + +public class OrderShopParam { + + /** 店铺ID **/ + @ApiModelProperty(value = "店铺id",required=true) + private Long shopId; + + /** + * 订单备注信息 + */ + @ApiModelProperty(value = "订单备注信息",required=true) + private String remarks; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/PayParam.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/PayParam.java new file mode 100644 index 0000000..5c21c2c --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/PayParam.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.param; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +@ApiModel(value= "支付参数") +public class PayParam { + + /** + * 订单号 + */ + @NotBlank(message="订单号不能为空") + @ApiModelProperty(value = "订单号",required=true) + private String orderNumbers; + + /** + * 支付方式 + */ + @NotNull(message="支付方式不能为空") + @ApiModelProperty(value = "支付方式 (1:微信支付 2:支付宝)",required=true) + private Integer payType; + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public String getOrderNumbers() { + return orderNumbers; + } + + public void setOrderNumbers(String orderNumbers) { + this.orderNumbers = orderNumbers; + } + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/ProdCommParam.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/ProdCommParam.java new file mode 100644 index 0000000..8c48765 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/ProdCommParam.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.param; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.yami.shop.common.serializer.json.ImgJsonSerializer; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +@Data +@ApiModel(value= "添加评论信息") +public class ProdCommParam { + /** + * 商品ID + */ + @ApiModelProperty(value = "商品id") + private Long prodId; + /** + * 订单项ID + */ + @ApiModelProperty(value = "订单项ID") + private Long orderItemId; + + /** + * 评价,0-5分 + */ + @ApiModelProperty(value = "评价,0-5分",required=true) + @NotNull(message = "评价不能为空") + private Integer score; + + @ApiModelProperty(value = "评论内容",required=true) + private String content; + + @ApiModelProperty(value = "评论图片, 用逗号分隔") + private String pics; + + /** + * 是否匿名(1:是 0:否) + */ + @ApiModelProperty(value = "是否匿名(1:是 0:否) 默认为否") + private Integer isAnonymous; + + + @ApiModelProperty(value = "* 评价(0好评 1中评 2差评)") + private Integer evaluate; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/SendSmsParam.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/SendSmsParam.java new file mode 100644 index 0000000..4038c10 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/SendSmsParam.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.param; + +import javax.validation.constraints.Pattern; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +@ApiModel(value= "发送验证码参数") +public class SendSmsParam { + + @ApiModelProperty(value = "手机号") + @Pattern(regexp="1[0-9]{10}",message = "请输入正确的手机号") + private String mobile; + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/ShopCartParam.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/ShopCartParam.java new file mode 100644 index 0000000..cafc53a --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/ShopCartParam.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.param; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel(value= "购物车参数") +@Data +public class ShopCartParam { + + @ApiModelProperty(value = "购物项id") + private Long basketId; + + @ApiModelProperty(value = "活动id,传0则不参与该活动") + private Long discountId; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/ShopCartParams.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/ShopCartParams.java new file mode 100644 index 0000000..fe1b2d6 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/ShopCartParams.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.param; + +import lombok.Data; + +import java.util.List; + +@Data +public class ShopCartParams { + List shopCartParams; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/SubmitOrderParam.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/SubmitOrderParam.java new file mode 100644 index 0000000..62cd2eb --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/SubmitOrderParam.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.param; + +import java.util.List; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value= "提交订单参数") +public class SubmitOrderParam { + @ApiModelProperty(value = "每个店铺提交的订单信息",required=true) + private List orderShopParam; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/UserInfoParam.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/UserInfoParam.java new file mode 100644 index 0000000..ae57a05 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/UserInfoParam.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.app.param; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value= "设置用户信息") +public class UserInfoParam { + + @ApiModelProperty(value = "用户昵称") + private String nickName; + + @ApiModelProperty(value = "用户头像") + private String avatarUrl; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/bo/SmsInfoBo.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/bo/SmsInfoBo.java new file mode 100644 index 0000000..a071d40 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/bo/SmsInfoBo.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.bo; + +import java.util.Map; + +import com.yami.shop.bean.enums.SmsType; + +public class SmsInfoBo { + + private SmsType smsType; + + private String userId; + + private String mobile; + + private Map params; + + + + + public SmsInfoBo(SmsType smsType, String userId, String mobile, Map params) { + this.smsType = smsType; + this.userId = userId; + this.mobile = mobile; + this.params = params; + } + + public SmsType getSmsType() { + return smsType; + } + + public void setSmsType(SmsType smsType) { + this.smsType = smsType; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Map getParams() { + return params; + } + + public void setParams(Map params) { + this.params = params; + } +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/distribution/UserShoppingDataDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/distribution/UserShoppingDataDto.java new file mode 100644 index 0000000..4372626 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/distribution/UserShoppingDataDto.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.distribution; + +import lombok.Data; + + +/** + * 用户购物数据 + */ +@Data +public class UserShoppingDataDto { + + /** + * 用户消费笔数 + */ + private Double expenseNumber; + + /** + * 用户消费金额 + */ + private Double sumOfConsumption; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/dto/HotSearchDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/dto/HotSearchDto.java new file mode 100644 index 0000000..1ef8b9b --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/dto/HotSearchDto.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.dto; + + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@ApiModel("热搜数据") +@Data +public class HotSearchDto implements Serializable { + + @ApiModelProperty("热搜id") + private Long hotSearchId; + + @ApiModelProperty("标题") + private String title; + + @ApiModelProperty("内容") + private String content; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/dto/ProductDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/dto/ProductDto.java new file mode 100644 index 0000000..8af87dd --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/dto/ProductDto.java @@ -0,0 +1,187 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.dto; + +import com.yami.shop.bean.model.Sku; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +@Data +public class ProductDto { + /** + * 商品ID + */ + private Long prodId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 店铺名称 + */ + private String shopName; + + /** + * 版本号 + */ + private Integer version; + + /** + * 商品名称 + */ + private String prodName; + + /** + * 原价 + */ + private Double oriPrice; + + /** + * 现价 + */ + private Double price; + + /** + * 简要描述,卖点等 + */ + private String brief; + + /** + * 商品主图 + */ + private String pic; + + /** + * 商品图片 + */ + private String imgs; + + + /** + * 默认是1,表示正常状态 + */ + private Integer status; + + /** + * 商品分类 + */ + private Long categoryId; + + /** + * 观看人数 + */ + private Integer views; + + /** + * 已经销售数量 + */ + private Integer buys; + + /** + * 评论数 + */ + private Integer comments; + + /** + * 评论得分 + */ + private Integer commentScore; + + /** + * 库存量 + */ + private Integer stocks; + + /** + * 实际库存 + */ + private Integer actualStocks; + + /** + * 库存警告 + */ + private Integer stocksArm; + + /** + * 关键字 + */ + private String keyWord; + + /** + * 是否包含用户自提 + */ + private Integer hasUserPickUp; + + /** + * 是否包含商家配送 + */ + private Integer hasShopDelivery; + + /** + * 运费模板id + */ + private Long transportId; + + /** + * 有没发票 + */ + private Integer hasInvoice; + + /** + * 是否保修 + */ + private Integer hasGuarantee; + + /** + * 商品SEOTitle + */ + private String metaTitle; + + /** + * 商品SEO desc + */ + private String metaDesc; + + /** + * 商品SEO keywords + */ + private String metaKeywords; + + /** + * 录入时间 + */ + private Date recTime; + + /** + * 修改时间 + */ + private Date modifyTime; + + /** + * 详细描述 + */ + private String content; + + /** + * sku列表 + */ + private List skuList; + + /** + * 商品分类名称 + */ + private String categoryName; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/dto/SearchProdDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/dto/SearchProdDto.java new file mode 100644 index 0000000..b2adece --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/dto/SearchProdDto.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.yami.shop.common.serializer.json.ImgJsonSerializer; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +@Data +@ApiModel("搜索商品数据") +public class SearchProdDto { + + @ApiModelProperty(value = "商品id") + private Long prodId; + + @ApiModelProperty(value = "商品照片") + @JsonSerialize(using = ImgJsonSerializer.class) + private String pic; + + @ApiModelProperty(value = "商品名字") + private String prodName; + + @ApiModelProperty(value = "商品价格") + private Double price; + + @ApiModelProperty(value = "商品评论数量") + private Integer prodCommNumber; + + @ApiModelProperty(value = "好评率") + private Double positiveRating; + + @ApiModelProperty(value = "好评数量") + private Integer praiseNumber; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/dto/TinymceEditorDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/dto/TinymceEditorDto.java new file mode 100644 index 0000000..4d8c8c5 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/dto/TinymceEditorDto.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.dto; + +/** + * 富文本编辑器 图片上传返回数据 + * @author lgh + */ +public class TinymceEditorDto { + + private Boolean error = false; + + private String path; + + public Boolean getError() { + return error; + } + + public void setError(Boolean error) { + this.error = error; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/CouponProdType.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/CouponProdType.java new file mode 100644 index 0000000..3e666da --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/CouponProdType.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.enums; + + +/** + * 优惠券适用商品类型 + * @author LGH + */ +public enum CouponProdType { + + /** + * 0全部商品参与 + */ + ALL(0), + + /** + * 1指定商品参与 + */ + PROD_IN(1), + + /** + * 2指定商品不参与 + */ + PROD_NO_IN(2) + ; + + private Integer num; + + public Integer value() { + return num; + } + + CouponProdType(Integer num){ + this.num = num; + } + + public static CouponProdType instance(Integer value) { + CouponProdType[] enums = values(); + for (CouponProdType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/CouponType.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/CouponType.java new file mode 100644 index 0000000..7f947c3 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/CouponType.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.enums; + + +/** + * 优惠券类型 1:代金券 2:折扣券 3:兑换券 + * @author LGH + */ +public enum CouponType { + + /** + * 代金券 + */ + C2M(1), + + /** + * 折扣券 + */ + C2D(2), + + /** + * 兑换券 + */ + C2P(3) + ; + + private Integer num; + + public Integer value() { + return num; + } + + CouponType(Integer num){ + this.num = num; + } + + public static CouponType instance(Integer value) { + CouponType[] enums = values(); + for (CouponType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/DiscountRule.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/DiscountRule.java new file mode 100644 index 0000000..b91b60d --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/DiscountRule.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.enums; + +/** + * 满减规则 + * + */ +public enum DiscountRule { + + /** + * 满钱减钱 + * M money + */ + M2M(0), + /** + * 满件减钱 + * P piece + */ + P2M(1), + /** + * 满钱打折 + * Discount + */ + M2D(2), + /** + * 满件打折 + * Discount + */ + P2D(3) + ; + + private Integer num; + + public Integer value() { + return num; + } + + DiscountRule(Integer num){ + this.num = num; + } + + public static DiscountRule instance(Integer value) { + DiscountRule[] enums = values(); + for (DiscountRule statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/DiscountType.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/DiscountType.java new file mode 100644 index 0000000..a55954f --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/DiscountType.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.enums; + +/** + * 满减规则 + * + */ +public enum DiscountType { + + /** + * 按满足最高层级减一次 + * M money + */ + MAX(0), + + /** + * 每满一次减一次 + */ + TRIGGER(1) + ; + + private Integer num; + + public Integer value() { + return num; + } + + DiscountType(Integer num){ + this.num = num; + } + + public static DiscountType instance(Integer value) { + DiscountType[] enums = values(); + for (DiscountType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/DistributionUserLinkContent.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/DistributionUserLinkContent.java new file mode 100644 index 0000000..339c97b --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/DistributionUserLinkContent.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.enums; + +/** + * 邀请码内容 + */ +public enum DistributionUserLinkContent { + + + +} + diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/MessageStatus.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/MessageStatus.java new file mode 100644 index 0000000..37113b3 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/MessageStatus.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.enums; + +public enum MessageStatus { + + /** + * 小程序 + */ + CANCEL(0), + RELEASE(1); + + private Integer num; + + public Integer value() { + return num; + } + + MessageStatus(Integer num){ + this.num = num; + } +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/OrderEntry.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/OrderEntry.java new file mode 100644 index 0000000..6b0fb71 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/OrderEntry.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.enums; + +/** + * 订单入口 + * @author LGH + */ +public enum OrderEntry { + + /** + * 立即购买 + */ + BUY_NOW, + + /** + * 购物车 + */ + SHOP_CART +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/OrderStatus.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/OrderStatus.java new file mode 100644 index 0000000..b9ecccf --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/OrderStatus.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.enums; + +public enum OrderStatus { + + /** + * 没有付款.待付款 + */ + UNPAY(1), + + /** + * 已经付款,但卖家没有发货.待发货 + */ + PADYED(2), + + /** + * 发货,导致实际库存减少,没有确认收货.待收货 + */ + CONSIGNMENT(3), + + /** + * 收货,没有评价.待评价 + */ + CONFIRM(4), + + /** + * 评价后交易成功,购买数增加1. + */ + SUCCESS(5), + + /** + * 交易失败.,还原库存 + */ + CLOSE(6); + + private Integer num; + + public Integer value() { + return num; + } + + OrderStatus(Integer num) { + this.num = num; + } + + public static OrderStatus instance(Integer value) { + OrderStatus[] enums = values(); + for (OrderStatus statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/PayType.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/PayType.java new file mode 100644 index 0000000..92d8637 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/PayType.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.enums; + +public enum PayType { + + /** 微信支付*/ + WECHATPAY(1,"微信支付"), + + /** "支付宝*/ + ALIPAY(2,"支付宝"); + + private Integer num; + + private String payTypeName; + + public Integer value() { + return num; + } + + public String getPayTypeName() { + return payTypeName; + } + + PayType(Integer num,String payTypeName){ + this.num = num; + this.payTypeName = payTypeName; + } + + public static PayType instance(Integer value) { + PayType[] enums = values(); + for (PayType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/ProdPropRule.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/ProdPropRule.java new file mode 100644 index 0000000..21a96de --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/ProdPropRule.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.enums; + +/** + * 商品规格参数、属性类型 + * @author lgh + */ +public enum ProdPropRule { + + // 规格属性 (用于商品商品发布时,关联sku) + SPEC(1), + + // 规格参数(用于商品搜索时,与分类关联搜索) + ATTRIBUTE(2); + + private Integer num; + + public Integer value() { + return num; + } + + ProdPropRule(Integer num){ + this.num = num; + } + + public static ProdPropRule instance(Integer value) { + ProdPropRule[] enums = values(); + for (ProdPropRule statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/SmsType.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/SmsType.java new file mode 100644 index 0000000..4df0c12 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/SmsType.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.enums; + +public enum SmsType { + + /** + *发送验证码 + */ + VALID(0,"SMS_152288010","感谢您对xxx的支持。您的验证码是${code},请勿把验证码泄漏给第三方。"), + + /** + * 商品库存不足通知 + */ + STOCKS_ARM(1,"SMS_152288054","尊敬的${name},感谢您对xxx的支持。您的${prodName}库存仅剩${num},为免影响您的客户下单,请及时补货!"), + + /** + * 行业客户审核通过通知 + */ + DISTRIBUTOR_PASS_AUDIT(2,"SMS_152283207","尊敬的${name},感谢您对xxx的支持。您提交的资料已审核通过!祝您购物愉快!"), + + /** + * 分销商订单购买成功通知 + */ + DISTRIBUTOR_BUY_SUCCESS(3,"SMS_152283148","尊敬的${name},感谢您对xxx的支持。您的订单${orderNumber}已确认成功,我们会尽快发货!"), + + /** + * 用户发货通知 + */ + NOTIFY_DVY(4,"SMS_152283152","尊敬的${name},感谢您对xxx的支持。您的订单${orderNumber}已通过${dvyName}发货,快递单号是:${dvyFlowId}。请注意查收。"), + + /** + * 代理商审核通知 + */ + AGENT_PASS_AUDIT(5,"SMS_152288028","尊敬的${name},感谢您对xxx的支持。您提交的代理商申请已审核通过!请重新登陆获取新的会员信息。"), + + /** + * 代理商商品被购买通知 + */ + NOTIFY_BUY(6,"SMS_152288372","尊敬的${name},感谢您对xxx的支持。与您有关联的订单${orderNumber}已生成,客户${buyerName},提货${prodName},数量${buyNum},剩余库存为${stockNum}。"), + + /** + * 代理商新增分销商通知 + */ + ADD_DISTRIBUTOR(7,"SMS_152283192","尊敬的${name},感谢您对xxx的支持。您有新增绑定客户资料生成:客户${userName},联系方式${mobilePhone},联系地址${addr},合计共有客户${number}名。"), + + /** + * 代理商解除与分销商合作通知 + */ + UNBINDING(8,"SMS_152283198","尊敬的${name},感谢您对xxx的支持。您已成功解除与此客户的绑定关系:客户${userName},联系方式${mobilePhone},联系地址${addr},现合计共有客户${number}名。"), + + /** + * 代理商补货订单模板 + */ + AGENT_BUY_SUCCESS(9,"SMS_152288475","尊敬的${name},感谢您对xxx的支持。您的补货订单${orderNumber}已完成入库,${prodName}剩余库存为${stockNum}。"), + + /** + * 普通用户下单成功通知 + */ + USER_BUY_SUCCESS(10,"SMS_152288329","亲爱的客户,感谢您对xxx的支持。您的订单${orderNumber}已支付成功。我们会尽快发货!") + + ; + + private Integer num; + + private String templateCode; + + private String content; + public Integer value() { + return num; + } + + SmsType(Integer num,String templateCode,String content){ + this.num = num; + this.templateCode = templateCode; + this.content = content; + } + + public static SmsType instance(Integer value) { + SmsType[] enums = values(); + for (SmsType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + public String getTemplateCode() { + return this.templateCode; + } + + public String getContent() { + return this.content; + } +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/TransportChargeType.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/TransportChargeType.java new file mode 100644 index 0000000..3435821 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/enums/TransportChargeType.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.enums; + + +/** + * 运费收费方式 (0 按件数,1 按重量 2 按体积) + * @author LGH + */ +public enum TransportChargeType { + + /** + * 0全部商品参与 + */ + COUNT(0), + + /** + * 1指定商品参与 + */ + WEIGHT(1), + + /** + * 2指定商品不参与 + */ + VOLUME(2) + ; + + private Integer num; + + public Integer value() { + return num; + } + + TransportChargeType(Integer num){ + this.num = num; + } + + public static TransportChargeType instance(Integer value) { + TransportChargeType[] enums = values(); + for (TransportChargeType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/event/CancelOrderEvent.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/event/CancelOrderEvent.java new file mode 100644 index 0000000..573b807 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/event/CancelOrderEvent.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.event; + +import com.yami.shop.bean.model.Order; +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * 取消订单的事件 + * @author + */ +@Data +@AllArgsConstructor +public class CancelOrderEvent { + + private Order order; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/event/ConfirmOrderEvent.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/event/ConfirmOrderEvent.java new file mode 100644 index 0000000..68c564a --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/event/ConfirmOrderEvent.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.event; + +import com.yami.shop.bean.app.dto.ShopCartDto; +import com.yami.shop.bean.app.dto.ShopCartItemDto; +import com.yami.shop.bean.app.dto.ShopCartOrderDto; +import com.yami.shop.bean.app.dto.ShopCartOrderMergerDto; +import com.yami.shop.bean.app.param.OrderParam; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.List; + +/** + * 确认订单时的事件 + * @author LGH + */ +@Data +@AllArgsConstructor +public class ConfirmOrderEvent { + + /** + * 购物车已经组装好的店铺订单信息 + */ + private ShopCartOrderDto shopCartOrderDto; + + /** + * 下单请求的参数 + */ + private OrderParam orderParam; + + /** + * 店铺中的所有商品项 + */ + private List shopCartItems; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/event/PaySuccessOrderEvent.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/event/PaySuccessOrderEvent.java new file mode 100644 index 0000000..aaa8c8b --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/event/PaySuccessOrderEvent.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.event; + +import com.yami.shop.bean.model.Order; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.List; + +/** + * 订单付款成功的事件 + * @author + */ +@Data +@AllArgsConstructor +public class PaySuccessOrderEvent { + + private List orders; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/event/ReceiptOrderEvent.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/event/ReceiptOrderEvent.java new file mode 100644 index 0000000..ce80b0c --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/event/ReceiptOrderEvent.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.event; + +import com.yami.shop.bean.model.Order; +import lombok.AllArgsConstructor; +import lombok.Data; + + +/** + * 确认收货的事件 + * @author + */ +@Data +@AllArgsConstructor +public class ReceiptOrderEvent { + + private Order order; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/event/ShopCartEvent.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/event/ShopCartEvent.java new file mode 100644 index 0000000..742a54d --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/event/ShopCartEvent.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.event; + +import com.yami.shop.bean.app.dto.ShopCartDto; +import com.yami.shop.bean.app.dto.ShopCartItemDto; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.List; + +/** + * 购物车商品发生改变时的事件 + * @author LGH + */ +@Data +@AllArgsConstructor +public class ShopCartEvent { + + /** + * 将要组装的单个店铺的店铺信息 + */ + private ShopCartDto shopCartDto; + + /** + * 该店铺下的所有商品信息 + */ + private List shopCartItemDtoList; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/event/SubmitOrderEvent.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/event/SubmitOrderEvent.java new file mode 100644 index 0000000..bf72c9e --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/event/SubmitOrderEvent.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.event; + +import com.yami.shop.bean.app.dto.ShopCartItemDto; +import com.yami.shop.bean.app.dto.ShopCartOrderDto; +import com.yami.shop.bean.app.dto.ShopCartOrderMergerDto; +import com.yami.shop.bean.app.param.OrderParam; +import com.yami.shop.bean.model.Order; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.List; + +/** + * 提交订单时的事件 + * @author LGH + */ +@Data +@AllArgsConstructor +public class SubmitOrderEvent { + /** + * 完整的订单信息 + */ + private final ShopCartOrderMergerDto mergerOrder; + + private List orders; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Area.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Area.java new file mode 100644 index 0000000..8780187 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Area.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.io.Serializable; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.*; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@TableName("tz_area") +public class Area implements Serializable { + private static final long serialVersionUID = -6013320537436191451L; + @TableId + @ApiModelProperty(value = "地区id",required=true) + private Long areaId; + + @ApiModelProperty(value = "地区名称",required=true) + private String areaName; + + @ApiModelProperty(value = "地区上级id",required=true) + private Long parentId; + + @ApiModelProperty(value = "地区层级",required=true) + private Integer level; + + @TableField(exist=false) + private List areas; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/AttachFile.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/AttachFile.java new file mode 100644 index 0000000..7912cfe --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/AttachFile.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +@Data +@TableName("tz_attach_file") +public class AttachFile implements Serializable { + @TableId + + private Long fileId; + + /** + * 文件路径 + */ + + private String filePath; + + /** + * 文件类型 + */ + + private String fileType; + + /** + * 文件大小 + */ + + private Integer fileSize; + + /** + * 上传时间 + */ + + private Date uploadTime; + + /** + * 文件关联的表主键id + */ + + private Long fileJoinId; + + /** + * 文件关联表类型:1 商品表 @see FileJoinType + */ + + private Integer fileJoinType; +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Basket.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Basket.java new file mode 100644 index 0000000..a7c0ee3 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Basket.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +@Data +@TableName("tz_basket") +public class Basket implements Serializable { + /** + * 主键 + */ + @TableId + + private Long basketId; + + /** + * 店铺ID + */ + + private Long shopId; + + /** + * 产品ID + */ + + private Long prodId; + + /** + * SkuID + */ + + private Long skuId; + + /** + * 用户ID + */ + + private String userId; + + /** + * 购物车产品个数 + */ + + private Integer basketCount; + + /** + * 购物时间 + */ + + private Date basketDate; + + /** + * 满减活动ID + */ + private Long discountId; + + /** + * 分销推广人卡号 + */ + private String distributionCardNo; +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Brand.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Brand.java new file mode 100644 index 0000000..61d03bd --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Brand.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +@Data +@TableName("tz_brand") +public class Brand implements Serializable { + /** + * 主键 + */ + @TableId + + private Long brandId; + + /** + * 品牌名称 + */ + + private String brandName; + + /** + * 图片路径 + */ + + private String brandPic; + + /** + * 用户ID + */ + + private String userId; + + /** + * 备注 + */ + private String memo; + + /** + * 顺序 + */ + private Integer seq; + + /** + * 默认是1,表示正常状态,0为下线状态 + */ + private Integer status; + + /** + * 简要描述 + */ + private String brief; + + /** + * 记录时间 + */ + + private Date recTime; + + /** + * 更新时间 + */ + + private Date updateTime; + + /** + * 品牌首字母 + */ + + private String firstChar; + + /** + * 内容 + */ + private String content; +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Category.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Category.java new file mode 100644 index 0000000..b6b2317 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Category.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +@TableName("tz_category") +public class Category implements Serializable { + + /** + * 类目ID + * + */ + @TableId + + private Long categoryId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 父节点 + */ + private Long parentId = 0L; + + /** + * 产品类目名称 + */ + private String categoryName; + + /** + * 类目图标 + */ + private String icon; + + /** + * 类目的显示图片 + */ + private String pic; + + /** + * 排序 + */ + private Integer seq; + + /** + * 默认是1,表示正常状态,0为下线状态 + */ + private Integer status; + + /** + * 记录时间 + */ + private Date recTime; + + /** + * 分类层级 + */ + private Integer grade; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 品牌id + */ + @TableField(exist=false) + private List brandIds; + + /** + * 参数id + */ + @TableField(exist=false) + private List attributeIds; + + /** + * 品牌列表 + */ + @TableField(exist=false) + private List brands; + + /** + * 参数列表 + */ + @TableField(exist=false) + private List prodProps; + + /** + * 商品列表 + */ + @TableField(exist=false) + private List products; + + @TableField(exist=false) + private List categories; +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/CategoryBrand.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/CategoryBrand.java new file mode 100644 index 0000000..57b2192 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/CategoryBrand.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.io.Serializable; + +@Data +@TableName("tz_category_brand") +public class CategoryBrand implements Serializable { + @TableId + + private Long id; + + /** + * 分类id + */ + + private Long categoryId; + + /** + * 品牌id + */ + + private Long brandId; +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/CategoryProp.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/CategoryProp.java new file mode 100644 index 0000000..eee57ab --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/CategoryProp.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.io.Serializable; + +@Data +@TableName("tz_category_prop") +public class CategoryProp implements Serializable { + @TableId + + private Long id; + + /** + * 分类id + */ + + private Long categoryId; + + /** + * 商品属性id即表tz_prod_prop中的prop_id + */ + + private Long propId; +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Delivery.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Delivery.java new file mode 100644 index 0000000..3652442 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Delivery.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +@Data +@TableName("tz_delivery") +public class Delivery implements Serializable { + /** + * ID + */ + @TableId + + private Long dvyId; + + /** + * 物流公司名称 + */ + + private String dvyName; + + /** + * 公司主页 + */ + + private String companyHomeUrl; + + /** + * 建立时间 + */ + + private Date recTime; + + /** + * 修改时间 + */ + + private Date modifyTime; + + /** + * 物流查询接口 + */ + + private String queryUrl; +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/HotSearch.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/HotSearch.java new file mode 100644 index 0000000..3928a8c --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/HotSearch.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.*; + +@Data +@TableName("tz_hot_search") +public class HotSearch implements Serializable { + /** + * 主键 + */ + @TableId + private Long hotSearchId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 标题 + */ + private String title; + + /** + * 内容 + */ + private String content; + + /** + * 录入时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date recDate; + + /** + * 顺序 + */ + private Integer seq; + + /** + * 状态 默认是1,0为下线 + */ + private Integer status; + +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/IndexImg.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/IndexImg.java new file mode 100644 index 0000000..2847efb --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/IndexImg.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.yami.shop.common.serializer.json.ImgJsonSerializer; +import lombok.Data; + +@Data +@TableName("tz_index_img") +public class IndexImg implements Serializable { + private static final long serialVersionUID = -3468251351681518798L; + /** + * 主键 + */ + @TableId + + private Long imgId; + + /** + * 店铺ID + */ + + private Long shopId; + + /** + * 图片 + */ + private String imgUrl; + + /** + * 说明文字,描述 + */ + private String des; + + /** + * 标题 + */ + private String title; + + /** + * 链接 + */ + private String link; + + /** + * 状态 + */ + private Integer status; + + /** + * 顺序 + */ + private Integer seq; + + /** + * 上传时间 + */ + private Date uploadTime; + + /** + * 类型 + */ + private int type; + + /** + * 关联id + */ + private Long relation; + + /** + * 商品图片 + */ + @TableField(exist = false) + @JsonSerialize(using = ImgJsonSerializer.class) + private String pic; + + /** + * 商品名称 + */ + @TableField(exist = false) + private String prodName; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/LoginHist.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/LoginHist.java new file mode 100644 index 0000000..1083185 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/LoginHist.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +@Data +@TableName("tz_login_hist") +public class LoginHist implements Serializable { + /** + * ID + */ + @TableId + + private Long id; + + /** + * 地区 + */ + private String area; + + /** + * 国家 + */ + private String country; + + /** + * 用户id + */ + + private String userId; + + /** + * IP + */ + private String ip; + + /** + * 时间 + */ + + private Date loginTime; + +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Message.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Message.java new file mode 100644 index 0000000..e436233 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Message.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.*; + +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; + +@Data +@TableName("tz_message") +public class Message implements Serializable { + @TableId + private Long id; + + /** + * 留言创建时间 + */ + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 姓名 + */ + private String userName; + + /** + * 邮箱 + */ + private String email; + + /** + * 联系方式 + */ + private String contact; + + /** + * 状态:0:未审核 1审核通过 + */ + private Integer status; + + /** + * 留言内容 + */ + private String content; + + /** + * 留言回复 + */ + private String reply; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Notice.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Notice.java new file mode 100644 index 0000000..b4026e9 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Notice.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * 公告管理 + * + * @author hzm + * @date 2019-04-18 21:21:40 + */ +@Data +@TableName("tz_notice") +public class Notice implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 公告id + */ + @TableId + private Long id; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 公告标题 + */ + private String title; + + /** + * 公告内容 + */ + private String content; + + /** + * 状态(1:公布 0:撤回) + */ + private Integer status; + + /** + * 是否置顶(1:是 0:否) + */ + private Integer isTop; + + /** + * 发布时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date publishTime; + + /** + * 更新时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Order.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Order.java new file mode 100644 index 0000000..859dc70 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Order.java @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; + +@Data +@TableName("tz_order") +public class Order implements Serializable { + private static final long serialVersionUID = 6222259729062826852L; + /** + * 订单ID + */ + @TableId + private Long orderId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 产品名称,多个产品将会以逗号隔开 + */ + private String prodName; + + /** + * 订购用户ID + */ + private String userId; + + /** + * 订购流水号 + */ + private String orderNumber; + + /** + * 总值 + */ + private Double total; + + /** + * 实际总值 + */ + private Double actualTotal; + + /** + * 支付方式 1 微信支付 2 支付宝 + */ + private Integer payType; + + /** + * 订单备注 + */ + private String remarks; + + /** + * 订单状态 -1 已取消 0:待付款 1:待发货 2:待收货 3:已完成 + */ + private Integer status; + + /** + * 配送类型 + */ + + private String dvyType; + + /** + * 配送方式ID + */ + + private Long dvyId; + + /** + * 物流单号 + */ + + private String dvyFlowId; + + /** + * 订单运费 + */ + + private Double freightAmount; + + /** + * 用户订单地址Id + */ + + private Long addrOrderId; + + /** + * 订单商品总数 + */ + + private Integer productNums; + + /** + * 订购时间 + */ + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 订单更新时间 + */ + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** + * 付款时间 + */ + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date payTime; + + /** + * 发货时间 + */ + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date dvyTime; + + /** + * 完成时间 + */ + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date finallyTime; + + /** + * 取消时间 + */ + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date cancelTime; + + /** + * 是否已经支付,1:已经支付过,0:,没有支付过 + */ + private Integer isPayed; + + /** + * 用户订单删除状态,0:没有删除, 1:回收站, 2:永久删除 + */ + private Integer deleteStatus; + + /** + * 0:默认,1:在处理,2:处理完成 + */ + private Integer refundSts; + + /** + * 优惠总额 + */ + private Double reduceAmount; + + /** + * 店铺名称 + */ + @TableField(exist = false) + private String shopName; + + @TableField(exist = false) + private List orderItems; + + /** + * 用户订单地址 + */ + @TableField(exist = false) + private UserAddrOrder userAddrOrder; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/OrderItem.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/OrderItem.java new file mode 100644 index 0000000..0f152f7 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/OrderItem.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +@TableName("tz_order_item") +public class OrderItem implements Serializable { + + private static final long serialVersionUID = 7307405761190788407L; + /** + * 订单项ID + */ + @TableId(type = IdType.AUTO) + private Long orderItemId; + + + private Long shopId; + + /** + * 订单sub_number + */ + + private String orderNumber; + + /** + * 产品ID + */ + + private Long prodId; + + /** + * 产品SkuID + */ + + private Long skuId; + + /** + * 购物车产品个数 + */ + + private Integer prodCount; + + /** + * 产品名称 + */ + + private String prodName; + + /** + * sku名称 + */ + private String skuName; + + /** + * 产品主图片路径 + */ + private String pic; + + /** + * 产品价格 + */ + private Double price; + + /** + * 用户Id + */ + + private String userId; + + /** + * 商品总金额 + */ + private Double productTotalAmount; + + /** + * 购物时间 + */ + + private Date recTime; + + /** + * 评论状态: 0 未评价 1 已评价 + */ + + private Integer commSts; + + /** + * 推广员使用的推销卡号 + */ + private String distributionCardNo; + + /** + * 加入购物车的时间 + */ + private Date basketDate; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/OrderRefund.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/OrderRefund.java new file mode 100644 index 0000000..150e5f0 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/OrderRefund.java @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +@Data +@TableName("tz_order_refund") +public class OrderRefund implements Serializable { + /** + * 记录ID + */ + @TableId + private Long refundId; + + /** + * shopId + */ + private Long shopId; + + /** + * 订单ID + */ + private Long orderId; + + /** + * 订单流水号 + */ + + private String orderNumber; + + /** + * 订单总金额 + */ + + private Double orderAmount; + + /** + * 订单项ID 全部退款是0 + */ + + private Long orderItemId; + + /** + * 退款编号 + */ + + private String refundSn; + + /** + * 订单支付流水号 + */ + + private String flowTradeNo; + + /** + * 第三方退款单号(微信退款单号) + */ + + private String outRefundNo; + + /** + * 订单支付方式 1 微信支付 2 支付宝 + */ + + private Integer payType; + + /** + * 订单支付名称 + */ + + private String payTypeName; + + /** + * 买家ID + */ + + private String userId; + + /** + * 退货数量 + */ + + private Integer goodsNum; + + /** + * 退款金额 + */ + + private Double refundAmount; + + /** + * 申请类型:1,仅退款,2退款退货 + */ + + private Integer applyType; + + /** + * 处理状态:1为待审核,2为同意,3为不同意 + */ + + private Integer refundSts; + + /** + * 处理退款状态: 0:退款处理中 1:退款成功 -1:退款失败 + */ + + private Integer returnMoneySts; + + /** + * 申请时间 + */ + + private Date applyTime; + + /** + * 卖家处理时间 + */ + + private Date handelTime; + + /** + * 退款时间 + */ + + private Date refundTime; + + /** + * 文件凭证json + */ + + private String photoFiles; + + /** + * 申请原因 + */ + + private String buyerMsg; + + /** + * 卖家备注 + */ + + private String sellerMsg; + + /** + * 物流公司名称 + */ + private String expressName; + + /** + * 物流单号 + */ + + private String expressNo; + + /** + * 发货时间 + */ + + private Date shipTime; + + /** + * 收货时间 + */ + + private Date receiveTime; + + /** + * 收货备注 + */ + + private String receiveMessage; + + /** + * 拒绝原因 + */ + private String rejectMessage; + + /** + * 订单列表 + */ + @TableField(exist = false) + private List orderItems; +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/OrderSettlement.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/OrderSettlement.java new file mode 100644 index 0000000..3e067b2 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/OrderSettlement.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +@Data +@TableName("tz_order_settlement") +public class OrderSettlement implements Serializable { + /** + * 支付结算单据ID + */ + @TableId + + private Long settlementId; + + /** + * 用户系统内部的订单号 + */ + private String payNo; + + /** + * 外部订单流水号 + */ + private String bizPayNo; + + /** + * 订单号 + */ + private String orderNumber; + + /** + * 支付方式 0 手动代付 1 微信支付 2 支付宝 + */ + + private Integer payType; + + /** + * 支付金额 + */ + private Double payAmount; + + /** + * 用户ID + */ + + private String userId; + + /** + * 是否清算 0:否 1:是 + */ + + private Integer isClearing; + + /** + * 创建时间 + */ + + private Date createTime; + + /** + * 清算时间 + */ + + private Date clearingTime; + + /** + * 支付状态 + */ + private Integer payStatus; + + /** + * 版本号 + */ + private Integer version; + +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/PickAddr.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/PickAddr.java new file mode 100644 index 0000000..71ca959 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/PickAddr.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.io.Serializable; + +@Data +@TableName("tz_pick_addr") +public class PickAddr implements Serializable { + /** + * ID + */ + @TableId + private Long addrId; + + /** + * 自提点名称 + */ + + private String addrName; + + /** + * 地址 + */ + private String addr; + + /** + * 手机 + */ + private String mobile; + + /** + * 省份ID + */ + private Long provinceId; + + /** + * 省份 + */ + private String province; + + /** + * 城市ID + */ + private Long cityId; + + /** + * 城市 + */ + private String city; + + /** + * 区/县ID + */ + private Long areaId; + + /** + * 区 + */ + private String area; + + /** + * 店铺id + */ + private Long shopId; + +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Points.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Points.java new file mode 100644 index 0000000..0fc37f8 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Points.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yami.shop.bean.vo.SysUserVO; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; +import com.baomidou.mybatisplus.annotation.*; + +@Data +@TableName( "tz_points") +public class Points { + /** + * 积分id + */ + @TableId + + private Long pointsId; + + /** + * 店铺id + */ + + private Long shopId; + + /** + * 积分名称 + */ + private String name; + + /** + * 状态(0 禁用 1启用) + */ + private Integer state; + + /** + * 更新时间 + */ + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** + * 操作人 + */ + private Long modifier; + + /** + * 关联操作人 + */ + @TableField(exist = false) + private SysUserVO sysUser; + +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsChange.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsChange.java new file mode 100644 index 0000000..291925e --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsChange.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.util.Date; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +@Data +@TableName( "tz_points_change") +public class PointsChange { + /** + * 积分流动记录表 + */ + + private Long pointsChangeId; + + /** + * 积分钱包id + */ + + private Long pointsWalletId; + + /** + * 增加或减少(增加 0 减少 1) + */ + + private Integer addOrReduce; + + /** + * 原因(订单,邀请,签到,兑换) + */ + private Integer reason; + + /** + * 积分状态(0:用户未收货待结算,1:已结算 2:用户退货退单) + */ + private Integer state; + + /** + * 积分数额 + */ + + private Double pointsNumber; + + /** + * 关联订单id + */ + + private Long orderId; + + /** + * 商户订单id + */ + + private Long merchantOrderId; + + /** + * 创建时间 + */ + + private Date createTime; + + /** + * 更新时间 + */ + + private Date updateTime; +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsProd.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsProd.java new file mode 100644 index 0000000..a40be58 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsProd.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.util.Date; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + + +@Data +@TableName( "tz_points_prod") +public class PointsProd { + /** + * 积分商品id + */ + + private Long pointsProdId; + + /** + * 所需积分id + */ + + private Long pointsId; + + /** + * 所需积分量 + */ + + private Double pointsNumber; + + /** + * 所需金额 + */ + private Double amount; + + /** + * 关联商品id + */ + + private Long prodId; + + /** + * 库存 + */ + private Integer stocks; + + /** + * 状态(0下架 1上架) + */ + private Integer state; + + /** + * 上架时间 + */ + + private Date upperShelfTime; + + /** + * 下架时间 + */ + + private Date lowerShelf; +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsWallet.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsWallet.java new file mode 100644 index 0000000..8634859 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsWallet.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +@Data +@TableName( "tz_points_wallet") +public class PointsWallet { + /** + * 积分钱包id + */ + + private Long pointsWalletId; + + /** + * 积分Id + */ + + private Long pointsId; + + /** + * 用户id + */ + + private Long userId; + + /** + * 待结算积分 + */ + private Double unsettled; + + /** + * 已结算积分 + */ + private Double settled; + + /** + * 积累收益积分 + */ + private Double addup; + + /** + * 乐观锁 + */ + @Version + private Integer version; +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ProdComm.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ProdComm.java new file mode 100644 index 0000000..096165b --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ProdComm.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.yami.shop.bean.vo.UserVO; +import com.yami.shop.common.serializer.json.ImgJsonSerializer; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 商品评论 + * + * @author xwc + * @date 2019-04-19 10:43:57 + */ +@Data +@TableName("tz_prod_comm") +@EqualsAndHashCode +public class ProdComm implements Serializable{ + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId + private Long prodCommId; + /** + * 商品ID + */ + private Long prodId; + /** + * 订单项ID + */ + private Long orderItemId; + /** + * 评论用户ID + */ + private String userId; + /** + * 评论内容 + */ + private String content; + /** + * 掌柜回复 + */ + private String replyContent; + /** + * 记录时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date recTime; + /** + * 回复时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date replyTime; + /** + * 是否回复 0:未回复 1:已回复 + */ + private Integer replySts; + /** + * IP来源 + */ + private String postip; + /** + * 得分,0-5分 + */ + private Integer score; + /** + * 有用的计数 + */ + private Integer usefulCounts; + /** + * 晒图的字符串 以逗号分隔 + */ + @JsonSerialize(using = ImgJsonSerializer.class) + private String pics; + /** + * 是否匿名(1:是 0:否) + */ + private Integer isAnonymous; + /** + * 是否显示,1:为显示,0:待审核, -1:不通过审核,不显示。 如果需要审核评论,则是0,,否则1 + */ + private Integer status; + + /** + * 评价(0好评 1中评 2差评) + */ + private Integer evaluate; + + /** + * 关联用户 + */ + @TableField(exist = false) + private UserVO user; + + /** + * 商品名称 + */ + @TableField(exist = false) + private String prodName; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ProdImg.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ProdImg.java new file mode 100644 index 0000000..e9fc2e8 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ProdImg.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +@Data +@TableName("tz_prod_img") +public class ProdImg implements Serializable { + /** + * 图片ID + */ + @TableId + + private Long imgId; + + /** + * 产品ID + */ + + private Long prodId; + + /** + * skuID(商品通用图片 skuid为0) + */ + + private Long skuId; + + /** + * 文件路径 + */ + + private String imgPath; + + /** + * 状态 + */ + private Byte status; + + /** + * 顺序 + */ + private Integer seq; + +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ProdProp.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ProdProp.java new file mode 100644 index 0000000..ccd6c56 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ProdProp.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.io.Serializable; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +@Data +@TableName("tz_prod_prop") +public class ProdProp implements Serializable { + private static final long serialVersionUID = -8761177918672000191L; + + /** + * 属性id + */ + @TableId + private Long propId; + + /** + * 属性名称 + */ + + private String propName; + + /** + * 1:销售属性(规格); 2:参数属性; + */ + private Integer rule; + + private Long shopId; + + /** + * 属性值 + */ + @TableField(exist=false) + private List prodPropValues; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ProdPropValue.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ProdPropValue.java new file mode 100644 index 0000000..bef0359 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ProdPropValue.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +@Data +@TableName("tz_prod_prop_value") +public class ProdPropValue implements Serializable{ + /** + * + */ + private static final long serialVersionUID = 6604406039354172708L; + + /** + * 属性值ID + */ + @TableId + + private Long valueId; + + /** + * 属性值名称 + */ + + private String propValue; + + /** + * 属性ID + */ + + private Long propId; + +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ProdTag.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ProdTag.java new file mode 100644 index 0000000..c46a903 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ProdTag.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * 商品分组标签 + * + * @author hzm + * @date 2019-04-18 10:48:44 + */ +@Data +@TableName("tz_prod_tag") +public class ProdTag implements Serializable { + + private static final long serialVersionUID = 1991508792679311621L; + /** + * 分组标签id + */ + @TableId + private Long id; + /** + * 分组标题 + */ + private String title; + /** + * 店铺Id + */ + private Long shopId; + /** + * 状态(1为正常,0为删除) + */ + private Integer status; + /** + * 默认类型(0:商家自定义,1:系统默认类型) + */ + private Integer isDefault; + /** + * 商品数量 + */ + private Long prodCount; + /** + * 排序 + */ + private Integer seq; + /** + * 列表样式(0:一列一个,1:一列两个,2:一列三个) + */ + private Integer style; + /** + * 创建时间 + */ + private Date createTime; + /** + * 修改时间 + */ + private Date updateTime; + /** + * 删除时间 + */ + private Date deleteTime; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ProdTagReference.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ProdTagReference.java new file mode 100644 index 0000000..7e2133c --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ProdTagReference.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; + +/** + * 分组标签引用 + * + * @author hzm + * @date 2019-04-18 16:28:01 + */ +@Data +@TableName("tz_prod_tag_reference") +public class ProdTagReference implements Serializable{ + private static final long serialVersionUID = 1L; + + /** + * 分组引用id + */ + @TableId + private Long referenceId; + /** + * 店铺id + */ + private Long shopId; + /** + * 标签id + */ + private Long tagId; + /** + * 商品id + */ + private Long prodId; + /** + * 状态(1:正常,0:删除) + */ + private Integer status; + /** + * 创建时间 + */ + private Date createTime; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Product.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Product.java new file mode 100644 index 0000000..9dce48c --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Product.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.yami.shop.common.serializer.json.ImgJsonSerializer; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +@TableName("tz_prod") +public class Product implements Serializable { + + private static final long serialVersionUID = -4644407386444894349L; + /** + * 商品ID + */ + @TableId + private Long prodId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 商品名称 + */ + private String prodName; + + /** + * 原价 + */ + private Double oriPrice; + + /** + * 现价 + */ + private Double price; + + /** + * 简要描述,卖点等 + */ + private String brief; + + /** + * 商品主图 + */ + @JsonSerialize(using = ImgJsonSerializer.class) + private String pic; + + /** + * 商品图片 + */ + private String imgs; + + /** + * 默认是1,表示正常状态, -1表示删除, 0下架 + */ + private Integer status; + + /** + * 商品分类 + */ + private Long categoryId; + + /** + * 已经销售数量 + */ + private Integer soldNum; + + /** + * 库存量 + */ + private Integer totalStocks; + + /** + * 配送方式json + */ + private String deliveryMode; + + /** + * 运费模板id + */ + private Long deliveryTemplateId; + + /** + * 录入时间 + */ + private Date createTime; + + /** + * 修改时间 + */ + private Date updateTime; + + /** + * 详细描述 + */ + private String content; + + + /** + * 上架时间 + */ + private Date putawayTime; + + /** + * 版本 + */ + @Version + private Integer version; + + /** + * sku列表 + */ + @TableField(exist = false) + private List skuList; + + /** + * 店铺名称 + */ + @TableField(exist = false) + private String shopName; + + @TableField(exist = false) + private List tagList; + + + @Data + public static class DeliveryModeVO { + + /** + * 用户自提 + */ + private Boolean hasUserPickUp; + + /** + * 店铺配送 + */ + private Boolean hasShopDelivery; + + } +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ScoreLog.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ScoreLog.java new file mode 100644 index 0000000..7f9ee0f --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ScoreLog.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.util.Date; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +@Data +@TableName("tz_score_log") +public class ScoreLog { + /** + * 积分记录id + */ + @TableId + + private Long id; + + /** + * 用户id + */ + + private String userId; + + /** + * 0支出 1收入 + */ + private Byte type; + + /** + * 记录创建时间 + */ + + private Date createTime; + + /** + * 流水号 + */ + private String sn; + + /** + * 积分类型:1回收加积分 2购买减积分 + */ + + private Byte scoreType; + +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/SensWord.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/SensWord.java new file mode 100644 index 0000000..3d72c0e --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/SensWord.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +@Data +@TableName("tz_sens_word") +public class SensWord { + /** + * ID + */ + @TableId + + private Long sensId; + + /** + * 敏感字 + */ + private String words; +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ShopDetail.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ShopDetail.java new file mode 100644 index 0000000..5a8c116 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/ShopDetail.java @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +@Data +@TableName("tz_shop_detail") +public class ShopDetail implements Serializable{ + private static final long serialVersionUID = 3300529542917772262L; + /** + * 店铺id + */ + @TableId + private Long shopId; + + /** + * 店铺名称(数字、中文,英文(可混合,不可有特殊字符),可修改)、不唯一 + */ + private String shopName; + + /** + * 店长用户id + */ + private String userId; + + /** + * 店铺类型 + */ + private Integer shopType; + + /** + * 店铺简介(可修改) + */ + private String intro; + + /** + * 店铺公告(可修改) + */ + private String shopNotice; + + /** + * 店铺行业(餐饮、生鲜果蔬、鲜花等) + */ + private Integer shopIndustry; + + /** + * 店长 + */ + private String shopOwner; + + /** + * 店铺绑定的手机(登录账号:唯一) + */ + private String mobile; + + /** + * 店铺联系电话 + */ + private String tel; + + /** + * 店铺所在纬度(可修改) + */ + private String shopLat; + + /** + * 店铺所在经度(可修改) + */ + private String shopLng; + + /** + * 店铺详细地址 + */ + private String shopAddress; + + /** + * 店铺所在省份(描述) + */ + private String province; + + /** + * 店铺所在城市(描述) + */ + private String city; + + /** + * 店铺所在区域(描述) + */ + private String area; + + /** + * 店铺省市区代码,用于回显 + */ + private String pcaCode; + + /** + * 店铺logo(可修改) + */ + private String shopLogo; + + /** + * 店铺相册 + */ + private String shopPhotos; + + /** + * 每天营业时间段(可修改) + */ + private String openTime; + + /** + * 店铺状态(-1:未开通 0: 停业中 1:营业中),可修改 + */ + private Integer shopStatus; + + /** + * 0:商家承担运费; 1:买家承担运费 + */ + private Integer transportType; + + /** + * 固定运费 + */ + private Double fixedFreight; + + /** + * 满X包邮 + */ + private Double fullFreeShipping; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 分销设置(0关闭 1开启) + */ + private Integer isDistribution; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Sku.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Sku.java new file mode 100644 index 0000000..4b461f4 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Sku.java @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +@Data +@TableName("tz_sku") +public class Sku implements Serializable { + /** + * 单品ID + */ + @TableId + private Long skuId; + + /** + * 商品ID + */ + private Long prodId; + + /** + * 销售属性组合字符串,格式是p1:v1;p2:v2 + */ + private String properties; + + /** + * 原价 + */ + private Double oriPrice; + + /** + * 价格 + */ + private Double price; + + /** + * 库存 + */ + private Integer stocks; + + /** + * 实际库存 + */ + private Integer actualStocks; + + /** + * 修改时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** + * 记录时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date recTime; + + /** + * 商家编码 + */ + private String partyCode; + + /** + * 商品条形码 + */ + private String modelId; + + /** + * sku图片 + */ + private String pic; + + /** + * sku名称 + */ + private String skuName; + + /** + * 商品名称 + */ + private String prodName; + + private Integer version; + + /** + * 重量 + */ + private Double weight; + + /** + * 体积 + */ + private Double volume; + + /** + * 状态:0禁用 1 启用 + */ + private Integer status; + + /** + * 0 正常 1 已被删除 + */ + private Integer isDelete; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/SmsLog.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/SmsLog.java new file mode 100644 index 0000000..679dc87 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/SmsLog.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.util.Date; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +@Data +@TableName("tz_sms_log") +public class SmsLog { + /** + * ID + */ + @TableId + + private Long id; + + /** + * 用户id + */ + + private String userId; + + /** + * 手机号码 + */ + + private String userPhone; + + /** + * 短信内容 + */ + private String content; + + /** + * 手机验证码 + */ + + private String mobileCode; + + /** + * 短信类型 1:注册 2:验证 + */ + private Integer type; + + /** + * 发送时间 + */ + + private Date recDate; + + /** + * 发送短信返回码 + */ + + private String responseCode; + + /** + * 状态 1:有效 0:失效 + */ + private Integer status; + +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Transcity.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Transcity.java new file mode 100644 index 0000000..a9cc96a --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Transcity.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.io.Serializable; + +@Data +@TableName("tz_transcity") +public class Transcity implements Serializable { + @TableId + + private Long transcityId; + + /** + * 运费项id + */ + + private Long transfeeId; + + /** + * 城市id + */ + + private Long cityId; + + /** + * 城市名称 + */ + @TableField(exist=false) + private String areaName; +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/TranscityFree.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/TranscityFree.java new file mode 100644 index 0000000..0cc606a --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/TranscityFree.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.io.Serializable; + +@Data +@TableName("tz_transcity_free") +public class TranscityFree implements Serializable { + private static final long serialVersionUID = 2579465286635831076L; + /** + * 指定条件包邮城市项id + */ + @TableId + + private Long transcityFreeId; + + /** + * 指定条件包邮项id + */ + + private Long transfeeFreeId; + + /** + * 城市id + */ + + private Long freeCityId; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Transfee.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Transfee.java new file mode 100644 index 0000000..2d358a0 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Transfee.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.io.Serializable; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.*; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@TableName("tz_transfee") +public class Transfee implements Serializable { + private static final long serialVersionUID = 8039640964056626028L; + /** + * 运费项id + */ + @TableId + @ApiModelProperty(value = "运费项id",required=true) + private Long transfeeId; + + /** + * 运费模板id + */ + + @ApiModelProperty(value = "运费模板id",required=true) + private Long transportId; + + /** + * 续件数量 + */ + + @ApiModelProperty(value = "续件数量",required=true) + private Double continuousPiece; + + /** + * 首件数量 + */ + + @ApiModelProperty(value = "首件数量",required=true) + private Double firstPiece; + + /** + * 续件费用 + */ + + @ApiModelProperty(value = "续件费用",required=true) + private Double continuousFee; + + /** + * 首件费用 + */ + + @ApiModelProperty(value = "首件费用",required=true) + private Double firstFee; + + @TableField(exist=false) + @ApiModelProperty(value = "指定条件运费城市项",required=true) + private List cityList; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/TransfeeFree.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/TransfeeFree.java new file mode 100644 index 0000000..59301f5 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/TransfeeFree.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.io.Serializable; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@TableName("tz_transfee_free") +public class TransfeeFree implements Serializable { + private static final long serialVersionUID = -2811714952219888223L; + /** + * 指定条件包邮项id + */ + @TableId + @ApiModelProperty(value = "指定条件包邮项id",required=true) + private Long transfeeFreeId; + + /** + * 运费模板id + */ + + @ApiModelProperty(value = "运费模板id",required=true) + private Long transportId; + + /** + * 包邮方式 (0 满x件/重量/体积包邮 1满金额包邮 2满x件/重量/体积且满金额包邮) + */ + + @ApiModelProperty(value = "包邮方式 (0 满x件/重量/体积包邮 1满金额包邮 2满x件/重量/体积且满金额包邮)",required=true) + private Integer freeType; + + /** + * 需满金额 + */ + @ApiModelProperty(value = "需满金额",required=true) + private Double amount; + + /** + * 包邮x件/重量/体积 + */ + @ApiModelProperty(value = "包邮x件/重量/体积",required=true) + private Double piece; + + /** + * 指定条件包邮城市项 + */ + @TableField(exist=false) + @ApiModelProperty(value = "指定条件包邮城市项",required=true) + private List freeCityList; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Transport.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Transport.java new file mode 100644 index 0000000..afd4739 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/Transport.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.*; + +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import io.swagger.annotations.ApiModelProperty; + +@Data +@TableName("tz_transport") +public class Transport implements Serializable { + private static final long serialVersionUID = 1876655654053364580L; + /** + * 运费模板id + */ + @TableId + @ApiModelProperty(value = "运费模板id",required=true) + private Long transportId; + + /** + * 运费模板名称 + */ + + @ApiModelProperty(value = "运费模板名称",required=true) + private String transName; + + /** + * 创建时间 + */ + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建时间",required=true) + private Date createTime; + + /** + * 店铺id + */ + + @ApiModelProperty(value = "店铺id",required=true) + private Long shopId; + + /** + * 参考 TransportChargeType + * 收费方式(0 按件数,1 按重量 2 按体积) + */ + @ApiModelProperty(value = "收费方式(0 按件数,1 按重量 2 按体积)",required=true) + private Integer chargeType; + + + /** + * 是否包邮 0:不包邮 1:包邮 + */ + @ApiModelProperty(value = "是否包邮 0:不包邮 1:包邮",required=true) + private Integer isFreeFee; + + /** + * 是否含有包邮条件 + */ + @ApiModelProperty(value = "是否含有包邮条件",required=true) + private Integer hasFreeCondition; + + /** + * 指定条件包邮项 + */ + @TableField(exist=false) + @ApiModelProperty(value = "指定条件包邮项",required=true) + private List transfeeFrees; + + /** + * 运费项 + */ + @TableField(exist=false) + @ApiModelProperty(value = "运费项",required=true) + private List transfees; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/User.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/User.java new file mode 100644 index 0000000..db1b02c --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/User.java @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.*; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.yami.shop.common.serializer.json.EmojiJsonSerializer; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; + +@Data +@TableName("tz_user") +public class User implements Serializable { + private static final long serialVersionUID = 2090714647038636896L; + /** + * ID + */ + @TableId(type = IdType.INPUT) + private String userId; + + /** + * 用户昵称 + */ + @JsonSerialize(using = EmojiJsonSerializer.class) + private String nickName; + + /** + * 真实姓名 + */ + + private String realName; + + /** + * 用户邮箱 + */ + + private String userMail; + + /** + * 登录密码 + */ + + private String loginPassword; + + /** + * 支付密码 + */ + + private String payPassword; + + /** + * 手机号码 + */ + + private String userMobile; + + /** + * 修改时间 + */ + + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + + /** + * 注册时间 + */ + + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date userRegtime; + + /** + * 注册IP + */ + + private String userRegip; + + /** + * 最后登录时间 + */ + + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date userLasttime; + + /** + * 最后登录IP + */ + + private String userLastip; + + /** + * 备注 + */ + + private String userMemo; + + /** + * M(男) or F(女) + */ + private String sex; + + /** + * 例如:2009-11-27 + */ + + @DateTimeFormat(pattern="yyyy-MM-dd") + private String birthDate; + + /** + * 头像图片路径 + */ + private String pic; + + /** + * 状态 1 正常 0 无效 + */ + private Integer status; + + /** + * 积分 + */ + private Integer score; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/UserAddr.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/UserAddr.java new file mode 100644 index 0000000..46c0d4d --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/UserAddr.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * 用户地址管理 + * + * @author hzm + * @date 2019-04-15 10:49:40 + */ +@Data +@TableName("tz_user_addr") +@EqualsAndHashCode(callSuper = false) +public class UserAddr implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId + private Long addrId; + /** + * 用户ID + */ + private String userId; + /** + * 收货人 + */ + private String receiver; + /** + * 省ID + */ + private Long provinceId; + /** + * 省 + */ + private String province; + /** + * 城市 + */ + private String city; + /** + * 城市ID + */ + private Long cityId; + /** + * 区 + */ + private String area; + /** + * 区ID + */ + private Long areaId; + /** + * 邮编 + */ + private String postCode; + /** + * 地址 + */ + private String addr; + /** + * 手机 + */ + private String mobile; + /** + * 状态,1正常,0无效 + */ + private Integer status; + /** + * 是否默认地址 1是 + */ + private Integer commonAddr; + /** + * 建立时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + /** + * 版本号 + */ + private Integer version; + /** + * 更新时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/UserAddrOrder.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/UserAddrOrder.java new file mode 100644 index 0000000..72f2824 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/UserAddrOrder.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +@Data +@TableName("tz_user_addr_order") +public class UserAddrOrder implements Serializable { + /** + * ID + */ + @TableId + + + private Long addrOrderId; + + /** + * 地址ID + */ + + private Long addrId; + + /** + * 用户ID + */ + + private String userId; + + /** + * 收货人 + */ + private String receiver; + + /** + * 省 + */ + + private String province; + + /** + * 城市 + */ + + private String city; + + /** + * 区 + */ + + private String area; + + /** + * 地址 + */ + private String addr; + + /** + * 邮编 + */ + + private String postCode; + + /** + * 省ID + */ + + private Long provinceId; + + /** + * 城市ID + */ + + private Long cityId; + + /** + * 区域ID + */ + + private Long areaId; + + /** + * 手机 + */ + private String mobile; + + /** + * 建立时间 + */ + + private Date createTime; + + /** + * 版本号 + */ + private Integer version; + +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/UserCollection.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/UserCollection.java new file mode 100644 index 0000000..d72ae47 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/UserCollection.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户收藏表 + * + * @author xwc + * @date 2019-04-19 16:57:20 + */ +@Data +@TableName("tz_user_collection") +@EqualsAndHashCode +public class UserCollection implements Serializable{ + private static final long serialVersionUID = 1L; + + /** + * 收藏表 + */ + @TableId + private Long id; + /** + * 商品id + */ + private Long prodId; + /** + * 用户id + */ + private String userId; + /** + * 收藏时间 + */ + private Date createTime; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/model/WxOrder.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/WxOrder.java new file mode 100644 index 0000000..a6c7849 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/model/WxOrder.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.model; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +@Data +@TableName("tz_wx_order") +public class WxOrder implements Serializable { + /** + * 微信订单id + */ + @TableId + private Long id; + + /** + * 订单流水号 + */ + private String sn; + + /** + * 微信流水号 + */ + + private String wxSn; + + /** + * 用户id + */ + + private String userId; + + /** + * 订单状态 + */ + private Byte status; + + /** + * 金额 + */ + private Double amount; + + /** + * 订单类型 + */ + + private Byte orderType; + + /** + * 扩展信息 + */ + + private String extendInfo; + + /** + * 创建时间 + */ + + private Date createTime; + + /** + * 更新时间 + */ + + private Date updateTime; +} \ No newline at end of file diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/order/ConfirmOrderOrder.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/order/ConfirmOrderOrder.java new file mode 100644 index 0000000..3c4a548 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/order/ConfirmOrderOrder.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.order; + +/** + * 提交订单事件先后顺序 + * @author LGH + */ +public interface ConfirmOrderOrder { + + /** + * 没有任何活动时的顺序 + */ + int DEFAULT = 0; + + /** + * 满减,排在DEFAULT后面 + */ + int DISCOUNT = 100; + + /** + * 优惠券,排在DISCOUNT后面 + */ + int COUPON = 200; + + /** + * 分销,排在COUPON后面 + */ + int DISTRIBUTION = 300; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/order/ShopCartEventOrder.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/order/ShopCartEventOrder.java new file mode 100644 index 0000000..dd9d274 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/order/ShopCartEventOrder.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.order; + +/** + * 购物车事件先后顺序 + * @author LGH + */ +public interface ShopCartEventOrder { + + /** + * 没有任何活动时的顺序 + */ + int DEFAULT = 0; + + /** + * 满减活动的组装顺序,排在DEFAULT后面 + */ + int DISCOUNT = 100; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/order/SubmitOrderOrder.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/order/SubmitOrderOrder.java new file mode 100644 index 0000000..d91ed59 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/order/SubmitOrderOrder.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.order; + +/** + * 提交订单事件先后顺序 + * @author LGH + */ +public interface SubmitOrderOrder { + + /** + * 没有任何活动时的顺序 + */ + int DEFAULT = 0; + + /** + * 优惠券,排在DEFAULT后面 + */ + int DISCOUNT = 100; + + /** + * 优惠券,排在DEFAULT后面 + */ + int COUPON = 200; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/param/DeliveryOrderParam.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/param/DeliveryOrderParam.java new file mode 100644 index 0000000..c9c85fb --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/param/DeliveryOrderParam.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.param; + +import javax.validation.constraints.NotBlank; + +import io.swagger.annotations.ApiModelProperty; + +public class DeliveryOrderParam { + + @NotBlank(message="订单号不能为空") + @ApiModelProperty(value = "订单号",required=true) + private String orderNumber; + + @NotBlank(message="快递公司id不能为空") + @ApiModelProperty(value = "快递公司",required=true) + private Long dvyId; + + @NotBlank(message="物流单号不能为空") + @ApiModelProperty(value = "物流单号",required=true) + private String dvyFlowId; + + + public Long getDvyId() { + return dvyId; + } + + public void setDvyId(Long dvyId) { + this.dvyId = dvyId; + } + + public String getDvyFlowId() { + return dvyFlowId; + } + + public void setDvyFlowId(String dvyFlowId) { + this.dvyFlowId = dvyFlowId; + } + + public String getOrderNumber() { + return orderNumber; + } + + public void setOrderNumber(String orderNumber) { + this.orderNumber = orderNumber; + } + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/param/GroupProdParam.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/param/GroupProdParam.java new file mode 100644 index 0000000..1ca5a57 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/param/GroupProdParam.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.param; + +public class GroupProdParam { + /** + * 商品名称 + */ + private String prodName; + + /** + * 商品最小金额区间 + */ + private Double minMoney; + + + /** + * 商品最大金额区间 + */ + private Double maxMoney; + + /** + * 商品分类Id + */ + private Long categoryId; + + /** + * 活动group_activity_id + */ + private Long groupActivityId; + + /** + * 商品店铺Id + */ + private Long shopId; + + public String getProdName() { + return prodName; + } + + public void setProdName(String prodName) { + this.prodName = prodName; + } + + public Double getMinMoney() { + return minMoney; + } + + public void setMinMoney(Double minMoney) { + this.minMoney = minMoney; + } + + public Double getMaxMoney() { + return maxMoney; + } + + public void setMaxMoney(Double maxMoney) { + this.maxMoney = maxMoney; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getGroupActivityId() { + return groupActivityId; + } + + public void setGroupActivityId(Long groupActivityId) { + this.groupActivityId = groupActivityId; + } +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/param/OrderParam.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/param/OrderParam.java new file mode 100644 index 0000000..a311fe3 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/param/OrderParam.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.param; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +@Data +public class OrderParam { + /** + * 店铺id + */ + private Long shopId; + + /** + * 订单状态 -1 已取消 0:待付款 1:待发货 2:待收货 3:已完成 + */ + private Integer status; + + /** + * 是否已经支付,1:已经支付过,0:,没有支付过 + */ + private Integer isPayed; + + /** + * 订购流水号 + */ + private String orderNumber; + + /** + * 开始时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + /** + * 结束时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/param/ProductParam.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/param/ProductParam.java new file mode 100644 index 0000000..a173476 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/param/ProductParam.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.param; + +import com.yami.shop.bean.model.Product; +import com.yami.shop.bean.model.Sku; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.List; + +@Data +public class ProductParam { + + /** + * 产品ID + */ + private Long prodId; + + /** + * 状态 + */ + private Integer status; + + /** + * 商品名称 + */ + @NotBlank(message = "商品名称不能为空") + @Size(max = 200, message = "商品名称长度应该小于{max}") + private String prodName; + + + /** + * 商品价格 + */ + @NotNull(message = "请输入商品价格") + private Double price; + + /** + * 商品价格 + */ + @NotNull(message = "请输入商品原价") + private Double oriPrice; + + /** + * 库存量 + */ + @NotNull(message = "请输入商品库存") + private Integer totalStocks; + + /** + * 简要描述,卖点等 + */ + @Size(max = 500, message = "商品卖点长度应该小于{max}") + private String brief; + + @NotBlank(message = "请选择图片上传") + private String pic; + + /** + * 商品图片 + */ + @NotBlank(message = "请选择图片上传") + private String imgs; + + /** + * 商品分类 + */ + @NotNull(message = "请选择商品分类") + private Long categoryId; + + /** + * sku列表字符串 + */ + private List skuList; + + /** + * content 商品详情 + */ + private String content; + + /** + * 是否能够用户自提 + */ + private Product.DeliveryModeVO deliveryModeVo; + + /** + * 运费模板id + */ + private Long deliveryTemplateId; + + /** + * 分组标签列表 + */ + private List tagList; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/param/ShopDetailParam.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/param/ShopDetailParam.java new file mode 100644 index 0000000..a484283 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/param/ShopDetailParam.java @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.param; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +public class ShopDetailParam { + + + private Long shopId; + + /** + * 店铺名称(数字、中文,英文(可混合,不可有特殊字符),可修改)、不唯一 + */ + @NotBlank(message="店铺名称不能为空") + @Size(max = 50,message = "商品名称长度应该小于{max}") + private String shopName; + + /** + * 店铺简介(可修改) + */ + @Size(max = 200,message = "店铺简介长度应该小于{max}") + private String intro; + + /** + * 店铺公告(可修改) + */ + @Size(max = 50,message = "店铺公告长度应该小于{max}") + private String shopNotice; + + /** + * 店铺联系电话 + */ + @NotBlank(message="店铺联系电话不能为空") + @Size(max = 20,message = "店铺公告长度应该小于{max}") + private String tel; + + /** + * 店铺详细地址 + */ + @NotBlank(message="店铺详细地址不能为空") + @Size(max = 100,message = "店铺公告长度应该小于{max}") + private String shopAddress; + + /** + * 店铺所在省份(描述) + */ + @NotBlank(message="店铺所在省份不能为空") + @Size(max = 10,message = "店铺所在省份长度应该小于{max}") + private String province; + + /** + * 店铺所在城市(描述) + */ + @NotBlank(message="店铺所在城市不能为空") + @Size(max = 10,message = "店铺所在城市长度应该小于{max}") + private String city; + + /** + * 店铺所在区域(描述) + */ + @NotBlank(message="店铺所在区域不能为空") + @Size(max = 10,message = "店铺所在省份区域长度应该小于{max}") + private String area; + + /** + * 店铺省市区代码,用于回显 + */ + @NotBlank(message="店铺省市区代码不能为空") + @Size(max = 20,message = "店铺省市区代码长度应该小于{max}") + private String pcaCode; + + /** + * 店铺logo(可修改) + */ + @NotBlank(message="店铺logo不能为空") + @Size(max = 200,message = "店铺logo长度应该小于{max}") + private String shopLogo; + + /** + * 店铺相册 + */ + @Size(max = 1000,message = "店铺相册长度应该小于{max}") + private String shopPhotos; + + /** + * 每天营业时间段(可修改) + */ + @NotBlank(message="每天营业时间段不能为空") + @Size(max = 100,message = "每天营业时间段长度应该小于{max}") + private String openTime; + + /** + * 店铺状态(-1:未开通 0: 停业中 1:营业中),可修改 + */ + private Integer shopStatus; + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getIntro() { + return intro; + } + + public void setIntro(String intro) { + this.intro = intro; + } + + public String getShopNotice() { + return shopNotice; + } + + public void setShopNotice(String shopNotice) { + this.shopNotice = shopNotice; + } + + public String getTel() { + return tel; + } + + public void setTel(String tel) { + this.tel = tel; + } + + public String getShopAddress() { + return shopAddress; + } + + public void setShopAddress(String shopAddress) { + this.shopAddress = shopAddress; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getPcaCode() { + return pcaCode; + } + + public void setPcaCode(String pcaCode) { + this.pcaCode = pcaCode; + } + + public String getShopLogo() { + return shopLogo; + } + + public void setShopLogo(String shopLogo) { + this.shopLogo = shopLogo; + } + + public String getShopPhotos() { + return shopPhotos; + } + + public void setShopPhotos(String shopPhotos) { + this.shopPhotos = shopPhotos; + } + + public String getOpenTime() { + return openTime; + } + + public void setOpenTime(String openTime) { + this.openTime = openTime; + } + + public Integer getShopStatus() { + return shopStatus; + } + + public void setShopStatus(Integer shopStatus) { + this.shopStatus = shopStatus; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/pay/PayInfoDto.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/pay/PayInfoDto.java new file mode 100644 index 0000000..9a39659 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/pay/PayInfoDto.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.pay; + +import lombok.Data; + +/** + * 支付信息 + * @author LGH + */ +@Data +public class PayInfoDto { + + /** + * 支付信息,如商品名称 + */ + private String body; + + /** + * 支付单号 + */ + private String payNo; + + /** + * 付款金额 + */ + private Double payAmount; +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/vo/SysUserVO.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/vo/SysUserVO.java new file mode 100644 index 0000000..eb8a8b8 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/vo/SysUserVO.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.vo; + +import lombok.Data; + +@Data +public class SysUserVO { + + /** + * 用户id + */ + private String userId; + + /** + * 用户名 + */ + private String username; + +} diff --git a/yami-shop-bean/src/main/java/com/yami/shop/bean/vo/UserVO.java b/yami-shop-bean/src/main/java/com/yami/shop/bean/vo/UserVO.java new file mode 100644 index 0000000..df8f658 --- /dev/null +++ b/yami-shop-bean/src/main/java/com/yami/shop/bean/vo/UserVO.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.bean.vo; + +import lombok.Data; + +@Data +public class UserVO { + + /** + * 用户id + */ + private String userId; + + /** + * 用户昵称 + */ + private String nickName; + + private String userMobile; + + /** + * 用户头像 + */ + private String pic; +} diff --git a/yami-shop-common/pom.xml b/yami-shop-common/pom.xml new file mode 100644 index 0000000..44ff2d3 --- /dev/null +++ b/yami-shop-common/pom.xml @@ -0,0 +1,97 @@ + + + + yami-shop + com.yami.shop + 0.0.1-SNAPSHOT + + 4.0.0 + yami-shop-common + jar + + + + org.springframework.boot + spring-boot-starter-aop + + + com.google.guava + guava + + + cn.hutool + hutool-all + + + com.fasterxml.jackson.core + jackson-databind + + + org.jsoup + jsoup + + + com.baomidou + mybatis-plus-boot-starter + + + com.qiniu + qiniu-java-sdk + + + mysql + mysql-connector-java + + + + org.springframework.boot + spring-boot-starter-cache + + + org.redisson + redisson-spring-boot-starter + + + ma.glasnost.orika + orika-core + + + io.springfox + springfox-swagger2 + + + com.github.xiaoymin + swagger-bootstrap-ui + + + com.aliyun + aliyun-java-sdk-core + + + com.aliyun + aliyun-java-sdk-dysmsapi + + + com.vdurmont + emoji-java + + + de.ruedigermoeller + fst + + + com.github.binarywang + weixin-java-pay + + + com.github.binarywang + weixin-java-miniapp + + + com.github.binarywang + weixin-java-mp + + + \ No newline at end of file diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/annotation/RedisLock.java b/yami-shop-common/src/main/java/com/yami/shop/common/annotation/RedisLock.java new file mode 100644 index 0000000..3eccfec --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/annotation/RedisLock.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.annotation; + +import org.springframework.core.annotation.AliasFor; + +import java.lang.annotation.*; +import java.util.concurrent.TimeUnit; + +/** + * 使用redis进行分布式锁 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RedisLock { + + /** + * redis锁 名字 + */ + String lockName() default ""; + + /** + * redis锁 key 支持spel表达式 + */ + String key() default ""; + + /** + * 过期秒数,默认为5秒 + * + * @return 轮询锁的时间 + */ + int expire() default 5000; + + /** + * 超时时间单位 + * + * @return 秒 + */ + TimeUnit timeUnit() default TimeUnit.SECONDS; +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/annotation/SysLog.java b/yami-shop-common/src/main/java/com/yami/shop/common/annotation/SysLog.java new file mode 100644 index 0000000..c354dd7 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/annotation/SysLog.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface SysLog { + + String value() default ""; +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/aspect/RedisLockAspect.java b/yami-shop-common/src/main/java/com/yami/shop/common/aspect/RedisLockAspect.java new file mode 100644 index 0000000..e813bd8 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/aspect/RedisLockAspect.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.aspect; + +import cn.hutool.core.util.StrUtil; +import com.yami.shop.common.annotation.RedisLock; +import com.yami.shop.common.util.SpelUtil; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.Signature; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +/** + * @author lgh + */ +@Aspect +@Component +public class RedisLockAspect { + + @Autowired + private RedissonClient redissonClient; + + private static final String REDISSON_LOCK_PREFIX = "redisson_lock:"; + + @Around("@annotation(redisLock)") + public Object around(ProceedingJoinPoint joinPoint, RedisLock redisLock) throws Throwable { + String spel = redisLock.key(); + String lockName = redisLock.lockName(); + + RLock rLock = redissonClient.getLock(getRedisKey(joinPoint,lockName,spel)); + + rLock.lock(redisLock.expire(),redisLock.timeUnit()); + + Object result = null; + try { + //执行方法 + result = joinPoint.proceed(); + + } finally { + rLock.unlock(); + } + return result; + } + + /** + * 将spel表达式转换为字符串 + * @param joinPoint 切点 + * @return redisKey + */ + private String getRedisKey(ProceedingJoinPoint joinPoint,String lockName,String spel) { + Signature signature = joinPoint.getSignature(); + MethodSignature methodSignature = (MethodSignature) signature; + Method targetMethod = methodSignature.getMethod(); + Object target = joinPoint.getTarget(); + Object[] arguments = joinPoint.getArgs(); + return REDISSON_LOCK_PREFIX + lockName + StrUtil.COLON + SpelUtil.parse(target,spel, targetMethod, arguments); + } +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/bean/ALiDaYu.java b/yami-shop-common/src/main/java/com/yami/shop/common/bean/ALiDaYu.java new file mode 100644 index 0000000..7142462 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/bean/ALiDaYu.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.bean; + +import lombok.Data; + +/** + * 阿里大鱼配置信息 + * @author LGH + */ +@Data +public class ALiDaYu { + + private String accessKeyId; + + private String accessKeySecret; + + private String signName; +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/bean/Qiniu.java b/yami-shop-common/src/main/java/com/yami/shop/common/bean/Qiniu.java new file mode 100644 index 0000000..ff223e7 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/bean/Qiniu.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.bean; + +import lombok.Data; + +/** + * 七牛云存储配置信息 + * @author lgh + */ +@Data +public class Qiniu { + + private String accessKey; + + private String secretKey; + + private String bucket; + + private String resourcesUrl; + +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/config/DefaultExceptionHandlerConfig.java b/yami-shop-common/src/main/java/com/yami/shop/common/config/DefaultExceptionHandlerConfig.java new file mode 100644 index 0000000..46ac302 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/config/DefaultExceptionHandlerConfig.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.config; + +import com.yami.shop.common.exception.YamiShopBindException; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +/** + * 自定义错误处理器 + * @author LGH + */ +@Controller +@RestControllerAdvice +public class DefaultExceptionHandlerConfig { + + + @ExceptionHandler(BindException.class) + public ResponseEntity bindExceptionHandler(BindException e){ + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getBindingResult().getFieldErrors().get(0).getDefaultMessage()); + + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseEntity methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e){ + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getBindingResult().getFieldErrors().get(0).getDefaultMessage()); + } + + @ExceptionHandler(YamiShopBindException.class) + public ResponseEntity unauthorizedExceptionHandler(YamiShopBindException e){ + e.printStackTrace(); + return ResponseEntity.status(e.getHttpStatusCode()).body(e.getMessage()); + } +} \ No newline at end of file diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/config/FileUploadConfig.java b/yami-shop-common/src/main/java/com/yami/shop/common/config/FileUploadConfig.java new file mode 100644 index 0000000..3e1e483 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/config/FileUploadConfig.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.qiniu.common.Zone; +import com.qiniu.storage.BucketManager; +import com.qiniu.storage.UploadManager; +import com.qiniu.util.Auth; +import com.yami.shop.common.bean.Qiniu; + +/** + * 文件上传配置 + * @author lgh + */ +@Configuration +public class FileUploadConfig { + + + @Autowired + private Qiniu qiniu; + + /** + * 华东机房 + */ + @Bean + public com.qiniu.storage.Configuration qiniuConfig() { + return new com.qiniu.storage.Configuration(Zone.zone2()); + } + + /** + * 构建一个七牛上传工具实例 + */ + @Bean + public UploadManager uploadManager() { + return new UploadManager(qiniuConfig()); + } + + /** + * 认证信息实例 + * @return + */ + @Bean + public Auth auth() { + return Auth.create(qiniu.getAccessKey(), qiniu.getSecretKey()); + } + + /** + * 构建七牛空间管理实例 + */ + @Bean + public BucketManager bucketManager() { + return new BucketManager(auth(), qiniuConfig()); + } +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/config/MybatisPlusConfig.java b/yami-shop-common/src/main/java/com/yami/shop/common/config/MybatisPlusConfig.java new file mode 100644 index 0000000..fc101e3 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/config/MybatisPlusConfig.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.config; + +import com.baomidou.mybatisplus.core.injector.ISqlInjector; +import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector; +import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; + +import javax.sql.DataSource; + +/** + */ +@Configuration +//@ConditionalOnBean(DataSource.class) +@MapperScan({"com.yami.shop.dao","com.yami.shop.**.dao"}) +public class MybatisPlusConfig { + + /** + * 分页插件 + * @return PaginationInterceptor + */ + @Bean + @ConditionalOnMissingBean + public PaginationInterceptor paginationInterceptor() { + return new PaginationInterceptor(); + } + /** + * 逻辑删除插件 + * + * @return LogicSqlInjector + */ + @Bean + @ConditionalOnMissingBean + public ISqlInjector sqlInjector() { + return new LogicSqlInjector(); + } + + /** + * 乐观锁插件 + * @return + */ + @Bean + public OptimisticLockerInterceptor optimisticLockerInterceptor() { + return new OptimisticLockerInterceptor(); + } +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/config/OrikaConfig.java b/yami-shop-common/src/main/java/com/yami/shop/common/config/OrikaConfig.java new file mode 100644 index 0000000..dc7a010 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/config/OrikaConfig.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import ma.glasnost.orika.MapperFacade; +import ma.glasnost.orika.MapperFactory; +import ma.glasnost.orika.impl.DefaultMapperFactory; + +/** + * MapperFacade 用于dto ->entity的转换 + * @author lgh + */ +@Configuration +public class OrikaConfig { + + @Bean + public MapperFactory mapperFactory() { + return new DefaultMapperFactory.Builder().build(); + } + + @Bean + public MapperFacade mapperFacade() { + return mapperFactory().getMapperFacade(); + } +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/config/RedisCacheConfig.java b/yami-shop-common/src/main/java/com/yami/shop/common/config/RedisCacheConfig.java new file mode 100644 index 0000000..db8cdc9 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/config/RedisCacheConfig.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.config; + +import java.time.Duration; +import java.util.HashMap; +import java.util.Map; + +import com.yami.shop.common.serializer.redis.FstRedisSerializer; +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.*; + +/** + * redis 缓存配置,仅当配置文件中spring.cache.type = redis时生效 + * @author lgh + */ +@EnableCaching +@Configuration +public class RedisCacheConfig { + + @Bean + public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { + + RedisCacheManager redisCacheManager = new RedisCacheManager( + RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory), + // 默认策略,未配置的 key 会使用这个 + this.getRedisCacheConfigurationWithTtl(3600), + // 指定 key 策略 + this.getRedisCacheConfigurationMap() + ); + redisCacheManager.setTransactionAware(true); + return redisCacheManager; + } + + private Map getRedisCacheConfigurationMap() { + Map redisCacheConfigurationMap = new HashMap<>(16); +// redisCacheConfigurationMap.put("UserInfoList", this.getRedisCacheConfigurationWithTtl(3000)); +// redisCacheConfigurationMap.put("UserInfoListAnother", this.getRedisCacheConfigurationWithTtl(18000)); + + return redisCacheConfigurationMap; + } + + private RedisCacheConfiguration getRedisCacheConfigurationWithTtl(Integer seconds) { + + FstRedisSerializer kryoRedisSerializer = new FstRedisSerializer(); + + RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig(); + redisCacheConfiguration = redisCacheConfiguration.serializeValuesWith( + RedisSerializationContext + .SerializationPair + .fromSerializer(kryoRedisSerializer) + ).entryTtl(Duration.ofSeconds(seconds)); + + return redisCacheConfiguration; + } + + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(redisConnectionFactory); + redisTemplate.setKeySerializer(new StringRedisSerializer()); + redisTemplate.setHashKeySerializer(new StringRedisSerializer()); + redisTemplate.setValueSerializer(new FstRedisSerializer()); + redisTemplate.setHashValueSerializer(new FstRedisSerializer()); + redisTemplate.afterPropertiesSet(); + return redisTemplate; + } + +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/config/ShopBasicConfig.java b/yami-shop-common/src/main/java/com/yami/shop/common/config/ShopBasicConfig.java new file mode 100644 index 0000000..2f603f8 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/config/ShopBasicConfig.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.config; + +import com.yami.shop.common.bean.ALiDaYu; +import com.yami.shop.common.bean.Qiniu; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + + +/** + * 商城配置文件 + * @author lgh + */ +@Data +@Component +@PropertySource("classpath:shop.properties") +@ConfigurationProperties(prefix = "shop") +public class ShopBasicConfig { + + /** + * 七牛云的配置信息 + */ + private Qiniu qiniu; + + /** + * 阿里大于短信平台 + */ + private ALiDaYu aLiDaYu; + + /** + * 用于加解密token的密钥 + */ + private String tokenAesKey; + +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/config/ShopBeanConfig.java b/yami-shop-common/src/main/java/com/yami/shop/common/config/ShopBeanConfig.java new file mode 100644 index 0000000..656b9b4 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/config/ShopBeanConfig.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.config; + +import cn.hutool.crypto.symmetric.AES; +import com.yami.shop.common.bean.ALiDaYu; +import com.yami.shop.common.bean.Qiniu; +import lombok.AllArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@AllArgsConstructor +public class ShopBeanConfig { + + private final ShopBasicConfig shopBasicConfig; + + @Bean + public Qiniu qiniu() { + return shopBasicConfig.getQiniu(); + } + + @Bean + public AES tokenAes() { + return new AES(shopBasicConfig.getTokenAesKey().getBytes()); + } + + @Bean + public ALiDaYu aLiDaYu () { + return shopBasicConfig.getALiDaYu(); + } +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/enums/YamiHttpStatus.java b/yami-shop-common/src/main/java/com/yami/shop/common/enums/YamiHttpStatus.java new file mode 100644 index 0000000..cae0cb0 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/enums/YamiHttpStatus.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.enums; + +/** + * 与前端进行特殊交互需要使用的状态码,由于小程序需要,所以状态码只能为3位数字,并且不能与正常的http状态码冲突 + * @author LGH + */ +public enum YamiHttpStatus { + /** + * 客户端看到401状态码时,应该重新登陆 + */ + UNAUTHORIZED(401, "未授权"), + + COUPONCANNOTUSETOGETHER(601, "优惠券不能共用"), + ; + + + private final int value; + + private final String msg; + + + YamiHttpStatus(int value, String msg) { + this.value = value; + this.msg = msg; + } + + + /** + * Return the integer value of this status code. + */ + public int value() { + return this.value; + } + + /** + * Return the msg of this status code. + */ + public String getMsg() { + return msg; + } + + /** + * Return a string representation of this status code. + */ + @Override + public String toString() { + return this.value + " " + name(); + } + + + public static YamiHttpStatus valueOf(int statusCode) { + YamiHttpStatus status = resolve(statusCode); + if (status == null) { + throw new IllegalArgumentException("没有找到该Http状态码包含状态 [" + statusCode + "]"); + } + return status; + } + + public static YamiHttpStatus resolve(int statusCode) { + for (YamiHttpStatus status : values()) { + if (status.value == statusCode) { + return status; + } + } + return null; + } + + +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/exception/YamiShopBindException.java b/yami-shop-common/src/main/java/com/yami/shop/common/exception/YamiShopBindException.java new file mode 100644 index 0000000..1cb20e1 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/exception/YamiShopBindException.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.exception; + +import com.yami.shop.common.enums.YamiHttpStatus; +import org.springframework.http.HttpStatus; + +public class YamiShopBindException extends RuntimeException{ + + /** + * + */ + private static final long serialVersionUID = -4137688758944857209L; + + /** + * http状态码 + */ + private Integer httpStatusCode; + + + /** + * @param httpStatus http状态码 + */ + public YamiShopBindException(YamiHttpStatus httpStatus) { + super(httpStatus.getMsg()); + this.httpStatusCode = httpStatus.value(); + } + + /** + * @param httpStatus http状态码 + */ + public YamiShopBindException(YamiHttpStatus httpStatus, String msg) { + super(msg); + this.httpStatusCode = httpStatus.value(); + } + + + public YamiShopBindException(String msg) { + super(msg); + this.httpStatusCode = HttpStatus.BAD_REQUEST.value(); + } + + + public Integer getHttpStatusCode() { + return httpStatusCode; + } + +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/filter/FilterConfig.java b/yami-shop-common/src/main/java/com/yami/shop/common/filter/FilterConfig.java new file mode 100644 index 0000000..11a55d1 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/filter/FilterConfig.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.filter; + +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.servlet.DispatcherType; + +/** + * @author lgh + */ +@Configuration +public class FilterConfig { + + @Bean + public FilterRegistrationBean filterRegistration() { + FilterRegistrationBean registration = new FilterRegistrationBean<>(); + //添加过滤器 + registration.setFilter(new XssFilter()); + //设置过滤路径,/*所有路径 + registration.addUrlPatterns("/*"); + registration.setName("xssFilter"); + //设置优先级 + registration.setOrder(Integer.MAX_VALUE); + registration.setDispatcherTypes(DispatcherType.REQUEST); + return registration; + } +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/filter/XssFilter.java b/yami-shop-common/src/main/java/com/yami/shop/common/filter/XssFilter.java new file mode 100644 index 0000000..81e0976 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/filter/XssFilter.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.filter; + +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.yami.shop.common.xss.XssWrapper; + +/** + * 一些简单的安全过滤: + * xss + * @author lgh + */ +public class XssFilter implements Filter { + Logger logger = LoggerFactory.getLogger(getClass().getName()); + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{ + HttpServletRequest req = (HttpServletRequest) request; + HttpServletResponse resp = (HttpServletResponse) response; + + + logger.info("uri:{}",req.getRequestURI()); + // xss 过滤 + chain.doFilter(new XssWrapper(req), resp); + } + + @Override + public void destroy() { + + } +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/response/ResponseCode.java b/yami-shop-common/src/main/java/com/yami/shop/common/response/ResponseCode.java new file mode 100644 index 0000000..8866a4d --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/response/ResponseCode.java @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.response; + +public interface ResponseCode { + + int SUCCESS = 1; + + int FAIL = -1; +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/response/ServerResponse.java b/yami-shop-common/src/main/java/com/yami/shop/common/response/ServerResponse.java new file mode 100644 index 0000000..49e833c --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/response/ServerResponse.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.response; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +import java.io.Serializable; +import java.util.Objects; + +@Data +public class ServerResponse implements Serializable { + + + private int code; + + private String msg; + + private T obj; + + public boolean isSuccess(){ + return Objects.equals(ResponseCode.SUCCESS, this.code); + } + + +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/response/ServerResponseEntity.java b/yami-shop-common/src/main/java/com/yami/shop/common/response/ServerResponseEntity.java new file mode 100644 index 0000000..1e3843e --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/response/ServerResponseEntity.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.response; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class ServerResponseEntity { + + public static ServerResponse success(T data) { + ServerResponse serverResponse = new ServerResponse<>(); + serverResponse.setObj(data); + serverResponse.setCode(ResponseCode.SUCCESS); + return serverResponse; + } + + public static ServerResponse success() { + ServerResponse serverResponse = new ServerResponse<>(); + serverResponse.setCode(ResponseCode.SUCCESS); + return serverResponse; + } + + public static ServerResponse fail(String msg) { + log.error(msg); + ServerResponse serverResponse = new ServerResponse<>(); + serverResponse.setMsg(msg); + serverResponse.setCode(ResponseCode.FAIL); + return serverResponse; + } + + public static ServerResponse fail(String msg, T data) { + log.error(msg); + ServerResponse serverResponse = new ServerResponse<>(); + serverResponse.setMsg(msg); + serverResponse.setCode(ResponseCode.FAIL); + serverResponse.setObj(data); + return serverResponse; + } + + public static ServerResponse fail(int code ,String msg, T data) { + log.error(msg); + ServerResponse serverResponse = new ServerResponse<>(); + serverResponse.setMsg(msg); + serverResponse.setCode(code); + serverResponse.setObj(data); + return serverResponse; + } +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/serializer/FSTSerializer.java b/yami-shop-common/src/main/java/com/yami/shop/common/serializer/FSTSerializer.java new file mode 100644 index 0000000..265e3a9 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/serializer/FSTSerializer.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.serializer; + +import org.nustaq.serialization.FSTConfiguration; +import org.nustaq.serialization.FSTDecoder; +import org.nustaq.serialization.FSTEncoder; +import org.nustaq.serialization.coders.FSTStreamDecoder; +import org.nustaq.serialization.coders.FSTStreamEncoder; + +import java.io.IOException; +import java.lang.reflect.Field; + +/** + * 使用fts进行序列化 + * @author LGH + */ +public class FSTSerializer { + + static class FSTDefaultStreamCoderFactory implements FSTConfiguration.StreamCoderFactory { + + Field chBufField; + Field ascStringCacheField; + + { + try { + chBufField = FSTStreamDecoder.class.getDeclaredField("chBufS"); + ascStringCacheField = FSTStreamDecoder.class.getDeclaredField("ascStringCache"); + } catch (Exception e) { + throw new IllegalStateException(e); + } + ascStringCacheField.setAccessible(true); + chBufField.setAccessible(true); + } + + private FSTConfiguration fstConfiguration; + + FSTDefaultStreamCoderFactory(FSTConfiguration fstConfiguration) { + this.fstConfiguration = fstConfiguration; + } + + @Override + public FSTEncoder createStreamEncoder() { + return new FSTStreamEncoder(fstConfiguration); + } + + @Override + public FSTDecoder createStreamDecoder() { + return new FSTStreamDecoder(fstConfiguration) { + @Override + public String readStringUTF() throws IOException { + try { + String res = super.readStringUTF(); + chBufField.set(this, null); + return res; + } catch (Exception e) { + throw new IOException(e); + } + } + + @Override + public String readStringAsc() throws IOException { + try { + String res = super.readStringAsc(); + ascStringCacheField.set(this, null); + return res; + } catch (Exception e) { + throw new IOException(e); + } + } + }; + } + + static ThreadLocal input = new ThreadLocal(); + static ThreadLocal output = new ThreadLocal(); + + @Override + public ThreadLocal getInput() { + return input; + } + + @Override + public ThreadLocal getOutput() { + return output; + } + + } + + private static class InstanceHolder { + private static final FSTConfiguration INSTANCE = FSTConfiguration.createDefaultConfiguration(); + static { + INSTANCE.setStreamCoderFactory(new FSTDefaultStreamCoderFactory(INSTANCE)); + } + } + + public FSTConfiguration getConfig() { + return InstanceHolder.INSTANCE; + } +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/serializer/json/EmojiJsonSerializer.java b/yami-shop-common/src/main/java/com/yami/shop/common/serializer/json/EmojiJsonSerializer.java new file mode 100644 index 0000000..c5ae6b2 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/serializer/json/EmojiJsonSerializer.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.serializer.json; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.emoji.EmojiUtil; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import lombok.SneakyThrows; +import org.springframework.stereotype.Component; + +/** + * 带有emoji字符串的json序列化 + * @author LGH + */ +@Component +public class EmojiJsonSerializer extends JsonSerializer { + + @Override + @SneakyThrows + public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) { + gen.writeString(EmojiUtil.toUnicode(StrUtil.isBlank(value)? "" : value)); + } +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/serializer/json/ImgJsonSerializer.java b/yami-shop-common/src/main/java/com/yami/shop/common/serializer/json/ImgJsonSerializer.java new file mode 100644 index 0000000..3d4c922 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/serializer/json/ImgJsonSerializer.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.serializer.json; + +import cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.yami.shop.common.bean.Qiniu; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.IOException; + +@Component +public class ImgJsonSerializer extends JsonSerializer { + + @Autowired + private Qiniu qiniu; + + @Override + public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + if (StrUtil.isBlank(value)) { + gen.writeString(StrUtil.EMPTY); + return; + } + String[] imgs = value.split(StrUtil.COMMA); + StringBuilder sb = new StringBuilder(); + for (String img : imgs) { + sb.append(qiniu.getResourcesUrl()).append(img).append(StrUtil.COMMA); + } + sb.deleteCharAt(sb.length()-1); + gen.writeString(sb.toString()); + } +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/serializer/redis/FstRedisSerializer.java b/yami-shop-common/src/main/java/com/yami/shop/common/serializer/redis/FstRedisSerializer.java new file mode 100644 index 0000000..37b6ad8 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/serializer/redis/FstRedisSerializer.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.serializer.redis; + +import com.yami.shop.common.serializer.FSTSerializer; +import lombok.SneakyThrows; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.lang.Nullable; + +/** + * 使用fst 进行reids的序列化 + * @author LGH + */ +public class FstRedisSerializer implements RedisSerializer { + + private static final byte[] EMPTY_ARRAY = new byte[0]; + + @Override + @SneakyThrows + public byte[] serialize(Object o) { + if (o == null) { + return EMPTY_ARRAY; + } + return new FSTSerializer().getConfig().asByteArray(o); + } + + @Override + @SneakyThrows + public Object deserialize(byte[] bytes) { + if (isEmpty(bytes)) { + return null; + } + return new FSTSerializer().getConfig().asObject(bytes); + } + + private static boolean isEmpty(@Nullable byte[] data) { + return (data == null || data.length == 0); + } +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/serializer/redisson/FstCodec.java b/yami-shop-common/src/main/java/com/yami/shop/common/serializer/redisson/FstCodec.java new file mode 100644 index 0000000..526b13f --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/serializer/redisson/FstCodec.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.serializer.redisson; + +import java.io.IOException; + +import com.yami.shop.common.serializer.FSTSerializer; +import org.nustaq.serialization.FSTConfiguration; +import org.nustaq.serialization.FSTObjectInput; +import org.nustaq.serialization.FSTObjectOutput; +import org.redisson.client.codec.BaseCodec; +import org.redisson.client.handler.State; +import org.redisson.client.protocol.Decoder; +import org.redisson.client.protocol.Encoder; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.buffer.ByteBufInputStream; +import io.netty.buffer.ByteBufOutputStream; + +/** + * 被redisson使用 + * Efficient and speedy serialization codec fully + * compatible with JDK Serialization codec. + * + * https://github.com/RuedigerMoeller/fast-serialization + * + * @author Nikita Koksharov + * + */ +public class FstCodec extends BaseCodec { + + + private final FSTConfiguration config; + + public FstCodec() { + config = new FSTSerializer().getConfig(); + } + + + private final Decoder decoder = new Decoder() { + @Override + public Object decode(ByteBuf buf, State state) throws IOException { + ByteBufInputStream in = new ByteBufInputStream(buf); + FSTObjectInput inputStream = config.getObjectInput(in); + try { + return inputStream.readObject(); + } catch (IOException e) { + throw e; + } catch (Exception e) { + throw new IOException(e); + } + } + }; + + private final Encoder encoder = new Encoder() { + + @Override + public ByteBuf encode(Object in) throws IOException { + ByteBuf out = ByteBufAllocator.DEFAULT.buffer(); + ByteBufOutputStream os = new ByteBufOutputStream(out); + FSTObjectOutput oos = config.getObjectOutput(os); + try { + oos.writeObject(in); + oos.flush(); + return os.buffer(); + } catch (IOException e) { + out.release(); + throw e; + } catch (Exception e) { + out.release(); + throw new IOException(e); + } + } + }; + + @Override + public Decoder getValueDecoder() { + return decoder; + } + + @Override + public Encoder getValueEncoder() { + return encoder; + } + + @Override + public ClassLoader getClassLoader() { + if (config.getClassLoader() != null) { + return config.getClassLoader(); + } + + return super.getClassLoader(); + } + +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/serializer/springfox/SpringFoxJsonSerializerConfig.java b/yami-shop-common/src/main/java/com/yami/shop/common/serializer/springfox/SpringFoxJsonSerializerConfig.java new file mode 100644 index 0000000..a5122ec --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/serializer/springfox/SpringFoxJsonSerializerConfig.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.serializer.springfox; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import springfox.documentation.spring.web.json.JacksonModuleRegistrar; +import springfox.documentation.spring.web.json.JsonSerializer; + +import java.util.List; + +/** + * @author LGH + */ +@Configuration +public class SpringFoxJsonSerializerConfig { + + @Bean + @Primary + public JsonSerializer yamiSpringfoxJsonSerializer(List moduleRegistrars) { + return new SpringfoxJsonSerializer(moduleRegistrars); + } +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/serializer/springfox/SpringfoxJsonSerializer.java b/yami-shop-common/src/main/java/com/yami/shop/common/serializer/springfox/SpringfoxJsonSerializer.java new file mode 100644 index 0000000..1ce03ce --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/serializer/springfox/SpringfoxJsonSerializer.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.serializer.springfox; + +import io.swagger.models.Operation; +import io.swagger.models.Swagger; +import io.swagger.models.parameters.Parameter; +import springfox.documentation.spring.web.json.JacksonModuleRegistrar; +import springfox.documentation.spring.web.json.Json; +import springfox.documentation.spring.web.json.JsonSerializer; + +import java.util.List; + +/** + * 自定义Swagger 的序列化,去除分页参数中的records值 + * @author LGH + */ +public class SpringfoxJsonSerializer extends JsonSerializer { + + public SpringfoxJsonSerializer(List modules) { + super(modules); + } + + @Override + public Json toJson(Object toSerialize) { + if (!(toSerialize instanceof Swagger)) { + return super.toJson(toSerialize); + } + Swagger swagger = (Swagger)toSerialize; + + swagger.getPaths().forEach((key, path) ->{ + Operation get = path.getGet(); + if (get != null) { + + List parameters = get.getParameters(); + if (parameters != null) { + parameters.removeIf(parameter -> parameter.getName().startsWith("records[0].")); + } + } + }); + + return super.toJson(swagger); +// return super.toJson(toSerialize); + } +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/util/Arith.java b/yami-shop-common/src/main/java/com/yami/shop/common/util/Arith.java new file mode 100644 index 0000000..242c73d --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/util/Arith.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.util; + +import java.math.BigDecimal; + +public class Arith { + /** + * 默认除法运算精度 + */ + private static final int DEF_DIV_SCALE = 2; + + /** + * 这个类不能实例化 + */ + private Arith() { + } + + /** + * 提供精确的加法运算。. + * + * @param v1 被加数 + * @param v2 加数 + * @return 两个参数的和 + */ + public static double add(double v1, double v2) { + // 必须转换成String + 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).setScale(2,BigDecimal.ROUND_HALF_UP).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)); + return b1.divide(b2, scale, BigDecimal.ROUND_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 = new BigDecimal("1"); + return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); + } + + + /** + * @param bigDecimal + * @param bigDecimal2 + * @param bigDecimal3 + * @return + */ + public static double add(BigDecimal bigDecimal, BigDecimal bigDecimal2, BigDecimal bigDecimal3) { + return bigDecimal.add(bigDecimal2).add(bigDecimal3).doubleValue(); + } + + /** + * @param preDepositPrice + * @param finalPrice + * @return + */ + public static double add(BigDecimal preDepositPrice, BigDecimal finalPrice) { + return preDepositPrice.add(finalPrice).doubleValue(); + } +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/util/CacheManagerUtil.java b/yami-shop-common/src/main/java/com/yami/shop/common/util/CacheManagerUtil.java new file mode 100644 index 0000000..f8ba0fb --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/util/CacheManagerUtil.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.util; + +import lombok.AllArgsConstructor; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; +import org.springframework.stereotype.Component; + +@Component +@AllArgsConstructor +public class CacheManagerUtil { + + private CacheManager cacheManager; + + @SuppressWarnings({"unchecked"}) + public T getCache(String cacheName,String key) { + Cache cache = cacheManager.getCache(cacheName); + if (cache == null) { + return null; + } + Cache.ValueWrapper valueWrapper = cache.get(key); + if (valueWrapper == null) { + return null; + } + return (T)valueWrapper.get(); + } + + public void putCache(String cacheName,String key, Object value) { + Cache cache = cacheManager.getCache(cacheName); + if (cache != null) { + cache.put(key, value); + } + } + + public void evictCache(String cacheName,String key) { + Cache cache = cacheManager.getCache(cacheName); + if (cache != null) { + cache.evict(key); + } + } +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/util/HttpContextUtils.java b/yami-shop-common/src/main/java/com/yami/shop/common/util/HttpContextUtils.java new file mode 100644 index 0000000..08d491e --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/util/HttpContextUtils.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.util; + +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; + +public class HttpContextUtils { + + public static HttpServletRequest getHttpServletRequest() { + return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + } + + public static String getDomain(){ + HttpServletRequest request = getHttpServletRequest(); + StringBuffer url = request.getRequestURL(); + return url.delete(url.length() - request.getRequestURI().length(), url.length()).toString(); + } + + public static String getOrigin(){ + HttpServletRequest request = getHttpServletRequest(); + return request.getHeader("Origin"); + } +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/util/IPHelper.java b/yami-shop-common/src/main/java/com/yami/shop/common/util/IPHelper.java new file mode 100644 index 0000000..8826097 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/util/IPHelper.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.util; + +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; + +/** + * IP帮助工具 + */ +public class IPHelper { + private static final String UNKNOWN = "unknown"; + + /** + * 得到用户的真实地址,如果有多个就取第一个 + * + * @return + */ + public static String getIpAddr() { + HttpServletRequest request = HttpContextUtils.getHttpServletRequest(); + if (request == null) { + return null; + } + 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("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + String[] ips = ip.split(","); + return ips[0].trim(); + } + + +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/util/IdUtil.java b/yami-shop-common/src/main/java/com/yami/shop/common/util/IdUtil.java new file mode 100644 index 0000000..3dc94f0 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/util/IdUtil.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.util; + +import cn.hutool.core.lang.Snowflake; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +/** + * 进制转换工具,最大支持十进制和DICT.length()进制的转换 + * 1、将十进制的数字转换为指定进制的字符串; + * 2、将其它进制的数字(字符串形式)转换为十进制的数字 + * @author xuliugen + * @date 2018/04/23 + */ +@Component +public class IdUtil { + + @Autowired + private Snowflake snowflake; + + private static final String DICT = "0123456789abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"; + + private static final int SEED = DICT.length(); + + private static final int ID_MIN_LENGTH = 6; + /** + * 数字->字符映射 + */ + private static final char[] CHARS = DICT.toCharArray(); + /** + * 字符->数字映射 + */ + private static final Map NUMBERS = new HashMap<>(); + + static { + int len = CHARS.length; + for (int i = 0; i 0) { + int r = (int) (id % SEED); + shortURL.insert(0, CHARS[r]); + id = id / SEED; + } + int len = shortURL.length(); + while (len < ID_MIN_LENGTH) { + shortURL.insert(0, CHARS[0]); + len++; + } + return shortURL.toString(); + } + + /** + * 根据获得的短网址编码解析出数据库中对应的记录ID + * @param key 短网址 eg. RwTji8, GijT7Y等等 + * @return + */ + public static long decode(String key) { + char[] shorts = key.toCharArray(); + int len = shorts.length; + long id = 0L; + for (int i = 0; i < len; i++) { + id = id + (long) (NUMBERS.get(shorts[i]) * Math.pow(SEED, len-i-1)); + } + return id; + } + + + public String nextShortId() { + return encode(snowflake.nextId()); + } +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/util/Json.java b/yami-shop-common/src/main/java/com/yami/shop/common/util/Json.java new file mode 100644 index 0000000..143a219 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/util/Json.java @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.util; + + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonGenerator.Feature; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.*; + +public class Json { + + private static ObjectMapper objectMapper = new ObjectMapper(); + + static { + // 是否缩放排列输出,默认false,有些场合为了便于排版阅读则需要对输出做缩放排列 +// objectMapper.enable(SerializationFeature.INDENT_OUTPUT); + // 序列化日期时以timestamps输出,默认true + // objectMapper.enable(SerializationFeature.INDENT_OUTPUT); + // 序列化枚举是以toString()来输出,默认false,即默认以name()来输出 如:ENUM01("enum_01") 默认为 ENUM01,true则为enum_01 + // objectMapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); + // 序列化枚举是以ordinal()来输出,默认false 如:ENUM01("enum_01") 默认为 ENUM01,true则为 0 非常危险 + // objectMapper.enable(SerializationFeature.WRITE_ENUMS_USING_INDEX); + // 序列化Map时对key进行排序操作,默认false + // objectMapper.enable(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS); + // 序列化char[]时以json数组输出,默认false + //objectMapper.enable(SerializationFeature.WRITE_CHAR_ARRAYS_AS_JSON_ARRAYS); + //序列化BigDecimal时之间输出原始数字还是科学计数,默认false,即是否以toPlainString()科学计数方式来输出 + // 1E+20 -> 100000000000000000000 +// objectMapper.enable(Feature.WRITE_BIGDECIMAL_AS_PLAIN); + + // 如果为空则不输出 + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); + // 对于空的对象转json的时候不抛出错误 + objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); + // 禁用序列化日期为timestamps + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + // 禁用遇到未知属性抛出异常 + objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + // 视空字符传为null +// objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT); + + // 低层级配置 +// objectMapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true); + // 允许属性名称没有引号 +// objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); + // 允许单引号 +// objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); + // 取消对非ASCII字符的转码 + objectMapper.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, false); + + } + + /** + * 对象转json + * @param object + * @return + */ + public static String toJsonString(Object object) { + try { + return objectMapper.writeValueAsString(object); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return null; + } + + /** + * json转换换成对象 + * @param json + * @param clazz + * @return + */ + public static T parseObject(String json, Class clazz) { + T result = null; + try { + result = objectMapper.readValue(json, clazz); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + public static ObjectMapper getObjectMapper() { + return objectMapper; + } + + + /** + * * https://stackoverflow.com/questions/6349421/how-to-use-jackson-to-deserialise-an-array-of-objects + * * List myObjects = Arrays.asList(mapper.readValue(json, MyClass[].class)) + * * works up to 10 time faster than TypeRefence. + * @return + */ + public static List parseArray(String json, Class clazz){ + T[] result = null; + try { + result = objectMapper.readValue(json, clazz); + } catch (Exception e) { + e.printStackTrace(); + } + if (result == null) { + return Collections.emptyList(); + } + return Arrays.asList(result); + } + + + /** + * 转换成json节点,即map + * @param jsonStr + * @return + */ + public static JsonNode parseJson(String jsonStr) { + JsonNode jsonNode = null; + try { + jsonNode = objectMapper.readTree(jsonStr); + } catch (Exception e) { + e.printStackTrace(); + } + return jsonNode; + } + +// public static void main(String[] args){ +// String arr = "[1.01,1.03,1.23]"; +// +// List doubles = parseArray(arr, Double[].class); +// for (Double aDouble : doubles) { +// System.out.println(aDouble); +// } +// +// } +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/util/PageAdapter.java b/yami-shop-common/src/main/java/com/yami/shop/common/util/PageAdapter.java new file mode 100644 index 0000000..ee59819 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/util/PageAdapter.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.util; + +import cn.hutool.core.util.PageUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.Data; + +@Data +public class PageAdapter{ + + private int begin; + + private int end; + + public PageAdapter(Page page) { + int[] startEnd = PageUtil.transToStartEnd((int) page.getCurrent(), (int) page.getSize()); + this.begin = startEnd[0]; + this.end = startEnd[1]; + } +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/util/PageParam.java b/yami-shop-common/src/main/java/com/yami/shop/common/util/PageParam.java new file mode 100644 index 0000000..475ae9a --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/util/PageParam.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.util; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiParam; + +import java.util.List; +public class PageParam extends Page { + + /** + * 查询数据列表 + */ + @ApiParam(hidden = true) + private List records; + /** + * 总数 + */ + @ApiParam(hidden = true) + private long total = 0; + + /** + * 每页显示条数,默认 10 + */ + @ApiParam(value = "每页大小,默认10",required = false, defaultValue = "10") + private long size = 10; + + /** + * 当前页 + */ + @ApiParam(value = "当前页,默认1",required = false,defaultValue = "1") + private long current = 1; + + /** + * 是否进行 count 查询 + */ + @ApiParam(hidden = true) + private boolean isSearchCount = true; + + @Override + @ApiParam(hidden = true) + public List getRecords() { + return this.records; + } + + @Override + public Page setRecords(List records) { + this.records = records; + return this; + } + + @Override + public long getTotal() { + return this.total; + } + + @Override + public Page setTotal(long total) { + this.total = total; + return this; + } + + @ApiParam(hidden = true) + public boolean getSearchCount() { + if (total < 0) { + return false; + } + return isSearchCount; + } + + @Override + @ApiParam(hidden = true) + public boolean isSearchCount() { + if (total < 0) { + return false; + } + return isSearchCount; + } + + @Override + public Page setSearchCount(boolean isSearchCount) { + this.isSearchCount = isSearchCount; + return this; + } + + @Override + public long getSize() { + return this.size; + } + + @Override + public Page setSize(long size) { + this.size = size; + return this; + } + + @Override + public long getCurrent() { + return this.current; + } + + @Override + public Page setCurrent(long current) { + this.current = current; + return this; + } +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/util/RedisUtil.java b/yami-shop-common/src/main/java/com/yami/shop/common/util/RedisUtil.java new file mode 100644 index 0000000..e6c7a6e --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/util/RedisUtil.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.util; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.util.CollectionUtils; + +public class RedisUtil { + private static RedisTemplate redisTemplate = SpringContextUtils.getBean("redisTemplate",RedisTemplate.class); + + //=============================common============================ + /** + * 指定缓存失效时间 + * @param key 键 + * @param time 时间(秒) + * @return + */ + public static boolean expire(String key,long time){ + try { + if(time>0){ + redisTemplate.expire(key, time, TimeUnit.SECONDS); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 失效时间为负数,说明该主键未设置失效时间(失效时间默认为-1) + */ + public static long getExpire(String key){ + return redisTemplate.getExpire(key,TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * @param key 键 + * @return true 存在 false 不存在 + */ + public static boolean hasKey(String key){ + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public static void del(String ... key){ + if(key!=null&&key.length>0){ + if(key.length==1){ + redisTemplate.delete(key[0]); + }else{ + redisTemplate.delete(CollectionUtils.arrayToList(key)); + } + } + } + + //============================String============================= + /** + * 普通缓存获取 + * @param key 键 + * @return 值 + */ + @SuppressWarnings("unchecked") + public static T get(String key){ + return key==null?null:(T)redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public static boolean set(String key,Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + + } + + /** + * 普通缓存放入并设置时间 + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public static boolean set(String key,Object value,long time){ + try { + if(time>0){ + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + }else{ + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 递增 此时value值必须为int类型 否则报错 + * @param key 键 + * @param delta 要增加几(大于0) + * @return + */ + public static long incr(String key, long delta){ + if(delta<0){ + throw new RuntimeException("递增因子必须大于0"); + } + return redisTemplate.opsForValue().increment(key, delta); + } + + /** + * 递减 + * @param key 键 + * @param delta 要减少几(小于0) + * @return + */ + public static long decr(String key, long delta){ + if(delta<0){ + throw new RuntimeException("递减因子必须大于0"); + } + return redisTemplate.opsForValue().increment(key, -delta); + } +} \ No newline at end of file diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/util/SimpleCaptcha.java b/yami-shop-common/src/main/java/com/yami/shop/common/util/SimpleCaptcha.java new file mode 100644 index 0000000..876703e --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/util/SimpleCaptcha.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.util; + +import cn.hutool.captcha.LineCaptcha; +import cn.hutool.core.util.ImageUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; + +import java.awt.*; +import java.awt.image.BufferedImage; +import java.util.concurrent.ThreadLocalRandom; + +public class SimpleCaptcha extends LineCaptcha{ + + private static final long serialVersionUID = -9042552338521307038L; + + private static final String CAPTCHA_CODE = "abcdefhjkmnpqrstuvwxyz2345678"; + + public SimpleCaptcha(int width, int height, int codeCount, int interfereCount) { + + super(width, height, codeCount, interfereCount); + } + + @Override + protected void generateCode() { + this.code = RandomUtil.randomString(CAPTCHA_CODE,this.generator.getLength()); + } + + @Override + public Image createImage(String code) { + // 图像buffer + final BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + final ThreadLocalRandom random = RandomUtil.getRandom(); + final Graphics2D g = ImageUtil.createGraphics(image, new Color(249,249,249)); + + // 干扰线 + drawInterfere(g, random); + + // 创建字体 + g.setFont(this.font); + final FontMetrics metrics = g.getFontMetrics(); + int minY = metrics.getAscent() - metrics.getLeading() - metrics.getDescent(); + // 文字 + final int len = this.generator.getLength(); + int charWidth = width / len; + for (int i = 0; i < len; i++) { + // 产生随机的颜色值,让输出的每个字符的颜色值都将不同。 + g.setColor(ImageUtil.randomColor(random)); + g.drawString(String.valueOf(code.charAt(i)), i * charWidth, RandomUtil.randomInt(minY, this.height)); + } + + return image; + } + + /** + * 绘制干扰线 + * + * @param g {@link Graphics2D}画笔 + * @param random 随机对象 + */ + private void drawInterfere(Graphics2D g, ThreadLocalRandom random) { + // 干扰线 + for (int i = 0; i < this.interfereCount; i++) { + int xs = random.nextInt(width); + int ys = random.nextInt(height); + int xe = xs + random.nextInt(width / 8); + int ye = ys + random.nextInt(height / 8); + g.setColor(ImageUtil.randomColor(random)); + g.drawLine(xs, ys, xe, ye); + } + } + +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/util/SpelUtil.java b/yami-shop-common/src/main/java/com/yami/shop/common/util/SpelUtil.java new file mode 100644 index 0000000..7b7ef3c --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/util/SpelUtil.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.util; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import org.springframework.context.expression.MethodBasedEvaluationContext; +import org.springframework.core.LocalVariableTableParameterNameDiscoverer; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; +import java.lang.reflect.Method; + +/** + * 解析SPEL 表达式 + * @author huxingnan + * @date 2018/5/21 10:51 + */ +public class SpelUtil { + + /** + * 支持 #p0 参数索引的表达式解析 + * @param rootObject 根对象,method 所在的对象 + * @param spel 表达式 + * @param method ,目标方法 + * @param args 方法入参 + * @return 解析后的字符串 + */ + public static String parse(Object rootObject,String spel, Method method, Object[] args) { + if (StrUtil.isBlank(spel)) { + return StrUtil.EMPTY; + } + //获取被拦截方法参数名列表(使用Spring支持类库) + LocalVariableTableParameterNameDiscoverer u = + new LocalVariableTableParameterNameDiscoverer(); + String[] paraNameArr = u.getParameterNames(method); + if (ArrayUtil.isEmpty(paraNameArr)) { + return spel; + } + //使用SPEL进行key的解析 + ExpressionParser parser = new SpelExpressionParser(); + //SPEL上下文 + StandardEvaluationContext context = new MethodBasedEvaluationContext(rootObject,method,args,u); + //把方法参数放入SPEL上下文中 + for (int i = 0; i < paraNameArr.length; i++) { + context.setVariable(paraNameArr[i], args[i]); + } + return parser.parseExpression(spel).getValue(context, String.class); + } +} diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/util/SpringContextUtils.java b/yami-shop-common/src/main/java/com/yami/shop/common/util/SpringContextUtils.java new file mode 100644 index 0000000..2629dcd --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/util/SpringContextUtils.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.util; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +/** + * Spring Context 工具类 + * @author lgh + */ +@Component +public class SpringContextUtils implements ApplicationContextAware { + public static ApplicationContext applicationContext; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) + throws BeansException { + SpringContextUtils.applicationContext = applicationContext; + } + + public static Object getBean(String name) { + return applicationContext.getBean(name); + } + + public static T getBean(String name, Class requiredType) { + return applicationContext.getBean(name, requiredType); + } + + public static boolean containsBean(String name) { + return applicationContext.containsBean(name); + } + + public static boolean isSingleton(String name) { + return applicationContext.isSingleton(name); + } + + public static Class getType(String name) { + return applicationContext.getType(name); + } + +} \ No newline at end of file diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/xss/XssUtil.java b/yami-shop-common/src/main/java/com/yami/shop/common/xss/XssUtil.java new file mode 100644 index 0000000..cc42104 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/xss/XssUtil.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.xss; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.safety.Whitelist; +/** + * 描述: 过滤 HTML 标签中 XSS 代码 + * @author lgh + */ +public class XssUtil { + /** + * 使用自带的 basicWithImages 白名单 + */ + private static final Whitelist WHITE_LIST = Whitelist.relaxed(); + /** 配置过滤化参数, 不对代码进行格式化 */ + private static final Document.OutputSettings OUTPUT_SETTINGS = new Document.OutputSettings().prettyPrint(false); + static { + // 富文本编辑时一些样式是使用 style 来进行实现的 + // 比如红色字体 style="color:red;" + // 所以需要给所有标签添加 style 属性 + WHITE_LIST.addAttributes(":all", "style"); + } + public static String clean(String content) { + return Jsoup.clean(content, "", WHITE_LIST, OUTPUT_SETTINGS); + } +} \ No newline at end of file diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/xss/XssWrapper.java b/yami-shop-common/src/main/java/com/yami/shop/common/xss/XssWrapper.java new file mode 100644 index 0000000..10013c5 --- /dev/null +++ b/yami-shop-common/src/main/java/com/yami/shop/common/xss/XssWrapper.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.common.xss; + +import cn.hutool.core.util.StrUtil; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; + +/** + * xss 攻击过滤 + * @author lgh + */ +public class XssWrapper extends HttpServletRequestWrapper { + /** + * Constructs a request object wrapping the given request. + * + * @param request The request to wrap + * @throws IllegalArgumentException if the request is null + */ + public XssWrapper(HttpServletRequest request) { + super(request); + } + + /** + * 对数组参数进行特殊字符过滤 + */ + @Override + public String[] getParameterValues(String name) { + String[] values = super.getParameterValues(name); + if (values == null) { + return null; + } + int count = values.length; + String[] encodedValues = new String[count]; + for (int i = 0; i < count; i++) { + encodedValues[i] = cleanXSS(values[i]); + } + return encodedValues; + } + + /** + * 对参数中特殊字符进行过滤 + */ + @Override + public String getParameter(String name) { + String value = super.getParameter(name); + if (StrUtil.isBlank(value)) { + return value; + } + return cleanXSS(value); + } + + /** + * 获取attribute,特殊字符过滤 + */ + @Override + public Object getAttribute(String name) { + Object value = super.getAttribute(name); + if (value instanceof String && StrUtil.isNotBlank((String) value)) { + return cleanXSS((String) value); + } + return value; + } + + /** + * 对请求头部进行特殊字符过滤 + */ + @Override + public String getHeader(String name) { + String value = super.getHeader(name); + if (StrUtil.isBlank(value)) { + return value; + } + return cleanXSS(value); + } + + private String cleanXSS(String value) { + return XssUtil.clean(value); + } +} diff --git a/yami-shop-common/src/main/resources/shop.properties b/yami-shop-common/src/main/resources/shop.properties new file mode 100644 index 0000000..9072f9e --- /dev/null +++ b/yami-shop-common/src/main/resources/shop.properties @@ -0,0 +1,10 @@ +shop.qiniu.resourcesUrl=http://img-test.gz-yami.com/ +shop.qiniu.accessKey=**** +shop.qiniu.secretKey=**** +shop.qiniu.bucket=**** + +shop.aLiDaYu.accessKeyId= +shop.aLiDaYu.accessKeySecret= +shop.aLiDaYu.signName= + +shop.tokenAesKey=q5e6w6w9f4q497te diff --git a/yami-shop-mp/pom.xml b/yami-shop-mp/pom.xml new file mode 100644 index 0000000..01098e2 --- /dev/null +++ b/yami-shop-mp/pom.xml @@ -0,0 +1,21 @@ + + + + yami-shop + com.yami.shop + 0.0.1-SNAPSHOT + + 4.0.0 + + yami-shop-mp + + + + com.yami.shop + yami-shop-security + ${yami.shop.version} + + + \ No newline at end of file diff --git a/yami-shop-mp/src/main/java/com/yami/shop/mp/builder/AbstractBuilder.java b/yami-shop-mp/src/main/java/com/yami/shop/mp/builder/AbstractBuilder.java new file mode 100644 index 0000000..e32195d --- /dev/null +++ b/yami-shop-mp/src/main/java/com/yami/shop/mp/builder/AbstractBuilder.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.mp.builder; + +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.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Binary Wang(https://github.com/binarywang) + */ +public abstract class AbstractBuilder { + protected final Logger logger = LoggerFactory.getLogger(getClass()); + + public abstract WxMpXmlOutMessage build(String content, + WxMpXmlMessage wxMessage, WxMpService service); +} diff --git a/yami-shop-mp/src/main/java/com/yami/shop/mp/builder/ImageBuilder.java b/yami-shop-mp/src/main/java/com/yami/shop/mp/builder/ImageBuilder.java new file mode 100644 index 0000000..f17e717 --- /dev/null +++ b/yami-shop-mp/src/main/java/com/yami/shop/mp/builder/ImageBuilder.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.mp.builder; + +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutImageMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; + +/** + * @author Binary Wang(https://github.com/binarywang) + */ +public class ImageBuilder extends AbstractBuilder { + + @Override + public WxMpXmlOutMessage build(String content, WxMpXmlMessage wxMessage, + WxMpService service) { + + WxMpXmlOutImageMessage m = WxMpXmlOutMessage.IMAGE().mediaId(content) + .fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()) + .build(); + + return m; + } + +} diff --git a/yami-shop-mp/src/main/java/com/yami/shop/mp/builder/TextBuilder.java b/yami-shop-mp/src/main/java/com/yami/shop/mp/builder/TextBuilder.java new file mode 100644 index 0000000..78644fe --- /dev/null +++ b/yami-shop-mp/src/main/java/com/yami/shop/mp/builder/TextBuilder.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.mp.builder; + + +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutTextMessage; + +/** + * @author Binary Wang(https://github.com/binarywang) + */ +public class TextBuilder extends AbstractBuilder { + + @Override + public WxMpXmlOutMessage build(String content, WxMpXmlMessage wxMessage, + WxMpService service) { + WxMpXmlOutTextMessage m = WxMpXmlOutMessage.TEXT().content(content) + .fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()) + .build(); + return m; + } + +} diff --git a/yami-shop-mp/src/main/java/com/yami/shop/mp/component/WxMaInRedisConfig.java b/yami-shop-mp/src/main/java/com/yami/shop/mp/component/WxMaInRedisConfig.java new file mode 100644 index 0000000..d89efd6 --- /dev/null +++ b/yami-shop-mp/src/main/java/com/yami/shop/mp/component/WxMaInRedisConfig.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.mp.component; + +import cn.binarywang.wx.miniapp.config.WxMaInMemoryConfig; +import com.yami.shop.common.annotation.RedisLock; +import com.yami.shop.common.util.RedisUtil; +import com.yami.shop.mp.config.bean.WxMiniApp; +import me.chanjar.weixin.common.bean.WxAccessToken; +import org.redisson.api.RedissonClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.concurrent.locks.Lock; + +/** + * 基于Redis的微信配置provider. + * + * 已加入分布式锁的实现 + * + * @author LGH + */ +@Component +public class WxMaInRedisConfig extends WxMaInMemoryConfig { + + private static final String ACCESS_TOKEN_KEY = "wxMa:access_token:"; + + private static final String JSAPI_TICKET_KEY = "wxMa:jsapi_ticket:"; + + private static final String CARD_API_TICKET_KEY = "wxMa:card_api_ticket:"; + + private static final String WX_MA_ACCESS_TOKEN_LOCK = "wxMa:access_token_lock:"; + + private static final String WX_MA_JSAPI_TICKET_LOCK = "wxMa:jsapi_ticket_lock:"; + + private static final String WX_MA_CARD_API_TICKET_LOCK = "wxMa:card_api_ticket_lock:"; + + private String accessTokenKey; + + private String jsapiTicketKey; + + private String cardApiTicketKey; + + @Autowired + private RedissonClient redissonClient; + + public WxMaInRedisConfig (WxMiniApp wxMiniApp) { + this.setAppid(wxMiniApp.getAppid()); + this.setSecret(wxMiniApp.getSecret()); + } + + /** + * 每个公众号生成独有的存储key. + */ + @Override + public void setAppid(String appId) { + super.setAppid(appId); + this.accessTokenKey = ACCESS_TOKEN_KEY.concat(appId); + this.jsapiTicketKey = JSAPI_TICKET_KEY.concat(appId); + this.cardApiTicketKey = CARD_API_TICKET_KEY.concat(appId); + } + + @Override + public String getAccessToken() { + return RedisUtil.get(accessTokenKey); + } + + @Override + public Lock getAccessTokenLock(){ + return redissonClient.getLock(WX_MA_ACCESS_TOKEN_LOCK); + } + + @Override + public boolean isAccessTokenExpired() { + return !RedisUtil.hasKey(accessTokenKey); + } + + @Override + public void expireAccessToken() { + RedisUtil.del(accessTokenKey); + } + + @Override + @RedisLock(lockName = "updateMaAccessToken") + public void updateAccessToken(WxAccessToken accessToken) { + updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn()); + } + + + @Override + @RedisLock(lockName = "updateMaAccessToken") + public void updateAccessToken(String accessToken, int expiresInSeconds) { + RedisUtil.set(accessTokenKey, accessToken, expiresInSeconds - 200); + } + + @Override + public String getJsapiTicket() { + return RedisUtil.get(jsapiTicketKey); + } + + @Override + public Lock getJsapiTicketLock() { + return redissonClient.getLock(WX_MA_JSAPI_TICKET_LOCK); + } + + @Override + public boolean isJsapiTicketExpired() { + return !RedisUtil.hasKey(jsapiTicketKey); + } + + @Override + public void expireJsapiTicket() { + RedisUtil.del(jsapiTicketKey); + } + + @Override + @RedisLock(lockName = "updateMaJsapiTicket") + public void updateJsapiTicket(String jsapiTicket, int expiresInSeconds) { + RedisUtil.set(jsapiTicketKey, jsapiTicket, expiresInSeconds - 200); + } + + @Override + public String getCardApiTicket() { + return RedisUtil.get(cardApiTicketKey); + } + + @Override + public Lock getCardApiTicketLock() { + return redissonClient.getLock(WX_MA_CARD_API_TICKET_LOCK); + } + + @Override + public boolean isCardApiTicketExpired() { + return !RedisUtil.hasKey(cardApiTicketKey); + } + + @Override + public void expireCardApiTicket() { + RedisUtil.del(cardApiTicketKey); + } + + @Override + @RedisLock(lockName = "updateMaCardJsapiTicket") + public void updateCardApiTicket(String cardApiTicket, int expiresInSeconds) { + RedisUtil.set(cardApiTicketKey, cardApiTicket, expiresInSeconds - 200); + } + +} diff --git a/yami-shop-mp/src/main/java/com/yami/shop/mp/component/WxMpInRedisConfigStorage.java b/yami-shop-mp/src/main/java/com/yami/shop/mp/component/WxMpInRedisConfigStorage.java new file mode 100644 index 0000000..cf9f384 --- /dev/null +++ b/yami-shop-mp/src/main/java/com/yami/shop/mp/component/WxMpInRedisConfigStorage.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.mp.component; + +import com.yami.shop.common.annotation.RedisLock; +import com.yami.shop.common.util.RedisUtil; +import com.yami.shop.mp.config.bean.WxMp; +import me.chanjar.weixin.common.bean.WxAccessToken; +import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage; +import me.chanjar.weixin.mp.enums.TicketType; +import org.springframework.stereotype.Component; + +/** + * 基于Redis的微信配置provider. + * + * 已加入分布式锁的实现 + * + * @author LGH + */ +@Component +public class WxMpInRedisConfigStorage extends WxMpInMemoryConfigStorage { + + private static final String ACCESS_TOKEN_KEY = "wxMp:access_token:"; + + private String accessTokenKey; + + public WxMpInRedisConfigStorage (WxMp wxMp) { + this.setAppId(wxMp.getAppid()); + this.setSecret(wxMp.getSecret()); + this.setToken(wxMp.getToken()); + this.setAesKey(wxMp.getAesKey()); + } + + /** + * 每个公众号生成独有的存储key. + */ + @Override + public void setAppId(String appId) { + super.setAppId(appId); + this.accessTokenKey = ACCESS_TOKEN_KEY.concat(appId); + } + + private String getTicketRedisKey(TicketType type) { + return String.format("wx:ticket:key:%s:%s", this.appId, type.getCode()); + } + + @Override + public String getAccessToken() { + return RedisUtil.get(accessTokenKey); + } + + @Override + public boolean isAccessTokenExpired() { + return !RedisUtil.hasKey(accessTokenKey); + } + + @Override + @RedisLock(lockName = "updateMpAccessToken") + public void updateAccessToken(WxAccessToken accessToken) { + updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn()); + } + + + @Override + @RedisLock(lockName = "updateMpAccessToken") + public void updateAccessToken(String accessToken, int expiresInSeconds) { + RedisUtil.set(accessTokenKey, accessToken, expiresInSeconds - 200); + } + + @Override + public void expireAccessToken() { + RedisUtil.del(accessTokenKey); + } + + @Override + public String getTicket(TicketType type) { + return RedisUtil.get(this.getTicketRedisKey(type)); + } + + @Override + public boolean isTicketExpired(TicketType type) { + return !RedisUtil.hasKey(this.getTicketRedisKey(type)); + } + + @Override + @RedisLock(lockName = "updateMpJsapiTicket") + public void updateTicket(TicketType type, String jsapiTicket, int expiresInSeconds) { + RedisUtil.set(this.getTicketRedisKey(type), jsapiTicket, expiresInSeconds - 200); + } + + @Override + public void expireTicket(TicketType type) { + RedisUtil.del(this.getTicketRedisKey(type)); + } + +} diff --git a/yami-shop-mp/src/main/java/com/yami/shop/mp/config/WxMaConfiguration.java b/yami-shop-mp/src/main/java/com/yami/shop/mp/config/WxMaConfiguration.java new file mode 100644 index 0000000..45af904 --- /dev/null +++ b/yami-shop-mp/src/main/java/com/yami/shop/mp/config/WxMaConfiguration.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.mp.config; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; +import com.yami.shop.mp.component.WxMaInRedisConfig; +import lombok.AllArgsConstructor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 微信小程序配置文件 + * @author LGH + */ +@Configuration +@AllArgsConstructor +@ConditionalOnClass(WxMaService.class) +public class WxMaConfiguration { + + + private final WxMaInRedisConfig wxMaInRedisConfig; + + @Bean + public WxMaService wxMaService() { + WxMaService service = new WxMaServiceImpl(); + service.setWxMaConfig(wxMaInRedisConfig); + return service; + } + + +} diff --git a/yami-shop-mp/src/main/java/com/yami/shop/mp/config/WxMpConfiguration.java b/yami-shop-mp/src/main/java/com/yami/shop/mp/config/WxMpConfiguration.java new file mode 100644 index 0000000..26b07f9 --- /dev/null +++ b/yami-shop-mp/src/main/java/com/yami/shop/mp/config/WxMpConfiguration.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.mp.config; + +import com.yami.shop.mp.component.WxMpInRedisConfigStorage; +import com.yami.shop.mp.handler.MenuHandler; +import lombok.AllArgsConstructor; +import me.chanjar.weixin.mp.api.WxMpMessageRouter; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import static me.chanjar.weixin.common.api.WxConsts.MenuButtonType; +import static me.chanjar.weixin.common.api.WxConsts.XmlMsgType; + +/** + * 微信公众号配置文件 + * @author LGH + */ +@Configuration +@AllArgsConstructor +@ConditionalOnClass(WxMpService.class) +public class WxMpConfiguration { + + private final MenuHandler menuHandler; + private final WxMpInRedisConfigStorage wxMpInRedisConfigStorage; + + @Bean + public WxMpService wxMpService() { + WxMpService service = new WxMpServiceImpl(); + service.setWxMpConfigStorage(wxMpInRedisConfigStorage); + return service; + } + + @Bean + public WxMpMessageRouter messageRouter() { + final WxMpMessageRouter newRouter = new WxMpMessageRouter(wxMpService()); + + // 自定义菜单事件 + newRouter.rule().async(false).msgType(XmlMsgType.EVENT) + .event(MenuButtonType.CLICK).handler(this.menuHandler).end(); + + + return newRouter; + } + +} diff --git a/yami-shop-mp/src/main/java/com/yami/shop/mp/config/WxPayConfiguration.java b/yami-shop-mp/src/main/java/com/yami/shop/mp/config/WxPayConfiguration.java new file mode 100644 index 0000000..5d7f26e --- /dev/null +++ b/yami-shop-mp/src/main/java/com/yami/shop/mp/config/WxPayConfiguration.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.mp.config; + +import com.github.binarywang.wxpay.config.WxPayConfig; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; +import com.yami.shop.mp.config.bean.WxMiniApp; +import com.yami.shop.mp.config.bean.WxMp; +import com.yami.shop.mp.config.bean.WxPay; +import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Objects; + +/** + * 微信公众号配置文件 + * + * @author LGH + */ +@Configuration +@RequiredArgsConstructor +@ConditionalOnClass(WxPayService.class) +public class WxPayConfiguration { + + private final WxMp wxMp; + + private final WxMiniApp wxMiniApp; + + private final WxPay wxPay; + + @Value("${spring.profiles.active}") + private String profile; + + + @Bean + public WxPayService wxMiniPayService() { + return getWxMpPayServiceByAppId(wxMiniApp.getAppid()); + } + + @Bean + public WxPayService wxMpPayService() { + return getWxMpPayServiceByAppId(wxMp.getAppid()); + } + + + private WxPayService getWxMpPayServiceByAppId(String appid) { + WxPayConfig payConfig = new WxPayConfig(); + payConfig.setAppId(appid); + payConfig.setMchId(wxPay.getMchId()); + payConfig.setMchKey(wxPay.getMchKey()); + payConfig.setKeyPath(wxPay.getKeyPath()); + payConfig.setSignType(WxPayConstants.SignType.MD5); + + WxPayService wxPayService = new WxPayServiceImpl(); + + + if (Objects.equals(profile, "dev")) { + String sandboxSignKey = null; + try { + wxPayService.setConfig(payConfig); + sandboxSignKey = wxPayService.getSandboxSignKey(); + } catch (WxPayException e) { + e.printStackTrace(); + } + payConfig.setUseSandboxEnv(true); + payConfig.setMchKey(sandboxSignKey); + } + + wxPayService.setConfig(payConfig); + return wxPayService; + } +} diff --git a/yami-shop-mp/src/main/java/com/yami/shop/mp/config/bean/WxMiniApp.java b/yami-shop-mp/src/main/java/com/yami/shop/mp/config/bean/WxMiniApp.java new file mode 100644 index 0000000..6d82051 --- /dev/null +++ b/yami-shop-mp/src/main/java/com/yami/shop/mp/config/bean/WxMiniApp.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.mp.config.bean; + + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + +@Data +@Component +@PropertySource("classpath:ma.properties") +@ConfigurationProperties(prefix = "ma") +public class WxMiniApp { + /** + * 设置微信小程序的appid + */ + private String appid; + + /** + * 设置微信小程序的Secret + */ + private String secret; + +} diff --git a/yami-shop-mp/src/main/java/com/yami/shop/mp/config/bean/WxMp.java b/yami-shop-mp/src/main/java/com/yami/shop/mp/config/bean/WxMp.java new file mode 100644 index 0000000..05c6a32 --- /dev/null +++ b/yami-shop-mp/src/main/java/com/yami/shop/mp/config/bean/WxMp.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.mp.config.bean; + + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + +@Data +@Component +@PropertySource("classpath:mp.properties") +@ConfigurationProperties(prefix = "mp") +public class WxMp { + /** + * 设置微信公众号的appid + */ + private String appid; + + /** + * 设置微信公众号的Secret + */ + private String secret; + + /** + * 微信公众号消息加解密token + */ + private String token; + + /** + * 微信公众号消息加解密aesKey + */ + private String aesKey; +} diff --git a/yami-shop-mp/src/main/java/com/yami/shop/mp/config/bean/WxPay.java b/yami-shop-mp/src/main/java/com/yami/shop/mp/config/bean/WxPay.java new file mode 100644 index 0000000..cafa082 --- /dev/null +++ b/yami-shop-mp/src/main/java/com/yami/shop/mp/config/bean/WxPay.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.mp.config.bean; + + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + +@Data +@Component +@PropertySource("classpath:pay.properties") +@ConfigurationProperties(prefix = "pay") +public class WxPay { + /** + * 微信支付mchId + */ + private String mchId; + + /** + * 微信支付mchKey + */ + private String mchKey; + + /** + * 签名类型 + */ + private String signType; + + /** + * 支付证书路径 + */ + private String keyPath; + + +} diff --git a/yami-shop-mp/src/main/java/com/yami/shop/mp/controller/api/WxPortalController.java b/yami-shop-mp/src/main/java/com/yami/shop/mp/controller/api/WxPortalController.java new file mode 100644 index 0000000..6aca6b9 --- /dev/null +++ b/yami-shop-mp/src/main/java/com/yami/shop/mp/controller/api/WxPortalController.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.mp.controller.api; + +import me.chanjar.weixin.mp.api.WxMpMessageRouter; +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.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.web.bind.annotation.*; + +/** + */ +@RestController +@RequestMapping("/wx/portal") +public class WxPortalController { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private WxMpService wxMpService; + + @Autowired + private WxMpMessageRouter wxMpMessageRouter; + + /** + * 用来进行微信认证,也就是当在: + * 公众号官方管理后台->开发->基本配置->修改配置 时,需要进行的校验 + * + * @return + */ + @GetMapping(produces = "text/plain;charset=utf-8") + 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) { + + this.logger.info("\n接收到来自微信服务器的认证消息:[{}, {}, {}, {}]", signature, + timestamp, nonce, echostr); + if (StringUtils.isAnyBlank(signature, timestamp, nonce, echostr)) { + throw new IllegalArgumentException("请求参数非法,请核实!"); + } + + if (wxMpService.checkSignature(timestamp, nonce, signature)) { + return echostr; + } + + return "非法请求"; + } + + /** + * 接收公众号的消息 + * + * @return + */ + @PostMapping(produces = "application/xml; charset=UTF-8") + public String post(@RequestBody String requestBody, + @RequestParam("signature") String signature, + @RequestParam("timestamp") String timestamp, + @RequestParam("nonce") String nonce, + @RequestParam("openid") String openid, + @RequestParam(name = "encrypt_type", required = false) String encType, + @RequestParam(name = "msg_signature", required = false) String msgSignature) { + this.logger.info("\n接收微信请求:[openid=[{}], [signature=[{}], encType=[{}], msgSignature=[{}]," + + " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ", + openid, signature, encType, msgSignature, timestamp, nonce, requestBody); + + + String out = null; + if (encType == null) { + // 明文传输的消息 + WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(requestBody); + WxMpXmlOutMessage outMessage = this.route(inMessage); + if (outMessage == null) { + return ""; + } + + out = outMessage.toXml(); + } else if ("aes".equalsIgnoreCase(encType)) { + // aes加密的消息 + WxMpXmlMessage inMessage = WxMpXmlMessage.fromEncryptedXml(requestBody, wxMpService.getWxMpConfigStorage(), + timestamp, nonce, msgSignature); + this.logger.debug("\n消息解密后内容为:\n{} ", inMessage.toString()); + WxMpXmlOutMessage outMessage = this.route(inMessage); + if (outMessage == null) { + return ""; + } + + out = outMessage.toEncryptedXml(wxMpService.getWxMpConfigStorage()); + } + + this.logger.debug("\n组装回复信息:{}", out); + return out; + } + + private WxMpXmlOutMessage route(WxMpXmlMessage message) { + try { + return wxMpMessageRouter.route(message); + } catch (Exception e) { + this.logger.error("路由消息时出现异常!", e); + } + return null; + } + +} \ No newline at end of file diff --git a/yami-shop-mp/src/main/java/com/yami/shop/mp/handler/AbstractHandler.java b/yami-shop-mp/src/main/java/com/yami/shop/mp/handler/AbstractHandler.java new file mode 100644 index 0000000..8cf6017 --- /dev/null +++ b/yami-shop-mp/src/main/java/com/yami/shop/mp/handler/AbstractHandler.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.mp.handler; + +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Binary Wang(https://github.com/binarywang) + */ +public abstract class AbstractHandler implements WxMpMessageHandler { + protected Logger logger = LoggerFactory.getLogger(getClass()); +} diff --git a/yami-shop-mp/src/main/java/com/yami/shop/mp/handler/MenuHandler.java b/yami-shop-mp/src/main/java/com/yami/shop/mp/handler/MenuHandler.java new file mode 100644 index 0000000..db1d7f0 --- /dev/null +++ b/yami-shop-mp/src/main/java/com/yami/shop/mp/handler/MenuHandler.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.mp.handler; + +import me.chanjar.weixin.common.session.WxSessionManager; +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.Component; + +import java.util.Map; + +import static me.chanjar.weixin.common.api.WxConsts.MenuButtonType; + +/** + * @author Binary Wang(https://github.com/binarywang) + */ +@Component +public class MenuHandler extends AbstractHandler { + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, + Map context, WxMpService weixinService, + WxSessionManager sessionManager) { + + String msg = String.format("type:%s, event:%s, key:%s", + wxMessage.getMsgType(), wxMessage.getEvent(), + wxMessage.getEventKey()); + if (MenuButtonType.VIEW.equals(wxMessage.getEvent())) { + return null; + } + + return WxMpXmlOutMessage.TEXT().content(msg) + .fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()) + .build(); + } + +} diff --git a/yami-shop-mp/src/main/resources/ma.properties b/yami-shop-mp/src/main/resources/ma.properties new file mode 100644 index 0000000..5b3cc3b --- /dev/null +++ b/yami-shop-mp/src/main/resources/ma.properties @@ -0,0 +1,2 @@ +ma.appid= +ma.secret= \ No newline at end of file diff --git a/yami-shop-mp/src/main/resources/mp.properties b/yami-shop-mp/src/main/resources/mp.properties new file mode 100644 index 0000000..a3c4d4d --- /dev/null +++ b/yami-shop-mp/src/main/resources/mp.properties @@ -0,0 +1,4 @@ +mp.appid= +mp.secret= +mp.token= +mp.aesKey= diff --git a/yami-shop-mp/src/main/resources/pay.properties b/yami-shop-mp/src/main/resources/pay.properties new file mode 100644 index 0000000..8e802d4 --- /dev/null +++ b/yami-shop-mp/src/main/resources/pay.properties @@ -0,0 +1,3 @@ +pay.mchId= +pay.mchKey= +pay.keyPath=classpath:xxx.p12 \ No newline at end of file diff --git a/yami-shop-mp/src/main/resources/xxx.p12 b/yami-shop-mp/src/main/resources/xxx.p12 new file mode 100644 index 0000000..e69de29 diff --git a/yami-shop-quartz/pom.xml b/yami-shop-quartz/pom.xml new file mode 100644 index 0000000..cf6fe32 --- /dev/null +++ b/yami-shop-quartz/pom.xml @@ -0,0 +1,30 @@ + + + + yami-shop + com.yami.shop + 0.0.1-SNAPSHOT + + 4.0.0 + + yami-shop-quartz + + + + org.quartz-scheduler + quartz + + + com.yami.shop + yami-shop-service + ${yami.shop.version} + + + com.yami.shop + yami-shop-security + ${yami.shop.version} + + + \ No newline at end of file diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/config/QuartzCustomizerConfig.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/config/QuartzCustomizerConfig.java new file mode 100644 index 0000000..34097c5 --- /dev/null +++ b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/config/QuartzCustomizerConfig.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.quartz.config; + +import org.springframework.boot.autoconfigure.quartz.SchedulerFactoryBeanCustomizer; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; + +/** + */ +@Configuration +public class QuartzCustomizerConfig implements SchedulerFactoryBeanCustomizer { + @Override + public void customize(SchedulerFactoryBean schedulerFactoryBean) { + schedulerFactoryBean.setWaitForJobsToCompleteOnShutdown(true); + } +} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/config/QuartzJob.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/config/QuartzJob.java new file mode 100644 index 0000000..2fd3cf1 --- /dev/null +++ b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/config/QuartzJob.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.quartz.config; + +import com.yami.shop.quartz.event.ScheduleJobEvent; +import com.yami.shop.quartz.model.ScheduleJob; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.scheduling.annotation.EnableAsync; + +/** + * 该类将会被org.springframework.scheduling.quartz.SpringBeanJobFactory 实例化 + * 并使@Autowired 生效 + */ +@Slf4j +@DisallowConcurrentExecution +public class QuartzJob implements Job { + + @Autowired + private ApplicationEventPublisher publisher; + + /** + * 任务调度参数key + */ + public static final String JOB_PARAM_KEY = "JOB_PARAM_KEY"; + + @Override + @SneakyThrows + public void execute(JobExecutionContext jobExecutionContext) { + ScheduleJob sysJob = (ScheduleJob) jobExecutionContext.getMergedJobDataMap().get(JOB_PARAM_KEY); + publisher.publishEvent(new ScheduleJobEvent(sysJob)); + } + +} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/config/ScheduleManager.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/config/ScheduleManager.java new file mode 100644 index 0000000..2854c31 --- /dev/null +++ b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/config/ScheduleManager.java @@ -0,0 +1,168 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.quartz.config; + +import com.yami.shop.quartz.enums.ScheduleStatus; +import com.yami.shop.quartz.model.ScheduleJob; +import lombok.AllArgsConstructor; +import org.quartz.*; +import org.springframework.stereotype.Component; + +/** + * 定时任务工具类 + * + * @author lgh + */ +@Component +@AllArgsConstructor +public class ScheduleManager { + private final static String JOB_NAME = "TASK_"; + + private final Scheduler scheduler; + + /** + * 获取触发器key + */ + private TriggerKey getTriggerKey(ScheduleJob scheduleJob) { + return TriggerKey.triggerKey(JOB_NAME + scheduleJob.getJobId()); + } + + /** + * 获取jobKey + */ + private JobKey getJobKey(ScheduleJob scheduleJob) { + return JobKey.jobKey(JOB_NAME + scheduleJob.getJobId()); + } + + /** + * 获取表达式触发器 + */ + private CronTrigger getCronTrigger(ScheduleJob scheduleJob) { + try { + return (CronTrigger) scheduler.getTrigger(getTriggerKey(scheduleJob)); + } catch (SchedulerException e) { + throw new RuntimeException("获取定时任务CronTrigger出现异常", e); + } + } + + /** + * 创建定时任务 + */ + public void createScheduleJob(ScheduleJob scheduleJob) { + try { + //构建job信息 + JobDetail jobDetail = JobBuilder.newJob(QuartzJob.class).withIdentity(getJobKey(scheduleJob)).build(); + + //表达式调度构建器,可以根据scheduleJob修改withMisfireHandling方法,但是使用异步执行定时任务,没必要 + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression()) + .withMisfireHandlingInstructionFireAndProceed(); + + //按新的cronExpression表达式构建一个新的trigger + CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(scheduleJob)).withSchedule(scheduleBuilder).build(); + + //放入参数,运行时的方法可以获取 + jobDetail.getJobDataMap().put(QuartzJob.JOB_PARAM_KEY, scheduleJob); + + scheduler.scheduleJob(jobDetail, trigger); + + //暂停任务 + if (scheduleJob.getStatus().equals(ScheduleStatus.PAUSE.getType())) { + pauseJob(scheduleJob); + } + } catch (SchedulerException e) { + throw new RuntimeException("创建定时任务失败", e); + } + } + + /** + * 更新定时任务 + */ + public void updateScheduleJob(ScheduleJob scheduleJob) { + try { + TriggerKey triggerKey = getTriggerKey(scheduleJob); + + //表达式调度构建器 + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression()).withMisfireHandlingInstructionFireAndProceed(); + + CronTrigger trigger = getCronTrigger(scheduleJob); + + //按新的cronExpression表达式重新构建trigger + trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); + + //参数 + trigger.getJobDataMap().put(QuartzJob.JOB_PARAM_KEY, scheduleJob); + + scheduler.rescheduleJob(triggerKey, trigger); + + //暂停任务 + if (scheduleJob.getStatus().equals(ScheduleStatus.PAUSE.getType())) { + pauseJob(scheduleJob); + } + + } catch (SchedulerException e) { + throw new RuntimeException("更新定时任务失败", e); + } + } + + /** + * 立即执行任务 + */ + public void run(ScheduleJob scheduleJob) { + try { + //参数 + JobDataMap dataMap = new JobDataMap(); + dataMap.put(QuartzJob.JOB_PARAM_KEY, scheduleJob); + + scheduler.triggerJob(getJobKey(scheduleJob), dataMap); + } catch (SchedulerException e) { + throw new RuntimeException("立即执行定时任务失败", e); + } + } + + /** + * 暂停任务 + */ + public void pauseJob(ScheduleJob scheduleJob) { + try { + scheduler.pauseJob(getJobKey(scheduleJob)); + } catch (SchedulerException e) { + throw new RuntimeException("暂停定时任务失败", e); + } + } + + /** + * 恢复任务 + */ + public void resumeJob(ScheduleJob scheduleJob) { + try { + scheduler.resumeJob(getJobKey(scheduleJob)); + } catch (SchedulerException e) { + throw new RuntimeException("恢复定时任务失败", e); + } + } + + /** + * 删除定时任务 + */ + public void deleteScheduleJob(ScheduleJob scheduleJob) { + try { + // 停止触发器 + scheduler.pauseTrigger(getTriggerKey(scheduleJob)); + //移除触发器 + scheduler.unscheduleJob(getTriggerKey(scheduleJob)); + //删除任务 + scheduler.deleteJob(getJobKey(scheduleJob)); + } catch (SchedulerException e) { + throw new RuntimeException("删除定时任务失败", e); + } + } + +} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/controller/ScheduleJobController.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/controller/ScheduleJobController.java new file mode 100644 index 0000000..61c5293 --- /dev/null +++ b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/controller/ScheduleJobController.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.quartz.controller; + +import javax.validation.Valid; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yami.shop.quartz.model.ScheduleJob; +import com.yami.shop.quartz.service.ScheduleJobService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +import com.yami.shop.common.util.PageParam; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yami.shop.common.annotation.SysLog; + +import cn.hutool.core.util.StrUtil; + + + +/** + * 定时任务 + * @author lgh + */ +@Slf4j +@RestController +@RequestMapping("/sys/schedule") +public class ScheduleJobController { + @Autowired + private ScheduleJobService scheduleJobService; + + /** + * 定时任务列表 + */ + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('sys:schedule:page')") + public ResponseEntity> page(String beanName,PageParam page){ + IPage scheduleJobs = scheduleJobService.page(page,new LambdaQueryWrapper().like(StrUtil.isNotBlank(beanName),ScheduleJob::getBeanName,beanName)); + return ResponseEntity.ok(scheduleJobs); + } + + /** + * 定时任务信息 + */ + @GetMapping("/info/{jobId}") + @PreAuthorize("@pms.hasPermission('sys:schedule:info')") + public ResponseEntity info(@PathVariable("jobId") Long jobId){ + ScheduleJob schedule = scheduleJobService.getById(jobId); + return ResponseEntity.ok(schedule); + } + + /** + * 保存定时任务 + */ + @SysLog("保存定时任务") + @PostMapping + @PreAuthorize("@pms.hasPermission('sys:schedule:save')") + public ResponseEntity save(@RequestBody @Valid ScheduleJob scheduleJob){ + scheduleJobService.saveAndStart(scheduleJob); + return ResponseEntity.ok().build(); + } + + /** + * 修改定时任务 + */ + @SysLog("修改定时任务") + @PutMapping + @PreAuthorize("@pms.hasPermission('sys:schedule:update')") + public ResponseEntity update(@RequestBody @Valid ScheduleJob scheduleJob){ + scheduleJobService.updateScheduleJob(scheduleJob); + + return ResponseEntity.ok().build(); + } + + /** + * 删除定时任务 + */ + @SysLog("删除定时任务") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('sys:schedule:delete')") + public ResponseEntity delete(@RequestBody Long[] jobIds){ + scheduleJobService.deleteBatch(jobIds); + return ResponseEntity.ok().build(); + } + + /** + * 立即执行任务 + */ + @SysLog("立即执行任务") + @PostMapping("/run") + @PreAuthorize("@pms.hasPermission('sys:schedule:run')") + public ResponseEntity run(@RequestBody Long[] jobIds){ + scheduleJobService.run(jobIds); + return ResponseEntity.ok().build(); + } + + /** + * 暂停定时任务 + */ + @SysLog("暂停定时任务") + @PostMapping("/pause") + @PreAuthorize("@pms.hasPermission('sys:schedule:pause')") + public ResponseEntity pause(@RequestBody Long[] jobIds){ + scheduleJobService.pause(jobIds); + return ResponseEntity.ok().build(); + } + + /** + * 恢复定时任务 + */ + @SysLog("恢复定时任务") + @PostMapping("/resume") + @PreAuthorize("@pms.hasPermission('sys:schedule:resume')") + public ResponseEntity resume(@RequestBody Long[] jobIds){ + scheduleJobService.resume(jobIds); + return ResponseEntity.ok().build(); + } + +} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/controller/ScheduleJobLogController.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/controller/ScheduleJobLogController.java new file mode 100644 index 0000000..ae952e3 --- /dev/null +++ b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/controller/ScheduleJobLogController.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.quartz.controller; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yami.shop.quartz.model.ScheduleJobLog; +import com.yami.shop.quartz.service.ScheduleJobLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +import com.yami.shop.common.util.PageParam; +import com.baomidou.mybatisplus.core.metadata.IPage; + +/** + * 定时任务日志 + * @author lgh + */ +@RestController +@RequestMapping("/sys/scheduleLog") +public class ScheduleJobLogController { + @Autowired + private ScheduleJobLogService scheduleJobLogService; + + /** + * 定时任务日志列表 + */ + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('sys:schedule:log')") + public ResponseEntity> page(Long jobId,PageParam page){ + IPage list = scheduleJobLogService.page(page,new LambdaQueryWrapper().eq(jobId != null,ScheduleJobLog::getJobId,jobId)); + return ResponseEntity.ok(list); + } +} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/dao/ScheduleJobLogMapper.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/dao/ScheduleJobLogMapper.java new file mode 100644 index 0000000..15ce160 --- /dev/null +++ b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/dao/ScheduleJobLogMapper.java @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.quartz.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yami.shop.quartz.model.ScheduleJobLog; + +public interface ScheduleJobLogMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/dao/ScheduleJobMapper.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/dao/ScheduleJobMapper.java new file mode 100644 index 0000000..b5c6259 --- /dev/null +++ b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/dao/ScheduleJobMapper.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.quartz.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yami.shop.quartz.model.ScheduleJob; +import org.apache.ibatis.annotations.Param; + +/** + * 定时任务,任务调度mapper + * @author lgh + */ +public interface ScheduleJobMapper extends BaseMapper { + + /** + * 批量修改任务状态 + * @param jobIds 调度任务id + * @param status 任务状态 + * @return 修改成功条数 + */ + int updateBatch(@Param("jobIds") Long[] jobIds, @Param("status") int status); +} \ No newline at end of file diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/enums/ScheduleStatus.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/enums/ScheduleStatus.java new file mode 100644 index 0000000..1c9150f --- /dev/null +++ b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/enums/ScheduleStatus.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.quartz.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum ScheduleStatus { + + /** + * 正常 + */ + NORMAL(0), + /** + * 暂停 + */ + PAUSE(1); + + /** + * 类型 + */ + private final Integer type; +} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/event/ScheduleJobEvent.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/event/ScheduleJobEvent.java new file mode 100644 index 0000000..147f7b7 --- /dev/null +++ b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/event/ScheduleJobEvent.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.quartz.event; + +import com.yami.shop.quartz.model.ScheduleJob; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 定时任务事件 + */ +@Getter +@AllArgsConstructor +public class ScheduleJobEvent { + + private final ScheduleJob scheduleJob; +} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/listener/SysJobListener.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/listener/SysJobListener.java new file mode 100644 index 0000000..4ca46ff --- /dev/null +++ b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/listener/SysJobListener.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.quartz.listener; + +import cn.hutool.core.date.SystemClock; +import cn.hutool.core.util.StrUtil; +import com.yami.shop.quartz.event.ScheduleJobEvent; +import com.yami.shop.quartz.model.ScheduleJob; +import com.yami.shop.quartz.model.ScheduleJobLog; +import com.yami.shop.quartz.service.ScheduleJobLogService; +import com.yami.shop.quartz.util.SpringBeanTaskUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.quartz.Trigger; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.stereotype.Component; + +import java.util.Date; + + +/** + * 异步监听定时任务事件,解决job线程无故丢失的问题 + */ +@Slf4j +@Component +@EnableAsync +@AllArgsConstructor +public class SysJobListener { + + private final ScheduleJobLogService scheduleJobLogService; + + @Async + @EventListener(ScheduleJobEvent.class) + public void scheduleJobEventListener(ScheduleJobEvent event) { + ScheduleJob scheduleJob = event.getScheduleJob(); + //数据库保存执行记录 + ScheduleJobLog jobLog = new ScheduleJobLog(); + jobLog.setJobId(scheduleJob.getJobId()); + jobLog.setBeanName(scheduleJob.getBeanName()); + jobLog.setMethodName(scheduleJob.getMethodName()); + jobLog.setParams(scheduleJob.getParams()); + jobLog.setCreateTime(new Date()); + + //任务开始时间 + long startTime = SystemClock.now(); + + try { + //执行任务 + log.info("任务准备执行,任务ID:" + scheduleJob.getJobId()); + + SpringBeanTaskUtil.invokeMethod(scheduleJob); + + //任务执行总时长 + long times = SystemClock.now() - startTime; + jobLog.setTimes((int)times); + jobLog.setStatus(1); + StringBuilder sb = new StringBuilder(); + + log.info(sb.append("任务执行完毕,任务ID:").append(jobLog.getJobId()).append(" 总共耗时:").append(times).append("毫秒").toString()); + } catch (Exception e) { + log.error("任务执行失败,任务ID:" + scheduleJob.getJobId(), e); + + //任务执行总时长 + long times = SystemClock.now() - startTime; + jobLog.setTimes((int)times); + jobLog.setStatus(0); + jobLog.setError(StrUtil.sub(e.toString(), 0, 2000)); + }finally { + scheduleJobLogService.save(jobLog); + } + scheduleJobLogService.save(jobLog); + + } +} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/model/ScheduleJob.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/model/ScheduleJob.java new file mode 100644 index 0000000..74b9bc4 --- /dev/null +++ b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/model/ScheduleJob.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.quartz.model; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.Date; + +@Data +@TableName("tz_schedule_job") +public class ScheduleJob implements Serializable { + /** + * + */ + private static final long serialVersionUID = 9150018026309004044L; + + /** + * 任务id + */ + @TableId + private Long jobId; + + /** + * spring bean名称 + */ + + @NotBlank(message="bean名称不能为空") + private String beanName; + + /** + * 方法名 + */ + + @NotBlank(message="方法名称不能为空") + private String methodName; + + /** + * 参数 + */ + private String params; + + /** + * cron表达式 + */ + + @NotBlank(message="cron表达式不能为空") + private String cronExpression; + + /** + * 任务状态 0:正常 1:暂停 + */ + private Integer status; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + + private Date createTime; +} \ No newline at end of file diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/model/ScheduleJobLog.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/model/ScheduleJobLog.java new file mode 100644 index 0000000..f643c34 --- /dev/null +++ b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/model/ScheduleJobLog.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.quartz.model; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("tz_schedule_job_log") +public class ScheduleJobLog { + /** + * 任务日志id + */ + @TableId + + private Long logId; + + /** + * 任务id + */ + + private Long jobId; + + /** + * spring bean名称 + */ + + private String beanName; + + /** + * 方法名 + */ + + private String methodName; + + /** + * 参数 + */ + private String params; + + /** + * 任务状态 1:成功 0:失败 + */ + private Integer status; + + /** + * 失败信息 + */ + private String error; + + /** + * 耗时(单位:毫秒) + */ + private Integer times; + + /** + * 创建时间 + */ + + private Date createTime; +} \ No newline at end of file diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/ScheduleJobLogService.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/ScheduleJobLogService.java new file mode 100644 index 0000000..8d34c4c --- /dev/null +++ b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/ScheduleJobLogService.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.quartz.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.quartz.model.ScheduleJobLog; + +/** + * @author lgh + */ +public interface ScheduleJobLogService extends IService{ + +} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/ScheduleJobService.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/ScheduleJobService.java new file mode 100644 index 0000000..e07a2d5 --- /dev/null +++ b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/ScheduleJobService.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.quartz.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.quartz.model.ScheduleJob; + +/** + * + * @author lgh + * + */ +public interface ScheduleJobService extends IService{ + + /** + * 保存并开始定时任务 + * @param scheduleJob + */ + void saveAndStart(ScheduleJob scheduleJob); + + /** + * 更新定时任务 + * @param scheduleJob + */ + void updateScheduleJob(ScheduleJob scheduleJob); + + /** + * 批量删除定时任务 + * @param jobIds 需要删除的job id列表 + */ + void deleteBatch(Long[] jobIds); + + /** + * 批量更新定时任务状态 + * @param jobIds 需要更新的job id列表 + * @param status 更新后的状态 + * @return 更新数量 + */ + int updateBatch(Long[] jobIds, int status); + + /** + * 立即执行 + * @param jobIds job id列表 + */ + void run(Long[] jobIds); + + /** + * 暂停运行 + * @param jobIds job id列表 + */ + void pause(Long[] jobIds); + + /** + * 恢复运行 + * @param jobIds job id列表 + */ + void resume(Long[] jobIds); + +} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/impl/ScheduleJobLogServiceImpl.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/impl/ScheduleJobLogServiceImpl.java new file mode 100644 index 0000000..0e600c1 --- /dev/null +++ b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/impl/ScheduleJobLogServiceImpl.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.quartz.service.impl; + +import com.yami.shop.quartz.dao.ScheduleJobLogMapper; +import com.yami.shop.quartz.model.ScheduleJobLog; +import com.yami.shop.quartz.service.ScheduleJobLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @author lgh + */ +@Service("scheduleJobLogService") +public class ScheduleJobLogServiceImpl extends ServiceImpl implements ScheduleJobLogService { + + @Autowired + private ScheduleJobLogMapper scheduleJobLogMapper; + +} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/impl/ScheduleJobServiceImpl.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/impl/ScheduleJobServiceImpl.java new file mode 100644 index 0000000..2cf5938 --- /dev/null +++ b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/impl/ScheduleJobServiceImpl.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.quartz.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yami.shop.quartz.config.ScheduleManager; +import com.yami.shop.quartz.dao.ScheduleJobMapper; +import com.yami.shop.quartz.enums.ScheduleStatus; +import com.yami.shop.quartz.model.ScheduleJob; +import com.yami.shop.quartz.service.ScheduleJobService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.PostConstruct; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +/** + * + * @author lgh + */ +@Service +public class ScheduleJobServiceImpl extends ServiceImpl implements ScheduleJobService { + + @Autowired + private ScheduleJobMapper scheduleJobMapper; + @Autowired + private ScheduleManager scheduleManager; + /** + * 项目启动时,初始化定时器 + */ + @PostConstruct + public void init(){ + list().forEach(scheduleJob -> { + if (ScheduleStatus.NORMAL.getType().equals(scheduleJob.getStatus())) { + scheduleManager.resumeJob(scheduleJob); + } else if (ScheduleStatus.PAUSE.getType().equals(scheduleJob.getStatus())) { + scheduleManager.pauseJob(scheduleJob); + } + }); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveAndStart(ScheduleJob scheduleJob) { + scheduleJob.setCreateTime(new Date()); + scheduleJob.setStatus(ScheduleStatus.NORMAL.getType()); + scheduleJobMapper.insert(scheduleJob); + + scheduleManager.createScheduleJob(scheduleJob); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateScheduleJob(ScheduleJob scheduleJob) { + scheduleManager.updateScheduleJob(scheduleJob); + scheduleJobMapper.updateById(scheduleJob); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteBatch(Long[] jobIds) { + + List ids = Arrays.asList(jobIds); + this.listByIds(ids).forEach(scheduleJob -> { + scheduleManager.deleteScheduleJob(scheduleJob); + }); + scheduleJobMapper.deleteBatchIds(ids); + } + + @Override + public int updateBatch(Long[] jobIds, int status) { + return scheduleJobMapper.updateBatch(jobIds,status); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void run(Long[] jobIds) { + for(Long jobId : jobIds){ + scheduleManager.run(scheduleJobMapper.selectById(jobId)); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void pause(Long[] jobIds) { + this.listByIds(Arrays.asList(jobIds)).forEach(scheduleJob -> { + scheduleManager.pauseJob(scheduleJob); + }); + + updateBatch(jobIds, ScheduleStatus.PAUSE.getType()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void resume(Long[] jobIds) { + this.listByIds(Arrays.asList(jobIds)).forEach(scheduleJob -> { + scheduleManager.resumeJob(scheduleJob); + }); + + updateBatch(jobIds, ScheduleStatus.NORMAL.getType()); + } +} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/util/SpringBeanTaskUtil.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/util/SpringBeanTaskUtil.java new file mode 100644 index 0000000..c92a372 --- /dev/null +++ b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/util/SpringBeanTaskUtil.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.quartz.util; + +import cn.hutool.core.util.StrUtil; +import com.yami.shop.common.util.SpringContextUtils; +import com.yami.shop.quartz.model.ScheduleJob; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.ReflectionUtils; + +import java.lang.reflect.Method; + + +/** + * 定时任务spring bean 执行定时任务 + * @author LGH + */ +@Slf4j +public class SpringBeanTaskUtil { + + public static void invokeMethod(ScheduleJob scheduleJob) { + Object target = SpringContextUtils.getBean(scheduleJob.getBeanName()); + try { + if (StrUtil.isNotEmpty(scheduleJob.getParams())) { + Method method = target.getClass().getDeclaredMethod(scheduleJob.getMethodName(), String.class); + ReflectionUtils.makeAccessible(method); + method.invoke(target, scheduleJob.getParams()); + } else { + Method method = target.getClass().getDeclaredMethod(scheduleJob.getMethodName()); + ReflectionUtils.makeAccessible(method); + method.invoke(target); + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("执行定时任务失败", e); + } + } +} diff --git a/yami-shop-quartz/src/main/resources/application-quartz.yml b/yami-shop-quartz/src/main/resources/application-quartz.yml new file mode 100644 index 0000000..47fa422 --- /dev/null +++ b/yami-shop-quartz/src/main/resources/application-quartz.yml @@ -0,0 +1,30 @@ +# 数据源配置 +spring: + quartz: + #相关属性配置 + properties: + org: + quartz: + scheduler: + instanceName: clusteredScheduler + instanceId: AUTO + jobStore: + class: org.quartz.impl.jdbcjobstore.JobStoreTX + driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate + tablePrefix: QRTZ_ + isClustered: true + clusterCheckinInterval: 10000 + useProperties: false + misfireThreshold: 12000 + #线程池配置 + threadPool: + #实现的类名 + class: org.quartz.simpl.SimpleThreadPool + #线程数量 + threadCount: 3 + #线程优先级 + threadPriority: 5 + #自创建父线程 + threadsInheritContextClassLoaderOfInitializingThread: true + #数据库方式 + job-store-type: jdbc \ No newline at end of file diff --git a/yami-shop-quartz/src/main/resources/mapper/ScheduleJobLogMapper.xml b/yami-shop-quartz/src/main/resources/mapper/ScheduleJobLogMapper.xml new file mode 100644 index 0000000..152f6cf --- /dev/null +++ b/yami-shop-quartz/src/main/resources/mapper/ScheduleJobLogMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/yami-shop-quartz/src/main/resources/mapper/ScheduleJobMapper.xml b/yami-shop-quartz/src/main/resources/mapper/ScheduleJobMapper.xml new file mode 100644 index 0000000..00f66ff --- /dev/null +++ b/yami-shop-quartz/src/main/resources/mapper/ScheduleJobMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + update tz_schedule_job set status = #{status} where job_id in + + #{jobId} + + + \ No newline at end of file diff --git a/yami-shop-security/pom.xml b/yami-shop-security/pom.xml new file mode 100644 index 0000000..d87dfcb --- /dev/null +++ b/yami-shop-security/pom.xml @@ -0,0 +1,26 @@ + + + + yami-shop + com.yami.shop + 0.0.1-SNAPSHOT + + 4.0.0 + + yami-shop-security + + + + com.yami.shop + yami-shop-common + ${yami.shop.version} + + + + org.springframework.security.oauth.boot + spring-security-oauth2-autoconfigure + + + \ No newline at end of file diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/constants/SecurityConstants.java b/yami-shop-security/src/main/java/com/yami/shop/security/constants/SecurityConstants.java new file mode 100644 index 0000000..619858e --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/constants/SecurityConstants.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.constants; + +public interface SecurityConstants { + /** + * 前缀 + */ + String YAMI_PREFIX = "yami_"; + + /** + * oauth 相关前缀 + */ + String OAUTH_PREFIX = "oauth:"; + + /** + * oauth 客户端信息 + */ + String CLIENT_DETAILS_KEY = "yami_oauth:client:details"; + + /** + * sys_oauth_client_details 表的字段,不包括client_id、client_secret + */ + String CLIENT_FIELDS = "client_id, CONCAT('{noop}',client_secret) as client_secret, resource_ids, scope, " + + "authorized_grant_types, web_server_redirect_uri, authorities, access_token_validity, " + + "refresh_token_validity, additional_information, autoapprove"; + + /** + * JdbcClientDetailsService 查询语句 + */ + String BASE_FIND_STATEMENT = "select " + CLIENT_FIELDS + + " from tz_oauth_client_details"; + + /** + * 默认的查询语句 + */ + String DEFAULT_FIND_STATEMENT = BASE_FIND_STATEMENT + " order by client_id"; + + /** + * 按条件client_id 查询 + */ + String DEFAULT_SELECT_STATEMENT = BASE_FIND_STATEMENT + " where client_id = ?"; + + /** + * 小程序登陆(暂时与数据库tz_oauth_client_details 中一致) + */ + String SPRING_SECURITY_RESTFUL_TYPE_MINI_APP = "mini_app"; + /** + * 公众号登陆(暂时与数据库tz_oauth_client_details 中一致) + */ + String SPRING_SECURITY_RESTFUL_TYPE_MP = "weixin_mp"; + /** + * 后台账号密码登陆(暂时与数据库tz_oauth_client_details 中一致) + */ + String SPRING_SECURITY_RESTFUL_TYPE_ADMIN = "admin"; + + String SPRING_SECURITY_RESTFUL_IMAGE_CODE = "imageCode"; +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/controller/SysLoginController.java b/yami-shop-security/src/main/java/com/yami/shop/security/controller/SysLoginController.java new file mode 100644 index 0000000..15103d5 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/controller/SysLoginController.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.controller; + + +import java.awt.*; +import java.io.IOException; + +import javax.servlet.http.HttpServletResponse; + +import com.yami.shop.security.constants.SecurityConstants; + +import com.yami.shop.security.service.YamiSysUser; +import com.yami.shop.security.util.SecurityUtils; +import lombok.AllArgsConstructor; +import org.redisson.api.RedissonClient; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; + +import com.yami.shop.common.util.RedisUtil; +import com.yami.shop.common.util.SimpleCaptcha; +import springfox.documentation.annotations.ApiIgnore; + +/** + * 登录相关 + * @author lgh + */ +@Controller +@AllArgsConstructor +@ApiIgnore +public class SysLoginController { + + private final CacheManager cacheManager; + + + @GetMapping("/captcha.jpg") + public void login(HttpServletResponse response,String uuid) { + //定义图形验证码的长、宽、验证码字符数、干扰元素个数 + SimpleCaptcha simpleCaptcha = new SimpleCaptcha(200, 50, 4, 20); + try { + simpleCaptcha.write(response.getOutputStream()); + RedisUtil.set(SecurityConstants.SPRING_SECURITY_RESTFUL_IMAGE_CODE+uuid, simpleCaptcha.getCode(), 300); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 退出 + */ + @PostMapping(value = "/sys/logout") + public ResponseEntity logout() { + Cache cache = cacheManager.getCache("yami_sys_user"); + if (cache != null) { + cache.evict(SecurityUtils.getSysUser().getUsername()); + } + SecurityContextHolder.clearContext(); + return ResponseEntity.ok().build(); + } + +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/dao/AppConnectMapper.java b/yami-shop-security/src/main/java/com/yami/shop/security/dao/AppConnectMapper.java new file mode 100644 index 0000000..d84c6f4 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/dao/AppConnectMapper.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.dao; + +import com.yami.shop.security.model.AppConnect; +import org.apache.ibatis.annotations.Param; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface AppConnectMapper extends BaseMapper { + + AppConnect getByBizUserId(@Param("bizUserId") String bizUserId, @Param("appId") Integer appId); + + AppConnect getByUserId(@Param("userId") String userId, @Param("appId") Integer appId); + + String getUserIdByUnionId(@Param("bizUnionId") String bizUnionId); +} \ No newline at end of file diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/enums/App.java b/yami-shop-security/src/main/java/com/yami/shop/security/enums/App.java new file mode 100644 index 0000000..105a868 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/enums/App.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.enums; + +public enum App { + + /** + * 小程序 + */ + MINI(1), + + /** + * 微信公众号 + */ + MP(2) + ; + + private Integer num; + + public Integer value() { + return num; + } + + App(Integer num){ + this.num = num; + } + + public static App instance(Integer value) { + App[] enums = values(); + for (App statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/exception/BadCredentialsException.java b/yami-shop-security/src/main/java/com/yami/shop/security/exception/BadCredentialsException.java new file mode 100644 index 0000000..6f6257c --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/exception/BadCredentialsException.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.exception; + +/** + * 密码不正确 + */ +public class BadCredentialsException extends YamiAuth2Exception{ + public BadCredentialsException(String msg) { + super(msg); + } + + @Override + public String getOAuth2ErrorCode() { + return "bad_credentials"; + } +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/exception/BadCredentialsExceptionBase.java b/yami-shop-security/src/main/java/com/yami/shop/security/exception/BadCredentialsExceptionBase.java new file mode 100644 index 0000000..e3d9f26 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/exception/BadCredentialsExceptionBase.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.exception; + +/** + * 密码不正确 + */ +public class BadCredentialsExceptionBase extends BaseYamiAuth2Exception { + public BadCredentialsExceptionBase(String msg) { + super(msg); + } + + @Override + public String getOAuth2ErrorCode() { + return "bad_credentials"; + } +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/exception/BaseYamiAuth2Exception.java b/yami-shop-security/src/main/java/com/yami/shop/security/exception/BaseYamiAuth2Exception.java new file mode 100644 index 0000000..ac655d3 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/exception/BaseYamiAuth2Exception.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.exception; + +import lombok.Getter; +import org.springframework.http.HttpStatus; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.oauth2.common.exceptions.OAuth2Exception; + +/** + */ +public abstract class BaseYamiAuth2Exception extends AuthenticationException { + + public BaseYamiAuth2Exception(String msg) { + super(msg); + } + + public int getHttpErrorCode() { + // 400 not 401 + return HttpStatus.BAD_REQUEST.value(); + } + + public abstract String getOAuth2ErrorCode(); +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/exception/ImageCodeNotMatchException.java b/yami-shop-security/src/main/java/com/yami/shop/security/exception/ImageCodeNotMatchException.java new file mode 100644 index 0000000..074e75e --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/exception/ImageCodeNotMatchException.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.exception; + +public class ImageCodeNotMatchException extends YamiAuth2Exception { + + public ImageCodeNotMatchException(String msg) { + super(msg); + } + + @Override + public String getOAuth2ErrorCode() { + return "image_code_not_match"; + } +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/exception/ImageCodeNotMatchExceptionBase.java b/yami-shop-security/src/main/java/com/yami/shop/security/exception/ImageCodeNotMatchExceptionBase.java new file mode 100644 index 0000000..a11a661 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/exception/ImageCodeNotMatchExceptionBase.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.exception; + +public class ImageCodeNotMatchExceptionBase extends BaseYamiAuth2Exception { + + public ImageCodeNotMatchExceptionBase(String msg) { + super(msg); + } + + @Override + public String getOAuth2ErrorCode() { + return "image_code_not_match"; + } +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/exception/UnauthorizedException.java b/yami-shop-security/src/main/java/com/yami/shop/security/exception/UnauthorizedException.java new file mode 100644 index 0000000..9592c7a --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/exception/UnauthorizedException.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.exception; + +import org.springframework.http.HttpStatus; + +/** + */ +public class UnauthorizedException extends YamiAuth2Exception { + + public UnauthorizedException(String msg) { + super(msg); + } + + + public UnauthorizedException(String msg, Throwable t) { + super(msg); + } + + @Override + public String getOAuth2ErrorCode() { + return "unauthorized"; + } + + @Override + public int getHttpErrorCode() { + return HttpStatus.UNAUTHORIZED.value(); + } + +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/exception/UnauthorizedExceptionBase.java b/yami-shop-security/src/main/java/com/yami/shop/security/exception/UnauthorizedExceptionBase.java new file mode 100644 index 0000000..d782a59 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/exception/UnauthorizedExceptionBase.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.exception; + +import org.springframework.http.HttpStatus; + +/** + */ +public class UnauthorizedExceptionBase extends BaseYamiAuth2Exception { + + public UnauthorizedExceptionBase(String msg) { + super(msg); + } + + + public UnauthorizedExceptionBase(String msg, Throwable t) { + super(msg); + } + + @Override + public String getOAuth2ErrorCode() { + return "unauthorized"; + } + + @Override + public int getHttpErrorCode() { + return HttpStatus.UNAUTHORIZED.value(); + } + +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/exception/UnknownGrantTypeException.java b/yami-shop-security/src/main/java/com/yami/shop/security/exception/UnknownGrantTypeException.java new file mode 100644 index 0000000..69c00c1 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/exception/UnknownGrantTypeException.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.exception; + +import org.springframework.http.HttpStatus; + +public class UnknownGrantTypeException extends YamiAuth2Exception { + + public UnknownGrantTypeException(String msg) { + super(msg); + } + + + public UnknownGrantTypeException(String msg, Throwable t) { + super(msg); + } + + @Override + public String getOAuth2ErrorCode() { + return "unknown_grant_type"; + } + + @Override + public int getHttpErrorCode() { + return HttpStatus.UNAUTHORIZED.value(); + } + +} \ No newline at end of file diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/exception/UnknownGrantTypeExceptionBase.java b/yami-shop-security/src/main/java/com/yami/shop/security/exception/UnknownGrantTypeExceptionBase.java new file mode 100644 index 0000000..5484382 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/exception/UnknownGrantTypeExceptionBase.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.exception; + +import org.springframework.http.HttpStatus; + +public class UnknownGrantTypeExceptionBase extends BaseYamiAuth2Exception { + + public UnknownGrantTypeExceptionBase(String msg) { + super(msg); + } + + + public UnknownGrantTypeExceptionBase(String msg, Throwable t) { + super(msg); + } + + @Override + public String getOAuth2ErrorCode() { + return "unknown_grant_type"; + } + + @Override + public int getHttpErrorCode() { + return HttpStatus.UNAUTHORIZED.value(); + } + +} \ No newline at end of file diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/exception/UsernameNotFoundException.java b/yami-shop-security/src/main/java/com/yami/shop/security/exception/UsernameNotFoundException.java new file mode 100644 index 0000000..1920729 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/exception/UsernameNotFoundException.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.exception; + +public class UsernameNotFoundException extends YamiAuth2Exception { + + public UsernameNotFoundException(String msg) { + super(msg); + } + + @Override + public String getOAuth2ErrorCode() { + return "username_not_found"; + } +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/exception/UsernameNotFoundExceptionBase.java b/yami-shop-security/src/main/java/com/yami/shop/security/exception/UsernameNotFoundExceptionBase.java new file mode 100644 index 0000000..a4c8225 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/exception/UsernameNotFoundExceptionBase.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.exception; + +public class UsernameNotFoundExceptionBase extends BaseYamiAuth2Exception { + + public UsernameNotFoundExceptionBase(String msg) { + super(msg); + } + + @Override + public String getOAuth2ErrorCode() { + return "username_not_found"; + } +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/exception/WxErrorException.java b/yami-shop-security/src/main/java/com/yami/shop/security/exception/WxErrorException.java new file mode 100644 index 0000000..1fa3749 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/exception/WxErrorException.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.exception; + +/** + * 密码不正确 + */ +public class WxErrorException extends YamiAuth2Exception{ + public WxErrorException(String msg) { + super(msg); + } + + @Override + public String getOAuth2ErrorCode() { + return "wx_error_exception"; + } +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/exception/WxErrorExceptionBase.java b/yami-shop-security/src/main/java/com/yami/shop/security/exception/WxErrorExceptionBase.java new file mode 100644 index 0000000..36b7fe0 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/exception/WxErrorExceptionBase.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.exception; + +/** + * 密码不正确 + */ +public class WxErrorExceptionBase extends BaseYamiAuth2Exception { + public WxErrorExceptionBase(String msg) { + super(msg); + } + + @Override + public String getOAuth2ErrorCode() { + return "wx_error_exception"; + } +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/exception/YamiAuth2Exception.java b/yami-shop-security/src/main/java/com/yami/shop/security/exception/YamiAuth2Exception.java new file mode 100644 index 0000000..e3b97cb --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/exception/YamiAuth2Exception.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.exception; + +import lombok.Getter; +import org.springframework.http.HttpStatus; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.oauth2.common.exceptions.OAuth2Exception; + +/** + */ +public abstract class YamiAuth2Exception extends AuthenticationException { + + public YamiAuth2Exception(String msg) { + super(msg); + } + + public int getHttpErrorCode() { + // 400 not 401 + return HttpStatus.BAD_REQUEST.value(); + } + + public abstract String getOAuth2ErrorCode(); +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/filter/LoginAuthenticationFilter.java b/yami-shop-security/src/main/java/com/yami/shop/security/filter/LoginAuthenticationFilter.java new file mode 100644 index 0000000..5c7e923 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/filter/LoginAuthenticationFilter.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.filter; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.servlet.ServletUtil; +import com.yami.shop.common.util.Json; +import com.yami.shop.security.constants.SecurityConstants; +import com.yami.shop.security.exception.UnknownGrantTypeExceptionBase; +import com.yami.shop.security.token.AdminAuthenticationToken; +import com.yami.shop.security.token.MiniAppAuthenticationToken; +import org.springframework.security.authentication.AbstractAuthenticationToken; +import org.springframework.security.authentication.AuthenticationServiceException; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.oauth2.common.util.OAuth2Utils; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +/** + * 自定义登陆filter,新增登陆方式:验证码、二维码扫码、账号密码; + * 小程序登陆:此时principal为code + * post:http://127.0.0.1:8086/login?grant_type=mini_app + * {principal:code} + * 管理员登陆: + * post: http://127.0.0.1:8086/login?grant_type=admin + * {principal:username,credentials:password} + */ +public class LoginAuthenticationFilter extends UsernamePasswordAuthenticationFilter { + + @Override + public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { + if (!ServletUtil.METHOD_POST.equals(request.getMethod())) { + throw new AuthenticationServiceException( + "Authentication method not supported: " + request.getMethod()); + } + String type = obtainParameter(request, OAuth2Utils.GRANT_TYPE); + + AbstractAuthenticationToken authRequest = null; + + String requestBody = getStringFromStream(request); + + if (StrUtil.isBlank(requestBody)) { + throw new AuthenticationServiceException("无法获取输入信息"); + } + + // 小程序通过code登陆 + if(SecurityConstants.SPRING_SECURITY_RESTFUL_TYPE_MINI_APP.equals(type)){ + authRequest = Json.parseObject(requestBody, MiniAppAuthenticationToken.class); + } + + + // 账号密码登陆 + else if (SecurityConstants.SPRING_SECURITY_RESTFUL_TYPE_ADMIN.equals(type)) { + authRequest = Json.parseObject(requestBody, AdminAuthenticationToken.class); + } + + if (authRequest == null) { + throw new UnknownGrantTypeExceptionBase("未知的grant_type"); + } + + // Allow subclasses to set the "details" property + setDetails(request, authRequest); + return this.getAuthenticationManager().authenticate(authRequest); + } + + private void setDetails(HttpServletRequest request, + AbstractAuthenticationToken authRequest) { + authRequest.setDetails(authenticationDetailsSource.buildDetails(request)); + } + + private String obtainParameter(HttpServletRequest request, String parameter) { + String result = request.getParameter(parameter); + return result == null ? "" : result; + } + + + private String getStringFromStream(HttpServletRequest req) { + ServletInputStream is; + try { + is = req.getInputStream(); + int nRead = 1; + int nTotalRead = 0; + byte[] bytes = new byte[10240]; + while (nRead > 0) { + nRead = is.read(bytes, nTotalRead, bytes.length - nTotalRead); + if (nRead > 0) { + nTotalRead = nTotalRead + nRead; + } + } + return new String(bytes, 0, nTotalRead, StandardCharsets.UTF_8); + } catch (IOException e) { + e.printStackTrace(); + return ""; + } + } +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/handler/LoginAuthFailedHandler.java b/yami-shop-security/src/main/java/com/yami/shop/security/handler/LoginAuthFailedHandler.java new file mode 100644 index 0000000..943f096 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/handler/LoginAuthFailedHandler.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.handler; + +import cn.hutool.core.util.CharsetUtil; +import com.yami.shop.security.exception.BaseYamiAuth2Exception; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.authentication.AuthenticationFailureHandler; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; + +/** + * 登陆失败处理 + */ +@Component +@Slf4j +public class LoginAuthFailedHandler implements AuthenticationFailureHandler { + + /** + * {@inheritDoc} + */ + @Override + @SneakyThrows + public void onAuthenticationFailure(HttpServletRequest request, + HttpServletResponse response, AuthenticationException exception) { + + if (!(exception instanceof BaseYamiAuth2Exception)) { + return; + } + + BaseYamiAuth2Exception auth2Exception = (BaseYamiAuth2Exception) exception; + + response.setCharacterEncoding(CharsetUtil.UTF_8); + response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE); + response.setStatus(auth2Exception.getHttpErrorCode()); + PrintWriter printWriter = response.getWriter(); + printWriter.append(auth2Exception.getMessage()); + } + +} \ No newline at end of file diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/handler/LoginAuthSuccessHandler.java b/yami-shop-security/src/main/java/com/yami/shop/security/handler/LoginAuthSuccessHandler.java new file mode 100644 index 0000000..25068bc --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/handler/LoginAuthSuccessHandler.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.handler; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.CharsetUtil; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Sets; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.http.MediaType; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.common.OAuth2AccessToken; +import org.springframework.security.oauth2.common.util.OAuth2Utils; +import org.springframework.security.oauth2.provider.*; +import org.springframework.security.oauth2.provider.client.BaseClientDetails; +import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices; +import org.springframework.security.web.authentication.AuthenticationSuccessHandler; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + + +/** + * 登录成功,返回oauth token + * + */ +@Component +@Slf4j +public class LoginAuthSuccessHandler implements AuthenticationSuccessHandler { + @Autowired + private ObjectMapper objectMapper; + @Autowired + @Lazy + private AuthorizationServerTokenServices yamiTokenServices; + + /** + * Called when a user has been successfully authenticated. + * 调用spring security oauth API 生成 oAuth2AccessToken + * + * @param request the request which caused the successful authentication + * @param response the response + * @param authentication the Authentication object which was created during + */ + @Override + public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) { + + try { + + // ClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId); + + + String grantType = request.getParameter(OAuth2Utils.GRANT_TYPE); + // 目前先简化登陆传入的参数 + String clientId = grantType; + // 简化 + BaseClientDetails clientDetails = new BaseClientDetails(); + clientDetails.setClientId(clientId); + + TokenRequest tokenRequest = new TokenRequest(MapUtil.newHashMap(), clientId, Sets.newHashSet(), grantType); + + + OAuth2Request oAuth2Request = tokenRequest.createOAuth2Request(clientDetails); + OAuth2Authentication oAuth2Authentication = new OAuth2Authentication(oAuth2Request, authentication); + + +// OAuth2AccessToken accessToken = defaultAuthorizationServerTokenServices.getAccessToken(oAuth2Authentication); +// OAuth2AccessToken oAuth2AccessToken = null; +// if (accessToken != null) { +// oAuth2AccessToken = defaultAuthorizationServerTokenServices.refreshAccessToken(accessToken.getRefreshToken().getValue(), tokenRequest); +// } else { +// oAuth2AccessToken = defaultAuthorizationServerTokenServices.createAccessToken(oAuth2Authentication); +// } + + OAuth2AccessToken oAuth2AccessToken = yamiTokenServices.createAccessToken(oAuth2Authentication); + log.info("获取token 成功:{}", oAuth2AccessToken.getValue()); + + response.setCharacterEncoding(CharsetUtil.UTF_8); + response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE); + PrintWriter printWriter = response.getWriter(); + printWriter.append(objectMapper.writeValueAsString(oAuth2AccessToken)); + } catch (IOException e) { + throw new BadCredentialsException( + "Failed to decode basic authentication token"); + } + + } + + +} \ No newline at end of file diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/model/AppConnect.java b/yami-shop-security/src/main/java/com/yami/shop/security/model/AppConnect.java new file mode 100644 index 0000000..463799b --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/model/AppConnect.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.model; + + +import java.util.Date; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +@Data +@TableName("tz_app_connect") +public class AppConnect { + /** + * id + */ + @TableId + private Long id; + + /** + * 本系统userId + */ + + private String userId; + + /** + * 第三方系统id 1:微信小程序 + */ + + private Integer appId; + + /** + * 第三方系统昵称 + */ + + private String nickName; + + /** + * 第三方系统头像 + */ + + private String imageUrl; + + /** + * 第三方系统userid + */ + + private String bizUserId; + + /** + * 第三方系统unionid + */ + + private String bizUnionid; + +} \ No newline at end of file diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/permission/PermissionService.java b/yami-shop-security/src/main/java/com/yami/shop/security/permission/PermissionService.java new file mode 100644 index 0000000..c86ea15 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/permission/PermissionService.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.permission; + +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.util.PatternMatchUtils; +import org.springframework.util.StringUtils; + +import java.util.Collection; + +/** + * 接口权限判断工具 + */ +@Slf4j +@Component("pms") +public class PermissionService { + /** + * 判断接口是否有xxx:xxx权限 + * + * @param permission 权限 + * @return {boolean} + */ + public boolean hasPermission(String permission) { + if (StrUtil.isBlank(permission)) { + return false; + } + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication == null) { + return false; + } + return authentication + .getAuthorities() + .stream() + .map(GrantedAuthority::getAuthority) + .filter(StringUtils::hasText) + .anyMatch(x -> PatternMatchUtils.simpleMatch(permission, x)); + } +} \ No newline at end of file diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/provider/AbstractUserDetailsAuthenticationProvider.java b/yami-shop-security/src/main/java/com/yami/shop/security/provider/AbstractUserDetailsAuthenticationProvider.java new file mode 100644 index 0000000..e81abc5 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/provider/AbstractUserDetailsAuthenticationProvider.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.provider; + +import com.yami.shop.security.enums.App; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +/** + * 自定义 AuthenticationProvider, 以使用自定义的 MyAuthenticationToken + * @author LGH + */ +@Slf4j +public abstract class AbstractUserDetailsAuthenticationProvider implements AuthenticationProvider, InitializingBean { + + + + protected abstract void additionalAuthenticationChecks(UserDetails var1, Authentication var2) throws AuthenticationException; + + @Override + public final void afterPropertiesSet() { + } + + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + String username = authentication.getPrincipal() == null?"NONE_PROVIDED":authentication.getName(); + UserDetails user; + + try { + user = this.retrieveUser(username, authentication); + } catch (UsernameNotFoundException var6) { + log.debug("User \'" + username + "\' not found"); + + throw var6; + } + + this.additionalAuthenticationChecks(user, authentication); + + return this.createSuccessAuthentication(authentication, user); + } + + protected abstract Authentication createSuccessAuthentication(Authentication authentication, UserDetails user); + + protected abstract App getAppInfo(); + + protected abstract UserDetails retrieveUser(String username, Authentication authentication) throws AuthenticationException; + + + +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/provider/AdminAuthenticationProvider.java b/yami-shop-security/src/main/java/com/yami/shop/security/provider/AdminAuthenticationProvider.java new file mode 100644 index 0000000..a64d48a --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/provider/AdminAuthenticationProvider.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.provider; + + +import cn.hutool.core.util.StrUtil; +import com.yami.shop.common.util.RedisUtil; +import com.yami.shop.security.constants.SecurityConstants; +import com.yami.shop.security.enums.App; +import com.yami.shop.security.exception.BadCredentialsExceptionBase; +import com.yami.shop.security.exception.ImageCodeNotMatchExceptionBase; +import com.yami.shop.security.exception.UsernameNotFoundExceptionBase; +import com.yami.shop.security.exception.BaseYamiAuth2Exception; +import com.yami.shop.security.service.YamiUserDetailsService; +import com.yami.shop.security.token.AdminAuthenticationToken; +import lombok.AllArgsConstructor; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Component; + +/** + * 后台管理员账号密码登陆 + * @author LGH + */ +@Component +@AllArgsConstructor +public class AdminAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider { + + private final YamiUserDetailsService yamiUserDetailsService; + + private final PasswordEncoder passwordEncoder; + + @Override + protected UserDetails retrieveUser(String username, Authentication authentication) throws BaseYamiAuth2Exception { + UserDetails user; + try { + user = yamiUserDetailsService.loadUserByUsername(username); + } catch (UsernameNotFoundExceptionBase var6) { + throw new UsernameNotFoundExceptionBase("账号或密码不正确"); + } + if (!user.isEnabled()) { + throw new UsernameNotFoundExceptionBase("账号已被锁定,请联系管理员"); + } + return user; + } + + @Override + protected void additionalAuthenticationChecks(UserDetails sysUser, Authentication authentication) throws BaseYamiAuth2Exception { + AdminAuthenticationToken adminAuthenticationToken = (AdminAuthenticationToken) authentication; + + String kaptchaKey = SecurityConstants.SPRING_SECURITY_RESTFUL_IMAGE_CODE + adminAuthenticationToken.getSessionUUID(); + + String kaptcha = RedisUtil.get(kaptchaKey); + + RedisUtil.del(kaptchaKey); + + if(StrUtil.isBlank(adminAuthenticationToken.getImageCode()) || !adminAuthenticationToken.getImageCode().equalsIgnoreCase(kaptcha)){ + throw new ImageCodeNotMatchExceptionBase("验证码有误"); + } + + + + String encodedPassword = sysUser.getPassword(); + String rawPassword = authentication.getCredentials().toString(); + + // 密码不正确 + if (!passwordEncoder.matches(rawPassword,encodedPassword)){ + throw new BadCredentialsExceptionBase("账号或密码不正确"); + } + } + + @Override + protected Authentication createSuccessAuthentication(Authentication authentication, UserDetails user) { + AdminAuthenticationToken result = new AdminAuthenticationToken(user, authentication.getCredentials()); + result.setDetails(authentication.getDetails()); + return result; + } + + + + @Override + public boolean supports(Class authentication) { + return AdminAuthenticationToken.class.isAssignableFrom(authentication); + } + + @Override + protected App getAppInfo() { + return null; + } + +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/provider/MiniAppAuthenticationProvider.java b/yami-shop-security/src/main/java/com/yami/shop/security/provider/MiniAppAuthenticationProvider.java new file mode 100644 index 0000000..b2757c5 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/provider/MiniAppAuthenticationProvider.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.provider; + + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; +import cn.hutool.core.util.BooleanUtil; +import com.yami.shop.security.enums.App; +import com.yami.shop.security.exception.UsernameNotFoundExceptionBase; +import com.yami.shop.security.exception.WxErrorExceptionBase; +import com.yami.shop.security.model.AppConnect; +import com.yami.shop.security.service.YamiUser; +import com.yami.shop.security.service.YamiUserDetailsService; +import com.yami.shop.security.token.MiniAppAuthenticationToken; +import com.yami.shop.security.token.MyAuthenticationToken; +import lombok.AllArgsConstructor; +import me.chanjar.weixin.common.error.WxErrorException; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Component; + +/** + * 小程序登陆 + * @author LGH + */ +@Component +@AllArgsConstructor +public class MiniAppAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider { + + private final YamiUserDetailsService yamiUserDetailsService; + + private final WxMaService wxMaService; + + @Override + protected void additionalAuthenticationChecks(UserDetails var1, Authentication authentication) throws AuthenticationException { + + } + + @Override + protected Authentication createSuccessAuthentication(Authentication authentication, UserDetails user) { + MiniAppAuthenticationToken result = new MiniAppAuthenticationToken(user, authentication.getCredentials()); + result.setDetails(authentication.getDetails()); + return result; + } + + @Override + protected UserDetails retrieveUser(String code, Authentication authentication) throws AuthenticationException { + YamiUser loadedUser = null; + // 如果使用debugger 模式,则返回debugger的用户 + if (BooleanUtil.isTrue(((MyAuthenticationToken)authentication).getDebugger())) { + loadedUser = new YamiUser("1" , "debuggerOpenId1" , this.getAppInfo().value(), true); + loadedUser.setDebugger(true); + return loadedUser; + } + + WxMaJscode2SessionResult session = null; + + AppConnect appConnect = new AppConnect(); + appConnect.setAppId(this.getAppInfo().value()); + try { + + session = wxMaService.getUserService().getSessionInfo(code); + + loadedUser = yamiUserDetailsService.loadUserByAppIdAndBizUserId(this.getAppInfo(),session.getOpenid()); + } catch (WxErrorException e) { + throw new WxErrorExceptionBase(e.getMessage()); + } catch (UsernameNotFoundExceptionBase var6) { + if (session == null) { + throw new WxErrorExceptionBase("无法获取用户登陆信息"); + } + appConnect.setBizUserId(session.getOpenid()); + appConnect.setBizUnionid(session.getUnionid()); + yamiUserDetailsService.insertUserIfNecessary(appConnect); + } + + if (loadedUser == null) { + loadedUser = yamiUserDetailsService.loadUserByAppIdAndBizUserId(this.getAppInfo(), appConnect.getBizUserId()); + } + return loadedUser; + } + + @Override + public boolean supports(Class authentication) { + return MiniAppAuthenticationToken.class.isAssignableFrom(authentication); + } + + + @Override + protected App getAppInfo() { + return App.MINI; + } +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/provider/MpAuthenticationProvider.java b/yami-shop-security/src/main/java/com/yami/shop/security/provider/MpAuthenticationProvider.java new file mode 100644 index 0000000..ab8ec22 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/provider/MpAuthenticationProvider.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.provider; + + + +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.emoji.EmojiUtil; +import cn.hutool.core.util.BooleanUtil; +import com.yami.shop.security.enums.App; +import com.yami.shop.security.exception.UsernameNotFoundExceptionBase; +import com.yami.shop.security.exception.WxErrorExceptionBase; +import com.yami.shop.security.model.AppConnect; +import com.yami.shop.security.service.YamiUser; +import com.yami.shop.security.service.YamiUserDetailsService; +import com.yami.shop.security.token.MpAuthenticationToken; +import com.yami.shop.security.token.MyAuthenticationToken; +import lombok.AllArgsConstructor; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken; +import me.chanjar.weixin.mp.bean.result.WxMpUser; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Component; + +/** + * 微信公众号登陆 + * @author LGH + */ +@Component +@AllArgsConstructor +public class MpAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider { + + private final YamiUserDetailsService yamiUserDetailsService; + + private final WxMpService wxMpService; + + + @Override + protected void additionalAuthenticationChecks(UserDetails var1, Authentication authentication) throws AuthenticationException { + + } + + @Override + protected Authentication createSuccessAuthentication(Authentication authentication, UserDetails user) { + MpAuthenticationToken result = new MpAuthenticationToken(user, authentication.getCredentials()); + result.setDetails(authentication.getDetails()); + return result; + } + + @Override + protected UserDetails retrieveUser(String code, Authentication authentication) throws AuthenticationException { + YamiUser loadedUser = null; + // 如果使用debugger 模式,则返回debugger的用户 + if (BooleanUtil.isTrue(((MyAuthenticationToken)authentication).getDebugger())) { + loadedUser = new YamiUser("1" , "debuggerOpenId" , this.getAppInfo().value(), true); + loadedUser.setDebugger(true); + return loadedUser; + } + + WxMpOAuth2AccessToken wxMpOAuth2AccessToken = null; + + AppConnect appConnect = new AppConnect(); + appConnect.setAppId(this.getAppInfo().value()); + + try { + + wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code); + loadedUser = yamiUserDetailsService.loadUserByAppIdAndBizUserId(this.getAppInfo(),wxMpOAuth2AccessToken.getOpenId()); + + } catch (WxErrorException e) { + throw new WxErrorExceptionBase(e.getMessage()); + } catch (UsernameNotFoundExceptionBase var6) { + WxMpUser wxMpUser = null; + try { + wxMpUser = wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken, null); + } catch (WxErrorException e) { + throw new WxErrorExceptionBase(e.getMessage()); + } + appConnect.setNickName(EmojiUtil.toAlias(StrUtil.isBlank(wxMpUser.getNickname())? "": wxMpUser.getNickname())); + appConnect.setImageUrl(wxMpUser.getHeadImgUrl()); + appConnect.setBizUserId(wxMpUser.getOpenId()); + appConnect.setBizUnionid(wxMpUser.getUnionId()); + yamiUserDetailsService.insertUserIfNecessary(appConnect); + + } + + if (loadedUser == null) { + loadedUser = yamiUserDetailsService.loadUserByAppIdAndBizUserId(this.getAppInfo(), appConnect.getBizUserId()); + } + return loadedUser; + } + + @Override + public boolean supports(Class authentication) { + return MpAuthenticationToken.class.isAssignableFrom(authentication); + } + + + @Override + protected App getAppInfo() { + return App.MP; + } +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/service/AppConnectService.java b/yami-shop-security/src/main/java/com/yami/shop/security/service/AppConnectService.java new file mode 100644 index 0000000..6c75a55 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/service/AppConnectService.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.security.enums.App; +import com.yami.shop.security.model.AppConnect; + +/** + * + * @author lgh on 2018/09/07. + */ +public interface AppConnectService extends IService { + + AppConnect getByBizUserId(String bizUserId, App app); +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/service/YamiClientDetailsService.java b/yami-shop-security/src/main/java/com/yami/shop/security/service/YamiClientDetailsService.java new file mode 100644 index 0000000..7de2391 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/service/YamiClientDetailsService.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.service; + +import com.yami.shop.security.constants.SecurityConstants; +import lombok.SneakyThrows; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.security.oauth2.common.exceptions.InvalidClientException; +import org.springframework.security.oauth2.provider.ClientDetails; +import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService; + +import javax.sql.DataSource; + +/** + * @author + * @tate 2019/03/30 + * 获取客户端 + */ +public class YamiClientDetailsService extends JdbcClientDetailsService { + + public YamiClientDetailsService(DataSource dataSource) { + super(dataSource); + } + + /** + * 重写原生方法支持redis缓存 + * + * @param clientId + * @return tz_oauth_client_details表对应的实体 + * @throws InvalidClientException + */ + @Override + @SneakyThrows + @Cacheable(value = SecurityConstants.CLIENT_DETAILS_KEY, key = "#clientId", unless = "#result == null") + public ClientDetails loadClientByClientId(String clientId) { + return super.loadClientByClientId(clientId); + } +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/service/YamiSysUser.java b/yami-shop-security/src/main/java/com/yami/shop/security/service/YamiSysUser.java new file mode 100644 index 0000000..0db5214 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/service/YamiSysUser.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.service; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.User; + +import java.util.Collection; + +/** + * 用户详细信息 + * + * @author + */ +@Getter +@Setter +public class YamiSysUser extends User { + /** + * 用户ID + */ + @Getter + private Long userId; + + /** + * 租户ID + */ + @Getter + private Long shopId; + + public YamiSysUser(Long userId, Long shopId, String username, String password, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection authorities) { + super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities); + this.userId = userId; + this.shopId = shopId; + } +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/service/YamiUser.java b/yami-shop-security/src/main/java/com/yami/shop/security/service/YamiUser.java new file mode 100644 index 0000000..7c8ed48 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/service/YamiUser.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.service; + +import cn.hutool.core.util.StrUtil; +import lombok.Getter; +import lombok.Setter; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.User; + +import java.util.Collection; +import java.util.Collections; + +/** + * 用户详细信息 + */ +@Getter +public class YamiUser extends User { + + /** + * 用户ID + */ + private String userId; + + private String bizUserId; + + @Setter + private String pic; + + @Setter + private String name; + + @Setter + private boolean debugger; + + public YamiUser(String userId, String bizUserId, Integer appId, boolean enabled) { + super(appId + StrUtil.COLON + bizUserId, "", enabled,true, true, true , Collections.emptyList()); + this.userId = userId; + this.bizUserId = bizUserId; + } +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/service/YamiUserDetailsService.java b/yami-shop-security/src/main/java/com/yami/shop/security/service/YamiUserDetailsService.java new file mode 100644 index 0000000..6ce71e4 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/service/YamiUserDetailsService.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.service; + +import com.yami.shop.security.enums.App; +import com.yami.shop.security.exception.UsernameNotFoundExceptionBase; +import com.yami.shop.security.model.AppConnect; +import org.springframework.security.core.userdetails.UserDetailsService; + +/** + * 用户详细信息 + * + * @author + */ +public interface YamiUserDetailsService extends UserDetailsService { + + /** + * 获取前端登陆的用户信息 + * + * @param app 所登陆的应用 + * @param bizUserId openId + * @return UserDetails + * @throws UsernameNotFoundExceptionBase + */ + YamiUser loadUserByAppIdAndBizUserId(App app, String bizUserId); + + /** + * 如果必要的话,插入新增用户 + * @param appConnect + */ + void insertUserIfNecessary(AppConnect appConnect); +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/service/impl/AppConnectServiceImpl.java b/yami-shop-security/src/main/java/com/yami/shop/security/service/impl/AppConnectServiceImpl.java new file mode 100644 index 0000000..3406d9a --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/service/impl/AppConnectServiceImpl.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yami.shop.security.dao.AppConnectMapper; +import com.yami.shop.security.enums.App; +import com.yami.shop.security.model.AppConnect; +import com.yami.shop.security.service.AppConnectService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + + + +/** + * + * @author lgh on 2018/09/07. + */ +@Service +public class AppConnectServiceImpl extends ServiceImpl implements AppConnectService { + + @Autowired + private AppConnectMapper appConnectMapper; + + /** + * YamiUserServiceImpl#insertUserIfNecessary 将会清楚该缓存信息 + * @param bizUserId + * @param app + * @return + */ + @Override + @Cacheable(cacheNames = "AppConnect", key = "#app.value() + ':' + #bizUserId") + public AppConnect getByBizUserId(String bizUserId, App app) { + return appConnectMapper.getByBizUserId(bizUserId, app.value()); + } + +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/token/AdminAuthenticationToken.java b/yami-shop-security/src/main/java/com/yami/shop/security/token/AdminAuthenticationToken.java new file mode 100644 index 0000000..733ce82 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/token/AdminAuthenticationToken.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.token; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import java.util.Collection; + +/** + * 系统用户账号密码登陆 + */ +@Getter +@Setter +@NoArgsConstructor +public class AdminAuthenticationToken extends MyAuthenticationToken { + + private String sessionUUID; + + private String imageCode; + + public AdminAuthenticationToken(UserDetails principal, Object credentials) { + super(principal, credentials, principal.getAuthorities()); + } + + +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/token/MiniAppAuthenticationToken.java b/yami-shop-security/src/main/java/com/yami/shop/security/token/MiniAppAuthenticationToken.java new file mode 100644 index 0000000..6493905 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/token/MiniAppAuthenticationToken.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.token; + +import lombok.NoArgsConstructor; +import org.springframework.security.core.userdetails.UserDetails; + +/** + * 二维码Token + */ +@NoArgsConstructor +public class MiniAppAuthenticationToken extends MyAuthenticationToken { + + + public MiniAppAuthenticationToken(UserDetails principal, Object credentials) { + super(principal, credentials, principal.getAuthorities()); + } +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/token/MpAuthenticationToken.java b/yami-shop-security/src/main/java/com/yami/shop/security/token/MpAuthenticationToken.java new file mode 100644 index 0000000..4237eaa --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/token/MpAuthenticationToken.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.token; + +import lombok.NoArgsConstructor; +import org.springframework.security.core.userdetails.UserDetails; + +/** + * 二维码Token + */ +@NoArgsConstructor +public class MpAuthenticationToken extends MyAuthenticationToken { + + + public MpAuthenticationToken(UserDetails principal, Object credentials) { + super(principal, credentials, principal.getAuthorities()); + } +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/token/MyAuthenticationToken.java b/yami-shop-security/src/main/java/com/yami/shop/security/token/MyAuthenticationToken.java new file mode 100644 index 0000000..4087d67 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/token/MyAuthenticationToken.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.token; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.security.authentication.AbstractAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; + +import java.util.Collection; + +/** + * 自定义AbstractAuthenticationToken, + */ +@Getter +@Setter +public class MyAuthenticationToken extends AbstractAuthenticationToken { + + private static final long serialVersionUID = 110L; + protected Object principal; + protected Object credentials; + protected Boolean debugger; + + public MyAuthenticationToken() { + super(null); + } + /** + * This constructor should only be used by AuthenticationManager or AuthenticationProvider + * implementations that are satisfied with producing a trusted (i.e. {@link #isAuthenticated()} = true) + * token token. + * + * @param principal + * @param credentials + * @param authorities + */ + public MyAuthenticationToken(Object principal, Object credentials, Collection authorities) { + super(authorities); + this.principal = principal; + this.credentials = credentials; + super.setAuthenticated(true); + } + public MyAuthenticationToken(Object principal, Object credentials) { + super(null); + this.principal = principal; + this.credentials = credentials; + this.setAuthenticated(false); + } + + + @Override + public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException { + if(isAuthenticated) { + throw new IllegalArgumentException("Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead"); + } else { + super.setAuthenticated(false); + } + } + + @Override + public void eraseCredentials() { + super.eraseCredentials(); + this.credentials = null; + } + +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/util/SecurityUtils.java b/yami-shop-security/src/main/java/com/yami/shop/security/util/SecurityUtils.java new file mode 100644 index 0000000..c5e484c --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/util/SecurityUtils.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.util; + + +import com.yami.shop.security.exception.UnauthorizedExceptionBase; +import com.yami.shop.security.service.YamiSysUser; +import com.yami.shop.security.service.YamiUser; +import lombok.experimental.UtilityClass; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; + +/** + * 安全工具类 + * + * @author L.cm + */ +@UtilityClass +public class SecurityUtils { + /** + * 获取Authentication + */ + public Authentication getAuthentication() { + return SecurityContextHolder.getContext().getAuthentication(); + } + + /** + * 获取用户 + */ + public YamiUser getUser() { + Authentication authentication = getAuthentication(); + Object principal = authentication.getPrincipal(); + if (principal instanceof YamiUser) { + return (YamiUser) principal; + } + throw new UnauthorizedExceptionBase("无法获取普通用户信息"); + } + + /** + * 获取系统用户 + */ + public YamiSysUser getSysUser() { + Authentication authentication = getAuthentication(); + Object principal = authentication.getPrincipal(); + if (principal instanceof YamiSysUser) { + return (YamiSysUser) principal; + } + throw new UnauthorizedExceptionBase("无法获取系统用户信息"); + } +} diff --git a/yami-shop-security/src/main/java/com/yami/shop/security/util/YamiTokenServices.java b/yami-shop-security/src/main/java/com/yami/shop/security/util/YamiTokenServices.java new file mode 100644 index 0000000..4224bd9 --- /dev/null +++ b/yami-shop-security/src/main/java/com/yami/shop/security/util/YamiTokenServices.java @@ -0,0 +1,433 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.security.util; + +import java.util.Date; +import java.util.Set; +import java.util.UUID; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.oauth2.common.DefaultExpiringOAuth2RefreshToken; +import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; +import org.springframework.security.oauth2.common.DefaultOAuth2RefreshToken; +import org.springframework.security.oauth2.common.ExpiringOAuth2RefreshToken; +import org.springframework.security.oauth2.common.OAuth2AccessToken; +import org.springframework.security.oauth2.common.OAuth2RefreshToken; +import org.springframework.security.oauth2.common.exceptions.InvalidGrantException; +import org.springframework.security.oauth2.common.exceptions.InvalidScopeException; +import org.springframework.security.oauth2.common.exceptions.InvalidTokenException; +import org.springframework.security.oauth2.provider.ClientDetails; +import org.springframework.security.oauth2.provider.ClientDetailsService; +import org.springframework.security.oauth2.provider.ClientRegistrationException; +import org.springframework.security.oauth2.provider.OAuth2Authentication; +import org.springframework.security.oauth2.provider.OAuth2Request; +import org.springframework.security.oauth2.provider.TokenRequest; +import org.springframework.security.oauth2.provider.token.*; +import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; + +/** + * Base implementation for token services using random UUID values for the access token and refresh token values. The + * main extension point for customizations is the {@link TokenEnhancer} which will be called after the access and + * refresh tokens have been generated but before they are stored. + *

+ * Persistence is delegated to a {@code TokenStore} implementation and customization of the access token to a + * {@link TokenEnhancer}. + * + * @author Ryan Heaton + * @author Luke Taylor + * @author Dave Syer + * @author LGH + */ +public class YamiTokenServices implements AuthorizationServerTokenServices, ResourceServerTokenServices, + ConsumerTokenServices, InitializingBean { + + // default 30 days. + private int refreshTokenValiditySeconds = 60 * 60 * 24 * 30; + + // default 12 hours. + private int accessTokenValiditySeconds = 60 * 60 * 12; + + private boolean supportRefreshToken = false; + + private boolean reuseRefreshToken = true; + + private TokenStore tokenStore; + + private ClientDetailsService clientDetailsService; + + private TokenEnhancer accessTokenEnhancer; + + private AuthenticationManager authenticationManager; + + /** + * Initialize these token services. If no random generator is set, one will be created. + */ + @Override + public void afterPropertiesSet() throws Exception { + Assert.notNull(tokenStore, "tokenStore must be set"); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public OAuth2AccessToken createAccessToken(OAuth2Authentication authentication) { + + OAuth2AccessToken existingAccessToken = tokenStore.getAccessToken(authentication); + OAuth2RefreshToken refreshToken = null; + // 如果有token,直接删除,更新token,避免出现缓存问题 + if (existingAccessToken != null) { + if (existingAccessToken.getRefreshToken() != null) { + refreshToken = existingAccessToken.getRefreshToken(); + // The token store could remove the refresh token when the + // access token is removed, but we want to + // be sure... + tokenStore.removeRefreshToken(refreshToken); + } + tokenStore.removeAccessToken(existingAccessToken); + + } + + // Only create a new refresh token if there wasn't an existing one + // associated with an expired access token. + // Clients might be holding existing refresh tokens, so we re-use it in + // the case that the old access token + // expired. + if (refreshToken == null) { + refreshToken = createRefreshToken(authentication); + } + // But the refresh token itself might need to be re-issued if it has + // expired. + else if (refreshToken instanceof ExpiringOAuth2RefreshToken) { + ExpiringOAuth2RefreshToken expiring = (ExpiringOAuth2RefreshToken) refreshToken; + if (System.currentTimeMillis() > expiring.getExpiration().getTime()) { + refreshToken = createRefreshToken(authentication); + } + } + + OAuth2AccessToken accessToken = createAccessToken(authentication, refreshToken); + tokenStore.storeAccessToken(accessToken, authentication); + // In case it was modified + refreshToken = accessToken.getRefreshToken(); + if (refreshToken != null) { + tokenStore.storeRefreshToken(refreshToken, authentication); + } + return accessToken; + + } + + @Override + @Transactional(noRollbackFor={InvalidTokenException.class, InvalidGrantException.class}, rollbackFor = Exception.class) + public OAuth2AccessToken refreshAccessToken(String refreshTokenValue, TokenRequest tokenRequest) + throws AuthenticationException { + + if (!supportRefreshToken) { + throw new InvalidGrantException("Invalid refresh token: " + refreshTokenValue); + } + + OAuth2RefreshToken refreshToken = tokenStore.readRefreshToken(refreshTokenValue); + if (refreshToken == null) { + throw new InvalidGrantException("Invalid refresh token: " + refreshTokenValue); + } + + OAuth2Authentication authentication = tokenStore.readAuthenticationForRefreshToken(refreshToken); + if (this.authenticationManager != null && !authentication.isClientOnly()) { + // The client has already been authenticated, but the user authentication might be old now, so give it a + // chance to re-authenticate. + Authentication user = new PreAuthenticatedAuthenticationToken(authentication.getUserAuthentication(), "", authentication.getAuthorities()); + user = authenticationManager.authenticate(user); + Object details = authentication.getDetails(); + authentication = new OAuth2Authentication(authentication.getOAuth2Request(), user); + authentication.setDetails(details); + } + String clientId = authentication.getOAuth2Request().getClientId(); + if (clientId == null || !clientId.equals(tokenRequest.getClientId())) { + throw new InvalidGrantException("Wrong client for this refresh token: " + refreshTokenValue); + } + + // clear out any access tokens already associated with the refresh + // token. + tokenStore.removeAccessTokenUsingRefreshToken(refreshToken); + + if (isExpired(refreshToken)) { + tokenStore.removeRefreshToken(refreshToken); + throw new InvalidTokenException("Invalid refresh token (expired): " + refreshToken); + } + + authentication = createRefreshedAuthentication(authentication, tokenRequest); + + if (!reuseRefreshToken) { + tokenStore.removeRefreshToken(refreshToken); + refreshToken = createRefreshToken(authentication); + } + + OAuth2AccessToken accessToken = createAccessToken(authentication, refreshToken); + tokenStore.storeAccessToken(accessToken, authentication); + if (!reuseRefreshToken) { + tokenStore.storeRefreshToken(accessToken.getRefreshToken(), authentication); + } + return accessToken; + } + + @Override + public OAuth2AccessToken getAccessToken(OAuth2Authentication authentication) { + return tokenStore.getAccessToken(authentication); + } + + /** + * Create a refreshed authentication. + * + * @param authentication The authentication. + * @param request The scope for the refreshed token. + * @return The refreshed authentication. + * @throws InvalidScopeException If the scope requested is invalid or wider than the original scope. + */ + private OAuth2Authentication createRefreshedAuthentication(OAuth2Authentication authentication, TokenRequest request) { + OAuth2Authentication narrowed = authentication; + Set scope = request.getScope(); + OAuth2Request clientAuth = authentication.getOAuth2Request().refresh(request); + if (scope != null && !scope.isEmpty()) { + Set originalScope = clientAuth.getScope(); + if (originalScope == null || !originalScope.containsAll(scope)) { + throw new InvalidScopeException("Unable to narrow the scope of the client authentication to " + scope + + ".", originalScope); + } + else { + clientAuth = clientAuth.narrowScope(scope); + } + } + narrowed = new OAuth2Authentication(clientAuth, authentication.getUserAuthentication()); + return narrowed; + } + + protected boolean isExpired(OAuth2RefreshToken refreshToken) { + if (refreshToken instanceof ExpiringOAuth2RefreshToken) { + ExpiringOAuth2RefreshToken expiringToken = (ExpiringOAuth2RefreshToken) refreshToken; + return expiringToken.getExpiration() == null + || System.currentTimeMillis() > expiringToken.getExpiration().getTime(); + } + return false; + } + + @Override + public OAuth2AccessToken readAccessToken(String accessToken) { + return tokenStore.readAccessToken(accessToken); + } + + @Override + public OAuth2Authentication loadAuthentication(String accessTokenValue) throws AuthenticationException, + InvalidTokenException { + OAuth2AccessToken accessToken = tokenStore.readAccessToken(accessTokenValue); + if (accessToken == null) { + throw new InvalidTokenException("Invalid access token: " + accessTokenValue); + } + else if (accessToken.isExpired()) { + tokenStore.removeAccessToken(accessToken); + throw new InvalidTokenException("Access token expired: " + accessTokenValue); + } + + OAuth2Authentication result = tokenStore.readAuthentication(accessToken); + if (result == null) { + // in case of race condition + throw new InvalidTokenException("Invalid access token: " + accessTokenValue); + } + if (clientDetailsService != null) { + String clientId = result.getOAuth2Request().getClientId(); + try { + clientDetailsService.loadClientByClientId(clientId); + } + catch (ClientRegistrationException e) { + throw new InvalidTokenException("Client not valid: " + clientId, e); + } + } + return result; + } + + public String getClientId(String tokenValue) { + OAuth2Authentication authentication = tokenStore.readAuthentication(tokenValue); + if (authentication == null) { + throw new InvalidTokenException("Invalid access token: " + tokenValue); + } + OAuth2Request clientAuth = authentication.getOAuth2Request(); + if (clientAuth == null) { + throw new InvalidTokenException("Invalid access token (no client id): " + tokenValue); + } + return clientAuth.getClientId(); + } + + @Override + public boolean revokeToken(String tokenValue) { + OAuth2AccessToken accessToken = tokenStore.readAccessToken(tokenValue); + if (accessToken == null) { + return false; + } + if (accessToken.getRefreshToken() != null) { + tokenStore.removeRefreshToken(accessToken.getRefreshToken()); + } + tokenStore.removeAccessToken(accessToken); + return true; + } + + private OAuth2RefreshToken createRefreshToken(OAuth2Authentication authentication) { + if (!isSupportRefreshToken(authentication.getOAuth2Request())) { + return null; + } + int validitySeconds = getRefreshTokenValiditySeconds(authentication.getOAuth2Request()); + String value = UUID.randomUUID().toString(); + if (validitySeconds > 0) { + return new DefaultExpiringOAuth2RefreshToken(value, new Date(System.currentTimeMillis() + + (validitySeconds * 1000L))); + } + return new DefaultOAuth2RefreshToken(value); + } + + private OAuth2AccessToken createAccessToken(OAuth2Authentication authentication, OAuth2RefreshToken refreshToken) { + DefaultOAuth2AccessToken token = new DefaultOAuth2AccessToken(UUID.randomUUID().toString()); + int validitySeconds = getAccessTokenValiditySeconds(authentication.getOAuth2Request()); + if (validitySeconds > 0) { + token.setExpiration(new Date(System.currentTimeMillis() + (validitySeconds * 1000L))); + } + token.setRefreshToken(refreshToken); + token.setScope(authentication.getOAuth2Request().getScope()); + + return accessTokenEnhancer != null ? accessTokenEnhancer.enhance(token, authentication) : token; + } + + /** + * The access token validity period in seconds + * + * @param clientAuth the current authorization request + * @return the access token validity period in seconds + */ + protected int getAccessTokenValiditySeconds(OAuth2Request clientAuth) { + if (clientDetailsService != null) { + ClientDetails client = clientDetailsService.loadClientByClientId(clientAuth.getClientId()); + Integer validity = client.getAccessTokenValiditySeconds(); + if (validity != null) { + return validity; + } + } + return accessTokenValiditySeconds; + } + + /** + * The refresh token validity period in seconds + * + * @param clientAuth the current authorization request + * @return the refresh token validity period in seconds + */ + protected int getRefreshTokenValiditySeconds(OAuth2Request clientAuth) { + if (clientDetailsService != null) { + ClientDetails client = clientDetailsService.loadClientByClientId(clientAuth.getClientId()); + Integer validity = client.getRefreshTokenValiditySeconds(); + if (validity != null) { + return validity; + } + } + return refreshTokenValiditySeconds; + } + + /** + * Is a refresh token supported for this client (or the global setting if + * {@link #setClientDetailsService(ClientDetailsService) clientDetailsService} is not set. + * + * @param clientAuth the current authorization request + * @return boolean to indicate if refresh token is supported + */ + protected boolean isSupportRefreshToken(OAuth2Request clientAuth) { + if (clientDetailsService != null) { + ClientDetails client = clientDetailsService.loadClientByClientId(clientAuth.getClientId()); + return client.getAuthorizedGrantTypes().contains("refresh_token"); + } + return this.supportRefreshToken; + } + + /** + * An access token enhancer that will be applied to a new token before it is saved in the token store. + * + * @param accessTokenEnhancer the access token enhancer to set + */ + public void setTokenEnhancer(TokenEnhancer accessTokenEnhancer) { + this.accessTokenEnhancer = accessTokenEnhancer; + } + + /** + * The validity (in seconds) of the refresh token. If less than or equal to zero then the tokens will be + * non-expiring. + * + * @param refreshTokenValiditySeconds The validity (in seconds) of the refresh token. + */ + public void setRefreshTokenValiditySeconds(int refreshTokenValiditySeconds) { + this.refreshTokenValiditySeconds = refreshTokenValiditySeconds; + } + + /** + * The default validity (in seconds) of the access token. Zero or negative for non-expiring tokens. If a client + * details service is set the validity period will be read from the client, defaulting to this value if not defined + * by the client. + * + * @param accessTokenValiditySeconds The validity (in seconds) of the access token. + */ + public void setAccessTokenValiditySeconds(int accessTokenValiditySeconds) { + this.accessTokenValiditySeconds = accessTokenValiditySeconds; + } + + /** + * Whether to support the refresh token. + * + * @param supportRefreshToken Whether to support the refresh token. + */ + public void setSupportRefreshToken(boolean supportRefreshToken) { + this.supportRefreshToken = supportRefreshToken; + } + + /** + * Whether to reuse refresh tokens (until expired). + * + * @param reuseRefreshToken Whether to reuse refresh tokens (until expired). + */ + public void setReuseRefreshToken(boolean reuseRefreshToken) { + this.reuseRefreshToken = reuseRefreshToken; + } + + /** + * The persistence strategy for token storage. + * + * @param tokenStore the store for access and refresh tokens. + */ + public void setTokenStore(TokenStore tokenStore) { + this.tokenStore = tokenStore; + } + + /** + * An authentication manager that will be used (if provided) to check the user authentication when a token is + * refreshed. + * + * @param authenticationManager the authenticationManager to set + */ + public void setAuthenticationManager(AuthenticationManager authenticationManager) { + this.authenticationManager = authenticationManager; + } + + /** + * The client details service to use for looking up clients (if necessary). Optional if the access token expiry is + * set globally via {@link #setAccessTokenValiditySeconds(int)}. + * + * @param clientDetailsService the client details service + */ + public void setClientDetailsService(ClientDetailsService clientDetailsService) { + this.clientDetailsService = clientDetailsService; + } + +} diff --git a/yami-shop-security/src/main/resources/mapper/AppConnectMapper.xml b/yami-shop-security/src/main/resources/mapper/AppConnectMapper.xml new file mode 100644 index 0000000..c650a8b --- /dev/null +++ b/yami-shop-security/src/main/resources/mapper/AppConnectMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/yami-shop-service/pom.xml b/yami-shop-service/pom.xml new file mode 100644 index 0000000..72cc8c8 --- /dev/null +++ b/yami-shop-service/pom.xml @@ -0,0 +1,26 @@ + + + + yami-shop + com.yami.shop + 0.0.1-SNAPSHOT + + 4.0.0 + + yami-shop-service + + + + com.yami.shop + yami-shop-bean + ${yami.shop.version} + + + com.yami.shop + yami-shop-common + ${yami.shop.version} + + + diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/AreaMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/AreaMapper.java new file mode 100644 index 0000000..0c78655 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/AreaMapper.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import com.yami.shop.bean.model.Area; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yami.shop.common.util.PageAdapter;import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface AreaMapper extends BaseMapper { +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/AttachFileMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/AttachFileMapper.java new file mode 100644 index 0000000..0d31110 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/AttachFileMapper.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import org.apache.ibatis.annotations.Param; + +import com.yami.shop.bean.model.AttachFile; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface AttachFileMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/BasketMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/BasketMapper.java new file mode 100644 index 0000000..69697a0 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/BasketMapper.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +import com.yami.shop.bean.app.dto.BasketItemDto; +import com.yami.shop.bean.app.dto.OrderItemDto; +import com.yami.shop.bean.app.param.ShopCartParam; +import org.apache.ibatis.annotations.Param; + +import com.yami.shop.bean.app.dto.ShopCartItemDto; +import com.yami.shop.bean.model.Basket; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface BasketMapper extends BaseMapper { + + List getShopCartItems(@Param("userId") String userId); + + void deleteShopCartItemsByBasketIds(@Param("userId") String userId, @Param("basketIds") List basketIds); + + void deleteAllShopCartItems(@Param("userId") String userId); + + List getShopCartExpiryItems(@Param("userId") String userId); + + void cleanExpiryProdList(@Param("userId") String userId); + + List shopCartItemDtoList(@Param("basketIdList")List basketIdList); + + void updateDiscountItemId(@Param("userId")String userId, @Param("basketIdShopCartParamMap") Map basketIdShopCartParamMap); + + List listUserIdByProdId(@Param("prodId")Long prodId); + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/BrandMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/BrandMapper.java new file mode 100644 index 0000000..c0f6611 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/BrandMapper.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.yami.shop.bean.model.Brand; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface BrandMapper extends BaseMapper { + + Brand getByBrandName(String brandName); + + /** + * 根据分类id获取品牌列表 + * + * @param categoryId 分类id + * @return + */ + List listByCategoryId(@Param("categoryId")Long categoryId); +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/CategoryBrandMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/CategoryBrandMapper.java new file mode 100644 index 0000000..408152b --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/CategoryBrandMapper.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.yami.shop.bean.model.CategoryBrand; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface CategoryBrandMapper extends BaseMapper { + + void insertCategoryBrand(@Param("categoryId") Long categoryId, @Param("brandIds") List brandIds); + + void deleteByCategoryId(Long categoryId); + + void deleteByBrandId(Long brandId); +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/CategoryMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/CategoryMapper.java new file mode 100644 index 0000000..56574ba --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/CategoryMapper.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import java.util.List; + +import com.yami.shop.bean.model.Category; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface CategoryMapper extends BaseMapper { + + List listByParentId(Long parentId); + + List tableCategory(Long shopId); + + List listCategoryAndProdByShopId(Long shopId); +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/CategoryPropMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/CategoryPropMapper.java new file mode 100644 index 0000000..51d09b1 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/CategoryPropMapper.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.yami.shop.bean.model.CategoryProp; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface CategoryPropMapper extends BaseMapper { + + void insertCategoryProp(@Param("categoryId") Long categoryId, @Param("propIds") List propIds); + + void deleteByCategoryId(Long categoryId); + + void deleteByPropId(Long propId); +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/DeliveryMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/DeliveryMapper.java new file mode 100644 index 0000000..c3c2a4b --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/DeliveryMapper.java @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import com.yami.shop.bean.model.Delivery; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface DeliveryMapper extends BaseMapper { +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/HotSearchMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/HotSearchMapper.java new file mode 100644 index 0000000..abea398 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/HotSearchMapper.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import com.yami.shop.bean.dto.HotSearchDto; +import com.yami.shop.bean.model.HotSearch; + +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +public interface HotSearchMapper extends BaseMapper { + List getHotSearchDtoByShopId(Long shopId); +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/IndexImgMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/IndexImgMapper.java new file mode 100644 index 0000000..662e5be --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/IndexImgMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.yami.shop.bean.model.IndexImg; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface IndexImgMapper extends BaseMapper { + + void deleteIndexImgsByIds(@Param("ids") Long[] ids); + + List listIndexImgs(); +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/LoginHistMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/LoginHistMapper.java new file mode 100644 index 0000000..5e61b60 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/LoginHistMapper.java @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import com.yami.shop.bean.model.LoginHist; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface LoginHistMapper extends BaseMapper { +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/MessageMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/MessageMapper.java new file mode 100644 index 0000000..353d2ea --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/MessageMapper.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import com.yami.shop.bean.model.Message; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface MessageMapper extends BaseMapper { + + void deleteByIds(Long[] ids); +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/NoticeMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/NoticeMapper.java new file mode 100644 index 0000000..7344bc0 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/NoticeMapper.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yami.shop.bean.app.dto.NoticeDto; +import com.yami.shop.bean.model.Notice; + +/** + * 公告管理 + * + * @author hzm + * @date 2019-04-18 21:21:40 + */ +public interface NoticeMapper extends BaseMapper { + + Page pageNotice(Page page); +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/OrderItemMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/OrderItemMapper.java new file mode 100644 index 0000000..99ca989 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/OrderItemMapper.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.yami.shop.bean.app.dto.OrderItemDto; +import com.yami.shop.bean.model.OrderItem; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface OrderItemMapper extends BaseMapper { + + List listByOrderNumber(@Param("orderNumber") String orderNumber); + + void insertBatch(List orderItems); + +// List getPayByOrderNumber(@Param("orderNumber") String orderNumber); + +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/OrderMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/OrderMapper.java new file mode 100644 index 0000000..8e31006 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/OrderMapper.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import cn.hutool.core.date.DateTime; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yami.shop.bean.app.dto.MyOrderDto; +import com.yami.shop.bean.app.dto.OrderCountData; +import com.yami.shop.bean.distribution.UserShoppingDataDto; +import com.yami.shop.bean.model.Order; +import com.yami.shop.bean.param.OrderParam; +import com.yami.shop.common.util.PageAdapter; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +public interface OrderMapper extends BaseMapper { + + Order getOrderByOrderNumber(@Param("orderNumber") String orderNumber); + + List listOrderAndOrderItems(@Param("orderStatus") Integer orderStatus, @Param("lessThanUpdateTime") DateTime lessThanUpdateTime); + + void cancelOrders(@Param("orders") List orders); + + void confirmOrder(@Param("orders") List orders); + + void updateByToPaySuccess(@Param("orderNumbers") List orderNumbers, @Param("payType") Integer payType); + + List listOrdersDetialByOrder(@Param("order") Order order, @Param("startTime") Date startTime, @Param("endTime") Date endTime); + + List listOrdersDetialByOrderParam(@Param("adapter") PageAdapter adapter, @Param("orderParam") OrderParam orderParam); + + Long countOrderDetial(@Param("orderParam") OrderParam orderParam); + + List listBoughtProdByUserIdAndShopId(@Param("shopId") Long shopId, @Param("userId") String userId); + + UserShoppingDataDto calculateUserInShopData(@Param("shopId") Long shopId, @Param("userId") String userId); + + List listMyOrderByUserIdAndStatus(@Param("adapter") PageAdapter adapter, @Param("userId") String userId, @Param("status") Integer status); + + Long countMyOrderByUserIdAndStatus(@Param("userId") String userId, @Param("status") Integer status); + + void deleteOrders(@Param("orders") List orders); + + OrderCountData getOrderCount(String userId); + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/OrderRefundMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/OrderRefundMapper.java new file mode 100644 index 0000000..d2f3d2b --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/OrderRefundMapper.java @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import com.yami.shop.bean.model.OrderRefund; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface OrderRefundMapper extends BaseMapper { +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/OrderSettlementMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/OrderSettlementMapper.java new file mode 100644 index 0000000..0c13994 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/OrderSettlementMapper.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.yami.shop.bean.model.OrderSettlement; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface OrderSettlementMapper extends BaseMapper { + + void updateByOrderNumberAndUserId(@Param("orderSettlement") OrderSettlement orderSettlement); + + List getSettlementsByPayNo(@Param("payNo") String payNo); + + void updateSettlementsByPayNo(@Param("outTradeNo") String outTradeNo, @Param("transactionId") String transactionId); + + int updateToPay(@Param("payNo") String payNo, @Param("version") Integer version); +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/PickAddrMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/PickAddrMapper.java new file mode 100644 index 0000000..9dbcbfb --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/PickAddrMapper.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import org.apache.ibatis.annotations.Param; + +import com.yami.shop.bean.model.PickAddr; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface PickAddrMapper extends BaseMapper { + + void deleteByIds(@Param("ids") Long[] ids); +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/PointsChangeMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/PointsChangeMapper.java new file mode 100644 index 0000000..9579034 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/PointsChangeMapper.java @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import com.yami.shop.bean.model.PointsChange; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface PointsChangeMapper extends BaseMapper { +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/PointsMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/PointsMapper.java new file mode 100644 index 0000000..52aca81 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/PointsMapper.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yami.shop.bean.model.Points; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +public interface PointsMapper extends BaseMapper { + IPage getPointsAndSysUserPage(Page page, @Param("points") Points points); + + List getNameAndId(@Param("points") Points points); + + void deleteByIds(@Param("ids") List ids); +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/PointsProdMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/PointsProdMapper.java new file mode 100644 index 0000000..1b3769d --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/PointsProdMapper.java @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import com.yami.shop.bean.model.PointsProd; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface PointsProdMapper extends BaseMapper { +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/PointsWalletMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/PointsWalletMapper.java new file mode 100644 index 0000000..c10ba81 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/PointsWalletMapper.java @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import com.yami.shop.bean.model.PointsWallet; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface PointsWalletMapper extends BaseMapper { +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/ProdCommMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/ProdCommMapper.java new file mode 100644 index 0000000..dcb9577 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/ProdCommMapper.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yami.shop.bean.app.dto.ProdCommDataDto; +import com.yami.shop.bean.app.dto.ProdCommDto; +import com.yami.shop.bean.model.PointsWallet; +import com.yami.shop.bean.model.ProdComm; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface ProdCommMapper extends BaseMapper { + ProdCommDataDto getProdCommDataByProdId(@Param("prodId") Long prodId, @Param("userId") String userId); + + IPage getProdCommDtoPageByProdId(@Param("page") Page page, @Param("prodId") Long prodId, @Param("evaluate") Integer evaluate, @Param("userId") String userId); + + IPage getProdCommDtoPageByUserId(Page page, @Param("userId") String userId); + + IPage getProdCommPage(Page page, @Param("prodComm") ProdComm prodComm); +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/ProdImgMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/ProdImgMapper.java new file mode 100644 index 0000000..05d4caf --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/ProdImgMapper.java @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import com.yami.shop.bean.model.ProdImg; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface ProdImgMapper extends BaseMapper { +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/ProdPropMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/ProdPropMapper.java new file mode 100644 index 0000000..87bb88b --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/ProdPropMapper.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yami.shop.bean.model.ProdProp; +import com.yami.shop.common.util.PageAdapter; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface ProdPropMapper extends BaseMapper { + + List listPropAndValue(@Param("adapter") PageAdapter adapter, @Param("prodProp") ProdProp prodProp); + + long countPropAndValue(@Param("prodProp") ProdProp prodProp); + + int deleteByPropId(@Param("propId") Long propId, @Param("rule") Integer rule, @Param("shopId") Long shopId); + + List listByCategoryId(Long categoryId); + + ProdProp getProdPropByPropNameAndShopId(@Param("propName") String propName, @Param("shopId") Long shopId, @Param("rule") Integer rule); +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/ProdPropValueMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/ProdPropValueMapper.java new file mode 100644 index 0000000..13b4e16 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/ProdPropValueMapper.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.yami.shop.bean.model.ProdPropValue; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface ProdPropValueMapper extends BaseMapper { + + void insertPropValues(@Param("propId") Long propId, @Param("prodPropValues") List prodPropValues); + + void deleteByPropId(@Param("propId") Long propId); +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/ProdTagMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/ProdTagMapper.java new file mode 100644 index 0000000..14dfbe5 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/ProdTagMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yami.shop.bean.model.ProdTag; + +/** + * 商品分组 + * + * @author hzm + * @date 2019-04-18 09:08:36 + */ +public interface ProdTagMapper extends BaseMapper { + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/ProdTagReferenceMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/ProdTagReferenceMapper.java new file mode 100644 index 0000000..2510cf0 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/ProdTagReferenceMapper.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yami.shop.bean.model.ProdTag; +import com.yami.shop.bean.model.ProdTagReference; +import com.yami.shop.bean.model.Sku; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 分组标签引用 + * + * @author hzm + * @date 2019-04-18 16:28:01 + */ +public interface ProdTagReferenceMapper extends BaseMapper { + void insertBatch(@Param("shopId") Long shopId, @Param("prodId") Long prodId, @Param("tagList") List tagList); + + List listTagIdByProdId(@Param("prodId") Long prodId); + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/ProductMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/ProductMapper.java new file mode 100644 index 0000000..3ebcf1e --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/ProductMapper.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yami.shop.bean.app.dto.ProductDto; +import com.yami.shop.bean.app.dto.TagProductDto; +import com.yami.shop.bean.dto.SearchProdDto; +import com.yami.shop.common.util.PageParam; +import org.apache.ibatis.annotations.Param; + +import com.yami.shop.bean.model.Product; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface ProductMapper extends BaseMapper { + + int updateStocks(@Param("prod") Product product); + + Product getProductByProdNameAndShopId(@Param("prodName") String prodName, @Param("shopId") Long shopId); + + void returnStock(@Param("prodCollect") Map prodCollect); + + IPage pageByPutawayTime(IPage page); + + IPage pageByTagId(Page page, @Param("tagId") Long tagId); + + IPage discountProdList(Page page); + + IPage moreBuyProdList(Page page); + + IPage pageByCategoryId(Page page, @Param("categoryId") Long categoryId); + + List listProdByCategoryId(@Param("categoryId") Long categoryId); + + IPage getSearchProdDtoPageByProdName(Page page, @Param("prodName") String prodName, @Param("sort") Integer sort, @Param("orderBy") Integer orderBy); + + TagProductDto tagProdList(@Param("tagId") Long tagId); + + List tagProdList(); + + IPage pageByDiscountId(Page page, @Param("discountId") Long discountId); + + /** + * 查看店铺的所有活动商品 + */ + IPage listByShopId(@Param("page") PageParam page, @Param("shopId") Long shopId); + + /** + * 通过优惠券适用商品类型、优惠券id、店铺id获取商品列表 + */ + IPage listBySuitableProdTypeAndCouponIdAndShopId(@Param("page") PageParam page, @Param("shopId") Long shopId, @Param("suitableProdType") Integer suitableProdType, @Param("couponId") Long couponId); + + /** + * 获取用户的收藏商品列表 + * + * @param userId + * @return + */ + IPage collectionProds(@Param("page") PageParam page, @Param("userId") String userId); + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/ScoreLogMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/ScoreLogMapper.java new file mode 100644 index 0000000..8edfa30 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/ScoreLogMapper.java @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import com.yami.shop.bean.model.ScoreLog; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface ScoreLogMapper extends BaseMapper { +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/SensWordMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/SensWordMapper.java new file mode 100644 index 0000000..55fcfd8 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/SensWordMapper.java @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import com.yami.shop.bean.model.SensWord; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface SensWordMapper extends BaseMapper { +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/ShopDetailMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/ShopDetailMapper.java new file mode 100644 index 0000000..1b44eb2 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/ShopDetailMapper.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import com.yami.shop.bean.model.ShopDetail; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface ShopDetailMapper extends BaseMapper { + + Integer getIsDistributionByShopId(Long shopId); +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/SkuMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/SkuMapper.java new file mode 100644 index 0000000..95cfb95 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/SkuMapper.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.annotations.Param; + +import com.yami.shop.bean.model.Sku; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface SkuMapper extends BaseMapper { + + /** + * 批量插入sku + * @param prodId 商品id + * @param skus sku列表 + */ + void insertBatch(@Param("prodId") Long prodId, @Param("skuList") List skuList); + + List listByProdId(Long prodId); + + int updateStocks(@Param("sku") Sku sku); + + void deleteByProdId(@Param("prodId") Long prodId); + + void returnStock(@Param("skuCollect") Map skuCollect); + +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/SmsLogMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/SmsLogMapper.java new file mode 100644 index 0000000..b6f39de --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/SmsLogMapper.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import org.apache.ibatis.annotations.Param; + +import com.yami.shop.bean.model.SmsLog; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface SmsLogMapper extends BaseMapper { + + void invalidSmsByMobileAndType(@Param("mobile") String mobile, @Param("type") Integer type); +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/TranscityFreeMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/TranscityFreeMapper.java new file mode 100644 index 0000000..0f0741f --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/TranscityFreeMapper.java @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import com.yami.shop.bean.model.TranscityFree; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface TranscityFreeMapper extends BaseMapper { +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/TranscityMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/TranscityMapper.java new file mode 100644 index 0000000..97c8ac6 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/TranscityMapper.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.yami.shop.bean.model.Transcity; +import com.yami.shop.bean.model.TranscityFree; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface TranscityMapper extends BaseMapper { + + void insertTranscities(@Param("transcities") List transcities); + + void insertTranscityFrees(@Param("transcityFrees") List transcityFrees); + + List listTranscityAndArea(@Param("transfeeId") Long transfeeId); + + void deleteBatchByTransfeeIds(@Param("transfeeIds") List transfeeIds); + + void deleteBatchByTransfeeFreeIds(@Param("transfeeFreeIds") List transfeeFreeIds); + +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/TransfeeFreeMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/TransfeeFreeMapper.java new file mode 100644 index 0000000..466955e --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/TransfeeFreeMapper.java @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import com.yami.shop.bean.model.TransfeeFree; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface TransfeeFreeMapper extends BaseMapper { +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/TransfeeMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/TransfeeMapper.java new file mode 100644 index 0000000..66dae93 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/TransfeeMapper.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.yami.shop.bean.model.Transfee; +import com.yami.shop.bean.model.TransfeeFree; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface TransfeeMapper extends BaseMapper { + + void insertTransfees(List transfees); + + void insertTransfeeFrees(List transfeeFrees); + + void deleteByTransportId(@Param("transportId") Long transportId); + + void deleteTransfeeFreesByTransportId(@Param("transportId") Long transportId); + + +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/TransportMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/TransportMapper.java new file mode 100644 index 0000000..8e2d56e --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/TransportMapper.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.yami.shop.bean.model.TransfeeFree; +import com.yami.shop.bean.model.Transport; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface TransportMapper extends BaseMapper { + + Transport getTransportAndTransfeeAndTranscity(@Param("id") Long id); + + void deleteTransports(@Param("ids") Long[] ids); + + List getTransfeeFreeAndTranscityFreeByTransportId(@Param("transportId") Long transportId); + +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/UserAddrMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/UserAddrMapper.java new file mode 100644 index 0000000..ac726f2 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/UserAddrMapper.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import org.apache.ibatis.annotations.Param; + +import com.yami.shop.bean.model.UserAddr; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface UserAddrMapper extends BaseMapper { + + UserAddr getDefaultUserAddr(@Param("userId") String userId); + + /** + * 移除用户默认地址 + * @param userId + */ + void removeDefaultUserAddr(@Param("userId") String userId); + + /** + * 将地址设置为默认地址 + * @param addrId + * @param userId + */ + int setDefaultUserAddr(@Param("addrId") Long addrId, @Param("userId") String userId); + + UserAddr getUserAddrByUserIdAndAddrId(@Param("userId") String userId, @Param("addrId") Long addrId); +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/UserAddrOrderMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/UserAddrOrderMapper.java new file mode 100644 index 0000000..3f7f05b --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/UserAddrOrderMapper.java @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import com.yami.shop.bean.model.UserAddrOrder; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface UserAddrOrderMapper extends BaseMapper { +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/UserCollectionMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/UserCollectionMapper.java new file mode 100644 index 0000000..d447d82 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/UserCollectionMapper.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yami.shop.bean.app.dto.UserCollectionDto; +import com.yami.shop.bean.model.UserCollection; +import org.apache.commons.lang3.StringUtils; + +/** + * 用户收藏表 + * + * @author xwc + * @date 2019-04-19 16:57:20 + */ +public interface UserCollectionMapper extends BaseMapper { + IPage getUserCollectionDtoPageByUserId(Page page, String userId); + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/UserMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/UserMapper.java new file mode 100644 index 0000000..174a034 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/UserMapper.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yami.shop.bean.model.User; +import com.yami.shop.bean.vo.UserVO; +import org.apache.ibatis.annotations.Param; + +public interface UserMapper extends BaseMapper { + + User getUserByBizUserId(@Param("appId")Integer appId, @Param("bizUserId")String bizUserId); +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/dao/WxOrderMapper.java b/yami-shop-service/src/main/java/com/yami/shop/dao/WxOrderMapper.java new file mode 100644 index 0000000..3076830 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/dao/WxOrderMapper.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.dao; + +import com.yami.shop.bean.model.WxOrder; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface WxOrderMapper extends BaseMapper { + + void updateStatusByFlowTradeNo(String outTradeNo); + +} \ No newline at end of file diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/AreaService.java b/yami-shop-service/src/main/java/com/yami/shop/service/AreaService.java new file mode 100644 index 0000000..217991d --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/AreaService.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.Area; + +import java.util.List; +import java.util.Map; + +/** + * @author lgh on 2018/10/26. + */ +public interface AreaService extends IService { + + /** + * 通过pid 查找地址接口 + * + * @param pid 父id + * @return + */ + List listByPid(Long pid); + + /** + * 通过pid 清除地址缓存 + * + * @param pid + */ + void removeAreaCacheByParentId(Long pid); + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/AttachFileService.java b/yami-shop-service/src/main/java/com/yami/shop/service/AttachFileService.java new file mode 100644 index 0000000..8097c2c --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/AttachFileService.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import java.io.IOException; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.AttachFile; + +/** + * + * Created by lgh on 2018/07/27. + */ +public interface AttachFileService extends IService { + + String uploadFile(byte[] bytes,String originalName) throws IOException; + + void deleteFile(String fileName); +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/BasketService.java b/yami-shop-service/src/main/java/com/yami/shop/service/BasketService.java new file mode 100644 index 0000000..921aceb --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/BasketService.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.app.dto.*; +import com.yami.shop.bean.app.param.ChangeShopCartParam; +import com.yami.shop.bean.app.param.OrderItemParam; +import com.yami.shop.bean.app.param.ShopCartParam; +import com.yami.shop.bean.model.Basket; + +/** + * @author lgh on 2018/10/18. + */ +public interface BasketService extends IService { + + void deleteShopCartItemsByBasketIds(String userId, List basketIds); + + void addShopCartItem(ChangeShopCartParam param, String userId); + + void updateShopCartItem(Basket basket); + + void deleteAllShopCartItems(String userId); + + List getShopCartItems(String userId); + + List getShopCartExpiryItems(String userId); + + void cleanExpiryProdList(String userId); + + void updateBasketByShopCartParam(String userId, Map basketIdShopCartParamMap); + + void removeShopCartItemsCacheByUserId(String userId); + + /** + * 获取购物车中拥有某件商品的用户,用于清除该用户购物车的缓存 + * @param prodId 商品id + * @return 用户id + */ + List listUserIdByProdId(Long prodId); + + /** + * 根据店铺组装购车中的商品信息,返回每个店铺中的购物车商品信息 + * @param shopCartItems 指定的购物项目 + * @return 每个店铺的购物车信息 + */ + List getShopCarts(List shopCartItems); + + /** + * 组装获取用户提交的购物车商品项 + * @param orderItems 提交订单时携带的商品信息 + * @param userId 当前用户的用户id + * @return 所有的商品购物项 + */ + List getShopCartItemsByOrderItems(List basketId, OrderItemParam orderItem,String userId); + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/BrandService.java b/yami-shop-service/src/main/java/com/yami/shop/service/BrandService.java new file mode 100644 index 0000000..6695c19 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/BrandService.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.Brand; + +import java.util.List; + +/** + * + * Created by lgh on 2018/07/05. + */ +public interface BrandService extends IService { + + /** + * 根据品牌名称获取该品牌 + * @param brandName + * @return + */ + Brand getByBrandName(String brandName); + + /** + * 删除品牌,同时删除品牌与分类之间的关联关系 + * @param brandId + */ + void deleteByBrand(Long brandId); + + /** + * 根据分类id获取品牌列表 + * @param categoryId 分类id + * @return + */ + List listByCategoryId(Long categoryId); + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/CategoryBrandService.java b/yami-shop-service/src/main/java/com/yami/shop/service/CategoryBrandService.java new file mode 100644 index 0000000..a6a79b3 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/CategoryBrandService.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.CategoryBrand; + +/** + * + * Created by lgh on 2018/07/13. + */ +public interface CategoryBrandService extends IService { + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/CategoryPropService.java b/yami-shop-service/src/main/java/com/yami/shop/service/CategoryPropService.java new file mode 100644 index 0000000..ff47338 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/CategoryPropService.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.CategoryProp; + +/** + * + * Created by lgh on 2018/07/13. + */ +public interface CategoryPropService extends IService { + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/CategoryService.java b/yami-shop-service/src/main/java/com/yami/shop/service/CategoryService.java new file mode 100644 index 0000000..be0c49d --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/CategoryService.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import java.util.List; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.app.dto.CategoryDto; +import com.yami.shop.bean.model.Category; + +/** + * 商品分类 + */ +public interface CategoryService extends IService { + + /** + * 根据parentId获取分类 + * @param parentId 0 一级分类 + * @return + */ + List listByParentId(Long parentId); + + /** + * 获取用于页面表单展现的category列表,根据seq排序 + * @return + */ + List tableCategory(Long shopId); + + /** + * 保存分类、品牌、参数 + * @return + */ + void saveCategroy(Category category); + + /** + * 修改分类、品牌、参数 + * @return + */ + void updateCategroy(Category category); + + /** + * 删除分类、品牌、参数 以及分类对应的图片 + * @param qiniu + * @return + */ + void deleteCategroy(Long categoryId); + + /** + * 根据店铺id和层级,获取商品分类树 + * @param shopId + * @param grade + * @return + */ + List treeSelect(Long shopId,int grade); + + List listCategoryDtoByShopId(Long shopId); + +// List listCategoryDtoByParentId(Long parentId); + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/DeliveryService.java b/yami-shop-service/src/main/java/com/yami/shop/service/DeliveryService.java new file mode 100644 index 0000000..da73c62 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/DeliveryService.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.Delivery; + +/** + * + * @author lgh on 2018/11/26. + */ +public interface DeliveryService extends IService { + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/HotSearchService.java b/yami-shop-service/src/main/java/com/yami/shop/service/HotSearchService.java new file mode 100644 index 0000000..169f2f8 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/HotSearchService.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.dto.HotSearchDto; +import com.yami.shop.bean.model.HotSearch; +import com.yami.shop.dao.HotSearchMapper; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * + * @author lgh on 2019/03/27. + */ +public interface HotSearchService extends IService { + + List getHotSearchDtoByshopId(Long shopId); + + void removeHotSearchDtoCacheByshopId(Long shopId); +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/IndexImgService.java b/yami-shop-service/src/main/java/com/yami/shop/service/IndexImgService.java new file mode 100644 index 0000000..750ce97 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/IndexImgService.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.IndexImg; + +import java.util.List; + +/** + * + * @author lgh on 2018/11/26. + */ +public interface IndexImgService extends IService { + + void deleteIndexImgsByIds(Long[] ids); + + List listIndexImgs(); + + void removeIndexImgs(); +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/MessageService.java b/yami-shop-service/src/main/java/com/yami/shop/service/MessageService.java new file mode 100644 index 0000000..601e878 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/MessageService.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.Message; + +/** + * + * @author lgh on 2018/10/15. + */ +public interface MessageService extends IService { + + void deleteByIds(Long[] ids); + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/MyOrderService.java b/yami-shop-service/src/main/java/com/yami/shop/service/MyOrderService.java new file mode 100644 index 0000000..cb2304d --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/MyOrderService.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.app.dto.MyOrderDto; +import com.yami.shop.bean.model.Order; + +/** + * 我的订单 + * @author lgh + */ +public interface MyOrderService extends IService { + + /** + * 通过用户id和订单状态分页获取订单信息 + * @param page 分页参数 + * @param userId 用户id + * @param status 订单状态 + * @return + */ + IPage pageMyOrderByUserIdAndStatus(Page page, String userId, Integer status); +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/NoticeService.java b/yami-shop-service/src/main/java/com/yami/shop/service/NoticeService.java new file mode 100644 index 0000000..f8d28b8 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/NoticeService.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.app.dto.NoticeDto; +import com.yami.shop.bean.model.Notice; + +import java.util.List; + +/** + * 公告管理 + * + * @author hzm + * @date 2019-04-18 21:21:40 + */ +public interface NoticeService extends IService { + + List listNotice(); + + void removeNoticeList(); + + Page pageNotice(Page page); + + Notice getNoticeById(Long noticeId); + + void removeNoticeById(Long noticeId); +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/OrderItemService.java b/yami-shop-service/src/main/java/com/yami/shop/service/OrderItemService.java new file mode 100644 index 0000000..9348f36 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/OrderItemService.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import java.util.List; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.OrderItem; + +/** + * + * @author lgh on 2018/09/15. + */ +public interface OrderItemService extends IService { + + List getOrderItemsByOrderNumber(String orderNumber); + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/OrderService.java b/yami-shop-service/src/main/java/com/yami/shop/service/OrderService.java new file mode 100644 index 0000000..80b0805 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/OrderService.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import java.util.Date; +import java.util.List; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.app.dto.OrderCountData; +import com.yami.shop.bean.app.dto.ShopCartOrderMergerDto; +import com.yami.shop.bean.model.Order; +import com.yami.shop.bean.param.OrderParam; + +import cn.hutool.core.date.DateTime; + +/** + * @author lgh on 2018/09/15. + */ +public interface OrderService extends IService { + + + Order getOrderByOrderNumber(String orderNumber); + + ShopCartOrderMergerDto putConfirmOrderCache(String userId ,ShopCartOrderMergerDto shopCartOrderMergerDto); + + ShopCartOrderMergerDto getConfirmOrderCache(String userId); + + void removeConfirmOrderCache(String userId); + + List submit(String userId, ShopCartOrderMergerDto mergerOrder); + + void delivery(Order order); + + List listOrderAndOrderItems(Integer orderStatus, DateTime lessThanUpdateTime); + + void cancelOrders(List orders); + + void confirmOrder(List orders); + + List listOrdersDetialByOrder(Order order, Date startTime, Date endTime); + + IPage pageOrdersDetialByOrderParam(Page page, OrderParam orderParam); + + void deleteOrders(List orders); + + OrderCountData getOrderCount(String userId); +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/OrderSettlementService.java b/yami-shop-service/src/main/java/com/yami/shop/service/OrderSettlementService.java new file mode 100644 index 0000000..57223a1 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/OrderSettlementService.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.OrderSettlement; + +/** + * + * @author lgh on 2018/11/10. + */ +public interface OrderSettlementService extends IService { + + /** + * 根据内部订单号更新order settlement + */ + void updateSettlementsByPayNo(String outTradeNo, String transactionId); +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/PayService.java b/yami-shop-service/src/main/java/com/yami/shop/service/PayService.java new file mode 100644 index 0000000..dcf3c9b --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/PayService.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.yami.shop.bean.app.param.PayParam; +import com.yami.shop.bean.pay.PayInfoDto; + +import java.util.List; + +/** + * @author lgh on 2018/09/15. + */ +public interface PayService { + + + PayInfoDto pay(String userId, PayParam payParam); + + List paySuccess(String payNo, String bizPayNo); + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/PickAddrService.java b/yami-shop-service/src/main/java/com/yami/shop/service/PickAddrService.java new file mode 100644 index 0000000..813d1b7 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/PickAddrService.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.PickAddr; + +/** + * + * @author lgh on 2018/10/17. + */ +public interface PickAddrService extends IService { + + void deleteByIds(Long[] ids); + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/PointsChangeService.java b/yami-shop-service/src/main/java/com/yami/shop/service/PointsChangeService.java new file mode 100644 index 0000000..739a11f --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/PointsChangeService.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.PointsChange; + +/** + * + * @author lgh on 2019/04/10. + */ +public interface PointsChangeService extends IService { + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/PointsProdService.java b/yami-shop-service/src/main/java/com/yami/shop/service/PointsProdService.java new file mode 100644 index 0000000..6c5f108 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/PointsProdService.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.PointsProd; + +/** + * + * @author lgh on 2019/04/10. + */ +public interface PointsProdService extends IService { + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/PointsService.java b/yami-shop-service/src/main/java/com/yami/shop/service/PointsService.java new file mode 100644 index 0000000..2c41557 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/PointsService.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.Points; + +import java.util.List; + +/** + * + * @author lgh on 2019/04/10. + */ +public interface PointsService extends IService { + IPage getPointsAndSysUserPage(Page page ,Points points); + + List getNameAndId(Points points); + + void deleteByIds(List ids); +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/PointsWalletService.java b/yami-shop-service/src/main/java/com/yami/shop/service/PointsWalletService.java new file mode 100644 index 0000000..b694650 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/PointsWalletService.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.PointsWallet; + +/** + * + * @author lgh on 2019/04/10. + */ +public interface PointsWalletService extends IService { + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/ProdCommService.java b/yami-shop-service/src/main/java/com/yami/shop/service/ProdCommService.java new file mode 100644 index 0000000..ee4e4c1 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/ProdCommService.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.app.dto.ProdCommDataDto; +import com.yami.shop.bean.app.dto.ProdCommDto; +import com.yami.shop.bean.model.ProdComm; + +import java.util.List; + + +/** + * 商品评论 + * + * @author xwc + * @date 2019-04-19 10:43:57 + */ +public interface ProdCommService extends IService { + ProdCommDataDto getProdCommDataByProdId(Long prodId, String userId); + + IPage getProdCommDtoPageByUserId(Page page,String userId); + + IPage getProdCommDtoPageByProdId(Page page, Long prodId, Integer evaluate, String userId); + + IPage getProdCommPage(Page page,ProdComm prodComm); + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/ProdPropService.java b/yami-shop-service/src/main/java/com/yami/shop/service/ProdPropService.java new file mode 100644 index 0000000..88522f2 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/ProdPropService.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.ProdProp; + +import java.util.List; + +/** + * + * Created by lgh on 2018/07/06. + */ +public interface ProdPropService extends IService { + + /** + * 获取属性与属性值 + * @param prodProp + * @param page + * @return + */ + IPage pagePropAndValue(ProdProp prodProp, Page page); + + /** + * 保存属性、属性值 + * @param prodProp + */ + void saveProdPropAndValues(ProdProp prodProp); + + /** + * 更新属性、属性值 + * @param prodProp + */ + void updateProdPropAndValues(ProdProp prodProp); + + /** + * 删除属性、属性值 + * 如果propRule为2,同时删除分类与属性值之间的关联关系 + */ + void deleteProdPropAndValues(Long propId,Integer propRule,Long shopId); + + /** + * 根据分类id获取分类所关联的属性 + * @param categoryId + * @return + */ + List listByCategoryId(Long categoryId); + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/ProdPropValueService.java b/yami-shop-service/src/main/java/com/yami/shop/service/ProdPropValueService.java new file mode 100644 index 0000000..6dcaeff --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/ProdPropValueService.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.ProdPropValue; + +/** + * + * Created by lgh on 2018/07/06. + */ +public interface ProdPropValueService extends IService { + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/ProdTagReferenceService.java b/yami-shop-service/src/main/java/com/yami/shop/service/ProdTagReferenceService.java new file mode 100644 index 0000000..30fa1ba --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/ProdTagReferenceService.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.ProdTagReference; + +import java.util.List; + +/** + * 分组标签引用 + * + * @author hzm + * @date 2019-04-18 16:28:01 + */ +public interface ProdTagReferenceService extends IService { + + List listTagIdByProdId(Long prodId); +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/ProdTagService.java b/yami-shop-service/src/main/java/com/yami/shop/service/ProdTagService.java new file mode 100644 index 0000000..85384c4 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/ProdTagService.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.ProdTag; + +import java.util.List; + +/** + * 商品分组标签 + * + * @author hzm + * @date 2019-04-18 10:48:44 + */ +public interface ProdTagService extends IService { + + List listProdTag(); + + void removeProdTag(); +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/ProductService.java b/yami-shop-service/src/main/java/com/yami/shop/service/ProductService.java new file mode 100644 index 0000000..e33fd00 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/ProductService.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.app.dto.ProductDto; +import com.yami.shop.bean.app.dto.TagProductDto; +import com.yami.shop.bean.dto.SearchProdDto; +import com.yami.shop.bean.model.Product; +import com.yami.shop.common.util.PageParam; + +import java.util.List; + +/** + * 商品 + */ +public interface ProductService extends IService { + + /** + * 保存商品 + * + * @param product 商品信息 + */ + void saveProduct(Product product); + + /** + * 更新商品 + * + * @param product 商品信息 + */ + void updateProduct(Product product, Product dbProduct); + + /** + * 根据商品id获取商品信息 + * + * @param prodId + * @return + */ + Product getProductByProdId(Long prodId); + + + void removeProductByProdId(Long prodId); + + void removeProductCacheByProdId(Long prodId); + + IPage pageByPutawayTime(IPage page); + + IPage pageByTagId(Page page, Long tagId); + + IPage discountProdList(Page page); + + IPage moreBuyProdList(Page page); + + IPage pageByCategoryId(Page page, Long categoryId); + + List listProdByCategoryId(Long categoryId); + + IPage getSearchProdDtoPageByProdName(Page page, String prodName, Integer sort, Integer orderBy); + + List tagProdList(); + + IPage pageByDiscountId(Page page, Long discountId); + + IPage collectionProds(PageParam page, String userId); +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/ScoreLogService.java b/yami-shop-service/src/main/java/com/yami/shop/service/ScoreLogService.java new file mode 100644 index 0000000..193edbf --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/ScoreLogService.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.ScoreLog; + +/** + * + * @author lgh on 2018/10/15. + */ +public interface ScoreLogService extends IService { + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/ShopDetailService.java b/yami-shop-service/src/main/java/com/yami/shop/service/ShopDetailService.java new file mode 100644 index 0000000..d4ea41a --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/ShopDetailService.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.ShopDetail; + +/** + * + * @author lgh on 2018/08/29. + */ +public interface ShopDetailService extends IService { + + void updateShopDetail(ShopDetail shopDetail,ShopDetail dbShopDetail); + + void deleteShopDetailByShopId(Long id); + + /** + * 根据店铺id获取店铺信息 + * @param shopId + * @return + */ + ShopDetail getShopDetailByShopId(Long shopId); + + void removeShopDetailCacheByShopId(Long shopId); +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/SkuService.java b/yami-shop-service/src/main/java/com/yami/shop/service/SkuService.java new file mode 100644 index 0000000..22e1c7e --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/SkuService.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import java.util.List; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.Sku; +import org.springframework.cache.annotation.CacheEvict; + +/** + * + * @author lgh on 2018/09/29. + */ +public interface SkuService extends IService { + + /** + * 根据商品id获取商品中的sku列表(将会被缓存起来) + * @param prodId 商品id + * @return sku列表 + */ + List listByProdId(Long prodId); + + /** + * 根据skuId获取sku信息(将会被缓存起来) + * @param skuId + * @return + */ + Sku getSkuBySkuId(Long skuId); + + void removeSkuCacheBySkuId(Long skuId,Long prodId); +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/SmsLogService.java b/yami-shop-service/src/main/java/com/yami/shop/service/SmsLogService.java new file mode 100644 index 0000000..421d153 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/SmsLogService.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import java.util.Map; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.enums.SmsType; +import com.yami.shop.bean.model.SmsLog; + +/** + * + * @author lgh on 2018/11/29. + */ +public interface SmsLogService extends IService { + + public void sendSms(SmsType smsType,String userId,String mobile,Map params); + + public boolean checkValidCode(String mobile, String code,SmsType smsType); +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/TranscityFreeService.java b/yami-shop-service/src/main/java/com/yami/shop/service/TranscityFreeService.java new file mode 100644 index 0000000..d41084b --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/TranscityFreeService.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.TranscityFree; + +/** + * + * @author lgh on 2018/12/20. + */ +public interface TranscityFreeService extends IService { + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/TranscityService.java b/yami-shop-service/src/main/java/com/yami/shop/service/TranscityService.java new file mode 100644 index 0000000..8a187f4 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/TranscityService.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import java.util.List; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.Transcity; + +/** + * + * @author lgh on 2018/11/16. + */ +public interface TranscityService extends IService { + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/TransfeeFreeService.java b/yami-shop-service/src/main/java/com/yami/shop/service/TransfeeFreeService.java new file mode 100644 index 0000000..1220067 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/TransfeeFreeService.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.TransfeeFree; + +/** + * + * @author lgh on 2018/12/20. + */ +public interface TransfeeFreeService extends IService { + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/TransfeeService.java b/yami-shop-service/src/main/java/com/yami/shop/service/TransfeeService.java new file mode 100644 index 0000000..b2e04ed --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/TransfeeService.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.Transfee; + +/** + * + * @author lgh on 2018/11/16. + */ +public interface TransfeeService extends IService { + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/TransportManagerService.java b/yami-shop-service/src/main/java/com/yami/shop/service/TransportManagerService.java new file mode 100644 index 0000000..04ebf5b --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/TransportManagerService.java @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.yami.shop.bean.app.dto.ProductItemDto; +import com.yami.shop.bean.model.UserAddr; + +public interface TransportManagerService { + + Double calculateTransfee(ProductItemDto productItem, UserAddr userAddr); +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/TransportService.java b/yami-shop-service/src/main/java/com/yami/shop/service/TransportService.java new file mode 100644 index 0000000..d77aeb7 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/TransportService.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.Transport; +import org.springframework.cache.annotation.CacheEvict; + +/** + * + * @author lgh on 2018/11/16. + */ +public interface TransportService extends IService { + + void insertTransportAndTransfee(Transport transport); + + void updateTransportAndTransfee(Transport transport); + + void deleteTransportAndTransfeeAndTranscity(Long[] ids); + + Transport getTransportAndAllItems(Long transportId); + + @CacheEvict(cacheNames = "TransportAndAllItems", key = "#transportId") + default void removeTransportAndAllItemsCache(Long transportId){} + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/UserAddrOrderService.java b/yami-shop-service/src/main/java/com/yami/shop/service/UserAddrOrderService.java new file mode 100644 index 0000000..a8ba1c3 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/UserAddrOrderService.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.UserAddrOrder; + +public interface UserAddrOrderService extends IService { + + +} + diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/UserAddrService.java b/yami-shop-service/src/main/java/com/yami/shop/service/UserAddrService.java new file mode 100644 index 0000000..168af34 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/UserAddrService.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.UserAddr; +import org.springframework.cache.annotation.CacheEvict; + +public interface UserAddrService extends IService { + + UserAddr getDefaultUserAddr(String userId); + + /** + * 更新默认地址 + * @param addrId 默认地址id + * @param userId 用户id + */ + void updateDefaultUserAddr(Long addrId, String userId); + + + void removeUserAddrByUserId(Long addrId, String userId); + + UserAddr getUserAddrByUserId(Long addrId, String userId); +} + diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/UserCollectionService.java b/yami-shop-service/src/main/java/com/yami/shop/service/UserCollectionService.java new file mode 100644 index 0000000..c4c9310 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/UserCollectionService.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.app.dto.UserCollectionDto; +import com.yami.shop.bean.model.UserCollection; + +/** + * 用户收藏表 + * + * @author xwc + * @date 2019-04-19 16:57:20 + */ +public interface UserCollectionService extends IService { + IPage getUserCollectionDtoPageByUserId(Page page, String userId); +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/UserService.java b/yami-shop-service/src/main/java/com/yami/shop/service/UserService.java new file mode 100644 index 0000000..fd3f32a --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/UserService.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.User; +import com.yami.shop.bean.vo.UserVO; + +/** + * + * @author lgh on 2018/09/11. + */ +public interface UserService extends IService { + + User getUserByUserId(String userId); +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/WxOrderService.java b/yami-shop-service/src/main/java/com/yami/shop/service/WxOrderService.java new file mode 100644 index 0000000..21974c8 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/WxOrderService.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.bean.model.WxOrder; + +/** + * + * @author lgh on 2018/09/18. + */ +public interface WxOrderService extends IService { +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/AreaServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/AreaServiceImpl.java new file mode 100644 index 0000000..0f07c78 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/AreaServiceImpl.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yami.shop.bean.model.Area; +import com.yami.shop.dao.AreaMapper; +import com.yami.shop.service.AreaService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author lgh on 2018/10/26. + */ +@Service +public class AreaServiceImpl extends ServiceImpl implements AreaService { + + @Autowired + private AreaMapper areaMapper; + + @Override + @Cacheable(cacheNames = "area", key = "#pid") + public List listByPid(Long pid) { + return areaMapper.selectList(new LambdaQueryWrapper().eq(Area::getParentId, pid)); + } + + @Override + @CacheEvict(cacheNames = "area", key = "#pid") + public void removeAreaCacheByParentId(Long pid) { + + } +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/AttachFileServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/AttachFileServiceImpl.java new file mode 100644 index 0000000..a08cbe8 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/AttachFileServiceImpl.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import java.util.Date; + +import cn.hutool.core.util.IdUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.qiniu.common.QiniuException; +import com.qiniu.http.Response; +import com.qiniu.storage.BucketManager; +import com.qiniu.storage.UploadManager; +import com.qiniu.storage.model.DefaultPutRet; +import com.qiniu.util.Auth; +import com.yami.shop.bean.model.AttachFile; +import com.yami.shop.common.bean.Qiniu; +import com.yami.shop.common.util.Json; +import com.yami.shop.dao.AttachFileMapper; +import com.yami.shop.service.AttachFileService; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.RandomUtil; + +/** + * + * Created by lgh on 2018/07/27. + */ +@Service +public class AttachFileServiceImpl extends ServiceImpl implements AttachFileService { + + @Autowired + private AttachFileMapper attachFileMapper; + + @Autowired + private UploadManager uploadManager; + + @Autowired + private BucketManager bucketManager; + @Autowired + private Qiniu qiniu; + + @Autowired + private Auth auth; + + public final static String NORM_MONTH_PATTERN = "yyyy/MM/"; + + @Override + public String uploadFile(byte[] bytes,String originalName) throws QiniuException { + String extName = FileUtil.extName(originalName); + String fileName =DateUtil.format(new Date(), NORM_MONTH_PATTERN)+ IdUtil.simpleUUID() + "." + extName; + + + AttachFile attachFile = new AttachFile(); + attachFile.setFilePath(fileName); + attachFile.setFileSize(bytes.length); + attachFile.setFileType(extName); + attachFile.setUploadTime(new Date()); + attachFileMapper.insert(attachFile); + + String upToken = auth.uploadToken(qiniu.getBucket(),fileName); + Response response = uploadManager.put(bytes, fileName, upToken); + Json.parseObject(response.bodyString(), DefaultPutRet.class); + return fileName; + } + + @Override + public void deleteFile(String fileName){ + attachFileMapper.delete(new LambdaQueryWrapper().eq(AttachFile::getFilePath,fileName)); + try { + bucketManager.delete(qiniu.getBucket(), fileName); + } catch (QiniuException e) { + throw new RuntimeException(e); + } + } + + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/BasketServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/BasketServiceImpl.java new file mode 100644 index 0000000..0f20a55 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/BasketServiceImpl.java @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; +import com.yami.shop.bean.app.dto.*; +import com.yami.shop.bean.app.param.ChangeShopCartParam; +import com.yami.shop.bean.app.param.OrderItemParam; +import com.yami.shop.bean.app.param.ShopCartParam; +import com.yami.shop.bean.event.ShopCartEvent; +import com.yami.shop.bean.model.Basket; +import com.yami.shop.bean.model.Product; +import com.yami.shop.bean.model.ShopDetail; +import com.yami.shop.bean.model.Sku; +import com.yami.shop.common.util.Arith; +import com.yami.shop.common.util.CacheManagerUtil; +import com.yami.shop.dao.BasketMapper; +import com.yami.shop.service.BasketService; +import com.yami.shop.service.ProductService; +import com.yami.shop.service.ShopDetailService; +import com.yami.shop.service.SkuService; +import lombok.AllArgsConstructor; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author lgh on 2018/10/18. + */ +@Service +@AllArgsConstructor +public class BasketServiceImpl extends ServiceImpl implements BasketService { + + private final BasketMapper basketMapper; + + private final CacheManagerUtil cacheManagerUtil; + + private final ApplicationContext applicationContext; + + private final SkuService skuService; + + private final ShopDetailService shopDetailService; + + private final ProductService productService; + + @Override + @CacheEvict(cacheNames = "ShopCartItems", key = "#userId") + public void deleteShopCartItemsByBasketIds(String userId, List basketIds) { + basketMapper.deleteShopCartItemsByBasketIds(userId, basketIds); + } + + @Override + @CacheEvict(cacheNames = "ShopCartItems", key = "#userId") + public void addShopCartItem(ChangeShopCartParam param, String userId) { + Basket basket = new Basket(); + basket.setBasketCount(param.getCount()); + basket.setBasketDate(new Date()); + basket.setProdId(param.getProdId()); + basket.setShopId(param.getShopId()); + basket.setUserId(userId); + basket.setSkuId(param.getSkuId()); + basket.setDistributionCardNo(param.getDistributionCardNo()); + basketMapper.insert(basket); + } + + @Override + @CacheEvict(cacheNames = "ShopCartItems", key = "#basket.userId") + public void updateShopCartItem(Basket basket) { + basketMapper.updateById(basket); + } + + @Override + @CacheEvict(cacheNames = "ShopCartItems", key = "#userId") + public void deleteAllShopCartItems(String userId) { + basketMapper.deleteAllShopCartItems(userId); + } + + @Override + public List getShopCartItems(String userId) { + // 在这个类里面要调用这里的缓存信息,并没有使用aop,所以不使用注解 + List shopCartItemDtoList = cacheManagerUtil.getCache("ShopCartItems", userId); + if (shopCartItemDtoList != null) { + return shopCartItemDtoList; + } + shopCartItemDtoList = basketMapper.getShopCartItems(userId); + for (ShopCartItemDto shopCartItemDto : shopCartItemDtoList) { + shopCartItemDto.setProductTotalAmount(Arith.mul(shopCartItemDto.getProdCount(), shopCartItemDto.getPrice())); + } + cacheManagerUtil.putCache("ShopCartItems", userId, shopCartItemDtoList); + return shopCartItemDtoList; + } + + @Override + public List getShopCartExpiryItems(String userId) { + return basketMapper.getShopCartExpiryItems(userId); + } + + @Override + @CacheEvict(cacheNames = "ShopCartItems", key = "#userId") + public void cleanExpiryProdList(String userId) { + basketMapper.cleanExpiryProdList(userId); + } + + @Override + @CacheEvict(cacheNames = "ShopCartItems", key = "#userId") + public void updateBasketByShopCartParam(String userId, Map basketIdShopCartParamMap) { + basketMapper.updateDiscountItemId(userId, basketIdShopCartParamMap); + } + + @Override + @CacheEvict(cacheNames = "ShopCartItems", key = "#userId") + public void removeShopCartItemsCacheByUserId(String userId) { + + } + + @Override + public List listUserIdByProdId(Long prodId) { + return basketMapper.listUserIdByProdId(prodId); + } + + @Override + public List getShopCarts(List shopCartItems) { + // 根据店铺ID划分item + Map> shopCartMap = shopCartItems.stream().collect(Collectors.groupingBy(ShopCartItemDto::getShopId)); + + // 返回一个店铺的所有信息 + List shopCartDtos = Lists.newArrayList(); + for (Long shopId : shopCartMap.keySet()) { + + //获取店铺的所有商品项 + List shopCartItemDtoList = shopCartMap.get(shopId); + + // 构建每个店铺的购物车信息 + ShopCartDto shopCart = new ShopCartDto(); + + //店铺信息 + shopCart.setShopId(shopId); + shopCart.setShopName(shopCartItemDtoList.get(0).getShopName()); + + applicationContext.publishEvent(new ShopCartEvent(shopCart, shopCartItemDtoList)); + + shopCartDtos.add(shopCart); + } + + return shopCartDtos; + } + + @Override + public List getShopCartItemsByOrderItems(List basketId, OrderItemParam orderItem,String userId) { + if (orderItem == null && CollectionUtil.isEmpty(basketId)) { + return Collections.emptyList(); + } + + // 当立即购买时,没有提交的订单是没有购物车信息的 + if (CollectionUtil.isEmpty(basketId) && orderItem != null) { + + Sku sku = skuService.getSkuBySkuId(orderItem.getSkuId()); + if (sku == null) { + throw new RuntimeException("订单包含无法识别的商品"); + } + Product prod = productService.getProductByProdId(orderItem.getProdId()); + if (prod == null) { + throw new RuntimeException("订单包含无法识别的商品"); + } + + // 拿到购物车的所有item + ShopCartItemDto shopCartItemDto = new ShopCartItemDto(); + shopCartItemDto.setBasketId(-1L); + shopCartItemDto.setSkuId(orderItem.getSkuId()); + shopCartItemDto.setProdCount(orderItem.getProdCount()); + shopCartItemDto.setProdId(orderItem.getProdId()); + shopCartItemDto.setSkuName(sku.getSkuName()); + shopCartItemDto.setPic(StrUtil.isBlank(sku.getPic())? prod.getPic() : sku.getPic()); + shopCartItemDto.setProdName(sku.getProdName()); + shopCartItemDto.setProductTotalAmount(Arith.mul(sku.getPrice(),orderItem.getProdCount())); + shopCartItemDto.setPrice(sku.getPrice()); + shopCartItemDto.setDistributionCardNo(orderItem.getDistributionCardNo()); + shopCartItemDto.setBasketDate(new Date()); + ShopDetail shopDetail = shopDetailService.getShopDetailByShopId(orderItem.getShopId()); + shopCartItemDto.setShopId(shopDetail.getShopId()); + shopCartItemDto.setShopName(shopDetail.getShopName()); + return Collections.singletonList(shopCartItemDto); + } + List dbShopCartItems = getShopCartItems(userId); + + // 返回购物车选择的商品信息 + return dbShopCartItems + .stream() + .filter(shopCartItemDto -> basketId.contains(shopCartItemDto.getBasketId())) + .collect(Collectors.toList()); + } + + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/BrandServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/BrandServiceImpl.java new file mode 100644 index 0000000..a33ac7c --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/BrandServiceImpl.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yami.shop.bean.model.Brand; +import com.yami.shop.dao.BrandMapper; +import com.yami.shop.dao.CategoryBrandMapper; +import com.yami.shop.service.BrandService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * + * Created by lgh on 2018/07/05. + */ +@Service +public class BrandServiceImpl extends ServiceImpl implements BrandService { + + @Autowired + private BrandMapper brandMapper; + + @Autowired + private CategoryBrandMapper categoryBrandMapper; + + @Override + public Brand getByBrandName(String brandName) { + return brandMapper.getByBrandName(brandName); + } + + @Override + public void deleteByBrand(Long brandId) { + brandMapper.deleteById(brandId); + categoryBrandMapper.deleteByBrandId(brandId); + } + + @Override + public List listByCategoryId(Long categoryId) { + return brandMapper.listByCategoryId(categoryId); + } + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/CategoryBrandServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/CategoryBrandServiceImpl.java new file mode 100644 index 0000000..680c94f --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/CategoryBrandServiceImpl.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.yami.shop.bean.model.CategoryBrand; +import com.yami.shop.dao.CategoryBrandMapper; +import com.yami.shop.service.CategoryBrandService; + +/** + * + * Created by lgh on 2018/07/13. + */ +@Service +public class CategoryBrandServiceImpl extends ServiceImpl implements CategoryBrandService { + + @Autowired + private CategoryBrandMapper categoryBrandMapper; + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/CategoryPropServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/CategoryPropServiceImpl.java new file mode 100644 index 0000000..7d7acb4 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/CategoryPropServiceImpl.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.yami.shop.bean.model.CategoryProp; +import com.yami.shop.dao.CategoryPropMapper; +import com.yami.shop.service.CategoryPropService; + +/** + * + * Created by lgh on 2018/07/13. + */ +@Service +public class CategoryPropServiceImpl extends ServiceImpl implements CategoryPropService { + + @Autowired + private CategoryPropMapper categoryPropMapper; + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/CategoryServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/CategoryServiceImpl.java new file mode 100644 index 0000000..203dbb8 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/CategoryServiceImpl.java @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.google.common.collect.Lists; +import com.yami.shop.bean.app.dto.CategoryDto; +import com.yami.shop.bean.model.Category; +import com.yami.shop.dao.CategoryBrandMapper; +import com.yami.shop.dao.CategoryMapper; +import com.yami.shop.dao.CategoryPropMapper; +import com.yami.shop.service.AttachFileService; +import com.yami.shop.service.CategoryService; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import ma.glasnost.orika.MapperFacade; + +@Service +public class CategoryServiceImpl extends ServiceImpl implements CategoryService{ + + @Autowired + private CategoryMapper categoryMapper; + + @Autowired + private CategoryBrandMapper categoryBrandMapper; + + @Autowired + private CategoryPropMapper categoryPropMapper; + + @Autowired + private AttachFileService attachFileService; + + @Autowired + private MapperFacade mapperFacade; + + @Override + public List listByParentId(Long parentId) { + return categoryMapper.listByParentId(parentId); + } + + @Override + public List tableCategory(Long shopId) { + return categoryMapper.tableCategory(shopId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveCategroy(Category category) { + category.setRecTime(new Date()); + // 保存分类信息 + categoryMapper.insert(category); + + insertBrandsAndAttributes(category); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateCategroy(Category category) { + Category dbCategory = categoryMapper.selectById(category.getCategoryId()); + category.setUpdateTime(new Date()); + // 保存分类信息 + categoryMapper.updateById(category); + // 先删除后增加 + deleteBrandsAndAttributes(category.getCategoryId()); + insertBrandsAndAttributes(category); + // 如果以前有图片,并且图片与现在不同,则删除以前的图片 + if (StrUtil.isNotBlank(dbCategory.getPic()) && !dbCategory.getPic().equals(category.getPic())) { + attachFileService.deleteFile(dbCategory.getPic()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteCategroy(Long categoryId) { + Category category = categoryMapper.selectById(categoryId); + categoryMapper.deleteById(categoryId); + + deleteBrandsAndAttributes(categoryId); + if (StrUtil.isNotBlank(category.getPic())) { + attachFileService.deleteFile(category.getPic()); + } + } + + + private void deleteBrandsAndAttributes(Long categoryId) { + // 删除所有分类所关联的品牌 + categoryBrandMapper.deleteByCategoryId(categoryId); + // 删除所有分类所关联的参数 + categoryPropMapper.deleteByCategoryId(categoryId); + } + + private void insertBrandsAndAttributes(Category category) { + //保存分类与品牌信息 + if(CollUtil.isNotEmpty(category.getBrandIds())){ + categoryBrandMapper.insertCategoryBrand(category.getCategoryId(), category.getBrandIds()); + } + + //保存分类与参数信息 + if(CollUtil.isNotEmpty(category.getAttributeIds())){ + categoryPropMapper.insertCategoryProp(category.getCategoryId(), category.getAttributeIds()); + } + } + + @Override + public List treeSelect(Long shopId,int grade) { + List categories = categoryMapper.selectList(new LambdaQueryWrapper().le(Category::getGrade,grade).eq(Category::getShopId,shopId)); + return categoryListToTree(categories); + } + + public List categoryListToTree(List categorys){ + if (CollectionUtils.isEmpty(categorys)) { + return Lists.newArrayList(); + } + Map> categoryMap = categorys.stream().collect(Collectors.groupingBy(Category::getParentId)); + + List rootList = categoryMap.get(0L); + transformCategoryTree(rootList,categoryMap); + return rootList; + } + + public void transformCategoryTree(List categorys,Map> categoryMap) { + for (Category category : categorys) { + List nextList = categoryMap.get(category.getCategoryId()); + if (CollectionUtils.isEmpty(nextList)) { + continue; + } + // 将排序完成的list设为下一层级 + category.setCategories(nextList); + // 处理下 下一层级 + transformCategoryTree(nextList, categoryMap); + } + } + + @Override + public List listCategoryDtoByShopId(Long shopId) { + List categoryList = categoryMapper.listCategoryAndProdByShopId(shopId); + return mapperFacade.mapAsList(categoryList, CategoryDto.class); + } + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/DeliveryServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/DeliveryServiceImpl.java new file mode 100644 index 0000000..d004788 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/DeliveryServiceImpl.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.yami.shop.bean.model.Delivery; +import com.yami.shop.dao.DeliveryMapper; + +import com.yami.shop.service.DeliveryService; + +/** + * + * @author lgh on 2018/11/26. + */ +@Service +public class DeliveryServiceImpl extends ServiceImpl implements DeliveryService { + + @Autowired + private DeliveryMapper deliveryMapper; + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/HotSearchServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/HotSearchServiceImpl.java new file mode 100644 index 0000000..84b5e01 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/HotSearchServiceImpl.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yami.shop.bean.dto.HotSearchDto; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import com.yami.shop.bean.model.HotSearch; +import com.yami.shop.dao.HotSearchMapper; + +import com.yami.shop.service.HotSearchService; + +import java.util.List; + +/** + * + * @author lgh on 2019/03/27. + */ +@Service +public class HotSearchServiceImpl extends ServiceImpl implements HotSearchService { + + @Autowired + private HotSearchMapper hotSearchMapper; + + @Override + @Cacheable(cacheNames = "HotSearchDto", key = "#shopId") + public List getHotSearchDtoByshopId(Long shopId) { + return hotSearchMapper.getHotSearchDtoByShopId(shopId); + } + + @Override + @CacheEvict(cacheNames = "HotSearchDto", key = "#shopId") + public void removeHotSearchDtoCacheByshopId(Long shopId) { + + } +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/IndexImgServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/IndexImgServiceImpl.java new file mode 100644 index 0000000..972cc61 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/IndexImgServiceImpl.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import com.yami.shop.bean.model.IndexImg; +import com.yami.shop.dao.IndexImgMapper; +import com.yami.shop.service.IndexImgService; + +import java.util.List; + +/** + * + * @author lgh on 2018/11/26. + */ +@Service +public class IndexImgServiceImpl extends ServiceImpl implements IndexImgService { + + @Autowired + private IndexImgMapper indexImgMapper; + + @Override + public void deleteIndexImgsByIds(Long[] ids) { + indexImgMapper.deleteIndexImgsByIds(ids); + } + + @Override + @Cacheable(cacheNames = "indexImg", key = "'indexImg'") + public List listIndexImgs() { + return indexImgMapper.listIndexImgs(); + } + + @Override + @CacheEvict(cacheNames = "indexImg", key = "'indexImg'") + public void removeIndexImgs() { + } +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/MessageServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/MessageServiceImpl.java new file mode 100644 index 0000000..9f8557d --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/MessageServiceImpl.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.yami.shop.bean.model.Message; +import com.yami.shop.dao.MessageMapper; +import com.yami.shop.service.MessageService; + +/** + * + * @author lgh on 2018/10/15. + */ +@Service +public class MessageServiceImpl extends ServiceImpl implements MessageService { + + @Autowired + private MessageMapper messageMapper; + + @Override + public void deleteByIds(Long[] ids) { + messageMapper.deleteByIds(ids); + } + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/MyOrderServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/MyOrderServiceImpl.java new file mode 100644 index 0000000..b000b2b --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/MyOrderServiceImpl.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import java.util.List; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yami.shop.bean.app.dto.MyOrderItemDto; +import com.yami.shop.bean.app.dto.ProductDto; +import com.yami.shop.common.util.PageAdapter; +import org.apache.commons.collections.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.yami.shop.bean.app.dto.MyOrderDto; +import com.yami.shop.bean.model.Order; +import com.yami.shop.dao.OrderMapper; +import com.yami.shop.service.MyOrderService; + +/** + * @author lgh on 2018/09/15. + */ +@Service +public class MyOrderServiceImpl extends ServiceImpl implements MyOrderService { + + @Autowired + private OrderMapper orderMapper; + + private static final Logger log = LoggerFactory.getLogger(MyOrderServiceImpl.class); + + + @Override + public IPage pageMyOrderByUserIdAndStatus(Page page, String userId, Integer status) { + page.setRecords(orderMapper.listMyOrderByUserIdAndStatus(new PageAdapter(page), userId, status)); + page.setTotal(orderMapper.countMyOrderByUserIdAndStatus(userId, status)); + return page; + } + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/NoticeServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/NoticeServiceImpl.java new file mode 100644 index 0000000..a2675f6 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/NoticeServiceImpl.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yami.shop.bean.app.dto.NoticeDto; +import com.yami.shop.bean.model.Notice; +import com.yami.shop.dao.NoticeMapper; +import com.yami.shop.service.NoticeService; +import lombok.AllArgsConstructor; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 公告管理 + * + * @author hzm + * @date 2019-04-18 21:21:40 + */ +@Service +@AllArgsConstructor +public class NoticeServiceImpl extends ServiceImpl implements NoticeService { + + private NoticeMapper noticeMapper; + + @Override + @Cacheable(cacheNames = "notices", key = "'notices'") + public List listNotice() { + return noticeMapper.selectList(new LambdaQueryWrapper() + .eq(Notice::getStatus, 1) + .eq(Notice::getIsTop, 1) + .orderByDesc(Notice::getPublishTime)); + } + + @Override + @CacheEvict(cacheNames = "notices", key = "'notices'") + public void removeNoticeList() { + } + + @Override + public Page pageNotice(Page page) { + return noticeMapper.pageNotice(page); + } + + @Override + @Cacheable(cacheNames = "notice", key = "#noticeId") + public Notice getNoticeById(Long noticeId) { + return noticeMapper.selectById(noticeId); + } + + @Override + @CacheEvict(cacheNames = "notice", key = "#noticeId") + public void removeNoticeById(Long noticeId) { + } + + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderItemServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderItemServiceImpl.java new file mode 100644 index 0000000..19da0a8 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderItemServiceImpl.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import java.util.List; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import com.yami.shop.bean.app.dto.OrderItemDto; +import com.yami.shop.bean.model.OrderItem; +import com.yami.shop.dao.OrderItemMapper; +import com.yami.shop.service.OrderItemService; + +/** + * + * @author lgh on 2018/09/15. + */ +@Service +public class OrderItemServiceImpl extends ServiceImpl implements OrderItemService { + + @Autowired + private OrderItemMapper orderItemMapper; + + @Override + @Cacheable(cacheNames = "OrderItems", key = "#orderNumber") + public List getOrderItemsByOrderNumber(String orderNumber) { + return orderItemMapper.listByOrderNumber(orderNumber); + } + + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderServiceImpl.java new file mode 100644 index 0000000..46815d5 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderServiceImpl.java @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateTime; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yami.shop.bean.app.dto.OrderCountData; +import com.yami.shop.bean.app.dto.ShopCartOrderMergerDto; +import com.yami.shop.bean.event.CancelOrderEvent; +import com.yami.shop.bean.event.ReceiptOrderEvent; +import com.yami.shop.bean.event.SubmitOrderEvent; +import com.yami.shop.bean.model.Order; +import com.yami.shop.bean.model.OrderItem; +import com.yami.shop.bean.param.OrderParam; +import com.yami.shop.common.util.PageAdapter; +import com.yami.shop.dao.OrderItemMapper; +import com.yami.shop.dao.OrderMapper; +import com.yami.shop.dao.ProductMapper; +import com.yami.shop.dao.SkuMapper; +import com.yami.shop.service.OrderService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author lgh on 2018/09/15. + */ +@Service +public class OrderServiceImpl extends ServiceImpl implements OrderService { + + @Autowired + private OrderMapper orderMapper; + + @Autowired + private SkuMapper skuMapper; + + @Autowired + private OrderItemMapper orderItemMapper; + + @Autowired + private ProductMapper productMapper; + + + @Autowired + private ApplicationEventPublisher eventPublisher; + + @Override + public Order getOrderByOrderNumber(String orderNumber) { + return orderMapper.getOrderByOrderNumber(orderNumber); + } + + @Override + @CachePut(cacheNames = "ConfirmOrderCache", key = "#userId") + public ShopCartOrderMergerDto putConfirmOrderCache(String userId, ShopCartOrderMergerDto shopCartOrderMergerDto) { + return shopCartOrderMergerDto; + } + + @Override + @Cacheable(cacheNames = "ConfirmOrderCache", key = "#userId") + public ShopCartOrderMergerDto getConfirmOrderCache(String userId) { + return null; + } + + @Override + @CacheEvict(cacheNames = "ConfirmOrderCache", key = "#userId") + public void removeConfirmOrderCache(String userId) { + } + + @Override + @Transactional(rollbackFor = Exception.class) + public List submit(String userId, ShopCartOrderMergerDto mergerOrder) { + List orderList = new ArrayList<>(); + // 通过事务提交订单 + eventPublisher.publishEvent(new SubmitOrderEvent(mergerOrder, orderList)); + + // 插入订单 + orderList.forEach(order -> orderMapper.insert(order)); + List orderItems = orderList.stream().flatMap(order -> order.getOrderItems().stream()).collect(Collectors.toList()); + // 插入订单项,返回主键 + orderItemMapper.insertBatch(orderItems); + + + return orderList; + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void delivery(Order order) { + orderMapper.updateById(order); + // 发送用户发货通知 + Map params = new HashMap<>(16); + params.put("orderNumber", order.getOrderNumber()); +// Delivery delivery = deliveryMapper.selectById(order.getDvyId()); +// params.put("dvyName", delivery.getDvyName()); +// params.put("dvyFlowId", order.getDvyFlowId()); +// smsLogService.sendSms(SmsType.NOTIFY_DVY, order.getUserId(), order.getMobile(), params); + + } + + @Override + public List listOrderAndOrderItems(Integer orderStatus, DateTime lessThanUpdateTime) { + return orderMapper.listOrderAndOrderItems(orderStatus, lessThanUpdateTime); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void cancelOrders(List orders) { + + orderMapper.cancelOrders(orders); + List allOrderItems = new ArrayList<>(); + for (Order order : orders) { + List orderItems = order.getOrderItems(); + allOrderItems.addAll(orderItems); + eventPublisher.publishEvent(new CancelOrderEvent(order)); + } + if (CollectionUtil.isEmpty(allOrderItems)) { + return; + } + Map prodCollect = new HashMap<>(16); + allOrderItems.stream().collect(Collectors.groupingBy(OrderItem::getProdId)).forEach((prodId, orderItems) -> { + int prodTotalNum = orderItems.stream().mapToInt(OrderItem::getProdCount).sum(); + prodCollect.put(prodId, prodTotalNum); + }); + productMapper.returnStock(prodCollect); + + Map skuCollect = new HashMap<>(16); + allOrderItems.stream().collect(Collectors.groupingBy(OrderItem::getSkuId)).forEach((skuId, orderItems) -> { + int prodTotalNum = orderItems.stream().mapToInt(OrderItem::getProdCount).sum(); + skuCollect.put(skuId, prodTotalNum); + }); + skuMapper.returnStock(skuCollect); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void confirmOrder(List orders) { + orderMapper.confirmOrder(orders); + for (Order order : orders) { + eventPublisher.publishEvent(new ReceiptOrderEvent(order)); + } + + } + + @Override + public List listOrdersDetialByOrder(Order order, Date startTime, Date endTime) { + return orderMapper.listOrdersDetialByOrder(order, startTime, endTime); + } + + @Override + public IPage pageOrdersDetialByOrderParam(Page page, OrderParam orderParam) { + page.setRecords(orderMapper.listOrdersDetialByOrderParam(new PageAdapter(page), orderParam)); + page.setTotal(orderMapper.countOrderDetial(orderParam)); + return page; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteOrders(List orders) { + orderMapper.deleteOrders(orders); + } + + @Override + public OrderCountData getOrderCount(String userId) { + return orderMapper.getOrderCount(userId); + } + + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderSettlementServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderSettlementServiceImpl.java new file mode 100644 index 0000000..8513193 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderSettlementServiceImpl.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.yami.shop.bean.model.OrderSettlement; +import com.yami.shop.dao.OrderSettlementMapper; +import com.yami.shop.service.OrderSettlementService; + +/** + * + * @author lgh on 2018/11/10. + */ +@Service +public class OrderSettlementServiceImpl extends ServiceImpl implements OrderSettlementService { + + @Autowired + private OrderSettlementMapper orderSettlementMapper; + + @Override + public void updateSettlementsByPayNo(String outTradeNo, String transactionId) { + orderSettlementMapper.updateSettlementsByPayNo(outTradeNo, transactionId); + } + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/PayServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/PayServiceImpl.java new file mode 100644 index 0000000..c862232 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/PayServiceImpl.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import cn.hutool.core.lang.Snowflake; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yami.shop.bean.enums.PayType; +import com.yami.shop.bean.event.PaySuccessOrderEvent; +import com.yami.shop.bean.model.Order; +import com.yami.shop.bean.model.OrderSettlement; +import com.yami.shop.bean.app.param.PayParam; +import com.yami.shop.bean.pay.PayInfoDto; +import com.yami.shop.common.exception.YamiShopBindException; +import com.yami.shop.common.util.Arith; +import com.yami.shop.dao.OrderMapper; +import com.yami.shop.dao.OrderSettlementMapper; +import com.yami.shop.service.PayService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author lgh on 2018/09/15. + */ +@Service +public class PayServiceImpl implements PayService { + + @Autowired + private OrderMapper orderMapper; + + + + @Autowired + private OrderSettlementMapper orderSettlementMapper; + + + @Autowired + private ApplicationEventPublisher eventPublisher; + + @Autowired + private Snowflake snowflake; + + /** + * 不同的订单号,同一个支付流水号 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public PayInfoDto pay(String userId, PayParam payParam) { + + + // 不同的订单号的产品名称 + StringBuilder prodName = new StringBuilder(); + // 支付单号 + String payNo = String.valueOf(snowflake.nextId()); + String[] orderNumbers = payParam.getOrderNumbers().split(StrUtil.COMMA); + // 修改订单信息 + for (String orderNumber : orderNumbers) { + OrderSettlement orderSettlement = new OrderSettlement(); + orderSettlement.setPayNo(payNo); + orderSettlement.setPayType(payParam.getPayType()); + orderSettlement.setUserId(userId); + orderSettlement.setOrderNumber(orderNumber); + orderSettlementMapper.updateByOrderNumberAndUserId(orderSettlement); + + Order order = orderMapper.getOrderByOrderNumber(orderNumber); + prodName.append(order.getProdName()).append(StrUtil.COMMA); + } + // 除了ordernumber不一样,其他都一样 + List settlements = orderSettlementMapper.getSettlementsByPayNo(payNo); + // 应支付的总金额 + double payAmount = 0.0; + for (OrderSettlement orderSettlement : settlements) { + payAmount = Arith.add(payAmount, orderSettlement.getPayAmount()); + } + + prodName.substring(0, Math.min(100, prodName.length() - 1)); + + PayInfoDto payInfoDto = new PayInfoDto(); + payInfoDto.setBody(prodName.toString()); + payInfoDto.setPayAmount(payAmount); + payInfoDto.setPayNo(payNo); + return payInfoDto; + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public List paySuccess(String payNo, String bizPayNo) { + List orderSettlements = orderSettlementMapper.selectList(new LambdaQueryWrapper().eq(OrderSettlement::getPayNo, payNo)); + + OrderSettlement settlement = orderSettlements.get(0); + + // 订单已支付 + if (settlement.getPayStatus() == 1) { + throw new YamiShopBindException("订单已支付"); + } + // 修改订单结算信息 + if (orderSettlementMapper.updateToPay(payNo, settlement.getVersion()) < 1) { + throw new YamiShopBindException("结算信息已更改"); + } + + + List orderNumbers = orderSettlements.stream().map(OrderSettlement::getOrderNumber).collect(Collectors.toList()); + + // 将订单改为已支付状态 + orderMapper.updateByToPaySuccess(orderNumbers, PayType.WECHATPAY.value()); + + List orders = orderNumbers.stream().map(orderNumber -> orderMapper.getOrderByOrderNumber(orderNumber)).collect(Collectors.toList()); + eventPublisher.publishEvent(new PaySuccessOrderEvent(orders)); + return orderNumbers; + } + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/PickAddrServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/PickAddrServiceImpl.java new file mode 100644 index 0000000..70b9cfc --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/PickAddrServiceImpl.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.yami.shop.bean.model.PickAddr; +import com.yami.shop.dao.PickAddrMapper; +import com.yami.shop.service.PickAddrService; + +/** + * + * @author lgh on 2018/10/17. + */ +@Service +public class PickAddrServiceImpl extends ServiceImpl implements PickAddrService { + + @Autowired + private PickAddrMapper pickAddrMapper; + + @Override + public void deleteByIds(Long[] ids) { + pickAddrMapper.deleteByIds(ids); + } + + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/PointsChangeServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/PointsChangeServiceImpl.java new file mode 100644 index 0000000..4ddb4b5 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/PointsChangeServiceImpl.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.yami.shop.bean.model.PointsChange; +import com.yami.shop.dao.PointsChangeMapper; + +import com.yami.shop.service.PointsChangeService; + +/** + * + * @author lgh on 2019/04/10. + */ +@Service +public class PointsChangeServiceImpl extends ServiceImpl implements PointsChangeService { + + @Autowired + private PointsChangeMapper pointsChangeMapper; + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/PointsProdServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/PointsProdServiceImpl.java new file mode 100644 index 0000000..731aec5 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/PointsProdServiceImpl.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.yami.shop.bean.model.PointsProd; +import com.yami.shop.dao.PointsProdMapper; + +import com.yami.shop.service.PointsProdService; + +/** + * + * @author lgh on 2019/04/10. + */ +@Service +public class PointsProdServiceImpl extends ServiceImpl implements PointsProdService { + + @Autowired + private PointsProdMapper pointsProdMapper; + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/PointsServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/PointsServiceImpl.java new file mode 100644 index 0000000..19a4b55 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/PointsServiceImpl.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.yami.shop.bean.model.Points; +import com.yami.shop.dao.PointsMapper; + +import com.yami.shop.service.PointsService; + +import java.util.List; + +/** + * + * @author lgh on 2019/04/10. + */ +@Service +public class PointsServiceImpl extends ServiceImpl implements PointsService { + + @Autowired + private PointsMapper pointsMapper; + + @Override + public IPage getPointsAndSysUserPage(Page page,Points points) { + return pointsMapper.getPointsAndSysUserPage(page,points); + } + + @Override + public List getNameAndId(Points points) { + return pointsMapper.getNameAndId(points); + } + + @Override + public void deleteByIds(List ids) { + pointsMapper.deleteByIds(ids); + } +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/PointsWalletServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/PointsWalletServiceImpl.java new file mode 100644 index 0000000..c3e05ae --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/PointsWalletServiceImpl.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.yami.shop.bean.model.PointsWallet; +import com.yami.shop.dao.PointsWalletMapper; + +import com.yami.shop.service.PointsWalletService; + +/** + * + * @author lgh on 2019/04/10. + */ +@Service +public class PointsWalletServiceImpl extends ServiceImpl implements PointsWalletService { + + @Autowired + private PointsWalletMapper pointsWalletMapper; + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/ProdCommServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/ProdCommServiceImpl.java new file mode 100644 index 0000000..9c314e3 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/ProdCommServiceImpl.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yami.shop.bean.app.dto.ProdCommDataDto; +import com.yami.shop.bean.app.dto.ProdCommDto; +import com.yami.shop.bean.model.ProdComm; +import com.yami.shop.common.util.Arith; +import com.yami.shop.dao.ProdCommMapper; +import com.yami.shop.service.ProdCommService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 商品评论 + * + * @author xwc + * @date 2019-04-19 10:43:57 + */ +@Service +public class ProdCommServiceImpl extends ServiceImpl implements ProdCommService { + + @Autowired + private ProdCommMapper prodCommMapper; + + @Override + public ProdCommDataDto getProdCommDataByProdId(Long prodId, String userId) { + ProdCommDataDto prodCommDataDto=prodCommMapper.getProdCommDataByProdId(prodId, userId); + //计算出好评率 + if(prodCommDataDto.getPraiseNumber() == 0||prodCommDataDto.getNumber() == 0){ + prodCommDataDto.setPositiveRating(0.0); + }else{ + prodCommDataDto.setPositiveRating(Arith.mul(Arith.div(prodCommDataDto.getPraiseNumber(),prodCommDataDto.getNumber()),100)); + } + return prodCommDataDto; + } + + @Override + public IPage getProdCommDtoPageByUserId(Page page, String userId) { + return prodCommMapper.getProdCommDtoPageByUserId(page,userId); + } + + @Override + public IPage getProdCommDtoPageByProdId(Page page, Long prodId, Integer evaluate, String userId) { + + IPage prodCommDtos = prodCommMapper.getProdCommDtoPageByProdId(page, prodId, evaluate, userId); + prodCommDtos.getRecords().forEach(prodCommDto -> { + // 匿名评价 + if (prodCommDto.getIsAnonymous() == 1) { + prodCommDto.setNickName(null); + } + }); + return prodCommDtos; + } + + @Override + public IPage getProdCommPage(Page page,ProdComm prodComm) { + return prodCommMapper.getProdCommPage(page,prodComm); + } +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/ProdPropServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/ProdPropServiceImpl.java new file mode 100644 index 0000000..ae220f5 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/ProdPropServiceImpl.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yami.shop.bean.enums.ProdPropRule; +import com.yami.shop.bean.model.ProdProp; +import com.yami.shop.common.exception.YamiShopBindException; +import com.yami.shop.common.util.PageAdapter; +import com.yami.shop.dao.CategoryPropMapper; +import com.yami.shop.dao.ProdPropMapper; +import com.yami.shop.dao.ProdPropValueMapper; +import com.yami.shop.service.ProdPropService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.validation.Valid; +import java.util.List; +import java.util.Objects; + +/** + * Created by lgh on 2018/07/06. + */ +@Service +public class ProdPropServiceImpl extends ServiceImpl implements ProdPropService { + + @Autowired + private ProdPropMapper prodPropMapper; + + @Autowired + private ProdPropValueMapper prodPropValueMapper; + + @Autowired + private CategoryPropMapper categoryPropMapper; + + @Override + public IPage pagePropAndValue(ProdProp prodProp, Page page) { + + page.setRecords(prodPropMapper.listPropAndValue(new PageAdapter(page), prodProp)); + page.setTotal(prodPropMapper.countPropAndValue(prodProp)); + return page; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveProdPropAndValues(@Valid ProdProp prodProp) { + ProdProp dbProdProp = prodPropMapper.getProdPropByPropNameAndShopId(prodProp.getPropName(), prodProp.getShopId(), prodProp.getRule()); + if (dbProdProp != null) { + throw new YamiShopBindException("已有相同名称规格"); + } + prodPropMapper.insert(prodProp); + if (CollUtil.isEmpty(prodProp.getProdPropValues())) { + return; + } + prodPropValueMapper.insertPropValues(prodProp.getPropId(), prodProp.getProdPropValues()); + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateProdPropAndValues(ProdProp prodProp) { + ProdProp dbProdProp = prodPropMapper.getProdPropByPropNameAndShopId(prodProp.getPropName(), prodProp.getShopId(), prodProp.getRule()); + if (dbProdProp != null && !Objects.equals(prodProp.getPropName(), dbProdProp.getPropName())) { + throw new YamiShopBindException("已有相同名称规格"); + } + prodPropMapper.updateById(prodProp); + // 先删除原有的属性值,再添加新的属性值 + prodPropValueMapper.deleteByPropId(prodProp.getPropId()); + if (CollUtil.isEmpty(prodProp.getProdPropValues())) { + return; + } + prodPropValueMapper.insertPropValues(prodProp.getPropId(), prodProp.getProdPropValues()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteProdPropAndValues(Long propId, Integer propRule, Long shopId) { + int deleteRows = prodPropMapper.deleteByPropId(propId, propRule, shopId); + if (deleteRows == 0) { + return; + } + // 删除原有的属性值 + prodPropValueMapper.deleteByPropId(propId); + + // 如果是参数,删除参数与分类关联信息 + if (ProdPropRule.ATTRIBUTE.value().equals(propRule)) { + categoryPropMapper.deleteByPropId(propId); + } + } + + @Override + public List listByCategoryId(Long categoryId) { + return prodPropMapper.listByCategoryId(categoryId); + } +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/ProdPropValueServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/ProdPropValueServiceImpl.java new file mode 100644 index 0000000..e6ab99e --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/ProdPropValueServiceImpl.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.yami.shop.bean.model.ProdPropValue; +import com.yami.shop.dao.ProdPropValueMapper; +import com.yami.shop.service.ProdPropValueService; + +/** + * + * Created by lgh on 2018/07/06. + */ +@Service +public class ProdPropValueServiceImpl extends ServiceImpl implements ProdPropValueService { + + @Autowired + private ProdPropValueMapper prodPropValueMapper; + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/ProdTagReferenceServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/ProdTagReferenceServiceImpl.java new file mode 100644 index 0000000..3052ef9 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/ProdTagReferenceServiceImpl.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yami.shop.bean.model.ProdTagReference; +import com.yami.shop.dao.ProdTagReferenceMapper; +import com.yami.shop.service.ProdTagReferenceService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 分组标签引用 + * + * @author hzm + * @date 2019-04-18 16:28:01 + */ +@Service +public class ProdTagReferenceServiceImpl extends ServiceImpl implements ProdTagReferenceService { + + @Autowired + private ProdTagReferenceMapper prodTagReferenceMapper; + + @Override + public List listTagIdByProdId(Long prodId) { + return prodTagReferenceMapper.listTagIdByProdId(prodId); + } +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/ProdTagServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/ProdTagServiceImpl.java new file mode 100644 index 0000000..13e4c03 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/ProdTagServiceImpl.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yami.shop.bean.model.ProdTag; +import com.yami.shop.dao.ProdTagMapper; +import com.yami.shop.service.ProdTagService; +import lombok.AllArgsConstructor; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 商品分组标签 + * + * @author hzm + * @date 2019-04-18 10:48:44 + */ +@Service +@AllArgsConstructor +public class ProdTagServiceImpl extends ServiceImpl implements ProdTagService { + + private ProdTagMapper prodTagMapper; + + @Override + @Cacheable(cacheNames = "prodTag", key = "'prodTag'") + public List listProdTag() { + return prodTagMapper.selectList(new LambdaQueryWrapper().orderByDesc(ProdTag::getSeq)); + } + + @Override + @CacheEvict(cacheNames = "prodTag", key = "'prodTag'") + public void removeProdTag() { + } +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/ProductServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/ProductServiceImpl.java new file mode 100644 index 0000000..3436957 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/ProductServiceImpl.java @@ -0,0 +1,222 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yami.shop.bean.app.dto.ProductDto; +import com.yami.shop.bean.app.dto.TagProductDto; +import com.yami.shop.bean.dto.SearchProdDto; +import com.yami.shop.bean.model.ProdTagReference; +import com.yami.shop.bean.model.Product; +import com.yami.shop.bean.model.Sku; +import com.yami.shop.common.util.Arith; +import com.yami.shop.common.util.PageParam; +import com.yami.shop.dao.ProdTagReferenceMapper; +import com.yami.shop.dao.ProductMapper; +import com.yami.shop.dao.SkuMapper; +import com.yami.shop.service.AttachFileService; +import com.yami.shop.service.ProductService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +@Service +public class ProductServiceImpl extends ServiceImpl implements ProductService { + + @Autowired + private ProductMapper productMapper; + @Autowired + private SkuMapper skuMapper; + @Autowired + private AttachFileService attachFileService; + @Autowired + private ProdTagReferenceMapper prodTagReferenceMapper; + + private static final Logger log = LoggerFactory.getLogger(ProductServiceImpl.class); + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveProduct(Product product) { + productMapper.insert(product); + if (CollectionUtil.isNotEmpty(product.getSkuList())) { + skuMapper.insertBatch(product.getProdId(), product.getSkuList()); + } + prodTagReferenceMapper.insertBatch(product.getShopId(), product.getProdId(), product.getTagList()); + + } + + @Override + @Transactional(rollbackFor = Exception.class) + @Caching(evict = { + @CacheEvict(cacheNames = "product", key = "#product.prodId"), + @CacheEvict(cacheNames = "skuList", key = "#product.prodId") + }) + public void updateProduct(Product product, Product dbProduct) { + + productMapper.updateById(product); + List dbSkuIds = dbProduct.getSkuList().stream().map(Sku::getSkuId).collect(Collectors.toList()); + // 2019/04/c0244be79909484fb67bc6d5f70cae18.jpg + if (!Objects.equals(dbProduct.getPic(), product.getPic()) && StrUtil.isNotBlank(dbProduct.getPic())) { + // 删除数据库中的商品图片 + attachFileService.deleteFile(dbProduct.getPic()); + } + // 将所有该商品的sku标记为已删除状态 + skuMapper.deleteByProdId(product.getProdId()); + + // 接口传入sku列表 + List skuList = product.getSkuList(); + + if (CollectionUtil.isEmpty(skuList)) { + return; + } + + List insertSkuList = new ArrayList<>(); + for (Sku sku : skuList) { + sku.setIsDelete(0); + // 如果数据库中原有sku就更新,否者就插入 + if (dbSkuIds.contains(sku.getSkuId())) { + skuMapper.updateById(sku); + } else { + insertSkuList.add(sku); + } + } + // 批量插入sku + if (CollectionUtil.isNotEmpty(insertSkuList)) { + skuMapper.insertBatch(product.getProdId(), insertSkuList); + } + + //更新分组信息 + List tagList = product.getTagList(); + if (CollectionUtil.isNotEmpty(tagList)) { + prodTagReferenceMapper.delete(new LambdaQueryWrapper().eq(ProdTagReference::getProdId, product.getProdId())); + prodTagReferenceMapper.insertBatch(dbProduct.getShopId(), product.getProdId(), tagList); + } + } + + + @Override + @Cacheable(cacheNames = "product", key = "#prodId") + public Product getProductByProdId(Long prodId) { + return productMapper.selectById(prodId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @Caching(evict = { + @CacheEvict(cacheNames = "product", key = "#prodId"), + @CacheEvict(cacheNames = "skuList", key = "#prodId") + }) + public void removeProductByProdId(Long prodId) { + Product dbProduct = getProductByProdId(prodId); + + productMapper.deleteById(prodId); + + skuMapper.deleteByProdId(prodId); + + //删除商品关联的分组标签 + prodTagReferenceMapper.delete(new LambdaQueryWrapper() + .eq(ProdTagReference::getProdId, prodId)); + + // 删除数据库中的商品图片 + if (StrUtil.isNotBlank(dbProduct.getImgs())) { + String[] imgs = dbProduct.getImgs().split(StrUtil.COMMA); + for (String img : imgs) { + attachFileService.deleteFile(img); + } + } + } + + @Override + @Caching(evict = { + @CacheEvict(cacheNames = "product", key = "#prodId"), + @CacheEvict(cacheNames = "skuList", key = "#prodId") + }) + public void removeProductCacheByProdId(Long prodId) { + + + } + + @Override + public IPage pageByPutawayTime(IPage page) { + return productMapper.pageByPutawayTime(page); + } + + @Override + public IPage pageByTagId(Page page, Long tagId) { + return productMapper.pageByTagId(page, tagId); + } + + @Override + public IPage discountProdList(Page page) { + return productMapper.discountProdList(page); + } + + @Override + public IPage moreBuyProdList(Page page) { + return productMapper.moreBuyProdList(page); + } + + @Override + public IPage pageByCategoryId(Page page, Long categoryId) { + return productMapper.pageByCategoryId(page, categoryId); + } + + @Override + public List listProdByCategoryId(Long categoryId) { + return productMapper.listProdByCategoryId(categoryId); + } + + @Override + public IPage getSearchProdDtoPageByProdName(Page page, String prodName, Integer sort, Integer orderBy) { + IPage searchProdDtoPage = productMapper.getSearchProdDtoPageByProdName(page, prodName, sort, orderBy); + for (SearchProdDto searchProdDto : searchProdDtoPage.getRecords()) { + //计算出好评率 + if (searchProdDto.getPraiseNumber() == 0 || searchProdDto.getProdCommNumber() == 0) { + searchProdDto.setPositiveRating(0.0); + } else { + searchProdDto.setPositiveRating(Arith.mul(Arith.div(searchProdDto.getPraiseNumber(), searchProdDto.getProdCommNumber()), 100)); + } + } + return searchProdDtoPage; + } + + @Override + public List tagProdList() { + return productMapper.tagProdList(); + } + + @Override + public IPage pageByDiscountId(Page page, Long discountId) { + return productMapper.pageByDiscountId(page, discountId); + } + + @Override + public IPage collectionProds(PageParam page, String userId) { + return productMapper.collectionProds(page, userId); + } + + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/ScoreLogServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/ScoreLogServiceImpl.java new file mode 100644 index 0000000..0d14b5f --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/ScoreLogServiceImpl.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.yami.shop.bean.model.ScoreLog; +import com.yami.shop.dao.ScoreLogMapper; +import com.yami.shop.service.ScoreLogService; + +/** + * + * @author lgh on 2018/10/15. + */ +@Service +public class ScoreLogServiceImpl extends ServiceImpl implements ScoreLogService { + + @Autowired + private ScoreLogMapper scoreLogMapper; + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/ShopDetailServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/ShopDetailServiceImpl.java new file mode 100644 index 0000000..081390e --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/ShopDetailServiceImpl.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import java.util.Objects; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.yami.shop.bean.model.ShopDetail; +import com.yami.shop.dao.ShopDetailMapper; +import com.yami.shop.service.AttachFileService; +import com.yami.shop.service.ShopDetailService; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; + +/** + * + * @author lgh on 2018/08/29. + */ +@Service +public class ShopDetailServiceImpl extends ServiceImpl implements ShopDetailService { + + @Autowired + private ShopDetailMapper shopDetailMapper; + + @Autowired + private AttachFileService attachFileService; + + @Override + @Transactional(rollbackFor=Exception.class) + @CacheEvict(cacheNames = "shop_detail", key = "#shopDetail.shopId") + public void updateShopDetail(ShopDetail shopDetail,ShopDetail dbShopDetail) { + // 更新除数据库中的信息,再删除图片 + shopDetailMapper.updateById(shopDetail); + if (!Objects.equals(dbShopDetail.getShopLogo(), shopDetail.getShopLogo())) { + // 删除logo + attachFileService.deleteFile(shopDetail.getShopLogo()); + } + // 店铺图片 + String shopPhotos = shopDetail.getShopPhotos(); + String[] shopPhotoArray =StrUtil.isBlank(shopPhotos)?new String[]{}: shopPhotos.split(","); + + // 数据库中的店铺图片 + String dbShopPhotos = dbShopDetail.getShopPhotos(); + String[] dbShopPhotoArray =StrUtil.isBlank(dbShopPhotos)?new String[]{}: dbShopPhotos.split(","); + for (String dbShopPhoto : dbShopPhotoArray) { + // 如果新插入的图片中没有旧数据中的图片,则删除旧数据中的图片 + if (!ArrayUtil.contains(shopPhotoArray, dbShopPhoto)) { + attachFileService.deleteFile(dbShopPhoto); + } + } + } + + @Override + @Transactional(rollbackFor=Exception.class) + @CacheEvict(cacheNames = "shop_detail", key = "#shopId") + public void deleteShopDetailByShopId(Long shopId) { + // 先删除数据库中的信息,再删除图片 + shopDetailMapper.deleteById(shopId); + + ShopDetail shopDetail = shopDetailMapper.selectById(shopId); + // 删除logo + attachFileService.deleteFile(shopDetail.getShopLogo()); + // 删除店铺图片 + String shopPhotos = shopDetail.getShopPhotos(); + if (StrUtil.isNotBlank(shopPhotos)) { + String[] shopPhotoArray = shopPhotos.split(","); + for (String shopPhoto : shopPhotoArray) { + attachFileService.deleteFile(shopPhoto); + } + } + } + + @Override + @Cacheable(cacheNames = "shop_detail", key = "#shopId") + public ShopDetail getShopDetailByShopId(Long shopId) { + return shopDetailMapper.selectById(shopId); + } + + @Override + @CacheEvict(cacheNames = "shop_detail", key = "#shopId") + public void removeShopDetailCacheByShopId(Long shopId) { + } +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/SkuServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/SkuServiceImpl.java new file mode 100644 index 0000000..75df194 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/SkuServiceImpl.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import java.util.List; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.stereotype.Service; + +import com.yami.shop.bean.model.Sku; +import com.yami.shop.dao.SkuMapper; +import com.yami.shop.service.SkuService; + +/** + * + * @author lgh on 2018/09/29. + */ +@Service +public class SkuServiceImpl extends ServiceImpl implements SkuService { + + @Autowired + private SkuMapper skuMapper; + + @Override + @Cacheable(cacheNames = "skuList", key = "#prodId") + public List listByProdId(Long prodId) { + return skuMapper.listByProdId(prodId); + } + + @Override + @Cacheable(cacheNames = "sku", key = "#skuId") + public Sku getSkuBySkuId(Long skuId) { + return skuMapper.selectById(skuId); + } + + @Override + @Caching(evict = { + @CacheEvict(cacheNames = "sku", key = "#skuId"), + @CacheEvict(cacheNames = "skuList", key = "#prodId") + }) + public void removeSkuCacheBySkuId(Long skuId,Long prodId) { + + } + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/SmsLogServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/SmsLogServiceImpl.java new file mode 100644 index 0000000..e569d47 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/SmsLogServiceImpl.java @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.RandomUtil; +import com.aliyuncs.DefaultAcsClient; +import com.aliyuncs.IAcsClient; +import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; +import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; +import com.aliyuncs.exceptions.ClientException; +import com.aliyuncs.profile.DefaultProfile; +import com.aliyuncs.profile.IClientProfile; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yami.shop.bean.enums.SmsType; +import com.yami.shop.bean.model.SmsLog; +import com.yami.shop.common.bean.ALiDaYu; +import com.yami.shop.common.enums.YamiHttpStatus; +import com.yami.shop.common.exception.YamiShopBindException; +import com.yami.shop.common.util.Json; +import com.yami.shop.common.util.RedisUtil; +import com.yami.shop.dao.SmsLogMapper; +import com.yami.shop.service.SmsLogService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.Map; +import java.util.Map.Entry; + + +/** + * @author lgh on 2018/11/29. + */ +@Service +@Slf4j +@AllArgsConstructor +public class SmsLogServiceImpl extends ServiceImpl implements SmsLogService { + + private SmsLogMapper smsLogMapper; + + private ALiDaYu aLiDaYu; + + /** + * 产品名称:云通信短信API产品,开发者无需替换 + */ + private static final String PRODUCT = "Dysmsapi"; + /** + * 产品域名,开发者无需替换 + */ + private static final String DOMAIN = "dysmsapi.aliyuncs.com"; + + /** + * 当天最大验证码短信发送量 + */ + private static final int TODAY_MAX_SEND_VALID_SMS_NUMBER = 10; + + /** + * 一段时间内短信验证码的最大验证次数 + */ + private static final int TIMES_CHECK_VALID_CODE_NUM = 10; + + /** + * 短信验证码的前缀 + */ + private static final String CHECK_VALID_CODE_NUM_PREFIX = "checkValidCodeNum_"; + + /** + * 短信发送成功的标志 + */ + private static final String SEND_SMS_SUCCESS_FLAG = "OK"; + + @Override + @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED) + public void sendSms(SmsType smsType, String userId, String mobile, Map params) { + + SmsLog smsLog = new SmsLog(); + if (smsType.equals(SmsType.VALID)) { + int todaySendSmsNumber = smsLogMapper.selectCount(new LambdaQueryWrapper() + .gt(SmsLog::getRecDate, DateUtil.beginOfDay(new Date())) + .lt(SmsLog::getRecDate, DateUtil.endOfDay(new Date())) + .eq(SmsLog::getUserId, userId) + .eq(SmsLog::getType, smsType.value())); + if (todaySendSmsNumber >= TODAY_MAX_SEND_VALID_SMS_NUMBER) { + throw new YamiShopBindException("今日发送短信验证码次数已达到上限"); + } + + // 将上一条验证码失效 + smsLogMapper.invalidSmsByMobileAndType(mobile, smsType.value()); + + String code = RandomUtil.randomNumbers(6); + params.put("code", code); + } + smsLog.setType(smsType.value()); + smsLog.setMobileCode(params.get("code")); + smsLog.setRecDate(new Date()); + smsLog.setStatus(1); + smsLog.setUserId(userId); + smsLog.setUserPhone(mobile); + smsLog.setContent(formatContent(smsType, params)); + smsLogMapper.insert(smsLog); + try { + this.sendSms(mobile, smsType.getTemplateCode(), params); + } catch (ClientException e) { + throw new YamiShopBindException("发送短信失败,请稍后再试"); + } + + + } + + @Override + @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED) + public boolean checkValidCode(String mobile, String code, SmsType smsType) { + long checkValidCodeNum = RedisUtil.incr(CHECK_VALID_CODE_NUM_PREFIX + mobile, 1); + if (checkValidCodeNum == 0) { + // 半小时后失效 + RedisUtil.expire(CHECK_VALID_CODE_NUM_PREFIX, 1800); + } + if (checkValidCodeNum >= TIMES_CHECK_VALID_CODE_NUM) { + throw new YamiShopBindException("验证码校验过频繁,请稍后再试"); + } + SmsLog sms = new SmsLog(); + sms.setUserPhone(mobile); + sms.setMobileCode(code); + sms.setStatus(1); + sms.setType(smsType.value()); + + SmsLog dbSms = smsLogMapper.selectOne(new LambdaQueryWrapper() + .eq(SmsLog::getUserPhone, mobile) + .eq(SmsLog::getMobileCode, code) + .eq(SmsLog::getStatus, 1) + .eq(SmsLog::getType, smsType.value())); + // 没有找到当前的验证码 + if (dbSms == null) { + RedisUtil.incr(CHECK_VALID_CODE_NUM_PREFIX + mobile, 1); + return false; + } + RedisUtil.del(CHECK_VALID_CODE_NUM_PREFIX + mobile); + // 标记为失效状态 + dbSms.setStatus(0); + smsLogMapper.updateById(dbSms); + // 验证码已过期 + DateTime offsetMinute = DateUtil.offsetMinute(dbSms.getRecDate(), 5); + if (offsetMinute.getTime() < System.currentTimeMillis()) { + RedisUtil.incr(CHECK_VALID_CODE_NUM_PREFIX + mobile, 1); + return false; + } + + return true; + } + + private void sendSms(String mobile, String templateCode, Map params) throws ClientException { + + //可自助调整超时时间 + System.setProperty("sun.net.client.defaultConnectTimeout", "10000"); + System.setProperty("sun.net.client.defaultReadTimeout", "10000"); + + //初始化acsClient,暂不支持region化 + IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", aLiDaYu.getAccessKeyId(), aLiDaYu.getAccessKeySecret()); + DefaultProfile.addEndpoint("cn-hangzhou", PRODUCT, DOMAIN); + IAcsClient acsClient = new DefaultAcsClient(profile); + + //组装请求对象-具体描述见控制台-文档部分内容 + SendSmsRequest request = new SendSmsRequest(); + //必填:待发送手机号 + request.setPhoneNumbers(mobile); + //必填:短信签名-可在短信控制台中找到 + request.setSignName(aLiDaYu.getSignName()); + //必填:短信模板-可在短信控制台中找到 + request.setTemplateCode(templateCode); + request.setTemplateParam(Json.toJsonString(params)); + + + //hint 此处可能会抛出异常,注意catch + SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); + log.debug(Json.toJsonString(sendSmsResponse)); + if (sendSmsResponse.getCode() == null || !SEND_SMS_SUCCESS_FLAG.equals(sendSmsResponse.getCode())) { + throw new YamiShopBindException("发送短信失败,请稍后再试:" + sendSmsResponse.getMessage()); + } + } + + private String formatContent(SmsType smsType, Map params) { + if (CollectionUtil.isEmpty(params)) { + return smsType.getContent(); + } + String content = smsType.getContent(); + for (Entry element : params.entrySet()) { + content = content.replace("${" + element.getKey() + "}", element.getValue()); + } + return content; + } +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/TranscityFreeServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/TranscityFreeServiceImpl.java new file mode 100644 index 0000000..0e45492 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/TranscityFreeServiceImpl.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.yami.shop.bean.model.TranscityFree; +import com.yami.shop.dao.TranscityFreeMapper; + +import com.yami.shop.service.TranscityFreeService; + +/** + * + * @author lgh on 2018/12/20. + */ +@Service +public class TranscityFreeServiceImpl extends ServiceImpl implements TranscityFreeService { + + @Autowired + private TranscityFreeMapper transcityFreeMapper; + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/TranscityServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/TranscityServiceImpl.java new file mode 100644 index 0000000..eae3bf9 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/TranscityServiceImpl.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import java.util.List; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.yami.shop.bean.model.Transcity; +import com.yami.shop.dao.TranscityMapper; +import com.yami.shop.service.TranscityService; + +/** + * + * @author lgh on 2018/11/16. + */ +@Service +public class TranscityServiceImpl extends ServiceImpl implements TranscityService { + + @Autowired + private TranscityMapper transcityMapper; + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/TransfeeFreeServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/TransfeeFreeServiceImpl.java new file mode 100644 index 0000000..5c2c140 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/TransfeeFreeServiceImpl.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.yami.shop.bean.model.TransfeeFree; +import com.yami.shop.dao.TransfeeFreeMapper; + +import com.yami.shop.service.TransfeeFreeService; + +/** + * + * @author lgh on 2018/12/20. + */ +@Service +public class TransfeeFreeServiceImpl extends ServiceImpl implements TransfeeFreeService { + + @Autowired + private TransfeeFreeMapper transfeeFreeMapper; + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/TransfeeServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/TransfeeServiceImpl.java new file mode 100644 index 0000000..c553738 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/TransfeeServiceImpl.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.yami.shop.bean.model.Transfee; +import com.yami.shop.dao.TransfeeMapper; +import com.yami.shop.service.TransfeeService; + +/** + * + * @author lgh on 2018/11/16. + */ +@Service +public class TransfeeServiceImpl extends ServiceImpl implements TransfeeService { + + @Autowired + private TransfeeMapper transfeeMapper; + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/TransportManagerServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/TransportManagerServiceImpl.java new file mode 100644 index 0000000..e2c4222 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/TransportManagerServiceImpl.java @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.yami.shop.bean.app.dto.ProductItemDto; +import com.yami.shop.bean.enums.TransportChargeType; +import com.yami.shop.bean.model.*; +import com.yami.shop.common.util.Arith; +import com.yami.shop.common.util.Json; +import com.yami.shop.service.ProductService; +import com.yami.shop.service.SkuService; +import com.yami.shop.service.TransportManagerService; +import com.yami.shop.service.TransportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + +@Service +public class TransportManagerServiceImpl implements TransportManagerService { + + @Autowired + private ProductService productService; + @Autowired + private SkuService skuService; + @Autowired + private TransportService transportService; + + @Override + public Double calculateTransfee(ProductItemDto productItem, UserAddr userAddr) { + Product product = productService.getProductByProdId(productItem.getProdId()); + // 用户所在城市id + Long cityId = userAddr.getCityId(); + + Product.DeliveryModeVO deliveryModeVO = Json.parseObject(product.getDeliveryMode(), Product.DeliveryModeVO.class); + + // 没有店铺配送的方式 + if (deliveryModeVO.getHasShopDelivery()) { + return 0.0; + } + if (product.getDeliveryTemplateId() == null) { + return 0.0; + } + + //找出该产品的运费项 + Transport transport = transportService.getTransportAndAllItems(product.getDeliveryTemplateId()); + //商家把运费模板删除 + if (transport == null) { + return 0.0; + } + + Sku sku = skuService.getSkuBySkuId(productItem.getSkuId()); + + // 用于计算运费的件数 + Double piece = 0.0; + + if (Objects.equals(TransportChargeType.COUNT.value(), transport.getChargeType())) { + // 按件数计算运费 + piece = Double.valueOf(productItem.getProdCount()); + } else if (Objects.equals(TransportChargeType.WEIGHT.value(), transport.getChargeType())) { + // 按重量计算运费 + double weight = sku.getWeight() == null ? 0 : sku.getWeight(); + piece = Arith.mul(weight, productItem.getProdCount()); + } else if (Objects.equals(TransportChargeType.VOLUME.value(), transport.getChargeType())) { + // 按体积计算运费 + double volume = sku.getVolume() == null ? 0 : sku.getVolume(); + piece = Arith.mul(volume, productItem.getProdCount()); + } + + + //如果有包邮的条件 + if (transport.getHasFreeCondition() == 1) { + // 获取所有的包邮条件 + List transfeeFrees = transport.getTransfeeFrees(); + for (TransfeeFree transfeeFree : transfeeFrees) { + List freeCityList = transfeeFree.getFreeCityList(); + for (Area freeCity : freeCityList) { + if (!Objects.equals(freeCity.getAreaId(), cityId)) { + continue; + } + //包邮方式 (0 满x件/重量/体积包邮 1满金额包邮 2满x件/重量/体积且满金额包邮) + if ((transfeeFree.getFreeType() == 0 && piece >= transfeeFree.getPiece()) || + (transfeeFree.getFreeType() == 1 && productItem.getProductTotalAmount() >= transfeeFree.getAmount()) || + (transfeeFree.getFreeType() == 2 && piece >= transfeeFree.getPiece() && productItem.getProductTotalAmount() >= transfeeFree.getAmount())) { + return 0.0; + } + } + } + } + + //订单的运费项 + Transfee transfee = null; + List transfees = transport.getTransfees(); + for (Transfee dbTransfee : transfees) { + // 将该商品的运费设置为默认运费 + if (transfee == null && CollectionUtil.isEmpty(dbTransfee.getCityList())) { + transfee = dbTransfee; + } + // 如果在运费模板中的城市找到该商品的运费,则将该商品由默认运费设置为该城市的运费 + for (Area area : dbTransfee.getCityList()) { + if (area.getAreaId().equals(cityId)) { + transfee = dbTransfee; + break; + } + } + // 如果在运费模板中的城市找到该商品的运费,则退出整个循环 + if (transfee != null && CollectionUtil.isNotEmpty(transfee.getCityList())) { + break; + } + } + + // 产品的运费 + Double fee = transfee.getFirstFee(); + // 如果件数大于首件数量,则开始计算超出的运费 + if (piece > transfee.getFirstPiece()) { + // 续件数量 + Double prodContinuousPiece = Arith.sub(piece, transfee.getFirstPiece()); + // 续件数量的倍数,向上取整 + Integer mulNumber = (int) Math.ceil(Arith.div(prodContinuousPiece, transfee.getContinuousPiece())); + // 续件数量运费 + Double continuousFee = Arith.mul(mulNumber, transfee.getContinuousFee()); + fee = Arith.add(fee, continuousFee); + } + return fee; + } + + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/TransportServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/TransportServiceImpl.java new file mode 100644 index 0000000..3ae8ef3 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/TransportServiceImpl.java @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.yami.shop.bean.model.Area; +import com.yami.shop.bean.model.Transcity; +import com.yami.shop.bean.model.TranscityFree; +import com.yami.shop.bean.model.Transfee; +import com.yami.shop.bean.model.TransfeeFree; +import com.yami.shop.bean.model.Transport; +import com.yami.shop.common.exception.YamiShopBindException; +import com.yami.shop.dao.TranscityMapper; +import com.yami.shop.dao.TransfeeMapper; +import com.yami.shop.dao.TransportMapper; +import com.yami.shop.service.TransportService; + +import cn.hutool.core.collection.CollectionUtil; + +/** + * + * @author lgh on 2018/11/16. + */ +@Service +public class TransportServiceImpl extends ServiceImpl implements TransportService { + + @Autowired + private TransportMapper transportMapper; + + @Autowired + private TransfeeMapper transfeeMapper; + + @Autowired + private TranscityMapper transcityMapper; + + @Autowired + private TransportService transportService; + + @Override + @Transactional(rollbackFor = Exception.class) + public void insertTransportAndTransfee(Transport transport) { + + // 插入运费模板 + transportMapper.insert(transport); + // 插入所有的运费项和城市 + insertTransfeeAndTranscity(transport); + + // 插入所有的指定包邮条件项和城市 + if (transport.getHasFreeCondition() == 1) { + insertTransfeeFreeAndTranscityFree(transport); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = "TransportAndAllItems", key = "#transport.transportId") + public void updateTransportAndTransfee(Transport transport) { + Transport dbTransport = transportService.getTransportAndAllItems(transport.getTransportId()); + + // 删除所有的运费项 + transfeeMapper.deleteByTransportId(transport.getTransportId()); + // 删除所有的指定包邮条件项 + transfeeMapper.deleteTransfeeFreesByTransportId(transport.getTransportId()); + + List transfeeIds = dbTransport.getTransfees().stream().map(Transfee::getTransfeeId).collect(Collectors.toList()); + List transfeeFreeIds = dbTransport.getTransfeeFrees().stream().map(TransfeeFree::getTransfeeFreeId).collect(Collectors.toList()); + + + // 删除所有运费项包含的城市 + transcityMapper.deleteBatchByTransfeeIds(transfeeIds); + if(CollectionUtil.isNotEmpty(transfeeFreeIds)) { + // 删除所有指定包邮条件项包含的城市 + transcityMapper.deleteBatchByTransfeeFreeIds(transfeeFreeIds); + } + + // 更新运费模板 + transportMapper.updateById(transport); + + // 插入所有的运费项和城市 + insertTransfeeAndTranscity(transport); + // 插入所有的指定包邮条件项和城市 + if (transport.getHasFreeCondition() == 1) { + insertTransfeeFreeAndTranscityFree(transport); + } + } + + + private void insertTransfeeFreeAndTranscityFree(Transport transport) { + Long transportId = transport.getTransportId(); + List transfeeFrees = transport.getTransfeeFrees(); + for (TransfeeFree transfeeFree : transfeeFrees) { + transfeeFree.setTransportId(transportId); + } + // 批量插入指定包邮条件项 并返回指定包邮条件项 id,供下面循环使用 + transfeeMapper.insertTransfeeFrees(transfeeFrees); + + List transcityFrees = new ArrayList<>(); + for (TransfeeFree transfeeFree : transfeeFrees) { + List cityList = transfeeFree.getFreeCityList(); + if (CollectionUtil.isEmpty(cityList)) { + throw new YamiShopBindException("请选择指定包邮城市"); + } + // 当地址不为空时 + for (Area area : cityList) { + TranscityFree transcityParam = new TranscityFree(); + transcityParam.setTransfeeFreeId(transfeeFree.getTransfeeFreeId()); + transcityParam.setFreeCityId(area.getAreaId()); + transcityFrees.add(transcityParam); + } + } + + // 批量插入指定包邮条件项中的城市 + if (CollectionUtil.isNotEmpty(transcityFrees)) { + transcityMapper.insertTranscityFrees(transcityFrees); + } + } + + private void insertTransfeeAndTranscity(Transport transport) { + Long transportId = transport.getTransportId(); + List transfees = transport.getTransfees(); + for (Transfee transfee : transfees) { + transfee.setTransportId(transportId); + } + // 批量插入运费项 并返回运费项id,供下面循环使用 + transfeeMapper.insertTransfees(transfees); + + List transcities = new ArrayList<>(); + for (Transfee transfee : transfees) { + List cityList = transfee.getCityList(); + if (CollectionUtil.isEmpty(cityList)) { + continue; + } + // 当地址不为空时 + for (Area area : cityList) { + Transcity transcityParam = new Transcity(); + transcityParam.setTransfeeId(transfee.getTransfeeId()); + transcityParam.setCityId(area.getAreaId()); + transcities.add(transcityParam); + } + } + + // 批量插入运费项中的城市 + if (CollectionUtil.isNotEmpty(transcities)) { + transcityMapper.insertTranscities(transcities); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteTransportAndTransfeeAndTranscity(Long[] ids) { + + + for (Long id : ids) { + Transport dbTransport = transportService.getTransportAndAllItems(id); + List transfeeIds = dbTransport.getTransfees().stream().map(Transfee::getTransfeeId).collect(Collectors.toList()); + // 删除所有运费项包含的城市 + transcityMapper.deleteBatchByTransfeeIds(transfeeIds); + // 删除所有的运费项 + transfeeMapper.deleteByTransportId(id); + } + // 删除运费模板 + transportMapper.deleteTransports(ids); + } + + + @Override + @Cacheable(cacheNames = "TransportAndAllItems", key = "#transportId") + public Transport getTransportAndAllItems(Long transportId) { + Transport transport = transportMapper.getTransportAndTransfeeAndTranscity(transportId); + List transfeeFrees = transportMapper.getTransfeeFreeAndTranscityFreeByTransportId(transportId); + transport.setTransfeeFrees(transfeeFrees); + return transport; + } +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/UserAddrOrderServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/UserAddrOrderServiceImpl.java new file mode 100644 index 0000000..2d0b7de --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/UserAddrOrderServiceImpl.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yami.shop.dao.UserAddrOrderMapper; +import org.springframework.stereotype.Service; + +import com.yami.shop.bean.model.UserAddrOrder; +import com.yami.shop.service.UserAddrOrderService; + +@Service +public class UserAddrOrderServiceImpl extends ServiceImpl implements UserAddrOrderService{ + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/UserAddrServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/UserAddrServiceImpl.java new file mode 100644 index 0000000..f6edb0a --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/UserAddrServiceImpl.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.yami.shop.bean.model.UserAddr; +import com.yami.shop.common.exception.YamiShopBindException; +import com.yami.shop.dao.UserAddrMapper; +import com.yami.shop.service.UserAddrService; + +@Service +public class UserAddrServiceImpl extends ServiceImpl implements UserAddrService { + + @Autowired + private UserAddrMapper userAddrMapper; + + @Override + public UserAddr getDefaultUserAddr(String userId) { + return userAddrMapper.getDefaultUserAddr(userId); + } + + @Override + @Transactional(rollbackFor=Exception.class) + public void updateDefaultUserAddr(Long addrId, String userId) { + userAddrMapper.removeDefaultUserAddr(userId); + int setCount = userAddrMapper.setDefaultUserAddr(addrId,userId); + if (setCount == 0) { + throw new YamiShopBindException("无法修改用户默认地址,请稍后再试"); + } + } + + @Override + @CacheEvict(cacheNames = "UserAddrDto", key = "#userId+':'+#addrId") + public void removeUserAddrByUserId(Long addrId, String userId) { + + } + + @Override + @Cacheable(cacheNames = "UserAddrDto", key = "#userId+':'+#addrId") + public UserAddr getUserAddrByUserId(Long addrId, String userId) { + if (addrId == 0) { + return userAddrMapper.getDefaultUserAddr(userId); + } + return userAddrMapper.getUserAddrByUserIdAndAddrId(userId, addrId); + } + + +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/UserCollectionServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/UserCollectionServiceImpl.java new file mode 100644 index 0000000..41d9bc8 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/UserCollectionServiceImpl.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yami.shop.bean.app.dto.UserCollectionDto; +import com.yami.shop.bean.model.UserCollection; +import com.yami.shop.dao.UserCollectionMapper; +import com.yami.shop.service.UserCollectionService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 用户收藏表 + * + * @author xwc + * @date 2019-04-19 16:57:20 + */ +@Service +public class UserCollectionServiceImpl extends ServiceImpl implements UserCollectionService { + + @Autowired + private UserCollectionMapper userCollectionMapper; + + @Override + public IPage getUserCollectionDtoPageByUserId(Page page, String userId) { + return userCollectionMapper.getUserCollectionDtoPageByUserId(page,userId); + } +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/UserServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..20b66a9 --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/UserServiceImpl.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yami.shop.bean.model.User; +import com.yami.shop.bean.vo.UserVO; +import com.yami.shop.dao.UserMapper; +import com.yami.shop.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.UUID; + +/** + * @author lgh on 2018/09/11. + */ +@Service +public class UserServiceImpl extends ServiceImpl implements UserService { + + @Autowired + private UserMapper userMapper; + + + @Override + @CacheEvict(cacheNames="user",key="#userId") + public User getUserByUserId(String userId) { + return userMapper.selectById(userId); + } +} diff --git a/yami-shop-service/src/main/java/com/yami/shop/service/impl/WxOrderServiceImpl.java b/yami-shop-service/src/main/java/com/yami/shop/service/impl/WxOrderServiceImpl.java new file mode 100644 index 0000000..5556c9e --- /dev/null +++ b/yami-shop-service/src/main/java/com/yami/shop/service/impl/WxOrderServiceImpl.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.yami.shop.bean.model.WxOrder; +import com.yami.shop.dao.WxOrderMapper; +import com.yami.shop.service.WxOrderService; + +/** + * + * @author lgh on 2018/09/18. + */ +@Service +public class WxOrderServiceImpl extends ServiceImpl implements WxOrderService { + + @Autowired + private WxOrderMapper wxOrderMapper; + + +} diff --git a/yami-shop-service/src/main/resources/mapper/AreaMapper.xml b/yami-shop-service/src/main/resources/mapper/AreaMapper.xml new file mode 100644 index 0000000..7cf5172 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/AreaMapper.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/yami-shop-service/src/main/resources/mapper/AttachFileMapper.xml b/yami-shop-service/src/main/resources/mapper/AttachFileMapper.xml new file mode 100644 index 0000000..ded6eee --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/AttachFileMapper.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/BasketMapper.xml b/yami-shop-service/src/main/resources/mapper/BasketMapper.xml new file mode 100644 index 0000000..953d280 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/BasketMapper.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + delete from tz_basket where user_id = #{userId} and basket_id in + + #{basketId} + + + + + delete from tz_basket where user_id = #{userId} + + + + + DELETE FROM tz_basket + WHERE basket_id IN( + SELECT basket_id FROM ( + SELECT tb.basket_id basket_id + FROM tz_basket tb + LEFT JOIN tz_shop_detail tsd + ON tb.shop_id = tsd.shop_id + LEFT JOIN tz_prod tp + ON tb.prod_id = tp.prod_id + LEFT JOIN tz_sku ts + ON tb.sku_id = ts.sku_id + WHERE tp.status = 0 OR ts.status = 0 AND tb.user_id = 1) AS temp) + + + + + + + + UPDATE tz_basket SET discount_id = #{shopCartParam.discountId} where basket_id = #{key} and user_id = #{userId} + + + + + diff --git a/yami-shop-service/src/main/resources/mapper/BrandMapper.xml b/yami-shop-service/src/main/resources/mapper/BrandMapper.xml new file mode 100644 index 0000000..54fb33a --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/BrandMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/CategoryBrandMapper.xml b/yami-shop-service/src/main/resources/mapper/CategoryBrandMapper.xml new file mode 100644 index 0000000..2660583 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/CategoryBrandMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + insert into tz_category_brand (category_id,brand_id) values + + (#{categoryId},#{brandId}) + + + + delete from tz_category_brand where category_id = #{categoryId} + + + + delete from tz_category_brand where brand_id = #{brandId} + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/CategoryMapper.xml b/yami-shop-service/src/main/resources/mapper/CategoryMapper.xml new file mode 100644 index 0000000..eaf56cc --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/CategoryMapper.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/yami-shop-service/src/main/resources/mapper/CategoryPropMapper.xml b/yami-shop-service/src/main/resources/mapper/CategoryPropMapper.xml new file mode 100644 index 0000000..6900184 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/CategoryPropMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + insert into tz_category_prop (category_id,prop_id) values + + (#{categoryId},#{propId}) + + + + + delete from tz_category_prop where category_id = #{categoryId} + + + + delete from tz_category_prop where prop_id = #{propId} + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/DeliveryMapper.xml b/yami-shop-service/src/main/resources/mapper/DeliveryMapper.xml new file mode 100644 index 0000000..5524fe5 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/DeliveryMapper.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/HotSearchMapper.xml b/yami-shop-service/src/main/resources/mapper/HotSearchMapper.xml new file mode 100644 index 0000000..a11f779 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/HotSearchMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/IndexImgMapper.xml b/yami-shop-service/src/main/resources/mapper/IndexImgMapper.xml new file mode 100644 index 0000000..2b599e6 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/IndexImgMapper.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + delete from tz_index_img where img_id in + + #{id} + + + + + diff --git a/yami-shop-service/src/main/resources/mapper/LoginHistMapper.xml b/yami-shop-service/src/main/resources/mapper/LoginHistMapper.xml new file mode 100644 index 0000000..174c54d --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/LoginHistMapper.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/MessageMapper.xml b/yami-shop-service/src/main/resources/mapper/MessageMapper.xml new file mode 100644 index 0000000..d494764 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/MessageMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + delete from tz_message where id in + + #{id} + + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/NoticeMapper.xml b/yami-shop-service/src/main/resources/mapper/NoticeMapper.xml new file mode 100644 index 0000000..4117f48 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/NoticeMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + diff --git a/yami-shop-service/src/main/resources/mapper/OrderItemMapper.xml b/yami-shop-service/src/main/resources/mapper/OrderItemMapper.xml new file mode 100644 index 0000000..9d2950a --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/OrderItemMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO `tz_order_item` (shop_id,order_number,prod_id,sku_id,sku_name, + prod_count,prod_name,pic,price,user_id,product_total_amount,rec_time,comm_sts, + distribution_card_no,basket_date) VALUES + + (#{orderItem.shopId},#{orderItem.orderNumber},#{orderItem.prodId},#{orderItem.skuId},#{orderItem.skuName}, + #{orderItem.prodCount},#{orderItem.prodName},#{orderItem.pic},#{orderItem.price},#{orderItem.userId},#{orderItem.productTotalAmount},#{orderItem.recTime},#{orderItem.commSts}, + #{orderItem.distributionCardNo},#{orderItem.basketDate}) + + + + + diff --git a/yami-shop-service/src/main/resources/mapper/OrderMapper.xml b/yami-shop-service/src/main/resources/mapper/OrderMapper.xml new file mode 100644 index 0000000..043312d --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/OrderMapper.xml @@ -0,0 +1,354 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update tz_order set `status`=6,cancel_time = NOW() where order_id in + + #{order.orderId} + + + + + update tz_order set `status`=5,finally_time = NOW() where order_id in + + #{order.orderId} + + + + + update tz_order set status = 2,is_payed =1,update_time=NOW(),pay_time=NOW(),pay_type =#{payType} where order_number in + + #{orderNumber} + + + + + + + + + + + + + + + + + + + + + + + + UPDATE tz_order SET `delete_status`=2 + WHERE order_id IN + + #{order.orderId} + + + + + + diff --git a/yami-shop-service/src/main/resources/mapper/OrderSettlementMapper.xml b/yami-shop-service/src/main/resources/mapper/OrderSettlementMapper.xml new file mode 100644 index 0000000..beda551 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/OrderSettlementMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + update tz_order_settlement + SET + + pay_no = #{orderSettlement.payNo}, + + + pay_type = #{orderSettlement.payType}, + + + is_clearing = #{orderSettlement.isClearing}, + + + clearing_time = #{orderSettlement.clearingTime}, + + order_number = #{orderSettlement.orderNumber} + WHERE order_number = #{orderSettlement.orderNumber} and user_id = #{orderSettlement.userId} + + + + + + update tz_order_settlement + + set + biz_pay_no = #{transactionId}, + is_clearing = 1, + pay_status = 1 + + where pay_no = #{outTradeNo} + + + + update tz_order_settlement set pay_status = 1, version = version +1 where pay_no = #{payNo} and version = #{version} + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/PickAddrMapper.xml b/yami-shop-service/src/main/resources/mapper/PickAddrMapper.xml new file mode 100644 index 0000000..0249a76 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/PickAddrMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + delete from tz_pick_addr where addr_id in + + #{addrId} + + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/PointsChangeMapper.xml b/yami-shop-service/src/main/resources/mapper/PointsChangeMapper.xml new file mode 100644 index 0000000..7bdc3dc --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/PointsChangeMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/PointsMapper.xml b/yami-shop-service/src/main/resources/mapper/PointsMapper.xml new file mode 100644 index 0000000..eeb6444 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/PointsMapper.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + delete from tz_points where points_id in + + #{id} + + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/PointsProdMapper.xml b/yami-shop-service/src/main/resources/mapper/PointsProdMapper.xml new file mode 100644 index 0000000..8cda62d --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/PointsProdMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/PointsWalletMapper.xml b/yami-shop-service/src/main/resources/mapper/PointsWalletMapper.xml new file mode 100644 index 0000000..152aee6 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/PointsWalletMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/ProdCommMapper.xml b/yami-shop-service/src/main/resources/mapper/ProdCommMapper.xml new file mode 100644 index 0000000..4e97666 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/ProdCommMapper.xml @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + pc.prod_comm_id, + pc.reply_content, + pc.rec_time, + pc.score, + pc.is_anonymous, + pc.pics, + pc.user_id, + pc.reply_sts, + pc.evaluate, + pc.content, + u.nick_name, + u.pic + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/ProdImgMapper.xml b/yami-shop-service/src/main/resources/mapper/ProdImgMapper.xml new file mode 100644 index 0000000..6daa9fe --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/ProdImgMapper.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/ProdPropMapper.xml b/yami-shop-service/src/main/resources/mapper/ProdPropMapper.xml new file mode 100644 index 0000000..a1dd748 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/ProdPropMapper.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + delete from tz_prod_prop where prop_id = #{propId} and rule = #{rule} and shop_id = #{shopId} + + + + + + + diff --git a/yami-shop-service/src/main/resources/mapper/ProdPropValueMapper.xml b/yami-shop-service/src/main/resources/mapper/ProdPropValueMapper.xml new file mode 100644 index 0000000..69a1a31 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/ProdPropValueMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + insert into tz_prod_prop_value (prop_id,prop_value) values + + (#{propId},#{prodPropValue.propValue}) + + + + + delete from tz_prod_prop_value where prop_id = #{propId} + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/ProdTagMapper.xml b/yami-shop-service/src/main/resources/mapper/ProdTagMapper.xml new file mode 100644 index 0000000..61d7392 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/ProdTagMapper.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/yami-shop-service/src/main/resources/mapper/ProdTagReferenceMapper.xml b/yami-shop-service/src/main/resources/mapper/ProdTagReferenceMapper.xml new file mode 100644 index 0000000..918a07e --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/ProdTagReferenceMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/yami-shop-service/src/main/resources/mapper/ProductMapper.xml b/yami-shop-service/src/main/resources/mapper/ProductMapper.xml new file mode 100644 index 0000000..e70f6ac --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/ProductMapper.xml @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + p.`prod_id`, + p.`shop_id`, + p.`prod_name`, + p.`pic`, + p.`price`, + p.`ori_price`, + p.`brief`, + p.`imgs`, + p.`category_id`, + p.`total_stocks` + + + + p.prod_id, + p.pic, + p.prod_name, + p.price, + p.brief, + sd.`shop_name` + + + + update tz_prod set total_stocks = total_stocks - #{prod.totalStocks} ,version = version + 1 where prod_id = #{prod.prodId} and #{prod.totalStocks} <= total_stocks + + + + + + + + + + + update tz_prod set total_stocks = total_stocks + #{changeStocks} where prod_id = #{prodId} + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/yami-shop-service/src/main/resources/mapper/ScoreLogMapper.xml b/yami-shop-service/src/main/resources/mapper/ScoreLogMapper.xml new file mode 100644 index 0000000..8c977a9 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/ScoreLogMapper.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/SensWordMapper.xml b/yami-shop-service/src/main/resources/mapper/SensWordMapper.xml new file mode 100644 index 0000000..57a40ab --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/SensWordMapper.xml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/ShopDetailMapper.xml b/yami-shop-service/src/main/resources/mapper/ShopDetailMapper.xml new file mode 100644 index 0000000..af87ca4 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/ShopDetailMapper.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/SkuMapper.xml b/yami-shop-service/src/main/resources/mapper/SkuMapper.xml new file mode 100644 index 0000000..bbff261 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/SkuMapper.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO `tz_sku` ( + `prod_id`,`properties`,`ori_price`,`price`,`stocks`,`actual_stocks`, + `update_time`,`rec_time`,`party_code`,`model_id`, `pic`, + `sku_name`,`prod_name`,`version`,`weight`,`volume`, `status`, `is_delete` + ) + VALUES + + ( + #{prodId},#{sku.properties},#{sku.oriPrice},#{sku.price},#{sku.stocks}, + #{sku.actualStocks}, NOW(),NOW(),#{sku.partyCode},#{sku.modelId}, #{sku.pic}, + #{sku.skuName},#{sku.prodName},0,#{sku.weight},#{sku.volume}, #{sku.status},0 + ) + + + + + + + update tz_sku set stocks = stocks - #{sku.stocks}, version = version + 1,update_time = NOW() where sku_id = #{sku.skuId} and #{sku.stocks} <= stocks + + + + update tz_sku set is_delete = 1 where prod_id = #{prodId} + + + + + update tz_sku set stocks = stocks + #{changeStocks} where sku_id = #{skuId} + + + diff --git a/yami-shop-service/src/main/resources/mapper/SmsLogMapper.xml b/yami-shop-service/src/main/resources/mapper/SmsLogMapper.xml new file mode 100644 index 0000000..2a2fc8e --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/SmsLogMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + update tz_sms_log set status = 0 where user_phone = #{mobile} and type = #{type} + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/TranscityFreeMapper.xml b/yami-shop-service/src/main/resources/mapper/TranscityFreeMapper.xml new file mode 100644 index 0000000..fed6f1e --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/TranscityFreeMapper.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/TranscityMapper.xml b/yami-shop-service/src/main/resources/mapper/TranscityMapper.xml new file mode 100644 index 0000000..3c85fd6 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/TranscityMapper.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + insert into tz_transcity (transfee_id,city_id) values + + (#{transcity.transfeeId},#{transcity.cityId}) + + + + + insert into tz_transcity_free (transfee_free_id,free_city_id) values + + (#{transcityFree.transfeeFreeId},#{transcityFree.freeCityId}) + + + + + delete from tz_transcity where transfee_id in + + #{transfeeId} + + + + + delete from tz_transcity_free where transfee_free_id in + + #{transfeeFreeId} + + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/TransfeeFreeMapper.xml b/yami-shop-service/src/main/resources/mapper/TransfeeFreeMapper.xml new file mode 100644 index 0000000..38246db --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/TransfeeFreeMapper.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/TransfeeMapper.xml b/yami-shop-service/src/main/resources/mapper/TransfeeMapper.xml new file mode 100644 index 0000000..ec2a8c2 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/TransfeeMapper.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + insert into tz_transfee (transport_id,continuous_piece,first_piece,continuous_fee,first_fee) values + + (#{transfee.transportId},#{transfee.continuousPiece},#{transfee.firstPiece},#{transfee.continuousFee},#{transfee.firstFee}) + + + + + insert into tz_transfee_free (free_type,amount,piece,transport_id) values + + (#{transfeeFree.freeType},#{transfeeFree.amount},#{transfeeFree.piece},#{transfeeFree.transportId}) + + + + + delete from tz_transfee where transport_id = #{transportId} + + + + delete from tz_transfee_free where transport_id = #{transportId} + + + + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/TransportMapper.xml b/yami-shop-service/src/main/resources/mapper/TransportMapper.xml new file mode 100644 index 0000000..f362a9d --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/TransportMapper.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + delete from tz_transport where transport_id in + + #{id} + + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/UserAddrMapper.xml b/yami-shop-service/src/main/resources/mapper/UserAddrMapper.xml new file mode 100644 index 0000000..240008f --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/UserAddrMapper.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + update tz_user_addr set common_addr = 0 where user_id = #{userId} + + + + + update tz_user_addr set common_addr = 1 where user_id = #{userId} and addr_id = #{addrId} + + + + diff --git a/yami-shop-service/src/main/resources/mapper/UserAddrOrderMapper.xml b/yami-shop-service/src/main/resources/mapper/UserAddrOrderMapper.xml new file mode 100644 index 0000000..1c39ce5 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/UserAddrOrderMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/yami-shop-service/src/main/resources/mapper/UserCollectionMapper.xml b/yami-shop-service/src/main/resources/mapper/UserCollectionMapper.xml new file mode 100644 index 0000000..6a30420 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/UserCollectionMapper.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/yami-shop-service/src/main/resources/mapper/UserMapper.xml b/yami-shop-service/src/main/resources/mapper/UserMapper.xml new file mode 100644 index 0000000..bf46fc6 --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/UserMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/yami-shop-service/src/main/resources/mapper/WxOrderMapper.xml b/yami-shop-service/src/main/resources/mapper/WxOrderMapper.xml new file mode 100644 index 0000000..fe474ae --- /dev/null +++ b/yami-shop-service/src/main/resources/mapper/WxOrderMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + update tz_wx_order set status = 1 where sn = #{outTradeNo} + + \ No newline at end of file diff --git a/yami-shop-sys/pom.xml b/yami-shop-sys/pom.xml new file mode 100644 index 0000000..2b89e62 --- /dev/null +++ b/yami-shop-sys/pom.xml @@ -0,0 +1,21 @@ + + 4.0.0 + yami-shop-sys + + + com.yami.shop + yami-shop + 0.0.1-SNAPSHOT + ../pom.xml + + + + + + com.yami.shop + yami-shop-security + ${yami.shop.version} + + + \ No newline at end of file diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/aspect/SysLogAspect.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/aspect/SysLogAspect.java new file mode 100644 index 0000000..e508902 --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/aspect/SysLogAspect.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.aspect; + +import java.lang.reflect.Method; +import java.util.Date; + +import javax.servlet.http.HttpServletRequest; + + +import com.yami.shop.common.util.IPHelper; +import com.yami.shop.security.util.SecurityUtils; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import com.yami.shop.sys.service.SysLogService; +import com.yami.shop.sys.model.SysLog; +import com.yami.shop.common.util.Json; + +import cn.hutool.core.date.SystemClock; +import cn.hutool.core.util.StrUtil; + +/** + * @author lgh + */ +@Aspect +@Component +public class SysLogAspect { + @Autowired + private SysLogService sysLogService; + private static Logger logger = LoggerFactory.getLogger(SysLogAspect.class); + + @Around("@annotation(sysLog)") + public Object around(ProceedingJoinPoint joinPoint,com.yami.shop.common.annotation.SysLog sysLog) throws Throwable { + long beginTime = SystemClock.now(); + //执行方法 + Object result = joinPoint.proceed(); + //执行时长(毫秒) + long time = SystemClock.now() - beginTime; + + + SysLog sysLogEntity = new SysLog(); + if(sysLog != null){ + //注解上的描述 + sysLogEntity.setOperation(sysLog.value()); + } + + //请求的方法名 + String className = joinPoint.getTarget().getClass().getName(); + String methodName = joinPoint.getSignature().getName(); + sysLogEntity.setMethod(className + "." + methodName + "()"); + + //请求的参数 + Object[] args = joinPoint.getArgs(); + String params = Json.toJsonString(args[0]); + sysLogEntity.setParams(params); + + //设置IP地址 + sysLogEntity.setIp(IPHelper.getIpAddr()); + + //用户名 + String username = SecurityUtils.getSysUser().getUsername(); + sysLogEntity.setUsername(username); + + sysLogEntity.setTime(time); + sysLogEntity.setCreateDate(new Date()); + //保存系统日志 + sysLogService.save(sysLogEntity); + + + return result; + } + +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/constant/Constant.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/constant/Constant.java new file mode 100644 index 0000000..1dd120c --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/constant/Constant.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.constant; + +/** + * 常量 + */ +public class Constant { + /** 超级管理员ID */ + public static final int SUPER_ADMIN_ID = 1; + + /** 系统菜单最大id */ + public static final int SYS_MENU_MAX_ID = 1; + +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/constant/MenuType.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/constant/MenuType.java new file mode 100644 index 0000000..0e0b483 --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/constant/MenuType.java @@ -0,0 +1,29 @@ +package com.yami.shop.sys.constant; + +/** + * 菜单类型 + */ +public enum MenuType { + /** + * 目录 + */ + CATALOG(0), + /** + * 菜单 + */ + MENU(1), + /** + * 按钮 + */ + BUTTON(2); + + private int value; + + MenuType(int value) { + this.value = value; + } + + public int getValue() { + return value; + } +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/controller/SysConfigController.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/controller/SysConfigController.java new file mode 100644 index 0000000..f4079e4 --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/controller/SysConfigController.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.controller; + + +import javax.validation.Valid; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yami.shop.sys.model.SysConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +import com.yami.shop.common.util.PageParam; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yami.shop.sys.service.SysConfigService; +import com.yami.shop.common.annotation.SysLog; + +import cn.hutool.core.util.StrUtil; + + + +/** + * 系统配置信息 + * @author lgh + */ +@RestController +@RequestMapping("/sys/config") +public class SysConfigController{ + @Autowired + private SysConfigService sysConfigService; + + /** + * 所有配置列表 + */ + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('sys:config:page')") + public ResponseEntity> page(String paramKey,PageParam page){ + IPage sysConfigs = sysConfigService.page(page, new LambdaQueryWrapper().like(StrUtil.isNotBlank(paramKey),SysConfig::getParamKey,paramKey)); + return ResponseEntity.ok(sysConfigs); + } + + + /** + * 配置信息 + */ + @GetMapping("/info/{id}") + @PreAuthorize("@pms.hasPermission('sys:config:info')") + public ResponseEntity info(@PathVariable("id") Long id){ + SysConfig config = sysConfigService.getById(id); + return ResponseEntity.ok(config); + } + + /** + * 保存配置 + */ + @SysLog("保存配置") + @PostMapping + @PreAuthorize("@pms.hasPermission('sys:config:save')") + public ResponseEntity save(@RequestBody @Valid SysConfig config){ + sysConfigService.save(config); + return ResponseEntity.ok().build(); + } + + /** + * 修改配置 + */ + @SysLog("修改配置") + @PutMapping + @PreAuthorize("@pms.hasPermission('sys:config:update')") + public ResponseEntity update(@RequestBody @Valid SysConfig config){ + sysConfigService.updateById(config); + return ResponseEntity.ok().build(); + } + + /** + * 删除配置 + */ + @SysLog("删除配置") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('sys:config:delete')") + public ResponseEntity delete(@RequestBody Long[] configIds){ + sysConfigService.deleteBatch(configIds); + return ResponseEntity.ok().build(); + } + +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/controller/SysLogController.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/controller/SysLogController.java new file mode 100644 index 0000000..c2c1137 --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/controller/SysLogController.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.controller; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yami.shop.sys.model.SysLog; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +import com.yami.shop.common.util.PageParam; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yami.shop.sys.service.SysLogService; + +import cn.hutool.core.util.StrUtil; + + + + +/** + * 系统日志 + * @author lgh + */ +@RestController +@RequestMapping("/sys/log") +public class SysLogController { + @Autowired + private SysLogService sysLogService; + + /** + * 列表 + */ + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('sys:log:page')") + public ResponseEntity> page(SysLog sysLog,PageParam page){ + IPage sysLogs = sysLogService.page(page, + new LambdaQueryWrapper() + .like(StrUtil.isNotBlank(sysLog.getUsername()),SysLog::getUsername, sysLog.getUsername()) + .like(StrUtil.isNotBlank(sysLog.getOperation()), SysLog::getOperation,sysLog.getOperation())); + return ResponseEntity.ok(sysLogs); + } + +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/controller/SysMenuController.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/controller/SysMenuController.java new file mode 100644 index 0000000..5fd4392 --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/controller/SysMenuController.java @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.controller; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import javax.validation.Valid; + +import cn.hutool.core.map.MapUtil; +import com.yami.shop.security.util.SecurityUtils; + +import com.yami.shop.sys.constant.Constant; +import com.yami.shop.sys.constant.MenuType; +import com.yami.shop.sys.model.SysMenu; +import lombok.AllArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +import com.yami.shop.sys.service.SysMenuService; +import com.yami.shop.common.annotation.SysLog; +import com.yami.shop.common.exception.YamiShopBindException; + +import cn.hutool.core.util.StrUtil; +import io.swagger.annotations.ApiOperation; + +/** + * 系统菜单 + * @author lgh + */ +@RestController +@RequestMapping("/sys/menu") +@AllArgsConstructor +public class SysMenuController{ + + private final SysMenuService sysMenuService; + + + @GetMapping("/nav") + @ApiOperation(value="获取用户所拥有的菜单和权限", notes="通过登陆用户的userId获取用户所拥有的菜单和权限") + public ResponseEntity> nav(){ + List menuList = sysMenuService.listMenuByUserId(SecurityUtils.getSysUser().getUserId()); + Collection authorities = SecurityUtils.getSysUser().getAuthorities(); + + return ResponseEntity.ok(MapUtil.builder().put("menuList", menuList).put("authorities", authorities).build()); + } + + /** + * 获取菜单页面的表 + * @return + */ + @GetMapping("/table") + public ResponseEntity> table(){ + List sysMenuList = sysMenuService.listMenuAndBtn(); + return ResponseEntity.ok(sysMenuList); + } + + /** + * 所有菜单列表(用于新建、修改角色时 获取菜单的信息) + */ + @GetMapping("/list") + @ApiOperation(value="获取用户所拥有的菜单(不包括按钮)", notes="通过登陆用户的userId获取用户所拥有的菜单和权限") + public ResponseEntity> list(){ + List sysMenuList= sysMenuService.listSimpleMenuNoButton(); + return ResponseEntity.ok(sysMenuList); + } + + /** + * 选择菜单 + */ + @GetMapping("/listRootMenu") + public ResponseEntity> listRootMenu(){ + //查询列表数据 + List menuList = sysMenuService.listRootMenu(); + + return ResponseEntity.ok(menuList); + } + + /** + * 选择子菜单 + */ + @GetMapping("/listChildrenMenu") + public ResponseEntity> listChildrenMenu(Long parentId){ + //查询列表数据 + List menuList = sysMenuService.listChildrenMenuByParentId(parentId); + + return ResponseEntity.ok(menuList); + } + + /** + * 菜单信息 + */ + @GetMapping("/info/{menuId}") + @PreAuthorize("@pms.hasPermission('sys:menu:info')") + public ResponseEntity info(@PathVariable("menuId") Long menuId){ + SysMenu menu = sysMenuService.getById(menuId); + return ResponseEntity.ok(menu); + } + + /** + * 保存 + */ + @SysLog("保存菜单") + @PostMapping + @PreAuthorize("@pms.hasPermission('sys:menu:save')") + public ResponseEntity save(@Valid @RequestBody SysMenu menu){ + //数据校验 + verifyForm(menu); + sysMenuService.save(menu); + return ResponseEntity.ok().build(); + } + + /** + * 修改 + */ + @SysLog("修改菜单") + @PutMapping + @PreAuthorize("@pms.hasPermission('sys:menu:update')") + public ResponseEntity update(@Valid @RequestBody SysMenu menu){ + //数据校验 + verifyForm(menu); + + if(menu.getType() == MenuType.MENU.getValue()){ + if(StrUtil.isBlank(menu.getUrl())){ + return ResponseEntity.badRequest().body("菜单URL不能为空"); + } + } + sysMenuService.updateById(menu); + + return ResponseEntity.ok().build(); + } + + /** + * 删除 + */ + @SysLog("删除菜单") + @DeleteMapping("/{menuId}") + @PreAuthorize("@pms.hasPermission('sys:menu:delete')") + public ResponseEntity delete(@PathVariable Long menuId){ + if(menuId <= Constant.SYS_MENU_MAX_ID){ + return ResponseEntity.badRequest().body("系统菜单,不能删除"); + } + //判断是否有子菜单或按钮 + List menuList = sysMenuService.listChildrenMenuByParentId(menuId); + if(menuList.size() > 0){ + return ResponseEntity.badRequest().body("请先删除子菜单或按钮"); + } + + sysMenuService.deleteMenuAndRoleMenu(menuId); + + return ResponseEntity.ok().build(); + } + + /** + * 验证参数是否正确 + */ + private void verifyForm(SysMenu menu){ + + if(menu.getType() == MenuType.MENU.getValue()){ + if(StrUtil.isBlank(menu.getUrl())){ + throw new YamiShopBindException("菜单URL不能为空"); + } + } + if(Objects.equals(menu.getMenuId(), menu.getParentId())){ + throw new YamiShopBindException("自己不能是自己的上级"); + } + + //上级菜单类型 + int parentType = MenuType.CATALOG.getValue(); + if(menu.getParentId() != 0){ + SysMenu parentMenu = sysMenuService.getById(menu.getParentId()); + parentType = parentMenu.getType(); + } + + //目录、菜单 + if(menu.getType() == MenuType.CATALOG.getValue() || + menu.getType() == MenuType.MENU.getValue()){ + if(parentType != MenuType.CATALOG.getValue()){ + throw new YamiShopBindException("上级菜单只能为目录类型"); + } + return ; + } + + //按钮 + if(menu.getType() == MenuType.BUTTON.getValue()){ + if(parentType != MenuType.MENU.getValue()){ + throw new YamiShopBindException("上级菜单只能为菜单类型"); + } + } + } +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/controller/SysRoleController.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/controller/SysRoleController.java new file mode 100644 index 0000000..75d8ffe --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/controller/SysRoleController.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.controller; + +import java.util.List; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yami.shop.sys.model.SysRole; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +import com.yami.shop.common.util.PageParam; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yami.shop.sys.service.SysMenuService; +import com.yami.shop.sys.service.SysRoleService; +import com.yami.shop.common.annotation.SysLog; + +import cn.hutool.core.util.StrUtil; + + + +/** + * 角色管理 + * @author lgh + */ +@RestController +@RequestMapping("/sys/role") +public class SysRoleController{ + @Autowired + private SysRoleService sysRoleService; + + @Autowired + private SysMenuService sysMenuService; + + /** + * 角色列表 + */ + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('sys:role:page')") + public ResponseEntity> page(String roleName,PageParam page){ + IPage sysRoles = sysRoleService.page(page,new LambdaQueryWrapper().like(StrUtil.isNotBlank(roleName),SysRole::getRoleName,roleName)); + return ResponseEntity.ok(sysRoles); + } + + /** + * 角色列表 + */ + @GetMapping("/list") + @PreAuthorize("@pms.hasPermission('sys:role:list')") + public ResponseEntity> list(){ + List list = sysRoleService.list(); + return ResponseEntity.ok(list); + } + + /** + * 角色信息 + */ + @GetMapping("/info/{roleId}") + @PreAuthorize("@pms.hasPermission('sys:role:info')") + public ResponseEntity info(@PathVariable("roleId") Long roleId){ + SysRole role = sysRoleService.getById(roleId); + + //查询角色对应的菜单 + List menuList = sysMenuService.listMenuIdByRoleId(roleId); + role.setMenuIdList(menuList); + + return ResponseEntity.ok(role); + } + + /** + * 保存角色 + */ + @SysLog("保存角色") + @PostMapping + @PreAuthorize("@pms.hasPermission('sys:role:save')") + public ResponseEntity save(@RequestBody SysRole role){ + sysRoleService.saveRoleAndRoleMenu(role); + return ResponseEntity.ok().build(); + } + + /** + * 修改角色 + */ + @SysLog("修改角色") + @PutMapping + @PreAuthorize("@pms.hasPermission('sys:role:update')") + public ResponseEntity update(@RequestBody SysRole role){ + sysRoleService.updateRoleAndRoleMenu(role); + return ResponseEntity.ok().build(); + } + + /** + * 删除角色 + */ + @SysLog("删除角色") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('sys:role:delete')") + public ResponseEntity delete(@RequestBody Long[] roleIds){ + sysRoleService.deleteBatch(roleIds); + return ResponseEntity.ok().build(); + } +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/controller/SysUserController.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/controller/SysUserController.java new file mode 100644 index 0000000..8f0fa07 --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/controller/SysUserController.java @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.controller; + + +import java.util.List; +import java.util.Objects; + +import javax.validation.Valid; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.yami.shop.common.util.PageParam; +import com.yami.shop.sys.constant.Constant; +import com.yami.shop.security.util.SecurityUtils; + + +import com.yami.shop.sys.dto.UpdatePasswordDto; +import com.yami.shop.sys.model.SysUser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.yami.shop.sys.service.SysRoleService; +import com.yami.shop.sys.service.SysUserService; +import com.yami.shop.common.annotation.SysLog; +import com.yami.shop.common.exception.YamiShopBindException; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import io.swagger.annotations.ApiOperation; + +/** + * 系统用户 + * @author lgh + */ +@RestController +@RequestMapping("/sys/user") +public class SysUserController { + @Autowired + private SysUserService sysUserService; + @Autowired + private SysRoleService sysRoleService; + + @Autowired + private PasswordEncoder passwordEncoder; + /** + * 所有用户列表 + */ + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('sys:user:page')") + public ResponseEntity> page(String username,PageParam page){ + + IPage sysUserPage = sysUserService.page(page, new LambdaQueryWrapper() + .eq(SysUser::getShopId, SecurityUtils.getSysUser().getShopId()) + .like(StrUtil.isNotBlank(username), SysUser::getUsername, username)); + + + return ResponseEntity.ok(sysUserPage); + } + + /** + * 获取登录的用户信息 + */ + @GetMapping("/info") + public ResponseEntity info(){ + return ResponseEntity.ok(sysUserService.getSysUserById(SecurityUtils.getSysUser().getUserId())); + } + + /** + * 修改登录用户密码 + */ + @SysLog("修改密码") + @PostMapping("/password") + @ApiOperation(value="修改密码", notes="修改当前登陆用户的密码") + public ResponseEntity password(@RequestBody @Valid UpdatePasswordDto param){ + Long userId = SecurityUtils.getSysUser().getUserId(); + + SysUser dbUser = sysUserService.getSysUserById(userId); + if (!passwordEncoder.matches(param.getPassword(), dbUser.getPassword())) { + return ResponseEntity.badRequest().body("原密码不正确"); + } + //新密码 + String newPassword = passwordEncoder.encode(param.getNewPassword()); +// 更新密码 + sysUserService.updatePasswordByUserId(userId, newPassword); + return ResponseEntity.ok().build(); + } + + /** + * 用户信息 + */ + @GetMapping("/info/{userId}") + @PreAuthorize("@pms.hasPermission('sys:user:info')") + public ResponseEntity info(@PathVariable("userId") Long userId){ + SysUser user = sysUserService.getSysUserById(userId); + user.setUserId(null); + if (!Objects.equals(user.getShopId(), SecurityUtils.getSysUser().getShopId())) { + throw new YamiShopBindException("没有权限获取该用户信息"); + } + //获取用户所属的角色列表 + List roleIdList = sysRoleService.listRoleIdByUserId(userId); + user.setRoleIdList(roleIdList); + return ResponseEntity.ok(user); + } + + /** + * 保存用户 + */ + @SysLog("保存用户") + @PostMapping + @PreAuthorize("@pms.hasPermission('sys:user:save')") + public ResponseEntity save(@Valid @RequestBody SysUser user){ + String username = user.getUsername(); + SysUser dbUser = sysUserService.getOne(new LambdaQueryWrapper() + .eq(SysUser::getUsername, username)); + if (dbUser!=null) { + return ResponseEntity.badRequest().body("该用户已存在"); + } + user.setShopId(SecurityUtils.getSysUser().getShopId()); + user.setPassword(passwordEncoder.encode(user.getPassword())); + sysUserService.saveUserAndUserRole(user); + return ResponseEntity.ok().build(); + } + + /** + * 修改用户 + */ + @SysLog("修改用户") + @PutMapping + @PreAuthorize("@pms.hasPermission('sys:user:update')") + public ResponseEntity update(@Valid @RequestBody SysUser user){ + String password = user.getPassword(); + + SysUser dbUser = sysUserService.getSysUserById(user.getUserId()); + + if (!Objects.equals(dbUser.getShopId(), SecurityUtils.getSysUser().getShopId())) { + throw new YamiShopBindException("没有权限修改该用户信息"); + } + SysUser dbUserNameInfo = sysUserService.getByUserName(user.getUsername()); + + if (dbUserNameInfo != null && !Objects.equals(dbUserNameInfo.getUserId(),user.getUserId())) { + return ResponseEntity.badRequest().body("该用户已存在"); + } + if (StrUtil.isBlank(password)) { + user.setPassword(null); + }else { + user.setPassword(passwordEncoder.encode(user.getPassword())); + } + sysUserService.updateUserAndUserRole(user); + return ResponseEntity.ok().build(); + } + + /** + * 删除用户 + */ + @SysLog("删除用户") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('sys:user:delete')") + public ResponseEntity delete(@RequestBody Long[] userIds){ + if (userIds.length == 0) { + return ResponseEntity.badRequest().body("请选择需要删除的用户"); + } + if(ArrayUtil.contains(userIds, Constant.SUPER_ADMIN_ID)){ + return ResponseEntity.badRequest().body("系统管理员不能删除"); + } + if(ArrayUtil.contains(userIds, SecurityUtils.getSysUser().getUserId())){ + return ResponseEntity.badRequest().body("当前用户不能删除"); + } + sysUserService.deleteBatch(userIds,SecurityUtils.getSysUser().getShopId()); + // 删除缓存 + for (Long userId : userIds) { + sysUserService.evictSysUserById(userId); + } + return ResponseEntity.ok().build(); + } + + +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/dao/SysConfigMapper.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/dao/SysConfigMapper.java new file mode 100644 index 0000000..003bc85 --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/dao/SysConfigMapper.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yami.shop.sys.model.SysConfig; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 系统配置信息 + * @author lgh + */ +public interface SysConfigMapper extends BaseMapper { + + /** + * 根据key,查询系统配置信息 + * @param key key + * @return SysConfig + */ + SysConfig queryByKey(String key); + + /** + * 根据key,更新value + * @param key + * @param value + * @return 更新成功条数 + */ + int updateValueByKey(@Param("key") String key, @Param("value") String value); + + /** + * 根据key查询系统配置信息 + * @param key + * @return 系统配置信息列表 + */ + List selectByKeyLike(String key); + + /** + * 批量删除系统配置 + * @param ids 系统配置信息数组 + */ + void deleteBatch(@Param("ids") Long[] ids); + +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/dao/SysLogMapper.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/dao/SysLogMapper.java new file mode 100644 index 0000000..430e67c --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/dao/SysLogMapper.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yami.shop.sys.model.SysLog; + +/** + * 系统日志 + */ +public interface SysLogMapper extends BaseMapper { + + +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/dao/SysMenuMapper.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/dao/SysMenuMapper.java new file mode 100644 index 0000000..3fcaf62 --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/dao/SysMenuMapper.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yami.shop.sys.model.SysMenu; + +import java.util.List; + + +/** + * 菜单管理 + * @author lgh + */ +public interface SysMenuMapper extends BaseMapper{ + + /** + * 根据角色id获取菜单列表 + * @param roleId 角色id + * @return 菜单id列表 + */ + List listMenuIdByRoleId(Long roleId); + + /** + * 查询用户的所有菜单ID + * @param userId 用户id + * @return 该用户所有可用的菜单 + */ + List listMenuByUserId(Long userId); + + /** + * 获取系统的所有菜单 + * @return 系统的所有菜单 + */ + List listMenu(); + + /** + * 获取简单的menu tree 用于在 ele-ui tree中显示,根据orderNum排序 + * @return ztreeDto列表 + */ + List listSimpleMenuNoButton(); + + /** + * 获取一级菜单 + * @return 一级菜单列表 + */ + List listRootMenu(); + + /** + * 根据一级菜单id 获取二级菜单 + * @return 二级菜单列表 + */ + List listChildrenMenuByParentId(Long parentId); + + List listMenuAndBtn(); +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/dao/SysRoleMapper.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/dao/SysRoleMapper.java new file mode 100644 index 0000000..7adac1e --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/dao/SysRoleMapper.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yami.shop.sys.model.SysRole; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 角色管理 + */ +public interface SysRoleMapper extends BaseMapper{ + + void deleteBatch(@Param("roleIds") Long[] roleIds); + + List listRoleIdByUserId(Long userId); + +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/dao/SysRoleMenuMapper.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/dao/SysRoleMenuMapper.java new file mode 100644 index 0000000..7432210 --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/dao/SysRoleMenuMapper.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yami.shop.sys.model.SysRoleMenu; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 角色与菜单对应关系 + */ +public interface SysRoleMenuMapper extends BaseMapper { + + /** + * 根据角色ID数组,批量删除 + */ + int deleteBatch(Long[] roleIds); + + /** + * 根据菜单id 删除菜单关联角色信息 + * @param menuId + */ + void deleteByMenuId(Long menuId); + + /** + * 根据角色id 批量添加角色与菜单关系 + * @param roleId + * @param menuIdList + */ + void insertRoleAndRoleMenu(@Param("roleId") Long roleId, @Param("menuIdList") List menuIdList); +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/dao/SysUserMapper.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/dao/SysUserMapper.java new file mode 100644 index 0000000..f4cdf45 --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/dao/SysUserMapper.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yami.shop.sys.model.SysUser; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 系统用户 + */ +public interface SysUserMapper extends BaseMapper { + + /** + * 查询用户的所有权限 + * @param userId 用户ID + */ + List queryAllPerms(Long userId); + + /** + * 根据用户id 批量删除用户 + * @param userIds + */ + void deleteBatch(@Param("userIds") Long[] userIds, @Param("shopId") Long shopId); + + /** + * 根据用户名获取管理员用户 + * @param username + * @return + */ + SysUser selectByUsername(String username); + +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/dao/SysUserRoleMapper.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/dao/SysUserRoleMapper.java new file mode 100644 index 0000000..29ccafd --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/dao/SysUserRoleMapper.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yami.shop.sys.model.SysUserRole; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户与角色对应关系 + */ +public interface SysUserRoleMapper extends BaseMapper { + + /** + * 根据角色ID数组,批量删除 + */ + int deleteBatch(@Param("roleIds") Long[] roleIds); + + /** + * 根据用户id删除用户与角色关系 + * @param userId + */ + void deleteByUserId(Long userId); + + /** + * 根据用户id 批量添加用户角色关系 + * @param userId + * @param roleIdList + */ + void insertUserAndUserRole(@Param("userId") Long userId, @Param("roleIdList") List roleIdList); +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/dto/UpdatePasswordDto.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/dto/UpdatePasswordDto.java new file mode 100644 index 0000000..ea5bc4d --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/dto/UpdatePasswordDto.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +@Data +@ApiModel(value= "更新密码参数") +public class UpdatePasswordDto { + + @NotBlank(message="旧密码不能为空") + @Size(max = 50) + @ApiModelProperty(value = "旧密码",required=true) + private String password; + + @NotBlank(message="新密码不能为空") + @Size(max = 50) + @ApiModelProperty(value = "新密码",required=true) + private String newPassword; +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/model/SysConfig.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/model/SysConfig.java new file mode 100644 index 0000000..a93263e --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/model/SysConfig.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.model; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * 系统配置信息 + */ +@Data +@TableName("tz_sys_config") +public class SysConfig { + @TableId + private Long id; + + @NotBlank(message="参数名不能为空") + private String paramKey; + + @NotBlank(message="参数值不能为空") + private String paramValue; + + private String remark; + +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/model/SysLog.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/model/SysLog.java new file mode 100644 index 0000000..e19a0a6 --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/model/SysLog.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.model; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + + +/** + * 系统日志 + */ +@Data +@TableName("tz_sys_log") +public class SysLog implements Serializable { + private static final long serialVersionUID = 1L; + @TableId + private Long id; + /** + * 用户名 + */ + private String username; + /** + * 用户操作 + */ + private String operation; + /** + * 请求方法 + */ + private String method; + /** + * 请求参数 + */ + private String params; + /** + * 执行时长(毫秒) + */ + private Long time; + /** + * IP地址 + */ + private String ip; + /** + * 创建时间 + */ + private Date createDate; + +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/model/SysMenu.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/model/SysMenu.java new file mode 100644 index 0000000..d0e4d14 --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/model/SysMenu.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.model; + + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + * 菜单管理 + * + */ +@Data +@TableName("tz_sys_menu") +public class SysMenu implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 菜单ID + */ + @TableId + private Long menuId; + + /** + * 父菜单ID,一级菜单为0 + */ + @NotNull(message="上级菜单不能为空") + private Long parentId; + + /** + * 父菜单名称 + */ + @TableField(exist=false) + private String parentName; + + /** + * 菜单名称 + */ + @NotBlank(message="菜单名称不能为空") + private String name; + + /** + * 菜单URL + */ + private String url; + + /** + * 授权(多个用逗号分隔,如:user:list,user:create) + */ + private String perms; + + /** + * 类型 0:目录 1:菜单 2:按钮 + */ + private Integer type; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 排序 + */ + private Integer orderNum; + + @TableField(exist=false) + private List list; + +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/model/SysRole.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/model/SysRole.java new file mode 100644 index 0000000..c725cae --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/model/SysRole.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.model; + + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 角色 + */ +@Data +@TableName("tz_sys_role") +public class SysRole implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 角色ID + * + */ + @TableId + + private Long roleId; + + /** + * 角色名称 + */ + @NotBlank(message="角色名称不能为空") + private String roleName; + + /** + * 备注 + */ + private String remark; + + @TableField(exist=false) + private List menuIdList; + + /** + * 创建时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/model/SysRoleMenu.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/model/SysRoleMenu.java new file mode 100644 index 0000000..e0b3442 --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/model/SysRoleMenu.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.model; + + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; + +/** + * 角色与菜单对应关系 + * + */ +@Data +@TableName("tz_sys_role_menu") +public class SysRoleMenu implements Serializable { + private static final long serialVersionUID = 1L; + @TableId + private Long id; + + /** + * 角色ID + */ + private Long roleId; + + /** + * 菜单ID + */ + private Long menuId; + +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/model/SysUser.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/model/SysUser.java new file mode 100644 index 0000000..e802d9d --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/model/SysUser.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.model; + + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 系统用户 + */ +@Data +@TableName("tz_sys_user") +public class SysUser implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 用户ID + * + */ + @TableId + private Long userId; + + /** + * 用户名 + */ + @NotBlank(message="用户名不能为空") + @Size(min = 2,max = 20,message = "用户名长度要在2-20之间") + private String username; + + /** + * 密码 + */ + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + private String password; + + /** + * 邮箱 + */ + @NotBlank(message="邮箱不能为空") + @Email(message="邮箱格式不正确") + private String email; + + /** + * 手机号 + */ + @Pattern(regexp="0?1[0-9]{10}",message = "请输入正确的手机号") + private String mobile; + + /** + * 状态 0:禁用 1:正常 + */ + private Integer status; + + /** + * 用户所在店铺id + */ + private Long shopId; + + /** + * 角色ID列表 + */ + @TableField(exist=false) + private List roleIdList; + + /** + * 创建时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/model/SysUserRole.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/model/SysUserRole.java new file mode 100644 index 0000000..a9d68bd --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/model/SysUserRole.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.model; + + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; + +/** + * 用户与角色对应关系 + */ +@Data +@TableName("tz_sys_user_role") +public class SysUserRole implements Serializable { + private static final long serialVersionUID = 1L; + @TableId + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 角色ID + */ + private Long roleId; +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/service/SysConfigService.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/service/SysConfigService.java new file mode 100644 index 0000000..b401aa7 --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/service/SysConfigService.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.sys.model.SysConfig; + +/** + * 系统配置信息 + * @author lgh + */ +public interface SysConfigService extends IService { + + /** + * 根据key,更新value + * @param key 参数key + * @param value 参数value + */ + public void updateValueByKey(String key, String value); + + /** + * 删除配置信息 + * @param ids 配置项id列表 + */ + public void deleteBatch(Long[] ids); + + /** + * 根据key,获取配置的value值 + * @param key 参数key + * @return value + */ + public String getValue(String key); + +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/service/SysLogService.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/service/SysLogService.java new file mode 100644 index 0000000..0bda99b --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/service/SysLogService.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.sys.model.SysLog; + + +/** + * 系统日志 + * @author lgh + */ +public interface SysLogService extends IService { + +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/service/SysMenuService.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/service/SysMenuService.java new file mode 100644 index 0000000..e697127 --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/service/SysMenuService.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.service; + + +import java.util.List; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.sys.model.SysMenu; + + +/** + * 菜单管理 + * @author lgh + */ +public interface SysMenuService extends IService { + + /** + * 获取用户菜单列表 + * @param userId 用户id + * @return 菜单列表 + */ + List listMenuByUserId(Long userId); + + /** + * 删除 菜单,与角色菜单之间的关系 + * @param menuId 菜单id + */ + void deleteMenuAndRoleMenu(Long menuId); + + /** + * 根据角色ID,获取菜单列表 + * @param roleId 角色id + * @return 角色所拥有的菜单id列表 + */ + List listMenuIdByRoleId(Long roleId); + + /** + * 获取简单的menu tree 用于在ele-ui tree中显示,根据orderNum排序 + * @return 所有的菜单 + */ + List listSimpleMenuNoButton(); + + /** + * 获取一级菜单 + * @return 一级菜单列表 + */ + List listRootMenu(); + + /** + * 根据一级菜单id 获取二级菜单 + * @param parentId 一级菜单id + * @return 二级菜单列表 + */ + List listChildrenMenuByParentId(Long parentId); + + List listMenuAndBtn(); +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/service/SysRoleService.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/service/SysRoleService.java new file mode 100644 index 0000000..55cfee9 --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/service/SysRoleService.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.service; + + +import java.util.List; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.sys.model.SysRole; + +/** + * 角色 + * @author lgh + */ +public interface SysRoleService extends IService { + + /** + * 根据id批量删除 + * @param roleIds + */ + void deleteBatch(Long[] roleIds); + + /** + * 保存角色 与 角色菜单关系 + * @param role + */ + void saveRoleAndRoleMenu(SysRole role); + + /** + * 更新角色 与 角色菜单关系 + * @param role + */ + void updateRoleAndRoleMenu(SysRole role); + + /** + * 根据用户ID,获取角色ID列表 + * @param userId 用户id + * @return 角色id列表 + */ + List listRoleIdByUserId(Long userId); + +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/service/SysUserService.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/service/SysUserService.java new file mode 100644 index 0000000..c4fead7 --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/service/SysUserService.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yami.shop.sys.model.SysUser; + + +/** + * 系统用户 + * @author lgh + */ +public interface SysUserService extends IService { + + /** + * 修改密码 + * @param userId 用户ID + * @param newPassword 新密码 + */ + void updatePasswordByUserId(Long userId, String newPassword); + + /** + * 保存用户与用户角色关系 + * @param user + */ + void saveUserAndUserRole(SysUser user); + + + /** + * 更新用户与用户角色关系 + * @param user + */ + void updateUserAndUserRole(SysUser user); + + /** + * 根据用户id 批量删除用户 + * @param userIds + */ + void deleteBatch(Long[] userIds,Long shopId); + + /** + * 根据用户名获取用户信息 + * @param username + * @return + */ + SysUser getByUserName(String username); + + /** + * 根据用户id获取用户信息 + * @param userId + * @return + */ + SysUser getSysUserById(Long userId); + + /** + * 根据用户id删除用户缓存信息 + * @param userId + * @return + */ + void evictSysUserById(Long userId); +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/service/impl/SysConfigServiceImpl.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/service/impl/SysConfigServiceImpl.java new file mode 100644 index 0000000..1f92281 --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/service/impl/SysConfigServiceImpl.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.service.impl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.yami.shop.sys.service.SysConfigService; +import com.yami.shop.sys.dao.SysConfigMapper; +import com.yami.shop.sys.model.SysConfig; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @author lgh + */ +@Service("sysConfigService") +public class SysConfigServiceImpl extends ServiceImpl implements SysConfigService { + + @Autowired + private SysConfigMapper sysConfigMapper; + + @Override + public void updateValueByKey(String key, String value) { + sysConfigMapper.updateValueByKey(key, value); + } + + @Override + public void deleteBatch(Long[] ids) { + sysConfigMapper.deleteBatch(ids); + } + + @Override + public String getValue(String key) { + SysConfig config = sysConfigMapper.queryByKey(key); + return config == null ? null : config.getParamValue(); + } +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/service/impl/SysLogServiceImpl.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/service/impl/SysLogServiceImpl.java new file mode 100644 index 0000000..00184da --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/service/impl/SysLogServiceImpl.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.service.impl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.yami.shop.sys.service.SysLogService; +import com.yami.shop.sys.dao.SysLogMapper; +import com.yami.shop.sys.model.SysLog; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @author lgh + */ +@Service("sysLogService") +public class SysLogServiceImpl extends ServiceImpl implements SysLogService { + + @Autowired + private SysLogMapper sysLogMapper; +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/service/impl/SysMenuServiceImpl.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/service/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..b700bdd --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.service.impl; + + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import cn.hutool.core.collection.CollectionUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.yami.shop.sys.service.SysMenuService; +import com.yami.shop.sys.dao.SysMenuMapper; +import com.yami.shop.sys.dao.SysRoleMenuMapper; +import com.yami.shop.sys.model.SysMenu; +import com.yami.shop.sys.constant.Constant; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @author lgh + */ +@Service("sysMenuService") +public class SysMenuServiceImpl extends ServiceImpl implements SysMenuService { + @Autowired + private SysRoleMenuMapper sysRoleMenuMapper; + @Autowired + private SysMenuMapper sysMenuMapper; + + @Override + public List listMenuByUserId(Long userId) { + // 用户的所有菜单信息 + List sysMenus ; + //系统管理员,拥有最高权限 + if(userId == Constant.SUPER_ADMIN_ID){ + sysMenus = sysMenuMapper.listMenu(); + }else { + sysMenus = sysMenuMapper.listMenuByUserId(userId); + } + + Map> sysMenuLevelMap = sysMenus.stream() + .sorted(Comparator.comparing(SysMenu::getOrderNum)) + .collect(Collectors.groupingBy(SysMenu::getParentId)); + + // 一级菜单 + List rootMenu = sysMenuLevelMap.get(0L); + if (CollectionUtil.isEmpty(rootMenu)) { + return Collections.emptyList(); + } + // 二级菜单 + for (SysMenu sysMenu : rootMenu) { + sysMenu.setList(sysMenuLevelMap.get(sysMenu.getMenuId())); + } + return rootMenu; + } + + @Override + public void deleteMenuAndRoleMenu(Long menuId){ + //删除菜单 + this.removeById(menuId); + //删除菜单与角色关联 + sysRoleMenuMapper.deleteByMenuId(menuId); + } + + + @Override + public List listMenuIdByRoleId(Long roleId) { + return sysMenuMapper.listMenuIdByRoleId(roleId); + } + + + @Override + public List listSimpleMenuNoButton() { + return sysMenuMapper.listSimpleMenuNoButton(); + } + + @Override + public List listRootMenu() { + return sysMenuMapper.listRootMenu(); + } + + @Override + public List listChildrenMenuByParentId(Long parentId) { + return sysMenuMapper.listChildrenMenuByParentId(parentId); + } + + @Override + public List listMenuAndBtn() { + return sysMenuMapper.listMenuAndBtn(); + } + +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/service/impl/SysRoleServiceImpl.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/service/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..e86db8b --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.service.impl; + +import java.util.Date; +import java.util.List; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.yami.shop.sys.service.SysRoleService; +import com.yami.shop.sys.dao.SysRoleMapper; +import com.yami.shop.sys.dao.SysRoleMenuMapper; +import com.yami.shop.sys.dao.SysUserRoleMapper; +import com.yami.shop.sys.model.SysRole; + + +/** + * 角色 + * @author lgh + */ +@Service("sysRoleService") +public class SysRoleServiceImpl extends ServiceImpl implements SysRoleService { + @Autowired + private SysRoleMenuMapper sysRoleMenuMapper; + @Autowired + private SysUserRoleMapper sysUserRoleMapper; + + @Autowired + private SysRoleMapper sysRoleMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveRoleAndRoleMenu(SysRole role) { + role.setCreateTime(new Date()); + this.save(role); + if (CollectionUtils.isEmpty(role.getMenuIdList())) { + return; + } + + + //保存角色与菜单关系 + sysRoleMenuMapper.insertRoleAndRoleMenu(role.getRoleId(), role.getMenuIdList()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateRoleAndRoleMenu(SysRole role) { + // 更新角色 + sysRoleMapper.updateById(role); + //先删除角色与菜单关系 + sysRoleMenuMapper.deleteBatch(new Long[]{role.getRoleId()}); + if (CollectionUtils.isEmpty(role.getMenuIdList())) { + return; + } + //保存角色与菜单关系 + sysRoleMenuMapper.insertRoleAndRoleMenu(role.getRoleId(), role.getMenuIdList()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteBatch(Long[] roleIds) { + //删除角色 + sysRoleMapper.deleteBatch(roleIds); + + //删除角色与菜单关联 + sysRoleMenuMapper.deleteBatch(roleIds); + + //删除角色与用户关联 + sysUserRoleMapper.deleteBatch(roleIds); + } + @Override + public List listRoleIdByUserId(Long userId) { + return sysRoleMapper.listRoleIdByUserId(userId); + } + +} diff --git a/yami-shop-sys/src/main/java/com/yami/shop/sys/service/impl/SysUserServiceImpl.java b/yami-shop-sys/src/main/java/com/yami/shop/sys/service/impl/SysUserServiceImpl.java new file mode 100644 index 0000000..1d0d383 --- /dev/null +++ b/yami-shop-sys/src/main/java/com/yami/shop/sys/service/impl/SysUserServiceImpl.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved. + * + * https://www.gz-yami.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.sys.service.impl; + + +import java.util.Date; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.yami.shop.sys.service.SysUserService; +import com.yami.shop.sys.dao.SysUserMapper; +import com.yami.shop.sys.dao.SysUserRoleMapper; +import com.yami.shop.sys.model.SysUser; + +import cn.hutool.core.collection.CollUtil; + + +/** + * 系统用户 + * @author lgh + */ +@Service("sysUserService") +public class SysUserServiceImpl extends ServiceImpl implements SysUserService { + @Autowired + private SysUserRoleMapper sysUserRoleMapper; + + @Autowired + private SysUserMapper sysUserMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveUserAndUserRole(SysUser user) { + user.setCreateTime(new Date()); + sysUserMapper.insert(user); + if(CollUtil.isEmpty(user.getRoleIdList())){ + return ; + } + //保存用户与角色关系 + sysUserRoleMapper.insertUserAndUserRole(user.getUserId(), user.getRoleIdList()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames="sys_user",key="#user.userId") + public void updateUserAndUserRole(SysUser user) { + // 更新用户 + sysUserMapper.updateById(user); + + //先删除用户与角色关系 + sysUserRoleMapper.deleteByUserId(user.getUserId()); + + if(CollUtil.isEmpty(user.getRoleIdList())){ + return ; + } + //保存用户与角色关系 + sysUserRoleMapper.insertUserAndUserRole(user.getUserId(), user.getRoleIdList()); + } + + @Override + public void updatePasswordByUserId(Long userId, String newPassword) { + SysUser user = new SysUser(); + user.setPassword(newPassword); + user.setUserId(userId); + sysUserMapper.updateById(user); + } + + @Override + public void deleteBatch(Long[] userIds,Long shopId) { + sysUserMapper.deleteBatch(userIds,shopId); + } + + @Override + public SysUser getByUserName(String username) { + return sysUserMapper.selectByUsername(username); + } + + @Override + @Cacheable(cacheNames="sys_user",key="#userId") + public SysUser getSysUserById(Long userId) { + return sysUserMapper.selectById(userId); + } + + @Override + @CacheEvict(cacheNames="sys_user",key="#userId") + public void evictSysUserById(Long userId) { + + } +} diff --git a/yami-shop-sys/src/main/resources/mapper/SysConfigMapper.xml b/yami-shop-sys/src/main/resources/mapper/SysConfigMapper.xml new file mode 100644 index 0000000..29c7567 --- /dev/null +++ b/yami-shop-sys/src/main/resources/mapper/SysConfigMapper.xml @@ -0,0 +1,22 @@ + + + + + + + update tz_sys_config set param_value = #{value} where param_key = #{key} + + + + + + + delete from tz_sys_config where id in + + #{id} + + + \ No newline at end of file diff --git a/yami-shop-sys/src/main/resources/mapper/SysLogMapper.xml b/yami-shop-sys/src/main/resources/mapper/SysLogMapper.xml new file mode 100644 index 0000000..903959f --- /dev/null +++ b/yami-shop-sys/src/main/resources/mapper/SysLogMapper.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/yami-shop-sys/src/main/resources/mapper/SysMenuMapper.xml b/yami-shop-sys/src/main/resources/mapper/SysMenuMapper.xml new file mode 100644 index 0000000..c9ec4ad --- /dev/null +++ b/yami-shop-sys/src/main/resources/mapper/SysMenuMapper.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/yami-shop-sys/src/main/resources/mapper/SysRoleMapper.xml b/yami-shop-sys/src/main/resources/mapper/SysRoleMapper.xml new file mode 100644 index 0000000..1d9d563 --- /dev/null +++ b/yami-shop-sys/src/main/resources/mapper/SysRoleMapper.xml @@ -0,0 +1,17 @@ + + + + + + + delete from tz_sys_role where role_id in + + #{roleId} + + + + + \ No newline at end of file diff --git a/yami-shop-sys/src/main/resources/mapper/SysRoleMenuMapper.xml b/yami-shop-sys/src/main/resources/mapper/SysRoleMenuMapper.xml new file mode 100644 index 0000000..d0641ca --- /dev/null +++ b/yami-shop-sys/src/main/resources/mapper/SysRoleMenuMapper.xml @@ -0,0 +1,23 @@ + + + + + + delete from tz_sys_role_menu where role_id in + + #{roleId} + + + + + delete from tz_sys_role_menu where menu_id = #{menuId} + + + + insert into tz_sys_role_menu (role_id,menu_id) values + + (#{roleId},#{menuId}) + + + + \ No newline at end of file diff --git a/yami-shop-sys/src/main/resources/mapper/SysUserMapper.xml b/yami-shop-sys/src/main/resources/mapper/SysUserMapper.xml new file mode 100644 index 0000000..dc39e8f --- /dev/null +++ b/yami-shop-sys/src/main/resources/mapper/SysUserMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + delete from tz_sys_user where user_id in + + #{userId} + + and shop_id = #{shopId} + + + + \ No newline at end of file diff --git a/yami-shop-sys/src/main/resources/mapper/SysUserRoleMapper.xml b/yami-shop-sys/src/main/resources/mapper/SysUserRoleMapper.xml new file mode 100644 index 0000000..1b265b4 --- /dev/null +++ b/yami-shop-sys/src/main/resources/mapper/SysUserRoleMapper.xml @@ -0,0 +1,23 @@ + + + + + + + delete from tz_sys_user_role where role_id in + + #{roleId} + + + + + delete from tz_sys_user_role where user_id = #{userId} + + + + insert into tz_sys_user_role (user_id,role_id) values + + (#{userId},#{roleId}) + + + \ No newline at end of file