fastadmin 各种开发技巧,问题总合集,持续跟新中....

使用

搜索的使用

自定义按钮

在这里插入图片描述

在这里插入图片描述
需改后的代码
在这里插入图片描述
在这里插入图片描述

  {
   
                            field: 'operate', title: __('Operate'), table: table,
                            buttons: [
                                {
   name: 'detail', text: '详情', title: '详情', icon: 'fa fa-list', classname: 'btn btn-xs btn-primary btn-dialog', url: 'version/detail'},
                                {
   name: 'edit', text: '编辑我', title: '编辑我', icon: 'fa fa-list', classname: 'btn btn-xs btn-primary btn-dialog', url: 'version/edit'}
                            ],
                            events: Table.api.events.operate, formatter: Table.api.formatter.operate
                        }

下面简单介绍一下几个配置的含义
name:唯一标识,其中index/add/edit/del/multi/dragsort这几个框架已经暂用,如果使用将会覆盖已有属性
text:按钮上的文本,可以为空时,为空时按钮将不显示文字信息,为空时最好配置上icon的值
title:按钮的标题信息,当鼠标移到上面时显示的文字,同时作为dialog弹出窗时的标题信息
icon:按钮上的按钮信息,可使用Font-awesome的按钮,当text为空时请务必填写该值
classname:按钮的class标签的值,建议btn btn-xs为必选,这样可以和其它按钮更加协调搭配,可搭配用的按钮颜色有btn-primary、btn-success、btn-danger、btn-warning,还有额外的功能class如btn-dialog、btn-addtabs、btn-ajax,下面会详细介绍。
url : 按钮点击后跳转的链接,可选且可使用相对链接。为空时按钮的链接为javascript:;
dropdown:按钮分组名称,用于将按钮分组下拉
refresh:是否在执行完事件后刷新列表,常配合classname:'btn-ajax’使用
confirm:提示确认信息,常配合classname属性为btn-ajax、btn-dialog、btn-addtabs使用
extend:扩展属性,用于扩展按钮的自定义属性
hidden:控制按钮是否隐藏属性,支持function
visible:控制按钮是否显示属性,支持function
disable:控制按钮是否禁用属性,支持function

自定义按钮完整代码

 {
   
    field: 'buttons',
    width: "120px",
    title: __('按钮组'),
    table: table,
    events: Table.api.events.operate,
    buttons: [
        {
   
            name: 'detail',
            text: __('弹出窗口打开'),
            title: __('弹出窗口打开'),
            classname: 'btn btn-xs btn-primary btn-dialog',
            icon: 'fa fa-list',
            url: 'example/bootstraptable/detail',
            callback: function (data) {
   
                Layer.alert("接收到回传数据:" + JSON.stringify(data), {
   title: "回传数据"});
            },
            visible: function (row) {
   
                //返回true时按钮显示,返回false隐藏
                return true;
            }
        },
        {
   
            name: 'ajax',
            text: __('发送Ajax'),
            title: __('发送Ajax'),
            classname: 'btn btn-xs btn-success btn-magic btn-ajax',
            icon: 'fa fa-magic',
            url: 'example/bootstraptable/detail',
            confirm: '确认发送',
            success: function (data, ret) {
   
                Layer.alert(ret.msg + ",返回数据:" + JSON.stringify(data));
                //如果需要阻止成功提示,则必须使用return false;
                //return false;
            },
            error: function (data, ret) {
   
                console.log(data, ret);
                Layer.alert(ret.msg);
                return false;
            }
        },
        {
   
            name: 'addtabs',
            text: __('新选项卡中打开'),
            title: __('新选项卡中打开'),
            classname: 'btn btn-xs btn-warning btn-addtabs',
            icon: 'fa fa-folder-o',
            url: 'example/bootstraptable/detail'
        }
    ],
    formatter: Table.api.formatter.buttons
}

按钮对应的参数有

参数 说明
name 按钮唯一标识,其中add/edit/del/dragsort已经被占用,如果使用将覆盖相应的按钮配置。如果需要按钮按钮显示,我们可以在HTML视图文件的table添加data-buttons-标识来根据权限控制显示
text 按钮的文本内容,如果不需要显示文本可忽略,支持function和string类型
title 鼠标移上去的标题或弹窗/选项显示的标题,支持function和string类型
icon 按钮的图标,请使用font-awesome图标库,比如 fa fa-home
classname 按钮的class, 其中classname中的btn-dialog、btn-ajax、btn-addtabs、btn-click,FastAdmin已经为这几个固定的Class注册了事件,所以可以直接使用,如果想要实现其它功能,需要自己手动编写代码绑定事件才可使用。
url 按钮的链接/Ajax事件请求的URL/弹窗链接/选项卡链接,直接function和string类型,此链接会自动在链接后添加ids/{ids},{ids}为当行主键ID,如果需要传递其它字段值,请在URL中使用{字段名}占位即可
refresh 自动刷新,只针对btn-ajax事件且不存在success回调
confirm 确认框提示文字,配置后会在确认操作再执行对应的事件,只针对btn-ajax/btn-dialog/btn-addtabs事件
success 事件成功的回调,只针对btn-ajax事件
error 事件失败的回调,只针对btn-ajax事件
callback 弹窗回传的回调,只针对btn-dialog事件,需要在对应打开的页面中使用Fast.api.close(data);进行回传数据
hidden 是否隐藏按钮,按钮默认显示,支持function和bool类型
visible 是否显示按钮,按钮默认显示,支持function和bool类型
disable 是否禁用按钮,按钮默认不禁用,支持function和bool类型
click 当classname包含btn-click时的点击回调事件
extend 按钮扩展信息,可以任意定制按钮的参数,比如我们想在新窗口中打开链接,则配置extend:’ target=“_blank”'即可
dropdown 下拉列表分组的名称,当多个按钮需要显示为一级时,该值为显示的文字

功能Class

btn-dialog : 点击按钮后将会以弹窗的形式打开url这个链接
在这里插入图片描述

btn-addtabs : 点击按钮后将会在顶部选项卡中新增一个选项卡并跳转
在这里插入图片描述
控制器
在这里插入图片描述
点击显示
在这里插入图片描述

btn-ajax : 点击按钮后将会发起一个Ajax请求
在这里插入图片描述

在这里插入图片描述

给按钮添加权限

默认已给的权限

<table id="table" class="table table-striped table-bordered table-hover" 
       data-operate-edit="{:$auth->check('page/edit')}" 
       data-operate-del="{:$auth->check('page/del')}" 
       width="100%">
</table>

如果我给detail添加权限

<table id="table" class="table table-striped table-bordered table-hover" 
       data-operate-edit="{:$auth->check('page/edit')}" 
       data-operate-del="{:$auth->check('page/del')}" 
       data-operate-detail="{:$auth->check('page/detail')}" 
       width="100%">
</table>

或者,给自定义添加权限

             {
   
                            field: 'operate', title: __('Operate'), table: table,
                            buttons: [
                                {
   name: 'detail', text: '详情', title: '详情', icon: 'fa fa-list', classname: 'btn btn-xs btn-primary btn-addtabs', url: 'version/detail?row=111'},

                                {
   name: 'edit', text: '编辑我', title: '编辑我', icon: 'fa fa-list', classname: 'btn btn-xs btn-primary btn-dialog', url: 'version/edit'},

                                {
   name: 'ajax', text: 'ajax请求', title: 'ajax请求', icon: 'fa fa-list', classname: 'btn btn-xs btn-primary btn-ajax', url: 'version/detail?row=111'}
                            ],
                            events: Table.api.events.operate, formatter: Table.api.formatter.operate
                        }

给自定义按钮添加权限

  1. 后台添加相应的菜单规则
    在这里插入图片描述
    2 .给其相应的权限或不给他权限
    在这里插入图片描述
  2. 显示效果
    没有权限
    在这里插入图片描述
    给权限后
    在这里插入图片描述

动态渲染统计信息

在这里插入图片描述

        <a href="javascript:;" class="btn btn-default" style="font-size:14px;color:dodgerblue;">
            <i class="fa fa-dollar"></i>
            <span class="extend">
        金额:<span id="money">0</span>
        单价:<span id="price">0</span>
        </span>
        </a>

下面的代码与 table.bootstrapTable({...})同级


            //当表格数据加载完成时
            table.on('load-success.bs.table', function (e, data) {
   
                //这里可以获取从服务端获取的JSON数据
                console.log(data);
                // 初始化money和price的和为0
                let totalMoney = 0;
                let totalPrice = 0;

                // 遍历rows数组
                data.rows.forEach(row => {
   
                    // 将money和price从字符串转换为数字,并累加
                    totalMoney += parseFloat(row.money);
                    totalPrice += parseFloat(row.price);
                });
                //这里我们手动设置底部的值
                $("#money").text(totalMoney);
                $("#price").text(totalPrice);
            });

结果:
在这里插入图片描述

列表上部按钮(工具栏按钮)

btn-add: 添加按钮使用
btn-edit: 编辑按钮使用
btn-del: 删除按钮使用
btn-import: 导入按钮使用
btn-more: 更多按钮使用
btn-multi: 指操作使用
btn-disabled: 添加此class后则只有在列表有选中数据时按钮才会变为可使用

 {:build_toolbar('refresh,add,edit,del')}

路径如下:
application/admin/common.php:build_toolbar
代码如下:

if (!function_exists('build_toolbar')) {
   

    /**
     * 生成表格操作按钮栏
     * @param array $btns 按钮组
     * @param array $attr 按钮属性值
     * @return string
     */
    function build_toolbar($btns = null, $attr = [])
    {
   
        $auth = \app\admin\library\Auth::instance();
        $controller = str_replace('.', '/', Loader::parseName(request()->controller()));
        $btns = $btns ? $btns : ['refresh', 'add', 'edit', 'del', 'import'];
        $btns = is_array($btns) ? $btns : explode(',', $btns);
        $index = array_search('delete', $btns);
        if ($index !== false) {
   
            $btns[$index] = 'del';
        }
        $btnAttr = [
            'refresh' => ['javascript:;', 'btn btn-primary btn-refresh', 'fa fa-refresh', '', __('Refresh')],
            'add'     => ['javascript:;', 'btn btn-success btn-add', 'fa fa-plus', __('Add'), __('Add')],
            'edit'    => ['javascript:;', 'btn btn-success btn-edit btn-disabled disabled', 'fa fa-pencil', __('Edit'), __('Edit')],
            'del'     => ['javascript:;', 'btn btn-danger btn-del btn-disabled disabled', 'fa fa-trash', __('Delete'), __('Delete')],
            'import'  => ['javascript:;', 'btn btn-info btn-import', 'fa fa-upload', __('Import'), __('Import')],
        ];
        $btnAttr = array_merge($btnAttr, $attr);
        $html = [];
        foreach ($btns as $k => $v) {
   
            //如果未定义或没有权限
            if (!isset($btnAttr[$v]) || ($v !== 'refresh' && !$auth->check("{
     $controller}/{
     $v}", $auth->id))) {
   
                continue;
            }
            list($href, $class, $icon, $text, $title) = $btnAttr[$v];
            //$extend = $v == 'import' ? 'id="btn-import-file" data-url="ajax/upload" data-mimetype="csv,xls,xlsx" data-multiple="false"' : '';
            //$html[] = '<a href="' . $href . '" class="' . $class . '" title="' . $title . '" ' . $extend . '><i class="' . $icon . '"></i> ' . $text . '</a>';
            if ($v == 'import') {
   
                $template = str_replace('/', '_', $controller);
                $download = '';
                if (file_exists("./template/{
     $template}.xlsx")) {
   
                    $download .= "<li><a href=\"/template/{
     $template}.xlsx\" target=\"_blank\">XLSX模版</a></li>";
                }
                if (file_exists("./template/{
     $template}.xls")) {
   
                    $download .= "<li><a href=\"/template/{
     $template}.xls\" target=\"_blank\">XLS模版</a></li>";
                }
                if (file_exists("./template/{
     $template}.csv")) {
   
                    $download .= empty($download) ? '' : "<li class=\"divider\"></li>";
                    $download .= "<li><a href=\"/template/{
     $template}.csv\" target=\"_blank\">CSV模版</a></li>";
                }
                $download .= empty($download) ? '' : "\n                            ";
                if (!empty($download)) {
   
                    $html[] = <<<EOT
                        <div class="btn-group">
                            <button type="button" href="{
     $href}" class="btn btn-info btn-import" title="{
     $title}" id="btn-import-file" data-url="ajax/upload" data-mimetype="csv,xls,xlsx" data-multiple="false"><i class="{
     $icon}"></i> {
     $text}</button>
                            <button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown" title="下载批量导入模版">
                                <span class="caret"></span>
                                <span class="sr-only">Toggle Dropdown</span>
                            </button>
                            <ul class="dropdown-menu" role="menu">{
     $download}</ul>
                        </div>
EOT;
                } else {
   
                    $html[] = '<a href="' . $href . '" class="' . $class . '" title="' . $title . '" id="btn-import-file" data-url="ajax/upload" data-mimetype="csv,xls,xlsx" data-multiple="false"><i class="' . $icon . '"></i> ' . $text . '</a>';
                }
            } else {
   
                $html[] = '<a href="' . $href . '" class="' . $class . '" title="' . $title . '"><i class="' . $icon . '"></i> ' . $text . '</a>';
            }
        }
        return implode(' ', $html);
    }
}

在这里插入图片描述

管理员只显示自己添加的数据

  1. 首先我们给当前控制器添加一个$dataLimit属性,如下
class Page extends Backend
{
   
    protected $model = null;
    protected $dataLimit = 'personal'; //这个属性在基类已经定义,默认为false,表示不启用,$dataLimit可使用auth和personal两个值
}

d a t a L i m i t 默认为 f a l s e ,表示不启用, dataLimit默认为false,表示不启用, dataLimit默认为false,表示不启用,dataLimit可使用auth和personal两个值,下面简单介绍一下它的意思

$dataLimit = false; //表示不启用,显示所有数据
$dataLimit = 'auth'; //表示显示当前自己和所有子级管理员的所有数据
$dataLimit = 'personal'; //表示仅显示当前自己的数据
  1. 给我们的数据表添加一个admin_id字段,类型为int(10),如果不想使用admin_id字段,我们改用adminid字段,则可以在当前控制器中定义个$dataLimitField属性,如下
class Page extends Backend
{
   
    protected $model = null;
    protected $dataLimit = 'personal'; 
    protected $dataLimitField = 'adminid';
}

自定义权限数据
如果默认的权限不符合你的要求,你可以在当前控制器自定义一个getDataLimitAdminIds的方法,该方法返回可以查看管理员数据的管理员ID集合。

protected function getDataLimitAdminIds(){
   
    $adminIds = [];//你的自定义可以查看管理员数据的管理员ID的集合
    return $adminIds;
}

注意:

一旦启用 d a t a L i m i t 功能,当前控制器的添加、编辑、删除、批量操作、 S e l e c t p a g e 都会做相应的限制和权限判断。如果你重写了 i n d e x / a d d / e d i t / d e l 等方法,需要你自己使用 dataLimit功能,当前控制器的添加、编辑、删除、批量操作、Selectpage都会做相应的限制和权限判断。 如果你重写了index/add/edit/del等方法,需要你自己使用 dataLimit功能,当前控制器的添加、编辑、删除、批量操作、Selectpage都会做相应的限制和权限判断。如果你重写了index/add/edit/del等方法,需要你自己使用adminIds = $this->getDataLimitAdminIds();来获取获取数据限制的管理员ID集合。

如何把入口文件放到根目录下

不建议这样干,因为存在安全隐患,但有时候又没有办法,只能移到根目录

  1. 将public目录下的index.php、.htaccess、admin.php、install.php、route.php文件移动到项目根目录,assets、uploads这两个文件夹务必保留在public目录中

  2. 修改index.php和admin.php中的/…/为/

  3. 修改application/extra/site.php中的cdnurl的值为/fastadmin/public,这里的/fastadmin/public视你的项目名称而修改

  4. 修改application/config.php中大概第138行__CDN__的值为/fastadmin/public,这里的/fastadmin/public视你的项目名称而修改

  5. 登录后台,在系统配置中将cdnurl的值改为/fastadmin/public,这里的修改是为了同步数据库中的配置。 完成,使用https://localhost/fastadmin试试是否可以正常访问了

通用搜索

约定大于配置的思想

测试基本代码

table.bootstrapTable({
   
                url: $.fn.bootstrapTable.defaults.extend.index_url,
                sortName: 'weigh',
                columns: [
                    [
                        {
   field: 'state', checkbox: true},
                        {
   field: 'id', title: __('Id') ,operate: false},
                        {
   field: 'oldversion', title: __('Oldversion')},
                        {
   field: 'newversion', title: __('Newversion')},
                        {
   field: 'packagesize', title: __('Packagesize')},
                        {
   field: 'content', title: __('Content'), formatter: Table.api.formatter.content},
                        {
   field: 'downloadurl', title: __('Downloadurl'), formatter: Table.api.formatter.url},
                        {
   field: 'enforce', title: __('Enforce'), searchList: {
   "1":__('Yes'),"0":__('No')}, table: table, formatter: Table.api.formatter.toggle},
                        {
   field: 'createtime', title: __('Createtime'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange'},
                        {
   field: 'updatetime', title: __('Updatetime'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange'},
                        {
   field: 'weigh', title: __('Weigh')},
                        {
   field: 'status', title: __('Status'), formatter: Table.api.formatter.status},
                       /* {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}*/
                        {
   
                            field: 'operate', title: __('Operate'), table: table,
                            buttons: [
                                {
   name: 'detail', text: '详情', title: '详情', icon: 'fa fa-list', classname: 'btn btn-xs btn-primary btn-addtabs', url: 'version/detail?row=111'},

                                {
   name: 'edit', text: '编辑我', title: '编辑我', icon: 'fa fa-list', classname: "btn btn-xs btn-primary btn-dialog", url: 'version/edit'},

                                {
   name: 'ajax', text: 'ajax请求', title: 'ajax请求', icon: 'fa fa-list', classname: 'btn btn-xs btn-primary btn-ajax', url: 'version/detail?row=111'}
                            ],
                            events: Table.api.events.operate, formatter: Table.api.formatter.operate
                        }

                    ]
                ]
            });

已这个地段为例

  {
   field: 'oldversion', title: __('Oldversion')},

operate:‘=’ //用于查询时的操作符,默认为=,为false表示禁用此字段的通用搜索,支持!=、LIKE、NOT LIKE、>、<、>=<=、
FIND_IN_SET、IN、NOT IN、BETWEEN、NOT BETWEEN、RANGE、NOT RANGE、NULL、NOT NULL、false
operate:false

在这里插入图片描述

searchList: //用于渲染列表的数据,支持的格式有JSON Array、JSON Object、$.getJSON、Function

{
   field: 'enforce', title: __('Enforce'), searchList: {
   "1":__('Yes'),"0":__('No')}, table: table, formatter: Table.api.formatter.toggle},

在这里插入图片描述

addclass: //用于给input或select添加额外的class属性

{
   field: 'oldversion', title: __('Oldversion'),addclass:"newClass"},

在这里插入图片描述

type: //用于定义input文本框的类型,默认为text

{
   field: 'oldversion', title: __('Oldversion'),type:"password"},

在这里插入图片描述

data: //用于给input或select添加额外的属性
在这里插入图片描述

renderDefault: //是否根据URL中的参数填充默认值,默认为true,支持的值有false/true

在这里插入图片描述

常用配置示例如下:
//时间区间搜索
{
   field: 'createtime', title: __('Createtime'), operate: 'RANGE', addclass: 'datetimerange', formatter: Table.api.formatter.datetime},
//金额区间搜索
{
   field: 'money', title: __('Money'), operate: 'RANGE'},
//下拉列表搜索
{
   field: 'flag', title: __('Flag'), searchList: {
   "hot": __('Flag hot'), "index": __('Flag index'), "recommend": __('Flag recommend')}, operate: 'FIND_IN_SET', formatter: Table.api.formatter.label},
//动态下拉列表搜索
{
   field: 'type', title: __('Type'), searchList: $.getJSON("ajax/dynamicselect")},
//禁用通用搜索
{
   field: 'keywords', title: __('Keywords'), operate: false},

自定义搜索

searchFormTemplate: 'customformtpl'

找到 customformtplhtml模板,一般在该静态文件的index.html里
在这里插入图片描述
找到 customformtpl自定义搜索模板
application/admin/view/example/customsearch/index.html
在这里插入图片描述

<script id="customformtpl" type="text/html">
    <!--form表单必须添加form-commsearch这个类-->
    <form action="" class="form-commonsearch">
        <div style="border-radius:2px;margin-bottom:10px;background:#f5f5f5;padding:15px 20px;">
            <h4>自定义搜索表单</h4>
            <hr>
            <div class="row">
                <div class="col-xs-12 col-sm-6 col-md-3">
                    <div class="form-group">
                        <label class="control-label">ID</label>
                        <!--显式的operate操作符-->
                        <div class="input-group">
                            <div class="input-group-btn">
                                <select class="form-control operate" data-name="id" style="width:60px;">
                                    <option value="=" selected>等于</option>
                                    <option value=">">大于</option>
                                    <option value="<">小于</option>
                                </select>
                            </div>
                            <input class="form-control" type="text" name="id" placeholder="" value=""/>
                        </div>
                    </div>
                </div>
                <div class="col-xs-12 col-sm-6 col-md-3">
                    <div class="form-group">
                        <label class="control-label">标题</label>
                        <!--隐式的operate操作符,必须携带一个class为operate隐藏的文本框,且它的data-name="字段",值为操作符-->
                        <input class="operate" type="hidden" data-name="title" value="="/>
                        <div>
                        <input class="form-control" type="text" name="title" placeholder="请输入查找的标题" value=""/>
                        </div>
                    </div>
                </div>
                <div class="col-xs-12 col-sm-6 col-md-3">
                    <div class="form-group">
                        <label class="control-label">管理员ID</label>
                        <div class="row" data-toggle="cxselect" data-selects="group,admin">
                            <div class="col-xs-6">
                                <select class="group form-control" name="group"
                                        data-url="example/bootstraptable/cxselect?type=group"></select>
                            </div>
                            <div class="col-xs-6">
                                <select class="admin form-control" name="admin_id"
                                        data-url="example/bootstraptable/cxselect?type=admin"
                                        data-query-name="group_id"></select>
                            </div>
                            <input type="hidden" class="operate" data-name="admin_id" value="="/>
                        </div>
                    </div>
                </div>
                <div class="col-xs-12 col-sm-6 col-md-3">
                    <div class="form-group">
                        <label class="control-label">用户名</label>
                        <input type="hidden" class="operate" data-name="username" value="="/>
                        <div>
                            <input id="c-category_id" data-source="auth/admin/index" data-primary-key="username"
                                   data-field="username" class="form-control selectpage" name="username" type="text"
                                   value="" style="display:block;">
                        </div>
                    </div>
                </div>

                <div class=&#

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/786406.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

班级录取查询系统如何制作

在教育的长河中&#xff0c;我们每位老师都曾面临过这样一个问题&#xff1a;如何高效、准确地完成班级录取查询的任务&#xff1f;记得在以往&#xff0c;每当新学期伊始&#xff0c;我们不得不手忙脚乱地整理学生名单&#xff0c;然后逐一通知他们所在的班级。这个过程不仅耗…

【机器学习】特征选择:精炼数据,提升模型效能

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 特征选择&#xff1a;精炼数据&#xff0c;提升模型效能引言为何进行特征选择&a…

windows server安全设置,多次登录密码错误锁定

河北瑾航科技有限公司推荐&#xff0c;www.jinhangsmart.top 按快捷键【winr】&#xff0c;在【运行】框中输入“gpedit.msc”后回车。 进入【本地组策略编辑器】后&#xff0c;展开至&#xff1a;计算机配置—Windows设置—安全设置—帐户策略—帐户锁定策略。 双击右侧…

一次性语音芯片——智能家居的新兴技术

一次性语音芯片&#xff0c;作为现代智能家居技术&#xff0c;正以其魅力和性能&#xff0c;逐渐渗透到我们日常生活的每一个角落。这些小巧而强大的芯片&#xff0c;不仅为智能家居设备赋予了“说话”的能力&#xff0c;更在提升用户体验、增强设备交互性方面发挥了举足轻重的…

GITLAB配置CI教程

一、gitlab runner下载安装 1、研发网下载安装包【172.20.191.53已经安装过了&#xff0c;不用再安装了&#xff0c;可以直接到第三步】 下载gitlab安装包 wget https://packages.gitlab.com/runner/gitlab-runner/packages/fedora/32/gitlab-runner-12.1.0-1.x86_64.rpm​ …

数字力量助西部职教全面提升——唯众品牌大数据、人工智能系列产品中标甘肃庆阳职院数字经济人才培养基地!

近日&#xff0c;唯众品牌凭借在大数据和人工智能领域深耕多年的技术积累和卓越产品&#xff0c;成功中标庆阳职业技术学院全国一体化算力网络国家枢纽节点数字经济人才培养基地项目&#xff0c;标志着唯众在助力西部职业教育与数字经济融合发展的新征程上迈出了坚实的一步。 …

线程交互现象

线程交互现象 小明对自家的狗子有个规定&#xff0c;就是在狗狗还没吃完的时候&#xff0c;可以继续给他加饭 不好的解决方式 狗狗感觉一千年没吃饭了&#xff0c;狼吞虎咽起来&#xff0c;最后饭只剩下最后一点点&#xff0c;吃饭线程中使用while循环判断是否是1&#xff0c;…

ST Smart Things Sentinel:一款针对复杂IoT协议的威胁检测工具

关于ST Smart Things Sentinel ST Smart Things Sentinel&#xff0c;简称ST&#xff0c;是一款功能强大的安全工具&#xff0c;广大研究人员可以使用该工具检测物联网 (IoT) 设备使用的复杂协议中的安全威胁。 在不断发展的联网设备领域&#xff0c;ST Smart Things Sentinel…

轮转数组(反转数组)的实现,看这篇就够了!!

一&#xff1a;题目 本题用数组为1 2 3 4 5 6 7 k3 来进行举例 理想结果为&#xff1a;5 6 7 1 2 3 4 二&#xff1a;思路 第一种方法&#xff1a; 用memcpy函数来实现 第一步&#xff1a;用malloc开辟一个新数组 第二步&#xff1a;将5 6 7 放进新数组 第三步&…

【JS|第21期】JavaScript模块化:深入解析三种文件暴露方式

日期:2024年7月6日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^ 1.01365 = 37.7834;0.99365 = 0.0255 1.02365 = 1377.4083…

台灯护眼是真的吗?台灯怎么选对眼睛好?一文带你读懂!

近视问题&#xff0c;这一现代社会的“视力杀手”&#xff0c;正悄然影响着越来越多的人群&#xff0c;尤其是青少年群体。长时间面对电子屏幕和书本&#xff0c;加上不正确的用眼习惯&#xff0c;使得视力下降成为普遍现象。在此背景下&#xff0c;一款优质的护眼台灯显得尤为…

【机器学习】Exam3

线性可分logistic逻辑回归 数据集点被分为了两边&#xff0c;根据课程学会归一化函数以及梯度下降即可。 使用线性模型。 import copyimport numpy as np import pandas as pd from matplotlib import pyplot as plt#归一化函数 def sigmoid(x):return 1 / (1 np.exp(-x))# …

基于Python的51job招聘数据采集与可视化项目实践

项目背景与目标 在当今竞争激烈的就业市场中&#xff0c;深入分析招聘信息对于求职者和企业都具有重要意义。基于Python的51job招聘数据采集与可视化项目旨在通过自动化手段高效获取大量招聘信息&#xff0c;并对这些数据进行深度分析和展示。 51job作为中国领先的招聘网站&…

ALG:MODTRAN查找表参数详解(学习笔记4)

一、Modtran安装及环境配置 https://blog.csdn.net/qq_41358707/article/details/134721973 二、ALG配置更新 添加大气RTM。Settings&#xff0c;进入首选项界面&#xff0c;单击RTM选项卡以更新RTM的配置&#xff1a; 从窗口右上角的select RTM弹出菜单中选择一个大气RTM&a…

Docker Desktop如何换镜像源?

docker现在很多镜像源都出现了问题,导致无法拉取镜像,所以找到一个好的镜像源,尤为重要。 一、阿里镜像源 经过测试,目前,阿里云镜像加速地址还可以使用。如果没有阿里云账号,需要先注册一个账号。 地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 二…

【AI前沿】人工智能的历史演进

文章目录 &#x1f4d1;引言一、人工智能的起源与早期发展1.1 古代与早期的智能机器设想1.2 20世纪初期的机械计算机1.3 图灵测试与计算智能1.4 达特茅斯会议与人工智能的正式诞生 二、早期AI研究与第一次冬天2.1 早期的探索与挑战2.2 早期的专家系统2.3 第一次AI冬天 三、专家…

C++杂说- 多态和继承的知识在总结

多态 就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会 产生出不同的状态。 构成多态还有两个条件&#xff1a; 1. 必须通过基类的指针或者引用调用虚函数 2. 被调用的函数必须是虚函数&#xff0c;且派生类必须对基类的虚函数进行重写 虚…

67.SAP FICO-凭证类型学习

目录 SAP凭证类型 凭证类型的作用 - OBA7 SAP默认的凭证类型更改 FI相应事务代码默认凭证类型 - OBU1 对FB50、60、70默认凭证类型的更改 - OBZO 后勤货物移动默认凭证类型 - OMBA 发货凭证类型 收货凭证类型 自动移动凭证类型 存货盘点凭证类型 发票默认的凭证类…

vue3中使用provide跨层传值(方法)

1.使用provide inject 跨层实现 祖父组件&#xff1a; provide有两个参数&#xff0c;第一个是我们传递的key&#xff0c;第二个就是value了 孙子组件&#xff1a; const dataList inject(getDataList1)//使用inject接收 const dataList1 dataList.getDataList 页面中使…

制作问卷表单二维码的方法,扫码登记信息更快捷

为了更好地收集用户信息&#xff0c;现在很多场景下会使用生成二维码的方式&#xff0c;让用户可以扫码自行填写相关信息&#xff0c;从而提高获取信息的效率以及填写数据的便捷性。那么用于收集用户数据的表单二维码是如何生成的呢&#xff1f;其实方法很简单&#xff0c;现在…