一本码簿

众里寻码千百度,那段却在github处。

常用命令

  • docker-compose -f qsh-compose.yml -p qsh up -d
  • docker-compose -f qsh-compose.yml -p qsh down
  • docker exec id /bin/bash|sh
  • docker logs id
  • ls -lh $(find /var/lib/docker/containers/ -name *-json.log)
  • docker inspect yj_tomcat|grep json.log
  • dockerd

日志设置

位置/etc/docker/deamon.json

1
2
3
4
5
6
7
{
"log-driver": "json-file",
"log-opts": {
"max-size": "1m",
"max-file": "5"
}
}

service docker restart

注意

  • compose文件若引用dockerfile,dockerfile内有相对路径引用的外部文件,则相对路径以compose文件为基础。

函数

Vlookup

第一个参数可以包含通配符 *,进行查询。

=VLOOKUP(“*“&B1&”*“,A1:A7,1,)代表的含义是在A1:A7的范围内查找包含B1关键字的单元格,找到后返回A1:A7第一列的内容。函数中的“*”代表任意字符,也就是说在A1:A7内查找B1文本前后任意字符的内容,也就是包含B1文本的意思。其中的1代表返回A1:A7数据区域第一列结果,最后一个逗号后省略参数代表的是精确匹配,也可以输入0或FALSE。

用法

函数计算方式

  • 向量:B2:B6 表示向量。
  • 数组计算:在公式最外有 {},快捷键为 ctrl+shift+enter

数组作为公式参数

=FIND({“杭州”;”湖州”;”嘉兴 “},B1),返回结果也是数组,因此显示为#VALUE!

快捷键

  • 绝对引用切换:选中范围按 F4
  • 显示公式内容:在单元格上按 F2
  • 单元格转数组:选中多个单元格按 F9
  • 公式求值:选中公式按 F9
  • 多个单元格填充:选中多个单元格按 ctrl+enter
  • 单元格定位:F5
  • 快速填充:Ctrl+E

简称ES6,ES2015。是是JavaScript语言的下一代标准。ECMAScript是JavaScript的规格,JavaScript是ECMAScript的一种实现。主流浏览器基本都兼容ES2015,通常开发环境用ES2015,借助Babel将ES2015编译成ES5部署在生产环境。
ES2105有很多新特性:let, const, class, extends, super, arrow functions, template string, destructuring, default, rest arguments

解构赋值

The destructuring assignment syntax is a JavaScript expression that makes it possible to unpack values from arrays, or properties from objects, into distinct variables.

1
2
3
4
5
6
7
8
9
10
//数组解构赋值
let [a, ...b] = [1, 2, 3];
console.log(a); // 1
console.log(b); // [2, 3]

//对象解构赋值
let o={a:1,b:'b1',c:{ci:'cii'}}
let {a1,c}=o
console.log(a1);//undefined
console.log(c);//{ ci: 'cii' }

import()函数

import函数的参数specifier,指定所要加载的模块的位置。import命令能够接受什么参数,import()函数就能接受什么参数,两者区别主要是后者为动态加载。
import()类似于 Node 的require方法,区别主要是前者是异步加载,后者是同步加载。
ES6 import()返回一个 Promise 对象。

简洁对象定义

1
2
3
4
5
6
7
8
9
10
11
//简洁对象定义
let a = 'foo', b = 42, c = {};
let o = {a, b, c};
console.log(o);//{ a: 'foo', b: 42, c: {} }

//简洁函数定义
let f={
fun1(){
}
}
console.log(f);//{ fun1: [Function: fun1] }

对象属性动态定义

1
2
3
4
5
let lable='lable1'
let od={
[lable]:6378
}
console.log(od);//{ lable1: 6378 }

扩展运算符

Spread syntax allows an iterable such as an array expression or string to be expanded in places where zero or more arguments (for function calls) or elements (for array literals) are expected, or an object expression to be expanded in places where zero or more key-value pairs (for object literals) are expected. rest 参数的逆运算。

1
2
3
4
let to={'a':'av','b':'bv'}
let ta=['1','2','3']
console.log([...ta,'4']);//[ '1', '2', '3', '4' ]
console.log({...to,'c':'cv');//es2018 下{'a':'av','b':'bv','c':'cv'}

地图前端现状

Openlayers

Openlayer目前最新为5.2.0,地图操作有比较全面,目前openlayer整合三维前端框架ol-cesium。目前有适用于Vue的Vuelayers

Leaflet

Leaflet目前最新为1.3.4,轻量级,适合用于移动端。

Vue

vue-router

静态路由若无redirect选项,刷新后,路由末尾后会自动加斜线,导致后退前进失败,例如

/resource/show会变为/resource/show/

通过addRoutes的动态路由无此问题

vue-x

  • state:保存数据
  • getters:进行类似map操作,store的computed属性。
  • mutations:commit,改变state数据,同步。
  • actions:dispatch,业务代码,调用多个mutations,异步。

axios

linqjs

font-awesome

echarts

rx

lodash

moment

IDEA 配置

语法高亮

  1. 支持Vue语法高亮:安装vuejs插件
  2. HTML标签高亮与自动补全:File | Settings | Editor | FileTypes | HTML 添加 *.vue

添加模板

File | Settings | Editor | File and Code Templates 添加下面为Vue创建模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<template lang="html">
</template>

<script>
export default {
data() {
return {}
},
methods: {},
mounted() {

},
computed: {}
}
</script>

<style lang="css">
</style>

SCSS语法提示错误

  1. 在IDEA中,style标签中添加 type="text/scss" 属性
  2. 在VS Code其他等,style标签中添加 rel="stylesheet/scss" 属性
    为支持两者,标签如下:
1
<style rel="stylesheet/scss" lang="scss" type="text/scss">

Webpack alias支持

一般前端开发为适应多种场景,工程根目录不存在webpack.config.json,因此要在
File | Settings | Languages & Frameworks | JavaScript | Webpack
指定实际的webpack配置文件。

一般不设置webpack.dev.conf.js,设置webpack.base.conf.js ,如果仍然显示Module is not installed,重启IDEA即可。

前端问题

空子div的高度完全填充父div剩余部分

html结构为

1
2
3
4
<div id="main">
<div id="nav">nav</div>
<div id="content">content</div>
</div>

css为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/*方法1*/
html, body {
height: 100%;
margin: 0px;
padding: 0px;
}
#main {
background-color: #999;
height: 100%;
}
#nav {
background-color: #85d989;
width: 100%;
height: 50px;
}
#content {
background-color: #cc85d9;
width: 100%;
position: absolute;
top: 50px;
bottom: 0px;
}
/*方法2(省略与上相同部分)*/
#content {
background-color: #cc85d9;
width: 100%;
height: calc(100vh - 50px);/*该方法的减号前后必须要有空格*/
}
/*方法3(省略与上相同部分)*/
#nav {
background-color: #85d989;
width: 100%;
height: 50px;
float: left;
}
#content {
background-color: #cc85d9;
height:100%;
}

数据库设计通常包括:概念设计、逻辑设计和物理设计。

概念设计

概念设计是最顶层设计,包括实体、关系和约束。通常用E-R图表示,分局部E-R图和总E-R图,局部E-R图通常表示管理的一个或几个实体之间的关系及属性,总E-R图通常表示全部实体之间的关系,若实体较多忽略实体属性。若存在几个不相关的实体集,可分开表示,通常该处不表示数据字典。

概念设计图

逻辑设计

逻辑设计是概念设计的实施,表示与数据库类型无关的数据结构、数据类型、约束等相关描述。通常选择关系型数据模型,形式为二维表。

逻辑设计图

物理设计

物理设计是与选择数据库类型相关的具体实施,包括创建表结构、索引和约束等,形式为DDL描述的sql脚本。

1
2
3
4
5
6
7
8
9
CREATE TABLE Customer (
CustNo NUMBER NOT NULL,
CustName VARCHAR2(200) NOT NULL,
Street VARCHAR2(200) NOT NULL,
City VARCHAR2(200) NOT NULL,
State CHAR(2) NOT NULL,
Zip VARCHAR2(20) NOT NULL,
PRIMARY KEY (CustNo)
) ;

在封装地图前端API时,一开始在多层次深对象中无法获取类的实例变量,一开始用prototype上的一个属性代替,但是无法满足多个地图实例启动的要求,因为prototype属性是共享的。以下有三种解决方法。

在运行时绑定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function SubRun(input){
this._input=input;
}
SubRun.prototype.funs=function(){
const self=this;
return{
show:function(){
// console.log(this._input);
console.log(self._input);
}
}
}
let subRun=new SubRun("sub_run_example");
subRun.funs().show();

通过闭包返回一个函数可获取运行时指向实例的this,但是方法调用时多了一个括号,稍显麻烦。

使用Apply

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function SubApply(input){
this._input=input;
SuperApply.apply(this,arguments);
}
function SuperApply(input){
const self=this;
this._input=input;
this.base= {
show:function(){
console.log("from param: "+input);
console.log("from self: "+self._input);
}
};
this.funs={
show:function(){
console.log("from funs:");
self.base.show();
}
};
}
let subApply=new SubApply("sub_apply_example");
subApply.base.show();
subApply.funs.show();

改方法可解决this对象获取的问题,但是定义多个proto属性需重复写,不优雅。

使用Classs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class SuperClass{
constructor(input){
this._input=input;
const self=this;
this.base= {
//使用lambda的方式获取this
show:()=>{
console.log("from param: "+input);
console.log("from self: "+this._input);
}
};
this.funs={
show:function(){
console.log("from funs lambda:");
self.base.show();
}
};
}
get self(){
return this;
}
get protoPropterty(){
// const self=this;
return {
property:()=>{
this.protoMethod();
console.log(this._input);
}
}
}
protoMethod(){
console.log("from proto :"+this._input);
}
}
class SubClass extends SuperClass{
constructor(input){
super(input);
this._input=input;
this.ori={
display:()=>{
console.log("from sub call");
this.funs.show();
}
}
}
}

let subClass=new SubClass("sub_class_example");
let subClass2=new SubClass("sub_class_example2");
// subClass.base.show();
// subClass.funs.show();
subClass.protoPropterty.property();
// subClass2.protoPropterty.property();
// subClass.protoMethod();
// subClass.ori.display();

若有多个原型属性,用const self=this的方法稍显繁琐,利用lambda的特性可在多层次深对象中直接获取指向实例的this。

idea

  • Ctrl+F12Alt+7 文件结构
  • Ctrl+Shift+E 最近更改的文件
  • Ctrl+Alt+B 跳转到方法实现处
  • Ctrl+”=/-” 当前方法展开、折叠
  • Ctrl+Shift+”=/-” 全部展开、折叠
  • Shift+F8 步出
  • Alt+F9 运行至光标处
  • Alt+2 收藏

linux

  • 查看一级目录大小:du -hd 1

tumx

  • ta 打开一个窗口
  • ts 创建一个窗口
  • tl 列出窗口
  • tkss 杀死一个窗口
  • tks 杀死全部

vim

  • /search_string\c 向下查找
  • ? 向上查找
  • :%s/foo/bar/gic 全局范围%查找foo并替换为bar,全局替换g,大小写敏感i,确认 c

nginx

  • nginx -V 查看详细信息(模块)

psql

  • sudo -u psql 进入psql
  • \l 列出数据库
  • \dt 列出表
  • \d [tablename] 列出表字段

regex

  • 部分替换

原始字符串:我是程序员
正则:(.*)(([^不是]|[^是]|)程序员)(.*)
替换为:$1工程师$4

  • 非捕捉组

Windows(?=95|98|NT|2000)
匹配 “Windows2000” 中的 “Windows”
不匹配 “Windows3.1” 中的 “Windows”

模式必须放后面(?=Windows)95无法匹配Windows95。
有回查类型的,例如:

2000(?<=Office|Word|Excel)
匹配 “ Office2000” 中的 “2000”
不匹配 “Windows2000” 中的 “2000”

但是回查类型的在Atom和Sublime Text3均无效。

记不住的

  • 开启SVN svnserve -d -r /mnt/d/svncode/project

其他

  • 批量重命名 for i infind -name ‘yale_*’;do mv $i ${i/yale/qsh};done
  • 批量替换文本内容 sed -i "s/yale/qsh/g" `grep yale -lr .`
  • 批量替换带空格的文件内容 grep "dc.zjchey.com" -lrZ hldc | xargs -0 sed -i "s/dc.zjchey.com/qsh.haies.cn/g"
  • docker输入宿主文件docker exec -i gogs-mysql mysql -uroot -pxxfY5019 gogs < win/gogs.sql

本次项目采用Springboot+Mybatis方式,使用注解式配置,增加全局异常处理,实现前端和后台参数传递过程下划线和驼峰法的自动转换。MyBatis官方没有提供基于Gradle的MyBtis Generator插件,因此沿用Maven做Build工具。


配置

application.yml关键配置

MyBatis配置如下:

1
2
3
4
5
mybatis:
mapper-locations: "classpath:mapper/*.xml"
type-aliases-package: "com.zjchey.dataManage.entity"
configuration:
map-underscore-to-camel-case: true

map-underscore-to-camel-case: true在生产代码时将数据库中下划线命名自动转为驼峰法命名代码。

Jackson配置如下:

1
2
3
jackson:
property-naming-strategy: SNAKE_CASE
defaultPropertyInclusion: NON_EMPTY

property-naming-strategy: SNAKE_CASE用于前端以application/json方式提交的POST请求的流参数转换,实现前端和后台双向自动下划线和驼峰法命名,后端接受参数的对象需要用@RequestBody修饰。
defaultPropertyInclusion: NON_EMPTY用于@ResponseBody修饰的接口在将对象转为json返回参数时,如果对象属性为null,则在json中忽略该属性。

注解配置

  1. 使用@Configuration修饰配置的类。
  2. 使用@Bean修饰的方法相当于xml配置中的bean标签,对应方法名为xml配置中的id属性,也可在用@Bean(name = "heou.net")的形式指定id。
  3. Spring的三种装配方式分别是:基于@Component@Autowired的隐式装配、基于@Configuration的Java显示装配和基于xml配置的显式装配。
  4. 在xml配置中,可通过构造器注入、setter注入的方式装配Bean。
  5. 在运行函数的类的配置如下:
1
2
3
@SpringBootApplication(scanBasePackages = "com.*.*")
@MapperScan("com.*.*.*")
@EnableTransactionManagement

@SpringBootApplication 包括@Configuration、@EnableAutoConfiguration和@ComponentScan三个注解。

排除tomcat使用undertow

Maven:

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>

Gradle:

1
2
3
4
5
6
7
8
9
configurations {
compile.exclude module: 'spring-boot-starter-tomcat'
}

dependencies {
compile('org.springframework.boot:spring-boot-starter-web'){
exclude module: 'spring-boot-starter-tomcat'
}
}

logback日志

1
2
3
4
5
6
7
logging:
file: projectname.log
path: .
pattern: "%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n"
level:
root: info
org.springframework.web: warn

可指定类的日志输出级别。

MyBatis

MyBatis分页

内存分页

使用RowBounds

1
loggerMapper.getLogsBySortASC(new RowBounds(0,10));

Mybatis拦截器

待实现

第三方组件

PageHelper

通用mapper

通过泛型实现所有的mapper的CRUD操作,减少代码量。待实现,目前有通用Mapper4

MyBatis Generator

POM配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.5</version>
</dependency>
</dependencies>
</plugin>

generatorConfig配置

1
2
3
4
5
<context id="context" targetRuntime="MyBatis3">

<table tableName="user" domainObjectName="UserSample"
enableSelectByPrimaryKey="false" enableUpdateByPrimaryKey="false"
enableDeleteByPrimaryKey="false" delimitIdentifiers="true"/>

targetRuntime=”MyBatis3”生产的代码包括selectByExample,delimitIdentifiers=”true”确保表名加引号,即使使用关键字(例如user)也可以正常查询。

常用功能

全局异常处理

1
2
3
4
5
6
7
8
9
10
11
@ControllerAdvice
public class GlobalExceptionHandler {
private final Logger logger=LoggerFactory.getLogger(getClass());

@ResponseBody
@ExceptionHandler(value = Exception.class)
public Result handlerGlobalException(Exception ex){
logger.error(ex.getMessage());
return new Result(ex.getMessage(),ResultType.ERROR);
}
}

若业务代码中无异常处理,可捕获controller和service中的异常。

统一返回消息格式

1.定义错误代码与错误消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public enum ResultType {
SUCCESS(200,"接口返回正常"),
FAILURE(5000,"接口返回失败"),
PARAMS_ERROR(5100,"提交参数错误"),
PARAMS_ERROR_MISS(5101,"必填参数缺失"),
PARAMS_ERROR_INVALID(5102,"参数无效"),
PERMISSION_DENIED(6000,"权限拒绝"),
DENIED_NOT_ROLE(6100,"角色权限拒绝"),
DENIED_NOT_ADMIN(6101,"非管理员权限"),
DENIED_NOT_USER(6102,"用户权限拒绝"),
ERROR(500,"接口调用错误"),
CUSTOM(999,"定制消息");

private Integer code;
private String msg;

ResultType(Integer code, String msg){
this.code=code;
this.msg=msg;
}
......
}

2.定义返回格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Result<T> {
@JsonIgnore
private ResultType resultType;
/*错误码*/
private Integer code;
/*提示信息 */
private String msg;
/*数据内容*/
private T data;

public Result(T data) {
this.data = data;
this.setResultType(null);
}

public Result(T data, ResultType resultType) {
this.data = data;
this.setResultType(resultType);
}
......
private void setResultType(ResultType type) {
this.resultType=type==null? ResultType.SUCCESS:type;
this.code= this.resultType.getCode();
this.msg= this.resultType.getMsg();
}
}

3.定义BaseController。

工具类使用

Google Guava

apache-commons-collections

apache-commons-fileupload

高级用法

数据库读写分离

redis二级缓存

统一前后端地址

使用反向代理

处理枚举

前后端字段下划线和驼峰法自动切换

指定property-naming-strategy: SNAKE_CASE
可实现后台到前端时的lowwer_camel转under_score但是,前端到后台时,后台接受参数的对象前加@RequestBody后,以Content-Type: application/json方式发POST请求时可以实现under_score转lowwer_camel
以application/x-www-form-urlencoded发POST请求时可以实现和Get请求均不能实现。

1.通过get请求或者application/x-www-form-urlencoded提交的POST请求

此情况下,参数可通过httpserveletRequest.getParams()获取

定义argumentreslover,如下:

1
2
3
class UnderScore2CamelArgumentResolver implements HandlerMethodArgumentResolver{
....
}

2.通过application/json提交的POST请求

此情况下,参数可通过httpserveletRequest.getInputStream()获取参数json流。

参考本文的Jackson配置

问题

Generator的xml文件如何读取application.yml内的内容

未解

yml中的日志名称改为项目名称

未解

Invalid bound statement (not found)

异常的全称如下:

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

网上大多提到的是xml的mapper无法扫描到,要在启动类配置@MapperScan(“com.*“),但本项目一开始犯了各低级的错误,application.xml的datasource.url配置成了jdbc:postgres://***,应该是jdbc:postgresql://***

注解

格式化

  1. @DateTimeFormat(pattern=”yyyy-MM-dd”)是将String转换成Date,一般前台给后台传值时用
  2. @JsonFormat(pattern=”yyyy-MM-dd”) 将Date转换成String 一般后台传值给前台时
  3. @JsonDeserialize(using = CustomJsonDateDeserializer.class)
  4. @JsonSerialize(using= DateJsonSerializer.class)

配置属性

WinGet

常用软件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
winget install --id voidtools.Everything -h;
winget install --id VideoLAN.VLC -h;
winget install --id 7zip.7zip -h;
winget install --id Microsoft.Sysinternals.Suite -h;
winget install --id Obsidian.Obsidian -h;
winget install --id Google.Chrome -h;
winget install --id Mozilla.Firefox -h;
winget install --id Tencent.WeChat -h;
winget install --id Alibaba.DingTalk -h;
winget install --id Evernote.Evernote.CN -h;
winget install --id PixPin.PixPin -h;
winget install --id Kingsoft.WPSOffice-CN -h;
winget install --id Baidu.BaiduNetdisk -h;
winget install --id Tencent.QQ -h;
winget install --id Tencent.QQMusic -h;
winget install --id Tencent.TencentVideo -h;
winget install --id Tencent.TencentMeeting -h;
winget install --id Bilibili.Bilibili -h;
winget install --id QL-Win.QuickLook -h;
winget install --id AutoHotkey.AutoHotkey -h;
winget install --id Microsoft.PowerToys -h;
winget install --id ClashVergeRev.ClashVergeRev -h;
winget install --id Microsoft.PowerShell -h;
winget install --id Microsoft.VisualStudioCode -i;

一键安装

1
2
Set-ExecutionPolicy Bypass -Scope Process -Force;
irm https://haies.cn/assets/win-install.ps1 | iex;

一键优化

1
2
Set-ExecutionPolicy Bypass -Scope Process -Force;
irm https://debloat.raphi.re/ | iex;

工作软件

1
2
3
4
5
6
7
8
9
10
11
12
13
winget install --id OSGeo.QGIS_LTR -h;
winget install --id RealVNC.VNCViewer -h;
winget install --id Rufus.Rufus -h;
winget install --id WinSCP.WinSCP -h;
winget install --id TortoiseSVN.TortoiseSVN -h;
winget install --id JurgenRathlev.innounp -h;
winget install --id DBBrowserForSQLite.DBBrowserForSQLite -h;

winget install --id Canonical.Ubuntu -h;
winget install --id PremiumSoft.NavicatPremium -h;
winget install --id JetBrains.IntelliJIDEA.Ultimate -h;
winget install --id Microsoft.VisualStudio.Community -h;

Scoop

1
2
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser;
irm https://get.scoop.sh | iex;

scoop install git-with-openssh gitignore sudo busybox nodejs-lts -g
scoop install cmder yarn maven python -g

npm

npm i -g hexo-cli
npm i -g phantomjs-prebuilt
npm i -g vue-cli webpack-cli tldr

[其他]

一键集合

1
irm https://get.activated.win | iex

环境位置

  • Everything %AppData%\Everything\Everything.ini
  • SSH %HOMEPATH%\.ssh
  • Git %HOMEPATH%\.gitconfig

准备材料清单

服务

  • ZCEY ITISPR-33_服务级别管理程序-服务目录.xls
  • ZCEY ITISPR-33_服务级别管理程序-IT服务水平协议(SLA).docx
  • ZCEY ITISPR-33_服务级别管理程序-运营级别协议OLAS.doc

项目

  • 系统开发合同/开发任务单
  • 系统需求分析
  • 系统功能设计
  • 系统测试方案
  • 系统测试报告
  • 系统验收报告或功能点验收报告
  • 用户报告

运维

  • ZCEY ITISPR-22_事件管理程序-运维事件汇总记录单.xlsx
  • ZCEY ITISPR-22_事件管理程序-重大事件处理报告单.docx

其他

  • 系统变更记录
  • 系统会议记录
  • 系统巡检记录
  • 其他ITIS文件

安全服务协议

  • 服务目录
    服务目录需根据不同的系统进行定制。
  • 服务协议
  • 运营协议
  • 服务提供方式
    如果提供技术支持,提供系统支持过程记录单。
  • 服务评价
    用户报告、用户满意度调查

开发过程控制

  • 系统合同或开发任务书
    系类型为:为甲方开发的任务、为院生产开发的任务、出售软件服务。为甲方开发的任务需要提供系统开发合同,后两者需提供开发任务书。
  • 需求分析
    分功能性需求和非功能性需求。
  • 功能设计
    功能设计需以需求为核心,一般包括概要设计和详细设计。
  • 系统测试
    包括系统测试方案,测试报告。
  • 系统验收
    系统验收报告或功能点验收报告。
  • 系统发布
    系统发布方案
  • 系统运维
    提供系统运维记录。

信息安全保证

开发环境

  • 开发环境分内网环境和外网环境,如果开发过程涉及到涉密数据,开发的调试和测试需放在内网环境。
  • 主机登录需考虑密钥和IP限制。
  • 主机需进行端口访问和IP访问策略控制,采用阿里云管理访问策略。
  • 开发主机需要安装杀毒软件或购买相应的云安全服务,如安骑士等。

代码管理

  • 使用svn 和git进行版本控制,版本控制分成果和开发分支。
  • 开发人员需提交密钥后才能提交代码,且只能提交到开发分支。
  • 项目负责人需管理分支,进行code review后将新开发的功能或者改进的代码合并到成果分支。

系统安全

  • 系统使用需进行登录,和无操作登录超时操作,用户密码需要进行加密和弱密码限制策略。
  • 系统关键参数,如坐标转换参数需进行加密,且满足一定的加密强度。

数据安全

  • 系统和系统数据库进行定时和手动备份计划。
  • 系统代码和文档需在不同主机进行备份。
  • 系统进行关键数据操作时,提供回退操作,且能回退到操作前的数据状态。

常用坐标对应的EPSG编号

cgcs2000_geo: 4490
cgcs2000_3_gk_117E: 4548
cgcs2000_3_gk_120E: 4549
cgcs2000_3_gk_123E: 4550
wgs84_geo: 4326
web_mercator_auxiliary_sphere: 3875
web_mercator(google): 3785

0%