HEX
Server: nginx/1.28.1
System: Linux VM-0-12-opencloudos 6.6.117-45.oc9.x86_64 #1 SMP Thu Dec 4 10:26:39 CST 2025 x86_64
User: www (1000)
PHP: 7.4.33
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: /www/wwwroot/www.waciwang.com/wp-content/themes/miragev-main/assets/js/src/content-action.js
/**
 * 点赞,收藏,评论
 */

import {getCookie, setCookie} from './utils.js';
import lightTip from '../../lib/ui/light-tip.js';
import dialogTools from './dialog.js';

export default function () {
  likeInit();
  starInit();
  sharePosterInit();
  coinInit();
}

/**
 * 点赞事件绑定
 */
async function likeInit(){
  var likeButtons = document.querySelectorAll('.widget-action.like');
  if(!likeButtons) return;
  likeButtons.forEach( button=>{
    button.addEventListener('click', async function(){
      var that = this;
      
      var wpnonce = document.querySelector("input[name='wp_create_nonce']").value;
      var post_id = document.querySelector("input[name='post_id']").value;
      
      var addUrl = '/wp-json/vtheme/v1/stars' + "?_wpnonce=" + wpnonce;
      var deleteUrl = '/wp-json/vtheme/v1/stars/' + post_id + "?_wpnonce=" + wpnonce;

      var currentUser
      
      // 登录用户取消点赞
      if( this.classList.contains('active') ){
        let response = await fetch(deleteUrl, {
          method:'DELETE',
          headers:{'Content-Type': 'application/json'},
          body:JSON.stringify({'type':'like'})
        });
        let responseJson = await response.json();
        if(response.status == 200){
          that.classList.remove('active');
          let num = that.querySelector('.number').innerText;
          num = (--num <= 0) ? '' : num; 

          that.querySelector('.number').innerText = num;
          // lightTip.custom('取消点赞', {type:'warning', time:500});
        }else{
          lightTip.error(responseJson.error);
        }
        return;
      }

      // 未登录用户,通过 cookie 判断是否点赞过
      let currentUserId = document.querySelector('input[name="current_user_id"]').value;
      let likeIdsArr = [];

      if(currentUserId==0){
        let likeIdsStr = getCookie('likeIds');
        likeIdsArr = [];

        try {
          likeIdsArr = JSON.parse(likeIdsStr);
        } catch(e) {
          likeIdsArr = [];
        }

        if(likeIdsArr.indexOf(post_id) !== -1){
          lightTip.success('今天已经点赞过了');
          return;
        }
      }
      
      // 执行点赞请求
      var data = {};
      data.object_id = document.querySelector("input[name='post_id']").value;
      data.type = 'like';

      let response = await fetch(addUrl, {
        method:'POST',
        headers:{'Content-Type': 'application/json'},
        body:JSON.stringify(data)
      });

      let responseJson = await response.json();
      if(response.status == 201){
        that.querySelector('.number').innerText = responseJson.counter;
        if(responseJson.user_id == 0){ //未登录用户
          likeIdsArr.push(post_id);
          setCookie('likeIds', JSON.stringify(likeIdsArr), 1);
          return;
        }
        that.classList.add('active');
        lightTip.normal('点赞成功',1000);
      }else{
        lightTip.error(responseJson.error);
      }
      
    });
  });
}


/**
 * 收藏事件绑定
 */
async function starInit(){
  var starButtons = document.querySelectorAll('.widget-action.star');
  if(!starButtons) return;
  starButtons.forEach( button=>{
    button.addEventListener('click', async function(){
      // 未登录用户,弹出登录框
      let currentUserId = document.querySelector('input[name="current_user_id"]').value;
      var loginModal = document.querySelector('.login-dialog');
      if(loginModal){
        loginModal.showModal();
        document.querySelector('body').classList.add('no-scroll');
      }
      

      var that = this;
      
      var wpnonce = document.querySelector("input[name='wp_create_nonce']").value;
      var post_id = document.querySelector("input[name='post_id']").value;
      
      var addUrl = '/wp-json/vtheme/v1/stars' + "?_wpnonce=" + wpnonce;
      var deleteUrl = '/wp-json/vtheme/v1/stars/' + post_id + "?_wpnonce=" + wpnonce;
      
      if( this.classList.contains('active') ){
        var that = this;
        var response = await fetch(deleteUrl, {
          method:'DELETE',
          headers:{'Content-Type': 'application/json'},
          body:JSON.stringify({'type':'star'})
        });
        var responseJson = await response.json();
        if(response.status == 200){
          that.classList.remove('active');
          let num = that.querySelector('.number').innerText;
          num = (--num <= 0) ? '' : num; 

          that.querySelector('.number').innerText = num;
        }else{
          lightTip.error(responseJson.error);
        }
      } else {
        var data = {};
        data.object_id = document.querySelector("input[name='post_id']").value;
        data.type = 'star';
        
        var response = await fetch(addUrl, {
          method:'POST',
          headers:{'Content-Type': 'application/json'},
          body:JSON.stringify(data)
        });
        var responseJson = await response.json();
        if(response.status == 201){
          that.classList.add('active');
          that.querySelector('.number').innerText = responseJson.counter;
          lightTip.normal('收藏成功',1000);
        } else if(response.status == 401) {
          lightTip.normal('请登录后重试',1000);
        }
      }

      
    });
  });
}


/**
 * 海报生成
 */
function sharePosterInit() {
  var qrcodeSelector = document.getElementById("qrcode");
  if(!qrcodeSelector) { return; }

  window.addEventListener('load', function(){
    var url = document.querySelector('input[name="post_url"]').value;
    var qrcode = new QRCode(qrcodeSelector, {
        text: url,
        width: 80,
        height: 80,
        colorDark : "#000000",
        colorLight : "#ffffff",
        correctLevel : QRCode.CorrectLevel.H
    });
  });


  var shareSelector = document.querySelector('.share-poster');
  var shareDialog = document.querySelector('#share-dialog');
  if(!shareSelector || !shareDialog){ return; }
  dialogTools.registerDialog(shareDialog);

  shareSelector.addEventListener('click', function(e){
    // shareDialog.show();
    shareDialog.showModal();
    // document.body.classList.add('no-scroll');

    var copyDom = document.querySelector('.share-card');
    var width = copyDom.offsetWidth;
    var height = copyDom.offsetHeight;
    var canvas = document.createElement("canvas");

    var scale = 1; // 图片缩放
    canvas.width = width * scale;
    canvas.height = height * scale;
    canvas.getContext("2d").scale(scale, scale);
      
    var opts = {
        scale: scale,
        canvas: canvas,
        width: width,
        height: height
    };

    html2canvas(copyDom, opts).then(canvas => {
        let dataURL = canvas.toDataURL("image/png"); // canvas转base64
        document.querySelector('#poster').src = dataURL;
        document.querySelector('#poster').classList.remove('hide');
        document.querySelector('.top-layer').classList.add('hide');
    });
  });


  shareDialog.querySelector('.close-button').addEventListener('click', e=>{
    shareDialog.close();
    // document.body.classList.remove('no-scroll');
  });
}


/**
 * 打赏
 */
function coinInit(argument) {
  var coinButton = document.querySelector('.coin');

  var coinDialog = document.querySelector('#coin-dialog');
  if(!coinButton){ return; }
  dialogTools.registerDialog(coinDialog);

  coinButton && coinButton.addEventListener('click', async e=> {
    coinDialog.showModal();
  });
}