[TOC]
本后台是为剧院票务管理系统开发的web应用后台,为剧院票务管理系统web应用及微信小程序提供数据查询,存储的支持。整个后台使用微服务架构,并配置nginx做静态资源管理和均衡负载。
- 开发语言:node.JS
- 系统数据数据库:MySQL 8.0
- 公共:public
- 登录注册:login
- 运营:operation
- 销售:sale
- express
- express-static
- mysql
- cookie-paser
- cookie-session
- crypto(加密函数)
- request(本地爬虫)
|server #后台根目录
├── README.md
├── node_module #安装工具
├── public #公共模块
├── ttms_server_xxx.js #服务后台
├── package.json #项目配置文件
└── package-lock.json #模块配置文件
涉及到emoji表情的存储,使用utf-8mb4无效后,使用longText结合Node.String->Unicode。进行存储。由于字符串较长,使用longText数据类型。
模块名称:sql.js
主要提供连接数据库,便捷调用服务,sql语句拼接(mysql模块的再次封装)。
- 创建mysql数据库连接池
var sql = require('./server/public_sql');
var pool = sql.createPool({
connectionLimit : 10,
host : '132.232.169.227',
user : 'admin',
password : 'xxx',
database : 'recruitment'
});
使用createPool方法进行数据库连接池创建,通过数据库连接池,提高与mysql之间交互效率。
- 通过连接池进行数据库操作
sql.sever(pool, sqlString);
async function(){
try {
var selectRepeat = await sql.sever(pool, sqlString);
//同步返回数据内容
} catch (err) {
throw err;
}
}
封装sql数据库命令sever,通过获取sql命令以及回调函数,实现包括从连接池获取连接,使用完释放连接的完整SQL查询。本功能返回promise,可以结合是有async将异步转换成同步代码。
参数说明:
-
pool: 连接池
-
SQLString: sql语句
- sql语句转换
- 数字不会被转义
- 布尔值会被转移成 true / false
- Date 对象会被转义成形如 'YYYY-mm-dd HH:ii:ss' 的字符串
- Buffer 会被转义成十六进制字符串,如: X'0fa5'
- 字符串会被安全地转义
- 数组会被转义成列表,例如: ['a', 'b'] 会被转义成 'a', 'b'
- 嵌套数组会被转义成多个列表(在大规模插入时),如: [['a', 'b'], ['c', 'd']] 会被转义成 ('a', 'b'), ('c', 'd')
- 对象的所有可遍历属性会被转义成键值对。如果属性的值是函数,则会被忽略;如果属性值是对象,则会使用其 toString() 方法的返回值。
- undefined / null 会被转义成 NULL
- NaN / Infinity 将会被原样传入。由于MySQL 并不支持这些值,在它们得到支持之前,插入这些值将会导致MySQL报错。
- SELECT语句拼接
- type: 查询的字段
- tablename: 查询的表
- where: where过滤语句(参数可选)
- INSERT语句拼接
- tablename: 查询的表
- type: 插入的字段
- valuse: 插入的值
- ignore: 筛选防止多重添加(可选参数)
- UPDATE语句拼接
- tablename: 查询的表
- type: 插入的字段
- valuse: 插入的值
- where: where过滤语句(参数可选)
- DELETE语句拼接
- tablename: 查询的表
- where: where过滤语句(参数可选)
-
数据库事务
let connect = await sql.handler(pool); //从数据库连接池获取连接 try { await sql.stepsql(connect, sqlStringRoom); await connect.commit() } catch (err) { await connect.rollback() send(res, { "msg": err, "style": -2 }); return; } finally { connect.release() }
考虑到项目中,需要大量的联合插入操作。为保证数据库一致性,使用了数据库的事务操作。通过多层封装,实现数据库的的数据插入。
- 其中sql.handler:从数据库连接池获取连接,并启动事务,返回数据库连接。
- 其中sql.stepsql:查询详情语句处理事务的每一条查询,并通过promise返回具体的查询结果
- 通过try捕获stepsql抛出的异常,来判断数据库的每一条操作的正确性。
- 通过connect.commit()提交事务
- 通过connect.rollback()回滚事务
- 通过connect.release()关闭连接
- express框架,建立server服务
- 设置cookie,session中间件
- header处理跨域
- 数据解析-中间件
- 更新session过期时间
- 封装res数据发送
- 封装session安全验证
- 封装退出登录函数
- sessionStart安全验证依据为session.style是否为1
- 退出登录,将session.style设置为0,同时cookie-style也设置为0
- judge函数可以校验,参数是否提交完整,数据类型是否符合要求(int,float,Array,only)
-
obj: 验证对象(对象中应包括name和password属性)
-
res: 验证下发目标
-
加密拼接规则:name+password+time
- obj: 验证对象(对象中包括name和password和style值)
- req: 请求来源对象
- obj.style(1正常,-1解析错误,-2解析超时)
- req: 请求来源对象
- 下发对应session.style=1
-
通过cookie登录保持,绑定cookie--style,有效时长1天cookie-style存储内容为obj.name
-
通过cookie跨页跳转验证,绑定cookie--pbl,有效时长15秒
- sale销售
- 服务器ip:132.232.169.227
- 服务器域名:konghouy.cn
- ttms服务域名:www.konghouy.cn
- 服务器带宽:1Mpbs
- 连接类型:https
- 应用路由:
- 登录注册:/ttmsLogin---->内网转发517
- 运营管理:/ttmsOperation---->内网转发510
- 销售:/ttmsSale---->内网转发965
- 财务:/ttmsFinance----->内网转发612
- url:/reg
- 方法:POST
- 参数:{”name”:“用户名“,”password”:“密码“}
- 注意:
- 提交用户名字符长度不得超过32个,密码字符使用MD5加密。
- 返回
- url:/login
- 方法:POST
- 参数:{”name”:“用户名“,”password”:“密码“}
- 注意:
- 提交用户名字符长度不得超过32个,密码字符使用MD5加密。
- 返回
- url:/step
- 方法:GET
- 参数:无
- 注意:
- 通过cookie-style验证登录状态
- 返回
-
url:/step
-
方法:POST
-
参数:微信获取的code
-
返回
{ "msg": "注册成功", "id":5, "style": 1 } { "msg": "参数错误!", "style": -1 } { "msg": "验证请求失败!", "style": 0 } { "msg": err, "style": -2 } //数据库异常
-
url:/userAll
-
方法:GET
-
参数:无
-
返回
{ "msg": "查询成功", "data": [ { "user_id": 2, "user_status": 4, "user_name": "olLXm5fpVjN6SBjpNziTmRSpT9Vs", "user_tel": null, "user_time": "2019-06-10T07:34:41.000Z" } ], "style": 0 } { "msg": err, "style": -2 } //数据库异常
-
url:/userEdit
-
方法:POST
-
参数:
参数名 类型 说明 id String 修改人员id status 0/1/2/3/4 0表示没有权,1表示运营,2表示销售,3表示财务,4表示个人 password String(MD5) 修改密码 tel String 修改电话 passwordchange 0/1 是否修改密码 0表示不修改,1表示修改 -
返回
{ "msg": "编辑成功!", "style": 1 } { "msg": "status参数缺失", "style": -1 } { "msg": "没有查询到要修改的id", "style": 0 }
- url:/new
- 方法:GET
- 参数:无
- 注意:
- 通过cookie-pbl验证登录状态,验证有效时间15秒
- 返回
- url:/query
- 方法:GET
- 参数:{url:“xxx”}
- 注意:
- 此处需要发送豆瓣电影详情主页
- 由于此项操作需要多次转发,和解析数据,数据返回会有一定延迟(1-2s)
- 返回
-
url:/playAdd
-
方法:POST
-
参数:{name:“xxx”,director:“xxx”,…}
-
注意:
- 姓名【必选】(name)参数的长度小于64
- 导演(director)参数长度32
- 演员(actor)参数长度128,多个演员使用“/”隔开
- 类型(type)参数长度32,多种类型使用“/”隔开
- 片长【必选】(timelong),int类型数值
- 国家(country),参数长度32位
- 语言(language),参数长度32位
- 状态【必选】(status),参数只能是“已上映”,“即将上映”,“已下线”
- 海报(pic),参数长度为70,需要填入竖版小图片的url
- 推广链接(link),参数长度70,需要填入横版小图的url,作为客户端轮播推广
- 爬虫(url),表示爬取网页详细信息
-
返回
{ "msg": "电影信息添加成功!", "waring":waring, "style": 1 } { "msg": "timelong参数格式不对", "style": -1 } { "msg": err, "style": -2 } //数据库异常
-
注意:
- 由于此项操作需要多次转发,和解析数据,数据返回会有一定延迟(1-2s)
- 注意waring,正常情况下是null,在url详细信息解读时出现异常,基础数据会添加成功,详细信息将无法填充。waring中会提示问题原因。
- 由于数据中存在emoji,后台将会报所有emoji表情过滤掉,然后进行存储
-
url:/playAll
-
方法:GET
-
参数:无
-
返回:
{ "msg": "查询成功!", "data": [ { "play_id":5, "play_name": "xxxx", "play_director": "xxx", "play_performer": "xxxxxxxx", "play_type": "xxx", "play_length": "90", "play_country": "xxx", "play_language": "xxx", "play_status": "已上映", "play_pic": "xxx", "play_link": "xxx", "play_path":"xxx" } ], "style": 1 } { "msg": err, "style": -2 } //数据库异常
注意:返回剧目信息按照id逆序排列
-
url:/palyMain
-
方法:GET
-
参数:{id:“xxx”}
-
返回
{ "msg": "查询成功!", "data": { "play_id": 1, "play_name": "xxxx", "play_director": "xxx", "play_performer": "xxxxxxxx", "play_type": "xxx", "play_length": "90", "play_country": "xxx", "play_language": "xxx", "play_status": "已上映", "play_pic": "xxx", "play_link": "xxx", "play_message": "xxx",//页面详细详细 "play_path": "https://movie.douban.com/subject/26891256/?from=showing" }, "style": 1 } { "msg": "没有查询到该id对应的电影!", "style": 0 } { "msg": err, "style": -2 } //数据库异常
-
url:/palyDel
-
方法:POST
-
参数:{id:“xxx”}
-
注意:如果删除有安排演出计划的剧目,将驳回请求
-
返回
{ "msg": "删除成功!", "style": 1 } { "msg": "没有查询到要修改的id", "style": 0 } { "msg": err, "style": -2 } //数据库异常
-
url:/playEdit
-
方法:POST
-
参数:{id:”2”,name:“xxx”,director:“xxx”,…}
-
注意:
-
编号 【必选】电影id号
-
姓名【必选】(name)参数的长度小于64
-
导演(director)参数长度32
-
演员(actor)参数长度128,多个演员使用“/”隔开
-
类型(type)参数长度32,多种类型使用“/”隔开
-
片长【必选】(timelong),int类型数值
-
国家(country),参数长度32位
-
语言(language),参数长度32位
-
状态【必选】(status),参数只能是“已上映”,“即将上映”,“已下线”
-
海报(pic),参数长度为70,需要填入竖版小图片的url
-
推广链接(link),参数长度70,需要填入横版小图的url,作为客户端轮播推广
-
爬虫(url),表示爬取网页详细信息
-
-
返回
{ "msg": "编辑成功!", "style": 1 } { "msg": "没有查询到要修改的id", "style": 0 } { "msg": err, "style": -2 } //数据库异常
-
url:/roomAdd
-
方法:POST
-
参数:
参数名 类型 说明 name String 演出厅名称 row Int 演出厅最大行数 col Int 演出厅最大列数 status 0/1 演出厅状态 seat 对象Array 当期演出厅的座位列表 seat->row Int 当前座位的行数 seat->col Int 当前座位的列数 seat->status 0/1 当前座位的状态 -
返回
{ "msg": "添加成功", "style": 1 } { "msg": "参数缺失", "style": -1 } { "msg": "col(Int)参数格式不对", "style": -1 } { "msg": err, "style": -2 } //数据库异常
-
url:/roomAll
-
方法:GET
-
参数:无
-
返回
{ "msg": "查询成功!", "data": [ { "room_id": 9, "room_name": "qwqw", "room_row": 10, "room_col": 10, "room_status":1 } ], "style": 1 } { "msg": err, "style": -2 } //数据库异常
-
url:/roomMain
-
方法:GET
-
参数:{id:“xxx”}
-
返回:
{ "msg": "查询成功!", "data": [ { "seat_id":1, "seat_row": 0, "seat_col": 0, "seat_status": 1 },... ], "style": 1 } { "msg": "没有查询到该id对应的演出厅座位!", "style": 0 } { "msg": err, "style": -2 } //数据库异常
-
url:/roomDel
-
方法:POST
-
参数:{id:“xxx”}
-
注意:如果删除有安排演出计划的演出厅,将驳回请求
-
返回
{ "msg": "删除成功!", "style": 1 } { "msg": "没有查询到要删除的id", "style": 0 } { "msg": err, "style": -2 } //数据库异常
-
url:/roomEdit
-
方法:POST
-
注意:如果删除有安排演出计划的演出厅,将驳回请求
-
参数:
参数名 类型 说明 id Int 修改演出厅的id name String 演出厅名称 status 0/1 演出厅状态 change 0/1 演出厅状态 row Int 演出厅最大行数 col Int 演出厅最大列数 seat(row,col,status) 对象Array 当期演出厅的座位列表 -
注意:
必选参数:id,name,status,change
当change==1时,row,col,seat需要提交,其他时刻不需要提交
-
返回
{ "msg": "编辑成功!", "style": 1 } { "msg": "没有查询到要修改的id演出厅", "style": 0 } { "msg": "change(only)参数内容不对", "style": -1 } { "msg": err, "style": -2 } //数据库异常
-
url:/planAdd
-
方法:POST
-
参数:plan对象数组
参数名 类型 说明 room Int 演出计划安排的演出厅id号 play Int 演出计划安排的剧目id号 language String 安排剧目的语言 startime Data 剧目开始时间 money Float 本场演出的票价 -
返回
{ "msg": "演出计划添加成功!", "style": 1 } { "msg": "plan参数缺失", "style": -1 } { "msg": "list[0]没有play属性", "style": -1 } { "msg": err, "style": -2 } //数据库异常
-
url:/planGet
-
方法:GET
-
参数:{time:xxx}(eg:2019-6-6)
-
返回:
{ "msg": "查询成功!", "data": [ { "plan_id": 3, "room_id": 33, "room_name": "qw", "play_id": 1, "play_length": 120, "play_name": "xxxx", "plan_language":"国语" "plan_startime": "2019-08-14T12:24:12.000Z", "plan_money": 19.2, },... ], "style": 1 } { "msg": "time参数缺失", "style": -1 } { "msg": err, "style": -2 } //数据库异常
-
url:/playNear
-
方法:GET
-
参数:无
-
返回
{ "msg": "查询成功!", "data": [ { "play_id": 1, "play_name": "xxxx", "play_director": "xxx", "play_performer": "xxxxxxxx", "play_type": "xxx", "play_length": "90", "play_country": "xxx", "play_language": "xxx", "play_status": "已上映", "play_pic": "xxx", "play_link": "xxx", "play_path": "https://movie.douban.com/subject/26891256/?from=showing" } ], "style": 1 } { "msg": err, "style": -2 } //数据库异常
-
url:/planList
-
方法:GET
-
参数:{id:2}//输入剧目id
-
返回
{ "msg": "查询成功!", "data": [ { "plan_id": 2, "room_id": 33, "room_name": "qw", "data": 6, "plan_startime": "2019-06-14T12:24:12.000Z", "plan_money": 19.2, "plan_language":"国语" }... ], "style": 1 } { "msg": "没有查询到此电影!", "style": 0 } { "msg": err, "style": -2 } //数据库异常
-
url:/ticketList
-
方法:GET
-
参数:{id:2}//输入演出计划id
-
返回
{ "msg": "查询成功!", "dataAll": [ { "ticket_id": 590, "seat_id": 1275 }, ], "dataSale": [ { "ticket_id": 634, "seat_id": 1319 } ], "style": 1 } { "msg": "没有查询到电影的演出计划!", "style": 0 } { "msg": err, "style": -2 } //数据库异常
-
url:/sale
-
方法:POST
-
参数:{ticket:[]}//想购买的电影票
-
返回
{ "msg": "购票成功!", "style": 1 } { "msg": "ticket参数缺失", "style": -1 } { "msg": "数组第0元素不是Int类型", "style": -1 } { "msg": "演出票校验错误!", "style": 0 } { "msg": err, "style": -2 } //数据库异常
-
url:/order
-
方法:POST
-
参数:{ticket:[],id:3}//想预定的电影票
-
返回
{ "msg": "购票成功!", "style": 1 } { "msg": "ticket参数缺失", "style": -1 } { "msg": "数组第0元素不是Int类型", "style": -1 } { "msg": "演出票校验错误!", "style": 0 } { "msg": err, "style": -2 } //数据库异常
-
url:/ticketMessage
-
方法:GET
-
参数:{id:3}
-
返回
{ "msg": "查询成功!", "data": [ { "room_name": "qwqw", "seat_row": 6, "seat_col": 4, "play_name": "xxxx", "plan_startime": "2019-06-09T12:24:12.000Z", "plan_language": "国语", "plan_money": 19.2 } ], "style": 1 } { "msg": "没有查询到该id对应的电影!", "style": 0 } { "msg": err, "style": -2 } //数据库异常
-
url:/selectOrder
-
方法:GET
-
参数:{id:3}
-
返回
{ "msg": "查询成功!", "order": [ { "orderticket_money": 10, "orderticket_history": "[51,58]", "orderticket_time": "2019-06-12T14:59:35.000Z", "orderTicket_status": 0 } ], "play": [ { "room_name": "1号厅", "play_name": "哥斯拉2:怪兽之王", "play_pic": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2554370800.jpg", "plan_startime": "2019-06-13T12:30:00.000Z", "plan_language": "英语", "plan_money": 5 } ], "ticket": [ { "seat_row": 2, "seat_col": 6 }, { "seat_row": 3, "seat_col": 6 } ], "style": 1 } { "msg": err, "style": -2 } //数据库异常
-
url:/salerAll
-
方法:GET
-
参数:无
-
返回
{ "msg": "查询成功", "data": [ { "user_id": 3, "user_name": "sh", "user_tel": 1534, "user_time": "2019-06-13T07:11:22.000Z" } ], "style": 1 } { "msg": err, "style": -2 } //数据库异常
-
url:/financebyid
-
方法:GET
-
参数:
参数 类型 说明 id Int 用户id start String 起始时间 end String 结束时间 -
返回
{ "msg": "查询成功", "data": [ { "sale_id": 1, "ticket_id": 23, "sale_money": 12.66, "sale_status": 1, "sale_time": "2019-06-12T11:25:20.000Z" } ], "style": 1 } { "msg": err, "style": -2 } //数据库异常
-
url:/financebyuser
-
方法:GET
-
参数:
参数 类型 说明 start String 起始时间 end String 结束时间 -
返回
{ "msg": "查询成功", "data": [ { "sale_id": 1, "ticket_id": 23, "sale_money": 12.66, "sale_status": 1, "sale_time": "2019-06-12T11:25:20.000Z" } ], "style": 0 } { "msg": err, "style": -2 } //数据库异常
提示: 可以将SQLString生成函数,最后的回调函数,提取出来,优化代码。
注意: 输入的SQLString要求要进行转义,防止SQL注入。
sql.escape(name);
不同类型的值转义的方式是有区别的,其区别如下:
注意: 所有从前端获取的内容,不能直接拼接进入sql语句,必须转换后再使用。
sql.select(type,tablename[,where]);
数据库查询命令拼接select,通过输入对应参数,返回拼接好的sql查询语句。
参数说明:
注意: 当有多条Where过滤条件时,注意拼接时的空格。
示例:
obj={
name:"樊宗渤",
password:"04173167"
}
let sqlString = sql.select(['user_name', 'user_password'], 'user',
`user_name=${sql.escape(obj.name)} AND user_password=${sql.escape(obj.password)}`);
sql.insert(tablename,type,value,ignore);
sql.insert("registryinformation",["password","phoneNum"],["asd",13345]);
数据库插入命令拼接insert,通过输入对应参数,返回拼接好的sql插入语句。
参数说明:
注意: 插入字段与插入值的个数应该相同。
**提示:**参数ignore为true表示,如果数据库中已经存在相同的记录,则忽略当前新数据;
sql.update(tablename, type, value[,where]);
sql.update("registryinformation",["password","phoneNum"],["123",123],"name='樊宗渤'");
参数说明:
注意: 当有多条Where过滤条件时,注意拼接时的空格。修改字段与修改值的个数应该相同。
sql.del(tablename[,where]);
sql.del("registryinformation","name='樊宗渤'");
参数说明:
注意: 当有多条Where过滤条件时,注意拼接时的空格。
警告: 此接口不使用where参数会导致删除数据表,请谨慎使用。
模块名称:system_config.js
将数据库登录信息为配置文件进行编写。便于后期更改和维护。
{
sql: {
connectionLimit: 10,
host: 'localhost',
user: 'root',
password: '3832414122',
database: 'ttms'
},url:"http://localhost:529"
}
模块名称:http.js
实现功能:
module.exports = {
send: send,//发送数据
server: server,//建立server服务
sessionStart:sessionStart,//session安全验证
exit:exit,//退出登录
judge:judge//判读参数是否合法
path:path//内网爬虫
}
//函数原型
function send(res, obj){};
const server = express();
function sessionStart(){};
function exit(){};
function judge(obj){};
function path(add,qs);
注意:
模块名称:cookie_step.js
这个模块使用的目的是,下发跨站验证登录cookie。对外暴露cookieStep,translateCookie,sessionStep函数
cookieStep(obj,res)
cookieStep({
name:"xxx",
password:"xxx"
},res)
参数说明:
var obj = translateCookie(req)
参数说明:
sessionStep(req)
参数说明:
注意:
注册:判断传入参数是否正确---->校验用户名唯一性---->数据写入数据库---->下发cookie---->url跳转
登录:判断传入参数是否正确---->校验用户名密码正确性---->下发cookie---->url跳转
登录保持:判断cookie-style值---->校验用户名---->下发cookie---->url跳转
人员状态:0表示没有权,1表示运营,2表示销售,3表示财务,4表示个人
跳转验证:解析cookie---->数据库再次确认---->下发session
【注意】:一下所有功能,都要首先进行session安全验证
url解析基础信息:验证url合法性---->本地798爬虫---->发送
添加剧目:验证参数---->判断是否启动爬虫---->加入数据库
- 爬虫中的emoji表情需要替换掉
查询剧目:返回所有剧目信息中,play_status != -1的信息。play_status = -1,表示删除
查询剧目详细信息:判断传入参数合法性---->查询剧目是否存在---->返回数据
删除剧目:判断传入参数合法性---->查询剧目是否存在---->plan是否安排---->标记play_status = -1
编辑剧目:判断传入参数合法性---->查询剧目是否存在---->判断是否启动爬虫---->修改数据
添加演出厅:判断传入参数合法性---->启动事务---->添加演出厅---->添加座位
- 演出厅状态(1启用 0停用 -1删除)座位状态(1正常 0损坏 -1空缺 -2删除)
查询演出厅:返回回所有剧目信息中,room_status != -1的信息。room_status = -1,表示删除
查询演出厅座位:判断传入参数合法性---->查询演出厅是否存在---->返回座位列表
删除演出厅:判断传入参数合法性---->查询演出厅是否存在---->plan是否安排---->演出厅-1---->座位-2
编辑演出厅:判断传入参数合法性---->查询演出厅是否存在---->判断是否需要修改座位---->事务操作
添加演出计划:判断传入参数合法性---->检查演出厅、剧目是否存在---->事务操作
查询演出计划:连表查询,涉及play\room\plan
演出票状态:0表示没有卖出,1表示已经卖出并出票,2表示预定中,3表示线上付款未打印票
买票为1,退票为0
orderTicket status ->0生成订单/1支付成功/-1取消订单
目前后台已经部署在腾讯云服务器上
后台应用由forever进行管理,如果出现后台崩溃等异常退出,后台将会自动重启,保证服务正常运行。
{
"msg": "注册成功",
"url": "需要跳转的url",
"style": 1
}
{
"msg": "注册失败--用户名重复",
"style": 0
}
{
"msg": "参数错误!",
"style": -1
}
{
"msg": err,
"style": -2
}
//数据库异常
注意:首次注册后,状态值为0,默认没有任何权限,需要联系系统管理员进行权限添加。
{
"msg": "登录成功!",
"url": "需要跳转的url",
"style": 1
}
{
"msg": "用户名或密码错误!",
"style": 0
}
{
"msg": "参数错误!",
"style": -1
}
{
"msg": err,
"style": -2
}
//数据库异常
{
"msg": "登录成功!",
"url": "需要跳转的url",
"style": 1
}
{
"msg": "登录状态没有保持",
"style": 0
}
{
"msg": err,
"style": -2
}
//数据库异常
{
"msg": "session已下发,登录状态安全",
"name":obj.name,
"style": 1
}
{
msg: "cookie解析错误",
style: 0
}
{
msg: "cookie解析超时",
style: -1
}
{
"msg": err,
"style": -2
}
//数据库异常
{
msg: "cookie解析style异常",
style: -10
}
{
"msg": "解析成功!",
"data": back.index.base,
"style": 1
}
{
"msg": "错误原因",
"style": 0
}
{
"msg": "参数错误!",
"style": -1
}