feat(活动): 添加关注豪礼

This commit is contained in:
luying
2023-03-31 17:35:24 +08:00
parent 07b75c1510
commit 94b6dca4cc
15 changed files with 382 additions and 27 deletions

View File

@@ -265,4 +265,12 @@ export enum BIND_PHONE_STATUS {
export enum MINI_GAME_TYPE {
ERASE = 1, // 消消乐
SHOOT = 2, // 射箭
}
export enum SNS_LINK_TYPE {
WX_GROUP = 1, // 微信群
BIND_PHONE = 2, // 绑定手机
WX_PUBLIC_ACCOUNT = 3, // 公众号
BBS = 4, // 论坛
CUSTOMER = 5, // 客服地址
}

48
shared/db/Link.ts Normal file
View File

@@ -0,0 +1,48 @@
// 链接
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
@index({ type: 1 })
@index({ serverId: 1 })
export default class Link extends BaseModel {
@prop({ required: true, default: 0 })
type: number; // 1-微信群2-手机绑定 3-公众号关注 4-论坛 5-客服
@prop({ required: true, default: 0 })
serverId: number; // 小区id不限的为0
@prop({ required: true, default: '' })
link: string; // 外链
@prop({ required: true, default: '' })
qrCodeLink: string; // 微信群二维码
public static async findByServerId(serverId: number) {
const result: LinkType[] = await LinkModel.find({ serverId: { $in: [serverId, 0] } }).sort({ serverId: 1 }).lean();
return result;
}
public static async findByType(type: number) {
const result: LinkType = await LinkModel.findOne({ type }).select('-_id -__v').lean();
return result;
}
public static async findByTypes(types: number[]) {
const result: LinkType[] = await LinkModel.find({ type: { $in: types } }).select('-_id -__v').sort({ serverId: 1 }).lean();
return result;
}
public static async updateByServerAndType(serverId: number, type: number, param: LinkUpdateInter, uid: number) {
const result: LinkType = await LinkModel.findOneAndUpdate({ serverId, type }, { $set: {...param, updatedBy: uid}, $setOnInsert: { createdBy: uid } }, { new: true, upsert: true }).lean();
return result;
}
public static async updateLinks(updateArr: { type: number, link?: string, qrCodeLink?: string }[], uid: number) {
await LinkModel.bulkWrite(updateArr.map(({type, link, qrCodeLink}) => {
return { updateOne: { filter: { type, serverId: 0 }, update: { $set: { link, qrCodeLink, updatedBy: uid }, $setOnInsert: { createdBy: uid } }, upsert: true} }
}))
}
}
export const LinkModel = getModelForClass(Link);
export interface LinkType extends Pick<DocumentType<Link>, keyof Link> { };
export type LinkUpdateInter = Partial<LinkType>;

View File

@@ -1,40 +1,154 @@
import { BIND_PHONE_STATUS } from '../../consts';
import { pick } from 'underscore';
import { BIND_PHONE_STATUS, SNS_LINK_TYPE } from '../../consts';
import { ActivityModelType } from '../../db/Activity';
import { ActivityBindPhoneRewardType } from '../../db/ActivityBindPhoneReward';
import { LinkType } from '../../db/Link';
import { UserType } from '../../db/User';
import { ActivityBase } from './activityField';
// 数据库
interface BindPhoneDataInDb {
interface PageDataInDb {
pageIndex: number;
pageName: string;
type: number;
rewards: string;
giftCode: string;
}
interface BindPhoneDataInDb {
pages: PageDataInDb[];
}
class PageData {
pageIndex: number;
pageName: string;
type: number;
constructor(pageData: PageDataInDb) {
this.pageIndex = pageData.pageIndex;
this.pageName = pageData.pageName;
this.type = pageData.type;
}
}
class WXGroupPage extends PageData {
link: string = ''; // 微信群外链
qrCodeLink: string = ''; // 微信群二维码
public setLink(link: LinkType) {
this.link = link.link;
this.qrCodeLink = link.qrCodeLink;
}
}
class BindPhonePage extends PageData {
rewards: string; // 绑定手机后能有的奖励
status: number = BIND_PHONE_STATUS.WAIT_BIND; // 状态 0-未绑定 1-已绑定 3-已领取
constructor(pageData: PageDataInDb) {
super(pageData);
this.rewards = pageData.rewards;
}
}
class WXPublicAccountPage extends PageData {
qrCodeLink: string; // 公众号二维码
rewards: string; // 口令能有的奖励
originGiftCode: string; // 加密后的口令
giftCode: string; // 加密后的口令
status: number = BIND_PHONE_STATUS.WAIT_BIND; // 状态 0-未使用 1-可领取 2-已领取
constructor(pageData: PageDataInDb) {
super(pageData);
this.originGiftCode = pageData.giftCode;
this.rewards = pageData.rewards;
}
public setLink(link: LinkType) {
this.qrCodeLink = link.qrCodeLink;
}
public setEncodeGiftCode(giftCode: string) {
this.giftCode = giftCode;
}
public getShowResult() {
return pick(this, ['pageIndex', 'pageName', 'type', 'qrCodeLink', 'rewards', 'giftCode', 'status']);
}
}
class BBSPage extends PageData {
link: string; // 论坛外链
public setLink(link: LinkType) {
this.link = link.link;
}
}
// 数据
export class BindPhoneData extends ActivityBase {
rewards: string;
status: number = BIND_PHONE_STATUS.WAIT_BIND; // 状态 0-未绑定 1-已绑定可领取 2-已领取
wxGroup: WXGroupPage;
bindPhone: BindPhonePage;
wxPublicAccount: WXPublicAccountPage;
bbs: BBSPage;
constructor(activityData: ActivityModelType, createTime: number, serverTime: number) {
super(activityData, createTime, serverTime);
this.initData(activityData.data)
this.initData(activityData.data);
}
public initData(data: string) {
let dataObj: BindPhoneDataInDb = JSON.parse(data);
this.rewards = dataObj.rewards;
for(let pageData of (dataObj?.pages||[])) {
switch(pageData.type) {
case SNS_LINK_TYPE.WX_GROUP: {
this.wxGroup = new WXGroupPage(pageData); break;
}
case SNS_LINK_TYPE.BIND_PHONE: {
this.bindPhone = new BindPhonePage(pageData); break;
}
case SNS_LINK_TYPE.WX_PUBLIC_ACCOUNT: {
this.wxPublicAccount = new WXPublicAccountPage(pageData); break;
}
case SNS_LINK_TYPE.BBS: {
this.bbs = new BBSPage(pageData); break;
}
}
}
}
public setRecord(user: UserType, data: ActivityBindPhoneRewardType) {
if(user && user.channelInfo && user.channelInfo.is_phone_bind == 1) this.status = BIND_PHONE_STATUS.HAS_BIND;
if(data) this.status = data.status;
public setLinks(links: LinkType[]) {
for(let link of links) {
switch (link.type) {
case SNS_LINK_TYPE.WX_GROUP: {
this.wxGroup.setLink(link); break;
}
case SNS_LINK_TYPE.WX_PUBLIC_ACCOUNT: {
this.wxPublicAccount.setLink(link); break;
}
case SNS_LINK_TYPE.BBS: {
this.bbs.setLink(link); break;
}
}
}
}
public setBindPhoneStatus(user: UserType, data: ActivityBindPhoneRewardType) {
if(this.bindPhone) {
if(user && user.channelInfo && user.channelInfo.is_phone_bind == 1) this.bindPhone.status = BIND_PHONE_STATUS.HAS_BIND;
if(data) this.bindPhone.status = data.status;
}
}
public getShowResult() {
let pages: (WXGroupPage|BindPhonePage|WXPublicAccountPage|BBSPage)[] = [];
if(this.wxGroup) pages.push(this.wxGroup);
if(this.bindPhone) pages.push(this.bindPhone);
if(this.wxPublicAccount) pages.push(this.wxPublicAccount.getShowResult());
if(this.bbs) pages.push(this.bbs);
return {
...this.getBaseKeys(),
rewards: this.rewards,
status: this.status,
pages
}
}

View File

@@ -49,3 +49,16 @@ export function getRemoteRplFilePath(roleId: string, warType: number, battleCode
const rplUrl = `/${roleId}/${warType}/${battleClass}/${battleCode}.bin`;
return rplUrl;
}
export function getLocalQrCodeUrl(curEnv: string, env: string) {
if(curEnv == 'development') {
return './img'
} else {
return `/zyz_logs/img/${md5(env).substring(0, 4)}/qrcode`;
}
}
export function getRemoteQrCodeUrl(env: string, fileName: string) {
const rplUrl = `${getPrefixByEnv(env)}/img/${md5(env).substring(0, 4)}/qrcode/` + fileName;
return rplUrl;
}

View File

@@ -971,6 +971,33 @@
"name": "编辑子包",
"module": "server",
"type": "find"
},
{
"id": 140,
"api": "/api/game/getlinks",
"name": "获取外链",
"module": "server",
"type": "find"
},
{
"id": 141,
"api": "/api/game/updatewxlink",
"name": "更新微信群外链",
"module": "server",
"type": "update"
},
{
"id": 142,
"api": "/api/game/updateotherlink",
"name": "更新其他外链",
"module": "server",
"type": "update"
},
{
"id": 143,
"api": "/api/upload/uploadqrcode",
"name": "上传二维码",
"module": "server",
"type": "update"
}
]

View File

@@ -273,7 +273,7 @@
"id": 50,
"activityType": 50,
"name": "BIND_PHONE",
"string": "绑定手机"
"string": "关注豪礼"
},
{
"id": 51,