一个SpringBoot的项目
整体的一个项目介绍框架功能介绍项目仓库地址
项目运行地址
这个项目是基于SpringBoot+Vue3框架来完成的。这是一个蛇与蛇对战的游戏,实现了人人对战,人机对战,机机对战的功能。
实现流程:
创建菜单与游戏界面。
登录注册等逻辑的实现。
通过微服务实现匹配系统(匹配池、以及实时对战)。
微服务Bot代码的执行。
排行榜的实现。
游戏规则介绍双方游戏开始时下方会有一个标记,表示你的位置在左下角还是右上角。当两方都有操作的的时候蛇才会动。
死亡条件:
5秒内未执行操作。
撞上墙或撞上自己身体或撞上对方身体。
整体架构图
匹配系统流程图
MyBatis
MyBatisMyBatis概念
MyBatis是一款优秀的持久层框架,用于简化JDBC开发
MyBatis本是 Apache的一个开源项目iBatis, 2010年这个项目由apache softwarefoundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github
官网:https://mybatis.org/mybatis-3/zh/index.html
持久层
负责将数据到保存到数据库的那一层代码
avaEE三层架构:表现层、业务层、持久层
框架
框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
在框架的基础之上构建软件编写更加高效、规范、通用、可扩展
为什么简化简化jDBC:免除JDBC代码以及设置参数和获取结果集的工作。
JDBC存在的缺点:
硬编码
注册驱动,获取连接
SQL语句
操作繁琐
手动设置参数
手动封装结果集
Mapper代理开发
定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下
设置SQL映射文件的namespace属性为Map ...
Maven基础
Maven基础
Maven是专门用于管理和构建Java项目的工具,它的主要功能有:
提供了一套标准化的项目结构
提供了一套标准化的构建流程(编译,测试,打包,发布…..)
提供了一套依赖管理机制
标准化的项目结构
标准构建流程
编译=》测试=》打包=》发布
依赖管理机制
管理你项目所依赖的第三方资源(jar包、插件…)
仓库分类
本地仓库:自己计算机上的一个目录
中央仓库:由Maven团队维护的全球唯一的仓库
地址: https://repo1.maven.org/maven2/
远程仓库(私服):一般由公司团队搭建的私有仓库
引入依赖当项目中使用坐标引入对应依赖jar包后,首先会查找本地仓库中是否有对应的jar包:如果有,则在项目直接引用;如果没有,则去中央仓库中下载对应的jar包到本地仓库。
Maven生命周期Maven构建项目生命周期描述的是一次构建过程经历经历了多少个事件Maven对项目构建的生命周期划分为3套
clean:清理工作
default:核心工作,例如编译,测试,打包,安装等
site:产生报告,发布站点等
同一生命周期内,执行后边的命令,前边 ...
JDBC基础
JDBC
创建工程,导入驱动jar包:
mysql-connector-java-5.1.48.jar
注册驱动
Class.forName("com.mysql.jdbc.Driver");
获取连接Connection conn = DriverManager.getConnection(url, username, password);
定义SQL语句String sql ="update...";
获取执行SQL对象Statement stmt = conn.createStatement();
执行SQLstmt.executeUpdate(sql);
处理返回结果
释放资源
123456789101112131415161718192021222324252627282930313233343536package com.jpc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.Statement;public clas ...
mysql的配置和基础语法
MySQL配置mysqlhttps://www.acwing.com/file_system/file/content/whole/index/content/6237942/
mysql服务的关闭与启动(默认开机自动启动,如果想手动操作,可以参考如下命令)
关闭:net stop mysql80
启动:net start mysql80
mysql的常用操作
连接用户名为root,密码为520jpc…的数据库服务:mysql -uroot -p520jpc…
show databases;:列出所有数据库
create database kob;:创建数据库
drop database kob;:删除数据库
use kob;:使用数据库kob
show tables;:列出当前数据库的所有表
create table user(id int, username varchar(100)):创建名称为user的表,表中包含id和username两个属性。
drop table user;:删除表
insert into user values(1, ‘yxc’);:在表中插入数据
s ...
最近公共祖先
最近公共祖先求最近公共祖先的方法
向上标记法O(n)
倍增
fa[i, j]表示从i开始,向上走2^j步所能走到的节点。0 <= j <= logn
depth[i] 表示深度
哨兵:如果从i开始向上跳2^j步跳过根节点,fa[i, j] = 0, depth[0] = 0;
步骤:
先让两个点跳到同一层
让两个点同时往上跳,一直跳到他们的最近公共祖先的下一层。
预处理O(nlogn)
查询O(logn)
Tarjan——离线求LCA O(n + m)
深度优先遍历的时候将所有点分成三大类:
已经遍历过,且回溯的点
正在搜索分支的点
还未搜索到的点
祖孙询问(基础)题目描述给定一棵包含 n 个节点的有根无向树,节点编号互不相同,但不一定是 1∼n。
有 m 个询问,每个询问给出了一对节点的编号 x 和 y,询问 x 与 y 的祖孙关系。
输入格式输入第一行包括一个整数 表示节点个数;
接下来 n 行每行一对整数 a 和 b,表示 a 和 b 之间有一条无向边。如果 b 是 −1,那么 a 就是树的根;
第 n+2 行是一个整数 m 表示询问个数;
接下来 ...
算法模板
高精度加法12345678910111213141516171819// C = A + B, A >= 0, B >= 0vector<int> add(vector<int> &A, vector<int> &B){ if (A.size() < B.size()) return add(B, A); vector<int> C; int t = 0; for (int i = 0; i < A.size(); i ++ ) { t += A[i]; if (i < B.size()) t += B[i]; C.push_back(t % 10); t /= 10; } if (t) C.push_back(t); return C;}
高精度减法1234567891011121314151617// C = A - B, 满足A > ...
JavaScript基础语法
基本输入输出
输入
从HTML与用户的交互中输入信息,例如通过input、textarea等标签获取用户的键盘输入,通过click、hover等事件获取用户的鼠标输入。通过Ajax与WebSocket从服务器端获取输入。
输出
调试用console.log,会将信息输出到浏览器控制台。改变当前页面的HTML与CSS。通过Ajax与WebSocket将结果返回到服务器。
输入a, b,输出a + b
123456789101112let fs = require('fs');let buf = '';process.stdin.on('readable', function(){ let chunk = process.stdin.read(); if(chunk) buf += chunk.toString();});process.stdin.on('end', function(){ let [a, b] = buf.split(' ...
进程通信
进程通信通过共享内存实现两个进程通信
发送方:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#include <fcntl.h>#include <stdlib.h>#include <stdio.h>#include <string.h> struct shared_msg { int update;//更新数据标志,1:更新,0:未更新 char text[BUFSIZ];//记录写入和读取的文本 };void main(){ printf("程序开始\n"); key_t key;//共 ...
linux下进程的同步互斥
互斥锁同步互斥为了保护共享资源,使我们线程可以单独使用某个共享资源,使用之前先上锁,当其他进程要使用的时候,就需要等待到这个线程用完之后,再开锁。
声明互斥锁:pthread_mutex_t m;
初始化互斥锁:int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);第一个参数:就是前面声明的锁,因为这个参数需要传递的是一个锁的指针,所以需要有一个取地址符。第二个参数:是这个锁的属性,我们让它是默认的属性,这里设置为NULL,返回值:成功返回0, 失败返回-1。
上锁:锁住某个资源int pthread_mutex_lock(pthread_mutex_t *mutex); 这个函数是阻塞型。int pthread_mutex_trylock(pthread_mutex_t *mutex); 这个是非阻塞型的。返回值:成功返回0,失败返回-1.
解锁:int pthread_mutex_unlock(pthread_mutex_t *m ...