从0开始:活动打卡小程序开发笔记

概要设计

功能规划

数据字典

` EnrollModel.DB_STRUCTURE = { _pid: 'string|true', ENROLL_ID: 'string|true',

ENROLL_TITLE: 'string|true|comment=标题',
ENROLL_STATUS: 'int|true|default=1|comment=状态 0=未启用,1=使用中',

ENROLL_CATE_ID: 'string|true|default=0|comment=分类',
ENROLL_CATE_NAME: 'string|false|comment=分类冗余',

ENROLL_START: 'int|false|comment=开始时间',
ENROLL_END: 'int|false|comment=结束时间',
ENROLL_DAY_CNT: 'int|false|comment=持续天数',

ENROLL_ORDER: 'int|true|default=9999',
ENROLL_VOUCH: 'int|true|default=0',

ENROLL_FORMS: 'array|true|default=[]',
ENROLL_OBJ: 'object|true|default={}',

ENROLL_JOIN_FORMS: 'array|true|default=[]',

ENROLL_QR: 'string|false',
ENROLL_VIEW_CNT: 'int|true|default=0',
ENROLL_JOIN_CNT: 'int|true|default=0',
ENROLL_USER_CNT: 'int|true|default=0',

ENROLL_USER_LIST: 'array|true|default=[]|comment={name,id,pic}',

ENROLL_ADD_TIME: 'int|true',
ENROLL_EDIT_TIME: 'int|true',
ENROLL_ADD_IP: 'string|false',
ENROLL_EDIT_IP: 'string|false',

};

EnrollJoinModel.DB_STRUCTURE = { _pid: 'string|true', ENROLL_JOIN_ID: 'string|true', ENROLL_JOIN_ENROLL_ID: 'string|true|comment=打卡PK',

ENROLL_JOIN_USER_ID: 'string|true|comment=用户ID',
ENROLL_JOIN_DAY: 'string|true|comment=日期',
ENROLL_JOIN_FORMS: 'array|true|default=[]|comment=表单',

ENROLL_JOIN_STATUS: 'int|true|default=1|comment=状态 1=成功', 

ENROLL_JOIN_ADD_TIME: 'int|true',
ENROLL_JOIN_EDIT_TIME: 'int|true',
ENROLL_JOIN_ADD_IP: 'string|false',
ENROLL_JOIN_EDIT_IP: 'string|false',

};

`

核心难点

` // 获取当前打卡状态 getJoinStatusDesc(enroll) { let timestamp = this._timestamp;

	if (enroll.ENROLL_STATUS == 0)
		return '已停止';
	else if (enroll.ENROLL_START > timestamp)
		return '未开始';
	else if (enroll.ENROLL_END <= timestamp)
		return '已结束';
	else
		return '进行中';
}

// 获取某日动态
async getEnrollJoinByDay(enrollId, day = '') {
	if (!day) day = timeUtil.time('Y-M-D');

	let where = {
		ENROLL_JOIN_ENROLL_ID: enrollId,
		ENROLL_JOIN_DAY: day,
		ENROLL_JOIN_STATUS: EnrollJoinModel.STATUS.SUCC
	}
	let joinParams = {
		from: UserModel.CL,
		localField: 'ENROLL_JOIN_USER_ID',
		foreignField: 'USER_MINI_OPENID',
		as: 'user',
	};
	let orderBy = {
		ENROLL_JOIN_ADD_TIME: 'desc'
	}
	let list = await EnrollJoinModel.getListJoin(joinParams, where, 'user.USER_NAME,user.USER_PIC', orderBy, 1, 100, false, 0);
	return list.list;
}

// 获取某活动排行
async getEnrollUserRank(enrollId) {

	let where = {
		ENROLL_USER_ENROLL_ID: enrollId
	}
	let joinParams = {
		from: UserModel.CL,
		localField: 'ENROLL_USER_MINI_OPENID',
		foreignField: 'USER_MINI_OPENID',
		as: 'user',
	};
	let orderBy = {
		ENROLL_USER_JOIN_CNT: 'desc'
	}
	let fields = 'ENROLL_USER_JOIN_CNT,ENROLL_USER_LAST_DAY,user.USER_NAME,user.USER_PIC';
	let list = await EnrollUserModel.getListJoin(joinParams, where, fields, orderBy, 1, 100, false, 0);
	return list.list;
}

/** 浏览信息 */
async viewEnroll(userId, id) {

	let fields = '*';

	let where = {
		_id: id,
		ENROLL_STATUS: EnrollModel.STATUS.COMM
	}
	let enroll = await EnrollModel.getOne(where, fields);
	if (!enroll) return null;

	EnrollModel.inc(id, 'ENROLL_VIEW_CNT', 1);

	// 判断用户今日是否有打卡
	let whereJoin = {
		ENROLL_JOIN_USER_ID: userId,
		ENROLL_JOIN_ENROLL_ID: id,
		ENROLL_JOIN_DAY: timeUtil.time('Y-M-D'),
		ENROLL_JOIN_STATUS: EnrollJoinModel.STATUS.SUCC
	}
	let enrollJoin = await EnrollJoinModel.getOne(whereJoin);
	if (enrollJoin) {
		enroll.myEnrollJoinId = enrollJoin._id;
	}
	else {
		enroll.myEnrollJoinId = '';
	}

	// 某日打卡列表
	enroll.activity = await this.getEnrollJoinByDay(id);

	// 打卡日期数组
	let dayList = [];
	let start = timeUtil.timestamp2Time(enroll.ENROLL_START, 'Y-M-D');
	start = timeUtil.time2Timestamp(start);
	let today = timeUtil.time2Timestamp(timeUtil.time('Y-M-D'));

	for (let k = start; k <= today;) {
		let month = timeUtil.timestamp2Time(k, 'M月');
		if (month.startsWith('0')) month = month.substring(1);

		let date = timeUtil.timestamp2Time(k, 'D');
		let day = timeUtil.timestamp2Time(k, 'Y-M-D');

		dayList.push({ month, date, day });
		k = k + 86400 * 1000;
	}
	enroll.dayList = dayList;

	// 排行榜 
	let rankList = await this.getEnrollUserRank(id);
	enroll.rankList = rankList;

	return enroll;
}


/** 取得分页列表 */
async getEnrollList({
	search, // 搜索条件
	sortType, // 搜索菜单
	sortVal, // 搜索菜单
	orderBy, // 排序 
	page,
	size,
	isTotal = true,
	oldTotal
}) {

	orderBy = orderBy || {
		'ENROLL_ORDER': 'asc',
		'ENROLL_ADD_TIME': 'desc'
	};
	let fields = 'ENROLL_USER_LIST,ENROLL_JOIN_CNT,ENROLL_OBJ,ENROLL_USER_CNT,ENROLL_TITLE,ENROLL_START,ENROLL_END,ENROLL_ORDER,ENROLL_STATUS,ENROLL_CATE_NAME,ENROLL_OBJ';

	let where = {};
	where.and = {
		_pid: this.getProjectId() //复杂的查询在此处标注PID
	};

	where.and.ENROLL_STATUS = EnrollModel.STATUS.COMM; // 状态  

	if (util.isDefined(search) && search) {
		where.or = [{
			ENROLL_TITLE: ['like', search]
		},];
	} else if (sortType && util.isDefined(sortVal)) {
		// 搜索菜单
		switch (sortType) {
			case 'cateId': {
				if (sortVal) where.and.ENROLL_CATE_ID = String(sortVal);
				break;
			}
			case 'sort': {
				orderBy = this.fmtOrderBySort(sortVal, 'ENROLL_ADD_TIME');
				break;
			}

		}
	}

	return await EnrollModel.getList(where, fields, orderBy, page, size, isTotal, oldTotal);
}

`

用户打卡 UI设计

![](https://oscimg.oschina.net/oscnet/up-1638a46403d3cd58b34f8febc060558d9c5.png

后台系统UI设计

源码

gitee源码

Linus 亲自动手,阻止内核开发者用空格替换制表符 父亲是少数会写代码的领导人、次子是开源科技部主管、幼子是开源核心贡献者 李彦宏:自然语言将成为新的通用编程语言、开源模型会越来越落后 华为:用 1 年时间将 5000 个常用手机应用全面迁移至鸿蒙 Java 是最容易出现第三方漏洞的语言 富文本编辑器 Quill 2.0 重磅发布,特性、可靠性与开发者体验大幅提升 马化腾周鸿祎握手“泯恩仇” Meta Llama 3 正式发布 虽然老乡鸡开源的不是代码,但背后的原因却让人很暖心 谷歌宣布进行大规模重组
{{o.name}}
{{m.name}}

猜你喜欢

转载自my.oschina.net/u/3808186/blog/8702890