z-blog实现登录后显示“管理后台”按钮,未登录显示注册

//根据id获取课程 @Override @GetMapping("/coursebase/get/{courseId}") public CourseBase getCourseBaseById(@PathVariable("courseId") String courseId) throws RuntimeException { return courseService.getCourseBaseById(courseId); } //更新课程基本信息 @Override @PutMapping("/coursebase/update/{id}") public ResponseResult updateCourseBase(@PathVariable("id") String id, @RequestBody CourseBase courseBase) { return courseService.updateCourseBase(id,courseBase); }

idea编程手动一键让实体类生成链式setter方法

一般操作都是在实体类中按Alt+Insert,然后选择Getter and Setter一键生成,但其实在选择生成时候有自带的Build模板可供选择,选择后可以一键生成可链式set的方法,位置如图:生成好后的代码:public class Coldknow  {    private Integer Id;    private String Title;    public Integer getId() {        return Id;    }    public Coldknow setId(Integer id) {        Id = id;        return this;    }    public String getTitle() {        return Title;    }    public Coldknow setTitle(String title) {        Title = title;        return this;    }}让我们对比下与普通setter方法的异同(注释部分为普通方式,this修饰的表当前类变量):public class Coldknow  {    private Integer id;/*    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }*/    public Integer getId() {        return id;    }    public Coldknow setId(Integer id) {        this.id = id;        return this;    }}可以看出,普通方式只是更改了属性,而Build方式在更改属性后还返回了当前对象,因此可以实现链式set这种操作。

idea编程手动一键让实体类生成链式setter方法

Lombok注解之@Accessors使用

在实体类上使用该注解,例如:@Data@EqualsAndHashCode(callSuper = false)@Accessors(fluent = true)@AllArgsConstructor@NoArgsConstructorpublic class Coldknow extends Model<Coldknow> {    private static final long serialVersionUID = 1L;    @TableId(value = "id", type = IdType.AUTO)    private Integer id;    private String title;    private String img;    private String text;    @Override    protected Serializable pkVal() {        return this.id;    }}@Accessors(fluent = true)使用后可以让你在get/set时候省去get/set例如:        Coldknow coldknow = new Coldknow();//        set设置属性        coldknow.title("标题");        coldknow.img("http://cway.top/1.png");//        get属性        System.out.println(coldknow.title());@Accessors(chain = true)使用后支持链式set,即:Coldknow coldknow = new Coldknow().setTitle("标题").setImg("http://cway.top/1.png")        .setText("内容");System.out.println(coldknow);@Accessors(prefix="t")生成getter/setter时忽略指定字符前缀,但前缀后必须是小驼峰命名,例如 fName,生成的get/set方法则变成getName()而非getFName(),具体观察下图:

Lombok注解之@Accessors使用

Lombok相关注解及其使用

主要用注解方式来简化Java实体类的书写,使代码更简洁清晰,所需依赖,例如:<dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId>    <version>1.16.20</version>    <scope>provided</scope></dependency>@Data注解在类上,会为类的所有属性自动生成setter/getter、equals、canEqual、hashCode、toString方法@ToString、@EqualsAndHashCode、@Getter/@Setter、@RequiredArgsConstructor的所有特性(),如为final属性,则不会为该属性生成setter方法。@Getter/@Setter注解,此注解在属性上,可以为相应的属性自动生成Getter/Setter方法@NonNull该注解用在属性或构造器上,Lombok会生成一个非空的声明,可用于校验参数,能帮助避免空指针。@Cleanup该注解能帮助我们自动调用close()方法,很大的简化了代码,例如:import lombok.Cleanup;import java.io.*;public class CleanupExample {  public static void main(String[] args) throws IOException {    @Cleanup InputStream in = new FileInputStream(args[0]);    @Cleanup OutputStream out = new FileOutputStream(args[1]);    byte[] b = new byte[10000];    while (true) {      int r = in.read(b);      if (r == -1) break;      out.write(b, 0, r);    }  }}@EqualsAndHashCode默认情况下,会使用所有非静态(non-static)和非瞬态(non-transient)属性来生成equals和hasCode,也能通过exclude注解来排除一些属性。示例:import lombok.EqualsAndHashCode;@EqualsAndHashCode(exclude={"id", "shape"})public class EqualsAndHashCodeExample {  private transient int transientVar = 10;  private String name;  private double score;  private Shape shape = new Square(5, 10);  private String[] tags;  private int id;    public String getName() {    return this.name;  }    @EqualsAndHashCode(callSuper=true)  public static class Square extends Shape {    private final int width, height;        public Square(int width, int height) {      this.width = width;      this.height = height;    }  }}@ToString注解,Lombok会生成一个toString()方法,默认情况下,会输出类名、所有属性(会按照属性定义顺序),用逗号来分割。通过将includeFieldNames参数设为true,就能明确的输出toString()属性。这一点是不是有点绕口,通过代码来看会更清晰些。示例:import lombok.ToString;@ToString(exclude="id")public class ToStringExample {  private static final int STATIC_VAR = 10;  private String name;  private Shape shape = new Square(5, 10);  private String[] tags;  private int id;    public String getName() {    return this.getName();  }    @ToString(callSuper=true, includeFieldNames=true)  public static class Square extends Shape {    private final int width, height;        public Square(int width, int height) {      this.width = width;      this.height = height;    }  }}@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor无参构造器、部分参数构造器、全参构造器。Lombok没法实现多种参数构造器的重载。 Lombok的优缺点优点:能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率让代码变得简洁,不用过多的去关注相应的方法属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等缺点:不支持多种参数构造器的重载虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度总结Lombok虽然有很多优点,但Lombok更类似于一种IDE插件,项目也需要依赖相应的jar包。Lombok依赖jar包是因为编译时要用它的注解,为什么说它又类似插件?因为在使用时,eclipse或IntelliJ IDEA都需要安装相应的插件,在编译器编译时通过操作AST(抽象语法树)改变字节码生成,变向的就是说它在改变java语法。它不像spring的依赖注入或者mybatis的ORM一样是运行时的特性,而是编译时的特性。这里我个人最感觉不爽的地方就是对插件的依赖!因为Lombok只是省去了一些人工生成代码的麻烦,但IDE都有快捷键来协助生成getter/setter等方法,也非常方便。知乎上有位大神发表过对Lombok的一些看法:这是一种低级趣味的插件,不建议使用。JAVA发展到今天,各种插件层出不穷,如何甄别各种插件的优劣?能从架构上优化你的设计的,能提高应用程序性能的 ,实现高度封装可扩展的..., 像lombok这种,像这种插件,已经不仅仅是插件了,改变了你如何编写源码,事实上,少去了代码你写上去又如何? 如果JAVA家族到处充斥这样的东西,那只不过是一坨披着金属颜色的屎,迟早会被其它的语言取代。虽然话糙但理确实不糙,试想一个项目有非常多类似Lombok这样的插件,个人觉得真的会极大的降低阅读源代码的舒适度。虽然非常不建议在属性的getter/setter写一些业务代码,但在多年项目的实战中,有时通过给getter/setter加一点点业务代码,能极大的简化某些业务场景的代码。所谓取舍,也许就是这时的舍弃一定的规范,取得极大的方便。我现在非常坚信一条理念,任何编程语言或插件,都仅仅只是工具而已,即使工具再强大也在于用的人,就如同小米加步枪照样能赢飞机大炮的道理一样。结合具体业务场景和项目实际情况,无需一味追求高大上的技术,适合的才是王道。Lombok有它的得天独厚的优点,也有它避之不及的缺点,熟知其优缺点,在实战中灵活运用才是王道。参考:https://projectlombok.org/features/https://github.com/rzwitserloot/lombok?spm=a2c4e.11153940.blogcont59972.5.2aeb6d32hayLHvhttps://www.zhihu.com/question/42348457https://blog.csdn.net/ghsau/article/details/52334762转载:https://www.cnblogs.com/heyonggang/p/8638374.html

百度贴吧一键签到Java源码

需要自己设置bduss,bduss设置方法:登录百度后在首页按F12,在调试窗口左上角Filter中填www.baidu.com 在Headers选项卡中Request Headers中找到BDUSS=复制其后的字符 赋值给代码中的bduss即可所需依赖:<dependency>    <groupId>org.apache.httpcomponents</groupId>    <artifactId>httpclient</artifactId>    <version>4.5.8</version></dependency><dependency>    <groupId>org.apache.httpcomponents</groupId>    <artifactId>httpcore</artifactId>    <version>4.4.6</version></dependency><dependency>    <groupId>org.apache.commons</groupId>    <artifactId>commons-lang3</artifactId>    <version>3.8.1</version></dependency><dependency>    <groupId>com.alibaba</groupId>    <artifactId>fastjson</artifactId>    <version>1.2.58</version></dependency>或者直接用commons-httpclient的依赖,commons-httpclient包含httpclient与httpcore包里部分内容      <dependency>          <groupId>commons-httpclient</groupId>          <artifactId>commons-httpclient</artifactId>          <version>3.1</version>      </dependency>如果你使用普通导jar包的Java项目,则需要的jar包除了以上之外还需要的jar有:commons-logging、commons-codec,可自行在Maven仓库下载代码:/** * Author: https://cway.top * Date: 2019/7/9 * Time: 10:35 * Description: 百度签到 */class BaiduSigner {    /**     * 百度签到     */    public static void main(String[] args) throws Exception {        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();        cm.setMaxTotal(200);             //    设置最大连接数        cm.setDefaultMaxPerRoute(10);    //    设置每个主机的并发数//        String bduss=args[0];        String bduss = "";          //    设置自己的bduss字符 或者从args获取        JSONObject tbs = (JSONObject) JSON.parse(getTbs(bduss, cm));        if (!tbs.getString("is_login").equals("1")) {            System.out.println("可能cookie失效咯");            return;        }        System.out.println("登录成功>>>>>");        String tbstr = tbs.getString("tbs");//        System.out.println(vipSign(tbstr, bduss, cm)); //vip一键签到 一般不需要        JSONObject jo = (JSONObject) JSON.parse(getForums(bduss, cm));        JSONObject forum_list = jo.getJSONObject("forum_list");        JSONArray jsonArray = forum_list.getJSONArray("non-gconforum");        System.out.println("获取列表成功>>>>>");        int n = 0;        int count = 0;        for (Object o : jsonArray) {            System.out.println("==========第" + ++n + "个==========");            JSONObject forum = (JSONObject) JSON.toJSON(o);            String id = forum.getString("id");            String name = forum.getString("name");            System.out.println("正在签到" + name + ":");            String signResult = signForums(name, id, tbstr, bduss, cm);            JSONObject result = (JSONObject) JSON.parse(signResult);            if (signResult.contains("error_code") && signResult.contains("error_msg")) {                System.out.println(result.getString("error_msg"));                continue;            }            JSONObject user_info = result.getJSONObject("user_info");            System.out.println("签到成功!经验+" + user_info.getString("sign_bonus_point") + ",今天第" + user_info.getString("user_sign_rank") + "个签到");            count++;        }        System.out.println("共签到成功" + count + "个贴吧");    }    /**     * 获取贴吧状态码 tbs     */    public static String getTbs(String bduss, PoolingHttpClientConnectionManager cm) throws Exception {        String header = "Cookie=" + "BDUSS=" + bduss;        return postClient("http://tieba.baidu.com/dc/common/tbs", header, "", cm).getResponseStr();    }    /**     * 获取所有关注贴吧     */    public static String getForums(String bduss, PoolingHttpClientConnectionManager cm) throws Exception {        String header = new StringBuilder().append("Cookie=BDUSS=").append(bduss).append("&")                .append("Content-Type=application/x-www-form-urlencoded&Charset=UTF-8&net=3&")                .append("User-Agent=bdtb for Android 8.4.0.1&Connection=Keep-Alive&Accept-Encoding=gzip&")                .append("Host=c.tieba.baidu.com").toString();        String md5Hex = DigestUtils.md5Hex(new StringBuilder().append("BDUSS=").append(bduss)                .append("_client_version=8.1.0.4page_no=1page_size=100tiebaclient!!!")                .toString());        String body = new StringBuilder().append("BDUSS=").append(bduss).append("&")                .append("_client_version=8.1.0.4&page_no=1&page_size=100&sign=")                .append(md5Hex).toString();        return postClient("http://c.tieba.baidu.com/c/f/forum/like", header, body, cm).getResponseStr();    }    /**     * 签到     */    public static String signForums(String name, String id, String tbs, String bduss, PoolingHttpClientConnectionManager cm) throws Exception {        String header = new StringBuilder().append("Cookie=BDUSS=").append(bduss).append("&")                .append("Content-Type=application/x-www-form-urlencoded&Charset=UTF-8&net=3&")                .append("User-Agent=bdtb for Android 8.4.0.1&Connection=Keep-Alive&Accept-Encoding=gzip&")                .append("Host=c.tieba.baidu.com").toString();        String md5Hex = DigestUtils.md5Hex(new StringBuilder().append("BDUSS=").append(bduss)                .append("fid=" + id + "kw=" + name + "tbs=" + tbs + "tiebaclient!!!")                .toString());        String body = new StringBuilder().append("BDUSS=").append(bduss)                .append("&fid=").append(id).append("&kw=").append(name)                .append("&sign=").append(md5Hex).append("&tbs=").append(tbs).toString();        return postClient("http://c.tieba.baidu.com/c/c/forum/sign", header, body, cm).getResponseStr();    }    /**     * VIP签到     */    public static String vipSign(String tbs, String bduss, PoolingHttpClientConnectionManager cm) throws Exception {        String firefoxHeader =                "Content-Type: application/x-www-form-urlencoded\n" +                        "Charset: UTF-8\n" +                        "net: 3\n" +                        "User-Agent: bdtb for Android 8.4.0.1\n" +                        "Connection: Keep-Alive\n" +                        "Accept-Encoding: gzip\n" +                        "Host: c.tieba.baidu.com";        firefoxHeader = firefoxHeader.replaceAll(": ", "=").replaceAll("\n", "&");        System.out.println("火狐:" + firefoxHeader);        String header = new StringBuilder().append("Cookie=BDUSS=").append(bduss).append("&")                .append(firefoxHeader).toString();        String body = new StringBuilder().append("ie=utf-8&tbs=").append(tbs).toString();        return postClient("http://tieba.baidu.com/tbmall/onekeySignin1", header, body, cm).getResponseStr();    }    /**     * post封装     *     * @param url    请求URL     * @param header 请求头     * @param body   请求体     * @param cm     cm连接池     * @return 返回Response与页面字符     * @throws Exception     */    public static ResponseVo postClient(String url, String header, String body, PoolingHttpClientConnectionManager cm) throws Exception {        CloseableHttpClient client = HttpClients.custom().setConnectionManager(cm).build();        HttpPost httpPost = new HttpPost(url);        if (StringUtils.isNotBlank(header)) {            for (Map.Entry<String, String> entry : covertParam(header)) {                httpPost.addHeader(entry.getKey(), entry.getValue());            }        }        List<NameValuePair> pairs = new ArrayList<>();        if (StringUtils.isNotBlank(body)) {            for (Map.Entry<String, String> entry : covertParam(body)) {                pairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));            }        }        UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(pairs, "utf-8");        httpPost.setEntity(formEntity);        String content = null;        CloseableHttpResponse response = null;        ResponseVo responseVo = null;        try {            //使用HttpClient发起请求            response = client.execute(httpPost);            //判断响应状态码是否为200            if (response.getStatusLine().getStatusCode() == 200) {                //如果为200表示请求成功,获取返回数据                content = EntityUtils.toString(response.getEntity(), "UTF-8");                responseVo = new ResponseVo().setResponse(response).setResponseStr(content);            }        } catch (Exception e) {            e.printStackTrace();        } finally {            //释放连接            if (response == null) {                try {                    response.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }        return responseVo;    }    /**     * 校验、转换参数     */    public static Set<Map.Entry<String, String>> covertParam(String params) throws Exception {        String[] paramses;        if (params.contains("=") && params.contains("&")) {            paramses = params.split("&");        } else if (params.contains("=") && !params.contains("&")) {            paramses = new String[1];            paramses[0] = params;        } else {            throw new Exception("参数请确保都为键值对形式");        }        Map<String, String> map = new HashMap<>();        for (String s : paramses) {            String[] ss = s.split("=");            map.put(ss[0], s.substring(ss[0].length() + 1));        }        return map.entrySet();    }}/** * 响应结果实体类 */class ResponseVo {    private String responseStr;    private CloseableHttpResponse response;    public ResponseVo(String responseStr, CloseableHttpResponse response) {        this.responseStr = responseStr;        this.response = response;    }    public ResponseVo() {    }    public String getResponseStr() {        return responseStr;    }    public ResponseVo setResponseStr(String responseStr) {        this.responseStr = responseStr;        return this;    }    public CloseableHttpResponse getResponse() {        return response;    }    public ResponseVo setResponse(CloseableHttpResponse response) {        this.response = response;        return this;    }}以下是非Maven版,即导jar包的版本,可以用cmd启动,试用期请编辑cmd文件中内容,另附源码:链接:https://pan.baidu.com/s/1mqWEYzYrxBYVqxrq-wON3g 提取码:fq91 复制这段内容后打开百度网盘手机App,操作更方便哦

MYSQL数据库删除重复数据行

下列Sql可用in,建议用existsSELECT *FROM coldknow aWHERE EXISTS ( SELECT title, img FROM coldknow GROUP BY title, img HAVING (COUNT(1) > 1 AND a.title = title AND a.img = img) ) AND NOT EXISTS ( SELECT MIN(id) FROM coldknow GROUP BY title, img HAVING COUNT(1) > 1 AND MIN(id) = id )a作为父表与虚拟子表进行关联,前exists存在父表字段与虚拟表相同的特征,后exists排除最小id的行,即保留重复记录中最小id的行

SpringMVC返回字符串/json数据到前台浏览器中文乱码问题

SpringMVC 直接返回字符串时,中文乱码出现问号(?)的问题,下列是各种解决方案:通过配置spring-mvc.xml//-- 在annotation-driven中添加converter<mvc:annotation-driven>    <mvc:message-converters>        <bean class="org.springframework.http.converter.StringHttpMessageConverter">            <constructor-arg ref="utf8Charset" />        </bean>    </mvc:message-converters></mvc:annotation-driven><bean id="utf8Charset" class="java.nio.charset.Charset" factory-method="forName">    <constructor-arg value="UTF-8" /></bean>或者<mvc:annotation-driven >    <!-- 消息转换器 -->        <mvc:message-converters register-defaults="true">          <bean class="org.springframework.http.converter.StringHttpMessageConverter">            <property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>          </bean>        </mvc:message-converters>    </mvc:annotation-driven>或者<mvc:annotation-driven>    <mvc:message-converters register-defaults="true">        <bean class="org.springframework.http.converter.StringHttpMessageConverter">            <property name="supportedMediaTypes">                <list>                    <value>text/html;charset=UTF-8</value>                    <value>application/json;charset=UTF-8</value>                    <value>text/plain;charset=UTF-8</value>                    <value>application/xml;charset=UTF-8</value>                </list>            </property>        </bean>    </mvc:message-converters></mvc:annotation-driven>或者<mvc:annotation-driven><mvc:message-converters register-defaults="true">        <bean class="cn.dubby.what.util.MyStringHttpMessageConverter"/></mvc:annotation-driven>在requestMapping中设置下编码即在RequestMapping使用(produces = “text/html; charset=utf-8”)produces 作用根据请求头中的Accept进行匹配,如请求头“Accept:text/html”时即可匹配。@RequestMapping(method = RequestMethod.POST,produces = "text/plain;charset=UTF-8")json的话produces就是(根据自己需要修改):produces = {"application/json;charset=UTF-8"}response返回页面的话可直接设置编码public static void write(HttpServletResponse response,Object o)throws Exception{    response.setContentType("text/html;charset=utf-8");    PrintWriter out=response.getWriter();    out.println(o.toString());    out.flush();    out.close();}

利用mybatis-generator根据数据库一键生成实体类与mapper代码

直接上文件吧。配置方法我都在上面有详细的配置了,看看即可。另外idea用户也可以依赖IDEA中的第三方插件生成代码,看个人需要与喜好了。Maven版本,该版本运行方法,打开idea创建Maven启动配置,在Command line行填写:mybatis-generator:generate -e如下图:下载链接:链接:https://pan.baidu.com/s/1W4Ua-3EfMc66J-lbpZbC_w提取码:i2wu普通项目版本下载链接:链接:https://pan.baidu.com/s/16P-_BX6gQrKcW4v83tSAsw提取码:9sdw

利用mybatis-generator根据数据库一键生成实体类与mapper代码

将亚马逊aws的ubuntu服务器的登陆方式改为密码登陆

首次登陆设置root密码    打开终端,输入命令sudo passwd,然后系统会让你输入新密码并确认,此时的密码就是root新密码。修改成功后,输入命令su root,再输入新的密码就ok了     切换为root用户,并且编辑sshd_config文件,PasswordAuthentication no,把no改成yes。使系统允许密码登陆su rootvim /etc/ssh/sshd_config重启ssh服务/etc/init.d/ssh restart    ssh位置因系统而异,由于aws ec2的ubuntu系统默认是以ubuntu这个账号名登录,因此也改下他的密码,用户是ubuntupasswd ubuntu提示输入两次密码5.此时还是不能用root登录,只能用ubuntu登陆,如果需要使用root用户登陆需要修改sshd_config文件vim /etc/ssh/sshd_config找到  PermitRootLogin 这项 将其改为 yes6.再次重启ssh服务。参考了以上链接可以使用下面的方式重启sshservice ssh  restart

Java获取web项目中的各种路径

request.getSession().getServletContext().getRealPath("/uploadfile/article"); 得到保存目录的真实路径request.getServletContext().getRealPath("/")  类似上面,获取项目所在服务器的全路径,如:D:\Program Files\apache-tomcat-7.0.25\webapps\TestSytem\request.getServletPath()    获取客户端请求的路径名,如:/object/delObject   就是除域名主体额外的部分request.getContextPath() 虚拟目录request.getSession().getServletContext().getContextPath()  也可以获得虚拟目录request.getServerName()    获取服务器地址,如:localhost request.getServerPort()    获取服务器端口,如8080request.getContextPath()    获取项目名称,如:TestSytemrequest.getLocalAddr()    获取本地地址,如:127.0.0.1request.getLocalName()    获取本地IP映射名,如:localhostrequest.getLocalPort()    获取本地端口,如:8090request.getRealPath("/")    获取项目所在服务器的全路径,如:D:\Program Files\apache-tomcat-7.0.25\webapps\TestSytem\request.getRemoteAddr()    获取远程主机地址,如:127.0.0.1request.getRemoteHost()    获取远程主机,如:127.0.0.1request.getRemotePort()    获取远程客户端端口,如:3623request.getRequestedSessionId()    获取会话session的ID,如:823A6BACAC64FB114235CBFE85A46CAArequest.getRequestURI()    获取包含项目名称的请求路径,如:/TestSytem/object/delObjectrequest.getRequestURL().toString()    获取请求的全路径,如:http://localhost:8090/TestSytem/object/delObject