栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

柴同学前段时间实习项目知识点总结

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

柴同学前段时间实习项目知识点总结

关于项目结构

这个业务项目有前端 小程序端 后端

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

redis

Override了很多方法 可能是用在了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用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文

遇到的BUG

1.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吗?

  1. 异步处理使用消息队列来进行异步处理,从而实现快速响应。

    在本小项目中用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的BUG

MQ起了但是小程序端不显示数据

消费者不能消费

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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.四张表排序BUG

order by created_at desc

2.不显示已废除BUG

querySettleConfirmList 永远是从

有四个模块

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(pd,headers),String.class);


        log.info("responseEntity---是"+responseEntity);
        return null;
    }
}

没有另一个系统的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(data,headers),String.class);
取值:JSONObject jsonObject = JSONUtil.parseObj(response.getBody());

get方式的带token请求 
HttpHeaders headers = new HttpHeaders();
headers.add("token","1234");
ResponseEntity response = restTemplate.exchange(Url,HttpMethod.GET,new HttpEntity(data,headers),String.class);

取值:JSONObject jsonObject = JSONUtil.parseObj(response.getBody());

想要访问那个链接 再新添一个接口来根据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文件中
事务注解
@Transactional
sql优化 左模糊 右模糊

like中分右模糊、左模糊,右模糊比如’abc%‘时,扫描索引,高效可以搜到abcd。当模糊查询含左模糊时,比如’%abc’,进行全表扫描,低效。当然更别提’%abc%'了。

left join 必须放在from的表后面

      
        SELECT
        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%')

        






























































    

        
遇到BUG

redis中的remoteToken是错的 只好用另外一个一体化token写死

一体化token是调的第三方接口生成的

 
如何在每次操作的时候都加进去一个token? 

用户登录时自动生成然后

redisDao.vSet(tokenKey, userInfoVo, exp);//第三个是过期时间
redis可以模糊查找key

查找到了放在set里 然后把set转换成list 取出来

//下面是测试环境用的 直接拿塔吊里面的token
        Set tokenSet= redisDao.keys("464325:*");
        List tokenlist=new ArrayList<>(tokenSet);
        Object tmp=tokenlist.get(0);
        String token=tmp.toString();
        headers.add("token",token);
 
把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模型

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号