背景调研
培训老师预约小程序: 教师和学生可以更便捷地安排课程,并提升教学质量和学习效果,使之成为管理和提升教学效果的强大工具。培训老师可以在小程序上设置自己的可预约时间,学员可以根据老师的日程安排选择合适的时间进行预约。这样可以提高预约的效率,减少沟通成本,方便双方的安排
功能规划
-
- 首页展示:展示最新的公告通知、老师推荐等内容,吸引用户关注。
-
- 老师列表:列出所有开课的老师信息,包括老师的个人简介、星级等,方便用户选择合适的老师。
-
- 预约功能:用户可以根据自己的需求选择老师,并进行预约。
-
- 预约管理:用户可以查看自己的预约记录,包括已完成的预约和待核销的预约,也可以取消预约。
-
后台端:可以添加和设定老师的基本信息,账号,登陆密码等。
-
老师端:可以编辑自己的个人资料(头像,简介,标签集等),设定预约时段排期(可预约时段,各时段人数限定), 在现场核销用户的预约码。
-
顾客端:选择自己需要的老师和时段,下单预约,预约成功后出示预约码给老师或者工作人员核销。
概要设计

数据库设计
MeetModel.DB_STRUCTURE = {
_pid: 'string|true',
MEET_ID: 'string|true',
MEET_ADMIN_ID: 'string|true|comment=添加的管理员',
MEET_TITLE: 'string|true|comment=标题',
MEET_JOIN_FORMS: 'array|true|default=[]|comment=表单字段设置',
MEET_DAYS: 'array|true|default=[]|comment=最近一次修改保存的可用日期',
MEET_CATE_ID: 'string|true|comment=分类编号',
MEET_CATE_NAME: 'string|true|comment=分类冗余',
MEET_FORMS: 'array|true|default=[]',
MEET_OBJ: 'object|true|default={}',
MEET_CANCEL_SET: 'int|true|default=1|comment=取消设置 0=不允,1=允许,2=仅开始前可取消',
MEET_STATUS: 'int|true|default=1|comment=状态 0=未启用,1=使用中,9=停止预约,10=已关闭',
MEET_ORDER: 'int|true|default=9999',
MEET_VOUCH: 'int|true|default=0',
MEET_QR: 'string|false',
MEET_PHONE: 'string|false|comment=登录手机',
MEET_PASSWORD: 'string|false|comment=登录密码',
MEET_TOKEN: 'string|false|comment=当前登录token',
MEET_TOKEN_TIME: 'int|true|default=0|comment=当前登录token time',
MEET_MINI_OPENID: 'string|false|comment=小程序openid',
MEET_LOGIN_CNT: 'int|true|default=0|comment=登录次数',
MEET_LOGIN_TIME: 'int|false|comment=最近登录时间',
MEET_ADD_TIME: 'int|true',
MEET_EDIT_TIME: 'int|true',
MEET_ADD_IP: 'string|false',
MEET_EDIT_IP: 'string|false',
};
UserModel.DB_STRUCTURE = {
_pid: 'string|true',
USER_ID: 'string|true',
USER_MINI_OPENID: 'string|true|comment=小程序openid',
USER_STATUS: 'int|true|default=1|comment=状态 0=待审核,1=正常,8=审核未过,9=禁用',
USER_CHECK_REASON: 'string|false|comment=审核未过的理由',
USER_NAME: 'string|false|comment=用户昵称',
USER_MOBILE: 'string|false|comment=联系电话',
USER_FORMS: 'array|true|default=[]',
USER_OBJ: 'object|true|default={}',
USER_LOGIN_CNT: 'int|true|default=0|comment=登录次数',
USER_LOGIN_TIME: 'int|false|comment=最近登录时间',
USER_ADD_TIME: 'int|true',
USER_ADD_IP: 'string|false',
USER_EDIT_TIME: 'int|true',
USER_EDIT_IP: 'string|false',
}
核心代码
class MeetService extends BaseProjectService {
constructor() {
super();
this._log = new LogUtil(projectConfig.MEET_LOG_LEVEL);
}
/**
* 抛出异常
* @param {*} msg
* @param {*} code
*/
AppError(msg) {
this._log.error(msg);
super.AppError(msg);
}
_meetLog(meet, func = '', msg = '') {
let str = '';
str = `[MEET=${meet.MEET_TITLE}][${func}] ${msg}`;
this._log.debug(str);
}
/** 统一获取Meet(某天) */
async getMeetOneDay(meetId, day, where, fields = '*') {
let meet = await MeetModel.getOne(where, fields);
if (!meet) return meet;
meet.MEET_DAYS_SET = await this.getDaysSet(meetId, day, day);
return meet;
}
/** 获取日期设置 */
async getDaysSet(meetId, startDay, endDay = null) {
let where = {
DAY_MEET_ID: meetId
}
if (startDay && endDay && endDay == startDay)
where.day = startDay;
else if (startDay && endDay)
where.day = ['between', startDay, endDay];
else if (!startDay && endDay)
where.day = ['<=', endDay];
else if (startDay && !endDay)
where.day = ['>=', startDay];
let orderBy = {
'day': 'asc'
}
let list = await DayModel.getAllBig(where, 'day,dayDesc,times', orderBy, 1000);
for (let k = 0; k < list.length; k++) {
delete list[k]._id;

最低0.47元/天 解锁文章
988

被折叠的 条评论
为什么被折叠?



