基于Ant DesignPro Vue实现通过SpringBoot后台加载自定义菜单- 前后端分离

news2024/11/26 2:33:15

基于Ant DesignPro Vue实现通过SpringBoot后台加载自定义菜单- 前后端分离

本文想基于Ant DesignPro Vue构建的前端+SpringBoot实现的后端接口服务,实现前后端分离开发和独立运行,业务场景是登录认证,认证成功后返回该用户相应权限范围内可见的菜单。

Ant Design Pro相关系列文章:
一、AntDesign Pro安装过程
二、基于Ant DesignPro实现通过SpringBoot后台加载自定义菜单-前端部分
三、基于Ant DesignPro实现通过SpringBoot后台加载自定义菜单-SpringBoot后端部分
四、搭建Vue版Ant Design Pro后台管理系统
五、基于Ant DesignPro Vue实现通过SpringBoot后台加载自定义菜单- 前后端分离

目录

  • 基于Ant DesignPro Vue实现通过SpringBoot后台加载自定义菜单- 前后端分离
  • 一、通过Ant DesignPro Vue构建前端
  • 二、Ant DesignPro Vue前端对接后台服务接口
    • 1、去掉Mock
    • 2、vue.config.js 中配置api代理
    • 3、修改菜单加载是从后台服务接口请求
  • 三、创建Ant DesignPro后台服务SpringBoot项目
    • 1. File->New->Project
    • 2.编辑pom.xml,添加需要的依赖
    • 3.编辑application.properties
    • 4.创建依赖的实体类
      • 4.1 登录请求实体类UserLoginDto.java
      • 4.2 向前端画面传输的用户信息实体类 UserVo.java
      • 4.3 菜单实体类MenuVo.java
      • 4.4 菜单项实体类MenuMetaVo.java
    • 5.创建登录认证(/api/auth/)接口响应处理类
    • 6.创建用户(/api/user/)接口响应处理类
    • 7.创建Account(/api/account)接口响应处理类
  • 四、验证
    • 1.启动服务端
    • 2.启动前端
    • 3.访问前端画面

一、通过Ant DesignPro Vue构建前端

参见 搭建Vue版Ant Design Pro后台管理系统

二、Ant DesignPro Vue前端对接后台服务接口

1、去掉Mock

编辑src/main.js,把mock注释
在这里插入图片描述

2、vue.config.js 中配置api代理

在这里插入图片描述

说明:
上面target配置属性是指后台服务接口URL,默认格式为:target指定的Ulr/api/请求接口

在这里插入图片描述

3、修改菜单加载是从后台服务接口请求

在这里插入图片描述

三、创建Ant DesignPro后台服务SpringBoot项目

1. File->New->Project

第一步第二步
第三步
第四步

2.编辑pom.xml,添加需要的依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.5</version>
        <relativePath/>
    </parent>
    <groupId>cn.chinaelink.im</groupId>
    <artifactId>mcvboot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mcboot</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- 热部署加入的引用,1.spring-boot-devtools-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <!--json需要的依赖 -->
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib-ext-spring</artifactId>
            <version>1.0.2</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
		<!--重点:模板引擎,用于显示网页需要的依赖,如果不需要将静态页面放入当前工程,则不需要解注下面依赖-->
		<!-- 如果要在当前工程中加入静态页面,首先需要解注下面依赖,并在src/main/resources/目录下创建static和templates目录-->
		<!--
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        -->
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <includeSystemScope>true</includeSystemScope>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

3.编辑application.properties

#配置管理服务端口号,默认为8080
server.port=8080
#服务访问路径
server.servlet.context-path=/

# 输出的log文件名
logging.file.name=mc
# 输出的文件的路径
logging.file.path=./logs/mcv/
# 限制日志文件的大小
logging.file.max-size=10MB
# 日志的保存天数
logging.file.max-history=7

# 输出级别
logging.level.root=warn
logging.level.cn.com.hxyl.filebs=debug

# xml配置文件
logging.config=classpath:logback-spring.xml

#关闭缓存
#如果不需要将静态页面放入当前工程,则不需要解注下面依赖
#如果要在当前工程中加入静态页面,首先需要解注下面依赖,并将静态页面文件放入src/main/resources/static/目录下
#spring.thymeleaf.cache=false
#spring.thymeleaf.prefix=classpath:/static/
server.tomcat.threads.max=100
server.tomcat.threads.min-spare=30

#开启项目热部署
spring.devtools.restart.enabled=true

4.创建依赖的实体类

在这里插入图片描述

4.1 登录请求实体类UserLoginDto.java

package cn.chinaelink.im.mcvboot.dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class UserLoginDto {
    // 用户名
    private String username;
    // 密码
    private String password;
    // 手机号
    private String mobile;
    // 验证码
    private String captcha;
}

4.2 向前端画面传输的用户信息实体类 UserVo.java

package cn.chinaelink.im.mcvboot.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class UserVo {
    private String id;
    private String name;
    private String username;
    private String password;
    private String avatar;
    private int status;
    private String telephone;
    private String lastLoginIp;
    private long lastLoginTime;
    private String creatorId;
    private long createTime;
    private int deleted;
    private String roleId;
    private String lang;
    private String token;
}

4.3 菜单实体类MenuVo.java

package cn.chinaelink.im.mcvboot.vo.menu;

import lombok.Data;

@Data
public class MenuVo {
    private String name;
    private int id;
    private int parentId;
    private String component;
    private String redirect;
    private String path;
    private MenuMetaVo meta;
}

4.4 菜单项实体类MenuMetaVo.java

package cn.chinaelink.im.mcvboot.vo.menu;

import lombok.Data;

@Data
public class MenuMetaVo {
    private String title;
    private String icon;
    private String target;
    private boolean show;
}

5.创建登录认证(/api/auth/)接口响应处理类

所以有接口实现都是参见src/mock/services/目录的相应的模拟接口js的结果定义的

在这里插入图片描述

AuthController类

import cn.chinaelink.im.mcvboot.dto.UserLoginDto;
import cn.chinaelink.im.mcvboot.vo.UserVo;
import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Optional;
import java.util.Random;
import java.util.UUID;

@Controller
@Slf4j
@RequestMapping("/api/auth")
public class AuthController {
    @PostMapping("/login")
    @ResponseBody
    public String login(@RequestBody UserLoginDto userLoginDto) {
        JSONObject resJson = new JSONObject();
        if (Optional.ofNullable(userLoginDto.getUsername()).isPresent() &&
                ("ant.design".equals(userLoginDto.getPassword()) ||
                        "admin".equals(userLoginDto.getUsername()))
        ) {
            UserVo userVo = getAdminUserVo();
            resJson.put("result",JSONObject.fromObject(userVo).toString());
            resJson.put("message","认证成功");
            resJson.put("code",200);
            resJson.put("_status", 200);
            resJson.put("token",userVo.getToken());
            return resJson.toString();
        } else if(Optional.ofNullable(userLoginDto.getMobile()).isPresent()){
            UserVo userVo =  getAdminUserVo();
            resJson.put("result",JSONObject.fromObject(userVo).toString());
            resJson.put("message","认证成功");
            resJson.put("code",200);
            resJson.put("_status", 200);
            resJson.put("token",userVo.getToken());
            return resJson.toString();
        }
        JSONObject result = new JSONObject();
        result.put("isLogin", true);
        resJson.put("result",result);
        resJson.put("message","错误的用户名和密码,请确认后重试!");
        resJson.put("code",401);
        resJson.put("_status", 401);
        return resJson.toString();
    }

    @PostMapping("/2step-code")
    @ResponseBody
    public JSONObject twoFactor() {
        JSONObject resJson = new JSONObject();
        JSONObject dataJson = new JSONObject();
        dataJson.put("stepCode",new Random().nextInt(1));
        resJson.put("result", dataJson);
        return resJson;
    }

    @PostMapping("/logout")
    @ResponseBody
    public JSONObject logout() {
        JSONObject data = new JSONObject();
        data.put("result", new JSONObject());
        data.put("message", "");
        return data;
    }

    private UserVo getAdminUserVo() {
        UserVo userVo = new UserVo();
        userVo.setId(UUID.randomUUID().toString());
        userVo.setName("超级管理员");
        userVo.setUsername("admin");
        userVo.setAvatar("https://gw.alipayobjects.com/zos/rmsportal/jZUIxmJycoymBprLOUbT.png");
        userVo.setStatus(1);
        userVo.setLastLoginTime(System.currentTimeMillis());
        userVo.setCreatorId("admin");
        userVo.setCreateTime(System.currentTimeMillis());
        userVo.setRoleId("admin");
        userVo.setLang("zh-CN");
        userVo.setToken("4291d7da9005377ec9aec4a71ea837f");
        return userVo;
    }
}

6.创建用户(/api/user/)接口响应处理类

package cn.chinaelink.im.mcvboot.controller.api;

import cn.chinaelink.im.mcvboot.vo.menu.MenuMetaVo;
import cn.chinaelink.im.mcvboot.vo.menu.MenuVo;
import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.List;

@Controller
@Slf4j
@RequestMapping("/api/user")
public class UserController {
    @RequestMapping("/info")
    @ResponseBody
    public JSONObject info(){
        JSONObject userInfoJson = new JSONObject();

        userInfoJson.put("id", "4291d7da9005377ec9aec4a71ea837f");
        userInfoJson.put("name", "天野远子");
        userInfoJson.put("username", "admin");
        userInfoJson.put("password", "");
        userInfoJson.put("avatar", "/avatar2.jpg'");
        userInfoJson.put("status", 1);
        userInfoJson.put("telephone", "");
        userInfoJson.put("lastLoginIp", "27.154.74.117");
        userInfoJson.put("lastLoginTime", 1534837621348L);
        userInfoJson.put("creatorId", "admin'");
        userInfoJson.put("createTime", 1497160610259L);
        userInfoJson.put("merchantCode", "TLif2btpzg079h15bk'");
        userInfoJson.put("deleted", 0);
        userInfoJson.put("roleId", "admin'");

        JSONObject roleObj = new JSONObject();
        roleObj.put("id","admin");
        roleObj.put("name","管理员");
        roleObj.put("describe","拥有所有权限");
        roleObj.put("status", 1);
        roleObj.put("creatorId","system");
        roleObj.put("createTime",1497160610259L);
        roleObj.put("deleted", 0);
        JSONArray permissionArray = new JSONArray();
        JSONObject permission1 = new JSONObject();
        permission1.put("roleId","admin");
        permission1.put("permissionId","dashboard");
        permission1.put("permissionName","仪表盘");
        permission1.put("actions","[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]");

        JSONArray actionEntitySet = new JSONArray();
        JSONObject actionEntity1 = new JSONObject();
        actionEntity1.put("action", "add");
        actionEntity1.put("describe", "新增");
        actionEntity1.put("defaultCheck", false);
        actionEntitySet.add(actionEntity1);

        JSONObject actionEntity2 = new JSONObject();
        actionEntity2.put("action", "query");
        actionEntity2.put("describe", "查询");
        actionEntity2.put("defaultCheck", false);
        actionEntitySet.add(actionEntity2);

        JSONObject actionEntity3 = new JSONObject();
        actionEntity3.put("action", "get");
        actionEntity3.put("describe", "详情");
        actionEntity3.put("defaultCheck", false);
        actionEntitySet.add(actionEntity3);

        JSONObject actionEntity4 = new JSONObject();
        actionEntity4.put("action", "update");
        actionEntity4.put("describe", "修改");
        actionEntity4.put("defaultCheck", false);
        actionEntitySet.add(actionEntity4);

        JSONObject actionEntity5 = new JSONObject();
        actionEntity5.put("action", "delete");
        actionEntity5.put("describe", "删除");
        actionEntity5.put("defaultCheck", false);
        actionEntitySet.add(actionEntity5);

        permission1.put("actionEntitySet", actionEntitySet);
        permission1.put("actionList", null);
        permission1.put("dataAccess", null);
        permissionArray.add(permission1);

        JSONObject permission2 = new JSONObject();
        permission2.put("roleId","admin");
        permission2.put("permissionId","exception");
        permission2.put("permissionName","异常页面权限");
        permission2.put("actions","[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]");

        JSONArray actionEntitySet2 = new JSONArray();
        JSONObject actionEntity21 = new JSONObject();
        actionEntity21.put("action", "add");
        actionEntity21.put("describe", "新增");
        actionEntity21.put("defaultCheck", false);
        actionEntitySet2.add(actionEntity21);

        JSONObject actionEntity22 = new JSONObject();
        actionEntity22.put("action", "query");
        actionEntity22.put("describe", "查询");
        actionEntity22.put("defaultCheck", false);
        actionEntitySet2.add(actionEntity22);

        JSONObject actionEntity23 = new JSONObject();
        actionEntity23.put("action", "get");
        actionEntity23.put("describe", "详情");
        actionEntity23.put("defaultCheck", false);
        actionEntitySet2.add(actionEntity23);

        JSONObject actionEntity24 = new JSONObject();
        actionEntity24.put("action", "update");
        actionEntity24.put("describe", "修改");
        actionEntity24.put("defaultCheck", false);
        actionEntitySet2.add(actionEntity24);

        JSONObject actionEntity25 = new JSONObject();
        actionEntity25.put("action", "delete");
        actionEntity25.put("describe", "删除");
        actionEntity25.put("defaultCheck", false);
        actionEntitySet2.add(actionEntity25);

        permission2.put("actionEntitySet", actionEntitySet2);
        permission2.put("actionList", null);
        permission2.put("dataAccess", null);
        permissionArray.add(permission2);
        roleObj.put("permissions", permissionArray);
        userInfoJson.put("role", roleObj);

        JSONObject body = new JSONObject();
        body.put("result", userInfoJson);
        return body;
    }
    @RequestMapping("/nav")
    @ResponseBody
    public JSONObject getUserMenus(){
        List<MenuVo> dataArray = new ArrayList<>();
        MenuVo menu1 = new MenuVo();
        menu1.setId(1);
        menu1.setParentId(0);
        menu1.setName("dashboard");
        menu1.setComponent("RouteView");
        menu1.setRedirect("/dashboard/workplace");
        MenuMetaVo meta1 = new MenuMetaVo();
        meta1.setTitle("menu.dashboard");
        meta1.setIcon("dashboard");
        meta1.setShow(true);
        menu1.setMeta(meta1);
        dataArray.add(menu1);

        MenuVo menu2 = new MenuVo();
        menu2.setId(7);
        menu2.setParentId(1);
        menu2.setName("workplace");
        menu2.setComponent("Workplace");
        MenuMetaVo meta2 = new MenuMetaVo();
        meta2.setTitle("menu.dashboard.monitor");
        meta2.setShow(true);
        menu2.setMeta(meta2);
        dataArray.add(menu2);

        MenuVo menu3 = new MenuVo();
        menu3.setId(3);
        menu3.setParentId(1);
        menu3.setName("monitor");
        menu3.setPath("https://www.baidu.com/");
        MenuMetaVo meta3 = new MenuMetaVo();
        meta3.setTitle("menu.dashboard.workplace");
        meta3.setTarget("_blank");
        meta3.setShow(true);
        menu3.setMeta(meta3);
        dataArray.add(menu3);

        MenuVo menu4 = new MenuVo();
        menu4.setId(2);
        menu4.setParentId(1);
        menu4.setName("Analysis");
        menu4.setComponent("Analysis");
        menu4.setPath("/dashboard/analysis");
        MenuMetaVo meta4 = new MenuMetaVo();
        meta4.setTitle("menu.dashboard.analysis");
        meta4.setShow(true);
        menu4.setMeta(meta4);
        dataArray.add(menu4);

        // Form
        MenuVo menu5 = new MenuVo();
        menu5.setId(10);
        menu5.setParentId(0);
        menu5.setName("form");
        menu5.setComponent("RouteView");
        menu5.setRedirect("/form/base-form");
        MenuMetaVo meta5 = new MenuMetaVo();
        meta5.setTitle("menu.form");
        meta5.setIcon("form");
        menu5.setMeta(meta5);
        dataArray.add(menu5);

        MenuVo menu6 = new MenuVo();
        menu6.setId(6);
        menu6.setParentId(10);
        menu6.setName("basic-form");
        menu6.setComponent("BasicForm");
        MenuMetaVo meta6 = new MenuMetaVo();
        meta6.setTitle("menu.form.basic-form");
        menu6.setMeta(meta6);
        dataArray.add(menu6);

        MenuVo menu7 = new MenuVo();
        menu7.setId(5);
        menu7.setParentId(10);
        menu7.setName("step-form");
        menu7.setComponent("StepForm");
        MenuMetaVo meta7 = new MenuMetaVo();
        meta7.setTitle("menu.form.step-form");
        menu7.setMeta(meta7);
        dataArray.add(menu7);

        MenuVo menu8 = new MenuVo();
        menu8.setId(4);
        menu8.setParentId(10);
        menu8.setName("advanced-form");
        menu8.setComponent("AdvanceForm");
        MenuMetaVo meta8 = new MenuMetaVo();
        meta8.setTitle("menu.form.advanced-form");
        menu8.setMeta(meta8);
        dataArray.add(menu8);

        // List
        MenuVo menu9 = new MenuVo();
        menu9.setId(10010);
        menu9.setParentId(0);
        menu9.setName("list");
        menu9.setComponent("RouteView");
        menu9.setRedirect("/list/table-list");
        MenuMetaVo meta9 = new MenuMetaVo();
        meta9.setTitle("menu.list");
        meta9.setIcon("table");
        meta9.setShow(true);
        menu9.setMeta(meta9);
        dataArray.add(menu9);

        MenuVo menu10 = new MenuVo();
        menu10.setId(10011);
        menu10.setParentId(10010);
        menu10.setName("table-list");
        menu10.setComponent("TableList");
        menu10.setPath("/list/table-list/:pageNo([1-9]\\d*)?");
        MenuMetaVo meta10 = new MenuMetaVo();
        meta10.setTitle("menu.list.table-list");
        meta10.setShow(true);
        menu10.setMeta(meta10);
        dataArray.add(menu10);

        MenuVo menu11 = new MenuVo();
        menu11.setId(10012);
        menu11.setParentId(10010);
        menu11.setName("basic-list");
        menu11.setComponent("StandardList");
        MenuMetaVo meta11 = new MenuMetaVo();
        meta11.setTitle("menu.list.basic-list");
        meta11.setShow(true);
        menu11.setMeta(meta11);
        dataArray.add(menu11);

        JSONObject body = new JSONObject();
        body.put("result", dataArray);
        return body;
    }
}

7.创建Account(/api/account)接口响应处理类

package cn.chinaelink.im.mcvboot.controller.api;

import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.Random;

@Controller
@Slf4j
@RequestMapping("/api/account")
public class AccountController {

    @RequestMapping("/sms")
    @ResponseBody
    public String smsCaptcha() {
        Random random = new Random();
        int num = random.nextInt(89999) + 10000;
        JSONObject data = new JSONObject();
        data.put("captcha", num);

        JSONObject response = new JSONObject();
        response.put("result", data);
        return response.toString();
    }
}

四、验证

1.启动服务端

在这里插入图片描述

启动成功后可以通过浏览器访问http://127.0.0.1:8080/

2.启动前端

在命令行进入前端代码所在目录后,执行下面的命令

D:\work\JavaTeam\workspace\IdeaProjects\antDesignPro\antdvPromc> yarn run serve

在这里插入图片描述

3.访问前端画面

在这里插入图片描述
在这里插入图片描述

说明:
通过访问,前端已正常通过http://192.168.0.100:8080这个后端服务接口登录认证成功,并成功的获取到后台返回的菜单(只返回了两项一级菜单)

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

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

相关文章

C语言杂记(指针篇)

指针篇 指针就是地址&#xff0c;地址就是指针 指针变量就是存放地址的变量 *号只有定义的时候表示定义指针变量&#xff0c;其他表示从地址里面取内容 通过指针的方法使main函数中的data1和data2发生数据交换。 #include <stdio.h> void chang_data(int *data1,int *da…

Flutter知识点(二)处理Json

flutter不支持反射&#xff0c;所以本来很简单的事情&#xff0c;一下子变复杂了。当然官方也提供了一些工具来方便开发者。 由于Dart的map和array的数据结构和json一样&#xff0c;所以在flutter中&#xff0c;变成了json string与Map&#xff0c;array之间的砖换。 &#x…

MYSQL数据库学习

数据库的基本概念 什么是数据库&#xff1f; 数据库&#xff08;database&#xff09;是用来组织 存储和管理数据的仓库。 当今世界是一个充满着数据的互联网世界&#xff0c;充斥着大量的数据。数据的来源有很多&#xff0c;比如出行记录 消费记录 浏览的网页 发送的信息等等…

《C++ Primer》 第十一章 关联容器

《C Primer》 第十一章 关联容器 11.1 使用关联容器 使用map: //统计每个单词在输入中出现的次数 map<string, size_t> word_count;//string到size_t的空map string word; while(cin>>word)word_count[word];//提取word的计数器并将其加1 for(const auto &w:…

Linux系统之部署Gitblit服务器

Linux系统之部署Gitblit服务器一、Gitblit介绍1.Gitblit简介2..Gitblit官网二、检查本地系统环境1.检查系统版本2.检查系统内核版本3.检查JDK版本三、下载Gitblit1.创建下载目录2.下载Gitblit软件包2.解压Gitblit软件包四、Gitblit的配置工作1.修改配置文件2.修改service-cento…

【小程序】如何实现一个可折叠的列表

作者刚接触小程序开发不久&#xff0c;打算用 CSDN 把学习过程中遇到的一些问题记录下来&#xff0c;都是一些浅显易懂的内容&#xff0c;希望对你也有所帮助。 如文章标题所示&#xff0c;作者要实现一个可折叠的列表&#xff0c;先来看一下页面效果&#xff1a; 这种展示方式…

ChatGPT API 低价上线,开发者可以人手一个了?

千呼万唤&#xff0c;ChatGPT API来了&#xff01; 不仅首发&#xff0c;价格居然还有惊喜&#xff0c;0.002美元/每1000 token&#xff0c;并将价格降低90%&#xff0c;直接打了1折。OpenAI官方还表示&#xff0c;gpt-3.5-turbo目前的版本代号是gpt-3.5-turbo-0301&#xff0…

【面试系列】equals和==的区别

问题&#xff1a;两个对象值相同(x.equals(y) true)&#xff0c;但是可能存在hashCode不同吗? 的定义 比较的是两个对象的内存地址&#xff0c;相等则意味着内存地址一样。 对象的equals方法 Object#equals public boolean equals(Object obj) {return (this obj);}Stri…

数据结构——基本概念

数据数据&#xff1a;是描述客观事物的符号&#xff0c;是计算机中可以操作的对象&#xff0c;是能被计算机识别&#xff0c;并输入给计算机处理的符号的集合。数据元素&#xff1a;是组成数据的&#xff0c;有一定意义的基本单位&#xff0c;在计算机中通常作为整体处理&#…

基于上下文分析的 Python 实时 API 推荐

原文来自微信公众号“编程语言Lab”&#xff1a;基于上下文分析的 Python 实时 API 推荐 搜索关注 “编程语言Lab”公众号&#xff08;HW-PLLab&#xff09;获取更多技术内容&#xff01; 欢迎加入 编程语言社区 SIG-程序分析 参与交流讨论&#xff08;加入方式&#xff1a;添加…

ICLR 2023 | LightGCL: 简单且高效的图对比学习推荐系统

论文题目&#xff1a;LightGCL: Simple Yet Effective Graph Contrastive Learning for Recommendation收录会议&#xff1a;ICLR 2023论文链接&#xff1a;https://arxiv.org/abs/2302.08191代码链接&#xff1a;https://github.com/HKUDS/LightGCL港大数据智能实验室 &#x…

billu_box靶场通关

billu靶场通关 靶机ip&#xff1a;192.168.112.134 信息收集 端口开放 80 目录扫描 images目录存在目录遍历 test.php(任意文件下载) add.php(文件上传) index.php(主页) head.php show.php c.php这个工具的字典不全&#xff0c;换py脚本重新扫多出了以下目录 phpmy in …

目标检测YOLOv5数据集怎么找?

完整的配置-标注-训练-识别在我这篇博客小白YOLOv5全流程-训练实现数字识别_yolov5数字识别_牛大了2022的博客-CSDN博客 模型部分剖析可以看我每周深度学习笔记部分。关于训练的数据集怎么搞很多人问过我&#xff0c;我在这篇文章给大家一点我的经验和建议。 数据集是什么 简…

Leetcode每日一题 1487. 保证文件名唯一

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

网上心理咨询系统的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;高等院校担负着培养高素质人才的使命&#xff0c;高素质人才不仅要有良好的思想道德素质、科学文化素质和身体素质&#xff0c;更要有良好的心理素质。然而随着近年来我国高校的连续扩招以及高额的学费居高不下&#xff0c;当代的大…

工程项目管理软件有哪些?这六款很好用!

工程项目管理软件哪个好用&#xff1f;这六款很不错&#xff01; 在现代社会中&#xff0c;软件已经成为了企业信息化、项目管理等方面必不可少的工具。尤其是对于工程项目管理而言&#xff0c;借助软件进行协同、计划、控制等方面的工作&#xff0c;已经成为了必要的手段。但…

钡铼技术BL302 ARM工控机QT图形化界面开发的实践

QT是一种跨平台的应用程序框架&#xff0c;用于开发图形用户界面(GUI)、网络应用程序和嵌入式应用程序。QT提供了丰富的GUI组件和工具&#xff0c;使开发人员能够轻松地创建专业级别的应用程序。QT使用C编写&#xff0c;支持多种操作系统&#xff0c;包括Windows、Linux、macOS…

tuts4you上lena‘s40个crackme(1)

本来是不打算写文章了&#xff0c;因为懒&#xff0c;想以后通过录屏的形式保存一下自己学的路程。但奈何开学后一直没找到机会&#xff0c;在宿舍也不愿意大吼大叫的讲东西&#xff0c;只好再写写文章了 最近学了一些汇编语言和逆向工程&#xff0c;所以就想通过这40给题目来看…

hashCode 和 equals 的处理

文章目录hashCode 和 equals 的处理1. 阿里巴巴编程规范要求2. equals和hashcode的分析2.1 Object方法2.2 只覆写&#xff08;Override&#xff09;equals带来的问题问题演示问题分析问题处理hashCode 和 equals 的处理 1. 阿里巴巴编程规范要求 2. equals和hashcode的分析 2…

python实战应用讲解-【numpy专题篇】函数(附python示例代码)

NumPy 数学函数 NumPy 包含大量的数学运算的函数,包括三角函数,算术运算的函数,复数处理函数等。 三角函数 NumPy 提供了标准的三角函数:sin()、cos()、tan()等 import numpy as npa = np.array([0, 30, 45, 60, 90]) print(不同角度的正弦值:) # 通过乘 pi/180 转化…