数据库(Database)中的缺省字段(也称为默认字段),就是在一般情况下,每个数据表(Table)必须包含的字段(Field),这类字段用于满足特定的数据需求,字段值的填充或更改一般遵照一定的逻辑要求。缺省字段的设计应该考虑到数据的完整性和一致性,以确保数据的正确与可靠,设计合理的表字段对于数据的有效管理和高效查询至关重要。
**boot-admin** 是一款采用前后端分离模式、基于 SpringCloud 微服务架构的SaaS后台管理框架。系统内置基础管理、权限管理、运行管理、定义管理、代码生成器、办公管理和流程管理7个功能模块,集成分布式事务 Seata、工作流引擎 Flowable、业务规则引擎 Drools、后台作业调度框架 Quartz 等,技术栈包括 Mybatis-plus、Redis、Nacos、Seata、Flowable、Drools、Quartz、SpringCloud、Springboot Admin Gateway、Liquibase、jwt、Openfeign、I18n等。
> [项目源码仓库github](http://github.com/soft1314/boot-admin)
> [项目源码仓库gitee](http://gitee.com/soft1314/boot-admin-vue)
## 字段命名规范
在设计数据库表字段时,应该遵循简洁明了、易于阅读、有意义的原则,并且应该尽可能遵循以下命名规范,这有助于提高代码的可读性和可维护性。
1. 字段名采用【小写字母】和【下划线】的组成,命名简洁明确;
2. 禁止使用数据库关键字,如:name,time ,datetime,password等;
3. 名称不易太长,一般不超过三个英文单词;
4. 名称一般使用名词或者动宾短语;
5. 用单数形式表示名称;
6. 字段名不允许“IS_XXX”,“SET_XXX”,“GET_XXX”等形式;
## boot-admin 项目中实际使用的缺省字段
### 基本缺省字段
| 序号| 字段| 名称| 数据类型| 主键| 非空| 默认值|枚举| 备注说明|
|----|----|----|----|----|----|----|----|----|
|1| GUID| 主键| NVARCHAR2(38)| √| √| ||插入时应用程序填充
|2| CREATE_BY| 记录创建者| NVARCHAR2(100)| |√ |||插入时应用程序填充
|3| CREATE_TIME| 记录创建时间| DATE| |√ |||插入时应用程序填充
|4| MODIFY_BY| 记录最后修改者| NVARCHAR2(100)| |√|||应用程序触发更新
|5| MODIFY_TIME| 记录最后修改时间| DATE| |√|||应用程序触发更新
|6| DATESTAMP| 时间戳| DATE| | √| sysdate||数据库触发更新
|7| ENABLED| 启用状态| NVARCHAR2(1)| | √ || ENABLED|应用程序触发更新
|8| DELETED| 删除状态| NVARCHAR2(1)| | √ || DELETED|逻辑删除应用程序触发更新
|9| VERSION| 乐观锁| INT| | √
|10| REMARKS| 备注| NVARCHAR2(900)|
|11| TENANT_ID_| 租户ID| NVARCHAR2(38)| | √|||多租户数据隔离
### 层次数据额外缺省字段
| 序号| 字段| 名称| 数据类型| 主键| 非空| 默认值|枚举| 备注说明|
|----|----|----|----|----|----|----|----|----|
|12| LEAF| 是否末级| NVARCHAR2(1)| | √ || YESNO
|13| PARENT_GUID| 父级GUID| NVARCHAR2(38)| | √
|14| SORT| 顺序号| INT| | √
## 总结
缺省字段设计是一个比较重要的问题,需结合项目实际仔细考虑和设计。通过合理地设计缺省字段,我们可以避免不必要的复杂性问题,提高数据库的性能和可靠性,以满足更多业务需求。
本文来自博客园,作者:超然楼,转载请注明原文链接:http://www.cnblogs.com/soft1314/p/17416463.html
一、目标李老板:最近刚买了辆新车,他带的App挺有意思,要不要盘一盘?奋飞:我去,加壳了,还挺有意思,搞一搞。v6.1.0二、步骤抓包我的抓包环境是Mac10.14.6+httpToolKit,这一步很顺利的抓到包了。main1:main可以看到,http请求和返回值都是加密的,我们的目标就是这个 request 和 response的来历的。脱壳脱壳我们首选的就是 BlackDex ,使用方便,效果好。不过针对这个样本却不好使,只脱出来一个dex,大概率是失败了。然后就上葫芦娃大佬的 FRIDA-DEXDump,这个样本很狡猾,fridaSpawn模式一跑就崩,看来壳比较硬。这下棘手了,回想起之前我们曾经用Xcube http://91fans.com.cn/post/antifridaoper/ 来对付加壳应用,这次继续试试。Xcube没有让我们失望,注入成功。但是在Xcube模式下如何跑FRIDA-DEXDump呢?本来想改改代码合并进去。无意中发现yang神也写了个DumpDex https://github.com/lasting-yang/frida_dump轻松合并到js
大家好,又见面了,我是你们的朋友全栈君。个人博客地址:http://ganshuo8.com/由于博客现在在docker中部署的,每次打包部署,需要停掉旧容器->删除旧容器->删除镜像->将新的jar包打包成镜像->再次运行,每次发布都需要重复的执行此操作,于是想将所有命令写成脚本,jar包上传之后,运行脚本即可。命令:app_name='java-blog' app_port='8081' #停止正在运行的容器 echo'......stopcontainer......' dockerstop${app_name} #删除容器 echo'......rmcontainer......' dockerrm${app_name} #删除名称为app_name镜像 echo'......rmnoneimages......' dockerrmi`dockerimages|grep${app_name}|awk'{print$3}'` #构
Ribbon简介SpringCloudRibbon也是基于NetflixRibbon实现的一套客户端负载均衡和服务调用的工具。可配置连接超时、重试的机制,实现自定义负载均衡算法。 GitHubRibbon已进入维护模式,未来可能会被SpringCloudLoadbalancer替代。 Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。 底层使用RestTemplate 提供的负载均衡算法有:轮询(默认),随机,根据响应时间加权 架构Ribbon在工作时分两步优先选择负载最小的注册中心根据用户配置的负载均衡算法,再从注册中心获取的服务注册表中选择一个地址负载规则RoundRobinRule轮询(默认规则)RandomRule随机RetryRule先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重WeightedResponseTimeRule对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择BestAvailableRule会先
redis分布式锁解决多进程/多线程下单个进程/单个线程运行1.导语在业务开发中像订单写入,一般需要单线程来保证订单写入数据库,防止数据多次被插入。最近,有两台容器,当程序运行时,会发送多份通知,那么需要保证同一时刻只有一个进程(一台容器)来运行,此时用分布式锁解决该问题。业界也有许多解决这种方案,这里以redis分布式锁来解决。简单来说就是采用golangredis库实现下面方案即可。2.redis的分布式锁实现2.1setnx+expiresetnxkeyvalue,将key设置为value,当键不存在时,才能成功,若键存在,什么也不做,成功返回1,失败返回0。SETNX实际上就是SETIFNOTExists的缩写。setnxkeyval expirekeyseconds 复制但是,上述两个操作不具有原子性,如果执行完第一条指令应用异常或者重启了,锁将无法过期。2.2lua脚本既然是原子性无法保证,那就采用执行lua脚本的原子性,将上述两个操作封装到lua脚本中便可以实现。ifredis.call('setnx',KEYS[1],ARGV[1])==1then
先看效果图,选中了几行,然后将选中的内容展示出来。 我设置两个有序序列,分别存储对应的复选框和行内容。 我的行内容是用的label标签。 #存储右边label组件的有序列表 defget_L_btn(self): L_btn=[self.label,self.label_2,self.label_8,self.label_9,self.label_10,self.label_11,self.label_12,self.label_13,self.label_14,self.label_15] returnL_btn #存储左边复选框的有序列表 defget_L_chk(self): L_chk=[self.checkBox,self.checkBox_2,self.checkBox_8,self.checkBox_9,self.checkBox_10,self.checkBox_11,self.checkBox_12,self.checkBox_13,self.checkBox_14,self.checkBox_15] returnL_chk复制因为他们的位置都是一一对应的,所以
前言可以当做一个初步认识Flink的文章, 仅此而已!!!!!工厂的老板VSJobManager老板都是复制整个工厂的整体把控的, 一般不亲自动手,只需要管好工厂的车间组长就可以了。 JobManager则是负责整个集群的资源管理与任务管理, 当然他不需要亲自管理,一般都是交给TaskManager。工厂的车间组长VSTaskManager工厂的车间组长也同样还是不是具体做事的人, 只需要包控下自己车间的资源和进度,向老板报告。 车间组长管理着这个拥有若干的生产设备车间 并有一批可用的工人。 工人们可以选择任意一个空闲的设备进行生产操作TaskManager负责当前节点上的任务运行及当前节点上的资源管理 并且将自己管理的内存资源划分为一个个的TaskSlot, 同时具有一定数量的CPU使用这些TaskSlot 这些CPU可以共享所有的TaskSlot资源执行任务所以类似的我们可以: 设备对于TaskSlot 工人对应CPU 并且生产设备是可以在工人之间共享, 也就是虽然内存TaskSlot进行了隔离, 但是CPU是没有进行隔离的生产流程VSTask假设我们的生产口罩的流程分为:ABCD
Keywords:堆栈、容器存储、LazyLog、异步日志、缓存周期概述规范化的日志输出和存留,可以用来:开发调试、行为留存、程序状态记录。对于日志,一般需要4个要素:时间、级别、位置、内容、上下文信息。对于集群或者多台机器来说,日志还需要区分不同机器的唯一标识。基本原理:堆栈信息自己封了个包,日志报错信息的格式为:。下面就是一条日志:[1:17:27PM](/root/tcb-console-node/dist/controllers/auth.js:auth:38:15)smart-proxysignaturecheckfail复制time、level、info元素非常容易获得,但是对于loc元素来说,它包含了调用日志的文件、函数、行数和列数。这些是通过堆栈信息来获得的。所以,获取loc的原理是:调用日志模块接口时,接口内部生成一个Error;根据堆栈信息,按照规范撰写正则表达式,匹配出文件、函数、行数和列数。//NodeErrorStack:https://github.com/v8/v8/wiki/Stack%20Trace%20API conststackReg1=/at\s
对Function的直观理解Function与Module的差异与应用场景写一个简单的ReLUFunction1.对Function的直观理解在之前的介绍中,我们知道,Pytorch是利用Variable与Function来构建计算图的。回顾下Variable,Variable就像是计算图中的节点,保存计算结果(包括前向传播的激活值,反向传播的梯度),而Function就像计算图中的边,实现Variable的计算,并输出新的Variable。Function简单说就是对Variable的运算,如加减乘除,relu,pool等。但它不仅仅是简单的运算。与普通Python或者numpy的运算不同,Function是针对计算图,需要计算反向传播的梯度。因此他不仅需要进行该运算(forward过程),还需要保留前向传播的输入(为计算梯度),并支持反向传播计算梯度。在之前Variable的学习中,我们知道进行一次运算后,输出的Variable对应的creator就是其运行的计算,如y=relu(x),y.creator,就是relu这个Function。我们可以对Function进行拓展,使其满
发展史1、很久很久以前,Web基本上就是文档的浏览而已,既然是浏览,作为服务器,不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议,就是请求加响应,尤其是我不用记住是谁刚刚发了HTTP请求,每个请求对我来说都是全新的。这段时间很嗨皮。2、但是随着交互式Web应用的兴起,像在线购物网站,需要登录的网站等等,马上就面临一个问题,那就是要管理会话,必须记住哪些人登录系统,哪些人往自己的购物车中放商品,也就是说我必须把每个人区分开,这就是一个不小的挑战,因为HTTP请求是无状态的,所以想出的办法就是给大家发一个会话标识(sessionid),说白了就是一个随机的字串,每个人收到的都不一样,每次大家向我发起HTTP请求的时候,把这个字符串给一并捎过来,这样我就能区分开谁是谁了3、这样大家很嗨皮了,可是服务器就不嗨皮了,每个人只需要保存自己的sessionid,而服务器要保存所有人的sessionid!如果访问服务器多了,就得由成千上万,甚至几十万个。这对服务器说是一个巨大的开销,严重的限制了服务器扩展能力,比如说我用两个机器组成了一个集群,小F通过机器A登录了系统,那s
随着2018年混合云将成为行业发展的风向标,几乎没有任何事情可以组织云计算业务的发展和增长,那么在可预见的将来,云计算行业的领导者将会是谁?尽管在云计算领域一直存在争议,但云服务和基础设施即服务(IaaS)领域的排行在短期内可能会持续保持现状:AWS排名第一,微软其次,第三是谷歌。业界分析师认为,随着用户寻求多云策略来避免厂商锁定等问题,随着时间的推移IBM可能会成为AWS和Azure之后的下一个重要的云服务提供商,IBM在区块链和分析方面的举措可以帮助公司成为某些云工作负载的更有竞争力的厂商。 AWS、微软、谷歌的云市场排名云计算市场竞争激烈,排名上的任何变化都意味着海量的工作需要做。KeyBanc分析师在CNBC上引用报告称,AWS第四季度的市场份额为62%,低于去年同期的68%,而微软持续增长。就目前而言:◆AWS拥有市场的62%的份额(低于之前的68%) ◆Azure市场份额从16%增长到20%◆谷歌的份额从10%增长到了12%未来五年可能会发生什么变化?尽管希望渺茫,但并非不可能。Gartner预计全球企业在内部数据中心系统上的投入超过1400亿美元。此后,公有云和私有云服务
MaximumSizeSubarraySumEqualsk 要点: 为什么slindingwindow或者localendingat方法不行?要得到exactequalsk,而array不是sorted。 idea:基本利用了partialsum差得到subarraysum。另外因为要得到maxLen,所以从左到右scan的时候,相同的partialsum只记录最左边的即可(显然如果是minLen,记录最右)。 sum_diff中作为减数的partialsum是exclusive的,所以长度公式是不+1的。同时也容易处理边界条件:初始化map为{0,-1} sum_diff只是右边的partialsum减去左边的,差值即为subarraysum,和结果正负无关 错误点: 注意减法的顺序:partialsum-k https://repl.it/Clxw classSolution(object): defmaxSubArrayLen(self,nums,k): """ :typenums:List[int] :typek:int :rtype:int """ umap={
各位看官久等了。最近比较忙乱,一是因为学习新技术本身就是一件很耗精力的事情,另一个原因该项目升级为了一个商业项目。然后还有PB项目的开发,时间紧,任务重…… ------------------------------技术理想与生活实现分割线------------------------------------ 这篇主要是总结了一下ORM层面从EF迁移到NPoco上,涉及到的一些操作,写的比较笼统,需要详细解释的可以留言。 一、Nop.Data部分 迁移后的项目文件结构,见下图: 1、创建NPocoContext,实现IDbContext接口。(尚未实现存储过程相关的接口)。 2、创建NPocoRepository,实现IRepository接口。 3、将BaseEntity拆分,结构定义如下:
要读取cell中的值,但是,如果cell中的值是一个公式,则读取出来的是公式。有时候我们希望读取到公式计算出来的结果,可以使用load_workbook()中的data_only属性。 load_workbook()中的read_only用于打开一个大空间的xlsx文件(否则会产生MemoryError问题——内存爆了),data_only用于读取cell中的值(如果cell中的值是公式,则会返回计算得到的值) filename (stringorafile-likeobjectopeninbinarymodec.f., zipfile.ZipFile)–thepathtoopenorafile-likeobjectread_only (bool)–optimisedforreading,contentcannotbeedited 准备包含带有公式的excel wb=openpyxl.load_workbook(filename,data_only=True)复制
过滤器 过滤器规则 Vue.js允许你自定义过滤器,可被用于一些常见的文本格式化。过滤器可以用在两个地方: 双花括号插值{{}}和 v-bind 表达式 (后者从2.1.0+开始支持)。过滤器应该被添加在JavaScript表达式的尾部,由“管道”符号指示: <!--在双花括号中--> {{name|Upper}} <!--在`v-bind`中--> <divv-bind:id="martin|Upper"></div>复制 过滤器分为全局过滤器和本地过滤器,全局过滤器顾名思义就是所有Vue实例挂载的元素内都能使用,而本地过滤器则是指只有过滤器函数所在的Vue实例挂载的元素内可以使用 全局过滤器: Vue.filter('Upper',function(name){ returnname.toUpperCase(); });复制 本地过滤器: varvm=newVue({ el:'#app', data:{ name:'m
单纯视图之间的切换单文档多视图切换是我在学习MFC中遇到的一个老大难问题,在今天总算是一一破解了。我觉得视图切换分为三个等级,第一是在未切分窗格的情况下切换视图类;第二是在分割窗格的一个窗格内实行视图切换;第三是在分割窗格和未分割之间的切换和视图切换。在MFC创建SDI的伊始,MFC默认的视图类是CView,如果CView满足你的需求,可以直接单击finish,如果你不想让CView成为你的默认视图类,你可以在下图这个地方修改。如果你忘记了修改默认的视图类这也没关系,我们可以在代码中改变:在App类里面有个函数叫InitInstance(),在这里面有一段代码CSingleDocTemplate*pDocTemplate;pDocTemplate=newCSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(Cprogram8Doc),RUNTIME_CLASS(CMainFrame),RUNTIME_CLASS(CView1));//这里更改你的默认视图类,注意不要忘记包含头文件哦if(!pDocTemplate)returnFALSE;AddD
一、官网快速构建 1、maven构建项目 1、访问http://start.spring.io/ 2、选择构建工具MavenProject、SpringBoot版本2.1.1以及一些工程基本信息,可参考下图所示: 3、点击GenerateProject下载项目压缩包 4、解压后,使用idea,File->new->Projectfromexistingsources->demo中的pom.xml->Finsh,OKdone! SpringBoot的基础结构共三个文件: src/main/java程序开发以及主程序入口 src/main/resources配置文件 src/test/java测试程序 采用默认配置可以省去很多配置,当然也可以根据自己的喜欢来进行更改最后,启动Applicationmain方法,至此一个java项目搭建好了! 2、引入web模块 pom.xml中添加支持web的模块: <dependency> <groupId>org.springframework.boot</groupI
为什么要用xargs,问题的来源 在工作中经常会接触到xargs命令,特别是在别人写的脚本里面也经常会遇到,但是却很容易与管道搞混淆,本篇会详细讲解到底什么是xargs命令,为什么要用xargs命令以及与管道的区别。为什么要用xargs呢,我们知道,linux命令可以从两个地方读取要处理的内容,一个是通过命令行参数,一个是标准输入。例如cat、grep就是这样的命令,举个例子: echo'main'|cattest.cpp 复制 这种情况下cat会输出test.cpp的内容,而不是'main'字符串,如果test.cpp不存在则cat命令报告该文件不存在,并不会尝试从标准输入中读取。echo'main'|会通过管道将echo的标准输出(也就是字符串'main')导入到cat的标准输入,也就是说此时cat的标准输入中是有内容的,其内容就是字符串'main'但是上面的内容中cat不会从它的标准输入中读入要处理的内容。(注:标准输入是有一个缓冲区的,就像我们在程序中使用scanf函数从标准输入中读取一样,实际上是从标准输入的缓冲区中读取的)。其实基本上linux的命令中很多的命令的设计是
职责链模式(ChainOf Responsibility),其含义是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止,我们可以考虑现实中的军情传递情况,以及java语言中的异常处理机制。 这个想法是给多个对象处理一个请求的机会,从而解耦发送者而后接受者。该请求沿对象链传递直至其中一个对象处理它,从第一个对象开始,链中收到请求的对象要么亲自处理它,要么转发给链中的下一个候选者。提交请求的对象并不明确地知道哪一个对象将会处理它——我们说该请求有一个隐式的接收者。要沿链发转请求,并保证接收者为隐式的,每个在链上的对象都有一致的处理请求和访问链上后继者的接口。 其适用性: 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定, 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求, 可处理一个请求的对象集合应被动态指定。 其结构图如下: &nbs