这个业务项目有前端 小程序端 后端
198是数据库 202是配置文件 网关
前端和小程序端共用我一个后端 然后资产项目和业务项目会互相调用接口
同时也有可能会调用别的后端的接口 再url上加上一些东西 后便可访问
web module都由springboot自动打包成jar包了 能被浏览器阅读
不能被浏览器阅读的module就是java module
在project Structure里面设置为maven模块
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u7Lo9CO0-1659714390007)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220511175719259.png)]
在manager模块中的pom文件里导入其他的模块 这样就可以使用模块中的东西了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LkhJtsui-1659714390008)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220511175943557.png)]
用的是这几种方法中的哪一种呢?
rabbitmq在这个项目中没有用到 manager模块中没有导入mq
redisOverride了很多方法 可能是用在了manager模块里
redis分布式锁没有原子性 a可能会释放b的锁 要设置uuid 用lua脚本
jedis 对应jdbc
锁卸载manager模块里
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8CQsjENt-1659714390009)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220516092306079.png)]
写在监听类里面了 application
swagger2[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T6BMf9Ls-1659714390009)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220512175008687.png)]
是一种API接口文档
登陆后可以看到大家写的api文档
@ApiModel配合@ApiModelProperty注解可以给实体类(pojo)加注释
@ApiOperation 是放在方法上的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9QxNmQw9-1659714390009)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220513145112697.png)]
@ApiParam就是给参数加备注
用swagger时 响应码是200不代表程序没错 只是这个接口调用成功了
xxljob定时任务
序列化那些实体类作用
Serializable是一个对象序列化的接口。一个类只有实现了Serializable接口,它的对象才能被序列化。
序列化
定义
把对象转换为字节序列的过程称为对象的序列化;
把字节序列恢复为对象的过程称为对象的反序列化。
用途
当我们需要把对象的状态信息通过网络进行传输,或者需要将对象的状态信息持久化,以便将来使用时都需要把对象进行序列化。
网络上传输的都是二进制,不会直接传输对象。
我在开发过程中,实体并没有实现序列化,但我同样可以将数据保存到mysql、Oracle数据库中,为什么非要序列化才能存储呢?
int、long、boolean类型等,都是基本数据类型,数据库里面有与之对应的数据结构。从类声明来看,我们以为的没有进行序列化,其实是在声明的各个不同变量的时候,由具体的数据类型帮助我们实现了序列化操作。所以就算我们不实现serializable依旧可以正常操作。序列化操作用于存储时,一般是对于NoSql数据库。
实现
Serializable接口是一个空接口,相当于一个标识,通知jvm,我不对这个类做序列化了,你(jvm)帮我序列化就好了。
SerialVersionUID
对于JVM来说,要进行持久化的类必须要有一个标记,只有持有这个标记JVM才允许类创建的对象可以通过其IO系统转换为字节数据,从而实现持久化,而这个标记就是Serializable接口。而在反序列化的过程中则需要使用serialVersionUID来确定由那个类来加载这个对象,所以我们在实现Serializable接口的时候,一般还会要去尽量显示地定义serialVersionUID,如:
private static final long serialVersionUID = 1L;
在反序列化的过程中,如果接收方为对象加载了一个类,如果该对象的serialVersionUID与对应持久化时的类不同,那么反序列化的过程中将会导致InvalidClassException异常。例如,在之前反序列化的例子中,我们故意将User类的serialVersionUID改为2L,如:
private static final long serialVersionUID = 2L;
那么此时,在反序例化时就会导致异常,如下:
java.io.InvalidClassException: cn.wudimanong.serializable.User; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2 at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:687) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1880) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1746) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2037) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1568) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:428) at cn.wudimanong.serializable.SerializableTest.readObj(SerializableTest.java:31) at cn.wudimanong.serializable.SerializableTest.main(SerializableTest.java:44)
如果我们在序列化中没有显示地声明serialVersionUID,则序列化运行时将会根据该类的各个方面计算该类默认的serialVersionUID值。但是,Java官方强烈建议所有要序列化的类都显示地声明serialVersionUID字段,因为如果高度依赖于JVM默认生成serialVersionUID,可能会导致其与编译器的实现细节耦合,这样可能会导致在反序列化的过程中发生意外的InvalidClassException异常。因此,为了保证跨不同Java编译器实现的serialVersionUID值的一致,实现Serializable接口的必须显示地声明serialVersionUID字段。
此外serialVersionUID字段地声明要尽可能使用private关键字修饰,这是因为该字段的声明只适用于声明的类,该字段作为成员变量被子类继承是没有用处的!有个特殊的地方需要注意的是,数组类是不能显示地声明serialVersionUID的,因为它们始终具有默认计算的值,不过数组类反序列化过程中也是放弃了匹配serialVersionUID值的要求。
要加到redis的时候必须序列化 平时不用序列化的时候加一个这个也可以没坏处
监听类?实现ApplicationListener接口,泛型使用ContextRefreshedEvent,即在applicationContext完成refresh的时候接收事件。
ApplicationListener 是对 application 生命周期的监听体制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bdD87tDU-1659714390010)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220513162152673.png)]
token彻底理解token,cookie session的区别
https://www.cnblogs.com/moyand/p/9047978.html
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d6GjYRri-1659714390010)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220513164422060.png)]
享给其它⽹站或者第三⽅App。所以简单来说,如果你的⽤户数据可能需要和第三⽅共享,或者允许第三⽅调⽤API接⼝,⽤Token。如果永远只是⾃⼰的⽹站,⾃⼰的App,⽤什么都无所谓了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0K4olWk2-1659714390011)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220518140432165.png)]
application和session的区别一、服务的对象不一样
在同一个浏览器窗口中,无论向服务器发送多少请求,session 对象只有一个;当 application 对象没有被销毁的时候,所有用户都可以享用该 application 对象。
二、性质不一样
session是会话变量,只要同一个浏览器没有被关闭,session对象就会存在;application它类似于系统的全局变量。
三、使用的人不一样
一个浏览器只能创建一个 session 变量;所有浏览器用户都可以使用服务器上的 application 对象。
四、保存的内容不一样
session 对象可以存储或者读取客户的相关信息;application 对象可以用于保存所有程序中的公有数据。
五、变量的生命周期不一样
可以通过编写程序进行修改这个 session 的生命周期的时间;application 的生命周期是最长的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ka2tWOVJ-1659714390011)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220516151401974.png)]
这个类在APP一开始运行的时候会执行一下
@Slf4j @Component public class ApplicationStartup implements ApplicationListener{ private Logger logger = LoggerFactory.getLogger(this.getClass()); private static String strClientID; private static String strClientSecret; private static String tokenUrl; //授权外部系统clientId @Value("${token.clientId}") public void setStrClientID(String strClientID) { ApplicationStartup.strClientID = strClientID; } @Value("${token.clientSecret}") public void setStrClientSecret(String strClientSecret) { ApplicationStartup.strClientSecret = strClientSecret; } @Value("${token.url}") public void setTokenUrl(String tokenUrl) { ApplicationStartup.tokenUrl = tokenUrl; } @Override //ContextRefreshedEvent public void onApplicationEvent(ContextRefreshedEvent event) { ApplicationContext ac = event.getApplicationContext(); //获取RedisDao的实例 RedisDao redisDao = ac.getBean(RedisDao.class); //分布式锁 Date date = new Date(); //定时任务 timeTask(date,redisDao); //lock.releaseLock("resource", identifier); } private void timeTask(Date date, RedisDao redisDao){ try { new Timer("testTimer").scheduleAtFixedRate(new TimerTask() { @Override public void run() { try { Map map = returnToken(); // 放入redis // responseToken的失效时间24小时 String responseToken = MapUtils.getString(map,"token"); int inspire = MapUtils.getInteger(map,"inspire"); redisDao.vSet(ConstantValUtil.REMOTE_TOKEN, responseToken, (long) inspire); logger.info(("redis中取到远程的API TOKEN:"+redisDao.vGet(ConstantValUtil.REMOTE_TOKEN))); } catch (Exception e) { log.error("获取一体化的API TOKEN出错:",e); } } },date,2*3600*1000); } catch (Exception e) { e.printStackTrace(); } } private Map returnToken() { String responseToken = null; int inspire = 0; String userMsg = strClientID + ":" + strClientSecret; String base64Msg = Base64.getEncoder().encodeToString(userMsg.getBytes()); HttpHeaders headers = new HttpHeaders(); headers.add("Authorization", "Basic " + base64Msg); HttpEntity entity = new HttpEntity<>(headers); RestTemplate restTemplate = new RestTemplate(); ResponseEntity response = restTemplate.exchange(tokenUrl + "?grant_type=client_credentials", HttpMethod.GET, entity, String.class); log.info("获取授权请求信息:[header={},response = {}]",headers,response); if (response.getStatusCode() == HttpStatus.OK) { ObjectMapper mapper = new ObjectMapper(); try { JsonNode root = mapper.readTree(response.getBody()); if (root.has("access_token") && root.has("expires_in")) { JsonNode accessToken = root.path("access_token"); responseToken = accessToken.asText(); JsonNode expiresIn = root.path("expires_in");// expires_in 失效时间 inspire = expiresIn.asInt();// 24小时失效 } } catch (Exception e) { log.error("获取授权token返回结果解析异常:",e); } } else { log.error("获取授权token返回结果失败:{}", JSON.toJSONString(response)); } Map map = new HashMap<>(); map.put("token", responseToken); map.put("inspire", inspire); return map; } }
用RestTemplate调用第三方接口(在高版本的springboot中推荐使用WebClient)
水电费用摊销扣款台账hydropowerCostController继承BaseController的目的是用BaseController里的方法 BaseController是同事自己写的 然后所有的controller层接受参数都是通过
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-92v458iJ-1659714390011)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220518175742117.png)]
这个这个getParams()方法来自basecontroller里面
为什么可序列化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oBnMDaZp-1659714390012)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220517134634373.png)]
这个Dto实现serializable 说明这个Dto可以被序列化
序列化的目的有两个,第一个是便于存储,第二个是便于传输。我们一般的实体类不需要程序员再次实现序列化的时候,请想两个问题:第一:存储媒体里面,是否是有其相对应的数据结构?第二:这个实体类,是否需要远程传输(或者两个不同系统甚至是分布式模块之间的调用)?
如果有注意观察的话,发现序列化操作用于存储时,一般是对于NoSql数据库,而在使用Nosql数据库进行存储时,用“freeze”这个说法来理解是再恰当不过了,在NoSql数据库中,是没有varchar,int之类的数据结构的,但我们又确实需要进行存储,那么,此时就应该将对象进行序列化。
————————————————
版权声明:本文为CSDN博主「乐羊子灰」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45853783/article/details/112681383
ResponseEntity
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XECEqxcg-1659714390012)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220517135849900.png)]
ResponseEntity用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文
遇到的BUG1.jdk1.8版本连不上sqlserver 删除了jdk中的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ehGb1RaR-1659714390012)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220518142817280.png)]
2.内部登录的时候登录不上去 好像也是ssl的错误 替换了jdk security中的[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fNze3GCo-1659714390013)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220518143501182.png)]
这个文件
rabbitmq项目的mq地址http://192.168.41.202:15672/#/
问题:这三个项目共用一个mq吗?
-
异步处理使用消息队列来进行异步处理,从而实现快速响应。
在本小项目中用mq的主要目的是异步处理
2.系统解耦
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jP6Suwyx-1659714390013)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220531111438415.png)]
如果库存系统出现问题,会导致订单系统下载失败。而且如果库存系统接口修改了,会导致订单系统也无法工作。
使用消息队列可以实现系统与系统之间的解耦,订单系统不再调用库存系统接口,而是把2订单消息写入到消息队列。库存系统从消息系统中拉取消息,然后再减库存,从而实现系统解耦。
3.流量削峰
实现了消息持久化
public class MessageHelper {
public static Message objToMsg(Object obj) {
if (null == obj) {
return null;
}
Message message = MessageBuilder.withBody(JacksonUtil.objToStr(obj).getBytes()).build();
// 消息持久化
message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
message.getMessageProperties().setContentType(MessageProperties.CONTENT_TYPE_JSON);
return message;
}
public static T msgToObj(Message message, Class clazz) {
if (null == message || null == clazz) {
return null;
}
String str = new String(message.getBody());
T obj = JacksonUtil.strToObj(str, clazz);
return obj;
}
}
下面这个D 是队列持久化的意思
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HUyPb3pI-1659714390013)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220531135059443.png)]
GS接口功能给第三方接口GS 传输材料发料单 把我们公司内数据库里的数据放在json里面传给这个第三方接口就行 功能
流程:controller层有个approve方法 同意了表单的提交后 用了AssetsCardServiceImpl里的approve方法 里面向GS==(企业微信的一个接口)==发送资产新增数据 然后调用了SendGsDataServiceImpl里面的sendGSAssetsAdd方法 直接用mqProducer.send方法发消息了 最后被什么东西接收了????
生产者producer 用来发消息 需要的参数是map exchange queue route
@Component
public class MqProducer {
@Resource
private RabbitTemplate rabbitTemplate;
@Resource
private MsgLogService msgLogService;
public void send(PageData pd, String type, String exchange, String route, String queue) {
//生成消息唯一标识
String msgId = UUID.randomUUID().toString().replaceAll("-", "");
pd.put("msgId",msgId);
//gs消息类型
pd.put("type",type);
//插入消息表
MsgLog msgLog = new MsgLog(msgId,pd,exchange,route,queue,pd.getString("serial_number"));
msgLogService.insert(msgLog);
CorrelationData correlationData = new CorrelationData(msgId);
// 发送消息
rabbitTemplate.convertAndSend(exchange, route, MessageHelper.objToMsg(pd), correlationData);
}
}
问题:信道channel在哪呢??
那四张表的功能 设备结算单[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IUaQYiPG-1659714390014)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220524171230182.png)]
得是西城客专一01登录 然后
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HXvEG8HN-1659714390014)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220524171255218.png)]
在这个最下面 把电话号码改成柴锦文的号 柴锦文的号才可以审批
MQ的BUGMQ起了但是小程序端不显示数据
消费者不能消费
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fG4UfJKP-1659714390014)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220524153648708.png)]
sqlserver 事务ID60 死锁 貌似两个人同时登录 会死锁?????
小程序端只有两个功能 查看待确认设备结算表,待确认设备转运记录单,设备费用扣款单,水电费用扣款单
或者查看已经批准的这四个单子
用管理员账号登录可以上传单子
springcloud中的网关GateWay springCloud的注册中心springCloud的stream
进展传进来的参数没有is_confirm
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tPwJq6ZT-1659714390015)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220524174558266.png)]
这个this是什么意思?
pd里面的参数是来自
HttpServletRequest request;
所有sql的参数都是pd
先根据电话号码 搜出这个
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1WzXpbyc-1659714390015)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220525140023307.png)]
我把某个改成我后 变成这样
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KkIITma6-1659714390015)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220526141309887.png)]
查里先电话号码18365286211
这个CRCC1100GL0220190267对应的就是西城客专一
SELECT
id,
serial_number,
'租赁设备结算管理' as belong_module,
'2' as module_flag,
creator_user_name,
created_at
FROM
eb_lease_settlement_manage
WHERe
creator_org_id IN
#{item.projectCode}
AND supplier_code IN
#{item.code}
AND ( is_confirm = 0 OR is_confirm IS NULL ) AND status in ('10040002','10040003','10040005')
UNIOn ALL
SELECt
id,
serial_number,
'设备维修结算管理' as belong_module,
'3' as module_flag,
creator_user_name,
created_at
FROM
eb_equip_repair
WHERe
creator_org_id IN
#{item.projectCode}
AND supplier_code IN
#{item.code}
AND ( is_confirm = 0 OR is_confirm IS NULL ) AND status in ('10040002','10040003','10040005')
UNIOn ALL
SELECt
id,
serial_number,
'路用车使用费结算管理' as belong_module,
'4' as module_flag,
creator_user_name,
created_at
FROM
eb_vehicle_cost_settlement
WHERe
creator_org_id IN
#{item.projectCode}
AND supplier_code IN
#{item.code}
AND ( is_confirm = 0 OR is_confirm IS NULL ) AND status in ('10040002','10040003','10040005')
UNIOn ALL
SELECt
id,
serial_number,
'安拆运输结算管理' as belong_module,
'5' as module_flag,
creator_user_name,
created_at
FROM
eb_equip_demolition_statement
WHERe
creator_org_id IN
#{item.projectCode}
AND supplier_code IN
#{item.code}
AND ( is_confirm = 0 OR is_confirm IS NULL ) AND status in ('10040002','10040003','10040005')
eb_lease_settlement_manage
eb_vehicle_cost_settlement
eb_equip_repair
eb_equip_demolition_statement
这些表里要
jse@SuppressWarnings注解是jse提供的注解。作用是屏蔽一些无关紧要的警告。使开发者能看到一些他们真正关心的警告。从而提高开发者的效率
解决的BUG 1.四张表排序BUGorder by created_at desc
2.不显示已废除BUGquerySettleConfirmList 永远是从
有四个模块
eb_lease_settlement_manage_applet 里面is_confirm全是1 eb_equip_repair_applet 里面全1 eb_vehicle_cost_settlement_applet 全1 eb_equip_demolition_statement_applet 全1
这四张表里面查
queryWorkConfirmList永远从
eb_equip_run_record_applet
queryEquipmentConfirmList永远从
eb_equip_cost_deduction_applet
queryWaterConfirmList永远从
eb_water_electricity_deduction_applet
已知
flag 1是小程序中还没有确认的数据 2是小程序中已经确认的
is_confirm=1是没废除 2是已废除
已知有代码会修改这六个地方
这个方法修改了这个表的is_confirm为2
handlerConfirmStatus 这个方法在很多service层都用到了
eb_equip_cost_deduction_applet
然后在取回操作 是service层的cancelRequest
还有 水电service层的 back里面用到了
在水电中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t9XNF32M-1659714390016)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220530153741372.png)]
是因为这个userId和creator_user_id不相等 导致的 换个号试试
private void handlerConfirmStatus(PageData pageData){
//当单据被退回到保存状态,则修改本单据为“未确认”,修改已确认的单据为“已废除”
if(pageData.getInt("status").equals(ConstantValUtil.APPROVAL_STATUS[0])){
//修改本单据为“未确认”
dao.update("WaterElectricityDeductionMapper.updateConfirmStatus",pageData);
//修改已确认的单据为“已废除”
dao.update("WaterElectricityDeductionMapper.updateAbolishStatus",pageData);
}
}
原因是getInt 写成getString了
3.点开设备结算单不显示东西已解决 创建表必须按照流程 之所以出现这个BUG是因为前端或者测试直接在数据库中进行修改状态码了 然而直接改他们修改的不完全所以导致的BUG 不能手动在数据库里改数据 必须调用后端代码来改
只要不乱动数据库 就不会出现这个BUG
当把柴锦文的手机号 给予权限 权限后 没有出现流程实例ID 导致没法点进去
是因为FlowServiceImpl中的query方法里的.findForObject没有搜到东西
是因为表eb_flow_info中没有process_inst_id
SELECT id, process_inst_id, creator_org_id as scope_code FROM eb_flow_info where process_inst_id=14805
也就是说我这个流程 没有process_inst_id
这个表 上次更新还是2020年 新建一个东西必须要有process_inst_id才能看到那些具体数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yc3u5Ukz-1659714390016)(C:Users柴锦文AppDataRoamingTyporatypora-user-imagesimage-20220526175053677.png)]
测试说 常德里的中国海洋是刘美 并且常德里面只能有一个中国海洋
与此同时拉林里面也可以有一个中国海洋 并且可以是柴锦文
4.非常严重的线上BUG上传不了企业法人授权委托书搞定 :去linux中center改一下配置地址
unable to execute HTTP request
去springcloud注册中心 改一下配置 然后重新启动
CRCC1100TL0120200345这种东西是项目编码
FBS202204200005这些是单据编号
连接第三方接口教学导入httpclient的包
public class RequestUrlServiceImpl implements RequestUrlService {
private static final String GETEQUIPMENTINID_URL="https://sbywcs.cr11g.com.cn/business/ledger/queryEquip";
@Autowired
private RestTemplate restTemplate;//凡是带template的 一般都是模板类,增删改查等功能,封装好的
@Autowired
private RedisDao redisDao;
@Override
public PeopleInfoOfBussinessDto queryPeopleInfoFromBussiness(PageData pd) {
//1.管理号码有了
//2.需要网址
//3.一般请求网页都是用httpclient,springboot的restTemplate类来请求
String remoteToken = "";
HttpHeaders headers = new HttpHeaders();
remoteToken = (String) redisDao.vGet(ConstantValUtil.REMOTE_TOKEN);
//把一体化token放到headers里面去
headers.add("token",remoteToken);
log.info("下面请求第三方");
//ResponseEntity responseEntity = restTemplate.getForEntity(GETEQUIPMENTINID_URL + pd.getString("manage_code"), String.class);
ResponseEntity responseEntity = restTemplate.exchange(GETEQUIPMENTINID_URL, HttpMethod.GET,new HttpEntity
没有另一个系统的token 是进不去的 这时候要用到一体化token(Remote_token)才行 官方文档
https://docs.spring.io/spring-framework/docs/5.2.8.RELEASE/javadoc-api/org/springframework/web/client/RestTemplate.html
post方式的带token请求
HttpHeaders headers = new HttpHeaders();
headers.add("token","1234");
ResponseEntity response = restTemplate.postForEntity(Url,new HttpEntity
想要访问那个链接 再新添一个接口来根据equipment_in_id
遇到了问题:
"Could not extract response: no suitable HttpMessageConverter found for response type [class com.common.entity.PageData] and content type [text/html;charset=UTF-8
大坑的解决方法:
用了工具类中的final里的东西
public static final MediaType APPLICATION_JSON = new MediaType("application", "json");
headers.setContentType(MediaType.APPLICATION_JSON);
List list= new ArrayList();
list.add(MediaType.APPLICATION_JSON);
headers.setAccept(list);
几个项目的一体化remoteToken的获得方法是什么??
RemoteTokenServices是security
返回得到的org.springframework.http.ResponseEntity包括了请求头和请求体
.getBody方法可以得到string类型的请求体 如何转换成hashmap?
一体化token的开头必须是Authorization 配置在linux中的配置中心里面
静态资源存放在阿里云oss上 并打印返回的时候返回地址就行
保存在本地数据库的二进制图片打印出来很简单
byte[] base64Str1 = Base64.decodeBase64((byte[]) pd.get("discernImage"));
Image img1 = Image.getInstance(base64Str1);
但是我这里返回的是阿里云上的地址 咋办?
https://blog.csdn.net/weixin_40516924/article/details/109396885
把存在阿里云里面的图片url变成输入流
因为是http协议的 所以用httpurlconnection
String strUrl=attachmentList.get(0).getString("url");
HttpURLConnection connection = (HttpURLConnection) new URL(strUrl).openConnection();
connection.setReadTimeout(5000);
connection.setConnectTimeout(5000);
connection.setRequestMethod("GET");
InputStream inStream = connection.getInputStream();
最后再把流变成二进制数组 把二进制数组变成图片
String strUrl1="XXXXXX";//照片的地址
HttpURLConnection connection = (HttpURLConnection) new URL(strUrl1).openConnection();
connection.setReadTimeout(5000);
connection.setConnectTimeout(5000);
connection.setRequestMethod("GET");
InputStream inStream = connection.getInputStream();
//下面要把inStream变成二进制
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while((len = inStream.read(buffer)) != -1){
outStream.write(buffer, 0, len);
}
outStream.close();
inStream.close();
byte[] base64Str1= outStream.toByteArray();//变成了二进制数组
if (base64Str1!= null && !base64Str1.equals("")) {
Image img1 = Image.getInstance(base64Str1);
img1.setAbsolutePosition(250, 80);
img1.scaleAbsolute(200, 150);
document.add(img1);
}//变成image类型 然后放在pdf文件中
事务注解
@Transactionalsql优化 左模糊 右模糊
like中分右模糊、左模糊,右模糊比如’abc%‘时,扫描索引,高效可以搜到abcd。当模糊查询含左模糊时,比如’%abc’,进行全表扫描,低效。当然更别提’%abc%'了。
left join 必须放在from的表后面
遇到BUGSELECT eb_equipment_ledger.equip_name, eb_equipment_ledger.manage_code, eb_equipment_ledger.specification, eb_equipment_ledger.in_date, eb_equipment_ledger.equip_source, eb_equipment_ledger.out_date, eb_equipment_ledger.technical_condition, eb_equipment_ledger.manufacturer, eb_equip_identity_detail.check_expire_date, eb_equip_check.serial_number FROM eb_equipment_ledger left join eb_equip_identity_detail on eb_equipment_ledger.manage_code=eb_equip_identity_detail.manage_code left join eb_equip_check on eb_equipment_ledger.manage_code=eb_equip_check.manage_code eb_equipment_ledger.creator_org_id =#{creatoOrgId} and eb_equipment_ledger.manage_code like concat('%',#{manage_code},'%') and eb_equipment_ledger.equip_name like concat('%',#{equip_name},'%') and eb_equipment_ledger.in_date = ]]> #{start_in_date} and eb_equipment_ledger.in_date #{end_in_date} and eb_equipment_ledger.specification like concat('%',#{specification},'%') and eb_equipment_ledger.usage_state = '0' and (eb_equipment_ledger.equip_code like '211%' or eb_equipment_ledger.equip_code like '212%' or eb_equipment_ledger.equip_code like '213%' or eb_equipment_ledger.equip_code like '219%')
redis中的remoteToken是错的 只好用另外一个一体化token写死
一体化token是调的第三方接口生成的
如何在每次操作的时候都加进去一个token?
用户登录时自动生成然后
redisDao.vSet(tokenKey, userInfoVo, exp);//第三个是过期时间redis可以模糊查找key
查找到了放在set里 然后把set转换成list 取出来
//下面是测试环境用的 直接拿塔吊里面的token
Set
把url写活 用@VALUE
-
注入URL资源
-
@Value("${business.QUERYPEOPLE_URL}") private String QUERYPEOPLE_URL;
在application.yml中配置
-
business.QUERYPEOPLE_URL: http://192.168.41.XXX:XXXX/towercranemonitoring/queryPersonByManageCode business.QUERYEQUIP_URL: http://192.168.41.XXX:XXXX/towercranemonitoring/queryEquipmentByScope
另外一个springcloud项目 要去linux中的配置中心改 改完要重启一下配置中心那个jar包
先把java的进程删掉
ps -ef|grep java
kill -9
nohup java -jar equipment-config-center-1.0-SNAPSHOT.jar &
要在equipment-config-center-1.0-SNAPSHOT.jar的页面下运行这行代码
Unix/Linux下一般比如想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行。
ArrayList PageData JSONLIST 之间的关系
运用WHERe语句检查查找出两列中name不是AAAA的所有结果
SELECT prod_name, prod_price FROM Products WHERe prod_name <> 'AAAA';
但是在项目中的xml中 只能写成
SELECt prod_name, prod_price FROM Products WHERe prod_name!= 'AAAA';遇到的问题
微软的sqlserver依赖不让自动下载 要手动导入
为啥要注销掉redis的配置 答案:用的是manager里面的配置
为什么同一个后端不同账号登录看到的内容不同? 答:权限管理 RBAC模型



