位置: IT常识 - 正文

LayUI—tree树形结构的使用解析(layui 树形)

编辑:rootadmin
这篇文章主要介绍了LayUI—tree树形结构的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 目录

推荐整理分享LayUI—tree树形结构的使用解析(layui 树形),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:layui tree数据结构,layui 树形,layui 树形,layui 树形,layui tree数据结构,layui 树形,layui树形结构,layui树形结构,内容如对您有帮助,希望把文章链接给更多的朋友!

先看一下显示的效果图案例对应的实体类Dept完整代码如下

树形结构在实际开发中很长用到,比如部门管理,权限菜单等。因为用树形结构来展示会显的很清晰明了。

最近写了一个个人博客小项目中用到了LayUI的树形结构,之后写了一个小案例整理一下。

先看一下显示的效果图

点击节点右面会显示对应部门的详情信息,可以修改。可以自定义按钮添加部门,也可以直接用自带的方法对部门进行新增,修改和删除。可以获取选中的节点,根据项目需求(有的需要选中保存)。

先需要引入LayUI的样式文件JS和CSS。

案例对应的实体类Dept@Entitypublic class Dept {private Integer id;private String name; //部门名称private String deptName; //部门负责人private String phone; //电话号private String number; //编号private double idx; //排序@JsonIgnoreprivate Dept parent;@JsonIgnoreprivate List<Dept> children = new ArrayList<>();@Id@GeneratedValuepublic Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDeptName() {return deptName;}public void setDeptName(String deptName) {this.deptName = deptName;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public double getIdx() {return idx;}public void setIdx(double idx) {this.idx = idx;}@ManyToOne@CreatedBypublic Dept getParent() {return parent;}public void setParent(Dept parent) {this.parent = parent;}@OneToMany(cascade=CascadeType.ALL,mappedBy="parent")@OrderBy(value="idx")public List<Dept> getChildren() {return children;}public void setChildren(List<Dept> children) {this.children = children;}public Dept(Integer id, String name, String deptName, String phone, String number, double idx, Dept parent, List<Dept> children) {this.id = id;this.name = name;this.deptName = deptName;this.phone = phone;this.number = number;this.idx = idx;this.parent = parent;this.children = children;}public Dept(Integer id) {this.id = id;}public Dept() {}}

显示LayUI树形菜单,只需要一个标签容器即可。

<div id="dept_tree"></div>

在案例中还有一些其他样式,比如右边的详情信息,新增按钮等。

完整代码如下<style type="text/css">#dept_main, #dept_particulars{width: 48.5%;display: inline-block;vertical-align: top;padding: 20px;background: white;box-sizing: border-box;}#dept_tree{margin-top: 20px;}</style><div id="dept_main"><fieldset class="layui-elem-field layui-field-title"><legend>所有部门</legend></fieldset><button class="layui-btn layui-btn-sm layui-btn-radius layui-btn-normal" lay-demo="addDept"><i class="layui-icon">&#xe654;</i>添加部门</button><button class="layui-btn layui-btn-sm layui-btn-radius layui-btn-normal" lay-demo="gain">获取选中节点</button><div id="dept_tree"></div></div><div id="dept_particulars"><fieldset class="layui-elem-field layui-field-title"><legend>部门详情</legend></fieldset><div id="dept_home"><div class="layui-tree-emptyText">无数据</div></div></div>

JS请求数据渲染页面代码,data为请求数据源,当时直接放入的请求链接,好像不行,所以之后才写了一个方法去请求数据源。

layui.use(['tree', 'util'], function() {var tree = layui.tree;var util = layui.util;tree.render({elem: '#dept_tree',data: getData(),id: 'treeId',showCheckbox: true, //是否显示复选框onlyIconControl: true});});function getData(){var data = [];$.ajax({url: "dept/treeload", //后台数据请求地址type: "post",async:false,success: function(resut){data = resut;}});return data;}

tree 组件提供的有以下基础参数,可根据需要进行相应的设置。

参数选项说明类型示例值elem指向容器选择器String/Object-data数据源Array-id设定实例唯一索引,用于基础方法传参使用。String-showCheckbox是否显示复选框Booleanfalseedit是否开启节点的操作图标。默认 false。

若为 true,则默认显示“改删”图标若为 数组,则可自由配置操作图标的显示状态和顺序,目前支持的操作图标有:add、update、del,如:edit: ['add', 'update', 'del']Boolean/Array['update', 'del']accordion是否开启手风琴模式,默认 falseBooleanfalseonlyIconControl是否仅允许节点左侧图标控制展开收缩。默认 false(即点击节点本身也可控制)。若为 true,则只能通过节点左侧图标来展开收缩BooleanfalseisJump是否允许点击节点时弹出新窗口跳转。默认 false,若开启,需在节点数据中设定 link 参数(值为 url 格式)BooleanfalseshowLine是否开启连接线。默认 true,若设为 false,则节点左侧出现三角图标。Booleantruetext自定义各类默认文本,目前支持以下设定:

text: {

defaultNodeName: '未命名' //节点默认名称

,none: '无数据' //数据为空时的提示文本

}

Object-

因为tree指定了json数据的键名称,所以后台传递过来的数据对应的键名不一样时需要做一下处理,或者实体类中的属性名就和tree的JSON数据的键名称一样。

键名:

属性选项说明类型示例值title节点标题String未命名id节点唯一索引,用于对指定节点进行各类操作String/Number任意唯一的字符或数字children子节点。支持设定选项同父节点Array[{title: '子节点1', id: '111'}]href点击节点弹出新窗口对应的 url。需开启 isJump 参数String任意 URLspread节点是否初始展开,默认 falseBooleantruechecked节点是否初始为选中状态(如果开启复选框的话),默认 falseBooleantruedisabled节点是否为禁用状态。默认 falseBooleanfalse

后台请求数据的方法。

@RequestMapping(value = "/treeload")@ResponseBodypublic Object treeload(){Sort sort = Sort.by("idx");List<Dept> dpet = deptService.findByParentIsNull(sort); //查找所有菜单List<HashMap<String, Object>> result = new ArrayList<>(); //定义一个map处理json键名问题return fun(dpet, result);}private Object fun(List<Dept> dpet, List<HashMap<String, Object>> result) {for(Dept d : dpet){HashMap<String, Object> map = new HashMap<>();map.put("id", d.getId());map.put("title", d.getName());map.put("spread", true); //设置是否展开List<HashMap<String, Object>> result1 = new ArrayList<>();List<Dept> children = d.getChildren(); //下级菜单//这里可以根据自己需求判断节点默认选中/*if(m.getParent() != null || m.getChildren().size() == 0){map.put("checked", true); //设置为选中状态}*/map.put("children", fun(children, result1));result.add(map);}return result;}

因为这里新建的实体类字段名和tree指定了json数据的键名称不一样,所以这里用了一个fun递归方法处理的。中间可以根据项目需求,根据条件判断是否需要选中该节点。

返回的JSON数据格式

[{"children": [//子节点{"children": [{"children": [],"id": 30,"title": "测试","spread": true}, {"children": [],"id": 31,"title": "开发","spread": true}, {"children": [{"children": [],"id": 36,"title": "测试节点","spread": true}],"id": 32,"title": "测试","spread": true}],"id": 2,"title": "技术部","spread": true}, {"children": [],"id": 19,"title": "财务部","spread": true}],"id": 1,//节点id"title": "某某公司",//节点名称"spread": true}, {"children": [],"id": 33,"title": "测试","spread": true}]

设置节点点击回调方法(在加载数据方法tree.render中添加以下代码)。

click: function (obj) {var id = obj.data.id;$("#dept_home").load("dept/show?id="+id);}

把请求过来的详情页面load到右边的div中显示。后台请求方法

@RequestMapping(value = "/show")public void show(DeptForm form, ModelMap map) throws InstantiationException, IllegalAccessException {Dept model = new Dept();Integer id = form.getId();Integer parentId = 0;if(id!=null) {model = deptService.findById(id);parentId = model.getParent()==null?0:model.getParent().getId();}map.put("parentId", parentId);map.put("model", model);}

DeptForm类为一个接收类,其中字段和实体类中一样。根据请求传递过来的id,查询这条数据的详细信息,之后把查询的当前部门详情数据及父级节点id(用于下拉树TreeSelect)传递给详情页面。

show.html详情页面代码。

<meta charset="UTF-8" /><style type="text/css">.myData .layui-form-item{margin: 20px 100px 10px 45px;}.myData .layui-form-label{width: 85px;}.layui-input-block {margin-left: 120px;}</style><form class="layui-form myData" action="save" method="post" lay-filter="stuform"><input type="hidden" name="id" data-th-value="${model.id}" /><div class="layui-form-item"><label class="layui-form-label">上级部门:</label><div class="layui-input-block"><input type="text" name="parentId" id="tree" lay-filter="tree" class="layui-input" /></div></div><div class="layui-form-item"><label class="layui-form-label">部门名称:</label><div class="layui-input-block"><input type="text" name="name" lay-verify="required" th:value="${model.name}" class="layui-input" /></div></div><div class="layui-form-item" ><label class="layui-form-label">部门负责人:</label><div class="layui-input-block"><input type="text" name="deptName" th:value="${model.deptName}" class="layui-input" /></div></div><div class="layui-form-item" ><label class="layui-form-label">电话:</label><div class="layui-input-block"><input type="text" name="phone" th:value="${model.phone}" class="layui-input" /></div></div><div class="layui-form-item" ><label class="layui-form-label">编号:</label><div class="layui-input-block"><input type="text" name="number" th:value="${model.number}" class="layui-input" /></div></div><div class="layui-form-item" ><label class="layui-form-label">排序:</label><div class="layui-input-block"><input type="text" name="idx" value="0" th:value="${model.idx}" class="layui-input" /></div></div><div class="layui-form-item"><label class="layui-form-label"></label><div class="layui-input-block"><button lay-submit class="layui-btn layui-btn-radius layui-btn-normal" lay-filter="btnSub"><i class="layui-icon">&#xe642;</i>修改并保存</button></div></div></form><script th:inline="javascript">layui.use(["treeSelect", "form", "tree"], function () {var form = layui.form;var tree = layui.tree;form.render('select');var treeSelect = layui.treeSelect;treeSelect.render({// 选择器elem: '#tree',// 数据data: 'dept/treeSelect?id='+[[${model.id==null ? 0 : model.id}]],// 异步加载方式:get/post,默认gettype: 'post',// 占位符placeholder: '上级菜单',// 是否开启搜索功能:true/false,默认falsesearch: true,// 一些可定制的样式style: {folder: {enable: true},line: {enable: true}},// 加载完成后的回调函数success: function (d) {// 选中节点,根据id筛选treeSelect.checkNode('tree', [[${model.parent == null? parentId: model.parent.id}]]);treeSelect.refresh('tree');}});form.on('submit(btnSub)', function (data) {$.post('dept/save', data.field, function (result) {if (result.success) {tree.reload('treeId', {data: getData()});}layer.msg(result.msg, {offset: 'rb'});});return false;});});</script>LayUI—tree树形结构的使用解析(layui 树形)

上级部门使用的是LayUI下拉树显示的,下拉树数据请求方法。关于下拉树的使用,可以访问LayUI下拉树TreeSelect的使用

@RequestMapping(value="/treeSelect")@ResponseBodypublic Object treeSelect(Integer id) {Sort sort = Sort.by("idx");Specification<Dept> spec = buildSpec1();List<Dept> list = deptService.findAll(spec,sort);return buildTree(list, id);}private Object buildTree(List<Dept> list, Integer id) {List<HashMap<String, Object>> result=new ArrayList<>();for (Dept dept : list) {if(dept.getId() != id) {HashMap<String, Object> node=new HashMap<>();node.put("id", dept.getId());node.put("name",dept.getName());node.put("open", false);node.put("checked", false);if(dept.getChildren().size() != 0) {node.put("children",buildTree(dept.getChildren(), id));}result.add(node);}}return result;}public Specification<Dept> buildSpec1() {Specification<Dept> specification = new Specification<Dept>() {private static final long serialVersionUID = 1L;@Overridepublic Predicate toPredicate(Root<Dept> root, CriteriaQuery<?> query, CriteriaBuilder cb) {HashSet<Predicate> rules=new HashSet<>();Predicate parent = cb.isNull(root.get("parent"));rules.add(parent);return cb.and(rules.toArray(new Predicate[rules.size()]));}};return specification;}

显示的效果。

上面修改并保存后台方法(因为修改和新增共用的一个方法,用id区分的)。

@Overridepublic Object save(DeptForm form) {try {Dept model = new Dept();Integer id = form.getId();if(id != null) {model = deptService.findById(id);}//父级菜单idInteger parentId = form.getParentId();if(parentId == null) {model.setParent(null);}else {model.setParent(new Dept(parentId));}BeanUtils.copyProperties(form, model,"id", "parent");deptService.save(model);return new AjaxResult("数据保存成功!");} catch (Exception e) {return new AjaxResult(false,"数据保存失败");}}

设置节点操作(在加载数据方法tree.render中添加以下代码)。

edit: ['add', 'update', 'del'], //操作节点的图标operate: function(obj){var type = obj.type; //得到操作类型:add、edit、delvar data = obj.data; //得到当前节点的数据var elem = obj.elem; //得到当前节点元素var id = data.id;var name = data.title;if(type === 'add'){ //增加节点$.post("dept/save", {parentId: id, name: "未命名"}, function (result) {tree.reload('treeId', {data: getData()});})//返回 key 值return ;} else if(type === 'update'){ //修改节点$.post("dept/update", {id: id, name: name}, function () {tree.reload('treeId', {data: getData()});})} else if(type === 'del'){ //删除节点$.post("dept/delete", {id: id}, function () {tree.reload('treeId', {data: getData()});});};}

其中operate为操作节点回调方法。

obj.type为操作类型,add为新增,update为修改,edl为删除。obj.data为操作节点后的数据。

新增节点后,向后台发送请求添加节点,save方法和上面修改方法一样,id为新建节点的父级节点id。

修改节点,同样,向后台发送修改请求,并传递对象的id,和修改后的数据作为参数。后台响应方法。

@RequestMapping(value = "/update")@ResponseBodypublic Object update(DeptForm form) {try {Dept model = deptService.findById(form.getId());model.setName(form.getName());deptService.save(model);return new AjaxResult("数据保存成功!");} catch (Exception e) {return new AjaxResult(false,"数据保存失败");}}

删除节点同理,传递删除节点的id。删除请求方法。

@RequestMapping(value="/delete")@ResponseBodypublic Object delete(Integer id) {try {deptService.deleteById(id);return new AjaxResult("数据删除成功");} catch (Exception e) {return new AjaxResult(false,"数据删除失败");}}

使用按钮操作树形菜单。

现在页面中定义两个按钮,给按钮添加lay-demo=""属性,并设置属性值,JS通过这个属性值,绑定点击事件。

<button class="layui-btn layui-btn-sm layui-btn-radius layui-btn-normal" lay-demo="addDept"><i class="layui-icon">&#xe654;</i>添加部门</button><button class="layui-btn layui-btn-sm layui-btn-radius layui-btn-normal" lay-demo="gain">获取选中节点</button>

绑定添加部门和获取选中节点按钮的点击事件的JS代码。

util.event('lay-demo', {addDept: function(othis){$.get('dept/edit', function(data) {layer.open({type: 1,title: '新增',area: ['530px'],content: data,btn: ['提交', '退出'],yes: function () {},success: function (layero, index) {layui.use('form', function () {var form = layui.form;layero.addClass('layui-form');var submitBtn = layero.find('.layui-layer-btn0');submitBtn.attr('lay-filter', 'formVerify').attr('lay-submit', '');layero.keydown(function (e) {if (e.keyCode == 13) {submitBtn.click();}});form.on('submit(formVerify)', function (data) {$.post('dept/save', data.field, function (result) {if (result.success) {layer.close(index);tree.reload('treeId', {data: getData()});}layer.msg(result.msg, {offset: 'rb'});});return false;});});}})})},gain: function () {var checkData = tree.getChecked('treeId');var str = JSON.stringify(checkData);$.post('dept/checkedGain', {data: str}, function () {});layer.alert(JSON.stringify(checkData), {shade:0});}});

添加部门按钮点击事件,先发送请求到后台,跳转到eidt新增页面,edit.html新增页面代码,和上面的show.html显示部门详情页面差不多。上级部门同样使用的LayUI下拉树显示的,下拉树数据请求方法,和上面的详情页面下拉树请求方法一致。LayUI下拉树TreeSelect的使用。新增后的保存方法也和上面的保存方法一致。

后台请求方法代码,跳转到edit页面。

@RequestMapping(value = "/edit")public void edit(){}

edit.html页面完整代码如下。

<meta charset="UTF-8" /><style type="text/css">.myData .layui-form-item{margin: 20px 100px 10px 45px;}.myData .layui-form-label{width: 85px;}.layui-input-block {margin-left: 120px;}</style><form class="layui-form myData" action="save" method="post" lay-filter="stuform"><div class="layui-form-item"><label class="layui-form-label">上级部门:</label><div class="layui-input-block"><input type="text" name="parentId" id="tree2" lay-filter="tree2" class="layui-input" /></div></div><div class="layui-form-item"><label class="layui-form-label">部门名称:</label><div class="layui-input-block"><input type="text" name="name" lay-verify="required" class="layui-input" /></div></div><div class="layui-form-item" ><label class="layui-form-label">部门负责人:</label><div class="layui-input-block"><input type="text" name="deptName" class="layui-input" /></div></div><div class="layui-form-item" ><label class="layui-form-label">电话:</label><div class="layui-input-block"><input type="text" name="phone" class="layui-input" /></div></div><div class="layui-form-item" ><label class="layui-form-label">编号:</label><div class="layui-input-block"><input type="text" name="number" class="layui-input" /></div></div><div class="layui-form-item" ><label class="layui-form-label">排序:</label><div class="layui-input-block"><input type="text" name="idx" value="0" class="layui-input" /></div></div></form><script th:inline="javascript">layui.use(["treeSelect", "form"], function () {var form = layui.form;form.render('select');var treeSelect = layui.treeSelect;treeSelect.render({// 选择器elem: '#tree2',// 数据data: 'dept/treeSelect',// 异步加载方式:get/post,默认gettype: 'post',// 占位符placeholder: '上级菜单',// 是否开启搜索功能:true/false,默认falsesearch: true,// 一些可定制的样式style: {folder: {enable: true},line: {enable: true}},// 加载完成后的回调函数success: function (d) {}});});</script>

页面效果。

获取选中节点按钮点击事件。如果项目需要保存数据时,就需要获取到选中节点的数据了。这里可以获取到选中节点的数据,之后当参数传递到后台。传递到后台是一个JSON数据的字符串,需要转换一下,这里给推荐大家两个很好用的JSON转换工具net.sf.json.JSONObject和Alibaba Fastjson。这里用的是Alibaba Fastjson,需要引入以下依赖。

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency>

这里用于输出,新建了一个和tree的json数据的键名称一样的工具类DeptTree,代码如下。

import java.util.ArrayList;import java.util.List;public class DeptTree {private Integer id;private String title;private boolean checked;private boolean spread;private List<DeptTree> children = new ArrayList<>();public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public List<DeptTree> getChildren() {return children;}public void setChildren(List<DeptTree> children) {this.children = children;}public boolean isChecked() {return checked;}public void setChecked(boolean checked) {this.checked = checked;}public boolean isSpread() {return spread;}public void setSpread(boolean spread) {this.spread = spread;}}

后台接收到传递过来的JSON数据字符串,转换后输出方法。

@RequestMapping(value = "/checkedGain")@ResponseBodypublic void checkedGain(String data){List<DeptTree> array2 = JSONArray.parseArray(data, DeptTree.class);treeData(array2);}//递归输出选中数据private void treeData(List<DeptTree> array2) {for (DeptTree tree: array2){System.out.println(tree.getTitle()+"==="+tree.getId());if(tree.getChildren() != null){treeData(tree.getChildren());}}}

选中节点,点击获取选中节点数据。

后台对应方法接收到数据,转换后输出结果。

数据拿到了,之后保存方法就简单了。

后台方法代码基本都在上面了,页面全部代码。

<style type="text/css">#dept_main, #dept_particulars{width: 48.5%;display: inline-block;vertical-align: top;padding: 20px;background: white;box-sizing: border-box;}#dept_tree{margin-top: 20px;}</style><div id="dept_main"><fieldset class="layui-elem-field layui-field-title"><legend>所有部门</legend></fieldset><button class="layui-btn layui-btn-sm layui-btn-radius layui-btn-normal" lay-demo="addDept"><i class="layui-icon">&#xe654;</i>添加部门</button><button class="layui-btn layui-btn-sm layui-btn-radius layui-btn-normal" lay-demo="gain">获取选中节点</button><div id="dept_tree"></div></div><div id="dept_particulars"><fieldset class="layui-elem-field layui-field-title"><legend>部门详情</legend></fieldset><div id="dept_home"><div class="layui-tree-emptyText">无数据</div></div></div><script type="text/javascript">layui.use(['tree', 'util', 'layer'], function() {var tree = layui.tree;var util = layui.util;var layer = layui.layer;tree.render({elem: '#dept_tree',data: getData(),id: 'treeId',showCheckbox: true, //时候显示复选框onlyIconControl: true,edit: ['add', 'update', 'del'], //操作节点的图标click: function (obj) {var id = obj.data.id;$("#dept_home").load("dept/show?id="+id);},operate: function(obj){var type = obj.type; //得到操作类型:add、edit、delvar data = obj.data; //得到当前节点的数据var elem = obj.elem; //得到当前节点元素var id = data.id;var name = data.title;if(type === 'add'){ //增加节点$.post("dept/save", {parentId: id, name: "未命名"}, function (result) {tree.reload('treeId', {data: getData()});})//返回 key 值return ;} else if(type === 'update'){ //修改节点$.post("dept/update", {id: id, name: name}, function () {tree.reload('treeId', {data: getData()});})} else if(type === 'del'){ //删除节点$.post("dept/delete", {id: id}, function () {tree.reload('treeId', {data: getData()});});};}});util.event('lay-demo', {addDept: function(othis){$.get('dept/edit', function(data) {layer.open({type: 1,title: '新增',area: ['530px'],content: data,btn: ['提交', '退出'],yes: function () {},success: function (layero, index) {layui.use('form', function () {var form = layui.form;layero.addClass('layui-form');var submitBtn = layero.find('.layui-layer-btn0');submitBtn.attr('lay-filter', 'formVerify').attr('lay-submit', '');layero.keydown(function (e) {if (e.keyCode == 13) {submitBtn.click();}});form.on('submit(formVerify)', function (data) {$.post('dept/save', data.field, function (result) {if (result.success) {layer.close(index);tree.reload('treeId', {data: getData()});}layer.msg(result.msg, {offset: 'rb'});});return false;});});}})})},gain: function () {var checkData = tree.getChecked('treeId');var str = JSON.stringify(checkData);$.post('dept/checkedGain', {data: str}, function () {});layer.alert(JSON.stringify(checkData), {shade:0});}});});function getData(){var data = [];$.ajax({url: "dept/treeload", //后台数据请求地址type: "post",async:false,success: function(resut){data = resut;}});return data;}</script>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。

本文链接地址:https://www.jiuchutong.com/zhishi/304528.html 转载请保留说明!

上一篇:如何让discuz显示php错误(discuz隐藏查看)

下一篇:PHPCMS各种注入漏洞补丁(php 注入)

  • 创维电视上的蓝牙在哪设置(创维电视上的蓝牙怎么用)

    创维电视上的蓝牙在哪设置(创维电视上的蓝牙怎么用)

  • 电脑上的时间怎么设置自动更新呢(电脑上的时间怎么不见了怎么办)

    电脑上的时间怎么设置自动更新呢(电脑上的时间怎么不见了怎么办)

  • surface book3何时出(surface book 3 发布)

    surface book3何时出(surface book 3 发布)

  • 华为nova如何关闭后台应用程序(华为nova如何关闭开发者模式)

    华为nova如何关闭后台应用程序(华为nova如何关闭开发者模式)

  • iphone网易云音乐锁屏不显示怎么办(网易云音乐苹果手机)

    iphone网易云音乐锁屏不显示怎么办(网易云音乐苹果手机)

  • 手机卡欠费不注销有什么后果(手机卡欠费不注销会一直扣费吗)

    手机卡欠费不注销有什么后果(手机卡欠费不注销会一直扣费吗)

  • 怎样在电脑上制作文档(怎样在电脑上制作简单的表格)

    怎样在电脑上制作文档(怎样在电脑上制作简单的表格)

  • oppoa91值得入手吗(oppoa91手机什么价)

    oppoa91值得入手吗(oppoa91手机什么价)

  • 手机芯片的作用(手机芯片排名前十名榜单)

    手机芯片的作用(手机芯片排名前十名榜单)

  • hry_alooa是什型号手机(hry-alooa是什么型号的)

    hry_alooa是什型号手机(hry-alooa是什么型号的)

  • 小红书没有浏览足迹吗(小红书没有浏览量)

    小红书没有浏览足迹吗(小红书没有浏览量)

  • vivonex3和3s有什么区别(vivonex3和nex3s市场价多少)

    vivonex3和3s有什么区别(vivonex3和nex3s市场价多少)

  • qq卸载后里面的数据还有吗?(qq卸载后里面的好友还有吗?)

    qq卸载后里面的数据还有吗?(qq卸载后里面的好友还有吗?)

  • 怎么修改华为Nova5Pro唤醒词(怎么修改华为手机时间24小时)

    怎么修改华为Nova5Pro唤醒词(怎么修改华为手机时间24小时)

  • nex是什么牌子(prokennex是什么牌子)

    nex是什么牌子(prokennex是什么牌子)

  • 有线网络与无线网络的区别(有线网络与无线网络的优缺点)

    有线网络与无线网络的区别(有线网络与无线网络的优缺点)

  • 电脑24小时开着对电脑有什么影响(电脑24小时开着会坏吗)

    电脑24小时开着对电脑有什么影响(电脑24小时开着会坏吗)

  • ps怎么羽化图片边缘(ps怎么羽化图片边缘轮廓)

    ps怎么羽化图片边缘(ps怎么羽化图片边缘轮廓)

  • oppoa9尺寸长宽高(oppoa9长宽高是多少)

    oppoa9尺寸长宽高(oppoa9长宽高是多少)

  • vue能自动生成字幕吗(vue怎么设置字体样式)

    vue能自动生成字幕吗(vue怎么设置字体样式)

  • iphone x 分屏多任务(苹果x能分屏两个任务)

    iphone x 分屏多任务(苹果x能分屏两个任务)

  • 华为手机拨号键盘空白(华为手机拨号键出现hd是怎么回事)

    华为手机拨号键盘空白(华为手机拨号键出现hd是怎么回事)

  • 浅谈为什么磁盘慢会导致Linux负载飙升(为什么磁盘会消失)

    浅谈为什么磁盘慢会导致Linux负载飙升(为什么磁盘会消失)

  • c语言中如何防止数组下标越界(c语言中如何防止函数重名)

    c语言中如何防止数组下标越界(c语言中如何防止函数重名)

  • 税金及附加二级明细
  • 广告牌制作加盟厂家
  • 金税四期上线后如何查虚开
  • 季度残保金如何申报
  • 买的矿泉水可以烧开吗
  • 专票如何开具
  • 无形资产出资入股流程
  • 支出和成本的关系和区别
  • 金税盘查发票明细
  • 集资款利息走什么科目
  • 个税个人减免
  • 所得税弥补以前的利润
  • 待认证转进项税额转出会计分录
  • 代垫款收到的发票在哪里
  • 固定资产抵扣期限
  • 收到对方的预付款,需要多久开发票
  • 地方教育费附加是什么意思
  • 销售货物收入与营业收入
  • 花卉租赁的税率
  • 水利建设专项收入税
  • 实收资本里的钱怎么做账
  • 职工报销费用的处理流程
  • 员工报销费用
  • 帮其他公司垫付的钱怎么写分录
  • 印花税查账征收和核定征收计算
  • 以资抵债方式取得的无形资产如何记账?
  • 退休人员再就业受伤算工伤吗
  • 单位收到项目前的钱
  • 电脑开机后一直滴滴
  • post-secondary program
  • 如何用home
  • macos big sur 电池
  • php strrpos函数
  • 存货跌价准备的计提
  • 小规模纳税人怎么申报增值税报表
  • 无痛人流多少钱?
  • php自动执行函数
  • 语义分割入门教程
  • axure简单教程
  • .size()
  • php 截取字符
  • vue数据加载完成显示页面过渡动画
  • dedecms批量发文章
  • sql server 判断数据是否存在
  • 用vue做的企业项目
  • 出口产品报关单
  • 分配现金股利如何做会计分录
  • 股权质押和股权抵押有什么区别
  • 利息收入应该填什么科目
  • 收到预付卡结算款怎么入账
  • 跨年红冲收入记在本年度
  • 长期待摊费用摊完了之后怎么处理
  • 会计原始分录包括什么
  • 应付利润科目
  • 一般纳税人拿到普票怎么处理账务
  • 香港公司账户收美元要交税吗
  • 工资冲抵借款合法
  • 新办企业是不是企业
  • 明细分类账怎么做表格
  • 固定资产如何管理
  • 使用二氧化碳灭火器时人应该站在什么位置
  • xp系统怎么调性能
  • 怎么清空mac用户数据
  • Win10 Mobile RS2预览版14905更新内容大全:全新精致铃声
  • win7如何设置屏幕不黑屏
  • win10预览体验三个选项
  • 红石怎么启动
  • win7怎样设置屏幕保护密码
  • android viewpager
  • jquery 伪元素
  • 深入理解javascript pdf
  • nodejsapi
  • Node.js中的construct构造函数
  • vue.js打包部署
  • bootstrap 标签
  • node 开发
  • jQuery使用contains过滤器实现精确匹配方法详解
  • android开发框架mvp
  • 国家税务总局纳税服务司罗名
  • 河北公示信息网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设