参考:
docker-compose 构建 Springboot 项目
Spring Boot 2 (五):Docker Compose + Spring Boot + Nginx + Mysql 实践
Spring Boot 2 (五):Docker Compose + Spring Boot + Nginx + Mysql 实践
springboot 简单优雅的通过docker-compose 构建
使用Docker Compose部署SpringBoot应用
使用docker-compose部署springboot项目
教你Docker+nginx部署SpringBoot+vue前后端分离项目
基于Spring Boot+Spring Security+JWT+Vue前后端分离
kubectl get pod -n 命名空间
kubectl logs 容器名称 -n 命名空间
单机游戏下载网 大型单机游戏
上古卷轴5:天际中文
大型单机游戏下载
3DMGAME
赛博朋克2077中文版
超大型游戏
高质量图片下载 magdeleine
特点:清新唯美、适合发朋友圈
Pexels
特点:每月更新,用户上传
Visual Hunt
特点:图片数量多, 可按照颜色筛选
Hippopx
特点:多国语言界面,图片高画质
Unsplash
特点:摄影作品,质量超高
Pixabay
Pexels
unsplash
gratisography
picjumbo
ifeofpix
博客园美化 博客园主题分享(博客园美化diy)
我来
在线音乐剪辑工具 在线剪辑
练习打字 typingclub
资源下载 软猫下载
爱给网
字由
设计 设计超赞效果
子类继承父类后,拓展了一些新属性,想在不同业务场景里使用,就必须经过转换,常见的转换方式有序列化,反射以及mapper
先介绍父类和子类:
/// <summary> /// People类-父类 /// </summary> public class People { /// <summary> /// sex /// </summary> public string sex{ get; set; } /// <summary> /// 年龄 /// </summary> public int age{ get; set; } } /// <summary> /// Student-子类 /// </summary> public class Student:People { /// <summary> /// 学校 /// </summary> public string school{ get; set; } /// <summary> /// 班级 /// </summary> public int @class{ get; set; } } 先介绍一个父类向子类单向转的方法,此方法只能把父类转子类,相反是不可以的:
目录
一、Java的下载与安装
1、软件的下载
2、安装JDK
二、JAVA环境变量的配置
1、右键点击我的电脑
点击属性,进入系统设置面板
找到高级系统设置
2.点击环境变量
3.找到系统变量,点击新建
4.新建系统变量变量名:JAVA_HOME
变量值为你的JDK安装目录(在有bin文件夹那个页面的路径,如图一)
5.在系统变量里找到path变量名
6.点击编辑,然后点击新建,然后输入:%JAVA_HOME%\bin
7.然后点击确定,这样我们就配置好了java的环境,我们就可以使用了。若是还不放心我们是否配置好了环境,我们可以进行验证。
三.验证环境是否配置好
1.键盘Windows+r,输入cmd,点击确定。
2.输入 java
3. Enter 键一下,若是出现下图,说明我们Java已经安装好了
4.之后,我们就可以安心的使用了
一、Java的下载与安装 1、软件的下载 (1)、Java_JDK的下载:Oracle | Cloud Applications and Cloud Platform
(2)、找到Java,选择JDK
(3)、选择要下载的版本
2、安装JDK (1)双击jdk-19_windows-x64_bin
点击下一步
(2).更改路径,(建议更改安装路径,在这里我们可以在自己想安装的路径,我们需要知道安装的地方,之后的配置我们将会用到)
(3).点击下一步,稍等一会(进度的快慢取决于你的电脑)
(4).点击完成,现在我们就已经安装成功了,关闭页面
二、JAVA环境变量的配置 1、右键点击我的电脑 点击属性,进入系统设置面板 找到高级系统设置 2.点击环境变量 3.找到系统变量,点击新建 4.新建系统变量变量名:JAVA_HOME 变量值为你的JDK安装目录(在有bin文件夹那个页面的路径,如图一) 图一 5.在系统变量里找到path变量名 6.点击编辑,然后点击新建,然后输入:%JAVA_HOME%\bin 7.然后点击确定,这样我们就配置好了java的环境,我们就可以使用了。若是还不放心我们是否配置好了环境,我们可以进行验证。 三.验证环境是否配置好 1.键盘Windows+r,输入cmd,点击确定。 2.输入 java 3. Enter 键一下,若是出现下图,说明我们Java已经安装好了 4.之后,我们就可以安心的使用了
声明:以下部分图片来源于网上
业务背景 现在越来越多的互联网应用都在提供基于地理位置的服务,假设现在有这样一个业务场景,加油站想要知道附近的车辆信息,那么我们该怎么做?这里主要涉及两个步骤,一个是对应的应用要保存和更新车辆实时的上报信息数据,二就是我们要根据加油站的信息来查询它附近的车辆信息。
这里我们首先忽略车辆信息上报这个阶段,因为这涉及到车子与加油站业务对接的相关内容。那么我们来看一下第二个搜索阶段,也就是今天要说的,根据加油站的地理位置信息(这里指的是经纬度)和给定的距离信息来搜索出周边满足条件的车辆,然后根据需要可以进一步按照距离远近进行排序或者限制返回的数量。
2.探索-解决方案选择 在看到搜索这个词的时候,首先意识到这是个对性能有要求的查询,无论是读或者还是写数据,都是要求非常快速的。并且车辆这个数据应该是蛮大的,因为车辆数和车辆的实时数据就是一个大批量的数据了。所以想到了与缓存相关的技术redis,它的读写非常快速,读的速度能达到11万次每秒,写的速度能达到8.1万次每秒。
(1)模糊匹配-keys 使用redis的keys命令,它是遍历算法,时间复杂度是O(N)。由于redis是单线程的,可能会阻塞进程,导致Redis服务卡顿,严重情况下,会导致宕机的可能。在实际生产中是不能使用的,因此不予采用。
(2)扫描-scan 使用redis的scan命令,它的时间复杂度虽然也是O(N),但是它是通过游标分步进行的,不会阻塞线程,还提供了limit参数,可以控制每次返回结果的最大条数。然而通过实际测试,在达到一定量的数据中查找时,还是挺耗时的,这个时间大概在2~5s,无法满足我们这个业务需求。
(3)GEO 使用redis的扩展类型GEO,它的时间复杂度是O(logN),通过实际性能测试,百万级数据查询可以在极短的时间内返回。采用此方案,下面主要就是介绍这个方案。
3. 经纬度 这里简单先介绍一下经纬度的概念,将一张世界地图铺开,以赤道为界将地球分成南北,以本初子午线将地球分成东西。赤道和本初子午线都是0度;以赤道0度开始,向上和向下分别分出90度,南极和北极分别为南纬90度和北纬90度,南极到北极的跨度是(-90,90),其中赤道到南极称为南纬,赤道到北极称为北纬;从本初子午线0度开始,向左和向右分别分出180度,跨度是(-180,180),其中本初子午线向左称为西经,本初子午线向右称为东经
坐标限制:
Redis有效的经度从-180度到180度。有效的纬度从-85.05112878度到85.05112878度。当坐标位置超出上述指定范围时,该命令将会返回一个错误。中国的经度范围:73°33′E至135°05′E。纬度范围:3°51′N至53°33′N。
4. GEO算法 (1)geo算法介绍 Geo算法是业界比较常用的地理位置排序算法,Redis也采用该算法,它是将二维的经纬度数据映射到一维的整数,这样所有的元素都会被挂在到一条线上,距离相近的二维坐标映射到一维后的点之间距离也会很近,当加油站查找附近的车辆时候,首先将目标位置映射到这条线上,然后在这个一维的线上获取附近的点就可以了。
下图展示了天安门 9 个区域的 geohash 字符串,每个字符串表示一个矩形区域(使用一维数据来表示二维坐标)。
(2)分块思想: Geo算法将整个地球看成一个二维平面,然后划分成了一系列正方形的方格,就像围棋棋盘,所有地图元素坐标都被放置于唯一的方格中,方格越小,坐标越精确,随后对这些方格进行整数编码,越是靠近的方格编码越接近。对于一个完整的二维空间,我们可以用二分的思想将它均匀划分。也就是在水平方向上一分为二,在垂直方向上也一分为二。这样一个空间就会被均匀地划分为四个子空间,这四个子空间,我们可以用两个比特位来编号。在水平方向上,我们用 0 来表示左边的区域,用 1 来表示右边的区域;在垂直方向上,我们用 0 来表示下面的区域,用 1 来表示上面的区域。
应用上述的分块思想,对某块区域进行编码:
这种区域编码的方式有 2 个优点:
a.区域有层次关系:如果两个区域的前缀是相同的,说明它们属于同一个大区域;
b.区域编码带有分割意义:奇数位的编号代表了垂直切分,偶数位的编号代表了水平切分,这会方便区域编码的计算(奇偶位是从右边以第 0 位开始数起的)。
5.GeoHash编码原理 (1)编码原理 GeoHash是一种地址编码方法,基本原理就是“二分区间,区间编码”。当我们要对一组经纬度进行 GeoHash 编码时,我们要先对经度和纬度分别编码,然后再把经纬度各自的编码组合成一个最终编码。而后base32后成为一个短字符串。
(2)编码过程 以经纬度(116.397457,39.909181)为例计算geohash
a.经纬度分别编码
纬度 39.909181 编码为:1011100011 00001 00
同理,地球经度区间是[-180,180],
经度116.397457编码为:1101001011 00010 110
b.合并:偶数位放经度,奇数位放纬度,结果如下:
将 11100 11101 0010001111 00000 01001 10100 转成十进制,分别是:28、29、4、15、0、9、20 base32的编码(0-9、a-z,去掉a、i、l、o四个字母)
愿备考的小伙伴们都取得一个自己满意的成绩。
持续更新中~~~~
印章 【DP】 ''' 问题描述 共有n种图案的印章,每种图案的出现概率相同。小A买了m张印章,求小A集齐n种印章的概率。 将印章当做彩票,印章是太拗口了。 dp[i][j] 表示 购买i张彩票,有j种彩票的概率。 当i<j时,买i张是肯定没有j种彩票。 当j == 1时,买i张相同的彩票时,每张彩票都是相同的概率,也就是1/n 其他条件,买第i张彩票的情况有两种,一是和前面i-1张有重复,二是和前面i-1张没有重复。 有重复就是已经凑齐了j种,dp[i-1][j], 再从凑齐的j种里面选一种的概率为j/n, 于是概率为dp[i-1][j]*j/n 没有重复就是只凑齐了j-1种,dp[i-1][j-1],再从没有凑齐的n-j+1种里面选一种的概率为(n - j + 1),于是概率为dp[i-1][j-1] * (n - j + 1) / n ''' n, m = map(int, input().split()) dp = [[0] * (n + 1) for _ in range(m + 1)] p = 1 / n for i in range(1, m + 1): for j in range(1, n + 1): if i < j: continue if j == 1: dp[i][j] = p ** (i - 1) else: dp[i][j] = dp[i - 1][j] * j / n + dp[i - 1][j - 1] * (n - j + 1) / n print("
最近接触个项目,有一部分区域有很高的相似度,所以想封装成共通。具体代码如下。
前提:有一个主页面,里面有多个相同区域(例如:
区域1=下拉列表+入力框+...+按钮。
区域2=下拉列表+入力框+...+按钮。
区域3=下拉列表+入力框+...+按钮。
需求,因为有大量相同代码,需要将【下拉列表+入力框+...+按钮。】封装成一个vue文件。
1. 定义共通组件内容 <template> <!-- 循环绑定的模型数据 --> <template v-for="(item, index) in model.plan" > <div class="">固定文言</div> <div class="">单位:{{model.unit}}</div> <div class=" style=""> 频度: {{model.frequency}} </div> <n-grid :cols="3"> <n-gi :span="1" class=""> <n-form-item :key="index + '下拉列表'" :label="'下拉列表'" :path="`${model.checkPath}[${index}].methodSummary`" :rule="{ required: true, trigger: ['input', 'change'] }" > <n-select v-model:value="item.methodSummary" class="" clearable placeholder="" :options="model.summaryOptions" /> </n-form-item> </n-gi> <n-gi :span="1" class=""> ...略 </n-gi> </n-grid> </template> </template> <script lang="ts"> export default { name: 'CommonInput' } </script> <script lang="
一,定义 postcss-pxtorem PostCSS 的一个插件,可以从像素单位生成 rem 单位。
amfe-flexible amfe-flexible是配置可伸缩布局方案,主要是将1rem设为viewWidth/10。
二,使用 1. 设置 viewport 在 index.html 中:
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"> 2.安装插件 npm install amfe-flexible --save
npm install postcss-pxtorem --save
3.配置文件 Vite自身已经集成PostCSS,因此无需单独创建PostCSS配置文件,可直接在 vite.config.js 文件中配置css.postcss选项。
import postCssPxToRem from "postcss-pxtorem"; export default defineConfig({ plugins: [vue()], css: { postcss: { plugins: [ postCssPxToRem({ rootValue: 75, // 1rem,根据 设计稿宽度/10 进行设置 propList: ['*'], // 需要转换的属性,这里选择全部都进行转换 }) ] } }, }) 4. 导入 在 main.
总结写前面:安装vscode→安装mingw→设置vscode→安装各种你喜欢的扩展 废话不多说,直接开始吧! (建议收藏) (如果下载慢的话,我已经把所有安装包都上传到网盘了)
下载链接(包含所有需要的软件) https://wwa.lanzoui.com/b010h3p5c
密码:5sxn
(↑↑↑先点这里!!先点这里!!先点这里!!) 1.下载并安装vscode 打开Visual Studio Code - Code Editing. Redefined
点击这里下载
点开安装,这里可以这样选择
安装完成打开
2.把vscode设置成中文 可以看到刚打开的界面是英文的
我们先找到右边的扩展按钮(这里面的扩展是vscode的灵魂)
搜索chinese并安装
可以看到下面已经跳出了提示,点击Restart就可以显示中文了
或者按快捷键Shift+Ctrl+P,搜索display
选择zh-cn(中文)
3.安装mingw(相当于C语言的内核) 链接在这:mingw下载
(下载慢的话,文章开头的网盘里有安装包) 这里选择x86_64
然后直接下一步安装完
接着把mingw添加进系统的环境变量: 找到我的电脑,右键点击属性
下面找到高级系统设置,点击环境变量,双击点开Path
点击新建,输入C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin
点击确定,关闭
4.设置vscode 首先安装扩展:C/++和C/++ Compile Run
点开“文件-首选项-设置”
打开“扩展-Compile Run”,找到Run-in-external-termina这个功能并打开
(作用是在外部命令行窗口运行代码)
然后按F6就能运行代码了!
我们来创建个代码试试吧
在桌面新建一个文件夹,在vscode里打开
点击这个按钮创建一个新文件,并命名为“1.c”
点开输入一段最简单的代码
#include<stdio.h> int main() { printf("Hello!"); return 0; } 按F6运行,看看是不是成功显示了“Hello!”
5.其他扩展推荐 SynthWave '84:霓虹灯主题
Bracket Pair Colorizer 2:多彩括号
background-cover:设置背景
安装后在右下角找到背景设置
选择背景图,不透明度建议设为0.85
文章目录 一、定义二、实例三、函数调用四、传参五、匿名函数 前言:使用函数时便于提高代码使用的重复性,提高效率,减少空间。例如 print()函数,这是系统定义好的,但也可以自己根据功能定义,这类叫做自定义函数。 一、定义 定义一个函数有以下的规则:
函数代码块以def关键字开头,后接函数名与小括号();任何传参和自变量都要放在圆括号之内,圆括号中间是用于定义参数;函数的第一行语句通常为文档字符串——用于函数说明;在圆括号后必须要加冒号:;函数结尾用return收尾,格式return[表达式],如果不带表达式,则相当于返回None; 二、实例 1、
def printstr(str): "用于打印字符串" #函数说明 print (str) return 2、
def say(char): #如果要输输入字符型,就要在括号内加入字符型关键字,其他的也一样 "Say Num" print (char) return 三、函数调用 def printstr(str): "用于打印字符串" #函数说明 print (str) return printstr("Hello,world!") #函数调用,以函数名+()形式来调用,如果有变量,就要加入实参 def say(char): #如果要输输入字符型,就要在括号内加入字符型关键字,其他的也一样 "Say Num" print (char) return say('10') #函数调用 四、传参 python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。
1、在调用函数时,参数必须与圆括号内一致;
2、关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。(三中展现的代码即为关键字参数)
3、使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
4、顺序不同,最后输出相同,体现了Python 解释器能够用参数名匹配参数值。
5、默认参
当函数调用时,给的实参与形参个数不同,那么最后输出时,会将形参中的值赋给实参。
如果实参中个数不少,即为与形参个数一样,则先按照实参给的值输入,这里可以这么理解,形参就相当于“后备能源”,如果前锋不够了,那么就会由形参来提供“大军”。
五、匿名函数 1、匿名函数相比def函数,他的方法体就简单了许多,匿名函数遵循一下规则:
匿名函数使用lambda来创建;lambda函数只是一个表达式,他的主体因而不是一个代码块,而是一个表达式。ambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。 2、语法:lambda [arg1 [,arg2,.....argn]]:expression
3、
#匿名函数 sum=lambda a1,a2:a1+a2 print("a1+a2={}".format(sum(2,3))) print("
最近更新时间:2023-03-12 09:58 1. Label:标签控件 1.1 简介 标签控件主要用于显示用户不能编辑的文本,标识窗体上的对象(例如:给文本框、列表框添加,描述信息等)。它对应PyQt5中的QLabel类,Label控件在本质上是QLabel类的一个对象。
在Qt Designer设计器中,它的图标如下图所示:
1.2 设置标签文本 有2种方法可以设置标签控件显示的文本:
方法1,直接在Qt Designer设计器的属性编辑器中设置它的text属性。如下图所示:
方法2,通过Python代码进行设置:
# 通过setText()方法将标签控件的显示内容设为“hello world” self.label.setText('hello world') 1.3 设置标签控件内文本的对齐方式 PyQt5中支持设置标签中文本的对齐方式,主要用到alignment属性。在Qt Designer设计器的属性编辑器中展开alignment属性,可以看到有2个值,分别为Horizontal(水平的)和Vertical(垂直的)。
其中,Horizontal表示水平对齐,取值有4个,如下表所示:
取值说明AlignLeft左对齐AlignHCenter水平居中对齐AlignRight右对齐AlignJustify两端对齐(效果同AlignLeft) 在Qt Designer设计器中的位置如下图所示:
不同取值的效果如下图所示:
以上是在属性编辑器中直接设置其属性的方法,除此之外,还有2种方法:
方法2:我们单击窗口中的Label控件,然后再单击右键菜单中的“改变多信息文本”,弹出一个编辑文本的窗口,在这个窗口的顶栏中有4种对齐方式可以设置,从左到右分别是:左对齐,中央对齐,右对齐,自动调整。
方法3:Python代码设置,写法都是一样的,只需要修改末尾最后一个单词即可,具体示例代码如下:
# AlignLeft:左对齐 self.label.setAlignment(QtCore.Qt.AlignLeft) # AlignHCenter:水平居中对齐 self.label.setAlignment(QtCore.Qt.AlignHCenter) # AlignRight:右对齐 self.label.setAlignment(QtCore.Qt.AlignRight) # AlignJustify:两端对齐(效果同AlignLeft) self.label.setAlignment(QtCore.Qt.AlignJustify) 代码运行效果如下图所示(为方便辨识,我将标签控件的背景色改成了粉色):
可以看到,它们都是在顶部左对齐、水平居中对齐、右对齐,而且是贴边的,这样很不美观,也不是我们想要的结果。
所以就需要结合Vertical了,Vertical是用来设置标签文本的垂直对齐方式,取值有3个。如下表:
取值说明AlignTop顶部对齐AlignVCenter垂直居中对齐AlignBottom底部对齐 在Qt Designer设计器中的位置如下图所示:
不同取值的效果如下图所示:
可以看到,Vertical是上中下变化,而Horizontal是左中右变化。所以只要将它们2个结合起来,就能实现真正的居中。示例代码如下:
# 水平垂直居中 self.label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter) 代码运行效果如下图所示:
1.4 设置文本换行显示 假设将标签文本改为“路虽远行则将至,事虽难做则必成”,在标签宽度不足的情况下,系统会默认只显示前面部分文字。遇到这种情况时,我们就需要用到换行显示了。
换行显示是标签控件的属性之一,在Qt Designer设计器的属性编辑器中,将wordWrap属性后面的复选框选中即可实现换行显示。如下图:
当然也可以用Python代码实现:
# 通过QLabel类的setWordWrap()方法将文本设为换行显示 self.label.setWordWrap(True) 1.5 为标签设置超链接 为Label标签设置超链接时,可以直接在QLabel类的setText()方法中使用HTML中的<a>标签设置超链接文本,然后将Label标签中的setOpenExternalLinks()方法设置为True,以便允许访问超链接,示例代码如下:
文章目录 一、flex布局是什么?二、基本概念flex 容器 三、容器的属性1. flex-direction属性决定主轴的方向(即项目的排列方向)2. flex-wrap属性定义如果一条轴线排不下,如何换行。3. flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap4. justify-content属性定义了项目在主轴上的对齐方式5. align-items属性定义项目在交叉轴上如何对齐6. align-content属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。 四、项目的属性1. order属性定义项目的排列顺序。数值越小,排列越靠前,默认为02. flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大3. flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。4. flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小5. flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。6. align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch 四、flex实例运用1. 单个元素水平居中1. 多个元素水平居中3. 多个元素水平分布4. 移动主轴的情况下水平居中5. 垂直居中1. 改变主轴方向2. 设置剩余空间分配 使用flex设置多个元素垂直居中的时候为使用flex 设置多个元素水平居中 一、flex布局是什么? flex:弹性布局
任何一个容器都可以指定为 flex 布局
.box{ display: flex; } 行内元素也可以使用flex 布局
.box{ display: inline-flex; } 对于webkit 内核的浏览器,必须加上-webkit 前缀
.box{ display: -webkit-flex; /* Safari */ display: flex; } 注意: 设置为flex 布局之后,子元素的float 、clear、 vertical-align(垂直文本对齐)都将失效
二、基本概念 flex 容器 容器存在两根轴,水平的主轴(main axis)和垂直的交叉轴(cross axis)主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end交叉轴的开始位置叫做cross start,结束位置叫做cross end项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size 三、容器的属性 1.
动态创建尾插法
#include <stdio.h> #include <stdlib.h> struct Test { int data; struct Test *next; }; void printLink(struct Test *head) { struct Test *p = head; while(p != NULL){ printf("%d ",p->data); p = p->next; } putchar('\n'); } struct Test* inserBehind(struct Test *head, struct Test *new) { struct Test *p = head; // 第一种情况,只有一个节点,那么该节点就是头节点 if(p == NULL){ p = new; return p; } // 第三种情况,链表已经创建好,我需要另外再插入一个节点, // 则需要不断遍历找到最后一个节点(最后一个节点的特点是next为null) while(p->next != NULL){ p = p->next; } // 第二种情况,头节点已经确定,则需要把next指向下一个节点 p->next = new; return head; } struct Test* createLink2(struct Test *head) { struct Test *new = NULL; while(1){ new = (struct Test *)malloc(sizeof(struct Test)); puts("
今天为大家分享一个java语言编写的图书管理程序-400,目前系统功能已经很全面,后续会进一步完善。整个系统界面漂亮,有完整得源码,希望大家可以喜欢。喜欢的帮忙点赞和关注。一起编程、一起进步
开发环境 开发语言为Java,开发环境Eclipse或者IDEA都可以,数据为MySQL。运行主程序,或者执行打开JAR文件即可以运行本程序。
系统框架 利用JDK自带的SWING框架开发。纯窗体模式,直接运行Main文件即可以。同时带有详细得设计文档。
主要功能 开发背景 随着社会的进步,信息技术的广泛应用,数字管理的优势日趋显著。针对中小型图书馆或图书室管理落后的情况,设计实现一个图书信息管理系统,通过与计算机的结合使用对中小型图书馆或图书室的各种图书信息进行管理可以给管理员和用户带来以下不同的方便:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高工作效率,也是图书馆等部门管理科学化、正规化的重要标志之一。而且计算机管理的成本不断降低。因此,开发一这样的中小型图书管理软件已经很有必要,并且实现研究服务于实践的原则。随着社会经济的迅速发展和科学技术的全面进步,计算机事业的飞速发展,以计算机与通信技术为基础的信息系统正处于蓬勃发展的时期。我国的学校的图书管理也正在逐步与国际接轨。图书管理环节、图书管理方式以及管理的理念都在发生深刻的变化,图书管理工作当然也在变化,因此就要求图书管理工作者学会和掌握计算机应用技术,实现图书管理工作信息化管理,因此很有必须开发一个基于窗体的的图书管理系统。
主要功能模块 本次开发的图书管理系统系统有两类主要的人员,包括学生和系统管理员。他们在系统中的功能如下:
学生
主要是查看库存图书和借阅情况
借阅图书
归还图书
修改密码和个人信息
查询历史借阅订单信息
系统管理员
可以对所有图书进行管理以及对图书进行包括添加、删除、修改的管理
对用户进行增删改查
对图书分类进行增删改查
对读者类型的日常管理。不同读者可以借阅不同数量的书本和借阅天数
查询历史借阅订单信息
修改密码和个人信息
数据库设计 实现效果 1 用户登陆 2 用户注册 3 图书信息管理 4 新增图书 5 修改图书 6 图书类型管理 7 读者管理 8 读者类型管理 9 图书借阅管理 10 个人信息维护 11 读者借阅图书 12 归还图书 13 读者修改个人信息 关键代码 package Tool; import java.util.regex.Pattern; /** * 正则表达式验证 * @author rsw * */ public class RegexTool { private static final String NAME="
问题描述 在vs2019上我要测试运行我的Linux项目,发现不能运行,并报无法启动gdb的错误
该问题的前提是Windows下可以编译生成Linux项目,所以可以排除编译的问题
什么是gdb gdb是Linux下调试代码的工具,相当于Windows下的Debug,有了gdb就可以对Linux代码进行调试运行。
问题解决 该报错的最大可能原因就是,我们的Linux系统中缺少gdb调试工具
首先我们先,看一下我们的Linux系统上到底有没有gdb,通过gdb -v的指令
发现系统上还真没有,那我们就先来安装一下
安装gdb命令:apt-get install gdb(建议安装在root用户下进行)
安装完成后,用gdb -v命令检验一下是否安装成功
这时在试一下,vs2019能否启动调试代码
可以调试运行,问题解决了
工具:iphone手机及UUID、mac电脑、数据线、wireshark、xcode、终端
1:获取UUID,手机连接好电脑,打开xocode->Window->Devices and Simulators,复制Identifier后面的UUID
2:打开终端,查看已有的接口,输入ifconfig -l
3:此时还没有rvi0,创建虚拟网卡,输入rvictl -s UUID
正确提示:Starting device UDID [SUCCEEDED] with interface rvi0
报错提示:Starting device failed:参考这个博文
4:打开wireshark,会看到rvi0,双击就可以监听。
5:最后记得删除虚拟网卡:rvictl -x UDID
遇到问题:如果过一段时间ifconfig -l发现rvi0没有了,这时候wireshark也会报错,停止监听。
解决方案:终端打开网卡的命令 sudo chmod 777 /dev/bpf*
再rvictl -s UUID就正常了
01、安全性 专有名词解释 1.数据库管理员:拥有所有对象的所有权限,根据实际情况不同的权限授予不同的用户
2.用户:拥有自己建立的对象的全部的操作权限,可以使用GRANT,把权限授予其他用户
3.角色:数据库角色是权限的集合。可以为一组具有相同权限的用户创建一个角色(例如学生成绩管理系统,同时具有修改/更新/删除/查询学生成绩权限的角色是老师),使用角色来管理数据库权限可以简化授权的过程。
4.审计:启用一个专用的审计日志(Audit Log),将用户对数据库的所有操作记录在上面;审计员利用审计日志监控数据库中的各种行为,找出非法存取数据的人、时间和内容。
审计很费时间和空间
DBA可以根据应用对安全性的要求,灵活地打开或关闭审计功能
审计功能主要用于安全性要求较高的部门
用户标识与鉴别(Identification & Authentication) 即由系统提供一定的方式让用户标识自己的名字或身份,每次用户要求进入系统时,由系统进行核对,通过鉴定后才提供机器使用权。如连接数据库时输入的用户名和密码。
存取控制 存取控制机制主要包括两部分:
1.定义用户权限,并将用户权限登记到数据字典中
2.合法权限检查:每当用户发出存取数据库的操作请求后,DBMS查找数据字典,根据安全规则进行合法权限检查。
自主存取控制(Discretionary Access Control,DAC):用户对于不同的数据库对象有不同的存取权限,不同的用户对同一对象也有不同的权限,而且用户还可以将其拥有的存取权限转授给其他用户。非常灵活。主要通过SQL的GRANT语句和REVOKE语句来实现。
强制存取控制(Mandatory Access Control,MAC):每一个数据库对象被标以一定的密级,每一个用户也被授予某一个级别的许可证。对于任意一个对象,只有具有合法许可证的用户才可以存取。较为严格。
授权sql语句:
GRANT <权限>[,<权限>]... ON <对象类型> <对象名>[,<对象类型> <对象名>]… TO <用户>[,<用户>]... [WITH GRANT OPTION]; 语义:将对指定操作对象的指定操作权限授予指定的用户。发出该GRANT语句的可以是DBA(数据库管理员),也可以是数据库对象创建者,也可以是已经拥有该权限的用户。
如果指定了WITH GRANT OPTION 子句,则获得某种权限的用户还可以把这种权限再授予其他的用户。但是不允许循环授权
GRANT SELECT ON TABLE Student TO U1; /* 把查询Student表的权限授予用户U1 */ REVOKE <权限>[,<权限>]... ON <对象类型> <对象名>[,<对象类型> <对象名>]… FROM <用户>[,<用户>]...[CASCADE|RESTRICT]; REVOKE UPDATE(Sno) ON TABLE Student FROM U4; /*回收用户U4修改学生学号的权限*/ 强制存取控制 保证更高程度的安全性