这个聪明的家伙🔥
这个聪明的家伙
“蒹葭苍苍,白露为霜.所谓伊人,在水一方.”
关注数: 69
粉丝数: 121
发帖数: 6,264
关注贴吧数: 22
【一元自选】2025.03.13-2025.04.30 2025.03.13-2025.04.30 (3月消费1元、4月消费1元、满足对应等级) 地址:http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fx5.qq.com%2Fcp%2Fa20250313xvipzx%2Findex.html&urlrefer=0fa4e6cd576842232f2d0f73c06d872b图片合集(女)图片详细(女)
[Swagger]快速API对接生成方式 一、pom.xml <properties> <swagger.version>2.9.2</swagger.version> <swagger.model.version>1.5.21</swagger.model.version> </properties> <dependencies> <!-- swagger ui --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${swagger.version}</version> <exclusions> <exclusion> <groupId>io.swagger</groupId> <artifactId>swagger-annotations</artifactId> </exclusion> <exclusion> <groupId>io.swagger</groupId> <artifactId>swagger-models</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${swagger.version}</version> </dependency> <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-annotations</artifactId> <version>${swagger.model.version}</version> </dependency> <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-models</artifactId> <version>${swagger.model.version}</version> </dependency> <!--swagger换皮doc--> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <!--在引用时请在maven中央仓库搜索最新版本号--> <version>2.0.4</version> </dependency> </dependencies> 二、main或Application主启动方法 增加注解:@EnableSwagger2 三、增加conf:SwaggerConf package com.iflytek.zhxf.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; @Configuration public class SwaggerConf { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() // 自行修改为自己的包路径 .apis(RequestHandlerSelectors.basePackage("com.on.demo")) .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("mock验证demo平台api文档") .description("mock验证demo平台接口问题") .version("1.0") .build(); } } 四、方法中增加 类:@Api(tags ={"mock验证类"}) 方法: @ApiOperationSupport(author="XX作者") @ApiOperation(value="XXX接口", notes="XXX接口")
追梦:莫负韶华,逐梦前行,做追梦人,未来可期。
荆棘之恋:纵然荆棘丛生,只要是你,便不可阻挡。
慕愉:我命令你,心悦于我。
野:深陷你的柔情,无法自拔,只愿就此沉沦
闲夏悠悠:陪伴,就是不管你需不需要,我都在。
灼热轻语:我不想做你生命的插曲,只想做你生命最完美的结局。
【星光宝藏下架】2022/12/24 10点下架一批+上新一批 官网:http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fx5.qq.com%2Fwebplat%2Finfo%2Fn&urlrefer=9241765739a17b3789616da16236a498 ... 202212/927643.shtml 【下架】【上架】
【记:主题约会自制一些玩法说明】 现在主题约会太多,固定玩法又容易累,自然就衍生出来了自制主题约会房间; 那么在如此多的玩法中,如何能快速融入大家呢? 接下来给大家介绍一些玩法,当然如果有未涉及或差异玩法、欢迎小伙伴们共享及指正: 友情提示几个关键词: 跨区野约:7、z、礼、站,就是“放弃”的意思 跨区邂逅:若未报数,则代表默认对选 约会频道——主题约会——玩法: 1、心动:顾名思义,需要心灵相犀嘛;对局第一轮选自己心动的玩家,第一轮选没黄线就放弃不能第二轮选了(没有心灵相犀嘛) 2、12:又名“1黄2随”、“1h2s”;对局第一轮选自己心动的玩家,第一轮选黄线第二轮则继续选择对方、第一轮选没黄线 则第二轮可以选其他未黄线的玩家 3、双爆:男女双方队伍中第一轮分数最高的2人,可以在对局第一轮选择任一心动玩家(若双方选择冲突、则按照分数高的那人选择为准),第二轮剩余人员可以选择其他未被选择的玩家(注意:第一轮强制被选方,不可拒绝) 4、高爆:又名“高爆队”;对局第一轮男女队伍个人分数最高的玩家队伍、选择任一心动玩家(若3人选择冲突、则按照分数高低为准),第二轮另一个队伍3名玩家才可以选择(注意:第一轮强制被选方,不可拒绝) 5、丑拒:若未表示黄7,那么就是默认黄牵;第一轮在对方3名玩家中选择1名觉得丑的玩家(内心~这里如果想要碰瓷,也可以选择你喜欢的欢喜冤家玩家),第二轮如果在第一轮黄线的玩家 则直接继续选择对方、若没有黄线则要动点脑力活动了(可以选择的玩家必须需满足这个规则:第一轮没有选择过你、你也没有选择过的玩家) 6、盲丑:若未表示黄7,那么就是默认黄牵;第一轮不可以对选、在对方其他2名玩家中选择1名觉得丑的玩家(内心~这里如果想要碰瓷,也可以选择你喜欢的欢喜冤家玩家),第二轮如果在第一轮黄线的玩家 则直接继续选择对方、若没有黄线则又要动点脑力活动了(可以选择的玩家必须需满足这个规则:第一轮没有选择过你、你也没有选择过的玩家) 7、卡分:卡1W、卡2W、卡3W等等;固定一个分数,全部人员蹦跶,对局第一轮最靠近这个分数的玩家(低于这个分数、超出不算)可以选择心动的对方玩家,第二轮剩余玩家随机选择(注意:第一轮强制被选方,不可拒绝) 8、1V5:对局第一轮全场分数最高的一名玩家 可以选择心动的对方玩家,第二轮剩余玩家随机选择(注意:第一轮强制被选方,不可拒绝) 剩余的玩法层出不穷,如果各位小可爱有遇到、或者自创到,则欢迎一起共享安利~
【炫拍】炫拍快乐开启纠结症
【炫舞占用磁盘过大】能删除部分文件? 如题,占用磁盘这么大,有小可爱知道删除哪些文件不影响游戏运行吗?(除了安装包,已删除)ps:安装包已删除
【和】今日份女朋友美好的一天
Hanser - 高阶萌妹成长指南
【记】对戒清单 序号 上架时间 对戒盒名称 对戒名称 产出方式 1 2018/7/12 梁祝·化蝶对戒包 梁祝·化蝶 箱子-梁祝 2 2018/8/4 玫瑰之恋 玫瑰之恋 珍宝/网页 3 2018/9/6 刺客·缠绵对戒包 刺客·缠绵 任意门 4 2018/9/17 紫月星河对戒盒 紫月星河 水晶石/网页 5 2018/10/7 天生一对 天生一对 珍宝/网页 6 2018/11/1 吟乐者对戒包 吟乐者·对戒 箱子 7 2018/11/6 桃夭之吻对戒包 桃夭之吻 任意门 8 2018/11/19 雪域爱恋对戒包 雪域爱恋 水晶石 9 2018/11/22 极夜爱恋对戒包 极夜爱恋 箱子 10 2019/1/1 河清海晏·鲤对戒包 河清海晏·鲤 箱子 11 2019/1/12 万象森罗·菱对戒包 万象森罗·菱 箱子 12 2019/1/12 极地冰晶·凝对戒包 极地冰晶·凝 幻光 13 2019/1/16 琴瑟和鸣·琴对戒包 琴瑟和鸣·琴 仙露 14 2019/2/1 星光之约·星对戒盒 星光之约·星 任意门 15 2019/2/4 暗香疏影·梅对戒包 暗香疏影·梅 箱子 16 2019/2/16 铃兰摇对戒包 铃兰摇 珍宝/网页 17 2019/3/2 独角兽·梦影对戒包 独角兽·梦影 箱子 18 2019/3/2 白日梦·梦对戒盒 白日梦·梦 水晶石 19 2019/3/16 鸾凤和鸣对戒包 鸾凤和鸣 珍宝 20 2019/3/23 枫林爱恋对戒包 枫林爱恋 珍宝 21 2019/3/26 墨韵·洺对戒包 墨韵·洺 箱子 22 2019/4/2 微醺·醉对戒包 微醺·醉 箱子 23 2019/4/6 彩虹之爱对戒盒 彩虹之爱 珍宝 24 2019/4/8 羽·璃对戒盒 羽·璃 网页 25 2019/4/13 魔法の对戒包 魔法の对戒 珍宝 26 2019/5/18 碧海明灯对戒包 碧海明灯 珍宝 27 2019/5/25 浪里寻岸对戒盒 浪里寻岸 珍宝 28 2019/6/13 缎带·恋与情对戒盒 缎带·恋与情 箱子 29 2019/6/13 夜黑风高对戒盒 夜黑风高 箱子/网页 30 2019/6/22 温暖臂弯对戒盒 温暖臂弯 仙露/珍宝 31 2019/6/26 樱花与你对戒盒 樱花与你 珍宝 32 2019/6/28 青春有你对戒盒 青春有你·对戒 网页/珍宝 33 2019/7/1 缎恋呈心对戒盒 缎恋呈心 消费礼包 34 2019/7/11 雾影舞迷对戒盒 雾影舞迷 月光 35 2019/7/11 舞动倾君对戒盒 舞动倾君·叶恋与花 月光 36 2019/7/13 馨书物语对戒盒 馨书物语 珍宝 37 2019/7/20 雨中眷侣对戒盒 雨中眷侣 仙露-水滴 38 2019/7/24 降临对戒盒 降临·对戒 珍宝 39 2019/7/27 厮守伴生对戒盒 厮守伴生 箱子-天启 40 2019/7/29 星之恋曲对戒盒 星之恋曲·谜 珍宝 41 2019/8/1 情之歌起对戒盒 情之歌·起 星海 42 2019/8/1 不负相思对戒盒 不负相思 星海 43 2019/8/3 恋梦粉趣对戒盒 恋梦粉趣 珍宝 44 2019/8/10 仲夏之泉对戒盒 仲夏之泉 仙露 45 2019/8/15 叶脉对戒盒 叶脉·刻骨铭心 月光 46 2019/8/17 爱琴海之翼对戒盒 爱琴海之翼 珍宝 47 2019/8/24 糖果蜜恋对戒盒 糖果蜜恋 仙露/网页 48 2019/8/31 思慕与共对戒盒 思慕与共 珍宝 49 2019/9/5 流金对戒盒 流金·砂亦迷情 箱子-鎏金 50 2019/9/12 嫦娥对戒盒 奔月之恋 月光-嫦娥 51 2019/9/12 星座物语对戒盒 星座物语·光年 月光-星座 52 2019/9/14 相伴有你对戒盒 相伴有你 珍宝 53 2019/9/17 梦想之音对戒盒 梦想之音 系统补偿 54 2019/9/18 翻转世界对戒盒 翻转世界 仙露 55 2019/9/18 妖灵对戒盒 妖灵·自然之子 仙露-妖灵 56 2019/10/1 如光琴音对戒盒 如光琴音 星海 57 2019/10/1 隽永誓言对戒盒 永恒之恋 星海-隽永 58 2019/10/5 公园邂逅对戒盒 公园邂逅 珍宝 59 2019/10/9 不老魔女对戒盒 幻金之菱 箱子-魔女 60 2019/10/10 情谊绵绵对戒盒 情谊绵绵 网页-棉花糖 61 2019/10/17 永生花对戒盒 永生花·花间偷吻 月光 62 2019/10/17 厨房情缘对戒盒 厨房情缘·餐台调情 月光-厨房 63 2019/10/19 游至你心对戒盒 游至你心 珍宝 64 2019/11/1 云雾对戒盒 云雾·雾中倩影 星海-云雾 65 2019/11/9 情系丝牌对戒 情系丝牌 仙露 66 2019/11/14 枫叶锁情对戒盒 枫叶锁情 任意门- 67 2019/11/14 宫廷对戒盒 宫廷·静謐缠绵 任意门-宫廷 68 2019/11/17 池边之吻对戒盒 池边之吻 珍宝 69 2019/11/20 共舞一曲对戒盒 共舞一曲 仙露 70 2019/12/1 暗夜裁决对戒盒 暗夜裁决·生死与共 星海-暗夜 71 2019/12/7 亭中一梦对戒盒 亭中一梦 珍宝 72 2019/12/12 佳期如梦对戒盒 情之欲动 箱子-佳期 73 2019/12/18 情难自抑对戒盒 情难自抑 仙露 74 2019/12/25 璃络铃铃对戒盒 璃络铃铃 网页 75 2020/1/1 幻兽绮梦对戒盒 清空之泪 星海-幻兽 76 2020/1/4 碎冰之恋对戒盒 碎冰之恋 珍宝 77 2020/1/11 树下荧光对戒 树下荧光 仙露 78 2020/1/15 狐仙桃林对戒盒 狐仙桃林 珍宝 79 2020/1/18 乱世对戒盒 乱世·月霖 极光-乱世 80 2020/1/18 本草对戒盒 灵草幻花 极光-本草 81 2020/1/22 都市传说对戒盒 月狐花晨 箱子-都市 82 2020/1/25 醉爱心扉对戒盒 醉爱心扉·终生 仙露 83 2020/1/29 邂逅花篱对戒盒 邂逅花篱 珍宝 84 2020/2/1 千里江山对戒盒 千里江山 星海- 85 2020/2/1 千语恋歌对戒盒 千语恋歌·语末 星海 86 2020/2/5 征服对戒盒 征服·迷舞 箱子-征服 87 2020/2/8 幸福之始对戒盒 幸福之始 珍宝 88 2020/2/11 醉酒迷情对戒盒 醉酒迷情·共饮 箱子-醉酒 89 2020/2/14 水墨穿越对戒盒 水墨穿越 珍宝 90 2020/2/20 刹那永恒对戒盒 一念之间 月光-刹那 91 2020/2/20 东风探春对戒盒 点笔红妆 月光-东风 92 2020/2/22 月下恋曲对戒盒 月下 珍宝 93 2020/2/26 丝绕情牵对戒盒 小确幸 仙露-丝绕 94 2020/2/28 微光之爱对戒盒 爱情U+ 珍宝 95 2020/3/4 魅惑对戒盒 欲望之茵 箱子-魅惑 96 2020/3/7 小别重逢对戒盒 小别重逢 珍宝 97 2020/3/19 夜游记对戒盒 千灯结缘 月光-夜游记 98 2020/3/19 迷离夜色对戒盒 迷离夜色 月光 99 2020/3/21 魔术师对戒盒 魔术师 珍宝 100 2020/3/25 爱与侵袭对戒盒 爱与侵袭 仙露 101 2020/4/1 口吻生花对戒盒 口吻生花 箱子-青春 102 2020/4/5 宴遇对戒盒 宴遇 珍宝 103 2020/4/16 星火对戒盒 星火 月光- 104 2020/4/16 飞鸟与鱼对戒盒 飞鸟与鱼 月光-飞鸟 105 2020/4/18 摩天之恋对戒盒 摩天之恋 珍宝 106 2020/4/22 迷途羔羊对戒盒 迷途羔羊 箱子-迷途之旅 107 2020/4/25 执手相携对戒包 执手相携 珍宝 108 2020/4/28 纯爱守候对戒盒 纯爱守候 仙露 109 2020/5/1 水佩风裳对戒盒 水佩风裳 星海 110 2020/5/1 荆棘之恋对戒盒 荆棘之恋 星海-荆棘 111 2020/5/9 沉木迷香对戒盒 沉木迷香 珍宝 112 2020/5/13 梦幻虹璃对戒盒 梦幻虹璃 网页 113 2020/5/16 一眼忘川对戒盒 一眼忘川 箱子-叱咤风云 114 2020/5/20 迷城对戒盒 迷城 月光-迷城 115 2020/5/20 幽光秘境对戒盒 幽光秘境 月光-幽光 116 2020/5/23 爱情旋律对戒包 爱情旋律 珍宝 117 2020/5/27 追风对戒盒 追风 仙露-追风 118 2020/5/30 蔷薇誓言对戒盒 蔷薇誓言 珍宝 119 2020/6/3 缘来是你对戒盒 缘来是你 箱子-缘来是你 120 2020/6/11 牵情丝对戒盒 牵情丝 月光-牵情丝 121 2020/6/11 风华如梦对戒盒 风华如梦 月光-风华 122 2020/6/13 时光定格对戒盒 时光定格 珍宝 123 2020/6/20 琴音与你对戒盒 琴音与你 仙露 124 2020/6/27 恋语夜色对戒盒 恋语夜色 珍宝 125 2020/7/1 梦境奇缘对戒盒 梦境奇缘 星海-梦境 126 2020/7/1 月引曜灵对戒盒 月引曜灵 星海-月引 127 2020/7/1 绚丽花火对戒盒 绚丽花火 消费礼包 128 2020/7/4 温馨小窝对戒盒 温馨小窝 珍宝 129 2020/7/6 盛昙一瞬对戒盒 盛昙一瞬 网页 130 2020/7/9 早安达令对戒盒 早安达令 箱子-甜蜜初晨 131 2020/7/11 兰月之夜对戒盒 兰月之夜 珍宝 132 2020/7/18 戒心对戒盒 戒心 极光-戒心 133 2020/7/18 驯兽师对戒盒 驯兽师 极光-驯兽师 134 2020/7/22 青涩爱恋对戒盒 青涩爱恋 仙露 135 2020/7/25 巷中巧遇对戒盒 巷中巧遇 珍宝 136 2020/8/1 浊酒玫瑰对戒盒 浊酒玫瑰 星海-浊酒 137 2020/8/1 双生对戒盒 双生 星海-双生 138 2020/8/1 恋如流水对戒盒 恋如流水 消费礼包 139 2020/8/8 一枕深情对戒盒 一枕深情 珍宝 140 2020/8/13 热浪对戒盒 热浪 箱子-夏热酷炫 141 2020/8/15 动情萌鸭对戒盒 动情萌鸭 珍宝 142 2020/8/19 夕缘对戒盒 夕缘 月光-夕缘 143 2020/8/19 星夜乐灵对戒盒 星夜乐灵 月光 144 2020/8/22 莲池蹁舟对戒盒 莲池蹁舟 珍宝 145 2020/8/25 睡衣派对对戒盒 睡衣派对 箱子-狂欢派对 146 2020/8/29 暖心小家对戒盒 暖心小家 仙露 147 2020/9/5 花开豆蔻对戒盒 花开豆蔻 珍宝 148 2020/9/10 爱别离对戒盒 爱别离 月光-爱别离 149 2020/9/10 心动海岸对戒盒 心动海岸 月光-心动海岸 150 2020/9/12 浪漫旅行对戒盒 浪漫旅行 珍宝 151 2020/9/16 缤果假期对戒盒 缤果假期 仙露-缤果假期 152 2020/9/20 迷情烹饪对戒盒 迷情烹饪 珍宝 153 2020/9/23 魅影特工对戒盒 魅影特工 网页 154 2020/10/1 皎月对戒盒 皎月 星海-皎月 155 2020/10/1 暗刃对戒盒 暗刃 星海-暗刃 156 2020/10/4 心动秘钥对戒盒 心动密钥 珍宝 157 2020/10/7 遇见你对戒盒 遇见你 箱子-不期而遇 158 2020/10/10 观影时光对戒盒 观影时光 珍宝 159 2020/10/12 缘结海角对戒盒 缘结海角 网页 160 2020/10/15 致命身份对戒盒 致命身份 月光-致命身份 161 2020/10/15 仙踪奇缘对戒盒 仙踪奇缘 月光-仙踪奇缘 162 2020/10/17 甜蜜负担对戒盒 甜蜜负担 珍宝 163 2020/10/21 猫咖对戒盒 猫咖 仙露-猫咖 164 2020/11/1 知秋之临对戒盒 知秋之临 星海-知秋之临 165 2020/11/1 囚坠魔影对戒盒 囚坠魔影 星海-囚坠魔影 166 2020/11/5 守护童话对戒盒 守护童话 箱子-森林童话 167 2020/11/7 倾心谧域对戒盒 倾心谧域 珍宝 168 2020/11/12 情劫对戒盒 情劫 月光-情劫 169 2020/11/12 园游会对戒盒 园游会 月光-游园会 170 2020/11/14 纯情告白对戒盒 纯情告白 珍宝 171 2020/11/26 热气球之恋对戒盒 热气球之恋 仙露 172 2020/12/1 魔都魅影对戒盒 魔都魅影 星海-魔都 173 2020/12/1 埃及迷情对戒盒 埃及迷情 星海-埃及迷情 174 2020/12/5 空谷笛音对戒盒 空谷笛音 珍宝 175 2020/12/10 红楼绮梦对戒盒 红楼绮梦 箱子-红楼绮梦 176 2020/12/12 恋与缠绵对戒盒 恋与缠绵 珍宝 177 2020/12/16 锦衣竹林对戒盒 锦衣竹林 网页 178 2020/12/23 烈焰共情对戒盒 烈焰共情 仙露 179 2020/12/26 梦灵幻晶对戒盒 梦灵幻晶 珍宝 180 2021/1/1 午夜情迷对戒盒 午夜情迷 星海-午夜情迷 181 2021/1/1 大漠孤烟对戒盒 大漠孤烟 星海-大漠孤烟 182 2021/1/1 湛空之旅对戒盒 湛空之旅 消费礼包 183 2021/1/7 暖语对戒盒 暖语 箱子-醉梦清甜 184 2021/1/9 钥羽魔杖对戒盒 钥羽魔杖 珍宝 185 2021/1/16 宿命之争对戒盒 宿命之争 极光-宿命之争 186 2021/1/16 谧夜情深对戒盒 谧夜情深 极光-谧夜情深 187 2021/1/20 纪念日对戒盒 纪念日 仙露纪念日 188 2021/1/23 花店来信对戒盒 花店来信 珍宝 189 2021/1/27 私人订制对戒盒 私人订制 箱子-私人订制 190 2010/1/30 甜筒心意对戒盒 甜筒心意 珍宝 191 2021/2/1 画心对戒盒 画心 星海-画心 192 2021/2/1 风间渡对戒盒 风间渡 星海-风间渡 193 2021/2/1 星恋心语对戒盒 星恋心语 消费礼包 194 2021/2/10 清梅诀对戒盒 清梅诀 仙露-青梅诀 195 2021/2/14 岁月如诗对戒盒 岁月如诗 月光-岁月如诗 196 2021/2/14 炫音狂潮对戒盒 炫音狂潮 月光-炫音狂潮 197 2021/2/18 勇士无双对戒盒 勇士无双 箱子-勇士无双 198 2021/2/20 魔法旅程对戒盒 魔法旅程 珍宝 199 2021/2/24 甜心对戒盒 甜心 仙露-甜心 200 2021/2/27 伴水嬉闹对戒盒 伴水嬉闹 珍宝 201 2021/3/2 虚空恋人对戒盒 虚空恋人 箱子-虚空恋人 202 2021/3/6 魔术传情对戒盒 魔术传情 珍宝 203 2021/3/11 夜影对戒盒 夜影 月光-夜影 204 2021/3/11 清风乐铃对戒盒 清风乐铃 月光-清风乐铃 205 2021/3/13 云鹤之羡对戒盒 云鹤之羡 珍宝 206 2021/3/17 初遇对戒盒 初遇 仙露 207 2021/3/20 浪漫悠游对戒盒 浪漫悠游 珍宝 208 2021/3/24 萌动心情对戒盒 萌动心情 网页 209 2021/4/1 左岸相颂对戒盒 左岸香颂 箱子-左岸香颂 210 2021/4/3 醉卧人间对戒盒 醉卧人间 珍宝 211 2021/4/8 春日私语对戒盒 春日私语 月光-春日私语 212 2021/4/8 曼妙之音对戒盒 曼妙之音 月光-曼妙之音 213 2021/4/10 记忆珍藏对戒盒 记忆珍藏 珍宝 214 2021/4/14 情定对戒盒 情定 箱子-情定 215 2021/4/21 回归故里对戒盒 回归故里 网页 216 2021/4/24 爱之嬉闹对戒盒 爱之嬉闹 珍宝 217 2021/4/28 海之吟对戒盒 海之吟 仙露-海之吟 218 2021/5/1 蛊魅对戒盒 蛊魅 星海-蛊魅 219 2021/5/1 野对戒盒 野 星海-野 220 2021/5/8 谋对戒盒 谋 箱子-谋 221 2021/5/13 采买时光对戒盒 采买时光 珍宝 222 2021/5/15 爱情信使对戒盒 爱情信使 仙露-爱情信使 223 2021/5/20 瞄准对戒盒 瞄准 月光-瞄准 224 2021/5/20 游梦对戒盒 游梦 月光-梦游 225 2021/5/22 樱花爱恋对戒盒 樱花爱恋 珍宝 226 2021/5/26 公路旅行对戒盒 公路旅行 星空祈愿-公路 227 2021/5/29 专属惊喜对戒盒 专属惊喜 珍宝 228 2021/6/2 博弈对戒盒 博弈 箱子-棋逢对手 229 2021/6/5 奇妙花园对戒盒 奇妙花园 珍宝 230 2021/6/10 追梦对戒盒 追梦 月光-追梦 231 2021/6/10 相见欢对戒盒 相见欢 月关-相见欢 232 2021/6/12 精灵结界对戒盒 精灵结界 珍宝 233 2021/6/16 乐之颂对戒盒 乐之颂 仙露-乐之颂 234 2021/6/19 嬉闹海岛对戒盒 嬉闹海岛 珍宝 235 2021/6/23 西域追捕对戒盒 西域追捕 网页 236 2021/6/26 圣职者对戒盒 圣职者 星空祈愿-圣职者 237 2021/6/30 良人相伴对戒盒 良人相伴 箱子-金缘玉露 238 2021/7/1 决奕对戒盒 决奕 消费礼包 239 2021/7/3 神秘海域对戒盒 神秘海域 星海-神秘海域 240 2021/7/3 璨羽之拥对戒盒 璨羽之拥 星海 241 2021/7/5 思之念之对戒盒 思之念之 网页 242 2021/7/8 欢乐假期对戒盒 欢乐假期 仙露-欢乐假期 243 2021/7/10 快乐日常对戒盒 快乐日常 珍宝 244 2021/7/14 白狮弥生对戒盒 白狮弥生 极光-白狮 245 2021/7/14 传说对戒盒 传说 极光-传说 246 2021/7/17 恋之雅对戒盒 恋之雅 珍宝 247 2021/7/21 职场对戒盒 职场 星空祈愿-职场 248 2021/7/24 光线未来对戒盒 光线未来 珍宝 249 2021/7/28 万里长空对戒盒 万里长空 箱子-万里长空 250 2021/8/1 甜蜜相框对戒盒 甜蜜相框 消费礼包 251 2021/8/1 光对戒盒 光 星海-光 252 2021/8/1 铁扇飞墨对戒盒 铁扇飞墨 星海-铁扇飞墨 253 2021/8/4 爱琴海对戒盒 爱琴海 星空祈愿-爱情海 254 2021/8/7 彼生爱恋对戒 彼生爱恋 珍宝 255 2021/8/9 宅物语对戒盒 宅物语 箱子-宅物语 256 2021/8/12 慕愉对戒盒 慕愉 仙露-慕愉 257 2021/8/14 一舞倾国对戒盒 一舞倾国 珍宝 258 2021/8/18 渡魂者对戒盒 渡魂者 月光-渡魂者 259 2021/8/18 遗忘之城对戒盒 遗忘之城 月光-遗忘之城 260 2021/8/21 时光之辉对戒盒 时光之辉 珍宝 261 2021/8/25 时倾对戒盒 时倾 箱子-时倾 262 2021/9/1 白茶记事·对戒盒 白茶记事 星空祈愿-白茶记事 263 2021/9/4 星空垂钓对戒盒 星空垂钓 珍宝 264 2021/9/9 绝地突袭·对戒盒 绝地突袭 月光-碧空鸢 265 2021/9/9 碧空鸢·对戒盒 碧空鸢 月光-绝地突袭 266 2021/9/11 小恋曲对戒盒 小恋曲 珍宝 267 2021/9/15 萌宠至上·对戒盒 萌宠至上 仙露-萌宠至上 268 2021/9/19 樊色花林对戒盒 樊色花林 珍宝 269 2021/9/22 午餐茶点对戒盒 午餐茶点 网页 270 2021/9/25 风驰瑾年·对戒盒 风驰瑾年 箱子-风驰瑾年 271 2021/10/1 凌虚之眼·对戒盒 凌虚之眼 星海-凌虚之眼 272 2021/10/1 星云月·对戒盒 星云月 星海-凌虚之眼 273 2021/10/4 居家趣事对戒盒 居家趣事 珍宝 274 2021/10/7 田园诗意·对戒盒 田园诗意 箱子-田园诗意 275 2021/10/10 蝶语飘扬对戒盒 蝶语飘扬 珍宝 276 2021/10/14 爱神咏颂·对戒盒 爱神咏颂 月光-爱神咏颂 277 2021/10/14 流年风华·对戒盒 流年风华 月光-爱神咏颂 278 2021/10/16 气球田野对戒盒 气球田野 珍宝 279 2021/10/20 都市异能·对戒盒 都市异能 仙露 280 2021/10/23 浪漫游船对戒盒 浪漫游船 珍宝 281 2021/10/26 运动心情·对戒盒 运动心情 星空祈愿 282 2021/10/29 明灯之引对戒盒 明灯之引 网页-明灯之引 283 2021/11/1 星愿巴士·对戒盒 星愿巴士 星海 284 2021/11/1 曲终幻影·对戒盒 曲终幻影 星海 285 2021/11/6 幸运选择对戒盒 幸运选择 珍宝 286 2021/11/11 相守桥畔·对戒盒 相守桥畔 月光 287 2021/11/11 迷迭之约·对戒盒 迷迭之约 月光 288 2021/11/13 心动轨迹对戒盒 心动轨迹 珍宝 289 2021/11/17 迷钻相遇·对戒盒 迷钻相遇 仙露 290 2021/11/20 相拥观影对戒盒 相拥观影 珍宝 291 2021/11/24 粉粉甜心对戒盒 粉粉甜心 网页 292 2021/11/27 幻境·对戒盒 幻境 星空祈愿 293 2021/12/1 彼岸·对戒盒 彼岸 星海 294 2021/12/1 粉蜜约会对戒盒 粉蜜约会 星海 295 2021/12/4 烟火轻吻对戒盒 烟火轻吻 珍宝 296 2021/12/9 家有萌宝·对戒盒 家有萌宝 箱子 297 2021/12/11 相遇心扉对戒盒 相遇心扉 珍宝 298 2021/12/15 幽笼行者·对戒盒 幽笼行者 仙露 299 2021/12/18 冰晶汐语对戒盒 冰晶汐语 珍宝 300 2021/12/22 潮流制作对戒盒 潮流制作 网页 301 2021/12/25 邂逅时光·对戒盒 邂逅时光 星空祈愿 302 2022/1/1 粉装出行·对戒盒 粉装出行 星海-银海 303 2022/1/1 忆时·对戒盒 忆时 星海-金海 304 2022/1/1 雪夜极光对戒盒 雪夜极光 礼包满赠 305 2022/1/5 民国舞厅对戒盒 民国舞厅 珍宝 306 2022/1/8 极致魅颜·对戒盒 极致魅颜 宝箱 307 2022/1/13 灵魂酒店·对戒盒 灵魂酒店 仙露 308 2022/1/15 观画奇遇对戒盒 观画奇遇 珍宝 309 2022/1/19 情逆·对戒盒 情逆 极光 310 2022/1/19 九尾一心·对戒盒 九尾一心 极光 311 2022/1/22 天际思念对戒盒 天际思念 珍宝 312 2022/1/26 剪爱·对戒盒 剪爱 宝箱 313 2022/1/29 追逐之语·对戒盒 追逐之语 星空祈愿 314 2022/2/1 暖心夜语·对戒盒 暖心夜语 星海-银海 315 2022/2/1 千羽落雪·对戒盒 千羽落雪 星海-金海 316 2022/2/1 彩虹同行对戒盒 彩虹同行 礼包满赠 317 2022/2/5 欢聚派对·对戒盒 欢聚派对 仙露 318 2022/2/9 楼兰·对戒盒 楼兰 星空祈愿 319 2022/2/12 花廊相会对戒盒 花廊相会 珍宝 320 2022/2/14 爱的靶心·对戒盒 爱的靶心 宝箱 321 2022/2/16 情缠迷幔对戒盒 情缠迷幔 月光 322 2022/2/16 宠溺·对戒盒 宠溺 月光 323 2022/2/19 温暖小窝对戒盒 温暖小窝 珍宝 324 2022/2/23 冰澈倾心·对戒盒 冰澈倾心 仙露 325 2022/2/26 春意萌芽·对戒盒 春意萌芽 箱子 326 2022/3/2 雾都库拉·对戒盒 雾都库拉 星空祈愿 327 2022/3/5 咸鱼周末对戒盒 咸鱼周末 珍宝 328 2022/3/9 踏光而来对戒盒 踏光而来 网页 329 2022/3/12 迷雾世界·对戒盒 迷雾世界 箱子 330 2022/3/17 绫晶·对戒盒 绫晶 月光 331 2022/3/17 幕夜送晚·对戒盒 幕夜送晚 月光 332 2022/3/19 甜蜜夜晚对戒盒 甜蜜夜晚 珍宝 333 2022/3/23 风铃夜·对戒盒 风铃夜 仙露 334 2022/3/26 萤境怀抱对戒盒 萤境怀抱 珍宝 335 2022/3/30 浪漫满星·对戒盒 浪漫满星 星空祈愿 336 2022/4/2 时尚高定·对戒盒 时尚高定 箱子 337 2022/4/6 最美的相遇对戒盒 最美的相遇 网页 338 2022/4/9 云雾梦境对戒盒 云雾梦境 珍宝 339 2022/4/16 暖窝一角对戒盒 暖窝一角 珍宝 340 2022/4/20 寂星·对戒盒 寂星 月光 341 2022/4/20 逐阳追光·对戒盒 逐阳追光 月光 342 2022/4/23 惜君沁饮对戒盒 惜君沁饮 珍宝 343 2022/4/27 动感青春·对戒盒 动感青春 仙露 344 2022/5/1 影誓·对戒盒 影誓 星海 345 2022/5/1 星辉爱恋·对戒盒 星辉爱恋 星海 346 2022/5/4 惊喜彩蛋对戒盒 惊喜彩蛋 珍宝 347 2022/5/7 专属设计·对戒盒 专属设计 礼盒 348 2022/5/11 彩虹星芒对戒盒 彩虹星芒 网页 349 2022/5/14 狮心·对戒盒 狮心 月光 350 2022/5/14 动人微风·对戒盒 动人微风 月光 351 2022/5/18 长安幻夜·对戒盒 长安幻夜 箱子 352 2022/5/21 耀车繁夜·对戒盒 耀车繁夜 仙露 353 2022/5/25 黎光艳后·对戒盒 黎光艳后 星空祈愿 354 2022/5/28 投壶游戏对戒盒 投壶游戏 珍宝 355 2022/6/1 爱的标杆·对戒盒 爱的标杆 箱子 356 2022/6/5 注定相遇对戒盒 注定相遇 珍宝 357 2022/6/9 羽兮·对戒盒 羽兮 月光 358 2022/6/9 情定纪念·对戒盒 情定纪念 月光 359 2022/6/9 冰雪之拥 冰雪之拥 网页舞会活动送 360 2022/6/11 碧海徜徉对戒盒 碧海徜徉 珍宝 361 2022/6/15 甜蜜暴击·对戒盒 甜蜜暴击 仙露 362 2022/6/18 情窦信物对戒盒 情窦信物 珍宝 363 2022/6/22 往事云烟·对戒盒 往事云烟 星空祈愿 364 2022/6/25 玫瑰佳话对戒盒 玫瑰佳话 珍宝 365 2022/6/29 时尚影棚对戒盒 时尚影棚 星瞳网页 366 2022/7/1 热暧对戒盒 热暧 礼包满赠 367 2022/7/2 烟雨水乡·对戒盒 烟雨水乡 星海 368 2022/7/2 云语·对戒盒 云语 星海 369 2022/7/6 浪漫周末·对戒盒 浪漫周末 箱子 370 2022/7/8 深情对戒盒 深情 珍宝 371 2022/7/10 冰钻之心对戒盒 冰钻之心 网页 372 2022/7/14 午后猫咪·对戒盒 午后猫咪 极夜 373 2022/7/14 千灵狐·对戒盒 千灵狐 极光 374 2022/7/20 夏日棕榈·对戒盒 夏日棕榈 仙露 375 2022/7/23 自然生灵对戒盒 自然生灵 珍宝 376 2022/7/27 双影伯爵对戒盒 双影伯爵 星空祈愿 377 2022/7/29 月下相会对戒盒 月下相会 珍宝 378 2022/8/1 幸福来临对戒盒 幸福来临 星海 379 2022/8/1 繁晶初绽·对戒盒 繁晶初绽 星海 380 2022/8/1 香薰迷人对戒盒 香薰迷人 礼包满赠 381 2022/8/4 诱人樱桃对戒盒 诱人樱桃 网页 382 2022/8/7 闲夏悠悠·对戒盒 闲夏悠悠 箱子 383 2022/8/11 灼热轻语·对戒盒 灼热轻语 仙露 384 2022/8/13 甜蜜合拍对戒盒 甜蜜合拍 珍宝 385 2022/8/17 运动课后对戒盒 运动课后 月光 386 2022/8/17 猎焰·对戒盒 猎焰 月光 387 2022/8/20 晴日乘凉对戒盒 晴日乘凉 珍宝 388 2022/8/24 一钻定情对戒盒 一钻定情 389 2022/8/27 厅内共舞对戒盒 厅内共舞 珍宝 390 2022/9/1 新际遇对戒盒 新际遇 星空祈愿
【记】打歌集获得名片徽章特效 最近开始各种名片徽章效果,依次试验——记录共勉。 1、带感女团舞【BoPeep】
【记】舞团徽章特效 最近爱上了各种徽章效果,舞团徽章部分特效也很奈斯,依次试验——有明显效果——记录共勉。 进入方式:社交——右下角舞团——返回舞团经纪公司——小卖部 1、炫彩之团(脚底四角红光+红色火焰+七彩光柱+金色手手光)2、耀目之团(脚底紫色多边形+鬼火焰+紫色光束+紫色手光)3、极光之团(脚底四叶草绿色+绿色光芒+发射七彩光柱+手光绿色)
【记】称号特效 最近爱上了各种徽章效果,偶然看到称号也有效果,依次试验——有明显效果的称号——记录共勉。 1、传说炫金耀星【效果:金色五星法阵圈(背后)】2、两极魔女【效果:发光四角阵芒(脚底) 】3、美丽的不是这个世界 【效果:红色菱形闪烁(脖子附近,晃动可出现) 】4、永恒皇女的罪孽【效果:身体一圈环体,分别有红蓝紫色圈】
【一元选购】纠结三款脸,帮忙出下神仙穿搭,便于选择~ 网址:http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fx5.qq.com%2Fact%2F8549%2Fa20220826yy%2Fmobile.html&urlrefer=50af0bdc600b0a7154cc2d2205b64870 纠结:忧郁尘缘、觉醒彩饰、诗意温柔(几个小可爱喜欢)
【运动蓝系列】傲然和vip箱男脸绝配~
【要不要】抓住夏日的尾巴~
【扒一扒】遇到过的骗子号码 543011719 2959910102 2722499923 1677499913 2625179463 骗术一(初级版):你先加我,你先款,我再送,爽快点,你们区怎么这么墨迹呢 骗术二(进阶版):添加好友后,你等我晚点,被限制了需要等朋友的手机号给验证码,然后消失,连续几天问都是这个理由 骗术三(混淆版):添加好友后,你先款,你看我最近收了多少(各种截图),我怎么会骗你呢,然后疯狂各种截图 骗术四(究极版):添加好友后,你先款,不先货,不行就担保;拉了担保之后、突然消失、各种私聊不回复,然后不了了之 谨防诈骗,人人有责。(稳妥点先货再款、其次选择担保、如果不怕就先款吧(●'◡'●))
【1】发帖记录下~黄瓜片含着饰品
【如何去除】两人靠近会自动出现两个圈,其他人看不到,如何去除 两人靠近会自动出现两个圈,其他人看不到,如何去除哇
【限定男】大家都在发限定,盘一盘男号好看的限定 官网链接: http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fx5.qq.com%2Fwebplat%2Finfo%2Fnews_version3%2F146%2F35241%2F35242%2F35244%2Fm20407%2F202111%2F904470.shtml&urlrefer=90a6e44f47aa72eb1d5ff7b7c6b0deef 限定顺序: 倾人、今日主角、朦胧心意、海上钢琴师、极地之心、月影依风、我愿意、银白花绕、永恒唯一、传承文明、狂野本性、喵喵喵-大橘、邪魅少爷、自由涂鸦、星光之梦、束装、鹤丸、轻纱覆身、甜心喵喵、如意新春、太空服、倾慕目光、欧系主厨、典雅侦探、冰丝雪情、银忆清梦【不可以】、西式静雅【不可以】、传奇教父、寒冬腊月、瀚海千澜、浪影归人、赏金猎人【不可以】、奉我为主、天空画板、醉心之恋、维纳斯梦舞
【动漫】安利一波动漫剧,欢迎分享。 1.carole & tuesday 2.为了女儿,我说不定连魔王都能干掉 3.请问您今天要来点兔子吗 4.小鸠 5.爱吃拉面的小泉同学 6.异国迷宫的十字路口 7.此花亭奇谭 8.URARA迷路贴 9.虫师 10.三者三叶 11.金色琴弦 12.花开伊吕波 13.小林家的龙女仆 14.食戟之灵 15.比宇宙更远的地方 16.妖怪旅馆营业中 17.拾又之国 18.夏目友人帐 19.狐妖小红娘 20.百妖谱 (暂仅导播片) 21.从前有座灵剑山 22.斗罗大陆 23.言叶之庭 24.萤火之森 25. 26.宫崎骏动漫(龙猫、魔女宅急便、哈尔的移动城堡、千与千寻、等等) ============================= 未待完续1.carole & tuesday2.为了女儿,我说不定连魔王都能干掉3.请问您今天要来点兔子吗4.小鸠5.爱吃拉面的小泉同学 6.异国迷宫的十字路口7.此花亭奇谭 8.URARA迷路贴9.虫师10.三者三叶11.金色琴弦12.花开伊吕波13.小林家的龙女仆14.食戟之灵15.比宇宙更远的地方16.妖怪旅馆营业中17.拾又之国18.夏目友人帐19.狐妖小红娘20.百妖谱 (暂仅导播片)21.从前有座灵剑山22.斗罗大陆23.言叶之庭24.萤火之森
【2018/5/8】logs日志 1、log4j2.xml <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <properties> <property name="logPath">D:\log</property> <!-- <property name="logPath">/opt/esb_service/pcl-user/log</property> --> </properties> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%t] %-5p %C{1}:%L [%X{BizCode}][%X{ReqCode}]- %msg%n" /> </Console> <RollingFile name="RollingFile" filename="${logPath}/pcl_user.log" filepattern="${logPath}/%d{yyyyMMddHHmmss}-pcl_user.log.zip"> <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%t] %-5p %C{1}:%L - %msg%n" /> <Policies> <SizeBasedTriggeringPolicy size="10 MB" /> </Policies> <DefaultRolloverStrategy compressionLevel="9" max="20" /><!--compressionLevel:日志压缩级别。0-9,压缩效果依次增大。只对于压缩文件类型有效。 --> </RollingFile> </Appenders> <Loggers> <Logger name="fileLogger" level="info" additivity="false"> <AppenderRef ref="Console" /><!-- UAT或者正式删除掉,原因:放置控制台打出syso --> <AppenderRef ref="RollingFile" /> </Logger> <Root level="info"> <AppenderRef ref="Console" /> </Root> </Loggers> </Configuration> 2、使用.txt private static TxtLogger logger = TxtLogger.getInstance(TestAccount.class.getName()); 3、相关包 log4j-api-2.5.jar log4j-core-2.5.jar log4j-slf4j-impl-2.5.jar logger-tool.jar
【2018/5/8】List去重,排序 //删除掉重复的元素 for ( int i = 0 ; i < m.size() - 1 ; i ++ ) { for ( int j = m.size() - 1 ; j > i; j -- ) { if (m.get(j).getLoan_no().equals(m.get(i).getLoan_no())) { m.remove(j); } } } //排序: Collections.sort; 包commons-lang-2.6.jar //使用类 public List<CdrORUser> getIpccCdrOrderByList(List<CdrORUser> cdrOrUserLists){ List<CdrORUser> m= new ArrayList<CdrORUser>(); try { SortClassCdr sort1 = new SortClassCdr(); Collections.sort(cdrOrUserLists,sort1); for(int i=0;i<cdrOrUserLists.size();i++){ CdrORUser temp = (CdrORUser)cdrOrUserLists.get(i); CdrORUser cdr = new CdrORUser(); cdr.setAgent(temp.getAgent()); cdr.setHrNum(temp.getHrNum()); cdr.setHcNum(temp.getHcNum()); cdr.setTotalNum(temp.getTotalNum()); cdr.setDeptName(temp.getDeptName()); cdr.setRoleName(temp.getRoleName()); cdr.setCalldate_begin(temp.getCalldate_begin()); cdr.setCalldate_end(temp.getCalldate_end()); m.add(cdr); } log.info("INFO【CelServiceImp.getIpccCdrOrderByList】:m.size()="+m.size()); } catch (Exception e) { e.printStackTrace(); log .error("ERROR【CelServiceImp.getIpccCdrOrderByList】"+e.getMessage()); } return m; } //另个类 public class SortClassCdr implements Comparator{ public int compare(Object arg0,Object arg1){ CdrORUser user0 = (CdrORUser)arg0; CdrORUser user1 = (CdrORUser)arg1; int flag = user1.getCalldate_begin().compareTo(user0.getCalldate_begin()); return flag; } }
【2018/4/27】mybatis中生成key及for、linux Jdk(安装)、boots mybatis中生成key及for: 一、生成主键: <insert id="addUserMas" parameterType="user.beans.UUserMas"> <selectKey keyColumn="USER_CODE" keyProperty="userCode" resultType="java.lang.String" order="BEFORE"> select (to_char(sysdate,'yyyymmdd')||'0000'||lpad(USER_CODE_SEQ.nextval,8,'0')) from DUAL </selectKey> insert into U_USER_MAS (USER_CODE, WORK_CODE, USER_TYPE, REALNAME, "PASSWORD", DEPARTMENT, "POSITION", AGENT_CODE, "STATUS", CHANGE_PASSWD_FLAG, CREATOR, CREATE_TIME, LAST_UPD_PASSWD_TIME, LAST_LOGIN_TIME, CITY_CODE, BRANCH_CODE) values (#{userCode,jdbcType=VARCHAR}, #{workCode,jdbcType=VARCHAR}, #{userType,jdbcType=VARCHAR}, #{realname,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{department,jdbcType=VARCHAR}, #{position,jdbcType=VARCHAR}, #{agentCode,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR}, #{changePasswdFlag,jdbcType=VARCHAR}, #{creator,jdbcType=VARCHAR}, sysdate, #{lastUpdPasswdTime,jdbcType=TIMESTAMP}, #{lastLoginTime,jdbcType=TIMESTAMP}, #{cityCode,jdbcType=VARCHAR}, #{branchCode,jdbcType=VARCHAR}) </insert> 二、foreach使用: 1、serviceImp: List ids = new ArrayList(); ids.add("值"); aApPlanLedgMasMapper.updateByPrimaryKeySelective(ids); 2、进入xml之前 int updateByPrimaryKeySelective(List ids); 3、.xml: <update id="updateByPrimaryKeySelective"> update A_AP_PLAN_LEDG_MAS set IS_SUCCESS = '', apBatchNo = '' where 1=1 and AP_LEDG_SEQ_NO in <foreach collection="list" index="index" item="item" open="(" separator="," close=")"> #{item} </foreach> </update>
【2018/4/27】代码加载.properties配置文件信息 Map<String, String> map = PropertiesUtil.loadProperties("config", "user-config.properties"); UserParameterCache.U_PERMISSIONCODES = map.get("permissioncodes");
【2018/4/26】sessionId及oracle关键词 @Controller @RequestMapping("/login") public class LoginController { private TxtLogger logger = TxtLogger.getInstance(LoginController.class.getName()); @Autowired IUserService iUserService; @Autowired IRolePermissionService iRolePermissionService; @Autowired IPubBtCmpMasService iPubBtCmpMasService; /** * 登录页面 * * @param request * @return */ @RequestMapping("/toLogin") public String toLoginPage(HttpServletRequest request) { Object obj = request.getSession().getAttribute(UserConstant.SESSION_LOGIN_UUSERMAS); request.getSession().setAttribute("version", StaticParameters.sysVersion); if (obj == null || (((UUserMas) obj).getWorkCode()).isEmpty()) { return "/user/login"; } return "/main/index"; } /** * 用户登录 */ @RequestMapping("/login") @ResponseBody public String login(HttpServletRequest request, HttpServletResponse response, String workCode, String password) { logger.info("用户登录 workCode = {}", workCode); int flag = 0; try { if (workCode == null || password == null || workCode.isEmpty() || password.isEmpty()) { return JsonUtil.toJson(flag);// 参数异常 } // 根据输入用户名进行校验是否存在:用户工号/用户编号 UUserMas uUserMas = iUserService.queryCodeAndPassWord(workCode); // 获取用户信息 if (null == uUserMas || uUserMas.getUserCode() == null || "".equals(uUserMas.getUserCode())) { return JsonUtil.toJson(-4);// 用户不存在 } // 密码已在前台做是否存在校验 if (uUserMas.getPassword().equals(password)) { if (uUserMas.getStatus().equals("N")) { // 设置登录日志对象 ULoginDetail uLoginDetail = new ULoginDetail(); uLoginDetail.setUserCode(uUserMas.getUserCode());// 登录用户 uLoginDetail.setLoginServer(request.getServerName());// 登录服务器 uLoginDetail.setLoginIp(RequestUtils.getIpAddr(request));// 登录ip iUserService.updateLoginTime(uUserMas.getWorkCode(), uLoginDetail); // 查询用户城市名称 // PubCityCompanyMas pubCityCompanyMas = // pubCityAndBranchService.queryPubCityCompanyMas(null, // uUserMas.getCityCode()); // request.getSession().setAttribute("userCityName", // pubCityCompanyMas.getCityName()); // 查询用户部门名称 UDepartment department = UserConstant.U_DEPARTMENT.get(uUserMas.getDepartment()); request.getSession().setAttribute("userDeptName", department.getDeptName()); request.getSession().setAttribute("cityCode", uUserMas.getCityCode()); request.getSession().setAttribute(UserConstant.SESSION_LOGIN_UUSERMAS, uUserMas); } else if (uUserMas.getStatus().equals("D")) { return JsonUtil.toJson(-7);// 该用户被注销 } } else { return JsonUtil.toJson(-5);// 该用户密码输入不正确 } // 当前用户的所有权限 List<UPermissionMas> userMenuTree = iUserService.queryUserPermission(uUserMas.getWorkCode(), uUserMas.getUserCode()); if (userMenuTree != null && !userMenuTree.isEmpty()) { request.getSession().setAttribute(UserConstant.SESSION_USER_PERMISSION, userMenuTree); // 操作权限:R1 List<String> accessPermissions = new ArrayList<>(); for (UPermissionMas o : userMenuTree) { if (null != o) { if ("R1".equals(o.getPermissionType())) { accessPermissions.add(o.getPageUrl()); } } } request.getSession().setAttribute(UserConstant.SESSION_USER_ACCESS_TREE, accessPermissions); } // 用户菜单权限 request.getSession().setAttribute("menu", JsonUtil.toJson(generateMenuTree(userMenuTree))); // 系统日期 request.getSession().setAttribute(UserConstant.SESSION_SYSTEM_DATE, DateUtils.getNowDate()); // 系统IP String serverIp = getServerIp(); logger.info("登录服务器IP={}", serverIp); request.getSession().setAttribute(UserConstant.SESSION_SYSTEM_IP, serverIp); // 额度权限 Map<String, String> mapBean = new HashMap<>(); mapBean.put("userCode", uUserMas.getUserCode()); mapBean.put("permissionType", "R2"); Map<String, URolePermission> findUserPermission = iRolePermissionService .findUserPermission(uUserMas.getWorkCode(), mapBean); request.getSession().setAttribute(UserConstant.SESSION_USER_LIMIT_TREE, findUserPermission); // 移除登出标识 request.getSession().removeAttribute("SYS_LOGIN_OUT");// 移除标识 // 默认代偿信息 PubBtCmpMas btCmpMas = new PubBtCmpMas(); btCmpMas.setBtcmpId(LoanConstant.COMP_DEFAULT_COMPANY_FLAG); PubBtCmpMas pubBtCmpMas = iPubBtCmpMasService.selectByPrimaryKey(uUserMas.getUserCode(), btCmpMas); if (null != pubBtCmpMas) { LCmpensationMas lCmpensationMas = new LCmpensationMas(); lCmpensationMas.setBtcmpId(LoanConstant.COMP_DEFAULT_COMPANY_FLAG); lCmpensationMas.setCpsCmpNm(pubBtCmpMas.getCpsCmpNm()); lCmpensationMas.setCpsAcctNm(pubBtCmpMas.getCpsAcctNm()); lCmpensationMas.setCpsBankNo(pubBtCmpMas.getCpsBankNo()); lCmpensationMas.setInternalBankCode(pubBtCmpMas.getInternalBankCode()); lCmpensationMas.setBankAcctProv(pubBtCmpMas.getBankAcctProv()); lCmpensationMas.setBankAcctCity(pubBtCmpMas.getBankAcctCity()); lCmpensationMas.setSysType(pubBtCmpMas.getSysType()); request.getSession().setAttribute("defaultCmp", lCmpensationMas); } if ("Y".equals(uUserMas.getChangePasswdFlag())) { flag = 2;// 强制改密【被上级管理员修改过密码、第一次登陆系统】 } else { flag = 1;// 登录成功 } logger.info("用户登录成功,workCode={}", workCode); } catch (Exception e) { flag = -1; logger.error("用户登录失败", e); } return JsonUtil.toJson(flag); } /** * 用户退出 */ @RequestMapping("/logout") public ModelAndView logout(HttpServletRequest request, HttpServletResponse response) { UUserMas uUserMas = (UUserMas) request.getSession().getAttribute(UserConstant.SESSION_LOGIN_UUSERMAS); try { request.getSession().invalidate();// session去除 ULoginDetail uLoginDetail = new ULoginDetail(); if (uUserMas != null) { logger.info("用户退出;userCode={}", uUserMas.getUserCode()); uLoginDetail.setUserCode(uUserMas.getUserCode());// 登录用户 iUserService.updateLoginOutTime(uLoginDetail, uUserMas.getWorkCode()); } } catch (Exception e) { logger.error("用户登出失败!参数:uLoginDetail = {}", uUserMas, e); } request.getSession().setAttribute("SYS_LOGIN_OUT", "Y"); // 重定向跳转到登录页面 return new ModelAndView("redirect:/main/index.do"); } private static final String TRUNK_MENU_ICON = "icon-home"; private static final String LEAF_MENU_ICON = "icon-glass"; private List<MenuTree> generateMenuTree(List<UPermissionMas> permissionMasList) { List<MenuTree> list = new ArrayList<>(); if (null == permissionMasList || permissionMasList.isEmpty()) return list; List<UPermissionMas> menus = new ArrayList<>(); Map<String, MenuTree> map = new HashMap<>(); // printList(permissionMasList); for (UPermissionMas mas : permissionMasList) { if (null == mas) continue; if ("M".equals(mas.getPermissionType())) { if (null == mas.getParentMenuCode()) { MenuTree mainMenu = new MenuTree(); mainMenu.setId(mas.getPermissionCode()); mainMenu.setText(mas.getPermissionName()); mainMenu.setIcon(TRUNK_MENU_ICON); mainMenu.setUrl(""); list.add(mainMenu); map.put(mas.getPermissionCode(), mainMenu); } else { menus.add(mas); } } } for (UPermissionMas mas : menus) { MenuTree trunkMenu = map.get(mas.getParentMenuCode()); if (null == trunkMenu) continue; MenuTree leafMenu = new MenuTree(); leafMenu.setId(mas.getPermissionCode()); leafMenu.setText(mas.getPermissionName()); leafMenu.setIcon(LEAF_MENU_ICON); leafMenu.setUrl(mas.getEsbPageUrl()); trunkMenu.addLeafMenu(leafMenu); } Collections.sort(list); for (MenuTree menuTree : list) Collections.sort(menuTree.getMenus()); return list; } private <T> void printList(Collection<T> t) { if (null == t) return; for (T ts : t) System.out.println(ts); } /** * 获取服务器地址 * * @return Ip地址 */ public String getServerIp() { // 获取操作系统类型 String sysType = System.getProperties().getProperty("os.name"); String ip; if (sysType.toLowerCase().startsWith("win")) { // 如果是Windows系统,获取本地IP地址 String localIP = null; try { localIP = InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException e) { logger.error(e.getMessage(), e); } if (localIP != null) { return localIP; } } else { ip = getIpByEthNum("eth0"); // 兼容Linux if (ip != null) { return ip; } } return "获取服务器IP错误"; } /** * 根据网络接口获取IP地址 * * @param ethNum * 网络接口名,Linux下是eth0 * @return */ private String getIpByEthNum(String ethNum) { try { Enumeration allNetInterfaces = NetworkInterface.getNetworkInterfaces(); InetAddress ip; while (allNetInterfaces.hasMoreElements()) { NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement(); if (ethNum.equals(netInterface.getName())) { Enumeration addresses = netInterface.getInetAddresses(); while (addresses.hasMoreElements()) { ip = (InetAddress) addresses.nextElement(); if (ip != null && ip instanceof Inet4Address) { return ip.getHostAddress(); } } } } } catch (SocketException e) { logger.error(e.getMessage(), e); } return "获取服务器IP错误"; } }
【2018/4/16】mybatis-config.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" "http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fibatis.apache.org%2Fdtd%2Fibatis-3-config.dtd&urlrefer=063e2a8c00f536cab873e945d091932e"> <!-- 配置管理器 --> <configuration> <settings> <setting name="logImpl" value="LOG4J2"/> </settings> <plugins> <!-- com.github.pagehelper为PageHelper类所在包名 --> <plugin interceptor="com.github.pagehelper.PageHelper"> <!-- 4.0.0以后版本可以不设置该参数 --> <property name="dialect" value="oracle" /> <!-- 该参数默认为false --> <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 --> <!-- 和startPage中的pageNum效果一样 --> <property name="offsetAsPageNum" value="true" /> <!-- 该参数默认为false --> <!-- 设置为true时,使用RowBounds分页会进行count查询 --> <property name="rowBoundsWithCount" value="true" /> <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 --> <!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型) --> <property name="pageSizeZero" value="true" /> <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 --> <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 --> <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 --> <property name="reasonable" value="true" /> <!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 --> <!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 --> <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值 --> <!-- 不理解该含义的前提下,不要随便复制该配置 --> <property name="params" value="pageNum=start;pageSize=limit;" /> <!-- 支持通过Mapper接口参数来传递分页参数 --> <property name="supportMethodsArguments" value="true" /> <!-- always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page --> <property name="returnPageInfo" value="check" /> </plugin> </plugins> </configuration>
【2018-4-11】MSD5加密 package com.pcl.los.util; import java.security.MessageDigest; public class MD5Util { /** * 加密 * * @param s * 字符串 * @return 返回加密后数据 */ public final static String getMD5String(String s) { char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; try { byte[] btInput = s.getBytes(); // 获得MD5摘要算法的 MessageDigest 对象 MessageDigest mdInst = MessageDigest.getInstance("MD5"); // 使用指定的字节更新摘要 mdInst.update(btInput); // 获得密文 byte[] md = mdInst.digest(); // 把密文转换成十六进制的字符串形式 int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte byte0 = md[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } return new String(str); } catch (Exception e) { e.printStackTrace(); return null; } } public static void main(String[] args) { System.out.print(MD5Util.getMD5String("password")); } }
【2018/4/11】bootstrapTable添加一行 // 每次加载前需要销毁表格,否则重复加载 $("#epibolyUp_list").bootstrapTable('destroy'); $('#epibolyUp_list').bootstrapTable({data: eval(data.list)}); addTable();//加一列合计 //或者这样加载 $("#epibolyNotes-table").bootstrapTable('destroy'); $("#epibolyNotes-table").bootstrapTable({ data : data.rows }); /** * 加一列合计 */ function addTable(){ //循环得到成功失败笔数 var rows = $('#epibolyUp_list').bootstrapTable('getData'); var amtY = 0; var amtN = 0; for (var i = 0; i < rows.length; i++) { if (rows[i].ocaStatus != null && rows[i].ocaStatus != "") { if(rows[i].ocaStatus == "Y"){ amtY += 1; }else{ amtN += 1; } } } //创建对象实体 var arryLedgAmt = new Array(); function arrs( cityCode,acctType,acctNo,creator,ocaStatus) { this.cityCode = cityCode; this.acctType = acctType; this.acctNo = acctNo; this.creator = creator; this.ocaStatus = ocaStatus; } var a = new arrs("","总条数:"+rows.length," 匹配条数:"+amtY," 不匹配条数:"+amtN,""); arryLedgAmt.push(a); //添加一行 $('#epibolyUp_list').bootstrapTable('append', arryLedgAmt[0]); }
applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.springframework.org%2Fschema%2Fbeans&urlrefer=2cfe664a6b89a7a8c06b489461ff152f" xmlns:p="http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.springframework.org%2Fschema%2Fp&urlrefer=ff0ea7a3e0931ce2b7511d3059b4fcbe" xmlns:context="http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.springframework.org%2Fschema%2Fcontext&urlrefer=eda4949cc9c44315ba915f719c8a3685" xmlns:tx="http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.springframework.org%2Fschema%2Ftx&urlrefer=bb0d9ebc89556cf2cb6470e2fd70d1f8" xmlns:xsi="http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema-instance&urlrefer=8c31805956ebb9a7292762c26181562e" xmlns:aop="http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.springframework.org%2Fschema%2Faop&urlrefer=38f64d940c80f0c3bf17aabd28afbd76" xmlns:util="http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.springframework.org%2Fschema%2Futil&urlrefer=e6a08af331b49de59df6def83046a21b" xmlns:jdbc="http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.springframework.org%2Fschema%2Fjdbc&urlrefer=17a0e2a949fa6dcf8274c2c4d4bb079c" xsi:schemaLocation="http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.springframework.org%2Fschema%2Fbeans&urlrefer=2cfe664a6b89a7a8c06b489461ff152f http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.springframework.org%2Fschema%2Fbeans%2Fspring-beans.xsd&urlrefer=4668e2927538467f0cfc282cdb1c1df9 http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.springframework.org%2Fschema%2Faop&urlrefer=38f64d940c80f0c3bf17aabd28afbd76 http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.springframework.org%2Fschema%2Faop%2Fspring-aop.xsd&urlrefer=00a7fc9766a57092ed396e1e9cf0bb83 http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.springframework.org%2Fschema%2Ftx&urlrefer=bb0d9ebc89556cf2cb6470e2fd70d1f8 http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.springframework.org%2Fschema%2Ftx%2Fspring-tx-3.2.xsd&urlrefer=5e40029520f43f161a2700abd339aba5 http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.springframework.org%2Fschema%2Fjdbc&urlrefer=17a0e2a949fa6dcf8274c2c4d4bb079c http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.springframework.org%2Fschema%2Fjdbc%2Fspring-jdbc-3.2.xsd&urlrefer=de99f39e03be149d79d4f341a1c0ee59 http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.springframework.org%2Fschema%2Futil&urlrefer=e6a08af331b49de59df6def83046a21b http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.springframework.org%2Fschema%2Futil%2Fspring-util.xsd&urlrefer=82ea684ffa37a7ef5f9c739a5d1688bc http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.springframework.org%2Fschema%2Fcontext&urlrefer=eda4949cc9c44315ba915f719c8a3685 http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.springframework.org%2Fschema%2Fcontext%2Fspring-context-3.2.xsd&urlrefer=503d9c915ea0424ad03f79347b4f846f"> <!-- 注解扫描路径配置 --> <context:component-scan base-package="account" /> <!-- 查找jdbc配置文件 属性配置文件扫描配置 --> <context:property-placeholder location="classpath:project.properties" /> <!-- 配置数据源 --> <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="shutdown"> <!-- <property name="driverClassName" value="${db.driverClass}" /> --> <!-- 无需指定,除非系统无法自动识别 --> <property name="jdbcUrl" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}"/> <!-- 连接只读数据库时配置为true, 保证安全 --> <property name="readOnly" value="false" /> <!-- 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒 --> <property name="connectionTimeout" value="30000" /> <!-- 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟 --> <property name="idleTimeout" value="600000" /> <!-- 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒,参考MySQL wait_timeout参数(show variables like '%timeout%';) --> <property name="maxLifetime" value="1800000" /> <!-- 连接池中允许的最大连接数。缺省值:10;推荐的公式:((core_count * 2) + effective_spindle_count) --> <property name="maximumPoolSize" value="5" /> </bean> <!-- Spring和MyBatis完美整合,不需要mybatis的配置映射文件 Mybatis连接会话工厂配置 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 自动扫描mapping.xml文件 --> <property name="mapperLocations" value="classpath*:**/account/mapper/mapping/*.xml"></property> <property name="configLocation" value="classpath:mybatis-config.xml" /> </bean> <!-- DAO接口所在包名,Spring会自动查找其下的类 Mybatis数据访问类扫描 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="**.account.mapper" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean> <!-- 可通过注解控制事务 --> <tx:annotation-driven transaction-manager="transactionManager" /> <!-- 事务管理 事务拦截数据源配置 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 可通过注解控制事务 事务管理器定义 --> <tx:annotation-driven transaction-manager="transactionManager" /> <!-- 其它配置文件导入 --> <import resource="connector.xml" /> <import resource="account.xml" /> <import resource="kft.xml" /> </beans>
【2018/3/29】R1权限 1、注解AUTO package com.pcl.los.common; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * controler层权限配置注解.<br/> * 模块标识和功能点标识共同构成唯一权限点. * @author wxwhy.wang * */ @Retention(RetentionPolicy.RUNTIME) // 声明注解的保留期限 @Target(ElementType.METHOD) // 声明可以使用该注解的目标类型为在方法中使用 public @interfaceAuth { /** 权限值 */ String value(); // 注解成员 } 2、拦截器 package com.pcl.los.interceptor; import java.io.IOException; import java.lang.reflect.Method; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import json.utils.JsonUtil; import logger.utils.TxtLogger; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import com.pcl.los.beans.user.UUserMas; import com.pcl.los.common.Auth; import com.pcl.los.util.UserConstant; /** * 用户操作权限R1判定拦截器 * @author wxwhy.wang * */ public class PermissionInterceptor implements HandlerInterceptor { private static final TxtLogger logger = TxtLogger.getInstance(PermissionInterceptor.class.getName()); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // logger.info("操作权限认证开始"); if(handler instanceof HandlerMethod){ try { Object uUserMas = request.getSession().getAttribute(UserConstant.SESSION_LOGIN_UUSERMAS); String workCode = ((UUserMas)uUserMas).getWorkCode(); Method method = ((HandlerMethod) handler).getMethod(); logger.info("##AccessLog##,用户:{} -- 访问方法:{} -- 参数:{}",workCode, method.getName(),JsonUtil.toJson(request.getParameterMap())); if(method.isAnnotationPresent(Auth.class)){ Auth permissions = method.getAnnotation(Auth.class); String pv = permissions.value(); @SuppressWarnings("unchecked") List accessPermission = (List) request.getSession().getAttribute(UserConstant.SESSION_USER_ACCESS_TREE); if(accessPermission.contains(pv)){ return true; }else{ logger.info("操作权限认证失败,无权限访问"); PermissionInterceptor.setInterceptResult(request,response); return false; } }else{ // logger.info("无权限注解,放行"); return true; } } catch (Exception e) { logger.error("操作权限认证异常:" + e); PermissionInterceptor.setInterceptResult(request,response); return false; } } logger.info("操作权限认证,handler类型错误!"); PermissionInterceptor.setInterceptResult(request,response); return false; } /** * 拦截到请求之后设置响应信息 * @param request * @param response */ private static void setInterceptResult(HttpServletRequest request,HttpServletResponse response) { String XHRHeader = request.getHeader("x-requested-with"); if (XHRHeader != null && XHRHeader.equalsIgnoreCase("XMLHttpRequest")){ response.setHeader("sessionstatus", "noPermission"); return; } try { response.setContentType("text/html;charset=UTF-8"); response.getWriter().write("<script type=\"text/javascript\">alert('权限受限');window.parent.frames.closeTabById();</script>"); } catch (IOException e) { logger.error("设置拦截结果异常:" + e); } } @Override public void afterCompletion(HttpServletRequest req, HttpServletResponse res, Object obj, Exception e) throws Exception { } @Override public void postHandle(HttpServletRequest req, HttpServletResponse res, Object obj, ModelAndView mav) throws Exception { } } 3、applicationContext.xml <!--配置拦截器, 多个拦截器,顺序执行 --> <mvc:interceptors> <mvc:interceptor> <!-- 新贷款系统跳转过来,将拦截进行登录 --> <mvc:mapping path="/**" /> <bean class="com.pcl.los.interceptor.RemoteCallInterceptor"></bean> </mvc:interceptor> <mvc:interceptor> <!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller --> <mvc:mapping path="/**" /> <bean class="com.pcl.los.interceptor.SpringMVCInterceptor"></bean> </mvc:interceptor> <mvc:interceptor> <!-- R1操作权限拦截 --> <mvc:mapping path="/**" /> <mvc:exclude-mapping path="/login/**" /> <bean class="com.pcl.los.interceptor.PermissionInterceptor"></bean> </mvc:interceptor> <!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 --> </mvc:interceptors> 4、使用 /** * 启用角色 */ @Auth("USER:ACTIVEROLE") @RequestMapping("/activeRole") @ResponseBody public String activeRole(HttpSession session,HttpServletRequest request,URoleMas roleMas) { UUserMas sessionUser = (UUserMas) session.getAttribute(UserConstant.SESSION_LOGIN_UUSERMAS); return roleService.updateURoleMas(sessionUser.getWorkCode(),roleMas); }
【2018/3/21】获取上传json文件 /** * 转扣结果导入 上传解析 * * @return */ @RequestMapping("resultPost") @ResponseBody public String resultPost(HttpServletRequest request, @RequestParam("file") CommonsMultipartFile[] files) { String error = "调用了PaymentFileController.resultPost【转扣结果导入】方法"; UUserMas uUserMas = (UUserMas) request.getSession().getAttribute(UserConstant.SESSION_LOGIN_UUSERMAS); logger.info(error+"操作人:"+uUserMas.getWorkCode()); String result = ""; List<Map<String, Object>> list = null; FileOutputStream os = null; InputStream in = null; InputStream ins = null; for (int i = 0; i < files.length; i++) { if (!files[i].isEmpty()) { try { String fileName = files[i].getOriginalFilename(); String type = fileName.substring(fileName.lastIndexOf(".")); String docPath = FilePathConstant.getFilePathGroupByMonth(FilePathConstant.PAY_FILE_UP_DOC_PATH); // 拿到输出流,同时重命名上传的文件 os = new FileOutputStream(docPath + System.currentTimeMillis() + type); // 拿到上传文件的输入流 in = files[i].getInputStream(); // 拿到上传文件的输入流 ins = files[i].getInputStream(); // 以写字节的方式写文件 int b = 0; while ((b = in.read()) != -1) { os.write(b); } os.flush(); //从inputstream中获取上传内容信息 StringWriter writer = new StringWriter(); IOUtils.copy(ins, writer, "UTF-8"); String uploadContent = writer.toString(); if(StringUtils.isEmpty(uploadContent)){ throw new Exception("上传文件为空!"); } //替换全部的换行为逗号 uploadContent = uploadContent.replaceAll("\r\n", ","); //将字符串变成json格式 uploadContent = "[" + uploadContent + "]"; list = JsonUtil.toObject(uploadContent, new ObjectTypeToken<List<Map<String, Object>>>(){}); if(list != null && !list.isEmpty()){ result = iPayService.upOLPayFileResultPost(list,uUserMas.getWorkCode()); } } catch (Exception e) { logger.error(error + "异常!参数{}", e); } finally { if (os != null) { try { os.close(); } catch (IOException e) { logger.error("error",e); } } if (in != null) { try { in.close(); } catch (IOException e) { logger.error("error",e); } } if (ins != null) { try { ins.close(); } catch (IOException e) { logger.error("error",e); } } } } } return result; }
【2018/3/9】生成id package util; import java.util.UUID; /** * 类描述: * * 项目名称:pcl-product * * 类名称:UuidUti * * @version 1.0 */ public class UuidUtil { public static void main(String[] args) { System.out.println(generateUuid().length()); } public static synchronized String generateUuid() { UUID randomUUID = UUID.randomUUID(); return randomUUID.toString().replaceAll("-", ""); } }
【2018/3/9】日期处理相关工具类 package account.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; import org.springframework.util.StringUtils; /** * 日期处理相关工具类 * * 项目名称:common * * 类名称:DateUtils * * 类描述: * * 创建人:hugo.liu * * 创建时间:2016年3月10日 下午4:55:53 * * 版权:深圳安信小额贷款有限责任公司 * * @version 1.0 */ public class DateUtils { /** 定义常量 日期格式化 **/ public static final String DATE_JFP_STR = "yyyyMM"; public static final String DATE_JFP_STRs = "yyyyMMdd"; public static final String DATE_FULL_STR = "yyyy-MM-dd HH:mm:ss"; public static final String DATE_SMALL_STR = "yyyy-MM-dd"; public static final String DATE_KEY_STR = "yyMMddHHmmss"; /** * 使用预设格式提取字符串日期 * * @param strDate * 日期字符串 * @return */ public static Date parse(String strDate) { return parse(strDate, DATE_FULL_STR); } /** * 使用预设格式提取字符串日期 * * @param strDate * 日期字符串 * @return */ public static Date parseDate(String strDate) { return parse(strDate, DATE_SMALL_STR); } /** * 使用预设格式提取字符串日期 * * @param strDate * 日期字符串 * @return */ public static String parseObjectToDate(Object date) { SimpleDateFormat df = new SimpleDateFormat(DATE_SMALL_STR); return df.format(date); } /** * 使用用户格式提取字符串日期 * * @param strDate * 日期字符串 * @param pattern * 日期格式 * @return */ public static Date DateToparse(String strDate, String pattern) { SimpleDateFormat df = new SimpleDateFormat(pattern); try { return df.parse(strDate); } catch (ParseException e) { e.printStackTrace(); return null; } } /** * 使用用户格式提取字符串日期 * * @param strDate * 日期字符串 * @param pattern * 日期格式 * @return */ public static String DateToStr(Date strDate, String pattern) { SimpleDateFormat df = new SimpleDateFormat(pattern); return df.format(strDate); } /** * 把日期格式化成字符串 * * @return */ public static String dateTostring(String dateFormat) { SimpleDateFormat df = new SimpleDateFormat(dateFormat); return df.format(new Date()); } /** * 使用用户格式提取字符串日期 * * @param strDate * 日期字符串 * @param pattern * 日期格式 * @return */ public static Date parse(String strDate, String pattern) { SimpleDateFormat df = new SimpleDateFormat(pattern); try { return df.parse(strDate); } catch (ParseException e) { e.printStackTrace(); return null; } } /** * 两个时间比较 * * @param date * @return */ public static int compareDateWithNow(Date date1) { Date date2 = new Date(); int rnum = date1.compareTo(date2); return rnum; } /** * 两个时间比较(日期) * * @param date * @return */ public static int compareDateWithNowTwo(Date date1) { int rnum = date1.compareTo(getSysDate()); return rnum; } /** * 两个时间比较(时间戳比较) * * @param date * @return */ public static int compareDateWithNow(long date1) { long date2 = dateToUnixTimestamp(); if (date1 > date2) { return 1; } else if (date1 < date2) { return -1; } else { return 0; } } /** * 获取系统当前时间 * * @return */ public static String getNowTime() { SimpleDateFormat df = new SimpleDateFormat(DATE_FULL_STR); return df.format(new Date()); } /** * 获取系统当前日期 * * @return 将系统当前时间转换成yyyy-MM-dd格式并返回 */ public static String getNowDate() { SimpleDateFormat df = new SimpleDateFormat(DATE_SMALL_STR); return df.format(new Date()); } /** * 获取系统当前日期 * * @return 将系统当前时间转换成yyyy-MM-dd格式字符串后 重新转换回Date返回 */ public static Date getSysDate() { SimpleDateFormat df = new SimpleDateFormat(DATE_SMALL_STR); try { return df.parse(df.format(new Date())); } catch (ParseException e) { return null; } } /** * 获取系统当前时间 * * @return */ public static String getNowTime(String type) { SimpleDateFormat df = new SimpleDateFormat(type); return df.format(new Date()); } /** * 获取系统当前计费期 * * @return */ public static String getJFPTime() { SimpleDateFormat df = new SimpleDateFormat(DATE_JFP_STR); return df.format(new Date()); } /** * 获取系统当前计费期 * * @return */ public static String getJFPTimes() { SimpleDateFormat df = new SimpleDateFormat(DATE_JFP_STRs); return df.format(new Date()); } /** * 将指定的日期转换成Unix时间戳 * * @param String * date 需要转换的日期 yyyy-MM-dd HH:mm:ss * @return long 时间戳 */ public static long dateToUnixTimestamp(String date) { long timestamp = 0; try { timestamp = new SimpleDateFormat(DATE_FULL_STR).parse(date).getTime(); } catch (ParseException e) { e.printStackTrace(); } return timestamp; } /** * 将指定的日期转换成Unix时间戳 * * @param String * date 需要转换的日期 yyyy-MM-dd * @return long 时间戳 */ public static long dateToUnixTimestamp(String date, String dateFormat) { long timestamp = 0; try { timestamp = new SimpleDateFormat(dateFormat).parse(date).getTime(); } catch (ParseException e) { e.printStackTrace(); } return timestamp; } /** * 将当前日期转换成Unix时间戳 * * @return long 时间戳 */ public static long dateToUnixTimestamp() { long timestamp = new Date().getTime(); return timestamp; } /** * 将Unix时间戳转换成日期 * * @param long timestamp 时间戳 * @return String 日期字符串 */ public static String unixTimestampToDate(long timestamp) { SimpleDateFormat sd = new SimpleDateFormat(DATE_FULL_STR); sd.setTimeZone(TimeZone.getTimeZone("GMT+8")); return sd.format(new Date(timestamp)); } /** * 获取一个月后的日期,如N不为0就加N天 * * @param n * 一个月后的日期加N天 * @return */ public static String getNextMonth(int n) { SimpleDateFormat df = new SimpleDateFormat(DATE_SMALL_STR); // 制定日期格式 Calendar c = Calendar.getInstance(); Date date = new Date(); c.setTime(date); c.add(Calendar.MONTH, 1); // 将当前日期加一个月 String valDate = df.format(c.getTime()); // 返回String型的时间; // 如n大于0测向后加几天 if (n > 0) { SimpleDateFormat sf = new SimpleDateFormat(DATE_SMALL_STR); Calendar cd = Calendar.getInstance(); sf.format(date); cd.add(Calendar.DAY_OF_MONTH, n); valDate = sf.format(cd.getTime()); } // 返回 return valDate; } /**获取当前时间的年月日 例如20160503 * @return */ public static String getYMD(){ String month = null; String day = null; Calendar now = Calendar.getInstance(); if(((now.get(Calendar.MONTH) + 1)) <10){ month= ("0"+(now.get(Calendar.MONTH) + 1) + "").toString(); } if(now.get(Calendar.DAY_OF_MONTH)<10){ day=("0"+now.get(Calendar.DAY_OF_MONTH)).toString(); } return (now.get(Calendar.YEAR)+""+month+""+day); } /** * 获取一个月后的日期,如N不为0就加N天 * * @param n * 一个月后的日期加N天 * @return */ public static Date getNextMonthDate(int n) { //SimpleDateFormat df = new SimpleDateFormat(DATE_SMALL_STR); // 制定日期格式 Calendar c = Calendar.getInstance(); Date date = new Date(); c.setTime(date); c.add(Calendar.MONTH, 1); // 将当前日期加一个月 Date valDate = c.getTime(); // 返回String型的时间; // 如n大于0测向后加几天 if (n > 0) { SimpleDateFormat sf = new SimpleDateFormat(DATE_SMALL_STR); Calendar cd = Calendar.getInstance(); sf.format(date); cd.add(Calendar.DAY_OF_MONTH, n); valDate = cd.getTime(); } // 返回 return valDate; } /** * 获取对应日期的前后天数 * * @param n * * @return */ public static Date getNextDay(Date date,int n) { Calendar c = Calendar.getInstance(); c.setTime(date); c.add(Calendar.DAY_OF_MONTH, 1); // 将当前日期加一天 Date valDate = c.getTime(); if (n < 0) { Calendar cd = Calendar.getInstance(); cd.setTime(date); cd.add(Calendar.DAY_OF_MONTH, n); valDate =cd.getTime(); } // 返回 return valDate; } public static String formatDate(Date date,String pattern){ if(date == null || StringUtils.isEmpty(pattern)) return null; try { SimpleDateFormat format = new SimpleDateFormat(pattern); return format.format(date); } catch (Exception e) { return null; } } /** * 计算指定两个日期之间相隔天数 * * @param begin * 开始日期 * @param end * 结束日期 * @return 相隔天数 * @throws ParseException */ public static long betweenDate(Date begin, Date end) throws ParseException { long day = 0; SimpleDateFormat format = new SimpleDateFormat(DATE_SMALL_STR); long time = format.parse(format.format(begin)).getTime(); long time2 = format.parse(format.format(end)).getTime(); day = Math.abs((time2 - time) / 24 / 60 / 60 / 1000); return day; } /** * 得到当前日期的前一天 * @return */ public static String formatDateDay(){ SimpleDateFormat sdf = new SimpleDateFormat(DATE_SMALL_STR); //当前日期的前一天 String creaDate = ""; Calendar date1 = Calendar.getInstance(); date1.setTime(new Date()); date1.set(Calendar.DATE, date1.get(Calendar.DATE) - 1); creaDate = sdf.format(date1.getTime()); return creaDate; } /** * 测试 */ public static void main(String[] args) throws Exception { System.out.println(getYMD()); } }
【2018/3/9】Java的简单类型不能够精确的对浮点数进行运算 package util; import java.math.BigDecimal; import java.text.DecimalFormat; /** * 由于Java的简单类型不能够精确的对浮点数进行运算, 这个工具类提供精 确的浮点数运算,包括加减乘除和四舍五入。 */ public class DecimalCalculate { // 默认除法运算精度 private static final int DEF_DIV_SCALE = 20; // 小数进位处理方式 private static final int ROUNDING_MODE = BigDecimal.ROUND_HALF_UP; // 这个类不能实例化 private DecimalCalculate() { } /** * 提供精确的加法运算。 * * @param v1 * 被加数 * @param v2 * 加数 * @return 两个参数的和 */ public static double add(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2).doubleValue(); } /** * 提供精确的减法运算。 * * @param v1 * 被减数 * @param v2 * 减数 * @return 两个参数的差 */ public static double sub(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.subtract(b2).doubleValue(); } /** * 提供精确的乘法运算。 * * @param v1 * 被乘数 * @param v2 * 乘数 * @return 两个参数的积 */ public static double mul(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2).doubleValue(); } /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入。 * * @param v1 * 被除数 * @param v2 * 除数 * @return 两个参数的商 */ public static double div(double v1, double v2) { return div(v1, v2, DEF_DIV_SCALE); } /** * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。 * * @param v1 * 被除数 * @param v2 * 除数 * @param scale * 表示表示需要精确到小数点以后几位。 * @return 两个参数的商 */ public static double div(double v1, double v2, int scale) { if (scale < 0) { throw new IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.divide(b2, scale, ROUNDING_MODE).doubleValue(); } /** * 提供精确的小数位四舍五入处理。 * * @param v * 需要四舍五入的数字 * @param scale * 小数点后保留几位 * @return 四舍五入后的结果 */ public static double round(double v, int scale) { if (scale < 0) { throw new IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b = new BigDecimal(Double.toString(v)); BigDecimal one = new BigDecimal("1"); return b.divide(one, scale, ROUNDING_MODE).doubleValue(); } /** * 提供精确的类型转换(Float) * * @param v * 需要被转换的数字 * @return 返回转换结果 */ public static float convertsToFloat(double v) { BigDecimal b = new BigDecimal(v); return b.floatValue(); } /** * 提供精确的类型转换(Int)不进行四舍五入 * * @param v * 需要被转换的数字 * @return 返回转换结果 */ public static int convertsToInt(double v) { BigDecimal b = new BigDecimal(v); return b.intValue(); } /** * 提供精确的类型转换(Long) * * @param v * 需要被转换的数字 * @return 返回转换结果 */ public static long convertsToLong(double v) { BigDecimal b = new BigDecimal(v); return b.longValue(); } /** * 返回两个数中大的一个值 * * @param v1 * 需要被对比的第一个数 * @param v2 * 需要被对比的第二个数 * @return 返回两个数中大的一个值 */ public static double returnMax(double v1, double v2) { BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.max(b2).doubleValue(); } /** * 返回两个数中小的一个值 * * @param v1 * 需要被对比的第一个数 * @param v2 * 需要被对比的第二个数 * @return 返回两个数中小的一个值 */ public static double returnMin(double v1, double v2) { BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.min(b2).doubleValue(); } /** * 精确对比两个数字 * * @param v1 * 需要被对比的第一个数 * @param v2 * 需要被对比的第二个数 * @return 如果两个数一样则返回0,如果第一个数比第二个数大则返回1,反之返回-1 */ public static int compareTo(double v1, double v2) { BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.compareTo(b2); } /** * 科学计数法处理与格式化金额 * @param d * 需要被转换的数字 * @param n * 需要保留的小数位 * @return */ public static String fmoney(double d ,int n ){ n = n > 0 && n <= 20 ? n : 2; StringBuffer sb = new StringBuffer(); for(int i = 0;i<n; i++){ sb.append("0"); } DecimalFormat myformat = new DecimalFormat(); myformat.applyPattern("##,###."+sb.toString()); return myformat.format(d); } public static Double formateDouble45(Object d){ if(d == null){ return 0d; } BigDecimal b = new BigDecimal(d.toString()); double f = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); return f; } }
【2018/3/6】生成txt //1.js //打包导出 function downloadPayFail(){ var apLedgSeqs=''; var flag = 0; var rows = $("#pay-table").bootstrapTable('getSelections'); if(rows.length==0){ alert("请选择需要打包导出的记录"); return false; } for (var i = 0; i < rows.length; i++) { flag += 1; if (i == 0) { apLedgSeqs = rows[i].apLedgSeq; } else { apLedgSeqs += ","+rows[i].apLedgSeq; } } if (flag == rows.length && flag != 0 && rows.length != 0) { window.open(weburl + "/PaymentFile/downloadPayFailTxt.do?apLedgSeqs="+apLedgSeqs,"_blank"); // window.open(weburl + "/postLoan/overdue/ExportExcel.do?arrlist="+arrlist+"&value="+value,"_blank"); } } //2.java @RequestMapping("/downloadPayFailTxt") public void downloadPayFailTxt(HttpServletResponse response, HttpServletRequest request, String apLedgSeqs){ String error = "调用了【代扣转移 - 打包导出】PaymentFileController.downloadPayFailTxt方法"; try { response.setContentType("text/html;charset=UTF-8"); //查询扣款记录 UUserMas sessionUser = (UUserMas) request.getSession().getAttribute(UserConstant.SESSION_LOGIN_UUSERMAS); List<String> apLedgSeqList = Arrays.asList(apLedgSeqs.split(",")); Map<String, String> resultMap = iPayService.getPayFail(sessionUser.getWorkCode(), null, "", "", apLedgSeqList, 1, 1, "N"); if("SUCC".equals(resultMap.get("RESULT"))){ Map<String, Object> map = JsonUtil.toObject(resultMap.get("DATA"), new ObjectTypeToken<Map<String, Object>>()); if (map.isEmpty()) { logger.warn(error + " 调用15-009:返回值为空"); response.getWriter().write("<script>alert('打包前查询没有记录!');window.close();</script>"); response.getWriter().close(); } List<OLPayFile> payFileList = JsonUtil.toObject(JsonUtil.toJson(map.get("dataList")), new ObjectTypeToken<List<OLPayFile>>() { }); if (payFileList == null || payFileList.isEmpty() || payFileList.size() == 0) { logger.warn(error + " 调用15-009:返回值为空"); response.getWriter().write("<script>alert('打包前查询没有记录!');window.close();</script>"); response.getWriter().close(); } else { Double transAmtSum = 0D; List<PayFailTxtReportDetailBean> detailList = new ArrayList<PayFailTxtReportDetailBean>(); //查询15个银行 List<PubBankDetailMas> plist = new ArrayList<PubBankDetailMas>(); plist.addAll(ParameterConstant.PUBBANKDETAILMAS.get("08")); Map<String, String> bankCodeMap = new HashMap<String, String>(); for(PubBankDetailMas pd: plist){ bankCodeMap.put(pd.getInternalBankCode(), pd.getPartnerBankCode()); } // 遍历: 放入文件明细 for (OLPayFile mp : payFileList) { PayFailTxtReportDetailBean m = new PayFailTxtReportDetailBean(); m.setProposalNo(mp.getProposalNo().toString());// 协议编号 m.setTransAmt(mp.getTransAmt().toString());// 收款金额 m.setOlBankCode(bankCodeMap.get(mp.getOldBankCode()).toString());// 银行行别 m.setCartNo(mp.getCartNo().toString());// 银行账户 m.setUserName(mp.getUserName().toString());// 户名 m.setCertNo(mp.getCertNo().toString());// 证件号码 m.setUserTel("");// 手机号码(旧系统的,这里不放置) m.setUserCreditCardDate("");// 客户信用卡有效期【可为空】 m.setUserCreditCardCVV("");// 客户信用卡的cvv2【可为空】 m.setRemark("");// 附言【可为空】 transAmtSum += mp.getTransAmt(); detailList.add(m); } if(detailList != null && !detailList.isEmpty()){ //2.新增批次表,修改代扣批次号栏位,并返回批次号 String result = iPayService.addPayFailBatch(sessionUser.getWorkCode(), apLedgSeqList); if(result != null && !result.isEmpty() ){ // 放入文件头 PayFailTxtReportBean failTxtReportBean = new PayFailTxtReportBean(); failTxtReportBean.setDetailBeanList(detailList);// 明细 failTxtReportBean.setZkBatchNo(result);// 批次号 failTxtReportBean.setEntrustDate( DateUtils.DateToStr(new Date(), "yyyyMMdd").toString());// 委托日期 failTxtReportBean.setListSizeSum("" + detailList.size());// 总笔数 failTxtReportBean.setTransAmtSum(transAmtSum.toString());// 总金额 failTxtReportBean.setInsteadBankNo("");// 代办行账户号【可为空】 // 下载txt RecordToTxtUtils.execDownloadFlinkTXTFileNew(failTxtReportBean, response); }else{ logger.warn(error + ":新增批次号异常"); response.getWriter().write("<script>alert('打包前生成批次号失败!');window.close();</script>"); response.getWriter().close(); } }else{ logger.warn(error + ":遍历异常"); response.getWriter().write("<script>alert('打包前查询遍历文件明细没有记录!');window.close();</script>"); response.getWriter().close(); } } } } catch (Exception e) { logger.error(error + "异常!参数{}", apLedgSeqs, e); } } //3.java:生成txt package com.pcl.los.util; import java.io.BufferedOutputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import com.pcl.los.beans.pay.PayFailTxtReportBean; import com.pcl.los.beans.pay.PayFailTxtReportDetailBean; /** * * 项目名称:pcl-los-web * * 类名称:RecordToTxtUtils * * 类描述:代扣转移 打包导出 * * 创建人:jing.wang * * 创建时间:2018年3月5日 上午11:13:12 * * 版权:深圳安信小额贷款有限责任公司 * * @version 1.0 */ public class RecordToTxtUtils { /** * 打包导出(txt) * * @param result * 数据列表 * * @param response * @throws Exception */ public static void execDownloadFlinkTXTFileNew(PayFailTxtReportBean result, HttpServletResponse response) throws Exception { Date date = new Date(); SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmm"); response.setHeader("Expires", "0"); response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); response.setHeader("Pragma", "public"); response.setHeader("Content-disposition", "attachment;filename=" + format.format(date) + ".txt"); response.setContentType("text/plain;charset=GBK"); response.setCharacterEncoding("GBK"); BufferedOutputStream buff = null; StringBuffer write = new StringBuffer(); String enter = "\r\n"; ServletOutputStream outSTr = null; try { outSTr = response.getOutputStream();// 建立 buff = new BufferedOutputStream(outSTr); createFileTitle(result, write); createFileContext(result.getDetailBeanList(), write, enter); buff.write(write.toString().getBytes("GBK")); buff.flush(); buff.close(); } finally { try { buff.close(); outSTr.close(); } catch (Exception e) { e.printStackTrace(); } } } /** * 创建文件内容 * * @param result * @param write * @param enter * @throws Exception */ private static void createFileContext(List<PayFailTxtReportDetailBean> result, StringBuffer write, String enter) throws Exception { PayFailTxtReportDetailBean fb = null; for (int i = 0; i < result.size(); i++) { fb = result.get(i); if(StringUtils.isEmpty(fb.getProposalNo())){ throw new NullPointerException("协议编号不能为空"); } String transAmt = ""; if(fb.getTransAmt().contains(".")){ transAmt = fb.getTransAmt().replaceAll("\\.",""); } write.append(formatFlinkString(formatFlinkString(String.valueOf(i + 1),"l",6), "x", 32));// 明细序号——订单编号(必填项) write.append(formatFlinkString(fb.getProposalNo(), "x", 32));// 协议编号(必填项) write.append(formatFlinkString(transAmt, "n", 16));// 收款金额(分)(必填项) write.append(formatFlinkString(fb.getDealName().trim(), "c", 64));// 交易名称(必填项) write.append(fb.getOlBankCode());// 银行行别(必填项) write.append(formatFlinkString(fb.getCartNo(), "x", 32));// 银行账号(必填项) write.append(formatFlinkString(fb.getUserName().trim(), "c", 64));// 户名(必填项) write.append(formatFlinkString(fb.getCertType(), "x", 2));// 证件类型(必填项) write.append(formatFlinkString(fb.getCertNo(), "x", 32));// 证件号码(必填项) write.append(formatFlinkString(fb.getUserTel() == null?"":fb.getUserTel(), "x", 20));// 手机号码(非必填项) write.append(formatFlinkString(fb.getUserCreditCardDate() == null?"":fb.getUserCreditCardDate(), "x", 4));// 客户信用卡有效期(非必填项) write.append(formatFlinkString(fb.getUserCreditCardCVV() == null?"":fb.getUserCreditCardCVV(), "x", 3));// 客户信用卡的cvv2(非必填项) write.append(formatFlinkString(fb.getRemark() == null?"":fb.getRemark(), "x", 128));// 附言(非必填项) if (i < result.size() - 1) { write.append(enter); } } } /** * 创建文件标题 * * @param result * @param write * @throws Exception */ private static void createFileTitle(PayFailTxtReportBean result, StringBuffer write) throws Exception { String transAmtSum = ""; if(result.getTransAmtSum().contains(".")){ transAmtSum = result.getTransAmtSum().replaceAll("\\.",""); } write.append(result.getType());// 业务类型(必填项)固定为 "20" write.append(formatFlinkString(result.getMerchantNo(), "x", 20));// 商户编号(必填项)固定为 "2017120700561130" write.append(formatFlinkString(result.getZkBatchNo(), "x", 32));// 批次号(必填项) write.append(formatFlinkString(result.getServiceNo(), "x", 8));// 服务编号(必填项) write.append(formatFlinkString(result.getEntrustDate(), "x", 8));// 委托日期(必填项) write.append(formatFlinkString(result.getListSizeSum(), "n", 8));// 总笔数(必填项) write.append(formatFlinkString(transAmtSum, "n", 16));// 总金额(分)(必填项) write.append(formatFlinkString(result.getInsteadBankNo() == null?"":result.getInsteadBankNo(), "x", 32));// 代办行账户号(非必填项) write.append("\r\n"); } /** * 格式化字符串 * * @param str * 字符 * @param type * 类型 * @param length * 长度 * @return * @throws Exception */ public static String formatFlinkString(String str, String type, int length) throws Exception { if(str == null) return null; String sReturn = str; if ("n".equals(type)) { while (sReturn.length() < length) { sReturn = "0" + sReturn; } } else if ("x".equals(type)) { while (sReturn.length() < length) { sReturn = sReturn + " "; } } else if ("c".equals(type)) { while (sReturn.getBytes("GBK").length < length) { sReturn = sReturn + " "; } } else if ("l".equals(type)){ while (sReturn.length() < length) { sReturn = "0" + sReturn; } sReturn = "00000001" + sReturn; } return sReturn; } }
【20180306】eclipse配置:背景、字体、maven、dubbo
【2017/01/03】手机壁纸
大家,这个另一半图片有嘛~
1
下一页