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、最后依赖浏览器的打印功能实现打印

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

相关推荐
风骏时光牛马8 分钟前
大模型底层架构与推理流程AI源码深度剖析
前端
程序员Sunday9 小时前
JavaScript 事件循环面试题,宏任务与微任务怎么执行|Sunday面试指南
开发语言·javascript·面试·校招·事件循环·程序员sunday
Setsuna_F_Seiei9 小时前
前端转型 Agent 开发 06 之 Agent Memory 记忆系统(让 Agent 更智能,更懂你)
前端·agent·ai编程
zhangzeyuaaa10 小时前
Ruby 多线程、GVL(GIL)与 Mutex 完全指南
开发语言·前端·ruby
默_笙10 小时前
🌊 向量库和 ES 都查不出"关系",我只好给奶茶建了一张人脉网
前端·javascript
优选资讯11 小时前
标签打印软件怎么对接 Excel 数据
前端·excel
思无邪6611 小时前
用 AI 做 JS 逆向:从抓包到复现的完整方法论
开发语言·javascript·人工智能
一个风轻云淡12 小时前
GCC 和 GDB命令简单解读
java·linux·前端
u01110267512 小时前
图片处理接口如何统一错误信息 前端提示与后端错误码设计
前端·状态模式
福兮说13 小时前
浏览器里把 iPhone 的 HEIC 转成 JPG:Chrome 解不开、转完大了七成、拍摄时间全丢,六个坑实测
前端·javascript·图像处理·chrome·ios·iphone·heic