JdbcTemplate+PageImpl实现多表分页查询

一、基础实体 

@MappedSuperclass
public abstract class AbsIdEntity implements Serializable {private static final long serialVersionUID = 7988377299341530426L;public final static int IS_DELETE_YES = 1;// 标记删除public final static int IS_DELETE_NO = 0;// 未删除,保留的
@Id@GenericGenerator(name="uuid", strategy="uuid")@GeneratedValue(generator="uuid")protected String id;@Column(name = "creationtime")protected Timestamp creationTimestamp = new Timestamp(System.currentTimeMillis());@Column(name = "lastmodifiedtime")protected Timestamp modificationTimestamp;@Column(name = "dr")protected int dr;// 是否删除。0:未删除;1:已删除/*** 主键,对应id字段*/public String getId() { return id; }public void setId(String id) { this.id = id; }/*** 创建日期,对应ts_insert字段*/public Timestamp getCreationTimestamp() { return creationTimestamp; }public void setCreationTimestamp(Timestamp creationTimestamp) { this.creationTimestamp = creationTimestamp; }/*** 修改日期,对应ts_update字段*/public Timestamp getModificationTimestamp() { return modificationTimestamp; }public void setModificationTimestamp(Timestamp modificationTimestamp) { this.modificationTimestamp = modificationTimestamp; }/*** 是否删除,对应dr字段* @return*/public int getDr() {return dr;}public void setDr(int dr) {this.dr = dr;}}
View Code

二、扩展VO

import java.io.Serializable;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;import org.springframework.jdbc.core.RowMapper;import xxx.entity.AbsIdEntity;public class StaffUnionVO extends AbsIdEntity implements Serializable, RowMapper<StaffUnionVO>{/*** */private static final long serialVersionUID = -5213225066818183479L;private String code;// 员工编码private String name;// 员工姓名private int sex; // 性别private Date birthday;// 出生年月日private String deptId;// 人员所属部门private String companyId;//人员所属公司表private EnumStatus status;// 员工状态,在职,离职private String nativePlace;// 籍贯private String education;// 学历private EnumPoliticalStatus politicalStatus;// 政治面貌private String major;// 所学专业private String school;// 毕业学校private Date graduationTime;// 毕业时间private Date workTime;// 参加工作时间private String credentialCode;// 证件号码private String mobile;// 移动电话private String signPic;// 签名图片private String landlineNum;// 座机号private String age;// 年龄private String post;// 职位  private String positionId;// 岗位Idprivate String dept;// 部门private String email;// 邮箱private String  userId;// 用户关联人员private int  isUser;// 是否关联人员private int credentialType;//证件类型private String address;//地址private String staffTypeId;//人员idprivate String property;//直属或隶属public String getProperty() {return property;}public void setProperty(String property) {this.property = property;}public String getPositionId() {return positionId;}public void setPositionId(String positionId) {this.positionId = positionId;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getStaffTypeId() {return staffTypeId;}public void setStaffTypeId(String staffTypeId) {this.staffTypeId = staffTypeId;}public int getCredentialType() {return credentialType;}public void setCredentialType(int credentialType) {this.credentialType = credentialType;}public int getIsUser() {return isUser;}public void setIsUser(int isUser) {this.isUser = isUser;}public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public String getLandlineNum() {return landlineNum;}public void setLandlineNum(String landlineNum) {this.landlineNum = landlineNum;}public String getDeptId() {return deptId;}public void setDeptId(String deptId) {this.deptId = deptId;}public String getCompanyId() {return companyId;}public void setCompanyId(String companyId) {this.companyId = companyId;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}public String getPost() {return post;}public void setPost(String post) {this.post = post;}public String getPosition() {return positionId;}public void setPosition(String position) {this.positionId = position;}public String getDept() {return dept;}public void setDept(String dept) {this.dept = dept;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getBirthday() {return birthday;}public int getSex() {return sex;}public void setSex(int sex) {this.sex = sex;}public void setBirthday(Date birthday) {this.birthday = birthday;}public EnumStatus getStatus() {return status;}public void setStatus(EnumStatus status) {this.status = status;}public String getNativePlace() {return nativePlace;}public void setNativePlace(String nativePlace) {this.nativePlace = nativePlace;}public String getEducation() {return education;}public void setEducation(String education) {this.education = education;}public EnumPoliticalStatus getPoliticalStatus() {return politicalStatus;}public void setPoliticalStatus(EnumPoliticalStatus politicalStatus) {this.politicalStatus = politicalStatus;}public String getMajor() {return major;}public void setMajor(String major) {this.major = major;}public String getSchool() {return school;}public void setSchool(String school) {this.school = school;}public Date getGraduationTime() {return graduationTime;}public void setGraduationTime(Date graduationTime) {this.graduationTime = graduationTime;}public Date getWorkTime() {return workTime;}public void setWorkTime(Date workTime) {this.workTime = workTime;}public String getCredentialCode() {return credentialCode;}public void setCredentialCode(String credentialCode) {this.credentialCode = credentialCode;}public String getMobile() {return mobile;}public void setMobile(String mobile) {this.mobile = mobile;}public String getSignPic() {return signPic;}public void setSignPic(String signPic) {this.signPic = signPic;}@Overridepublic StaffUnionVO mapRow(ResultSet rs, int row) throws SQLException {StaffUnionVO vo = new StaffUnionVO();vo.setAddress(rs.getString("address"));vo.setAge(rs.getString("age"));vo.setBirthday(rs.getDate("birthday"));vo.setCode(rs.getString("code"));vo.setCompanyId(rs.getString("companyId"));vo.setCreationTimestamp(rs.getTimestamp("creationtime"));vo.setCredentialCode(rs.getString("credentialCode"));vo.setCredentialType(rs.getInt("credentialType"));vo.setDept(rs.getString("dept"));vo.setDeptId(rs.getString("deptId"));vo.setDr(rs.getInt("dr"));vo.setEducation(rs.getString("education"));vo.setEmail(rs.getString("email"));vo.setGraduationTime(rs.getDate("graduationTime"));vo.setId(rs.getString("id"));vo.setIsUser(rs.getInt("isUser"));vo.setLandlineNum(rs.getString("landlineNum"));vo.setMajor(rs.getString("major"));vo.setMobile(rs.getString("mobile"));vo.setModificationTimestamp(rs.getTimestamp("lastmodifiedtime"));vo.setName(rs.getString("name"));vo.setNativePlace(rs.getString("nativePlace"));vo.setPoliticalStatus(rs.getString("politicalStatus") == null || "".equals(rs.getString("politicalStatus").trim()) ? null : EnumPoliticalStatus.valueOf(rs.getString("politicalStatus")));vo.setPositionId(rs.getString("positionId"));vo.setPost(rs.getString("post"));vo.setProperty(rs.getString("property"));vo.setSchool(rs.getString("school"));vo.setSex(rs.getInt("sex"));vo.setSignPic(rs.getString("signPic"));vo.setStaffTypeId(rs.getString("staffTypeId"));vo.setStatus(rs.getString("status") == null || "".equals(rs.getString("status").trim()) ? null : EnumStatus.valueOf(rs.getString("status")));vo.setUserId(rs.getString("userId"));vo.setWorkTime(rs.getDate("workTime"));return vo;}
}
View Code

三、使用JdbcTemplate 进行联表查询操作

@Repository
public class StaffUnionDao {@Autowiredprivate JdbcTemplate jdbcTemplate;public List<StaffUnionVO> getStaffUnion(String deptId, String param) {
     //sql中联表查询,自定义列名String sql
= "select bs.id id, bs.creationtime creationtime, bs.lastmodifiedtime lastmodifiedtime, bs.dr dr, bs.code code, bs.name name, bs.sex sex, bs.birthday birthday, bsp.dept_id as deptId, bsp.company_id companyId,"+ "bs.status status, bs.native_place nativePlace, bs.education education, bs.political_status politicalStatus, bs.major major, bs.school school, bs.graduation_time graduationTime, bs.work_time workTime,"+ "bs.credential_code credentialCode, bs.mobilephone_num mobile, bs.sign_pic signPic, bs.landline_num landlineNum, bs.age age, bs.post post, bsp.position positionId, bs.dept dept, bs.is_user isUser,"+ "bs.email email, bs.userid userId, bs.credential_type credentialType, bs.address address, bs.staff_type_id staffTypeId, bsp.property property from bd_staff bs, bd_staff_partjob bsp where bs.id = bsp.staff_id and bsp.dr = 0";//String sqlx = "select bs.id id from bd_staff bs, bd_staff_partjob bsp where bs.id = bsp.staff_id and bsp.dr = 0";if(deptId != null) {sql += "and bsp.dept_id = " + deptId;}if(param != null) {sql += " and (bs.code like %" + param + "% or bs.name like %" + param + "%)";}
     (1)
//该方法无法实现类中变量是对象时的转换,例如存在枚举对象。//List<StaffUnionVO> result = jdbcTemplate.query(sql, BeanPropertyRowMapper.newInstance(StaffUnionVO.class));(2) // 可以自定义转化 // @SuppressWarnings("unchecked") // List<StaffUnionVO> result = jdbcTemplate.query(sqlx, new RowMapper() { // @Override // public Object mapRow(ResultSet rs, int n) throws SQLException { // StaffUnionVO vo = new StaffUnionVO(); // vo.setId(rs.getString("id")); // return vo; // } // });(3)//自定义映射方式的实现写在了 StaffUnionVO类中List<StaffUnionVO> result = jdbcTemplate.query(sql, new StaffUnionVO());return result;} }

四、使用PageImpl进行分页

  @Autowiredprivate StaffUnionDao newPageDao;@RequestMapping(path = "newpage", method = RequestMethod.GET)@ResponseBodypublic PageImpl<StaffUnionVO> getStaffInfoNew(@RequestParam(value = "deptId", required = false) String deptId,@RequestParam(value = "searchText", required = false) String param,@RequestParam("pageNumber") int pageNumber, @RequestParam("pageSize") int pageSize) {List<StaffUnionVO> content = newPageDao.getStaffUnion(deptId, param);PageRequest pageRequest = new PageRequest(pageNumber - 1, pageSize);PageImpl<StaffUnionVO> ans = new PageImpl<StaffUnionVO>(content, pageRequest, content == null ? 0 : content.size());return ans;}

 

五、补充一种场景

  进行分页查询的时候一般多是针对一个实体(对应一个表),通常使用的spring data jpa 的接口 JpaSpecificationExecutor<T>, 接口内容如下。

JpaSpecificationExecutor

public interface JpaSpecificationExecutor<T> {/*** Returns a single entity matching the given {@link Specification}.* * @param spec* @return*/T findOne(Specification<T> spec);/*** Returns all entities matching the given {@link Specification}.* * @param spec* @return*/List<T> findAll(Specification<T> spec);/*** Returns a {@link Page} of entities matching the given {@link Specification}.* * @param spec* @param pageable* @return*/Page<T> findAll(Specification<T> spec, Pageable pageable);/*** Returns all entities matching the given {@link Specification} and {@link Sort}.* * @param spec* @param sort* @return*/List<T> findAll(Specification<T> spec, Sort sort);/*** Returns the number of instances that the given {@link Specification} will return.* * @param spec the {@link Specification} to count instances for* @return the number of instances*/long count(Specification<T> spec);
}

  分页查询的结果是实体类的集合,通常在服务层完成。但是我们一般不让业务层直接接触我们的实体类,所以就是产生了VO类,也就是服务层不再返回实体类的集合,而是返回VO类的集合,业务层操作的其实是VO类。这样就显得层次清晰,方便控制。例如分页查询,具体实现如下。

  请参考: 后台json格式设计 PagableResponse(分页json格式)  ,生成查询Specification  QueryTool工具

 

Controller

  @Autowiredprivate RoleService roleService;@RequestMapping(path = "page")@ResponseBodypublic PagableResponse<RoleVO> getPageableRole(@RequestParam(value = "roleId", required = false) String roleId,@RequestParam(value = "searchText", required = false) String param,@RequestParam("pageNumber") int pageNumber, @RequestParam("pageSize") int pageSize) {PagableResponse<RoleVO> response = new PagableResponse<RoleVO>();response.setPageNumber(pageNumber);response.setPageSize(pageSize);PageRequest pageRequest = new PageRequest(pageNumber, pageSize);try {List<RoleVO> data = roleService.findPageableRoles(param, roleId, pageRequest);long count = roleService.count(param, roleId);response.setList(data);response.setCount(count);response.setCode(ReturnCode.SUCCESS);response.setMsg("获取角色信息成功!");} catch(Exception e) {e.printStackTrace();response.setCode(ReturnCode.FAILURE);response.setMsg("获取角色信息失败!"); }return response;}

Service

  @Overridepublic List<RoleVO> findPageableRoles(String param, String relyCondition, PageRequest pageRequest) {List<RoleVO> list = new ArrayList<RoleVO>();Map<String, Object> map = QueryTool.parseCondition(relyCondition); //添加搜索添加if(StringUtils.isNotBlank(param)){map.put(Operator.LIKE+"_roleName", param);map.put(Operator.LIKE+"_roleCode", relyCondition);}if(StringUtils.isNotBlank(relyCondition)) {map.put(Operator.LIKE+"_id", relyCondition);}map.put(Operator.EQ+"_dr", "0");Specification<RoleEntity> spec = QueryTool.buildSpecification(map, RoleEntity.class);Page<RoleEntity> page = roleDao.findAll(spec, pageRequest);for (RoleEntity entity : page) {RoleVO roleVO = new RoleVO();BeanUtils.copyProperties(entity, roleVO);list.add(roleVO);}return list;}

六、自定义规范

  实体类

@Entity
@Table(name="sm_role")
public class RoleEntity extends AbsIdEntity implements Serializable{private static final long serialVersionUID = 3717832885014711347L;@Column(name="role_name")private String roleName;@Column(name="role_code")private String roleCode;@Column(name="role_type")private String roleType;@Column(name="isactive")private String isactive;@Column(name="tenant_id")private String tenantId;@Column(name="dtype")private String dtype;@Column(name="remark")private String remark;@Column(name="creator")private String creator;@Column(name="reviser")private String reviser;@Column(name="role_property")private String roleProperty;@Column(name="related_post_id")private String relatedPostId;@Column(name = "instruction")private String instruction;public String getInstruction() {return instruction;}public void setInstruction(String instruction) {this.instruction = instruction;}public String getRoleName() {return roleName;}public void setRoleName(String roleName) {this.roleName = roleName;}public String getRoleCode() {return roleCode;}public void setRoleCode(String roleCode) {this.roleCode = roleCode;}public String getRoleType() {return roleType;}public void setRoleType(String roleType) {this.roleType = roleType;}public String getIsactive() {return isactive;}public void setIsactive(String isactive) {this.isactive = isactive;}public String getTenantId() {return tenantId;}public void setTenantId(String tenantId) {this.tenantId = tenantId;}public String getDtype() {return dtype;}public void setDtype(String dtype) {this.dtype = dtype;}public String getRemark() {return remark;}public void setRemark(String remark) {this.remark = remark;}public String getCreator() {return creator;}public void setCreator(String creator) {this.creator = creator;}public String getReviser() {return reviser;}public void setReviser(String reviser) {this.reviser = reviser;}public String getRoleProperty() {return roleProperty;}public void setRoleProperty(String roleProperty) {this.roleProperty = roleProperty;}public String getRelatedPostId() {return relatedPostId;}public void setRelatedPostId(String relatedPostId) {this.relatedPostId = relatedPostId;}
}

  自定义Specification

public class RoleSpecification implements Specification<RoleEntity> {private Integer delete = new Integer(0);// 默认查询未删除的数据private String searchParam;private String roleId;public RoleSpecification(String searchParam, String roleId) {super();this.searchParam = searchParam;this.roleId = roleId;}@Overridepublic Predicate toPredicate(Root<RoleEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {List<Predicate> list = new ArrayList<Predicate>();list.add(cb.equal(root.get("dr").as(Integer.class), delete));if (StringUtils.isNotBlank(searchParam)) {list.add(cb.or(cb.like(root.get("roleName").as(String.class), cb.literal("%" + searchParam + "%")),cb.like(root.get("roleCode").as(String.class), cb.literal("%" + searchParam + "%")),cb.like(root.get("roleType").as(String.class), cb.literal("%" + searchParam + "%"))));}//角色idif(roleId != null && !("".equals(roleId.trim()))) {list.add(cb.equal(root.get("roleId").as(String.class), roleId));}Predicate[] predicates = new Predicate[list.size()];return cb.and(list.toArray(predicates));}public Integer getDelete() {return delete;}public void setDelete(Integer delete) {this.delete = delete;}public String getSearchParam() {return searchParam;}public void setSearchParam(String searchParam) {this.searchParam = searchParam;}public String getRoleId() {return roleId;}public void setRoleId(String roleId) {this.roleId = roleId;}
}

  注:规范中操作的 字段名称 都是 实体类的字段名称,不要写成数据库字段名称。

  自定义规范可以自定义条件查询,比如 or, and等等,使用QueryTool工具建立的规范默认条件都是and,所以很多情况下不能满足我们的需求。总的来说,现在刚刚接触,Spring Data JPA 的 Specification 还要进一步学习。

七、其他通过Specification实现分页查询,请参考

    springmvc+jpa实现分页的两种方式

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

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

相关文章

消息队列选型手册

前言 消息队列中间件重要吗&#xff1f;面试必问问题之一&#xff0c;你说重不重要。我有时会问同事&#xff0c;为啥你用 RabbitMQ&#xff0c;不用 Kafka&#xff0c;或者 RocketMQ 呢&#xff1f; 他给我的回答&#xff1a;“因为公司用的就是这个&#xff0c;大家都这么用…

Jenkins 持续集成国产嵌入式操作系统 RT-Thread 的CI

我们直接在Jenkins的镜像基础上进行集成RT-Thread 的编译环境&#xff0c; 这样直接使用Shell 命令 最直接了当&#xff0c; 通过 第三方docker等插件&#xff0c; 尝试了计重方案&#xff0c; 没有找到理想中的感觉&#xff0c; 如果其他人有想法可以告知一二。 我们有现成的镜…

codevs原创抄袭题 5960 信使

题目描述 Description•战争时期&#xff0c;前线有n个哨所&#xff0c;每个哨所可能会与其他若干个哨所之间有通信联系。信使负责在哨所之间传递信息&#xff0c;当然&#xff0c;这是要花费一定时间的&#xff08;以天为单位&#xff09;。指挥部设在第一个哨所。当指挥部下达…

MongoDB精华总结

概述 MongoDB是属于文档型的NoSQL数据库&#xff0c;也就是文档数据库。文档数据库区别于传统的其它数据库&#xff0c;它是用来管理文档。在传统的数据库中&#xff0c;信息被分割成离散的数据段&#xff0c;而在文档数据库中&#xff0c;文档是处理信息的基本单位&#xff0c…

认清性能问题

本文翻译自 Thinking Clearly About Performance 这是我三年前读到的一篇关于性能问题的好文&#xff0c;读完后还觉不过瘾&#xff0c;怕理解的不够遂又翻译了一遍&#xff0c;这也是当年我的第一次翻译。 这几年来每次碰到性能问题&#xff0c;我都会想起这篇文章&#xff0c…

简述:分布式CAP理论和BASE理论

目录 一、什么是CAP&#xff1f; Consistency (一致性)&#xff1a; Availability (可用性): Partition Tolerance (分区容错性): 二、取舍策略 三、Base理论 1、基本可用 2、软状态 3、最终一致性 四、常见产品 Ereka Zookeeper 五、总结 一、什么是CAP&#xf…

WinForm(四)一种实现登录的方式

首先声明&#xff0c;这只是一种登录方式&#xff0c;并不是最好的方式&#xff0c;用这个例子为了说明登录窗体和Application的关系。在登录前&#xff0c;定义了用户实体&#xff0c;然后是一个通用的类&#xff0c;存放进程中当前登录的用户&#xff0c;所以CurrentUser是静…

Java多线程4:synchronized锁机制

脏读 一个常见的概念。在多线程中&#xff0c;难免会出现在多个线程中对同一个对象的实例变量进行并发访问的情况&#xff0c;如果不做正确的同步处理&#xff0c;那么产生的后果就是"脏读"&#xff0c;也就是取到的数据其实是被更改过的。 按照正常来看应该打印&quo…

.NET Community Toolkit 8.0.0 版本发布

.NET 社区工具包&#xff08;.NET Community Toolkit &#xff09;现已发布 8.0.0 版&#xff01;.NET 社区工具包是一组适用于所有 .NET 开发人员&#xff0c;且与任何特定 UI 平台无关的帮助程序和 API。该工具包由 Microsoft 维护和发布&#xff0c;是 .NET 基金会的一部分&…

1、内存

程序为什么需要内存 程序运行的目的&#xff1a;程序运行是为了得到一定的结果&#xff0c;程序运行其实是在做一系列的数据计算&#xff0c;所以&#xff1a;程序代码数据&#xff1b;程序运行的目的不外乎2个&#xff1a;过程、结果&#xff1b; 用函数来类比&#xff1a;…

基于CAP组件实现补偿事务与幂等性保障

【.NET Core】| 总结/Edison Zhou1补偿事务和幂等性在微服务架构下&#xff0c;我们会采用异步通信来对各个微服务进行解耦&#xff0c;从而我们会用到消息中间件来传递各个消息。 补偿事务某些情况下&#xff0c;消费者需要返回值以告诉发布者执行结果&#xff0c;以便于发布者…

Docker与k8s

前言 随着k8s 作为容器编排解决方案变得越来越流行&#xff0c;有些人开始拿 Docker 和 k8s进行对比&#xff0c;不禁问道&#xff1a;Docker 不香吗&#xff1f; k8s 是kubernets的缩写&#xff0c;’8‘代表中间的八个字符。 其实 Docker 和 k8s 并非直接的竞争对手&#xff…

Linux下启动tomcat报java.lang.OutOfMemoryError: PermGen space

2019独角兽企业重金招聘Python工程师标准>>> 一、错误信息 java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav…

Redis安装[Windows]

一. redis下载地址: https://github.com/ServiceStack/redis-windows/tree/master/downloads 根据需要的下载对应版本*.zip即可.(我这里是win7x64) 二.使用 1. 下载之后解压到你相应的目录下: 1 文件介绍&#xff1a; 2 redis-benchmark.exe #基准测试 3 redis-check-aof.e…

简练软考知识点整理-项目启动过程组

启动过程组包含定义一个新项目或现有项目的一个新阶段&#xff0c;授权开始该项目或阶段的一组过程。在启动过程中&#xff0c;定义初步范围和落实初步财务资源&#xff0c;识别那些将相互作用并影响项目总体结果的内外部干系人&#xff0c;选定项目经理&#xff08;如果尚未安…

Paxos算法详解

Paxos、Raft分布式一致性算法应用场景一文讲述了分布式一致性问题与分布式一致性算法的典型应用场景。作为分布式一致性代名词的Paxos算法号称是最难理解的算法。本文试图用通俗易懂的语言讲述Paxos算法。 一、Paxos算法背景 Paxos算法是Lamport宗师提出的一种基于消息传递的分…

Teiid:数据虚拟化Data Virtualization平台

2019独角兽企业重金招聘Python工程师标准>>> Teiid介绍 http://teiid.jboss.org/ 数据虚拟化的定义 https://en.wikipedia.org/wiki/Data_virtualization http://www.denodo.com/en/data-virtualization/overview 数据虚拟化的文章 Sick of ETL? Database virtuali…

如何仿造一个websocket请求?

之前两次singnalr、 websocket实时推送相关&#xff1a;• .NET WebSockets 核心原理初体验[1]• SignalR 从开发到生产部署避坑指南[2]tag&#xff1a;浏览器--->nginx--> server其中提到nginx默认不会为客户端转发Upgrade、Connection标头&#xff0c; 因为为了让被代理…

从“互联网+教育”到“教育+互联网”——互联网文化基因视域下的审思

作者信息 朱敬/广西师范大学教育学部教授&#xff0c;教育学博士&#xff0c;博士生导师&#xff1b; 蔡建东/河南大学教育学部教授&#xff0c;教育学博士。 本文摘要 近年来国务院与教育部文件逐渐使用“教育互联网”一词&#xff0c;从“互联网教育”到“教育互联网”&a…

Axure RP使用攻略--动态面板的用途(8)

写了几个Axure教程之后发现&#xff0c;可能教程的起点有些高了&#xff0c;过分的去讲效果的实现&#xff0c;而忽略了axure功能以及基础元件的使用&#xff0c;那么从这个教程开始&#xff0c;把这些逐渐的展开讲解。 关于动态面板 动态面板是axure原型制作中使用非常频繁的一…