Flask+LayUI开发手记(六):树型表格的增删改查

       树型表格的增删改查功能与数据表格的是完全一致,就是调用layui-form表单组件实现数据输入再提交,比较大的区别是树型节点的编辑,都需要有上级节点的输入,而这个上级节点的展示,必须是以树型方式展示出来。当然,树型也有多种模式展示,比如最简单,仍然是select选项域,只是选项用一些特征字符作为前缀,以显示出树型的错落出来。而复杂的展示模式,就是用真正的树型组件来展示,而layui也正好提供了树型组件Tree。

       所以,本节树型表格的编辑功能重点还是介绍级节点树型输入域的构建过程,我构建是一个组合的输入,即一个基本的select选项树型和一个通过按钮点开的Tree组件树型。

       程序主要包括四个部分,前端列表实现编辑页面展示、表单编辑页面、后端数据提取及编辑处理服务程序和树型数据生成程序。

       第一个是上一节树型列表的表头工具栏和行内工具栏的具体处理程序,内容如下。这部分程序与数据列表的处理没有区别,不再详述。

<script>
layui.use(['jquery','layer','treeTable'], function(){var $=layui.jquery,layer=layui.layer,table=layui.treeTable;var cur_row = null;var url_tree = '{{url_for("sysadm.branch_list")}}';var url_edit = '{{url_for("sysadm.branch_edit")}}';table.render({elem: '#table_tree',height: 'full',url: url_tree,toolbar: '#toolBar',method: 'POST',page: false,limits: [13, 26, 39, 52, 65]           ,limit : 13 ,even : true,size : 'sm' ,cols: [[ { type: 'checkbox', fixed: 'left' },{field: 'id', title: 'ID', width:40, sort: true, fixed: 'left'},{field: 'name', title: '机构名称', width:140},{field: 'parent_id', title: 'PID', width:40, sort: true},{field: 'short_name', title: '简称', width:80},{field: 'branch_cd', title: '编码', width:60},{field: 'status_name', title: '状态', width:60},{field: 'category_name', title: '业务条线', width: 100},{field: 'type_name', title: '机构类型', width: 100},{field: 'regtime', title: '注册时间', width: 140},{fixed: 'right', width:200, align:'center', toolbar: '#linetoolBar'}]],done: function () {table.expandAll('table_tree', true);}});//表头工具栏事件table.on('toolbar(table_tree)', function (obj) {switch (obj.event) {case 'search':tree_refresh(1);break;case 'add':cur_row=null;tree_edit('add','新增机构节点',0);break;case 'mdel':tree_mdelete(1)break;};});//table行内工具栏事件table.on('tool(table_tree)', function (obj) {    //obj是指这张表中的数据,将表中选中的行数据赋给cur_row变量        cur_row = obj.data;                             var rid = cur_row.id;switch(obj.event) {case 'edit':tree_edit('upd',"修改机构节点",rid);break;case 'adds':tree_edit('adds',"新增下级机构",rid);break;case 'del':if (cur_row.isParent == true) {layer.msg(cur_row.name + cur_row.id + '有子机构结点,不能删除!!');return false;}layer.confirm('确认删除吗?', {icon: 3, title:'提示'}, function(index){$.post(url_edit + '?opr=del',{id:rid},function(rs){if(rs.success){//调用查询方法刷新数据layer.msg(rs.msg,function(){});tree_refresh(1);}else{layer.msg(rs.msg,function(){});}},'json');layer.close(index);});                break;}});//弹出层显示记录编辑界面function tree_edit(opr,title,uid){layer.open({type: 2, title:title,area: ['660px', '540px'],   //宽高skin: 'layui-layer-rim',    //样式类名content:  url_edit + '?opr=' + opr + '&&id=' + uid, //编辑页面btn:['保存','关闭'],yes: function(index, layero){tree_save(layero,opr);},success: function(layero, index, that){},btn2: function(index, layero){layer.closeAll();},});}//存储表单数据function tree_save(layero,opr) {var iframeWin = window[layero.find('iframe')[0]['name']];var vform = iframeWin.layui.form;console.log('vform:' + JSON.stringify(vform));vform.submit('edit-form',function(data){console.log('data:' + JSON.stringify(data));$.post(url_edit + '?opr=' + opr,data.field,function(rs){if(rs.success){layer.closeAll();layer.msg(rs.msg,function(){});tree_refresh(1);}else{layer.msg(rs.msg,function(){});}},'json');});}function tree_mdelete(cpage) {var checkData = table.checkStatus('table_tree').data; //得到选中的数据if (checkData.length === 0) {layer.msg('请选择数据');return false;}var idArr = [];for (var i = 0; i < checkData.length; i++) {idArr.push(checkData[i].id);}layer.confirm('确认批量删除吗?', {icon: 3, title:'提示'}, function(index){$.post(url_edit + '?opr=mdel' ,{id:idArr.join(',')},function(rs){if(rs.success){tree_refresh(1);layer.msg(rs.msg);}else{layer.msg(rs.msg);}},'json');layer.close(index);});                }function tree_refresh(cpage) {table.reload('table_tree', {where: {                           'searchtext':$('#searchtext').val()},  page: { curr: cpage },},true);}});</script>

        第二部分是前端树型编辑的页面程序,包括Html+JavaScript,程序文件名为branch_edit.html.j2,主要内容如下:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>栏目编辑</title>
<link rel="stylesheet" href="/static/layui/css/layui.css"  media="all">
</head>
<style>
.layui-form-select dl{max-height:150px;
}
</style>
<body>
<div style="padding:10px;"><form class="layui-form  layui-form-pane" lay-filter="edit-form" action=""><input type="hidden" id="id" name="id"/><div class="layui-form-item" ><div class="layui-inline" style="width:70%"><label class="layui-form-label">上级机构</label><div class="layui-input-block"><select id="parent_id" name="parent_id" lay-search=""><option value="0">---请选择---</option></select></div></div><div class="layui-inline"><button id="btn_tree" type="button" class="layui-btn layui-btn-sm"><i class="layui-icon layui-icon-cols"></i>树型</button></div><div id="parent_tree" style="border:1px solid;border-color:#eee"></div></div><div class="layui-form-item"><label class="layui-form-label">机构名称</label><div class="layui-input-block"><input type="text" id="branch_name" name="branch_name" autocomplete="off" placeholder="请输入机构名称" class="layui-input"></div></div><div class="layui-form-item"><div class="layui-inline" style="width:48%"><label class="layui-form-label">机构编码</label><div class="layui-input-block" ><input type="text" id="branch_cd" name="branch_cd" autocomplete="off" placeholder="请输入机构编码" class="layui-input"></div></div><div class="layui-inline" style="width:48%"><label class="layui-form-label">机构简称</label><div class="layui-input-block" ><input type="text" id="short_name" name="short_name" autocomplete="off" placeholder="请输入机构简称" class="layui-input"></div></div></div><div class="layui-form-item"><label class="layui-form-label">办公地址</label><div class="layui-input-block"><input type="text" id="address" name="address" autocomplete="off" placeholder="请输入办公地址" class="layui-input"></div></div><div class="layui-form-item"><div class="layui-inline" style="width:48%"><label class="layui-form-label">电话</label><div class="layui-input-block" ><input type="text" id="phone" name="phone" autocomplete="off" placeholder="请输入联系电话" class="layui-input"></div></div><div class="layui-inline" style="width:48%"><label class="layui-form-label">邮箱</label><div class="layui-input-block" ><input type="text" id="email" name="email" autocomplete="off" placeholder="请输入电子邮箱" class="layui-input"></div></div></div><div class="layui-form-item"><div class="layui-inline" style="width:48%"><label class="layui-form-label">业务条线</label><div class="layui-input-block" ><select id="branch_cat" name="branch_cat"><option value="00">---请选择---</option><option value="10">10_分支机构</option><option value="20">20_管理部门</option></select></div></div><div class="layui-inline" style="width:48%"><label class="layui-form-label">机构类型</label><div class="layui-input-block" ><select id="branch_type" name="branch_type"><option value="00">---请选择---</option><option value="10">10_管理机构</option><option value="20">20_营业机构</option></select></div></div></div><div class="layui-form-item"><label class="layui-form-label">状态</label><div class="layui-input-block"><select name="status"><option value="">---请选择---</option><option value="0">0_启用</option><option value="1">1_停用</option></select></div></div></form>
</div>
<script src="/static/layui/layui.js"></script>
<script>
layui.use(['layer','form','jquery','tree'],function(){var $=layui.jquery,layer=layui.layer,form=layui.form,tree=layui.tree;initDimension();initFormData();//由UID从服务器数据库中取出数据作为原始数据function initFormData(){rscode = null;{% if rsdata %}rscode = {{ rsdata.success }};var rsmsg = '{{ rsdata.msg | safe }}';var rsdata = {{ rsdata.data | tojson}};if (rscode != null) {form.val('edit-form',$.extend({}, rsdata||{}));//将父页面传递的行数据赋值到表单中}{% endif %}}//由后台取出选项条目数据对选项进行动态刷新function initDimension() {{% if rsdim %}var opr_dim = {{ rsdim.opr_dim | safe }};var branch_tlist = {{ rsdim.branch_tlist | safe }};var branch_tree = {{ rsdim.branch_tree | safe }};var status_dim = {{ rsdim.status_dim | safe }};var category_dim = {{ rsdim.category_dim | safe }};var type_dim = {{ rsdim.type_dim | safe }};if (branch_tlist != null) set_select_tree(branch_tlist,'parent_id');if (branch_tree != null) set_tree_render(branch_tree,'parent_tree');if (status_dim != null) set_select_option(status_dim,'status');if (category_dim != null) set_select_option(category_dim,'branch_cat');if (type_dim != null) set_select_option(type_dim,'branch_type');if (opr_dim.opr_funt == 'adds') {disable_parent_tree(opr_dim.rid);}form.render('select'); {% endif %}}//设置select中的选项条目function set_select_option(select_dim,sname) {var $select = $('[name="'+ sname + '"]');$select.empty();for (var i = 0; i<select_dim.length; i++ ) {option_item = select_dim[i];$select.append($('<option>').text(option_item[0] + '_' + option_item[1]).attr('value', option_item[0]));}}//设置select中的树型选项条目function set_select_tree(select_dim,sname) {var $select = $('[name="'+ sname + '"]');$select.empty();$select.append($('<option>').text('根结点_0').attr('value', 0));for (var i = 0; i<select_dim.length; i++ ) {option_item = select_dim[i];let level = option_item[3];let lstr ='├' + '─'.repeat(level)$select.append($('<option>').text(lstr + option_item[1] + '_' + option_item[0]).attr('value', option_item[0]));}}//绑定树型展开按钮的点击事件$('#btn_tree').click(function(){pt_elem = $('#parent_tree');if (pt_elem.is(":hidden"))pt_elem.show();elsept_elem.hide()});//渲染树型组件function set_tree_render(itree,ielem) {//console.log('tree:' + JSON.stringify(itree));tree.render({elem: '#'+ielem,data: itree,onlyIconControl: true,  // 是否仅允许节点左侧图标控制展开收缩size : 'sm',click: function(obj){//layer.msg(JSON.stringify(obj.data));$('#parent_id').val(obj.data.id);form.render('select'); $('#' + ielem).hide();}});$('#'+ielem).hide();}//加子节点功能时,将父节点输入域及按钮设置为不可操作function disable_parent_tree(uid) {$('#parent_id').val(uid);$('#parent_id').attr('disabled','disabled');$('#btn_tree').attr('disabled','disabled');}});</script>
</body>
</html>

       编辑页面程序需要特别说明的是上级机构输入域的构成,前面说了,这是一个输入组合,可以通过普通select选项域选择机构,也可以展开layui-Tree树型,点击相应机构分支。

       普通select选择输入域如下图所示,在前端选项初始化时,添加了所有选项的前置字符,以展现出树型的样式来,而实质仍然是select选择域。

       机构条目可能很多,所以,建议在select定义中加入lay-search="",这样普通选项树型不但可以进行选择标准操作,还可以在选项里输入关键字进行检索匹配操作,以快速确定机构选项。

       layui-Tree树型在初始状态是隐藏的,通过点击树型button可以展现出来,然后可以进行树型展开操作,并点击相应的机构条目选定机构,点击条目后树型自动关闭。再次展现需要再次点击树型button。

        对于单选树型来说,加入layui-Tree展示只是提供更友好的界面。不过,如果是在树型里多选的话,普通select选项域是无法满足要求的,必须用加checkbox的树型才能实现这个功能。而layui-Tree组件无论是多选还是单选都能支持。多选树型的数据准备和控制比单选树型要复杂一些,但单选树型通了,多选也基本没啥难度,大家可以自己研究一下。       

       页面的JavaScript部分主要包括表单数据的初始化、表单选项域和树型的初始化,上述初始化所要求的数据都是由后端服务程序提供的,处理过程也与数据表格dataTalbe的处理类似。需要特殊说明的是disable_parent_tree(),这个函数是为增加子节点的功能而设置的,增加子节点功能要求上级机构是固定的值,不能改变。所以用disable_parent_tree()将相应的选择域和button都置成不能操作。

        第三部分是后端服务处理程序,内容如下:

#机构信息编辑
@bp.route('/branch_edit/',methods=['GET','POST'])
@login_required
#@admin_auth
def branch_edit():if request.method == 'GET':opr = request.values.get('opr')if opr == None:opr = 'upd'rid= request.values.get('id')if rid == None:rid = 0branchTree = Branch_Tree()udim = {'opr_dim' : json.dumps({'opr_funt':opr,'rid':rid}),'branch_tlist': json.dumps(branchTree.get_tlist()),'branch_tree' : json.dumps(branchTree.get_tree()),'status_dim' : json.dumps(Branch_Status().get_list()),'category_dim' : json.dumps(Branch_Category().get_list()),'type_dim' : json.dumps(Branch_Type().get_list()),}if opr != 'upd':return render_template('admin/branch_edit.html.j2',rsdim=udim)else:irow = db.session.query(Branchs).filter_by(id=rid).first()udata = dict(id=irow.id,branch_name=irow.branch_name,parent_id=irow.parent_id,short_name= irow.short_name,branch_cd=irow.branch_cd,email=irow.email,phone=irow.phone,address=irow.address,branch_cat=irow.branch_cat,branch_type=irow.branch_type,status=irow.status)rsdata = {"success": 1,"msg": "取机构数据成功","data":udata}return render_template('admin/branch_edit.html.j2',rsdim=udim,rsdata=rsdata)else :opr = request.values.get('opr')rid = request.values.get('id')try :if opr == 'add' or opr == 'adds':rs_data = branch_add()elif opr == 'upd' :rs_data = branch_update(rid)elif opr == 'del' :rs_data = branch_delete(rid)elif opr == 'mdel':rs_data = branch_mdelete(rid)else :rs_data = {'success':0,'msg':'错误的操作码' + opr,'status':200}except SQLAlchemyError as e:db.session.rollback()rs_data = {'success':0,'msg':'更新机构数据错误:' + str(e.orig),'status':200} if rs_data.get('success') == 1:Branch_Tree.init_dim()return json.dumps(rs_data)#新增机构    
def branch_add():logging.debug('Add Branch....')parent_id = request.values.get('parent_id')branch_cd = request.values.get('branch_cd')branch_cat = request.values.get('branch_cat')branch_type = request.values.get('branch_type')branch_name = request.values.get('branch_name')short_name = request.values.get('short_name')email = request.values.get('email')phone = request.values.get('phone')address = request.values.get('address')status = request.values.get('status')rowadd = Branchs( branch_name=branch_name,parent_id=parent_id,short_name= short_name,branch_cd=branch_cd,email=email,phone=phone,address=address,branch_cat=branch_cat,branch_type=branch_type,status=status)db.session.add(rowadd)db.session.commit()rs_data = {'success':1,'msg':'增加机构成功' + branch_cd + branch_name,'status':200}return rs_data#修改机构
def branch_update(uid):logging.debug('update Branch %s....' % uid)irow = db.session.query(Branchs).filter_by(id=uid).first()irow.parent_id = request.values.get('parent_id')irow.branch_cd = request.values.get('branch_cd')irow.branch_cat = request.values.get('branch_cat')irow.branch_type = request.values.get('branch_type')irow.branch_name = request.values.get('branch_name')irow.short_name = request.values.get('short_name')irow.email = request.values.get('email')irow.phone = request.values.get('phone')irow.address = request.values.get('address')irow.status = request.values.get('status')db.session.commit()rs_data = {'success':1,'msg':'修改机构信息成功','status':200}return rs_data#删除机构--设置status标志为'9'
def branch_delete(uid):logging.debug('Branch delete ' + uid)irow = db.session.query(Branchs).filter_by(id=uid).first()db.session.delete(irow)db.session.commit()rs_data = {'success':1,'msg':'删除机构成功' + uid,'status':200}return rs_data#批量删除机构
def branch_mdelete(ridstr):logging.debug('Branch muli delete ' + ridstr)ridlist = list(map(int,ridstr.split(',')))rows = db.session.query(Branchs).filter(Branchs.id.in_(ridlist)).all()for irow in rows:db.session.delete(irow)db.session.commit()rs_data = {'success':1,'msg':'删除机构列表成功' + ridstr,'status':200}return rs_data

       后端数据获取和处理服务程序的路由命名为'/branch_edit/'。分为get和post两部分。

       get部分是为编辑表单提供初始化数据的,提供的数据主要包括表单初值数据和表单选项数据两部。由于树型表单的特殊要求,服务程序将操作方式也表单选项数据下传,以便表单能够针对操作做特殊处理。

       post部分是对数据增删改等操作进行统一的处理,需要特别说明的是在编辑功能完成后加了Branch_Tree.init_dim(),这是为了在修改机构数据后可以同步机构树型的数据,相应的数据处理是第四部分的内容。

       第四部分是机构树型构建及树型选项列表以及Layui-Tree树型的数据生成程序,内容如下 :

#############机构树型维表处理
class Branch_Tree(Tree_Dimension):dim_dict = Nonedef __init__(self) :if self.dim_dict == None:self.dim_dict = current_app.config.get('BRANCH_DIM')if self.dim_dict ==None :self.dim_dict = Branch_Tree.init_dim()#初始化dim_dict变量 @staticmethoddef init_dim():logging.debug('Initial Branch dim....')rows = db.session.query(Branchs).filter_by(status=0).order_by(Branchs.id.desc()).all()rows_info = {}for irow in rows:rows_info[irow.id] = dict(name=irow.short_name,pid=irow.parent_id)current_app.config['BRANCH_DIM'] = rows_inforeturn rows_infoclass Tree_Dimension(object) :dim_dict = {}# 初始化方法def __init__(self,v_dim=None):# 实例属性if v_dim :#logging.debug('dimention %s' % str(v_dim))self.dim_dict = v_dimdef get_name(self,id) :return self.dim_dict.get(id).get('name')def get_list(self) :auth_list = []for (k,v) in self.dim_dict.items():auth_item = [k,v['name'],v['pid'],0]auth_list.append(auth_item)return sorted(auth_list)def id_format(self,id):idname = self.dim_dict.get(id).get('name')if isinstance(id, str) :return id + '_' + idnameelse :return str(id) + '_' + idname#为普通select输入域构建选项列表def get_tlist(self) :auth_dim = self.get_list()auth_tlist = self.build_tlist(auth_dim,0,0)return auth_tlistdef build_tlist(self,tlist,p_id,level):treelist = []for row in tlist:if row[2] != p_id:continuerow[3] = leveltreelist.append(row)treechild = self.build_tlist(tlist, row[0], level+1)if treechild:treelist.extend(treechild)return treelist#为LayUI Tree 生成数据def get_tree(self) :auth_dim = self.get_list()auth_tree = self.build_tree(auth_dim,0,0)return auth_treedef build_tree(self,data,p_id,level=0):tree = []row = {}for item in data:if item[2] ==p_id:row = dict(id = item[0], title= item[1] + '_' + str(item[0]), parent_id=item[2],level= level)child = self.build_tree(data, row['id'], level+1)row['children'] = []if child:row['children'] += childtree.append(row)return tree

       树型选项采用了类方式来构建,tree_dimension是树型基础类,构建了一组功能函数,包括取树型节点的名称、取树型数据节点的条目。get_tlist用于构建普通选择域的选项列表,get_tree用于构建Layui-Tree组件所需要的数据。

       通过上面几部分的程序,一个基本的树型表单编辑功能就完成了,主要的界面如下:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

语音控制开关的语音识别ic芯片方案

语音控制开关是一种基于语音识别技术的设备&#xff0c;它通过内置的语音识别芯片&#xff0c;将用户的语音指令转化为电信号&#xff0c;从而实现对设备的控制。例如在智能家居设备上的应用&#xff0c;通常需要连接到家庭的Wi-Fi网络上&#xff0c;以便与智能手机或智能音箱等…

golang RSA 解密前端jsencrypt发送的数据时异常 crypto/rsa: decryption error 解决方法

golang中 RSA解密前端&#xff08;jsencrypt&#xff09;发来的密文后出现 "crypto/rsa: decryption error" &#xff0c; 这个问题首先需要确认你的私匙和公匙是否匹配&#xff0c; 如果匹配 那检查入参数据类型&#xff0c; 前端发送来的rsa加密后的数据一般都是…

bbr 随机 phase 的麻烦与 inflight 守恒算法的动机

bbr 有个要点&#xff0c;要把 probebw 的 phase 错开&#xff1a; static void bbr_reset_probe_bw_mode(struct sock *sk) {struct bbr *bbr inet_csk_ca(sk);bbr->mode BBR_PROBE_BW;bbr->cycle_idx CYCLE_LEN - 1 - prandom_u32_max(bbr_cycle_rand);bbr_advance…

Java项目:基于SpringBoot+mysql在线拍卖系统(含源码+数据库+答辩PPT+毕业论文)

一、项目简介 本项目是一套基于SSM框架mysql在线拍卖系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能齐全、…

Java 面试题:HTTP版本演变--xunznux

文章目录 HTTP版本演变HTTP/0.9HTTP/1.0HTTP/1.1新引入&#xff1a;问题&#xff1a;长连接是什么&#xff1a;管道网络传输&#xff1a;队头阻塞是什么&#xff1f;解决http队头阻塞的方法&#xff1a;HTTP1.1常见性能问题为解决HTTP1.1性能问题而提出的常见优化手段 HTTP/21、…

【河北航空-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

RS485与USB3.1电路

USB2.0最高也就480M&#xff0c;而USB3.0轻松到达5Gbps&#xff1a; DTU远程控制&#xff1a; DTU&#xff08;数据传输单元&#xff09;通常用于将数据从现场设备传输到远程服务器&#xff0c;常用于物联网、工业控制、远程监控等场景。它可以通过GPRS/4G、Wi-Fi、以太网等方…

Python网络爬虫模拟登录与验证解析

内容导读 使用Selenium模拟登录 使用Cookies登录网站 模拟表单登录网站 爬虫识别简单的验证码 实例解析 一、使用Selenium模拟登录 1、为什么要模拟登录 在互联网上存在大量需要登录才能访问的网站&#xff0c;要爬取这些网站&#xff0c;就需要学习爬虫的模拟登录。对…

TC-RAG: Turing-Complete RAG--图灵完备的检索增强

摘要&#xff1a; 在提升领域特定的大语言模型&#xff08;LLMs&#xff09;的方法中&#xff0c;检索增强生成&#xff08;RAG&#xff09;技术作为一种有前景的解决方案&#xff0c;可以缓解诸如幻觉、知识过时以及在高度专业化查询中专业知识有限等问题。然而&#xff0c;现…

WPF- vs中的WPF应用项目模板 如何自己实现

读书笔记 1. 单个 c#文件的 空白window应用程序 (只展示了一个button按钮) 2.C#文件 和xml文件 的空白window程序 .xml文件作为程序的资源 (只一个button按钮) 3. xmal和c#共同编译 形如使用VS 创建WPF应用项目模板 1.新建一个wpf空白项目 ,添加一个主c#文件 和xaml文件(属…

【C++ Primer Plus习题】7.2

问题: 解答: #include <iostream> using namespace std;#define MAX 10int input(float* grade, int len) {int i 0;for (i 0; i < len; i){cout << "请输入第" << i 1 << "个高尔夫成绩(按0结束):";cin >> grade[i]…

【二叉树进阶】--- 前中后序遍历非递归

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Journey 本篇博客我们将来了解有关二叉树前中后序遍历的非递归版本。 &#x1f3e0; 前序遍历 要迭代非递归实现二叉树的前序遍历&#xff0c;首先还…

【Android】MotionLayout实现动画效果

【Android】MotionLayout实现开场动画 在移动应用开发中&#xff0c;动画不仅仅是美化界面的工具&#xff0c;它更是提升用户体验的关键手段。Android 平台一直以来都提供了丰富的动画框架&#xff0c;但随着应用复杂性的增加&#xff0c;开发者对动画的需求也变得更加复杂和多…

如何通过WinRAR软件有效禁止RAR压缩包内文件的修改

RAR压缩包作为一种广泛使用的文件格式&#xff0c;凭借其高压缩比和强大的功能&#xff0c;成为了许多用户保存和传输文件的首选。然而&#xff0c;在某些情况下&#xff0c;我们可能希望确保RAR压缩包内的文件不被随意修改或删除&#xff0c;以维护文件的安全性和完整性。本文…

【网络】数据链路层-MAC帧

数据链路层-以太网与ARP协议 文章目录 1.数据链路层2.以太网2.1什么是以太网2.2MAC帧格式 3.ARP协议3.1为什么有ARP协议&#xff1f;3.2ARP的定位3.3ARP协议工作流程3.4ARP数据格式 4.RARP协议 1.数据链路层 数据链路层是网络协议栈中最底层的内容&#xff0c;而在之前对其他…

恶劣天气下的目标检测新突破:多尺度退化建模与特征融合策略

更多优质内容&#xff0c;请关注公众号&#xff1a;智驾机器人技术前线 1.论文信息 论文标题&#xff1a;Degradation Modeling for Restoration-enhanced Object Detection in Adverse Weather Scenes 作者&#xff1a;Xiaofeng Wang, Xiao Liu, Hong Yang, Zhengyong Wang, …

阿里PAI-ChatLearn:大规模 Alignment高效训练框架正式开源

导读 ChatGPT是OpenAI开发的基于大型语言模型(LLM)的聊天机器人&#xff0c;以其令人惊叹的对话能力而迅速火爆并被广泛采用。ChatGPT 成功背后得益于大型语言模型生成领域的新训练范式&#xff1a;RLHF (Reinforcement Learning from Human Feedback)&#xff0c;即以强化学习…

PTA L1-028 判断素数

L1-028 判断素数&#xff08;10分&#xff09; 本题的目标很简单&#xff0c;就是判断一个给定的正整数是否素数。 输入格式&#xff1a; 输入在第一行给出一个正整数N&#xff08;≤ 10&#xff09;&#xff0c;随后N行&#xff0c;每行给出一个小于的需要判断的正整数。 …

利用clip模型实现text2draw

参考论文 实践 有数据增强的代码 import math import collections import CLIP_.clip as clip import torch import torch.nn as nn from torchvision import models, transforms import numpy as np import webp from PIL import Image import skimage import torchvision …

滚柱导轨:数控机床高效运行的驱动力

机床制造者最关心的莫过于机床的精度&#xff0c;刚性和使用寿命&#xff0c;对导轨系统的关注甚少。但导轨为机床功能的实现奠定了可靠的基础&#xff0c;各种类型的机床工作部件&#xff0c;都是利用控制轴在指定的导轨上运动。机床设计者根据机床的类型和用途选用各种不同形…