Skip to content

SAD SmartBackstage (SAD SB)

renfeisong edited this page Dec 22, 2014 · 23 revisions

开发方法

所有后台页面都用sb_layout.jade模版,只需要定义contentblock,在其中直接写内容即可,不用写页面头部、侧边栏、脚部。例如:

extends ./sb_layout
block content
    p ...

也可以参考 sb_home.jade(访问地址:/backstage

所有表单编辑功能均直接调用 SAD-API 实现。添加功能均 POST 到 Web 服务器的对应页面(见下文),Web 服务器会负责跳转回来(添加功能不要使用 AJAX)。

页面对照表

  • 欢迎页面 sb_home.jade
  • 医院管理 sb_hospitals.jade
  • 用户审核 sb_users.jade
  • 科室管理 sb_departments.jade
  • 医生管理 sb_doctors.jade
  • 排班编辑 sb_edit-schedule.jade
  • 预约管理 sb_reservations.jade
  • 修改密码 sb_changePassword.jade

插件

系统已经内置如下 CSS/JavaScript 插件,可以直接使用:

  • Font Awesome
  • jQuery
  • Toastr Notifications
  • iCheck
  • Select2
  • jQuery Validate
  • Bootstrap Editable
  • DataTables
  • Bootstrap 的所有 JavaScript 插件

注意:系统没有内置 Bootstrap 的 CSS 样式

插件的使用

  • 表格展示请使用 DataTables,文档
  • 表格信息编辑请使用 Bootstrap Editable 插件,文档
  • 表单验证请使用 jQuery Validation,文档
  • 通过 URL 参数传递的提示信息不需要处理,由我统一实现

关于样式

  • 虽然系统不内置 Bootstrap 的 CSS 样式,但是内置了我精心准备的 CSS 文件,因此对于基本功能是够用的。
  • 页面统一以一个h2开头,为页面标题
  • input元素、textarea元素都添加form-control
  • table添加table table-striped table-bordered table-hover
  • 按钮(button元素)添加button类,并且有几种颜色可以选择:
    • 绿色:添加green-button
    • 红色:添加red-button
    • 蓝色:添加blue-button
    • 灰色:添加gray-button
  • 标签可以添加label类,并且有多色可选:green-labelblue-labelgray-labelgblue-labellblue-labelyellow-labelred-label(均为类名)。如果想使用小号标签,可以添加xs-label
  • 页面专用 CSS 可以另外建立文件

tab 分页

对于医院、科室、医生管理,涉及管理现有记录和添加新记录两部分。出于后台用户体验的一致性考虑,统一使用 tab 分页的方式实现。

效果可参考:医生管理页面

实现起来非常简单,不需要写 JavaScript 代码。方法如下:

extends ./sb_layout

block content
   h2 医生管理

   ul.nav.nav-tabs(role='tablist')
      li.active(role='presentation')
         a(href='#panel-manage', role='tab', data-toggle='tab') 现有医生管理
      li(role='presentation')
         a(href='#panel-add', role='tab', data-toggle='tab') 添加医生

   div.tab-content
      div#panel-manage.tab-pane.fade.in.active
         h3 现有医生管理
         table#doctor-table.table.table-striped.table-bordered.table-hover
            thead
               tr
                  th id
                  th 姓名
                  th 所属科室
                  th 职称
                  th 描述
                  th 操作
            tbody


      div#panel-add.tab-pane.fade
         h3 添加医生

表单

参考如下标记,即可生成排版整齐漂亮的表格:

<form>
    <div class="form-group">
        <div class="prompt">
            <label for="publishDate">布置日期</label>
        </div>
        <div class="control">
            <input class="form-control" type="text" name="publishDate" id="publishDate" required>
        </div>
    </div>
    <div class="form-group">
        <div class="prompt">
            <label for="dueDate">截止日期</label>
        </div>
        <div class="control">
            <input class="form-control" type="text" name="dueDate" id="dueDate">
        </div>
    </div>
    <button type="submit" class="button submit-button green-button button-with-icon"><i class="fa fa-plus"></i> 添加</button>
</form>

页面参数文档

所有页面都传的参数:

  • username(管理员用户名)
  • userId(管理员用户ID)
  • hospitalId(所管理医院的ID)
  • hospitalName(所管理医院的名称)
  • businessServer(业务服务器host+port, e.glocalhost:3001)

所有页面:

  • 如果检测到未登录,直接跳转到 /backstage/login

很多页面:

  • 包括login,changePassword,hospital,departments,doctors
  • 可以在URL中传一个:initTimestamp/:msgType/:message参数,分别表示消息发送时间(当前posix timestamp,精确到秒),信息类型(success/fail),以及提示信息(用代号表示)。这些也要作为参数传递。
  • 上述页面如果 URL 参数为空,传递给 jade 的参数也要空,但是不能不传。

exports.home = function(request, response) {

渲染主页(sb_home.jade)
无需额外操作

};

exports.login = function(request, response) {

渲染登录页(sb_login.jade)
无需额外操作

};

exports.onLogin = function(request, response) {

接收POST方式发送的数据(password为):
username,password
调用管理员登陆接口
成功就跳转到/backstage(并写cookie)
失败跳转到/backstage/login,添加错误提示wrong_credentials
没有界面

};

exports.logout = function(request, response) {

写cookie
跳转到/login,添加成功提示logout_complete
没有界面

};

exports.changePassword = function(request, response) {

渲染修改密码页(sb_changePassword.jade)

};

exports.onChangePassword = function(request, response) {

接收POST方式发送的数据:
username,originalPassword,newPassword
调用修改密码接口
完成后跳转到/backstage/account,添加成功提示complete或失败提示wrong_credential
没有界面

};

exports.hospitals = function(request, response) {

渲染管理医院页面(sb_hospitals.jade)
传参:
list:(2-2-1)
[
    {
      "id": 1,
      "name": "协和医院",
      "level": "三级甲等", (REV#2~1#)
      "province": "北京",
      "city": "北京",
      "address": "xxxx",
      "telephone": "xxxx",
      "website": "www.google.com",
      "description": "这是一家好医院"
    },{
      "id": 2,
      "name": "昌平医院",
      ...
    }
]

};

exports.departments = function(request, response) {

渲染管理科室页面(sb_departments.jade)
传参:
list:(2-3-1)
[
    {
      "id": 1,
      "name": "xxx",
      "phone": "838141",
      "description": "xxxxxx"
    },
    {
      "id": 2,
      "name": "xxx",
      "phone": "838143",
      "description": "xxxxxx"
    }
]

};

exports.doctors = function(request, response) {

渲染管理医生页面(sb_doctors.jade)
传参:
departments:(2-3-1)
[
    {
      "id": 1,
      "name": "xxx",
      "phone": "838141",
      "description": "xxxxxx"
    },
    {
      "id": 2,
      "name": "xxx",
      "phone": "838143",
      "description": "xxxxxx"
    }
]
list:(2-2-1,需要合并一下)
[
    {
        "id": 2,
        "name": "李四",
        "hospital": "协和医院",
        "department": "口腔科",
        "title": "副主任医师",
        "description": "擅长治疗xxx",
        "photo_url": "http://www.example.com/383d1adc.png"
    },{
        "id": 3,
        "name": "李四",
        "hospital": "协和医院",
        "department": "口腔科",
        "title": "副主任医师",
        "description": "擅长治疗xxx",
        "photo_url": "http://www.example.com/383d1adc.png"
    }
]

};

exports.reservations = function(request, response) {

渲染管理预约页面(sb_reservations.jade)
传参:
list:(3-1-7)
[
    {
		"reservation_id":12345,
		"time":"2014-12-16 08:50:00",
		"price":"23.33",
		"status":"000000",
  		"status_msg": "在线支付,已付款",
		"hospital_name":"XX hospital",
		"department_name":"psychology",
		"doctor_name":"杨伟",
		"user_name": "渣诚",
		"user_phone": "18622222222",
		"user_sid": "12010319921000100X"
	},{
		"reservation_id":12345,
		"time":"2014-12-16 08:50:00",
		"price":"23.33",
		"status":"000000",
  		"status_msg": "在线支付,已付款",
		"hospital_name":"XX hospital",
		"department_name":"psychology",
		"doctor_name":"杨伟",
		"user_name": "渣诚",
		"user_phone": "18622222222",
		"user_sid": "12010319921000100X"
	}
]

};

exports.addHospital = function(request, response) {

接收POST方式发送的数据:
name,level,province,address,telephone,website,description
调用2-1-3接口
完成后跳转到/backstage/manage-hospitals,添加成功提示complete
没有界面

};

exports.addDepartment = function(request, response) {

接收POST方式发送的数据:
name,hospitalId,phone,description
调用2-3-3接口
完成后跳转到/backstage/departments,添加成功提示complete
没有界面

};

exports.addDoctor = function(request, response) {

接收POST方式发送的数据:
name, hospitalId, departmentId, description, title, price, timeSlots
其中timeSlots为上班时间,格式是一个JSON字符串:
[
		[0, 10, 0],
		[14, 0, 41],
		[15, 0, 11],
		[31, 0, 31],
		[51, 0, 51],
		[14, 0, 31],
		[11, 0, 1]
]
可调用2-2-2以及2-2-6-2接口
完成后跳转到/backstage/account,添加成功提示complete
没有界面

};

exports.editSchedule = function(request, response) {

渲染编辑排班页面(sb_edit-schedule.jade)
接收URL参数id(为医生id)
传参:
doctorId:医生 id
doctorName:姓名
doctorHospital:医院
doctorDepartment:部门
schedule(调2-2-6-1接口):
{
	"code": 0,
	"message": "success",
      "week":  [                      //容量,0表示不上班
		[10, 0, 10],			//周一  上午,下午,晚上
		[0, 10, 10],
		[0, 1, 1],
		[0, 0, 1],
		[0, 0, 0],
		[1, 1, 1],
		[1, 1, 0]				//周日
	],
	"temp": [{
		"date": "2014-12-12",
		"period": 1,
           "capacity": 20 //临时加班	
	}, {
		"date": "2014-12-12",
		"period": 3,
           "capacity": 0 //临时休假
	}, 
	......
	]
}

};

exports.users = function (request, response) {

渲染审核用户页面(sb_users.jade)
传参:
list: (1-2-1)
    "validating": [
            {
                "user_id": 233,
                "username": "rongzimeng",
                "id": "13100219930415461X",
                "name": "荣芓萌",
                "phone": "13332333233",
                "email": "[email protected]",
                "ip": "127.0.0.1"
            },...
        ],
        "unqualified": [
            {
                "user_id": 233,
                "username": "rongzimeng",
                "id": "13100219930415461X",
                "name": "荣芓萌",
                "phone": "13332333233",
                "email": "[email protected]",
                "ip": "127.0.0.1"
            },...
        ]

};