De 0 a 1: Notas sobre la reserva de clases de los estudiantes y el desarrollo del mini programa de deducción de clases

Antecedentes de desarrollo

  • Instituciones: varias instituciones de formación en música, deportes, belleza, matemáticas, física y química deben llevar a cabo la gestión de clases, las estadísticas de las clases, los cálculos de las clases, los registros de las clases y el registro de las citas de las clases.
  • Estudiantes: necesitan verificar sus registros de consumo y uso de cursos en tiempo real.
  • Gerente: Necesita verificar en cualquier momento, aumentar o disminuir el número de cursos para estudiantes

Planificación funcional

 

Selección de tecnología:
utilice la plataforma del mini programa WeChat para el desarrollo.
Utilizando la tecnología de desarrollo de nube de programas pequeños especializados de Tencent, los recursos de la nube incluyen funciones de nube, bases de datos, ancho de banda, espacio de almacenamiento, temporizadores, etc. Las cuotas de recursos son de bajo precio y se pueden crear sin nombres de dominio ni servidores.
El miniprograma en sí está listo para usar, es adecuado para escenarios de uso de dispositivos y también es adecuado para un desarrollo e iteración rápidos.
La tecnología de desarrollo en la nube utiliza enlaces internos de Tencent, por lo que no hay riesgo de ser atacado por piratas informáticos ni ataques DDOS, lo que ahorra costos de firewall, alta seguridad y no requiere mantenimiento.
La capacidad de carga de recursos se puede ampliar de manera flexible en cualquier momento según las necesidades de desarrollo empresarial.
 

Diseño de base de datos

LessonLogModel.DB_STRUCTURE = {
	_pid: 'string|true',
	LESSON_LOG_ID: 'string|true',


	LESSON_LOG_USER_ID: 'string|true|comment=用户ID',

	LESSON_LOG_MEET_ID: 'string|false|comment=预约项目PK',

	LESSON_LOG_DESC: 'string|false|comment=备注',

	LESSON_LOG_TYPE: 'int|true|default=1|comment=类型 0=用户约课-,1=用户取消预约+,10=后台增加课时+,11=后台减少课时-,12=后台取消预约+,13=后台恢复+',

	LESSON_LOG_EDIT_ADMIN_ID: 'string|false|comment=最近修改的管理员ID',
	LESSON_LOG_EDIT_ADMIN_NAME: 'string|false|comment=最近修改的管理员名',
	LESSON_LOG_EDIT_ADMIN_TIME: 'int|true|default=0|comment=管理员最近修改的时间',


	LESSON_LOG_CHANGE_CNT: 'int|true|default=0|comment=当变动课时数(可正负)',
	LESSON_LOG_LAST_CNT: 'int|true|default=0|comment=变动前次数',
	LESSON_LOG_NOW_CNT: 'int|true|default=0|comment=当前次数', 

	LESSON_LOG_ADD_TIME: 'int|true',
	LESSON_LOG_ADD_IP: 'string|false',

	LESSON_LOG_EDIT_TIME: 'int|true',
	LESSON_LOG_EDIT_IP: 'string|false',
}

// 字段前缀
LessonLogModel.FIELD_PREFIX = "LESSON_LOG_";

/**
 * 类型 0=初始赠送,1=学员约课,2=学员取消预约,10=后台增加课时,11=后台减少课时,12=后台取消预约,13=后台恢复
 */
LessonLogModel.TYPE = {
	INIT: 0,
	USER_APPT: 1,
	USER_CANCEL: 2,
	ADMIN_ADD: 10,
	ADMIN_REDUCE: 11,
	ADMIN_CANCEL: 12,
	ADMIN_RECOVER: 13
};

LessonLogModel.TYPE_DESC = {
	INIT: '初始赠送',
	USER_APPT: '学员约课',
	USER_CANCEL: '学员取消预约',
	ADMIN_ADD: '后台增加课时',
	ADMIN_REDUCE: '后台减少课时',
	ADMIN_CANCEL: '后台取消预约',
	ADMIN_RECOVER: '后台恢复预约'
};

JoinModel.DB_STRUCTURE = {
	_pid: 'string|true',
	JOIN_ID: 'string|true',

	JOIN_EDIT_ADMIN_ID: 'string|false|comment=最近修改的管理员ID',
	JOIN_EDIT_ADMIN_NAME: 'string|false|comment=最近修改的管理员名',
	JOIN_EDIT_ADMIN_TIME: 'int|true|default=0|comment=管理员最近修改的时间',
	JOIN_EDIT_ADMIN_STATUS: 'int|false|comment=最近管理员修改为的状态 ',

	JOIN_IS_ADMIN: 'int|true|default=0|comment=是否管理员添加 0/1',

	JOIN_CODE: 'string|true|comment=核验码15位',
	JOIN_IS_CHECKIN: 'int|true|default=0|comment=是否核销 0/1 ',
	JOIN_CHECKIN_TIME: 'int|true|default=0',

	JOIN_USER_ID: 'string|true|comment=用户ID',
	JOIN_MEET_ID: 'string|true|comment=预约PK',
	JOIN_MEET_CATE_ID: 'string|true',
	JOIN_MEET_CATE_NAME: 'string|true',
	JOIN_MEET_TITLE: 'string|true|comment=项目',
	JOIN_MEET_DAY: 'string|true|comment=日期',
	JOIN_MEET_TIME_START: 'string|true|comment=时段开始',
	JOIN_MEET_TIME_END: 'string|true|comment=时段结束',
	JOIN_MEET_TIME_MARK: 'string|true|comment=时段标识',

	JOIN_COMPLETE_END_TIME: 'string|false|comment=完整结束时间',

	JOIN_START_TIME: 'int|true|comment=开始时间戳',

	JOIN_FORMS: 'array|true|default=[]|comment=表单',
	/* title:
	   mark:
	   type:
	   val:
	*/
	JOIN_OBJ: 'object|true|default={}',

	JOIN_STATUS: 'int|true|default=1|comment=状态 1=预约成功,10=已取消, 99=系统取消',

	JOIN_REASON: 'string|false|comment=审核拒绝或者取消理由',

	JOIN_ADD_TIME: 'int|true',
	JOIN_EDIT_TIME: 'int|true',
	JOIN_ADD_IP: 'string|false',
	JOIN_EDIT_IP: 'string|false',
};

 

Implementación de código clave

// 用户预约逻辑
	async join(userId, meetId, timeMark, formsList) {
		// 预约时段是否存在
		let meetWhere = {
			_id: meetId
		};
		let day = this.getDayByTimeMark(timeMark);
		let meet = await this.getMeetOneDay(meetId, day, meetWhere);

		if (!meet) {
			this.AppError('预约时段选择错误1,请重新选择');
		}

		let daySet = this.getDaySetByTimeMark(meet, timeMark);
		if (!daySet)
			this.AppError('预约时段选择错误2,请重新选择');

		let timeSet = this.getTimeSetByTimeMark(meet, timeMark);
		if (!timeSet)
			this.AppError('预约时段选择错误3,请重新选择');

		// 规则校验
		await this.checkMeetRules(userId, meetId, timeMark, formsList);


		let data = {};

		data.JOIN_USER_ID = userId;
		data.JOIN_MEET_ID = meetId;
		data.JOIN_MEET_CATE_ID = meet.MEET_CATE_ID;
		data.JOIN_MEET_CATE_NAME = meet.MEET_CATE_NAME;
		data.JOIN_MEET_TITLE = meet.MEET_TITLE;
		data.JOIN_MEET_DAY = daySet.day;
		data.JOIN_MEET_TIME_START = timeSet.start;
		data.JOIN_MEET_TIME_END = timeSet.end;
		data.JOIN_MEET_TIME_MARK = timeMark;
		data.JOIN_START_TIME = timeUtil.time2Timestamp(daySet.day + ' ' + timeSet.start + ':00');
		data.JOIN_STATUS = JoinModel.STATUS.SUCC;
		data.JOIN_COMPLETE_END_TIME = daySet.day + ' ' + timeSet.end;

		// 入库
		for (let k = 0; k < formsList.length; k++) {
			let forms = formsList[k];
			data.JOIN_FORMS = forms;
			data.JOIN_OBJ = dataUtil.dbForms2Obj(forms);
			data.JOIN_CODE = dataUtil.genRandomIntString(15);
			await JoinModel.insert(data);
		}


		// 统计
		await this.statJoinCnt(meetId, timeMark);

		// 课时统计
		await this.editUserMeetLesson(null, userId, -1, LessonLogModel.TYPE.USER_APPT, meetId, '《' + meet.MEET_TITLE + '》')

		return {
			result: 'ok',
		}
	}

Diseño de interfaz de usuario frontal

 

código fuente git

https://gitee.com/soft-m/ChildrenPalace?_from=gitee_search

Linus se encargó de evitar que los desarrolladores del kernel reemplazaran las pestañas con espacios. Su padre es uno de los pocos líderes que puede escribir código, su segundo hijo es el director del departamento de tecnología de código abierto y su hijo menor es un núcleo de código abierto. Colaborador Robin Li: El lenguaje natural se convertirá en un nuevo lenguaje de programación universal. El modelo de código abierto se quedará cada vez más atrás de Huawei: tomará 1 año migrar completamente 5,000 aplicaciones móviles de uso común a Hongmeng, que es el lenguaje más propenso. Vulnerabilidades de terceros. Se lanzó el editor de texto enriquecido Quill 2.0 con características, confiabilidad y experiencia de desarrolladores que Ma Huateng y Zhou Hongyi se dieron la mano para "eliminar los rencores". La fuente de Laoxiangji no es el código, las razones detrás de esto son muy conmovedoras. Google anunció una reestructuración a gran escala.
{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/u/3808186/blog/8591038
Recomendado
Clasificación