0%

Bug级别

  • Blocker: 崩溃:阻碍开发或测试工作的问题;造成系统崩溃、死机、死循环,导致数据库数据丢失, 与数据库连接错误,主要功能丧失,基本模块缺失等问题。如:代码错误、死循环、数据库发生死锁、 重要的一级菜单功能不能使用等(该问题在测试中较少出现,一旦出现应立即中止当前版本测试)。
  • Critical: 严重:系统主要功能部分丧失、数据库保存调用错误、用户数据丢失, 一级功能菜单不能使用但是不影响其他功能的测试。功能设计与需求严重不符, 模块无法启动或调用,程序重启、自动退出,关联程序间调用冲突,安全问题、稳定性等。 如:软件中数据保存后数据库中显示错误,用户所要求的功能缺失,程序接口错误, 数值计算统计错误等(该等级问题出现在不影响其他功能测试的情况下可以继续该版本测试)。
  • Major: 一般:功能没有完全实现但是不影响使用,功能菜单存在缺陷但不会影响系统稳定性。 如:操作时间长、查询时间长、格式错误、边界条件错误,删除没有确认框、数据库表中字段过多等 (该问题实际测试中存在最多,合理安排解决BUG,解决率关系版本的优化程度)。
  • Minor: 次要:界面、性能缺陷,建议类问题,不影响操作功能的执行,可以优化性能的方案等。 如:错别字、界面格式不规范,页面显示重叠、不该显示的要隐藏,描述不清楚,提示语丢失, 文字排列不整齐,光标位置不正确,用户体验感受不好,可以优化性能的方案等 (此类问题在测试初期较多,优先程度较低;在测试后期出现较少,应及时处理)。
Read more »

Prometheus简介

Prometheus是一套开源的系统监控报警框架。它启发于Google的borgmon监控系统, 由工作在SoundCloud的google前员工在2012年创建,作为社区开源项目进行开发,并于2015年正式发布。 2016年,Prometheus正式加入Cloud Native Computing Foundation,成为受欢迎度仅次于Kubernetes的项目。

Read more »

  • Elasticsearch: 一个分布式、RESTful风格的搜索和数据分析引擎
  • Kibana: 一个免费且开放的用户界面,能够对数据进行可视化
  • Logstash: 服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到指定的存储库中
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
version: '3.7'
services:
kibana:
image: kibana:7.9.2
restart: always
ports:
- 5601:5601
environment:
ELASTICSEARCH_HOSTS: http://elasticsearch:9200
ELASTICSEARCH_USERNAME: elastic
ELASTICSEARCH_PASSWORD: EA238970DA384AA3A308FB692714AA1B
elasticsearch:
image: elasticsearch:7.9.2
restart: always
ports:
- 9200:9200
- 9300:9300
environment:
ELASTIC_PASSWORD: EA238970DA384AA3A308FB692714AA1B
XPACK_LICENSE_SELF_GENERATED_TYPE: basic
discovery.type: single-node
logstash:
image: logstash:7.9.2
restart: always
ports:
- 5000:5000
- 9600:9600
environment:
XPACK_MONITORING_ELASTICSEARCH_HOSTS: http://elasticsearch:9200
XPACK_MONITORING_ELASTICSEARCH_USERNAME: elastic
XPACK_MONITORING_ELASTICSEARCH_PASSWORD: EA238970DA384AA3A308FB692714AA1B

Django程序在接收到请求之后,会在第一次访问数据库时创建连接,到请求结束时关闭连接。

源码分析

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
# django/core/handlers/wsgi.py
class WSGIHandler(base.BaseHandler):
request_class = WSGIRequest

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.load_middleware()

def __call__(self, environ, start_response):
set_script_prefix(get_script_name(environ))
# 请求开始,触发request_started信号
signals.request_started.send(sender=self.__class__, environ=environ)
request = self.request_class(environ)
response = self.get_response(request)

response._handler_class = self.__class__

status = '%d %s' % (response.status_code, response.reason_phrase)
response_headers = [
*response.items(),
*(('Set-Cookie', c.output(header='')) for c in response.cookies.values()),
]
start_response(status, response_headers)
if getattr(response, 'file_to_stream', None) is not None and environ.get('wsgi.file_wrapper'):
# If `wsgi.file_wrapper` is used the WSGI server does not call
# .close on the response, but on the file wrapper. Patch it to use
# response.close instead which takes care of closing all files.
response.file_to_stream.close = response.close
response = environ['wsgi.file_wrapper'](response.file_to_stream, response.block_size)
return response
Read more »

Case Description Example Resule
camel case Transform into a string with the separator denoted by the next word capitalized test string testString
capital case Transform into a space separated string with each word capitalized test string Test String
constant case Transform into upper case string with an underscore between words test string TEST_STRING
dot case Transform into a lower case string with a period between words test string test.string
header case Transform into a dash separated string of capitalized words test string Test-String
no case Transform into a lower cased string with spaces between words test string test string
param case Transform into a lower cased string with dashes between words test string test-string
kebab case Transform into a lower cased string with dashes between words test string test-string
pascal case Transform into a string of capitalized words without separators test string TestString
path case Transform into a lower case string with slashes between words test string test/string
sentence case Transform into a lower case with spaces between words, then capitalize the string testString Test string
snake case Transform into a lower case string with underscores between words test string test_string
title case Transform a string into title case following English rules test string Test String
swap case Transform a string by swapping every character from upper to lower case, or lower to upper case test string tEST sTRING
lower case Transforms the string to lower case TEST STRING test string
lower case first Transforms the string with the first character in lower cased TEST STRING tEST STRING
upper case Transforms the string to upper case test string TEST STRING
upper case first Transforms the string with the first character in upper cased test string Test string

Reference

VtigerCRM是一套基于Web以销售能力自动化(SFA)为主的客户关系管理系统(CRM)。它基于是SugarCRM专业版(SPL1.1.2)开发的一个衍生版本。

VtigerCRM系统是一个适合中小企业的客户管理工具,帮助管理公司业务,从市场、销售、采购、库存、客服等全程跟踪客户, 最大可能获得订单,提高客户满意度。比较适合销售团队,贸易公司,服务型企业使用。部分作用如下:

  • 统一记录与管理客户资料,不再担心资料丢失
  • 随时随地搜索查找客户资料,及时联系客户
  • 自动化的统计分析您的客户信息、销售情况等
  • 全面掌握公司业务信息,避免人员离职等导致客户流失
  • 通过CRM系统的工作流使公司业务流程自动化
Read more »

关于Python运算符重载,大家可以参考Data model

重载一元运算符

运算符 函数 说明
+ __pos__ 一元取正算术运算符
- __neg__ 一元取负算术运算符
~ __invert__ 对整数按位取反
Read more »

这两天发现网页浏览量显示不对,深入调查后发现是Chrome 85Referrer-Policy进行了调整, 将原来默认的no-referrer-when-downgrade调整为strict-origin-when-cross-origin

什么是Referer

Referer请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。 服务端一般使用Referer请求头识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。

需要注意的是referer实际上是referrer误拼写。参见HTTP referer on Wikipedia来获取更详细的信息。

什么是Referrer-Policy

Referrer-Policy首部用来监管哪些访问来源信息——会在Referer中发送——应该被包含在生成的请求当中。

  • no-referrer: 整个Referer首部会被移除。访问来源信息不随着请求一起发送。
  • no-referrer-when-downgrade: 在没有指定任何策略的情况下用户代理的默认行为。在同等安全级别的情况下, 引用页面的地址会被发送(HTTPS->HTTPS),但是在降级的情况下不会被发送(HTTPS->HTTP)。
  • origin: 在任何情况下,仅发送文件的源作为引用地址。例如 https://example.com/page.html 会将 https://example.com/ 作为引用地址。
  • origin-when-cross-origin: 对于同源的请求,会发送完整的URL作为引用地址,但是对于非同源请求仅发送文件的源。
    Read more »

vee-validatevuejs的表单验证库,它内置了许多规则,并且支持自定义规则。

安装

1
2
3
yarn add vee-validate
# OR
npm install vee-validate --save

配置

加载components并导入rules

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import Vue from 'vue'
import { ValidationObserver, ValidationProvider, extend } from 'vee-validate'
import * as rules from 'vee-validate/dist/rules'
import { messages } from 'vee-validate/dist/locale/zh_CN.json'

Vue.component('ValidationObserver', ValidationObserver)
Vue.component('ValidationProvider', ValidationProvider)

for (const [rule, validation] of Object.entries(rules)) {
extend(rule, {
...validation,
message: (messages as { [key: string]: string })[rule]
})
}
Read more »

直接在typescript中导入json会抛出如下异常:

1
TS2732: Cannot find module ‘***.json'. Consider using '--resolveJsonModule' to import module with '.json' extension

要避免产生这个异常,你需要在tsconfig.json中配置如下两个属性:

1
2
"resolveJsonModule": true,
"esModuleInterop": true,