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

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

相关推荐
于慨20 小时前
Lambda 表达式、方法引用(Method Reference)语法
java·前端·servlet
石小石Orz20 小时前
油猴脚本实现生产环境加载本地qiankun子应用
前端·架构
从前慢丶20 小时前
前端交互规范(Web 端)
前端
像我这样帅的人丶你还20 小时前
别再让JS耽误你进步了。
css·vue.js
@yanyu66620 小时前
07-引入element布局及spring boot完善后端
javascript·vue.js·spring boot
CHU72903521 小时前
便捷约玩,沉浸推理:线上剧本杀APP功能版块设计详解
前端·小程序
GISer_Jing21 小时前
Page-agent MCP结构
前端·人工智能
王霸天21 小时前
💥别再抄网上的Scale缩放代码了!50行源码教你写一个永不翻车的大屏适配
前端·vue.js·数据可视化
小领航21 小时前
用 Three.js + Vue 3 打造炫酷的 3D 行政地图可视化组件
前端·github
@大迁世界21 小时前
2026年React大洗牌:React Hooks 将迎来重大升级
前端·javascript·react.js·前端框架·ecmascript