为了写些demo,我上架了个小程序:【i不简】

280 阅读3分钟

哈喽哇!我是小不不简说的不。在代码世界疯狂蹦跶的 “非资深选手”🙋‍♂️!主打一个*“踩坑我来,避坑你学”*。毕竟独乐乐不如众乐乐,让大家少走弯路,才是咱的终极使命✨~

这些天也是一直在副业摸索中。跌跌撞撞,看了很多,也学到了很多。

前言

最近发送有不少小伙伴想要在非web环境下处理 vue-plugin-hiprint的模板数据,在uniapp,小程序端预览模板,或者获取pdf文件

文末见小程序链接,demo源码

那么本期也是实操,我把往期文章以及这些可能需要的功能上架到了我的小程序:【i不简】 如图:

首页

模板预览,pdf

部署服务端

我的服务器配置:2C 4G

本地用到我的另一个开源项目:node-hiprint-pdf

它的原理,我早期文件也介绍过了,这里就不赘述了。详情看文章:mp.weixin.qq.com/s/xJP8WSOoD…

见项目文件 Dockerfile以及docker-compose.yaml 这两个 docker 配置文件

为了实时修改,存放一些资源,我修改了一下 docker-compose.yaml 看代码

version: "3"
services:
  node-hiprint-pdf:
    image: node-hiprint-pdf:1.0.0
    restart: always
    container_name: node-hiprint-pdf
    build:
      context: ./
      dockerfile: Dockerfile
    ports:
      - "3002:3002"
    volumes:
      # 挂载项目目录的 public 目录
      - ./public:/app/public

而后构建运行 docker 服务即可:

docker-compose up -d

如果是Linux服务器,由于docker版本原因,如果报错,你可能需要换成

docker compose up -d

注意:docker构建比较耗时,有可能网络原因导致失败。大家要多摸索摸索。

启动好后,将会有一个 3000 端口的服务后台服务。

uniapp端代码

本期采用了 牛X 的开源框架:

开箱即用。

UI部分就没什么好说的了,直接上核心代码:

首先定义咱们的后端API:

export const getImage = (data) => {
  return http.post('/img', data);
};

export const getPdf = (data) => {
  return http.post('/pdf', data);
};

export const getHtml = (data) => {
  return http.post('/html', data);
};

而后处理 UI 上的按钮事件:

<template>
<view class="my-2 mx-2">
      <wd-button custom-class="w-full mb-2" icon="image" @click="onGetImage">
        获取预览图片
      </wd-button>
      <wd-button custom-class="w-full mb-2" icon="file-pdf" @click="onGetPdf">获取pdf</wd-button>
      <wd-button custom-class="w-full mb-2" icon="code " @click="onGetHtml">获取html</wd-button>
    </view>
  </view>
</template>
<script setup lang="ts">
import { getImage, getPdf, getHtml } from '@/service';

const template = ref({
  panels: [
    // xxx 省略模板数据
  ],
});
const printData = ref({
  name: '不简说',
});

const imageUrl = ref('');
const pdfUrl = ref('');
const htmlStr = ref('');

const onGetImage = async () => {
  uni.showLoading({
    title: '请稍后...',
    mask: true,
  });
  const res = await getImage({
    template: JSON.parse(templateStr.value),
    printData: JSON.parse(printDataStr.value),
  });
  uni.hideLoading();
  console.log(res);
  if (res.code === 1) {
    imageUrl.value = res.data as string;
  } else {
    toast.error(res.msg || '获取图片失败');
  }
};

const onGetPdf = async () => {
  uni.showLoading({
    title: '请稍后...',
    mask: true,
  });
  const res = await getPdf({
    template: JSON.parse(templateStr.value),
    printData: JSON.parse(printDataStr.value),
  });
  uni.hideLoading();
  if (res.code === 1) {
    pdfUrl.value = res.data as string;
  } else {
    toast.error(res.msg || '获取pdf失败');
  }
};

const onGetHtml = async () => {
  uni.showLoading({
    title: '请稍后...',
  });
  const res = await getHtml({
    template: JSON.parse(templateStr.value),
    printData: JSON.parse(printDataStr.value),
  });
  uni.hideLoading();
  if (res.code === 1) {
    htmlStr.value = res.data as string;
  } else {
    toast.error(res.msg || '获取html失败');
  }
};
</script>

总结

代码整体很简单。并没有很难理解吧。就是调用node后端的API传需要的数据,而后获取对应的数据。

服务器配置不高,希望各位不用疯狂体验测试。

服务器配置不高,希望各位不用疯狂体验测试。

服务器配置不高,希望各位不用疯狂体验测试。

公众号回复 2505 获取源码~

写到最后

💡 温馨提示:本文章可随意 “转发扩散”,让更多小伙伴加入 “少踩坑联盟”!毕竟独坑坑不如众坑坑…… 啊不,是独乐乐不如众乐乐😂!

👉 快来关注小不悄悄说:评论区蹲一个 “你最想知道的代码小技巧,demo”,下一期说不定就为你量身定制啦🎯!