{ "name": "用户", "table": { "name": "user", "comment": "用户表", "engine": "InnoDB" }, "columns": [ { "label": "ID", "name": "id", "type": "ID" }, { "label": "厂商", "name": "manu_id", "type": "bigInteger", "length": 50, "comment": "所属厂商", "nullable": true, "index": true, "validations": [ { "method": "typeof", "args": ["integer"], "message": "{{input}}类型错误, {{label}}应为数字" }, { "method": "min", "args": [0], "message": "{{label}}应大于0" } ] }, { "label": "类型", "name": "type", "type": "enum", "option": ["admin", "staff", "user"], "comment": "账号类型 admin 管理员, staff 员工, user 用户", "default": "staff", "index": true, "validations": [ { "method": "typeof", "args": ["string"], "message": "{{input}}类型错误, {{label}}应该为字符串" }, { "method": "enum", "args": ["admin", "staff", "user"], "message": "{{input}}不在许可范围, {{label}}应该为 admin/staff/user" } ] }, { "label": "手机号", "name": "mobile", "type": "string", "length": 50, "comment": "手机号", "index": true, "crypt": "AES", "validations": [ { "method": "typeof", "args": ["string"], "message": "{{input}}类型错误, {{label}}应该为字符串" }, { "method": "pattern", "args": ["^1[3-9]\\d{9}$"], "message": "{{input}}格式错误" } ] }, { "label": "登录密码", "name": "password", "type": "string", "length": 256, "comment": "登录密码", "crypt": "PASSWORD", "index": true, "validations": [ { "method": "typeof", "args": ["string"], "message": "{{input}}类型错误, {{label}}应该为字符串" }, { "method": "minLength", "args": [6], "message": "{{label}}应该由6-18位,大小写字母、数字和符号构成" }, { "method": "maxLength", "args": [18], "message": "{{label}}应该由6-18位,大小写字母、数字和符号构成" }, { "method": "pattern", "args": ["[0-9]+"], "message": "{{label}}应该至少包含一个数字" }, { "method": "pattern", "args": ["[A-Z]+"], "message": "{{label}}应该至少包含一个大写字母" }, { "method": "pattern", "args": ["[a-z]+"], "message": "{{label}}应该至少包含一个小写字母" }, { "method": "pattern", "args": ["[@#$&*]+"], "message": "{{label}}应该至少包含一个符号" } ] }, { "label": "姓名", "name": "name", "type": "string", "length": 80, "comment": "姓名", "index": true, "validations": [ { "method": "typeof", "args": ["string"], "message": "{{input}}类型错误, {{label}}应该为字符串" }, { "method": "minLength", "args": [2], "message": "{{label}}至少需要2个字" }, { "method": "maxLength", "args": [40], "message": "{{label}}不能超过20个字" } ] }, { "label": "身份证号码", "name": "idcard", "type": "string", "length": 256, "comment": "身份证号码", "crypt": "AES", "nullable": true, "index": true, "validations": [ { "method": "typeof", "args": ["string"], "message": "{{input}}类型错误, {{label}}应该为字符串" }, { "method": "pattern", "args": ["^(\\d{18})|(\\d{14}X)$"], "message": "{{label}}格式错误" } ] }, { "label": "账户余额", "name": "balance", "type": "integer", "length": 20, "comment": "账户余额(冗余)", "default": 0, "index": true, "validations": [ { "method": "typeof", "args": ["integer"], "message": "{{input}}类型错误, {{label}}应为数字" }, { "method": "min", "args": [0], "message": "{{label}}应大于0" } ] }, { "label": "API Key", "name": "key", "type": "string", "length": 256, "comment": "API Key", "nullable": true, "unique": true, "validations": [ { "method": "typeof", "args": ["string"], "message": "{{input}}类型错误, {{label}}应该为字符串" }, { "method": "pattern", "args": ["^[0-9A-Za-z@#$&*]{8}$"], "message": " {{label}}应该由8位,大小写字母、数字和符号构成" } ] }, { "label": "API 密钥", "name": "secret", "type": "string", "length": 256, "nullable": true, "crypt": "AES", "comment": "API 密钥", "index": true, "validations": [ { "method": "typeof", "args": ["string"], "message": "{{input}}类型错误, {{label}}应该为字符串" }, { "method": "pattern", "args": ["^[0-9A-Za-z@#$&*]{32}$"], "message": "{{label}}应该由32位,大小写字母、数字和符号构成" } ] }, { "label": "简历", "name": "resume", "type": "text", "comment": "简历", "nullable": true }, { "label": "扩展信息", "name": "extra", "type": "json", "comment": "扩展信息", "nullable": true }, { "label": "状态", "comment": "用户状态 enabled 有效, disabled 无效", "name": "status", "type": "enum", "default": "enabled", "option": ["enabled", "disabled"], "index": true, "validations": [ { "method": "typeof", "args": ["string"], "message": "{{input}}类型错误, {{label}}应该为字符串" }, { "method": "enum", "args": ["enabled", "disabled"], "message": "{{input}}不在许可范围, {{label}}应该为 enabled/disabled" } ] } ], "relations": { "manu": { "type": "hasOne", "model": "manu", "key": "id", "foreign": "manu_id", "select": ["name", "short_name", "type"] }, "addresses": { "type": "hasMany", "model": "address", "key": "user_id", "foreign": "id", "query": { "select": ["province", "city", "location", "status"], "pagesize": 20 } }, "mother": { "type": "hasOneThrough", "links": [ { "type": "hasOne", "model": "friends", "key": "user_id", "foreign": "user.id", "query": { "select": ["status", "type", "friend_id"], "wheres": [ { "column": "type", "value": "monther" } ] } }, { "type": "hasOne", "model": "user", "key": "id", "foreign": "user_mother_friends.friend_id", "query": { "select": ["name", "id", "status", "type", "secret", "extra"], "withs": { "manu": { "name": "manu" }, "roles": { "name": "roles" }, "address": { "name": "address" } } } } ] }, "roles": { "type": "hasManyThrough", "links": [ { "type": "hasMany", "model": "user_roles", "key": "user_id", "foreign": "id", "query": { "select": ["status"], "pagesize": 20 } }, { "type": "hasOne", "model": "role", "key": "id", "foreign": "role_id", "query": { "select": ["name", "label", "permission"] } } ] } }, "values": [ { "name": "管理员", "manu_id": 1, "type": "admin", "idcard": "230624198301170015", "mobile": "13900001111", "password": "cvSK@RY6", "key": "FB3fxCeQ", "secret": "XMTdNRVigbgUiAPdiJCfaWgWcz2PaQXw", "status": "enabled", "extra": { "sex": "男" } }, { "name": "员工", "manu_id": 1, "type": "staff", "idcard": "23082619820207024X", "mobile": "13900002222", "password": "qV@uT1DI", "key": "JDh2ZiUt", "secret": "wBeYjL7FjbcvpAdBrxtDFfjydsoPKhRN", "status": "enabled", "extra": { "sex": "女" } }, { "name": "用户", "manu_id": 2, "type": "user", "idcard": "23082619820207004X", "mobile": "13900003333", "password": "qV@uT1DI", "key": "XZ12MiPz", "secret": "wBeYjL7FjbcvpAdBrxtDFfjydsoPKhRN", "status": "enabled", "extra": { "sex": "女" } } ], "indexes": [ { "comment": "厂商用户", "name": "manu_id_mobile_unique", "columns": ["manu_id", "mobile"], "type": "unique" }, { "comment": "简历全文检索", "name": "resume_fulltext", "columns": ["resume"], "type": "fulltext" } ], "option": { "timestamps": true, "soft_deletes": true } }