uniCloud avanzado (1. Competente en la estructura de tablas del esquema de base de datos)


Prefacio

Competente en la estructura de la tabla del esquema DB


1. Estructura de tabla Esquema de base de datos

Haga clic derecho en la base de datos y cree un nuevo esquema de base de datos.
Insertar descripción de la imagen aquí

Reglas de validación de esquemas


	"bsonType": "object",
	"required": ["title"],//必填
	"permission": {
    
    
		"read":  true,//检验keyid
		"create": "atuo.uid != null",//校验用户登录
		"update": false,
		"delete": false
	},
	"properties": {
    
    //数据库数据验证 字段
		"_id": {
    
    
			"description": "ID,系统自动生成"
		},
		"title":{
    
    
			  "bsonType": "string",
			  "title": "文章标题",
			  "description": "文章的标题",
			  "errorMessage":"标题必须填写",
			  "trim": "both"
		},
		"userid":{
    
    
			"bsonType": "string",
			"title": "用户id",
			"foreignKey": "uni-id-users._id",
			"defaultValue":{
    
    //默认值now/时间戳, clientIP/客户端ip  
			用户id uid 
				"$env":"uid"
			}
		}
	}
}

propiedades del campo de propiedades

La lista de campos en propiedades, cada campo tiene muchas propiedades que se pueden configurar, de la siguiente manera:

Clasificación de atributos Atributos tipo describir
básico bsonTipo cualquier Tipo de campo, como objeto json, cadena, número, valor bool, fecha, marca de tiempo; consulte la siguiente tabla para obtener detalles sobre los tipos disponibles de bsonType
básico tipo de matriz Cadena Tipo de elemento de matriz, válido cuando bsonType="array", compatible con HBuilderX 3.1.0+; consulte la siguiente tabla para conocer los tipos de arrayType disponibles
básico título cadena Título, utilizado por los desarrolladores para el mantenimiento. Cuando esquema2code genera el código del formulario de interfaz, se usa de forma predeterminada para la etiqueta delante del elemento del formulario.
básico descripción cadena Descripción, utilizada por los desarrolladores para el mantenimiento. Al generar el código del formulario de front-end, si el campo no está configurado en componenteForEdit y el campo se representa como entrada, el lugar reservado de la entrada será esta descripción de forma predeterminada.
básico valor por defecto cadena, objeto valor por defecto
básico fuerzaDefaultValue cadena, objeto El valor predeterminado obligatorio, que no puede ser modificado por el código clientDB, se usa a menudo para almacenar valores fijos como identificación de usuario, hora, IP del cliente, etc. Consulte el valor predeterminado en la siguiente tabla para obtener más detalles.
Verificación del rango de valores requerido formación ¿Es necesario? Admite completar nombres de campos subordinados obligatorios. requerido puede aparecer en la descripción a nivel de tabla, especificando qué campos de la tabla son obligatorios. También puede aparecer en un campo determinado. Si el campo es un objeto json, puede describir qué campos del json son obligatorios. Vea el ejemplo a continuación para más detalles.
Verificación del rango de valores enumeración Formación Rango de enumeración de valores de campo, debe haber al menos un elemento en la matriz y cada elemento de la matriz es único.
Verificación del rango de valores tipo de enumeración Cadena Tipo de enumeración de valores de campo, árbol de valores opcional. Cuando se establece en árbol, significa que los datos de la enumeración son una estructura de árbol. En este momento, Schema2code puede generar componentes de selección en cascada de varios niveles.
Verificación del rango de valores tipo de medio de archivo Cadena Tipo de archivo, válido cuando bsonType="archivo", valor opcional todo
Verificación del rango de valores archivoExtName Cadena Filtrado de extensiones de archivos, válido cuando bsonType="archivo", varias extensiones de archivos están separadas por ",", por ejemplo: jpg, png, compatible con HBuilderX 3.1.0+
Verificación del rango de valores máximo número Si bsonType es un número, el valor máximo aceptable
Verificación del rango de valores exclusivoMáximo booleano Ya sea para excluir el máximo
Verificación del rango de valores mínimo número Si bsonType es un número, el valor mínimo aceptable
Verificación del rango de valores exclusivoMínimo booleano Ya sea para excluir el mínimo
Verificación del rango de valores longitud mínima número Limitar la longitud mínima de una cadena o matriz
Verificación del rango de valores longitud máxima número Limitar la longitud máxima de una cadena o matriz
Verificación del rango de valores recortar Cadena Eliminar caracteres de espacio en blanco, no admite ninguno
Verificación del rango de valores formato 'url', 'correo electrónico' Formato de datos, los datos que no se ajusten al formato no se pueden almacenar en la base de datos. Actualmente solo se admiten 'url' y 'correo electrónico', se ampliarán otros formatos en el futuro
Verificación del rango de valores patrón Cadena Expresión regular: por ejemplo, si se establece en la expresión regular de un número de teléfono móvil, si no coincide con la expresión regular, la verificación fallará y no se podrá almacenar en la base de datos.
Verificación del rango de valores validarFunción cadena Nombre de la función de verificación extendida
Verificación de permiso permiso Objeto Los permisos de la base de datos controlan qué roles pueden leer/escribir qué datos, controlar tablas y campos, y establecer dónde condiciones. Vea los detalles abajo
retorno de error mensaje de error cadena, objeto Cuando se escriben o actualizan datos, aparece el mensaje de error después de no poder verificar la validez de los datos
relación de conexión clave externa Cadena Campos relacionados. Indica que la definición original del campo apunta a un campo en otra tabla y el formato del valor es nombre de tabla.Nombre de campo. Por ejemplo, el campo uid de usuario de pedido de la tabla de pedidos apunta al campo _id de la tabla de pedidos. tabla id-users, entonces el valor es uni -id-users._id. Una vez definidos los campos asociados, se pueden utilizar para consultas de tablas conjuntas. Las tablas conjuntas virtuales se sintetizan a través de los campos asociados, lo que simplifica enormemente la complejidad de las consultas de tablas conjuntas.
relación de conexión clavepadre Cadena Campos principales en la misma tabla de datos. Para obtener más información, consulte: Consulta de datos del árbol
esquema2código etiqueta cadena Título del campo. Cuando Schema2code genera código de interfaz de usuario, muestra el título de la etiqueta delante del elemento del formulario. Si se deja en blanco, se utilizará el atributo de título. Adecuado para situaciones en las que el título no se puede mostrar delante del elemento del formulario.
esquema2código grupo cadena Identificación del grupo. Cuando Schema2code genera código de interfaz, los elementos del formulario correspondientes a múltiples campos se pueden combinar y mostrar en un componente unigrupo.
esquema2código orden En t Número de clasificación de elementos del formulario. Cuando Schema2code genera código de front-end, los elementos del formulario se organizan de arriba a abajo en el orden de los campos del esquema de forma predeterminada. Sin embargo, si se especifica el orden, el orden se ordenará en el orden especificado por orden. Si el elemento del formulario está incluido en un unigrupo, el mismo grupo se ordenará por orden.
esquema2código componente Objeto、Matriz Cuando Schema2code genera código de interfaz de usuario, qué componente se utiliza para representar este elemento de formulario. Obsoleto. Utilice componenteForEdit y componenteForShow a continuación
esquema2código componenteParaEditar Objeto、Matriz HBuilderX 3.1.0+, al generar archivos de página de edición de front-end (add.vue, edit.vue), qué componente se utiliza para representar este elemento de formulario. Por ejemplo, utilice el cuadro de entrada de entrada.
esquema2código componenteParaMostrar Objeto、Matriz HBuilderX 3.1.0+, al generar la página de visualización frontal (list.vue, Detail.vue), qué componente se utiliza para la renderización. Por ejemplo, utilice uni-dateformat para dar formato a las fechas.

formulario obligatorio campos obligatorios, formato de entrada

bsonTipo

  • bool: valor booleano, verdadero|falso
  • cadena: cadena
  • password:一种特殊的string。这类字段不会通过clientDB传递给前端,所有用户都不能通过clientDB读写,即使是admin管理员。uni-id-user表有示例
  • int:整数
  • double:精度数。由于浮点精度问题,慎用
  • object:json对象。地理位置也属于object
  • file:一种特殊的object,固定格式存放云存储文件的信息。不直接存储文件,而是一个json object,包括云存储文件的名称、路径、文件体积等信息。(HBuilderX 3.1.0+ )
  • array:数组
  • timestamp:时间戳
  • date:日期

新增照片字段

"photo": {
    
    
        "bsonType": "file",
        "title": "照片",
        "fileMediaType": "image", // 可选值 all|image|video 默认值为all,表示所有文件,image表示图片类型文件,video表示视频类型文件
        "fileExtName": "jpg,png", // 扩展名过滤,多个用 , 分割
      }

arrayType 指定数组每一项的类型

bsonType为array时使用

"images": {
    
    
        "bsonType": "array",
        "arrayType": "file",
        "title": "照片",
		"multiple": true, // 允许选择多张图片,schema2code生效
        "fileMediaType": "image", // 可选值 all|image|video 默认值为all,表示所有文件,image表示图片类型文件,video表示视频类型文件
        "fileExtName": "jpg,png", // 扩展名过滤,多个用 , 分割
        "maxLength": 3 // 限制最大数量
      }

defaultValue/forceDefaultValue 默认值

  • defaultValue普通默认值
  • forceDefaultValue 强制默认值,不可修改
"defaultValue": {
    
    
  "$env": "now"
}

预置变量$env取值:

变量 说明
now 当前服务器时间戳
clientIP 当前客户端IP
uid 当前用户Id,基于uni-id。如果当前用户未登录或登录状态无效会报错

foreignKey 关联数据表

foreignKey 前半部分是另一张表的表名,中间用.分割,后半部分是另一张表的字段名
作用:联表查询

 "user_id": {
    
    
	"bsonType": "string",
	"description": "文章作者ID",
	"foreignKey": "uni-id-users._id",
	"defaultValue": {
    
    
	  "$env": "uid"
	}
  },

parentKey树形表

  • 形式化父子关系,实现tree查询
  • 使用parentKey描述了字段父子关系后,就可以通过JQL的getTree方便的做tree查询
"parent_id": {
    
    
      "bsonType": "string",
      "description": "父id",
      "parentKey": "_id", // 指定父子关系为:如果数据库记录A的_id和数据库记录B的parent_id相等,则A是B的父级。
    },

validator 字段值域规则 required

  • required填写后该字段不可为空
  • 当required没填写,则进行name下的规则验证,name长度不能小于2
{
    
    
  "bsonType": "object",
  "required": ["name"],
  "properties": {
    
    
    "name": {
    
    
      "bsonType": "string",
      "title": "姓名",
      "minLength": 2,
      "errorMessage"{
    
    
         "required": "{title}不能为空",
        "minLength": "{title}不能小于 {minLength} 个字符"
       }
    }
  }
}

format 验证url网址

  • 仅对string类型字段生效。
  • http:// | https:// | ftp:// 开头, // 后必须包含一个 .(localhost除外)
 "properties": {
    
    
    "email": {
    
    
      "bsonType": "string",
      "title": "邮箱",
      "format": "email",
      "errorMessage": {
    
    
        "required": "{title}不能为空",
        "format": "{title}格式无效"
      }
    }
  }

pattern正则表达式

正则验证
例:验证手机号 “pattern”: “^\+?[0-9-]{3,20}$”

"properties": {
    
    
    "name": {
    
    
      "bsonType": "string",
      "title": "姓名",
      "pattern": "",
      "errorMessage": {
    
    
        "required": "{title}不能为空",
        "pattern": "{title}格式无效"
      }
    }
  }

enum枚举控制值域

设置enum枚举属性后传入的值只能是enum有的值,否则报错,无法插入或更新数据

enum格式之支持描述的复杂数组

 "gender": {
    
    
      "bsonType": "array",
      "title": "性别",
      "description": "用户性别:0 未知 1 男性 2 女性",
      "enum": [0,1,2]
    }

enum格式之支持描述的复杂数组

"enum": [
			{
    
    
				"text": "未知",
				"value": 0
			},
	]

enum格式之数据表查询

 "enum": {
    
    
        "collection": "opendb-nation-china",
        "orderby": "first_letter asc",
        "field": "name as value, name as text"
      }

enum格式之数据表查询之tree型数据
代表enum里的数据为树形结构,在schema2code时,可自动生成多级级联选择组件

"city_id": {
    
    
        "bsonType": "string",
        "title": "地址",
        "description": "城市编码",
        "foreignKey": "opendb-city-china.code",
        "enumType": "tree",
        "enum": {
    
    
          "collection": "opendb-city-china",
          "orderby": "value asc",
          "field": "code as value, name as text"
        }
      }

trim 去除首尾空白字符

描述
none 不处理。默认为none
both 从一个字符串的两端删除空白字符。在这个上下文中的空白字符是所有的空白字符 (space, tab, no-break space 等) 以及所有行终止符字符(如 LF,CR 等)
start 从字符串的开头移除空白字符
end 从一个字符串的末端移除空白字符

fieldRules字段间校验

验证字段之间的关系逻辑

{
    
    
  "bsonType": "object",
  "required": ["title","create_date"],
  "fieldRules": [{
    
    
    "rule": "end_date == null || end_date != null && create_date < end_date",
    "errorMessage": "结束时间需大于创建时间"
  }],
  "properties": {
    
    
    "title": {
    
    
      "bsonType": "string",
      "title": "标题"
    },
    "create_date": {
    
    
      "bsonType": "timestamp",
      "title": "创建时间",
      "forceDefaultValue": {
    
    
        "$env": "now"
      }
    },
    "end_date": {
    
    
      "bsonType": "timestamp",
      "title": "结束时间"
    }
  }
}

validateFunction扩展校验函数

  1. 在左侧项目管理器选择工程,对其下的uniCloud目录点右键,选择创建database目录(如果已有该目录则忽略本步骤)

  2. 在第一步创建的database目录右键选择创建数据库扩展校验函数目录

  3. 在第二步创建的validateFunction目录右键选择新建数据库扩展校验函数

  • validateFunction 类型为字符串时,云端和客户端同时生效

扩展校验函数

// 扩展校验函数示例
module.exports = function (rule, value, data, callback) {
    
    
  // rule  当前规则
  // value 当前规则校验数据
  // data  全部校验数据
  // callback 可选,一般用于自定义 errorMessage,如果执行了callback return 值无效,callback 传入的 message 将替换 errorMessage
  // callback('message') 传入错误消息时校验不通过
  // callback() 无参时通过
  // 注意 callback 不支持异步调用,异步请使用 Promise/await/async
  return value.length < 10
}

// 异步校验 Promise
module.exports = function (rule, value, data) {
    
    
  return new Promise((resolve, reject) => {
    
    
    setTimeout(() => {
    
    
      if (value > 10) {
    
    
        // 校验通过
        resolve()
      } else {
    
    
        // 校验失败
        resolve('error') // 等于 reject(new Error('error'))
        // reject(new Error('error'))
      }
    }, 3000);
  })
}

// 异步校验 await/async
module.exports = async function (rule, value, data) {
    
    
  let result = await uni.request({
    
    ...})
  if (result > 10) {
    
    
    // 校验通过
    return true
  } else {
    
    
    // 校验失败
    return 'error message'
  }
}


表引用

{
    
    
  "bsonType": "object",
  "required": ["name"],
  "properties": {
    
    
    "name": {
    
    
      "bsonType": "string",
      "title": "姓名",
      "validateFunction": "checkabc",
      "errorMessage": {
    
    
        "required": "{title}不能为空"
      }
    }
  }
}

// "validateFunction": {
    
    
//          "name": "checkabc", // 扩展校验函数名
//          "client": false //如果不配置默认是 true
 //     },

如果配置了 “client”: false 客户端也可以在生成的代码中改为自己的校验函数,此时客户端的校验仍然生效,客户端对应的校验文件目录为 js_sdk/validator/collection, collection为表名,非固定值

当使用schema2code生成前端页面,那么写扩展校验函数需要多一层注意。
比如调用了uniCloud.httpclient这样在前端并不存在的API时,前端的表单校验会出错。
此时就需要在扩展校验函数中多写一个if判断,避免undefined的问题。

if (uniCloud.httpclient) {
    
    
	console.log("此处运行在云函数环境里。前端没有这个API");
}
// 或者另一种写法
if (uni) {
    
    
	console.log("此处运行在前端环境里。云函数没有uni对象,除非你在validateFunction里自己定义了这个对象");
}

errorMessage自定义错误提示

数据不符合schema配置的规范时,无法入库,此时会报错

"errorMessage": {
    
    
        "required": "{title}必填",
        "minLength": "{title}不能小于{minLength}个字符",
        "maxLength": "{title}不能大于{maxLength}个字符"
      },


 "errorMessage": "{title}应该大于 {minimum} 岁,小于 {maximum} 岁"

permission 数据权限系统

  1. 对数据的指定
  • 可以对整个表进行增删改查或计数控制

  • 可以针对字段进行读写控制

  • 可以配置具体的where规则,对指定的数据记录进行删改查控制

  • 默认自带一个特殊数据的描述,就是当前请求计划操作的数据(doc),后面会详解用法

  1. 对角色的指定
  • 未登录,即游客都可以操作数据
  • 当前已登录用户(auth.uid)
  • uni-id定义的其他角色
  • 开发者可以在uni-id中自定义各种角色,比如部门管理员,然后在DB Schema的permission中配置其可操作的数据。

注意:如果登录用户是uni-id的admin角色,即超级管理员,则不受DB Schema的配置限制的,admin角色拥有对所有数据的读写权限。

表级权限控制

"permission": {
    
    
    "read": true, // 任何用户都可以读
    "create": false, // 禁止新增数据记录(admin权限用户不受限)
    "update": false, // 禁止更新数据(admin权限用户不受限)
    "delete": false, // 禁止删除数据(admin权限用户不受限)
    "count": false // 禁止查询数据条数(admin权限用户不受限),新增于HBuilderX 3.1.0
  },

字段级权限控制

如果字段的bsonType配置为password,则clientDB完全不可操作此字段(即使是admin用户也不可以在客户端读写)。

 "age": {
    
    
      "bsonType": "number",
      "title": "年龄",
      "permission": {
    
    
        "read": false, // 禁止读取 age 字段的数据(admin权限用户不受限)
        "write": false // 禁止写入 age 字段的数据(admin权限用户不受限)
      }
    }

指定数据集权限控制

"permission": {
    
    
    "read": "doc.status==true", // 任何用户都可以读status字段的值为true的记录,其他记录不可读
    "create": false, // 禁止新增数据记录(admin权限用户不受限)
    "update": false, // 禁止更新数据(admin权限用户不受限)
    "delete": false // 禁止删除数据(admin权限用户不受限)
  },

权限规则的变量和运算符

变量名 说明
auth.uid 用户id
auth.role 用户角色数组,参考uni-id 角色权限,注意admin为内置的角色,如果用户角色列表里包含admin则认为此用户有完全数据访问权限
auth.permission 用户权限数组,参考uni-id 角色权限
doc 数据库中的目标数据记录,用于匹配记录内容/查询条件
now 当前服务器时间戳(单位:毫秒),时间戳可以进行额外运算,如doc.publish_date > now - 60000表示publish_date在最近一分钟
action La solicitud de operación de datos también especifica la acción uni-clientDB. La operación de datos utilizada para especificar el front-end debe ir acompañada de la ejecución de una función de nube de acción. Si la acción no se activa, la verificación del permiso fallará.

Operadores que se pueden utilizar dentro de las reglas de permisos

Los operadores son similares a js.

operador ilustrar Ejemplo Explicación de ejemplo (consulta de colección)
== igual autenticación.uid == 'abc' La identificación del usuario es abc.
!= no igual a auth.uid! = nulo El usuario debe estar registrado
> más que el edad doc>10 El atributo de edad de los datos de destino es mayor que 10
>= mayor o igual a edad.doc>=10 El atributo de edad de los datos de destino es mayor o igual a 10
< menos que edad doc<10 El atributo de edad de los datos de destino es inferior a 10
<= Menos que o igual a edad.doc<=10 El atributo de edad de los datos de destino es menor o igual a 10
en existe en la matriz doc.status en ['a','b'] El estado de los datos de destino es uno de ['a', 'b'] y todos los elementos de la matriz deben ser del mismo tipo.
! No !(doc.estado en ['a','b']) El estado de los datos de destino no es ninguno de ['a', 'b'] y todos los elementos de la matriz deben ser del mismo tipo.
&& y auth.uid == 'abc' && edad doc>10 La identificación de usuario es abc y el atributo de edad de los datos de destino es mayor que 10
|| o autenticación.uid == 'abc' doc.age>10 El ID de usuario es abc o el atributo de edad de los datos de destino es mayor que 10

Resumir

Conocimiento profundo de la estructura de las tablas de la base de datos.

Supongo que te gusta

Origin blog.csdn.net/yang20000222/article/details/130903287
Recomendado
Clasificación