文档章节

智能商贸-day4-代码生成器&权限认识

 非理不可
发布于 07/09 19:18
字数 3329
阅读 0
收藏 0
  1. 模板技术

velocity-1.6.3.jar   默认模板的后缀vm

freemarker-2.2.19.jar   默认模板的后缀ftl

 

struts2-core-2.x.jar\template\simple项目使用主题

<!-- struts.ui.theme=xhtml默认主题样式 -->

<constant name="struts.ui.theme" value="simple" />

 

 

    1. 模板技术怎样输出数据

数据(struts2的值栈)+模板(html文件,vm文件,ftl文件)=输出文本

 

pss05-代码生成器+角色权限管理\资料\velocity-1.7\docs\developer-guide.html开发指南,代码

 

    1. Velocity模板技术可以实现的功能

动态页面静态化:xxx.html

在后台准备数据,在前台准备模板,通过IO把数据与模板合并,真正的生成一个html页面出来

用作发送邮件、短信模板

代码生成器(今天要完成的代码生成器)

 

    1. pom.xml:添加jar文件

<!-- 代码生成器模版技术 -->

<dependency>

<groupId>org.apache.velocity</groupId>

<artifactId>velocity</artifactId>

<version>1.6</version>

</dependency>

    1. Hello Velocity
      1. VelocityTest

package cn.itsource.pss;

 

import java.io.StringWriter;

import org.apache.velocity.Template;

import org.apache.velocity.VelocityContext;

import org.apache.velocity.app.Velocity;

import org.junit.Test;

/**

 * 测试Velocity功能

 */

public class VelocityTest {
    @Test
    public void testVelocity01() throws Exception {
        //创建模板应用上下文
        VelocityContext context = new VelocityContext();
        context.put("msg", "小张是个好同志");
        //拿到相应的模板(需要设置好编码)
        Template template = Velocity.getTemplate("temptest/hello.html","UTF-8");
        //准备输出流
        StringWriter writer = new StringWriter();
        template.merge(context, writer);
        System.out.println(writer);
    }


    @Test
    public void testVelocity02() throws Exception {
        //创建模板应用上下文
        VelocityContext context = new VelocityContext();
        context.put("msg", "小张是个好同志");
        //拿到相应的模板(需要设置好编码)
        Template template = Velocity.getTemplate("temptest/hello.html","UTF-8");
        //准备输出流
        File file = new File("temptest/helloNew.html");
        FileWriter writer = new FileWriter(file);
        template.merge(context, writer);
        writer.close();
    }

}

 

      1. temptest /hello.html

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

大伙都说:${msg}

</body>

</html>

 

其它的功能我们可以参见咱们的PDF文档进行学习

  1. 代码生成器

咱们在写代码的时候,应该已经发现了,如果你还要做另外一个模块,那么它们的基础代码都差不多,虽然我们直接拷备过来修改使用也是可以的。但还是会觉得有点浪费时间,所以我们可以做一个自己生成基础代码的功能,然后我们直接生成,再添加其它的功能即可!

 

没有代码生成器的时候,如果添加部门模型domain,复制IDepartmentService,修改类名,ctrl+f,进行人工替换

而使用了代码生成器就是先定义好模板,然后使用代码自动修改类名,有代码参照模板进行指定内容自动替换

先用一个临时模型Dept,进行测试

注:写代码生成器前,先把项目进行备份,以免写出问题无法挽回!

 

 

 

    1. 使用手册

我们这只作一些简单的讲解,手册具体的部分可以参见给的 makejava-EasyCode 文档

https://gitee.com/makejava/EasyCode/wikis/pages

 

      1. 安装

在线安装,直接打开

离线安装(先下载相应的zip包)

 

 

      1. 添加数据源(已经学过,不做详细讲解)

 

最主要的就是控制它的位置与内容

      1. 生成一个基本代码

使用dept为例:这个是最简单的测试!!

我们这里只是生成一个最简单的实体类(当然,这个是使用它的自己原来的一个代码生成器模板,和我们最后想要的效果还有很大的差别!)

 

    1. 自定义模板生成

 

      1. 新建一个分组

咱们的代码生成器

 

      1. 模板的创建与位置问题

我们直接从原来模板中的entity中拷备过来,然后改成我们需要的代码即可!

注意:解决文件生成的位置问题:

模板代码的位置:

 

生成时的路径位置:

 

:两个位置结合起来,最后才能把文件放到自己想要的地方

 

  1. 代码生成器模板
    1. Domain实体对象

##引入宏定义
$!define

##使用宏定义设置回调(保存位置与文件后缀)
#save("/main/java/com/tzq/domain", ".java")

##使用宏定义设置包后缀
#setPackageSuffix("domain")

##使用全局变量实现默认包导入
$!autoImport
import java.io.Serializable;

import javax.persistence.*;

@Entity
@Table(name="$!{tableInfo.obj.name}")
public class $!{tableInfo.name} extends BaseDomain {
  
#foreach($column in $tableInfo.otherColumn)
##这一句是如果有注释就加上注释
    #if(${column.comment})//${column.comment}#end
##数据遍历出来的名字作为字段
    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end

#foreach($column in $tableInfo.otherColumn)
##使用宏定义实现get,set方法
    #getSetMethod($column)
#end

}

 

完成后可以查询生成代码,没有问题继续!

    1. Query查询对象

这个我们可以参考默认代码中的service等地方


##定义初始变量(给表名的后面加上一个Query生成一个表名+Query的类名)
#set($tableName = $tool.append($tableInfo.name, "Query"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/com/tzq/Query"))
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}Query;

import com.github.wenhao.jpa.Specifications;
import com.tzq.domain.$tableInfo.name;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.jpa.domain.Specification;

public class $!{tableName} extends BaseQuery {

    private String name;

    //返回咱们的查询条件 where username = ?
    @Override
    public Specification createSpec(){
        Specification<$tableInfo.name> spec = Specifications.<$tableInfo.name>and()
                .like(StringUtils.isNotBlank(name),"name", "%"+name+"%")
                .build();
        return spec;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

 

 

    1. Repository数据层

其实代码都差不多,只需要把相应位置的名称替换了即可

##定义初始变量(给表名的后面加上一个Query生成一个表名+Query的类名)
#set($tableName = $tool.append($tableInfo.name, "Repository"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/com/tzq/repository"))
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}repository;

import com.tzq.domain.$tableInfo.name;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;

public interface  $!{tableName} extends BaseRepository<$tableInfo.name,Long> {
   
}

 

 

    1. IXxxService业务层接口

##定义初始变量(给表名的后面加上一个Query生成一个表名+Query的类名)
#set($tableName = $tool.append("I",$tableInfo.name, "Service"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/com/tzq/service"))
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service;

import com.tzq.domain.$tableInfo.name;

public interface $!{tableName} extends IBaseService<$tableInfo.name,Long> {
   
}

 

 

    1. XxxService

##定义初始变量(给表名的后面加上一个Query生成一个表名+Query的类名)
#set($tableName = $tool.append($tableInfo.name, "ServiceImpl"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/com/tzq/service/impl"))
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service.impl;

import com.tzq.domain.$tableInfo.name;

import com.tzq.service.I$!{tableInfo.name}Service;
import org.springframework.stereotype.Service;
@Service
public class $!{tableName} extends BaseServiceImpl<$tableInfo.name,Long> implements I$!{tableInfo.name}Service {

}

    
}

 

    1. Test基本测试生成

##定义初始变量(给表名的后面加上一个Query生成一个表名+Query的类名)
#set($tableName = $tool.append($tableInfo.name, "ServiceTest"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/test/java/com/tzq/service"))
##生成的包名
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service;

import com.tzq.BaseServiceTest;
import com.tzq.domain.$!{tableInfo.name};
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

public class $!{tableInfo.name}ServiceTest extends BaseServiceTest {
    @Autowired
    private I$!{tableInfo.name}Service $!{tableInfo.obj.name}Service;

    @Test
    public void testFindAll()throws Exception{
        $!{tableInfo.obj.name}Service.findAll().forEach(e-> System.out.println(e));
    }

}

 

    1. XxxController:控制层

需要替换的太多,大家可以选拷备出去替换了后再重新进行操作

去掉多余的东西(如department相关与用户名验证功能)

     ##定义初始变量(给表名的后面加上一个Query生成一个表名+Query的类名)
#set($tableName = $tool.append($tableInfo.name, "Controller"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
##生成路径
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/com/tzq/web/controller"))
##生成的包名
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}web.controller;

import com.tzq.Query.$!{tableInfo.name}Query;
import com.tzq.common.JsonResult;
import com.tzq.common.UIPage;
import com.tzq.domain.$!{tableInfo.name};
import com.tzq.service.I$!{tableInfo.name}Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/$!{tableInfo.obj.name}")
public class $!{tableInfo.name}Controller extends BaseController {
    @Autowired
    private I$!{tableInfo.name}Service $!{tableInfo.obj.name}Service;

    @RequestMapping("/index")
    public String index() {

        //根据配置,这里会跳到/WEB-INF/views/$!{tableInfo.obj.name}/$!{tableInfo.obj.name}.jsp页面
        return "$!{tableInfo.obj.name}/$!{tableInfo.obj.name}";
    }
    //分页查询
    @RequestMapping("/page")
    @ResponseBody
    public UIPage page($!{tableInfo.name}Query query){
        return new UIPage($!{tableInfo.obj.name}Service.findPageByQuery(query)) ;
    }
    /*
    *@ModelAttribute:路径问题Controller的每个方法,都会先执行它里面的代码
    *
    * */
    @ModelAttribute("edit$!{tableInfo.name}")
    public $!{tableInfo.name} beforeEdit(Long id,String cmd){

        if (id!=null&&"_update".equals(cmd)){
            //修改就执行这个代码
            $!{tableInfo.name} db$!{tableInfo.name} = $!{tableInfo.obj.name}Service.findOne(id);
            //解决n-to-n的问题,把关联的对象设置为null
           
            return db$!{tableInfo.name};
        }
        return null;
    }
    //删除功能[返回一个JsonResult对象,一个boolean值,和报错信息]
    @RequestMapping("/delete")
    @ResponseBody
    public JsonResult delete(Long id){
        try {
            $!{tableInfo.obj.name}Service.delete(id);
            return new JsonResult();
        } catch (Exception e) {
            e.printStackTrace();
            return new JsonResult(false,e.getLocalizedMessage());
        }
    }

    //添加
    @RequestMapping("/save")
    @ResponseBody
    public JsonResult save($!{tableInfo.name} $!{tableInfo.obj.name}){
        try {
            $!{tableInfo.obj.name}Service.save($!{tableInfo.obj.name});
            return new JsonResult();
        } catch (Exception e) {
            e.printStackTrace();
            return new JsonResult(false,e.getLocalizedMessage());
        }
    }
    //修改
    @RequestMapping("/update")
    @ResponseBody
    public JsonResult update(@ModelAttribute("edit$!{tableInfo.name}") $!{tableInfo.name} $!{tableInfo.obj.name}){
        try {
            $!{tableInfo.obj.name}Service.save($!{tableInfo.obj.name});
            return new JsonResult();
        } catch (Exception e) {
            e.printStackTrace();
            return new JsonResult(false,e.getLocalizedMessage());
        }
    }


}

 

 

 

    1. xxx.jsp 页面展示



##设置回调
$!callback.setFileName($tool.append($!{tableInfo.obj.name}, ".jsp"))
##生文件路径
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/webapp/WEB-INF/views/$!{tableInfo.obj.name}"))


<%--
  Created by IntelliJ IDEA.
  User: hp
  Date: 2019/7/5
  Time: 19:38
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>
<head>
    <title>Title</title>
    <%@include file="/WEB-INF/views/head.jsp" %>
    <script src="/js/model/$!{tableInfo.obj.name}.js"></script>
</head>
<body>
<%--<table id= "$!{tableInfo.obj.name}Grid" class="easyui-datagrid"
       data-options="url:'/$!{tableInfo.obj.name}/page',fitColumns:true,singleSelect:true,fit:true,pagination:true,toolbar:'#gridTools'">
    <thead>--%>
<%--查询数据展示数据--%>
<table id="$!{tableInfo.obj.name}Grid" class="easyui-datagrid"
       data-options="fit:true,fixed:true,fitColumns:true,toolbar:'#gridTools',singleSelect:true"
       url="/$!{tableInfo.obj.name}/page"
       iconCls="icon-save"
       enableHeaderClickMenu="true"
       rownumbers="true" pagination="true">
    <thead>
    <tr>
        #foreach($column in $tableInfo.otherColumn)
        <th data-options="field:'$!{column.name}',width:100">$!{column.name}</th>
       #end
    </tr>
    </thead>
</table>

<%--grid顶部工具栏--%>
<div id="gridTools" style="padding:5px;height:auto">
    <%--增删改功能条--%>
    <div style="margin-bottom:5px">
        <a href="#" data-method="add" class="easyui-linkbutton" iconCls="icon-add" plain="true">添加</a>
        <a href="#" data-method="update" class="easyui-linkbutton" iconCls="icon-edit" plain="true">修改</a>
        <a href="#" data-method="del" class="easyui-linkbutton" iconCls="icon-remove" plain="true">删除</a>
    </div>
    <%--高级查询--%>
    <form id="searchForm">
        name: <input name="name" class="easyui-textbox" style="width:80px">
        
        <a href="#" data-method="search" class="easyui-linkbutton" iconCls="icon-search">查询</a>
    </form>
</div>

<%--添加保存对话窗口--%>
<div id="editDialog" class="easyui-dialog" title="编辑" style="width:400px;"
     data-options="iconCls:'icon-save',resizable:true,modal:true,closed:true">
    <form id="editForm" method="post">
        <input id="$!{tableInfo.obj.name}Id" type="hidden" name="id">
        <table cellpadding="5">
            <tr>
             #foreach($column in $tableInfo.otherColumn)
        
      
                <td>$!{column.name}:</td>
                <td><input class="easyui-validatebox"  type="text" name="$!{column.name}"
                           data-options="required:true"></input></td>
               #end
            </tr>
        </table>
    </form>
    <div style="text-align:center;padding:5px">
        <a href="javascript:void(0)" class="easyui-linkbutton" data-method="save">提交</a>
        <a href="javascript:void(0)" class="easyui-linkbutton" data-method="closeDialog">关闭</a>
    </div>
</div>
</body>
</html>


 

 

 

    1. Xxx.js

注意:拷备Employee实现后删除多余的内容(如department与一些format代码)

##设置回调
$!callback.setFileName($tool.append($!{tableInfo.obj.name}, ".js"))
##生文件路径
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/webapp/js/model/$!{tableInfo.obj.name}"))
function formatImage(value,row,index) {
    return value?`<img src="${value}" width="50" height="50">`:"没有图";
}
function formatDept(value) {
    return value?value.name:"";
}
//自定义验证(验证用户名是否存在)
$.extend($.fn.validatebox.defaults.rules, {
    //验证的名称
    checkName: {
        /*value:文本框当前的值
        param:传过来的值(数组)
        *
        * */
        validator: function(value,param){
            //ajax是异步的
           /* var jsonResult;
            $.get("/$!{tableInfo.obj.name}/checkUsername",{username:value},function (date) {
                jsonResult=date;
                console.debug("=============")
            })
            console.debug("我先走一波")
            return  jsonResult;*/
           //同步
            //拿到员工的id
            var $!{tableInfo.obj.name}Id = $("#$!{tableInfo.obj.name}Id").val();//修改的时候如果不修改就忽略检查
            var jsonResult = $.ajax({
                url: "/$!{tableInfo.obj.name}/checkUsername",
                //传参
                data:{username:value,id:$!{tableInfo.obj.name}Id},
                async: false//false同步
            }).responseText;
            //转json格式
            jsonResult=JSON.parse(jsonResult)
            return  jsonResult;
        },
        message: '用户名已经存在!!!!'
    }
});
$(function () {
    //1.获取常用的一些组件
    //整个Grid
    var $!{tableInfo.obj.name}Grid = $("#$!{tableInfo.obj.name}Grid");
    //高级查询
    var searchForm = $("#searchForm");
    //添加保存关闭对话框
    var editDialog = $("#editDialog");
    //对话空的from表单
    var editForm = $("#editForm");
    //2.绑定相应的事件
    $("*[data-method]").on("click",function(){
        var methodName = $(this).data("method");
        window.tzq[methodName]();
    })
    tzq={
        //添加
        add(){
            //让密码框失效且隐藏起来
            $("*[data-edit]").show();
            $("*[data-edit] input").validatebox("enable");
            //清空form中的数据
            editForm.form("clear");
            //打开弹出窗居中
            editDialog.dialog("center").dialog('open')
        },
        //ajax的保存功能
        save(){
            var url="/$!{tableInfo.obj.name}/save";
            //获得到id的值
            var $!{tableInfo.obj.name}Id=$("#$!{tableInfo.obj.name}Id").val()
            if ($!{tableInfo.obj.name}Id){
                url ="/$!{tableInfo.obj.name}/update?cmd=_update"
            }
            //easyui的form提交
            editForm.form('submit', {
                //提交路径
                url:url,
                //提交之前的一些操作
                onSubmit: function(){
                    //做一些检查
                    //返回false可以阻止提交
                    return $(this).form('validate')
                },
                //这里是返回的数据,是字符串
                success:function(data){
                    //强转为JSON格式
                    var parse = JSON.parse(data);
                    if(parse.success){
                        $!{tableInfo.obj.name}Grid.datagrid("reload")
                    }else {
                        $.messager.alert('错误',`保存失败,原因是${parse.msg}`,"error");

                    }
                    //关闭弹出框
                    tzq.closeDialog();
                }
            });
        },
        update(){
            //1.获得选中的一行数据
            var row = $!{tableInfo.obj.name}Grid.datagrid("getSelected");
            //2.没有选中给出提示
            if(!row){
                $.messager.alert('警告','请选择要修改的数据',"warning");
                return
            }
            //清空form中的数据
            editForm.form("clear");
            //让密码框失效且隐藏起来
            $("*[data-edit]").hide();
            $("*[data-edit] input").validatebox("disable")
           //把结果进行回显
           /* if(row.department){
                row["department.id"]=row.department.id;
                editForm.form("load",row);
            }*/
            //打开弹出窗居中
            editDialog.dialog("center").dialog('open')

        },
        del(){
            //1.获得选中的一行数据
            var row = $!{tableInfo.obj.name}Grid.datagrid("getSelected");
            //2.没有选中给出提示
            if(!row){
                $.messager.alert('警告','请选择要删除的数据',"warning");
                return
            }
            //3.如果选中删除,提示用户是否删除
            $.messager.confirm('确认','您确认想要删除记录吗?',function(r){
                //4.确定删除,发送数据到后台删除数据
                if (r){
                    //后台返回true刷新数据,返回fals提示错误
                   $.get("/$!{tableInfo.obj.name}/delete",{id:row.id},function (result) {
                       //5.返回数据是否删除成功
                      if (result.success){
                            $!{tableInfo.obj.name}Grid.datagrid("reload")
                      }else {
                          $.messager.alert('错误',`删除失败,原因是${result.msg}`,"error");
                      }
                    })
                }
            });

        },
        //查询
        search(){
            //serializeObject:拿到一个form中的所有数据,封装成json对象
            var params = searchForm.serializeObject();
            //数据表格
            $!{tableInfo.obj.name}Grid.datagrid("load",params);
        },
        //关闭窗口
        closeDialog(){
            editDialog.dialog("close")
        }
    }
})

 

  1. 权限设计

权限有哪些?  我们的登录应该是什么样的? 为什么我们要使用框架来完成权限?

密码加密又是什么意思?

 

 

 

权限是什么

简单的说:就是说你能不能对系统做某一种操作!

一般我们分两种:登录认证 + 权限认证

以前咱们登录:成功后所有内容都可以访问!

权限认证:你登录成功后,是否有操作某一个功能的权限

登录的逻辑

没有登录的人,我们称它为游客

游客要有票(令牌:token【username,password】)才可以进入

     ---

我们进入相应的验证:

  1. 判断用户名是否存在
  2. 判断密码是否正确
  3. 判断用户是否已经过期
  4. 其它错误(解释权归我们自己)

两个问题:session不通过(SE系统)/密码不安全

 

密码加密问题

把密码进行散列加密(Sha,MD5)

加密次数,加盐 以及我们如何判断登录

 

角色资源的认识

 

© 著作权归作者所有

粉丝 0
博文 16
码字总数 14947
作品 0
成都
私信 提问
JEECG v3.0 发布,基于代码生成器的智能开发平台

JEECG(J2EE Code Generation)是一款基于代码生成器的智能开发平台,采用代码生成+手工MERGE半智能开发模式,可以帮助你解决Java项目中60%的重复工作,让你更多关注业务逻辑。 JEECG宗旨:简...

Jeecg
2013/03/04
8.4K
11
python学习(day4)

1、装饰器: '''实现装饰器只是储备:1、函数即“变量”2、高阶函数3、嵌套函数 高阶函数+嵌套函数=》装饰器'''import timedef timmer(func): def warpper(args,*kwargs): start_time = tim......

deyiliu
2017/04/18
0
0
基于代码生成器的快速开发平台 - JEECG

JEECG是一款基于代码生成器的J2EE快速开发平台,开源界“小普元”超越传统商业企业级开发平台。引领新的开发模式(Online Coding模式(在线开发)->代码生成器模式->手工MERGE智能开发),可以帮...

Jeecg
2012/12/30
156.6K
94
济南-刘振/jeeidp

jeeidp智能开发平台 当前最新版本:1.0 简介 jeeidp(Java EE Intelligent development platform)是一款基于代码生成器的智能开发平台。采用智能生成+手动调整的开发模式,帮助开发人员解决...

济南-刘振
2016/11/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
今天
5
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
今天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
今天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
今天
10
0
再见 Spring Boot 1.X,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维...

Java技术剑
今天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部