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.rhkb.cn/news/412619.html

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

相关文章

使用facebook开源prophet模型预测上证指数etf股价

可以图个乐&#xff0c;没有那么准确&#xff0c;可能还需要更深入的研究分析 蓝线是预测的2024年的走势&#xff0c;绿线是实际走势&#xff0c;红线是历史和未来的分界线。结果上有蛮多差异的。 # 测试预测2024年 coded by luke 伊玛目的门徒 import akshare as ak impor…

信息学奥赛一本通/openjudge Crossing River

题目 一本通题目入口 openjudge题目入口 &#xff08;注&#xff1a;由于一本通题面描述的可能有些欠缺&#xff0c;所以这里的题面采用openjudge英文翻译后的题面&#xff09; 题目分析 首先我们来看样例&#xff0c;为什么样例的结果是17呢?首先观察&#xff0c;“5”和“…

GUI编程04:课堂练习及总结

本节内容视频链接&#xff1a;6、课堂练习讲解及总结_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1DJ411B75F?p6&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 根据前三节学习到的Frame、Panel、Button知识&#xff0c;画出一下窗口界面&#xff1a; 实现代码如下…

Spring Security基于token的极简示例

1 引言 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架&#xff0c;但是用起来有点复杂&#xff0c;为了便于学习理解&#xff0c;下面将用最简洁的配置和示例&#xff0c;展示整个流程。 2 代码 创建一个spring-security…

单图生成 2D 和 3D 人物,高质量图像处理模型 CharacterGen来啦!

CharacterGen引入了一个简化的生成流程和一个图像条件的多视图扩散模型。该模型有效地将输入姿态校准到规范形式&#xff0c;同时保留输入图像的关键属性&#xff0c;从而解决了多样化姿态带来的挑战。 CharacterGen的另一个核心组成部分是基于Transformer的、可泛化的稀疏视图…

kafka 入门

kafka 有分区和副本的概念&#xff0c;partition 3 表示有3个分区&#xff0c;replication 2 表示有2个副本 通过 --describe --topic test命令可以知道 test这个 主题的分区和副本情况&#xff0c;途中的replicas 表示 其他副本分区的情况&#xff0c;如第一条&#xff0c;t…

【spring】学习笔记2:sample、boot功能和组件设计

Spring自带了一个强大的Web框架,名为Spring MVC。Spring MVC的核心 是控制器(controller)的理念。控制器是处理请求并以某种方式进行信息 响应的类。在面向浏览器的应用中,控制器会填充可选的数据模型并将请求 传递给一个视图,以便于生成返回给浏览器的HTML。在pom.xml文件…

免费批量Excel文件合并、拆分软件

软件介绍 下载地址&#xff1a;https://pan.quark.cn/s/ae860a4e2ccb 1.多个XLS或XLSX格式EXCEL文件合并&#xff0c;合并后可使用数据透视表进行相关操作。 2.自动合并多个EXCEL文件的第一个工作表&#xff0c;并汇总成一张表&#xff0c;可根据所有列标题需要指定需要的列。 …

Ethernet 测试系列(1)-- 物理层测试::IOP Test::Link-up time

车载以太网物理层IOP测试&#xff0c;即互操作性测试&#xff08;Interop- erability Tests&#xff09;&#xff0c;用于验证车载以太网PHY&#xff08;通常也称为收发器&#xff09;的可靠性和检查PHY能否在给定的有限时间内建立稳定的链路;还用于车载以太网PHY的诊断&#x…

Unity编辑器扩展之Hierarchy面板扩展

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity编辑器扩展之Hierarchy面板扩展 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取&#xff…

JavaScript学习文档(11):Window对象、本地存储、数组中一些方法、学生就业统计表案例

目录 一、Window对象 1、BOM(浏览器对象模型) 2、定时器-延时函数 3、 JS执行机制 &#xff08;1&#xff09;同步任务&#xff1a; &#xff08;2&#xff09;异步任务&#xff1a; 4、location对象 &#xff08;1&#xff09;5秒钟后跳转页面 5、navigator对象 6、…

乐城堡 JoyCastle Unity岗位笔试题

1)实现 move(GameObjct gameObject, Vector3 begin, Vector3 end, float time, bool pingpong){ } 使 gameObject 在 time 秒内&#xff0c;从 begin 移动到 end&#xff0c;若 pingpong 为 true&#xff0c;则在结束时 使 gameObject 在 time 秒内从 end 移动到 begin&#xf…

FPGA上板项目(三)——RAM测试

目录 实验内容实验原理实验步骤实验用时序波形HDL 代码仿真综合实现上板测试 实验内容 对 FPGA 内部的 RAM 进行数据读写操作。 实验原理 RAM &#xff08;Random Access Memory&#xff09;&#xff0c;是可以进行数据交换的存储器&#xff0c;可读可写&#xff1b;而 ROM&…

操作系统:实验六文件操作实验

一、实验目的 1、了解文件系统功能及实现原理。 2、掌握LINUX下文件操作的有关系统调用。 3、熟悉main函数带参数运行的有关操作过程。 4、通过模拟程序实现简单的一级文件系统或二级文件系统。 二、实验内容 1、编程显示文件自身。&#xff08;1分&#xff09; #includ…

Java学习第五天

数组 数组适合做一批同类型数据的存储。 静态初始化数组&#xff1a; 注意&#xff1a;数组变量名中存储的是数组在内存中的地址&#xff0c;数组是引用类型。 数组的访问 动态初始化数组&#xff1a; 数组的遍历&#xff1a; 注意左边和右边的区别&#xff0c;一个是改变数组…

桥接与NET

仔细看看下面两幅图 net模式&#xff0c;就是在你的Windows电脑&#xff08;假设叫A电脑&#xff09;的网络基础上&#xff0c;再生成一个子网络&#xff0c;ip的前两位默认就是192.168&#xff0c;然后第三位是随机&#xff0c;第四位是自己可以手动设置的。使用这种模式唯一的…

grpc-spring 通信(选型,grpc-ecosystem/grpc-spring)

需求 需要一个在稳定网络环境里高性能且开发和部署成本较小&#xff0c;且多平台&#xff0c;且对视频传输和消息订阅和推送的支持比较好的&#xff0c; 一套环境 先说结论因为结论先得到的&#xff0c; 问AI了&#xff0c; 发现一个新东西gRPC ,看了下非常好。 再说过程&…

【2024 CCF编程能力等级认证(GESP)C++ 】一级大纲

目录 1. 背景2. 考核知识块3. 考核内容3.1 计算机基础知识3.2 集成开发环境3.3 结构化程序设计3.4 程序的基本语句3.5 程序的基本概念3.6 基本运算3.7 基本数据类型4. 考核目标5. 题型分布6. 考试时长7. 认证时间与报名8. 政策与福利9. GESP一级认证形式 1. 背景 官网&#xff…

OceanBase V4 技术解读:从Alter Table 看DDL的支持

背景 数据库类型可以划分为两大类&#xff1a;关系型数据库和非关系型数据库。而关系型数据库以表格形式进行数据组织&#xff0c;同时遵循表关系的约束&#xff0c;例如创建一张表&#xff0c;表里面包含多个列&#xff0c;不同的列可以有不同的类型。当需要改表结构&#xf…

数学建模赛前备赛——模拟退火算法

一.什么是智能优化算法 智能优化算法本质上是一个优化算法,它通过不断优化模型的参数,使得系统表现达到最优&#xff0c;常见的只能优化算法有很多&#xff0c;比如说蚁群算法,遗传算法以及我们今天的主角——模拟退火算法。 二.模拟算法的前身——爬山算法 爬山算法是一种简…