fastadmin 实现标签打印

项目场景如图,需要打印一批条形码或者二维码,除了市面上成熟的标签机之外,今天挑战一下使用普通的打印机+不干胶贴纸,实现低成本的标签打印;

项目框架基于 fastadmin:

1、项目对应的js添加打印按钮的事件监听

javascript 复制代码
            $('.btn-print').click(function () {
                var ids = Table.api.selectedids(table);//获取选中列的id
                Fast.api.open("code/print?id="+ids, __('打印标签'), {
                    area: ['100%', '90%']
                });
            })

2、打印标签模板的html页面:使用了 grid 布局

html 复制代码
<style>
    
.container {
    display: grid;
    grid-template-columns: repeat(6, 125px);
    /*grid-template-rows: repeat(7, 76px);*/
    /* width: 800px; */
    align-content: space-between;
    align-items: center;
    justify-items: stretch;
    grid-gap: 2px 2px;
}

.item{
    display: flex;
    flex-direction: column;
    align-items: center;
    border: 1px solid;
    width: 100%;
    height: 76px;
    padding: 5%;
}

</style>
<div class="form-group layer-footer">
    <label class="control-label col-xs-12 col-sm-2"></label>
    <div class="col-xs-12 col-sm-8">
        <button type="reset" class="btn btn-primary btn-embossed btn-close"
                onclick="Layer.closeAll()">{:__('Close')}</button>
        <button type="reset" class="btn btn-primary btn-embossed btn-close" onclick="doPrint()">打印</button>
    </div>
</div>
<div id="app">
    <div class="container">
        {volist name="lists" id="vo"}
        <div class="item">
            <div style="width:85%;">
                <img style="width:100%;" src="{$vo.barcode}" alt="" />
            </div>
            <div style="font-size:x-small;">
                {$vo.code}
            </div>
        </div>
        {/volist}
    </div>
 
</div>
<style></style>
<script>
    function doPrint() {
        window.print()
    }
</script>

模板标签页效果如下:

3、后端controller写一个 print 方法

javascript 复制代码
    public function print(){
        $ids = $this->request->get('id');
        $ids = explode(',',$ids);
        $lists = $this->model
            ->where('id','in',$ids)
            ->select();
        // dump($lists[0]->toArray());
        $this->assign('lists',$lists);
        return $this->fetch();
    }

4、后端 model,因为条形码是依赖插件生成,所以这里追加barcode属性

php 复制代码
    // 追加属性
    protected $append = [
        'barcode'
    ];
    
    public function getBarcodeAttr($value, $data)
    {
        $code = $data['code'];
        return "https://3f.gde.cc/barcode/build?text={$code}&type=C128&foreground=%23000000&width=1&height=40";
    }

5、最后依赖浏览器的打印功能实现打印

实际上还需要通过调整边距、缩放等实现最佳的打印效果。

相关推荐
范文杰2 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪2 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪2 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy3 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom4 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom4 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom4 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom4 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom4 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试
LaoZhangAI5 小时前
2025最全GPT-4o图像生成API指南:官方接口配置+15个实用提示词【保姆级教程】
前端