| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586 | // nova-werun/pages/home/share/index.jsconst qiniuUploader = require("../../../../utils/qiniuUploader");const Parse = getApp().Parse;const company = getApp().globalData.company;Page({    /**     * 页面的初始数据     */    data: {        //屏幕高度        statusBarHeight: 0, // 状态栏高度        screenHeight: 0, // 屏幕高度        customHeight: 0, // 自定义导航栏高度(如小程序右上角胶囊按钮)        bottomNavHeight: 0, // 底部导航栏高度        contentHeight: 0, // 可用内容高度        contentHeight2: 0,        contentpadding: 0, //顶部padding高度        sharList: [],        images: [            'https://file-cloud.fmode.cn/qpFbRRSZrO/20250102/gtontq125800552.jpg?imageView2/1/w/200/h/200',            'https://file-cloud.fmode.cn/qpFbRRSZrO/20250102/8e1ps0125800358.jpg?imageView2/1/w/200/h/200',            'https://file-cloud.fmode.cn/qpFbRRSZrO/20250102/l5321n125800284.jpg?imageView2/1/w/200/h/200',            'https://file-cloud.fmode.cn/qpFbRRSZrO/20250102/j1p6l7125757884.jpg?imageView2/1/w/200/h/200'        ],        randomImage: '',        saveimage: '',        uptokenURL: '',        domain: '',        uploadURL:''    },    /**     * 生命周期函数--监听页面加载     */    onLoad: function (options) {        // 计算        const systemInfo = wx.getSystemInfoSync();        const statusBarHeight = systemInfo.statusBarHeight || 0;        const screenHeight = systemInfo.screenHeight || 0;        const custom = wx.getMenuButtonBoundingClientRect();        const customHeight = custom.height + 10 + 2 || 0;        const bottomNavHeight = systemInfo.screenHeight - systemInfo.safeArea.bottom || 0;        const contentpadding = (statusBarHeight + customHeight) * 750 / systemInfo.windowWidth;        const contentHeight = (screenHeight - bottomNavHeight - statusBarHeight - customHeight) * 750 / systemInfo.windowWidth;        this.setData({            statusBarHeight,            screenHeight,            customHeight,            bottomNavHeight,            contentpadding,            contentHeight        });        this.order()        this.showRandomImage()    },    /**     * 生命周期函数--监听页面初次渲染完成     */    onReady: function () {    },    /**     * 生命周期函数--监听页面显示     */    onShow: function () {    },    /**     * 生命周期函数--监听页面隐藏     */    onHide: function () {    },    /**     * 生命周期函数--监听页面卸载     */    onUnload: function () {    },    /**     * 页面相关事件处理函数--监听用户下拉动作     */    onPullDownRefresh: function () {    },    /**     * 页面上拉触底事件的处理函数     */    onReachBottom: function () {    },    /**     * 用户点击右上角分享     */    onShareAppMessage: function () {    },    //获取当天运动数据    async order() {        const currentUser = Parse.User.current();        let ActivityDataquery = new Parse.Query('ActivityData');        // ActivityDataquery.equalTo('user', currentUser.id);        ActivityDataquery.equalTo('company', company);        ActivityDataquery.equalTo('type', 'today');        ActivityDataquery.notEqualTo('isDeleted', true);        // 获取今天的日期        const today = new Date();        const todayStart = new Date(today.getFullYear(), today.getMonth(), today.getDate()); // 今天的开始时间        const todayEnd = new Date(todayStart);        todayEnd.setHours(23, 59, 59, 999); // 今天的结束时间        // 在查询条件中添加对 createdAt 的限制        ActivityDataquery.greaterThanOrEqualTo('createdAt', todayStart);        ActivityDataquery.lessThanOrEqualTo('createdAt', todayEnd);        ActivityDataquery.include('user');        // 根据 steps 字段进行降序排序        ActivityDataquery.descending('steps');        let r = await ActivityDataquery.find();        let todayList = r.map(item => {            let itemData = item.toJSON();            // 获取当前时间并格式化            const now = new Date();            const formattedTime = `${now.getFullYear()}/${String(now.getMonth() + 1).padStart(2, '0')}/${String(now.getDate()).padStart(2, '0')} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}`;            itemData.currentTime = formattedTime; // 将当前时间添加到 item 中            return itemData;        });        let sharList = []        todayList.forEach((item, index) => {            if (item.user.objectId == currentUser.id) {                sharList.push({                    ...item, // 包含用户数据                    rank: index + 1 // 计算排名(index 从 0 开始,所以加 1)                });            }        })        this.setData({            sharList        });        this.saveImage()        console.log(this.data.sharList);    },    //随机展示图片    showRandomImage: function () {        const randomIndex = Math.floor(Math.random() * this.data.images.length);        this.setData({            randomImage: this.data.images[randomIndex]        });    },    //绘制canvas    rpxToPx(rpx) {        const systemInfo = wx.getSystemInfoSync();        return rpx * (systemInfo.windowWidth / 750);    },    getImageInfo(url) {        console.log(url);        return new Promise((result) => {            wx.getImageInfo({                src: url, //服务器返回的图片地址                success: function (res) {                    // res.path是网络图片的本地地址                    let Path = res.path;                    result(Path)                },                fail(err) {                    console.log(err);                    result()                }            });        })    },    //rpx    async saveImage() {        // console.log('运行了');        const canvas = wx.createCanvasContext('myCanvas');        const width = this.rpxToPx(670);        const height = this.rpxToPx(1100);        // console.log(width, height);        canvas.width = this.rpxToPx(670);        canvas.height = this.rpxToPx(1100);        // 绘制背景        canvas.setFillStyle('#CAE1FD'); // 背景色        canvas.fillRect(0, 0, width, height);        canvas.setFillStyle('#0178EE');        let mainimage = await this.getImageInfo(this.data.randomImage)        let avatar = Parse.User.current()?.get('avatar')        console.log('avatar', avatar);        let userAvatar = await this.getImageInfo(avatar)        console.log('userAvatar', userAvatar);        //主图片        canvas.drawImage(mainimage, 0, 0, width, this.rpxToPx(500)); // 调整图片高度        //头像        if (userAvatar) {            // 绘制带圆角的头像            const avatarX = this.rpxToPx(40);            const avatarY = this.rpxToPx(540);            const avatarSize = this.rpxToPx(83);            const radius = avatarSize / 2; // 半径为头像大小的一半            // 绘制圆角矩形            canvas.save(); // 保存当前状态            canvas.beginPath(); // 开始路径            canvas.moveTo(avatarX + radius, avatarY); // 左上角            canvas.lineTo(avatarX + avatarSize - radius, avatarY); // 上边            canvas.arc(avatarX + avatarSize - radius, avatarY + radius, radius, 1.5 * Math.PI, 0, false); // 右上角            canvas.lineTo(avatarX + avatarSize, avatarY + avatarSize - radius); // 右边            canvas.arc(avatarX + avatarSize - radius, avatarY + avatarSize - radius, radius, 0, 0.5 * Math.PI, false); // 右下角            canvas.lineTo(avatarX + radius, avatarY + avatarSize); // 下边            canvas.arc(avatarX + radius, avatarY + avatarSize - radius, radius, 0.5 * Math.PI, Math.PI, false); // 左下角            canvas.lineTo(avatarX, avatarY + radius); // 左边            canvas.arc(avatarX + radius, avatarY + radius, radius, Math.PI, 1.5 * Math.PI, false); // 左上角            canvas.closePath(); // 关闭路径            canvas.clip(); // 剪切            // 绘制头像            canvas.drawImage(userAvatar, avatarX, avatarY, avatarSize, avatarSize); // 头像位置和大小            canvas.restore(); // 恢复状态        }        // 绘制昵称和时间        const nickname = this.data.sharList[0].user.nickname;        const currentTime = this.data.sharList[0].currentTime;        const rank = this.data.sharList[0].rank;        const steps = this.data.sharList[0].steps || 0;        const distance = this.data.sharList[0].distance || 0;        canvas.setFontSize(this.rpxToPx(30));        canvas.fillText(nickname, this.rpxToPx(140), this.rpxToPx(580)); // 昵称位置        // console.log('昵称加载成功');        canvas.setFontSize(this.rpxToPx(28));        canvas.fillText(currentTime, this.rpxToPx(140), this.rpxToPx(610)); // 时间位置        // console.log('时间加载成功');        // 绘制其他文本        canvas.setFontSize(this.rpxToPx(55));        canvas.fillText('梦想家', this.rpxToPx(40), this.rpxToPx(720));        // console.log('梦想家加载成功');        canvas.setFontSize(this.rpxToPx(30));        canvas.fillText('用汗水实现想象,用脚步丈量梦想', this.rpxToPx(40), this.rpxToPx(780));        // console.log('汗水加载成功');        // 绘制排名、步数和公里数        canvas.setFontSize(this.rpxToPx(28));        // canvas.fillText('今日排名: ' + rank, 20, 400);        canvas.fillText('今日排名', this.rpxToPx(40), this.rpxToPx(840));        // console.log('排名加载成功');        // canvas.fillText('今日步数: ' + steps, 20, 420);        canvas.fillText('今日步数', this.rpxToPx(240), this.rpxToPx(840));        // console.log('步数加载成功');        // canvas.fillText('公里数: ' + distance + 'km', 20, 430);        canvas.fillText('公里数', this.rpxToPx(440), this.rpxToPx(840));        // console.log('公里数加载成功');        canvas.setFontSize(this.rpxToPx(40));        canvas.fillText(rank, this.rpxToPx(80), this.rpxToPx(900));        canvas.fillText(steps, this.rpxToPx(240), this.rpxToPx(900));        canvas.fillText(distance + 'km', this.rpxToPx(444), this.rpxToPx(900));        // 绘制二维码(如果有)        canvas.setFillStyle('#0178EE'); // 示例二维码        canvas.fillRect(width - this.rpxToPx(140), height - this.rpxToPx(160), this.rpxToPx(120), this.rpxToPx(120)); // QR 位置        // console.log('二维码绘制');        canvas.setFillStyle('#0178EE');        canvas.setFontSize(this.rpxToPx(28));        canvas.fillText('长按二维码加入跑团', width - this.rpxToPx(420), height - this.rpxToPx(120));        canvas.fillText('和我一起运动', width - this.rpxToPx(380), height - this.rpxToPx(80));        // 完成绘制        canvas.draw(false, () => {            console.log('123');            wx.canvasToTempFilePath({                canvasId: 'myCanvas',                success: (res) => {                    console.log('绘制完成', res);                    this.setData({                        saveimage: res.tempFilePath                    });                    this.getUptoken()                    console.log(this.data.saveimage);                },                fail: (err) => {                    console.error('canvasToTempFilePath 失败', err);                }            });        });    },    uploadImageToServer() {        const that = this;        const tempFilePath = this.data.saveimage; // 获取本地临时文件路径            qiniuUploader.upload(            tempFilePath, // 本地文件路径            (res) => {                const imageURL = res.imageURL; // 上传成功后的网络地址                console.log('上传成功,网络地址:', imageURL);                that.setData({                    saveimage: imageURL // 更新 saveimage 为网络地址                });            },            (error) => {                console.error('上传失败:', error);            },            {                region: "SCN", // 七牛云区域                uploadURL: that.data.uploadURL, // 上传地址                domain: that.data.domain, // 域名                uptoken: that.data.uptokenURL, // 上传凭证            }        );        console.log('saveimage',this.data.saveimage);    },    async getUptoken() {        let res = await Parse.Cloud.run('qiniu_uptoken', {            company: company        })        this.setData({            uptokenURL: res.uptoken,            domain: res.domain,            uploadURL: res.zoneUrl        })        this.uploadImageToServer()        console.log(this.data.uptokenURL, this.data.domain, this.data.uploadURL);    },    //px    // saveImage() {    //     // console.log('运行了');    //     const canvas = wx.createCanvasContext('myCanvas');    //     const width = 335;    //     const height = 550;    //     // console.log(width, height);    //     canvas.width = 335;    //     canvas.height = 550;    //     // 绘制背景    //     canvas.setFillStyle('#CAE1FD'); // 背景色    //     canvas.fillRect(0, 0, width, height);    //     canvas.setFillStyle('#0178EE');    //     // 加载主图片    //     wx.getImageInfo({    //         src: this.data.randomImage,    //         success: (res) => {    //             canvas.drawImage(res.path, 0, 0, width, 250); // 调整图片高度    //             // console.log('主图片加载成功');    //             // 加载用户头像    //             wx.getImageInfo({    //                 src: this.data.sharList[0].user.avatar,    //                 success: (avatarRes) => {    //                     // 绘制带圆角的头像    //                     const avatarX = 20;    //                     const avatarY = 270;    //                     const avatarSize = 42.5;    //                     const radius = avatarSize / 2; // 半径为头像大小的一半    //                     // 绘制圆角矩形    //                     canvas.save(); // 保存当前状态    //                     canvas.beginPath(); // 开始路径    //                     canvas.moveTo(avatarX + radius, avatarY); // 左上角    //                     canvas.lineTo(avatarX + avatarSize - radius, avatarY); // 上边    //                     canvas.arc(avatarX + avatarSize - radius, avatarY + radius, radius, 1.5 * Math.PI, 0, false); // 右上角    //                     canvas.lineTo(avatarX + avatarSize, avatarY + avatarSize - radius); // 右边    //                     canvas.arc(avatarX + avatarSize - radius, avatarY + avatarSize - radius, radius, 0, 0.5 * Math.PI, false); // 右下角    //                     canvas.lineTo(avatarX + radius, avatarY + avatarSize); // 下边    //                     canvas.arc(avatarX + radius, avatarY + avatarSize - radius, radius, 0.5 * Math.PI, Math.PI, false); // 左下角    //                     canvas.lineTo(avatarX, avatarY + radius); // 左边    //                     canvas.arc(avatarX + radius, avatarY + radius, radius, Math.PI, 1.5 * Math.PI, false); // 左上角    //                     canvas.closePath(); // 关闭路径    //                     canvas.clip(); // 剪切    //                     // 绘制头像    //                     canvas.drawImage(avatarRes.path, avatarX, avatarY, avatarSize, avatarSize); // 头像位置和大小    //                     canvas.restore(); // 恢复状态    //                     // console.log('头像加载成功');    //                     // 绘制昵称和时间    //                     const nickname = this.data.sharList[0].user.nickname;    //                     const currentTime = this.data.sharList[0].currentTime;    //                     const rank = this.data.sharList[0].rank;    //                     const steps = this.data.sharList[0].steps || 0;    //                     const distance = this.data.sharList[0].distance || 0;    //                     canvas.setFontSize(15);    //                     canvas.fillText(nickname, 70, 290); // 昵称位置    //                     // console.log('昵称加载成功');    //                     canvas.setFontSize(14);    //                     canvas.fillText(currentTime, 70, 305); // 时间位置    //                     // console.log('时间加载成功');    //                     // 绘制其他文本    //                     canvas.setFontSize(27.5);    //                     canvas.fillText('梦想家', 20, 360);    //                     // console.log('梦想家加载成功');    //                     canvas.setFontSize(15);    //                     canvas.fillText('用汗水实现想象,用脚步丈量梦想', 20, 390);    //                     // console.log('汗水加载成功');    //                     // 绘制排名、步数和公里数    //                     canvas.setFontSize(14);    //                     // canvas.fillText('今日排名: ' + rank, 20, 400);    //                     canvas.fillText('今日排名', 20, 420);    //                     // console.log('排名加载成功');    //                     // canvas.fillText('今日步数: ' + steps, 20, 420);    //                     canvas.fillText('今日步数', 120, 420);    //                     // console.log('步数加载成功');    //                     // canvas.fillText('公里数: ' + distance + 'km', 20, 430);    //                     canvas.fillText('公里数', 220, 420);    //                     // console.log('公里数加载成功');    //                     canvas.setFontSize(20);    //                     canvas.fillText(rank, 40, 450);    //                     canvas.fillText(steps, 122, 450);    //                     canvas.fillText(distance + 'km', 222, 450);    //                     // 绘制二维码(如果有)    //                     canvas.setFillStyle('red'); // 示例二维码    //                     canvas.fillRect(width - 70, height - 80, 60, 60); // QR 位置    //                     // console.log('二维码绘制');    //                     canvas.setFillStyle('#0178EE');    //                     canvas.setFontSize(14);    //                     canvas.fillText('长按二维码加入跑团', width - 210, height - 60);    //                     canvas.fillText('和我一起运动', width - 190, height - 40);    //                     // 完成绘制    //                     canvas.draw(false, () => {    //                         console.log('123');    //                         wx.canvasToTempFilePath({    //                             canvasId: 'myCanvas',    //                             success: (res) => {    //                                 console.log('绘制完成', res);    //                                 this.setData({    //                                     saveimage: res.tempFilePath    //                                 });    //                                 console.log(this.data.saveimage);    //                             },    //                             fail: (err) => {    //                                 console.error('canvasToTempFilePath 失败', err);    //                             }    //                         });    //                     });    //                 },    //                 fail: () => {    //                     console.error('用户头像加载失败');    //                 }    //             });    //         },    //         fail: () => {    //             console.error('主图片加载失败');    //         }    //     });    // },    //点击保存图片    async savepic() {        await this.saveImage()        const imagePath = this.data.saveimage; // 获取保存的图片路径        if (imagePath) {            // 调用保存图片到相册的方法            wx.saveImageToPhotosAlbum({                filePath: imagePath,                success: () => {                    wx.showToast({                        title: '图片已保存到相册',                        icon: 'success'                    });                },                fail: (err) => {                    console.error('保存失败', err);                    wx.showToast({                        title: '保存失败',                        icon: 'none'                    });                }            });        } else {            wx.showToast({                title: '没有可保存的图片',                icon: 'none'            });        }    },    //保存图片到相册    savepic2: function () {        let that = this;        wx.canvasToTempFilePath({          x: 0,          y: 0,          width: 670,          height: 1100,          destWidth: 670,          destHeight: 1100,          canvasId: 'myCanvas',          success: function (result) {            wx.getSetting({              success(res) {                if (!res.authSetting['scope.writePhotosAlbum']) {                  wx.authorize({                    scope: 'scope.writePhotosAlbum',                    success() {                      //这里是用户同意授权后的回调                      // that.saveImgToLocal();                      wx.saveImageToPhotosAlbum({                        filePath: result.tempFilePath,                        success(res) {                            wx.showToast({                                title: '图片已保存到相册',                                icon: 'success'                            });                        }                      })                    },                    fail() { //这里是用户拒绝授权后的回调                      wx.showToast({                        title: '打开相册授权,才能保存图片哦~',                        icon: 'none',                        duration: 2000                      })                      that.setData({                        openSettingBtnHidden: false                      })                    }                  })                } else {                  //调取小程序当中获取图片                  console.log(result.tempFilePath);                  wx.saveImageToPhotosAlbum({                    filePath: result.tempFilePath,                    success(res) {                        wx.showToast({                            title: '图片已保存到相册',                            icon: 'success'                        });                    }                  })                }              }            })              },          fail: function (res) {            console.log(res)          }        })      },    shar() {        wx.downloadFile({            url: this.data.saveimage, //图片服务器地址            success: (res) => {                wx.showShareImageMenu({                    path: res.tempFilePath, //转为本地地址showShareImageMenu进行分享                    success: (res) => {                        uni.hideLoading();                        this.modalShare = null;                    },                    fail: (err) => {                        uni.hideLoading();                        this.modalShare = null;                    },                });            },        });    },    sharecircle() {        console.log('this.data.saveimage',this.data.saveimage);        wx.navigateTo({            url: '../../circle/send-circle/index?image=' + this.data.saveimage // 目标页面的路径        });    }})
 |