123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- import { getUserInfo,behaviorReport } from '../api/user'
- // 获取手机号
- export const MAKE_PHONE_CALL = (phoneNumber) => {
- if (!phoneNumber) {
- wx.showToast({ title: '暂无手机号', icon: 'none' });
- }
- wx.makePhoneCall({
- phoneNumber: phoneNumber,
- success() {
- console.log('拨打电话成功');
- },
- fail(err) {
- console.error('拨打电话失败', err);
- }
- });
- };
- // 获取用户信息
- export async function FETCH_AND_FORMAT_USER_INFO() {
- const userRes = await getUserInfo()
- const data = userRes.data || {};
- let dataInfo = {
- ...data,
- nickname: data.nickname || data.phone || data.username.substring(0,6)
- }
- wx.setStorageSync('userInfo', dataInfo)
- getApp().globalData.userInfo = dataInfo
- }
- // 埋点上报
- export async function REPORT_BEHAVIOR(eventName = '', extra = {}) {
- try {
- const res = await behaviorReport({
- type: eventName,
- ...extra
- });
- console.log('埋点成功:', res);
- return res;
- } catch (err) {
- console.error('埋点失败:', err);
- return null;
- }
- }
- // 生成海报
- export async function DRAW_POSTER() {
- const userInfo = getApp().globalData.userInfo || wx.getStorageSync('userInfo');
- const programConfig = getApp().globalData.programConfig || wx.getStorageSync('programConfig');
- const ctx = wx.createCanvasContext('posterCanvas', this);
- const canvasWidth = 300;
- const canvasHeight = 600;
- const bottomHeight = 80;
- const radius = 16; // 圆角半径
- ctx.save();
- ctx.setFillStyle('#fff');
- drawRoundRect(ctx, 0, 0, canvasWidth, canvasHeight, radius);
- // 背景图
- const bgUrl = programConfig.share_img;
- if (bgUrl) {
- const bgPath = bgUrl.startsWith('http') ? await downloadImage(bgUrl) : bgUrl;
- ctx.drawImage(bgPath, 0, 0, canvasWidth, canvasHeight - bottomHeight);
- }
- // 底部白色区域
- ctx.setFillStyle('#fff');
- ctx.fillRect(0, canvasHeight - bottomHeight, canvasWidth, bottomHeight);
- // 用户头像(圆形)
- const avatarUrl = userInfo.avatar;
- if (avatarUrl) {
- const avatarPath = avatarUrl.startsWith('http') ? await downloadImage(avatarUrl) : avatarUrl;
- const avatarSize = 40;
- const avatarX = 20;
- const avatarY = canvasHeight - bottomHeight + (bottomHeight - avatarSize) / 2;
- ctx.save();
- ctx.beginPath();
- ctx.arc(avatarX + avatarSize / 2, avatarY + avatarSize / 2, avatarSize / 2, 0, Math.PI * 2);
- ctx.clip();
- ctx.drawImage(avatarPath, avatarX, avatarY, avatarSize, avatarSize);
- ctx.restore();
- }
- // 昵称
- const nickName = userInfo.nickname || '游客';
- ctx.setFontSize(16);
- ctx.setFillStyle('#000');
- const textX = 20 + 40 + 12;
- const textY = canvasHeight - bottomHeight + bottomHeight / 2 + 6;
- ctx.fillText(nickName, textX, textY);
- // 二维码
- const qrUrl = programConfig.share_qrcode;
- if (qrUrl) {
- const qrPath = qrUrl.startsWith('http') ? await downloadImage(qrUrl) : qrUrl;
- const qrSize = 50;
- const qrX = canvasWidth - qrSize - 20;
- const qrY = canvasHeight - bottomHeight + (bottomHeight - qrSize) / 2;
- ctx.drawImage(qrPath, qrX, qrY, qrSize, qrSize);
- }
- ctx.restore(); // 恢复裁剪
- return new Promise((resolve, reject) => {
- ctx.draw(true, () => {
- wx.canvasToTempFilePath({
- canvasId: 'posterCanvas',
- success: res => resolve(res.tempFilePath),
- fail: err => {
- console.error('生成临时文件失败:', err);
- reject(err);
- }
- }, this);
- });
- });
- }
- // 下载网络图片到临时路径
- function downloadImage(url) {
- return new Promise((resolve, reject) => {
- wx.downloadFile({
- url,
- success(res) {
- if (res.statusCode === 200) resolve(res.tempFilePath);
- else reject(new Error('下载失败'));
- },
- fail(err) { reject(err); }
- });
- });
- }
- // 绘制圆角矩形函数
- function drawRoundRect(ctx, x, y, w, h, r) {
- ctx.beginPath();
- ctx.moveTo(x + r, y);
- ctx.arcTo(x + w, y, x + w, y + h, r);
- ctx.arcTo(x + w, y + h, x, y + h, r);
- ctx.arcTo(x, y + h, x, y, r);
- ctx.arcTo(x, y, x + w, y, r);
- ctx.closePath();
- ctx.fill();
- ctx.clip(); // 关键:裁剪出圆角
- }
|