| | |
| | | |
| | | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml |
| | | hs_err_pid* |
| | | generator |
| | | .idea |
| | | |
| | | target |
| | | |
| | | *.yaml |
| | | *.yml |
| | | *.log |
| | | *.iml |
| | |
| | | ## gy_jifenshangcheng |
| | | ## 系统模块 |
| | | ~~~ |
| | | com.ruoyi |
| | | ├── ruoyi-ui // 前端框架 [80] |
| | | ├── ruoyi-gateway // 网关模块 [8080] |
| | | ├── ruoyi-auth // 认证中心 [9200] |
| | | ├── ruoyi-api // 接口模块 |
| | | │ └── ruoyi-api-system // 系统接口 |
| | | ├── ruoyi-common // 通用模块 |
| | | │ └── ruoyi-common-core // 核心模块 |
| | | │ └── ruoyi-common-datascope // 权限范围 |
| | | │ └── ruoyi-common-datasource // 多数据源 |
| | | │ └── ruoyi-common-log // 日志记录 |
| | | │ └── ruoyi-common-redis // 缓存服务 |
| | | │ └── ruoyi-common-seata // 分布式事务 |
| | | │ └── ruoyi-common-security // 安全模块 |
| | | │ └── ruoyi-common-swagger // 系统接口 |
| | | ├── ruoyi-modules // 业务模块 |
| | | │ └── ruoyi-system // 系统模块 [9201] |
| | | │ └── ruoyi-gen // 代码生成 [9202] |
| | | │ └── ruoyi-job // 定时任务 [9203] |
| | | │ └── ruoyi-file // 文件服务 [9300] |
| | | ├── ruoyi-visual // 图形化管理模块 |
| | | │ └── ruoyi-visual-monitor // 监控中心 [9100] |
| | | ├──pom.xml // 公共依赖 |
| | | ~~~ |
| | | ## 内置功能 |
| | | |
| | | 贵阳-积分商城 |
| | | 1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 |
| | | 2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。 |
| | | 3. 岗位管理:配置系统用户所属担任职务。 |
| | | 4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。 |
| | | 5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 |
| | | 6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。 |
| | | 7. 参数管理:对系统动态配置常用参数。 |
| | | 8. 通知公告:系统通知公告信息发布维护。 |
| | | 9. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 |
| | | 10. 登录日志:系统登录日志记录查询包含登录异常。 |
| | | 11. 在线用户:当前系统中活跃用户状态监控。 |
| | | 12. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。 |
| | | 13. 代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。 |
| | | 14. 系统接口:根据业务代码自动生成相关的api接口文档。 |
| | | 15. 服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。 |
| | | 16. 在线构建器:拖动表单元素生成相应的HTML代码。 |
| | | 17. 连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。 |
| | | |
| | | ~~~ |
| | | |
| | | ## 账号各方面信息 |
| | | 服务器:122.9.150.46 |
| | | 密码: |
| | | |
| | | MySQL数据库: |
| | | 端口:10633 |
| | | 账号:root 密码:YiXingTong2023@! |
| | | 账号:yixingtong 密码:YiXingTong2023@? |
| | | |
| | | RabbitMQ: |
| | | 端口:5672 |
| | | 账号:guest 密码:guest |
| | | 服务器启动命令: systemctl start rabbitmq-server |
| | | |
| | | Redis: |
| | | 端口:10644 |
| | | 密码:YiXingTong2023@? |
| | | |
| | | MongoDB: |
| | | 端口:27017 |
| | | 数据库:gps_address |
| | | 账号:gps 密码:YiXingTongGPS2023@? |
| | | 服务器启动命令: /usr/local/mongodb/mongodb-6.0.5/bin/mongod --dbpath=/usr/local/mongodb/mongodb-6.0.5/data --logpath=/usr/local/mongodb/mongodb-6.0.5/logs/mongodb.log --logappend --port=27017 --fork |
| | | 服务器启动命令: service mongod start |
| | | 服务器MongoDB登录命令: /usr/local/mongodb/mongodb-6.0.5/bin/mongo(6版本弃用,使用远程连接NoSQLBooster) |
New file |
| | |
| | | { |
| | | "customTables":{}, |
| | | "globalTables":{}, |
| | | "normalProcedures":{}, |
| | | "normalTables":{ |
| | | "t_app_user_shop":{ |
| | | "createTableSQL":"CREATE TABLE `t_app_user_shop` (\r\n `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\r\n `app_user_id` bigint DEFAULT NULL COMMENT '用户id',\r\n `shop_id` int DEFAULT NULL COMMENT '门店id',\r\n PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='门店员工关联表(移动端)'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_account", |
| | | "tableName":"t_app_user_shop", |
| | | "targetName":"prototype" |
| | | } |
| | | } |
| | | }, |
| | | "schemaName":"qijisheng_account", |
| | | "shardingTables":{ |
| | | "t_user_point":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_account`.`t_user_point` (\n\t`id` bigint NOT NULL COMMENT '主键',\n\t`type` int DEFAULT NULL COMMENT '变动类型(1-消费,2-返佣,3-拉新,4-每日分享,5-每日签到,6-使用时长, 7-注册积分, 8-门店业绩,9-门店返佣,14-下级门店返佣,10-技师业绩,11-兑换商品,12-他人赠送,13-赠与他人)',\n\t`historical_point` decimal(10, 2) DEFAULT NULL COMMENT '历史余额',\n\t`variable_point` decimal(10, 2) DEFAULT NULL COMMENT '变动金额',\n\t`balance` decimal(10, 2) DEFAULT NULL COMMENT '变动后金额',\n\t`create_time` datetime DEFAULT NULL COMMENT '变动时间',\n\t`app_user_id` bigint DEFAULT NULL COMMENT '变动用户id',\n\t`object_id` bigint DEFAULT NULL COMMENT '关联对象id',\n\t`extention` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '拓展字段',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '用户积分流水'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 20", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_account/t_user_point_${tableIndex}", |
| | | "tableNum":"20", |
| | | "tableMethod":"MOD_HASH(app_user_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_user_coupon":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_account`.`t_user_coupon` (\n\t`id` bigint NOT NULL,\n\t`del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\n\t`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`use_time` datetime DEFAULT NULL COMMENT '使用时间',\n\t`coupon_id` int DEFAULT NULL COMMENT '优惠劵id',\n\t`start_time` datetime DEFAULT NULL COMMENT '开始时间',\n\t`end_time` datetime DEFAULT NULL COMMENT '结束时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '用户-优惠劵'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 20", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_account/t_user_coupon_${tableIndex}", |
| | | "tableNum":"20", |
| | | "tableMethod":"MOD_HASH(app_user_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_user_sign_record":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_account`.`t_user_sign_record` (\n\t`id` bigint NOT NULL,\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`sign_day` date DEFAULT NULL COMMENT '签到时间',\n\t`red_amount` decimal(10, 2) DEFAULT NULL COMMENT '红包金额',\n\t`point` decimal(10, 2) DEFAULT NULL COMMENT '积分',\n\t`del_flag` int DEFAULT '0' COMMENT '删除(0=否,1=是)',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '用户签到记录'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 20", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_account/t_user_sign_record_${tableIndex}", |
| | | "tableNum":"20", |
| | | "tableMethod":"MOD_HASH(app_user_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_withdrawal_requests":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_account`.`t_withdrawal_requests` (\n\t`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\n\t`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`withdrawal_amount` decimal(10, 2) DEFAULT NULL COMMENT '提现金额',\n\t`arrival_amount` decimal(10, 2) DEFAULT NULL COMMENT '到账金额',\n\t`service_charge` decimal(10, 2) DEFAULT NULL COMMENT '手续费',\n\t`withdrawal_method` int DEFAULT NULL COMMENT '1微信2银行卡',\n\t`account_holder` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '开户人',\n\t`bank_card_number` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '银行卡号',\n\t`audit_status` int DEFAULT NULL COMMENT '审核状态 1''待审核'',2''审核通过'',3''审核拒绝'' ',\n\t`status` int DEFAULT NULL COMMENT '状态(1=处理中,2=成功)',\n\t`arrival_time` datetime DEFAULT NULL COMMENT '到账时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT '提现申请'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 20", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_account/t_withdrawal_requests_${tableIndex}", |
| | | "tableNum":"20", |
| | | "tableMethod":"MOD_HASH(app_user_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_app_user_share":{ |
| | | "createTableSQL":"CREATE TABLE `t_app_user_share` (\r\n `id` bigint NOT NULL COMMENT '主键',\r\n `app_user_id` bigint DEFAULT NULL COMMENT '用户id',\r\n `create_time` datetime DEFAULT NULL COMMENT '分享时间',\r\n PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='用户每日首次分享记录' TBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 10", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_account/t_app_user_share_${tableIndex}", |
| | | "tableNum":"10", |
| | | "tableMethod":"MOD_HASH(app_user_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_user_click_log":{ |
| | | "createTableSQL":"CREATE TABLE `t_user_click_log` (\r\n `id` bigint NOT NULL COMMENT '主键',\r\n `del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\r\n `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\r\n `app_user_id` bigint DEFAULT NULL COMMENT '用户id',\r\n `vip_id` int DEFAULT NULL COMMENT '会员等级',\r\n PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='申请点击记录' TBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 40", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_account/t_user_click_log_${tableIndex}", |
| | | "tableNum":"40", |
| | | "tableMethod":"MOD_HASH(app_user_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_balance_payment":{ |
| | | "createTableSQL":"CREATE TABLE `t_balance_payment` (\r\n `id` bigint NOT NULL COMMENT '主键',\r\n `app_user_id` bigint DEFAULT NULL COMMENT '用户id',\r\n `money` decimal(10,2) DEFAULT NULL COMMENT '支付金额',\r\n `serial_number` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '微信支付流水号',\r\n `status` int DEFAULT '1' COMMENT '微信支付状态(1=待支付,2=已支付)',\r\n `payment_time` datetime DEFAULT NULL COMMENT '完成支付时间',\r\n `balance_change_record_id` bigint DEFAULT NULL COMMENT '余额变更记录id',\r\n `create_time` datetime DEFAULT NULL COMMENT '添加时间',\r\n PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='账户余额充值记录' TBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 50", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_account/t_balance_payment_${tableIndex}", |
| | | "tableNum":"50", |
| | | "tableMethod":"MOD_HASH(app_user_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_user_cancellation_log":{ |
| | | "createTableSQL":"CREATE TABLE `t_user_cancellation_log` (\r\n `id` bigint NOT NULL COMMENT '主键',\r\n `del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\r\n `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\r\n `app_user_id` bigint DEFAULT NULL COMMENT '用户id',\r\n `vip_id` int DEFAULT NULL COMMENT '会员等级',\r\n PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='注销记录' TBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 10", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_account/t_user_cancellation_log_${tableIndex}", |
| | | "tableNum":"10", |
| | | "tableMethod":"MOD_HASH(app_user_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_agent_application":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_account`.`t_agent_application` (\n\t`id` bigint NOT NULL,\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`application_vip_id` int DEFAULT NULL COMMENT '申请类型 对应vip_id',\n\t`application_time` datetime DEFAULT NULL COMMENT '申请时间',\n\t`status` int DEFAULT NULL COMMENT '1''待处理'',2''已处理-同意'',3''已处理-拒绝''',\n\t`shop_point` int DEFAULT NULL COMMENT '用户当前消费积分',\n\t`share_point` int DEFAULT NULL COMMENT '用户当前分佣积分',\n\t`direct_vip_num` int DEFAULT NULL COMMENT '直推用户已达钻石会员数',\n\t`direct_agent_num` int DEFAULT NULL COMMENT '直推用户已成为代理数',\n\t`bind_shop_num` int DEFAULT NULL COMMENT '已绑定门店数',\n\t`remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '处理意见',\n\t`del_flag` int DEFAULT '0' COMMENT '删除(0=否,1=是)',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '会员申请'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 20", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_account/t_agent_application_${tableIndex}", |
| | | "tableNum":"20", |
| | | "tableMethod":"MOD_HASH(app_user_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_balance_change_record":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_account`.`t_balance_change_record` (\n\t`id` bigint(20) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT,\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`order_id` bigint DEFAULT NULL COMMENT '订单id',\n\t`change_type` int DEFAULT NULL COMMENT '1充值2提现3红包4分佣5商城购物6取消订单退款',\n\t`before_amount` decimal(10, 2) DEFAULT NULL COMMENT '变更前金额',\n\t`change_amount` decimal(10, 2) DEFAULT NULL COMMENT '变更金额',\n\t`after_amount` decimal(10, 2) DEFAULT NULL COMMENT '变更后金额',\n\t`del_flag` int DEFAULT '0' COMMENT '删除(0=否,1=是)',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '用户余额变更记录'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 20", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_account/t_balance_change_record_${tableIndex}", |
| | | "tableNum":"20", |
| | | "tableMethod":"MOD_HASH(app_user_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_app_user_bank":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_account`.`t_app_user_bank` (\n\t`id` bigint NOT NULL,\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`bank_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '开户银行名称',\n\t`bank_number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '银行卡号',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '用户银行卡'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 10", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_account/t_app_user_bank_${tableIndex}", |
| | | "tableNum":"10", |
| | | "tableMethod":"MOD_HASH(app_user_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_app_user":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_account`.`t_app_user` (\n\t`id` bigint NOT NULL COMMENT '主键',\n\t`user_type` int DEFAULT '1' COMMENT '用户类型(1=普通用户,2=门店员工)',\n\t`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '用户',\n\t`phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '手机号',\n\t`avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '头像',\n\t`vip_id` int DEFAULT NULL COMMENT '会员id',\n\t`wx_openid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '微信openid',\n\t`ali_openid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '支付宝openid',\n\t`status` int DEFAULT '1' COMMENT '状态(1=正常,2=冻结,3=注销)',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\t`del_flag` tinyint(1) UNSIGNED ZEROFILL DEFAULT '0' COMMENT '删除(0=否,1=是)',\n\t`first_add` int DEFAULT NULL COMMENT '0否1是第一次添加',\n\t`last_login_time` datetime DEFAULT NULL COMMENT '最后一次登录时间',\n\t`top_invite_id` bigint DEFAULT NULL COMMENT '顶级推广人id',\n\t`invite_user_id` bigint DEFAULT NULL COMMENT '推广人id',\n\t`shop_id` int DEFAULT NULL COMMENT '绑定门店id',\n\t`part_point` int DEFAULT '0' COMMENT '合伙人积分数',\n\t`part_grow_point` int DEFAULT '0' COMMENT '合伙人培育积分数',\n\t`last_shop_time` datetime DEFAULT NULL COMMENT '最后消费时间',\n\t`shop_point` int DEFAULT '0' COMMENT '消费积分数',\n\t`share_point` int DEFAULT '0' COMMENT '返佣积分数',\n\t`shop_share_point` int DEFAULT '0' COMMENT '门店返佣积分',\n\t`shop_achievement_point` int DEFAULT '0' COMMENT '门店业绩积分',\n\t`lower_level_share_point` int DEFAULT '0' COMMENT '绑定下级门店分佣积分',\n\t`total_invite_point` int DEFAULT '0' COMMENT '拉新人积分总数',\n\t`total_register_point` int DEFAULT '0' COMMENT '注册积分总数',\n\t`total_performance_point` int DEFAULT '0' COMMENT '业绩积分总数',\n\t`total_share_point` int DEFAULT '0' COMMENT '每日分享积分',\n\t`total_sign_point` int DEFAULT '0' COMMENT '每日签到积分',\n\t`total_hour_point` int DEFAULT '0' COMMENT '使用时长积分',\n\t`lave_point` int DEFAULT '0' COMMENT '剩余积分',\n\t`available_point` int DEFAULT '0' COMMENT '可用积分',\n\t`transferable_point` int DEFAULT '0' COMMENT '可转增积分',\n\t`total_available_point` int DEFAULT '0' COMMENT '可用总积分数',\n\t`total_point` int DEFAULT '0' COMMENT '总积分',\n\t`shop_amount` decimal(10, 2) DEFAULT '0.00' COMMENT '消费总金额',\n\t`withdrawable_amount` decimal(10, 2) DEFAULT '0.00' COMMENT '可提现金额',\n\t`withdrawn_amount` decimal(10, 2) DEFAULT '0.00' COMMENT '已提现金额',\n\t`total_recharge_amount` decimal(10, 2) DEFAULT '0.00' COMMENT '充值总金额',\n\t`total_red_packet_amount` decimal(10, 2) DEFAULT '0.00' COMMENT '红包总金额',\n\t`total_distribution_amount` decimal(10, 2) DEFAULT '0.00' COMMENT '分销总金额',\n\t`shop_service_fee` decimal(10, 2) DEFAULT '0.00' COMMENT '门店服务费(门店核销获得)',\n\t`shop_commission` decimal(10, 2) DEFAULT '0.00' COMMENT '门店返佣金额(绑定用户消费后返佣)',\n\t`balance` decimal(10, 2) DEFAULT '0.00' COMMENT '账户余额',\n\t`change_promoter` int DEFAULT '0' COMMENT '是否可更换推广人(0=否,1=是)',\n\t`longitude` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '经度',\n\t`latitude` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '纬度',\n\t`province` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '省',\n\t`province_code` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '省编号',\n\t`city` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '市',\n\t`city_code` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '市编号',\n\t`district` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '区',\n\t`district_code` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '区编号',\n\t`qr_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '推广二维码',\n\t`is_danger` int DEFAULT '0' COMMENT '降级预警(0=否,1=是)',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT 'app用户'\nTBPARTITION BY MOD_HASH(phone) TBPARTITIONS 10", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_account/t_app_user_${tableIndex}", |
| | | "tableNum":"10", |
| | | "tableMethod":"MOD_HASH(phone)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_user_change_log":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_account`.`t_user_change_log` (\n\t`id` bigint NOT NULL COMMENT '主键',\n\t`del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\n\t`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`before_vip_id` int DEFAULT NULL COMMENT '变更前等级',\n\t`after_vip_id` int DEFAULT NULL COMMENT '变更后等级',\n\t`change_type` int DEFAULT NULL COMMENT '变更类型(1=升级,2=降级)',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT '会员等级变更记录'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 20", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_account/t_user_change_log_${tableIndex}", |
| | | "tableNum":"20", |
| | | "tableMethod":"MOD_HASH(app_user_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_user_address":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_account`.`t_user_address` (\n\t`id` bigint NOT NULL,\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`recieve_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '收件人姓名',\n\t`recieve_phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '收件人电话',\n\t`del_flag` int DEFAULT '0' COMMENT '删除(0=否,1=是)',\n\t`province` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '省',\n\t`province_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '省编号',\n\t`city` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '市',\n\t`city_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '市编号',\n\t`district` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '区',\n\t`district_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '区编号',\n\t`recieve_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '收件人地址',\n\t`is_default` int DEFAULT NULL COMMENT '是否默认1是0否',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '用户地址'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 20", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_account/t_user_address_${tableIndex}", |
| | | "tableNum":"20", |
| | | "tableMethod":"MOD_HASH(app_user_id)", |
| | | "storeNum":0 |
| | | } |
| | | }, |
| | | "shardingIndexTables":{} |
| | | } |
| | | }, |
| | | "views":{} |
| | | } |
New file |
| | |
| | | { |
| | | "customTables":{}, |
| | | "globalTables":{}, |
| | | "normalProcedures":{}, |
| | | "normalTables":{}, |
| | | "schemaName":"qijisheng_order", |
| | | "shardingTables":{ |
| | | "t_order_balance_payment":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_order`.`t_order_balance_payment` (\n\t`id` bigint NOT NULL COMMENT '主键',\n\t`order_id` bigint DEFAULT NULL COMMENT '订单金额',\n\t`red_packet_amount` decimal(10, 2) DEFAULT NULL COMMENT '红包支付金额',\n\t`distribution_amount` decimal(10, 2) DEFAULT NULL COMMENT '分销金额支付金额',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '余额支付订单明细'\nTBPARTITION BY MOD_HASH(order_id) TBPARTITIONS 50", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_order/t_order_balance_payment_${tableIndex}", |
| | | "tableNum":"50", |
| | | "tableMethod":"MOD_HASH(order_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_order_good":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_order`.`t_order_good` (\n\t`id` bigint NOT NULL AUTO_INCREMENT,\n\t`goods_id` int DEFAULT NULL COMMENT '商品id',\n\t`order_id` bigint DEFAULT NULL COMMENT '订单id',\n\t`good_amount` decimal(10, 2) DEFAULT NULL COMMENT '商品券抵扣金额',\n\t`seckill_json` text COLLATE utf8mb4_bin COMMENT '秒杀活动的json快照',\n\t`good_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '购买商品的json快照',\n\t`num` int DEFAULT NULL COMMENT '数量',\n\t`del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\n\t`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\n\t`earn_spending_points` int DEFAULT '0' COMMENT '可获得消费积分',\n\t`superior_subcommission` decimal(10, 2) DEFAULT '0.00' COMMENT '上级获得分佣金额',\n\t`superior_rebate_points` int DEFAULT '0' COMMENT '上级获得返佣积分',\n\t`superior_type` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '获取返佣积分上级类型(1=直推上级,2=直帮上级)',\n\t`superior_price_type` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '获取分佣金额上级类型(1=直推上级,2=直帮上级)',\n\t`servuce_shop_charges` decimal(10, 2) DEFAULT '0.00' COMMENT '核销门店可获得服务费',\n\t`servuce_shop_points` int DEFAULT '0' COMMENT '核销门店可获得服务积分',\n\t`technician_points` int DEFAULT '0' COMMENT '技师可获得服务积分',\n\t`bound_shop_charges` decimal(10, 2) DEFAULT '0.00' COMMENT '绑定门店可获得分佣金额',\n\t`bound_shop_points` int DEFAULT NULL COMMENT '绑定门店可获得返佣积分',\n\t`bound_shop_superiors_charges` decimal(10, 2) DEFAULT '0.00' COMMENT '绑定门店上级门店可获得分佣金额',\n\t`bound_shop_superiors_points` int DEFAULT '0' COMMENT '绑定门店上级门店可获得返佣积分',\n\t`type` int DEFAULT NULL COMMENT '购买类型(1=普通商品,2=秒杀商品)',\n\t`cash_payment` int DEFAULT NULL COMMENT '现金支付(0=否,1=是)',\n\t`point_payment` int DEFAULT NULL COMMENT '积分支付(0=否,1=是)',\n\t`selling_price` decimal(10, 2) DEFAULT NULL COMMENT '基础售价',\n\t`integral` int DEFAULT NULL COMMENT '基础积分',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 1062097391416512589 CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '订单表—关联商品信息'\nTBPARTITION BY MOD_HASH(order_id) TBPARTITIONS 50", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_order/t_order_good_${tableIndex}", |
| | | "tableNum":"50", |
| | | "tableMethod":"MOD_HASH(order_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_refund_pass":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_order`.`t_refund_pass` (\n\t`id` bigint NOT NULL,\n\t`order_id` bigint DEFAULT NULL COMMENT '订单id',\n\t`status` int DEFAULT NULL COMMENT '1待审核2已完成3已拒绝4待退货5待平台收货',\n\t`refund_method` int DEFAULT NULL COMMENT '1退货退款2仅退款',\n\t`refund_reason` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '用户申请原因',\n\t`user_remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '用户申请备注',\n\t`pics` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '申请图片',\n\t`pass_status` int DEFAULT NULL COMMENT '1待审核2同意3拒绝',\n\t`pass_remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '后台审核备注',\n\t`auth_time` datetime DEFAULT NULL COMMENT '审核时间',\n\t`del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\n\t`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\n\t`name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '收货人姓名',\n\t`phone` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '收货人电话',\n\t`address` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '收货地址',\n\t`code` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '快递单号',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '售后管理'\nTBPARTITION BY MOD_HASH(order_id) TBPARTITIONS 20", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_order/t_refund_pass_${tableIndex}", |
| | | "tableNum":"20", |
| | | "tableMethod":"MOD_HASH(order_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_shopping_cart":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_order`.`t_shopping_cart` (\n\t`id` bigint NOT NULL COMMENT '主键',\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`goods_id` int DEFAULT NULL COMMENT '商品id',\n\t`number` int DEFAULT '1' COMMENT '数量',\n\t`type` int DEFAULT NULL COMMENT '购买类型(1=普通商品,2=秒杀商品)',\n\t`status` int DEFAULT NULL COMMENT '状态(0=临时数据,1=购物车数据)',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '购物车'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 50", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_order/t_shopping_cart_${tableIndex}", |
| | | "tableNum":"50", |
| | | "tableMethod":"MOD_HASH(app_user_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_order":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_order`.`t_order` (\n\t`id` bigint NOT NULL,\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`num` int NOT NULL COMMENT '商品数量',\n\t`good_pics` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '商品封面(多张逗号隔开,最多三张))',\n\t`good_name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '商品名称(多个名称逗号隔开))',\n\t`order_type` int DEFAULT NULL COMMENT '订单类型1服务单2商品',\n\t`order_status` int DEFAULT NULL COMMENT '1待发货2待收货3待使用4已完成5已取消6已退款7售后中8已评价',\n\t`old_order_status` int DEFAULT NULL COMMENT '1待发货2待收货3待使用4已完成5已取消6已退款7售后中8已评价',\n\t`is_commission` tinyint(1) DEFAULT '0' COMMENT '是否已分佣 0-否 1-是',\n\t`end_time` datetime DEFAULT NULL COMMENT '核销时间',\n\t`canceller_app_user_id` bigint DEFAULT NULL COMMENT '核销人id',\n\t`after_sale_time` datetime DEFAULT NULL COMMENT '售后截止日期',\n\t`technician_id` int DEFAULT NULL COMMENT '技师id',\n\t`order_number` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '订单编号',\n\t`total_amount` decimal(10, 2) DEFAULT NULL COMMENT '订单总金额',\n\t`full_reduction_amount` decimal(10, 2) DEFAULT NULL COMMENT '满减金额',\n\t`money_amount` decimal(10, 2) DEFAULT NULL COMMENT '代金券抵扣金额',\n\t`discount_amount` decimal(10, 2) DEFAULT NULL COMMENT '折扣券抵扣金额',\n\t`good_amount` decimal(10, 2) DEFAULT NULL COMMENT '商品券抵扣总金额',\n\t`user_coupon_id` bigint DEFAULT NULL COMMENT '用户优惠券id',\n\t`activity_amount` decimal(10, 2) DEFAULT NULL COMMENT '活动优惠金额',\n\t`discount_total_amount` decimal(10, 2) DEFAULT NULL COMMENT '优惠总金额',\n\t`payment_amount` decimal(10, 2) DEFAULT NULL COMMENT '实际支付价格',\n\t`point` int DEFAULT NULL COMMENT '使用积分',\n\t`pay_method` int DEFAULT NULL COMMENT '1微信,2账户余额,3积分',\n\t`coupon_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '使用的优惠劵json',\n\t`activity_json` text COLLATE utf8mb4_bin COMMENT '订单优惠活动的json快照',\n\t`express_amount` decimal(10, 2) DEFAULT NULL COMMENT '运费',\n\t`express_pay_method` int DEFAULT NULL COMMENT '运费支付方式,1微信,2账户余额',\n\t`express_json` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT 'NULL' COMMENT '第三方快递信息',\n\t`express_result` text COLLATE utf8mb4_bin COMMENT '第三方快递结果',\n\t`deliver_province` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '发货省名称',\n\t`deliver_province_code` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '发货省编号',\n\t`deliver_city` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '发货市名称',\n\t`deliver_city_code` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '发货市编号',\n\t`deliver_district` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '发货区名称',\n\t`deliver_district_code` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '发货区编号',\n\t`share_amount` decimal(10, 2) DEFAULT NULL COMMENT '平台分佣',\n\t`get_point` int DEFAULT NULL COMMENT '本单获取的积分',\n\t`serial_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '微信支付号',\n\t`pay_status` int DEFAULT NULL COMMENT '1待支付2已支付',\n\t`shop_id` int DEFAULT NULL COMMENT '对应门店id',\n\t`del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\n\t`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\n\t`address_json` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '地址json',\n\t`expected_delivery_time` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '预计提货时间',\n\t`refund_status` int DEFAULT NULL COMMENT '退款状态(1=退款中,2=已退款)',\n\t`refund_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '退款流水号',\n\t`refund_time` datetime DEFAULT NULL COMMENT '退款时间',\n\tPRIMARY KEY USING BTREE (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '订单表'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 50", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_order/t_order_${tableIndex}", |
| | | "tableNum":"50", |
| | | "tableMethod":"MOD_HASH(app_user_id)", |
| | | "storeNum":0 |
| | | } |
| | | }, |
| | | "shardingIndexTables":{} |
| | | } |
| | | }, |
| | | "views":{} |
| | | } |
New file |
| | |
| | | { |
| | | "customTables":{}, |
| | | "globalTables":{}, |
| | | "normalProcedures":{}, |
| | | "normalTables":{ |
| | | "t_share":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_share` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '标题',\n\t`image_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '图片地址',\n\t`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '分享内容',\n\t`audit_status` int DEFAULT '0' COMMENT '审核状态(0=待审核,1=审核通过,2=审核失败)',\n\t`audit_user_id` int DEFAULT NULL COMMENT '审核人id',\n\t`audit_time` datetime DEFAULT NULL COMMENT '审核时间',\n\t`audit_msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '审核结果',\n\t`applet_share` int DEFAULT '0' COMMENT '小程序分享(0=否,1=是)',\n\t`del_flag` int DEFAULT '0' COMMENT '删除状态(0=否,1=是)',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\t`add_type` int DEFAULT NULL COMMENT '添加类型(1=平台添加,2=推广人添加,3=门店添加)',\n\t`object_id` bigint DEFAULT NULL COMMENT '对象id',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '分享'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_other", |
| | | "tableName":"t_share", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "t_goods_category":{ |
| | | "createTableSQL":"CREATE TABLE `t_goods_category` (\r\n `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\r\n `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '名称',\r\n `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'icon图片地址',\r\n `del_flag` int DEFAULT '0' COMMENT '删除(0=否,1=是)',\r\n `create_time` datetime DEFAULT NULL COMMENT '添加时间',\r\n PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='商品分类'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_other", |
| | | "tableName":"t_goods_category", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "t_goods_bargain_price_detail":{ |
| | | "createTableSQL":"CREATE TABLE `t_goods_bargain_price_detail` (\r\n `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\r\n `goods_bargain_price_id` int DEFAULT NULL COMMENT '门店特价申请数据id',\r\n `vip` int DEFAULT NULL COMMENT '会员级别(1=普通会员,2=黄金会员,3=钻石会员,4=准代理,5=代理,6=总代,7=合伙人)',\r\n `selling_price` decimal(10,2) DEFAULT NULL COMMENT '基础售价',\r\n `integral` int DEFAULT NULL COMMENT '基础积分',\r\n PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='门店特价申请明细数据'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_other", |
| | | "tableName":"t_goods_bargain_price_detail", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "t_red_packege_set":{ |
| | | "createTableSQL":"CREATE TABLE `t_red_packege_set` (\r\n `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\r\n `del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\r\n `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\r\n `start_time` datetime DEFAULT NULL COMMENT '开始时间',\r\n `end_time` datetime DEFAULT NULL COMMENT '结束时间',\r\n `packege_amount` decimal(10,2) DEFAULT NULL COMMENT '红包金额',\r\n PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='红包活动设置'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_other", |
| | | "tableName":"t_red_packege_set", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "t_shop":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_shop` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '门店名称',\n\t`pid` int DEFAULT '0' COMMENT '上级门店id',\n\t`business_date` int DEFAULT NULL COMMENT '营业星期:1-周一到周日 2-周一周五 3-仅周末',\n\t`start_time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '开始时间(HH:mm)',\n\t`end_time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '结束时间(HH:mm)',\n\t`home_picture` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '封面图',\n\t`shop_manager` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '店长姓名',\n\t`details_picture` text COLLATE utf8mb4_bin COMMENT '详情图,多个逗号分隔',\n\t`phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '电话',\n\t`app_user_id` bigint DEFAULT NULL COMMENT '店长用户id',\n\t`service_tel` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '客户电话(同步到t_phone表)',\n\t`certification` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '资质证书图片',\n\t`longitude` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '经度',\n\t`latitude` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '纬度',\n\t`address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '详细地址',\n\t`status` int DEFAULT '1' COMMENT '状态(1=正常,2=冻结)',\n\t`shop_all_point` int DEFAULT '0' COMMENT '门店积分总数',\n\t`lower_level_share_point` int DEFAULT '0' COMMENT '绑定下级门店分佣积分',\n\t`share_point` int DEFAULT '0' COMMENT '门店返佣积分',\n\t`server_point` int DEFAULT '0' COMMENT '门店服务积分',\n\t`use_point` int DEFAULT '0' COMMENT '门店已用积分',\n\t`lave_point` int DEFAULT '0' COMMENT '门店剩余积分',\n\t`giveaway_all_money` decimal(10, 2) DEFAULT '0.00' COMMENT '门店分佣总金额',\n\t`giveaway_money` decimal(10, 2) DEFAULT '0.00' COMMENT '门店分佣金额',\n\t`lower_level_giveaway_money` decimal(10, 2) DEFAULT '0.00' COMMENT '绑定下级门店分佣金额',\n\t`server_giveaway_money` decimal(10, 2) DEFAULT '0.00' COMMENT '门店服务分佣金额',\n\t`can_withdraw_money` decimal(10, 2) DEFAULT '0.00' COMMENT '可提现金额',\n\t`withdraw_money` decimal(10, 2) DEFAULT '0.00' COMMENT '已提现金额',\n\t`balance` decimal(10, 2) DEFAULT '0.00' COMMENT '余额',\n\t`order_number` int DEFAULT '0' COMMENT '门店订单总数',\n\t`server_order_number` int DEFAULT '0' COMMENT '门店服务订单数',\n\t`custom_order_number` int DEFAULT '0' COMMENT '单品自提订单数',\n\t`score` decimal(10, 2) DEFAULT '0.00' COMMENT '总评分',\n\t`score_number` int DEFAULT '0' COMMENT '评分数量',\n\t`del_flag` int DEFAULT '0' COMMENT '删除(0=否,1=是)',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\t`tradeMerchantNo` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '报备商户号',\n\t`receiverAccountNoEnc` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '收款银行卡号',\n\t`receiverNameEnc` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '收款银行卡持卡人名称',\n\t`receiverAccountType` int DEFAULT NULL COMMENT '账户类型(对私账户201,对公账户204)',\n\t`receiverBankChannelNo` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '收款账户联行号',\n\t`province` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '省',\n\t`province_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '省编号',\n\t`city` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '市',\n\t`city_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '市编号',\n\t`district` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '区',\n\t`district_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '区编号',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 27 CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '门店'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_other", |
| | | "tableName":"t_shop", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "t_technician":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_technician` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`shop_id` int DEFAULT NULL COMMENT '门店id',\n\t`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '技师姓名',\n\t`phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '电话',\n\t`introduction` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '简介',\n\t`home_picture` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '技师封面图',\n\t`info_picture` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '技师详情图',\n\t`status` int DEFAULT '1' COMMENT '状态(1=下架,2=上架)',\n\t`subscribe_status` int DEFAULT NULL COMMENT '预约状态(1=可预约,2=不可预约)',\n\t`del_flag` int DEFAULT '0' COMMENT '删除(0=否,1=是)',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '技师'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_other", |
| | | "tableName":"t_technician", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "t_goods":{ |
| | | "createTableSQL":"CREATE TABLE `t_goods` (\r\n `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\r\n `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '名称',\r\n `goods_category_id` int DEFAULT NULL COMMENT '分类id',\r\n `type` int DEFAULT NULL COMMENT '类型(1=服务商品,2=单品商品)',\r\n `purchase_limit` int DEFAULT NULL COMMENT '限购数量(-1不限购)',\r\n `distribution_mode` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '配送方式(1=自提,2=快递,1,2 = 自提+快递)',\r\n `appoint_store` int DEFAULT '2' COMMENT '指定门店(1=指定,2=所有)',\r\n `introduction` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '商品简介',\r\n `home_page_picture` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '封面图',\r\n `detail_picture` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '详情图,多个逗号分隔',\r\n `detail` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '商品详情',\r\n `operating_cost` decimal(10,2) DEFAULT NULL COMMENT '运营成本',\r\n `shop_cost` decimal(10,2) DEFAULT NULL COMMENT '门店成本',\r\n `original_price` decimal(10,2) DEFAULT NULL COMMENT '划线价',\r\n `cash_payment` int DEFAULT NULL COMMENT '现金支付(0=否,1=是)',\r\n `point_payment` int DEFAULT NULL COMMENT '积分支付(0=否,1=是)',\r\n `selling_price` decimal(10,2) DEFAULT NULL COMMENT '基础售价',\r\n `integral` int DEFAULT NULL COMMENT '基础积分',\r\n `commodity_authority` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '商品权限JSON(-1=全部,0=游客,1=普通会员,2=黄金会员,3=钻石会员,4=准代理,5=代理,6=总代,7=合伙人)',\r\n `del_flag` int DEFAULT '0' COMMENT '删除(0=否,1=是)',\r\n `create_time` datetime DEFAULT NULL COMMENT '添加时间',\r\n `status` int DEFAULT NULL COMMENT '状态(1=下架,2=上架)',\r\n `sale_num` int DEFAULT NULL COMMENT '销量',\r\n `sort` int DEFAULT NULL COMMENT '排序',\r\n PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='商品'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_other", |
| | | "tableName":"t_goods", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "t_system_config":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_system_config` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`type` int DEFAULT NULL COMMENT '类型(1=启动页管理,2=首页配置,3=订单包邮设置,4=合伙人积分设置会员说明设置)',\n\t`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '配置内容json',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '系统配置'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_other", |
| | | "tableName":"t_system_config", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "t_phone":{ |
| | | "createTableSQL":"CREATE TABLE `t_phone` (\r\n `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\r\n `type` int DEFAULT NULL COMMENT '类型(1=平台,2=门店)',\r\n `shop_id` int DEFAULT NULL COMMENT '门店id',\r\n `phone_one` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '联系电话1',\r\n `phone_two` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '联系电话2',\r\n PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='客服电话'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_other", |
| | | "tableName":"t_phone", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "t_receiver_bank_channel":{ |
| | | "createTableSQL":"CREATE TABLE `t_receiver_bank_channel` (\r\n `id` bigint DEFAULT NULL,\r\n `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,\r\n `short` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='银行数据'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_other", |
| | | "tableName":"t_receiver_bank_channel", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "t_banner":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_banner` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`position` int DEFAULT NULL COMMENT '位置(1=首页,2=商城首页)',\n\t`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '名称',\n\t`jump_type` int DEFAULT NULL COMMENT '跳转类型(1=无跳转,2=外部链接,3=商品详情,4=秒杀商品详情,5=领券中心)',\n\t`content_type` int DEFAULT NULL,\n\t`content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '跳转内容',\n\t`image_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '图片地址',\n\t`video_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '视频地址',\n\t`del_flag` int DEFAULT '0' COMMENT '删除标识(0=否,1=是)',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT 'banner'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_other", |
| | | "tableName":"t_banner", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "t_coupon_info":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_coupon_info` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\n\t`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\n\t`coupon_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '优惠券名称',\n\t`coupon_type` int DEFAULT NULL COMMENT '优惠券类型 1''满减券'',2''代金券'',3''折扣券'',4''商品券''',\n\t`condition_amount` decimal(10, 2) DEFAULT NULL COMMENT '满x元',\n\t`discount_amount` decimal(10, 2) DEFAULT NULL COMMENT '减x元',\n\t`money_amount` decimal(10, 2) DEFAULT NULL COMMENT '代金x元',\n\t`discount` decimal(10, 2) DEFAULT NULL COMMENT '折扣',\n\t`for_good_ids` text COMMENT '适用商品ids,全部-1',\n\t`send_num` int DEFAULT NULL COMMENT '发放数量',\n\t`max_num` int DEFAULT NULL COMMENT '可领数量',\n\t`period_type` int DEFAULT NULL COMMENT '有效期类型 1指定时间内有效 2领取后x天有效',\n\t`period_start_time` datetime DEFAULT NULL COMMENT '有效期开始时间',\n\t`period_end_time` datetime DEFAULT NULL COMMENT '有效期结束时间',\n\t`period_days` int DEFAULT NULL COMMENT '领取后x天有效',\n\t`send_start_time` datetime DEFAULT NULL COMMENT '开始发放时间',\n\t`send_end_time` datetime DEFAULT NULL COMMENT '结束发放时间',\n\t`send_type` int DEFAULT NULL COMMENT '1免费发放2积分兑换',\n\t`need_point` decimal(10, 2) DEFAULT NULL COMMENT '兑换所需积分',\n\t`person_type` int DEFAULT NULL COMMENT '可领用户 1全部 2指定人员 3指定会员 4 新人注册',\n\t`person_ids` text COMMENT '可领取对应的ids,用find_in_set查询',\n\t`shelf_status` int DEFAULT NULL COMMENT '上架状态:0-下架 1-上架',\n\t`vip_ids` varchar(255) DEFAULT NULL COMMENT '指定会员等级,逗号隔开',\n\t`goods_name_json` varchar(255) DEFAULT NULL,\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 63 CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT '优惠劵'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_other", |
| | | "tableName":"t_coupon_info", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "t_goods_vip":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_goods_vip` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`goods_id` int DEFAULT NULL COMMENT '商品id',\n\t`vip` int DEFAULT NULL COMMENT '会员级别(1=普通会员,2=黄金会员,3=钻石会员,4=准代理,5=代理,6=总代,7=合伙人)',\n\t`cash_payment` int DEFAULT NULL COMMENT '现金支付(0=否,1=是)',\n\t`point_payment` int DEFAULT NULL COMMENT '积分支付(0=否,1=是)',\n\t`selling_price` decimal(10, 2) DEFAULT NULL COMMENT '基础售价',\n\t`integral` int DEFAULT NULL COMMENT '基础积分',\n\t`earn_spending_points` int DEFAULT NULL COMMENT '可获得消费积分',\n\t`superior_subcommission` decimal(10, 2) DEFAULT NULL COMMENT '上级获得分佣金额',\n\t`superior_rebate_points` int DEFAULT NULL COMMENT '上级获得返佣积分',\n\t`superior_type` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '获取返佣积分上级类型(1=直推上级,2=直帮上级)',\n\t`superior_price_type` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '获取分佣金额上级类型(1=直推上级,2=直帮上级)',\n\t`servuce_shop_charges` decimal(10, 2) DEFAULT NULL COMMENT '核销门店可获得服务费',\n\t`servuce_shop_points` int DEFAULT NULL COMMENT '核销门店可获得服务积分',\n\t`technician_points` int DEFAULT NULL COMMENT '技师可获得服务积分',\n\t`bound_shop_charges` decimal(10, 2) DEFAULT NULL COMMENT '绑定门店可获得分佣金额',\n\t`bound_shop_points` int DEFAULT NULL COMMENT '绑定门店可获得返佣积分',\n\t`bound_shop_superiors_charges` decimal(10, 2) DEFAULT NULL COMMENT '绑定门店上级门店可获得分佣金额',\n\t`bound_shop_superiors_points` int DEFAULT NULL COMMENT '绑定门店上级门店可获得返佣积分',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '商品会员配置'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_other", |
| | | "tableName":"t_goods_vip", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "t_seckill_activity_info":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_seckill_activity_info` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\n\t`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\n\t`good_id` int DEFAULT NULL COMMENT '商品id',\n\t`max_num` int DEFAULT NULL COMMENT '限购数量',\n\t`vip_ids` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '适用会员类型“,”分隔',\n\t`start_time` datetime DEFAULT NULL COMMENT '活动开始日期',\n\t`end_time` datetime DEFAULT NULL COMMENT '活动结束日期',\n\t`is_shelves` int DEFAULT '1' COMMENT '是否上架:0否 1是',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT '商品秒杀活动'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_other", |
| | | "tableName":"t_seckill_activity_info", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "t_goods_seckill":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_goods_seckill` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`seckill_activity_info_id` int DEFAULT NULL COMMENT '秒杀活动主表',\n\t`vip` int DEFAULT NULL COMMENT '会员级别(0=游客,1=普通会员,2=黄金会员,3=钻石会员,4=准代理,5=代理,6=总代,7=合伙人)',\n\t`cash_payment` int DEFAULT '0' COMMENT '现金支付(0=否,1=是)',\n\t`point_payment` int DEFAULT '0' COMMENT '积分支付(0=否,1=是)',\n\t`selling_price` decimal(10, 2) DEFAULT NULL COMMENT '基础售价',\n\t`integral` int DEFAULT NULL COMMENT '基础积分',\n\t`earn_spending_points` int DEFAULT NULL COMMENT '可获得消费积分',\n\t`superior_subcommission` decimal(10, 2) DEFAULT NULL COMMENT '上级获得分佣金额',\n\t`superior_rebate_points` int DEFAULT NULL COMMENT '上级获得返佣积分',\n\t`superior_type` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '获取返佣积分上级类型(1=直推上级,2=直帮上级)',\n\t`superior_price_type` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '获取分佣金额上级类型(1=直推上级,2=直帮上级)',\n\t`servuce_shop_charges` decimal(10, 2) DEFAULT NULL COMMENT '核销门店可获得服务费',\n\t`servuce_shop_points` int DEFAULT NULL COMMENT '核销门店可获得服务积分',\n\t`technician_points` int DEFAULT NULL COMMENT '技师可获得服务积分',\n\t`bound_shop_charges` decimal(10, 2) DEFAULT NULL COMMENT '绑定门店可获得分佣金额',\n\t`bound_shop_points` int DEFAULT NULL COMMENT '绑定门店可获得返佣积分',\n\t`bound_shop_superiors_charges` decimal(10, 2) DEFAULT NULL COMMENT '绑定门店上级门店可获得分佣金额',\n\t`bound_shop_superiors_points` int DEFAULT NULL COMMENT '绑定门店上级门店可获得返佣积分',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 127 CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '秒杀活动会员配置'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_other", |
| | | "tableName":"t_goods_seckill", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "t_goods_bargain_price":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_goods_bargain_price` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`goods_id` int DEFAULT NULL COMMENT '商品id',\n\t`shop_id` int DEFAULT NULL COMMENT '门店id',\n\t`audit_status` int DEFAULT '0' COMMENT '审核状态(0=待审核,1=审核通过,2=审核失败)',\n\t`audit_user_id` bigint DEFAULT NULL COMMENT '审核人id',\n\t`audit_time` datetime DEFAULT NULL COMMENT '审核时间',\n\t`audit_msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '审核结果',\n\t`del_flag` int DEFAULT NULL COMMENT '删除(0=否,1=是)',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\t`create_user_id` int DEFAULT NULL COMMENT '添加用户id',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '门店特价申请数据'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_other", |
| | | "tableName":"t_goods_bargain_price", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "t_agreement":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_agreement` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`type` int DEFAULT NULL COMMENT '类型(1=用户协议,2=隐私协议,3=技师上门免责声明,4=注销协议,5门店提现免责声明)',\n\t`content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '内容',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '协议'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_other", |
| | | "tableName":"t_agreement", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "t_recharge_set":{ |
| | | "createTableSQL":"CREATE TABLE `t_recharge_set` (\r\n `id` int NOT NULL,\r\n `recharge_amount` decimal(10,2) DEFAULT NULL COMMENT '充值金额',\r\n PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='充值管理'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_other", |
| | | "tableName":"t_recharge_set", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "t_point_setting":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_point_setting` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '1-7对应会员等级',\n\t`del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\n\t`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\n\t`new_point` int DEFAULT NULL COMMENT '拉新人积分',\n\t`every_share_point` int DEFAULT NULL COMMENT '每日分享积分',\n\t`sign_point` int DEFAULT NULL COMMENT '每日签到积分',\n\t`hour_point` int DEFAULT NULL COMMENT '使用一小时积分',\n\t`regis_point` int DEFAULT NULL COMMENT '注册积分',\n\t`buy_point` decimal(10, 2) DEFAULT NULL COMMENT '消费积分可用百分比',\n\t`buy_point_open` int DEFAULT '0' COMMENT '消费积分积分 1开0关',\n\t`buy_point_gift` int DEFAULT '0' COMMENT '消费积分转赠送 1开0关',\n\t`share_point` decimal(10, 2) DEFAULT NULL COMMENT '返佣积分可用百分比',\n\t`share_point_open` int DEFAULT '0' COMMENT '返佣积分 1开0关',\n\t`share_point_gift` int DEFAULT '0' COMMENT '返佣积分转赠送 1开0关',\n\t`shop_share_point` decimal(10, 2) DEFAULT NULL COMMENT '门店返佣积分可用百分比',\n\t`shop_share_point_open` int DEFAULT '0' COMMENT '门店返佣积分 1开0关',\n\t`shop_share_point_gift` int DEFAULT '0' COMMENT '门店返佣积分赠送 1开0关',\n\t`shop_point` decimal(10, 2) DEFAULT NULL COMMENT '门店业绩积分可用百分比',\n\t`shop_point_open` int DEFAULT '0' COMMENT '门店业绩积分 1开0关',\n\t`shop_point_gift` int DEFAULT '0' COMMENT '门店业绩积分转赠送 1开0关',\n\t`person_point` decimal(10, 2) DEFAULT NULL COMMENT '技师业绩积分可用百分比',\n\t`person_point_open` int DEFAULT '0' COMMENT '技师业绩积分 1开0关',\n\t`person_point_gift` int DEFAULT '0' COMMENT '技师积分转赠送 1开0关',\n\t`get_new_point` decimal(10, 2) DEFAULT NULL COMMENT '拉新人积分可用百分比',\n\t`get_new_point_open` int DEFAULT '0' COMMENT '拉新人积分 1开0关',\n\t`get_new_point_gift` int DEFAULT '0' COMMENT '拉新人积分转赠送 1开0关',\n\t`get_regis_point` decimal(10, 2) DEFAULT NULL COMMENT '注册积分可用百分比',\n\t`get_regis_point_open` int DEFAULT '0' COMMENT '注册积分 1开0关',\n\t`get_regis_point_gift` int DEFAULT '0' COMMENT '注册积分转赠送 1开0关',\n\t`work_point` decimal(10, 2) DEFAULT NULL COMMENT '做工积分可用百分比',\n\t`work_point_open` int DEFAULT '0' COMMENT '做工积分 1开0关',\n\t`work_point_gift` int DEFAULT '0' COMMENT '做工积分转赠送 1开0关',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 64 CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '积分管理-积分设置'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_other", |
| | | "tableName":"t_point_setting", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "t_vip_setting":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_vip_setting` (\n\t`id` int NOT NULL COMMENT '1-7对应会员',\n\t`vip_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '会员名称',\n\t`vip_info` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '会员专属权益',\n\t`vip_cancel_day` int DEFAULT NULL COMMENT '1级会员专用 自动解绑推广人天数: 达到设置天数未成为黄金会员自动解绑推广人',\n\t`vip_change_day` int DEFAULT NULL COMMENT '1级会员专用 可更换绑定人天数:用户在达到设置的天数未下单商品,可以更换绑定人',\n\t`vip_withdrawal_role` int DEFAULT '0' COMMENT '钱包提现权限1开0关',\n\t`vip_withdrawal_min_amount` decimal(10, 2) DEFAULT NULL COMMENT '最低提现门槛',\n\t`vip_withdrawal_fee` decimal(10, 2) DEFAULT NULL COMMENT '提现手续费',\n\t`vip_gift_role` int DEFAULT '0' COMMENT '积分转赠权限 1开0关',\n\t`vip_level_up_shop` decimal(10, 2) DEFAULT NULL COMMENT '达成会员等级所需消费积分数量',\n\t`vip_level_up_shop_role` int DEFAULT '0' COMMENT '通过消费积分达成会员等级的开关 1开0关',\n\t`vip_level_up_share` int DEFAULT NULL COMMENT '达成会员等级所需的返佣积分数量',\n\t`vip_level_up_share_role` int DEFAULT '0' COMMENT '通过返佣积分达成会员等级的开关 1开0关',\n\t`vip_agent_level_up_role` int DEFAULT '0' COMMENT '创业者:消费并且返佣升级 1开0关',\n\t`vip_direct_num` int DEFAULT NULL COMMENT '达成会员等级所需的直推人数(包括钻石和代理)',\n\t`vip_team_num` int DEFAULT NULL COMMENT '达成会员等级所需的团队数量',\n\t`vip_level_up_num_role` int DEFAULT NULL COMMENT '通过直推用户或团队数量的方式达成会员等级的开关 1开0关',\n\t`vip_direct_vip_num` int DEFAULT NULL COMMENT '达成会员等级所需准代理数(达成总代和合伙人用到)',\n\t`vip_team_vip_num` int DEFAULT NULL COMMENT '达成会员等级所需总代数量(达成合伙人用到)',\n\t`vip_open_shop_num` int DEFAULT NULL COMMENT '达成会员等级所需开店数量',\n\t`vip_direct_vip_role` int DEFAULT '0' COMMENT '创业者:直推钻石会员开关 1开0关',\n\t`keep_buy_day` int DEFAULT NULL COMMENT '消费积分保级周期(天)',\n\t`keep_buy_point` int DEFAULT NULL COMMENT '消费积分保级的积分阈值(分)',\n\t`keep_share_day` int DEFAULT NULL COMMENT '返佣积分保级的周期(天)',\n\t`keep_share_point` int DEFAULT NULL COMMENT '返佣积分保级的积分阈值(分)',\n\t`keep_shop_day` int DEFAULT NULL COMMENT '门店业绩积分保级的周期(天)',\n\t`keep_shop_point` int DEFAULT NULL COMMENT '门店业绩积分保级的积分阈值(分)',\n\t`vip_level_up_proxy_role` int DEFAULT '0' COMMENT '会员等级是否必须达到代理: 0-否 1-是',\n\t`good_ids` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '指定购买商品升级ids',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '会员权益'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_other", |
| | | "tableName":"t_vip_setting", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "t_base_setting":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_base_setting` (\n\t`id` int NOT NULL COMMENT '1:合伙人积分设置一,2:合伙人积分设置二,3:会员说明设置,4:活动管理-活动设置 1开0,5:售后设置',\n\t`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '内容',\n\t`withdraw` int DEFAULT NULL,\n\t`withdrawalMinAmount` decimal(10, 2) DEFAULT NULL,\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '基础设置'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_other", |
| | | "tableName":"t_base_setting", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "t_order_activity_info":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_order_activity_info` (\n\t`id` bigint NOT NULL COMMENT '主键',\n\t`del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\n\t`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\n\t`activity_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '活动名称',\n\t`vip_ids` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '适用会员类型\",\"分隔',\n\t`start_time` datetime DEFAULT NULL COMMENT '活动开始日期',\n\t`end_time` datetime DEFAULT NULL COMMENT '活动结束日期',\n\t`condition_amount` decimal(10, 2) DEFAULT NULL COMMENT '满x元',\n\t`discount` decimal(10, 2) DEFAULT NULL COMMENT '折扣',\n\t`is_shelf` int DEFAULT NULL COMMENT '是否上架:0否 1是',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT '订单优惠活动'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_other", |
| | | "tableName":"t_order_activity_info", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "t_region":{ |
| | | "createTableSQL":"CREATE TABLE `t_region` (\r\n `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',\r\n `name` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '城市名称',\r\n `code` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,\r\n `citycode` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,\r\n `parent_id` int DEFAULT NULL COMMENT '父级ID',\r\n `english` varchar(200) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '英文名称',\r\n PRIMARY KEY (`id`) USING BTREE\r\n) ENGINE=InnoDB AUTO_INCREMENT=3537 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=COMPACT COMMENT='省市区三级联动'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_other", |
| | | "tableName":"t_region", |
| | | "targetName":"prototype" |
| | | } |
| | | } |
| | | }, |
| | | "schemaName":"qijisheng_other", |
| | | "shardingTables":{ |
| | | "t_goods_app_user":{ |
| | | "createTableSQL":"CREATE TABLE `t_goods_app_user` (\r\n `id` bigint NOT NULL COMMENT '主键',\r\n `goods_id` int DEFAULT NULL COMMENT '商品id',\r\n `app_user_id` bigint DEFAULT NULL COMMENT '用户id',\r\n PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='商品指定用户数据' TBPARTITION BY MOD_HASH(goods_id) TBPARTITIONS 10", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_other/t_goods_app_user_${tableIndex}", |
| | | "tableNum":"10", |
| | | "tableMethod":"MOD_HASH(goods_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_technician_subscribe":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_technician_subscribe` (\n\t`id` bigint NOT NULL COMMENT '主键',\n\t`order_id` bigint DEFAULT NULL COMMENT '订单id',\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`technician_id` int DEFAULT NULL COMMENT '技师id',\n\t`subscribe_time` datetime DEFAULT NULL COMMENT '预约时间',\n\t`service_mode` int DEFAULT NULL COMMENT '服务方式(1=上门服务,2=到店服务)',\n\t`user_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '用户地址JSON对象',\n\t`status` int DEFAULT NULL COMMENT '状态(0=待服务,1=已服务,2=已取消,3=已到期)',\n\t`del_flag` int DEFAULT NULL COMMENT '删除(0=否,1=是)',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '技师预约记录'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 10", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_other/t_technician_subscribe_${tableIndex}", |
| | | "tableNum":"10", |
| | | "tableMethod":"MOD_HASH(app_user_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_technician_score":{ |
| | | "createTableSQL":"CREATE TABLE `t_technician_score` (\r\n `id` bigint NOT NULL COMMENT '主键',\r\n `app_user_id` bigint DEFAULT NULL COMMENT '用户id',\r\n `technician_id` int DEFAULT NULL COMMENT '技师id',\r\n `score` decimal(10,2) DEFAULT NULL COMMENT '评分',\r\n `create_time` datetime DEFAULT NULL COMMENT '添加时间',\r\n PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='技师评分记录' TBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 20", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_other/t_technician_score_${tableIndex}", |
| | | "tableNum":"20", |
| | | "tableMethod":"MOD_HASH(app_user_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_vip_good":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_vip_good` (\n\t`id` bigint NOT NULL,\n\t`vip_id` int DEFAULT NULL COMMENT '对应会员id',\n\t`good_json` text COLLATE utf8mb4_bin COMMENT '指定购买后升级商品的json快照',\n\tPRIMARY KEY USING BTREE (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '会员等级设置-指定商品(弃用)'\nTBPARTITION BY MOD_HASH(vip_id) TBPARTITIONS 10", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_other/t_vip_good_${tableIndex}", |
| | | "tableNum":"10", |
| | | "tableMethod":"MOD_HASH(vip_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_goods_evaluate":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_goods_evaluate` (\n\t`id` bigint NOT NULL COMMENT '主键',\n\t`goods_id` int DEFAULT NULL COMMENT '商品id',\n\t`order_id` bigint DEFAULT NULL COMMENT '订单id',\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`grade` decimal(10, 2) DEFAULT NULL COMMENT '评分',\n\t`comment` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '评价内容',\n\t`images` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '评价图片',\n\t`status` int DEFAULT '2' COMMENT '状态(1=下架,2=上架)',\n\t`del_flag` int DEFAULT '0' COMMENT '删除(0=否,1=是)',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '商品评价'\nTBPARTITION BY MOD_HASH(goods_id) TBPARTITIONS 10", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_other/t_goods_evaluate_${tableIndex}", |
| | | "tableNum":"10", |
| | | "tableMethod":"MOD_HASH(goods_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_shop_balance_statement":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_shop_balance_statement` (\n\t`id` bigint NOT NULL COMMENT '主键',\n\t`shop_id` int DEFAULT NULL COMMENT '门店id',\n\t`type` int DEFAULT NULL COMMENT '变动类型(1=绑定门店分佣,2=下级门店分佣,3=核销门店服务费,4=提现)',\n\t`historical_balance` decimal(10, 2) DEFAULT NULL COMMENT '历史余额',\n\t`variable_amount` decimal(10, 2) DEFAULT NULL COMMENT '变动金额',\n\t`balance` decimal(10, 2) DEFAULT NULL COMMENT '变动后余额',\n\t`create_time` datetime DEFAULT NULL COMMENT '变动时间',\n\t`create_user_id` bigint DEFAULT NULL COMMENT '变动用户id',\n\t`object_id` bigint DEFAULT NULL COMMENT '关联对象id',\n\t`extension` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '拓展字段',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '门店余额流水'\nTBPARTITION BY MOD_HASH(shop_id) TBPARTITIONS 20", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_other/t_shop_balance_statement_${tableIndex}", |
| | | "tableNum":"20", |
| | | "tableMethod":"MOD_HASH(shop_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_goods_area":{ |
| | | "createTableSQL":"CREATE TABLE `t_goods_area` (\r\n `id` bigint NOT NULL COMMENT '主键',\r\n `goods_id` int DEFAULT NULL COMMENT '商品id',\r\n `province` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '省',\r\n `province_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '省编号',\r\n `city` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '市',\r\n `city_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '市编号',\r\n `districts` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '区',\r\n `districts_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '区编号',\r\n `vip` int DEFAULT NULL COMMENT '会员级别(1=普通会员,2=黄金会员,3=钻石会员,4=准代理,5=代理,6=总代,7=合伙人)',\r\n `cash_payment` int DEFAULT NULL COMMENT '现金支付(0=否,1=是)',\r\n `point_payment` int DEFAULT NULL COMMENT '积分支付(0=否,1=是)',\r\n `selling_price` decimal(10,2) DEFAULT NULL COMMENT '基础售价',\r\n `integral` int DEFAULT NULL COMMENT '基础积分',\r\n `earn_spending_points` int DEFAULT NULL COMMENT '可获得消费积分',\r\n `superior_subcommission` decimal(10,2) DEFAULT NULL COMMENT '上级获得分佣金额',\r\n `superior_rebate_points` int DEFAULT NULL COMMENT '上级获得返佣积分',\r\n `superior_type` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '获取返佣积分上级类型(1=直推上级,2=直帮上级)',\r\n `superior_price_type` varchar(255) DEFAULT NULL COMMENT '获取分佣金额上级类型(1=直推上级,2=直帮上级)',\r\n `servuce_shop_charges` decimal(10,2) DEFAULT NULL COMMENT '核销门店可获得服务费',\r\n `servuce_shop_points` int DEFAULT NULL COMMENT '核销门店可获得服务积分',\r\n `technician_points` int DEFAULT NULL COMMENT '技师可获得服务积分',\r\n `bound_shop_charges` decimal(10,2) DEFAULT NULL COMMENT '绑定门店可获得分佣金额',\r\n `bound_shop_points` int DEFAULT NULL COMMENT '绑定门店可获得返佣积分',\r\n `bound_shop_superiors_charges` decimal(10,2) DEFAULT NULL COMMENT '绑定门店上级门店可获得分佣金额',\r\n `bound_shop_superiors_points` int DEFAULT NULL COMMENT '绑定门店上级门店可获得返佣积分',\r\n PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='商品地区配置' TBPARTITION BY MOD_HASH(goods_id) TBPARTITIONS 10", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_other/t_goods_area_${tableIndex}", |
| | | "tableNum":"10", |
| | | "tableMethod":"MOD_HASH(goods_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_shop_point":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_shop_point` (\n\t`id` bigint NOT NULL COMMENT '主键',\n\t`shop_id` int DEFAULT NULL COMMENT '门店id',\n\t`type` int DEFAULT NULL COMMENT '变动类型(1=门店业绩,2=门店返佣,3=下级门店返佣,4=门店服务返佣)',\n\t`historical_point` int DEFAULT NULL COMMENT '历史余额',\n\t`variable_point` int DEFAULT NULL COMMENT '变动金额',\n\t`balance` int DEFAULT NULL COMMENT '变动后余额',\n\t`create_time` datetime DEFAULT NULL COMMENT '变动时间',\n\t`create_user_id` bigint DEFAULT NULL COMMENT '变动用户id',\n\t`object_id` bigint DEFAULT NULL COMMENT '关联对象id',\n\t`order_num` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '订单编号',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '门店积分流水'\nTBPARTITION BY MOD_HASH(shop_id) TBPARTITIONS 20", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_other/t_shop_point_${tableIndex}", |
| | | "tableNum":"20", |
| | | "tableMethod":"MOD_HASH(shop_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_shop_withdraw":{ |
| | | "createTableSQL":"CREATE TABLE `t_shop_withdraw` (\r\n `id` bigint NOT NULL COMMENT '主键',\r\n `shop_id` int DEFAULT NULL COMMENT '门店id',\r\n `money` decimal(10,2) DEFAULT NULL COMMENT '提现金额',\r\n `audit_status` int DEFAULT '0' COMMENT '审核状态(0=待审核,1=审核通过,2=审核失败)',\r\n `audit_user_id` bigint DEFAULT NULL COMMENT '审核人id',\r\n `audit_time` datetime DEFAULT NULL COMMENT '审核时间',\r\n `audit_msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '审核结果',\r\n `status` int DEFAULT NULL COMMENT '状态(1=申请中,2=已到账)',\r\n `arrival_time` datetime DEFAULT NULL COMMENT '到账时间',\r\n `del_flag` int DEFAULT NULL COMMENT '删除(0=否,1=是)',\r\n `create_time` datetime DEFAULT NULL COMMENT '添加时间',\r\n `create_user_id` bigint DEFAULT NULL COMMENT '添加用户id',\r\n PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='门店提现申请' TBPARTITION BY MOD_HASH(shop_id) TBPARTITIONS 10", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_other/t_shop_withdraw_${tableIndex}", |
| | | "tableNum":"10", |
| | | "tableMethod":"MOD_HASH(shop_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_goods_shop":{ |
| | | "createTableSQL":"CREATE TABLE `t_goods_shop` (\r\n `id` bigint NOT NULL COMMENT '主键',\r\n `goods_id` int DEFAULT NULL COMMENT '商品id',\r\n `shop_id` int DEFAULT NULL COMMENT '门店id',\r\n PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='商品指定门店数据' TBPARTITION BY MOD_HASH(goods_id) TBPARTITIONS 10", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_other/t_goods_shop_${tableIndex}", |
| | | "tableNum":"10", |
| | | "tableMethod":"MOD_HASH(goods_id)", |
| | | "storeNum":0 |
| | | }, |
| | | "ranges":{} |
| | | }, |
| | | "partition":{ |
| | | |
| | | }, |
| | | "shardingIndexTables":{} |
| | | }, |
| | | "t_shop_score":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_shop_score` (\n\t`id` bigint NOT NULL COMMENT '主键',\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`shop_id` int DEFAULT NULL COMMENT '门店id',\n\t`score` decimal(10, 1) DEFAULT '5.0' COMMENT '评分',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '门店评分记录'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 20", |
| | | "function":{ |
| | | "properties":{ |
| | | "mappingFormat":"prototype/qijisheng_other/t_shop_score_${tableIndex}", |
| | | "tableNum":"20", |
| | | "tableMethod":"MOD_HASH(app_user_id)", |
| | | "storeNum":0 |
| | | } |
| | | }, |
| | | "shardingIndexTables":{} |
| | | } |
| | | }, |
| | | "views":{} |
| | | } |
New file |
| | |
| | | { |
| | | "customTables":{}, |
| | | "globalTables":{}, |
| | | "normalProcedures":{}, |
| | | "normalTables":{ |
| | | "sys_job_log":{ |
| | | "createTableSQL":"CREATE TABLE `sys_job_log` (\r\n `job_log_id` bigint NOT NULL AUTO_INCREMENT COMMENT '任务日志ID',\r\n `job_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务名称',\r\n `job_group` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务组名',\r\n `invoke_target` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调用目标字符串',\r\n `job_message` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '日志信息',\r\n `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '执行状态(0正常 1失败)',\r\n `exception_info` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '异常信息',\r\n `create_time` datetime DEFAULT NULL COMMENT '创建时间',\r\n PRIMARY KEY (`job_log_id`) USING BTREE\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='定时任务调度日志表'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_system", |
| | | "tableName":"sys_job_log", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "t_user_shop":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_system`.`t_user_shop` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`user_id` int DEFAULT NULL COMMENT '用户id',\n\t`shop_id` int DEFAULT NULL COMMENT '门店id',\n\t`role_type` int DEFAULT NULL COMMENT '角色类型(1=店长,2=店员)',\n\t`role_id` int DEFAULT NULL COMMENT '角色id',\n\t`dept_id` bigint DEFAULT NULL COMMENT '部门ID',\n\t`nick_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户昵称',\n\t`create_time` datetime DEFAULT NULL COMMENT '创建时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 25 CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '门店员工关系数据(后台)'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_system", |
| | | "tableName":"t_user_shop", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "sys_dict_type":{ |
| | | "createTableSQL":"CREATE TABLE `sys_dict_type` (\r\n `dict_id` bigint NOT NULL AUTO_INCREMENT COMMENT '字典主键',\r\n `dict_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典名称',\r\n `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典类型',\r\n `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态(0正常 1停用)',\r\n `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\r\n `create_time` datetime DEFAULT NULL COMMENT '创建时间',\r\n `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\r\n `update_time` datetime DEFAULT NULL COMMENT '更新时间',\r\n `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',\r\n PRIMARY KEY (`dict_id`) USING BTREE,\r\n UNIQUE KEY `dict_type` (`dict_type`) USING BTREE\r\n) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='字典类型表'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_system", |
| | | "tableName":"sys_dict_type", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "sys_role_menu":{ |
| | | "createTableSQL":"CREATE TABLE `sys_role_menu` (\r\n `role_id` bigint NOT NULL COMMENT '角色ID',\r\n `menu_id` bigint NOT NULL COMMENT '菜单ID',\r\n PRIMARY KEY (`role_id`,`menu_id`) USING BTREE\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='角色和菜单关联表'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_system", |
| | | "tableName":"sys_role_menu", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "gen_table_column":{ |
| | | "createTableSQL":"CREATE TABLE `gen_table_column` (\r\n `column_id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',\r\n `table_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '归属表编号',\r\n `column_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '列名称',\r\n `column_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '列描述',\r\n `column_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '列类型',\r\n `java_type` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'JAVA类型',\r\n `java_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'JAVA字段名',\r\n `is_pk` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否主键(1是)',\r\n `is_increment` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否自增(1是)',\r\n `is_required` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否必填(1是)',\r\n `is_insert` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否为插入字段(1是)',\r\n `is_edit` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否编辑字段(1是)',\r\n `is_list` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否列表字段(1是)',\r\n `is_query` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否查询字段(1是)',\r\n `query_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'EQ' COMMENT '查询方式(等于、不等于、大于、小于、范围)',\r\n `html_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)',\r\n `dict_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典类型',\r\n `sort` int DEFAULT NULL COMMENT '排序',\r\n `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\r\n `create_time` datetime DEFAULT NULL COMMENT '创建时间',\r\n `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\r\n `update_time` datetime DEFAULT NULL COMMENT '更新时间',\r\n PRIMARY KEY (`column_id`) USING BTREE\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='代码生成业务表字段'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_system", |
| | | "tableName":"gen_table_column", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "sys_job":{ |
| | | "createTableSQL":"CREATE TABLE `sys_job` (\r\n `job_id` bigint NOT NULL AUTO_INCREMENT COMMENT '任务ID',\r\n `job_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '任务名称',\r\n `job_group` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'DEFAULT' COMMENT '任务组名',\r\n `invoke_target` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调用目标字符串',\r\n `cron_expression` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'cron执行表达式',\r\n `misfire_policy` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '3' COMMENT '计划执行错误策略(1立即执行 2执行一次 3放弃执行)',\r\n `concurrent` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '是否并发执行(0允许 1禁止)',\r\n `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态(0正常 1暂停)',\r\n `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\r\n `create_time` datetime DEFAULT NULL COMMENT '创建时间',\r\n `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\r\n `update_time` datetime DEFAULT NULL COMMENT '更新时间',\r\n `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注信息',\r\n PRIMARY KEY (`job_id`,`job_name`,`job_group`) USING BTREE\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='定时任务调度表'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_system", |
| | | "tableName":"sys_job", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "gen_table":{ |
| | | "createTableSQL":"CREATE TABLE `gen_table` (\r\n `table_id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',\r\n `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '表名称',\r\n `table_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '表描述',\r\n `sub_table_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '关联子表的表名',\r\n `sub_table_fk_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '子表关联的外键名',\r\n `class_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '实体类名称',\r\n `tpl_category` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'crud' COMMENT '使用的模板(crud单表操作 tree树表操作)',\r\n `package_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '生成包路径',\r\n `module_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '生成模块名',\r\n `business_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '生成业务名',\r\n `function_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '生成功能名',\r\n `function_author` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '生成功能作者',\r\n `gen_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '生成代码方式(0zip压缩包 1自定义路径)',\r\n `gen_path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '/' COMMENT '生成路径(不填默认项目路径)',\r\n `options` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '其它生成选项',\r\n `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\r\n `create_time` datetime DEFAULT NULL COMMENT '创建时间',\r\n `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\r\n `update_time` datetime DEFAULT NULL COMMENT '更新时间',\r\n `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',\r\n PRIMARY KEY (`table_id`) USING BTREE\r\n) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='代码生成业务表'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_system", |
| | | "tableName":"gen_table", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "sys_login_log":{ |
| | | "createTableSQL":"CREATE TABLE `sys_login_log` (\r\n `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\r\n `user_id` int DEFAULT NULL COMMENT '用户id',\r\n `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '登录账号',\r\n `ip_address` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '登录IP地址',\r\n `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '登录地址',\r\n `browser_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '浏览器类型',\r\n `operating_system` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '操作系统',\r\n `login_time` datetime DEFAULT NULL COMMENT '登录时间',\r\n `login_status` int DEFAULT NULL COMMENT '登录状态(1=成功,2=失败)',\r\n `message` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '提示消息',\r\n `create_time` datetime DEFAULT NULL COMMENT '添加时间',\r\n `del_flag` int DEFAULT NULL COMMENT '删除状态(0=否,1=是)',\r\n PRIMARY KEY (`id`) USING BTREE\r\n) ENGINE=InnoDB AUTO_INCREMENT=463 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='登录日志'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_system", |
| | | "tableName":"sys_login_log", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "sys_user_post":{ |
| | | "createTableSQL":"CREATE TABLE `sys_user_post` (\r\n `user_id` bigint NOT NULL COMMENT '用户ID',\r\n `post_id` bigint NOT NULL COMMENT '岗位ID',\r\n PRIMARY KEY (`user_id`,`post_id`) USING BTREE\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='用户与岗位关联表'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_system", |
| | | "tableName":"sys_user_post", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "sys_dict_data":{ |
| | | "createTableSQL":"CREATE TABLE `sys_dict_data` (\r\n `dict_code` bigint NOT NULL AUTO_INCREMENT COMMENT '字典编码',\r\n `dict_sort` int DEFAULT '0' COMMENT '字典排序',\r\n `dict_label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典标签',\r\n `dict_value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典键值',\r\n `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典类型',\r\n `css_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '样式属性(其他样式扩展)',\r\n `list_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表格回显样式',\r\n `is_default` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'N' COMMENT '是否默认(Y是 N否)',\r\n `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态(0正常 1停用)',\r\n `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\r\n `create_time` datetime DEFAULT NULL COMMENT '创建时间',\r\n `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\r\n `update_time` datetime DEFAULT NULL COMMENT '更新时间',\r\n `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',\r\n PRIMARY KEY (`dict_code`) USING BTREE\r\n) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='字典数据表'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_system", |
| | | "tableName":"sys_dict_data", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "sys_role_dept":{ |
| | | "createTableSQL":"CREATE TABLE `sys_role_dept` (\r\n `role_id` bigint NOT NULL COMMENT '角色ID',\r\n `dept_id` bigint NOT NULL COMMENT '部门ID',\r\n PRIMARY KEY (`role_id`,`dept_id`) USING BTREE\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='角色和部门关联表'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_system", |
| | | "tableName":"sys_role_dept", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "sys_role":{ |
| | | "createTableSQL":"CREATE TABLE `sys_role` (\r\n `role_id` bigint NOT NULL AUTO_INCREMENT COMMENT '角色ID',\r\n `role_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色名称',\r\n `role_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '角色权限字符串',\r\n `data_scope` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)',\r\n `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '角色状态(0正常 1停用)',\r\n `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',\r\n `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\r\n `create_time` datetime DEFAULT NULL COMMENT '创建时间',\r\n `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\r\n `update_time` datetime DEFAULT NULL COMMENT '更新时间',\r\n `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',\r\n `shop_id` int DEFAULT NULL COMMENT '门店id',\r\n PRIMARY KEY (`role_id`) USING BTREE\r\n) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='角色信息表'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_system", |
| | | "tableName":"sys_role", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "sys_oper_log":{ |
| | | "createTableSQL":"CREATE TABLE `sys_oper_log` (\r\n `oper_id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志主键',\r\n `title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '模块标题',\r\n `business_type` int DEFAULT '0' COMMENT '业务类型(0其它 1新增 2修改 3删除)',\r\n `method` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '方法名称',\r\n `request_method` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '请求方式',\r\n `operator_type` int DEFAULT '0' COMMENT '操作类别(0其它 1后台用户 2手机端用户)',\r\n `oper_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '操作人员',\r\n `dept_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '部门名称',\r\n `oper_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '请求URL',\r\n `oper_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '主机地址',\r\n `oper_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '操作地点',\r\n `oper_param` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '请求参数',\r\n `json_result` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '返回参数',\r\n `status` int DEFAULT '0' COMMENT '操作状态(0正常 1异常)',\r\n `error_msg` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '错误消息',\r\n `oper_time` datetime DEFAULT NULL COMMENT '操作时间',\r\n `cost_time` bigint DEFAULT '0' COMMENT '消耗时间',\r\n PRIMARY KEY (`oper_id`) USING BTREE,\r\n KEY `idx_sys_oper_log_bt` (`business_type`) USING BTREE,\r\n KEY `idx_sys_oper_log_s` (`status`) USING BTREE,\r\n KEY `idx_sys_oper_log_ot` (`oper_time`) USING BTREE\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='操作日志记录'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_system", |
| | | "tableName":"sys_oper_log", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "sys_user_role":{ |
| | | "createTableSQL":"CREATE TABLE `sys_user_role` (\r\n `user_id` bigint NOT NULL COMMENT '用户ID',\r\n `role_id` bigint NOT NULL COMMENT '角色ID',\r\n PRIMARY KEY (`user_id`,`role_id`) USING BTREE\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='用户和角色关联表'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_system", |
| | | "tableName":"sys_user_role", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "sys_menu":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_system`.`sys_menu` (\n\t`menu_id` bigint NOT NULL AUTO_INCREMENT COMMENT '菜单ID',\n\t`menu_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '菜单名称',\n\t`parent_id` bigint DEFAULT '0' COMMENT '父菜单ID',\n\t`order_num` int DEFAULT '0' COMMENT '显示顺序',\n\t`path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '路由地址',\n\t`component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '组件路径',\n\t`query` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '路由参数',\n\t`is_frame` int DEFAULT '1' COMMENT '是否为外链(0是 1否)',\n\t`is_cache` int DEFAULT '0' COMMENT '是否缓存(0缓存 1不缓存)',\n\t`menu_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '菜单类型(M目录 C菜单 F按钮)',\n\t`visible` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '菜单状态(0显示 1隐藏)',\n\t`status` tinyint(1) DEFAULT '0' COMMENT '菜单状态(0正常 1停用)',\n\t`perms` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '权限标识',\n\t`icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '#' COMMENT '菜单图标',\n\t`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\n\t`create_time` datetime DEFAULT NULL COMMENT '创建时间',\n\t`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\n\t`update_time` datetime DEFAULT NULL COMMENT '更新时间',\n\t`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注',\n\t`role_type` int DEFAULT NULL COMMENT '数据类型(1=平台,2=门店)',\n\tPRIMARY KEY USING BTREE (`menu_id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 286 CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC COMMENT '菜单权限表'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_system", |
| | | "tableName":"sys_menu", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "sys_user":{ |
| | | "createTableSQL":"CREATE TABLE `qijisheng_system`.`sys_user` (\n\t`user_id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID',\n\t`dept_id` bigint DEFAULT NULL COMMENT '部门ID',\n\t`user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户账号',\n\t`nick_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户昵称',\n\t`user_type` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '00' COMMENT '用户类型(00系统用户)',\n\t`email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户邮箱',\n\t`phonenumber` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '手机号码',\n\t`sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)',\n\t`avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '头像地址',\n\t`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '密码',\n\t`status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '帐号状态(0正常 1停用)',\n\t`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',\n\t`login_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '最后登录IP',\n\t`login_date` datetime DEFAULT NULL COMMENT '最后登录时间',\n\t`role_type` int DEFAULT '1' COMMENT '角色类型 1=平台 2=门店',\n\t`passWordUpdate` datetime DEFAULT NULL COMMENT '密码修改时间',\n\t`objectId` int DEFAULT '1' COMMENT '对象ID',\n\t`create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\n\t`create_time` datetime DEFAULT NULL COMMENT '创建时间',\n\t`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\n\t`update_time` datetime DEFAULT NULL COMMENT '更新时间',\n\t`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',\n\t`forbidden_remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '禁用账户备注',\n\t`app_user_id` bigint DEFAULT NULL COMMENT '前端用户id',\n\tPRIMARY KEY USING BTREE (`user_id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 49 CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC COMMENT '用户信息表'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_system", |
| | | "tableName":"sys_user", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "sys_dept":{ |
| | | "createTableSQL":"CREATE TABLE `sys_dept` (\r\n `dept_id` bigint NOT NULL AUTO_INCREMENT COMMENT '部门id',\r\n `parent_id` bigint DEFAULT '0' COMMENT '父部门id',\r\n `ancestors` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '祖级列表',\r\n `dept_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '部门名称',\r\n `order_num` int DEFAULT '0' COMMENT '显示顺序',\r\n `leader` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '负责人',\r\n `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '联系电话',\r\n `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '邮箱',\r\n `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '部门状态(0正常 1停用)',\r\n `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',\r\n `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\r\n `create_time` datetime DEFAULT NULL COMMENT '创建时间',\r\n `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\r\n `update_time` datetime DEFAULT NULL COMMENT '更新时间',\r\n `shop_id` int DEFAULT NULL COMMENT '门店id',\r\n PRIMARY KEY (`dept_id`) USING BTREE\r\n) ENGINE=InnoDB AUTO_INCREMENT=110 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='部门表'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_system", |
| | | "tableName":"sys_dept", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "sys_post":{ |
| | | "createTableSQL":"CREATE TABLE `sys_post` (\r\n `post_id` bigint NOT NULL AUTO_INCREMENT COMMENT '岗位ID',\r\n `post_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位编码',\r\n `post_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位名称',\r\n `post_sort` int NOT NULL COMMENT '显示顺序',\r\n `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '状态(0正常 1停用)',\r\n `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\r\n `create_time` datetime DEFAULT NULL COMMENT '创建时间',\r\n `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\r\n `update_time` datetime DEFAULT NULL COMMENT '更新时间',\r\n `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',\r\n PRIMARY KEY (`post_id`) USING BTREE\r\n) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='岗位信息表'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_system", |
| | | "tableName":"sys_post", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "sys_config":{ |
| | | "createTableSQL":"CREATE TABLE `sys_config` (\r\n `config_id` int NOT NULL AUTO_INCREMENT COMMENT '参数主键',\r\n `config_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '参数名称',\r\n `config_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '参数键名',\r\n `config_value` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '参数键值',\r\n `config_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'N' COMMENT '系统内置(Y是 N否)',\r\n `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\r\n `create_time` datetime DEFAULT NULL COMMENT '创建时间',\r\n `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\r\n `update_time` datetime DEFAULT NULL COMMENT '更新时间',\r\n `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',\r\n PRIMARY KEY (`config_id`) USING BTREE\r\n) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='参数配置表'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_system", |
| | | "tableName":"sys_config", |
| | | "targetName":"prototype" |
| | | } |
| | | }, |
| | | "sys_notice":{ |
| | | "createTableSQL":"CREATE TABLE `sys_notice` (\r\n `notice_id` int NOT NULL AUTO_INCREMENT COMMENT '公告ID',\r\n `notice_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '公告标题',\r\n `notice_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '公告类型(1通知 2公告)',\r\n `notice_content` longblob COMMENT '公告内容',\r\n `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '公告状态(0正常 1关闭)',\r\n `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\r\n `create_time` datetime DEFAULT NULL COMMENT '创建时间',\r\n `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\r\n `update_time` datetime DEFAULT NULL COMMENT '更新时间',\r\n `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',\r\n PRIMARY KEY (`notice_id`) USING BTREE\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='通知公告表'", |
| | | "locality":{ |
| | | "schemaName":"qijisheng_system", |
| | | "tableName":"sys_notice", |
| | | "targetName":"prototype" |
| | | } |
| | | } |
| | | }, |
| | | "schemaName":"qijisheng_system", |
| | | "shardingTables":{}, |
| | | "views":{} |
| | | } |
New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <project xmlns="http://maven.apache.org/POM/4.0.0" |
| | | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| | | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi</artifactId> |
| | | <version>3.6.2</version> |
| | | |
| | | <name>ruoyi</name> |
| | | <description>微服务系统</description> |
| | | |
| | | <properties> |
| | | <ruoyi.version>3.6.2</ruoyi.version> |
| | | <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
| | | <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> |
| | | <java.version>1.8</java.version> |
| | | <spring-boot.version>2.7.7</spring-boot.version> |
| | | <spring-cloud.version>2021.0.5</spring-cloud.version> |
| | | <spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version> |
| | | <spring-boot-admin.version>2.7.10</spring-boot-admin.version> |
| | | <swagger.fox.version>3.0.0</swagger.fox.version> |
| | | <swagger.core.version>1.6.2</swagger.core.version> |
| | | <tobato.version>1.27.2</tobato.version> |
| | | <kaptcha.version>2.3.3</kaptcha.version> |
| | | <pagehelper.boot.version>1.4.6</pagehelper.boot.version> |
| | | <druid.version>1.2.16</druid.version> |
| | | <dynamic-ds.version>3.5.2</dynamic-ds.version> |
| | | <commons.io.version>2.11.0</commons.io.version> |
| | | <velocity.version>2.3</velocity.version> |
| | | <fastjson.version>2.0.25</fastjson.version> |
| | | <jjwt.version>0.9.1</jjwt.version> |
| | | <minio.version>8.2.2</minio.version> |
| | | <poi.version>4.1.2</poi.version> |
| | | <transmittable-thread-local.version>2.14.2</transmittable-thread-local.version> |
| | | </properties> |
| | | |
| | | <!-- 依赖声明 --> |
| | | <dependencyManagement> |
| | | <dependencies> |
| | | |
| | | <!-- SpringCloud 微服务 --> |
| | | <dependency> |
| | | <groupId>org.springframework.cloud</groupId> |
| | | <artifactId>spring-cloud-dependencies</artifactId> |
| | | <version>${spring-cloud.version}</version> |
| | | <type>pom</type> |
| | | <scope>import</scope> |
| | | </dependency> |
| | | |
| | | <!-- SpringCloud Alibaba 微服务 --> |
| | | <dependency> |
| | | <groupId>com.alibaba.cloud</groupId> |
| | | <artifactId>spring-cloud-alibaba-dependencies</artifactId> |
| | | <version>${spring-cloud-alibaba.version}</version> |
| | | <type>pom</type> |
| | | <scope>import</scope> |
| | | </dependency> |
| | | |
| | | <!-- SpringBoot 依赖配置 --> |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-dependencies</artifactId> |
| | | <version>${spring-boot.version}</version> |
| | | <type>pom</type> |
| | | <scope>import</scope> |
| | | </dependency> |
| | | |
| | | <!-- FastDFS 分布式文件系统 --> |
| | | <dependency> |
| | | <groupId>com.github.tobato</groupId> |
| | | <artifactId>fastdfs-client</artifactId> |
| | | <version>${tobato.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- Swagger 依赖配置 --> |
| | | <dependency> |
| | | <groupId>io.swagger</groupId> |
| | | <artifactId>swagger-models</artifactId> |
| | | <version>${swagger.core.version}</version> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>io.swagger</groupId> |
| | | <artifactId>swagger-annotations</artifactId> |
| | | <version>${swagger.core.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- 验证码 --> |
| | | <dependency> |
| | | <groupId>pro.fessional</groupId> |
| | | <artifactId>kaptcha</artifactId> |
| | | <version>${kaptcha.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- pagehelper 分页插件 --> |
| | | <dependency> |
| | | <groupId>com.github.pagehelper</groupId> |
| | | <artifactId>pagehelper-spring-boot-starter</artifactId> |
| | | <version>${pagehelper.boot.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- io常用工具类 --> |
| | | <dependency> |
| | | <groupId>commons-io</groupId> |
| | | <artifactId>commons-io</artifactId> |
| | | <version>${commons.io.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- excel工具 --> |
| | | <dependency> |
| | | <groupId>org.apache.poi</groupId> |
| | | <artifactId>poi-ooxml</artifactId> |
| | | <version>${poi.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- 代码生成使用模板 --> |
| | | <dependency> |
| | | <groupId>org.apache.velocity</groupId> |
| | | <artifactId>velocity-engine-core</artifactId> |
| | | <version>${velocity.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- JSON 解析器和生成器 --> |
| | | <dependency> |
| | | <groupId>com.alibaba.fastjson2</groupId> |
| | | <artifactId>fastjson2</artifactId> |
| | | <version>${fastjson.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- JWT --> |
| | | <dependency> |
| | | <groupId>io.jsonwebtoken</groupId> |
| | | <artifactId>jjwt</artifactId> |
| | | <version>${jjwt.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- 线程传递值 --> |
| | | <dependency> |
| | | <groupId>com.alibaba</groupId> |
| | | <artifactId>transmittable-thread-local</artifactId> |
| | | <version>${transmittable-thread-local.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- 核心模块 --> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-common-core</artifactId> |
| | | <version>${ruoyi.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- 接口模块 --> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-common-swagger</artifactId> |
| | | <version>${ruoyi.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- 安全模块 --> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-common-security</artifactId> |
| | | <version>${ruoyi.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- 权限范围 --> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-common-datascope</artifactId> |
| | | <version>${ruoyi.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- 多数据源 --> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-common-datasource</artifactId> |
| | | <version>${ruoyi.version}</version> |
| | | </dependency> |
| | | |
| | | |
| | | <!-- 日志记录 --> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-common-log</artifactId> |
| | | <version>${ruoyi.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- 缓存服务 --> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-common-redis</artifactId> |
| | | <version>${ruoyi.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- 系统接口 --> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-api-system</artifactId> |
| | | <version>${ruoyi.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- 账户接口 --> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-api-account</artifactId> |
| | | <version>${ruoyi.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- 订单接口 --> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-api-order</artifactId> |
| | | <version>${ruoyi.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- 系统其他接口 --> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-api-other</artifactId> |
| | | <version>${ruoyi.version}</version> |
| | | </dependency> |
| | | |
| | | </dependencies> |
| | | </dependencyManagement> |
| | | |
| | | <modules> |
| | | <module>ruoyi-auth</module> |
| | | <module>ruoyi-gateway</module> |
| | | <module>ruoyi-modules</module> |
| | | <module>ruoyi-api</module> |
| | | <module>ruoyi-common</module> |
| | | <module>ruoyi-service</module> |
| | | </modules> |
| | | <packaging>pom</packaging> |
| | | |
| | | <dependencies> |
| | | <!-- bootstrap 启动器 --> |
| | | <dependency> |
| | | <groupId>org.springframework.cloud</groupId> |
| | | <artifactId>spring-cloud-starter-bootstrap</artifactId> |
| | | </dependency> |
| | | </dependencies> |
| | | |
| | | <build> |
| | | <plugins> |
| | | <plugin> |
| | | <groupId>org.apache.maven.plugins</groupId> |
| | | <artifactId>maven-compiler-plugin</artifactId> |
| | | <configuration> |
| | | <source>${java.version}</source> |
| | | <target>${java.version}</target> |
| | | <encoding>${project.build.sourceEncoding}</encoding> |
| | | </configuration> |
| | | </plugin> |
| | | </plugins> |
| | | <pluginManagement> |
| | | <plugins> |
| | | <plugin> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-maven-plugin</artifactId> |
| | | <version>${spring-boot.version}</version> |
| | | <executions> |
| | | <execution> |
| | | <goals> |
| | | <goal>repackage</goal> |
| | | </goals> |
| | | </execution> |
| | | </executions> |
| | | </plugin> |
| | | </plugins> |
| | | </pluginManagement> |
| | | </build> |
| | | |
| | | <repositories> |
| | | <repository> |
| | | <id>public</id> |
| | | <name>aliyun nexus</name> |
| | | <url>https://maven.aliyun.com/repository/public</url> |
| | | <releases> |
| | | <enabled>true</enabled> |
| | | </releases> |
| | | </repository> |
| | | </repositories> |
| | | |
| | | <pluginRepositories> |
| | | <pluginRepository> |
| | | <id>public</id> |
| | | <name>aliyun nexus</name> |
| | | <url>https://maven.aliyun.com/repository/public</url> |
| | | <releases> |
| | | <enabled>true</enabled> |
| | | </releases> |
| | | <snapshots> |
| | | <enabled>false</enabled> |
| | | </snapshots> |
| | | </pluginRepository> |
| | | </pluginRepositories> |
| | | |
| | | </project> |
New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" |
| | | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| | | <parent> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi</artifactId> |
| | | <version>3.6.2</version> |
| | | </parent> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | |
| | | <modules> |
| | | <module>ruoyi-api-system</module> |
| | | <module>ruoyi-api-account</module> |
| | | <module>ruoyi-api-order</module> |
| | | <module>ruoyi-api-other</module> |
| | | </modules> |
| | | |
| | | <artifactId>ruoyi-api</artifactId> |
| | | <packaging>pom</packaging> |
| | | |
| | | <description> |
| | | ruoyi-api系统接口 |
| | | </description> |
| | | |
| | | </project> |
New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| | | xmlns="http://maven.apache.org/POM/4.0.0" |
| | | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| | | <parent> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-api</artifactId> |
| | | <version>3.6.2</version> |
| | | </parent> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | |
| | | <artifactId>ruoyi-api-account</artifactId> |
| | | |
| | | <description> |
| | | ruoyi-api-account账户接口模块 |
| | | </description> |
| | | |
| | | <dependencies> |
| | | |
| | | <!-- RuoYi Common Core--> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-common-core</artifactId> |
| | | <exclusions> |
| | | <exclusion> |
| | | <groupId>com.github.pagehelper</groupId> |
| | | <artifactId>pagehelper-spring-boot-starter</artifactId> |
| | | </exclusion> |
| | | </exclusions> |
| | | </dependency> |
| | | </dependencies> |
| | | |
| | | </project> |
New file |
| | |
| | | package com.ruoyi.account.api.factory; |
| | | |
| | | import com.ruoyi.account.api.feignClient.AppUserClient; |
| | | import com.ruoyi.account.api.model.AppUser; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.cloud.openfeign.FallbackFactory; |
| | | |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/11/21 9:52 |
| | | */ |
| | | @Slf4j |
| | | public class AppUserClientFallbackFactory implements FallbackFactory<AppUserClient> { |
| | | |
| | | |
| | | |
| | | @Override |
| | | public AppUserClient create(Throwable cause) { |
| | | |
| | | return new AppUserClient() { |
| | | @Override |
| | | public AppUser getAppUserById(Long id) { |
| | | log.error("根据id获取用户失败:{}", cause.getMessage()); |
| | | throw new RuntimeException("根据id获取用户失败"); |
| | | } |
| | | |
| | | @Override |
| | | public R<Void> editAppUserById(AppUser appUser) { |
| | | log.error("编辑用户信息失败:{}", cause.getMessage()); |
| | | return R.fail("编辑用户信息失败"); |
| | | } |
| | | |
| | | @Override |
| | | public R<Long> getCouponCount(Long userId, Integer couponId) { |
| | | log.error("获取优惠券数量失败:{}", cause.getMessage()); |
| | | throw new RuntimeException("获取优惠券数量失败"); |
| | | } |
| | | |
| | | @Override |
| | | public R<List<AppUser>> getUserAncestorList(Long id) { |
| | | log.error("获取用户祖籍列表失败:{}", cause.getMessage()); |
| | | throw new RuntimeException("获取用户祖籍列表失败"); |
| | | } |
| | | |
| | | @Override |
| | | public R<AppUser> getSuperiorLeader(Long id) { |
| | | return R.fail("获取直帮上级用户失败"); |
| | | } |
| | | |
| | | @Override |
| | | public R<List<AppUser>> getTopUsers() { |
| | | log.error("获取用户列表失败:{}", cause.getMessage()); |
| | | throw new RuntimeException("获取用户列表失败"); |
| | | } |
| | | |
| | | @Override |
| | | public R<Long> getVipCount(Long userId, Integer vipId) { |
| | | log.error("获取直推会员数失败:{}", cause.getMessage()); |
| | | throw new RuntimeException("获取直推会员数失败"); |
| | | } |
| | | |
| | | @Override |
| | | public R<List<AppUser>> getAppUserByName(String name) { |
| | | return R.fail("根据用户名称模糊搜索用户列表失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<List<AppUser>> getAppUserByNameNoFilter(String name) { |
| | | return R.fail("根据用户名称模糊搜索用户列表失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<List<AppUser>> getAppUserByPhone(String phone) { |
| | | return R.fail("根据用户电话模糊搜索用户列表失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<List<AppUser>> getAppUserByPhoneNoFilter(String phone) { |
| | | return R.fail("根据用户电话模糊搜索用户列表失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<AppUser> getAppUserByPhone1(String phone) { |
| | | return R.fail("通过手机号查询用户失败"); |
| | | } |
| | | |
| | | @Override |
| | | public R<List<AppUser>> setLowerUserShop(Long userId, Integer shopId) { |
| | | return R.fail(); |
| | | } |
| | | |
| | | @Override |
| | | public List<AppUser> listByIds(List<Long> list) { |
| | | log.error("获取用户失败: "+cause.getMessage()); |
| | | return Collections.emptyList(); |
| | | } |
| | | |
| | | @Override |
| | | public void vipUpgrade(Long appUserId) { |
| | | R.fail("检查会员等级变更失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public void vipConsumption(Long appUserId) { |
| | | R.fail("检查会员等级变更失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public void vipDemotion(Long appUserId) { |
| | | R.fail("检查会员等级降级失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public void demotionDetection() { |
| | | R.fail("用户降级检测失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R clearBindShop(Integer shopId) { |
| | | return R.fail("清空绑定门店的用户门店数据失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | }; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.account.api.feignClient; |
| | | |
| | | import com.ruoyi.account.api.factory.AppUserClientFallbackFactory; |
| | | import com.ruoyi.account.api.model.AppUser; |
| | | import com.ruoyi.common.core.constant.ServiceNameConstants; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import org.springframework.cloud.openfeign.FeignClient; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/11/21 9:50 |
| | | */ |
| | | @FeignClient(contextId = "AppUserClient", value = ServiceNameConstants.ACCOUNT_SERVICE, fallbackFactory = AppUserClientFallbackFactory.class) |
| | | public interface AppUserClient { |
| | | |
| | | /** |
| | | * 根据id获取用户 |
| | | * @param id |
| | | * @return |
| | | */ |
| | | @PostMapping("/app-user/getAppUserById") |
| | | AppUser getAppUserById(@RequestParam("id") Long id); |
| | | |
| | | /** |
| | | * 根据id编辑用户 |
| | | */ |
| | | @PostMapping("/app-user/editAppUserById") |
| | | R<Void> editAppUserById(@RequestBody AppUser appUser); |
| | | |
| | | @PostMapping("/app-user/getCouponCount") |
| | | R<Long> getCouponCount(@RequestParam("userId")Long userId, @RequestParam("couponId") Integer couponId ); |
| | | |
| | | /** |
| | | * 根据用户id获取用户的祖籍列表 |
| | | */ |
| | | @GetMapping("/appletLogin/getUserAncestorList") |
| | | R<List<AppUser>> getUserAncestorList(@RequestParam("id") Long id); |
| | | |
| | | @PostMapping("/app-user/getSuperiorLeader") |
| | | R<AppUser> getSuperiorLeader(@RequestParam("id") Long id); |
| | | |
| | | @PostMapping("/app-user/getTopUsers") |
| | | R<List<AppUser>> getTopUsers(); |
| | | |
| | | @PostMapping("/app-user/getVipCount") |
| | | R<Long> getVipCount(@RequestParam("userId")Long userId, @RequestParam("vipId") Integer vipId ); |
| | | |
| | | |
| | | @PostMapping("/app-user/listByIds") |
| | | List<AppUser> listByIds(@RequestParam("ids") List<Long> list); |
| | | |
| | | /** |
| | | * 根据用户名称模糊搜索用户列表 |
| | | * @param name |
| | | * @return |
| | | */ |
| | | @PostMapping("/app-user/getAppUserByName") |
| | | R<List<AppUser>> getAppUserByName(@RequestParam("name") String name); |
| | | |
| | | @GetMapping("/app-user/getAppUserByNameNoFilter") |
| | | public R<List<AppUser>> getAppUserByNameNoFilter(@RequestParam("name") String name); |
| | | |
| | | /** |
| | | * 根据用户电话模糊搜索用户列表 |
| | | * @param phone |
| | | * @return |
| | | */ |
| | | @PostMapping("/app-user/getAppUserByPhone") |
| | | R<List<AppUser>> getAppUserByPhone(@RequestParam("phone") String phone); |
| | | |
| | | /** |
| | | * 根据用户电话模糊搜索用户列表(包含被删除的用户) |
| | | * @param phone |
| | | * @return |
| | | */ |
| | | @GetMapping("/app-user/getAppUserByPhoneNoFilter") |
| | | public R<List<AppUser>> getAppUserByPhoneNoFilter(@RequestParam("phone") String phone); |
| | | |
| | | |
| | | @PostMapping("/app-user/getAppUserByPhone1") |
| | | R<AppUser> getAppUserByPhone1(@RequestParam("phone") String phone); |
| | | |
| | | /** |
| | | * 获得指定用户的下级用户 |
| | | * @param userId |
| | | * @return |
| | | */ |
| | | @PostMapping("/app-user/setLowerUserShop") |
| | | R<List<AppUser>> setLowerUserShop(@RequestParam("userId") Long userId,@RequestParam("shopId") Integer shopId); |
| | | |
| | | |
| | | |
| | | /** |
| | | * 检查会员等级变更 |
| | | * @param appUserId |
| | | */ |
| | | @PostMapping("/app-user/vipUpgrade") |
| | | void vipUpgrade(@RequestParam("appUserId") Long appUserId); |
| | | |
| | | /** |
| | | * 消费后检查会员等级变更 |
| | | */ |
| | | @PostMapping("/app-user/vipConsumption") |
| | | void vipConsumption(@RequestParam("appUserId") Long appUserId); |
| | | |
| | | |
| | | /** |
| | | * 检查会员降级 |
| | | * @param appUserId |
| | | */ |
| | | @PostMapping("/app-user/vipDemotion") |
| | | void vipDemotion(@RequestParam("appUserId") Long appUserId); |
| | | |
| | | |
| | | |
| | | /** |
| | | * 用户降级检测 |
| | | */ |
| | | @PostMapping("/app-user/demotionDetection") |
| | | void demotionDetection(); |
| | | |
| | | |
| | | /** |
| | | * 清空绑定门店的用户门店数据 |
| | | * @param shopId |
| | | * @return |
| | | */ |
| | | @PostMapping("/app-user/clearBindShop") |
| | | R clearBindShop(@RequestParam("shopId") Integer shopId); |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.account.api.model; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.fasterxml.jackson.annotation.JsonInclude; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | |
| | | /** |
| | | * <p> |
| | | * |
| | | * </p> |
| | | * |
| | | * @author luodangjia |
| | | * @since 2024-11-21 |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = false) |
| | | @TableName("t_app_user") |
| | | @ApiModel(value="AppUser对象", description="") |
| | | public class AppUser implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @ApiModelProperty(value = "主键") |
| | | @TableId("id") |
| | | private Long id; |
| | | |
| | | @ApiModelProperty(value = "用户类型(1-普通用户,2-门店员工)") |
| | | private Integer userType; |
| | | |
| | | @ApiModelProperty(value = "用户") |
| | | @TableField("name") |
| | | private String name; |
| | | @ApiModelProperty("会员名称") |
| | | @TableField(exist = false) |
| | | private String vipName; |
| | | |
| | | @ApiModelProperty(value = "手机号") |
| | | @TableField("phone") |
| | | private String phone; |
| | | |
| | | @ApiModelProperty(value = "头像") |
| | | @TableField("avatar") |
| | | private String avatar; |
| | | |
| | | @ApiModelProperty(value = "会员id") |
| | | @TableField("vip_id") |
| | | private Integer vipId; |
| | | |
| | | @ApiModelProperty(value = "微信openid") |
| | | @TableField("wx_openid") |
| | | private String wxOpenid; |
| | | |
| | | @ApiModelProperty(value = "支付宝openid") |
| | | @TableField("ali_openid") |
| | | private String aliOpenid; |
| | | |
| | | @ApiModelProperty(value = "状态(1=正常,2=冻结,3=注销)") |
| | | @TableField("status") |
| | | private Integer status; |
| | | |
| | | @ApiModelProperty(value = "添加时间") |
| | | @TableField("create_time") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private LocalDateTime createTime; |
| | | |
| | | @ApiModelProperty(value = "删除(0=否,1=是)") |
| | | @TableField("del_flag") |
| | | private Boolean delFlag; |
| | | |
| | | @ApiModelProperty(value = "0否1是第一次添加") |
| | | @TableField("first_add") |
| | | private Integer firstAdd; |
| | | |
| | | @ApiModelProperty(value = "最后一次登录时间") |
| | | @TableField("last_login_time") |
| | | private LocalDateTime lastLoginTime; |
| | | |
| | | @ApiModelProperty(value = "顶级推广人id") |
| | | @TableField("top_invite_id") |
| | | private Long topInviteId; |
| | | |
| | | @ApiModelProperty(value = "推广人id") |
| | | @TableField("invite_user_id") |
| | | private Long inviteUserId; |
| | | @ApiModelProperty(value = "推广人姓名") |
| | | @TableField(exist = false) |
| | | private String inviteUserName; |
| | | @ApiModelProperty(value = "指导老师") |
| | | @TableField(exist = false) |
| | | private String teacher; |
| | | @TableField(exist = false) |
| | | private String teacherPhone; |
| | | |
| | | @ApiModelProperty(value = "绑定门店id") |
| | | @TableField("shop_id") |
| | | private Integer shopId; |
| | | @ApiModelProperty(value = "绑定门店名称") |
| | | @TableField(exist = false) |
| | | private String shopName; |
| | | @ApiModelProperty(value = "绑定门店列表") |
| | | @TableField(exist = false) |
| | | private List<String> shopNames; |
| | | @ApiModelProperty(value = "绑定门店封面") |
| | | @TableField(exist = false) |
| | | private String shopCover; |
| | | @ApiModelProperty(value = "绑定门店地址") |
| | | @TableField(exist = false) |
| | | private String shopAddress; |
| | | @ApiModelProperty(value = "上级人员信息") |
| | | @TableField(exist = false) |
| | | private AppUser topUser; |
| | | @ApiModelProperty(value = "下级人员列表") |
| | | @TableField(exist = false) |
| | | private List<AppUser> bottomUsers; |
| | | |
| | | @TableField(exist = false) |
| | | private Page<AppUser> bottomUsersPage; |
| | | |
| | | @ApiModelProperty(value = "合伙人积分数") |
| | | @TableField("part_point") |
| | | private Integer partPoint; |
| | | |
| | | @ApiModelProperty(value = "合伙人培育积分数") |
| | | @TableField("part_grow_point") |
| | | private Integer partGrowPoint; |
| | | |
| | | @ApiModelProperty(value = "消费积分数") |
| | | @TableField("shop_point") |
| | | private Integer shopPoint; |
| | | |
| | | @ApiModelProperty(value = "返佣积分数") |
| | | @TableField("share_point") |
| | | private Integer sharePoint; |
| | | |
| | | @ApiModelProperty(value = "消费总金额") |
| | | @TableField("shop_amount") |
| | | private BigDecimal shopAmount; |
| | | |
| | | @ApiModelProperty(value = "最后消费时间") |
| | | @TableField("last_shop_time") |
| | | private LocalDateTime lastShopTime; |
| | | |
| | | @ApiModelProperty(value = "账户余额") |
| | | @TableField("balance") |
| | | private BigDecimal balance; |
| | | |
| | | @ApiModelProperty(value = "可提现金额") |
| | | @TableField("withdrawable_amount") |
| | | private BigDecimal withdrawableAmount; |
| | | |
| | | @ApiModelProperty(value = "已提现金额") |
| | | @TableField("withdrawn_amount") |
| | | private BigDecimal withdrawnAmount; |
| | | |
| | | @ApiModelProperty(value = "充值总金额") |
| | | @TableField("total_recharge_amount") |
| | | private BigDecimal totalRechargeAmount; |
| | | |
| | | @ApiModelProperty(value = "红包总金额") |
| | | @TableField("total_red_packet_amount") |
| | | private BigDecimal totalRedPacketAmount; |
| | | |
| | | @ApiModelProperty(value = "分销总金额") |
| | | @TableField("total_distribution_amount") |
| | | private BigDecimal totalDistributionAmount; |
| | | |
| | | @ApiModelProperty(value = "冻结分佣金额") |
| | | @TableField("freeze_commission_amount") |
| | | private BigDecimal freezeCommissionAmount; |
| | | |
| | | @ApiModelProperty(value = "冻结分佣积分") |
| | | @TableField("freeze_commission_point") |
| | | private Integer freezeCommissionPoint; |
| | | |
| | | @ApiModelProperty(value = "拉新人积分总数") |
| | | @TableField("total_invite_point") |
| | | private Integer totalInvitePoint; |
| | | |
| | | @ApiModelProperty(value = "注册积分总数") |
| | | @TableField("total_register_point") |
| | | private Integer totalRegisterPoint; |
| | | |
| | | @ApiModelProperty(value = "绑定下级门店分佣积分") |
| | | @TableField("lower_level_share_point") |
| | | private Integer lowerLevelSharePoint; |
| | | |
| | | @ApiModelProperty(value = "门店返佣积分") |
| | | @TableField("shop_share_point") |
| | | private Integer shopSharePoint; |
| | | |
| | | @ApiModelProperty(value = "门店业绩积分") |
| | | @TableField("shop_achievement_point") |
| | | private Integer shopAchievementPoint; |
| | | |
| | | @ApiModelProperty(value = "门店服务费(门店核销获得)") |
| | | @TableField("shop_service_fee") |
| | | private BigDecimal shopServiceFee; |
| | | |
| | | @ApiModelProperty(value = "门店返佣金额(绑定用户消费后返佣)") |
| | | @TableField("shop_commission") |
| | | private BigDecimal shopCommission; |
| | | |
| | | // @ApiModelProperty(value = "做工积分总数") |
| | | // @TableField("total_work_point") |
| | | // private Integer totalWorkPoint; |
| | | |
| | | @ApiModelProperty(value = "每日分享积分") |
| | | @TableField("total_share_point") |
| | | private Integer totalSharePoint; |
| | | |
| | | @ApiModelProperty(value = "每日签到积分") |
| | | @TableField("total_sign_point") |
| | | private Integer totalSignPoint; |
| | | |
| | | @ApiModelProperty(value = "使用时长积分") |
| | | @TableField("total_hour_point") |
| | | private Integer totalHourPoint; |
| | | |
| | | @ApiModelProperty(value = "技师业绩积分总数") |
| | | @TableField("total_performance_point") |
| | | private Integer totalPerformancePoint; |
| | | |
| | | @ApiModelProperty(value = "总积分") |
| | | @TableField("total_point") |
| | | private Integer totalPoint; |
| | | |
| | | @ApiModelProperty(value = "剩余积分") |
| | | @TableField("lave_point") |
| | | private Integer lavePoint; |
| | | |
| | | @ApiModelProperty(value = "可用积分") |
| | | @TableField("available_point") |
| | | private Integer availablePoint; |
| | | |
| | | @ApiModelProperty(value = "可用总积分数") |
| | | @TableField("total_available_point") |
| | | private Integer totalAvailablePoint; |
| | | |
| | | @ApiModelProperty(value = "可转增积分") |
| | | @TableField("transferable_point") |
| | | private Integer transferablePoint; |
| | | |
| | | @ApiModelProperty(value = "是否可更换推广人(0=否,1=是)") |
| | | @TableField("change_promoter") |
| | | private Integer changePromoter; |
| | | |
| | | @ApiModelProperty(value = "经度") |
| | | @TableField("longitude") |
| | | private String longitude; |
| | | |
| | | @ApiModelProperty(value = "纬度") |
| | | @TableField("latitude") |
| | | private String latitude; |
| | | |
| | | @ApiModelProperty(value = "省") |
| | | @TableField("province") |
| | | private String province; |
| | | |
| | | @ApiModelProperty(value = "省编号") |
| | | @TableField("province_code") |
| | | private String provinceCode; |
| | | |
| | | @ApiModelProperty(value = "市") |
| | | @TableField("city") |
| | | private String city; |
| | | |
| | | @ApiModelProperty(value = "市编号") |
| | | @TableField("city_code") |
| | | private String cityCode; |
| | | |
| | | @ApiModelProperty(value = "区") |
| | | @TableField("district") |
| | | private String district; |
| | | |
| | | @ApiModelProperty(value = "区编号") |
| | | @TableField("district_code") |
| | | private String districtCode; |
| | | @ApiModelProperty(value = "区编号") |
| | | @TableField("qr_code") |
| | | private String qrCode; |
| | | |
| | | @ApiModelProperty("等级1会员数") |
| | | @TableField(exist = false) |
| | | private Long count1; |
| | | |
| | | @ApiModelProperty("等级2会员数") |
| | | @TableField(exist = false) |
| | | private Long count2; |
| | | |
| | | @ApiModelProperty("等级3会员数") |
| | | @TableField(exist = false) |
| | | private Long count3; |
| | | |
| | | @ApiModelProperty("等级4会员数") |
| | | @TableField(exist = false) |
| | | private Long count4; |
| | | |
| | | @ApiModelProperty("等级5会员数") |
| | | @TableField(exist = false) |
| | | private Long count5; |
| | | |
| | | @ApiModelProperty("等级6会员数") |
| | | @TableField(exist = false) |
| | | private Long count6; |
| | | |
| | | @ApiModelProperty("等级7会员数") |
| | | @TableField(exist = false) |
| | | private Long count7; |
| | | |
| | | @ApiModelProperty("是否签到1是0否") |
| | | @TableField(exist = false) |
| | | private Integer isSign; |
| | | |
| | | @ApiModelProperty("绑定门店id列表") |
| | | @TableField(exist = false) |
| | | private Set<Integer> shopIds; |
| | | |
| | | @ApiModelProperty(value = "降级预警(0=否,1=是)") |
| | | @TableField("is_danger") |
| | | private Integer isDanger; |
| | | |
| | | @ApiModelProperty(value = "最后下单时间") |
| | | @TableField(exist = false) |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private LocalDateTime lastOrderTime; |
| | | |
| | | @TableField(exist = false) |
| | | private Set<Long> userIds; |
| | | |
| | | @TableField(exist = false) |
| | | private Integer excludeStatus; |
| | | |
| | | public String getIdStr(){ |
| | | return String.valueOf(id); |
| | | } |
| | | |
| | | |
| | | public Integer getUserTotalPoint(){ |
| | | if (totalPoint == null){ |
| | | totalPoint = 0; |
| | | } |
| | | if (lowerLevelSharePoint == null){ |
| | | lowerLevelSharePoint = 0; |
| | | } |
| | | if (shopSharePoint == null){ |
| | | shopSharePoint = 0; |
| | | } |
| | | if (shopAchievementPoint == null){ |
| | | shopAchievementPoint = 0; |
| | | } |
| | | return totalPoint - lowerLevelSharePoint - shopSharePoint - shopAchievementPoint; |
| | | } |
| | | |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.account.api.model; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/11/25 14:59 |
| | | */ |
| | | @Data |
| | | @ApiModel |
| | | @TableName("t_app_user_bank") |
| | | public class AppUserBank { |
| | | /** |
| | | * 主键 |
| | | */ |
| | | @TableId("id") |
| | | @ApiModelProperty(value = "数据id") |
| | | private Long id; |
| | | /** |
| | | * 用户id |
| | | */ |
| | | @TableField("app_user_id") |
| | | @ApiModelProperty(value = "用户id") |
| | | private Long appUserId; |
| | | /** |
| | | * 开户银行名称 |
| | | */ |
| | | @TableField("bank_name") |
| | | @ApiModelProperty(value = "开户银行名称", required = true) |
| | | private String bankName; |
| | | /** |
| | | * 银行卡号 |
| | | */ |
| | | @TableField("bank_number") |
| | | @ApiModelProperty(value = "银行卡号", required = true) |
| | | private String bankNumber; |
| | | } |
New file |
| | |
| | | package com.ruoyi.account.api.model; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableLogic; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | import java.io.Serializable; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * <p> |
| | | * |
| | | * </p> |
| | | * |
| | | * @author luodangjia |
| | | * @since 2024-11-21 |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = false) |
| | | @TableName("t_user_cancellation_log") |
| | | @ApiModel(value="UserCancellationLog对象", description="") |
| | | public class UserCancellationLog implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @ApiModelProperty(value = "主键") |
| | | @TableId("id") |
| | | private Long id; |
| | | |
| | | @ApiModelProperty(value = "删除标志(0=否,1=是)") |
| | | @TableField("del_flag") |
| | | private Integer delFlag; |
| | | |
| | | @ApiModelProperty(value = "添加时间") |
| | | @TableField("create_time") |
| | | private LocalDateTime createTime; |
| | | |
| | | @ApiModelProperty(value = "用户id") |
| | | @TableField("app_user_id") |
| | | private Long appUserId; |
| | | |
| | | @ApiModelProperty(value = "会员等级") |
| | | @TableField("vip_id") |
| | | private Integer vipId; |
| | | |
| | | @TableField(exist = false) |
| | | private String userName; |
| | | @TableField(exist = false) |
| | | private String userPhone; |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.account.api.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.ruoyi.common.core.annotation.Excel; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import io.swagger.annotations.ApiParam; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * <p> |
| | | * |
| | | * </p> |
| | | * |
| | | * @author luodangjia |
| | | * @since 2024-11-21 |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = false) |
| | | @TableName("t_user_point") |
| | | @ApiModel(value="UserPoint对象", description="") |
| | | public class UserPoint implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @ApiModelProperty(value = "主键") |
| | | @TableId("id") |
| | | private Long id; |
| | | |
| | | @ApiModelProperty(value = "变动类型(1-消费,2-返佣,3-拉新,4-每日分享,5-每日签到,6-使用时长, 7-注册积分, 8-门店业绩," + |
| | | "9-门店返佣,14-下级门店返佣,10-技师业绩,11-兑换商品,12-他人赠送,13-赠与他人,15-兑换券)") |
| | | @Excel(name = "变动类型", readConverterExp = "1=消费积分,2=返佣积分,3=拉新人积分,4=每日分享,5=每日签到,6=使用时长,7=注册积分,8=门店业绩,9=门店返佣,14=下级门店返佣,10=技师业绩,11=兑换商品,12=他人赠送,13=赠与他人,15=兑换券") |
| | | @TableField("type") |
| | | private Integer type; |
| | | |
| | | @ApiModelProperty(value = "历史余额") |
| | | @TableField("historical_point") |
| | | private Integer historicalPoint; |
| | | |
| | | @ApiModelProperty(value = "变动金额") |
| | | @TableField("variable_point") |
| | | @Excel(name = "变动金额") |
| | | private Integer variablePoint; |
| | | |
| | | @ApiModelProperty(value = "变动后余额") |
| | | @TableField("balance") |
| | | private Integer balance; |
| | | |
| | | @ApiModelProperty(value = "变动时间") |
| | | @TableField("create_time") |
| | | @Excel(name = "变动时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") |
| | | private LocalDateTime createTime; |
| | | |
| | | @ApiModelProperty(value = "变动用户id") |
| | | @TableField("app_user_id") |
| | | private Long appUserId; |
| | | |
| | | @ApiModelProperty(value = "关联对象id") |
| | | @TableField("object_id") |
| | | private Long objectId; |
| | | |
| | | @ApiModelProperty(value = "拓展字段") |
| | | @TableField("extention") |
| | | private String extention; |
| | | |
| | | @ApiModelProperty(value = "用户名称") |
| | | @Excel(name = "用户名称") |
| | | @TableField(exist = false) |
| | | private String userName; |
| | | @ApiModelProperty(value = "变动类型 0未变化1增加2减少") |
| | | @TableField(exist = false) |
| | | private Integer variableType; |
| | | |
| | | @ApiModelProperty(value = "联系电话") |
| | | @Excel(name = "联系电话") |
| | | @TableField(exist = false) |
| | | private String phone; |
| | | |
| | | |
| | | @ApiModelProperty(value = "开始时间") |
| | | @TableField(exist = false) |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private LocalDateTime startTime; |
| | | |
| | | @ApiModelProperty(value = "结束时间") |
| | | @TableField(exist = false) |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private LocalDateTime endTime; |
| | | |
| | | @TableField(exist = false) |
| | | private List<Long> userIds; |
| | | @TableField(exist = false) |
| | | private Integer pageNum; |
| | | @TableField(exist = false) |
| | | private Integer pageSize; |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.account.api.vo; |
| | | |
| | | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * <p> |
| | | * |
| | | * </p> |
| | | * |
| | | * @author luodangjia |
| | | * @since 2024-11-20 |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = false) |
| | | @TableName("t_coupon_info") |
| | | @ApiModel(value="CouponInfo对象", description="") |
| | | public class CouponInfoVo implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @ApiModelProperty(value = "主键") |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | private Integer id; |
| | | |
| | | @ApiModelProperty(value = "删除标志(0=否,1=是)") |
| | | @TableField("del_flag") |
| | | private Integer delFlag; |
| | | |
| | | @ApiModelProperty(value = "添加时间") |
| | | @TableField("create_time") |
| | | private LocalDateTime createTime; |
| | | |
| | | @ApiModelProperty(value = "优惠券名称") |
| | | @TableField("coupon_name") |
| | | private String couponName; |
| | | |
| | | @ApiModelProperty(value = "优惠券类型 1'满减券',2'代金券',3'折扣券',4'商品券'") |
| | | @TableField("coupon_type") |
| | | private Integer couponType; |
| | | |
| | | @ApiModelProperty(value = "满x元") |
| | | @TableField("condition_amount") |
| | | private BigDecimal conditionAmount; |
| | | |
| | | @ApiModelProperty(value = "减x元") |
| | | @TableField("discount_amount") |
| | | private BigDecimal discountAmount; |
| | | |
| | | @ApiModelProperty(value = "代金x元") |
| | | @TableField("money_amount") |
| | | private BigDecimal moneyAmount; |
| | | |
| | | @ApiModelProperty(value = "折扣") |
| | | @TableField("discount") |
| | | private BigDecimal discount; |
| | | |
| | | @ApiModelProperty(value = "适用商品ids,全部-1") |
| | | @TableField("for_good_ids") |
| | | private String forGoodIds; |
| | | |
| | | @ApiModelProperty(value = "发放数量") |
| | | @TableField("send_num") |
| | | private Integer sendNum; |
| | | |
| | | @ApiModelProperty(value = "可领数量") |
| | | @TableField("max_num") |
| | | private Integer maxNum; |
| | | |
| | | @ApiModelProperty(value = "有效期类型 1指定时间内有效 2领取后x天有效") |
| | | @TableField("period_type") |
| | | private Integer periodType; |
| | | |
| | | @ApiModelProperty(value = "有效期开始时间") |
| | | @TableField("period_start_time") |
| | | private LocalDateTime periodStartTime; |
| | | |
| | | @ApiModelProperty(value = "有效期结束时间") |
| | | @TableField("period_end_time") |
| | | private LocalDateTime periodEndTime; |
| | | |
| | | @ApiModelProperty(value = "领取后x天有效") |
| | | @TableField("period_days") |
| | | private Integer periodDays; |
| | | |
| | | @ApiModelProperty(value = "开始发放时间") |
| | | @TableField("send_start_time") |
| | | private LocalDateTime sendStartTime; |
| | | |
| | | @ApiModelProperty(value = "结束发放时间") |
| | | @TableField("send_end_time") |
| | | private LocalDateTime sendEndTime; |
| | | |
| | | @ApiModelProperty(value = "1免费发放2积分兑换") |
| | | @TableField("send_type") |
| | | private Integer sendType; |
| | | |
| | | @ApiModelProperty(value = "兑换所需积分") |
| | | @TableField("need_point") |
| | | private BigDecimal needPoint; |
| | | |
| | | @ApiModelProperty(value = "可领用户 1全部 2指定人员 3指定会员 4 新人注册") |
| | | @TableField("person_type") |
| | | private Integer personType; |
| | | |
| | | @ApiModelProperty(value = "可领取对应的ids,用find_in_set查询") |
| | | @TableField("person_ids") |
| | | private String personIds; |
| | | |
| | | @ApiModelProperty(value = "商品卷对应的商品名称") |
| | | @TableField(exist = false) |
| | | private List<String> goodNames; |
| | | |
| | | @ApiModelProperty(value = "其他商品名称") |
| | | private String goodsNameJson; |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.account.api.vo; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/11/29 14:32 |
| | | */ |
| | | @Data |
| | | public class PaymentUserCoupon { |
| | | /** |
| | | * 用户id |
| | | */ |
| | | private Long userId; |
| | | /** |
| | | * 订单金额 |
| | | */ |
| | | private BigDecimal orderMoney; |
| | | /** |
| | | * 商品类型(1=服务,2=实体商品) |
| | | */ |
| | | private Integer type; |
| | | } |
New file |
| | |
| | | package com.ruoyi.account.api.vo; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/11/29 16:39 |
| | | */ |
| | | @Data |
| | | @ApiModel |
| | | public class PaymentUserCouponVo { |
| | | @ApiModelProperty("优惠券id") |
| | | private String id; |
| | | @ApiModelProperty("优惠券名称") |
| | | private String name; |
| | | @ApiModelProperty("优惠券类型 1=满减券,2=代金券,3=折扣券,4=商品券") |
| | | private Integer couponType; |
| | | @ApiModelProperty("满x元") |
| | | private BigDecimal conditionAmount; |
| | | @ApiModelProperty("减x元") |
| | | private BigDecimal discountAmount; |
| | | @ApiModelProperty("代金x元") |
| | | private BigDecimal moneyAmount; |
| | | @ApiModelProperty("折扣") |
| | | private BigDecimal discount; |
| | | @ApiModelProperty("有效期开始时间") |
| | | private String periodStartTime; |
| | | @ApiModelProperty("有效期结束时间") |
| | | private String periodEndTime; |
| | | @ApiModelProperty("适用商品id集合,为null表示全部适用") |
| | | private List<String> forGoodIds; |
| | | @ApiModelProperty("是否可用") |
| | | private Boolean available; |
| | | } |
New file |
| | |
| | | com.ruoyi.account.api.factory.AppUserClientFallbackFactory |
| | | com.ruoyi.account.api.factory.UserAddressClientFallbackFactory |
| | | com.ruoyi.account.api.factory.UserCouponClientFallbackFactory |
| | | com.ruoyi.account.api.factory.UserPointFallbackFactory |
| | | com.ruoyi.account.api.factory.BalanceChangeRecordClientFallbackFactory |
| | | com.ruoyi.account.api.factory.UserChangeLogFallbackFactory |
| | | com.ruoyi.account.api.factory.AppUserShopClientFallbackFactory |
| | | com.ruoyi.account.api.factory.AppUserGiveawayTemporaryClientFallbackFactory |
New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| | | xmlns="http://maven.apache.org/POM/4.0.0" |
| | | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| | | <parent> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-api</artifactId> |
| | | <version>3.6.2</version> |
| | | </parent> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | |
| | | <artifactId>ruoyi-api-order</artifactId> |
| | | |
| | | <description> |
| | | ruoyi-api-order订单接口模块 |
| | | </description> |
| | | |
| | | <dependencies> |
| | | |
| | | <!-- RuoYi Common Core--> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-common-core</artifactId> |
| | | <exclusions> |
| | | <exclusion> |
| | | <groupId>com.github.pagehelper</groupId> |
| | | <artifactId>pagehelper-spring-boot-starter</artifactId> |
| | | </exclusion> |
| | | </exclusions> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-api-other</artifactId> |
| | | </dependency> |
| | | </dependencies> |
| | | |
| | | </project> |
New file |
| | |
| | | package com.ruoyi.order.factory; |
| | | |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.order.feignClient.OrderClient; |
| | | import com.ruoyi.order.model.Order; |
| | | import com.ruoyi.order.vo.OrderSaleNum; |
| | | import org.springframework.cloud.openfeign.FallbackFactory; |
| | | |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @date 2025/1/7 14:38 |
| | | */ |
| | | public class OrderClientFallbackFactory implements FallbackFactory<OrderClient> { |
| | | @Override |
| | | public OrderClient create(Throwable cause) { |
| | | return new OrderClient(){ |
| | | |
| | | @Override |
| | | public R<Integer> getGoodsSaleNum(Integer goodsId, Integer type) { |
| | | return R.fail("获取商品销售数量失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public R<Integer> getShopSaleNum(Integer shopId, Integer type) { |
| | | return R.fail("获取门店销售订单数量失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<Integer> getShopSaleNumByShopIds(OrderSaleNum orderSaleNum) { |
| | | return R.fail("获取门店销售订单数量失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<Set<Long>> getAppUserByShoppingShop(Integer shopId) { |
| | | return R.fail("获取所有在指定门店消费的用户id失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<List<Order>> getRedeemedOrdersByShop(Integer shopId) { |
| | | return R.fail("获取已核销的订单失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<Order> getOrderById(Long id) { |
| | | return R.fail("根据id获取订单详情失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R editOrder(Order order) { |
| | | return R.fail("编辑订单详情失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public R<Long> getOrderCountByAppUserId(Long appUserId) { |
| | | return R.fail("获取用户订单数量失败:" + cause.getMessage()); |
| | | } |
| | | }; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.order.factory; |
| | | |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.order.feignClient.RemoteOrderGoodsClient; |
| | | import com.ruoyi.order.vo.Price; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import com.ruoyi.order.model.Order; |
| | | import com.ruoyi.order.model.OrderGood; |
| | | import org.springframework.cloud.openfeign.FallbackFactory; |
| | | |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | |
| | | @Slf4j |
| | | public class RemoteOrderGoodsFallbackFactory implements FallbackFactory<RemoteOrderGoodsClient> { |
| | | @Override |
| | | public RemoteOrderGoodsClient create(Throwable cause) { |
| | | return new RemoteOrderGoodsClient(){ |
| | | @Override |
| | | public R<List<OrderGood>> goodsOrder(List<Long> goodsIds) { |
| | | log.error("获取订单商品失败:{}", cause.getMessage()); |
| | | throw new RuntimeException("获取订单商品失败"); |
| | | } |
| | | |
| | | @Override |
| | | public R<List<Order>> getOrderListByIds(List<Long> orderIds) { |
| | | log.error("获取订单列表失败:{}", cause.getMessage()); |
| | | throw new RuntimeException("获取订单列表失败"); |
| | | } |
| | | |
| | | @Override |
| | | public R<List<Order>> getOrderListByUserIdAndGoodsId(Long userId, Integer goodsId) { |
| | | return R.fail("获取订单列表失败"); |
| | | } |
| | | |
| | | @Override |
| | | public R<Void> updateOrderStatus(Order order) { |
| | | return R.fail("更新订单状态失败"); |
| | | } |
| | | |
| | | @Override |
| | | public R<Void> subscribe(Long id, Integer technicianId) { |
| | | return R.fail("预约失败"); |
| | | } |
| | | |
| | | @Override |
| | | public R<Price> getGoodsPrice(Long appUserId, Integer goodsId, Integer shopId) { |
| | | return R.fail("获取商品价格失败"); |
| | | } |
| | | |
| | | @Override |
| | | public R<Order> getLastOrder(Long appUserId) { |
| | | return R.fail("获取订单失败"); |
| | | } |
| | | |
| | | @Override |
| | | public R<List<Order>> byUserId(Long appUserId,Integer shopId) { |
| | | return R.fail(); |
| | | } |
| | | |
| | | @Override |
| | | public R<List<Order>> byShopId(Integer shopId) { |
| | | return R.fail(); |
| | | } |
| | | @Override |
| | | public R<List<Order>> byShopIdAndUserId(Long userId,Integer shopId) { |
| | | return R.fail("通过门店和用户id查询订单失败"); |
| | | } |
| | | |
| | | @Override |
| | | public R<List<OrderGood>> getUnDistributedOrder(List<Long> appUserIds) { |
| | | return R.fail("获取未分配订单失败"); |
| | | } |
| | | }; |
| | | |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.order.feignClient; |
| | | |
| | | import com.ruoyi.common.core.constant.ServiceNameConstants; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.order.factory.OrderClientFallbackFactory; |
| | | import com.ruoyi.order.model.Order; |
| | | import com.ruoyi.order.vo.OrderSaleNum; |
| | | import org.springframework.cloud.openfeign.FeignClient; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @date 2025/1/7 14:37 |
| | | */ |
| | | @FeignClient(contextId = "OrderClient", value = ServiceNameConstants.ORDER_SERVICE, fallbackFactory = OrderClientFallbackFactory.class) |
| | | public interface OrderClient { |
| | | |
| | | |
| | | /** |
| | | * 获取商品销售数量 |
| | | * @param goodsId |
| | | * @param type 购买类型(1=普通商品,2=秒杀商品) |
| | | * @return |
| | | */ |
| | | @PostMapping("/order/getGoodsSaleNum") |
| | | R<Integer> getGoodsSaleNum(@RequestParam("goodsId") Integer goodsId, @RequestParam("type") Integer type); |
| | | |
| | | |
| | | /** |
| | | * 获取门店销售订单数量 |
| | | * @param shopId 门店id |
| | | * @param type 1:服务订单,2:单品订单 |
| | | * @return |
| | | */ |
| | | @PostMapping("/order/getShopSaleNum") |
| | | R<Integer> getShopSaleNum(@RequestParam("shopId") Integer shopId, @RequestParam("type") Integer type); |
| | | |
| | | @PostMapping("/order/getShopSaleNumByShopIds") |
| | | R<Integer> getShopSaleNumByShopIds(@RequestBody OrderSaleNum orderSaleNum); |
| | | |
| | | |
| | | /** |
| | | * 获取所有在指定门店消费的用户id |
| | | * @param shopId |
| | | * @return |
| | | */ |
| | | @PostMapping("/order/getAppUserByShoppingShop") |
| | | R<Set<Long>> getAppUserByShoppingShop(@RequestParam("shopId") Integer shopId); |
| | | |
| | | /** |
| | | * 获取指定门店的核销订单 |
| | | */ |
| | | @GetMapping("/order/getRedeemedOrdersByShop") |
| | | R<List<Order>> getRedeemedOrdersByShop(@RequestParam("shopId") Integer shopId); |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * 根据id获取订单详情 |
| | | * @param id |
| | | * @return |
| | | */ |
| | | @PostMapping("/order/getOrderById") |
| | | R<Order> getOrderById(@RequestParam("id") Long id); |
| | | |
| | | |
| | | /** |
| | | * 编辑订单详情 |
| | | * @param order |
| | | * @return |
| | | */ |
| | | @PostMapping("/order/editOrder") |
| | | R editOrder(@RequestBody Order order); |
| | | |
| | | |
| | | /** |
| | | * 获取用户订单数量 |
| | | * @param appUserId |
| | | * @return |
| | | */ |
| | | @PostMapping("/order/getOrderCountByAppUserId") |
| | | R<Long> getOrderCountByAppUserId(@RequestParam("id") Long appUserId); |
| | | } |
New file |
| | |
| | | package com.ruoyi.order.feignClient; |
| | | |
| | | |
| | | import com.ruoyi.common.core.constant.ServiceNameConstants; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.order.factory.RemoteOrderGoodsFallbackFactory; |
| | | import com.ruoyi.order.model.Order; |
| | | import com.ruoyi.order.model.OrderGood; |
| | | import com.ruoyi.order.vo.Price; |
| | | import org.springframework.cloud.openfeign.FeignClient; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | |
| | | @FeignClient(contextId = "RemoteOrderGoodsClient", value = ServiceNameConstants.ORDER_SERVICE, fallbackFactory = RemoteOrderGoodsFallbackFactory.class) |
| | | public interface RemoteOrderGoodsClient { |
| | | |
| | | /** |
| | | * 查询指定商品订单 |
| | | */ |
| | | @PostMapping("/order-good/selectGoodsOrder") |
| | | R<List<OrderGood>> goodsOrder(@RequestBody List<Long> goodsIds); |
| | | |
| | | /** |
| | | * 根据ids查找订单列表 |
| | | */ |
| | | @PostMapping("/order/getOrderListByIds") |
| | | R<List<Order>> getOrderListByIds(@RequestBody List<Long> orderIds); |
| | | |
| | | @PostMapping("/order/byUserId") |
| | | R<List<Order>> byUserId(@RequestParam("appUserId") Long appUserId,@RequestParam("shopId") Integer shopId); |
| | | @PostMapping("/order/byShopId") |
| | | R<List<Order>> byShopId(@RequestParam("shopId") Integer shopId); |
| | | @PostMapping("/order/byShopIdAndUserId") |
| | | R<List<Order>> byShopIdAndUserId(@RequestParam("appUserId") Long appUserId,@RequestParam("shopId") Integer shopId); |
| | | |
| | | |
| | | /** |
| | | * 根据用户id和商品id查找订单列表 |
| | | */ |
| | | @GetMapping("/order-good/getOrderListByUserIdAndGoodsId") |
| | | R<List<Order>> getOrderListByUserIdAndGoodsId(@RequestParam("userId") Long userId, @RequestParam("goodsId") Integer goodsId); |
| | | |
| | | /** |
| | | * 更新订单状态 |
| | | */ |
| | | @PostMapping("/order/updateOrderStatus") |
| | | R<Void> updateOrderStatus(@RequestBody Order order); |
| | | |
| | | /** |
| | | * 预约技师 |
| | | */ |
| | | @PostMapping("/order/subscribe") |
| | | R<Void> subscribe(@RequestParam(value = "id", required = false) Long id, @RequestParam(value = "technicianId", required = false) Integer technicianId); |
| | | |
| | | |
| | | |
| | | @GetMapping("/shopping-cart/getGoodsPrice") |
| | | R<Price> getGoodsPrice(@RequestParam("appUserId") Long appUserId, @RequestParam("goodsId") Integer goodsId, @RequestParam("shopId") Integer shopId); |
| | | @PostMapping("/order/getLastOrder") |
| | | R<Order> getLastOrder(@RequestParam("appUserId") Long appUserId); |
| | | |
| | | |
| | | @PostMapping("/order-good/getUnDistributedOrder") |
| | | R<List<OrderGood>> getUnDistributedOrder(@RequestBody List<Long> appUserIds); |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.order.model; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * <p> |
| | | * |
| | | * </p> |
| | | * |
| | | * @author luodangjia |
| | | * @since 2024-11-21 |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = false) |
| | | @TableName("t_order") |
| | | @ApiModel(value="Order对象", description="") |
| | | public class Order implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @TableId("id") |
| | | private Long id; |
| | | |
| | | @ApiModelProperty(value = "用户id") |
| | | @TableField("app_user_id") |
| | | private Long appUserId; |
| | | |
| | | @ApiModelProperty(value = "订单类型1服务单2商品") |
| | | @TableField("order_type") |
| | | private Integer orderType; |
| | | |
| | | @ApiModelProperty(value = "1待发货2待收货3待使用4已完成5已取消6已退款7售后中8已评价") |
| | | @TableField("order_status") |
| | | private Integer orderStatus; |
| | | |
| | | @ApiModelProperty(value = "1待发货2待收货3待使用4已完成5已取消6已退款7售后中8已评价") |
| | | @TableField("old_order_status") |
| | | private Integer oldOrderStatus; |
| | | |
| | | @ApiModelProperty(value = "是否已分佣: 0-否 1-普通已拥,2-门店已分佣") |
| | | @TableField("is_commission") |
| | | private Integer isCommission; |
| | | |
| | | @ApiModelProperty(value = "核销时间") |
| | | @TableField("end_time") |
| | | private LocalDateTime endTime; |
| | | |
| | | @ApiModelProperty(value = "核销人id") |
| | | @TableField("canceller_app_user_id") |
| | | private Long cancellerAppUserId; |
| | | |
| | | @ApiModelProperty(value = "售后截止日期") |
| | | @TableField("after_sale_time") |
| | | private LocalDateTime afterSaleTime; |
| | | |
| | | @ApiModelProperty(value = "技师id") |
| | | @TableField("technician_id") |
| | | private Integer technicianId; |
| | | |
| | | @ApiModelProperty(value = "订单编号") |
| | | @TableField("order_number") |
| | | private String orderNumber; |
| | | |
| | | @ApiModelProperty(value = "商品数量") |
| | | @TableField("num") |
| | | private Integer num; |
| | | |
| | | @ApiModelProperty(value = "商品封面(多张逗号隔开,最多三张))") |
| | | @TableField("good_pics") |
| | | private String goodPics; |
| | | |
| | | @ApiModelProperty(value = "商品名称(多个名称逗号隔开))") |
| | | @TableField("good_name") |
| | | private String goodName; |
| | | |
| | | @ApiModelProperty(value = "订单总金额") |
| | | @TableField("total_amount") |
| | | private BigDecimal totalAmount; |
| | | |
| | | @ApiModelProperty(value = "满减金额") |
| | | @TableField("full_reduction_amount") |
| | | private BigDecimal fullReductionAmount; |
| | | |
| | | @ApiModelProperty(value = "代金券抵扣金额") |
| | | @TableField("money_amount") |
| | | private BigDecimal moneyAmount; |
| | | |
| | | @ApiModelProperty(value = "折扣券抵扣金额") |
| | | @TableField("discount_amount") |
| | | private BigDecimal discountAmount; |
| | | |
| | | @ApiModelProperty(value = "商品券抵扣总金额") |
| | | @TableField("good_amount") |
| | | private BigDecimal goodAmount; |
| | | |
| | | @ApiModelProperty(value = "用户优惠券id") |
| | | @TableField("user_coupon_id") |
| | | private Long userCouponId; |
| | | |
| | | @ApiModelProperty(value = "活动优惠金额") |
| | | @TableField("activity_amount") |
| | | private BigDecimal activityAmount; |
| | | |
| | | @ApiModelProperty(value = "优惠总金额") |
| | | @TableField("discount_total_amount") |
| | | private BigDecimal discountTotalAmount; |
| | | |
| | | @ApiModelProperty(value = "实际支付价格") |
| | | @TableField("payment_amount") |
| | | private BigDecimal paymentAmount; |
| | | |
| | | @ApiModelProperty(value = "使用积分") |
| | | @TableField("point") |
| | | private Integer point; |
| | | |
| | | @ApiModelProperty(value = "1微信,2账户余额,3积分") |
| | | @TableField("pay_method") |
| | | private Integer payMethod; |
| | | |
| | | @ApiModelProperty(value = "使用的优惠劵json") |
| | | @TableField("coupon_json") |
| | | private String couponJson; |
| | | |
| | | @ApiModelProperty(value = "订单优惠活动的json快照") |
| | | @TableField("activity_json") |
| | | private String activityJson; |
| | | |
| | | @ApiModelProperty(value = "运费") |
| | | @TableField("express_amount") |
| | | private BigDecimal expressAmount; |
| | | |
| | | @ApiModelProperty(value = "1微信,2账户余额") |
| | | @TableField("express_pay_method") |
| | | private Integer expressPayMethod; |
| | | |
| | | @ApiModelProperty(value = "配送方式(1=自提,2=快递)") |
| | | @TableField("distribution_mode") |
| | | private Integer distributionMode; |
| | | |
| | | @ApiModelProperty(value = "第三方快递信息") |
| | | @TableField("express_json") |
| | | private String expressJson; |
| | | |
| | | @ApiModelProperty(value = "第三方快递结果") |
| | | @TableField("express_result") |
| | | private String expressResult; |
| | | |
| | | @ApiModelProperty(value = "发货省") |
| | | @TableField("deliver_province") |
| | | private String deliverProvince; |
| | | |
| | | @ApiModelProperty(value = "发货省编号") |
| | | @TableField("deliver_province_code") |
| | | private String deliverProvinceCode; |
| | | |
| | | @ApiModelProperty(value = "发货市") |
| | | @TableField("deliver_city") |
| | | private String deliverCity; |
| | | |
| | | @ApiModelProperty(value = "发货市编号") |
| | | @TableField("deliver_city_code") |
| | | private String deliverCityCode; |
| | | |
| | | @ApiModelProperty(value = "发货区") |
| | | @TableField("deliver_district") |
| | | private String deliverDistrict; |
| | | |
| | | @ApiModelProperty(value = "发货区编号") |
| | | @TableField("deliver_district_code") |
| | | private String deliverDistrictCode; |
| | | |
| | | @ApiModelProperty(value = "收货地址信息") |
| | | @TableField("address_json") |
| | | private String addressJson; |
| | | |
| | | @ApiModelProperty(value = "平台分佣") |
| | | @TableField("share_amount") |
| | | private BigDecimal shareAmount; |
| | | |
| | | @ApiModelProperty(value = "本单获取的积分") |
| | | @TableField("get_point") |
| | | private Integer getPoint; |
| | | |
| | | @ApiModelProperty(value = "微信支付号") |
| | | @TableField("serial_number") |
| | | private String serialNumber; |
| | | |
| | | @ApiModelProperty(value = "1待支付2已支付") |
| | | @TableField("pay_status") |
| | | private Integer payStatus; |
| | | |
| | | @ApiModelProperty(value = "对应门店id") |
| | | @TableField("shop_id") |
| | | private Integer shopId; |
| | | |
| | | @ApiModelProperty(value = "删除标志(0=否,1=是)") |
| | | @TableField("del_flag") |
| | | private Integer delFlag; |
| | | |
| | | @ApiModelProperty(value = "添加时间") |
| | | @TableField("create_time") |
| | | private LocalDateTime createTime; |
| | | |
| | | @ApiModelProperty(value = "预计提货时间") |
| | | @TableField("expected_delivery_time") |
| | | private String expectedDeliveryTime; |
| | | |
| | | @ApiModelProperty("退款状态(1=退款中,2=已退款)") |
| | | @TableField("refund_status") |
| | | private Integer refundStatus; |
| | | |
| | | @ApiModelProperty("退款流水号") |
| | | @TableField("refund_code") |
| | | private String refundCode; |
| | | |
| | | @ApiModelProperty("退款时间") |
| | | @TableField("refund_time") |
| | | private LocalDateTime refundTime; |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.order.model; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * <p> |
| | | * |
| | | * </p> |
| | | * |
| | | * @author luodangjia |
| | | * @since 2024-11-21 |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = false) |
| | | @TableName("t_order_good") |
| | | @ApiModel(value="OrderGood对象", description="") |
| | | public class OrderGood implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | private Long id; |
| | | |
| | | @ApiModelProperty(value = "商品id") |
| | | @TableField("goods_id") |
| | | private Integer goodsId; |
| | | |
| | | @ApiModelProperty(value = "订单id") |
| | | @TableField("order_id") |
| | | private Long orderId; |
| | | |
| | | @ApiModelProperty(value = "商品券优惠金额") |
| | | @TableField("good_amount") |
| | | private BigDecimal goodsCouponAmount; |
| | | |
| | | @ApiModelProperty(value = "购买商品的json快照") |
| | | @TableField("good_json") |
| | | private String goodJson; |
| | | |
| | | @ApiModelProperty(value = "秒杀活动json快照") |
| | | @TableField("seckill_json") |
| | | private String seckillJson; |
| | | |
| | | @ApiModelProperty(value = "数量") |
| | | @TableField("num") |
| | | private Integer num; |
| | | |
| | | @ApiModelProperty(value = "删除标志(0=否,1=是)") |
| | | @TableField("del_flag") |
| | | private Integer delFlag; |
| | | |
| | | @ApiModelProperty(value = "添加时间") |
| | | @TableField("create_time") |
| | | private LocalDateTime createTime; |
| | | |
| | | @ApiModelProperty(value = "可获得消费积分") |
| | | @TableField("earn_spending_points") |
| | | private Integer earnSpendingPoints; |
| | | |
| | | @ApiModelProperty(value = "上级获得分佣金额") |
| | | @TableField("superior_subcommission") |
| | | private BigDecimal superiorSubcommission; |
| | | |
| | | @ApiModelProperty(value = "上级获得返佣积分") |
| | | @TableField("superior_rebate_points") |
| | | private Integer superiorRebatePoints; |
| | | |
| | | @ApiModelProperty(value = "获取返佣积分上级类型(1=直推上级,2=直帮上级)") |
| | | @TableField("superior_type") |
| | | private String superiorType; |
| | | |
| | | @ApiModelProperty(value = "获取分佣金额上级类型(1=直推上级,2=直帮上级)") |
| | | @TableField("superior_price_type") |
| | | private String superiorPriceType; |
| | | |
| | | @ApiModelProperty(value = "核销门店可获得服务费") |
| | | @TableField("servuce_shop_charges") |
| | | private BigDecimal servuceShopCharges; |
| | | |
| | | @ApiModelProperty(value = "核销门店可获得服务积分") |
| | | @TableField("servuce_shop_points") |
| | | private Integer servuceShopPoints; |
| | | |
| | | @ApiModelProperty(value = "技师可获得服务积分") |
| | | @TableField("technician_points") |
| | | private Integer technicianPoints; |
| | | |
| | | @ApiModelProperty(value = "绑定门店可获得分佣金额") |
| | | @TableField("bound_shop_charges") |
| | | private BigDecimal boundShopCharges; |
| | | |
| | | @ApiModelProperty(value = "绑定门店可获得返佣积分") |
| | | @TableField("bound_shop_points") |
| | | private Integer boundShopPoints; |
| | | |
| | | @ApiModelProperty(value = "绑定门店上级门店可获得分佣金额") |
| | | @TableField("bound_shop_superiors_charges") |
| | | private BigDecimal boundShopSuperiorsCharges; |
| | | |
| | | @ApiModelProperty(value = "绑定门店上级门店可获得返佣积分") |
| | | @TableField("bound_shop_superiors_points") |
| | | private Integer boundShopSuperiorsPoints; |
| | | @ApiModelProperty("购买类型(1=普通商品,2=秒杀商品)") |
| | | @TableField("type") |
| | | private Integer type; |
| | | |
| | | @ApiModelProperty(value = "现金支付(0=否,1=是)") |
| | | @TableField("cash_payment") |
| | | private Integer cashPayment; |
| | | |
| | | @ApiModelProperty(value = "积分支付(0=否,1=是)") |
| | | @TableField("point_payment") |
| | | private Integer pointPayment; |
| | | |
| | | @ApiModelProperty(value = "基础售价") |
| | | @TableField("selling_price") |
| | | private BigDecimal sellingPrice; |
| | | |
| | | @ApiModelProperty(value = "基础积分") |
| | | @TableField("integral") |
| | | private Integer integral; |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.order.vo; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/12/6 18:30 |
| | | */ |
| | | @Data |
| | | @ApiModel |
| | | public class ApplyRefundPass { |
| | | @ApiModelProperty(value = "订单id", required = true) |
| | | private Long id; |
| | | @ApiModelProperty(value = "售后类型(1=退货退款,2=仅退款)", required = true) |
| | | private Integer refundMethod; |
| | | @ApiModelProperty(value = "申请原因", required = true) |
| | | private String refundReason; |
| | | @ApiModelProperty(value = "备注", required = true) |
| | | private String userRemark; |
| | | @ApiModelProperty(value = "图片地址,多个逗号分隔", required = true) |
| | | private String pics; |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.order.vo; |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Data |
| | | @ApiModel(value = "ChargingOrderListInfoVO对象",description = "充电时段统计列表查看详情VO") |
| | | public class ChargingOrderListInfoVO { |
| | | @ApiModelProperty(value = "订单编号") |
| | | private String code; |
| | | @ApiModelProperty(value = "电站名称") |
| | | private String siteName; |
| | | @ApiModelProperty(value = "电站地址") |
| | | private String siteAddress; |
| | | @ApiModelProperty(value = "终端编号") |
| | | private String gunCode; |
| | | @ApiModelProperty(value = "充电终端名称 桩+枪") |
| | | private String terminalName; |
| | | @ApiModelProperty(value = "结束原因 (0=异常终止,1=主动终止,2=满电终止,3=费用不足终止)") |
| | | private Integer endMode; |
| | | @ApiModelProperty(value = "状态(-1=启动失败,取消订单,0=未知,1=等待中,2=启动中,3=充电中,4=停止中,5=已结束)") |
| | | private Integer status; |
| | | @ApiModelProperty(value = "开始soc") |
| | | private String startSoc; |
| | | @ApiModelProperty(value = "结束soc") |
| | | private String endSoc; |
| | | @ApiModelProperty(value = "充电电流 度") |
| | | private BigDecimal chargingCapacity; |
| | | @ApiModelProperty(value = "电站id") |
| | | private Integer siteId; |
| | | @ApiModelProperty(value = "充电桩id") |
| | | private Integer chargingPileId; |
| | | @ApiModelProperty(value = "用户id") |
| | | private Long appUserId; |
| | | @ApiModelProperty(value = "用户车辆id") |
| | | private Long appUserCarId; |
| | | @ApiModelProperty(value = "充电枪id") |
| | | private Integer chargingGunId; |
| | | @ApiModelProperty(value = "订单类型(1=充电订单(小程序),2=充电订单(刷卡))") |
| | | private String orderType; |
| | | @ApiModelProperty(value = "充电时间 秒") |
| | | private String chargingSecond; |
| | | @ApiModelProperty(value = "车牌号") |
| | | private String licensePlate; |
| | | @ApiModelProperty(value = "客户手机号") |
| | | private String phone; |
| | | @ApiModelProperty(value = "充电到账金额") |
| | | private BigDecimal paymentAmount; |
| | | @ApiModelProperty(value = "累计电费") |
| | | private BigDecimal electrovalence; |
| | | @ApiModelProperty(value = "累计服务费") |
| | | private BigDecimal serviceCharge; |
| | | @ApiModelProperty(value = "充电费用(电费加服务费)") |
| | | private BigDecimal total; |
| | | @ApiModelProperty(value = "实收(电费加服务费)-优惠券抵扣 -会员抵扣 - 第三方平台分佣 -平台手续费") |
| | | private BigDecimal realTotal; |
| | | |
| | | @ApiModelProperty(value = "开始时间") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private LocalDateTime startTime; |
| | | @ApiModelProperty(value = "结束时间") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private LocalDateTime endTime; |
| | | @ApiModelProperty(value = "订单id") |
| | | private Long id; |
| | | @ApiModelProperty(value = "订单uid") |
| | | private String uid; |
| | | @ApiModelProperty(value = "费用明细-优惠券优惠金额") |
| | | private BigDecimal couponDiscountAmount; |
| | | @ApiModelProperty(value = "费用明细-会员优惠金额") |
| | | private BigDecimal vipDiscountAmount; |
| | | @ApiModelProperty(value = "费用明细-平台分佣") |
| | | private BigDecimal sharingAmount; |
| | | @ApiModelProperty(value = "费用明细-手续费") |
| | | private BigDecimal commissionAmount; |
| | | } |
New file |
| | |
| | | package com.ruoyi.order.vo; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/11/25 12:12 |
| | | */ |
| | | @Data |
| | | @ApiModel |
| | | public class ConfirmOrder { |
| | | @ApiModelProperty(value = "购买方式(1=购物车,2=商品详情)", required = true) |
| | | private Integer position; |
| | | @ApiModelProperty(value = "购物车数据id,数量 JSON[{id:1212,num:2,type:1}]", required = true, notes = "type值取值范围(1=普通商品,2=秒杀商品)") |
| | | private String goodsJson; |
| | | @ApiModelProperty(value = "支付方式(1=现金,2=积分)", required = true) |
| | | private Integer paymentType; |
| | | @ApiModelProperty(value = "核销门店id", required = true) |
| | | private Integer shopId; |
| | | @ApiModelProperty(value = "商品类型(1=服务商品,2=单品商品)", required = true) |
| | | private Integer type; |
| | | @ApiModelProperty("优惠券id") |
| | | private Long couponId; |
| | | } |
New file |
| | |
| | | package com.ruoyi.order.vo; |
| | | |
| | | import com.ruoyi.account.api.vo.PaymentUserCouponVo; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/11/25 14:05 |
| | | */ |
| | | @Data |
| | | @ApiModel |
| | | public class ConfirmOrderVo { |
| | | @ApiModelProperty("商品列表") |
| | | private List<MyShoppingCartVo> goodsList; |
| | | @ApiModelProperty("核销门店") |
| | | private String shopName; |
| | | @ApiModelProperty("核销门店id") |
| | | private Integer shopId; |
| | | @ApiModelProperty("订单金额") |
| | | private BigDecimal orderMoney; |
| | | @ApiModelProperty("优惠活动") |
| | | private String activityName; |
| | | @ApiModelProperty("优惠金额") |
| | | private BigDecimal discountAmount; |
| | | @ApiModelProperty("获得积分") |
| | | private Integer earnPoint; |
| | | @ApiModelProperty("支付金额") |
| | | private BigDecimal payMoney; |
| | | @ApiModelProperty("订单总积分") |
| | | private Integer orderPoint; |
| | | @ApiModelProperty("剩余积分") |
| | | private Integer residualPoint; |
| | | @ApiModelProperty("快递费") |
| | | private BigDecimal expressFee; |
| | | @ApiModelProperty("支付方式(1=现金,2=积分)") |
| | | private Integer paymentType; |
| | | @ApiModelProperty("活动是否可以和优惠券同时使用") |
| | | private Boolean useSimultaneously; |
| | | @ApiModelProperty("优惠券列表") |
| | | private List<PaymentUserCouponVo> coupon; |
| | | } |
New file |
| | |
| | | package com.ruoyi.order.vo; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/10/12 9:20 |
| | | */ |
| | | @Data |
| | | @ApiModel |
| | | public class EndOfChargePageInfo { |
| | | @ApiModelProperty("订单id") |
| | | private String id; |
| | | @ApiModelProperty("充电金额") |
| | | private BigDecimal paymentAmount; |
| | | @ApiModelProperty("优惠金额") |
| | | private BigDecimal couponDiscountAmount; |
| | | @ApiModelProperty("积分") |
| | | private Integer integral; |
| | | @ApiModelProperty("订单编号") |
| | | private String code; |
| | | @ApiModelProperty("预充金额") |
| | | private BigDecimal rechargeAmount; |
| | | @ApiModelProperty("退还金额") |
| | | private BigDecimal refundAmount; |
| | | @ApiModelProperty("开始日期") |
| | | private String startDay; |
| | | @ApiModelProperty("开始时间") |
| | | private String startHour; |
| | | @ApiModelProperty("结束日期") |
| | | private String endDay; |
| | | @ApiModelProperty("结束时间") |
| | | private String endHour; |
| | | @ApiModelProperty("充电时长") |
| | | private String duration; |
| | | } |
New file |
| | |
| | | package com.ruoyi.order.vo; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/11/25 11:51 |
| | | */ |
| | | @Data |
| | | @ApiModel("购物车") |
| | | public class MyShoppingCartVo { |
| | | @ApiModelProperty("数据id") |
| | | private String id; |
| | | @ApiModelProperty("购买类型(1=普通商品,2=秒杀商品)") |
| | | private Integer type; |
| | | @ApiModelProperty("商品id") |
| | | private Integer goodsId; |
| | | @ApiModelProperty("封面图") |
| | | private String homePicture; |
| | | @ApiModelProperty("商品名称") |
| | | private String name; |
| | | @ApiModelProperty("售价现金") |
| | | private BigDecimal cash; |
| | | @ApiModelProperty("售价积分") |
| | | private Integer point; |
| | | @ApiModelProperty("原价") |
| | | private String originalPrice; |
| | | @ApiModelProperty("购买数量") |
| | | private Integer number; |
| | | @ApiModelProperty("结束时间") |
| | | private Long endTime; |
| | | @ApiModelProperty("是否可核销(0=否,1=是)") |
| | | private Boolean verifiable; |
| | | @ApiModelProperty("是否超出限购数量") |
| | | private Boolean purchaseLimit; |
| | | @ApiModelProperty("限购数量") |
| | | private Integer purchaseLimitNum; |
| | | @ApiModelProperty("现金支付") |
| | | private Boolean cashPayment; |
| | | @ApiModelProperty("积分支付") |
| | | private Boolean pointPayment; |
| | | @ApiModelProperty("配送方式(1=自提,2=快递)") |
| | | private String distributionMode; |
| | | /** |
| | | * 可获得消费积分 |
| | | */ |
| | | private Integer earnSpendingPoints; |
| | | /** |
| | | * 上级获得分佣金额 |
| | | */ |
| | | private BigDecimal superiorSubcommission; |
| | | /** |
| | | * 上级获得返佣积分 |
| | | */ |
| | | private Integer superiorRebatePoints; |
| | | /** |
| | | * 获取返佣积分上级类型(1=直推上级,2=直帮上级) |
| | | */ |
| | | private String superiorType; |
| | | /** |
| | | * 获取返佣积分上级类型(1=直推上级,2=直帮上级) |
| | | */ |
| | | private String superiorPriceType; |
| | | /** |
| | | * 核销门店可获得服务费 |
| | | */ |
| | | private BigDecimal servuceShopCharges; |
| | | /** |
| | | * 核销门店可获得服务积分 |
| | | */ |
| | | private Integer servuceShopPoints; |
| | | /** |
| | | * 技师可获得服务积分 |
| | | */ |
| | | private Integer technicianPoints; |
| | | /** |
| | | * 绑定门店可获得分佣金额 |
| | | */ |
| | | private BigDecimal boundShopCharges; |
| | | /** |
| | | * 绑定门店可获得返佣积分 |
| | | */ |
| | | private Integer boundShopPoints; |
| | | /** |
| | | * 绑定门店上级门店可获得分佣金额 |
| | | */ |
| | | private BigDecimal boundShopSuperiorsCharges; |
| | | /** |
| | | * 绑定门店上级门店可获得返佣积分 |
| | | */ |
| | | private Integer boundShopSuperiorsPoints; |
| | | } |
New file |
| | |
| | | package com.ruoyi.order.vo; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | @Data |
| | | @ApiModel(value = "订单明细") |
| | | public class OrderDetailVO { |
| | | @ApiModelProperty(value = "订单id") |
| | | private Long id; |
| | | |
| | | @ApiModelProperty(value = "订单状态") |
| | | private Integer orderStatus; |
| | | |
| | | @ApiModelProperty(value = "订单商品") |
| | | private List<OrderGoodsVO> goodsList; |
| | | |
| | | @ApiModelProperty(value = "使用积分") |
| | | private Integer point; |
| | | |
| | | @ApiModelProperty(value = "收货地址id") |
| | | private Long addressId; |
| | | |
| | | @ApiModelProperty(value = "收货联系人") |
| | | private String recieveName; |
| | | |
| | | @ApiModelProperty(value = "收货联系电话") |
| | | private String recievePhone; |
| | | |
| | | @ApiModelProperty(value = "收货地址") |
| | | private String recieveAddress; |
| | | |
| | | @ApiModelProperty(value = "订单编号") |
| | | private String orderNumber; |
| | | |
| | | @ApiModelProperty("下单时间") |
| | | private LocalDateTime createTime; |
| | | |
| | | @ApiModelProperty(value = "订单总金额") |
| | | private BigDecimal totalAmount; |
| | | |
| | | @ApiModelProperty(value = "优惠券名称") |
| | | private String couponName; |
| | | |
| | | @ApiModelProperty(value = "参与活动名称") |
| | | private String activityName; |
| | | |
| | | @ApiModelProperty(value = "抵扣金额") |
| | | private BigDecimal couponAmount; |
| | | |
| | | @ApiModelProperty(value = "快递费") |
| | | private BigDecimal expressAmount; |
| | | |
| | | @ApiModelProperty(value = "可获得积分") |
| | | private Integer pointAmount; |
| | | |
| | | @ApiModelProperty(value = "实际支付价格") |
| | | private BigDecimal paymentAmount; |
| | | |
| | | @ApiModelProperty(value = "配送方式(1=自提,2=快递)") |
| | | private Integer distributionMode; |
| | | |
| | | @ApiModelProperty(value = "门店名称") |
| | | private String shopName; |
| | | |
| | | @ApiModelProperty(value = "门店地址") |
| | | private String shopAddress; |
| | | |
| | | @ApiModelProperty(value = "经度") |
| | | private String longitude; |
| | | |
| | | @ApiModelProperty(value = "纬度") |
| | | private String latitude; |
| | | |
| | | @ApiModelProperty(value = "门店id") |
| | | private Integer shopId; |
| | | |
| | | @ApiModelProperty(value = "技师名称") |
| | | private String technicianName; |
| | | |
| | | @ApiModelProperty(value = "技师id") |
| | | private Integer technicianId; |
| | | |
| | | @ApiModelProperty(value = "预约单id") |
| | | private String technicianSubscribeId; |
| | | |
| | | @ApiModelProperty("核销码BASE64") |
| | | private String writeOffCode; |
| | | |
| | | @ApiModelProperty("最新快递信息") |
| | | private String express; |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.order.vo; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Data |
| | | @ApiModel(value = "订单商品") |
| | | public class OrderGoodsVO { |
| | | @ApiModelProperty(value = "商品id") |
| | | private Integer goodsId; |
| | | |
| | | @ApiModelProperty(value = "商品名称") |
| | | private String goodsName; |
| | | |
| | | @ApiModelProperty(value = "类型(1=服务商品,2=单品商品)") |
| | | private Integer type; |
| | | |
| | | @ApiModelProperty(value = "数量") |
| | | private Integer num; |
| | | |
| | | @ApiModelProperty(value = "商品图片") |
| | | private String goodsPic; |
| | | |
| | | @ApiModelProperty(value = "基础售价") |
| | | private BigDecimal sellingPrice; |
| | | |
| | | @ApiModelProperty(value = "积分") |
| | | private Integer integral; |
| | | |
| | | @ApiModelProperty(value = "划线价") |
| | | private BigDecimal originalPrice; |
| | | } |
New file |
| | |
| | | package com.ruoyi.order.vo; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | @Data |
| | | public class OrderSaleNum { |
| | | private List<Integer> shopIds; |
| | | private Integer type; |
| | | } |
New file |
| | |
| | | package com.ruoyi.order.vo; |
| | | |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Data |
| | | public class OrderVO { |
| | | @ApiModelProperty(value = "订单id") |
| | | private String id; |
| | | |
| | | @ApiModelProperty(value = "订单编号") |
| | | private String orderNumber; |
| | | |
| | | @ApiModelProperty(value = "1待发货2待收货3待使用4已完成待评论5已取消6已退款7售后中8已完成已评论") |
| | | private Integer orderStatus; |
| | | |
| | | @ApiModelProperty(value = "商品封面(多张逗号隔开,最多三张))") |
| | | private String goodPics; |
| | | |
| | | @ApiModelProperty(value = "商品名称(多个名称逗号隔开))") |
| | | private String goodName; |
| | | |
| | | @ApiModelProperty(value = "商品数量") |
| | | private Integer num; |
| | | |
| | | @ApiModelProperty(value = "使用积分") |
| | | private BigDecimal point; |
| | | |
| | | @ApiModelProperty(value = "实际支付价格") |
| | | private BigDecimal paymentAmount; |
| | | |
| | | @ApiModelProperty(value = "快递费") |
| | | private BigDecimal expressAmount; |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.order.vo; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Data |
| | | public class Price { |
| | | /** |
| | | * 现金 |
| | | */ |
| | | private BigDecimal cash; |
| | | /** |
| | | * 积分 |
| | | */ |
| | | private Integer point; |
| | | /** |
| | | * 获取结束时间 |
| | | */ |
| | | private Long endTime; |
| | | /** |
| | | * 现金支付 |
| | | */ |
| | | private Boolean cashPayment; |
| | | /** |
| | | * 积分支付 |
| | | */ |
| | | private Boolean pointPayment; |
| | | /** |
| | | * 可获得消费积分 |
| | | */ |
| | | private Integer earnSpendingPoints; |
| | | /** |
| | | * 上级获得分佣金额 |
| | | */ |
| | | private BigDecimal superiorSubcommission; |
| | | /** |
| | | * 上级获得返佣积分 |
| | | */ |
| | | private Integer superiorRebatePoints; |
| | | /** |
| | | * 获取返佣积分上级类型(1=直推上级,2=直帮上级) |
| | | */ |
| | | private String superiorType; |
| | | /** |
| | | * 获取分佣金额上级类型(1=直推上级,2=直帮上级) |
| | | */ |
| | | private String superiorPriceType; |
| | | /** |
| | | * 核销门店可获得服务费 |
| | | */ |
| | | private BigDecimal servuceShopCharges; |
| | | /** |
| | | * 核销门店可获得服务积分 |
| | | */ |
| | | private Integer servuceShopPoints; |
| | | /** |
| | | * 技师可获得服务积分 |
| | | */ |
| | | private Integer technicianPoints; |
| | | /** |
| | | * 绑定门店可获得分佣金额 |
| | | */ |
| | | private BigDecimal boundShopCharges; |
| | | /** |
| | | * 绑定门店可获得返佣积分 |
| | | */ |
| | | private Integer boundShopPoints; |
| | | /** |
| | | * 绑定门店上级门店可获得分佣金额 |
| | | */ |
| | | private BigDecimal boundShopSuperiorsCharges; |
| | | /** |
| | | * 绑定门店上级门店可获得返佣积分 |
| | | */ |
| | | private Integer boundShopSuperiorsPoints; |
| | | } |
New file |
| | |
| | | package com.ruoyi.order.vo; |
| | | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/10/10 11:40 |
| | | */ |
| | | @Data |
| | | public class ReplyEvaluationVO { |
| | | private Long id; |
| | | private String reply; |
| | | } |
New file |
| | |
| | | package com.ruoyi.order.vo; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/11/25 12:04 |
| | | */ |
| | | @Data |
| | | @ApiModel |
| | | public class SetGoodsNumber { |
| | | @ApiModelProperty(value = "购物车数据id", required = true) |
| | | private Long id; |
| | | @ApiModelProperty(value = "修改数量", required = true) |
| | | private Integer number; |
| | | } |
New file |
| | |
| | | package com.ruoyi.order.vo; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/11/25 14:33 |
| | | */ |
| | | @Data |
| | | @ApiModel |
| | | public class ShoppingCartPayment { |
| | | @ApiModelProperty(value = "购物车数据id,数量 JSON[{id:1212,num:2,type:1}]", required = true) |
| | | private String goodsJson; |
| | | @ApiModelProperty(value = "支付方式(1=微信,2=账户余额,3=积分)", required = true) |
| | | private Integer paymentType; |
| | | @ApiModelProperty(value = "运费支付方式(1=微信,2=账户余额)", required = true) |
| | | private Integer freightPaymentType; |
| | | @ApiModelProperty(value = "核销门店id", required = true) |
| | | private Integer shopId; |
| | | @ApiModelProperty(value = "优惠券id", required = false) |
| | | private Long userCouponId; |
| | | @ApiModelProperty(value = "配送方式(1=自提,2=快递)", required = false) |
| | | private Integer distributionMode; |
| | | @ApiModelProperty(value = "配送地址id", required = false) |
| | | private Long userAddressId; |
| | | @ApiModelProperty(value = "预计提货时间", required = false) |
| | | private String expectedDeliveryTime; |
| | | } |
New file |
| | |
| | | package com.ruoyi.order.vo; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/11/25 12:08 |
| | | */ |
| | | @Data |
| | | @ApiModel |
| | | public class VerifiableShopVo { |
| | | @ApiModelProperty("门店id") |
| | | private Integer id; |
| | | @ApiModelProperty("门店名称") |
| | | private String name; |
| | | @ApiModelProperty("距离") |
| | | private Long distance; |
| | | @ApiModelProperty("地址") |
| | | private String address; |
| | | @ApiModelProperty("图片") |
| | | private String homePicture; |
| | | |
| | | } |
New file |
| | |
| | | com.ruoyi.order.factory.RemoteOrderGoodsFallbackFactory |
| | | com.ruoyi.order.factory.OrderClientFallbackFactory |
New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| | | xmlns="http://maven.apache.org/POM/4.0.0" |
| | | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| | | <parent> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-api</artifactId> |
| | | <version>3.6.2</version> |
| | | </parent> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | |
| | | <artifactId>ruoyi-api-other</artifactId> |
| | | |
| | | <description> |
| | | ruoyi-api-other基础接口模块 |
| | | </description> |
| | | |
| | | <dependencies> |
| | | |
| | | <!-- RuoYi Common Core--> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-common-core</artifactId> |
| | | <exclusions> |
| | | <exclusion> |
| | | <groupId>com.github.pagehelper</groupId> |
| | | <artifactId>pagehelper-spring-boot-starter</artifactId> |
| | | </exclusion> |
| | | </exclusions> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-api-account</artifactId> |
| | | </dependency> |
| | | </dependencies> |
| | | |
| | | </project> |
New file |
| | |
| | | package com.ruoyi.other.api.domain; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | import java.io.Serializable; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * <p> |
| | | * |
| | | * </p> |
| | | * |
| | | * @author luodangjia |
| | | * @since 2024-11-20 |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = false) |
| | | @TableName("t_agreement") |
| | | @ApiModel(value="Agreement对象", description="") |
| | | public class Agreement implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @ApiModelProperty(value = "主键") |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | private Integer id; |
| | | |
| | | @ApiModelProperty(value = "类型(1=用户协议,2=隐私协议,3=技师上门免责声明,4=注销协议,5门店提现免责声明)") |
| | | @TableField("type") |
| | | private Integer type; |
| | | |
| | | @ApiModelProperty(value = "内容") |
| | | @TableField("content") |
| | | private String content; |
| | | |
| | | @ApiModelProperty(value = "添加时间") |
| | | @TableField("create_time") |
| | | private LocalDateTime createTime; |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.domain; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | import java.io.Serializable; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * <p> |
| | | * |
| | | * </p> |
| | | * |
| | | * @author luodangjia |
| | | * @since 2024-11-20 |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = false) |
| | | @TableName("t_banner") |
| | | @ApiModel(value="Banner对象", description="") |
| | | public class Banner implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @ApiModelProperty(value = "主键") |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | private Integer id; |
| | | |
| | | @ApiModelProperty(value = "位置(1=首页,2=商城首页)") |
| | | @TableField("position") |
| | | private Integer position; |
| | | |
| | | @ApiModelProperty(value = "名称") |
| | | @TableField("name") |
| | | private String name; |
| | | |
| | | @ApiModelProperty(value = "1图片2视频") |
| | | @TableField("content_type") |
| | | private Integer contentType; |
| | | |
| | | @ApiModelProperty(value = "跳转类型(1=无跳转,2=外部链接,3=商品详情,4=秒杀商品详情,5=领券中心)") |
| | | @TableField("jump_type") |
| | | private Integer jumpType; |
| | | |
| | | @ApiModelProperty(value = "跳转内容") |
| | | @TableField("content") |
| | | private String content; |
| | | |
| | | @ApiModelProperty(value = "图片地址") |
| | | @TableField("image_url") |
| | | private String imageUrl; |
| | | |
| | | @ApiModelProperty(value = "视频地址") |
| | | @TableField("video_url") |
| | | private String videoUrl; |
| | | |
| | | @ApiModelProperty(value = "删除标识(0=否,1=是)") |
| | | @TableField("del_flag") |
| | | private Integer delFlag; |
| | | |
| | | @ApiModelProperty(value = "添加时间") |
| | | @TableField("create_time") |
| | | private LocalDateTime createTime; |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.domain; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * <p> |
| | | * |
| | | * </p> |
| | | * |
| | | * @author luodangjia |
| | | * @since 2024-11-20 |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = false) |
| | | @TableName("t_base_setting") |
| | | @ApiModel(value="BaseSetting对象", description="") |
| | | public class BaseSetting implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @ApiModelProperty(value = "1:合伙人积分设置一 2:合伙人积分设置二 3:会员说明设置 4:活动管理-活动设置 1开0关 5:售后设置 6:充值设置") |
| | | @TableId("id") |
| | | private Integer id; |
| | | |
| | | @ApiModelProperty(value = "内容") |
| | | @TableField("content") |
| | | private String content; |
| | | |
| | | @ApiModelProperty("是否可提现(0=否,1=是)") |
| | | |
| | | private Integer withdraw; |
| | | |
| | | @ApiModelProperty("最低提现金额") |
| | | @TableField("withdrawalMinAmount") |
| | | private BigDecimal withdrawalMinAmount; |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.domain; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import com.ruoyi.common.core.web.page.BasePage; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * <p> |
| | | * |
| | | * </p> |
| | | * |
| | | * @author luodangjia |
| | | * @since 2024-11-20 |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = false) |
| | | @TableName("t_goods") |
| | | @ApiModel(value="Goods对象", description="") |
| | | public class Goods extends BasePage implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @ApiModelProperty(value = "主键") |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | private Integer id; |
| | | |
| | | @ApiModelProperty(value = "名称") |
| | | @TableField("name") |
| | | private String name; |
| | | |
| | | @ApiModelProperty(value = "分类id") |
| | | @TableField("goods_category_id") |
| | | private Integer goodsCategoryId; |
| | | |
| | | @ApiModelProperty(value = "类型(1=服务商品,2=单品商品)") |
| | | @TableField("type") |
| | | private Integer type; |
| | | |
| | | @ApiModelProperty(value = "限购数量(-1不限购)") |
| | | @TableField("purchase_limit") |
| | | private Integer purchaseLimit; |
| | | |
| | | @ApiModelProperty(value = "配送方式(1=自提,2=快递)") |
| | | @TableField("distribution_mode") |
| | | private String distributionMode; |
| | | |
| | | @ApiModelProperty(value = "指定门店(1=指定,2=所有)") |
| | | @TableField("appoint_store") |
| | | private Integer appointStore; |
| | | |
| | | @ApiModelProperty(value = "商品简介") |
| | | @TableField("introduction") |
| | | private String introduction; |
| | | |
| | | @ApiModelProperty(value = "封面图") |
| | | @TableField("home_page_picture") |
| | | private String homePagePicture; |
| | | |
| | | @ApiModelProperty(value = "详情图,多个逗号分隔") |
| | | @TableField("detail_picture") |
| | | private String detailPicture; |
| | | |
| | | @ApiModelProperty(value = "商品详情") |
| | | @TableField("detail") |
| | | private String detail; |
| | | |
| | | @ApiModelProperty(value = "运营成本") |
| | | @TableField("operating_cost") |
| | | private BigDecimal operatingCost; |
| | | |
| | | @ApiModelProperty(value = "门店成本") |
| | | @TableField("shop_cost") |
| | | private BigDecimal shopCost; |
| | | |
| | | @ApiModelProperty(value = "划线价") |
| | | @TableField("original_price") |
| | | private BigDecimal originalPrice; |
| | | |
| | | @ApiModelProperty(value = "现金支付(0=否,1=是)") |
| | | @TableField("cash_payment") |
| | | private Integer cashPayment; |
| | | |
| | | @ApiModelProperty(value = "积分支付(0=否,1=是)") |
| | | @TableField("point_payment") |
| | | private Integer pointPayment; |
| | | |
| | | @ApiModelProperty(value = "基础售价") |
| | | @TableField("selling_price") |
| | | private BigDecimal sellingPrice; |
| | | |
| | | @ApiModelProperty(value = "基础积分") |
| | | @TableField("integral") |
| | | private Integer integral; |
| | | |
| | | @ApiModelProperty(value = "销量") |
| | | @TableField("sale_num") |
| | | private Integer saleNum; |
| | | |
| | | @ApiModelProperty(value = "商品权限 逗号分隔(-1=全部,0=游客,1=普通会员,2=黄金会员,3=钻石会员,4=准代理,5=代理,6=总代,7=合伙人)") |
| | | @TableField("commodity_authority") |
| | | private String commodityAuthority; |
| | | |
| | | @ApiModelProperty(value = "删除(0=否,1=是)") |
| | | @TableField("del_flag") |
| | | private Integer delFlag; |
| | | |
| | | @ApiModelProperty(value = "添加时间") |
| | | @TableField("create_time") |
| | | private LocalDateTime createTime; |
| | | |
| | | @ApiModelProperty(value = "状态(1=下架,2=上架)") |
| | | @TableField("status") |
| | | private Integer status; |
| | | |
| | | @ApiModelProperty(value = "排序") |
| | | @TableField("sort") |
| | | private Integer sort; |
| | | |
| | | @TableField(exist = false) |
| | | private Integer vipId; |
| | | |
| | | @TableField(exist = false) |
| | | @ApiModelProperty(value = "指定门店") |
| | | private List<GoodsShop> goodsShopList; |
| | | |
| | | @TableField(exist = false) |
| | | private String categoryName; |
| | | |
| | | @TableField(exist = false) |
| | | private Integer showStatus; |
| | | |
| | | @TableField(exist = false) |
| | | private String payMethod; |
| | | |
| | | /** |
| | | * 排序字段 |
| | | */ |
| | | @TableField(exist = false) |
| | | private String orderByColumn; |
| | | |
| | | /** |
| | | * 排序方式 |
| | | */ |
| | | @TableField(exist = false) |
| | | private String isAsc; |
| | | @TableField(exist = false) |
| | | private Integer pageNum; |
| | | @TableField(exist = false) |
| | | private Integer pageSize; |
| | | |
| | | |
| | | |
| | | public String getIdStr() { |
| | | return String.valueOf(id); |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.domain; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | import java.io.Serializable; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * <p> |
| | | * |
| | | * </p> |
| | | * |
| | | * @author luodangjia |
| | | * @since 2024-11-20 |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = false) |
| | | @TableName("t_goods_category") |
| | | @ApiModel(value="GoodsCategory对象", description="") |
| | | public class GoodsCategory implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @ApiModelProperty(value = "主键") |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | private Integer id; |
| | | |
| | | @ApiModelProperty(value = "名称") |
| | | @TableField("name") |
| | | private String name; |
| | | |
| | | @ApiModelProperty(value = "icon图片地址") |
| | | @TableField("icon") |
| | | private String icon; |
| | | |
| | | @ApiModelProperty(value = "删除(0=否,1=是)") |
| | | @TableField("del_flag") |
| | | private Integer delFlag; |
| | | |
| | | @ApiModelProperty(value = "添加时间") |
| | | @TableField("create_time") |
| | | private LocalDateTime createTime; |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.domain; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * <p> |
| | | * |
| | | * </p> |
| | | * |
| | | * @author luodangjia |
| | | * @since 2024-11-20 |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = false) |
| | | @TableName("t_goods_seckill") |
| | | @ApiModel(value="GoodsSeckill对象", description="") |
| | | public class GoodsSeckill implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @ApiModelProperty(value = "主键") |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | private Integer id; |
| | | |
| | | @ApiModelProperty(value = "秒杀活动主表") |
| | | @TableField("seckill_activity_info_id") |
| | | private Integer seckillActivityInfoId; |
| | | |
| | | @ApiModelProperty(value = "会员级别(1=普通会员,2=黄金会员,3=钻石会员,4=准代理,5=代理,6=总代,7=合伙人)") |
| | | @TableField("vip") |
| | | private Integer vip; |
| | | |
| | | @ApiModelProperty(value = "现金支付(0=否,1=是)") |
| | | @TableField("cash_payment") |
| | | private Integer cashPayment; |
| | | |
| | | @ApiModelProperty(value = "积分支付(0=否,1=是)") |
| | | @TableField("point_payment") |
| | | private Integer pointPayment; |
| | | |
| | | @ApiModelProperty(value = "基础售价") |
| | | @TableField("selling_price") |
| | | private BigDecimal sellingPrice; |
| | | |
| | | @ApiModelProperty(value = "基础积分") |
| | | @TableField("integral") |
| | | private Integer integral; |
| | | |
| | | @ApiModelProperty(value = "可获得消费积分") |
| | | @TableField("earn_spending_points") |
| | | private Integer earnSpendingPoints; |
| | | |
| | | @ApiModelProperty(value = "上级获得分佣金额") |
| | | @TableField("superior_subcommission") |
| | | private BigDecimal superiorSubcommission; |
| | | |
| | | @ApiModelProperty(value = "上级获得返佣积分") |
| | | @TableField("superior_rebate_points") |
| | | private Integer superiorRebatePoints; |
| | | |
| | | @ApiModelProperty(value = "获取返佣积分上级类型(1=直推上级,2=直帮上级)") |
| | | @TableField("superior_type") |
| | | private String superiorType; |
| | | |
| | | @ApiModelProperty(value = "获取分佣金额上级类型(1=直推上级,2=直帮上级)") |
| | | @TableField("superior_price_type") |
| | | private String superiorPriceType; |
| | | |
| | | @ApiModelProperty(value = "核销门店可获得服务费") |
| | | @TableField("servuce_shop_charges") |
| | | private BigDecimal servuceShopCharges; |
| | | |
| | | @ApiModelProperty(value = "核销门店可获得服务积分") |
| | | @TableField("servuce_shop_points") |
| | | private Integer servuceShopPoints; |
| | | |
| | | @ApiModelProperty(value = "技师可获得服务积分") |
| | | @TableField("technician_points") |
| | | private Integer technicianPoints; |
| | | |
| | | @ApiModelProperty(value = "绑定门店可获得分佣金额") |
| | | @TableField("bound_shop_charges") |
| | | private BigDecimal boundShopCharges; |
| | | |
| | | @ApiModelProperty(value = "绑定门店可获得返佣积分") |
| | | @TableField("bound_shop_points") |
| | | private Integer boundShopPoints; |
| | | |
| | | @ApiModelProperty(value = "绑定门店上级门店可获得分佣金额") |
| | | @TableField("bound_shop_superiors_charges") |
| | | private BigDecimal boundShopSuperiorsCharges; |
| | | |
| | | @ApiModelProperty(value = "绑定门店上级门店可获得返佣积分") |
| | | @TableField("bound_shop_superiors_points") |
| | | private Integer boundShopSuperiorsPoints; |
| | | |
| | | @ApiModelProperty(value = "活动结束时间") |
| | | @TableField(exist = false) |
| | | private Long endTime; |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.domain; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * <p> |
| | | * |
| | | * </p> |
| | | * |
| | | * @author luodangjia |
| | | * @since 2024-11-20 |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = false) |
| | | @TableName("t_goods_shop") |
| | | @ApiModel(value="指定门店对象", description="") |
| | | public class GoodsShop implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @ApiModelProperty(value = "主键") |
| | | @TableId("id") |
| | | private Long id; |
| | | |
| | | @ApiModelProperty(value = "商品id") |
| | | @TableField("goods_id") |
| | | private Integer goodsId; |
| | | |
| | | @ApiModelProperty(value = "门店id") |
| | | @TableField("shop_id") |
| | | private Integer shopId; |
| | | |
| | | @ApiModelProperty(value = "门店名称") |
| | | @TableField(exist = false) |
| | | private String shopName; |
| | | |
| | | @ApiModelProperty(value = "店长名称") |
| | | @TableField(exist = false) |
| | | private String ownerName; |
| | | |
| | | @ApiModelProperty(value = "联系电话") |
| | | @TableField(exist = false) |
| | | private String phone; |
| | | |
| | | @ApiModelProperty(value = "门店地址") |
| | | @TableField(exist = false) |
| | | private String address; |
| | | |
| | | public String getIdStr(){ |
| | | return String.valueOf(id); |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.domain; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * <p> |
| | | * |
| | | * </p> |
| | | * |
| | | * @author luodangjia |
| | | * @since 2024-11-20 |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = false) |
| | | @TableName("t_phone") |
| | | @ApiModel(value="Phone对象", description="") |
| | | public class Phone implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @ApiModelProperty(value = "主键") |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | private Integer id; |
| | | |
| | | @ApiModelProperty(value = "类型(1=平台,2=门店)") |
| | | @TableField("type") |
| | | private Integer type; |
| | | |
| | | @ApiModelProperty(value = "门店id") |
| | | @TableField("shop_id") |
| | | private Integer shopId; |
| | | |
| | | @ApiModelProperty(value = "联系电话1") |
| | | @TableField("phone_one") |
| | | private String phoneOne; |
| | | |
| | | @ApiModelProperty(value = "联系电话2") |
| | | @TableField("phone_two") |
| | | private String phoneTwo; |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.domain; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * <p> |
| | | * |
| | | * </p> |
| | | * |
| | | * @author luodangjia |
| | | * @since 2024-11-20 |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = false) |
| | | @TableName("t_point_setting") |
| | | @ApiModel(value="PointSetting对象", description="") |
| | | public class PointSetting implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @ApiModelProperty(value = "1-7对应会员等级") |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | private Integer id; |
| | | |
| | | @ApiModelProperty(value = "删除标志(0=否,1=是)") |
| | | @TableField("del_flag") |
| | | private Integer delFlag; |
| | | |
| | | @ApiModelProperty(value = "添加时间") |
| | | @TableField("create_time") |
| | | private LocalDateTime createTime; |
| | | |
| | | @ApiModelProperty(value = "拉新人积分") |
| | | @TableField("new_point") |
| | | private Integer newPoint; |
| | | |
| | | @ApiModelProperty(value = "每日分享积分") |
| | | @TableField("every_share_point") |
| | | private Integer everySharePoint; |
| | | |
| | | @ApiModelProperty(value = "每日签到积分") |
| | | @TableField("sign_point") |
| | | private Integer signPoint; |
| | | |
| | | @ApiModelProperty(value = "使用一小时积分") |
| | | @TableField("hour_point") |
| | | private Integer hourPoint; |
| | | |
| | | @ApiModelProperty(value = "注册积分") |
| | | @TableField("regis_point") |
| | | private Integer regisPoint; |
| | | |
| | | @ApiModelProperty(value = "消费积分") |
| | | @TableField("buy_point") |
| | | private BigDecimal buyPoint; |
| | | |
| | | @ApiModelProperty(value = "消费积分积分 1开0关") |
| | | @TableField("buy_point_open") |
| | | private Integer buyPointOpen; |
| | | |
| | | @ApiModelProperty(value = "消费积分转赠送 1开0关") |
| | | @TableField("buy_point_gift") |
| | | private Integer buyPointGift; |
| | | |
| | | @ApiModelProperty(value = "返佣积分") |
| | | @TableField("share_point") |
| | | private BigDecimal sharePoint; |
| | | |
| | | @ApiModelProperty(value = "返佣积分 1开0关") |
| | | @TableField("share_point_open") |
| | | private Integer sharePointOpen; |
| | | |
| | | @ApiModelProperty(value = "返佣积分转赠送 1开0关") |
| | | @TableField("share_point_gift") |
| | | private Integer sharePointGift; |
| | | |
| | | @ApiModelProperty(value = "门店返佣积分") |
| | | @TableField("shop_share_point") |
| | | private BigDecimal shopSharePoint; |
| | | |
| | | @ApiModelProperty(value = "门店返佣积分 1开0关") |
| | | @TableField("shop_share_point_open") |
| | | private Integer shopSharePointOpen; |
| | | |
| | | @ApiModelProperty(value = "门店返佣积分赠送 1开0关") |
| | | @TableField("shop_share_point_gift") |
| | | private Integer shopSharePointGift; |
| | | |
| | | @ApiModelProperty(value = "门店业绩积分") |
| | | @TableField("shop_point") |
| | | private BigDecimal shopPoint; |
| | | |
| | | @ApiModelProperty(value = "门店业绩积分 1开0关") |
| | | @TableField("shop_point_open") |
| | | private Integer shopPointOpen; |
| | | |
| | | @ApiModelProperty(value = "门店业绩积分转赠送 1开0关") |
| | | @TableField("shop_point_gift") |
| | | private Integer shopPointGift; |
| | | |
| | | @ApiModelProperty(value = "技师业绩积分") |
| | | @TableField("person_point") |
| | | private BigDecimal personPoint; |
| | | |
| | | @ApiModelProperty(value = "技师业绩积分 1开0关") |
| | | @TableField("person_point_open") |
| | | private Integer personPointOpen; |
| | | |
| | | @ApiModelProperty(value = "技师积分转赠送 1开0关") |
| | | @TableField("person_point_gift") |
| | | private Integer personPointGift; |
| | | |
| | | @ApiModelProperty(value = "拉新人积分") |
| | | @TableField("get_new_point") |
| | | private BigDecimal getNewPoint; |
| | | |
| | | @ApiModelProperty(value = "拉新人积分 1开0关") |
| | | @TableField("get_new_point_open") |
| | | private Integer getNewPointOpen; |
| | | |
| | | @ApiModelProperty(value = "拉新人积分转赠送 1开0关") |
| | | @TableField("get_new_point_gift") |
| | | private Integer getNewPointGift; |
| | | |
| | | @ApiModelProperty(value = "注册积分") |
| | | @TableField("get_regis_point") |
| | | private BigDecimal getRegisPoint; |
| | | |
| | | @ApiModelProperty(value = "注册积分 1开0关") |
| | | @TableField("get_regis_point_open") |
| | | private Integer getRegisPointOpen; |
| | | |
| | | @ApiModelProperty(value = "注册积分转赠送 1开0关") |
| | | @TableField("get_regis_point_gift") |
| | | private Integer getRegisPointGift; |
| | | |
| | | @ApiModelProperty(value = "做工积分") |
| | | @TableField("work_point") |
| | | private BigDecimal workPoint; |
| | | |
| | | @ApiModelProperty(value = "做工积分 1开0关") |
| | | @TableField("work_point_open") |
| | | private Integer workPointOpen; |
| | | |
| | | @ApiModelProperty(value = "做工积分转赠送 1开0关") |
| | | @TableField("work_point_gift") |
| | | private Integer workPointGift; |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.domain; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @date 2025/1/10 18:43 |
| | | */ |
| | | @Data |
| | | @TableName("t_receiver_bank_channel") |
| | | public class ReceiverBankChannel { |
| | | /** |
| | | * 主键 |
| | | */ |
| | | @TableField("id") |
| | | private Long id; |
| | | /** |
| | | * 银行名称 |
| | | */ |
| | | @TableField("name") |
| | | private String name; |
| | | /** |
| | | * 银行简称 |
| | | */ |
| | | @TableField("short") |
| | | private String shortName; |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.domain; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import io.swagger.annotations.ApiModel; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | import java.io.Serializable; |
| | | import java.util.List; |
| | | |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = false) |
| | | @TableName("t_region") |
| | | @ApiModel(value="Region对象", description="") |
| | | public class Region implements Serializable { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | private Long id; |
| | | |
| | | private String name; |
| | | |
| | | private String code; |
| | | |
| | | private String citycode; |
| | | |
| | | private Long parentId; |
| | | |
| | | private String english; |
| | | |
| | | @TableField(exist = false) |
| | | private List<Region> childs; |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.domain; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import java.io.Serializable; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * <p> |
| | | * |
| | | * </p> |
| | | * |
| | | * @author luodangjia |
| | | * @since 2024-11-20 |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = false) |
| | | @TableName("t_seckill_activity_info") |
| | | @ApiModel(value="SeckillActivityInfo对象", description="") |
| | | public class SeckillActivityInfo implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @ApiModelProperty(value = "主键") |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | private Integer id; |
| | | |
| | | @ApiModelProperty(value = "删除标志(0=否,1=是)") |
| | | @TableField("del_flag") |
| | | private Integer delFlag; |
| | | |
| | | @ApiModelProperty(value = "添加时间") |
| | | @TableField("create_time") |
| | | private LocalDateTime createTime; |
| | | |
| | | @ApiModelProperty(value = "商品id") |
| | | @TableField("good_id") |
| | | private Integer goodId; |
| | | |
| | | @ApiModelProperty(value = "限购数量") |
| | | @TableField("max_num") |
| | | private Integer maxNum; |
| | | |
| | | @ApiModelProperty(value = "适用会员类型") |
| | | @TableField("vip_ids") |
| | | private String vipIds; |
| | | |
| | | @ApiModelProperty(value = "活动开始日期") |
| | | @TableField("start_time") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private LocalDateTime startTime; |
| | | |
| | | @ApiModelProperty(value = "活动结束日期") |
| | | @TableField("end_time") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private LocalDateTime endTime; |
| | | |
| | | @ApiModelProperty(value = "是否上架:0否 1是") |
| | | @TableField("is_shelves") |
| | | private Integer isShelves; |
| | | |
| | | |
| | | private List<GoodsSeckill> goodsSeckills; |
| | | |
| | | @TableField(exist = false) |
| | | private Goods goods; |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.domain; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * <p> |
| | | * |
| | | * </p> |
| | | * |
| | | * @author luodangjia |
| | | * @since 2024-11-20 |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = false) |
| | | @TableName("t_shop") |
| | | @ApiModel(value="Shop对象", description="") |
| | | public class Shop implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @ApiModelProperty(value = "主键") |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | private Integer id; |
| | | |
| | | @ApiModelProperty(value = "门店名称") |
| | | @TableField("name") |
| | | private String name; |
| | | |
| | | @ApiModelProperty(value = "上级门店id") |
| | | @TableField("pid") |
| | | private Integer pid; |
| | | |
| | | @ApiModelProperty(value = "营业星期:1-周一到周日 2-周一周五 3-仅周末") |
| | | @TableField("business_date") |
| | | private Integer businessDate; |
| | | |
| | | @ApiModelProperty(value = "开始时间(HH:mm)") |
| | | @TableField("start_time") |
| | | private String startTime; |
| | | |
| | | @ApiModelProperty(value = "结束时间(HH:mm)") |
| | | @TableField("end_time") |
| | | private String endTime; |
| | | |
| | | @ApiModelProperty(value = "封面图片") |
| | | @TableField("home_picture") |
| | | private String homePicture; |
| | | |
| | | @ApiModelProperty(value = "详情图,多个逗号分隔") |
| | | @TableField("details_picture") |
| | | private String detailsPicture; |
| | | |
| | | @ApiModelProperty(value = "店长姓名") |
| | | @TableField("shop_manager") |
| | | private String shopManager; |
| | | |
| | | @ApiModelProperty(value = "电话") |
| | | @TableField("phone") |
| | | private String phone; |
| | | |
| | | @ApiModelProperty(value = "店长用户id") |
| | | @TableField("app_user_id") |
| | | private Long appUserId; |
| | | |
| | | @ApiModelProperty(value = "客户电话(同步到t_phone表)") |
| | | @TableField("service_tel") |
| | | private String serviceTel; |
| | | |
| | | @ApiModelProperty(value = "资质证书图片") |
| | | @TableField("certification") |
| | | private String certification; |
| | | |
| | | @ApiModelProperty(value = "经度") |
| | | @TableField("longitude") |
| | | private String longitude; |
| | | |
| | | @ApiModelProperty(value = "纬度") |
| | | @TableField("latitude") |
| | | private String latitude; |
| | | |
| | | @ApiModelProperty(value = "详细地址") |
| | | @TableField("address") |
| | | private String address; |
| | | |
| | | @ApiModelProperty(value = "状态(1=正常,2=冻结)") |
| | | @TableField("status") |
| | | private Integer status; |
| | | |
| | | @ApiModelProperty(value = "门店积分总数") |
| | | @TableField("shop_all_point") |
| | | private Integer shopAllPoint; |
| | | |
| | | @ApiModelProperty(value = "绑定下级门店分佣积分") |
| | | @TableField("lower_level_share_point") |
| | | private Integer lowerLevelSharePoint; |
| | | |
| | | @ApiModelProperty(value = "门店返佣积分") |
| | | @TableField("share_point") |
| | | private Integer sharePoint; |
| | | |
| | | @ApiModelProperty(value = "门店服务积分") |
| | | @TableField("server_point") |
| | | private Integer serverPoint; |
| | | |
| | | @ApiModelProperty(value = "门店已用积分") |
| | | @TableField("use_point") |
| | | private Integer usePoint; |
| | | |
| | | @ApiModelProperty(value = "门店剩余积分") |
| | | @TableField("lave_point") |
| | | private Integer lavePoint; |
| | | |
| | | @TableField(exist = false) |
| | | private Integer laveUsePoint; |
| | | |
| | | @ApiModelProperty(value = "门店分佣总金额") |
| | | @TableField("giveaway_all_money") |
| | | private BigDecimal giveawayAllMoney; |
| | | |
| | | @ApiModelProperty(value = "门店分佣金额") |
| | | @TableField("giveaway_money") |
| | | private BigDecimal giveawayMoney; |
| | | |
| | | @ApiModelProperty(value = "绑定下级门店分佣金额") |
| | | @TableField("lower_level_giveaway_money") |
| | | private BigDecimal lowerLevelGiveawayMoney; |
| | | |
| | | @ApiModelProperty(value = "门店服务分佣金额") |
| | | @TableField("server_giveaway_money") |
| | | private BigDecimal serverGiveawayMoney; |
| | | |
| | | @ApiModelProperty(value = "可提现金额") |
| | | @TableField("can_withdraw_money") |
| | | private BigDecimal canWithdrawMoney; |
| | | |
| | | @ApiModelProperty(value = "已提现金额") |
| | | @TableField("withdraw_money") |
| | | private BigDecimal withdrawMoney; |
| | | @ApiModelProperty(value = "审核中金额") |
| | | @TableField(exist = false) |
| | | private BigDecimal withdrawAuditMoney; |
| | | |
| | | @ApiModelProperty(value = "余额") |
| | | @TableField("balance") |
| | | private BigDecimal balance; |
| | | |
| | | |
| | | @ApiModelProperty(value = "门店订单总数") |
| | | @TableField("order_number") |
| | | private Integer orderNumber; |
| | | |
| | | @ApiModelProperty(value = "门店服务订单数") |
| | | @TableField("server_order_number") |
| | | private Integer serverOrderNumber; |
| | | |
| | | @ApiModelProperty(value = "单品自提订单数") |
| | | @TableField("custom_order_number") |
| | | private Integer customOrderNumber; |
| | | |
| | | @ApiModelProperty(value = "删除(0=否,1=是)") |
| | | @TableField("del_flag") |
| | | private Integer delFlag; |
| | | |
| | | @ApiModelProperty(value = "添加时间") |
| | | @TableField("create_time") |
| | | private LocalDateTime createTime; |
| | | |
| | | @ApiModelProperty("报备商户号") |
| | | @TableField("tradeMerchantNo") |
| | | private String tradeMerchantNo; |
| | | |
| | | @ApiModelProperty("收款银行卡号") |
| | | @TableField("receiverAccountNoEnc") |
| | | private String receiverAccountNoEnc; |
| | | |
| | | @ApiModelProperty("收款银行卡持卡人名称") |
| | | @TableField("receiverNameEnc") |
| | | private String receiverNameEnc; |
| | | |
| | | @ApiModelProperty("账户类型(对私账户201,对公账户204)") |
| | | @TableField("receiverAccountType") |
| | | private Integer receiverAccountType; |
| | | |
| | | @ApiModelProperty("收款账户联行号") |
| | | @TableField("receiverBankChannelNo") |
| | | private String receiverBankChannelNo; |
| | | |
| | | |
| | | @ApiModelProperty(value = "省") |
| | | @TableField("province") |
| | | private String province; |
| | | |
| | | @ApiModelProperty(value = "省编号") |
| | | @TableField("province_code") |
| | | private String provinceCode; |
| | | |
| | | @ApiModelProperty(value = "市") |
| | | @TableField("city") |
| | | private String city; |
| | | |
| | | @ApiModelProperty(value = "市编号") |
| | | @TableField("city_code") |
| | | private String cityCode; |
| | | |
| | | @ApiModelProperty(value = "区") |
| | | @TableField("district") |
| | | private String district; |
| | | |
| | | @ApiModelProperty(value = "区编号") |
| | | @TableField("district_code") |
| | | private String districtCode; |
| | | |
| | | @TableField(exist = false) |
| | | private Double distance; |
| | | |
| | | @TableField(exist = false) |
| | | private Double score; |
| | | |
| | | @ApiModelProperty(value = "自己打分") |
| | | @TableField(exist = false) |
| | | private String myScore; |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.domain; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * <p> |
| | | * |
| | | * </p> |
| | | * |
| | | * @author luodangjia |
| | | * @since 2024-11-20 |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = false) |
| | | @TableName("t_system_config") |
| | | @ApiModel(value="SystemConfig对象", description="") |
| | | public class SystemConfig implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @ApiModelProperty(value = "主键") |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | private Integer id; |
| | | |
| | | @ApiModelProperty(value = "类型(1=启动页管理,2=首页配置,3=订单包邮设置)") |
| | | @TableField("type") |
| | | private Integer type; |
| | | |
| | | @ApiModelProperty(value = "配置内容json") |
| | | @TableField("content") |
| | | private String content; |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.dto; |
| | | |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class IndexConfigSetDto { |
| | | @ApiModelProperty("公司理念") |
| | | private String companyWant; |
| | | @ApiModelProperty("宣传图片1") |
| | | private String pic1; |
| | | @ApiModelProperty("跳转类型1 - 1无2外部链接3商品详情4秒杀商品详情5领卷中心") |
| | | private Integer direct1; |
| | | @ApiModelProperty("跳转内容1") |
| | | private String content1; |
| | | @ApiModelProperty("宣传图片2") |
| | | private String pic2; |
| | | @ApiModelProperty("跳转内容2") |
| | | private String content2; |
| | | @ApiModelProperty("跳转类型2 - 1无2外部链接3商品详情4秒杀商品详情5领卷中心") |
| | | private Integer direct2; |
| | | @ApiModelProperty("公司简介") |
| | | private String companyInfo; |
| | | |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.dto; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Data |
| | | @ApiModel(description = "物流设置") |
| | | public class LogisticsSetDto { |
| | | /** |
| | | * 物流查询时间间隔 |
| | | */ |
| | | @ApiModelProperty(value = "物流查询时间间隔") |
| | | private Integer waitTime; |
| | | |
| | | /** |
| | | * 订单运费 |
| | | */ |
| | | @ApiModelProperty(value = "订单运费") |
| | | private BigDecimal freight; |
| | | |
| | | /** |
| | | * 包邮订单金额 |
| | | */ |
| | | @ApiModelProperty(value = "包邮订单金额") |
| | | private BigDecimal freeFreight; |
| | | |
| | | /** |
| | | * 包邮订单积分 |
| | | */ |
| | | @ApiModelProperty(value = "包邮订单积分") |
| | | private Integer freeIntegral; |
| | | |
| | | /** |
| | | * 包邮会员等级要求:1普通会员,2黄金会员,3钻石会员,4准代理,5代理,6总代,7合伙人 |
| | | */ |
| | | @ApiModelProperty(value = "包邮会员等级要求:0全部 1普通会员,2黄金会员,3钻石会员,4准代理,5代理,6总代,7合伙人") |
| | | private String freeVip; |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.dto; |
| | | |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class StartPageSetDto { |
| | | @ApiModelProperty("启动页倒计时") |
| | | private Integer waitTime; |
| | | @ApiModelProperty("1图片2视频") |
| | | private Integer type; |
| | | @ApiModelProperty("对应文件地址") |
| | | private String url; |
| | | |
| | | |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.enums; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | @Getter |
| | | public enum PointChangeType { |
| | | // 1-消费,2-返佣,3-拉新,4-每日分享,5-每日签到,6-使用时长, 7-注册积分, 8-门店业绩,9-门店返佣,10-技师业绩,11-兑换商品,12-他人赠送,13-赠与他人 |
| | | CONSUME(1, "消费"), |
| | | REBATE(2, "返佣"), |
| | | PULL_NEW(3, "拉新"), |
| | | SHARE(4, "每日分享"), |
| | | SIGN_IN(5, "每日签到"), |
| | | USE_TIME(6, "使用时长"), |
| | | REGISTER(7, "注册积分"), |
| | | SHOP_ACHIEVEMENT(8, "门店业绩"), |
| | | SHOP_REBATE(9, "门店返佣"), |
| | | JUNIOR_SHOP_REBATE(14, "下级门店返佣"), |
| | | TECHNICIAN_ACHIEVEMENT(10, "技师业绩"), |
| | | EXCHANGE_GOODS(11, "兑换商品"), |
| | | OTHER_GIFT(12, "他人赠送"), |
| | | GIFT(13, "赠与他人"); |
| | | private final int code; |
| | | private final String description; |
| | | |
| | | PointChangeType(int code, String description) { |
| | | this.code = code; |
| | | this.description = description; |
| | | } |
| | | |
| | | public static PointChangeType fromCode(int code) { |
| | | for (PointChangeType type : values()) { |
| | | if (type.getCode() == code) { |
| | | return type; |
| | | } |
| | | } |
| | | throw new IllegalArgumentException("Invalid code: " + code); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.enums; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | @Getter |
| | | public enum WithdrawalAuditStatus { |
| | | WAIT_AUDIT(1, "待审核"), |
| | | AUDIT_SUCCESS(2, "审核通过"), |
| | | AUDIT_FAIL(3, "审核拒绝"); |
| | | private final Integer code; |
| | | private final String desc; |
| | | WithdrawalAuditStatus(Integer code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.factory; |
| | | |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.other.api.domain.BaseSetting; |
| | | import com.ruoyi.other.api.feignClient.BaseSettingClient; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.cloud.openfeign.FallbackFactory; |
| | | |
| | | @Slf4j |
| | | public class BaseSettingClientFallbackFactory implements FallbackFactory<BaseSettingClient> { |
| | | @Override |
| | | public BaseSettingClient create(Throwable cause) { |
| | | return new BaseSettingClient(){ |
| | | @Override |
| | | public R<BaseSetting> getBaseSetting(Integer id) { |
| | | return R.fail("获取基础配置失败:" + cause.getMessage()); |
| | | } |
| | | }; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.factory; |
| | | |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.other.api.domain.Goods; |
| | | import com.ruoyi.other.api.feignClient.GoodsClient; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.cloud.openfeign.FallbackFactory; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/11/27 19:57 |
| | | */ |
| | | @Slf4j |
| | | public class GoodsClientFallbackFactory implements FallbackFactory<GoodsClient> { |
| | | |
| | | |
| | | @Override |
| | | public GoodsClient create(Throwable cause) { |
| | | return new GoodsClient(){ |
| | | |
| | | @Override |
| | | public R<List<Goods>> getGoodsByType(Integer type) { |
| | | return R.fail("根据类型(1=服务商品,2=单品商品)获取商品数据失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<Goods> getGoodsById(Integer id) { |
| | | return R.fail("根据id获取商品详情失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<List<Goods>> getGoodsById(String [] ids) { |
| | | return R.fail("根据ids获取商品详情失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R editGoodsList(List<Goods> goods) { |
| | | return R.fail("编辑商品信息失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<Void> editGoodsNum(Integer goodsId, Integer num) { |
| | | return R.fail(); |
| | | } |
| | | |
| | | @Override |
| | | public R<List<Goods>> getAllGoods() { |
| | | return R.fail("获取所有商品失败:" + cause.getMessage()); |
| | | } |
| | | }; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.factory; |
| | | |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.other.api.domain.GoodsShop; |
| | | import com.ruoyi.other.api.feignClient.GoodsShopClient; |
| | | import com.ruoyi.other.api.vo.GetGoodsShopByGoodsIds; |
| | | import org.springframework.cloud.openfeign.FallbackFactory; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/11/27 20:29 |
| | | */ |
| | | public class GoodsShopClientFallbackFactory implements FallbackFactory<GoodsShopClient> { |
| | | |
| | | |
| | | @Override |
| | | public GoodsShopClient create(Throwable cause) { |
| | | return new GoodsShopClient() { |
| | | @Override |
| | | public R<GoodsShop> getGoodsShop(GoodsShop goodsShop) { |
| | | return R.fail("获取商品门店关系数据失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<List<GoodsShop>> getGoodsShopByGoodsIds(GetGoodsShopByGoodsIds goodsIds) { |
| | | return R.fail("根据商品id集合和门店id查询数据失败:" + cause.getMessage()); |
| | | } |
| | | }; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.factory; |
| | | |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.other.api.domain.PointSetting; |
| | | import com.ruoyi.other.api.feignClient.PointSettingClient; |
| | | import org.springframework.cloud.openfeign.FallbackFactory; |
| | | |
| | | public class PointSettingClientFallbackFactory implements FallbackFactory<PointSettingClient> { |
| | | @Override |
| | | public PointSettingClient create(Throwable cause) { |
| | | return new PointSettingClient() { |
| | | @Override |
| | | public R<PointSetting> getPointSetting(Integer id) { |
| | | return R.fail("获取积分配置失败:" + cause.getMessage()); |
| | | } |
| | | }; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.factory; |
| | | |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.other.api.domain.Region; |
| | | import com.ruoyi.other.api.feignClient.RegionClient; |
| | | import org.springframework.cloud.openfeign.FallbackFactory; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/12/19 10:02 |
| | | */ |
| | | public class RegionClientFallbackFactory implements FallbackFactory<RegionClient> { |
| | | @Override |
| | | public RegionClient create(Throwable cause) { |
| | | return new RegionClient() { |
| | | @Override |
| | | public R<Region> getRegionBiCode(String code) { |
| | | return R.fail("根据城市编号查询行政区域数据失败:" + cause.getMessage()); |
| | | } |
| | | }; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.factory; |
| | | |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.other.api.domain.GoodsSeckill; |
| | | import com.ruoyi.other.api.domain.SeckillActivityInfo; |
| | | import com.ruoyi.other.api.feignClient.SeckillActivityInfoClient; |
| | | import com.ruoyi.other.api.vo.GetSeckillActivityInfo; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.cloud.openfeign.FallbackFactory; |
| | | |
| | | @Slf4j |
| | | public class SeckillActivityInfoClientFallbackFactory implements FallbackFactory<SeckillActivityInfoClient> { |
| | | @Override |
| | | public SeckillActivityInfoClient create(Throwable cause) { |
| | | return new SeckillActivityInfoClient(){ |
| | | @Override |
| | | public R<GoodsSeckill> getSeckillActivityInfo(GetSeckillActivityInfo info) { |
| | | return R.fail("根据商品id和会员等级获取对应的秒杀活动失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<SeckillActivityInfo> getSeckillActivityInfoById(Integer id) { |
| | | return R.fail("根据id获取秒杀活动失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<SeckillActivityInfo> getSeckillActivityInfoByGoodsId(Integer goodsId) { |
| | | return R.fail(); |
| | | } |
| | | }; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.factory; |
| | | |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.other.api.domain.Shop; |
| | | import com.ruoyi.other.api.feignClient.ShopClient; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.cloud.openfeign.FallbackFactory; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Set; |
| | | |
| | | @Slf4j |
| | | public class ShopClientFallbackFactory implements FallbackFactory<ShopClient> { |
| | | @Override |
| | | public ShopClient create(Throwable cause) { |
| | | return new ShopClient(){ |
| | | @Override |
| | | public R<Shop> getShopById(Integer id) { |
| | | return R.fail("根据id获取门店信息失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<List<Shop>> getShopByUserId(Long id) { |
| | | return R.fail("根据用户id集合获取门店数据失败"); |
| | | } |
| | | |
| | | @Override |
| | | public R<Shop> getShopByPhone(String phone) { |
| | | return R.fail("根据店铺管理员电话获取门店数据失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<List<Shop>> getShopByUserIds(List<Long> userIds) { |
| | | return R.fail("根据用户id集合获取门店数据失败"); |
| | | } |
| | | |
| | | @Override |
| | | public R<Set<Integer>> getShopIdByName(String shopName) { |
| | | return R.fail("根据门店名称获取门店id失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<Set<Long>> getManagerByManagerName(String managerName) { |
| | | return R.fail("根据门店管理员名称获取门店id失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public void updateShop(Shop shop) { |
| | | R.fail("编辑门店失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<List<Shop>> getAllShop() { |
| | | return R.fail("获取所有门店失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @GetMapping("/shop/getShopStatistics") |
| | | @Override |
| | | public R<Map<String, BigDecimal>> getShopStatistics(Integer shopId) { |
| | | return R.fail(); |
| | | } |
| | | |
| | | @Override |
| | | public R<Shop> getServiceProvider(Long appUserId) { |
| | | return R.fail("获取服务商失败"); |
| | | } |
| | | |
| | | @Override |
| | | public R<Shop> getSuperiorServiceProvider(Long appUserId) { |
| | | return R.fail("获取高级服务商失败"); |
| | | } |
| | | }; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.factory; |
| | | |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.other.api.domain.Shop; |
| | | import com.ruoyi.other.api.feignClient.StoreClient; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.cloud.openfeign.FallbackFactory; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * 充电订单服务降级处理 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @Component |
| | | public class StoreFallbackFactory implements FallbackFactory<StoreClient> |
| | | { |
| | | private static final Logger log = LoggerFactory.getLogger(StoreFallbackFactory.class); |
| | | |
| | | |
| | | @Override |
| | | public StoreClient create(Throwable cause) { |
| | | log.error("商品订单调用失败:{}", cause.getMessage()); |
| | | return new StoreClient() { |
| | | |
| | | |
| | | @Override |
| | | public R<Shop> getStoreById(Integer id) { |
| | | return R.fail("根据门店id查询详情:" + cause.getMessage()); |
| | | } |
| | | }; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.factory; |
| | | |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.other.api.domain.SystemConfig; |
| | | import com.ruoyi.other.api.feignClient.SystemConfigClient; |
| | | import org.springframework.cloud.openfeign.FallbackFactory; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/11/29 15:58 |
| | | */ |
| | | public class SystemConfigClientFallbackFactory implements FallbackFactory<SystemConfigClient> { |
| | | @Override |
| | | public SystemConfigClient create(Throwable cause) { |
| | | return new SystemConfigClient() { |
| | | @Override |
| | | public R<SystemConfig> getSystemConfig(Integer type) { |
| | | return R.fail("根据类型获取系统配置失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<BigDecimal> redPackegeSet() { |
| | | return R.fail("根据红包配置失败:" + cause.getMessage()); |
| | | } |
| | | }; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.feignClient; |
| | | |
| | | import com.ruoyi.common.core.constant.ServiceNameConstants; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.other.api.domain.BaseSetting; |
| | | import com.ruoyi.other.api.factory.BaseSettingClientFallbackFactory; |
| | | import org.springframework.cloud.openfeign.FeignClient; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/11/29 11:34 |
| | | */ |
| | | @FeignClient(contextId = "BaseSettingClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = BaseSettingClientFallbackFactory.class) |
| | | public interface BaseSettingClient { |
| | | |
| | | |
| | | /** |
| | | * 获取基础配置 |
| | | * @param id |
| | | * @return |
| | | */ |
| | | @GetMapping("/base-setting/getBaseSetting") |
| | | R<BaseSetting> getBaseSetting(@RequestParam("id") Integer id); |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.feignClient; |
| | | |
| | | import com.ruoyi.common.core.constant.ServiceNameConstants; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.other.api.domain.Goods; |
| | | import com.ruoyi.other.api.factory.GoodsClientFallbackFactory; |
| | | import org.springframework.cloud.openfeign.FeignClient; |
| | | 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.RequestParam; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/11/27 19:56 |
| | | */ |
| | | @FeignClient(contextId = "GoodsClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = GoodsClientFallbackFactory.class) |
| | | public interface GoodsClient{ |
| | | |
| | | |
| | | /** |
| | | * 根据类型(1=服务商品,2=单品商品)获取商品数据 |
| | | * @param type |
| | | * @return |
| | | */ |
| | | @PostMapping("/goods/getGoodsByType") |
| | | R<List<Goods>> getGoodsByType(@RequestParam("type") Integer type); |
| | | |
| | | |
| | | /** |
| | | * 根据id获取商品详情 |
| | | * @param id |
| | | * @return |
| | | */ |
| | | @PostMapping("/goods/getGoodsById") |
| | | R<Goods> getGoodsById(@RequestParam("id") Integer id); |
| | | |
| | | |
| | | @PostMapping("/goods/getGoodsByIds") |
| | | R<List<Goods>> getGoodsById(@RequestParam("ids") String[] ids); |
| | | |
| | | |
| | | /** |
| | | * 编辑商品信息 |
| | | * @param goods |
| | | * @return |
| | | */ |
| | | @PostMapping("/goods/editGoods") |
| | | R editGoodsList(@RequestBody List<Goods> goods); |
| | | |
| | | /** |
| | | * 商品销量增加 |
| | | */ |
| | | @PutMapping("/goods/editGoodsNum") |
| | | R<Void> editGoodsNum(@RequestParam("goodsId") Integer goodsId, @RequestParam("num") Integer num); |
| | | |
| | | |
| | | /** |
| | | * 获取所有商品 |
| | | * @return |
| | | */ |
| | | @PostMapping("/goods/getAllGoods") |
| | | R<List<Goods>> getAllGoods(); |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.feignClient; |
| | | |
| | | import com.ruoyi.common.core.constant.ServiceNameConstants; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.other.api.domain.GoodsShop; |
| | | import com.ruoyi.other.api.factory.GoodsShopClientFallbackFactory; |
| | | import com.ruoyi.other.api.vo.GetGoodsShopByGoodsIds; |
| | | import org.springframework.cloud.openfeign.FeignClient; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/11/27 20:28 |
| | | */ |
| | | @FeignClient(contextId = "GoodsShopClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = GoodsShopClientFallbackFactory.class) |
| | | public interface GoodsShopClient { |
| | | |
| | | /** |
| | | * 获取商品门店关系数据 |
| | | * @param goodsShop |
| | | * @return |
| | | */ |
| | | @PostMapping("/goods-shop/getGoodsShop") |
| | | R<GoodsShop> getGoodsShop(@RequestBody GoodsShop goodsShop); |
| | | |
| | | /** |
| | | * 根据商品id集合和门店id查询数据 |
| | | * @param goodsIds |
| | | * @return |
| | | */ |
| | | @PostMapping("/goods-shop/getGoodsShopByGoodsIds") |
| | | R<List<GoodsShop>> getGoodsShopByGoodsIds(@RequestBody GetGoodsShopByGoodsIds goodsIds); |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.feignClient; |
| | | |
| | | import com.ruoyi.common.core.constant.ServiceNameConstants; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.other.api.domain.PointSetting; |
| | | import com.ruoyi.other.api.factory.PointSettingClientFallbackFactory; |
| | | import org.springframework.cloud.openfeign.FeignClient; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | |
| | | @FeignClient(contextId = "PointSettingClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = PointSettingClientFallbackFactory.class) |
| | | public interface PointSettingClient { |
| | | |
| | | @PostMapping("/point-setting/getPointSetting") |
| | | R<PointSetting> getPointSetting(@RequestParam("id") Integer id); |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.feignClient; |
| | | |
| | | import com.ruoyi.common.core.constant.ServiceNameConstants; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.other.api.domain.Region; |
| | | import com.ruoyi.other.api.factory.RegionClientFallbackFactory; |
| | | import org.springframework.cloud.openfeign.FeignClient; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/12/19 10:01 |
| | | */ |
| | | @FeignClient(contextId = "RegionClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = RegionClientFallbackFactory.class) |
| | | public interface RegionClient { |
| | | |
| | | |
| | | /** |
| | | * 根据城市编号查询行政区域数据 |
| | | * @param code |
| | | * @return |
| | | */ |
| | | @PostMapping("/region/getRegionBiCode") |
| | | R<Region> getRegionBiCode(@RequestParam("code") String code); |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.feignClient; |
| | | |
| | | import com.ruoyi.common.core.constant.ServiceNameConstants; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.other.api.domain.GoodsSeckill; |
| | | import com.ruoyi.other.api.domain.SeckillActivityInfo; |
| | | import com.ruoyi.other.api.factory.SeckillActivityInfoClientFallbackFactory; |
| | | import com.ruoyi.other.api.vo.GetSeckillActivityInfo; |
| | | import org.springframework.cloud.openfeign.FeignClient; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/11/28 10:38 |
| | | */ |
| | | @FeignClient(contextId = "SeckillActivityInfoClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = SeckillActivityInfoClientFallbackFactory.class) |
| | | public interface SeckillActivityInfoClient { |
| | | |
| | | |
| | | /** |
| | | * 根据商品id和会员等级获取对应的秒杀活动 |
| | | * @param info |
| | | * @return |
| | | */ |
| | | @PostMapping("/seckill-activity-info/getSeckillActivityInfo") |
| | | R<GoodsSeckill> getSeckillActivityInfo(@RequestBody GetSeckillActivityInfo info); |
| | | |
| | | |
| | | /** |
| | | * 根据id获取秒杀活动 |
| | | * @param id |
| | | * @return |
| | | */ |
| | | @PostMapping("/seckill-activity-info/getSeckillActivityInfoById") |
| | | R<SeckillActivityInfo> getSeckillActivityInfoById(@RequestParam("id") Integer id); |
| | | |
| | | @GetMapping("/seckill-activity-info/getSeckillActivityInfoByGoodsId") |
| | | public R<SeckillActivityInfo> getSeckillActivityInfoByGoodsId(@RequestParam("goodsId") Integer goodsId); |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.feignClient; |
| | | |
| | | import com.ruoyi.common.core.constant.ServiceNameConstants; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.other.api.domain.Shop; |
| | | import com.ruoyi.other.api.factory.ShopClientFallbackFactory; |
| | | import org.springframework.cloud.openfeign.FeignClient; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Set; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/11/29 10:28 |
| | | */ |
| | | @FeignClient(contextId = "ShopClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = ShopClientFallbackFactory.class) |
| | | public interface ShopClient { |
| | | |
| | | |
| | | /** |
| | | * 根据id获取门店信息 |
| | | * @param id |
| | | * @return |
| | | */ |
| | | @PostMapping("/shop/getShopById") |
| | | R<Shop> getShopById(@RequestParam("id") Integer id); |
| | | |
| | | @PostMapping("/shop/getShopByUserId") |
| | | R<List<Shop>> getShopByUserId(@RequestParam("id") Long id); |
| | | |
| | | /** |
| | | * 根据店铺管理员电话获取门店数据 |
| | | * @param phone |
| | | * @return |
| | | */ |
| | | @PostMapping("/shop/getShopByPhone") |
| | | R<Shop> getShopByPhone(@RequestParam("phone") String phone); |
| | | |
| | | @PostMapping("/shop/getShopByUserIds") |
| | | R<List<Shop>> getShopByUserIds(@RequestBody List<Long> userIds); |
| | | |
| | | @PostMapping("/shop/getShopIdByName") |
| | | R<Set<Integer>> getShopIdByName(@RequestParam("shopName") String shopName); |
| | | |
| | | @PostMapping("/shop/getManagerByManagerName") |
| | | R<Set<Long>> getManagerByManagerName(@RequestParam("managerName") String managerName); |
| | | |
| | | /** |
| | | * 编辑门店 |
| | | * @param shop |
| | | */ |
| | | @PostMapping("/shop/updateShop") |
| | | void updateShop(Shop shop); |
| | | |
| | | |
| | | /** |
| | | * 获取所有门店 |
| | | * @return |
| | | */ |
| | | @PostMapping("/shop/getAllShop") |
| | | R<List<Shop>> getAllShop(); |
| | | |
| | | |
| | | @GetMapping("/shop/getShopStatistics") |
| | | public R<Map<String, BigDecimal>> getShopStatistics(@RequestParam("shopId") Integer shopId); |
| | | |
| | | /** |
| | | * 获取指定用户的服务商 |
| | | */ |
| | | @GetMapping("/shop/getServiceProvider") |
| | | R<Shop> getServiceProvider(@RequestParam("appUserId") Long appUserId); |
| | | |
| | | /** |
| | | * 获取指定用户的高级服务商 |
| | | */ |
| | | @GetMapping("/shop/getSuperiorServiceProvider") |
| | | public R<Shop> getSuperiorServiceProvider(@RequestParam("appUserId") Long appUserId); |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.feignClient; |
| | | |
| | | import com.ruoyi.common.core.constant.ServiceNameConstants; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.other.api.domain.Shop; |
| | | import com.ruoyi.other.api.factory.StoreFallbackFactory; |
| | | import org.springframework.cloud.openfeign.FeignClient; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | |
| | | /** |
| | | * 后台订单服务 |
| | | * @author ruoyi |
| | | */ |
| | | @FeignClient(contextId = "StoreClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = StoreFallbackFactory.class) |
| | | public interface StoreClient { |
| | | @GetMapping(value = "/shop/getDetailById") |
| | | R<Shop> getStoreById(@RequestParam("id") Integer id); |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.feignClient; |
| | | |
| | | import com.ruoyi.common.core.constant.ServiceNameConstants; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.other.api.domain.SystemConfig; |
| | | import com.ruoyi.other.api.factory.SystemConfigClientFallbackFactory; |
| | | import org.springframework.cloud.openfeign.FeignClient; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/11/29 15:58 |
| | | */ |
| | | @FeignClient(contextId = "SystemConfigClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = SystemConfigClientFallbackFactory.class) |
| | | public interface SystemConfigClient { |
| | | |
| | | |
| | | /** |
| | | * 根据类型获取系统配置 |
| | | * @param type |
| | | * @return |
| | | */ |
| | | @PostMapping("/system-config/getSystemConfig") |
| | | R<SystemConfig> getSystemConfig(@RequestParam("type") Integer type); |
| | | |
| | | @PostMapping("/red-packege-set/get") |
| | | R<BigDecimal> redPackegeSet(); |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.vo; |
| | | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/11/28 10:47 |
| | | */ |
| | | @Data |
| | | public class GetGoodsBargainPrice { |
| | | /** |
| | | * 商品id |
| | | */ |
| | | private Integer goodsId; |
| | | /** |
| | | * 会员 |
| | | */ |
| | | private Integer vip; |
| | | /** |
| | | * 门店id |
| | | */ |
| | | private Integer shopId; |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.vo; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/12/2 10:18 |
| | | */ |
| | | @Data |
| | | public class GetGoodsShopByGoodsIds { |
| | | /** |
| | | * 门店id |
| | | */ |
| | | private Integer shopId; |
| | | /** |
| | | * 商品id集合 |
| | | */ |
| | | private List<Integer> goodsIds; |
| | | } |
New file |
| | |
| | | package com.ruoyi.other.api.vo; |
| | | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/11/28 10:33 |
| | | */ |
| | | @Data |
| | | public class GetSeckillActivityInfo { |
| | | /** |
| | | * 商品id |
| | | */ |
| | | private Integer goodsId; |
| | | /** |
| | | * 会员 |
| | | */ |
| | | private Integer vip; |
| | | } |
New file |
| | |
| | | com.ruoyi.other.api.factory.GoodsClientFallbackFactory |
| | | com.ruoyi.other.api.factory.GoodsShopClientFallbackFactory |
| | | com.ruoyi.other.api.factory.GoodsAreaClientFallbackFactory |
| | | com.ruoyi.other.api.factory.GoodsVipClientFallbackFactory |
| | | com.ruoyi.other.api.factory.SeckillActivityInfoClientFallbackFactory |
| | | com.ruoyi.other.api.factory.GoodsBargainPriceClientFallbackFactory |
| | | com.ruoyi.other.api.factory.RemoteVipSettingFallbackFactory |
| | | com.ruoyi.other.api.factory.ShopClientFallbackFactory |
| | | com.ruoyi.other.api.factory.OrderActivityInfoClientFallbackFactory |
| | | com.ruoyi.other.api.factory.BaseSettingClientFallbackFactory |
| | | com.ruoyi.other.api.factory.CouponInfoClientFallbackFactory |
| | | com.ruoyi.other.api.factory.SystemConfigClientFallbackFactory |
| | | com.ruoyi.other.api.factory.StoreFallbackFactory |
| | | com.ruoyi.other.api.factory.CouponClientFallbackFactory |
| | | com.ruoyi.other.api.factory.TechnicianClientFallbackFactory |
| | | com.ruoyi.other.api.factory.PointSettingClientFallbackFactory |
| | | com.ruoyi.other.api.factory.VipGoodClientFallbackFactory |
| | | com.ruoyi.other.api.factory.VipSettingClientFallbackFactory |
| | | com.ruoyi.other.api.factory.RegionClientFallbackFactory |
| | | com.ruoyi.other.api.factory.ShopBalanceStatementClientFallbackFactory |
| | | com.ruoyi.other.api.factory.ShopPointClientFallbackFactory |
| | | com.ruoyi.other.api.factory.TechnicianSubscribeClientFallbackFactory |
| | | com.ruoyi.other.api.factory.ShopGiveawayTemporaryClientFallbackFactory |
New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| | | xmlns="http://maven.apache.org/POM/4.0.0" |
| | | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| | | <parent> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-api</artifactId> |
| | | <version>3.6.2</version> |
| | | </parent> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | |
| | | <artifactId>ruoyi-api-system</artifactId> |
| | | |
| | | <description> |
| | | ruoyi-api-system系统接口模块 |
| | | </description> |
| | | |
| | | <dependencies> |
| | | |
| | | <!-- RuoYi Common Core--> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-common-core</artifactId> |
| | | <exclusions> |
| | | <exclusion> |
| | | <groupId>com.github.pagehelper</groupId> |
| | | <artifactId>pagehelper-spring-boot-starter</artifactId> |
| | | </exclusion> |
| | | </exclusions> |
| | | </dependency> |
| | | </dependencies> |
| | | |
| | | </project> |
New file |
| | |
| | | package com.ruoyi.system.api; |
| | | |
| | | import com.ruoyi.common.core.constant.ServiceNameConstants; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.system.api.domain.SysFile; |
| | | import com.ruoyi.system.api.factory.RemoteFileFallbackFactory; |
| | | import org.springframework.cloud.openfeign.FeignClient; |
| | | import org.springframework.http.MediaType; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestPart; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | /** |
| | | * 文件服务 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @FeignClient(contextId = "remoteFileService", value = ServiceNameConstants.FILE_SERVICE, fallbackFactory = RemoteFileFallbackFactory.class) |
| | | public interface RemoteFileService |
| | | { |
| | | /** |
| | | * 上传文件 |
| | | * |
| | | * @param file 文件信息 |
| | | * @return 结果 |
| | | */ |
| | | @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) |
| | | public R<SysFile> upload(@RequestPart(value = "file") MultipartFile file); |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api; |
| | | |
| | | import com.ruoyi.common.core.constant.SecurityConstants; |
| | | import com.ruoyi.common.core.constant.ServiceNameConstants; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.system.api.domain.SysOperLog; |
| | | import com.ruoyi.system.api.factory.RemoteLogFallbackFactory; |
| | | import org.springframework.cloud.openfeign.FeignClient; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestHeader; |
| | | |
| | | /** |
| | | * 日志服务 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @FeignClient(contextId = "remoteLogService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteLogFallbackFactory.class) |
| | | public interface RemoteLogService |
| | | { |
| | | /** |
| | | * 保存系统日志 |
| | | * |
| | | * @param sysOperLog 日志实体 |
| | | * @param source 请求来源 |
| | | * @return 结果 |
| | | */ |
| | | @PostMapping("/operlog") |
| | | public R<Boolean> saveLog(@RequestBody SysOperLog sysOperLog, @RequestHeader(SecurityConstants.FROM_SOURCE) String source) throws Exception; |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api; |
| | | |
| | | import com.ruoyi.common.core.constant.SecurityConstants; |
| | | import com.ruoyi.common.core.constant.ServiceNameConstants; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.system.api.domain.SysUser; |
| | | import com.ruoyi.system.api.factory.RemoteUserFallbackFactory; |
| | | import com.ruoyi.system.api.model.LoginUser; |
| | | import org.springframework.cloud.openfeign.FeignClient; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | /** |
| | | * 用户服务 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class) |
| | | public interface RemoteUserService |
| | | { |
| | | /** |
| | | * 通过用户名查询用户信息 |
| | | * |
| | | * @param username 用户名 |
| | | * @param source 请求来源 |
| | | * @return 结果 |
| | | */ |
| | | @GetMapping("/user/info/{username}") |
| | | public R<LoginUser> getUserInfo(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); |
| | | @GetMapping("/user/infoShop/{username}") |
| | | public R<LoginUser> infoShop(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); |
| | | |
| | | /** |
| | | * 注册用户信息 |
| | | * |
| | | * @param sysUser 用户信息 |
| | | * @param source 请求来源 |
| | | * @return 结果 |
| | | */ |
| | | @PostMapping("/user/register") |
| | | public R<Boolean> registerUserInfo(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.config; |
| | | |
| | | import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; |
| | | import com.ruoyi.system.api.model.LoginUser; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.ibatis.reflection.MetaObject; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.context.annotation.Configuration; |
| | | import org.springframework.util.StringUtils; |
| | | |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * @author xiaochen |
| | | * @ClassName DataUpdateInterceptor |
| | | * @Description 数据更新操作处理 |
| | | * @date 2021-12-15 |
| | | * <p> |
| | | * 注意,之前在此处注入了 JwtTokenUtils |
| | | * <p> |
| | | * 造成spring循环依赖,项目支棱不起来 |
| | | */ |
| | | @Slf4j |
| | | @Configuration |
| | | public class DataUpdateHandlerConfig implements MetaObjectHandler { |
| | | |
| | | @Override |
| | | public void insertFill(MetaObject metaObject) { |
| | | |
| | | } |
| | | |
| | | @Override |
| | | public void updateFill(MetaObject metaObject) { |
| | | |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.config; |
| | | |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.boot.web.client.RestTemplateBuilder; |
| | | import org.springframework.context.annotation.Bean; |
| | | import org.springframework.context.annotation.Configuration; |
| | | import org.springframework.web.client.RestTemplate; |
| | | |
| | | /** |
| | | * http请求工具配置 |
| | | * |
| | | * @author: KingKong |
| | | * @create: 2018-11-14 10:47 |
| | | **/ |
| | | @Configuration |
| | | public class HttpConfig { |
| | | |
| | | @Autowired |
| | | private RestTemplateBuilder builder; |
| | | |
| | | @Bean |
| | | public RestTemplate restTemplate() { |
| | | return builder.build(); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.config; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.DbType; |
| | | import com.baomidou.mybatisplus.core.config.GlobalConfig; |
| | | import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; |
| | | import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.context.annotation.Bean; |
| | | import org.springframework.context.annotation.Configuration; |
| | | |
| | | /** |
| | | * @author xiaochen |
| | | * @ClassName MybatisPlusConfig |
| | | * @Description MybatisPlus相关配置 |
| | | * @date 2020-09-22 11:22、 |
| | | * 直接以实现类作为bean的注入(有事务管理的类) |
| | | * @EnableTransactionManagement(proxyTargetClass = true) |
| | | */ |
| | | @Configuration |
| | | public class MybatisPlusConfig { |
| | | private final DataUpdateHandlerConfig dataUpdateHandler; |
| | | |
| | | @Autowired |
| | | public MybatisPlusConfig(DataUpdateHandlerConfig dataUpdateHandler) { |
| | | this.dataUpdateHandler = dataUpdateHandler; |
| | | } |
| | | |
| | | /** |
| | | * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题 |
| | | */ |
| | | @Bean |
| | | public MybatisPlusInterceptor mybatisPlusInterceptor() { |
| | | MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); |
| | | interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); |
| | | return interceptor; |
| | | } |
| | | |
| | | /** |
| | | * 自动填充功能 |
| | | * |
| | | * @return |
| | | */ |
| | | @Bean |
| | | public GlobalConfig globalConfig() { |
| | | GlobalConfig globalConfig = new GlobalConfig(); |
| | | globalConfig.setMetaObjectHandler(dataUpdateHandler); |
| | | return globalConfig; |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.domain; |
| | | |
| | | import com.ruoyi.common.core.web.domain.BaseEntity; |
| | | import org.apache.commons.lang3.builder.ToStringBuilder; |
| | | import org.apache.commons.lang3.builder.ToStringStyle; |
| | | |
| | | import javax.validation.constraints.Email; |
| | | import javax.validation.constraints.Size; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 部门表 sys_dept |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class SysDept extends BaseEntity |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** 部门ID */ |
| | | private Long deptId; |
| | | |
| | | /** 父部门ID */ |
| | | private Long parentId; |
| | | |
| | | /** 祖级列表 */ |
| | | private String ancestors; |
| | | |
| | | /** 部门名称 */ |
| | | private String deptName; |
| | | |
| | | /** 显示顺序 */ |
| | | private Integer orderNum; |
| | | |
| | | /** 负责人 */ |
| | | private String leader; |
| | | |
| | | /** 联系电话 */ |
| | | private String phone; |
| | | |
| | | /** 邮箱 */ |
| | | private String email; |
| | | |
| | | /** 部门状态:0正常,1停用 */ |
| | | private String status; |
| | | |
| | | /** 删除标志(0代表存在 2代表删除) */ |
| | | private String delFlag; |
| | | /** |
| | | * 门店id |
| | | */ |
| | | private Integer shopId; |
| | | |
| | | /** 父部门名称 */ |
| | | private String parentName; |
| | | |
| | | /** 子部门 */ |
| | | private List<SysDept> children = new ArrayList<SysDept>(); |
| | | |
| | | public Long getDeptId() |
| | | { |
| | | return deptId; |
| | | } |
| | | |
| | | public void setDeptId(Long deptId) |
| | | { |
| | | this.deptId = deptId; |
| | | } |
| | | |
| | | public Long getParentId() |
| | | { |
| | | return parentId; |
| | | } |
| | | |
| | | public void setParentId(Long parentId) |
| | | { |
| | | this.parentId = parentId; |
| | | } |
| | | |
| | | public String getAncestors() |
| | | { |
| | | return ancestors; |
| | | } |
| | | |
| | | public void setAncestors(String ancestors) |
| | | { |
| | | this.ancestors = ancestors; |
| | | } |
| | | |
| | | @Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符") |
| | | public String getDeptName() |
| | | { |
| | | return deptName; |
| | | } |
| | | |
| | | public void setDeptName(String deptName) |
| | | { |
| | | this.deptName = deptName; |
| | | } |
| | | |
| | | public Integer getOrderNum() |
| | | { |
| | | return orderNum; |
| | | } |
| | | |
| | | public void setOrderNum(Integer orderNum) |
| | | { |
| | | this.orderNum = orderNum; |
| | | } |
| | | |
| | | public String getLeader() |
| | | { |
| | | return leader; |
| | | } |
| | | |
| | | public void setLeader(String leader) |
| | | { |
| | | this.leader = leader; |
| | | } |
| | | |
| | | @Size(min = 0, max = 11, message = "联系电话长度不能超过11个字符") |
| | | public String getPhone() |
| | | { |
| | | return phone; |
| | | } |
| | | |
| | | public void setPhone(String phone) |
| | | { |
| | | this.phone = phone; |
| | | } |
| | | |
| | | @Email(message = "邮箱格式不正确") |
| | | @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") |
| | | public String getEmail() |
| | | { |
| | | return email; |
| | | } |
| | | |
| | | public void setEmail(String email) |
| | | { |
| | | this.email = email; |
| | | } |
| | | |
| | | public String getStatus() |
| | | { |
| | | return status; |
| | | } |
| | | |
| | | public void setStatus(String status) |
| | | { |
| | | this.status = status; |
| | | } |
| | | |
| | | public String getDelFlag() |
| | | { |
| | | return delFlag; |
| | | } |
| | | |
| | | public void setDelFlag(String delFlag) |
| | | { |
| | | this.delFlag = delFlag; |
| | | } |
| | | |
| | | public String getParentName() |
| | | { |
| | | return parentName; |
| | | } |
| | | |
| | | public void setParentName(String parentName) |
| | | { |
| | | this.parentName = parentName; |
| | | } |
| | | |
| | | public List<SysDept> getChildren() |
| | | { |
| | | return children; |
| | | } |
| | | |
| | | public void setChildren(List<SysDept> children) |
| | | { |
| | | this.children = children; |
| | | } |
| | | |
| | | public Integer getShopId() { |
| | | return shopId; |
| | | } |
| | | |
| | | public void setShopId(Integer shopId) { |
| | | this.shopId = shopId; |
| | | } |
| | | |
| | | @Override |
| | | public String toString() { |
| | | return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) |
| | | .append("deptId", getDeptId()) |
| | | .append("parentId", getParentId()) |
| | | .append("ancestors", getAncestors()) |
| | | .append("deptName", getDeptName()) |
| | | .append("orderNum", getOrderNum()) |
| | | .append("leader", getLeader()) |
| | | .append("phone", getPhone()) |
| | | .append("email", getEmail()) |
| | | .append("status", getStatus()) |
| | | .append("delFlag", getDelFlag()) |
| | | .append("createBy", getCreateBy()) |
| | | .append("createTime", getCreateTime()) |
| | | .append("updateBy", getUpdateBy()) |
| | | .append("updateTime", getUpdateTime()) |
| | | .toString(); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.domain; |
| | | |
| | | import com.ruoyi.common.core.annotation.Excel; |
| | | import com.ruoyi.common.core.annotation.Excel.ColumnType; |
| | | import com.ruoyi.common.core.constant.UserConstants; |
| | | import com.ruoyi.common.core.web.domain.BaseEntity; |
| | | import org.apache.commons.lang3.builder.ToStringBuilder; |
| | | import org.apache.commons.lang3.builder.ToStringStyle; |
| | | |
| | | import javax.validation.constraints.NotBlank; |
| | | import javax.validation.constraints.Size; |
| | | |
| | | /** |
| | | * 字典数据表 sys_dict_data |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class SysDictData extends BaseEntity |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** 字典编码 */ |
| | | @Excel(name = "字典编码", cellType = ColumnType.NUMERIC) |
| | | private Long dictCode; |
| | | |
| | | /** 字典排序 */ |
| | | @Excel(name = "字典排序", cellType = ColumnType.NUMERIC) |
| | | private Long dictSort; |
| | | |
| | | /** 字典标签 */ |
| | | @Excel(name = "字典标签") |
| | | private String dictLabel; |
| | | |
| | | /** 字典键值 */ |
| | | @Excel(name = "字典键值") |
| | | private String dictValue; |
| | | |
| | | /** 字典类型 */ |
| | | @Excel(name = "字典类型") |
| | | private String dictType; |
| | | |
| | | /** 样式属性(其他样式扩展) */ |
| | | private String cssClass; |
| | | |
| | | /** 表格字典样式 */ |
| | | private String listClass; |
| | | |
| | | /** 是否默认(Y是 N否) */ |
| | | @Excel(name = "是否默认", readConverterExp = "Y=是,N=否") |
| | | private String isDefault; |
| | | |
| | | /** 状态(0正常 1停用) */ |
| | | @Excel(name = "状态", readConverterExp = "0=正常,1=停用") |
| | | private String status; |
| | | |
| | | public Long getDictCode() |
| | | { |
| | | return dictCode; |
| | | } |
| | | |
| | | public void setDictCode(Long dictCode) |
| | | { |
| | | this.dictCode = dictCode; |
| | | } |
| | | |
| | | public Long getDictSort() |
| | | { |
| | | return dictSort; |
| | | } |
| | | |
| | | public void setDictSort(Long dictSort) |
| | | { |
| | | this.dictSort = dictSort; |
| | | } |
| | | |
| | | @NotBlank(message = "字典标签不能为空") |
| | | @Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符") |
| | | public String getDictLabel() |
| | | { |
| | | return dictLabel; |
| | | } |
| | | |
| | | public void setDictLabel(String dictLabel) |
| | | { |
| | | this.dictLabel = dictLabel; |
| | | } |
| | | |
| | | @NotBlank(message = "字典键值不能为空") |
| | | @Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符") |
| | | public String getDictValue() |
| | | { |
| | | return dictValue; |
| | | } |
| | | |
| | | public void setDictValue(String dictValue) |
| | | { |
| | | this.dictValue = dictValue; |
| | | } |
| | | |
| | | @NotBlank(message = "字典类型不能为空") |
| | | @Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符") |
| | | public String getDictType() |
| | | { |
| | | return dictType; |
| | | } |
| | | |
| | | public void setDictType(String dictType) |
| | | { |
| | | this.dictType = dictType; |
| | | } |
| | | |
| | | @Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符") |
| | | public String getCssClass() |
| | | { |
| | | return cssClass; |
| | | } |
| | | |
| | | public void setCssClass(String cssClass) |
| | | { |
| | | this.cssClass = cssClass; |
| | | } |
| | | |
| | | public String getListClass() |
| | | { |
| | | return listClass; |
| | | } |
| | | |
| | | public void setListClass(String listClass) |
| | | { |
| | | this.listClass = listClass; |
| | | } |
| | | |
| | | public boolean getDefault() |
| | | { |
| | | return UserConstants.YES.equals(this.isDefault); |
| | | } |
| | | |
| | | public String getIsDefault() |
| | | { |
| | | return isDefault; |
| | | } |
| | | |
| | | public void setIsDefault(String isDefault) |
| | | { |
| | | this.isDefault = isDefault; |
| | | } |
| | | |
| | | public String getStatus() |
| | | { |
| | | return status; |
| | | } |
| | | |
| | | public void setStatus(String status) |
| | | { |
| | | this.status = status; |
| | | } |
| | | |
| | | @Override |
| | | public String toString() { |
| | | return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) |
| | | .append("dictCode", getDictCode()) |
| | | .append("dictSort", getDictSort()) |
| | | .append("dictLabel", getDictLabel()) |
| | | .append("dictValue", getDictValue()) |
| | | .append("dictType", getDictType()) |
| | | .append("cssClass", getCssClass()) |
| | | .append("listClass", getListClass()) |
| | | .append("isDefault", getIsDefault()) |
| | | .append("status", getStatus()) |
| | | .append("createBy", getCreateBy()) |
| | | .append("createTime", getCreateTime()) |
| | | .append("updateBy", getUpdateBy()) |
| | | .append("updateTime", getUpdateTime()) |
| | | .append("remark", getRemark()) |
| | | .toString(); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.domain; |
| | | |
| | | import com.ruoyi.common.core.annotation.Excel; |
| | | import com.ruoyi.common.core.annotation.Excel.ColumnType; |
| | | import com.ruoyi.common.core.web.domain.BaseEntity; |
| | | import org.apache.commons.lang3.builder.ToStringBuilder; |
| | | import org.apache.commons.lang3.builder.ToStringStyle; |
| | | |
| | | import javax.validation.constraints.NotBlank; |
| | | import javax.validation.constraints.Pattern; |
| | | import javax.validation.constraints.Size; |
| | | |
| | | /** |
| | | * 字典类型表 sys_dict_type |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class SysDictType extends BaseEntity |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** 字典主键 */ |
| | | @Excel(name = "字典主键", cellType = ColumnType.NUMERIC) |
| | | private Long dictId; |
| | | |
| | | /** 字典名称 */ |
| | | @Excel(name = "字典名称") |
| | | private String dictName; |
| | | |
| | | /** 字典类型 */ |
| | | @Excel(name = "字典类型") |
| | | private String dictType; |
| | | |
| | | /** 状态(0正常 1停用) */ |
| | | @Excel(name = "状态", readConverterExp = "0=正常,1=停用") |
| | | private String status; |
| | | |
| | | public Long getDictId() |
| | | { |
| | | return dictId; |
| | | } |
| | | |
| | | public void setDictId(Long dictId) |
| | | { |
| | | this.dictId = dictId; |
| | | } |
| | | |
| | | @NotBlank(message = "字典名称不能为空") |
| | | @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符") |
| | | public String getDictName() |
| | | { |
| | | return dictName; |
| | | } |
| | | |
| | | public void setDictName(String dictName) |
| | | { |
| | | this.dictName = dictName; |
| | | } |
| | | |
| | | @NotBlank(message = "字典类型不能为空") |
| | | @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符") |
| | | @Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)") |
| | | public String getDictType() |
| | | { |
| | | return dictType; |
| | | } |
| | | |
| | | public void setDictType(String dictType) |
| | | { |
| | | this.dictType = dictType; |
| | | } |
| | | |
| | | public String getStatus() |
| | | { |
| | | return status; |
| | | } |
| | | |
| | | public void setStatus(String status) |
| | | { |
| | | this.status = status; |
| | | } |
| | | |
| | | @Override |
| | | public String toString() { |
| | | return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) |
| | | .append("dictId", getDictId()) |
| | | .append("dictName", getDictName()) |
| | | .append("dictType", getDictType()) |
| | | .append("status", getStatus()) |
| | | .append("createBy", getCreateBy()) |
| | | .append("createTime", getCreateTime()) |
| | | .append("updateBy", getUpdateBy()) |
| | | .append("updateTime", getUpdateTime()) |
| | | .append("remark", getRemark()) |
| | | .toString(); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.domain; |
| | | |
| | | import org.apache.commons.lang3.builder.ToStringBuilder; |
| | | import org.apache.commons.lang3.builder.ToStringStyle; |
| | | |
| | | /** |
| | | * 文件信息 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class SysFile |
| | | { |
| | | /** |
| | | * 文件名称 |
| | | */ |
| | | private String name; |
| | | |
| | | /** |
| | | * 文件地址 |
| | | */ |
| | | private String url; |
| | | |
| | | public String getName() |
| | | { |
| | | return name; |
| | | } |
| | | |
| | | public void setName(String name) |
| | | { |
| | | this.name = name; |
| | | } |
| | | |
| | | public String getUrl() |
| | | { |
| | | return url; |
| | | } |
| | | |
| | | public void setUrl(String url) |
| | | { |
| | | this.url = url; |
| | | } |
| | | |
| | | @Override |
| | | public String toString() { |
| | | return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) |
| | | .append("name", getName()) |
| | | .append("url", getUrl()) |
| | | .toString(); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.domain; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | 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 io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/8/12 15:38 |
| | | */ |
| | | @Data |
| | | @TableName("sys_login_log") |
| | | @ApiModel |
| | | public class SysLoginLog { |
| | | /** |
| | | * 主键 |
| | | */ |
| | | @ApiModelProperty(value = "数据id") |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | private Integer id; |
| | | /** |
| | | * 用户id |
| | | */ |
| | | @TableField("user_id") |
| | | private Integer userId; |
| | | /** |
| | | * 登录账号 |
| | | */ |
| | | @TableField("username") |
| | | @ApiModelProperty(value = "用户账号") |
| | | private String username; |
| | | /** |
| | | * 登录IP地址 |
| | | */ |
| | | @TableField("ip_address") |
| | | @ApiModelProperty(value = "登录IP地址") |
| | | private String ipAddress; |
| | | /** |
| | | * 登录地址 |
| | | */ |
| | | @TableField("address") |
| | | @ApiModelProperty(value = "登录地址") |
| | | private String address; |
| | | /** |
| | | * 浏览器类型 |
| | | */ |
| | | @TableField("browser_type") |
| | | @ApiModelProperty(value = "浏览器类型") |
| | | private String browserType; |
| | | /** |
| | | * 操作系统 |
| | | */ |
| | | @TableField("operating_system") |
| | | @ApiModelProperty(value = "操作系统") |
| | | private String operatingSystem; |
| | | /** |
| | | * 登录时间 |
| | | */ |
| | | @TableField("login_time") |
| | | @ApiModelProperty(value = "登录时间") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private LocalDateTime loginTime; |
| | | /** |
| | | * 登录状态(1=成功,2=失败) |
| | | */ |
| | | @TableField("login_status") |
| | | private Integer loginStatus; |
| | | /** |
| | | * 提示消息 |
| | | */ |
| | | @TableField("message") |
| | | private String message; |
| | | /** |
| | | * 添加时间 |
| | | */ |
| | | @TableField("create_time") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private LocalDateTime createTime; |
| | | /** |
| | | * 删除状态(0=否,1=是) |
| | | */ |
| | | @TableField("del_flag") |
| | | private Integer delFlag; |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.domain; |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.ruoyi.common.core.annotation.Excel; |
| | | import com.ruoyi.common.core.annotation.Excel.ColumnType; |
| | | import com.ruoyi.common.core.web.domain.BaseEntity; |
| | | |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * 系统访问记录表 sys_logininfor |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class SysLogininfor extends BaseEntity |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** ID */ |
| | | @Excel(name = "序号", cellType = ColumnType.NUMERIC) |
| | | private Long infoId; |
| | | |
| | | /** 用户账号 */ |
| | | @Excel(name = "用户账号") |
| | | private String userName; |
| | | |
| | | /** 状态 0成功 1失败 */ |
| | | @Excel(name = "状态", readConverterExp = "0=成功,1=失败") |
| | | private String status; |
| | | |
| | | /** 地址 */ |
| | | @Excel(name = "地址") |
| | | private String ipaddr; |
| | | |
| | | /** 描述 */ |
| | | @Excel(name = "描述") |
| | | private String msg; |
| | | |
| | | /** 访问时间 */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @Excel(name = "访问时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") |
| | | private Date accessTime; |
| | | |
| | | public Long getInfoId() |
| | | { |
| | | return infoId; |
| | | } |
| | | |
| | | public void setInfoId(Long infoId) |
| | | { |
| | | this.infoId = infoId; |
| | | } |
| | | |
| | | public String getUserName() |
| | | { |
| | | return userName; |
| | | } |
| | | |
| | | public void setUserName(String userName) |
| | | { |
| | | this.userName = userName; |
| | | } |
| | | |
| | | public String getStatus() |
| | | { |
| | | return status; |
| | | } |
| | | |
| | | public void setStatus(String status) |
| | | { |
| | | this.status = status; |
| | | } |
| | | |
| | | public String getIpaddr() |
| | | { |
| | | return ipaddr; |
| | | } |
| | | |
| | | public void setIpaddr(String ipaddr) |
| | | { |
| | | this.ipaddr = ipaddr; |
| | | } |
| | | |
| | | public String getMsg() |
| | | { |
| | | return msg; |
| | | } |
| | | |
| | | public void setMsg(String msg) |
| | | { |
| | | this.msg = msg; |
| | | } |
| | | |
| | | public Date getAccessTime() |
| | | { |
| | | return accessTime; |
| | | } |
| | | |
| | | public void setAccessTime(Date accessTime) |
| | | { |
| | | this.accessTime = accessTime; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.domain; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | 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.ruoyi.common.core.annotation.Excel; |
| | | import com.ruoyi.common.core.annotation.Excel.ColumnType; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * 操作日志记录表 oper_log |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @Data |
| | | @ApiModel |
| | | @TableName("sys_oper_log") |
| | | public class SysOperLog { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * 日志主键 |
| | | */ |
| | | @Excel(name = "操作序号", cellType = ColumnType.NUMERIC) |
| | | @ApiModelProperty("数据id") |
| | | @TableId(value = "oper_id", type = IdType.AUTO) |
| | | private Long operId; |
| | | |
| | | /** |
| | | * 操作模块 |
| | | */ |
| | | @Excel(name = "操作模块") |
| | | @ApiModelProperty("操作模块") |
| | | private String title; |
| | | |
| | | /** |
| | | * 业务类型(0其它 1新增 2修改 3删除) |
| | | */ |
| | | @Excel(name = "业务类型", readConverterExp = "0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据") |
| | | @ApiModelProperty("0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据") |
| | | @TableField("business_type") |
| | | private Integer businessType; |
| | | |
| | | /** |
| | | * 业务类型数组 |
| | | */ |
| | | @TableField(exist = false) |
| | | private Integer[] businessTypes; |
| | | |
| | | /** |
| | | * 请求方法 |
| | | */ |
| | | @Excel(name = "请求方法") |
| | | @ApiModelProperty("请求方法") |
| | | private String method; |
| | | |
| | | /** |
| | | * 请求方式 |
| | | */ |
| | | @Excel(name = "请求方式") |
| | | @ApiModelProperty("请求方式") |
| | | @TableField("request_method") |
| | | private String requestMethod; |
| | | |
| | | /** |
| | | * 操作类别(0其它 1后台用户 2手机端用户) |
| | | */ |
| | | @Excel(name = "操作类别", readConverterExp = "0=其它,1=后台用户,2=手机端用户") |
| | | @ApiModelProperty("0=其它,1=后台用户,2=手机端用户") |
| | | @TableField("operator_type") |
| | | private Integer operatorType; |
| | | |
| | | /** |
| | | * 操作人员 |
| | | */ |
| | | @Excel(name = "操作人员") |
| | | @ApiModelProperty("操作人员") |
| | | @TableField("oper_name") |
| | | private String operName; |
| | | |
| | | /** |
| | | * 部门名称 |
| | | */ |
| | | @Excel(name = "部门名称") |
| | | @ApiModelProperty("部门名称") |
| | | @TableField("dept_name") |
| | | private String deptName; |
| | | |
| | | /** |
| | | * 请求url |
| | | */ |
| | | @Excel(name = "请求地址") |
| | | @ApiModelProperty("请求地址") |
| | | @TableField("oper_url") |
| | | private String operUrl; |
| | | |
| | | /** |
| | | * 操作地址 |
| | | */ |
| | | @Excel(name = "操作地址") |
| | | @ApiModelProperty("操作地址") |
| | | @TableField("oper_ip") |
| | | private String operIp; |
| | | |
| | | /** |
| | | * 请求参数 |
| | | */ |
| | | @Excel(name = "请求参数") |
| | | @ApiModelProperty("请求参数") |
| | | @TableField("oper_param") |
| | | private String operParam; |
| | | |
| | | /** |
| | | * 返回参数 |
| | | */ |
| | | @Excel(name = "返回参数") |
| | | @ApiModelProperty("返回参数") |
| | | @TableField("json_result") |
| | | private String jsonResult; |
| | | |
| | | /** |
| | | * 操作状态(0正常 1异常) |
| | | */ |
| | | @Excel(name = "状态", readConverterExp = "0=正常,1=异常") |
| | | @ApiModelProperty("0=正常,1=异常") |
| | | private Integer status; |
| | | |
| | | /** |
| | | * 错误消息 |
| | | */ |
| | | @Excel(name = "错误消息") |
| | | @ApiModelProperty("错误消息") |
| | | @TableField("error_msg") |
| | | private String errorMsg; |
| | | |
| | | /** |
| | | * 操作时间 |
| | | */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") |
| | | @ApiModelProperty("操作时间") |
| | | @TableField("oper_time") |
| | | private Date operTime; |
| | | |
| | | /** |
| | | * 消耗时间 |
| | | */ |
| | | @Excel(name = "消耗时间", suffix = "毫秒") |
| | | @ApiModelProperty("消耗时间") |
| | | @TableField("cost_time") |
| | | private Long costTime; |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.domain; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.ruoyi.common.core.annotation.Excel; |
| | | import com.ruoyi.common.core.annotation.Excel.ColumnType; |
| | | import com.ruoyi.common.core.web.domain.BaseEntity; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import org.apache.commons.lang3.builder.ToStringBuilder; |
| | | import org.apache.commons.lang3.builder.ToStringStyle; |
| | | |
| | | import javax.validation.constraints.NotBlank; |
| | | import javax.validation.constraints.Size; |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | |
| | | /** |
| | | * 角色表 sys_role |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class SysRole extends BaseEntity |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** 角色ID */ |
| | | @Excel(name = "角色序号", cellType = ColumnType.NUMERIC) |
| | | @TableField("role_id") |
| | | private Long roleId; |
| | | |
| | | /** 角色名称 */ |
| | | @Excel(name = "角色名称") |
| | | @TableField("role_name") |
| | | private String roleName; |
| | | |
| | | /** 角色权限 */ |
| | | @Excel(name = "角色权限") |
| | | @TableField("role_key") |
| | | private String roleKey; |
| | | |
| | | /** 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) */ |
| | | @Excel(name = "数据范围", readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限") |
| | | @TableField("data_scope") |
| | | private String dataScope; |
| | | |
| | | |
| | | /** 角色状态(0正常 1停用) */ |
| | | @Excel(name = "角色状态", readConverterExp = "0=正常,1=停用") |
| | | private String status; |
| | | /** |
| | | * 门店id |
| | | */ |
| | | @TableField("shop_id") |
| | | private Integer shopId; |
| | | |
| | | /** 删除标志(0代表存在 2代表删除) */ |
| | | @TableField("del_flag") |
| | | private String delFlag; |
| | | |
| | | /** 用户是否存在此角色标识 默认不存在 */ |
| | | @TableField(exist = false) |
| | | private boolean flag = false; |
| | | |
| | | /** 菜单组 */ |
| | | @TableField(exist = false) |
| | | private Long[] menuIds; |
| | | |
| | | /** 部门组(数据权限) */ |
| | | @TableField(exist = false) |
| | | private Long[] deptIds; |
| | | |
| | | /** 角色菜单权限 */ |
| | | @TableField(exist = false) |
| | | private Set<String> permissions; |
| | | @ApiModelProperty(value = "站点名称") |
| | | @TableField(exist = false) |
| | | private List<String> siteNames; |
| | | |
| | | @TableField(exist = false) |
| | | private Long number; |
| | | |
| | | |
| | | public SysRole() |
| | | { |
| | | |
| | | } |
| | | |
| | | public SysRole(Long roleId) |
| | | { |
| | | this.roleId = roleId; |
| | | } |
| | | |
| | | public Long getRoleId() |
| | | { |
| | | return roleId; |
| | | } |
| | | |
| | | public void setRoleId(Long roleId) |
| | | { |
| | | this.roleId = roleId; |
| | | } |
| | | |
| | | public boolean isAdmin() |
| | | { |
| | | return isAdmin(this.roleId); |
| | | } |
| | | |
| | | public static boolean isAdmin(Long roleId) |
| | | { |
| | | return roleId != null && 1L == roleId; |
| | | } |
| | | |
| | | @NotBlank(message = "角色名称不能为空") |
| | | @Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符") |
| | | public String getRoleName() |
| | | { |
| | | return roleName; |
| | | } |
| | | |
| | | public void setRoleName(String roleName) |
| | | { |
| | | this.roleName = roleName; |
| | | } |
| | | |
| | | @NotBlank(message = "权限字符不能为空") |
| | | @Size(min = 0, max = 100, message = "权限字符长度不能超过100个字符") |
| | | public String getRoleKey() |
| | | { |
| | | return roleKey; |
| | | } |
| | | |
| | | public void setRoleKey(String roleKey) |
| | | { |
| | | this.roleKey = roleKey; |
| | | } |
| | | |
| | | public String getDataScope() |
| | | { |
| | | return dataScope; |
| | | } |
| | | |
| | | public void setDataScope(String dataScope) |
| | | { |
| | | this.dataScope = dataScope; |
| | | } |
| | | |
| | | public String getStatus() |
| | | { |
| | | return status; |
| | | } |
| | | |
| | | public void setStatus(String status) |
| | | { |
| | | this.status = status; |
| | | } |
| | | |
| | | public String getDelFlag() |
| | | { |
| | | return delFlag; |
| | | } |
| | | |
| | | public void setDelFlag(String delFlag) |
| | | { |
| | | this.delFlag = delFlag; |
| | | } |
| | | |
| | | public boolean isFlag() |
| | | { |
| | | return flag; |
| | | } |
| | | |
| | | public void setFlag(boolean flag) |
| | | { |
| | | this.flag = flag; |
| | | } |
| | | |
| | | public Long[] getMenuIds() |
| | | { |
| | | return menuIds; |
| | | } |
| | | |
| | | public void setMenuIds(Long[] menuIds) |
| | | { |
| | | this.menuIds = menuIds; |
| | | } |
| | | |
| | | public Long[] getDeptIds() |
| | | { |
| | | return deptIds; |
| | | } |
| | | |
| | | public void setDeptIds(Long[] deptIds) |
| | | { |
| | | this.deptIds = deptIds; |
| | | } |
| | | |
| | | public Set<String> getPermissions() |
| | | { |
| | | return permissions; |
| | | } |
| | | |
| | | public void setPermissions(Set<String> permissions) |
| | | { |
| | | this.permissions = permissions; |
| | | } |
| | | |
| | | public List<String> getSiteNames() { |
| | | return siteNames; |
| | | } |
| | | |
| | | public void setSiteNames(List<String> siteNames) { |
| | | this.siteNames = siteNames; |
| | | } |
| | | |
| | | public Long getNumber() { |
| | | return number; |
| | | } |
| | | |
| | | public void setNumber(Long number) { |
| | | this.number = number; |
| | | } |
| | | |
| | | public Integer getShopId() { |
| | | return shopId; |
| | | } |
| | | |
| | | public void setShopId(Integer shopId) { |
| | | this.shopId = shopId; |
| | | } |
| | | |
| | | @Override |
| | | public String toString() { |
| | | return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) |
| | | .append("roleId", getRoleId()) |
| | | .append("roleName", getRoleName()) |
| | | .append("roleKey", getRoleKey()) |
| | | .append("dataScope", getDataScope()) |
| | | .append("status", getStatus()) |
| | | .append("delFlag", getDelFlag()) |
| | | .append("createBy", getCreateBy()) |
| | | .append("createTime", getCreateTime()) |
| | | .append("updateBy", getUpdateBy()) |
| | | .append("updateTime", getUpdateTime()) |
| | | .append("remark", getRemark()) |
| | | .toString(); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.domain; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.ruoyi.common.core.annotation.Excel; |
| | | import com.ruoyi.common.core.annotation.Excel.ColumnType; |
| | | import com.ruoyi.common.core.annotation.Excel.Type; |
| | | import com.ruoyi.common.core.annotation.Excels; |
| | | import com.ruoyi.common.core.web.domain.BaseEntity; |
| | | import com.ruoyi.common.core.xss.Xss; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import org.apache.commons.lang3.builder.ToStringBuilder; |
| | | import org.apache.commons.lang3.builder.ToStringStyle; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import javax.validation.constraints.Email; |
| | | import javax.validation.constraints.NotBlank; |
| | | import javax.validation.constraints.Size; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 用户对象 sys_user |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class SysUser extends BaseEntity |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** 用户ID */ |
| | | @Excel(name = "用户序号", cellType = ColumnType.NUMERIC, prompt = "用户编号") |
| | | @TableId(value = "user_id", type = IdType.AUTO) |
| | | private Long userId; |
| | | |
| | | /** 部门ID */ |
| | | @Excel(name = "部门编号", type = Type.IMPORT) |
| | | @TableField("dept_id") |
| | | private Long deptId; |
| | | |
| | | /** 用户账号 */ |
| | | @Excel(name = "登录名称") |
| | | @TableField("user_name") |
| | | private String userName; |
| | | |
| | | /** 用户昵称 */ |
| | | @Excel(name = "用户名称") |
| | | @NotBlank(message = "姓名不能为空") |
| | | @TableField("nick_name") |
| | | private String nickName; |
| | | |
| | | /** 用户邮箱 */ |
| | | @Excel(name = "用户邮箱") |
| | | private String email; |
| | | |
| | | /** 手机号码 */ |
| | | @Excel(name = "手机号码") |
| | | @NotBlank(message = "请输入账号") |
| | | private String phonenumber; |
| | | |
| | | /** 用户性别 */ |
| | | @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知") |
| | | private String sex; |
| | | |
| | | /** 用户头像 */ |
| | | private String avatar; |
| | | |
| | | /** 密码 */ |
| | | private String password; |
| | | |
| | | /** 帐号状态(0正常 1停用) */ |
| | | @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用") |
| | | private String status; |
| | | |
| | | /** 删除标志(0代表存在 2代表删除) */ |
| | | @TableField("del_flag") |
| | | private String delFlag; |
| | | |
| | | /** 最后登录IP */ |
| | | @Excel(name = "最后登录IP", type = Type.EXPORT) |
| | | @TableField("login_ip") |
| | | private String loginIp; |
| | | |
| | | /** 最后登录时间 */ |
| | | @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT) |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @TableField("login_date") |
| | | private Date loginDate; |
| | | |
| | | /** 部门对象 */ |
| | | @Excels({ |
| | | @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT), |
| | | @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT) |
| | | }) |
| | | @TableField(exist = false) |
| | | private SysDept dept; |
| | | |
| | | /** 角色对象 */ |
| | | @TableField(exist = false) |
| | | private List<SysRole> roles; |
| | | |
| | | /** 角色组 */ |
| | | @TableField(exist = false) |
| | | private Long[] roleIds; |
| | | |
| | | /** 岗位组 */ |
| | | @TableField(exist = false) |
| | | private Long[] postIds; |
| | | |
| | | /** 角色ID */ |
| | | @TableField(exist = false) |
| | | private Long roleId; |
| | | |
| | | /** |
| | | * 角色类型 1=平台 2=门店 |
| | | */ |
| | | @ApiModelProperty(value = "角色类型 1=平台 2=门店") |
| | | @TableField("role_type") |
| | | private Integer roleType; |
| | | |
| | | @Excel(name = "密码修改时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT) |
| | | private Date passWordUpdate; |
| | | |
| | | @ApiModelProperty(value = "对象ID") |
| | | @TableField("objectId") |
| | | private Integer objectId; |
| | | |
| | | @ApiModelProperty(value = "备注") |
| | | private String remark; |
| | | |
| | | @ApiModelProperty(value = "禁用账户备注") |
| | | @TableField("forbidden_remark") |
| | | private String forbiddenRemark; |
| | | |
| | | @ApiModelProperty(value = "前端用户id") |
| | | @TableField("app_user_id") |
| | | private Long appUserId; |
| | | |
| | | @ApiModelProperty(value = "角色") |
| | | @TableField(exist = false) |
| | | private List<String> roleNames; |
| | | |
| | | |
| | | |
| | | @Override |
| | | public String getRemark() { |
| | | return remark; |
| | | } |
| | | |
| | | @Override |
| | | public void setRemark(String remark) { |
| | | this.remark = remark; |
| | | } |
| | | |
| | | public SysUser() |
| | | { |
| | | |
| | | } |
| | | |
| | | public SysUser(Long userId) |
| | | { |
| | | this.userId = userId; |
| | | } |
| | | |
| | | public Integer getRoleType() { |
| | | return roleType; |
| | | } |
| | | |
| | | public void setRoleType(Integer roleType) { |
| | | this.roleType = roleType; |
| | | } |
| | | |
| | | public Date getPassWordUpdate() { |
| | | return passWordUpdate; |
| | | } |
| | | |
| | | public void setPassWordUpdate(Date passWordUpdate) { |
| | | this.passWordUpdate = passWordUpdate; |
| | | } |
| | | |
| | | public Integer getObjectId() { |
| | | return objectId; |
| | | } |
| | | |
| | | public void setObjectId(Integer objectId) { |
| | | this.objectId = objectId; |
| | | } |
| | | |
| | | public Long getUserId() |
| | | { |
| | | return userId; |
| | | } |
| | | |
| | | public void setUserId(Long userId) |
| | | { |
| | | this.userId = userId; |
| | | } |
| | | |
| | | public boolean isAdmin() |
| | | { |
| | | return isAdmin(this.userId); |
| | | } |
| | | |
| | | public static boolean isAdmin(Long userId) |
| | | { |
| | | return userId != null && 1L == userId; |
| | | } |
| | | |
| | | public Long getDeptId() |
| | | { |
| | | return deptId; |
| | | } |
| | | |
| | | public void setDeptId(Long deptId) |
| | | { |
| | | this.deptId = deptId; |
| | | } |
| | | |
| | | @Xss(message = "用户昵称不能包含脚本字符") |
| | | @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符") |
| | | public String getNickName() |
| | | { |
| | | return nickName; |
| | | } |
| | | |
| | | public void setNickName(String nickName) |
| | | { |
| | | this.nickName = nickName; |
| | | } |
| | | |
| | | @Xss(message = "用户账号不能包含脚本字符") |
| | | @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符") |
| | | public String getUserName() |
| | | { |
| | | return userName; |
| | | } |
| | | |
| | | public void setUserName(String userName) |
| | | { |
| | | this.userName = userName; |
| | | } |
| | | |
| | | @Email(message = "邮箱格式不正确") |
| | | @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") |
| | | public String getEmail() |
| | | { |
| | | return email; |
| | | } |
| | | |
| | | public void setEmail(String email) |
| | | { |
| | | this.email = email; |
| | | } |
| | | |
| | | @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符") |
| | | public String getPhonenumber() |
| | | { |
| | | return phonenumber; |
| | | } |
| | | |
| | | public void setPhonenumber(String phonenumber) |
| | | { |
| | | this.phonenumber = phonenumber; |
| | | } |
| | | |
| | | public String getSex() |
| | | { |
| | | return sex; |
| | | } |
| | | |
| | | public void setSex(String sex) |
| | | { |
| | | this.sex = sex; |
| | | } |
| | | |
| | | public String getAvatar() |
| | | { |
| | | return avatar; |
| | | } |
| | | |
| | | public void setAvatar(String avatar) |
| | | { |
| | | this.avatar = avatar; |
| | | } |
| | | |
| | | public String getPassword() |
| | | { |
| | | return password; |
| | | } |
| | | |
| | | public void setPassword(String password) |
| | | { |
| | | this.password = password; |
| | | } |
| | | |
| | | public String getStatus() |
| | | { |
| | | return status; |
| | | } |
| | | |
| | | public void setStatus(String status) |
| | | { |
| | | this.status = status; |
| | | } |
| | | |
| | | public String getDelFlag() |
| | | { |
| | | return delFlag; |
| | | } |
| | | |
| | | public void setDelFlag(String delFlag) |
| | | { |
| | | this.delFlag = delFlag; |
| | | } |
| | | |
| | | public String getLoginIp() |
| | | { |
| | | return loginIp; |
| | | } |
| | | |
| | | public void setLoginIp(String loginIp) |
| | | { |
| | | this.loginIp = loginIp; |
| | | } |
| | | |
| | | public Date getLoginDate() |
| | | { |
| | | return loginDate; |
| | | } |
| | | |
| | | public void setLoginDate(Date loginDate) |
| | | { |
| | | this.loginDate = loginDate; |
| | | } |
| | | |
| | | public SysDept getDept() |
| | | { |
| | | return dept; |
| | | } |
| | | |
| | | public void setDept(SysDept dept) |
| | | { |
| | | this.dept = dept; |
| | | } |
| | | |
| | | public List<SysRole> getRoles() |
| | | { |
| | | return roles; |
| | | } |
| | | |
| | | public void setRoles(List<SysRole> roles) |
| | | { |
| | | this.roles = roles; |
| | | } |
| | | |
| | | public Long[] getRoleIds() |
| | | { |
| | | return roleIds; |
| | | } |
| | | |
| | | public void setRoleIds(Long[] roleIds) |
| | | { |
| | | this.roleIds = roleIds; |
| | | } |
| | | |
| | | public Long[] getPostIds() |
| | | { |
| | | return postIds; |
| | | } |
| | | |
| | | public void setPostIds(Long[] postIds) |
| | | { |
| | | this.postIds = postIds; |
| | | } |
| | | |
| | | public Long getRoleId() |
| | | { |
| | | return roleId; |
| | | } |
| | | |
| | | public void setRoleId(Long roleId) |
| | | { |
| | | this.roleId = roleId; |
| | | } |
| | | |
| | | public Long getAppUserId() { |
| | | return appUserId; |
| | | } |
| | | |
| | | public void setAppUserId(Long appUserId) { |
| | | this.appUserId = appUserId; |
| | | } |
| | | |
| | | public void setRoleNames(List<String> roleNames) { |
| | | this.roleNames = roleNames; |
| | | } |
| | | |
| | | public String getForbiddenRemark() { |
| | | return forbiddenRemark; |
| | | } |
| | | |
| | | public void setForbiddenRemark(String forbiddenRemark) { |
| | | this.forbiddenRemark = forbiddenRemark; |
| | | } |
| | | |
| | | public List<String> getRoleNames() { |
| | | return roleNames; |
| | | } |
| | | |
| | | @Override |
| | | public String toString() { |
| | | return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) |
| | | .append("userId", getUserId()) |
| | | .append("deptId", getDeptId()) |
| | | .append("userName", getUserName()) |
| | | .append("nickName", getNickName()) |
| | | .append("email", getEmail()) |
| | | .append("phonenumber", getPhonenumber()) |
| | | .append("sex", getSex()) |
| | | .append("avatar", getAvatar()) |
| | | .append("password", getPassword()) |
| | | .append("status", getStatus()) |
| | | .append("delFlag", getDelFlag()) |
| | | .append("loginIp", getLoginIp()) |
| | | .append("loginDate", getLoginDate()) |
| | | .append("createBy", getCreateBy()) |
| | | .append("createTime", getCreateTime()) |
| | | .append("updateBy", getUpdateBy()) |
| | | .append("updateTime", getUpdateTime()) |
| | | .append("remark", getRemark()) |
| | | .append("dept", getDept()) |
| | | .toString(); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.factory; |
| | | |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.system.api.RemoteFileService; |
| | | import com.ruoyi.system.api.domain.SysFile; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.cloud.openfeign.FallbackFactory; |
| | | import org.springframework.stereotype.Component; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | /** |
| | | * 文件服务降级处理 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @Component |
| | | public class RemoteFileFallbackFactory implements FallbackFactory<RemoteFileService> |
| | | { |
| | | private static final Logger log = LoggerFactory.getLogger(RemoteFileFallbackFactory.class); |
| | | |
| | | @Override |
| | | public RemoteFileService create(Throwable throwable) |
| | | { |
| | | log.error("文件服务调用失败:{}", throwable.getMessage()); |
| | | return new RemoteFileService() |
| | | { |
| | | @Override |
| | | public R<SysFile> upload(MultipartFile file) |
| | | { |
| | | return R.fail("上传文件失败:" + throwable.getMessage()); |
| | | } |
| | | }; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.factory; |
| | | |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.system.api.RemoteLogService; |
| | | import com.ruoyi.system.api.domain.SysOperLog; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.cloud.openfeign.FallbackFactory; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * 日志服务降级处理 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @Component |
| | | public class RemoteLogFallbackFactory implements FallbackFactory<RemoteLogService> |
| | | { |
| | | private static final Logger log = LoggerFactory.getLogger(RemoteLogFallbackFactory.class); |
| | | |
| | | @Override |
| | | public RemoteLogService create(Throwable throwable) { |
| | | log.error("日志服务调用失败:{}", throwable.getMessage()); |
| | | return new RemoteLogService() |
| | | { |
| | | @Override |
| | | public R<Boolean> saveLog(SysOperLog sysOperLog, String source) |
| | | { |
| | | return null; |
| | | } |
| | | |
| | | }; |
| | | |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.factory; |
| | | |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.system.api.RemoteUserService; |
| | | import com.ruoyi.system.api.domain.SysUser; |
| | | import com.ruoyi.system.api.model.LoginUser; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.cloud.openfeign.FallbackFactory; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * 用户服务降级处理 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @Component |
| | | public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserService> |
| | | { |
| | | private static final Logger log = LoggerFactory.getLogger(RemoteUserFallbackFactory.class); |
| | | |
| | | @Override |
| | | public RemoteUserService create(Throwable throwable) |
| | | { |
| | | log.error("用户服务调用失败:{}", throwable.getMessage()); |
| | | return new RemoteUserService() |
| | | { |
| | | @Override |
| | | public R<LoginUser> getUserInfo(String username, String source) |
| | | { |
| | | return R.fail("获取用户失败:" + throwable.getMessage()); |
| | | } |
| | | @Override |
| | | public R<LoginUser> infoShop(String username, String source) |
| | | { |
| | | return R.fail("门店登录获取用户失败:" + throwable.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<Boolean> registerUserInfo(SysUser sysUser, String source) |
| | | { |
| | | return R.fail("注册用户失败:" + throwable.getMessage()); |
| | | } |
| | | }; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.factory; |
| | | |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.system.api.domain.SysLoginLog; |
| | | import com.ruoyi.system.api.feignClient.SysLoginLogClient; |
| | | import org.springframework.cloud.openfeign.FallbackFactory; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | @Component |
| | | public class SysLoginLogFallbackFactory implements FallbackFactory<SysLoginLogClient> { |
| | | @Override |
| | | public SysLoginLogClient create(Throwable cause) { |
| | | return new SysLoginLogClient(){ |
| | | |
| | | |
| | | @Override |
| | | public R saveLoginLog(SysLoginLog loginLog) { |
| | | return R.fail("添加登录日志失败!" + cause.getMessage()); |
| | | } |
| | | }; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.factory; |
| | | |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.system.api.domain.SysRole; |
| | | import com.ruoyi.system.api.feignClient.SysRoleClient; |
| | | import com.ruoyi.system.api.model.GetSysRoleByIds; |
| | | import org.springframework.cloud.openfeign.FallbackFactory; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author Pu Zhibing |
| | | */ |
| | | @Component |
| | | public class SysRoleFallbackFactory implements FallbackFactory<SysRoleClient> { |
| | | |
| | | @Override |
| | | public SysRoleClient create(Throwable cause) { |
| | | return new SysRoleClient(){ |
| | | @Override |
| | | public R<List<SysRole>> getSysRoleByIds(GetSysRoleByIds ids) { |
| | | return R.fail("获取角色失败:" + cause.getMessage()); |
| | | } |
| | | }; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.factory; |
| | | |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.system.api.domain.SysRole; |
| | | import com.ruoyi.system.api.domain.SysUser; |
| | | import com.ruoyi.system.api.feignClient.SysUserClient; |
| | | import org.springframework.cloud.openfeign.FallbackFactory; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.List; |
| | | @Component |
| | | public class SysUserFallbackFactory implements FallbackFactory<SysUserClient> { |
| | | @Override |
| | | public SysUserClient create(Throwable cause) { |
| | | return new SysUserClient(){ |
| | | |
| | | @Override |
| | | public R<SysUser> getSysUser(Long userId) { |
| | | System.out.println(cause.getMessage()); |
| | | return R.fail("获取用户失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<Boolean> updateSysUser(SysUser sysUser) { |
| | | return R.fail("更新用户失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<List<SysUser>> getUserList(List<Integer> userIds) { |
| | | return R.fail("通过用户id集合查询用户失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<Integer> isAdmin(Long userId) { |
| | | return R.fail("获取角色信息失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<Boolean> updateUser(SysUser sysUser) { |
| | | return R.fail("修改用户信息失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<SysRole> queryRoleByUserId(Long userId) { |
| | | return R.fail("通过用户id查询角色对象失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<SysRole> queryRoleByRoleId(Long roleId) { |
| | | return R.fail("通过角色id查询角色对象失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<List<SysUser>> queryUserByPhoneList(List<String> phoneList) { |
| | | return R.fail("通过手机号集合查询用户失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<SysUser> queryUserByPhone(String phone) { |
| | | return R.fail("通过手机号查询用户失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<SysUser> queryUserByUserName(String userName) { |
| | | return R.fail("通过账号查询用户失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R<SysUser> queryUserByUserNameAndRoleType(String userName, Integer roleType) { |
| | | return R.fail("通过账号和账号权限查询用户失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R addSysUser(SysUser user) { |
| | | return R.fail("添加用户失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R resetPassword(SysUser user) { |
| | | return R.fail("重置用户密码失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R saveShopUser(SysUser user) { |
| | | return R.fail("新增加门店员工账号数据失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R delShopUser(Integer objectId, Integer roleType) { |
| | | return R.fail("删除门店管理员账号失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R delSysUserById(Long userId) { |
| | | return R.fail("根据id删除管理员账户失败:" + cause.getMessage()); |
| | | } |
| | | }; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.factory; |
| | | |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.system.api.feignClient.SysUserRoleClient; |
| | | import com.ruoyi.system.api.model.SysUserRoleVo; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.List; |
| | | |
| | | @Component |
| | | public class SysUserRoleFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<SysUserRoleClient> { |
| | | @Override |
| | | public SysUserRoleClient create(Throwable cause) { |
| | | return new SysUserRoleClient(){ |
| | | |
| | | |
| | | @Override |
| | | public R<List<SysUserRoleVo>> getRoleByUserId(Long userId) { |
| | | return R.fail("根据用户id获取角色失败:" + cause.getMessage()); |
| | | } |
| | | }; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.factory; |
| | | |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.system.api.feignClient.UserShopClient; |
| | | import com.ruoyi.system.api.model.UserShop; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @date 2025/1/2 18:02 |
| | | */ |
| | | public class UserShopClientFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<UserShopClient> { |
| | | @Override |
| | | public UserShopClient create(Throwable cause) { |
| | | return new UserShopClient(){ |
| | | |
| | | @Override |
| | | public R<List<UserShop>> getUserShop(UserShop userShop) { |
| | | return R.fail("获取用户门店关系数据失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R saveUserShop(UserShop userShop) { |
| | | return R.fail("保存门店用户关系数据失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R delUserShop(UserShop userShop) { |
| | | return R.fail("删除后台账号和门店关系数据失败:" + cause.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public R delShopAllUserShop(Integer shopId) { |
| | | return R.fail("删除门店所有后台账号和门店关系数据失败:" + cause.getMessage()); |
| | | } |
| | | }; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.feignClient; |
| | | |
| | | import com.ruoyi.common.core.constant.ServiceNameConstants; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.system.api.domain.SysLoginLog; |
| | | import com.ruoyi.system.api.factory.SysLoginLogFallbackFactory; |
| | | import org.springframework.cloud.openfeign.FeignClient; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/8/12 16:30 |
| | | */ |
| | | @FeignClient(contextId = "SysLoginLogClient", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = SysLoginLogFallbackFactory.class) |
| | | public interface SysLoginLogClient { |
| | | |
| | | |
| | | /** |
| | | * 添加登陆日志 |
| | | * @param loginLog |
| | | * @return |
| | | */ |
| | | @PostMapping("/sysLoginLog/saveLoginLog") |
| | | R saveLoginLog(@RequestBody SysLoginLog loginLog); |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.feignClient; |
| | | |
| | | import com.ruoyi.common.core.constant.ServiceNameConstants; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.system.api.domain.SysRole; |
| | | import com.ruoyi.system.api.factory.SysRoleFallbackFactory; |
| | | import com.ruoyi.system.api.model.GetSysRoleByIds; |
| | | import org.springframework.cloud.openfeign.FeignClient; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/8/7 15:14 |
| | | */ |
| | | @FeignClient(contextId = "SysRoleClient", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = SysRoleFallbackFactory.class) |
| | | public interface SysRoleClient { |
| | | |
| | | @PostMapping("/role/getSysRoleByIds") |
| | | public R<List<SysRole>> getSysRoleByIds(GetSysRoleByIds ids); |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.feignClient; |
| | | |
| | | import com.ruoyi.common.core.constant.ServiceNameConstants; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.system.api.domain.SysRole; |
| | | import com.ruoyi.system.api.domain.SysUser; |
| | | import com.ruoyi.system.api.factory.SysUserFallbackFactory; |
| | | import org.springframework.cloud.openfeign.FeignClient; |
| | | import org.springframework.web.bind.annotation.PathVariable; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | |
| | | import java.util.List; |
| | | |
| | | @FeignClient(contextId = "sysUserClient", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = SysUserFallbackFactory.class) |
| | | public interface SysUserClient { |
| | | |
| | | @PostMapping("/user/getSysUser") |
| | | R<SysUser> getSysUser(@RequestParam("userId")Long userId); |
| | | |
| | | @PostMapping("/user/updateSysUser") |
| | | R<Boolean> updateSysUser(@RequestBody SysUser sysUser); |
| | | |
| | | @PostMapping("/user/getUserList") |
| | | R<List<SysUser>> getUserList(@RequestBody List<Integer> userIds); |
| | | |
| | | |
| | | @PostMapping("/user/isAdmin") |
| | | R<Integer> isAdmin(Long userId); |
| | | |
| | | @PostMapping("/user/updateUser") |
| | | R<Boolean> updateUser(@RequestBody SysUser sysUser); |
| | | |
| | | /** |
| | | * 通过用户id查询角色对象 |
| | | * @param userId |
| | | * @return |
| | | */ |
| | | @PostMapping("/user/queryRoleByUserId/{userId}") |
| | | R<SysRole> queryRoleByUserId(@PathVariable("userId") Long userId); |
| | | |
| | | |
| | | /** |
| | | * 通过角色id查询角色对象 |
| | | * @param roleId |
| | | * @return |
| | | */ |
| | | @PostMapping("/user/queryRoleByRoleId/{roleId}") |
| | | R<SysRole> queryRoleByRoleId(@PathVariable("roleId") Long roleId); |
| | | |
| | | /** |
| | | * 通过手机号集合查询用户 |
| | | * @param phoneList |
| | | * @return |
| | | */ |
| | | @PostMapping("/user/queryUserByPhoneList") |
| | | R<List<SysUser>> queryUserByPhoneList(@RequestBody List<String> phoneList); |
| | | |
| | | /** |
| | | * 通过手机号查询用户 |
| | | * @param phone |
| | | * @return |
| | | */ |
| | | @PostMapping("/user/queryUserByPhone") |
| | | R<SysUser> queryUserByPhone(@RequestBody String phone); |
| | | |
| | | /** |
| | | * 通过账号查询用户 |
| | | * @param userName |
| | | * @return |
| | | */ |
| | | @PostMapping("/user/queryUserByUserName") |
| | | R<SysUser> queryUserByUserName(@RequestBody String userName); |
| | | |
| | | /** |
| | | * 通过账号和账号权限查询用户 |
| | | * @param userName |
| | | * @return |
| | | */ |
| | | @PostMapping("/user/queryUserByUserNameAndRoleType") |
| | | R<SysUser> queryUserByUserNameAndRoleType(@RequestParam("userName") String userName, @RequestParam("roleType") Integer roleType); |
| | | |
| | | /** |
| | | * 新增加用户信息 |
| | | * @param user |
| | | */ |
| | | @PostMapping("/user/addSysUser") |
| | | R<Long> addSysUser(@RequestBody SysUser user); |
| | | |
| | | |
| | | /** |
| | | * 重置密码 |
| | | * @param user |
| | | * @return |
| | | */ |
| | | @PostMapping("/user/resetPassword") |
| | | R resetPassword(@RequestBody SysUser user); |
| | | |
| | | |
| | | /** |
| | | * 新增加门店员工账号数据 |
| | | * @param user |
| | | * @return |
| | | */ |
| | | @PostMapping("/user/saveShopUser") |
| | | R<Long> saveShopUser(@RequestBody SysUser user); |
| | | |
| | | /** |
| | | * 删除门店所有管理员账号 |
| | | * @param objectId |
| | | * @param roleType |
| | | * @return |
| | | */ |
| | | @PostMapping("/user/user/delShopUser") |
| | | R delShopUser(@RequestParam("objectId") Integer objectId, @RequestParam("roleType") Integer roleType); |
| | | |
| | | |
| | | /** |
| | | * 根据id删除管理员账户 |
| | | * @param userId |
| | | * @return |
| | | */ |
| | | @PostMapping("/user/delSysUserById") |
| | | R delSysUserById(@RequestParam("userId") Long userId); |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.feignClient; |
| | | |
| | | import com.ruoyi.common.core.constant.ServiceNameConstants; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.system.api.factory.SysUserRoleFallbackFactory; |
| | | import com.ruoyi.system.api.model.SysUserRoleVo; |
| | | import org.springframework.cloud.openfeign.FeignClient; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @date 2024/9/4 9:49 |
| | | */ |
| | | @FeignClient(contextId = "SysUserRoleClient", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = SysUserRoleFallbackFactory.class) |
| | | public interface SysUserRoleClient { |
| | | |
| | | |
| | | /** |
| | | * 根据用户id获取角色 |
| | | * @param userId |
| | | * @return |
| | | */ |
| | | @PostMapping("/userRole/getRoleByUserId") |
| | | R<List<SysUserRoleVo>> getRoleByUserId(@RequestParam("userId") Long userId); |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.feignClient; |
| | | |
| | | import com.ruoyi.common.core.constant.ServiceNameConstants; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.system.api.factory.UserShopClientFallbackFactory; |
| | | import com.ruoyi.system.api.model.UserShop; |
| | | import org.springframework.cloud.openfeign.FeignClient; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @date 2025/1/2 18:02 |
| | | */ |
| | | @FeignClient(contextId = "UserShopClient", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = UserShopClientFallbackFactory.class) |
| | | public interface UserShopClient { |
| | | |
| | | |
| | | /** |
| | | * 获取用户门店关系数据 |
| | | * @param userShop |
| | | * @return |
| | | */ |
| | | @PostMapping("/userShop/getUserShop") |
| | | R<List<UserShop>> getUserShop(@RequestBody UserShop userShop); |
| | | |
| | | |
| | | /** |
| | | * 保存门店用户关系数据 |
| | | * @param userShop |
| | | * @return |
| | | */ |
| | | @PostMapping("/userShop/saveUserShop") |
| | | R saveUserShop(@RequestBody UserShop userShop); |
| | | |
| | | /** |
| | | * 删除后台账号和门店关系数据 |
| | | * @param userShop |
| | | * @return |
| | | */ |
| | | @PostMapping("/userShop/delUserShop") |
| | | R delUserShop(@RequestBody UserShop userShop); |
| | | |
| | | /** |
| | | * 删除门店所有后台账号和门店关系数据 |
| | | * @param shopId |
| | | * @return |
| | | */ |
| | | @PostMapping("/userShop/delShopAllUserShop") |
| | | R delShopAllUserShop(@RequestParam("shopId") Integer shopId); |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.model; |
| | | |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | @Data |
| | | public class CompanyAddSysUserDto { |
| | | List<CompanyUserListVo> list; |
| | | @ApiModelProperty("公司id") |
| | | private Integer companyId; |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.model; |
| | | |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Data; |
| | | import lombok.NoArgsConstructor; |
| | | |
| | | import java.util.List; |
| | | |
| | | @Data |
| | | @AllArgsConstructor |
| | | @NoArgsConstructor |
| | | public class CompanySysUserReq { |
| | | private Integer companyId; |
| | | private String name; |
| | | private List<Integer> userIds; |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.model; |
| | | |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class CompanyUserListVo { |
| | | private Long id; |
| | | |
| | | private String userName; |
| | | |
| | | private String phoneNumber; |
| | | |
| | | private String password; |
| | | |
| | | private String nickName; |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.model; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/8/7 15:06 |
| | | */ |
| | | @Data |
| | | public class GetSysRoleByIds { |
| | | /** |
| | | * ids |
| | | */ |
| | | private List<Integer> ids; |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.model; |
| | | |
| | | import com.ruoyi.system.api.domain.SysUser; |
| | | |
| | | import java.io.Serializable; |
| | | import java.util.Set; |
| | | |
| | | /** |
| | | * 用户信息 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class LoginUser implements Serializable |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * 用户唯一标识 |
| | | */ |
| | | private String token; |
| | | |
| | | /** |
| | | * 用户名id |
| | | */ |
| | | private Long userid; |
| | | |
| | | /** |
| | | * 用户名 |
| | | */ |
| | | private String username; |
| | | |
| | | /** |
| | | * 登录时间 |
| | | */ |
| | | private Long loginTime; |
| | | |
| | | /** |
| | | * 过期时间 |
| | | */ |
| | | private Long expireTime; |
| | | |
| | | /** |
| | | * 登录IP地址 |
| | | */ |
| | | private String ipaddr; |
| | | |
| | | /** |
| | | * 权限列表 |
| | | */ |
| | | private Set<String> permissions; |
| | | |
| | | /** |
| | | * 角色列表 |
| | | */ |
| | | private Set<String> roles; |
| | | |
| | | /** |
| | | * 用户信息 |
| | | */ |
| | | private SysUser sysUser; |
| | | |
| | | public String getToken() |
| | | { |
| | | return token; |
| | | } |
| | | |
| | | public void setToken(String token) |
| | | { |
| | | this.token = token; |
| | | } |
| | | |
| | | public Long getUserid() |
| | | { |
| | | return userid; |
| | | } |
| | | |
| | | public void setUserid(Long userid) |
| | | { |
| | | this.userid = userid; |
| | | } |
| | | |
| | | public String getUsername() |
| | | { |
| | | return username; |
| | | } |
| | | |
| | | public void setUsername(String username) |
| | | { |
| | | this.username = username; |
| | | } |
| | | |
| | | public Long getLoginTime() |
| | | { |
| | | return loginTime; |
| | | } |
| | | |
| | | public void setLoginTime(Long loginTime) |
| | | { |
| | | this.loginTime = loginTime; |
| | | } |
| | | |
| | | public Long getExpireTime() |
| | | { |
| | | return expireTime; |
| | | } |
| | | |
| | | public void setExpireTime(Long expireTime) |
| | | { |
| | | this.expireTime = expireTime; |
| | | } |
| | | |
| | | public String getIpaddr() |
| | | { |
| | | return ipaddr; |
| | | } |
| | | |
| | | public void setIpaddr(String ipaddr) |
| | | { |
| | | this.ipaddr = ipaddr; |
| | | } |
| | | |
| | | public Set<String> getPermissions() |
| | | { |
| | | return permissions; |
| | | } |
| | | |
| | | public void setPermissions(Set<String> permissions) |
| | | { |
| | | this.permissions = permissions; |
| | | } |
| | | |
| | | public Set<String> getRoles() |
| | | { |
| | | return roles; |
| | | } |
| | | |
| | | public void setRoles(Set<String> roles) |
| | | { |
| | | this.roles = roles; |
| | | } |
| | | |
| | | public SysUser getSysUser() |
| | | { |
| | | return sysUser; |
| | | } |
| | | |
| | | public void setSysUser(SysUser sysUser) |
| | | { |
| | | this.sysUser = sysUser; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.model; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * 用户信息 小程序登录使用 |
| | | * |
| | | * @author 无关风月 |
| | | */ |
| | | @Data |
| | | public class LoginUserApplet implements Serializable { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * 用户唯一标识 |
| | | */ |
| | | private String token; |
| | | /** |
| | | * 用户姓名 |
| | | */ |
| | | private String name; |
| | | |
| | | /** |
| | | * 用户名id |
| | | */ |
| | | private Long userId; |
| | | private String userIdStr; |
| | | |
| | | /** |
| | | * 用户手机号 |
| | | */ |
| | | private String phone; |
| | | /** |
| | | * 登录时间 |
| | | */ |
| | | private Long loginTime; |
| | | |
| | | /** |
| | | * 过期时间 |
| | | */ |
| | | private Long expireTime; |
| | | |
| | | /** |
| | | * 登录IP地址 |
| | | */ |
| | | private String ipaddr; |
| | | /** |
| | | * 头像 |
| | | */ |
| | | private String avatar; |
| | | /** |
| | | * 地址 |
| | | */ |
| | | private String address; |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.model; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | |
| | | @Data |
| | | @ApiModel(value = "自动关联修理厂角色DTO") |
| | | public class SysUserRoleDTO implements Serializable { |
| | | |
| | | @ApiModelProperty(value = "用户id") |
| | | private Long userId; |
| | | @ApiModelProperty(value = "角色id") |
| | | private Long roleId; |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.model; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import org.apache.commons.lang3.builder.ToStringBuilder; |
| | | import org.apache.commons.lang3.builder.ToStringStyle; |
| | | |
| | | /** |
| | | * 用户和角色关联 sys_user_role |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class SysUserRoleVo |
| | | { |
| | | /** 用户ID */ |
| | | @TableField("user_id") |
| | | private Long userId; |
| | | |
| | | /** 角色ID */ |
| | | @TableField("role_id") |
| | | private Long roleId; |
| | | |
| | | public Long getUserId() |
| | | { |
| | | return userId; |
| | | } |
| | | |
| | | public void setUserId(Long userId) |
| | | { |
| | | this.userId = userId; |
| | | } |
| | | |
| | | public Long getRoleId() |
| | | { |
| | | return roleId; |
| | | } |
| | | |
| | | public void setRoleId(Long roleId) |
| | | { |
| | | this.roleId = roleId; |
| | | } |
| | | |
| | | @Override |
| | | public String toString() { |
| | | return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) |
| | | .append("userId", getUserId()) |
| | | .append("roleId", getRoleId()) |
| | | .toString(); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.model; |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.ruoyi.common.core.web.domain.BasePojo; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * <p> |
| | | * |
| | | * </p> |
| | | * |
| | | * @author luodangjia |
| | | * @since 2024-08-06 |
| | | */ |
| | | @Data |
| | | public class TAppUserLoginInfo extends BasePojo { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | private Long id; |
| | | |
| | | @ApiModelProperty(value = "用户") |
| | | private String name; |
| | | |
| | | @ApiModelProperty(value = "手机号") |
| | | private String phone; |
| | | |
| | | @ApiModelProperty(value = "头像") |
| | | private String avatar; |
| | | |
| | | @ApiModelProperty(value = "会员id") |
| | | private Integer vipId; |
| | | |
| | | @ApiModelProperty(value = "会员到期时间") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private LocalDateTime vipEndTime; |
| | | |
| | | @ApiModelProperty(value = "单位id") |
| | | private Integer companyId; |
| | | |
| | | @ApiModelProperty(value = "身份证号") |
| | | private String idCard; |
| | | |
| | | @ApiModelProperty(value = "认证状态(0=否,1=是)") |
| | | private Integer authStatus; |
| | | |
| | | @ApiModelProperty(value = "微信openid") |
| | | private String wxOpenid; |
| | | |
| | | @ApiModelProperty(value = "支付宝openid") |
| | | private String aliOpenid; |
| | | |
| | | @ApiModelProperty(value = "积分") |
| | | private Integer points; |
| | | |
| | | @ApiModelProperty(value = "省名称") |
| | | private String province; |
| | | |
| | | @ApiModelProperty(value = "省区划代码") |
| | | private String provinceCode; |
| | | |
| | | @ApiModelProperty(value = "市名称") |
| | | private String city; |
| | | |
| | | @ApiModelProperty(value = "市区划代码") |
| | | private String cityCode; |
| | | |
| | | @ApiModelProperty(value = "状态(1=正常,2=冻结,3=注销)") |
| | | private Integer status; |
| | | |
| | | @ApiModelProperty(value = "最后一次登录时间") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private LocalDateTime lastLoginTime; |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.model; |
| | | |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import javax.validation.constraints.NotBlank; |
| | | |
| | | @Data |
| | | public class TRepairShopAdd { |
| | | @ApiModelProperty("账号") |
| | | @NotBlank(message = "账号不能为空") |
| | | private String phonenumber; |
| | | @ApiModelProperty("密码") |
| | | @NotBlank(message = "密码不能为空") |
| | | private String pwd; |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.model; |
| | | |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import javax.validation.constraints.NotNull; |
| | | import java.util.List; |
| | | @Data |
| | | public class TRepairShopAddDto { |
| | | private List<TRepairShopAdd> list; |
| | | @ApiModelProperty("修理场id") |
| | | @NotNull(message = "修理厂id不能为空") |
| | | private Integer repairId; |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.model; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import com.ruoyi.common.core.annotation.Excel; |
| | | import lombok.Data; |
| | | |
| | | import javax.validation.constraints.NotBlank; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/12/2 9:36 |
| | | */ |
| | | @Data |
| | | @TableName("t_user_shop") |
| | | public class UserShop { |
| | | /** |
| | | * 主键 |
| | | */ |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | private Integer id; |
| | | /** |
| | | * 用户id |
| | | */ |
| | | @TableField("user_id") |
| | | private Long userId; |
| | | /** |
| | | * 门店id |
| | | */ |
| | | @TableField("shop_id") |
| | | private Integer shopId; |
| | | /** |
| | | * 角色类型(1=店长,2=店员) |
| | | */ |
| | | @TableField("role_type") |
| | | private Integer roleType; |
| | | /** |
| | | * 角色id |
| | | */ |
| | | @TableField("role_id") |
| | | private Long roleId; |
| | | |
| | | /** 部门ID */ |
| | | @TableField("dept_id") |
| | | private Long deptId; |
| | | |
| | | /** 用户昵称 */ |
| | | @TableField("nick_name") |
| | | private String nickName; |
| | | |
| | | @TableField("create_time") |
| | | private LocalDateTime createTime; |
| | | } |
New file |
| | |
| | | package com.ruoyi.system.api.query; |
| | | |
| | | import com.ruoyi.common.core.web.page.BasePage; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | @ApiModel(value = "用户选择列表Query") |
| | | public class ChangeUserQuery extends BasePage { |
| | | |
| | | @ApiModelProperty(value = "用户名称") |
| | | private String nickName; |
| | | private Integer objectId; |
| | | |
| | | } |
New file |
| | |
| | | com.ruoyi.system.api.factory.RemoteUserFallbackFactory |
| | | com.ruoyi.system.api.factory.RemoteLogFallbackFactory |
| | | com.ruoyi.system.api.factory.RemoteFileFallbackFactory |
| | | com.ruoyi.system.api.factory.SysUserFallbackFactory |
| | | com.ruoyi.system.api.factory.SysRoleFallbackFactory |
| | | com.ruoyi.system.api.factory.SysLoginLogFallbackFactory |
| | | com.ruoyi.system.api.factory.SysUserRoleFallbackFactory |
| | | com.ruoyi.system.api.factory.UserShopClientFallbackFactory |
New file |
| | |
| | | <project xmlns="http://maven.apache.org/POM/4.0.0" |
| | | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| | | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| | | <parent> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi</artifactId> |
| | | <version>3.6.2</version> |
| | | </parent> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | |
| | | <artifactId>ruoyi-auth</artifactId> |
| | | |
| | | <description> |
| | | ruoyi-auth认证授权中心 |
| | | </description> |
| | | |
| | | <properties> |
| | | <druid.version>1.1.13</druid.version> |
| | | <hutool.version>5.3.8</hutool.version> |
| | | </properties> |
| | | |
| | | <dependencies> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-api-other</artifactId> |
| | | </dependency> |
| | | <!-- SpringCloud Alibaba Nacos --> |
| | | <dependency> |
| | | <groupId>com.alibaba.cloud</groupId> |
| | | <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- SpringCloud Alibaba Nacos Config --> |
| | | <dependency> |
| | | <groupId>com.alibaba.cloud</groupId> |
| | | <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- SpringCloud Alibaba Sentinel --> |
| | | <dependency> |
| | | <groupId>com.alibaba.cloud</groupId> |
| | | <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- SpringBoot Web --> |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-starter-web</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- SpringBoot Actuator --> |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-starter-actuator</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- RuoYi Common Security--> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-common-security</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- 引入Druid依赖,阿里巴巴所提供的数据源 --> |
| | | <dependency> |
| | | <groupId>com.alibaba</groupId> |
| | | <artifactId>druid-spring-boot-starter</artifactId> |
| | | <version>${druid.version}</version> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>com.alibaba</groupId> |
| | | <artifactId>fastjson</artifactId> |
| | | <version>1.2.47</version> |
| | | </dependency> |
| | | <!--mysql--> |
| | | <dependency> |
| | | <groupId>mysql</groupId> |
| | | <artifactId>mysql-connector-java</artifactId> |
| | | </dependency> |
| | | <!-- hutool工具类--> |
| | | <dependency> |
| | | <groupId>cn.hutool</groupId> |
| | | <artifactId>hutool-core</artifactId> |
| | | <version>${hutool.version}</version> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>cn.hutool</groupId> |
| | | <artifactId>hutool-crypto</artifactId> |
| | | <version>${hutool.version}</version> |
| | | </dependency> |
| | | |
| | | </dependencies> |
| | | |
| | | <build> |
| | | <finalName>${project.artifactId}</finalName> |
| | | <plugins> |
| | | <plugin> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-maven-plugin</artifactId> |
| | | <executions> |
| | | <execution> |
| | | <goals> |
| | | <goal>repackage</goal> |
| | | </goals> |
| | | </execution> |
| | | </executions> |
| | | </plugin> |
| | | </plugins> |
| | | </build> |
| | | |
| | | </project> |
New file |
| | |
| | | package com.ruoyi.auth; |
| | | |
| | | import org.springframework.boot.SpringApplication; |
| | | import org.springframework.boot.autoconfigure.SpringBootApplication; |
| | | import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; |
| | | import com.ruoyi.common.security.annotation.EnableRyFeignClients; |
| | | |
| | | /** |
| | | * 认证授权中心 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @EnableRyFeignClients |
| | | @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class }) |
| | | public class RuoYiAuthApplication |
| | | { |
| | | public static void main(String[] args) |
| | | { |
| | | try { |
| | | SpringApplication.run(RuoYiAuthApplication.class, args); |
| | | }catch (Exception e){ |
| | | e.printStackTrace(); |
| | | } |
| | | System.out.println("(♥◠‿◠)ノ゙ 认证授权中心启动成功 ლ(´ڡ`ლ)゙ \n" + |
| | | " .-------. ____ __ \n" + |
| | | " | _ _ \\ \\ \\ / / \n" + |
| | | " | ( ' ) | \\ _. / ' \n" + |
| | | " |(_ o _) / _( )_ .' \n" + |
| | | " | (_,_).' __ ___(_ o _)' \n" + |
| | | " | |\\ \\ | || |(_,_)' \n" + |
| | | " | | \\ `' /| `-' / \n" + |
| | | " | | \\ / \\ / \n" + |
| | | " ''-' `'-' `-..-' "); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.auth.controller; |
| | | |
| | | import javax.annotation.Resource; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | |
| | | import com.ruoyi.system.api.domain.SysRole; |
| | | import com.ruoyi.system.api.domain.SysUser; |
| | | import com.ruoyi.system.api.feignClient.SysUserClient; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.util.CollectionUtils; |
| | | import org.springframework.web.bind.annotation.*; |
| | | import com.ruoyi.auth.form.LoginBody; |
| | | import com.ruoyi.auth.form.RegisterBody; |
| | | import com.ruoyi.auth.service.SysLoginService; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.common.core.utils.JwtUtils; |
| | | import com.ruoyi.common.core.utils.StringUtils; |
| | | import com.ruoyi.common.security.auth.AuthUtil; |
| | | import com.ruoyi.common.security.service.TokenService; |
| | | import com.ruoyi.common.security.utils.SecurityUtils; |
| | | import com.ruoyi.system.api.model.LoginUser; |
| | | |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * token 控制 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @Slf4j |
| | | @RestController |
| | | public class TokenController { |
| | | @Autowired |
| | | private TokenService tokenService; |
| | | |
| | | @Autowired |
| | | private SysLoginService sysLoginService; |
| | | @Resource |
| | | private SysUserClient userClient; |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | @PostMapping("login") |
| | | public R<?> login(@RequestBody LoginBody form, HttpServletRequest request) { |
| | | // 用户登录 |
| | | LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword(), request); |
| | | HashMap<String, Object> map = new HashMap<>(); |
| | | map.put("token", tokenService.createToken(userInfo)); |
| | | List<SysRole> roles = userInfo.getSysUser().getRoles(); |
| | | if(CollectionUtils.isEmpty(roles)){ |
| | | return R.fail("请关联角色!"); |
| | | } |
| | | |
| | | map.put("roleName",roles.get(0).getRoleName()); |
| | | map.put("info", userInfo); |
| | | // 修改用户最后登录时间 |
| | | SysUser sysUser = new SysUser(); |
| | | sysUser.setUserId(userInfo.getSysUser().getUserId()); |
| | | sysUser.setLoginDate(new Date()); |
| | | System.out.println("修改用户登录时间" + sysUser); |
| | | userClient.updateSysUser(sysUser); |
| | | return R.ok(map); |
| | | } |
| | | @PostMapping("loginShop") |
| | | public R<?> loginShop(@RequestBody LoginBody form, HttpServletRequest request) { |
| | | // 用户登录 |
| | | LoginUser userInfo = sysLoginService.loginShop(form.getUsername(), form.getPassword(), request); |
| | | HashMap<String, Object> map = new HashMap<>(); |
| | | map.put("token", tokenService.createToken(userInfo)); |
| | | List<SysRole> roles = userInfo.getSysUser().getRoles(); |
| | | if(CollectionUtils.isEmpty(roles)){ |
| | | return R.fail("请关联角色!"); |
| | | } |
| | | |
| | | map.put("roleName",roles.get(0).getRoleName()); |
| | | map.put("info", userInfo); |
| | | // 修改用户最后登录时间 |
| | | SysUser sysUser = new SysUser(); |
| | | sysUser.setUserId(userInfo.getSysUser().getUserId()); |
| | | sysUser.setLoginDate(new Date()); |
| | | System.out.println("修改用户登录时间" + sysUser); |
| | | userClient.updateSysUser(sysUser); |
| | | return R.ok(map); |
| | | } |
| | | |
| | | @DeleteMapping("logout") |
| | | public R<?> logout(HttpServletRequest request) { |
| | | String token = SecurityUtils.getToken(request); |
| | | if (StringUtils.isNotEmpty(token)) { |
| | | String username = JwtUtils.getUserName(token); |
| | | // 删除用户缓存记录 |
| | | AuthUtil.logoutByToken(token); |
| | | // 记录用户退出日志 |
| | | sysLoginService.logout(username, request); |
| | | } |
| | | return R.ok(); |
| | | } |
| | | |
| | | |
| | | @PostMapping("refresh") |
| | | public R<?> refresh(HttpServletRequest request) { |
| | | LoginUser loginUser = tokenService.getLoginUser(request); |
| | | if (StringUtils.isNotNull(loginUser)) { |
| | | // 刷新令牌有效期 |
| | | tokenService.refreshToken(loginUser); |
| | | return R.ok(); |
| | | } |
| | | return R.ok(); |
| | | } |
| | | |
| | | @PostMapping("register") |
| | | public R<?> register(@RequestBody RegisterBody registerBody, HttpServletRequest request) { |
| | | // 用户注册 |
| | | sysLoginService.register(registerBody.getUsername(), registerBody.getPassword(), request); |
| | | return R.ok(); |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.auth.form; |
| | | |
| | | /** |
| | | * 用户登录对象 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class LoginBody |
| | | { |
| | | /** |
| | | * 用户名 |
| | | */ |
| | | private String username; |
| | | |
| | | /** |
| | | * 用户密码 |
| | | */ |
| | | private String password; |
| | | /** |
| | | * 登录平台类型(1=平台,2=门店) |
| | | */ |
| | | private Integer roleType; |
| | | |
| | | public String getUsername() |
| | | { |
| | | return username; |
| | | } |
| | | |
| | | public void setUsername(String username) |
| | | { |
| | | this.username = username; |
| | | } |
| | | |
| | | public String getPassword() |
| | | { |
| | | return password; |
| | | } |
| | | |
| | | public void setPassword(String password) |
| | | { |
| | | this.password = password; |
| | | } |
| | | |
| | | public Integer getRoleType() { |
| | | return roleType; |
| | | } |
| | | |
| | | public void setRoleType(Integer roleType) { |
| | | this.roleType = roleType; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.auth.form; |
| | | |
| | | /** |
| | | * 用户注册对象 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class RegisterBody extends LoginBody |
| | | { |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.auth.service; |
| | | |
| | | import com.ruoyi.other.api.domain.Shop; |
| | | import com.ruoyi.other.api.feignClient.ShopClient; |
| | | import com.ruoyi.system.api.RemoteUserService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Component; |
| | | import com.ruoyi.common.core.constant.CacheConstants; |
| | | import com.ruoyi.common.core.constant.Constants; |
| | | import com.ruoyi.common.core.constant.SecurityConstants; |
| | | import com.ruoyi.common.core.constant.UserConstants; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.common.core.enums.UserStatus; |
| | | import com.ruoyi.common.core.exception.ServiceException; |
| | | import com.ruoyi.common.core.text.Convert; |
| | | import com.ruoyi.common.core.utils.StringUtils; |
| | | import com.ruoyi.common.core.utils.ip.IpUtils; |
| | | import com.ruoyi.common.redis.service.RedisService; |
| | | import com.ruoyi.common.security.utils.SecurityUtils; |
| | | import com.ruoyi.system.api.domain.SysUser; |
| | | import com.ruoyi.system.api.model.LoginUser; |
| | | |
| | | import javax.annotation.Resource; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | |
| | | /** |
| | | * 登录校验方法 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @Component |
| | | public class SysLoginService { |
| | | @Resource |
| | | private RemoteUserService remoteUserService; |
| | | |
| | | @Resource |
| | | private SysPasswordService passwordService; |
| | | |
| | | @Resource |
| | | private SysRecordLogService recordLogService; |
| | | |
| | | @Resource |
| | | private RedisService redisService; |
| | | @Resource |
| | | private ShopClient shopClient; |
| | | /** |
| | | * 登录 |
| | | */ |
| | | public LoginUser login(String username, String password, HttpServletRequest request) { |
| | | username = username.trim(); |
| | | // 查询用户信息 |
| | | R<LoginUser> userResult = remoteUserService.getUserInfo(username, SecurityConstants.INNER); |
| | | |
| | | if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData())) { |
| | | recordLogService.recordLogininfor(request, null, username, Constants.LOGIN_FAIL_STATUS, "登录用户不存在"); |
| | | throw new ServiceException("登录用户:" + username + " 不存在"); |
| | | } |
| | | LoginUser userInfo = userResult.getData(); |
| | | SysUser user = userResult.getData().getSysUser(); |
| | | |
| | | // 用户名或密码为空 错误 |
| | | if (StringUtils.isAnyBlank(username, password)) { |
| | | recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "用户/密码必须填写"); |
| | | throw new ServiceException("用户/密码必须填写"); |
| | | } |
| | | // 密码如果不在指定范围内 错误 |
| | | if (password.length() < UserConstants.PASSWORD_MIN_LENGTH |
| | | || password.length() > UserConstants.PASSWORD_MAX_LENGTH) { |
| | | recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "用户密码不在指定范围"); |
| | | throw new ServiceException("用户密码不在指定范围"); |
| | | } |
| | | // 用户名不在指定范围内 错误 |
| | | if (username.length() < UserConstants.USERNAME_MIN_LENGTH |
| | | || username.length() > UserConstants.USERNAME_MAX_LENGTH) { |
| | | recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "用户名不在指定范围"); |
| | | throw new ServiceException("用户名不在指定范围"); |
| | | } |
| | | // IP黑名单校验 |
| | | String blackStr = Convert.toStr(redisService.getCacheObject(CacheConstants.SYS_LOGIN_BLACKIPLIST)); |
| | | if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr())) { |
| | | recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "很遗憾,访问IP已被列入系统黑名单"); |
| | | throw new ServiceException("很遗憾,访问IP已被列入系统黑名单"); |
| | | } |
| | | |
| | | if (R.FAIL == userResult.getCode()) { |
| | | throw new ServiceException(userResult.getMsg()); |
| | | } |
| | | |
| | | |
| | | if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) { |
| | | recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "对不起,您的账号已被删除"); |
| | | throw new ServiceException("对不起,您的账号:" + username + " 已被删除"); |
| | | } |
| | | if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { |
| | | recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "用户已停用,请联系管理员"); |
| | | throw new ServiceException("您所属门店已被冻结,请联系平台"); |
| | | } |
| | | if (user.getRoleType()==2){ |
| | | Shop data = shopClient.getShopById(user.getObjectId()).getData(); |
| | | if (data==null){ |
| | | throw new ServiceException("门店不存在"); |
| | | }else{ |
| | | if (data.getStatus()==2){ |
| | | throw new ServiceException("您所属门店已被冻结,请联系平台"); |
| | | } |
| | | } |
| | | } |
| | | passwordService.validate(user, password, request); |
| | | recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_SUCCESS_STATUS, "登录成功"); |
| | | return userInfo; |
| | | } |
| | | public LoginUser loginShop(String username, String password, HttpServletRequest request) { |
| | | username = username.trim(); |
| | | // 查询用户信息 |
| | | R<LoginUser> userResult = remoteUserService.infoShop(username, SecurityConstants.INNER); |
| | | |
| | | if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData())) { |
| | | recordLogService.recordLogininfor(request, null, username, Constants.LOGIN_FAIL_STATUS, "登录用户不存在"); |
| | | throw new ServiceException("登录用户:" + username + " 不存在"); |
| | | } |
| | | LoginUser userInfo = userResult.getData(); |
| | | SysUser user = userResult.getData().getSysUser(); |
| | | |
| | | // 用户名或密码为空 错误 |
| | | if (StringUtils.isAnyBlank(username, password)) { |
| | | recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "用户/密码必须填写"); |
| | | throw new ServiceException("用户/密码必须填写"); |
| | | } |
| | | // 密码如果不在指定范围内 错误 |
| | | if (password.length() < UserConstants.PASSWORD_MIN_LENGTH |
| | | || password.length() > UserConstants.PASSWORD_MAX_LENGTH) { |
| | | recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "用户密码不在指定范围"); |
| | | throw new ServiceException("用户密码不在指定范围"); |
| | | } |
| | | // 用户名不在指定范围内 错误 |
| | | if (username.length() < UserConstants.USERNAME_MIN_LENGTH |
| | | || username.length() > UserConstants.USERNAME_MAX_LENGTH) { |
| | | recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "用户名不在指定范围"); |
| | | throw new ServiceException("用户名不在指定范围"); |
| | | } |
| | | // IP黑名单校验 |
| | | String blackStr = Convert.toStr(redisService.getCacheObject(CacheConstants.SYS_LOGIN_BLACKIPLIST)); |
| | | if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr())) { |
| | | recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "很遗憾,访问IP已被列入系统黑名单"); |
| | | throw new ServiceException("很遗憾,访问IP已被列入系统黑名单"); |
| | | } |
| | | |
| | | if (R.FAIL == userResult.getCode()) { |
| | | throw new ServiceException(userResult.getMsg()); |
| | | } |
| | | |
| | | |
| | | if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) { |
| | | recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "对不起,您的账号已被删除"); |
| | | throw new ServiceException("对不起,您的账号:" + username + " 已被删除"); |
| | | } |
| | | if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { |
| | | recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "用户已停用,请联系管理员"); |
| | | // throw new ServiceException("对不起,您的账号:" + username + " 已停用"); |
| | | throw new ServiceException("您的账号已被禁用,请联系平台"); |
| | | } |
| | | passwordService.validate(user, password, request); |
| | | recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_SUCCESS_STATUS, "登录成功"); |
| | | return userInfo; |
| | | } |
| | | |
| | | public void logout(String loginName, HttpServletRequest request) { |
| | | recordLogService.recordLogininfor(request, null, loginName, Constants.LOGIN_SUCCESS_STATUS, "退出成功"); |
| | | } |
| | | |
| | | /** |
| | | * 注册 |
| | | */ |
| | | public void register(String username, String password, HttpServletRequest request) { |
| | | // 用户名或密码为空 错误 |
| | | if (StringUtils.isAnyBlank(username, password)) { |
| | | throw new ServiceException("用户/密码必须填写"); |
| | | } |
| | | if (username.length() < UserConstants.USERNAME_MIN_LENGTH |
| | | || username.length() > UserConstants.USERNAME_MAX_LENGTH) { |
| | | throw new ServiceException("账户长度必须在2到20个字符之间"); |
| | | } |
| | | if (password.length() < UserConstants.PASSWORD_MIN_LENGTH |
| | | || password.length() > UserConstants.PASSWORD_MAX_LENGTH) { |
| | | throw new ServiceException("密码长度必须在5到20个字符之间"); |
| | | } |
| | | |
| | | // 注册用户信息 |
| | | SysUser sysUser = new SysUser(); |
| | | sysUser.setUserName(username); |
| | | sysUser.setNickName(username); |
| | | sysUser.setPassword(SecurityUtils.encryptPassword(password)); |
| | | R<?> registerResult = remoteUserService.registerUserInfo(sysUser, SecurityConstants.INNER); |
| | | |
| | | if (R.FAIL == registerResult.getCode()) { |
| | | throw new ServiceException(registerResult.getMsg()); |
| | | } |
| | | recordLogService.recordLogininfor(request, sysUser.getUserId().intValue(), username, Constants.LOGIN_SUCCESS_STATUS, "注册成功"); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.auth.service; |
| | | |
| | | import java.util.concurrent.TimeUnit; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Component; |
| | | import com.ruoyi.common.core.constant.CacheConstants; |
| | | import com.ruoyi.common.core.constant.Constants; |
| | | import com.ruoyi.common.core.exception.ServiceException; |
| | | import com.ruoyi.common.redis.service.RedisService; |
| | | import com.ruoyi.common.security.utils.SecurityUtils; |
| | | import com.ruoyi.system.api.domain.SysUser; |
| | | |
| | | import javax.servlet.http.HttpServletRequest; |
| | | |
| | | /** |
| | | * 登录密码方法 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @Component |
| | | public class SysPasswordService |
| | | { |
| | | @Autowired |
| | | private RedisService redisService; |
| | | |
| | | private int maxRetryCount = CacheConstants.PASSWORD_MAX_RETRY_COUNT; |
| | | private Long lockTime = CacheConstants.PASSWORD_LOCK_TIME; |
| | | |
| | | @Autowired |
| | | private SysRecordLogService recordLogService; |
| | | |
| | | /** |
| | | * 登录账户密码错误次数缓存键名 |
| | | * |
| | | * @param username 用户名 |
| | | * @return 缓存键key |
| | | */ |
| | | private String getCacheKey(String username) |
| | | { |
| | | return CacheConstants.PWD_ERR_CNT_KEY + username; |
| | | } |
| | | |
| | | public void validate(SysUser user, String password, HttpServletRequest request) { |
| | | String username = user.getUserName(); |
| | | |
| | | Integer retryCount = redisService.getCacheObject(getCacheKey(username)); |
| | | |
| | | if (retryCount == null) |
| | | { |
| | | retryCount = 0; |
| | | } |
| | | |
| | | if (retryCount >= Integer.valueOf(maxRetryCount).intValue()) |
| | | { |
| | | String errMsg = String.format("密码输入错误%s次,帐户锁定%s分钟", maxRetryCount, lockTime); |
| | | recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS,errMsg); |
| | | throw new ServiceException(errMsg); |
| | | } |
| | | |
| | | if (!matches(user,password)){ |
| | | retryCount = retryCount + 1; |
| | | recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, String.format("密码输入错误%s次", retryCount)); |
| | | redisService.setCacheObject(getCacheKey(username), retryCount, lockTime, TimeUnit.MINUTES); |
| | | throw new ServiceException("密码错误"); |
| | | } else { |
| | | clearLoginRecordCache(username); |
| | | } |
| | | } |
| | | |
| | | public boolean matches(SysUser user, String rawPassword) |
| | | { |
| | | return SecurityUtils.matchesPassword(rawPassword, user.getPassword()); |
| | | } |
| | | |
| | | public void clearLoginRecordCache(String loginName) |
| | | { |
| | | if (redisService.hasKey(getCacheKey(loginName))) |
| | | { |
| | | redisService.deleteObject(getCacheKey(loginName)); |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.auth.service; |
| | | |
| | | import com.ruoyi.system.api.domain.SysLoginLog; |
| | | import com.ruoyi.system.api.feignClient.SysLoginLogClient; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.Resource; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import java.time.LocalDateTime; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * 记录日志方法 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @Component |
| | | public class SysRecordLogService { |
| | | @Resource |
| | | private SysLoginLogClient sysLoginLogClient; |
| | | |
| | | /** |
| | | * 记录登录信息 |
| | | * |
| | | * @param username 用户名 |
| | | * @param status 状态 |
| | | * @param message 消息内容 |
| | | * @return |
| | | */ |
| | | public void recordLogininfor(HttpServletRequest request, Integer userId, String username, String status, String message) { |
| | | Map<String, String> headerData = getHeaderData(request); |
| | | //添加登录日志 |
| | | SysLoginLog loginLog = new SysLoginLog(); |
| | | loginLog.setUserId(userId); |
| | | loginLog.setUsername(username); |
| | | loginLog.setIpAddress(headerData.get("ip")); |
| | | loginLog.setAddress(""); |
| | | loginLog.setBrowserType(headerData.get("browser")); |
| | | loginLog.setOperatingSystem(headerData.get("os")); |
| | | loginLog.setLoginTime(LocalDateTime.now()); |
| | | loginLog.setLoginStatus(Integer.valueOf(status)); |
| | | loginLog.setMessage(message); |
| | | sysLoginLogClient.saveLoginLog(loginLog); |
| | | } |
| | | |
| | | |
| | | public Map<String, String> getHeaderData(HttpServletRequest request) { |
| | | //Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0 |
| | | String browserDetails = request.getHeader("User-Agent"); |
| | | String userAgent = browserDetails; |
| | | String user = userAgent.toLowerCase(); |
| | | Map<String, String> map = new HashMap<>(); |
| | | String os = ""; |
| | | String browser = ""; |
| | | if (userAgent.toLowerCase().indexOf("windows") >= 0) { |
| | | os = "Windows"; |
| | | } else if (userAgent.toLowerCase().indexOf("mac") >= 0) { |
| | | os = "Mac"; |
| | | } else if (userAgent.toLowerCase().indexOf("x11") >= 0) { |
| | | os = "Unix"; |
| | | } else if (userAgent.toLowerCase().indexOf("android") >= 0) { |
| | | os = "Android"; |
| | | } else if (userAgent.toLowerCase().indexOf("iphone") >= 0) { |
| | | os = "IPhone"; |
| | | } else { |
| | | os = "UnKnown, More-Info: " + userAgent; |
| | | } |
| | | if (user.contains("edge")) { |
| | | browser = (userAgent.substring(userAgent.indexOf("Edge")).split(" ")[0]).replace("/", "-"); |
| | | } else if (user.contains("msie")) { |
| | | String substring = userAgent.substring(userAgent.indexOf("MSIE")).split(";")[0]; |
| | | browser = substring.split(" ")[0].replace("MSIE", "IE") + "-" + substring.split(" ")[1]; |
| | | } else if (user.contains("safari") && user.contains("version")) { |
| | | browser = (userAgent.substring(userAgent.indexOf("Safari")).split(" ")[0]).split("/")[0] |
| | | + "-" + (userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1]; |
| | | } else if (user.contains("opr") || user.contains("opera")) { |
| | | if (user.contains("opera")) { |
| | | browser = (userAgent.substring(userAgent.indexOf("Opera")).split(" ")[0]).split("/")[0] |
| | | + "-" + (userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1]; |
| | | } else if (user.contains("opr")) { |
| | | browser = ((userAgent.substring(userAgent.indexOf("OPR")).split(" ")[0]).replace("/", "-")) |
| | | .replace("OPR", "Opera"); |
| | | } |
| | | |
| | | } else if (user.contains("chrome")) { |
| | | browser = (userAgent.substring(userAgent.indexOf("Chrome")).split(" ")[0]).replace("/", "-"); |
| | | } else if ((user.indexOf("mozilla/7.0") > -1) || (user.indexOf("netscape6") != -1) || |
| | | (user.indexOf("mozilla/4.7") != -1) || (user.indexOf("mozilla/4.78") != -1) || |
| | | (user.indexOf("mozilla/4.08") != -1) || (user.indexOf("mozilla/3") != -1)) { |
| | | browser = "Netscape-?"; |
| | | |
| | | } else if (user.contains("firefox")) { |
| | | browser = (userAgent.substring(userAgent.indexOf("Firefox")).split(" ")[0]).replace("/", "-"); |
| | | } else if (user.contains("rv")) { |
| | | String IEVersion = (userAgent.substring(userAgent.indexOf("rv")).split(" ")[0]).replace("rv:", "-"); |
| | | browser = "IE" + IEVersion.substring(0, IEVersion.length() - 1); |
| | | } else { |
| | | browser = "UnKnown, More-Info: " + userAgent; |
| | | } |
| | | |
| | | String ip = request.getHeader("x-forwarded-for"); |
| | | if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) { |
| | | // 多次反向代理后会有多个ip值,第一个ip才是真实ip |
| | | if (ip.indexOf(",") != -1) { |
| | | ip = ip.split(",")[0]; |
| | | } |
| | | } |
| | | 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.getHeader("HTTP_CLIENT_IP"); |
| | | } |
| | | if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { |
| | | ip = request.getHeader("HTTP_X_FORWARDED_FOR"); |
| | | } |
| | | if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { |
| | | ip = request.getHeader("X-Real-IP"); |
| | | } |
| | | if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { |
| | | ip = request.getRemoteAddr(); |
| | | } |
| | | map.put("os", os); |
| | | map.put("browser", browser); |
| | | map.put("ip", ip); |
| | | return map; |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | Spring Boot Version: ${spring-boot.version} |
| | | Spring Application Name: ${spring.application.name} |
| | | _ _ _ |
| | | (_) | | | | |
| | | _ __ _ _ ___ _ _ _ ______ __ _ _ _ | |_ | |__ |
| | | | '__|| | | | / _ \ | | | || ||______| / _` || | | || __|| '_ \ |
| | | | | | |_| || (_) || |_| || | | (_| || |_| || |_ | | | | |
| | | |_| \__,_| \___/ \__, ||_| \__,_| \__,_| \__||_| |_| |
| | | __/ | |
| | | |___/ |
New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <configuration scan="true" scanPeriod="60 seconds" debug="false"> |
| | | <!-- 日志存放路径 --> |
| | | <property name="log.path" value="/mnt/app/ruoyi-auth" /> |
| | | <!-- 日志输出格式 --> |
| | | <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" /> |
| | | |
| | | <!-- 控制台输出 --> |
| | | <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> |
| | | <encoder> |
| | | <pattern>${log.pattern}</pattern> |
| | | </encoder> |
| | | </appender> |
| | | |
| | | <!-- 系统日志输出 --> |
| | | <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
| | | <file>${log.path}/info.log</file> |
| | | <!-- 循环政策:基于时间创建日志文件 --> |
| | | <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> |
| | | <!-- 日志文件名格式 --> |
| | | <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern> |
| | | <!-- 日志最大的历史 60天 --> |
| | | <maxHistory>60</maxHistory> |
| | | </rollingPolicy> |
| | | <encoder> |
| | | <pattern>${log.pattern}</pattern> |
| | | </encoder> |
| | | <filter class="ch.qos.logback.classic.filter.LevelFilter"> |
| | | <!-- 过滤的级别 --> |
| | | <level>INFO</level> |
| | | <!-- 匹配时的操作:接收(记录) --> |
| | | <onMatch>ACCEPT</onMatch> |
| | | <!-- 不匹配时的操作:拒绝(不记录) --> |
| | | <onMismatch>DENY</onMismatch> |
| | | </filter> |
| | | </appender> |
| | | |
| | | <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
| | | <file>${log.path}/error.log</file> |
| | | <!-- 循环政策:基于时间创建日志文件 --> |
| | | <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> |
| | | <!-- 日志文件名格式 --> |
| | | <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern> |
| | | <!-- 日志最大的历史 60天 --> |
| | | <maxHistory>60</maxHistory> |
| | | </rollingPolicy> |
| | | <encoder> |
| | | <pattern>${log.pattern}</pattern> |
| | | </encoder> |
| | | <filter class="ch.qos.logback.classic.filter.LevelFilter"> |
| | | <!-- 过滤的级别 --> |
| | | <level>ERROR</level> |
| | | <!-- 匹配时的操作:接收(记录) --> |
| | | <onMatch>ACCEPT</onMatch> |
| | | <!-- 不匹配时的操作:拒绝(不记录) --> |
| | | <onMismatch>DENY</onMismatch> |
| | | </filter> |
| | | </appender> |
| | | |
| | | <!-- 系统模块日志级别控制 --> |
| | | <logger name="com.ruoyi" level="info" /> |
| | | <!-- Spring日志级别控制 --> |
| | | <logger name="org.springframework" level="warn" /> |
| | | |
| | | <root level="info"> |
| | | <appender-ref ref="console" /> |
| | | </root> |
| | | |
| | | <!--系统操作日志--> |
| | | <root level="info"> |
| | | <appender-ref ref="file_info" /> |
| | | <appender-ref ref="file_error" /> |
| | | </root> |
| | | </configuration> |
New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" |
| | | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| | | <parent> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi</artifactId> |
| | | <version>3.6.2</version> |
| | | </parent> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | |
| | | <modules> |
| | | <module>ruoyi-common-log</module> |
| | | <module>ruoyi-common-core</module> |
| | | <module>ruoyi-common-redis</module> |
| | | <module>ruoyi-common-swagger</module> |
| | | <module>ruoyi-common-security</module> |
| | | <module>ruoyi-common-datascope</module> |
| | | <module>ruoyi-common-datasource</module> |
| | | </modules> |
| | | |
| | | <artifactId>ruoyi-common</artifactId> |
| | | <packaging>pom</packaging> |
| | | |
| | | <description> |
| | | ruoyi-common通用模块 |
| | | </description> |
| | | |
| | | <dependencies> |
| | | <!--lombok--> |
| | | <dependency> |
| | | <groupId>org.projectlombok</groupId> |
| | | <artifactId>lombok</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>com.google.zxing</groupId> |
| | | <artifactId>core</artifactId> |
| | | <version>3.4.1</version> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>com.google.zxing</groupId> |
| | | <artifactId>javase</artifactId> |
| | | <version>3.4.1</version> |
| | | </dependency> |
| | | </dependencies> |
| | | |
| | | </project> |
New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| | | xmlns="http://maven.apache.org/POM/4.0.0" |
| | | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| | | <parent> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-common</artifactId> |
| | | <version>3.6.2</version> |
| | | </parent> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | |
| | | <artifactId>ruoyi-common-core</artifactId> |
| | | |
| | | <description> |
| | | ruoyi-common-core核心模块 |
| | | </description> |
| | | |
| | | <dependencies> |
| | | |
| | | |
| | | <!-- SpringCloud Openfeign --> |
| | | <dependency> |
| | | <groupId>org.springframework.cloud</groupId> |
| | | <artifactId>spring-cloud-starter-openfeign</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- SpringCloud Loadbalancer --> |
| | | <dependency> |
| | | <groupId>org.springframework.cloud</groupId> |
| | | <artifactId>spring-cloud-starter-loadbalancer</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- Spring Context Support --> |
| | | <dependency> |
| | | <groupId>org.springframework</groupId> |
| | | <artifactId>spring-context-support</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- Spring Web --> |
| | | <dependency> |
| | | <groupId>org.springframework</groupId> |
| | | <artifactId>spring-web</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- Transmittable ThreadLocal --> |
| | | <dependency> |
| | | <groupId>com.alibaba</groupId> |
| | | <artifactId>transmittable-thread-local</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- Pagehelper --> |
| | | <dependency> |
| | | <groupId>com.github.pagehelper</groupId> |
| | | <artifactId>pagehelper-spring-boot-starter</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- Hibernate Validator --> |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-starter-validation</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- Jackson --> |
| | | <dependency> |
| | | <groupId>com.fasterxml.jackson.core</groupId> |
| | | <artifactId>jackson-databind</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- Alibaba Fastjson --> |
| | | <dependency> |
| | | <groupId>com.alibaba.fastjson2</groupId> |
| | | <artifactId>fastjson2</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- Jwt --> |
| | | <dependency> |
| | | <groupId>io.jsonwebtoken</groupId> |
| | | <artifactId>jjwt</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- Jaxb --> |
| | | <dependency> |
| | | <groupId>javax.xml.bind</groupId> |
| | | <artifactId>jaxb-api</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- Apache Lang3 --> |
| | | <dependency> |
| | | <groupId>org.apache.commons</groupId> |
| | | <artifactId>commons-lang3</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- Commons Io --> |
| | | <dependency> |
| | | <groupId>commons-io</groupId> |
| | | <artifactId>commons-io</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- excel工具 --> |
| | | <dependency> |
| | | <groupId>org.apache.poi</groupId> |
| | | <artifactId>poi-ooxml</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- Java Servlet --> |
| | | <dependency> |
| | | <groupId>javax.servlet</groupId> |
| | | <artifactId>javax.servlet-api</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- Swagger --> |
| | | <dependency> |
| | | <groupId>io.swagger</groupId> |
| | | <artifactId>swagger-annotations</artifactId> |
| | | </dependency> |
| | | |
| | | <!--mybatis-plus--> |
| | | <dependency> |
| | | <groupId>com.baomidou</groupId> |
| | | <artifactId>mybatis-plus-boot-starter</artifactId> |
| | | <version>3.5.2</version> |
| | | </dependency> |
| | | |
| | | |
| | | <!--华为云的obs--> |
| | | <dependency> |
| | | <groupId>com.huaweicloud</groupId> |
| | | <artifactId>esdk-obs-java</artifactId> |
| | | <version>3.19.5</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>com.squareup.okhttp3</groupId> |
| | | <artifactId>okhttp</artifactId> |
| | | <version>4.9.3</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>com.squareup.okio</groupId> |
| | | <artifactId>okio</artifactId> |
| | | <version>2.8.0</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.gavaghan</groupId> |
| | | <artifactId>geodesy</artifactId> |
| | | <version>1.1.3</version> |
| | | </dependency> |
| | | |
| | | </dependencies> |
| | | |
| | | </project> |
New file |
| | |
| | | package com.ruoyi.common.core.annotation; |
| | | |
| | | import java.lang.annotation.ElementType; |
| | | import java.lang.annotation.Retention; |
| | | import java.lang.annotation.RetentionPolicy; |
| | | import java.lang.annotation.Target; |
| | | import java.math.BigDecimal; |
| | | import org.apache.poi.ss.usermodel.HorizontalAlignment; |
| | | import org.apache.poi.ss.usermodel.IndexedColors; |
| | | import com.ruoyi.common.core.utils.poi.ExcelHandlerAdapter; |
| | | |
| | | /** |
| | | * 自定义导出Excel数据注解 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @Retention(RetentionPolicy.RUNTIME) |
| | | @Target(ElementType.FIELD) |
| | | public @interface Excel |
| | | { |
| | | /** |
| | | * 导出时在excel中排序 |
| | | */ |
| | | public int sort() default Integer.MAX_VALUE; |
| | | |
| | | /** |
| | | * 导出到Excel中的名字. |
| | | */ |
| | | public String name() default ""; |
| | | |
| | | /** |
| | | * 日期格式, 如: yyyy-MM-dd |
| | | */ |
| | | public String dateFormat() default ""; |
| | | |
| | | /** |
| | | * 读取内容转表达式 (如: 0=男,1=女,2=未知) |
| | | */ |
| | | public String readConverterExp() default ""; |
| | | |
| | | /** |
| | | * 分隔符,读取字符串组内容 |
| | | */ |
| | | public String separator() default ","; |
| | | |
| | | /** |
| | | * BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化) |
| | | */ |
| | | public int scale() default -1; |
| | | |
| | | /** |
| | | * BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN |
| | | */ |
| | | public int roundingMode() default BigDecimal.ROUND_HALF_EVEN; |
| | | |
| | | /** |
| | | * 导出时在excel中每个列的高度 单位为字符 |
| | | */ |
| | | public double height() default 14; |
| | | |
| | | /** |
| | | * 导出时在excel中每个列的宽 单位为字符 |
| | | */ |
| | | public double width() default 16; |
| | | |
| | | /** |
| | | * 文字后缀,如% 90 变成90% |
| | | */ |
| | | public String suffix() default ""; |
| | | |
| | | /** |
| | | * 当值为空时,字段的默认值 |
| | | */ |
| | | public String defaultValue() default ""; |
| | | |
| | | /** |
| | | * 提示信息 |
| | | */ |
| | | public String prompt() default ""; |
| | | |
| | | /** |
| | | * 设置只能选择不能输入的列内容. |
| | | */ |
| | | public String[] combo() default {}; |
| | | |
| | | /** |
| | | * 是否需要纵向合并单元格,应对需求:含有list集合单元格) |
| | | */ |
| | | public boolean needMerge() default false; |
| | | |
| | | /** |
| | | * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写. |
| | | */ |
| | | public boolean isExport() default true; |
| | | |
| | | /** |
| | | * 另一个类中的属性名称,支持多级获取,以小数点隔开 |
| | | */ |
| | | public String targetAttr() default ""; |
| | | |
| | | /** |
| | | * 是否自动统计数据,在最后追加一行统计数据总和 |
| | | */ |
| | | public boolean isStatistics() default false; |
| | | |
| | | /** |
| | | * 导出类型(0数字 1字符串) |
| | | */ |
| | | public ColumnType cellType() default ColumnType.STRING; |
| | | |
| | | /** |
| | | * 导出列头背景色 |
| | | */ |
| | | public IndexedColors headerBackgroundColor() default IndexedColors.GREY_50_PERCENT; |
| | | |
| | | /** |
| | | * 导出列头字体颜色 |
| | | */ |
| | | public IndexedColors headerColor() default IndexedColors.WHITE; |
| | | |
| | | /** |
| | | * 导出单元格背景色 |
| | | */ |
| | | public IndexedColors backgroundColor() default IndexedColors.WHITE; |
| | | |
| | | /** |
| | | * 导出单元格字体颜色 |
| | | */ |
| | | public IndexedColors color() default IndexedColors.BLACK; |
| | | |
| | | /** |
| | | * 导出字段对齐方式 |
| | | */ |
| | | public HorizontalAlignment align() default HorizontalAlignment.CENTER; |
| | | |
| | | /** |
| | | * 自定义数据处理器 |
| | | */ |
| | | public Class<?> handler() default ExcelHandlerAdapter.class; |
| | | |
| | | /** |
| | | * 自定义数据处理器参数 |
| | | */ |
| | | public String[] args() default {}; |
| | | |
| | | /** |
| | | * 字段类型(0:导出导入;1:仅导出;2:仅导入) |
| | | */ |
| | | Type type() default Type.ALL; |
| | | |
| | | public enum Type |
| | | { |
| | | ALL(0), EXPORT(1), IMPORT(2); |
| | | private final int value; |
| | | |
| | | Type(int value) |
| | | { |
| | | this.value = value; |
| | | } |
| | | |
| | | public int value() |
| | | { |
| | | return this.value; |
| | | } |
| | | } |
| | | |
| | | public enum ColumnType |
| | | { |
| | | NUMERIC(0), STRING(1), IMAGE(2); |
| | | private final int value; |
| | | |
| | | ColumnType(int value) |
| | | { |
| | | this.value = value; |
| | | } |
| | | |
| | | public int value() |
| | | { |
| | | return this.value; |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.annotation; |
| | | |
| | | import java.lang.annotation.ElementType; |
| | | import java.lang.annotation.Retention; |
| | | import java.lang.annotation.RetentionPolicy; |
| | | import java.lang.annotation.Target; |
| | | |
| | | /** |
| | | * Excel注解集 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @Target(ElementType.FIELD) |
| | | @Retention(RetentionPolicy.RUNTIME) |
| | | public @interface Excels |
| | | { |
| | | Excel[] value(); |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.constant; |
| | | |
| | | /** |
| | | * 缓存常量信息 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class CacheConstants |
| | | { |
| | | /** |
| | | * 缓存有效期,默认720(分钟) |
| | | */ |
| | | public final static long EXPIRATION = 120; |
| | | public final static long EXPIRATION_APPLET = 7*24*60*60; |
| | | |
| | | /** |
| | | * 缓存刷新时间,默认120(分钟) |
| | | */ |
| | | public final static long REFRESH_TIME = 120; |
| | | |
| | | /** |
| | | * 密码最大错误次数 |
| | | */ |
| | | public final static int PASSWORD_MAX_RETRY_COUNT = 5; |
| | | |
| | | /** |
| | | * 密码锁定时间,默认10(分钟) |
| | | */ |
| | | public final static long PASSWORD_LOCK_TIME = 10; |
| | | |
| | | /** |
| | | * 权限缓存前缀 |
| | | */ |
| | | public final static String LOGIN_TOKEN_KEY = "login_tokens:"; |
| | | |
| | | /** |
| | | * 验证码 redis key |
| | | */ |
| | | public static final String CAPTCHA_CODE_KEY = "captcha_codes:"; |
| | | |
| | | /** |
| | | * 参数管理 cache key |
| | | */ |
| | | public static final String SYS_CONFIG_KEY = "sys_config:"; |
| | | |
| | | /** |
| | | * 字典管理 cache key |
| | | */ |
| | | public static final String SYS_DICT_KEY = "sys_dict:"; |
| | | |
| | | /** |
| | | * 登录账户密码错误次数 redis key |
| | | */ |
| | | public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; |
| | | |
| | | /** |
| | | * 登录IP黑名单 cache key |
| | | */ |
| | | public static final String SYS_LOGIN_BLACKIPLIST = SYS_CONFIG_KEY + "sys.login.blackIPList"; |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.constant; |
| | | |
| | | /** |
| | | * 通用常量信息 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class Constants |
| | | { |
| | | /** |
| | | * UTF-8 字符集 |
| | | */ |
| | | public static final String UTF8 = "UTF-8"; |
| | | |
| | | /** |
| | | * GBK 字符集 |
| | | */ |
| | | public static final String GBK = "GBK"; |
| | | |
| | | /** |
| | | * www主域 |
| | | */ |
| | | public static final String WWW = "www."; |
| | | |
| | | /** |
| | | * RMI 远程方法调用 |
| | | */ |
| | | public static final String LOOKUP_RMI = "rmi:"; |
| | | |
| | | /** |
| | | * LDAP 远程方法调用 |
| | | */ |
| | | public static final String LOOKUP_LDAP = "ldap:"; |
| | | |
| | | /** |
| | | * LDAPS 远程方法调用 |
| | | */ |
| | | public static final String LOOKUP_LDAPS = "ldaps:"; |
| | | |
| | | /** |
| | | * http请求 |
| | | */ |
| | | public static final String HTTP = "http://"; |
| | | |
| | | /** |
| | | * https请求 |
| | | */ |
| | | public static final String HTTPS = "https://"; |
| | | |
| | | /** |
| | | * 成功标记 |
| | | */ |
| | | public static final Integer SUCCESS = 200; |
| | | |
| | | /** |
| | | * 失败标记 |
| | | */ |
| | | public static final Integer FAIL = 500; |
| | | |
| | | /** |
| | | * 登录成功状态 |
| | | */ |
| | | public static final String LOGIN_SUCCESS_STATUS = "1"; |
| | | |
| | | /** |
| | | * 登录失败状态 |
| | | */ |
| | | public static final String LOGIN_FAIL_STATUS = "2"; |
| | | |
| | | /** |
| | | * 登录成功 |
| | | */ |
| | | public static final String LOGIN_SUCCESS = "Success"; |
| | | |
| | | /** |
| | | * 注销 |
| | | */ |
| | | public static final String LOGOUT = "Logout"; |
| | | |
| | | /** |
| | | * 注册 |
| | | */ |
| | | public static final String REGISTER = "Register"; |
| | | |
| | | /** |
| | | * 登录失败 |
| | | */ |
| | | public static final String LOGIN_FAIL = "Error"; |
| | | |
| | | /** |
| | | * 当前记录起始索引 |
| | | */ |
| | | public static final String PAGE_NUM = "pageNum"; |
| | | |
| | | /** |
| | | * 每页显示记录数 |
| | | */ |
| | | public static final String PAGE_SIZE = "pageSize"; |
| | | |
| | | /** |
| | | * 排序列 |
| | | */ |
| | | public static final String ORDER_BY_COLUMN = "orderByColumn"; |
| | | |
| | | /** |
| | | * 排序的方向 "desc" 或者 "asc". |
| | | */ |
| | | public static final String IS_ASC = "isAsc"; |
| | | |
| | | /** |
| | | * 验证码有效期(分钟) |
| | | */ |
| | | public static final long CAPTCHA_EXPIRATION = 2; |
| | | |
| | | /** |
| | | * 资源映射路径 前缀 |
| | | */ |
| | | public static final String RESOURCE_PREFIX = "/profile"; |
| | | |
| | | /** |
| | | * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加) |
| | | */ |
| | | public static final String[] JOB_WHITELIST_STR = { "com.ruoyi" }; |
| | | |
| | | /** |
| | | * 时间格式化 |
| | | */ |
| | | public static final String DATE_FORMATTER_TIME = "yyyy-MM-dd HH:mm:ss"; |
| | | public static final String DATE_FORMATTER_DATE = "yyyy-MM-dd"; |
| | | /** |
| | | * 修改手机号后缀 |
| | | */ |
| | | public static final String UPDATE_PHONE = "_updatePhone"; |
| | | /** |
| | | * 申请建桩后缀 |
| | | */ |
| | | public static final String APPLY_CHARGING = "_applyCharging"; |
| | | /** |
| | | * 定时任务违规的字符 |
| | | */ |
| | | public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", |
| | | "org.springframework", "org.apache", "com.ruoyi.common.core.utils.file" }; |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.constant; |
| | | |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | |
| | | public class ExpressCompanyMap { |
| | | |
| | | public static final Map<String, String> EXPRESS_COMPANY_MAP = new HashMap<>(); |
| | | |
| | | static { |
| | | // 初始化快递公司信息 |
| | | EXPRESS_COMPANY_MAP.put("shunfeng", "顺丰"); |
| | | EXPRESS_COMPANY_MAP.put("zhongtong", "中通"); |
| | | EXPRESS_COMPANY_MAP.put("yuantong", "圆通"); |
| | | EXPRESS_COMPANY_MAP.put("huitongkuaidi", "汇通快递"); |
| | | EXPRESS_COMPANY_MAP.put("shentong", "申通"); |
| | | EXPRESS_COMPANY_MAP.put("yunda", "韵达"); |
| | | EXPRESS_COMPANY_MAP.put("ems", "EMS"); |
| | | EXPRESS_COMPANY_MAP.put("jd", "京东快递"); |
| | | EXPRESS_COMPANY_MAP.put("zhaijisong", "宅急送"); |
| | | EXPRESS_COMPANY_MAP.put("debangkuaidi", "德邦快递"); |
| | | EXPRESS_COMPANY_MAP.put("shansong", "闪送"); |
| | | EXPRESS_COMPANY_MAP.put("kfw", "快分网"); |
| | | } |
| | | |
| | | /** |
| | | * 根据编码获取快递公司名称 |
| | | * |
| | | * @param code 快递公司编码 |
| | | * @return 快递公司名称,如果编码不存在则返回 null |
| | | */ |
| | | public static String getCompanyNameByCode(String code) { |
| | | return EXPRESS_COMPANY_MAP.get(code); |
| | | } |
| | | |
| | | /** |
| | | * 根据快递公司名称获取编码 |
| | | */ |
| | | public static String getCodeByCompanyName(String companyName) { |
| | | for (Map.Entry<String, String> entry : EXPRESS_COMPANY_MAP.entrySet()) { |
| | | if (entry.getValue().equals(companyName)) { |
| | | return entry.getKey(); |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.constant; |
| | | |
| | | /** |
| | | * 代码生成通用常量 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class GenConstants |
| | | { |
| | | /** 单表(增删改查) */ |
| | | public static final String TPL_CRUD = "crud"; |
| | | |
| | | /** 树表(增删改查) */ |
| | | public static final String TPL_TREE = "tree"; |
| | | |
| | | /** 主子表(增删改查) */ |
| | | public static final String TPL_SUB = "sub"; |
| | | |
| | | /** 树编码字段 */ |
| | | public static final String TREE_CODE = "treeCode"; |
| | | |
| | | /** 树父编码字段 */ |
| | | public static final String TREE_PARENT_CODE = "treeParentCode"; |
| | | |
| | | /** 树名称字段 */ |
| | | public static final String TREE_NAME = "treeName"; |
| | | |
| | | /** 上级菜单ID字段 */ |
| | | public static final String PARENT_MENU_ID = "parentMenuId"; |
| | | |
| | | /** 上级菜单名称字段 */ |
| | | public static final String PARENT_MENU_NAME = "parentMenuName"; |
| | | |
| | | /** 数据库字符串类型 */ |
| | | public static final String[] COLUMNTYPE_STR = { "char", "varchar", "nvarchar", "varchar2" }; |
| | | |
| | | /** 数据库文本类型 */ |
| | | public static final String[] COLUMNTYPE_TEXT = { "tinytext", "text", "mediumtext", "longtext" }; |
| | | |
| | | /** 数据库时间类型 */ |
| | | public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp" }; |
| | | |
| | | /** 数据库数字类型 */ |
| | | public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "number", "integer", |
| | | "bigint", "float", "double", "decimal" }; |
| | | |
| | | /** 页面不需要编辑字段 */ |
| | | public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" }; |
| | | |
| | | /** 页面不需要显示的列表字段 */ |
| | | public static final String[] COLUMNNAME_NOT_LIST = { "id", "create_by", "create_time", "del_flag", "update_by", |
| | | "update_time" }; |
| | | |
| | | /** 页面不需要查询字段 */ |
| | | public static final String[] COLUMNNAME_NOT_QUERY = { "id", "create_by", "create_time", "del_flag", "update_by", |
| | | "update_time", "remark" }; |
| | | |
| | | /** Entity基类字段 */ |
| | | public static final String[] BASE_ENTITY = { "createBy", "createTime", "updateBy", "updateTime", "remark" }; |
| | | |
| | | /** Tree基类字段 */ |
| | | public static final String[] TREE_ENTITY = { "parentName", "parentId", "orderNum", "ancestors" }; |
| | | |
| | | /** 文本框 */ |
| | | public static final String HTML_INPUT = "input"; |
| | | |
| | | /** 文本域 */ |
| | | public static final String HTML_TEXTAREA = "textarea"; |
| | | |
| | | /** 下拉框 */ |
| | | public static final String HTML_SELECT = "select"; |
| | | |
| | | /** 单选框 */ |
| | | public static final String HTML_RADIO = "radio"; |
| | | |
| | | /** 复选框 */ |
| | | public static final String HTML_CHECKBOX = "checkbox"; |
| | | |
| | | /** 日期控件 */ |
| | | public static final String HTML_DATETIME = "datetime"; |
| | | |
| | | /** 图片上传控件 */ |
| | | public static final String HTML_IMAGE_UPLOAD = "imageUpload"; |
| | | |
| | | /** 文件上传控件 */ |
| | | public static final String HTML_FILE_UPLOAD = "fileUpload"; |
| | | |
| | | /** 富文本控件 */ |
| | | public static final String HTML_EDITOR = "editor"; |
| | | |
| | | /** 字符串类型 */ |
| | | public static final String TYPE_STRING = "String"; |
| | | |
| | | /** 整型 */ |
| | | public static final String TYPE_INTEGER = "Integer"; |
| | | |
| | | /** 长整型 */ |
| | | public static final String TYPE_LONG = "Long"; |
| | | |
| | | /** 浮点型 */ |
| | | public static final String TYPE_DOUBLE = "Double"; |
| | | |
| | | /** 高精度计算类型 */ |
| | | public static final String TYPE_BIGDECIMAL = "BigDecimal"; |
| | | |
| | | /** 时间类型 */ |
| | | public static final String TYPE_DATE = "Date"; |
| | | |
| | | /** 模糊查询 */ |
| | | public static final String QUERY_LIKE = "LIKE"; |
| | | |
| | | /** 相等查询 */ |
| | | public static final String QUERY_EQ = "EQ"; |
| | | |
| | | /** 需要 */ |
| | | public static final String REQUIRE = "1"; |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.constant; |
| | | |
| | | /** |
| | | * 返回状态码 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class HttpStatus |
| | | { |
| | | /** |
| | | * 操作成功 |
| | | */ |
| | | public static final int SUCCESS = 200; |
| | | |
| | | /** |
| | | * 对象创建成功 |
| | | */ |
| | | public static final int CREATED = 201; |
| | | |
| | | /** |
| | | * 请求已经被接受 |
| | | */ |
| | | public static final int ACCEPTED = 202; |
| | | |
| | | /** |
| | | * 操作已经执行成功,但是没有返回数据 |
| | | */ |
| | | public static final int NO_CONTENT = 204; |
| | | |
| | | /** |
| | | * 资源已被移除 |
| | | */ |
| | | public static final int MOVED_PERM = 301; |
| | | |
| | | /** |
| | | * 重定向 |
| | | */ |
| | | public static final int SEE_OTHER = 303; |
| | | |
| | | /** |
| | | * 资源没有被修改 |
| | | */ |
| | | public static final int NOT_MODIFIED = 304; |
| | | |
| | | /** |
| | | * 参数列表错误(缺少,格式不匹配) |
| | | */ |
| | | public static final int BAD_REQUEST = 400; |
| | | |
| | | /** |
| | | * 未授权 |
| | | */ |
| | | public static final int UNAUTHORIZED = 401; |
| | | |
| | | /** |
| | | * 访问受限,授权过期 |
| | | */ |
| | | public static final int FORBIDDEN = 403; |
| | | |
| | | /** |
| | | * 资源,服务未找到 |
| | | */ |
| | | public static final int NOT_FOUND = 404; |
| | | |
| | | /** |
| | | * 不允许的http方法 |
| | | */ |
| | | public static final int BAD_METHOD = 405; |
| | | |
| | | /** |
| | | * 资源冲突,或者资源被锁 |
| | | */ |
| | | public static final int CONFLICT = 409; |
| | | |
| | | /** |
| | | * 不支持的数据,媒体类型 |
| | | */ |
| | | public static final int UNSUPPORTED_TYPE = 415; |
| | | |
| | | /** |
| | | * 系统内部错误 |
| | | */ |
| | | public static final int ERROR = 500; |
| | | |
| | | /** |
| | | * 接口未实现 |
| | | */ |
| | | public static final int NOT_IMPLEMENTED = 501; |
| | | |
| | | /** |
| | | * 系统警告消息 |
| | | */ |
| | | public static final int WARN = 601; |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.constant; |
| | | |
| | | /** |
| | | * 短信常量 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class MsgConstants |
| | | { |
| | | /** 短信发送地址 */ |
| | | public static final String SEND_URL = "http://112.35.1.155:1992/sms/tmpsubmit"; |
| | | /** 更换手机号短信验证码 TEMPLATE_ID */ |
| | | public static final String CODE_TEMPLATE_ID = "5bf3949463e54c03a25c6fce3ad48139"; |
| | | /** 建桩申请短信验证码 TEMPLATE_ID */ |
| | | public static final String APPLY_TEMPLATE_ID = "44ac24b86a9f4dd6bee41577e2703472"; |
| | | |
| | | /** 停车占位提醒 TEMPLATE_ID */ |
| | | public static final String STOP_TEMPLATE_ID = "4940ce98a3f94f67aa9f5cd2d4e05cbd"; |
| | | |
| | | /** 充电结束 TEMPLATE_ID */ |
| | | public static final String CHARGE_TEMPLATE_ID = "47b2eb376cfa436faae041a6f2f22688"; |
| | | |
| | | /** 桩故障(自动/手动) TEMPLATE_ID */ |
| | | public static final String FAULT_TEMPLATE_ID = "37956469a14a47e484a747a1e7e462de"; |
| | | /** 更换手机号短信验证码 AP_ID */ |
| | | public static final String CODE_AP_ID = "GH123"; |
| | | /** 建桩短信验证码 AP_ID */ |
| | | public static final String APPLY_AP_ID = "JZ123"; |
| | | |
| | | /** 停车占位提醒 AP_ID */ |
| | | public static final String STOP_AP_ID = "TC123"; |
| | | |
| | | /** 充电结束 AP_ID */ |
| | | public static final String CHARGE_AP_ID = "CD123"; |
| | | |
| | | /** 桩故障(自动/手动) AP_ID */ |
| | | public static final String FAULT_AP_ID = "GZ123"; |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.constant; |
| | | |
| | | /** |
| | | * 任务调度通用常量 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class ScheduleConstants |
| | | { |
| | | public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME"; |
| | | |
| | | /** 执行目标key */ |
| | | public static final String TASK_PROPERTIES = "TASK_PROPERTIES"; |
| | | |
| | | /** 默认 */ |
| | | public static final String MISFIRE_DEFAULT = "0"; |
| | | |
| | | /** 立即触发执行 */ |
| | | public static final String MISFIRE_IGNORE_MISFIRES = "1"; |
| | | |
| | | /** 触发一次执行 */ |
| | | public static final String MISFIRE_FIRE_AND_PROCEED = "2"; |
| | | |
| | | /** 不触发立即执行 */ |
| | | public static final String MISFIRE_DO_NOTHING = "3"; |
| | | |
| | | public enum Status |
| | | { |
| | | /** |
| | | * 正常 |
| | | */ |
| | | NORMAL("0"), |
| | | /** |
| | | * 暂停 |
| | | */ |
| | | PAUSE("1"); |
| | | |
| | | private String value; |
| | | |
| | | private Status(String value) |
| | | { |
| | | this.value = value; |
| | | } |
| | | |
| | | public String getValue() |
| | | { |
| | | return value; |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.constant; |
| | | |
| | | /** |
| | | * 权限相关通用常量 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class SecurityConstants |
| | | { |
| | | /** |
| | | * 用户ID字段 |
| | | */ |
| | | public static final String DETAILS_USER_ID = "user_id"; |
| | | |
| | | /** |
| | | * 用户名字段 |
| | | */ |
| | | public static final String DETAILS_USERNAME = "username"; |
| | | |
| | | /** |
| | | * 授权信息字段 |
| | | */ |
| | | public static final String AUTHORIZATION_HEADER = "Authorization"; |
| | | |
| | | /** |
| | | * 请求来源 |
| | | */ |
| | | public static final String FROM_SOURCE = "from-source"; |
| | | |
| | | /** |
| | | * 内部请求 |
| | | */ |
| | | public static final String INNER = "inner"; |
| | | |
| | | /** |
| | | * 用户标识 |
| | | */ |
| | | public static final String USER_KEY = "user_key"; |
| | | |
| | | /** |
| | | * 用户类型(system/applet) |
| | | */ |
| | | public static final String USER_TYPE = "user_type"; |
| | | /** |
| | | * 小程序登录用户标识 |
| | | */ |
| | | public static final String USER_APPLET_KEY = "user_applet_key"; |
| | | |
| | | /** |
| | | * 登录用户 |
| | | */ |
| | | public static final String LOGIN_USER = "login_user"; |
| | | |
| | | /** |
| | | * 角色权限 |
| | | */ |
| | | public static final String ROLE_PERMISSION = "role_permission"; |
| | | |
| | | /** |
| | | * 过期时间 |
| | | */ |
| | | public static final String EXPIRATION_TIME = "expiration_time"; |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.constant; |
| | | |
| | | /** |
| | | * 服务名称 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class ServiceNameConstants |
| | | { |
| | | /** |
| | | * 认证服务的serviceid |
| | | */ |
| | | public static final String AUTH_SERVICE = "ruoyi-auth"; |
| | | |
| | | /** |
| | | * 系统模块的serviceid |
| | | */ |
| | | public static final String SYSTEM_SERVICE = "ruoyi-system"; |
| | | |
| | | /** |
| | | * 文件服务的serviceid |
| | | */ |
| | | public static final String FILE_SERVICE = "ruoyi-file"; |
| | | public static final String ACCOUNT_SERVICE = "ruoyi-account"; |
| | | public static final String OTHER_SERVICE = "ruoyi-other"; |
| | | public static final String ORDER_SERVICE = "ruoyi-order"; |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.constant; |
| | | |
| | | /** |
| | | * Token的Key常量 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class TokenConstants |
| | | { |
| | | /** |
| | | * 令牌自定义标识 |
| | | */ |
| | | public static final String AUTHENTICATION = "Authorization"; |
| | | |
| | | /** |
| | | * 令牌前缀 |
| | | */ |
| | | public static final String PREFIX = "Bearer "; |
| | | |
| | | /** |
| | | * 令牌秘钥 |
| | | */ |
| | | public final static String SECRET = "abcdefghijklmnopqrstuvwxyz"; |
| | | |
| | | /** |
| | | * 参数签名 |
| | | */ |
| | | public static final String SIGN = "sign"; |
| | | |
| | | /** |
| | | * 参数随机字符串 |
| | | */ |
| | | public static final String NONCE_STR = "nonce_str"; |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.constant; |
| | | |
| | | /** |
| | | * 用户常量信息 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class UserConstants |
| | | { |
| | | /** |
| | | * 平台内系统用户的唯一标志 |
| | | */ |
| | | public static final String SYS_USER = "SYS_USER"; |
| | | |
| | | /** 正常状态 */ |
| | | public static final String NORMAL = "0"; |
| | | |
| | | /** 异常状态 */ |
| | | public static final String EXCEPTION = "1"; |
| | | |
| | | /** 用户封禁状态 */ |
| | | public static final String USER_DISABLE = "1"; |
| | | |
| | | /** 角色封禁状态 */ |
| | | public static final String ROLE_DISABLE = "1"; |
| | | |
| | | /** 部门正常状态 */ |
| | | public static final String DEPT_NORMAL = "0"; |
| | | |
| | | /** 部门停用状态 */ |
| | | public static final String DEPT_DISABLE = "1"; |
| | | |
| | | /** 字典正常状态 */ |
| | | public static final String DICT_NORMAL = "0"; |
| | | |
| | | /** 是否为系统默认(是) */ |
| | | public static final String YES = "Y"; |
| | | |
| | | /** 是否菜单外链(是) */ |
| | | public static final String YES_FRAME = "0"; |
| | | |
| | | /** 是否菜单外链(否) */ |
| | | public static final String NO_FRAME = "1"; |
| | | |
| | | /** 菜单类型(目录) */ |
| | | public static final String TYPE_DIR = "M"; |
| | | |
| | | /** 菜单类型(菜单) */ |
| | | public static final String TYPE_MENU = "C"; |
| | | |
| | | /** 菜单类型(按钮) */ |
| | | public static final String TYPE_BUTTON = "F"; |
| | | |
| | | /** Layout组件标识 */ |
| | | public final static String LAYOUT = "Layout"; |
| | | |
| | | /** ParentView组件标识 */ |
| | | public final static String PARENT_VIEW = "ParentView"; |
| | | |
| | | /** InnerLink组件标识 */ |
| | | public final static String INNER_LINK = "InnerLink"; |
| | | |
| | | /** 校验是否唯一的返回标识 */ |
| | | public final static boolean UNIQUE = true; |
| | | public final static boolean NOT_UNIQUE = false; |
| | | |
| | | /** |
| | | * 用户名长度限制 |
| | | */ |
| | | public static final int USERNAME_MIN_LENGTH = 2; |
| | | |
| | | public static final int USERNAME_MAX_LENGTH = 20; |
| | | |
| | | /** |
| | | * 密码长度限制 |
| | | */ |
| | | public static final int PASSWORD_MIN_LENGTH = 5; |
| | | |
| | | public static final int PASSWORD_MAX_LENGTH = 40; |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.context; |
| | | |
| | | import java.util.Map; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | import com.alibaba.ttl.TransmittableThreadLocal; |
| | | import com.ruoyi.common.core.constant.SecurityConstants; |
| | | import com.ruoyi.common.core.text.Convert; |
| | | import com.ruoyi.common.core.utils.StringUtils; |
| | | |
| | | /** |
| | | * 获取当前线程变量中的 用户id、用户名称、Token等信息 |
| | | * 注意: 必须在网关通过请求头的方法传入,同时在HeaderInterceptor拦截器设置值。 否则这里无法获取 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class SecurityContextHolder |
| | | { |
| | | private static final TransmittableThreadLocal<Map<String, Object>> THREAD_LOCAL = new TransmittableThreadLocal<>(); |
| | | |
| | | public static void set(String key, Object value) |
| | | { |
| | | Map<String, Object> map = getLocalMap(); |
| | | map.put(key, value == null ? StringUtils.EMPTY : value); |
| | | } |
| | | |
| | | public static String get(String key) |
| | | { |
| | | Map<String, Object> map = getLocalMap(); |
| | | return Convert.toStr(map.getOrDefault(key, StringUtils.EMPTY)); |
| | | } |
| | | |
| | | public static <T> T get(String key, Class<T> clazz) |
| | | { |
| | | Map<String, Object> map = getLocalMap(); |
| | | return StringUtils.cast(map.getOrDefault(key, null)); |
| | | } |
| | | |
| | | public static Map<String, Object> getLocalMap() |
| | | { |
| | | Map<String, Object> map = THREAD_LOCAL.get(); |
| | | if (map == null) |
| | | { |
| | | map = new ConcurrentHashMap<String, Object>(); |
| | | THREAD_LOCAL.set(map); |
| | | } |
| | | return map; |
| | | } |
| | | |
| | | public static void setLocalMap(Map<String, Object> threadLocalMap) |
| | | { |
| | | THREAD_LOCAL.set(threadLocalMap); |
| | | } |
| | | |
| | | public static Long getUserId() |
| | | { |
| | | return Convert.toLong(get(SecurityConstants.DETAILS_USER_ID), 0L); |
| | | } |
| | | |
| | | public static void setUserId(String account) |
| | | { |
| | | set(SecurityConstants.DETAILS_USER_ID, account); |
| | | } |
| | | |
| | | public static String getUserName() |
| | | { |
| | | return get(SecurityConstants.DETAILS_USERNAME); |
| | | } |
| | | |
| | | public static void setUserName(String username) |
| | | { |
| | | set(SecurityConstants.DETAILS_USERNAME, username); |
| | | } |
| | | |
| | | public static String getUserKey() |
| | | { |
| | | return get(SecurityConstants.USER_KEY); |
| | | } |
| | | |
| | | public static void setUserKey(String userKey) |
| | | { |
| | | set(SecurityConstants.USER_KEY, userKey); |
| | | } |
| | | |
| | | public static String getPermission() |
| | | { |
| | | return get(SecurityConstants.ROLE_PERMISSION); |
| | | } |
| | | |
| | | public static void setPermission(String permissions) |
| | | { |
| | | set(SecurityConstants.ROLE_PERMISSION, permissions); |
| | | } |
| | | |
| | | public static void remove() |
| | | { |
| | | THREAD_LOCAL.remove(); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.domain; |
| | | |
| | | import java.io.Serializable; |
| | | import com.ruoyi.common.core.constant.Constants; |
| | | |
| | | /** |
| | | * 响应信息主体 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class R<T> implements Serializable |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** 成功 */ |
| | | public static final int SUCCESS = Constants.SUCCESS; |
| | | |
| | | /** 失败 */ |
| | | public static final int FAIL = Constants.FAIL; |
| | | |
| | | private int code; |
| | | |
| | | private String msg; |
| | | |
| | | private T data; |
| | | |
| | | public static <T> R<T> ok() |
| | | { |
| | | return restResult(null, SUCCESS, null); |
| | | } |
| | | |
| | | public static <T> R<T> ok(T data) |
| | | { |
| | | return restResult(data, SUCCESS, null); |
| | | } |
| | | |
| | | public static <T> R<T> ok(T data, String msg) |
| | | { |
| | | return restResult(data, SUCCESS, msg); |
| | | } |
| | | |
| | | public static <T> R<T> fail() |
| | | { |
| | | return restResult(null, FAIL, null); |
| | | } |
| | | |
| | | public static <T> R<T> fail(String msg) |
| | | { |
| | | return restResult(null, FAIL, msg); |
| | | } |
| | | |
| | | public static <T> R<T> fail(T data) |
| | | { |
| | | return restResult(data, FAIL, null); |
| | | } |
| | | |
| | | public static <T> R<T> fail(T data, String msg) |
| | | { |
| | | return restResult(data, FAIL, msg); |
| | | } |
| | | |
| | | public static <T> R<T> fail(int code, String msg) |
| | | { |
| | | return restResult(null, code, msg); |
| | | } |
| | | |
| | | private static <T> R<T> restResult(T data, int code, String msg) |
| | | { |
| | | R<T> apiResult = new R<>(); |
| | | apiResult.setCode(code); |
| | | apiResult.setData(data); |
| | | apiResult.setMsg(msg); |
| | | return apiResult; |
| | | } |
| | | |
| | | public int getCode() |
| | | { |
| | | return code; |
| | | } |
| | | |
| | | public void setCode(int code) |
| | | { |
| | | this.code = code; |
| | | } |
| | | |
| | | public String getMsg() |
| | | { |
| | | return msg; |
| | | } |
| | | |
| | | public void setMsg(String msg) |
| | | { |
| | | this.msg = msg; |
| | | } |
| | | |
| | | public T getData() |
| | | { |
| | | return data; |
| | | } |
| | | |
| | | public void setData(T data) |
| | | { |
| | | this.data = data; |
| | | } |
| | | |
| | | public static <T> Boolean isError(R<T> ret) |
| | | { |
| | | return !isSuccess(ret); |
| | | } |
| | | |
| | | public static <T> Boolean isSuccess(R<T> ret) |
| | | { |
| | | return R.SUCCESS == ret.getCode(); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.dto; |
| | | |
| | | import com.ruoyi.common.core.web.page.BasePage; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class AppGoodQuery extends BasePage { |
| | | @ApiModelProperty("1=购买商品,2=兑换商品") |
| | | private Integer type; |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.dto; |
| | | |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | @Data |
| | | public class ChargingOrderGroup { |
| | | @ApiModelProperty("充电量") |
| | | BigDecimal chargingCapacity; |
| | | @ApiModelProperty("站点") |
| | | Integer siteId; |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.dto; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Data |
| | | public class ChargingPercentProvinceDto { |
| | | String provinceCode; |
| | | LocalDate date1; |
| | | LocalDate date2; |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.dto; |
| | | |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class ExchangeBackDto { |
| | | private Long id; |
| | | private String code; |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.dto; |
| | | |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Data |
| | | public class ExchangeDto { |
| | | @ApiModelProperty("商品id") |
| | | Integer goodId; |
| | | @ApiModelProperty("地址id") |
| | | Long addressId; |
| | | @ApiModelProperty("备注") |
| | | String remark; |
| | | @ApiModelProperty(hidden = true) |
| | | Long userId; |
| | | |
| | | @ApiModelProperty("1商品2优惠卷") |
| | | Integer goodType; |
| | | @ApiModelProperty(hidden = true) |
| | | Integer point; |
| | | @ApiModelProperty("购买数量") |
| | | Integer num; |
| | | @ApiModelProperty("优惠卷id") |
| | | Long couponId; |
| | | |
| | | @ApiModelProperty("1微信2支付宝") |
| | | Integer payMethod; |
| | | |
| | | @ApiModelProperty(hidden =true) |
| | | BigDecimal orderPrice; |
| | | @ApiModelProperty(hidden =true) |
| | | BigDecimal payPrice; |
| | | @ApiModelProperty(hidden =true) |
| | | BigDecimal discountPrice; |
| | | @ApiModelProperty(hidden =true) |
| | | BigDecimal vipDiscount; |
| | | @ApiModelProperty(hidden =true) |
| | | String title; |
| | | @ApiModelProperty(hidden =true) |
| | | String phone; |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.dto; |
| | | |
| | | import com.ruoyi.common.core.web.page.BasePage; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | @Data |
| | | @ApiModel(value = "ChargingOrderQuery充电桩订单查询对象",description = "管理后台充电桩订单查询对象") |
| | | public class MongoChargingOrderQuery extends BasePage { |
| | | @ApiModelProperty(value = "订单编号") |
| | | private String code; |
| | | @ApiModelProperty(value = "订单类型(1=充电订单(小程序),2=充电订单(刷卡))") |
| | | private Integer orderType; |
| | | @ApiModelProperty(value = "手机号") |
| | | private String phone; |
| | | @ApiModelProperty(value = "状态(0=未知,1=等待中,2=启动中,3=充电中,4=停止中,5=已结束)") |
| | | private Integer status; |
| | | @ApiModelProperty(value = "站点id") |
| | | private Integer siteId; |
| | | @ApiModelProperty(value = "充电桩code ") |
| | | private String chargingPileCode; |
| | | @ApiModelProperty(value = "充电枪code ") |
| | | private String chargingGunCode; |
| | | @ApiModelProperty(value = "开始时间2020-01-01 00:00:00 - 2021-01-01 23:59:59") |
| | | private String createTime; |
| | | @ApiModelProperty(value = "结束时间2020-01-01 00:00:00 - 2021-01-01 23:59:59") |
| | | private String lastTime; |
| | | @ApiModelProperty(value = "订单来源 1明星 2快电 3新电途") |
| | | private Integer orderSource; |
| | | @ApiModelProperty(value = "用户ids 前端忽略") |
| | | private List<Long> userIds; |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.dto; |
| | | |
| | | import lombok.Data; |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | @Data |
| | | public class PointChangeDto { |
| | | private Long userId; |
| | | private Integer points; |
| | | private String remark; |
| | | private Integer type; |
| | | private String code; |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.dto; |
| | | |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class SteategyPassDto { |
| | | @ApiModelProperty("备注") |
| | | private String remark; |
| | | @ApiModelProperty("1通过2拒绝") |
| | | private Integer pass; |
| | | @ApiModelProperty("ID") |
| | | private Integer id; |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.enums; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * @Description |
| | | * @Author xiaochen |
| | | * @Date 2023/6/8 16:42 |
| | | */ |
| | | public enum ApproveConfigEnum { |
| | | |
| | | /*审批类型 1=交车审批、2=续约审批、3=退车审批*/ |
| | | |
| | | DELIVERY_APPROVAL(1, "交车审批"), |
| | | RENEWAL_APPROVAL(2, "续约审批"), |
| | | RETURN_APPROVAL(3, "退车审批"); |
| | | |
| | | @Getter |
| | | private String desc; |
| | | |
| | | |
| | | @Getter |
| | | private int code; |
| | | |
| | | |
| | | ApproveConfigEnum(int code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | /** |
| | | * 通过code获取枚举 |
| | | * |
| | | * @param code |
| | | * @return |
| | | */ |
| | | public static ApproveConfigEnum fromCode(Integer code) { |
| | | ApproveConfigEnum[] resultTypes = ApproveConfigEnum.values(); |
| | | for (ApproveConfigEnum resultType : resultTypes) { |
| | | if (code.equals(resultType.getCode())) { |
| | | return resultType; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.enums; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * @Description |
| | | * @Author xiaochen |
| | | * @Date 2023/6/8 16:42 |
| | | */ |
| | | public enum AuditStateEnum { |
| | | |
| | | /*审核状态 0待审批 1通过 2驳回 3已撤回*/ |
| | | |
| | | PENDING_APPROVAL(0, "待审批"), |
| | | APPROVED(1, "审批通过"), |
| | | APPROVAL_REJECTION(2, "审批驳回"), |
| | | WITHDRAWN(3, "已撤回"); |
| | | |
| | | @Getter |
| | | private String desc; |
| | | |
| | | |
| | | @Getter |
| | | private int code; |
| | | |
| | | |
| | | AuditStateEnum(int code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | /** |
| | | * 通过code获取枚举 |
| | | * |
| | | * @param code |
| | | * @return |
| | | */ |
| | | public static AuditStateEnum fromCode(Integer code) { |
| | | AuditStateEnum[] resultTypes = AuditStateEnum.values(); |
| | | for (AuditStateEnum resultType : resultTypes) { |
| | | if (code.equals(resultType.getCode())) { |
| | | return resultType; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.enums; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * @Description |
| | | * @Author xiaochen |
| | | * @Date 2023/6/8 16:42 |
| | | */ |
| | | public enum AuditTypeEnum { |
| | | |
| | | /*审核类型 1交车申请 2续约申请 3退车申请 4事故账单申请*/ |
| | | |
| | | DELIVERY_APPLICATION(1, "交车申请"), |
| | | RENEWAL_APPLICATION(2, "续约申请"), |
| | | RETURN_APPLICATION(3, "退车申请"), |
| | | ACCIDENT_BILL_APPLICATION(4, "事故账单申请"); |
| | | |
| | | @Getter |
| | | private String desc; |
| | | |
| | | |
| | | @Getter |
| | | private int code; |
| | | |
| | | |
| | | AuditTypeEnum(int code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | /** |
| | | * 通过code获取枚举 |
| | | * |
| | | * @param code |
| | | * @return |
| | | */ |
| | | public static AuditTypeEnum fromCode(Integer code) { |
| | | AuditTypeEnum[] resultTypes = AuditTypeEnum.values(); |
| | | for (AuditTypeEnum resultType : resultTypes) { |
| | | if (code.equals(resultType.getCode())) { |
| | | return resultType; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.enums; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * @Description |
| | | * @Author xiaochen |
| | | * @Date 2023/6/8 16:42 |
| | | */ |
| | | public enum CarColorEnum { |
| | | |
| | | /*1=白色、2=黑色、3=银色、4=灰色、5=红色、6=蓝色、7=绿色、8=黄色、9=金色、10=紫色、11=橙色、12=其他*/ |
| | | |
| | | WHITE(1, "白色"), |
| | | BLACK(2, "黑色"), |
| | | SILVERY(3, "银色"), |
| | | GREY(4, "灰色"), |
| | | RED(5, "红色"), |
| | | BLUE(6, "蓝色"), |
| | | GREEN(7, "绿色"), |
| | | YELLOW(8, "黄色"), |
| | | GOLDEN(9, "金色"), |
| | | PURPLE(10, "紫色"), |
| | | ORANGE(11, "橙色"), |
| | | OTHER(12, "其他"); |
| | | |
| | | @Getter |
| | | private String desc; |
| | | |
| | | |
| | | @Getter |
| | | private int code; |
| | | |
| | | |
| | | CarColorEnum(int code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | /** |
| | | * 通过code获取枚举 |
| | | * |
| | | * @param code |
| | | * @return |
| | | */ |
| | | public static CarColorEnum fromCode(Integer code) { |
| | | CarColorEnum[] resultTypes = CarColorEnum.values(); |
| | | for (CarColorEnum resultType : resultTypes) { |
| | | if (code.equals(resultType.getCode())) { |
| | | return resultType; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.enums; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * @Description |
| | | * @Author xiaochen |
| | | * @Date 2023/6/8 16:42 |
| | | */ |
| | | public enum CarStateEnum { |
| | | |
| | | /*状态1= 待上户、2=待办证、3=待整备、4=待租、5=已租、6=已处置*/ |
| | | |
| | | PENDING_REGISTRATION(1, "待上户"), |
| | | PENDING_CERTIFICATE(2, "待办证"), |
| | | TO_BE_PREPARED(3, "待整备"), |
| | | FOR_RENT(4, "待租"), |
| | | RENTED(5, "已租"), |
| | | DISPOSED(6, "已处置"); |
| | | |
| | | @Getter |
| | | private String desc; |
| | | |
| | | |
| | | @Getter |
| | | private int code; |
| | | |
| | | |
| | | CarStateEnum(int code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | /** |
| | | * 通过code获取枚举 |
| | | * |
| | | * @param code |
| | | * @return |
| | | */ |
| | | public static CarStateEnum fromCode(Integer code) { |
| | | CarStateEnum[] resultTypes = CarStateEnum.values(); |
| | | for (CarStateEnum resultType : resultTypes) { |
| | | if (code.equals(resultType.getCode())) { |
| | | return resultType; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.enums; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * @Description |
| | | * @Author xiaochen |
| | | * @Date 2023/6/8 16:42 |
| | | */ |
| | | public enum ContractStateEnum { |
| | | |
| | | /*合同状态 1签约中 2审批拒绝 3续约中 4待执行 5执行中 6结算中 7已结束 8已作废 9即将到期 10已到期 11已撤销*/ |
| | | |
| | | SIGNING(1, "签约中"), |
| | | APPROVAL_REJECTION(2, "审批拒绝"), |
| | | UNDER_RENEWAL(3, "续约中"), |
| | | TO_BE_EXECUTED(4, "待执行"), |
| | | UNDER_EXECUTION(5, "执行中"), |
| | | SETTLEMENT_PROGRESS(6, "结算中"), |
| | | ENDED(7, "已结束"), |
| | | VOIDED(8, "已作废"), |
| | | DUE(9, "即将到期"), |
| | | EXPIRED(10, "已到期"), |
| | | REVOKED(11, "已撤销"); |
| | | |
| | | @Getter |
| | | private String desc; |
| | | |
| | | |
| | | @Getter |
| | | private int code; |
| | | |
| | | |
| | | ContractStateEnum(int code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | /** |
| | | * 通过code获取枚举 |
| | | * |
| | | * @param code |
| | | * @return |
| | | */ |
| | | public static ContractStateEnum fromCode(Integer code) { |
| | | ContractStateEnum[] resultTypes = ContractStateEnum.values(); |
| | | for (ContractStateEnum resultType : resultTypes) { |
| | | if (code.equals(resultType.getCode())) { |
| | | return resultType; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.enums; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * @Description |
| | | * @Author xiaochen |
| | | * @Date 2023/6/8 16:42 |
| | | */ |
| | | public enum ContractTypeEnum { |
| | | |
| | | /*合同类型 1=纯租 2=以租代购 3=打工模式*/ |
| | | PURE_RENT(1, "纯租"), |
| | | CAR_LEASE(2, "以租代购"), |
| | | WORKING_MODE(3, "打工模式"); |
| | | |
| | | @Getter |
| | | private String desc; |
| | | |
| | | |
| | | @Getter |
| | | private int code; |
| | | |
| | | |
| | | ContractTypeEnum(int code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | /** |
| | | * 通过code获取枚举 |
| | | * |
| | | * @param code |
| | | * @return |
| | | */ |
| | | public static ContractTypeEnum fromCode(Integer code) { |
| | | ContractTypeEnum[] resultTypes = ContractTypeEnum.values(); |
| | | for (ContractTypeEnum resultType : resultTypes) { |
| | | if (code.equals(resultType.getCode())) { |
| | | return resultType; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.enums; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * @author xiaochen |
| | | * @ClassName Disable |
| | | * @Description |
| | | * @date 2022-06-08 16:55 |
| | | */ |
| | | public enum DelFlagEnum { |
| | | NO(0, "否"), |
| | | YES(1, "是"); |
| | | |
| | | @Getter |
| | | private String desc; |
| | | |
| | | |
| | | @Getter |
| | | private int code; |
| | | |
| | | |
| | | DelFlagEnum(int code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | /** |
| | | * 通过code获取枚举 |
| | | * |
| | | * @param code |
| | | * @return |
| | | */ |
| | | public static DelFlagEnum fromCode(Integer code) { |
| | | DelFlagEnum[] resultTypes = DelFlagEnum.values(); |
| | | for (DelFlagEnum resultType : resultTypes) { |
| | | if (code.equals(resultType.getCode())) { |
| | | return resultType; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.enums; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * @author xiaochen |
| | | * @ClassName Disable |
| | | * @Description |
| | | * @date 2022-06-08 16:55 |
| | | */ |
| | | public enum DisabledEnum { |
| | | NO(0, "否"), |
| | | YES(1, "是"); |
| | | |
| | | @Getter |
| | | private String desc; |
| | | |
| | | |
| | | @Getter |
| | | private int code; |
| | | |
| | | |
| | | DisabledEnum(int code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | /** |
| | | * 通过code获取枚举 |
| | | * |
| | | * @param code |
| | | * @return |
| | | */ |
| | | public static DisabledEnum fromCode(Integer code) { |
| | | DisabledEnum[] resultTypes = DisabledEnum.values(); |
| | | for (DisabledEnum resultType : resultTypes) { |
| | | if (code.equals(resultType.getCode())) { |
| | | return resultType; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.enums; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * @Description |
| | | * @Author xiaochen |
| | | * @Date 2023/6/8 16:42 |
| | | */ |
| | | public enum HandoverStateEnum { |
| | | |
| | | /*交车状态 1待交车 2待审批 3已交车 4审批拒绝*/ |
| | | |
| | | VEHICLE_DELIVERED(1, "待交车"), |
| | | PENDING_APPROVAL(2, "待审批"), |
| | | DELIVERED(3, "已交车"), |
| | | APPROVAL_REJECTION(4, "审批拒绝"), |
| | | REVOKED(5, "已撤销"); |
| | | |
| | | @Getter |
| | | private String desc; |
| | | |
| | | |
| | | @Getter |
| | | private int code; |
| | | |
| | | |
| | | HandoverStateEnum(int code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | /** |
| | | * 通过code获取枚举 |
| | | * |
| | | * @param code |
| | | * @return |
| | | */ |
| | | public static HandoverStateEnum fromCode(Integer code) { |
| | | HandoverStateEnum[] resultTypes = HandoverStateEnum.values(); |
| | | for (HandoverStateEnum resultType : resultTypes) { |
| | | if (code.equals(resultType.getCode())) { |
| | | return resultType; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.enums; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * @Description |
| | | * @Author xiaochen |
| | | * @Date 2023/6/8 16:42 |
| | | */ |
| | | public enum ImportTypeEnum { |
| | | |
| | | /*1=新车车辆导入 、2=已有车辆导入、3=上户导入、4=设备导入、5=违章导入、6=违章图片导入、7=保养记录导入、8=保单导入、9=合同导入*/ |
| | | |
| | | NEW_CAR(1, "新车车辆导入"), |
| | | EXIST_CAR(2, "已有车辆导入"), |
| | | WEALTHY(3, "上户导入"), |
| | | DEVICE(4, "设备导入"), |
| | | VIOLATION(5, "违章导入"), |
| | | VIOLATION_PICTURE(6, "违章图片导入"), |
| | | SERVICE(7, "保养记录导入"), |
| | | WARRANTY(8, "保单导入"), |
| | | CONTRACT(9, "合同导入"), |
| | | CERTIFICATE(10, "办证导入"), |
| | | INSPECTANNUALLY(11, "车辆年检导入"), |
| | | MAINTENANCE(12, "车辆维修导入"); |
| | | |
| | | @Getter |
| | | private String desc; |
| | | |
| | | |
| | | @Getter |
| | | private int code; |
| | | |
| | | |
| | | ImportTypeEnum(int code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | /** |
| | | * 通过code获取枚举 |
| | | * |
| | | * @param code |
| | | * @return |
| | | */ |
| | | public static ImportTypeEnum fromCode(Integer code) { |
| | | ImportTypeEnum[] resultTypes = ImportTypeEnum.values(); |
| | | for (ImportTypeEnum resultType : resultTypes) { |
| | | if (code.equals(resultType.getCode())) { |
| | | return resultType; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.enums; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * @Description |
| | | * @Author xiaochen |
| | | * @Date 2023/6/8 16:42 |
| | | */ |
| | | public enum InsureTypeEnum { |
| | | |
| | | /*保险类型 1=商业险、2=交强险、3=承运人责任险、4=客伤险、5=盗抢险*/ |
| | | |
| | | COMMERCIAL_INSURANCE(1, "商业险"), |
| | | COMPULSORY_INSURANCE(2, "交强险"), |
| | | CARRIER_LIABILITY_INSURANCE(3, "承运人责任险"), |
| | | CUSTOMER_INJURY_INSURANCE(4, "客伤险"), |
| | | THEFT_INSURANCE(5, "盗抢险"); |
| | | |
| | | @Getter |
| | | private String desc; |
| | | |
| | | |
| | | @Getter |
| | | private int code; |
| | | |
| | | |
| | | InsureTypeEnum(int code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | /** |
| | | * 通过code获取枚举 |
| | | * |
| | | * @param code |
| | | * @return |
| | | */ |
| | | public static InsureTypeEnum fromCode(Integer code) { |
| | | InsureTypeEnum[] resultTypes = InsureTypeEnum.values(); |
| | | for (InsureTypeEnum resultType : resultTypes) { |
| | | if (code.equals(resultType.getCode())) { |
| | | return resultType; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.enums; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * @Description |
| | | * @Author xiaochen |
| | | * @Date 2023/6/8 16:42 |
| | | */ |
| | | public enum PurchaseStateEnum { |
| | | |
| | | /*购买状态 1在保 2停保 3复保 4脱保*/ |
| | | |
| | | UNDER_PROTECTION(1, "在保"), |
| | | SUSPENSION_MAINTENANCE(2, "停保"), |
| | | REINSURANCE(3, "复保"), |
| | | DELISTING(4, "脱保"); |
| | | |
| | | @Getter |
| | | private String desc; |
| | | |
| | | |
| | | @Getter |
| | | private int code; |
| | | |
| | | |
| | | PurchaseStateEnum(int code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | /** |
| | | * 通过code获取枚举 |
| | | * |
| | | * @param code |
| | | * @return |
| | | */ |
| | | public static PurchaseStateEnum fromCode(Integer code) { |
| | | PurchaseStateEnum[] resultTypes = PurchaseStateEnum.values(); |
| | | for (PurchaseStateEnum resultType : resultTypes) { |
| | | if (code.equals(resultType.getCode())) { |
| | | return resultType; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.enums; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * @Description |
| | | * @Author xiaochen |
| | | * @Date 2023/6/8 16:42 |
| | | */ |
| | | public enum ReturnCarTypeEnum { |
| | | |
| | | /*合同类型 合同到期、提前退车、强制收车*/ |
| | | EXPIRE(1, "合同到期"), |
| | | EARLY_WITHDRAWAL(2, "提前退车"), |
| | | COMPULSORY_COLLECTION(3, "强制收车"); |
| | | |
| | | @Getter |
| | | private String desc; |
| | | |
| | | |
| | | @Getter |
| | | private int code; |
| | | |
| | | |
| | | ReturnCarTypeEnum(int code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | /** |
| | | * 通过code获取枚举 |
| | | * |
| | | * @param code |
| | | * @return |
| | | */ |
| | | public static ReturnCarTypeEnum fromCode(Integer code) { |
| | | ReturnCarTypeEnum[] resultTypes = ReturnCarTypeEnum.values(); |
| | | for (ReturnCarTypeEnum resultType : resultTypes) { |
| | | if (code.equals(resultType.getCode())) { |
| | | return resultType; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.enums; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * @Description |
| | | * @Author xiaochen |
| | | * @Date 2023/6/8 16:42 |
| | | */ |
| | | public enum ReturnStateEnum { |
| | | |
| | | /*退车状态 1=待验车 2=待生成账单 3=待审批 4=已退车 5=审批拒绝*/ |
| | | |
| | | VEHICLE_INSPECTED(1, "待验车"), |
| | | PENDING_BILL_GENERATION(2, "待生成账单"), |
| | | PENDING_APPROVAL(3, "待审批"), |
| | | RETURNED_VEHICLE(4, "已退车"), |
| | | APPROVAL_REJECTION(5, "审批拒绝"), |
| | | REVOKED(6, "已撤销"); |
| | | |
| | | @Getter |
| | | private String desc; |
| | | |
| | | |
| | | @Getter |
| | | private int code; |
| | | |
| | | |
| | | ReturnStateEnum(int code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | /** |
| | | * 通过code获取枚举 |
| | | * |
| | | * @param code |
| | | * @return |
| | | */ |
| | | public static ReturnStateEnum fromCode(Integer code) { |
| | | ReturnStateEnum[] resultTypes = ReturnStateEnum.values(); |
| | | for (ReturnStateEnum resultType : resultTypes) { |
| | | if (code.equals(resultType.getCode())) { |
| | | return resultType; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.enums; |
| | | |
| | | /** |
| | | * 用户状态 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public enum UserStatus |
| | | { |
| | | OK("0", "正常"), DISABLE("1", "停用"), DELETED("2", "删除"); |
| | | |
| | | private final String code; |
| | | private final String info; |
| | | |
| | | UserStatus(String code, String info) |
| | | { |
| | | this.code = code; |
| | | this.info = info; |
| | | } |
| | | |
| | | public String getCode() |
| | | { |
| | | return code; |
| | | } |
| | | |
| | | public String getInfo() |
| | | { |
| | | return info; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.enums; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * @Description |
| | | * @Author xiaochen |
| | | * @Date 2023/6/8 16:42 |
| | | */ |
| | | public enum WarrantyStateEnum { |
| | | |
| | | /*保单状态 1正常 2已脱保 3已停保 4即将到期 5建议停保*/ |
| | | |
| | | NORMAL(1, "正常"), |
| | | DELISTED(2, "已脱保"), |
| | | DISCONTINUED_WARRANTY(3, "已停保"), |
| | | DUE(4, "即将到期"), |
| | | SUGGEST_DISCONTINUING_MAINTENANCE(5, "建议停保"); |
| | | |
| | | @Getter |
| | | private String desc; |
| | | |
| | | |
| | | @Getter |
| | | private int code; |
| | | |
| | | |
| | | WarrantyStateEnum(int code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | /** |
| | | * 通过code获取枚举 |
| | | * |
| | | * @param code |
| | | * @return |
| | | */ |
| | | public static WarrantyStateEnum fromCode(Integer code) { |
| | | WarrantyStateEnum[] resultTypes = WarrantyStateEnum.values(); |
| | | for (WarrantyStateEnum resultType : resultTypes) { |
| | | if (code.equals(resultType.getCode())) { |
| | | return resultType; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.enums.status; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * @Description |
| | | * @Author xiaochen |
| | | * @Date 2023/6/8 16:42 |
| | | */ |
| | | public enum AdvertisingStatusEnum { |
| | | |
| | | |
| | | NO(0, "否"), |
| | | YES(1, "是"); |
| | | |
| | | @Getter |
| | | private String desc; |
| | | |
| | | |
| | | @Getter |
| | | private int code; |
| | | |
| | | |
| | | AdvertisingStatusEnum(int code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | /** |
| | | * 通过code获取枚举 |
| | | * |
| | | * @param code |
| | | * @return |
| | | */ |
| | | public static AdvertisingStatusEnum fromCode(Integer code) { |
| | | AdvertisingStatusEnum[] resultTypes = AdvertisingStatusEnum.values(); |
| | | for (AdvertisingStatusEnum resultType : resultTypes) { |
| | | if (code.equals(resultType.getCode())) { |
| | | return resultType; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.enums.status; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * @Description |
| | | * @Author xiaochen |
| | | * @Date 2023/6/8 16:42 |
| | | */ |
| | | public enum AppUserStatusEnum { |
| | | |
| | | |
| | | NORMAL(1, "正常"), |
| | | FREEZE(2, "冻结"), |
| | | LOGOFF(3, "注销"); |
| | | |
| | | @Getter |
| | | private String desc; |
| | | |
| | | |
| | | @Getter |
| | | private int code; |
| | | |
| | | |
| | | AppUserStatusEnum(int code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | /** |
| | | * 通过code获取枚举 |
| | | * |
| | | * @param code |
| | | * @return |
| | | */ |
| | | public static AppUserStatusEnum fromCode(Integer code) { |
| | | AppUserStatusEnum[] resultTypes = AppUserStatusEnum.values(); |
| | | for (AppUserStatusEnum resultType : resultTypes) { |
| | | if (code.equals(resultType.getCode())) { |
| | | return resultType; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.enums.status; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * @Description |
| | | * @Author xiaochen |
| | | * @Date 2023/6/8 16:42 |
| | | */ |
| | | public enum ChargingGunModeEnum { |
| | | |
| | | |
| | | SUPER_SUFFICIENT(1, "超级快充"), |
| | | FAST_SUFFICIENT(2, "快充"), |
| | | SLOW_SUFFICIENT(3, "慢充"); |
| | | |
| | | @Getter |
| | | private String desc; |
| | | |
| | | |
| | | @Getter |
| | | private int code; |
| | | |
| | | |
| | | ChargingGunModeEnum(int code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | /** |
| | | * 通过code获取枚举 |
| | | * |
| | | * @param code |
| | | * @return |
| | | */ |
| | | public static ChargingGunModeEnum fromCode(Integer code) { |
| | | ChargingGunModeEnum[] resultTypes = ChargingGunModeEnum.values(); |
| | | for (ChargingGunModeEnum resultType : resultTypes) { |
| | | if (code.equals(resultType.getCode())) { |
| | | return resultType; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.enums.status; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * @Description |
| | | * @Author xiaochen |
| | | * @Date 2023/6/8 16:42 |
| | | */ |
| | | public enum ChargingGunStatusEnum { |
| | | |
| | | |
| | | OFFLINE(1, "离线"), |
| | | IDLE(2, "空闲"), |
| | | OCCUPATION_UNCHARGED(3, "占用(未充电)"), |
| | | OCCUPATION_CHARGING(4, "占用(充电中)"), |
| | | OCCUPATION_FULL(5, "占用(已充满)"), |
| | | OCCUPATION_LOCK(6, "占用(预约锁定)"), |
| | | FAULT(7, "故障"); |
| | | |
| | | @Getter |
| | | private String desc; |
| | | |
| | | |
| | | @Getter |
| | | private int code; |
| | | |
| | | |
| | | ChargingGunStatusEnum(int code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | /** |
| | | * 通过code获取枚举 |
| | | * |
| | | * @param code |
| | | * @return |
| | | */ |
| | | public static ChargingGunStatusEnum fromCode(Integer code) { |
| | | ChargingGunStatusEnum[] resultTypes = ChargingGunStatusEnum.values(); |
| | | for (ChargingGunStatusEnum resultType : resultTypes) { |
| | | if (code.equals(resultType.getCode())) { |
| | | return resultType; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.enums.status; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * @Description |
| | | * @Author xiaochen |
| | | * @Date 2023/6/8 16:42 |
| | | */ |
| | | public enum SiteStatusEnum { |
| | | |
| | | |
| | | NORMAL_USE(1, "正常使用"), |
| | | IN_MAINTENANCE(2, "维修中"), |
| | | CLOSE_OFFLINE(3, "关闭下线"); |
| | | |
| | | @Getter |
| | | private String desc; |
| | | |
| | | |
| | | @Getter |
| | | private int code; |
| | | |
| | | |
| | | SiteStatusEnum(int code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | /** |
| | | * 通过code获取枚举 |
| | | * |
| | | * @param code |
| | | * @return |
| | | */ |
| | | public static SiteStatusEnum fromCode(Integer code) { |
| | | SiteStatusEnum[] resultTypes = SiteStatusEnum.values(); |
| | | for (SiteStatusEnum resultType : resultTypes) { |
| | | if (code.equals(resultType.getCode())) { |
| | | return resultType; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.exception; |
| | | |
| | | /** |
| | | * 验证码错误异常类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class CaptchaException extends RuntimeException |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | public CaptchaException(String msg) |
| | | { |
| | | super(msg); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.exception; |
| | | |
| | | /** |
| | | * 检查异常 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class CheckedException extends RuntimeException |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | public CheckedException(String message) |
| | | { |
| | | super(message); |
| | | } |
| | | |
| | | public CheckedException(Throwable cause) |
| | | { |
| | | super(cause); |
| | | } |
| | | |
| | | public CheckedException(String message, Throwable cause) |
| | | { |
| | | super(message, cause); |
| | | } |
| | | |
| | | public CheckedException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) |
| | | { |
| | | super(message, cause, enableSuppression, writableStackTrace); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.exception; |
| | | |
| | | /** |
| | | * 演示模式异常 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class DemoModeException extends RuntimeException |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | public DemoModeException() |
| | | { |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.exception; |
| | | |
| | | /** |
| | | * 全局异常 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class GlobalException extends RuntimeException |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * 错误提示 |
| | | */ |
| | | private String message; |
| | | |
| | | /** |
| | | * 错误明细,内部调试错误 |
| | | * |
| | | * 和 {@link CommonResult#getDetailMessage()} 一致的设计 |
| | | */ |
| | | private String detailMessage; |
| | | |
| | | /** |
| | | * 空构造方法,避免反序列化问题 |
| | | */ |
| | | public GlobalException() |
| | | { |
| | | } |
| | | |
| | | public GlobalException(String message) |
| | | { |
| | | this.message = message; |
| | | } |
| | | |
| | | public String getDetailMessage() |
| | | { |
| | | return detailMessage; |
| | | } |
| | | |
| | | public GlobalException setDetailMessage(String detailMessage) |
| | | { |
| | | this.detailMessage = detailMessage; |
| | | return this; |
| | | } |
| | | |
| | | @Override |
| | | public String getMessage() |
| | | { |
| | | return message; |
| | | } |
| | | |
| | | public GlobalException setMessage(String message) |
| | | { |
| | | this.message = message; |
| | | return this; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.exception; |
| | | |
| | | /** |
| | | * 内部认证异常 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class InnerAuthException extends RuntimeException |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | public InnerAuthException(String message) |
| | | { |
| | | super(message); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.exception; |
| | | |
| | | /** |
| | | * 权限异常 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class PreAuthorizeException extends RuntimeException |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | public PreAuthorizeException() |
| | | { |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.exception; |
| | | |
| | | /** |
| | | * 业务异常 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public final class ServiceException extends RuntimeException |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * 错误码 |
| | | */ |
| | | private Integer code; |
| | | |
| | | /** |
| | | * 错误提示 |
| | | */ |
| | | private String message; |
| | | |
| | | /** |
| | | * 错误明细,内部调试错误 |
| | | * |
| | | * 和 {@link CommonResult#getDetailMessage()} 一致的设计 |
| | | */ |
| | | private String detailMessage; |
| | | |
| | | /** |
| | | * 空构造方法,避免反序列化问题 |
| | | */ |
| | | public ServiceException() |
| | | { |
| | | } |
| | | |
| | | public ServiceException(String message) |
| | | { |
| | | this.message = message; |
| | | } |
| | | |
| | | public ServiceException(String message, Integer code) |
| | | { |
| | | this.message = message; |
| | | this.code = code; |
| | | } |
| | | |
| | | public String getDetailMessage() |
| | | { |
| | | return detailMessage; |
| | | } |
| | | |
| | | @Override |
| | | public String getMessage() |
| | | { |
| | | return message; |
| | | } |
| | | |
| | | public Integer getCode() |
| | | { |
| | | return code; |
| | | } |
| | | |
| | | public ServiceException setMessage(String message) |
| | | { |
| | | this.message = message; |
| | | return this; |
| | | } |
| | | |
| | | public ServiceException setDetailMessage(String detailMessage) |
| | | { |
| | | this.detailMessage = detailMessage; |
| | | return this; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.exception; |
| | | |
| | | /** |
| | | * 工具类异常 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class UtilException extends RuntimeException |
| | | { |
| | | private static final long serialVersionUID = 8247610319171014183L; |
| | | |
| | | public UtilException(Throwable e) |
| | | { |
| | | super(e.getMessage(), e); |
| | | } |
| | | |
| | | public UtilException(String message) |
| | | { |
| | | super(message); |
| | | } |
| | | |
| | | public UtilException(String message, Throwable throwable) |
| | | { |
| | | super(message, throwable); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.exception.auth; |
| | | |
| | | /** |
| | | * 未能通过的登录认证异常 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class NotLoginException extends RuntimeException |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | public NotLoginException(String message) |
| | | { |
| | | super(message); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.exception.auth; |
| | | |
| | | import org.apache.commons.lang3.StringUtils; |
| | | |
| | | /** |
| | | * 未能通过的权限认证异常 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class NotPermissionException extends RuntimeException |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | public NotPermissionException(String permission) |
| | | { |
| | | super(permission); |
| | | } |
| | | |
| | | public NotPermissionException(String[] permissions) |
| | | { |
| | | super(StringUtils.join(permissions, ",")); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.exception.auth; |
| | | |
| | | import org.apache.commons.lang3.StringUtils; |
| | | |
| | | /** |
| | | * 未能通过的角色认证异常 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class NotRoleException extends RuntimeException |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | public NotRoleException(String role) |
| | | { |
| | | super(role); |
| | | } |
| | | |
| | | public NotRoleException(String[] roles) |
| | | { |
| | | super(StringUtils.join(roles, ",")); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.exception.base; |
| | | |
| | | /** |
| | | * 基础异常 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class BaseException extends RuntimeException |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * 所属模块 |
| | | */ |
| | | private String module; |
| | | |
| | | /** |
| | | * 错误码 |
| | | */ |
| | | private String code; |
| | | |
| | | /** |
| | | * 错误码对应的参数 |
| | | */ |
| | | private Object[] args; |
| | | |
| | | /** |
| | | * 错误消息 |
| | | */ |
| | | private String defaultMessage; |
| | | |
| | | public BaseException(String module, String code, Object[] args, String defaultMessage) |
| | | { |
| | | this.module = module; |
| | | this.code = code; |
| | | this.args = args; |
| | | this.defaultMessage = defaultMessage; |
| | | } |
| | | |
| | | public BaseException(String module, String code, Object[] args) |
| | | { |
| | | this(module, code, args, null); |
| | | } |
| | | |
| | | public BaseException(String module, String defaultMessage) |
| | | { |
| | | this(module, null, null, defaultMessage); |
| | | } |
| | | |
| | | public BaseException(String code, Object[] args) |
| | | { |
| | | this(null, code, args, null); |
| | | } |
| | | |
| | | public BaseException(String defaultMessage) |
| | | { |
| | | this(null, null, null, defaultMessage); |
| | | } |
| | | |
| | | public String getModule() |
| | | { |
| | | return module; |
| | | } |
| | | |
| | | public String getCode() |
| | | { |
| | | return code; |
| | | } |
| | | |
| | | public Object[] getArgs() |
| | | { |
| | | return args; |
| | | } |
| | | |
| | | public String getDefaultMessage() |
| | | { |
| | | return defaultMessage; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.exception.file; |
| | | |
| | | import com.ruoyi.common.core.exception.base.BaseException; |
| | | |
| | | /** |
| | | * 文件信息异常类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class FileException extends BaseException |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | public FileException(String code, Object[] args, String msg) |
| | | { |
| | | super("file", code, args, msg); |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.exception.file; |
| | | |
| | | /** |
| | | * 文件名称超长限制异常类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class FileNameLengthLimitExceededException extends FileException |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | public FileNameLengthLimitExceededException(int defaultFileNameLength) |
| | | { |
| | | super("upload.filename.exceed.length", new Object[] { defaultFileNameLength }, "the filename is too long"); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.exception.file; |
| | | |
| | | /** |
| | | * 文件名大小限制异常类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class FileSizeLimitExceededException extends FileException |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | public FileSizeLimitExceededException(long defaultMaxSize) |
| | | { |
| | | super("upload.exceed.maxSize", new Object[] { defaultMaxSize }, "the filesize is too large"); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.exception.file; |
| | | |
| | | import java.io.PrintStream; |
| | | import java.io.PrintWriter; |
| | | |
| | | /** |
| | | * 文件上传异常类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class FileUploadException extends Exception |
| | | { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | private final Throwable cause; |
| | | |
| | | public FileUploadException() |
| | | { |
| | | this(null, null); |
| | | } |
| | | |
| | | public FileUploadException(final String msg) |
| | | { |
| | | this(msg, null); |
| | | } |
| | | |
| | | public FileUploadException(String msg, Throwable cause) |
| | | { |
| | | super(msg); |
| | | this.cause = cause; |
| | | } |
| | | |
| | | @Override |
| | | public void printStackTrace(PrintStream stream) |
| | | { |
| | | super.printStackTrace(stream); |
| | | if (cause != null) |
| | | { |
| | | stream.println("Caused by:"); |
| | | cause.printStackTrace(stream); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void printStackTrace(PrintWriter writer) |
| | | { |
| | | super.printStackTrace(writer); |
| | | if (cause != null) |
| | | { |
| | | writer.println("Caused by:"); |
| | | cause.printStackTrace(writer); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public Throwable getCause() |
| | | { |
| | | return cause; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.exception.file; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * 文件上传 误异常类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class InvalidExtensionException extends FileUploadException |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | private String[] allowedExtension; |
| | | private String extension; |
| | | private String filename; |
| | | |
| | | public InvalidExtensionException(String[] allowedExtension, String extension, String filename) |
| | | { |
| | | super("filename : [" + filename + "], extension : [" + extension + "], allowed extension : [" + Arrays.toString(allowedExtension) + "]"); |
| | | this.allowedExtension = allowedExtension; |
| | | this.extension = extension; |
| | | this.filename = filename; |
| | | } |
| | | |
| | | public String[] getAllowedExtension() |
| | | { |
| | | return allowedExtension; |
| | | } |
| | | |
| | | public String getExtension() |
| | | { |
| | | return extension; |
| | | } |
| | | |
| | | public String getFilename() |
| | | { |
| | | return filename; |
| | | } |
| | | |
| | | public static class InvalidImageExtensionException extends InvalidExtensionException |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | public InvalidImageExtensionException(String[] allowedExtension, String extension, String filename) |
| | | { |
| | | super(allowedExtension, extension, filename); |
| | | } |
| | | } |
| | | |
| | | public static class InvalidFlashExtensionException extends InvalidExtensionException |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | public InvalidFlashExtensionException(String[] allowedExtension, String extension, String filename) |
| | | { |
| | | super(allowedExtension, extension, filename); |
| | | } |
| | | } |
| | | |
| | | public static class InvalidMediaExtensionException extends InvalidExtensionException |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | public InvalidMediaExtensionException(String[] allowedExtension, String extension, String filename) |
| | | { |
| | | super(allowedExtension, extension, filename); |
| | | } |
| | | } |
| | | |
| | | public static class InvalidVideoExtensionException extends InvalidExtensionException |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | public InvalidVideoExtensionException(String[] allowedExtension, String extension, String filename) |
| | | { |
| | | super(allowedExtension, extension, filename); |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.exception.job; |
| | | |
| | | /** |
| | | * 计划策略异常 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class TaskException extends Exception |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | private Code code; |
| | | |
| | | public TaskException(String msg, Code code) |
| | | { |
| | | this(msg, code, null); |
| | | } |
| | | |
| | | public TaskException(String msg, Code code, Exception nestedEx) |
| | | { |
| | | super(msg, nestedEx); |
| | | this.code = code; |
| | | } |
| | | |
| | | public Code getCode() |
| | | { |
| | | return code; |
| | | } |
| | | |
| | | public enum Code |
| | | { |
| | | TASK_EXISTS, NO_TASK_EXISTS, TASK_ALREADY_STARTED, UNKNOWN, CONFIG_ERROR, TASK_NODE_NOT_AVAILABLE |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.exception.user; |
| | | |
| | | /** |
| | | * 验证码失效异常类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class CaptchaExpireException extends UserException |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | public CaptchaExpireException() |
| | | { |
| | | super("user.jcaptcha.expire", null); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.exception.user; |
| | | |
| | | /** |
| | | * 学生端登录异常信息 |
| | | * |
| | | * @author HJL |
| | | * @version 1.0 |
| | | * @since 2024-05-24 11:35 |
| | | */ |
| | | public class UserAppletException extends RuntimeException { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * 错误提示 |
| | | */ |
| | | private String message; |
| | | |
| | | /** |
| | | * 错误码 |
| | | */ |
| | | private int code; |
| | | |
| | | public UserAppletException() { |
| | | } |
| | | |
| | | public UserAppletException(String message, Integer code) { |
| | | this.message = message; |
| | | this.code = code; |
| | | } |
| | | |
| | | @Override |
| | | public String getMessage() { |
| | | return message; |
| | | } |
| | | |
| | | public void setMessage(String message) { |
| | | this.message = message; |
| | | } |
| | | |
| | | public int getCode() { |
| | | return code; |
| | | } |
| | | |
| | | public void setCode(int code) { |
| | | this.code = code; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.exception.user; |
| | | |
| | | import com.ruoyi.common.core.exception.base.BaseException; |
| | | |
| | | /** |
| | | * 用户信息异常类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class UserException extends BaseException |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | public UserException(String code, Object[] args) |
| | | { |
| | | super("user", code, args, null); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.exception.user; |
| | | |
| | | /** |
| | | * 用户密码不正确或不符合规范异常类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class UserPasswordNotMatchException extends UserException |
| | | { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | public UserPasswordNotMatchException() |
| | | { |
| | | super("user.password.not.match", null); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.query; |
| | | |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.ruoyi.common.core.web.page.BasePage; |
| | | import com.ruoyi.common.core.web.page.TableDataInfo; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.Date; |
| | | import java.util.Objects; |
| | | |
| | | /** |
| | | * @author xiaochen |
| | | * @ClassName TimeRangePageDTO |
| | | * @Description |
| | | * @date 2023-06-4 14:42 |
| | | */ |
| | | @ApiModel("时间范围分页dto") |
| | | public class TimeRangePageQuery extends BasePage { |
| | | @ApiModelProperty("开始时间 格式 yyyy-MM-dd") |
| | | @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") |
| | | private Date startTime; |
| | | |
| | | @ApiModelProperty("结束时间 格式 yyyy-MM-dd") |
| | | @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") |
| | | private Date endTime; |
| | | |
| | | public String getStartTime() { |
| | | if (Objects.nonNull(startTime)) { |
| | | return new SimpleDateFormat("yyyy-MM-dd").format(startTime) + " 00:00:00"; |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | public void setStartTime(Date startTime) { |
| | | this.startTime = startTime; |
| | | } |
| | | |
| | | public String getEndTime() { |
| | | if (Objects.nonNull(endTime)) { |
| | | return new SimpleDateFormat("yyyy-MM-dd").format(endTime) + " 23:59:59"; |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | public void setEndTime(Date endTime) { |
| | | this.endTime = endTime; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.text; |
| | | |
| | | import java.nio.charset.Charset; |
| | | import java.nio.charset.StandardCharsets; |
| | | import com.ruoyi.common.core.utils.StringUtils; |
| | | |
| | | /** |
| | | * 字符集工具类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class CharsetKit |
| | | { |
| | | /** ISO-8859-1 */ |
| | | public static final String ISO_8859_1 = "ISO-8859-1"; |
| | | /** UTF-8 */ |
| | | public static final String UTF_8 = "UTF-8"; |
| | | /** GBK */ |
| | | public static final String GBK = "GBK"; |
| | | |
| | | /** ISO-8859-1 */ |
| | | public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1); |
| | | /** UTF-8 */ |
| | | public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8); |
| | | /** GBK */ |
| | | public static final Charset CHARSET_GBK = Charset.forName(GBK); |
| | | |
| | | /** |
| | | * 转换为Charset对象 |
| | | * |
| | | * @param charset 字符集,为空则返回默认字符集 |
| | | * @return Charset |
| | | */ |
| | | public static Charset charset(String charset) |
| | | { |
| | | return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset); |
| | | } |
| | | |
| | | /** |
| | | * 转换字符串的字符集编码 |
| | | * |
| | | * @param source 字符串 |
| | | * @param srcCharset 源字符集,默认ISO-8859-1 |
| | | * @param destCharset 目标字符集,默认UTF-8 |
| | | * @return 转换后的字符集 |
| | | */ |
| | | public static String convert(String source, String srcCharset, String destCharset) |
| | | { |
| | | return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset)); |
| | | } |
| | | |
| | | /** |
| | | * 转换字符串的字符集编码 |
| | | * |
| | | * @param source 字符串 |
| | | * @param srcCharset 源字符集,默认ISO-8859-1 |
| | | * @param destCharset 目标字符集,默认UTF-8 |
| | | * @return 转换后的字符集 |
| | | */ |
| | | public static String convert(String source, Charset srcCharset, Charset destCharset) |
| | | { |
| | | if (null == srcCharset) |
| | | { |
| | | srcCharset = StandardCharsets.ISO_8859_1; |
| | | } |
| | | |
| | | if (null == destCharset) |
| | | { |
| | | destCharset = StandardCharsets.UTF_8; |
| | | } |
| | | |
| | | if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) |
| | | { |
| | | return source; |
| | | } |
| | | return new String(source.getBytes(srcCharset), destCharset); |
| | | } |
| | | |
| | | /** |
| | | * @return 系统字符集编码 |
| | | */ |
| | | public static String systemCharset() |
| | | { |
| | | return Charset.defaultCharset().name(); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.text; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.math.BigInteger; |
| | | import java.nio.ByteBuffer; |
| | | import java.nio.charset.Charset; |
| | | import java.text.NumberFormat; |
| | | import java.util.Set; |
| | | import com.ruoyi.common.core.utils.StringUtils; |
| | | |
| | | /** |
| | | * 类型转换器 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class Convert |
| | | { |
| | | /** |
| | | * 转换为字符串<br> |
| | | * 如果给定的值为null,或者转换失败,返回默认值<br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @param defaultValue 转换错误时的默认值 |
| | | * @return 结果 |
| | | */ |
| | | public static String toStr(Object value, String defaultValue) |
| | | { |
| | | if (null == value) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | if (value instanceof String) |
| | | { |
| | | return (String) value; |
| | | } |
| | | return value.toString(); |
| | | } |
| | | |
| | | /** |
| | | * 转换为字符串<br> |
| | | * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @return 结果 |
| | | */ |
| | | public static String toStr(Object value) |
| | | { |
| | | return toStr(value, null); |
| | | } |
| | | |
| | | /** |
| | | * 转换为字符<br> |
| | | * 如果给定的值为null,或者转换失败,返回默认值<br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @param defaultValue 转换错误时的默认值 |
| | | * @return 结果 |
| | | */ |
| | | public static Character toChar(Object value, Character defaultValue) |
| | | { |
| | | if (null == value) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | if (value instanceof Character) |
| | | { |
| | | return (Character) value; |
| | | } |
| | | |
| | | final String valueStr = toStr(value, null); |
| | | return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0); |
| | | } |
| | | |
| | | /** |
| | | * 转换为字符<br> |
| | | * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @return 结果 |
| | | */ |
| | | public static Character toChar(Object value) |
| | | { |
| | | return toChar(value, null); |
| | | } |
| | | |
| | | /** |
| | | * 转换为byte<br> |
| | | * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @param defaultValue 转换错误时的默认值 |
| | | * @return 结果 |
| | | */ |
| | | public static Byte toByte(Object value, Byte defaultValue) |
| | | { |
| | | if (value == null) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | if (value instanceof Byte) |
| | | { |
| | | return (Byte) value; |
| | | } |
| | | if (value instanceof Number) |
| | | { |
| | | return ((Number) value).byteValue(); |
| | | } |
| | | final String valueStr = toStr(value, null); |
| | | if (StringUtils.isEmpty(valueStr)) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | try |
| | | { |
| | | return Byte.parseByte(valueStr); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 转换为byte<br> |
| | | * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @return 结果 |
| | | */ |
| | | public static Byte toByte(Object value) |
| | | { |
| | | return toByte(value, null); |
| | | } |
| | | |
| | | /** |
| | | * 转换为Short<br> |
| | | * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @param defaultValue 转换错误时的默认值 |
| | | * @return 结果 |
| | | */ |
| | | public static Short toShort(Object value, Short defaultValue) |
| | | { |
| | | if (value == null) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | if (value instanceof Short) |
| | | { |
| | | return (Short) value; |
| | | } |
| | | if (value instanceof Number) |
| | | { |
| | | return ((Number) value).shortValue(); |
| | | } |
| | | final String valueStr = toStr(value, null); |
| | | if (StringUtils.isEmpty(valueStr)) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | try |
| | | { |
| | | return Short.parseShort(valueStr.trim()); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 转换为Short<br> |
| | | * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @return 结果 |
| | | */ |
| | | public static Short toShort(Object value) |
| | | { |
| | | return toShort(value, null); |
| | | } |
| | | |
| | | /** |
| | | * 转换为Number<br> |
| | | * 如果给定的值为空,或者转换失败,返回默认值<br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @param defaultValue 转换错误时的默认值 |
| | | * @return 结果 |
| | | */ |
| | | public static Number toNumber(Object value, Number defaultValue) |
| | | { |
| | | if (value == null) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | if (value instanceof Number) |
| | | { |
| | | return (Number) value; |
| | | } |
| | | final String valueStr = toStr(value, null); |
| | | if (StringUtils.isEmpty(valueStr)) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | try |
| | | { |
| | | return NumberFormat.getInstance().parse(valueStr); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 转换为Number<br> |
| | | * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @return 结果 |
| | | */ |
| | | public static Number toNumber(Object value) |
| | | { |
| | | return toNumber(value, null); |
| | | } |
| | | |
| | | /** |
| | | * 转换为int<br> |
| | | * 如果给定的值为空,或者转换失败,返回默认值<br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @param defaultValue 转换错误时的默认值 |
| | | * @return 结果 |
| | | */ |
| | | public static Integer toInt(Object value, Integer defaultValue) |
| | | { |
| | | if (value == null) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | if (value instanceof Integer) |
| | | { |
| | | return (Integer) value; |
| | | } |
| | | if (value instanceof Number) |
| | | { |
| | | return ((Number) value).intValue(); |
| | | } |
| | | final String valueStr = toStr(value, null); |
| | | if (StringUtils.isEmpty(valueStr)) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | try |
| | | { |
| | | return Integer.parseInt(valueStr.trim()); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 转换为int<br> |
| | | * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @return 结果 |
| | | */ |
| | | public static Integer toInt(Object value) |
| | | { |
| | | return toInt(value, null); |
| | | } |
| | | |
| | | /** |
| | | * 转换为Integer数组<br> |
| | | * |
| | | * @param str 被转换的值 |
| | | * @return 结果 |
| | | */ |
| | | public static Integer[] toIntArray(String str) |
| | | { |
| | | return toIntArray(",", str); |
| | | } |
| | | |
| | | /** |
| | | * 转换为Long数组<br> |
| | | * |
| | | * @param str 被转换的值 |
| | | * @return 结果 |
| | | */ |
| | | public static Long[] toLongArray(String str) |
| | | { |
| | | return toLongArray(",", str); |
| | | } |
| | | |
| | | /** |
| | | * 转换为Integer数组<br> |
| | | * |
| | | * @param split 分隔符 |
| | | * @param str 被转换的值 |
| | | * @return 结果 |
| | | */ |
| | | public static Integer[] toIntArray(String split, String str) |
| | | { |
| | | if (StringUtils.isEmpty(str)) |
| | | { |
| | | return new Integer[] {}; |
| | | } |
| | | String[] arr = str.split(split); |
| | | final Integer[] ints = new Integer[arr.length]; |
| | | for (int i = 0; i < arr.length; i++) |
| | | { |
| | | final Integer v = toInt(arr[i], 0); |
| | | ints[i] = v; |
| | | } |
| | | return ints; |
| | | } |
| | | |
| | | /** |
| | | * 转换为Long数组<br> |
| | | * |
| | | * @param split 分隔符 |
| | | * @param str 被转换的值 |
| | | * @return 结果 |
| | | */ |
| | | public static Long[] toLongArray(String split, String str) |
| | | { |
| | | if (StringUtils.isEmpty(str)) |
| | | { |
| | | return new Long[] {}; |
| | | } |
| | | String[] arr = str.split(split); |
| | | final Long[] longs = new Long[arr.length]; |
| | | for (int i = 0; i < arr.length; i++) |
| | | { |
| | | final Long v = toLong(arr[i], null); |
| | | longs[i] = v; |
| | | } |
| | | return longs; |
| | | } |
| | | |
| | | /** |
| | | * 转换为String数组<br> |
| | | * |
| | | * @param str 被转换的值 |
| | | * @return 结果 |
| | | */ |
| | | public static String[] toStrArray(String str) |
| | | { |
| | | return toStrArray(",", str); |
| | | } |
| | | |
| | | /** |
| | | * 转换为String数组<br> |
| | | * |
| | | * @param split 分隔符 |
| | | * @param str 被转换的值 |
| | | * @return 结果 |
| | | */ |
| | | public static String[] toStrArray(String split, String str) |
| | | { |
| | | return str.split(split); |
| | | } |
| | | |
| | | /** |
| | | * 转换为long<br> |
| | | * 如果给定的值为空,或者转换失败,返回默认值<br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @param defaultValue 转换错误时的默认值 |
| | | * @return 结果 |
| | | */ |
| | | public static Long toLong(Object value, Long defaultValue) |
| | | { |
| | | if (value == null) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | if (value instanceof Long) |
| | | { |
| | | return (Long) value; |
| | | } |
| | | if (value instanceof Number) |
| | | { |
| | | return ((Number) value).longValue(); |
| | | } |
| | | final String valueStr = toStr(value, null); |
| | | if (StringUtils.isEmpty(valueStr)) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | try |
| | | { |
| | | // 支持科学计数法 |
| | | return new BigDecimal(valueStr.trim()).longValue(); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 转换为long<br> |
| | | * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @return 结果 |
| | | */ |
| | | public static Long toLong(Object value) |
| | | { |
| | | return toLong(value, null); |
| | | } |
| | | |
| | | /** |
| | | * 转换为double<br> |
| | | * 如果给定的值为空,或者转换失败,返回默认值<br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @param defaultValue 转换错误时的默认值 |
| | | * @return 结果 |
| | | */ |
| | | public static Double toDouble(Object value, Double defaultValue) |
| | | { |
| | | if (value == null) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | if (value instanceof Double) |
| | | { |
| | | return (Double) value; |
| | | } |
| | | if (value instanceof Number) |
| | | { |
| | | return ((Number) value).doubleValue(); |
| | | } |
| | | final String valueStr = toStr(value, null); |
| | | if (StringUtils.isEmpty(valueStr)) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | try |
| | | { |
| | | // 支持科学计数法 |
| | | return new BigDecimal(valueStr.trim()).doubleValue(); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 转换为double<br> |
| | | * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @return 结果 |
| | | */ |
| | | public static Double toDouble(Object value) |
| | | { |
| | | return toDouble(value, null); |
| | | } |
| | | |
| | | /** |
| | | * 转换为Float<br> |
| | | * 如果给定的值为空,或者转换失败,返回默认值<br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @param defaultValue 转换错误时的默认值 |
| | | * @return 结果 |
| | | */ |
| | | public static Float toFloat(Object value, Float defaultValue) |
| | | { |
| | | if (value == null) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | if (value instanceof Float) |
| | | { |
| | | return (Float) value; |
| | | } |
| | | if (value instanceof Number) |
| | | { |
| | | return ((Number) value).floatValue(); |
| | | } |
| | | final String valueStr = toStr(value, null); |
| | | if (StringUtils.isEmpty(valueStr)) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | try |
| | | { |
| | | return Float.parseFloat(valueStr.trim()); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 转换为Float<br> |
| | | * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @return 结果 |
| | | */ |
| | | public static Float toFloat(Object value) |
| | | { |
| | | return toFloat(value, null); |
| | | } |
| | | |
| | | /** |
| | | * 转换为boolean<br> |
| | | * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值<br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @param defaultValue 转换错误时的默认值 |
| | | * @return 结果 |
| | | */ |
| | | public static Boolean toBool(Object value, Boolean defaultValue) |
| | | { |
| | | if (value == null) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | if (value instanceof Boolean) |
| | | { |
| | | return (Boolean) value; |
| | | } |
| | | String valueStr = toStr(value, null); |
| | | if (StringUtils.isEmpty(valueStr)) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | valueStr = valueStr.trim().toLowerCase(); |
| | | switch (valueStr) |
| | | { |
| | | case "true": |
| | | case "yes": |
| | | case "ok": |
| | | case "1": |
| | | return true; |
| | | case "false": |
| | | case "no": |
| | | case "0": |
| | | return false; |
| | | default: |
| | | return defaultValue; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 转换为boolean<br> |
| | | * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @return 结果 |
| | | */ |
| | | public static Boolean toBool(Object value) |
| | | { |
| | | return toBool(value, null); |
| | | } |
| | | |
| | | /** |
| | | * 转换为Enum对象<br> |
| | | * 如果给定的值为空,或者转换失败,返回默认值<br> |
| | | * |
| | | * @param clazz Enum的Class |
| | | * @param value 值 |
| | | * @param defaultValue 默认值 |
| | | * @return Enum |
| | | */ |
| | | public static <E extends Enum<E>> E toEnum(Class<E> clazz, Object value, E defaultValue) |
| | | { |
| | | if (value == null) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | if (clazz.isAssignableFrom(value.getClass())) |
| | | { |
| | | @SuppressWarnings("unchecked") |
| | | E myE = (E) value; |
| | | return myE; |
| | | } |
| | | final String valueStr = toStr(value, null); |
| | | if (StringUtils.isEmpty(valueStr)) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | try |
| | | { |
| | | return Enum.valueOf(clazz, valueStr); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 转换为Enum对象<br> |
| | | * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br> |
| | | * |
| | | * @param clazz Enum的Class |
| | | * @param value 值 |
| | | * @return Enum |
| | | */ |
| | | public static <E extends Enum<E>> E toEnum(Class<E> clazz, Object value) |
| | | { |
| | | return toEnum(clazz, value, null); |
| | | } |
| | | |
| | | /** |
| | | * 转换为BigInteger<br> |
| | | * 如果给定的值为空,或者转换失败,返回默认值<br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @param defaultValue 转换错误时的默认值 |
| | | * @return 结果 |
| | | */ |
| | | public static BigInteger toBigInteger(Object value, BigInteger defaultValue) |
| | | { |
| | | if (value == null) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | if (value instanceof BigInteger) |
| | | { |
| | | return (BigInteger) value; |
| | | } |
| | | if (value instanceof Long) |
| | | { |
| | | return BigInteger.valueOf((Long) value); |
| | | } |
| | | final String valueStr = toStr(value, null); |
| | | if (StringUtils.isEmpty(valueStr)) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | try |
| | | { |
| | | return new BigInteger(valueStr); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 转换为BigInteger<br> |
| | | * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @return 结果 |
| | | */ |
| | | public static BigInteger toBigInteger(Object value) |
| | | { |
| | | return toBigInteger(value, null); |
| | | } |
| | | |
| | | /** |
| | | * 转换为BigDecimal<br> |
| | | * 如果给定的值为空,或者转换失败,返回默认值<br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @param defaultValue 转换错误时的默认值 |
| | | * @return 结果 |
| | | */ |
| | | public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) |
| | | { |
| | | if (value == null) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | if (value instanceof BigDecimal) |
| | | { |
| | | return (BigDecimal) value; |
| | | } |
| | | if (value instanceof Long) |
| | | { |
| | | return new BigDecimal((Long) value); |
| | | } |
| | | if (value instanceof Double) |
| | | { |
| | | return BigDecimal.valueOf((Double) value); |
| | | } |
| | | if (value instanceof Integer) |
| | | { |
| | | return new BigDecimal((Integer) value); |
| | | } |
| | | final String valueStr = toStr(value, null); |
| | | if (StringUtils.isEmpty(valueStr)) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | try |
| | | { |
| | | return new BigDecimal(valueStr); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 转换为BigDecimal<br> |
| | | * 如果给定的值为空,或者转换失败,返回默认值<br> |
| | | * 转换失败不会报错 |
| | | * |
| | | * @param value 被转换的值 |
| | | * @return 结果 |
| | | */ |
| | | public static BigDecimal toBigDecimal(Object value) |
| | | { |
| | | return toBigDecimal(value, null); |
| | | } |
| | | |
| | | /** |
| | | * 将对象转为字符串<br> |
| | | * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 |
| | | * |
| | | * @param obj 对象 |
| | | * @return 字符串 |
| | | */ |
| | | public static String utf8Str(Object obj) |
| | | { |
| | | return str(obj, CharsetKit.CHARSET_UTF_8); |
| | | } |
| | | |
| | | /** |
| | | * 将对象转为字符串<br> |
| | | * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 |
| | | * |
| | | * @param obj 对象 |
| | | * @param charsetName 字符集 |
| | | * @return 字符串 |
| | | */ |
| | | public static String str(Object obj, String charsetName) |
| | | { |
| | | return str(obj, Charset.forName(charsetName)); |
| | | } |
| | | |
| | | /** |
| | | * 将对象转为字符串<br> |
| | | * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 |
| | | * |
| | | * @param obj 对象 |
| | | * @param charset 字符集 |
| | | * @return 字符串 |
| | | */ |
| | | public static String str(Object obj, Charset charset) |
| | | { |
| | | if (null == obj) |
| | | { |
| | | return null; |
| | | } |
| | | |
| | | if (obj instanceof String) |
| | | { |
| | | return (String) obj; |
| | | } |
| | | else if (obj instanceof byte[] || obj instanceof Byte[]) |
| | | { |
| | | if (obj instanceof byte[]) |
| | | { |
| | | return str((byte[]) obj, charset); |
| | | } |
| | | else |
| | | { |
| | | Byte[] bytes = (Byte[]) obj; |
| | | int length = bytes.length; |
| | | byte[] dest = new byte[length]; |
| | | for (int i = 0; i < length; i++) |
| | | { |
| | | dest[i] = bytes[i]; |
| | | } |
| | | return str(dest, charset); |
| | | } |
| | | } |
| | | else if (obj instanceof ByteBuffer) |
| | | { |
| | | return str((ByteBuffer) obj, charset); |
| | | } |
| | | return obj.toString(); |
| | | } |
| | | |
| | | /** |
| | | * 将byte数组转为字符串 |
| | | * |
| | | * @param bytes byte数组 |
| | | * @param charset 字符集 |
| | | * @return 字符串 |
| | | */ |
| | | public static String str(byte[] bytes, String charset) |
| | | { |
| | | return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset)); |
| | | } |
| | | |
| | | /** |
| | | * 解码字节码 |
| | | * |
| | | * @param data 字符串 |
| | | * @param charset 字符集,如果此字段为空,则解码的结果取决于平台 |
| | | * @return 解码后的字符串 |
| | | */ |
| | | public static String str(byte[] data, Charset charset) |
| | | { |
| | | if (data == null) |
| | | { |
| | | return null; |
| | | } |
| | | |
| | | if (null == charset) |
| | | { |
| | | return new String(data); |
| | | } |
| | | return new String(data, charset); |
| | | } |
| | | |
| | | /** |
| | | * 将编码的byteBuffer数据转换为字符串 |
| | | * |
| | | * @param data 数据 |
| | | * @param charset 字符集,如果为空使用当前系统字符集 |
| | | * @return 字符串 |
| | | */ |
| | | public static String str(ByteBuffer data, String charset) |
| | | { |
| | | if (data == null) |
| | | { |
| | | return null; |
| | | } |
| | | |
| | | return str(data, Charset.forName(charset)); |
| | | } |
| | | |
| | | /** |
| | | * 将编码的byteBuffer数据转换为字符串 |
| | | * |
| | | * @param data 数据 |
| | | * @param charset 字符集,如果为空使用当前系统字符集 |
| | | * @return 字符串 |
| | | */ |
| | | public static String str(ByteBuffer data, Charset charset) |
| | | { |
| | | if (null == charset) |
| | | { |
| | | charset = Charset.defaultCharset(); |
| | | } |
| | | return charset.decode(data).toString(); |
| | | } |
| | | |
| | | // ----------------------------------------------------------------------- 全角半角转换 |
| | | /** |
| | | * 半角转全角 |
| | | * |
| | | * @param input String. |
| | | * @return 全角字符串. |
| | | */ |
| | | public static String toSBC(String input) |
| | | { |
| | | return toSBC(input, null); |
| | | } |
| | | |
| | | /** |
| | | * 半角转全角 |
| | | * |
| | | * @param input String |
| | | * @param notConvertSet 不替换的字符集合 |
| | | * @return 全角字符串. |
| | | */ |
| | | public static String toSBC(String input, Set<Character> notConvertSet) |
| | | { |
| | | char[] c = input.toCharArray(); |
| | | for (int i = 0; i < c.length; i++) |
| | | { |
| | | if (null != notConvertSet && notConvertSet.contains(c[i])) |
| | | { |
| | | // 跳过不替换的字符 |
| | | continue; |
| | | } |
| | | |
| | | if (c[i] == ' ') |
| | | { |
| | | c[i] = '\u3000'; |
| | | } |
| | | else if (c[i] < '\177') |
| | | { |
| | | c[i] = (char) (c[i] + 65248); |
| | | |
| | | } |
| | | } |
| | | return new String(c); |
| | | } |
| | | |
| | | /** |
| | | * 全角转半角 |
| | | * |
| | | * @param input String. |
| | | * @return 半角字符串 |
| | | */ |
| | | public static String toDBC(String input) |
| | | { |
| | | return toDBC(input, null); |
| | | } |
| | | |
| | | /** |
| | | * 替换全角为半角 |
| | | * |
| | | * @param text 文本 |
| | | * @param notConvertSet 不替换的字符集合 |
| | | * @return 替换后的字符 |
| | | */ |
| | | public static String toDBC(String text, Set<Character> notConvertSet) |
| | | { |
| | | char[] c = text.toCharArray(); |
| | | for (int i = 0; i < c.length; i++) |
| | | { |
| | | if (null != notConvertSet && notConvertSet.contains(c[i])) |
| | | { |
| | | // 跳过不替换的字符 |
| | | continue; |
| | | } |
| | | |
| | | if (c[i] == '\u3000') |
| | | { |
| | | c[i] = ' '; |
| | | } |
| | | else if (c[i] > '\uFF00' && c[i] < '\uFF5F') |
| | | { |
| | | c[i] = (char) (c[i] - 65248); |
| | | } |
| | | } |
| | | return new String(c); |
| | | } |
| | | |
| | | /** |
| | | * 数字金额大写转换 先写个完整的然后将如零拾替换成零 |
| | | * |
| | | * @param n 数字 |
| | | * @return 中文大写数字 |
| | | */ |
| | | public static String digitUppercase(double n) |
| | | { |
| | | String[] fraction = { "角", "分" }; |
| | | String[] digit = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; |
| | | String[][] unit = { { "元", "万", "亿" }, { "", "拾", "佰", "仟" } }; |
| | | |
| | | String head = n < 0 ? "负" : ""; |
| | | n = Math.abs(n); |
| | | |
| | | String s = ""; |
| | | for (int i = 0; i < fraction.length; i++) |
| | | { |
| | | s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", ""); |
| | | } |
| | | if (s.length() < 1) |
| | | { |
| | | s = "整"; |
| | | } |
| | | int integerPart = (int) Math.floor(n); |
| | | |
| | | for (int i = 0; i < unit[0].length && integerPart > 0; i++) |
| | | { |
| | | String p = ""; |
| | | for (int j = 0; j < unit[1].length && n > 0; j++) |
| | | { |
| | | p = digit[integerPart % 10] + unit[1][j] + p; |
| | | integerPart = integerPart / 10; |
| | | } |
| | | s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s; |
| | | } |
| | | return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整"); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.text; |
| | | |
| | | import com.ruoyi.common.core.utils.StringUtils; |
| | | |
| | | /** |
| | | * 字符串格式化 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class StrFormatter |
| | | { |
| | | public static final String EMPTY_JSON = "{}"; |
| | | public static final char C_BACKSLASH = '\\'; |
| | | public static final char C_DELIM_START = '{'; |
| | | public static final char C_DELIM_END = '}'; |
| | | |
| | | /** |
| | | * 格式化字符串<br> |
| | | * 此方法只是简单将占位符 {} 按照顺序替换为参数<br> |
| | | * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br> |
| | | * 例:<br> |
| | | * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br> |
| | | * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br> |
| | | * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br> |
| | | * |
| | | * @param strPattern 字符串模板 |
| | | * @param argArray 参数列表 |
| | | * @return 结果 |
| | | */ |
| | | public static String format(final String strPattern, final Object... argArray) |
| | | { |
| | | if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray)) |
| | | { |
| | | return strPattern; |
| | | } |
| | | final int strPatternLength = strPattern.length(); |
| | | |
| | | // 初始化定义好的长度以获得更好的性能 |
| | | StringBuilder sbuf = new StringBuilder(strPatternLength + 50); |
| | | |
| | | int handledPosition = 0; |
| | | int delimIndex;// 占位符所在位置 |
| | | for (int argIndex = 0; argIndex < argArray.length; argIndex++) |
| | | { |
| | | delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition); |
| | | if (delimIndex == -1) |
| | | { |
| | | if (handledPosition == 0) |
| | | { |
| | | return strPattern; |
| | | } |
| | | else |
| | | { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果 |
| | | sbuf.append(strPattern, handledPosition, strPatternLength); |
| | | return sbuf.toString(); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) |
| | | { |
| | | if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) |
| | | { |
| | | // 转义符之前还有一个转义符,占位符依旧有效 |
| | | sbuf.append(strPattern, handledPosition, delimIndex - 1); |
| | | sbuf.append(Convert.utf8Str(argArray[argIndex])); |
| | | handledPosition = delimIndex + 2; |
| | | } |
| | | else |
| | | { |
| | | // 占位符被转义 |
| | | argIndex--; |
| | | sbuf.append(strPattern, handledPosition, delimIndex - 1); |
| | | sbuf.append(C_DELIM_START); |
| | | handledPosition = delimIndex + 1; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | // 正常占位符 |
| | | sbuf.append(strPattern, handledPosition, delimIndex); |
| | | sbuf.append(Convert.utf8Str(argArray[argIndex])); |
| | | handledPosition = delimIndex + 2; |
| | | } |
| | | } |
| | | } |
| | | // 加入最后一个占位符后所有的字符 |
| | | sbuf.append(strPattern, handledPosition, strPattern.length()); |
| | | |
| | | return sbuf.toString(); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.Calendar; |
| | | |
| | | /** |
| | | * @Description 活动订单操作 |
| | | * @Author xiaochen |
| | | * @Date 2021/7/28 10:26 |
| | | */ |
| | | public class CodeGenerateUtils { |
| | | |
| | | /** |
| | | * @return |
| | | * @Description 获取商品编码 |
| | | * 商品编码规则:nanoTime(后5位)*5位随机数(10000~99999) |
| | | * @Author xiaochen |
| | | */ |
| | | public static String generateProductCode() { |
| | | long nanoPart = System.nanoTime() % 100000L; |
| | | if (nanoPart < 10000L) { |
| | | nanoPart += 10000L; |
| | | } |
| | | long randomPart = (long) (Math.random() * (90000) + 10000); |
| | | String code = "0" + String.valueOf((new BigDecimal(nanoPart).multiply(new BigDecimal(randomPart)))); |
| | | return code.substring(code.length() - 10); |
| | | } |
| | | |
| | | /** |
| | | * @param id: 用户id |
| | | * @return |
| | | * @Description 生成订单编号 |
| | | * 订单编号规则:(10位):(年末尾*月,取后2位)+(用户ID%3.33*日取整后2位)+(timestamp*10000以内随机数,取后6位) |
| | | * @Author xiaochen |
| | | */ |
| | | public static String generateOrderSn(long id) { |
| | | Calendar calendar = Calendar.getInstance(); |
| | | int year = calendar.get(Calendar.YEAR); |
| | | year = year % 10; |
| | | if (year == 0) year = 10; |
| | | int month = calendar.get(Calendar.MONTH) + 1; |
| | | int yearMonth = year * month; |
| | | String yearMonthPart = "0" + yearMonth; |
| | | yearMonthPart = yearMonthPart.substring(yearMonthPart.length() - 2); |
| | | |
| | | int day = calendar.get(Calendar.DAY_OF_MONTH); |
| | | int dayNum = (int) ((id % 3.33) * day); |
| | | String dayPart = "0" + dayNum; |
| | | dayPart = dayPart.substring(dayPart.length() - 2); |
| | | |
| | | String timestampPart = "" + (Math.random() * 10000) * (System.currentTimeMillis() / 10000); |
| | | timestampPart = timestampPart.replace(".", "").replace("E", ""); |
| | | timestampPart = timestampPart.substring(0, 6); |
| | | return yearMonthPart + dayPart + timestampPart; |
| | | } |
| | | |
| | | /** |
| | | * @return |
| | | * @Description 生成统一支付单号 规则:年(2)月(2)日(2)时(2)分(2)+timestamp*5位随机整数取后5位 |
| | | * @Author xiaochen |
| | | */ |
| | | public static String generateVolumeSn() { |
| | | Calendar calendar = Calendar.getInstance(); |
| | | SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddhhmmss"); |
| | | String dateTime = dateFormat.format(calendar.getTime()); |
| | | dateTime = dateTime.substring(2); |
| | | String timestampPart = "" + (Math.random() * 10000) * (System.currentTimeMillis() / 10000); |
| | | timestampPart = timestampPart.replace(".", "").replace("E", ""); |
| | | timestampPart = timestampPart.substring(0, 5); |
| | | return dateTime + timestampPart; |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | for (long i = 0; i < 20; i++) { |
| | | //String timestampPart = ""+(Math.random() * 10000) * (System.currentTimeMillis()/10000); |
| | | //System.out.println(timestampPart); |
| | | //System.out.println(generateOrderSn(i)); |
| | | long l = System.currentTimeMillis() * Long.valueOf(CodeGenerateUtils.generateProductCode().substring(0, 5)); |
| | | System.out.println(String.valueOf(l).substring(0,10)); |
| | | } |
| | | |
| | | } |
| | | |
| | | /** |
| | | * @description id补0生成编号 |
| | | * @author jqs |
| | | * @date 2024/4/17 14:19 |
| | | * @param totalLength |
| | | * @param id |
| | | * @return String |
| | | */ |
| | | public static String toFillZeroCode(int totalLength, Long id) { |
| | | String idStr = id.toString(); |
| | | int length = idStr.length(); |
| | | if(totalLength <= length){ |
| | | return idStr; |
| | | } |
| | | int fillLength = totalLength - length; |
| | | StringBuilder idsbs = new StringBuilder(); |
| | | for (int i = 0; i < fillLength; i++) { |
| | | idsbs.append("0"); |
| | | } |
| | | return idsbs.append(idStr).toString(); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils; |
| | | |
| | | import org.apache.commons.lang3.time.DateFormatUtils; |
| | | import org.apache.poi.ss.usermodel.DateUtil; |
| | | |
| | | import java.lang.management.ManagementFactory; |
| | | import java.text.ParseException; |
| | | import java.text.SimpleDateFormat; |
| | | import java.time.*; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * 时间工具类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class DateUtils extends org.apache.commons.lang3.time.DateUtils |
| | | { |
| | | private static TimeZone tz = TimeZone.getTimeZone("GMT+8"); |
| | | |
| | | public static String YYYY = "yyyy"; |
| | | |
| | | public static String YYYY_MM = "yyyy-MM"; |
| | | |
| | | public static String YYYY_MM_DD = "yyyy-MM-dd"; |
| | | |
| | | public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; |
| | | |
| | | public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; |
| | | |
| | | private static String[] parsePatterns = { |
| | | "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", |
| | | "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", |
| | | "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; |
| | | |
| | | /** |
| | | * 获取当前Date型日期 |
| | | * |
| | | * @return Date() 当前日期 |
| | | */ |
| | | public static Date getNowDate() |
| | | { |
| | | return new Date(); |
| | | } |
| | | |
| | | /** |
| | | * 获取当前日期, 默认格式为yyyy-MM-dd |
| | | * |
| | | * @return String |
| | | */ |
| | | public static String getDate() |
| | | { |
| | | return dateTimeNow(YYYY_MM_DD); |
| | | } |
| | | |
| | | public static final String getTime() |
| | | { |
| | | return dateTimeNow(YYYY_MM_DD_HH_MM_SS); |
| | | } |
| | | |
| | | public static final String dateTimeNow() |
| | | { |
| | | return dateTimeNow(YYYYMMDDHHMMSS); |
| | | } |
| | | |
| | | public static final String dateTimeNow(final String format) |
| | | { |
| | | return parseDateToStr(format, new Date()); |
| | | } |
| | | |
| | | public static final String dateTime(final Date date) |
| | | { |
| | | return parseDateToStr(YYYY_MM_DD, date); |
| | | } |
| | | |
| | | public static final String parseDateToStr(final String format, final Date date) |
| | | { |
| | | return new SimpleDateFormat(format).format(date); |
| | | } |
| | | |
| | | public static final Date dateTime(final String format, final String ts) |
| | | { |
| | | try |
| | | { |
| | | return new SimpleDateFormat(format).parse(ts); |
| | | } |
| | | catch (ParseException e) |
| | | { |
| | | throw new RuntimeException(e); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 日期路径 即年/月/日 如2018/08/08 |
| | | */ |
| | | public static final String datePath() |
| | | { |
| | | Date now = new Date(); |
| | | return DateFormatUtils.format(now, "yyyy/MM/dd"); |
| | | } |
| | | |
| | | /** |
| | | * 日期路径 即年/月/日 如20180808 |
| | | */ |
| | | public static final String dateTime() |
| | | { |
| | | Date now = new Date(); |
| | | return DateFormatUtils.format(now, "yyyyMMdd"); |
| | | } |
| | | |
| | | /** |
| | | * 日期型字符串转化为日期 格式 |
| | | */ |
| | | public static Date parseDate(Object str) |
| | | { |
| | | if (str == null) |
| | | { |
| | | return null; |
| | | } |
| | | try |
| | | { |
| | | return parseDate(str.toString(), parsePatterns); |
| | | } |
| | | catch (ParseException e) |
| | | { |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取服务器启动时间 |
| | | */ |
| | | public static Date getServerStartDate() |
| | | { |
| | | long time = ManagementFactory.getRuntimeMXBean().getStartTime(); |
| | | return new Date(time); |
| | | } |
| | | |
| | | /** |
| | | * 计算时间差 |
| | | * |
| | | * @param endTime 最后时间 |
| | | * @param startTime 开始时间 |
| | | * @return 时间差(天/小时/分钟) |
| | | */ |
| | | public static String timeDistance(Date endTime, Date startTime) |
| | | { |
| | | long nd = 1000 * 24 * 60 * 60; |
| | | long nh = 1000 * 60 * 60; |
| | | long nm = 1000 * 60; |
| | | // long ns = 1000; |
| | | // 获得两个时间的毫秒时间差异 |
| | | long diff = endTime.getTime() - startTime.getTime(); |
| | | // 计算差多少天 |
| | | long day = diff / nd; |
| | | // 计算差多少小时 |
| | | long hour = diff % nd / nh; |
| | | // 计算差多少分钟 |
| | | long min = diff % nd % nh / nm; |
| | | // 计算差多少秒//输出结果 |
| | | // long sec = diff % nd % nh % nm / ns; |
| | | return day + "天" + hour + "小时" + min + "分钟"; |
| | | } |
| | | |
| | | /** |
| | | * 增加 LocalDateTime ==> Date |
| | | */ |
| | | public static Date toDate(LocalDateTime temporalAccessor) |
| | | { |
| | | ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); |
| | | return Date.from(zdt.toInstant()); |
| | | } |
| | | |
| | | /** |
| | | * 增加 LocalDate ==> Date |
| | | */ |
| | | public static Date toDate(LocalDate temporalAccessor) |
| | | { |
| | | LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); |
| | | ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); |
| | | return Date.from(zdt.toInstant()); |
| | | } |
| | | |
| | | /** |
| | | * 计算两个日期之间相差的天数 |
| | | * |
| | | * @param smdate 较小的时间 |
| | | * @param bdate 较大的时间 |
| | | * @return 相差天数 |
| | | */ |
| | | public static int daysBetween(Date smdate, Date bdate) { |
| | | Calendar cal = Calendar.getInstance(); |
| | | cal.setTime(smdate); |
| | | long time1 = cal.getTimeInMillis(); |
| | | cal.setTime(bdate); |
| | | long time2 = cal.getTimeInMillis(); |
| | | long days = (time2 - time1) / (1000 * 3600 * 24); |
| | | return Integer.parseInt(String.valueOf(days)); |
| | | } |
| | | |
| | | /** |
| | | * 得到系统日期 |
| | | * |
| | | * @return |
| | | */ |
| | | public static Date getDateTime() { |
| | | TimeZone.setDefault(tz); |
| | | return new Date(); |
| | | } |
| | | |
| | | /** |
| | | * 字符串日期转Date yyyy-MM-dd HH:mm:ss |
| | | * |
| | | * @param dateStr |
| | | * @return |
| | | */ |
| | | public static Date getDate_str3(String dateStr) { |
| | | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
| | | sdf.setTimeZone(tz); |
| | | if ("".equals(dateStr)) { |
| | | dateStr = sdf.format(DateUtils.getDateTime()); |
| | | } |
| | | Date date = null; |
| | | try { |
| | | date = sdf.parse(dateStr); |
| | | } catch (ParseException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | return date; |
| | | } |
| | | |
| | | /** |
| | | * 指定日期所在周的周一和周日时间 |
| | | * |
| | | * @return 结果集 |
| | | */ |
| | | public static Map<String, Date> getWeekDate(Date date) { |
| | | Map<String, Date> map = new HashMap<>(2); |
| | | Calendar cal = Calendar.getInstance(); |
| | | cal.setTime(date); |
| | | // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一 |
| | | cal.setFirstDayOfWeek(Calendar.MONDAY); |
| | | // 获得当前日期是一个星期的第几天 |
| | | int dayWeek = cal.get(Calendar.DAY_OF_WEEK); |
| | | if (dayWeek == 1) { |
| | | dayWeek = 8; |
| | | } |
| | | // 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值 |
| | | cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - dayWeek); |
| | | Date mondayDate = cal.getTime(); |
| | | cal.add(Calendar.DATE, 4 + cal.getFirstDayOfWeek()); |
| | | Date sundayDate = cal.getTime(); |
| | | map.put("first", mondayDate); |
| | | map.put("last", sundayDate); |
| | | return map; |
| | | } |
| | | |
| | | /** |
| | | * 指定日期所在月的第一天/最后一天时间 |
| | | * |
| | | * @return 结果集 |
| | | */ |
| | | public static Map<String, Date> getMonthDate(Date date) { |
| | | Map<String, Date> map = new HashMap<>(2); |
| | | Calendar cal = Calendar.getInstance(); |
| | | //设置指定日期 |
| | | cal.setTime(date); |
| | | //获取当月第一天日期 |
| | | int first = cal.getActualMinimum(Calendar.DAY_OF_MONTH); |
| | | cal.set(Calendar.DAY_OF_MONTH, first); |
| | | Date firstDay = cal.getTime(); |
| | | map.put("first", firstDay); |
| | | //获取当月最后一天日期 |
| | | int last = cal.getActualMaximum(Calendar.DAY_OF_MONTH); |
| | | cal.set(Calendar.DAY_OF_MONTH, last); |
| | | Date lastDay = cal.getTime(); |
| | | map.put("last", lastDay); |
| | | return map; |
| | | } |
| | | |
| | | /** |
| | | * 指定日期所在年的第一天/最后一天时间 |
| | | * |
| | | * @return 结果集 |
| | | */ |
| | | public static Map<String, Date> getYearDate(Date date) { |
| | | Map<String, Date> map = new HashMap<>(2); |
| | | Calendar cal = Calendar.getInstance(); |
| | | //设置指定日期 |
| | | cal.setTime(date); |
| | | //获取本年第一天日期 |
| | | int first = cal.getActualMinimum(Calendar.DAY_OF_YEAR); |
| | | cal.set(Calendar.DAY_OF_YEAR, first); |
| | | Date firstDay = cal.getTime(); |
| | | map.put("first", firstDay); |
| | | //获取本年最后一天日期 |
| | | int last = cal.getActualMaximum(Calendar.DAY_OF_YEAR); |
| | | cal.set(Calendar.DAY_OF_YEAR, last); |
| | | Date lastDay = cal.getTime(); |
| | | map.put("last", lastDay); |
| | | return map; |
| | | } |
| | | |
| | | /** |
| | | * 分别获取日期中的年月日 |
| | | * |
| | | * @param date 需要获取的日期 |
| | | * @return 结果集合 |
| | | */ |
| | | public static Map<String, String> getYearMonthDay(Date date) { |
| | | String year = String.format("%tY", date); |
| | | String month = String.format("%tm", date); |
| | | String day = String.format("%td", date); |
| | | Map<String, String> result = new HashMap<>(3); |
| | | result.put("year", year); |
| | | result.put("month", month); |
| | | result.put("day", day); |
| | | result.put("time", String.valueOf(date.getTime())); |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * Date转为LocalDateTime |
| | | * |
| | | * @param date 日期 |
| | | * @return LocalDateTime |
| | | */ |
| | | public static LocalDateTime dateToLocalDateTime(Date date) { |
| | | Instant instant = date.toInstant(); |
| | | ZoneId zoneId = ZoneId.systemDefault(); |
| | | return instant.atZone(zoneId).toLocalDateTime(); |
| | | } |
| | | |
| | | /** |
| | | * LocalDateTime转Date |
| | | * |
| | | * @param dateTime 日期 |
| | | * @return Date |
| | | */ |
| | | public static Date localDateTimeToDate(LocalDateTime dateTime) { |
| | | ZoneId zoneId = ZoneId.systemDefault(); |
| | | ZonedDateTime zdt = dateTime.atZone(zoneId); |
| | | return Date.from(zdt.toInstant()); |
| | | } |
| | | |
| | | /** |
| | | * 获取当天的00:00:00 |
| | | * |
| | | * @return |
| | | */ |
| | | public static LocalDateTime getDayStart(LocalDateTime time) { |
| | | return time.with(LocalTime.MIN); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 获取当天的23:59:59 |
| | | * |
| | | * @return |
| | | */ |
| | | public static LocalDateTime getDayEnd(LocalDateTime time) { |
| | | return time.with(LocalTime.MAX); |
| | | } |
| | | /** |
| | | * string转LocalTime |
| | | * |
| | | * @return |
| | | */ |
| | | public static LocalTime string2LocalTime(String time) { |
| | | DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss"); |
| | | return LocalTime.parse(time, formatter); |
| | | } |
| | | |
| | | /** |
| | | * localdatetime转为字符串 |
| | | * |
| | | * @param time localdatetime |
| | | * @return 字符串 |
| | | */ |
| | | public static String localDateTimeToString(LocalDateTime time) { |
| | | DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); |
| | | return df.format(time); |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils; |
| | | |
| | | import java.io.PrintWriter; |
| | | import java.io.StringWriter; |
| | | import org.apache.commons.lang3.exception.ExceptionUtils; |
| | | |
| | | /** |
| | | * 错误信息处理类。 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class ExceptionUtil |
| | | { |
| | | /** |
| | | * 获取exception的详细错误信息。 |
| | | */ |
| | | public static String getExceptionMessage(Throwable e) |
| | | { |
| | | StringWriter sw = new StringWriter(); |
| | | e.printStackTrace(new PrintWriter(sw, true)); |
| | | return sw.toString(); |
| | | } |
| | | |
| | | public static String getRootErrorMessage(Exception e) |
| | | { |
| | | Throwable root = ExceptionUtils.getRootCause(e); |
| | | root = (root == null ? e : root); |
| | | if (root == null) |
| | | { |
| | | return ""; |
| | | } |
| | | String msg = root.getMessage(); |
| | | if (msg == null) |
| | | { |
| | | return "null"; |
| | | } |
| | | return StringUtils.defaultString(msg); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils; |
| | | |
| | | import java.io.File; |
| | | import java.io.IOException; |
| | | import java.nio.file.Paths; |
| | | import java.util.Objects; |
| | | import org.apache.commons.io.FilenameUtils; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | import com.ruoyi.common.core.exception.file.FileException; |
| | | import com.ruoyi.common.core.exception.file.FileNameLengthLimitExceededException; |
| | | import com.ruoyi.common.core.exception.file.FileSizeLimitExceededException; |
| | | import com.ruoyi.common.core.exception.file.InvalidExtensionException; |
| | | import com.ruoyi.common.core.utils.file.FileTypeUtils; |
| | | import com.ruoyi.common.core.utils.file.MimeTypeUtils; |
| | | import com.ruoyi.common.core.utils.uuid.Seq; |
| | | |
| | | /** |
| | | * 文件上传工具类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class FileUploadUtils |
| | | { |
| | | /** |
| | | * 默认大小 50M |
| | | */ |
| | | public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024; |
| | | |
| | | /** |
| | | * 默认的文件名最大长度 100 |
| | | */ |
| | | public static final int DEFAULT_FILE_NAME_LENGTH = 100; |
| | | |
| | | /** |
| | | * 根据文件路径上传 |
| | | * |
| | | * @param baseDir 相对应用的基目录 |
| | | * @param file 上传的文件 |
| | | * @return 文件名称 |
| | | * @throws IOException |
| | | */ |
| | | public static final String upload(String baseDir, MultipartFile file) throws IOException |
| | | { |
| | | try |
| | | { |
| | | return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); |
| | | } |
| | | catch (FileException fe) |
| | | { |
| | | throw new IOException(fe.getDefaultMessage(), fe); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | throw new IOException(e.getMessage(), e); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 文件上传 |
| | | * |
| | | * @param baseDir 相对应用的基目录 |
| | | * @param file 上传的文件 |
| | | * @param allowedExtension 上传文件类型 |
| | | * @return 返回上传成功的文件名 |
| | | * @throws FileSizeLimitExceededException 如果超出最大大小 |
| | | * @throws FileNameLengthLimitExceededException 文件名太长 |
| | | * @throws IOException 比如读写文件出错时 |
| | | * @throws InvalidExtensionException 文件校验异常 |
| | | */ |
| | | public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension) |
| | | throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, |
| | | InvalidExtensionException |
| | | { |
| | | int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length(); |
| | | if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) |
| | | { |
| | | throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH); |
| | | } |
| | | |
| | | assertAllowed(file, allowedExtension); |
| | | |
| | | String fileName = extractFilename(file); |
| | | |
| | | String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath(); |
| | | file.transferTo(Paths.get(absPath)); |
| | | return getPathFileName(fileName); |
| | | } |
| | | |
| | | /** |
| | | * 编码文件名 |
| | | */ |
| | | public static final String extractFilename(MultipartFile file) |
| | | { |
| | | return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(), |
| | | FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), FileTypeUtils.getExtension(file)); |
| | | } |
| | | |
| | | private static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException |
| | | { |
| | | File desc = new File(uploadDir + File.separator + fileName); |
| | | |
| | | if (!desc.exists()) |
| | | { |
| | | if (!desc.getParentFile().exists()) |
| | | { |
| | | desc.getParentFile().mkdirs(); |
| | | } |
| | | } |
| | | return desc.isAbsolute() ? desc : desc.getAbsoluteFile(); |
| | | } |
| | | |
| | | private static final String getPathFileName(String fileName) throws IOException |
| | | { |
| | | String pathFileName = "/" + fileName; |
| | | return pathFileName; |
| | | } |
| | | |
| | | /** |
| | | * 文件大小校验 |
| | | * |
| | | * @param file 上传的文件 |
| | | * @throws FileSizeLimitExceededException 如果超出最大大小 |
| | | * @throws InvalidExtensionException 文件校验异常 |
| | | */ |
| | | public static final void assertAllowed(MultipartFile file, String[] allowedExtension) |
| | | throws FileSizeLimitExceededException, InvalidExtensionException |
| | | { |
| | | long size = file.getSize(); |
| | | if (size > DEFAULT_MAX_SIZE) |
| | | { |
| | | throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024); |
| | | } |
| | | |
| | | String fileName = file.getOriginalFilename(); |
| | | String extension = FileTypeUtils.getExtension(file); |
| | | if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) |
| | | { |
| | | if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) |
| | | { |
| | | throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension, |
| | | fileName); |
| | | } |
| | | else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION) |
| | | { |
| | | throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension, |
| | | fileName); |
| | | } |
| | | else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION) |
| | | { |
| | | throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension, |
| | | fileName); |
| | | } |
| | | else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION) |
| | | { |
| | | throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension, |
| | | fileName); |
| | | } |
| | | else |
| | | { |
| | | throw new InvalidExtensionException(allowedExtension, extension, fileName); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 判断MIME类型是否是允许的MIME类型 |
| | | * |
| | | * @param extension 上传文件类型 |
| | | * @param allowedExtension 允许上传文件类型 |
| | | * @return true/false |
| | | */ |
| | | public static final boolean isAllowedExtension(String extension, String[] allowedExtension) |
| | | { |
| | | for (String str : allowedExtension) |
| | | { |
| | | if (str.equalsIgnoreCase(extension)) |
| | | { |
| | | return true; |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils; |
| | | |
| | | import org.gavaghan.geodesy.Ellipsoid; |
| | | import org.gavaghan.geodesy.GeodeticCalculator; |
| | | import org.gavaghan.geodesy.GeodeticCurve; |
| | | import org.gavaghan.geodesy.GlobalCoordinates; |
| | | |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * 计算两个金纬度坐标之间的直线距离 |
| | | */ |
| | | public class GeodesyUtil { |
| | | |
| | | |
| | | /** |
| | | * 获取直线距离 |
| | | * @param fromLonLat |
| | | * @param toLonLat |
| | | * @return |
| | | */ |
| | | public static Map<String, Double> getDistance(String fromLonLat, String toLonLat){ |
| | | Map<String, Double> map = null; |
| | | if(StringUtils.isNotEmpty(fromLonLat) && StringUtils.isNotEmpty(toLonLat)){ |
| | | map = new HashMap<>(); |
| | | String[] from = fromLonLat.split(","); |
| | | String[] to = toLonLat.split(","); |
| | | GlobalCoordinates source = new GlobalCoordinates(Double.valueOf(from[1]), Double.valueOf(from[0])); |
| | | GlobalCoordinates target = new GlobalCoordinates(Double.valueOf(to[1]), Double.valueOf(to[0])); |
| | | double Sphere = getDistanceMeter(source, target, Ellipsoid.Sphere); |
| | | double WGS84 = getDistanceMeter(source, target, Ellipsoid.WGS84); |
| | | double GRS80 = getDistanceMeter(source, target, Ellipsoid.GRS80); |
| | | double GRS67 = getDistanceMeter(source, target, Ellipsoid.GRS67); |
| | | double ANS = getDistanceMeter(source, target, Ellipsoid.ANS); |
| | | double WGS72 = getDistanceMeter(source, target, Ellipsoid.WGS72); |
| | | double Clarke1858 = getDistanceMeter(source, target, Ellipsoid.Clarke1858); |
| | | double Clarke1880 = getDistanceMeter(source, target, Ellipsoid.Clarke1880); |
| | | System.out.println("Sphere坐标系计算结果:"+Sphere + "米"); |
| | | System.out.println("WGS84坐标系计算结果:"+WGS84 + "米"); |
| | | System.out.println("GRS80坐标系计算结果:"+GRS80 + "米"); |
| | | System.out.println("GRS67坐标系计算结果:"+GRS67 + "米"); |
| | | System.out.println("ANS坐标系计算结果:"+ANS + "米"); |
| | | System.out.println("WGS72坐标系计算结果:"+WGS72 + "米"); |
| | | System.out.println("Clarke1858坐标系计算结果:"+Clarke1858 + "米"); |
| | | System.out.println("Clarke1880坐标系计算结果:"+Clarke1880 + "米"); |
| | | map.put("Sphere", Sphere); |
| | | map.put("WGS84", WGS84); |
| | | map.put("GRS80", GRS80); |
| | | map.put("GRS67", GRS67); |
| | | map.put("ANS", ANS); |
| | | map.put("WGS72", WGS72); |
| | | map.put("Clarke1858", Clarke1858); |
| | | map.put("Clarke1880", Clarke1880); |
| | | } |
| | | return map; |
| | | } |
| | | |
| | | |
| | | private static double getDistanceMeter(GlobalCoordinates gpsFrom, GlobalCoordinates gpsTo, Ellipsoid ellipsoid){ |
| | | //创建GeodeticCalculator,调用计算方法,传入坐标系、经纬度用于计算距离 |
| | | GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(ellipsoid, gpsFrom, gpsTo); |
| | | return geoCurve.getEllipsoidalDistance(); |
| | | } |
| | | |
| | | |
| | | |
| | | public static void main(String[] ages){ |
| | | GeodesyUtil geodesyUtil = new GeodesyUtil(); |
| | | Map<String, Double> distance = geodesyUtil.getDistance("106.6664549,29.4158471", "104.0908333,30.4414610"); |
| | | System.err.println(distance); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils; |
| | | |
| | | import com.ruoyi.common.core.constant.Constants; |
| | | import com.ruoyi.common.core.exception.ServiceException; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | |
| | | import javax.net.ssl.*; |
| | | import java.io.*; |
| | | import java.net.*; |
| | | import java.nio.charset.StandardCharsets; |
| | | import java.security.cert.X509Certificate; |
| | | import java.time.LocalDateTime; |
| | | import java.time.OffsetDateTime; |
| | | import java.time.ZoneOffset; |
| | | import java.time.format.DateTimeFormatter; |
| | | |
| | | /** |
| | | * 通用http发送方法 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class HttpUtils |
| | | { |
| | | private static final Logger log = LoggerFactory.getLogger(HttpUtils.class); |
| | | |
| | | /** |
| | | * 向指定 URL 发送GET方法的请求 |
| | | * |
| | | * @param url 发送请求的 URL |
| | | * @return 所代表远程资源的响应结果 |
| | | */ |
| | | public static String sendGet(String url) |
| | | { |
| | | return sendGet(url, StringUtils.EMPTY); |
| | | } |
| | | |
| | | /** |
| | | * 向指定 URL 发送GET方法的请求 |
| | | * |
| | | * @param url 发送请求的 URL |
| | | * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 |
| | | * @return 所代表远程资源的响应结果 |
| | | */ |
| | | public static String sendGet(String url, String param) |
| | | { |
| | | return sendGet(url, param, Constants.UTF8); |
| | | } |
| | | |
| | | /** |
| | | * 向指定 URL 发送GET方法的请求 |
| | | * |
| | | * @param url 发送请求的 URL |
| | | * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 |
| | | * @param contentType 编码类型 |
| | | * @return 所代表远程资源的响应结果 |
| | | */ |
| | | public static String sendGet(String url, String param, String contentType) |
| | | { |
| | | StringBuilder result = new StringBuilder(); |
| | | BufferedReader in = null; |
| | | try |
| | | { |
| | | String urlNameString = StringUtils.isNotBlank(param) ? url + "?" + param : url; |
| | | log.info("sendGet - {}", urlNameString); |
| | | URL realUrl = new URL(urlNameString); |
| | | URLConnection connection = realUrl.openConnection(); |
| | | connection.setRequestProperty("accept", "*/*"); |
| | | connection.setRequestProperty("connection", "Keep-Alive"); |
| | | connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); |
| | | connection.connect(); |
| | | in = new BufferedReader(new InputStreamReader(connection.getInputStream(), contentType)); |
| | | String line; |
| | | while ((line = in.readLine()) != null) |
| | | { |
| | | result.append(line); |
| | | } |
| | | log.info("recv - {}", result); |
| | | } |
| | | catch (ConnectException e) |
| | | { |
| | | log.error("调用HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e); |
| | | } |
| | | catch (SocketTimeoutException e) |
| | | { |
| | | log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e); |
| | | } |
| | | catch (IOException e) |
| | | { |
| | | log.error("调用HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | log.error("调用HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e); |
| | | } |
| | | finally |
| | | { |
| | | try |
| | | { |
| | | if (in != null) |
| | | { |
| | | in.close(); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); |
| | | } |
| | | } |
| | | return result.toString(); |
| | | } |
| | | |
| | | /** |
| | | * 向指定 URL 发送POST方法的请求 |
| | | * |
| | | * @param url 发送请求的 URL |
| | | * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 |
| | | * @return 所代表远程资源的响应结果 |
| | | */ |
| | | public static String sendPost(String url, String param) |
| | | { |
| | | PrintWriter out = null; |
| | | BufferedReader in = null; |
| | | StringBuilder result = new StringBuilder(); |
| | | try |
| | | { |
| | | log.info("sendPost - {}", url); |
| | | URL realUrl = new URL(url); |
| | | URLConnection conn = realUrl.openConnection(); |
| | | conn.setRequestProperty("accept", "*/*"); |
| | | conn.setRequestProperty("connection", "Keep-Alive"); |
| | | conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); |
| | | conn.setRequestProperty("Accept-Charset", "utf-8"); |
| | | conn.setRequestProperty("contentType", "utf-8"); |
| | | conn.setDoOutput(true); |
| | | conn.setDoInput(true); |
| | | out = new PrintWriter(conn.getOutputStream()); |
| | | out.print(param); |
| | | out.flush(); |
| | | in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)); |
| | | String line; |
| | | while ((line = in.readLine()) != null) |
| | | { |
| | | result.append(line); |
| | | } |
| | | log.info("recv - {}", result); |
| | | } |
| | | catch (ConnectException e) |
| | | { |
| | | log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e); |
| | | } |
| | | catch (SocketTimeoutException e) |
| | | { |
| | | log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e); |
| | | } |
| | | catch (IOException e) |
| | | { |
| | | log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e); |
| | | } |
| | | finally |
| | | { |
| | | try |
| | | { |
| | | if (out != null) |
| | | { |
| | | out.close(); |
| | | } |
| | | if (in != null) |
| | | { |
| | | in.close(); |
| | | } |
| | | } |
| | | catch (IOException ex) |
| | | { |
| | | log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); |
| | | } |
| | | } |
| | | return result.toString(); |
| | | } |
| | | |
| | | public static String sendSSLPost(String url, String param) |
| | | { |
| | | StringBuilder result = new StringBuilder(); |
| | | String urlNameString = url + "?" + param; |
| | | try |
| | | { |
| | | log.info("sendSSLPost - {}", urlNameString); |
| | | SSLContext sc = SSLContext.getInstance("SSL"); |
| | | sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom()); |
| | | URL console = new URL(urlNameString); |
| | | HttpsURLConnection conn = (HttpsURLConnection) console.openConnection(); |
| | | conn.setRequestProperty("accept", "*/*"); |
| | | conn.setRequestProperty("connection", "Keep-Alive"); |
| | | conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); |
| | | conn.setRequestProperty("Accept-Charset", "utf-8"); |
| | | conn.setRequestProperty("contentType", "utf-8"); |
| | | conn.setDoOutput(true); |
| | | conn.setDoInput(true); |
| | | |
| | | conn.setSSLSocketFactory(sc.getSocketFactory()); |
| | | conn.setHostnameVerifier(new TrustAnyHostnameVerifier()); |
| | | conn.connect(); |
| | | InputStream is = conn.getInputStream(); |
| | | BufferedReader br = new BufferedReader(new InputStreamReader(is)); |
| | | String ret = ""; |
| | | while ((ret = br.readLine()) != null) |
| | | { |
| | | if (ret != null && !"".equals(ret.trim())) |
| | | { |
| | | result.append(new String(ret.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8)); |
| | | } |
| | | } |
| | | log.info("recv - {}", result); |
| | | conn.disconnect(); |
| | | br.close(); |
| | | } |
| | | catch (ConnectException e) |
| | | { |
| | | log.error("调用HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e); |
| | | } |
| | | catch (SocketTimeoutException e) |
| | | { |
| | | log.error("调用HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e); |
| | | } |
| | | catch (IOException e) |
| | | { |
| | | log.error("调用HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | log.error("调用HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e); |
| | | } |
| | | return result.toString(); |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | // 获取当前时间,并指定时区偏移为 +08:00 |
| | | OffsetDateTime now = OffsetDateTime.now(ZoneOffset.of("+08:00")); |
| | | |
| | | // 定义日期时间格式 |
| | | DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSxxx"); |
| | | |
| | | // 将时间格式化为字符串 |
| | | String formattedDateTime = now.format(formatter); |
| | | |
| | | // 输出结果 |
| | | System.out.println(formattedDateTime); |
| | | |
| | | } |
| | | |
| | | public static String post(String strURL, String params) { |
| | | String result = ""; |
| | | BufferedReader reader = null; |
| | | try { |
| | | URL url = new URL(strURL);// 创建连接 |
| | | HttpURLConnection connection = (HttpURLConnection) url |
| | | .openConnection(); |
| | | connection.setDoOutput(true); |
| | | connection.setDoInput(true); |
| | | connection.setUseCaches(false); |
| | | connection.setInstanceFollowRedirects(true); |
| | | connection.setRequestMethod("POST"); // 设置请求方式 |
| | | connection.setRequestProperty("Accept", "application/json"); // 设置接收数据的格式 |
| | | connection.setRequestProperty("Content-Type", "application/json"); // 设置发送数据的格式 |
| | | connection.connect(); |
| | | if (params != null && !StringUtils.isEmpty(params)) { |
| | | byte[] writebytes = params.getBytes(); |
| | | // 设置文件长度 |
| | | // connection.setRequestProperty("Content-Length", String.valueOf(writebytes.length)); |
| | | OutputStream outwritestream = connection.getOutputStream(); |
| | | outwritestream.write(params.getBytes()); |
| | | outwritestream.flush(); |
| | | outwritestream.close(); |
| | | // Log.d("hlhupload", "doJsonPost: conn"+connection.getResponseCode()); |
| | | } |
| | | if (connection.getResponseCode() == 200) { |
| | | log.info("<<<<<<<<<<<<<请求响应:{}", connection.getResponseMessage()); |
| | | reader = new BufferedReader( |
| | | new InputStreamReader(connection.getInputStream())); |
| | | result = reader.readLine(); |
| | | log.info("<<<<<<<<<<<<<请求响应:{}", result); |
| | | } else { |
| | | throw new ServiceException(connection.getResponseMessage()); |
| | | } |
| | | } catch (Exception e) { |
| | | throw new ServiceException("http的post请求异常!" + e.getMessage()); |
| | | } finally { |
| | | if (reader != null) { |
| | | try { |
| | | reader.close(); |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | private static class TrustAnyTrustManager implements X509TrustManager |
| | | { |
| | | @Override |
| | | public void checkClientTrusted(X509Certificate[] chain, String authType) |
| | | { |
| | | } |
| | | |
| | | @Override |
| | | public void checkServerTrusted(X509Certificate[] chain, String authType) |
| | | { |
| | | } |
| | | |
| | | @Override |
| | | public X509Certificate[] getAcceptedIssuers() |
| | | { |
| | | return new X509Certificate[] {}; |
| | | } |
| | | } |
| | | |
| | | private static class TrustAnyHostnameVerifier implements HostnameVerifier |
| | | { |
| | | @Override |
| | | public boolean verify(String hostname, SSLSession session) |
| | | { |
| | | return true; |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.common.core.web.domain.AjaxResult; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 导出返回信息 |
| | | */ |
| | | @Slf4j |
| | | public class ImportExcelUtil { |
| | | |
| | | /** |
| | | * @param errorLines 错误行数 |
| | | * @param successLines 成功行数 |
| | | * @param errorMessage 错误信息 |
| | | * @return |
| | | * @throws IOException |
| | | */ |
| | | public static R<String > importReturnMsg(int errorLines, int successLines, List<String> errorMessage) throws IOException { |
| | | if (errorLines == 0) { |
| | | return R.ok("共" + successLines + "行数据全部导入成功!"); |
| | | } else { |
| | | JSONObject result = new JSONObject(5); |
| | | int totalCount = successLines + errorLines; |
| | | result.put("totalCount", totalCount); |
| | | result.put("errorCount", errorLines); |
| | | result.put("errorMessage", errorMessage); |
| | | result.put("successCount", successLines); |
| | | result.put("msg", "总上传行数:" + totalCount + ",已导入行数:" + successLines + ",错误行数:" + errorLines); |
| | | return R.ok(JSON.toJSONString(result)); |
| | | } |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils; |
| | | |
| | | import java.util.Map; |
| | | import com.ruoyi.common.core.constant.SecurityConstants; |
| | | import com.ruoyi.common.core.constant.TokenConstants; |
| | | import com.ruoyi.common.core.text.Convert; |
| | | import io.jsonwebtoken.Claims; |
| | | import io.jsonwebtoken.Jwts; |
| | | import io.jsonwebtoken.SignatureAlgorithm; |
| | | |
| | | /** |
| | | * Jwt工具类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class JwtUtils |
| | | { |
| | | public static String secret = TokenConstants.SECRET; |
| | | |
| | | /** |
| | | * 从数据声明生成令牌 |
| | | * |
| | | * @param claims 数据声明 |
| | | * @return 令牌 |
| | | */ |
| | | public static String createToken(Map<String, Object> claims) |
| | | { |
| | | String token = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512, secret).compact(); |
| | | return token; |
| | | } |
| | | |
| | | /** |
| | | * 从令牌中获取数据声明 |
| | | * |
| | | * @param token 令牌 |
| | | * @return 数据声明 |
| | | */ |
| | | public static Claims parseToken(String token) |
| | | { |
| | | return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); |
| | | } |
| | | |
| | | /** |
| | | * 根据令牌获取用户标识 |
| | | * |
| | | * @param token 令牌 |
| | | * @return 用户ID |
| | | */ |
| | | public static String getUserKey(String token) |
| | | { |
| | | Claims claims = parseToken(token); |
| | | return getValue(claims, SecurityConstants.USER_KEY); |
| | | } |
| | | |
| | | /** |
| | | * 根据令牌获取用户标识 |
| | | * |
| | | * @param claims 身份信息 |
| | | * @return 用户ID |
| | | */ |
| | | public static String getUserKey(Claims claims) |
| | | { |
| | | return getValue(claims, SecurityConstants.USER_KEY); |
| | | } |
| | | |
| | | /** |
| | | * 根据令牌获取用户类型 |
| | | * |
| | | * @param token 令牌 |
| | | * @return 用户类型 |
| | | */ |
| | | public static String getUserType(String token) |
| | | { |
| | | Claims claims = parseToken(token); |
| | | return getValue(claims, SecurityConstants.USER_TYPE); |
| | | } |
| | | |
| | | /** |
| | | * 根据令牌获取用户类型 |
| | | * |
| | | * @param claims 身份信息 |
| | | * @return 用户类型 |
| | | */ |
| | | public static String getUserType(Claims claims) |
| | | { |
| | | return getValue(claims, SecurityConstants.USER_TYPE); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 小程序根据令牌获取用户标识 |
| | | * |
| | | * @param token 令牌 |
| | | * @return 用户ID |
| | | */ |
| | | public static String getUserKeyApplet(String token) |
| | | { |
| | | Claims claims = parseToken(token); |
| | | return getValue(claims, SecurityConstants.USER_APPLET_KEY); |
| | | } |
| | | /** |
| | | * 根据令牌获取用户ID |
| | | * |
| | | * @param token 令牌 |
| | | * @return 用户ID |
| | | */ |
| | | public static String getUserId(String token) |
| | | { |
| | | Claims claims = parseToken(token); |
| | | return getValue(claims, SecurityConstants.DETAILS_USER_ID); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 根据身份信息获取用户ID |
| | | * |
| | | * @param claims 身份信息 |
| | | * @return 用户ID |
| | | */ |
| | | public static String getUserId(Claims claims) |
| | | { |
| | | return getValue(claims, SecurityConstants.DETAILS_USER_ID); |
| | | } |
| | | |
| | | /** |
| | | * 根据令牌获取用户名 |
| | | * |
| | | * @param token 令牌 |
| | | * @return 用户名 |
| | | */ |
| | | public static String getUserName(String token) |
| | | { |
| | | Claims claims = parseToken(token); |
| | | return getValue(claims, SecurityConstants.DETAILS_USERNAME); |
| | | } |
| | | |
| | | /** |
| | | * 根据身份信息获取用户名 |
| | | * |
| | | * @param claims 身份信息 |
| | | * @return 用户名 |
| | | */ |
| | | public static String getUserName(Claims claims) |
| | | { |
| | | return getValue(claims, SecurityConstants.DETAILS_USERNAME); |
| | | } |
| | | |
| | | /** |
| | | * 根据身份信息获取键值 |
| | | * |
| | | * @param claims 身份信息 |
| | | * @param key 键 |
| | | * @return 值 |
| | | */ |
| | | public static String getValue(Claims claims, String key) |
| | | { |
| | | return Convert.toStr(claims.get(key), ""); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils; |
| | | |
| | | import java.security.MessageDigest; |
| | | import java.security.NoSuchAlgorithmException; |
| | | |
| | | public class MD5Util { |
| | | |
| | | /** |
| | | * 给指定字符串按照md5算法去加密 |
| | | * |
| | | * @param psd 需要加密的密码 加盐处理 |
| | | * |
| | | * @return md5后的字符串 |
| | | */ |
| | | public static String encoder(String psd) { |
| | | try { |
| | | //加盐处理 |
| | | psd = psd + "mobilesafe"; |
| | | //1,指定加密算法类型 |
| | | MessageDigest digest = MessageDigest.getInstance("MD5"); |
| | | //2,将需要加密的字符串中转换成byte类型的数组,然后进行随机哈希过程 |
| | | byte[] bs = digest.digest(psd.getBytes()); |
| | | // System.out.println(bs.length); |
| | | //3,循环遍历bs,然后让其生成32位字符串,固定写法 |
| | | //4,拼接字符串过程 |
| | | StringBuffer stringBuffer = new StringBuffer(); |
| | | for (byte b : bs) { |
| | | int i = b & 0xff; |
| | | //int类型的i需要转换成16机制字符 |
| | | String hexString = Integer.toHexString(i); |
| | | // System.out.println(hexString); |
| | | if (hexString.length() < 2) { |
| | | hexString = "0" + hexString; |
| | | } |
| | | stringBuffer.append(hexString); |
| | | } |
| | | //5,打印测试 |
| | | System.out.println(stringBuffer.toString()); |
| | | return stringBuffer.toString(); |
| | | } catch (NoSuchAlgorithmException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | return ""; |
| | | } |
| | | |
| | | /** |
| | | * MD5加密字符串 |
| | | * |
| | | * @param str |
| | | * @return |
| | | */ |
| | | public static String getMD5(String str) { |
| | | if (StringUtils.isNotEmpty(str)) { |
| | | try { |
| | | // 创建MD5加密实例 |
| | | MessageDigest md = MessageDigest.getInstance("MD5"); |
| | | |
| | | // 执行加密操作 |
| | | byte[] messageDigest = md.digest(str.getBytes()); |
| | | |
| | | // 将得到的散列值转换为十六进制 |
| | | StringBuilder sb = new StringBuilder(); |
| | | for (byte b : messageDigest) { |
| | | sb.append(String.format("%02x", b)); |
| | | } |
| | | |
| | | // 返回MD5散列值 |
| | | return sb.toString(); |
| | | } catch (NoSuchAlgorithmException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | return ""; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.ruoyi.common.core.constant.MsgConstants; |
| | | import com.ruoyi.common.core.utils.req.SubmitTempletReq; |
| | | import org.apache.commons.codec.binary.Base64; |
| | | |
| | | import java.util.concurrent.ThreadLocalRandom; |
| | | |
| | | public class MsgUtil { |
| | | |
| | | public final static String ecName= ""; |
| | | public final static String secretKey= ""; |
| | | public final static String sign= ""; |
| | | |
| | | |
| | | |
| | | /** |
| | | * 更换手机号:【签名】验证码:XXX,用于更换手机号。请勿转发。 |
| | | * @param phone 手机号 |
| | | * @param code 验证码 |
| | | * @return |
| | | */ |
| | | public static String codeMsg(String phone,String code){ |
| | | SubmitTempletReq submitReq = new SubmitTempletReq(); |
| | | String[] paramss = {code}; |
| | | submitReq.setApId(MsgConstants.CODE_AP_ID); |
| | | submitReq.setEcName(ecName); |
| | | submitReq.setSecretKey(secretKey); |
| | | submitReq.setParams(JSON.toJSONString(paramss)); |
| | | submitReq.setMobiles(phone); |
| | | submitReq.setAddSerial(""); |
| | | submitReq.setSign(sign); |
| | | submitReq.setTemplateId(MsgConstants.CODE_TEMPLATE_ID); |
| | | StringBuffer stringBuffer = new StringBuffer(); |
| | | stringBuffer.append(submitReq.getEcName()); |
| | | stringBuffer.append(submitReq.getApId()); |
| | | stringBuffer.append(submitReq.getSecretKey()); |
| | | stringBuffer.append(submitReq.getTemplateId()); |
| | | stringBuffer.append(submitReq.getMobiles()); |
| | | stringBuffer.append(submitReq.getParams()); |
| | | stringBuffer.append(submitReq.getSign()); |
| | | stringBuffer.append(submitReq.getAddSerial()); |
| | | submitReq.setMac(MD5Util.getMD5(stringBuffer.toString())); |
| | | String reqText = JSON.toJSONString(submitReq); |
| | | //加密 |
| | | String encode = Base64.encodeBase64String(reqText.getBytes()); |
| | | System.err.println(encode); |
| | | return encode; |
| | | } |
| | | |
| | | /** |
| | | * 更换手机号:【签名】验证码:XXX,用于更换手机号。请勿转发。 |
| | | * @param phone 手机号 |
| | | * @param code 验证码 |
| | | * @return |
| | | */ |
| | | public static String applyCodeMsg(String phone,String code){ |
| | | SubmitTempletReq submitReq = new SubmitTempletReq(); |
| | | String[] paramss = {code}; |
| | | submitReq.setApId(MsgConstants.APPLY_AP_ID); |
| | | submitReq.setEcName(ecName); |
| | | submitReq.setSecretKey(secretKey); |
| | | submitReq.setParams(JSON.toJSONString(paramss)); |
| | | submitReq.setMobiles(phone); |
| | | submitReq.setAddSerial(""); |
| | | submitReq.setSign(sign); |
| | | submitReq.setTemplateId(MsgConstants.APPLY_TEMPLATE_ID); |
| | | StringBuffer stringBuffer = new StringBuffer(); |
| | | stringBuffer.append(submitReq.getEcName()); |
| | | stringBuffer.append(submitReq.getApId()); |
| | | stringBuffer.append(submitReq.getSecretKey()); |
| | | stringBuffer.append(submitReq.getTemplateId()); |
| | | stringBuffer.append(submitReq.getMobiles()); |
| | | stringBuffer.append(submitReq.getParams()); |
| | | stringBuffer.append(submitReq.getSign()); |
| | | stringBuffer.append(submitReq.getAddSerial()); |
| | | submitReq.setMac(MD5Util.getMD5(stringBuffer.toString())); |
| | | String reqText = JSON.toJSONString(submitReq); |
| | | //加密 |
| | | String encode = Base64.encodeBase64String(reqText.getBytes()); |
| | | System.err.println(encode); |
| | | return encode; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 停车占位提醒:车辆已在3小时前完成充电,请及时取车,避免长时间占用充电资源。 |
| | | * @param phone 手机号 |
| | | * @return |
| | | */ |
| | | public static String stopMsg(String phone){ |
| | | SubmitTempletReq submitReq = new SubmitTempletReq(); |
| | | submitReq.setTemplateId(MsgConstants.STOP_TEMPLATE_ID); |
| | | submitReq.setApId(MsgConstants.STOP_AP_ID); |
| | | submitReq.setEcName(ecName); |
| | | submitReq.setSecretKey(secretKey); |
| | | submitReq.setMobiles(phone); |
| | | submitReq.setAddSerial(""); |
| | | submitReq.setSign(sign); |
| | | StringBuffer stringBuffer = new StringBuffer(); |
| | | stringBuffer.append(submitReq.getEcName()); |
| | | stringBuffer.append(submitReq.getApId()); |
| | | stringBuffer.append(submitReq.getSecretKey()); |
| | | stringBuffer.append(submitReq.getTemplateId()); |
| | | stringBuffer.append(submitReq.getMobiles()); |
| | | stringBuffer.append(submitReq.getParams()); |
| | | stringBuffer.append(submitReq.getSign()); |
| | | stringBuffer.append(submitReq.getAddSerial()); |
| | | submitReq.setMac(MD5Util.getMD5(stringBuffer.toString())); |
| | | String reqText = JSON.toJSONString(submitReq); |
| | | //加密 |
| | | String encode = Base64.encodeBase64String(reqText.getBytes()); |
| | | System.err.println(encode); |
| | | return encode; |
| | | } |
| | | |
| | | /** |
| | | * 充电结束:车辆充电结束,请及时取车。 |
| | | * @param phone 手机号 |
| | | * @return |
| | | */ |
| | | public static String chargeStopMsg(String phone){ |
| | | SubmitTempletReq submitReq = new SubmitTempletReq(); |
| | | submitReq.setTemplateId(MsgConstants.CHARGE_TEMPLATE_ID); |
| | | submitReq.setApId(MsgConstants.CHARGE_AP_ID); |
| | | submitReq.setEcName(ecName); |
| | | submitReq.setSecretKey(secretKey); |
| | | submitReq.setMobiles(phone); |
| | | submitReq.setAddSerial(""); |
| | | submitReq.setSign(sign); |
| | | StringBuffer stringBuffer = new StringBuffer(); |
| | | stringBuffer.append(submitReq.getEcName()); |
| | | stringBuffer.append(submitReq.getApId()); |
| | | stringBuffer.append(submitReq.getSecretKey()); |
| | | stringBuffer.append(submitReq.getTemplateId()); |
| | | stringBuffer.append(submitReq.getMobiles()); |
| | | stringBuffer.append(submitReq.getParams()); |
| | | stringBuffer.append(submitReq.getSign()); |
| | | stringBuffer.append(submitReq.getAddSerial()); |
| | | submitReq.setMac(MD5Util.getMD5(stringBuffer.toString())); |
| | | String reqText = JSON.toJSONString(submitReq); |
| | | //加密 |
| | | String encode = Base64.encodeBase64String(reqText.getBytes()); |
| | | System.err.println(encode); |
| | | return encode; |
| | | } |
| | | |
| | | /** phone 单词可拼接5000个号码 |
| | | * 桩故障(自动/手动):检测到【电站1】【编号】号桩设备离线,请及时查看处理! |
| | | * @param phone 手机号 |
| | | * @param site 站点名称 |
| | | * @param chargeGun 桩编号 |
| | | * @return |
| | | */ |
| | | public static String faultMsg(String phone,String site,String chargeGun){ |
| | | SubmitTempletReq submitReq = new SubmitTempletReq(); |
| | | if(site.length()<=10){ |
| | | String[] paramss = {site,chargeGun}; |
| | | submitReq.setParams(JSON.toJSONString(paramss)); |
| | | }else{ |
| | | String work1 = site.substring(0,10); |
| | | String[] paramss = {work1,chargeGun}; |
| | | submitReq.setParams(JSON.toJSONString(paramss)); |
| | | } |
| | | submitReq.setTemplateId(MsgConstants.FAULT_TEMPLATE_ID); |
| | | submitReq.setApId(MsgConstants.FAULT_AP_ID); |
| | | submitReq.setEcName(ecName); |
| | | submitReq.setSecretKey(secretKey); |
| | | submitReq.setMobiles(phone); |
| | | submitReq.setAddSerial(""); |
| | | submitReq.setSign(sign); |
| | | StringBuffer stringBuffer = new StringBuffer(); |
| | | stringBuffer.append(submitReq.getEcName()); |
| | | stringBuffer.append(submitReq.getApId()); |
| | | stringBuffer.append(submitReq.getSecretKey()); |
| | | stringBuffer.append(submitReq.getTemplateId()); |
| | | stringBuffer.append(submitReq.getMobiles()); |
| | | stringBuffer.append(submitReq.getParams()); |
| | | stringBuffer.append(submitReq.getSign()); |
| | | stringBuffer.append(submitReq.getAddSerial()); |
| | | submitReq.setMac(MD5Util.getMD5(stringBuffer.toString())); |
| | | String reqText = JSON.toJSONString(submitReq); |
| | | //加密 |
| | | String encode = Base64.encodeBase64String(reqText.getBytes()); |
| | | System.err.println(encode); |
| | | return encode; |
| | | } |
| | | /** |
| | | * 生成验证码 |
| | | * @return |
| | | */ |
| | | public static String createCode(){ |
| | | return String.valueOf(ThreadLocalRandom.current().nextInt(100000, 999999)); |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils; |
| | | |
| | | import java.time.LocalDateTime; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.Random; |
| | | |
| | | public class OrderCodeUtil { |
| | | |
| | | public static String getOrderCode(String code){ |
| | | LocalDateTime now = LocalDateTime.now(); |
| | | DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); |
| | | String formattedDate = now.format(formatter); |
| | | |
| | | // 四位随机数 |
| | | Random random = new Random(); |
| | | int randomNumber = random.nextInt(9999); // 生成0-9998之间的随机数 |
| | | String formattedRandomNumber = String.format("%04d", randomNumber); // 补齐到4位 |
| | | |
| | | // 拼接日期和随机数 |
| | | return code+formattedDate + formattedRandomNumber; |
| | | } |
| | | public static void main(String[] args) { |
| | | // 测试方法 |
| | | System.out.println(getOrderCode("DH")); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils; |
| | | |
| | | import com.github.pagehelper.PageHelper; |
| | | import com.ruoyi.common.core.utils.sql.SqlUtil; |
| | | import com.ruoyi.common.core.web.page.PageDomain; |
| | | import com.ruoyi.common.core.web.page.TableSupport; |
| | | |
| | | /** |
| | | * 分页工具类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class PageUtils extends PageHelper |
| | | { |
| | | /** |
| | | * 设置请求分页数据 |
| | | */ |
| | | public static void startPage() |
| | | { |
| | | PageDomain pageDomain = TableSupport.buildPageRequest(); |
| | | Integer pageNum = pageDomain.getPageNum(); |
| | | Integer pageSize = pageDomain.getPageSize(); |
| | | String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); |
| | | Boolean reasonable = pageDomain.getReasonable(); |
| | | PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable); |
| | | } |
| | | |
| | | public static void startPage(Integer pageNum,Integer pageSize){ |
| | | PageDomain pageDomain = TableSupport.buildPageRequest(); |
| | | String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); |
| | | Boolean reasonable = pageDomain.getReasonable(); |
| | | PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable); |
| | | } |
| | | |
| | | /** |
| | | * 清理分页的线程变量 |
| | | */ |
| | | public static void clearPage() |
| | | { |
| | | PageHelper.clearPage(); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils; |
| | | |
| | | public class PhoneNumberValidator { |
| | | |
| | | // 定义一个匹配中国手机号的正则表达式 |
| | | private static final String CHINA_PHONE_REGEX = "^1[3-9]\\d{9}$"; |
| | | |
| | | /** |
| | | * 验证给定的字符串是否符合中国手机号的格式. |
| | | * |
| | | * @param phoneNumber 要验证的手机号 |
| | | * @return 如果手机号格式正确返回true,否则返回false |
| | | */ |
| | | public static boolean isValidChinaPhoneNumber(String phoneNumber) { |
| | | if (phoneNumber == null || phoneNumber.isEmpty()) { |
| | | return false; |
| | | } |
| | | return phoneNumber.matches(CHINA_PHONE_REGEX); |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | // 测试几个号码 |
| | | String[] phoneNumbers = {"13800138000", "15912345678", "18612345678", "110", "12345678901", "19912345678"}; |
| | | for (String phoneNumber : phoneNumbers) { |
| | | System.out.println("Phone number: " + phoneNumber + " is valid: " + isValidChinaPhoneNumber(phoneNumber)); |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils; |
| | | |
| | | import java.io.IOException; |
| | | import java.io.UnsupportedEncodingException; |
| | | import java.net.URLDecoder; |
| | | import java.net.URLEncoder; |
| | | import java.util.Collections; |
| | | import java.util.Enumeration; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | import javax.servlet.ServletRequest; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import javax.servlet.http.HttpSession; |
| | | import org.springframework.core.io.buffer.DataBuffer; |
| | | import org.springframework.http.HttpHeaders; |
| | | import org.springframework.http.HttpStatus; |
| | | import org.springframework.http.MediaType; |
| | | import org.springframework.http.server.reactive.ServerHttpResponse; |
| | | import org.springframework.util.LinkedCaseInsensitiveMap; |
| | | import org.springframework.web.context.request.RequestAttributes; |
| | | import org.springframework.web.context.request.RequestContextHolder; |
| | | import org.springframework.web.context.request.ServletRequestAttributes; |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.ruoyi.common.core.constant.Constants; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.common.core.text.Convert; |
| | | import reactor.core.publisher.Mono; |
| | | |
| | | /** |
| | | * 客户端工具类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class ServletUtils |
| | | { |
| | | /** |
| | | * 获取String参数 |
| | | */ |
| | | public static String getParameter(String name) |
| | | { |
| | | return getRequest().getParameter(name); |
| | | } |
| | | |
| | | /** |
| | | * 获取String参数 |
| | | */ |
| | | public static String getParameter(String name, String defaultValue) |
| | | { |
| | | return Convert.toStr(getRequest().getParameter(name), defaultValue); |
| | | } |
| | | |
| | | /** |
| | | * 获取Integer参数 |
| | | */ |
| | | public static Integer getParameterToInt(String name) |
| | | { |
| | | return Convert.toInt(getRequest().getParameter(name)); |
| | | } |
| | | |
| | | /** |
| | | * 获取Integer参数 |
| | | */ |
| | | public static Integer getParameterToInt(String name, Integer defaultValue) |
| | | { |
| | | return Convert.toInt(getRequest().getParameter(name), defaultValue); |
| | | } |
| | | |
| | | /** |
| | | * 获取Boolean参数 |
| | | */ |
| | | public static Boolean getParameterToBool(String name) |
| | | { |
| | | return Convert.toBool(getRequest().getParameter(name)); |
| | | } |
| | | |
| | | /** |
| | | * 获取Boolean参数 |
| | | */ |
| | | public static Boolean getParameterToBool(String name, Boolean defaultValue) |
| | | { |
| | | return Convert.toBool(getRequest().getParameter(name), defaultValue); |
| | | } |
| | | |
| | | /** |
| | | * 获得所有请求参数 |
| | | * |
| | | * @param request 请求对象{@link ServletRequest} |
| | | * @return Map |
| | | */ |
| | | public static Map<String, String[]> getParams(ServletRequest request) |
| | | { |
| | | final Map<String, String[]> map = request.getParameterMap(); |
| | | return Collections.unmodifiableMap(map); |
| | | } |
| | | |
| | | /** |
| | | * 获得所有请求参数 |
| | | * |
| | | * @param request 请求对象{@link ServletRequest} |
| | | * @return Map |
| | | */ |
| | | public static Map<String, String> getParamMap(ServletRequest request) |
| | | { |
| | | Map<String, String> params = new HashMap<>(); |
| | | for (Map.Entry<String, String[]> entry : getParams(request).entrySet()) |
| | | { |
| | | params.put(entry.getKey(), StringUtils.join(entry.getValue(), ",")); |
| | | } |
| | | return params; |
| | | } |
| | | |
| | | /** |
| | | * 获取request |
| | | */ |
| | | public static HttpServletRequest getRequest() |
| | | { |
| | | try |
| | | { |
| | | return getRequestAttributes().getRequest(); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取response |
| | | */ |
| | | public static HttpServletResponse getResponse() |
| | | { |
| | | try |
| | | { |
| | | return getRequestAttributes().getResponse(); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取session |
| | | */ |
| | | public static HttpSession getSession() |
| | | { |
| | | return getRequest().getSession(); |
| | | } |
| | | |
| | | public static ServletRequestAttributes getRequestAttributes() |
| | | { |
| | | try |
| | | { |
| | | RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); |
| | | return (ServletRequestAttributes) attributes; |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | public static String getHeader(HttpServletRequest request, String name) |
| | | { |
| | | String value = request.getHeader(name); |
| | | if (StringUtils.isEmpty(value)) |
| | | { |
| | | return StringUtils.EMPTY; |
| | | } |
| | | return urlDecode(value); |
| | | } |
| | | |
| | | public static Map<String, String> getHeaders(HttpServletRequest request) |
| | | { |
| | | Map<String, String> map = new LinkedCaseInsensitiveMap<>(); |
| | | Enumeration<String> enumeration = request.getHeaderNames(); |
| | | if (enumeration != null) |
| | | { |
| | | while (enumeration.hasMoreElements()) |
| | | { |
| | | String key = enumeration.nextElement(); |
| | | String value = request.getHeader(key); |
| | | map.put(key, value); |
| | | } |
| | | } |
| | | return map; |
| | | } |
| | | |
| | | /** |
| | | * 将字符串渲染到客户端 |
| | | * |
| | | * @param response 渲染对象 |
| | | * @param string 待渲染的字符串 |
| | | */ |
| | | public static void renderString(HttpServletResponse response, String string) |
| | | { |
| | | try |
| | | { |
| | | response.setStatus(200); |
| | | response.setContentType("application/json"); |
| | | response.setCharacterEncoding("utf-8"); |
| | | response.getWriter().print(string); |
| | | } |
| | | catch (IOException e) |
| | | { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 是否是Ajax异步请求 |
| | | * |
| | | * @param request |
| | | */ |
| | | public static boolean isAjaxRequest(HttpServletRequest request) |
| | | { |
| | | String accept = request.getHeader("accept"); |
| | | if (accept != null && accept.contains("application/json")) |
| | | { |
| | | return true; |
| | | } |
| | | |
| | | String xRequestedWith = request.getHeader("X-Requested-With"); |
| | | if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) |
| | | { |
| | | return true; |
| | | } |
| | | |
| | | String uri = request.getRequestURI(); |
| | | if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")) |
| | | { |
| | | return true; |
| | | } |
| | | |
| | | String ajax = request.getParameter("__ajax"); |
| | | return StringUtils.inStringIgnoreCase(ajax, "json", "xml"); |
| | | } |
| | | |
| | | /** |
| | | * 内容编码 |
| | | * |
| | | * @param str 内容 |
| | | * @return 编码后的内容 |
| | | */ |
| | | public static String urlEncode(String str) |
| | | { |
| | | try |
| | | { |
| | | return URLEncoder.encode(str, Constants.UTF8); |
| | | } |
| | | catch (UnsupportedEncodingException e) |
| | | { |
| | | return StringUtils.EMPTY; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 内容解码 |
| | | * |
| | | * @param str 内容 |
| | | * @return 解码后的内容 |
| | | */ |
| | | public static String urlDecode(String str) |
| | | { |
| | | try |
| | | { |
| | | return URLDecoder.decode(str, Constants.UTF8); |
| | | } |
| | | catch (UnsupportedEncodingException e) |
| | | { |
| | | return StringUtils.EMPTY; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 设置webflux模型响应 |
| | | * |
| | | * @param response ServerHttpResponse |
| | | * @param value 响应内容 |
| | | * @return Mono<Void> |
| | | */ |
| | | public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, Object value) |
| | | { |
| | | return webFluxResponseWriter(response, HttpStatus.OK, value, R.FAIL); |
| | | } |
| | | |
| | | /** |
| | | * 设置webflux模型响应 |
| | | * |
| | | * @param response ServerHttpResponse |
| | | * @param code 响应状态码 |
| | | * @param value 响应内容 |
| | | * @return Mono<Void> |
| | | */ |
| | | public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, Object value, int code) |
| | | { |
| | | return webFluxResponseWriter(response, HttpStatus.OK, value, code); |
| | | } |
| | | |
| | | /** |
| | | * 设置webflux模型响应 |
| | | * |
| | | * @param response ServerHttpResponse |
| | | * @param status http状态码 |
| | | * @param code 响应状态码 |
| | | * @param value 响应内容 |
| | | * @return Mono<Void> |
| | | */ |
| | | public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, HttpStatus status, Object value, int code) |
| | | { |
| | | return webFluxResponseWriter(response, MediaType.APPLICATION_JSON_VALUE, status, value, code); |
| | | } |
| | | |
| | | /** |
| | | * 设置webflux模型响应 |
| | | * |
| | | * @param response ServerHttpResponse |
| | | * @param contentType content-type |
| | | * @param status http状态码 |
| | | * @param code 响应状态码 |
| | | * @param value 响应内容 |
| | | * @return Mono<Void> |
| | | */ |
| | | public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, String contentType, HttpStatus status, Object value, int code) |
| | | { |
| | | response.setStatusCode(status); |
| | | response.getHeaders().add(HttpHeaders.CONTENT_TYPE, contentType); |
| | | R<?> result = R.fail(code, value.toString()); |
| | | DataBuffer dataBuffer = response.bufferFactory().wrap(JSON.toJSONString(result).getBytes()); |
| | | return response.writeWith(Mono.just(dataBuffer)); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils; |
| | | |
| | | import org.springframework.aop.framework.AopContext; |
| | | import org.springframework.beans.BeansException; |
| | | import org.springframework.beans.factory.NoSuchBeanDefinitionException; |
| | | import org.springframework.beans.factory.config.BeanFactoryPostProcessor; |
| | | import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * spring工具类 方便在非spring管理环境中获取bean |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @Component |
| | | public final class SpringUtils implements BeanFactoryPostProcessor |
| | | { |
| | | /** Spring应用上下文环境 */ |
| | | private static ConfigurableListableBeanFactory beanFactory; |
| | | |
| | | @Override |
| | | public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException |
| | | { |
| | | SpringUtils.beanFactory = beanFactory; |
| | | } |
| | | |
| | | /** |
| | | * 获取对象 |
| | | * |
| | | * @param name |
| | | * @return Object 一个以所给名字注册的bean的实例 |
| | | * @throws org.springframework.beans.BeansException |
| | | * |
| | | */ |
| | | @SuppressWarnings("unchecked") |
| | | public static <T> T getBean(String name) throws BeansException |
| | | { |
| | | return (T) beanFactory.getBean(name); |
| | | } |
| | | |
| | | /** |
| | | * 获取类型为requiredType的对象 |
| | | * |
| | | * @param clz |
| | | * @return |
| | | * @throws org.springframework.beans.BeansException |
| | | * |
| | | */ |
| | | public static <T> T getBean(Class<T> clz) throws BeansException |
| | | { |
| | | T result = (T) beanFactory.getBean(clz); |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true |
| | | * |
| | | * @param name |
| | | * @return boolean |
| | | */ |
| | | public static boolean containsBean(String name) |
| | | { |
| | | return beanFactory.containsBean(name); |
| | | } |
| | | |
| | | /** |
| | | * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) |
| | | * |
| | | * @param name |
| | | * @return boolean |
| | | * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException |
| | | * |
| | | */ |
| | | public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException |
| | | { |
| | | return beanFactory.isSingleton(name); |
| | | } |
| | | |
| | | /** |
| | | * @param name |
| | | * @return Class 注册对象的类型 |
| | | * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException |
| | | * |
| | | */ |
| | | public static Class<?> getType(String name) throws NoSuchBeanDefinitionException |
| | | { |
| | | return beanFactory.getType(name); |
| | | } |
| | | |
| | | /** |
| | | * 如果给定的bean名字在bean定义中有别名,则返回这些别名 |
| | | * |
| | | * @param name |
| | | * @return |
| | | * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException |
| | | * |
| | | */ |
| | | public static String[] getAliases(String name) throws NoSuchBeanDefinitionException |
| | | { |
| | | return beanFactory.getAliases(name); |
| | | } |
| | | |
| | | /** |
| | | * 获取aop代理对象 |
| | | * |
| | | * @param invoker |
| | | * @return |
| | | */ |
| | | @SuppressWarnings("unchecked") |
| | | public static <T> T getAopProxy(T invoker) |
| | | { |
| | | return (T) AopContext.currentProxy(); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import org.springframework.util.AntPathMatcher; |
| | | import com.ruoyi.common.core.constant.Constants; |
| | | import com.ruoyi.common.core.text.StrFormatter; |
| | | |
| | | /** |
| | | * 字符串工具类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class StringUtils extends org.apache.commons.lang3.StringUtils |
| | | { |
| | | /** 空字符串 */ |
| | | private static final String NULLSTR = ""; |
| | | |
| | | /** 下划线 */ |
| | | private static final char SEPARATOR = '_'; |
| | | |
| | | /** |
| | | * 获取参数不为空值 |
| | | * |
| | | * @param value defaultValue 要判断的value |
| | | * @return value 返回值 |
| | | */ |
| | | public static <T> T nvl(T value, T defaultValue) |
| | | { |
| | | return value != null ? value : defaultValue; |
| | | } |
| | | |
| | | /** |
| | | * * 判断一个Collection是否为空, 包含List,Set,Queue |
| | | * |
| | | * @param coll 要判断的Collection |
| | | * @return true:为空 false:非空 |
| | | */ |
| | | public static boolean isEmpty(Collection<?> coll) |
| | | { |
| | | return isNull(coll) || coll.isEmpty(); |
| | | } |
| | | |
| | | /** |
| | | * * 判断一个Collection是否非空,包含List,Set,Queue |
| | | * |
| | | * @param coll 要判断的Collection |
| | | * @return true:非空 false:空 |
| | | */ |
| | | public static boolean isNotEmpty(Collection<?> coll) |
| | | { |
| | | return !isEmpty(coll); |
| | | } |
| | | |
| | | /** |
| | | * * 判断一个对象数组是否为空 |
| | | * |
| | | * @param objects 要判断的对象数组 |
| | | ** @return true:为空 false:非空 |
| | | */ |
| | | public static boolean isEmpty(Object[] objects) |
| | | { |
| | | return isNull(objects) || (objects.length == 0); |
| | | } |
| | | |
| | | /** |
| | | * * 判断一个对象数组是否非空 |
| | | * |
| | | * @param objects 要判断的对象数组 |
| | | * @return true:非空 false:空 |
| | | */ |
| | | public static boolean isNotEmpty(Object[] objects) |
| | | { |
| | | return !isEmpty(objects); |
| | | } |
| | | |
| | | /** |
| | | * * 判断一个Map是否为空 |
| | | * |
| | | * @param map 要判断的Map |
| | | * @return true:为空 false:非空 |
| | | */ |
| | | public static boolean isEmpty(Map<?, ?> map) |
| | | { |
| | | return isNull(map) || map.isEmpty(); |
| | | } |
| | | |
| | | /** |
| | | * * 判断一个Map是否为空 |
| | | * |
| | | * @param map 要判断的Map |
| | | * @return true:非空 false:空 |
| | | */ |
| | | public static boolean isNotEmpty(Map<?, ?> map) |
| | | { |
| | | return !isEmpty(map); |
| | | } |
| | | |
| | | /** |
| | | * * 判断一个字符串是否为空串 |
| | | * |
| | | * @param str String |
| | | * @return true:为空 false:非空 |
| | | */ |
| | | public static boolean isEmpty(String str) |
| | | { |
| | | return isNull(str) || NULLSTR.equals(str.trim()); |
| | | } |
| | | |
| | | /** |
| | | * * 判断一个字符串是否为非空串 |
| | | * |
| | | * @param str String |
| | | * @return true:非空串 false:空串 |
| | | */ |
| | | public static boolean isNotEmpty(String str) |
| | | { |
| | | return !isEmpty(str); |
| | | } |
| | | |
| | | /** |
| | | * * 判断一个对象是否为空 |
| | | * |
| | | * @param object Object |
| | | * @return true:为空 false:非空 |
| | | */ |
| | | public static boolean isNull(Object object) |
| | | { |
| | | return object == null; |
| | | } |
| | | |
| | | /** |
| | | * * 判断一个对象是否非空 |
| | | * |
| | | * @param object Object |
| | | * @return true:非空 false:空 |
| | | */ |
| | | public static boolean isNotNull(Object object) |
| | | { |
| | | return !isNull(object); |
| | | } |
| | | |
| | | /** |
| | | * * 判断一个对象是否是数组类型(Java基本型别的数组) |
| | | * |
| | | * @param object 对象 |
| | | * @return true:是数组 false:不是数组 |
| | | */ |
| | | public static boolean isArray(Object object) |
| | | { |
| | | return isNotNull(object) && object.getClass().isArray(); |
| | | } |
| | | |
| | | /** |
| | | * 去空格 |
| | | */ |
| | | public static String trim(String str) |
| | | { |
| | | return (str == null ? "" : str.trim()); |
| | | } |
| | | |
| | | /** |
| | | * 截取字符串 |
| | | * |
| | | * @param str 字符串 |
| | | * @param start 开始 |
| | | * @return 结果 |
| | | */ |
| | | public static String substring(final String str, int start) |
| | | { |
| | | if (str == null) |
| | | { |
| | | return NULLSTR; |
| | | } |
| | | |
| | | if (start < 0) |
| | | { |
| | | start = str.length() + start; |
| | | } |
| | | |
| | | if (start < 0) |
| | | { |
| | | start = 0; |
| | | } |
| | | if (start > str.length()) |
| | | { |
| | | return NULLSTR; |
| | | } |
| | | |
| | | return str.substring(start); |
| | | } |
| | | |
| | | /** |
| | | * 截取字符串 |
| | | * |
| | | * @param str 字符串 |
| | | * @param start 开始 |
| | | * @param end 结束 |
| | | * @return 结果 |
| | | */ |
| | | public static String substring(final String str, int start, int end) |
| | | { |
| | | if (str == null) |
| | | { |
| | | return NULLSTR; |
| | | } |
| | | |
| | | if (end < 0) |
| | | { |
| | | end = str.length() + end; |
| | | } |
| | | if (start < 0) |
| | | { |
| | | start = str.length() + start; |
| | | } |
| | | |
| | | if (end > str.length()) |
| | | { |
| | | end = str.length(); |
| | | } |
| | | |
| | | if (start > end) |
| | | { |
| | | return NULLSTR; |
| | | } |
| | | |
| | | if (start < 0) |
| | | { |
| | | start = 0; |
| | | } |
| | | if (end < 0) |
| | | { |
| | | end = 0; |
| | | } |
| | | |
| | | return str.substring(start, end); |
| | | } |
| | | |
| | | /** |
| | | * 判断是否为空,并且不是空白字符 |
| | | * |
| | | * @param str 要判断的value |
| | | * @return 结果 |
| | | */ |
| | | public static boolean hasText(String str) |
| | | { |
| | | return (str != null && !str.isEmpty() && containsText(str)); |
| | | } |
| | | |
| | | private static boolean containsText(CharSequence str) |
| | | { |
| | | int strLen = str.length(); |
| | | for (int i = 0; i < strLen; i++) |
| | | { |
| | | if (!Character.isWhitespace(str.charAt(i))) |
| | | { |
| | | return true; |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | | * 格式化文本, {} 表示占位符<br> |
| | | * 此方法只是简单将占位符 {} 按照顺序替换为参数<br> |
| | | * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br> |
| | | * 例:<br> |
| | | * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br> |
| | | * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br> |
| | | * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br> |
| | | * |
| | | * @param template 文本模板,被替换的部分用 {} 表示 |
| | | * @param params 参数值 |
| | | * @return 格式化后的文本 |
| | | */ |
| | | public static String format(String template, Object... params) |
| | | { |
| | | if (isEmpty(params) || isEmpty(template)) |
| | | { |
| | | return template; |
| | | } |
| | | return StrFormatter.format(template, params); |
| | | } |
| | | |
| | | /** |
| | | * 是否为http(s)://开头 |
| | | * |
| | | * @param link 链接 |
| | | * @return 结果 |
| | | */ |
| | | public static boolean ishttp(String link) |
| | | { |
| | | return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS); |
| | | } |
| | | |
| | | /** |
| | | * 判断给定的collection列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value |
| | | * |
| | | * @param collection 给定的集合 |
| | | * @param array 给定的数组 |
| | | * @return boolean 结果 |
| | | */ |
| | | public static boolean containsAny(Collection<String> collection, String... array) |
| | | { |
| | | if (isEmpty(collection) || isEmpty(array)) |
| | | { |
| | | return false; |
| | | } |
| | | else |
| | | { |
| | | for (String str : array) |
| | | { |
| | | if (collection.contains(str)) |
| | | { |
| | | return true; |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 驼峰转下划线命名 |
| | | */ |
| | | public static String toUnderScoreCase(String str) |
| | | { |
| | | if (str == null) |
| | | { |
| | | return null; |
| | | } |
| | | StringBuilder sb = new StringBuilder(); |
| | | // 前置字符是否大写 |
| | | boolean preCharIsUpperCase = true; |
| | | // 当前字符是否大写 |
| | | boolean curreCharIsUpperCase = true; |
| | | // 下一字符是否大写 |
| | | boolean nexteCharIsUpperCase = true; |
| | | for (int i = 0; i < str.length(); i++) |
| | | { |
| | | char c = str.charAt(i); |
| | | if (i > 0) |
| | | { |
| | | preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); |
| | | } |
| | | else |
| | | { |
| | | preCharIsUpperCase = false; |
| | | } |
| | | |
| | | curreCharIsUpperCase = Character.isUpperCase(c); |
| | | |
| | | if (i < (str.length() - 1)) |
| | | { |
| | | nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); |
| | | } |
| | | |
| | | if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) |
| | | { |
| | | sb.append(SEPARATOR); |
| | | } |
| | | else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) |
| | | { |
| | | sb.append(SEPARATOR); |
| | | } |
| | | sb.append(Character.toLowerCase(c)); |
| | | } |
| | | |
| | | return sb.toString(); |
| | | } |
| | | |
| | | /** |
| | | * 是否包含字符串 |
| | | * |
| | | * @param str 验证字符串 |
| | | * @param strs 字符串组 |
| | | * @return 包含返回true |
| | | */ |
| | | public static boolean inStringIgnoreCase(String str, String... strs) |
| | | { |
| | | if (str != null && strs != null) |
| | | { |
| | | for (String s : strs) |
| | | { |
| | | if (str.equalsIgnoreCase(trim(s))) |
| | | { |
| | | return true; |
| | | } |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | | * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld |
| | | * |
| | | * @param name 转换前的下划线大写方式命名的字符串 |
| | | * @return 转换后的驼峰式命名的字符串 |
| | | */ |
| | | public static String convertToCamelCase(String name) |
| | | { |
| | | StringBuilder result = new StringBuilder(); |
| | | // 快速检查 |
| | | if (name == null || name.isEmpty()) |
| | | { |
| | | // 没必要转换 |
| | | return ""; |
| | | } |
| | | else if (!name.contains("_")) |
| | | { |
| | | // 不含下划线,仅将首字母大写 |
| | | return name.substring(0, 1).toUpperCase() + name.substring(1); |
| | | } |
| | | // 用下划线将原始字符串分割 |
| | | String[] camels = name.split("_"); |
| | | for (String camel : camels) |
| | | { |
| | | // 跳过原始字符串中开头、结尾的下换线或双重下划线 |
| | | if (camel.isEmpty()) |
| | | { |
| | | continue; |
| | | } |
| | | // 首字母大写 |
| | | result.append(camel.substring(0, 1).toUpperCase()); |
| | | result.append(camel.substring(1).toLowerCase()); |
| | | } |
| | | return result.toString(); |
| | | } |
| | | |
| | | /** |
| | | * 驼峰式命名法 |
| | | * 例如:user_name->userName |
| | | */ |
| | | public static String toCamelCase(String s) |
| | | { |
| | | if (s == null) |
| | | { |
| | | return null; |
| | | } |
| | | if (s.indexOf(SEPARATOR) == -1) |
| | | { |
| | | return s; |
| | | } |
| | | s = s.toLowerCase(); |
| | | StringBuilder sb = new StringBuilder(s.length()); |
| | | boolean upperCase = false; |
| | | for (int i = 0; i < s.length(); i++) |
| | | { |
| | | char c = s.charAt(i); |
| | | |
| | | if (c == SEPARATOR) |
| | | { |
| | | upperCase = true; |
| | | } |
| | | else if (upperCase) |
| | | { |
| | | sb.append(Character.toUpperCase(c)); |
| | | upperCase = false; |
| | | } |
| | | else |
| | | { |
| | | sb.append(c); |
| | | } |
| | | } |
| | | return sb.toString(); |
| | | } |
| | | |
| | | /** |
| | | * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 |
| | | * |
| | | * @param str 指定字符串 |
| | | * @param strs 需要检查的字符串数组 |
| | | * @return 是否匹配 |
| | | */ |
| | | public static boolean matches(String str, List<String> strs) |
| | | { |
| | | if (isEmpty(str) || isEmpty(strs)) |
| | | { |
| | | return false; |
| | | } |
| | | for (String pattern : strs) |
| | | { |
| | | if (isMatch(pattern, str)) |
| | | { |
| | | return true; |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | | * 判断url是否与规则配置: |
| | | * ? 表示单个字符; |
| | | * * 表示一层路径内的任意字符串,不可跨层级; |
| | | * ** 表示任意层路径; |
| | | * |
| | | * @param pattern 匹配规则 |
| | | * @param url 需要匹配的url |
| | | * @return |
| | | */ |
| | | public static boolean isMatch(String pattern, String url) |
| | | { |
| | | AntPathMatcher matcher = new AntPathMatcher(); |
| | | return matcher.match(pattern, url); |
| | | } |
| | | |
| | | @SuppressWarnings("unchecked") |
| | | public static <T> T cast(Object obj) |
| | | { |
| | | return (T) obj; |
| | | } |
| | | |
| | | /** |
| | | * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。 |
| | | * |
| | | * @param num 数字对象 |
| | | * @param size 字符串指定长度 |
| | | * @return 返回数字的字符串格式,该字符串为指定长度。 |
| | | */ |
| | | public static final String padl(final Number num, final int size) |
| | | { |
| | | return padl(num.toString(), size, '0'); |
| | | } |
| | | |
| | | /** |
| | | * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。 |
| | | * |
| | | * @param s 原始字符串 |
| | | * @param size 字符串指定长度 |
| | | * @param c 用于补齐的字符 |
| | | * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。 |
| | | */ |
| | | public static final String padl(final String s, final int size, final char c) |
| | | { |
| | | final StringBuilder sb = new StringBuilder(size); |
| | | if (s != null) |
| | | { |
| | | final int len = s.length(); |
| | | if (s.length() <= size) |
| | | { |
| | | for (int i = size - len; i > 0; i--) |
| | | { |
| | | sb.append(c); |
| | | } |
| | | sb.append(s); |
| | | } |
| | | else |
| | | { |
| | | return s.substring(len - size, len); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | for (int i = size; i > 0; i--) |
| | | { |
| | | sb.append(c); |
| | | } |
| | | } |
| | | return sb.toString(); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils; |
| | | |
| | | |
| | | import org.springframework.web.context.request.RequestContextHolder; |
| | | import org.springframework.web.context.request.ServletRequestAttributes; |
| | | |
| | | import javax.servlet.http.Cookie; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import javax.servlet.http.HttpSession; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * web工具类 |
| | | * |
| | | * @author liheng |
| | | */ |
| | | public final class WebUtils extends org.springframework.web.util.WebUtils { |
| | | |
| | | /** |
| | | * 当前请求 |
| | | */ |
| | | public static HttpServletRequest request() { |
| | | return contextHolder() == null ? null : contextHolder().getRequest(); |
| | | } |
| | | |
| | | /** |
| | | * 当前响应 |
| | | */ |
| | | public static HttpServletResponse response() { |
| | | return contextHolder() == null ? null : contextHolder().getResponse(); |
| | | } |
| | | |
| | | /** |
| | | * 当前session |
| | | */ |
| | | public static HttpSession session() { |
| | | return request() == null ? null : request().getSession(); |
| | | } |
| | | |
| | | /** |
| | | * 当前ServletRequest |
| | | */ |
| | | public static ServletRequestAttributes contextHolder() { |
| | | return (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); |
| | | } |
| | | |
| | | /** |
| | | * 判断请求是否为 AJAX |
| | | * |
| | | * @param request 当前请求 |
| | | */ |
| | | public static boolean isAjax(HttpServletRequest request) { |
| | | return "XMLHttpRequest".equals(request.getHeader("X-Requested-With")); |
| | | } |
| | | |
| | | /** |
| | | * 获取操作系统,浏览器及浏览器版本信息 |
| | | * |
| | | * @param request |
| | | * @return |
| | | */ |
| | | public static Map<String, String> getOsAndBrowserInfo(HttpServletRequest request) { |
| | | Map<String, String> map = new HashMap<>(2); |
| | | String browserDetails = request.getHeader("User-Agent"); |
| | | String userAgent = browserDetails; |
| | | String user = userAgent.toLowerCase(); |
| | | |
| | | String os = ""; |
| | | String browser = ""; |
| | | //=================OS Info======================= |
| | | if (userAgent.toLowerCase().contains("windows")) { |
| | | os = "Windows"; |
| | | } else if (userAgent.toLowerCase().contains("mac")) { |
| | | os = "Mac"; |
| | | } else if (userAgent.toLowerCase().contains("x11")) { |
| | | os = "Unix"; |
| | | } else if (userAgent.toLowerCase().contains("android")) { |
| | | os = "Android"; |
| | | } else if (userAgent.toLowerCase().contains("iphone")) { |
| | | os = "IPhone"; |
| | | } else { |
| | | os = "UnKnown, More-Info: " + userAgent; |
| | | } |
| | | //===============Browser=========================== |
| | | if (user.contains("edge")) { |
| | | browser = (userAgent.substring(userAgent.indexOf("Edge")).split(" ")[0]).replace("/", "-"); |
| | | } else if (user.contains("msie")) { |
| | | String substring = userAgent.substring(userAgent.indexOf("MSIE")).split(";")[0]; |
| | | browser = substring.split(" ")[0].replace("MSIE", "IE") + "-" + substring.split(" ")[1]; |
| | | } else if (user.contains("safari") && user.contains("version")) { |
| | | browser = (userAgent.substring(userAgent.indexOf("Safari")).split(" ")[0]).split("/")[0] |
| | | + "-" + (userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1]; |
| | | } else if (user.contains("opr") || user.contains("opera")) { |
| | | if (user.contains("opera")) { |
| | | browser = (userAgent.substring(userAgent.indexOf("Opera")).split(" ")[0]).split("/")[0] |
| | | + "-" + (userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1]; |
| | | } else if (user.contains("opr")) { |
| | | browser = ((userAgent.substring(userAgent.indexOf("OPR")).split(" ")[0]).replace("/", "-")) |
| | | .replace("OPR", "Opera"); |
| | | } |
| | | } else if (user.contains("chrome")) { |
| | | browser = (userAgent.substring(userAgent.indexOf("Chrome")).split(" ")[0]).replace("/", "-"); |
| | | } else if ((user.contains("mozilla/7.0")) || (user.contains("netscape6")) || |
| | | (user.contains("mozilla/4.7")) || (user.contains("mozilla/4.78")) || |
| | | (user.contains("mozilla/4.08")) || (user.contains("mozilla/3"))) { |
| | | browser = "Netscape-?"; |
| | | } else if (user.contains("firefox")) { |
| | | browser = (userAgent.substring(userAgent.indexOf("Firefox")).split(" ")[0]).replace("/", "-"); |
| | | } else if (user.contains("rv")) { |
| | | String IEVersion = (userAgent.substring(userAgent.indexOf("rv")).split(" ")[0]).replace("rv:", "-"); |
| | | browser = "IE" + IEVersion.substring(0, IEVersion.length() - 1); |
| | | } else { |
| | | browser = "UnKnown, More-Info: " + userAgent; |
| | | } |
| | | map.put("os", os); |
| | | map.put("browser", browser); |
| | | return map; |
| | | } |
| | | |
| | | /** |
| | | * 读取cookie |
| | | * |
| | | * @param name cookie name |
| | | * @return cookie value |
| | | */ |
| | | public String getCookieVal(String name) { |
| | | return getCookieVal(request(), name); |
| | | } |
| | | |
| | | /** |
| | | * 读取cookie |
| | | * |
| | | * @param request HttpServletRequest |
| | | * @param name cookie name |
| | | * @return cookie value |
| | | */ |
| | | public String getCookieVal(HttpServletRequest request, String name) { |
| | | Cookie cookie = getCookie(request, name); |
| | | return cookie != null ? cookie.getValue() : null; |
| | | } |
| | | |
| | | /** |
| | | * 清除 某个指定的cookie |
| | | * |
| | | * @param response HttpServletResponse |
| | | * @param key cookie key |
| | | */ |
| | | public void removeCookie(HttpServletResponse response, String key) { |
| | | setCookie(response, key, null, 0); |
| | | } |
| | | |
| | | /** |
| | | * 设置cookie |
| | | * |
| | | * @param response HttpServletResponse |
| | | * @param name cookie name |
| | | * @param value cookie value |
| | | * @param maxAgeInSeconds maxage |
| | | */ |
| | | public void setCookie(HttpServletResponse response, String name, String value, int maxAgeInSeconds) { |
| | | Cookie cookie = new Cookie(name, value); |
| | | cookie.setPath("/"); |
| | | cookie.setMaxAge(maxAgeInSeconds); |
| | | //cookie.setHttpOnly(true); |
| | | response.addCookie(cookie); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils.bean; |
| | | |
| | | import java.lang.reflect.Method; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.regex.Matcher; |
| | | import java.util.regex.Pattern; |
| | | |
| | | /** |
| | | * Bean 工具类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class BeanUtils extends org.springframework.beans.BeanUtils |
| | | { |
| | | /** Bean方法名中属性名开始的下标 */ |
| | | private static final int BEAN_METHOD_PROP_INDEX = 3; |
| | | |
| | | /** * 匹配getter方法的正则表达式 */ |
| | | private static final Pattern GET_PATTERN = Pattern.compile("get(\\p{javaUpperCase}\\w*)"); |
| | | |
| | | /** * 匹配setter方法的正则表达式 */ |
| | | private static final Pattern SET_PATTERN = Pattern.compile("set(\\p{javaUpperCase}\\w*)"); |
| | | |
| | | /** |
| | | * Bean属性复制工具方法。 |
| | | * |
| | | * @param dest 目标对象 |
| | | * @param src 源对象 |
| | | */ |
| | | public static void copyBeanProp(Object dest, Object src) |
| | | { |
| | | try |
| | | { |
| | | copyProperties(src, dest); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取对象的setter方法。 |
| | | * |
| | | * @param obj 对象 |
| | | * @return 对象的setter方法列表 |
| | | */ |
| | | public static List<Method> getSetterMethods(Object obj) |
| | | { |
| | | // setter方法列表 |
| | | List<Method> setterMethods = new ArrayList<Method>(); |
| | | |
| | | // 获取所有方法 |
| | | Method[] methods = obj.getClass().getMethods(); |
| | | |
| | | // 查找setter方法 |
| | | |
| | | for (Method method : methods) |
| | | { |
| | | Matcher m = SET_PATTERN.matcher(method.getName()); |
| | | if (m.matches() && (method.getParameterTypes().length == 1)) |
| | | { |
| | | setterMethods.add(method); |
| | | } |
| | | } |
| | | // 返回setter方法列表 |
| | | return setterMethods; |
| | | } |
| | | |
| | | /** |
| | | * 获取对象的getter方法。 |
| | | * |
| | | * @param obj 对象 |
| | | * @return 对象的getter方法列表 |
| | | */ |
| | | |
| | | public static List<Method> getGetterMethods(Object obj) |
| | | { |
| | | // getter方法列表 |
| | | List<Method> getterMethods = new ArrayList<Method>(); |
| | | // 获取所有方法 |
| | | Method[] methods = obj.getClass().getMethods(); |
| | | // 查找getter方法 |
| | | for (Method method : methods) |
| | | { |
| | | Matcher m = GET_PATTERN.matcher(method.getName()); |
| | | if (m.matches() && (method.getParameterTypes().length == 0)) |
| | | { |
| | | getterMethods.add(method); |
| | | } |
| | | } |
| | | // 返回getter方法列表 |
| | | return getterMethods; |
| | | } |
| | | |
| | | /** |
| | | * 检查Bean方法名中的属性名是否相等。<br> |
| | | * 如getName()和setName()属性名一样,getName()和setAge()属性名不一样。 |
| | | * |
| | | * @param m1 方法名1 |
| | | * @param m2 方法名2 |
| | | * @return 属性名一样返回true,否则返回false |
| | | */ |
| | | |
| | | public static boolean isMethodPropEquals(String m1, String m2) |
| | | { |
| | | return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX)); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils.bean; |
| | | |
| | | import java.util.Set; |
| | | import javax.validation.ConstraintViolation; |
| | | import javax.validation.ConstraintViolationException; |
| | | import javax.validation.Validator; |
| | | |
| | | /** |
| | | * bean对象属性验证 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class BeanValidators |
| | | { |
| | | public static void validateWithException(Validator validator, Object object, Class<?>... groups) |
| | | throws ConstraintViolationException |
| | | { |
| | | Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups); |
| | | if (!constraintViolations.isEmpty()) |
| | | { |
| | | throw new ConstraintViolationException(constraintViolations); |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils.file; |
| | | |
| | | import java.io.File; |
| | | import java.util.Objects; |
| | | import org.apache.commons.io.FilenameUtils; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | /** |
| | | * 文件类型工具类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class FileTypeUtils |
| | | { |
| | | /** |
| | | * 获取文件类型 |
| | | * <p> |
| | | * 例如: ruoyi.txt, 返回: txt |
| | | * |
| | | * @param file 文件名 |
| | | * @return 后缀(不含".") |
| | | */ |
| | | public static String getFileType(File file) |
| | | { |
| | | if (null == file) |
| | | { |
| | | return StringUtils.EMPTY; |
| | | } |
| | | return getFileType(file.getName()); |
| | | } |
| | | |
| | | /** |
| | | * 获取文件类型 |
| | | * <p> |
| | | * 例如: ruoyi.txt, 返回: txt |
| | | * |
| | | * @param fileName 文件名 |
| | | * @return 后缀(不含".") |
| | | */ |
| | | public static String getFileType(String fileName) |
| | | { |
| | | int separatorIndex = fileName.lastIndexOf("."); |
| | | if (separatorIndex < 0) |
| | | { |
| | | return ""; |
| | | } |
| | | return fileName.substring(separatorIndex + 1).toLowerCase(); |
| | | } |
| | | |
| | | /** |
| | | * 获取文件名的后缀 |
| | | * |
| | | * @param file 表单文件 |
| | | * @return 后缀名 |
| | | */ |
| | | public static final String getExtension(MultipartFile file) |
| | | { |
| | | String extension = FilenameUtils.getExtension(file.getOriginalFilename()); |
| | | if (StringUtils.isEmpty(extension)) |
| | | { |
| | | extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType())); |
| | | } |
| | | return extension; |
| | | } |
| | | |
| | | /** |
| | | * 获取文件类型 |
| | | * |
| | | * @param photoByte 文件字节码 |
| | | * @return 后缀(不含".") |
| | | */ |
| | | public static String getFileExtendName(byte[] photoByte) |
| | | { |
| | | String strFileExtendName = "JPG"; |
| | | if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) |
| | | && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) |
| | | { |
| | | strFileExtendName = "GIF"; |
| | | } |
| | | else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) |
| | | { |
| | | strFileExtendName = "JPG"; |
| | | } |
| | | else if ((photoByte[0] == 66) && (photoByte[1] == 77)) |
| | | { |
| | | strFileExtendName = "BMP"; |
| | | } |
| | | else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) |
| | | { |
| | | strFileExtendName = "PNG"; |
| | | } |
| | | return strFileExtendName; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils.file; |
| | | |
| | | import java.io.File; |
| | | import java.io.FileInputStream; |
| | | import java.io.FileNotFoundException; |
| | | import java.io.IOException; |
| | | import java.io.OutputStream; |
| | | import java.io.UnsupportedEncodingException; |
| | | import java.net.URLEncoder; |
| | | import java.nio.charset.StandardCharsets; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import org.apache.commons.lang3.ArrayUtils; |
| | | import com.ruoyi.common.core.utils.StringUtils; |
| | | |
| | | /** |
| | | * 文件处理工具类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class FileUtils |
| | | { |
| | | /** 字符常量:斜杠 {@code '/'} */ |
| | | public static final char SLASH = '/'; |
| | | |
| | | /** 字符常量:反斜杠 {@code '\\'} */ |
| | | public static final char BACKSLASH = '\\'; |
| | | |
| | | public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+"; |
| | | |
| | | /** |
| | | * 输出指定文件的byte数组 |
| | | * |
| | | * @param filePath 文件路径 |
| | | * @param os 输出流 |
| | | * @return |
| | | */ |
| | | public static void writeBytes(String filePath, OutputStream os) throws IOException |
| | | { |
| | | FileInputStream fis = null; |
| | | try |
| | | { |
| | | File file = new File(filePath); |
| | | if (!file.exists()) |
| | | { |
| | | throw new FileNotFoundException(filePath); |
| | | } |
| | | fis = new FileInputStream(file); |
| | | byte[] b = new byte[1024]; |
| | | int length; |
| | | while ((length = fis.read(b)) > 0) |
| | | { |
| | | os.write(b, 0, length); |
| | | } |
| | | } |
| | | catch (IOException e) |
| | | { |
| | | throw e; |
| | | } |
| | | finally |
| | | { |
| | | if (os != null) |
| | | { |
| | | try |
| | | { |
| | | os.close(); |
| | | } |
| | | catch (IOException e1) |
| | | { |
| | | e1.printStackTrace(); |
| | | } |
| | | } |
| | | if (fis != null) |
| | | { |
| | | try |
| | | { |
| | | fis.close(); |
| | | } |
| | | catch (IOException e1) |
| | | { |
| | | e1.printStackTrace(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 删除文件 |
| | | * |
| | | * @param filePath 文件 |
| | | * @return |
| | | */ |
| | | public static boolean deleteFile(String filePath) |
| | | { |
| | | boolean flag = false; |
| | | File file = new File(filePath); |
| | | // 路径为文件且不为空则进行删除 |
| | | if (file.isFile() && file.exists()) |
| | | { |
| | | flag = file.delete(); |
| | | } |
| | | return flag; |
| | | } |
| | | |
| | | /** |
| | | * 文件名称验证 |
| | | * |
| | | * @param filename 文件名称 |
| | | * @return true 正常 false 非法 |
| | | */ |
| | | public static boolean isValidFilename(String filename) |
| | | { |
| | | return filename.matches(FILENAME_PATTERN); |
| | | } |
| | | |
| | | /** |
| | | * 检查文件是否可下载 |
| | | * |
| | | * @param resource 需要下载的文件 |
| | | * @return true 正常 false 非法 |
| | | */ |
| | | public static boolean checkAllowDownload(String resource) |
| | | { |
| | | // 禁止目录上跳级别 |
| | | if (StringUtils.contains(resource, "..")) |
| | | { |
| | | return false; |
| | | } |
| | | // 判断是否在允许下载的文件规则内 |
| | | return ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(resource)); |
| | | } |
| | | |
| | | /** |
| | | * 下载文件名重新编码 |
| | | * |
| | | * @param request 请求对象 |
| | | * @param fileName 文件名 |
| | | * @return 编码后的文件名 |
| | | */ |
| | | public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException |
| | | { |
| | | final String agent = request.getHeader("USER-AGENT"); |
| | | String filename = fileName; |
| | | if (agent.contains("MSIE")) |
| | | { |
| | | // IE浏览器 |
| | | filename = URLEncoder.encode(filename, "utf-8"); |
| | | filename = filename.replace("+", " "); |
| | | } |
| | | else if (agent.contains("Firefox")) |
| | | { |
| | | // 火狐浏览器 |
| | | filename = new String(fileName.getBytes(), "ISO8859-1"); |
| | | } |
| | | else if (agent.contains("Chrome")) |
| | | { |
| | | // google浏览器 |
| | | filename = URLEncoder.encode(filename, "utf-8"); |
| | | } |
| | | else |
| | | { |
| | | // 其它浏览器 |
| | | filename = URLEncoder.encode(filename, "utf-8"); |
| | | } |
| | | return filename; |
| | | } |
| | | |
| | | /** |
| | | * 返回文件名 |
| | | * |
| | | * @param filePath 文件 |
| | | * @return 文件名 |
| | | */ |
| | | public static String getName(String filePath) |
| | | { |
| | | if (null == filePath) |
| | | { |
| | | return null; |
| | | } |
| | | int len = filePath.length(); |
| | | if (0 == len) |
| | | { |
| | | return filePath; |
| | | } |
| | | if (isFileSeparator(filePath.charAt(len - 1))) |
| | | { |
| | | // 以分隔符结尾的去掉结尾分隔符 |
| | | len--; |
| | | } |
| | | |
| | | int begin = 0; |
| | | char c; |
| | | for (int i = len - 1; i > -1; i--) |
| | | { |
| | | c = filePath.charAt(i); |
| | | if (isFileSeparator(c)) |
| | | { |
| | | // 查找最后一个路径分隔符(/或者\) |
| | | begin = i + 1; |
| | | break; |
| | | } |
| | | } |
| | | |
| | | return filePath.substring(begin, len); |
| | | } |
| | | |
| | | /** |
| | | * 是否为Windows或者Linux(Unix)文件分隔符<br> |
| | | * Windows平台下分隔符为\,Linux(Unix)为/ |
| | | * |
| | | * @param c 字符 |
| | | * @return 是否为Windows或者Linux(Unix)文件分隔符 |
| | | */ |
| | | public static boolean isFileSeparator(char c) |
| | | { |
| | | return SLASH == c || BACKSLASH == c; |
| | | } |
| | | |
| | | /** |
| | | * 下载文件名重新编码 |
| | | * |
| | | * @param response 响应对象 |
| | | * @param realFileName 真实文件名 |
| | | * @return |
| | | */ |
| | | public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException |
| | | { |
| | | String percentEncodedFileName = percentEncode(realFileName); |
| | | |
| | | StringBuilder contentDispositionValue = new StringBuilder(); |
| | | contentDispositionValue.append("attachment; filename=") |
| | | .append(percentEncodedFileName) |
| | | .append(";") |
| | | .append("filename*=") |
| | | .append("utf-8''") |
| | | .append(percentEncodedFileName); |
| | | |
| | | response.setHeader("Content-disposition", contentDispositionValue.toString()); |
| | | response.setHeader("download-filename", percentEncodedFileName); |
| | | } |
| | | |
| | | /** |
| | | * 百分号编码工具方法 |
| | | * |
| | | * @param s 需要百分号编码的字符串 |
| | | * @return 百分号编码后的字符串 |
| | | */ |
| | | public static String percentEncode(String s) throws UnsupportedEncodingException |
| | | { |
| | | String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString()); |
| | | return encode.replaceAll("\\+", "%20"); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils.file; |
| | | |
| | | import java.io.ByteArrayInputStream; |
| | | import java.io.InputStream; |
| | | import java.net.URL; |
| | | import java.net.URLConnection; |
| | | import java.util.Arrays; |
| | | import org.apache.poi.util.IOUtils; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | |
| | | /** |
| | | * 图片处理工具类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class ImageUtils |
| | | { |
| | | private static final Logger log = LoggerFactory.getLogger(ImageUtils.class); |
| | | |
| | | public static byte[] getImage(String imagePath) |
| | | { |
| | | InputStream is = getFile(imagePath); |
| | | try |
| | | { |
| | | return IOUtils.toByteArray(is); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | log.error("图片加载异常 {}", e); |
| | | return null; |
| | | } |
| | | finally |
| | | { |
| | | IOUtils.closeQuietly(is); |
| | | } |
| | | } |
| | | |
| | | public static InputStream getFile(String imagePath) |
| | | { |
| | | try |
| | | { |
| | | byte[] result = readFile(imagePath); |
| | | result = Arrays.copyOf(result, result.length); |
| | | return new ByteArrayInputStream(result); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | log.error("获取图片异常 {}", e); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * 读取文件为字节数据 |
| | | * |
| | | * @param url 地址 |
| | | * @return 字节数据 |
| | | */ |
| | | public static byte[] readFile(String url) |
| | | { |
| | | InputStream in = null; |
| | | try |
| | | { |
| | | // 网络地址 |
| | | URL urlObj = new URL(url); |
| | | URLConnection urlConnection = urlObj.openConnection(); |
| | | urlConnection.setConnectTimeout(30 * 1000); |
| | | urlConnection.setReadTimeout(60 * 1000); |
| | | urlConnection.setDoInput(true); |
| | | in = urlConnection.getInputStream(); |
| | | return IOUtils.toByteArray(in); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | log.error("访问文件异常 {}", e); |
| | | return null; |
| | | } |
| | | finally |
| | | { |
| | | IOUtils.closeQuietly(in); |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils.file; |
| | | |
| | | /** |
| | | * 媒体类型工具类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class MimeTypeUtils |
| | | { |
| | | public static final String IMAGE_PNG = "image/png"; |
| | | |
| | | public static final String IMAGE_JPG = "image/jpg"; |
| | | |
| | | public static final String IMAGE_JPEG = "image/jpeg"; |
| | | |
| | | public static final String IMAGE_BMP = "image/bmp"; |
| | | |
| | | public static final String IMAGE_GIF = "image/gif"; |
| | | |
| | | public static final String[] IMAGE_EXTENSION = { "bmp", "gif", "jpg", "jpeg", "png" }; |
| | | |
| | | public static final String[] FLASH_EXTENSION = { "swf", "flv" }; |
| | | |
| | | public static final String[] MEDIA_EXTENSION = { "swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg", |
| | | "asf", "rm", "rmvb" }; |
| | | |
| | | public static final String[] VIDEO_EXTENSION = { "mp4", "avi", "rmvb" }; |
| | | |
| | | public static final String[] DEFAULT_ALLOWED_EXTENSION = { |
| | | // 图片 |
| | | "bmp", "gif", "jpg", "jpeg", "png", |
| | | // word excel powerpoint |
| | | "doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt", |
| | | // 压缩文件 |
| | | "rar", "zip", "gz", "bz2", |
| | | // 视频格式 |
| | | "mp4", "avi", "rmvb", |
| | | // pdf |
| | | "pdf" }; |
| | | |
| | | public static String getExtension(String prefix) |
| | | { |
| | | switch (prefix) |
| | | { |
| | | case IMAGE_PNG: |
| | | return "png"; |
| | | case IMAGE_JPG: |
| | | return "jpg"; |
| | | case IMAGE_JPEG: |
| | | return "jpeg"; |
| | | case IMAGE_BMP: |
| | | return "bmp"; |
| | | case IMAGE_GIF: |
| | | return "gif"; |
| | | default: |
| | | return ""; |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils.html; |
| | | |
| | | import com.ruoyi.common.core.utils.StringUtils; |
| | | |
| | | /** |
| | | * 转义和反转义工具类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class EscapeUtil |
| | | { |
| | | public static final String RE_HTML_MARK = "(<[^<]*?>)|(<[\\s]*?/[^<]*?>)|(<[^<]*?/[\\s]*?>)"; |
| | | |
| | | private static final char[][] TEXT = new char[64][]; |
| | | |
| | | static |
| | | { |
| | | for (int i = 0; i < 64; i++) |
| | | { |
| | | TEXT[i] = new char[] { (char) i }; |
| | | } |
| | | |
| | | // special HTML characters |
| | | TEXT['\''] = "'".toCharArray(); // 单引号 |
| | | TEXT['"'] = """.toCharArray(); // 双引号 |
| | | TEXT['&'] = "&".toCharArray(); // &符 |
| | | TEXT['<'] = "<".toCharArray(); // 小于号 |
| | | TEXT['>'] = ">".toCharArray(); // 大于号 |
| | | } |
| | | |
| | | /** |
| | | * 转义文本中的HTML字符为安全的字符 |
| | | * |
| | | * @param text 被转义的文本 |
| | | * @return 转义后的文本 |
| | | */ |
| | | public static String escape(String text) |
| | | { |
| | | return encode(text); |
| | | } |
| | | |
| | | /** |
| | | * 还原被转义的HTML特殊字符 |
| | | * |
| | | * @param content 包含转义符的HTML内容 |
| | | * @return 转换后的字符串 |
| | | */ |
| | | public static String unescape(String content) |
| | | { |
| | | return decode(content); |
| | | } |
| | | |
| | | /** |
| | | * 清除所有HTML标签,但是不删除标签内的内容 |
| | | * |
| | | * @param content 文本 |
| | | * @return 清除标签后的文本 |
| | | */ |
| | | public static String clean(String content) |
| | | { |
| | | return new HTMLFilter().filter(content); |
| | | } |
| | | |
| | | /** |
| | | * Escape编码 |
| | | * |
| | | * @param text 被编码的文本 |
| | | * @return 编码后的字符 |
| | | */ |
| | | private static String encode(String text) |
| | | { |
| | | if (StringUtils.isEmpty(text)) |
| | | { |
| | | return StringUtils.EMPTY; |
| | | } |
| | | |
| | | final StringBuilder tmp = new StringBuilder(text.length() * 6); |
| | | char c; |
| | | for (int i = 0; i < text.length(); i++) |
| | | { |
| | | c = text.charAt(i); |
| | | if (c < 256) |
| | | { |
| | | tmp.append("%"); |
| | | if (c < 16) |
| | | { |
| | | tmp.append("0"); |
| | | } |
| | | tmp.append(Integer.toString(c, 16)); |
| | | } |
| | | else |
| | | { |
| | | tmp.append("%u"); |
| | | if (c <= 0xfff) |
| | | { |
| | | // issue#I49JU8@Gitee |
| | | tmp.append("0"); |
| | | } |
| | | tmp.append(Integer.toString(c, 16)); |
| | | } |
| | | } |
| | | return tmp.toString(); |
| | | } |
| | | |
| | | /** |
| | | * Escape解码 |
| | | * |
| | | * @param content 被转义的内容 |
| | | * @return 解码后的字符串 |
| | | */ |
| | | public static String decode(String content) |
| | | { |
| | | if (StringUtils.isEmpty(content)) |
| | | { |
| | | return content; |
| | | } |
| | | |
| | | StringBuilder tmp = new StringBuilder(content.length()); |
| | | int lastPos = 0, pos = 0; |
| | | char ch; |
| | | while (lastPos < content.length()) |
| | | { |
| | | pos = content.indexOf("%", lastPos); |
| | | if (pos == lastPos) |
| | | { |
| | | if (content.charAt(pos + 1) == 'u') |
| | | { |
| | | ch = (char) Integer.parseInt(content.substring(pos + 2, pos + 6), 16); |
| | | tmp.append(ch); |
| | | lastPos = pos + 6; |
| | | } |
| | | else |
| | | { |
| | | ch = (char) Integer.parseInt(content.substring(pos + 1, pos + 3), 16); |
| | | tmp.append(ch); |
| | | lastPos = pos + 3; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | if (pos == -1) |
| | | { |
| | | tmp.append(content.substring(lastPos)); |
| | | lastPos = content.length(); |
| | | } |
| | | else |
| | | { |
| | | tmp.append(content.substring(lastPos, pos)); |
| | | lastPos = pos; |
| | | } |
| | | } |
| | | } |
| | | return tmp.toString(); |
| | | } |
| | | |
| | | public static void main(String[] args) |
| | | { |
| | | String html = "<script>alert(1);</script>"; |
| | | String escape = EscapeUtil.escape(html); |
| | | // String html = "<scr<script>ipt>alert(\"XSS\")</scr<script>ipt>"; |
| | | // String html = "<123"; |
| | | // String html = "123>"; |
| | | System.out.println("clean: " + EscapeUtil.clean(html)); |
| | | System.out.println("escape: " + escape); |
| | | System.out.println("unescape: " + EscapeUtil.unescape(escape)); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils.html; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Collections; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | import java.util.concurrent.ConcurrentMap; |
| | | import java.util.regex.Matcher; |
| | | import java.util.regex.Pattern; |
| | | |
| | | /** |
| | | * HTML过滤器,用于去除XSS漏洞隐患。 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public final class HTMLFilter |
| | | { |
| | | /** |
| | | * regex flag union representing /si modifiers in php |
| | | **/ |
| | | private static final int REGEX_FLAGS_SI = Pattern.CASE_INSENSITIVE | Pattern.DOTALL; |
| | | private static final Pattern P_COMMENTS = Pattern.compile("<!--(.*?)-->", Pattern.DOTALL); |
| | | private static final Pattern P_COMMENT = Pattern.compile("^!--(.*)--$", REGEX_FLAGS_SI); |
| | | private static final Pattern P_TAGS = Pattern.compile("<(.*?)>", Pattern.DOTALL); |
| | | private static final Pattern P_END_TAG = Pattern.compile("^/([a-z0-9]+)", REGEX_FLAGS_SI); |
| | | private static final Pattern P_START_TAG = Pattern.compile("^([a-z0-9]+)(.*?)(/?)$", REGEX_FLAGS_SI); |
| | | private static final Pattern P_QUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)=([\"'])(.*?)\\2", REGEX_FLAGS_SI); |
| | | private static final Pattern P_UNQUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)(=)([^\"\\s']+)", REGEX_FLAGS_SI); |
| | | private static final Pattern P_PROTOCOL = Pattern.compile("^([^:]+):", REGEX_FLAGS_SI); |
| | | private static final Pattern P_ENTITY = Pattern.compile("&#(\\d+);?"); |
| | | private static final Pattern P_ENTITY_UNICODE = Pattern.compile("&#x([0-9a-f]+);?"); |
| | | private static final Pattern P_ENCODE = Pattern.compile("%([0-9a-f]{2});?"); |
| | | private static final Pattern P_VALID_ENTITIES = Pattern.compile("&([^&;]*)(?=(;|&|$))"); |
| | | private static final Pattern P_VALID_QUOTES = Pattern.compile("(>|^)([^<]+?)(<|$)", Pattern.DOTALL); |
| | | private static final Pattern P_END_ARROW = Pattern.compile("^>"); |
| | | private static final Pattern P_BODY_TO_END = Pattern.compile("<([^>]*?)(?=<|$)"); |
| | | private static final Pattern P_XML_CONTENT = Pattern.compile("(^|>)([^<]*?)(?=>)"); |
| | | private static final Pattern P_STRAY_LEFT_ARROW = Pattern.compile("<([^>]*?)(?=<|$)"); |
| | | private static final Pattern P_STRAY_RIGHT_ARROW = Pattern.compile("(^|>)([^<]*?)(?=>)"); |
| | | private static final Pattern P_AMP = Pattern.compile("&"); |
| | | private static final Pattern P_QUOTE = Pattern.compile("\""); |
| | | private static final Pattern P_LEFT_ARROW = Pattern.compile("<"); |
| | | private static final Pattern P_RIGHT_ARROW = Pattern.compile(">"); |
| | | private static final Pattern P_BOTH_ARROWS = Pattern.compile("<>"); |
| | | |
| | | // @xxx could grow large... maybe use sesat's ReferenceMap |
| | | private static final ConcurrentMap<String, Pattern> P_REMOVE_PAIR_BLANKS = new ConcurrentHashMap<>(); |
| | | private static final ConcurrentMap<String, Pattern> P_REMOVE_SELF_BLANKS = new ConcurrentHashMap<>(); |
| | | |
| | | /** |
| | | * set of allowed html elements, along with allowed attributes for each element |
| | | **/ |
| | | private final Map<String, List<String>> vAllowed; |
| | | /** |
| | | * counts of open tags for each (allowable) html element |
| | | **/ |
| | | private final Map<String, Integer> vTagCounts = new HashMap<>(); |
| | | |
| | | /** |
| | | * html elements which must always be self-closing (e.g. "<img />") |
| | | **/ |
| | | private final String[] vSelfClosingTags; |
| | | /** |
| | | * html elements which must always have separate opening and closing tags (e.g. "<b></b>") |
| | | **/ |
| | | private final String[] vNeedClosingTags; |
| | | /** |
| | | * set of disallowed html elements |
| | | **/ |
| | | private final String[] vDisallowed; |
| | | /** |
| | | * attributes which should be checked for valid protocols |
| | | **/ |
| | | private final String[] vProtocolAtts; |
| | | /** |
| | | * allowed protocols |
| | | **/ |
| | | private final String[] vAllowedProtocols; |
| | | /** |
| | | * tags which should be removed if they contain no content (e.g. "<b></b>" or "<b />") |
| | | **/ |
| | | private final String[] vRemoveBlanks; |
| | | /** |
| | | * entities allowed within html markup |
| | | **/ |
| | | private final String[] vAllowedEntities; |
| | | /** |
| | | * flag determining whether comments are allowed in input String. |
| | | */ |
| | | private final boolean stripComment; |
| | | private final boolean encodeQuotes; |
| | | /** |
| | | * flag determining whether to try to make tags when presented with "unbalanced" angle brackets (e.g. "<b text </b>" |
| | | * becomes "<b> text </b>"). If set to false, unbalanced angle brackets will be html escaped. |
| | | */ |
| | | private final boolean alwaysMakeTags; |
| | | |
| | | /** |
| | | * Default constructor. |
| | | */ |
| | | public HTMLFilter() |
| | | { |
| | | vAllowed = new HashMap<>(); |
| | | |
| | | final ArrayList<String> a_atts = new ArrayList<>(); |
| | | a_atts.add("href"); |
| | | a_atts.add("target"); |
| | | vAllowed.put("a", a_atts); |
| | | |
| | | final ArrayList<String> img_atts = new ArrayList<>(); |
| | | img_atts.add("src"); |
| | | img_atts.add("width"); |
| | | img_atts.add("height"); |
| | | img_atts.add("alt"); |
| | | vAllowed.put("img", img_atts); |
| | | |
| | | final ArrayList<String> no_atts = new ArrayList<>(); |
| | | vAllowed.put("b", no_atts); |
| | | vAllowed.put("strong", no_atts); |
| | | vAllowed.put("i", no_atts); |
| | | vAllowed.put("em", no_atts); |
| | | |
| | | vSelfClosingTags = new String[] { "img" }; |
| | | vNeedClosingTags = new String[] { "a", "b", "strong", "i", "em" }; |
| | | vDisallowed = new String[] {}; |
| | | vAllowedProtocols = new String[] { "http", "mailto", "https" }; // no ftp. |
| | | vProtocolAtts = new String[] { "src", "href" }; |
| | | vRemoveBlanks = new String[] { "a", "b", "strong", "i", "em" }; |
| | | vAllowedEntities = new String[] { "amp", "gt", "lt", "quot" }; |
| | | stripComment = true; |
| | | encodeQuotes = true; |
| | | alwaysMakeTags = false; |
| | | } |
| | | |
| | | /** |
| | | * Map-parameter configurable constructor. |
| | | * |
| | | * @param conf map containing configuration. keys match field names. |
| | | */ |
| | | @SuppressWarnings("unchecked") |
| | | public HTMLFilter(final Map<String, Object> conf) |
| | | { |
| | | |
| | | assert conf.containsKey("vAllowed") : "configuration requires vAllowed"; |
| | | assert conf.containsKey("vSelfClosingTags") : "configuration requires vSelfClosingTags"; |
| | | assert conf.containsKey("vNeedClosingTags") : "configuration requires vNeedClosingTags"; |
| | | assert conf.containsKey("vDisallowed") : "configuration requires vDisallowed"; |
| | | assert conf.containsKey("vAllowedProtocols") : "configuration requires vAllowedProtocols"; |
| | | assert conf.containsKey("vProtocolAtts") : "configuration requires vProtocolAtts"; |
| | | assert conf.containsKey("vRemoveBlanks") : "configuration requires vRemoveBlanks"; |
| | | assert conf.containsKey("vAllowedEntities") : "configuration requires vAllowedEntities"; |
| | | |
| | | vAllowed = Collections.unmodifiableMap((HashMap<String, List<String>>) conf.get("vAllowed")); |
| | | vSelfClosingTags = (String[]) conf.get("vSelfClosingTags"); |
| | | vNeedClosingTags = (String[]) conf.get("vNeedClosingTags"); |
| | | vDisallowed = (String[]) conf.get("vDisallowed"); |
| | | vAllowedProtocols = (String[]) conf.get("vAllowedProtocols"); |
| | | vProtocolAtts = (String[]) conf.get("vProtocolAtts"); |
| | | vRemoveBlanks = (String[]) conf.get("vRemoveBlanks"); |
| | | vAllowedEntities = (String[]) conf.get("vAllowedEntities"); |
| | | stripComment = conf.containsKey("stripComment") ? (Boolean) conf.get("stripComment") : true; |
| | | encodeQuotes = conf.containsKey("encodeQuotes") ? (Boolean) conf.get("encodeQuotes") : true; |
| | | alwaysMakeTags = conf.containsKey("alwaysMakeTags") ? (Boolean) conf.get("alwaysMakeTags") : true; |
| | | } |
| | | |
| | | private void reset() |
| | | { |
| | | vTagCounts.clear(); |
| | | } |
| | | |
| | | // --------------------------------------------------------------- |
| | | // my versions of some PHP library functions |
| | | public static String chr(final int decimal) |
| | | { |
| | | return String.valueOf((char) decimal); |
| | | } |
| | | |
| | | public static String htmlSpecialChars(final String s) |
| | | { |
| | | String result = s; |
| | | result = regexReplace(P_AMP, "&", result); |
| | | result = regexReplace(P_QUOTE, """, result); |
| | | result = regexReplace(P_LEFT_ARROW, "<", result); |
| | | result = regexReplace(P_RIGHT_ARROW, ">", result); |
| | | return result; |
| | | } |
| | | |
| | | // --------------------------------------------------------------- |
| | | |
| | | /** |
| | | * given a user submitted input String, filter out any invalid or restricted html. |
| | | * |
| | | * @param input text (i.e. submitted by a user) than may contain html |
| | | * @return "clean" version of input, with only valid, whitelisted html elements allowed |
| | | */ |
| | | public String filter(final String input) |
| | | { |
| | | reset(); |
| | | String s = input; |
| | | |
| | | s = escapeComments(s); |
| | | |
| | | s = balanceHTML(s); |
| | | |
| | | s = checkTags(s); |
| | | |
| | | s = processRemoveBlanks(s); |
| | | |
| | | // s = validateEntities(s); |
| | | |
| | | return s; |
| | | } |
| | | |
| | | public boolean isAlwaysMakeTags() |
| | | { |
| | | return alwaysMakeTags; |
| | | } |
| | | |
| | | public boolean isStripComments() |
| | | { |
| | | return stripComment; |
| | | } |
| | | |
| | | private String escapeComments(final String s) |
| | | { |
| | | final Matcher m = P_COMMENTS.matcher(s); |
| | | final StringBuffer buf = new StringBuffer(); |
| | | if (m.find()) |
| | | { |
| | | final String match = m.group(1); // (.*?) |
| | | m.appendReplacement(buf, Matcher.quoteReplacement("<!--" + htmlSpecialChars(match) + "-->")); |
| | | } |
| | | m.appendTail(buf); |
| | | |
| | | return buf.toString(); |
| | | } |
| | | |
| | | private String balanceHTML(String s) |
| | | { |
| | | if (alwaysMakeTags) |
| | | { |
| | | // |
| | | // try and form html |
| | | // |
| | | s = regexReplace(P_END_ARROW, "", s); |
| | | // 不追加结束标签 |
| | | s = regexReplace(P_BODY_TO_END, "<$1>", s); |
| | | s = regexReplace(P_XML_CONTENT, "$1<$2", s); |
| | | |
| | | } |
| | | else |
| | | { |
| | | // |
| | | // escape stray brackets |
| | | // |
| | | s = regexReplace(P_STRAY_LEFT_ARROW, "<$1", s); |
| | | s = regexReplace(P_STRAY_RIGHT_ARROW, "$1$2><", s); |
| | | |
| | | // |
| | | // the last regexp causes '<>' entities to appear |
| | | // (we need to do a lookahead assertion so that the last bracket can |
| | | // be used in the next pass of the regexp) |
| | | // |
| | | s = regexReplace(P_BOTH_ARROWS, "", s); |
| | | } |
| | | |
| | | return s; |
| | | } |
| | | |
| | | private String checkTags(String s) |
| | | { |
| | | Matcher m = P_TAGS.matcher(s); |
| | | |
| | | final StringBuffer buf = new StringBuffer(); |
| | | while (m.find()) |
| | | { |
| | | String replaceStr = m.group(1); |
| | | replaceStr = processTag(replaceStr); |
| | | m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr)); |
| | | } |
| | | m.appendTail(buf); |
| | | |
| | | // these get tallied in processTag |
| | | // (remember to reset before subsequent calls to filter method) |
| | | final StringBuilder sBuilder = new StringBuilder(buf.toString()); |
| | | for (String key : vTagCounts.keySet()) |
| | | { |
| | | for (int ii = 0; ii < vTagCounts.get(key); ii++) |
| | | { |
| | | sBuilder.append("</").append(key).append(">"); |
| | | } |
| | | } |
| | | s = sBuilder.toString(); |
| | | |
| | | return s; |
| | | } |
| | | |
| | | private String processRemoveBlanks(final String s) |
| | | { |
| | | String result = s; |
| | | for (String tag : vRemoveBlanks) |
| | | { |
| | | if (!P_REMOVE_PAIR_BLANKS.containsKey(tag)) |
| | | { |
| | | P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?></" + tag + ">")); |
| | | } |
| | | result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), "", result); |
| | | if (!P_REMOVE_SELF_BLANKS.containsKey(tag)) |
| | | { |
| | | P_REMOVE_SELF_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?/>")); |
| | | } |
| | | result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result); |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | |
| | | private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s) |
| | | { |
| | | Matcher m = regex_pattern.matcher(s); |
| | | return m.replaceAll(replacement); |
| | | } |
| | | |
| | | private String processTag(final String s) |
| | | { |
| | | // ending tags |
| | | Matcher m = P_END_TAG.matcher(s); |
| | | if (m.find()) |
| | | { |
| | | final String name = m.group(1).toLowerCase(); |
| | | if (allowed(name)) |
| | | { |
| | | if (!inArray(name, vSelfClosingTags)) |
| | | { |
| | | if (vTagCounts.containsKey(name)) |
| | | { |
| | | vTagCounts.put(name, vTagCounts.get(name) - 1); |
| | | return "</" + name + ">"; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | // starting tags |
| | | m = P_START_TAG.matcher(s); |
| | | if (m.find()) |
| | | { |
| | | final String name = m.group(1).toLowerCase(); |
| | | final String body = m.group(2); |
| | | String ending = m.group(3); |
| | | |
| | | // debug( "in a starting tag, name='" + name + "'; body='" + body + "'; ending='" + ending + "'" ); |
| | | if (allowed(name)) |
| | | { |
| | | final StringBuilder params = new StringBuilder(); |
| | | |
| | | final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body); |
| | | final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body); |
| | | final List<String> paramNames = new ArrayList<>(); |
| | | final List<String> paramValues = new ArrayList<>(); |
| | | while (m2.find()) |
| | | { |
| | | paramNames.add(m2.group(1)); // ([a-z0-9]+) |
| | | paramValues.add(m2.group(3)); // (.*?) |
| | | } |
| | | while (m3.find()) |
| | | { |
| | | paramNames.add(m3.group(1)); // ([a-z0-9]+) |
| | | paramValues.add(m3.group(3)); // ([^\"\\s']+) |
| | | } |
| | | |
| | | String paramName, paramValue; |
| | | for (int ii = 0; ii < paramNames.size(); ii++) |
| | | { |
| | | paramName = paramNames.get(ii).toLowerCase(); |
| | | paramValue = paramValues.get(ii); |
| | | |
| | | // debug( "paramName='" + paramName + "'" ); |
| | | // debug( "paramValue='" + paramValue + "'" ); |
| | | // debug( "allowed? " + vAllowed.get( name ).contains( paramName ) ); |
| | | |
| | | if (allowedAttribute(name, paramName)) |
| | | { |
| | | if (inArray(paramName, vProtocolAtts)) |
| | | { |
| | | paramValue = processParamProtocol(paramValue); |
| | | } |
| | | params.append(' ').append(paramName).append("=\\\"").append(paramValue).append("\\\""); |
| | | } |
| | | } |
| | | |
| | | if (inArray(name, vSelfClosingTags)) |
| | | { |
| | | ending = " /"; |
| | | } |
| | | |
| | | if (inArray(name, vNeedClosingTags)) |
| | | { |
| | | ending = ""; |
| | | } |
| | | |
| | | if (ending == null || ending.length() < 1) |
| | | { |
| | | if (vTagCounts.containsKey(name)) |
| | | { |
| | | vTagCounts.put(name, vTagCounts.get(name) + 1); |
| | | } |
| | | else |
| | | { |
| | | vTagCounts.put(name, 1); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | ending = " /"; |
| | | } |
| | | return "<" + name + params + ending + ">"; |
| | | } |
| | | else |
| | | { |
| | | return ""; |
| | | } |
| | | } |
| | | |
| | | // comments |
| | | m = P_COMMENT.matcher(s); |
| | | if (!stripComment && m.find()) |
| | | { |
| | | return "<" + m.group() + ">"; |
| | | } |
| | | |
| | | return ""; |
| | | } |
| | | |
| | | private String processParamProtocol(String s) |
| | | { |
| | | s = decodeEntities(s); |
| | | final Matcher m = P_PROTOCOL.matcher(s); |
| | | if (m.find()) |
| | | { |
| | | final String protocol = m.group(1); |
| | | if (!inArray(protocol, vAllowedProtocols)) |
| | | { |
| | | // bad protocol, turn into local anchor link instead |
| | | s = "#" + s.substring(protocol.length() + 1); |
| | | if (s.startsWith("#//")) |
| | | { |
| | | s = "#" + s.substring(3); |
| | | } |
| | | } |
| | | } |
| | | |
| | | return s; |
| | | } |
| | | |
| | | private String decodeEntities(String s) |
| | | { |
| | | StringBuffer buf = new StringBuffer(); |
| | | |
| | | Matcher m = P_ENTITY.matcher(s); |
| | | while (m.find()) |
| | | { |
| | | final String match = m.group(1); |
| | | final int decimal = Integer.decode(match).intValue(); |
| | | m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); |
| | | } |
| | | m.appendTail(buf); |
| | | s = buf.toString(); |
| | | |
| | | buf = new StringBuffer(); |
| | | m = P_ENTITY_UNICODE.matcher(s); |
| | | while (m.find()) |
| | | { |
| | | final String match = m.group(1); |
| | | final int decimal = Integer.valueOf(match, 16).intValue(); |
| | | m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); |
| | | } |
| | | m.appendTail(buf); |
| | | s = buf.toString(); |
| | | |
| | | buf = new StringBuffer(); |
| | | m = P_ENCODE.matcher(s); |
| | | while (m.find()) |
| | | { |
| | | final String match = m.group(1); |
| | | final int decimal = Integer.valueOf(match, 16).intValue(); |
| | | m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); |
| | | } |
| | | m.appendTail(buf); |
| | | s = buf.toString(); |
| | | |
| | | s = validateEntities(s); |
| | | return s; |
| | | } |
| | | |
| | | private String validateEntities(final String s) |
| | | { |
| | | StringBuffer buf = new StringBuffer(); |
| | | |
| | | // validate entities throughout the string |
| | | Matcher m = P_VALID_ENTITIES.matcher(s); |
| | | while (m.find()) |
| | | { |
| | | final String one = m.group(1); // ([^&;]*) |
| | | final String two = m.group(2); // (?=(;|&|$)) |
| | | m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two))); |
| | | } |
| | | m.appendTail(buf); |
| | | |
| | | return encodeQuotes(buf.toString()); |
| | | } |
| | | |
| | | private String encodeQuotes(final String s) |
| | | { |
| | | if (encodeQuotes) |
| | | { |
| | | StringBuffer buf = new StringBuffer(); |
| | | Matcher m = P_VALID_QUOTES.matcher(s); |
| | | while (m.find()) |
| | | { |
| | | final String one = m.group(1); // (>|^) |
| | | final String two = m.group(2); // ([^<]+?) |
| | | final String three = m.group(3); // (<|$) |
| | | // 不替换双引号为",防止json格式无效 regexReplace(P_QUOTE, """, two) |
| | | m.appendReplacement(buf, Matcher.quoteReplacement(one + two + three)); |
| | | } |
| | | m.appendTail(buf); |
| | | return buf.toString(); |
| | | } |
| | | else |
| | | { |
| | | return s; |
| | | } |
| | | } |
| | | |
| | | private String checkEntity(final String preamble, final String term) |
| | | { |
| | | |
| | | return ";".equals(term) && isValidEntity(preamble) ? '&' + preamble : "&" + preamble; |
| | | } |
| | | |
| | | private boolean isValidEntity(final String entity) |
| | | { |
| | | return inArray(entity, vAllowedEntities); |
| | | } |
| | | |
| | | private static boolean inArray(final String s, final String[] array) |
| | | { |
| | | for (String item : array) |
| | | { |
| | | if (item != null && item.equals(s)) |
| | | { |
| | | return true; |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | private boolean allowed(final String name) |
| | | { |
| | | return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed); |
| | | } |
| | | |
| | | private boolean allowedAttribute(final String name, final String paramName) |
| | | { |
| | | return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName)); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils.ip; |
| | | |
| | | import java.net.InetAddress; |
| | | import java.net.UnknownHostException; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import com.ruoyi.common.core.utils.ServletUtils; |
| | | import com.ruoyi.common.core.utils.StringUtils; |
| | | |
| | | /** |
| | | * 获取IP方法 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class IpUtils |
| | | { |
| | | public final static String REGX_0_255 = "(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)"; |
| | | // 匹配 ip |
| | | public final static String REGX_IP = "((" + REGX_0_255 + "\\.){3}" + REGX_0_255 + ")"; |
| | | public final static String REGX_IP_WILDCARD = "(((\\*\\.){3}\\*)|(" + REGX_0_255 + "(\\.\\*){3})|(" + REGX_0_255 + "\\." + REGX_0_255 + ")(\\.\\*){2}" + "|((" + REGX_0_255 + "\\.){3}\\*))"; |
| | | // 匹配网段 |
| | | public final static String REGX_IP_SEG = "(" + REGX_IP + "\\-" + REGX_IP + ")"; |
| | | |
| | | /** |
| | | * 获取客户端IP |
| | | * |
| | | * @return IP地址 |
| | | */ |
| | | public static String getIpAddr() |
| | | { |
| | | return getIpAddr(ServletUtils.getRequest()); |
| | | } |
| | | |
| | | /** |
| | | * 获取客户端IP |
| | | * |
| | | * @param request 请求对象 |
| | | * @return IP地址 |
| | | */ |
| | | public static String getIpAddr(HttpServletRequest request) |
| | | { |
| | | if (request == null) |
| | | { |
| | | return "unknown"; |
| | | } |
| | | String ip = request.getHeader("x-forwarded-for"); |
| | | if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) |
| | | { |
| | | ip = request.getHeader("Proxy-Client-IP"); |
| | | } |
| | | if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) |
| | | { |
| | | ip = request.getHeader("X-Forwarded-For"); |
| | | } |
| | | if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) |
| | | { |
| | | ip = request.getHeader("WL-Proxy-Client-IP"); |
| | | } |
| | | if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) |
| | | { |
| | | ip = request.getHeader("X-Real-IP"); |
| | | } |
| | | |
| | | if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) |
| | | { |
| | | ip = request.getRemoteAddr(); |
| | | } |
| | | |
| | | return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip); |
| | | } |
| | | |
| | | /** |
| | | * 检查是否为内部IP地址 |
| | | * |
| | | * @param ip IP地址 |
| | | * @return 结果 |
| | | */ |
| | | public static boolean internalIp(String ip) |
| | | { |
| | | byte[] addr = textToNumericFormatV4(ip); |
| | | return internalIp(addr) || "127.0.0.1".equals(ip); |
| | | } |
| | | |
| | | /** |
| | | * 检查是否为内部IP地址 |
| | | * |
| | | * @param addr byte地址 |
| | | * @return 结果 |
| | | */ |
| | | private static boolean internalIp(byte[] addr) |
| | | { |
| | | if (StringUtils.isNull(addr) || addr.length < 2) |
| | | { |
| | | return true; |
| | | } |
| | | final byte b0 = addr[0]; |
| | | final byte b1 = addr[1]; |
| | | // 10.x.x.x/8 |
| | | final byte SECTION_1 = 0x0A; |
| | | // 172.16.x.x/12 |
| | | final byte SECTION_2 = (byte) 0xAC; |
| | | final byte SECTION_3 = (byte) 0x10; |
| | | final byte SECTION_4 = (byte) 0x1F; |
| | | // 192.168.x.x/16 |
| | | final byte SECTION_5 = (byte) 0xC0; |
| | | final byte SECTION_6 = (byte) 0xA8; |
| | | switch (b0) |
| | | { |
| | | case SECTION_1: |
| | | return true; |
| | | case SECTION_2: |
| | | if (b1 >= SECTION_3 && b1 <= SECTION_4) |
| | | { |
| | | return true; |
| | | } |
| | | case SECTION_5: |
| | | switch (b1) |
| | | { |
| | | case SECTION_6: |
| | | return true; |
| | | } |
| | | default: |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 将IPv4地址转换成字节 |
| | | * |
| | | * @param text IPv4地址 |
| | | * @return byte 字节 |
| | | */ |
| | | public static byte[] textToNumericFormatV4(String text) |
| | | { |
| | | if (text.length() == 0) |
| | | { |
| | | return null; |
| | | } |
| | | |
| | | byte[] bytes = new byte[4]; |
| | | String[] elements = text.split("\\.", -1); |
| | | try |
| | | { |
| | | long l; |
| | | int i; |
| | | switch (elements.length) |
| | | { |
| | | case 1: |
| | | l = Long.parseLong(elements[0]); |
| | | if ((l < 0L) || (l > 4294967295L)) |
| | | { |
| | | return null; |
| | | } |
| | | bytes[0] = (byte) (int) (l >> 24 & 0xFF); |
| | | bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF); |
| | | bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); |
| | | bytes[3] = (byte) (int) (l & 0xFF); |
| | | break; |
| | | case 2: |
| | | l = Integer.parseInt(elements[0]); |
| | | if ((l < 0L) || (l > 255L)) |
| | | { |
| | | return null; |
| | | } |
| | | bytes[0] = (byte) (int) (l & 0xFF); |
| | | l = Integer.parseInt(elements[1]); |
| | | if ((l < 0L) || (l > 16777215L)) |
| | | { |
| | | return null; |
| | | } |
| | | bytes[1] = (byte) (int) (l >> 16 & 0xFF); |
| | | bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); |
| | | bytes[3] = (byte) (int) (l & 0xFF); |
| | | break; |
| | | case 3: |
| | | for (i = 0; i < 2; ++i) |
| | | { |
| | | l = Integer.parseInt(elements[i]); |
| | | if ((l < 0L) || (l > 255L)) |
| | | { |
| | | return null; |
| | | } |
| | | bytes[i] = (byte) (int) (l & 0xFF); |
| | | } |
| | | l = Integer.parseInt(elements[2]); |
| | | if ((l < 0L) || (l > 65535L)) |
| | | { |
| | | return null; |
| | | } |
| | | bytes[2] = (byte) (int) (l >> 8 & 0xFF); |
| | | bytes[3] = (byte) (int) (l & 0xFF); |
| | | break; |
| | | case 4: |
| | | for (i = 0; i < 4; ++i) |
| | | { |
| | | l = Integer.parseInt(elements[i]); |
| | | if ((l < 0L) || (l > 255L)) |
| | | { |
| | | return null; |
| | | } |
| | | bytes[i] = (byte) (int) (l & 0xFF); |
| | | } |
| | | break; |
| | | default: |
| | | return null; |
| | | } |
| | | } |
| | | catch (NumberFormatException e) |
| | | { |
| | | return null; |
| | | } |
| | | return bytes; |
| | | } |
| | | |
| | | /** |
| | | * 获取IP地址 |
| | | * |
| | | * @return 本地IP地址 |
| | | */ |
| | | public static String getHostIp() |
| | | { |
| | | try |
| | | { |
| | | return InetAddress.getLocalHost().getHostAddress(); |
| | | } |
| | | catch (UnknownHostException e) |
| | | { |
| | | } |
| | | return "127.0.0.1"; |
| | | } |
| | | |
| | | /** |
| | | * 获取主机名 |
| | | * |
| | | * @return 本地主机名 |
| | | */ |
| | | public static String getHostName() |
| | | { |
| | | try |
| | | { |
| | | return InetAddress.getLocalHost().getHostName(); |
| | | } |
| | | catch (UnknownHostException e) |
| | | { |
| | | } |
| | | return "未知"; |
| | | } |
| | | |
| | | /** |
| | | * 从多级反向代理中获得第一个非unknown IP地址 |
| | | * |
| | | * @param ip 获得的IP地址 |
| | | * @return 第一个非unknown IP地址 |
| | | */ |
| | | public static String getMultistageReverseProxyIp(String ip) |
| | | { |
| | | // 多级反向代理检测 |
| | | if (ip != null && ip.indexOf(",") > 0) |
| | | { |
| | | final String[] ips = ip.trim().split(","); |
| | | for (String subIp : ips) |
| | | { |
| | | if (false == isUnknown(subIp)) |
| | | { |
| | | ip = subIp; |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | return StringUtils.substring(ip, 0, 255); |
| | | } |
| | | |
| | | /** |
| | | * 检测给定字符串是否为未知,多用于检测HTTP请求相关 |
| | | * |
| | | * @param checkString 被检测的字符串 |
| | | * @return 是否未知 |
| | | */ |
| | | public static boolean isUnknown(String checkString) |
| | | { |
| | | return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString); |
| | | } |
| | | |
| | | /** |
| | | * 是否为IP |
| | | */ |
| | | public static boolean isIP(String ip) |
| | | { |
| | | return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP); |
| | | } |
| | | |
| | | /** |
| | | * 是否为IP,或 *为间隔的通配符地址 |
| | | */ |
| | | public static boolean isIpWildCard(String ip) |
| | | { |
| | | return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP_WILDCARD); |
| | | } |
| | | |
| | | /** |
| | | * 检测参数是否在ip通配符里 |
| | | */ |
| | | public static boolean ipIsInWildCardNoCheck(String ipWildCard, String ip) |
| | | { |
| | | String[] s1 = ipWildCard.split("\\."); |
| | | String[] s2 = ip.split("\\."); |
| | | boolean isMatchedSeg = true; |
| | | for (int i = 0; i < s1.length && !s1[i].equals("*"); i++) |
| | | { |
| | | if (!s1[i].equals(s2[i])) |
| | | { |
| | | isMatchedSeg = false; |
| | | break; |
| | | } |
| | | } |
| | | return isMatchedSeg; |
| | | } |
| | | |
| | | /** |
| | | * 是否为特定格式如:“10.10.10.1-10.10.10.99”的ip段字符串 |
| | | */ |
| | | public static boolean isIPSegment(String ipSeg) |
| | | { |
| | | return StringUtils.isNotBlank(ipSeg) && ipSeg.matches(REGX_IP_SEG); |
| | | } |
| | | |
| | | /** |
| | | * 判断ip是否在指定网段中 |
| | | */ |
| | | public static boolean ipIsInNetNoCheck(String iparea, String ip) |
| | | { |
| | | int idx = iparea.indexOf('-'); |
| | | String[] sips = iparea.substring(0, idx).split("\\."); |
| | | String[] sipe = iparea.substring(idx + 1).split("\\."); |
| | | String[] sipt = ip.split("\\."); |
| | | long ips = 0L, ipe = 0L, ipt = 0L; |
| | | for (int i = 0; i < 4; ++i) |
| | | { |
| | | ips = ips << 8 | Integer.parseInt(sips[i]); |
| | | ipe = ipe << 8 | Integer.parseInt(sipe[i]); |
| | | ipt = ipt << 8 | Integer.parseInt(sipt[i]); |
| | | } |
| | | if (ips > ipe) |
| | | { |
| | | long t = ips; |
| | | ips = ipe; |
| | | ipe = t; |
| | | } |
| | | return ips <= ipt && ipt <= ipe; |
| | | } |
| | | |
| | | /** |
| | | * 校验ip是否符合过滤串规则 |
| | | * |
| | | * @param filter 过滤IP列表,支持后缀'*'通配,支持网段如:`10.10.10.1-10.10.10.99` |
| | | * @param ip 校验IP地址 |
| | | * @return boolean 结果 |
| | | */ |
| | | public static boolean isMatchedIp(String filter, String ip) |
| | | { |
| | | if (StringUtils.isEmpty(filter) || StringUtils.isEmpty(ip)) |
| | | { |
| | | return false; |
| | | } |
| | | String[] ips = filter.split(";"); |
| | | for (String iStr : ips) |
| | | { |
| | | if (isIP(iStr) && iStr.equals(ip)) |
| | | { |
| | | return true; |
| | | } |
| | | else if (isIpWildCard(iStr) && ipIsInWildCardNoCheck(iStr, ip)) |
| | | { |
| | | return true; |
| | | } |
| | | else if (isIPSegment(iStr) && ipIsInNetNoCheck(iStr, ip)) |
| | | { |
| | | return true; |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils.obs; |
| | | |
| | | import com.obs.services.ObsClient; |
| | | import com.obs.services.model.PutObjectRequest; |
| | | import com.obs.services.model.PutObjectResult; |
| | | |
| | | import java.io.InputStream; |
| | | |
| | | /** |
| | | * 对象存储上传 |
| | | * @author zhibing.pu |
| | | * @date 2023/3/15 11:32 |
| | | */ |
| | | public class OBSUtil { |
| | | |
| | | public static String endPoint = "https://obs.cn-southwest-2.myhuaweicloud.com"; |
| | | public static String ak = "ONCVMOIXDX55ADAU5MFS"; |
| | | public static String sk = "3uuS3p3rcw2WYSpFVPveIGm7wVvx5OtoCNhbBv3n"; |
| | | public static String bucketname = "yixingtong"; |
| | | |
| | | /** |
| | | * 上传文件 |
| | | * @param inputStream |
| | | * @param objectKey |
| | | * @return |
| | | */ |
| | | public static String putObjectToBucket(InputStream inputStream, String objectKey) { |
| | | try { |
| | | // 创建ObsClient实例 |
| | | ObsClient obsClient = new ObsClient(ak, sk, endPoint); |
| | | // 待上传的本地文件路径,需要指定到具体的文件名 |
| | | PutObjectRequest request = new PutObjectRequest(); |
| | | request.setBucketName(bucketname); |
| | | request.setObjectKey(objectKey); |
| | | request.setInput(inputStream); |
| | | PutObjectResult putObjectResult = obsClient.putObject(request); |
| | | return putObjectResult.getObjectUrl(); |
| | | }catch (Exception e){ |
| | | e.printStackTrace(); |
| | | } |
| | | return null; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils.poi; |
| | | |
| | | /** |
| | | * Excel数据格式处理适配器 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface ExcelHandlerAdapter |
| | | { |
| | | /** |
| | | * 格式化 |
| | | * |
| | | * @param value 单元格数据值 |
| | | * @param args excel注解args参数组 |
| | | * |
| | | * @return 处理后的值 |
| | | */ |
| | | Object format(Object value, String[] args); |
| | | } |
New file |
| | |
| | | package com.ruoyi.common.core.utils.poi; |
| | | |
| | | import java.io.IOException; |
| | | import java.io.InputStream; |
| | | import java.lang.reflect.Field; |
| | | import java.lang.reflect.Method; |
| | | import java.lang.reflect.ParameterizedType; |
| | | import java.math.BigDecimal; |
| | | import java.text.DecimalFormat; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.util.ArrayList; |
| | | import java.util.Arrays; |
| | | import java.util.Collection; |
| | | import java.util.Comparator; |
| | | import java.util.Date; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Set; |
| | | import java.util.stream.Collectors; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import org.apache.commons.lang3.ArrayUtils; |
| | | import org.apache.commons.lang3.RegExUtils; |
| | | import org.apache.commons.lang3.reflect.FieldUtils; |
| | | import org.apache.poi.ss.usermodel.BorderStyle; |
| | | import org.apache.poi.ss.usermodel.Cell; |
| | | import org.apache.poi.ss.usermodel.CellStyle; |
| | | import org.apache.poi.ss.usermodel.CellType; |
| | | import org.apache.poi.ss.usermodel.ClientAnchor; |
| | | import org.apache.poi.ss.usermodel.DataValidation; |
| | | import org.apache.poi.ss.usermodel.DataValidationConstraint; |
| | | import org.apache.poi.ss.usermodel.DataValidationHelper; |
| | | import org.apache.poi.ss.usermodel.DateUtil; |
| | | import org.apache.poi.ss.usermodel.Drawing; |
| | | import org.apache.poi.ss.usermodel.FillPatternType; |
| | | import org.apache.poi.ss.usermodel.Font; |
| | | import org.apache.poi.ss.usermodel.HorizontalAlignment; |
| | | import org.apache.poi.ss.usermodel.IndexedColors; |
| | | import org.apache.poi.ss.usermodel.Name; |
| | | import org.apache.poi.ss.usermodel.Row; |
| | | import org.apache.poi.ss.usermodel.Sheet; |
| | | import org.apache.poi.ss.usermodel.VerticalAlignment; |
| | | import org.apache.poi.ss.usermodel.Workbook; |
| | | import org.apache.poi.ss.usermodel.WorkbookFactory; |
| | | import org.apache.poi.ss.util.CellRangeAddress; |
| | | import org.apache.poi.ss.util.CellRangeAddressList; |
| | | import org.apache.poi.util.IOUtils; |
| | | import org.apache.poi.xssf.streaming.SXSSFWorkbook; |
| | | import org.apache.poi.xssf.usermodel.XSSFClientAnchor; |
| | | import org.apache.poi.xssf.usermodel.XSSFDataValidation; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import com.ruoyi.common.core.annotation.Excel; |
| | | import com.ruoyi.common.core.annotation.Excel.ColumnType; |
| | | import com.ruoyi.common.core.annotation.Excel.Type; |
| | | import com.ruoyi.common.core.annotation.Excels; |
| | | import com.ruoyi.common.core.text.Convert; |
| | | import com.ruoyi.common.core.utils.DateUtils; |
| | | import com.ruoyi.common.core.utils.StringUtils; |
| | | import com.ruoyi.common.core.utils.file.FileTypeUtils; |
| | | import com.ruoyi.common.core.utils.file.ImageUtils; |
| | | import com.ruoyi.common.core.utils.reflect.ReflectUtils; |
| | | |
| | | /** |
| | | * Excel相关处理 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class ExcelUtil<T> |
| | | { |
| | | private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); |
| | | |
| | | public static final String FORMULA_REGEX_STR = "=|-|\\+|@"; |
| | | |
| | | public static final String[] FORMULA_STR = { "=", "-", "+", "@" }; |
| | | |
| | | /** |
| | | * Excel sheet最大行数,默认65536 |
| | | */ |
| | | public static final int sheetSize = 65536; |
| | | |
| | | /** |
| | | * 工作表名称 |
| | | */ |
| | | private String sheetName; |
| | | |
| | | /** |
| | | * 导出类型(EXPORT:导出数据;IMPORT:导入模板) |
| | | */ |
| | | private Type type; |
| | | |
| | | /** |
| | | * 工作薄对象 |
| | | */ |
| | | private Workbook wb; |
| | | |
| | | /** |
| | | * 工作表对象 |
| | | */ |
| | | private Sheet sheet; |
| | | |
| | | /** |
| | | * 样式列表 |
| | | */ |
| | | private Map<String, CellStyle> styles; |
| | | |
| | | /** |
| | | * 导入导出数据列表 |
| | | */ |
| | | private List<T> list; |
| | | |
| | | /** |
| | | * 注解列表 |
| | | */ |
| | | private List<Object[]> fields; |
| | | |
| | | /** |
| | | * 当前行号 |
| | | */ |
| | | private int rownum; |
| | | |
| | | /** |
| | | * 标题 |
| | | */ |
| | | private String title; |
| | | |
| | | /** |
| | | * 最大高度 |
| | | */ |
| | | private short maxHeight; |
| | | |
| | | /** |
| | | * 合并后最后行数 |
| | | */ |
| | | private int subMergedLastRowNum = 0; |
| | | |
| | | /** |
| | | * 合并后开始行数 |
| | | */ |
| | | private int subMergedFirstRowNum = 1; |
| | | |
| | | /** |
| | | * 对象的子列表方法 |
| | | */ |
| | | private Method subMethod; |
| | | |
| | | /** |
| | | * 对象的子列表属性 |
| | | */ |
| | | private List<Field> subFields; |
| | | |
| | | /** |
| | | * 统计列表 |
| | | */ |
| | | private Map<Integer, Double> statistics = new HashMap<Integer, Double>(); |
| | | |
| | | /** |
| | | * 数字格式 |
| | | */ |
| | | private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); |
| | | |
| | | /** |
| | | * 实体对象 |
| | | */ |
| | | public Class<T> clazz; |
| | | |
| | | /** |
| | | * 需要排除列属性 |
| | | */ |
| | | public String[] excludeFields; |
| | | |
| | | public ExcelUtil(Class<T> clazz) |
| | | { |
| | | this.clazz = clazz; |
| | | } |
| | | |
| | | /** |
| | | * 隐藏Excel中列属性 |
| | | * |
| | | * @param fields 列属性名 示例[单个"name"/多个"id","name"] |
| | | * @throws Exception |
| | | */ |
| | | public void hideColumn(String... fields) |
| | | { |
| | | this.excludeFields = fields; |
| | | } |
| | | |
| | | public void init(List<T> list, String sheetName, String title, Type type) |
| | | { |
| | | if (list == null) |
| | | { |
| | | list = new ArrayList<T>(); |
| | | } |
| | | this.list = list; |
| | | this.sheetName = sheetName; |
| | | this.type = type; |
| | | this.title = title; |
| | | createExcelField(); |
| | | createWorkbook(); |
| | | createTitle(); |
| | | createSubHead(); |
| | | } |
| | | |
| | | /** |
| | | * 创建excel第一行标题 |
| | | */ |
| | | public void createTitle() |
| | | { |
| | | if (StringUtils.isNotEmpty(title)) |
| | | { |
| | | subMergedFirstRowNum++; |
| | | subMergedLastRowNum++; |
| | | int titleLastCol = this.fields.size() - 1; |
| | | if (isSubList()) |
| | | { |
| | | titleLastCol = titleLastCol + subFields.size() - 1; |
| | | } |
| | | Row titleRow = sheet.createRow(rownum == 0 ? rownum++ : 0); |
| | | titleRow.setHeightInPoints(30); |
| | | Cell titleCell = titleRow.createCell(0); |
| | | titleCell.setCellStyle(styles.get("title")); |
| | | titleCell.setCellValue(title); |
| | | sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(), titleLastCol)); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 创建对象的子列表名称 |
| | | */ |
| | | public void createSubHead() |
| | | { |
| | | if (isSubList()) |
| | | { |
| | | subMergedFirstRowNum++; |
| | | subMergedLastRowNum++; |
| | | Row subRow = sheet.createRow(rownum); |
| | | int excelNum = 0; |
| | | for (Object[] objects : fields) |
| | | { |
| | | Excel attr = (Excel) objects[1]; |
| | | Cell headCell1 = subRow.createCell(excelNum); |
| | | headCell1.setCellValue(attr.name()); |
| | | headCell1.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); |
| | | excelNum++; |
| | | } |
| | | int headFirstRow = excelNum - 1; |
| | | int headLastRow = headFirstRow + subFields.size() - 1; |
| | | if (headLastRow > headFirstRow) |
| | | { |
| | | sheet.addMergedRegion(new CellRangeAddress(rownum, rownum, headFirstRow, headLastRow)); |
| | | } |
| | | rownum++; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 对excel表单默认第一个索引名转换成list |
| | | * |
| | | * @param is 输入流 |
| | | * @return 转换后集合 |
| | | */ |
| | | public List<T> importExcel(InputStream is) throws Exception |
| | | { |
| | | return importExcel(is, 0); |
| | | } |
| | | |
| | | /** |
| | | * 对excel表单默认第一个索引名转换成list |
| | | * |
| | | * @param is 输入流 |
| | | * @param titleNum 标题占用行数 |
| | | * @return 转换后集合 |
| | | */ |
| | | public List<T> importExcel(InputStream is, int titleNum) throws Exception |
| | | { |
| | | return importExcel(StringUtils.EMPTY, is, titleNum); |
| | | } |
| | | |
| | | /** |
| | | * 对excel表单指定表格索引名转换成list |
| | | * |
| | | * @param sheetName 表格索引名 |
| | | * @param titleNum 标题占用行数 |
| | | * @param is 输入流 |
| | | * @return 转换后集合 |
| | | */ |
| | | public List<T> importExcel(String sheetName, InputStream is, int titleNum) throws Exception |
| | | { |
| | | this.type = Type.IMPORT; |
| | | this.wb = WorkbookFactory.create(is); |
| | | List<T> list = new ArrayList<T>(); |
| | | // 如果指定sheet名,则取指定sheet中的内容 否则默认指向第1个sheet |
| | | Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(0); |
| | | if (sheet == null) |
| | | { |
| | | throw new IOException("文件sheet不存在"); |
| | | } |
| | | |
| | | // 获取最后一个非空行的行下标,比如总行数为n,则返回的为n-1 |
| | | int rows = sheet.getLastRowNum(); |
| | | |
| | | if (rows > 0) |
| | | { |
| | | // 定义一个map用于存放excel列的序号和field. |
| | | Map<String, Integer> cellMap = new HashMap<String, Integer>(); |
| | | // 获取表头 |
| | | Row heard = sheet.getRow(titleNum); |
| | | for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) |
| | | { |
| | | Cell cell = heard.getCell(i); |
| | | if (StringUtils.isNotNull(cell)) |
| | | { |
| | | String value = this.getCellValue(heard, i).toString(); |
| | | cellMap.put(value, i); |
| | | } |
| | | else |
| | | { |
| | | cellMap.put(null, i); |
| | | } |
| | | } |
| | | // 有数据时才处理 得到类的所有field. |
| | | List<Object[]> fields = this.getFields(); |
| | | Map<Integer, Object[]> fieldsMap = new HashMap<Integer, Object[]>(); |
| | | for (Object[] objects : fields) |
| | | { |
| | | Excel attr = (Excel) objects[1]; |
| | | Integer column = cellMap.get(attr.name()); |
| | | if (column != null) |
| | | { |
| | | fieldsMap.put(column, objects); |
| | | } |
| | | } |
| | | for (int i = titleNum + 1; i <= rows; i++) |
| | | { |
| | | // 从第2行开始取数据,默认第一行是表头. |
| | | Row row = sheet.getRow(i); |
| | | // 判断当前行是否是空行 |
| | | if (isRowEmpty(row)) |
| | | { |
| | | continue; |
| | | } |
| | | T entity = null; |
| | | for (Map.Entry<Integer, Object[]> entry : fieldsMap.entrySet()) |
| | | { |
| | | Object val = this.getCellValue(row, entry.getKey()); |
| | | |
| | | // 如果不存在实例则新建. |
| | | entity = (entity == null ? clazz.newInstance() : entity); |
| | | // 从map中得到对应列的field. |
| | | Field field = (Field) entry.getValue()[0]; |
| | | Excel attr = (Excel) entry.getValue()[1]; |
| | | // 取得类型,并根据对象类型设置值. |
| | | Class<?> fieldType = field.getType(); |
| | | if (String.class == fieldType) |
| | | { |
| | | String s = Convert.toStr(val); |
| | | if (StringUtils.endsWith(s, ".0")) |
| | | { |
| | | val = StringUtils.substringBefore(s, ".0"); |
| | | } |
| | | else |
| | | { |
| | | String dateFormat = field.getAnnotation(Excel.class).dateFormat(); |
| | | if (StringUtils.isNotEmpty(dateFormat)) |
| | | { |
| | | val = parseDateToStr(dateFormat, val); |
| | | } |
| | | else |
| | | { |
| | | val = Convert.toStr(val); |
| | | } |
| | | } |
| | | } |
| | | else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) |
| | | { |
| | | val = Convert.toInt(val); |
| | | } |
| | | else if ((Long.TYPE == fieldType || Long.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) |
| | | { |
| | | val = Convert.toLong(val); |
| | | } |
| | | else if (Double.TYPE == fieldType || Double.class == fieldType) |
| | | { |
| | | val = Convert.toDouble(val); |
| | | } |
| | | else if (Float.TYPE == fieldType || Float.class == fieldType) |
| | | { |
| | | val = Convert.toFloat(val); |
| | | } |
| | | else if (BigDecimal.class == fieldType) |
| | | { |
| | | val = Convert.toBigDecimal(val); |
| | | } |
| | | else if (Date.class == fieldType) |
| | | { |
| | | if (val instanceof String) |
| | | { |
| | | val = DateUtils.parseDate(val); |
| | | } |
| | | else if (val instanceof Double) |
| | | { |
| | | val = DateUtil.getJavaDate((Double) val); |
| | | } |
| | | } |
| | | else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) |
| | | { |
| | | val = Convert.toBool(val, false); |
| | | } |
| | | if (StringUtils.isNotNull(fieldType)) |
| | | { |
| | | String propertyName = field.getName(); |
| | | if (StringUtils.isNotEmpty(attr.targetAttr())) |
| | | { |
| | | propertyName = field.getName() + "." + attr.targetAttr(); |
| | | } |
| | | else if (StringUtils.isNotEmpty(attr.readConverterExp())) |
| | | { |
| | | val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator()); |
| | | } |
| | | else if (!attr.handler().equals(ExcelHandlerAdapter.class)) |
| | | { |
| | | val = dataFormatHandlerAdapter(val, attr); |
| | | } |
| | | ReflectUtils.invokeSetter(entity, propertyName, val); |
| | | } |
| | | } |
| | | list.add(entity); |
| | | } |
| | | } |
| | | return list; |
| | | } |
| | | |
| | | /** |
| | | * 对list数据源将其里面的数据导入到excel表单 |
| | | * |
| | | * @param response 返回数据 |
| | | * @param list 导出数据集合 |
| | | * @param sheetName 工作表的名称 |
| | | * @return 结果 |
| | | */ |
| | | public void exportExcel(HttpServletResponse response, List<T> list, String sheetName) |
| | | { |
| | | exportExcel(response, list, sheetName, StringUtils.EMPTY); |
| | | } |
| | | |
| | | /** |
| | | * 对list数据源将其里面的数据导入到excel表单 |
| | | * |
| | | * @param response 返回数据 |
| | | * @param list 导出数据集合 |
| | | * @param sheetName 工作表的名称 |
| | | * @param title 标题 |
| | | * @return 结果 |
| | | */ |
| | | public void exportExcel(HttpServletResponse response, List<T> list, String sheetName, String title) |
| | | { |
| | | response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); |
| | | response.setCharacterEncoding("utf-8"); |
| | | this.init(list, sheetName, title, Type.EXPORT); |
| | | exportExcel(response); |
| | | } |
| | | |
| | | /** |
| | | * 对list数据源将其里面的数据导入到excel表单 |
| | | * |
| | | * @param sheetName 工作表的名称 |
| | | * @return 结果 |
| | | */ |
| | | public void importTemplateExcel(HttpServletResponse response, String sheetName) |
| | | { |
| | | importTemplateExcel(response, sheetName, StringUtils.EMPTY); |
| | | } |
| | | |
| | | /** |
| | | * 对list数据源将其里面的数据导入到excel表单 |
| | | * |
| | | * @param sheetName 工作表的名称 |
| | | * @param title 标题 |
| | | * @return 结果 |
| | | */ |
| | | public void importTemplateExcel(HttpServletResponse response, String sheetName, String title) |
| | | { |
| | | response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); |
| | | response.setCharacterEncoding("utf-8"); |
| | | this.init(null, sheetName, title, Type.IMPORT); |
| | | exportExcel(response); |
| | | } |
| | | |
| | | /** |
| | | * 对list数据源将其里面的数据导入到excel表单 |
| | | * |
| | | * @return 结果 |
| | | */ |
| | | public void exportExcel(HttpServletResponse response) |
| | | { |
| | | try |
| | | { |
| | | writeSheet(); |
| | | wb.write(response.getOutputStream()); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | log.error("导出Excel异常{}", e.getMessage()); |
| | | } |
| | | finally |
| | | { |
| | | IOUtils.closeQuietly(wb); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 创建写入数据到Sheet |
| | | */ |
| | | public void writeSheet() |
| | | { |
| | | // 取出一共有多少个sheet. |
| | | int sheetNo = Math.max(1, (int) Math.ceil(list.size() * 1.0 / sheetSize)); |
| | | for (int index = 0; index < sheetNo; index++) |
| | | { |
| | | createSheet(sheetNo, index); |
| | | |
| | | // 产生一行 |
| | | Row row = sheet.createRow(rownum); |
| | | int column = 0; |
| | | // 写入各个字段的列头名称 |
| | | for (Object[] os : fields) |
| | | { |
| | | Field field = (Field) os[0]; |
| | | Excel excel = (Excel) os[1]; |
| | | if (Collection.class.isAssignableFrom(field.getType())) |
| | | { |
| | | for (Field subField : subFields) |
| | | { |
| | | Excel subExcel = subField.getAnnotation(Excel.class); |
| | | this.createHeadCell(subExcel, row, column++); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | this.createHeadCell(excel, row, column++); |
| | | } |
| | | } |
| | | if (Type.EXPORT.equals(type)) |
| | | { |
| | | fillExcelData(index, row); |
| | | addStatisticsRow(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 填充excel数据 |
| | | * |
| | | * @param index 序号 |
| | | * @param row 单元格行 |
| | | */ |
| | | @SuppressWarnings("unchecked") |
| | | public void fillExcelData(int index, Row row) |
| | | { |
| | | int startNo = index * sheetSize; |
| | | int endNo = Math.min(startNo + sheetSize, list.size()); |
| | | int rowNo = (1 + rownum) - startNo; |
| | | for (int i = startNo; i < endNo; i++) |
| | | { |
| | | rowNo = isSubList() ? (i > 1 ? rowNo + 1 : rowNo + i) : i + 1 + rownum - startNo; |
| | | row = sheet.createRow(rowNo); |
| | | // 得到导出对象. |
| | | T vo = (T) list.get(i); |
| | | Collection<?> subList = null; |
| | | if (isSubList()) |
| | | { |
| | | if (isSubListValue(vo)) |
| | | { |
| | | subList = getListCellValue(vo); |
| | | subMergedLastRowNum = subMergedLastRowNum + subList.size(); |
| | | } |
| | | else |
| | | { |
| | | subMergedFirstRowNum++; |
| | | subMergedLastRowNum++; |
| | | } |
| | | } |
| | | int column = 0; |
| | | for (Object[] os : fields) |
| | | { |
| | | Field field = (Field) os[0]; |
| | | Excel excel = (Excel) os[1]; |
| | | if (Collection.class.isAssignableFrom(field.getType()) && StringUtils.isNotNull(subList)) |
| | | { |
| | | boolean subFirst = false; |
| | | for (Object obj : subList) |
| | | { |
| | | if (subFirst) |
| | | { |
| | | rowNo++; |
| | | row = sheet.createRow(rowNo); |
| | | } |
| | | List<Field> subFields = FieldUtils.getFieldsListWithAnnotation(obj.getClass(), Excel.class); |
| | | int subIndex = 0; |
| | | for (Field subField : subFields) |
| | | { |
| | | if (subField.isAnnotationPresent(Excel.class)) |
| | | { |
| | | subField.setAccessible(true); |
| | | Excel attr = subField.getAnnotation(Excel.class); |
| | | this.addCell(attr, row, (T) obj, subField, column + subIndex); |
| | | } |
| | | subIndex++; |
| | | } |
| | | subFirst = true; |
| | | } |
| | | this.subMergedFirstRowNum = this.subMergedFirstRowNum + subList.size(); |
| | | } |
| | | else |
| | | { |
| | | this.addCell(excel, row, vo, field, column++); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 创建表格样式 |
| | | * |
| | | * @param wb 工作薄对象 |
| | | * @return 样式列表 |
| | | */ |
| | | private Map<String, CellStyle> createStyles(Workbook wb) |
| | | { |
| | | // 写入各条记录,每条记录对应excel表中的一行 |
| | | Map<String, CellStyle> styles = new HashMap<String, CellStyle>(); |
| | | CellStyle style = wb.createCellStyle(); |
| | | style.setAlignment(HorizontalAlignment.CENTER); |
| | | style.setVerticalAlignment(VerticalAlignment.CENTER); |
| | | Font titleFont = wb.createFont(); |
| | | titleFont.setFontName("Arial"); |
| | | titleFont.setFontHeightInPoints((short) 16); |
| | | titleFont.setBold(true); |
| | | style.setFont(titleFont); |
| | | styles.put("title", style); |
| | | |
| | | style = wb.createCellStyle(); |
| | | style.setAlignment(HorizontalAlignment.CENTER); |
| | | style.setVerticalAlignment(VerticalAlignment.CENTER); |
| | | style.setBorderRight(BorderStyle.THIN); |
| | | style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); |
| | | style.setBorderLeft(BorderStyle.THIN); |
| | | style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); |
| | | style.setBorderTop(BorderStyle.THIN); |
| | | style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); |
| | | style.setBorderBottom(BorderStyle.THIN); |
| | | style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); |
| | | Font dataFont = wb.createFont(); |
| | | dataFont.setFontName("Arial"); |
| | | dataFont.setFontHeightInPoints((short) 10); |
| | | style.setFont(dataFont); |
| | | styles.put("data", style); |
| | | |
| | | style = wb.createCellStyle(); |
| | | style.setAlignment(HorizontalAlignment.CENTER); |
| | | style.setVerticalAlignment(VerticalAlignment.CENTER); |
| | | Font totalFont = wb.createFont(); |
| | | totalFont.setFontName("Arial"); |
| | | totalFont.setFontHeightInPoints((short) 10); |
| | | style.setFont(totalFont); |
| | | styles.put("total", style); |
| | | |
| | | styles.putAll(annotationHeaderStyles(wb, styles)); |
| | | |
| | | styles.putAll(annotationDataStyles(wb)); |
| | | |
| | | return styles; |
| | | } |
| | | |
| | | /** |
| | | * 根据Excel注解创建表格头样式 |
| | | * |
| | | * @param wb 工作薄对象 |
| | | * @return 自定义样式列表 |
| | | */ |
| | | private Map<String, CellStyle> annotationHeaderStyles(Workbook wb, Map<String, CellStyle> styles) |
| | | { |
| | | Map<String, CellStyle> headerStyles = new HashMap<String, CellStyle>(); |
| | | for (Object[] os : fields) |
| | | { |
| | | Excel excel = (Excel) os[1]; |
| | | String key = StringUtils.format("header_{}_{}", excel.headerColor(), excel.headerBackgroundColor()); |
| | | if (!headerStyles.containsKey(key)) |
| | | { |
| | | CellStyle style = wb.createCellStyle(); |
| | | style.cloneStyleFrom(styles.get("data")); |
| | | style.setAlignment(HorizontalAlignment.CENTER); |
| | | style.setVerticalAlignment(VerticalAlignment.CENTER); |
| | | style.setFillForegroundColor(excel.headerBackgroundColor().index); |
| | | style.setFillPattern(FillPatternType.SOLID_FOREGROUND); |
| | | Font headerFont = wb.createFont(); |
| | | headerFont.setFontName("Arial"); |
| | | headerFont.setFontHeightInPoints((short) 10); |
| | | headerFont.setBold(true); |
| | | headerFont.setColor(excel.headerColor().index); |
| | | style.setFont(headerFont); |
| | | headerStyles.put(key, style); |
| | | } |
| | | } |
| | | return headerStyles; |
| | | } |
| | | |
| | | /** |
| | | * 根据Excel注解创建表格列样式 |
| | | * |
| | | * @param wb 工作薄对象 |
| | | * @return 自定义样式列表 |
| | | */ |
| | | private Map<String, CellStyle> annotationDataStyles(Workbook wb) |
| | | { |
| | | Map<String, CellStyle> styles = new HashMap<String, CellStyle>(); |
| | | for (Object[] os : fields) |
| | | { |
| | | Excel excel = (Excel) os[1]; |
| | | String key = StringUtils.format("data_{}_{}_{}", excel.align(), excel.color(), excel.backgroundColor()); |
| | | if (!styles.containsKey(key)) |
| | | { |
| | | CellStyle style = wb.createCellStyle(); |
| | | style.setAlignment(excel.align()); |
| | | style.setVerticalAlignment(VerticalAlignment.CENTER); |
| | | style.setBorderRight(BorderStyle.THIN); |
| | | style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); |
| | | style.setBorderLeft(BorderStyle.THIN); |
| | | style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); |
| | | style.setBorderTop(BorderStyle.THIN); |
| | | style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); |
| | | style.setBorderBottom(BorderStyle.THIN); |
| | | style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); |
| | | style.setFillPattern(FillPatternType.SOLID_FOREGROUND); |
| | | style.setFillForegroundColor(excel.backgroundColor().getIndex()); |
| | | Font dataFont = wb.createFont(); |
| | | dataFont.setFontName("Arial"); |
| | | dataFont.setFontHeightInPoints((short) 10); |
| | | dataFont.setColor(excel.color().index); |
| | | style.setFont(dataFont); |
| | | styles.put(key, style); |
| | | } |
| | | } |
| | | return styles; |
| | | } |
| | | |
| | | /** |
| | | * 创建单元格 |
| | | */ |
| | | public Cell createHeadCell(Excel attr, Row row, int column) |
| | | { |
| | | // 创建列 |
| | | Cell cell = row.createCell(column); |
| | | // 写入列信息 |
| | | cell.setCellValue(attr.name()); |
| | | setDataValidation(attr, row, column); |
| | | cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); |
| | | if (isSubList()) |
| | | { |
| | | // 填充默认样式,防止合并单元格样式失效 |
| | | sheet.setDefaultColumnStyle(column, styles.get(StringUtils.format("data_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor()))); |
| | | if (attr.needMerge()) |
| | | { |
| | | sheet.addMergedRegion(new CellRangeAddress(rownum - 1, rownum, column, column)); |
| | | } |
| | | } |
| | | return cell; |
| | | } |
| | | |
| | | /** |
| | | * 设置单元格信息 |
| | | * |
| | | * @param value 单元格值 |
| | | * @param attr 注解相关 |
| | | * @param cell 单元格信息 |
| | | */ |
| | | public void setCellVo(Object value, Excel attr, Cell cell) |
| | | { |
| | | if (ColumnType.STRING == attr.cellType()) |
| | | { |
| | | String cellValue = Convert.toStr(value); |
| | | // 对于任何以表达式触发字符 =-+@开头的单元格,直接使用tab字符作为前缀,防止CSV注入。 |
| | | if (StringUtils.startsWithAny(cellValue, FORMULA_STR)) |
| | | { |
| | | cellValue = RegExUtils.replaceFirst(cellValue, FORMULA_REGEX_STR, "\t$0"); |
| | | } |
| | | if (value instanceof Collection && StringUtils.equals("[]", cellValue)) |
| | | { |
| | | cellValue = StringUtils.EMPTY; |
| | | } |
| | | cell.setCellValue(StringUtils.isNull(cellValue) ? attr.defaultValue() : cellValue + attr.suffix()); |
| | | } |
| | | else if (ColumnType.NUMERIC == attr.cellType()) |
| | | { |
| | | if (StringUtils.isNotNull(value)) |
| | | { |
| | | cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value)); |
| | | } |
| | | } |
| | | else if (ColumnType.IMAGE == attr.cellType()) |
| | | { |
| | | ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), cell.getRow().getRowNum() + 1); |
| | | String imagePath = Convert.toStr(value); |
| | | if (StringUtils.isNotEmpty(imagePath)) |
| | | { |
| | | byte[] data = ImageUtils.getImage(imagePath); |
| | | getDrawingPatriarch(cell.getSheet()).createPicture(anchor, |
| | | cell.getSheet().getWorkbook().addPicture(data, getImageType(data))); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取画布 |
| | | */ |
| | | public static Drawing<?> getDrawingPatriarch(Sheet sheet) |
| | | { |
| | | if (sheet.getDrawingPatriarch() == null) |
| | | { |
| | | sheet.createDrawingPatriarch(); |
| | | } |
| | | return sheet.getDrawingPatriarch(); |
| | | } |
| | | |
| | | /** |
| | | * 获取图片类型,设置图片插入类型 |
| | | */ |
| | | public int getImageType(byte[] value) |
| | | { |
| | | String type = FileTypeUtils.getFileExtendName(value); |
| | | if ("JPG".equalsIgnoreCase(type)) |
| | | { |
| | | return Workbook.PICTURE_TYPE_JPEG; |
| | | } |
| | | else if ("PNG".equalsIgnoreCase(type)) |
| | | { |
| | | return Workbook.PICTURE_TYPE_PNG; |
| | | } |
| | | return Workbook.PICTURE_TYPE_JPEG; |
| | | } |
| | | |
| | | /** |
| | | * 创建表格样式 |
| | | */ |
| | | public void setDataValidation(Excel attr, Row row, int column) |
| | | { |
| | | if (attr.name().indexOf("注:") >= 0) |
| | | { |
| | | sheet.setColumnWidth(column, 6000); |
| | | } |
| | | else |
| | | { |
| | | // 设置列宽 |
| | | sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256)); |
| | | } |
| | | if (StringUtils.isNotEmpty(attr.prompt()) || attr.combo().length > 0) |
| | | { |
| | | if (attr.combo().length > 15 || StringUtils.join(attr.combo()).length() > 255) |
| | | { |
| | | // 如果下拉数大于15或字符串长度大于255,则使用一个新sheet存储,避免生成的模板下拉值获取不到 |
| | | setXSSFValidationWithHidden(sheet, attr.combo(), attr.prompt(), 1, 100, column, column); |
| | | } |
| | | else |
| | | { |
| | | // 提示信息或只能选择不能输入的列内容. |
| | | setPromptOrValidation(sheet, attr.combo(), attr.prompt(), 1, 100, column, column); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 添加单元格 |
| | | */ |
| | | public Cell addCell(Excel attr, Row row, T vo, Field field, int column) |
| | | { |
| | | Cell cell = null; |
| | | try |
| | | { |
| | | // 设置行高 |
| | | row.setHeight(maxHeight); |
| | | // 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列. |
| | | if (attr.isExport()) |
| | | { |
| | | // 创建cell |
| | | cell = row.createCell(column); |
| | | if (isSubListValue(vo) && getListCellValue(vo).size() > 1 && attr.needMerge()) |
| | | { |
| | | CellRangeAddress cellAddress = new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column); |
| | | sheet.addMergedRegion(cellAddress); |
| | | } |
| | | cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor()))); |
| | | |
| | | // 用于读取对象中的属性 |
| | | Object value = getTargetValue(vo, field, attr); |
| | | String dateFormat = attr.dateFormat(); |
| | | String readConverterExp = attr.readConverterExp(); |
| | | String separator = attr.separator(); |
| | | if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) |
| | | { |
| | | cell.setCellValue(parseDateToStr(dateFormat, value)); |
| | | } |
| | | else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) |
| | | { |
| | | cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator)); |
| | | } |
| | | else if (value instanceof BigDecimal && -1 != attr.scale()) |
| | | { |
| | | cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).doubleValue()); |
| | | } |
| | | else if (!attr.handler().equals(ExcelHandlerAdapter.class)) |
| | | { |
| | | cell.setCellValue(dataFormatHandlerAdapter(value, attr)); |
| | | } |
| | | else |
| | | { |
| | | // 设置列类型 |
| | | setCellVo(value, attr, cell); |
| | | } |
| | | addStatisticsData(column, Convert.toStr(value), attr); |
| | | } |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | log.error("导出Excel失败{}", e); |
| | | } |
| | | return cell; |
| | | } |
| | | |
| | | /** |
| | | * 设置 POI XSSFSheet 单元格提示或选择框 |
| | | * |
| | | * @param sheet 表单 |
| | | * @param textlist 下拉框显示的内容 |
| | | * @param promptContent 提示内容 |
| | | * @param firstRow 开始行 |
| | | * @param endRow 结束行 |
| | | * @param firstCol 开始列 |
| | | * @param endCol 结束列 |
| | | */ |
| | | public void setPromptOrValidation(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, |
| | | int firstCol, int endCol) |
| | | { |
| | | DataValidationHelper helper = sheet.getDataValidationHelper(); |
| | | DataValidationConstraint constraint = textlist.length > 0 ? helper.createExplicitListConstraint(textlist) : helper.createCustomConstraint("DD1"); |
| | | CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); |
| | | DataValidation dataValidation = helper.createValidation(constraint, regions); |
| | | if (StringUtils.isNotEmpty(promptContent)) |
| | | { |
| | | // 如果设置了提示信息则鼠标放上去提示 |
| | | dataValidation.createPromptBox("", promptContent); |
| | | dataValidation.setShowPromptBox(true); |
| | | } |
| | | // 处理Excel兼容性问题 |
| | | if (dataValidation instanceof XSSFDataValidation) |
| | | { |
| | | dataValidation.setSuppressDropDownArrow(true); |
| | | dataValidation.setShowErrorBox(true); |
| | | } |
| | | else |
| | | { |
| | | dataValidation.setSuppressDropDownArrow(false); |
| | | } |
| | | sheet.addValidationData(dataValidation); |
| | | } |
| | | |
| | | /** |
| | | * 设置某些列的值只能输入预制的数据,显示下拉框(兼容超出一定数量的下拉框). |
| | | * |
| | | * @param sheet 要设置的sheet. |
| | | * @param textlist 下拉框显示的内容 |
| | | * @param promptContent 提示内容 |
| | | * @param firstRow 开始行 |
| | | * @param endRow 结束行 |
| | | * @param firstCol 开始列 |
| | | * @param endCol 结束列 |
| | | */ |
| | | public void setXSSFValidationWithHidden(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, int firstCol, int endCol) |
| | | { |
| | | String hideSheetName = "combo_" + firstCol + "_" + endCol; |
| | | Sheet hideSheet = wb.createSheet(hideSheetName); // 用于存储 下拉菜单数据 |
| | | for (int i = 0; i < textlist.length; i++) |
| | | { |
| | | hideSheet.createRow(i).createCell(0).setCellValue(textlist[i]); |
| | | } |
| | | // 创建名称,可被其他单元格引用 |
| | | Name name = wb.createName(); |
| | | name.setNameName(hideSheetName + "_data"); |
| | | name.setRefersToFormula(hideSheetName + "!$A$1:$A$" + textlist.length); |
| | | DataValidationHelper helper = sheet.getDataValidationHelper(); |
| | | // 加载下拉列表内容 |
| | | DataValidationConstraint constraint = helper.createFormulaListConstraint(hideSheetName + "_data"); |
| | | // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 |
| | | CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); |
| | | // 数据有效性对象 |
| | | DataValidation dataValidation = helper.createValidation(constraint, regions); |
| | | if (StringUtils.isNotEmpty(promptContent)) |
| | | { |
| | | // 如果设置了提示信息则鼠标放上去提示 |
| | | dataValidation.createPromptBox("", promptContent); |
| | | dataValidation.setShowPromptBox(true); |
| | | } |
| | | // 处理Excel兼容性问题 |
| | | if (dataValidation instanceof XSSFDataValidation) |
| | | { |
| | | dataValidation.setSuppressDropDownArrow(true); |
| | | dataValidation.setShowErrorBox(true); |
| | | } |
| | | else |
| | | { |
| | | dataValidation.setSuppressDropDownArrow(false); |
| | | } |
| | | |
| | | sheet.addValidationData(dataValidation); |
| | | // 设置hiddenSheet隐藏 |
| | | wb.setSheetHidden(wb.getSheetIndex(hideSheet), true); |
| | | } |
| | | |
| | | /** |
| | | * 解析导出值 0=男,1=女,2=未知 |
| | | * |
| | | * @param propertyValue 参数值 |
| | | * @param converterExp 翻译注解 |
| | | * @param separator 分隔符 |
| | | * @return 解析后值 |
| | | */ |
| | | public static String convertByExp(String propertyValue, String converterExp, String separator) |
| | | { |
| | | StringBuilder propertyString = new StringBuilder(); |
| | | String[] convertSource = converterExp.split(","); |
| | | for (String item : convertSource) |
| | | { |
| | | String[] itemArray = item.split("="); |
| | | if (StringUtils.containsAny(propertyValue, separator)) |
| | | { |
| | | for (String value : propertyValue.split(separator)) |
| | | { |
| | | if (itemArray[0].equals(value)) |
| | | { |
| | | propertyString.append(itemArray[1] + separator); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | if (itemArray[0].equals(propertyValue)) |
| | | { |
| | | return itemArray[1]; |
| | | } |
| | | } |
| | | } |
| | | return StringUtils.stripEnd(propertyString.toString(), separator); |
| | | } |
| | | |
| | | /** |
| | | * 反向解析值 男=0,女=1,未知=2 |
| | | * |
| | | * @param propertyValue 参数值 |
| | | * @param converterExp 翻译注解 |
| | | * @param separator 分隔符 |
| | | * @return 解析后值 |
| | | */ |
| | | public static String reverseByExp(String propertyValue, String converterExp, String separator) |
| | | { |
| | | StringBuilder propertyString = new StringBuilder(); |
| | | String[] convertSource = converterExp.split(","); |
| | | for (String item : convertSource) |
| | | { |
| | | String[] itemArray = item.split("="); |
| | | if (StringUtils.containsAny(propertyValue, separator)) |
| | | { |
| | | for (String value : propertyValue.split(separator)) |
| | | { |
| | | if (itemArray[1].equals(value)) |
| | | { |
| | | propertyString.append(itemArray[0] + separator); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | if (itemArray[1].equals(propertyValue)) |
| | | { |
| | | return itemArray[0]; |
| | | } |
| | | } |
| | | } |
| | | return StringUtils.stripEnd(propertyString.toString(), separator); |
| | | } |
| | | |
| | | /** |
| | | * 数据处理器 |
| | | * |
| | | * @param value 数据值 |
| | | * @param excel 数据注解 |
| | | * @return |
| | | */ |
| | | public String dataFormatHandlerAdapter(Object value, Excel excel) |
| | | { |
| | | try |
| | | { |
| | | Object instance = excel.handler().newInstance(); |
| | | Method formatMethod = excel.handler().getMethod("format", new Class[] { Object.class, String[].class }); |
| | | value = formatMethod.invoke(instance, value, excel.args()); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | log.error("不能格式化数据 " + excel.handler(), e.getMessage()); |
| | | } |
| | | return Convert.toStr(value); |
| | | } |
| | | |
| | | /** |
| | | * 合计统计信息 |
| | | */ |
| | | private void addStatisticsData(Integer index, String text, Excel entity) |
| | | { |
| | | if (entity != null && entity.isStatistics()) |
| | | { |
| | | Double temp = 0D; |
| | | if (!statistics.containsKey(index)) |
| | | { |
| | | statistics.put(index, temp); |
| | | } |
| | | try |
| | | { |
| | | temp = Double.valueOf(text); |
| | | } |
| | | catch (NumberFormatException e) |
| | | { |
| | | } |
| | | statistics.put(index, statistics.get(index) + temp); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 创建统计行 |
| | | */ |
| | | public void addStatisticsRow() |
| | | { |
| | | if (statistics.size() > 0) |
| | | { |
| | | Row row = sheet.createRow(sheet.getLastRowNum() + 1); |
| | | Set<Integer> keys = statistics.keySet(); |
| | | Cell cell = row.createCell(0); |
| | | cell.setCellStyle(styles.get("total")); |
| | | cell.setCellValue("合计"); |
| | | |
| | | for (Integer key : keys) |
| | | { |
| | | cell = row.createCell(key); |
| | | cell.setCellStyle(styles.get("total")); |
| | | cell.setCellValue(DOUBLE_FORMAT.format(statistics.get(key))); |
| | | } |
| | | statistics.clear(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取bean中的属性值 |
| | | * |
| | | * @param vo 实体对象 |
| | | * @param field 字段 |
| | | * @param excel 注解 |
| | | * @return 最终的属性值 |
| | | * @throws Exception |
| | | */ |
| | | private Object getTargetValue(T vo, Field field, Excel excel) throws Exception |
| | | { |
| | | Object o = field.get(vo); |
| | | if (StringUtils.isNotEmpty(excel.targetAttr())) |
| | | { |
| | | String target = excel.targetAttr(); |
| | | if (target.contains(".")) |
| | | { |
| | | String[] targets = target.split("[.]"); |
| | | for (String name : targets) |
| | | { |
| | | o = getValue(o, name); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | o = getValue(o, target); |
| | | } |
| | | } |
| | | return o; |
| | | } |
| | | |
| | | /** |
| | | * 以类的属性的get方法方法形式获取值 |
| | | * |
| | | * @param o |
| | | * @param name |
| | | * @return value |
| | | * @throws Exception |
| | | */ |
| | | private Object getValue(Object o, String name) throws Exception |
| | | { |
| | | if (StringUtils.isNotNull(o) && StringUtils.isNotEmpty(name)) |
| | | { |
| | | Class<?> clazz = o.getClass(); |
| | | Field field = clazz.getDeclaredField(name); |
| | | field.setAccessible(true); |
| | | o = field.get(o); |
| | | } |
| | | return o; |
| | | } |
| | | |
| | | /** |
| | | * 得到所有定义字段 |
| | | */ |
| | | private void createExcelField() |
| | | { |
| | | this.fields = getFields(); |
| | | this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList()); |
| | | this.maxHeight = getRowHeight(); |
| | | } |
| | | |
| | | /** |
| | | * 获取字段注解信息 |
| | | */ |
| | | public List<Object[]> getFields() |
| | | { |
| | | List<Object[]> fields = new ArrayList<Object[]>(); |
| | | List<Field> tempFields = new ArrayList<>(); |
| | | tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields())); |
| | | tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); |
| | | for (Field field : tempFields) |
| | | { |
| | | if (!ArrayUtils.contains(this.excludeFields, field.getName())) |
| | | { |
| | | // 单注解 |
| | | if (field.isAnnotationPresent(Excel.class)) |
| | | { |
| | | Excel attr = field.getAnnotation(Excel.class); |
| | | if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) |
| | | { |
| | | field.setAccessible(true); |
| | | fields.add(new Object[] { field, attr }); |
| | | } |
| | | if (Collection.class.isAssignableFrom(field.getType())) |
| | | { |
| | | subMethod = getSubMethod(field.getName(), clazz); |
| | | ParameterizedType pt = (ParameterizedType) field.getGenericType(); |
| | | Class<?> subClass = (Class<?>) pt.getActualTypeArguments()[0]; |
| | | this.subFields = FieldUtils.getFieldsListWithAnnotation(subClass, Excel.class); |
| | | } |
| | | } |
| | | |
| | | // 多注解 |
| | | if (field.isAnnotationPresent(Excels.class)) |
| | | { |
| | | Excels attrs = field.getAnnotation(Excels.class); |
| | | Excel[] excels = attrs.value(); |
| | | for (Excel attr : excels) |
| | | { |
| | | if (!ArrayUtils.contains(this.excludeFields, field.getName() + "." + attr.targetAttr()) |
| | | && (attr != null && (attr.type() == Type.ALL || attr.type() == type))) |
| | | { |
| | | field.setAccessible(true); |
| | | fields.add(new Object[] { field, attr }); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | return fields; |
| | | } |
| | | |
| | | /** |
| | | * 根据注解获取最大行高 |
| | | */ |
| | | public short getRowHeight() |
| | | { |
| | | double maxHeight = 0; |
| | | for (Object[] os : this.fields) |
| | | { |
| | | Excel excel = (Excel) os[1]; |
| | | maxHeight = Math.max(maxHeight, excel.height()); |
| | | } |
| | | return (short) (maxHeight * 20); |
| | | } |
| | | |
| | | /** |
| | | * 创建一个工作簿 |
| | | */ |
| | | public void createWorkbook() |
| | | { |
| | | this.wb = new SXSSFWorkbook(500); |
| | | this.sheet = wb.createSheet(); |
| | | wb.setSheetName(0, sheetName); |
| | | this.styles = createStyles(wb); |
| | | } |
| | | |
| | | /** |
| | | * 创建工作表 |
| | | * |
| | | * @param sheetNo sheet数量 |
| | | * @param index 序号 |
| | | */ |
| | | public void createSheet(int sheetNo, int index) |
| | | { |
| | | // 设置工作表的名称. |
| | | if (sheetNo > 1 && index > 0) |
| | | { |
| | | this.sheet = wb.createSheet(); |
| | | this.createTitle(); |
| | | wb.setSheetName(index, sheetName + index); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取单元格值 |
| | | * |
| | | * @param row 获取的行 |
| | | * @param column 获取单元格列号 |
| | | * @return 单元格值 |
| | | */ |
| | | public Object getCellValue(Row row, int column) |
| | | { |
| | | if (row == null) |
| | | { |
| | | return row; |
| | | } |
| | | Object val = ""; |
| | | try |
| | | { |
| | | Cell cell = row.getCell(column); |
| | | if (StringUtils.isNotNull(cell)) |
| | | { |
| | | if (cell.getCellType() == CellType.NUMERIC || cell.getCellType() == CellType.FORMULA) |
| | | { |
| | | val = cell.getNumericCellValue(); |
| | | if (DateUtil.isCellDateFormatted(cell)) |
| | | { |
| | | val = DateUtil.getJavaDate((Double) val); // POI Excel 日期格式转换 |
| | | } |
| | | else |
| | | { |
| | | if ((Double) val % 1 != 0) |
| | | { |
| | | val = new BigDecimal(val.toString()); |
| | | } |
| | | else |
| | | { |
| | | val = new DecimalFormat("0").format(val); |
| | | } |
| | | } |
| | | } |
| | | else if (cell.getCellType() == CellType.STRING) |
| | | { |
| | | val = cell.getStringCellValue(); |
| | | } |
| | | else if (cell.getCellType() == CellType.BOOLEAN) |
| | | { |
| | | val = cell.getBooleanCellValue(); |
| | | } |
| | | else if (cell.getCellType() == CellType.ERROR) |
| | | { |
| | | val = cell.getErrorCellValue(); |
| | | } |
| | | |
| | | } |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | return val; |
| | | } |
| | | return val; |
| | | } |
| | | |
| | | /** |
| | | * 判断是否是空行 |
| | | * |
| | | * @param row 判断的行 |
| | | * @return |
| | | */ |
| | | private boolean isRowEmpty(Row row) |
| | | { |
| | | if (row == null) |
| | | { |
| | | return true; |
| | | } |
| | | for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) |
| | | { |
| | | Cell cell = row.getCell(i); |
| | | if (cell != null && cell.getCellType() != CellType.BLANK) |
| | | { |
| | | return false; |
| | | } |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | /** |
| | | * 格式化不同类型的日期对象 |
| | | * |
| | | * @param dateFormat 日期格式 |
| | | * @param val 被格式化的日期对象 |
| | | * @return 格式化后的日期字符 |
| | | */ |
| | | public String parseDateToStr(String dateFormat, Object val) |
| | | { |
| | | if (val == null) |
| | | { |
| | | return ""; |
| | | } |
| | | String str; |
| | | if (val instanceof Date) |
| | | { |
| | | str = DateUtils.parseDateToStr(dateFormat, (Date) val); |
| | | } |
| | | else if (val instanceof LocalDateTime) |
| | | { |
| | | str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDateTime) val)); |
| | | } |
| | | else if (val instanceof LocalDate) |
| | | { |
| | | str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDate) val)); |
| | | } |
| | | else |
| | | { |
| | | str = val.toString(); |
| | | } |
| | | return str; |
| | | } |
| | | |
| | | /** |
| | | * 是否有对象的子列表 |
| | | */ |
| | | public boolean isSubList() |
| | | { |
| | | return StringUtils.isNotNull(subFields) && subFields.size() > 0; |
| | | } |
| | | |
| | | /** |
| | | * 是否有对象的子列表,集合不为空 |
| | | */ |
| | | public boolean isSubListValue(T vo) |
| | | { |
| | | return StringUtils.isNotNull(subFields) && subFields.size() > 0 && StringUtils.isNotNull(getListCellValue(vo)) && getListCellValue(vo).size() > 0; |
| | | } |
| | | |
| | | /** |
| | | * 获取集合的值 |
| | | */ |
| | | public Collection<?> getListCellValue(Object obj) |
| | | { |
| | | Object value; |
| | | try |
| | | { |
| | | value = subMethod.invoke(obj, new Object[] {}); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | return new ArrayList<Object>(); |
| | | } |
| | | return (Collection<?>) value; |
| | | } |
| | | |
| | | /** |
| | | * 获取对象的子列表方法 |
| | | * |
| | | * @param name 名称 |
| | | * @param pojoClass 类对象 |
| | | * @return 子列表方法 |
| | | */ |
| | | public Method getSubMethod(String name, Class<?> pojoClass) |
| | | { |
| | | StringBuffer getMethodName = new StringBuffer("get"); |
| | | getMethodName.append(name.substring(0, 1).toUpperCase()); |
| | | getMethodName.append(name.substring(1)); |
| | | Method method = null; |
| | | try |
| | | { |
| | | method = pojoClass.getMethod(getMethodName.toString(), new Class[] {}); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | log.error("获取对象异常{}", e.getMessage()); |
| | | } |
| | | return method; |
| | | } |
| | | } |
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/reflect/ReflectUtils.java
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/req/SubmitTempletReq.java
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/sign/Base64.java
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/sql/SqlUtil.java
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/uuid/IdUtils.java
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/uuid/QRCodeGenerator.java
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/uuid/Seq.java
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/uuid/UUID.java
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/controller/BaseController.java
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/AjaxResult.java
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/BaseDelete.java
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/BaseEntity.java
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/BaseModel.java
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/BasePojo.java
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/TreeEntity.java
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/BasePage.java
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/PageDomain.java
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/PageInfo.java
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/TableDataInfo.java
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/TableSupport.java
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/xss/Xss.java
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/xss/XssValidator.java
ruoyi-common/ruoyi-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
ruoyi-common/ruoyi-common-datascope/pom.xml
ruoyi-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/annotation/DataScope.java
ruoyi-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/aspect/DataScopeAspect.java
ruoyi-common/ruoyi-common-datascope/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
ruoyi-common/ruoyi-common-datasource/pom.xml
ruoyi-common/ruoyi-common-datasource/src/main/java/com/ruoyi/common/datasource/annotation/Master.java
ruoyi-common/ruoyi-common-datasource/src/main/java/com/ruoyi/common/datasource/annotation/Slave.java
ruoyi-common/ruoyi-common-log/pom.xml
ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/annotation/Log.java
ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/aspect/LogAspect.java
ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/enums/BusinessStatus.java
ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/enums/BusinessType.java
ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/enums/OperatorType.java
ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/filter/PropertyPreExcludeFilter.java
ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/service/AsyncLogService.java
ruoyi-common/ruoyi-common-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
ruoyi-common/ruoyi-common-redis/pom.xml
ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/annotation/DistributedLock.java
ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/aspectj/DistributedLockAspect.java
ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/FastJson2JsonRedisSerializer.java
ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java
ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java
ruoyi-common/ruoyi-common-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
ruoyi-common/ruoyi-common-security/pom.xml
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/EnableCustomConfig.java
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/EnableRyFeignClients.java
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/InnerAuth.java
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/Logical.java
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/RequiresLogin.java
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/RequiresPermissions.java
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/RequiresRoles.java
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/aspect/InnerAuthAspect.java
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/aspect/PreAuthorizeAspect.java
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthLogic.java
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthUtil.java
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/config/ApplicationConfig.java
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/config/WebMvcConfig.java
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/feign/FeignAutoConfiguration.java
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/feign/FeignRequestInterceptor.java
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/handler/GlobalExceptionHandler.java
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/interceptor/HeaderInterceptor.java
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/DictUtils.java
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/MD5Generator.java
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/SecurityUtils.java
ruoyi-common/ruoyi-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
ruoyi-common/ruoyi-common-swagger/pom.xml
ruoyi-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/annotation/EnableCustomSwagger2.java
ruoyi-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/config/SwaggerAutoConfiguration.java
ruoyi-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/config/SwaggerBeanPostProcessor.java
ruoyi-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/config/SwaggerProperties.java
ruoyi-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/config/SwaggerWebConfiguration.java
ruoyi-common/ruoyi-common-swagger/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
ruoyi-gateway/pom.xml
ruoyi-gateway/src/main/java/com/ruoyi/gateway/RuoYiGatewayApplication.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/CaptchaConfig.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/GatewayConfig.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/KaptchaTextCreator.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/RouterFunctionConfiguration.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/SwaggerProvider.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/AntiShakeProperties.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/CaptchaProperties.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/IgnoreWhiteProperties.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/SignProperties.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/XssProperties.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/BlackListUrlFilter.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/CacheRequestFilter.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/HMACSHA1.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/RequestParamGlobalFilter.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/SignFilter.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/ValidateCodeFilter.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/XssFilter.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/GatewayExceptionHandler.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SentinelFallbackHandler.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SwaggerHandler.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/ValidateCodeHandler.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/ValidateCodeService.java
ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/impl/ValidateCodeServiceImpl.java
ruoyi-gateway/src/main/resources/banner.txt
ruoyi-gateway/src/main/resources/logback.xml
ruoyi-modules/pom.xml
ruoyi-modules/ruoyi-file/pom.xml
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/RuoYiFileApplication.java
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/config/MinioConfig.java
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/config/ResourcesConfig.java
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/FastDfsSysFileServiceImpl.java
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileService.java
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/MinioSysFileServiceImpl.java
ruoyi-modules/ruoyi-file/src/main/resources/banner.txt
ruoyi-modules/ruoyi-file/src/main/resources/logback.xml
ruoyi-modules/ruoyi-gen/pom.xml
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/RuoYiGenApplication.java
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/config/GenConfig.java
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/controller/GenController.java
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/domain/GenTable.java
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/domain/GenTableColumn.java
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/mapper/GenTableColumnMapper.java
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/mapper/GenTableMapper.java
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/GenTableColumnServiceImpl.java
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/GenTableServiceImpl.java
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/IGenTableColumnService.java
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/IGenTableService.java
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/GenUtils.java
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/VelocityInitializer.java
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/VelocityUtils.java
ruoyi-modules/ruoyi-gen/src/main/resources/banner.txt
ruoyi-modules/ruoyi-gen/src/main/resources/logback.xml
ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/controller.java.vm
ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/domain.java.vm
ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/mapper.java.vm
ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/service.java.vm
ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl.java.vm
ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/sub-domain.java.vm
ruoyi-modules/ruoyi-gen/src/main/resources/vm/js/api.js.vm
ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/sql.vm
ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index-tree.vue.vm
ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index.vue.vm
ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/v3/index-tree.vue.vm
ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/v3/index.vue.vm
ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/v3/readme.txt
ruoyi-modules/ruoyi-gen/src/main/resources/vm/xml/mapper.xml.vm
ruoyi-modules/ruoyi-job/pom.xml
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/RuoYiJobApplication.java
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/config/ScheduleConfig.java
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/controller/SysJobController.java
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/controller/SysJobLogController.java
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/domain/SysJob.java
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/domain/SysJobLog.java
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/mapper/SysJobLogMapper.java
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/mapper/SysJobMapper.java
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/ISysJobLogService.java
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/ISysJobService.java
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/SysJobLogServiceImpl.java
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/SysJobServiceImpl.java
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/task/RyTask.java
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/AbstractQuartzJob.java
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/CronUtils.java
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/JobInvokeUtil.java
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/QuartzDisallowConcurrentExecution.java
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/QuartzJobExecution.java
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/ScheduleUtils.java
ruoyi-modules/ruoyi-job/src/main/resources/banner.txt
ruoyi-modules/ruoyi-job/src/main/resources/logback.xml
ruoyi-modules/ruoyi-job/src/main/resources/mapper/job/SysJobLogMapper.xml
ruoyi-modules/ruoyi-job/src/main/resources/mapper/job/SysJobMapper.xml
ruoyi-modules/ruoyi-system/pom.xml
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/RuoYiSystemApplication.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/GenTableColumnController.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/GenTableController.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysConfigController.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDeptController.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictDataController.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictTypeController.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysJobController.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysJobLogController.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysLoginLogController.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysMenuController.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysNoticeController.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysOperlogController.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysPostController.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysProfileController.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleDeptController.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleMenuController.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserOnlineController.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserPostController.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserRoleController.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/UserShopController.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysMenu.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysMenus.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleDept.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserOnline.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserPost.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserRole.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/AddCompanyUserDto.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/IndexDto.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/RoleAddDto.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/RoleUpdateDto.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/CompanyUserVo.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MetaVo.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RoleInfoVo.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RouterVo.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/TCompanyToUserVo.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/TreeSelect.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/UserRoleVO.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/ViolationListExportVo.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/dto/UpdatePassword.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/filter/AuthFilter.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysConfigMapper.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLoginLogMapper.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserPostMapper.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserShopMapper.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/query/GetSysUserList.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/query/ShopUserStart.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/query/SysOperLogQuery.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLoginLogService.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeService.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPermissionService.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserRoleService.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/UserShopService.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLoginLogServiceImpl.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPermissionServiceImpl.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserRoleServiceImpl.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserShopServiceImpl.java
ruoyi-modules/ruoyi-system/src/main/resources/banner.txt
ruoyi-modules/ruoyi-system/src/main/resources/logback.xml
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/BalanceChangeRecordCopyMapper.xml
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysConfigMapper.xml
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysDeptMapper.xml
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysDictDataMapper.xml
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysDictTypeMapper.xml
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysLoginLogMapper.xml
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysMenuMapper.xml
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysNoticeMapper.xml
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysOperLogMapper.xml
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysPostMapper.xml
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysRoleDeptMapper.xml
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysRoleMenuMapper.xml
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysUserMapper.xml
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysUserPostMapper.xml
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysUserRoleMapper.xml
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/UserShopMapper.xml
ruoyi-modules/ruoyi-system/src/main/resources/mybatis-config.xml
ruoyi-service/pom.xml
ruoyi-service/ruoyi-account/pom.xml
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/RuoYiAccountApplication.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/config/DataUpdateHandlerConfig.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/config/FileUploadConfig.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/config/HttpConfig.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/config/MybatisPlusConfig.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserBankController.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserCancellationLogController.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserPointController.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/AgentQuery.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/BalanceQuery.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/DangerInfoDto.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/RecommendDto.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/SignBackRDto.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/UserCancelQuery.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/UserChangeQuery.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/WithQuery.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/WithdrawalRequestsDTO.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/filter/AuthFilter.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/mapper/AppUserBankMapper.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/mapper/AppUserMapper.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/mapper/UserCancellationLogMapper.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/mapper/UserPointMapper.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/AppUserBankService.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/AppUserService.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/PointSettingService.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/UserCancellationLogService.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/UserPointService.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserBankServiceImpl.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserServiceImpl.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/PointSettingServiceImpl.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserCancellationLogServiceImpl.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserPointServiceImpl.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/GeodesyUtil.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/ObsUploadUtil.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/SMSUtil.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/MD5AndKL.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/PaymentUtil.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/TransferUtil.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/AccountBalanceQueryResult.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/CloseOrderResult.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/FrpCodeEnum.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/QueryOrderResult.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/QueryRefundResult.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/RefundCallbackResult.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/RefundResult.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/SinglePay.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/SinglePayCallbackResult.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/SinglePayQueryResult.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/SinglePayResult.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/UniPayCallbackResult.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/UniPayResult.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/tencentMap/TencentMapUtil.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/weChat/AES.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/weChat/EnvVersion.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/weChat/WXCore.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/weChat/WeChatUtil.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/weChat/WxPKCS7Encoder.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/AppletLogin.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/LoginVo.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/MobileLogin.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/NearbyReferrer.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/NearbyReferrerVo.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/RegisterAccount.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/SMSCode.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/TransferPoint.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserPointDetailVO.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserPointStatistics.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserPointVO.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserStatistics.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserStatisticsDetail.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/WalletStatistics.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/WalletStatisticsDetail.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/WalletVO.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/WithdrawalAuth.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/vip/Level.java
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/vip/VipLevel.java
ruoyi-service/ruoyi-account/src/main/resources/logback.xml
ruoyi-service/ruoyi-account/src/main/resources/mapper/account/AppUserMapper.xml
ruoyi-service/ruoyi-account/src/main/resources/mapper/account/UserCancellationLogMapper.xml
ruoyi-service/ruoyi-account/src/main/resources/mapper/account/UserPointMapper.xml
ruoyi-service/ruoyi-account/src/main/resources/mybatis-config.xml
ruoyi-service/ruoyi-account/src/test/java/com/ruoyi/order/account/RuoYiAccountApplicationTests.java
ruoyi-service/ruoyi-order/pom.xml
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/RuoYiOrderApplication.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/config/DataUpdateHandlerConfig.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/config/HttpConfig.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/config/MybatisPlusConfig.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/JsapiServiceExample.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderGoodController.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/enums/OrderStatus.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/enums/OrderType.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/event/ConfirmDeliveryEvent.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/event/ConfirmDeliveryEventListener.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/event/PayEvent.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/event/PayEventListener.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/filter/AuthFilter.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/OrderGoodMapper.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/OrderMapper.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/OrderGoodService.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/OrderService.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderGoodServiceImpl.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/ExpressDeliveryUtil.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/GeodesyUtil.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/RedisLock.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/MD5AndKL.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/PaymentUtil.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/TransferUtil.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/AccountBalanceQueryResult.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/CloseOrderResult.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/FrpCodeEnum.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/QueryOrderResult.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/QueryRefundResult.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/RefundCallbackResult.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/RefundResult.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/SinglePay.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/SinglePayCallbackResult.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/SinglePayQueryResult.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/SinglePayResult.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/UniPayCallbackResult.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/UniPayResult.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/wechat/TransferUtil.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/wechat/WechatProperty.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/wechat/model/InitiateBatchTransfer.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/vo/MapTrackKD100Vo.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/vo/QueryKD100ListVo.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/vo/QueryKD100Vo.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/AuthPassStatus.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ConfirmDelivery.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/DeliverGoodsRefundPass.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderExport.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderInfoVo.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderPageList.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderPageListVo.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderRefundPassList.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderRefundPassListVo.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderStatistics.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderStatisticsDetail.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/RefundPassInfo.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/Contact.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/Order.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/OrderKey.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/Payer.java
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/Shipping.java
ruoyi-service/ruoyi-order/src/main/resources/logback.xml
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/OrderGoodMapper.xml
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml
ruoyi-service/ruoyi-order/src/main/resources/mybatis-config.xml
ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/order/RuoYiOrderApplicationTests.java
ruoyi-service/ruoyi-other/Dockerfile
ruoyi-service/ruoyi-other/pom.xml
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/RuoYiOtherApplication.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/DataUpdateHandlerConfig.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/HttpConfig.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/MybatisPlusConfig.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/AgreementController.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/BannerController.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/BaseSettingController.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsCategoryController.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsController.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsSeckillController.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsShopController.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/PhoneController.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/PointSettingController.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/RegionController.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/SeckillActivityInfoController.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShopController.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/SystemConfigController.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/dto/GoodsAreaDto.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/dto/PointSettingDto.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/dto/ShopBalanceDto.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/dto/VipSetDto.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/GoodsStatus.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/PhoneType.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShareAddType.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShareAuditStatus.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShopStatus.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/TechnicianErrorCode.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/TechnicianStatus.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/filter/AuthFilter.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/AgreementMapper.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/BannerMapper.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/BaseSettingMapper.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsCategoryMapper.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsMapper.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsSeckillMapper.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsShopMapper.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/PhoneMapper.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/PointSettingMapper.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ReceiverBankChannelMapper.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/RegionMapper.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/SeckillActivityInfoMapper.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShopMapper.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/SystemConfigMapper.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/AgreementService.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/BannerService.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/BaseSettingService.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsCategoryService.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsSeckillService.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsService.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsShopService.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/IAgreementService.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/PhoneService.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/PointSettingService.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ReceiverBankChannelService.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/RegionService.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/SeckillActivityInfoService.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShopService.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/SystemConfigService.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/AgreementServiceImpl.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/BannerServiceImpl.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/BaseSettingServiceImpl.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsCategoryServiceImpl.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsSeckillServiceImpl.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsServiceImpl.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsShopServiceImpl.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/PhoneServiceImpl.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/PointSettingServiceImpl.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ReceiverBankChannelServicImpl.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/RegionServiceImpl.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/SeckillActivityInfoServiceImpl.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ShopServiceImpl.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/SystemConfigServiceImpl.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/GeodesyUtil.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/MD5AndKL.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/PaymentUtil.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/TransferUtil.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/AccountBalanceQueryResult.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/CloseOrderResult.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/FrpCodeEnum.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/QueryOrderResult.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/QueryRefundResult.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/RefundCallbackResult.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/RefundResult.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/SinglePay.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/SinglePayCallbackResult.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/SinglePayQueryResult.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/SinglePayResult.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/UniPayCallbackResult.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/UniPayResult.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/tencentMap/TencentMapUtil.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/GoodsVO.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/Home.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/NearbyShopVO.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/RefundPassSettingVo.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/SaveWithdrawalAccount.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/SeckillActivityDetailVO.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/SeckillActivityVO.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopBalanceStatementDetailPage.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopCommission.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopCommissionDetail.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopDetailVO.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopGoodsList.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopGoodsListVo.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopStatistics.java
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/WalletChangeVO.java
ruoyi-service/ruoyi-other/src/main/resources/logback.xml
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/AgreementMapper.xml
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/CouponInfoMapper.xml
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/GoodsAreaMapper.xml
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/GoodsBargainPriceMapper.xml
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/GoodsMapper.xml
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/GoodsSeckillMapper.xml
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/GoodsShopMapper.xml
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/SeckillActivityInfoMapper.xml
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/ShareMapper.xml
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/ShopBalanceStatementMapper.xml
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/ShopMapper.xml
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/ShopPointMapper.xml
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TechnicianMapper.xml
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TechnicianSubscribeMapper.xml
ruoyi-service/ruoyi-other/src/main/resources/mybatis-config.xml
ruoyi-service/ruoyi-other/src/test/java/com/ruoyi/order/other/RuoYiOtherApplicationTests.java
sql/qijisheng_account.sql
sql/qijisheng_order.sql
sql/qijisheng_other.sql
sql/qijisheng_system.sql |