✨ feat(活动): 添加关注豪礼
This commit is contained in:
@@ -6,7 +6,7 @@ import { DailyItem } from '../../../domain/activityField/dailyChallengesField';
|
|||||||
import { addReward, stringToRewardParam } from '../../../services/activity/giftPackageService';
|
import { addReward, stringToRewardParam } from '../../../services/activity/giftPackageService';
|
||||||
import { RewardParam } from '../../../domain/activityField/rewardField';
|
import { RewardParam } from '../../../domain/activityField/rewardField';
|
||||||
import { ActivityDailyChallengesModel } from '../../../db/ActivityDailyChallenges';
|
import { ActivityDailyChallengesModel } from '../../../db/ActivityDailyChallenges';
|
||||||
import { getBindPhoneData } from '../../../services/activity/bindPhoneService';
|
import { getBindPhoneData, getBindPhoneDataShow } from '../../../services/activity/bindPhoneService';
|
||||||
import { ActivityBindPhoneRewardModel } from '../../../db/ActivityBindPhoneReward';
|
import { ActivityBindPhoneRewardModel } from '../../../db/ActivityBindPhoneReward';
|
||||||
|
|
||||||
|
|
||||||
@@ -19,6 +19,18 @@ export class BindPhoneHandler {
|
|||||||
constructor(private app: Application) {
|
constructor(private app: Application) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getData(msg: { activityId: number }, session: BackendSession) {
|
||||||
|
const { activityId } = msg;
|
||||||
|
const roleId = session.get('roleId');
|
||||||
|
const serverId = session.get('serverId');
|
||||||
|
const uid = session.get('userid');
|
||||||
|
|
||||||
|
let playerData = await getBindPhoneDataShow(activityId, roleId, serverId, uid);
|
||||||
|
return resResult(STATUS.SUCCESS, {
|
||||||
|
playerData
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
/************************绑定手机****************************/
|
/************************绑定手机****************************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -36,8 +48,9 @@ export class BindPhoneHandler {
|
|||||||
const uid = session.get('userid');
|
const uid = session.get('userid');
|
||||||
|
|
||||||
let playerData = await getBindPhoneData(activityId, roleId, serverId, uid);
|
let playerData = await getBindPhoneData(activityId, roleId, serverId, uid);
|
||||||
if(!playerData) return resResult(STATUS.ACTIVITY_ID_ERROR);
|
let bindPhoneData = playerData?.bindPhone;
|
||||||
if(playerData.status != BIND_PHONE_STATUS.WAIT_BIND) return resResult(STATUS.ACTIVITY_HAS_BIND);
|
if(!bindPhoneData) return resResult(STATUS.ACTIVITY_ID_ERROR);
|
||||||
|
if(bindPhoneData.status != BIND_PHONE_STATUS.WAIT_BIND) return resResult(STATUS.ACTIVITY_HAS_BIND);
|
||||||
|
|
||||||
await ActivityBindPhoneRewardModel.addRecord(activityId, uid, BIND_PHONE_STATUS.HAS_BIND, { roleId, roleName, serverId });
|
await ActivityBindPhoneRewardModel.addRecord(activityId, uid, BIND_PHONE_STATUS.HAS_BIND, { roleId, roleName, serverId });
|
||||||
|
|
||||||
@@ -62,12 +75,13 @@ export class BindPhoneHandler {
|
|||||||
const uid = session.get('userid');
|
const uid = session.get('userid');
|
||||||
|
|
||||||
let playerData = await getBindPhoneData(activityId, roleId, serverId, uid);
|
let playerData = await getBindPhoneData(activityId, roleId, serverId, uid);
|
||||||
if(!playerData) return resResult(STATUS.ACTIVITY_ID_ERROR);
|
let bindPhoneData = playerData?.bindPhone;
|
||||||
if(playerData.status == BIND_PHONE_STATUS.WAIT_BIND) return resResult(STATUS.ACTIVITY_BIND_ERR);
|
if(!bindPhoneData) return resResult(STATUS.ACTIVITY_ID_ERROR);
|
||||||
if(playerData.status == BIND_PHONE_STATUS.RECEIVED) return resResult(STATUS.ACTIVITY_BIND_RECEIVED);
|
if(bindPhoneData.status == BIND_PHONE_STATUS.WAIT_BIND) return resResult(STATUS.ACTIVITY_BIND_ERR);
|
||||||
|
if(bindPhoneData.status == BIND_PHONE_STATUS.RECEIVED) return resResult(STATUS.ACTIVITY_BIND_RECEIVED);
|
||||||
|
|
||||||
await ActivityBindPhoneRewardModel.addRecord(activityId, uid, BIND_PHONE_STATUS.RECEIVED, { roleId, roleName, serverId });
|
await ActivityBindPhoneRewardModel.addRecord(activityId, uid, BIND_PHONE_STATUS.RECEIVED, { roleId, roleName, serverId });
|
||||||
let rewardArray = stringToRewardParam(playerData.rewards)
|
let rewardArray = stringToRewardParam(bindPhoneData.rewards)
|
||||||
let { goods, addHeros } = await addReward(roleId, roleName, sid, serverId, rewardArray, ITEM_CHANGE_REASON.ACT_BIND_PHONE);
|
let { goods, addHeros } = await addReward(roleId, roleName, sid, serverId, rewardArray, ITEM_CHANGE_REASON.ACT_BIND_PHONE);
|
||||||
|
|
||||||
return resResult(STATUS.SUCCESS, {
|
return resResult(STATUS.SUCCESS, {
|
||||||
@@ -77,4 +91,24 @@ export class BindPhoneHandler {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 领取公众号口令奖励
|
||||||
|
* @param {{ activityId: number}} msg
|
||||||
|
* @param {BackendSession} session
|
||||||
|
* @memberof BindPhoneHandler
|
||||||
|
*/
|
||||||
|
async receiveGiftCode(msg: { activityId: number }, session: BackendSession) {
|
||||||
|
return resResult(STATUS.SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 前往论坛,用于前往论坛任务
|
||||||
|
* @param {{ activityId: number}} msg
|
||||||
|
* @param {BackendSession} session
|
||||||
|
* @memberof BindPhoneHandler
|
||||||
|
*/
|
||||||
|
async skipOutSide(msg: { activityId: number }, session: BackendSession) {
|
||||||
|
return resResult(STATUS.SUCCESS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { ACTIVITY_TYPE } from '../../consts';
|
|||||||
import { ActivityModel, ActivityModelType } from '../../db/Activity';
|
import { ActivityModel, ActivityModelType } from '../../db/Activity';
|
||||||
import { ActivityBindPhoneRewardModel } from '../../db/ActivityBindPhoneReward';
|
import { ActivityBindPhoneRewardModel } from '../../db/ActivityBindPhoneReward';
|
||||||
import { ActivityDailyChallengesModel, ActivityDailyChallengesModelType } from '../../db/ActivityDailyChallenges';
|
import { ActivityDailyChallengesModel, ActivityDailyChallengesModelType } from '../../db/ActivityDailyChallenges';
|
||||||
|
import { LinkModel } from '../../db/Link';
|
||||||
import { RoleModel } from '../../db/Role';
|
import { RoleModel } from '../../db/Role';
|
||||||
import { ServerlistModel } from '../../db/Serverlist';
|
import { ServerlistModel } from '../../db/Serverlist';
|
||||||
import { UserModel } from '../../db/User';
|
import { UserModel } from '../../db/User';
|
||||||
@@ -28,9 +29,14 @@ export async function getBindPhoneData(activityId: number, roleId: string, serve
|
|||||||
let serverTime = await getServerCreateTime(serverId);
|
let serverTime = await getServerCreateTime(serverId);
|
||||||
let playerData = new BindPhoneData(activityData, createTime, serverTime);
|
let playerData = new BindPhoneData(activityData, createTime, serverTime);
|
||||||
|
|
||||||
let user = await UserModel.findUserByUid(uid);
|
let links = await LinkModel.findByServerId(serverId);
|
||||||
let receiveRec = await ActivityBindPhoneRewardModel.findByUid(activityId, uid);
|
playerData.setLinks(links);
|
||||||
playerData.setRecord(user, receiveRec);
|
|
||||||
|
if(playerData.bindPhone) {
|
||||||
|
let user = await UserModel.findUserByUid(uid);
|
||||||
|
let receiveRec = await ActivityBindPhoneRewardModel.findByUid(activityId, uid);
|
||||||
|
playerData.setBindPhoneStatus(user, receiveRec);
|
||||||
|
}
|
||||||
|
|
||||||
return playerData;
|
return playerData;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -123,6 +123,10 @@ export function checkRouteParam(route: string, msg: any) {
|
|||||||
case 'activity.miniGameHandler.getMiniGameActivity':
|
case 'activity.miniGameHandler.getMiniGameActivity':
|
||||||
case 'activity.weeklyFundHandler.getData':
|
case 'activity.weeklyFundHandler.getData':
|
||||||
case 'activity.monthlyFundHandler.getData':
|
case 'activity.monthlyFundHandler.getData':
|
||||||
|
case 'activity.bindPhoneHandler.bind':
|
||||||
|
case 'activity.bindPhoneHandler.receiveReward':
|
||||||
|
case 'activity.bindPhoneHandler.receiveGiftCode':
|
||||||
|
case 'activity.bindPhoneHandler.skipOutSide':
|
||||||
{
|
{
|
||||||
if(!checkNaturalNumbers(msg.activityId)) return false;
|
if(!checkNaturalNumbers(msg.activityId)) return false;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import { getCurTask, getPvpTask } from './task/taskService';
|
|||||||
import { RoleType } from '../db/Role';
|
import { RoleType } from '../db/Role';
|
||||||
import { Application, FrontendOrBackendSession, pinus, RpcClient } from 'pinus';
|
import { Application, FrontendOrBackendSession, pinus, RpcClient } from 'pinus';
|
||||||
import { getRandEelmWithWeight, resResult } from '../pubUtils/util';
|
import { getRandEelmWithWeight, resResult } from '../pubUtils/util';
|
||||||
import { STATUS, PUSH_BATCH, PUSH_INTERVAL, CONSUME_TYPE, HERO_SELECT, ENTERY_ROLE_PICK, JEWEL_SELECT, ITEM_SELECT, SKIN_SELECT, PUSH_ROUTE, ARTIFACT_SELECT, ACTIVITYITEM_SELECT } from '../consts';
|
import { STATUS, PUSH_BATCH, PUSH_INTERVAL, CONSUME_TYPE, HERO_SELECT, ENTERY_ROLE_PICK, JEWEL_SELECT, ITEM_SELECT, SKIN_SELECT, PUSH_ROUTE, ARTIFACT_SELECT, ACTIVITYITEM_SELECT, SNS_LINK_TYPE } from '../consts';
|
||||||
import { getAllShopList } from './shopService';
|
import { getAllShopList } from './shopService';
|
||||||
import { getGeneralRank, getRankFirstReward } from './rankService';
|
import { getGeneralRank, getRankFirstReward } from './rankService';
|
||||||
import { getFriendList, getApplyList } from './friendService';
|
import { getFriendList, getApplyList } from './friendService';
|
||||||
@@ -52,6 +52,7 @@ import { PvpDataReturn } from '../domain/battleField/pvp';
|
|||||||
import { getHiddenData } from './dataService';
|
import { getHiddenData } from './dataService';
|
||||||
import { ArtifactModel } from '../db/Artifact';
|
import { ArtifactModel } from '../db/Artifact';
|
||||||
import { ActivityItemModel } from '../db/ActivityItem';
|
import { ActivityItemModel } from '../db/ActivityItem';
|
||||||
|
import { LinkModel } from '../db/Link';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* init: 初始的时候是否推送 true-推 false-不推
|
* init: 初始的时候是否推送 true-推 false-不推
|
||||||
@@ -87,6 +88,7 @@ const modules = [
|
|||||||
{ id: 26, type: 'survey', init: false, refresh: true, guild: false },
|
{ id: 26, type: 'survey', init: false, refresh: true, guild: false },
|
||||||
{ id: 27, type: 'ladder', init: false, refresh: true, guild: false },
|
{ id: 27, type: 'ladder', init: false, refresh: true, guild: false },
|
||||||
{ id: 28, type: 'hiddenData', init: true, refresh: true, guild: false },
|
{ id: 28, type: 'hiddenData', init: true, refresh: true, guild: false },
|
||||||
|
{ id: 29, type: 'customerLink', init: true, refresh: true, guild: false },
|
||||||
]
|
]
|
||||||
|
|
||||||
export async function pushData(hasInit: boolean, role: RoleType, session: FrontendOrBackendSession, pushType: 'entry' | 'refresh' = 'entry') {
|
export async function pushData(hasInit: boolean, role: RoleType, session: FrontendOrBackendSession, pushType: 'entry' | 'refresh' = 'entry') {
|
||||||
@@ -127,6 +129,7 @@ export async function getModuleData(type: string, data: { role: RoleType, sessio
|
|||||||
let skins = await SkinModel.findbyRole(role.roleId, SKIN_SELECT.ENTRY);
|
let skins = await SkinModel.findbyRole(role.roleId, SKIN_SELECT.ENTRY);
|
||||||
let artifacts = await ArtifactModel.findbyRole(role.roleId, ARTIFACT_SELECT.ENTRY);
|
let artifacts = await ArtifactModel.findbyRole(role.roleId, ARTIFACT_SELECT.ENTRY);
|
||||||
let activityItems = await ActivityItemModel.findbyRole(role.roleId, ACTIVITYITEM_SELECT.ENTRY);
|
let activityItems = await ActivityItemModel.findbyRole(role.roleId, ACTIVITYITEM_SELECT.ENTRY);
|
||||||
|
let link = await LinkModel.findByType(SNS_LINK_TYPE.CUSTOMER);
|
||||||
|
|
||||||
role['heros'] = heros.map(hero => new HeroParam(hero));
|
role['heros'] = heros.map(hero => new HeroParam(hero));
|
||||||
role['jewels'] = jewels;
|
role['jewels'] = jewels;
|
||||||
@@ -142,6 +145,7 @@ export async function getModuleData(type: string, data: { role: RoleType, sessio
|
|||||||
role.heads = role.heads.filter(cur => cur.status);
|
role.heads = role.heads.filter(cur => cur.status);
|
||||||
role.frames = role.frames.filter(cur => cur.status);
|
role.frames = role.frames.filter(cur => cur.status);
|
||||||
role.spines = role.spines.filter(cur => cur.status);
|
role.spines = role.spines.filter(cur => cur.status);
|
||||||
|
role['customerLink'] = link?.link||'';
|
||||||
return pick(role, ENTERY_ROLE_PICK);
|
return pick(role, ENTERY_ROLE_PICK);
|
||||||
case 'shop': // 商店
|
case 'shop': // 商店
|
||||||
return await getAllShopList(roleId, serverId);
|
return await getAllShopList(roleId, serverId);
|
||||||
|
|||||||
@@ -251,4 +251,25 @@ export default class GameController extends Controller {
|
|||||||
ctx.body = await ctx.service.game.getGVGConfig();
|
ctx.body = await ctx.service.game.getGVGConfig();
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async getLinks() {
|
||||||
|
const { ctx } = this;
|
||||||
|
const { types } = ctx.request.body;
|
||||||
|
ctx.body = await ctx.service.game.getLinks(types);
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
public async updateWXLink() {
|
||||||
|
const { ctx } = this;
|
||||||
|
const { serverId, link, qrCodeLink } = ctx.request.body;
|
||||||
|
ctx.body = await ctx.service.game.updateWXLink(serverId, link, qrCodeLink);
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
public async updateOtherLink() {
|
||||||
|
const { ctx } = this;
|
||||||
|
const { wxPublicAccountQrCode, bbsLink, customerLink } = ctx.request.body;
|
||||||
|
ctx.body = await ctx.service.game.updateOtherLink(wxPublicAccountQrCode, bbsLink, customerLink);
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ const publishPath = '/root/hot_update_backup';
|
|||||||
import {exec} from 'child_process'
|
import {exec} from 'child_process'
|
||||||
import { reloadResources } from '@pubUtils/data';
|
import { reloadResources } from '@pubUtils/data';
|
||||||
import { decodeArrayStr } from '@pubUtils/util';
|
import { decodeArrayStr } from '@pubUtils/util';
|
||||||
|
import { getLocalQrCodeUrl, getRemoteQrCodeUrl } from '@pubUtils/battleUtils';
|
||||||
const sendToWormhole = require('stream-wormhole');
|
const sendToWormhole = require('stream-wormhole');
|
||||||
|
|
||||||
export default class UploadController extends Controller {
|
export default class UploadController extends Controller {
|
||||||
@@ -276,6 +277,49 @@ export default class UploadController extends Controller {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async uploadQrCode() {
|
||||||
|
const { ctx } = this;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const { ctx } = this;
|
||||||
|
const parts = ctx.multipart();
|
||||||
|
let part, env = ctx.request.headers.env, fileName = '';
|
||||||
|
while ((part = await parts()) != null) {
|
||||||
|
if (part.length) {
|
||||||
|
console.log('kv: ', `${part[0]}: ${part[1]}`);
|
||||||
|
} else {
|
||||||
|
if (!part.filename) continue;
|
||||||
|
|
||||||
|
let filenames = part.filename.split('.');
|
||||||
|
let ext = filenames[filenames.length - 1];
|
||||||
|
let writePath = getLocalQrCodeUrl(this.app.config.realEnv, env);
|
||||||
|
fileName = `QR${moment().valueOf()}.${ext}`;
|
||||||
|
let fullPath = `${writePath}/${fileName}`;
|
||||||
|
try {
|
||||||
|
fs.accessSync(writePath);
|
||||||
|
} catch (err) {
|
||||||
|
if (err) {
|
||||||
|
fs.mkdirSync(writePath, { recursive: true });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!fs.existsSync(fullPath)) {
|
||||||
|
fs.writeFileSync(fullPath, '');
|
||||||
|
}
|
||||||
|
const writeStream = fs.createWriteStream(fullPath);
|
||||||
|
await pump(part, writeStream);
|
||||||
|
|
||||||
|
// remoteUrl = `${getRemoteRplUrl(ctx.app.config.realEnv, roleId, warType, battleCode)}/${battleCode}.bin`;
|
||||||
|
}
|
||||||
|
await sendToWormhole(part);
|
||||||
|
}
|
||||||
|
ctx.body = ctx.service.utils.resResult(STATUS.SUCCESS, { isOK: true, url: getRemoteQrCodeUrl(env, fileName) });
|
||||||
|
return;
|
||||||
|
} catch(e) {
|
||||||
|
ctx.body = ctx.service.utils.resResult(STATUS.SUCCESS, { isOK: false, err: e.stack });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function childExec(commond: string) {
|
export function childExec(commond: string) {
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ export default (app: Application) => {
|
|||||||
router.post('/api/upload/hotupdate', tokenParser, controller.upload.upload);
|
router.post('/api/upload/hotupdate', tokenParser, controller.upload.upload);
|
||||||
router.post('/api/upload/uploadjson', tokenParser, controller.upload.uploadJson);
|
router.post('/api/upload/uploadjson', tokenParser, controller.upload.uploadJson);
|
||||||
router.post('/api/upload/reloadresource', tokenParser, controller.upload.reloadResource);
|
router.post('/api/upload/reloadresource', tokenParser, controller.upload.reloadResource);
|
||||||
|
router.post('/api/upload/uploadqrcode', tokenParser, controller.upload.uploadQrCode);
|
||||||
|
|
||||||
router.post('/api/gmaccount/getgmlist', tokenParser, controller.gmaccount.getGmList);
|
router.post('/api/gmaccount/getgmlist', tokenParser, controller.gmaccount.getGmList);
|
||||||
router.post('/api/gmaccount/createaccount', tokenParser,controller.gmaccount.createGmAccount);
|
router.post('/api/gmaccount/createaccount', tokenParser,controller.gmaccount.createGmAccount);
|
||||||
@@ -65,6 +66,9 @@ export default (app: Application) => {
|
|||||||
router.post('/api/game/getexisthiddendata', controller.game.getExistHiddenData);
|
router.post('/api/game/getexisthiddendata', controller.game.getExistHiddenData);
|
||||||
router.post('/api/game/getgvgservergroup', controller.game.getGVGServerGroup);
|
router.post('/api/game/getgvgservergroup', controller.game.getGVGServerGroup);
|
||||||
router.post('/api/game/getgvgconfig', controller.game.getGVGConfig);
|
router.post('/api/game/getgvgconfig', controller.game.getGVGConfig);
|
||||||
|
router.post('/api/game/getlinks', tokenParser, controller.game.getLinks);
|
||||||
|
router.post('/api/game/updatewxlink', tokenParser, controller.game.updateWXLink);
|
||||||
|
router.post('/api/game/updateotherlink', tokenParser, controller.game.updateOtherLink);
|
||||||
|
|
||||||
router.post('/api/dic/getdicgoods', tokenParser, controller.game.getDicGoods);
|
router.post('/api/dic/getdicgoods', tokenParser, controller.game.getDicGoods);
|
||||||
router.post('/api/dic/getdichero', tokenParser, controller.game.getDicHero);
|
router.post('/api/dic/getdichero', tokenParser, controller.game.getDicHero);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { PackageModel } from '@db/Package';
|
import { PackageModel } from '@db/Package';
|
||||||
import { Service } from 'egg';
|
import { Service } from 'egg';
|
||||||
import { REDIS_KEY, STATUS } from '@consts';
|
import { REDIS_KEY, SNS_LINK_TYPE, STATUS } from '@consts';
|
||||||
import { ServerlistModel } from '@db/Serverlist';
|
import { ServerlistModel } from '@db/Serverlist';
|
||||||
import { gameData } from '@pubUtils/data';
|
import { gameData } from '@pubUtils/data';
|
||||||
import { DicHero } from '@pubUtils/dictionary/DicHero';
|
import { DicHero } from '@pubUtils/dictionary/DicHero';
|
||||||
@@ -26,6 +26,7 @@ import { HiddenDataByIdModel } from '@db/HiddenDataById';
|
|||||||
import { isNumber } from 'util';
|
import { isNumber } from 'util';
|
||||||
import { ServerGroupModel } from '@db/ServerGroup';
|
import { ServerGroupModel } from '@db/ServerGroup';
|
||||||
import { GVGConfigModel } from '@db/GVGConfig';
|
import { GVGConfigModel } from '@db/GVGConfig';
|
||||||
|
import { LinkModel } from '@db/Link';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test Service
|
* Test Service
|
||||||
@@ -420,4 +421,31 @@ export default class Game extends Service {
|
|||||||
list: gvgconfig?[{...gvgconfig, env: this.app.config.realEnv }]: []
|
list: gvgconfig?[{...gvgconfig, env: this.app.config.realEnv }]: []
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async getLinks(types: number[]) {
|
||||||
|
const { ctx } = this;
|
||||||
|
const links = await LinkModel.findByTypes(types);
|
||||||
|
|
||||||
|
return ctx.service.utils.resResult(STATUS.SUCCESS, {
|
||||||
|
list: links.map(cur => ({...cur, env: this.app.config.realEnv }))
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public async updateWXLink(serverId: number, link: string, qrCodeLink: string ) {
|
||||||
|
const { ctx } = this;
|
||||||
|
await LinkModel.updateByServerAndType(serverId, SNS_LINK_TYPE.WX_GROUP, { link, qrCodeLink }, ctx.user?.uid);
|
||||||
|
|
||||||
|
return ctx.service.utils.resResult(STATUS.SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async updateOtherLink(wxPublicAccountQrCode: string, bbsLink: string, customerLink: string ) {
|
||||||
|
const { ctx } = this;
|
||||||
|
let updateArr: { type: number, link?: string, qrCodeLink?: string }[] = [];
|
||||||
|
if(wxPublicAccountQrCode) updateArr.push({ type: SNS_LINK_TYPE.WX_PUBLIC_ACCOUNT, qrCodeLink: wxPublicAccountQrCode });
|
||||||
|
if(bbsLink) updateArr.push({ type: SNS_LINK_TYPE.BBS, link: bbsLink });
|
||||||
|
if(customerLink) updateArr.push({ type: SNS_LINK_TYPE.CUSTOMER, link: customerLink });
|
||||||
|
await LinkModel.updateLinks(updateArr, ctx.user?.uid);
|
||||||
|
|
||||||
|
return ctx.service.utils.resResult(STATUS.SUCCESS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ export default (appInfo: EggAppInfo) => {
|
|||||||
fileSize: '100mb',
|
fileSize: '100mb',
|
||||||
mode: 'stream',
|
mode: 'stream',
|
||||||
whitelist: [
|
whitelist: [
|
||||||
'.json', '.ts', '.zip'
|
'.json', '.ts', '.zip', '.jpg', '.png', '.jpeg'
|
||||||
],
|
],
|
||||||
fileExtensions: ['.json', '.ts', '.zip', '.tar.gz'], // 扩展几种上传的文件格式
|
fileExtensions: ['.json', '.ts', '.zip', '.tar.gz'], // 扩展几种上传的文件格式
|
||||||
autoFields: true
|
autoFields: true
|
||||||
|
|||||||
@@ -266,3 +266,11 @@ export enum MINI_GAME_TYPE {
|
|||||||
ERASE = 1, // 消消乐
|
ERASE = 1, // 消消乐
|
||||||
SHOOT = 2, // 射箭
|
SHOOT = 2, // 射箭
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export enum SNS_LINK_TYPE {
|
||||||
|
WX_GROUP = 1, // 微信群
|
||||||
|
BIND_PHONE = 2, // 绑定手机
|
||||||
|
WX_PUBLIC_ACCOUNT = 3, // 公众号
|
||||||
|
BBS = 4, // 论坛
|
||||||
|
CUSTOMER = 5, // 客服地址
|
||||||
|
}
|
||||||
@@ -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>;
|
||||||
@@ -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 { ActivityModelType } from '../../db/Activity';
|
||||||
import { ActivityBindPhoneRewardType } from '../../db/ActivityBindPhoneReward';
|
import { ActivityBindPhoneRewardType } from '../../db/ActivityBindPhoneReward';
|
||||||
|
import { LinkType } from '../../db/Link';
|
||||||
import { UserType } from '../../db/User';
|
import { UserType } from '../../db/User';
|
||||||
import { ActivityBase } from './activityField';
|
import { ActivityBase } from './activityField';
|
||||||
|
|
||||||
// 数据库
|
// 数据库
|
||||||
interface BindPhoneDataInDb {
|
interface PageDataInDb {
|
||||||
|
pageIndex: number;
|
||||||
|
pageName: string;
|
||||||
|
type: number;
|
||||||
rewards: string;
|
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 {
|
export class BindPhoneData extends ActivityBase {
|
||||||
rewards: string;
|
wxGroup: WXGroupPage;
|
||||||
|
bindPhone: BindPhonePage;
|
||||||
status: number = BIND_PHONE_STATUS.WAIT_BIND; // 状态 0-未绑定 1-已绑定可领取 2-已领取
|
wxPublicAccount: WXPublicAccountPage;
|
||||||
|
bbs: BBSPage;
|
||||||
|
|
||||||
constructor(activityData: ActivityModelType, createTime: number, serverTime: number) {
|
constructor(activityData: ActivityModelType, createTime: number, serverTime: number) {
|
||||||
super(activityData, createTime, serverTime);
|
super(activityData, createTime, serverTime);
|
||||||
this.initData(activityData.data)
|
this.initData(activityData.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
public initData(data: string) {
|
public initData(data: string) {
|
||||||
let dataObj: BindPhoneDataInDb = JSON.parse(data);
|
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) {
|
public setLinks(links: LinkType[]) {
|
||||||
if(user && user.channelInfo && user.channelInfo.is_phone_bind == 1) this.status = BIND_PHONE_STATUS.HAS_BIND;
|
for(let link of links) {
|
||||||
if(data) this.status = data.status;
|
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() {
|
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 {
|
return {
|
||||||
...this.getBaseKeys(),
|
...this.getBaseKeys(),
|
||||||
rewards: this.rewards,
|
pages
|
||||||
status: this.status,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,3 +49,16 @@ export function getRemoteRplFilePath(roleId: string, warType: number, battleCode
|
|||||||
const rplUrl = `/${roleId}/${warType}/${battleClass}/${battleCode}.bin`;
|
const rplUrl = `/${roleId}/${warType}/${battleClass}/${battleCode}.bin`;
|
||||||
return rplUrl;
|
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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -971,6 +971,33 @@
|
|||||||
"name": "编辑子包",
|
"name": "编辑子包",
|
||||||
"module": "server",
|
"module": "server",
|
||||||
"type": "find"
|
"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"
|
||||||
}
|
}
|
||||||
|
|
||||||
]
|
]
|
||||||
@@ -273,7 +273,7 @@
|
|||||||
"id": 50,
|
"id": 50,
|
||||||
"activityType": 50,
|
"activityType": 50,
|
||||||
"name": "BIND_PHONE",
|
"name": "BIND_PHONE",
|
||||||
"string": "绑定手机"
|
"string": "关注豪礼"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 51,
|
"id": 51,
|
||||||
|
|||||||
Reference in New Issue
Block a user