项目实战(cloud)--配置中心Config(码云来做一个配置中心)

news2024/11/18 3:40:21

 服务的拆分原则:

 单体应用向微服的一个改造:

 搭建一个聚合项目

创建一个maven项目  父项目

pom

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.pb</groupId>
    <artifactId>parent</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>register</module>
        <module>gateway</module>
        <module>member</module>
    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR5</spring-cloud.version>
        <mysql.version>5.1.48</mysql.version>
        <mybatis-spring.version>2.2.1</mybatis-spring.version>
        <lombok.version>1.16.18</lombok.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

yml

spring:
  application:
    name: register
server:
  port: 8761
eureka:
  client:
    fetch-registry: false
    register-with-eureka: false

启动类:

@EnableEurekaServer
@SpringBootApplication
public class RegisterApp {
    public static void main(String[] args) {
        SpringApplication.run(RegisterApp.class,args);
    }
}

 yml

spring:
  application:
    name: gateway

server:
  port: 9000

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

启动类:

 创建模块:(member)

pom

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>parent</artifactId>
        <groupId>com.pb</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>member</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

</project>

创建数据库

CREATE TABLE `t_member` (
  `mid` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `idno` varchar(50) DEFAULT NULL,
  `mobile` varchar(50) DEFAULT NULL,
  `regdate` date DEFAULT NULL,
  `expdate` date DEFAULT NULL,
  PRIMARY KEY (`mid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gbk

实体类:

@Data
@Entity
@Table(name="t_member")
public class Member implements Serializable {
    private static final long serialVersionUID = 7796360948254473734L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long mid;
    private String name;
    private String idno;
    private String mobile;
    private Date regdate;
    private Date expdate;
}

repositroy--MemberRepository

public interface MemberRepository extends JpaRepository<Member, Long> {

    /**
     * 根据手机号码查询会员信息
     * @param mobile
     * @return
     */
    List<Member> findMemberByMobile(String mobile);
}

自定义异常

package com.pb.exception;
//spring的事物有回滚,默认出现异常回滚的是RuntimeException
public class MemberNotFoundException extends RuntimeException {
    public MemberNotFoundException(String message) {
        super(message);
    }
}

 service

 impl

@Service
public class MemberServiceImpl implements MemberService {
    @Autowired
    private MemberRepository memberRepository;

    //@Transactional(rollbackFor=Exception.class)
    @Override
    public Member findMemberByMobile(String mobile) {
        List<Member> list = memberRepository.findMemberByMobile(mobile);
        if(list.size() <= 0) {
            throw new MemberNotFoundException("会员未找到");  //这里自动异常回向上抛出MemberNotFoundException
        }
        Member member = list.get(0);
        return member;
    }
}

controller

@RestController
public class MemberController {

    @Autowired
    private MemberService memberService;

    @CrossOrigin
    @RequestMapping("/selectMemberByMobile")
    public Map<String, Object> selectMemberByMobile(String mobile) {
        Map<String, Object> map = new HashMap<>();
        //给异常
        try {
            Member member = memberService.findMemberByMobile(mobile);
            map.put("code", 200);
            map.put("msg", "success");
            map.put("data", member);
        } catch (Exception e) {
            e.printStackTrace();
            map.put("code", 500);
            map.put("msg", e.getMessage());
            System.out.println(e);
            System.out.println(e.getMessage());

        }
        return map;
    }

}

启动getway

 引入一个html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>layui</title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="https://cdn.bootcss.com/weui/1.1.2/style/weui.min.css">
    <link rel="stylesheet" href="https://cdn.bootcss.com/jquery-weui/1.2.0/css/jquery-weui.min.css">

    <!-- 注意:如果你直接复制所有代码到本地,上述css路径需要改成你本地的 -->
</head>
<body>
<h2 style="text-align: center">图书借阅登记</h2>
<form id="frmBorrow" action="">
    <div class="weui-cells weui-cells_form">
        <div class="weui-cells__title">手机号<span id="errMobile" style="margin-left:10px;color: red"></span>
            <span id="succMobile" style="margin-left:10px;color: green"></span>
        </div>

        <div class="weui-cell weui-cell_vcode">
            <div class="weui-cell__bd">
                <input id="mobile" name="mobile" class="weui-input" type="tel" placeholder="请输入手机号">
            </div>
            <div class="weui-cell__ft">
                <button id="btnCheck" type="button" class="weui-vcode-btn">获取验证码</button>
            </div>
        </div>
        <div class="weui-cells__title">验证码</div>
        <div class="weui-cell weui-cell_vcode">
            <div class="weui-cell__bd">
                <input class="weui-input"  type="number" placeholder="请输入6位验证码">
            </div>

        </div>
        <div class="weui-cells__title">借阅图书</div>
        <div class="weui-cell">
            <div class="weui-cell__bd">
                <input class="weui-input" id="name" name="name" type="text" placeholder="请选择要借阅的图书">
                <input type="hidden" name="bid" id="bid">
            </div>
        </div>

        <div class="weui-cells__title">借阅时间</div>
        <div class="weui-cell">
            <div class="weui-cell__bd">
                <input type="text" name="takedate" class="weui-input" placeholder="请选择取书日期" id='takedate'/>
            </div>
        </div>

        <div class="weui-cells__title">归还时间</div>
        <div class="weui-cell">
            <div class="weui-cell__bd">
                <input type="text" name="returndate" class="weui-input" placeholder="请选择还书日期" id='returndate'/>
            </div>
        </div>
        <br>
        <a href="javascript:;" id="btnSubmit" class="weui-btn weui-btn_primary">提交</a>
    </div>

</form>
<script src="https://cdn.bootcss.com/jquery/1.11.0/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/jquery-weui/1.2.0/js/jquery-weui.min.js"></script>

<script>
    $("#takedate,#returndate").calendar({
        dateFormat: "yyyy-mm-dd"
    });

	$("#btnCheck").click(function(){
		var mobile = $("#mobile").val();
        $.ajax({
            type:"post",
            url:"http://localhost:9000/member/selectMemberByMobile",
            data:{mobile: mobile},
            dataType:"json",
            success:function (res){
                console.log(res);
            }

        })

	});

    //我们先来通过ajax进行所有数据的查询超操作,并通过下拉菜单进行展示
    var name = $("#name").val();


</script>
</body>
</html>

$("#btnCheck").click(function(){
		var mobile = $("#mobile").val();
        $.ajax({
            type:"post",
            url:"http://localhost:9000/member/selectMemberByMobile",
            data:{mobile: mobile},
            dataType:"json",
            success:function (res){
                console.log(res);
                if (res.code == 200){
                    $("#succMobile").text("会员:"+res.data.name);
                    $("#succMobile").show();
                    $("#errMobile").hide();
                }else {
                    $("#errMobile").text(res.msg);
                    $("#succMobile").hide();
                    $("#errMobile").show();
                }

            }

        })

	});

 

配置中心Config

进入到码云来做一个配置中心,官方网址为:Gitee - 企业级 DevOps 研发效能平台

然后你可以申请一个密码进行登录即可

然后我们点击红色的部门新建一个项目

 创建项目:

 创建完成后会出现如下界面:

然后点击文件里面的新建文件进行操作:

 然后点击提交,如下图所示:

 让后我们通过idea创建配置中心项目:

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>parent</artifactId>
        <groupId>com.pb</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>config</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!--配置中心的服务端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
    </dependencies>



</project>

然后设置config项目的yml文件:

spring:
  application:
    name: config
  #配置配置中心
  cloud:
    config:
      server:
        git:
          #刚才您创建项目时候登记的远程地址
          uri: https://gitee.com/light_breeze_dawn/sc-config
          username: xxxxxxxx
          password: xxxxxxxx
server:
  port: 9100

设置主启动类:

package com.laosan.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient     //开启向注册中心注册
@EnableConfigServer     //启用配置中心
public class ConfigApplication {
   public static void main(String[] args) {
      SpringApplication.run(ConfigApplication.class, args);
   }
}

最后启动所有的服务包括配置中心,如下图所示:

 我们所有的服务都启动起来了,然后我们把浏览器打开进行对配置中心的测试,但是还是会报错,根本查询不到我要的数据不能从配置中心把数据拿回来,如下图所示:

这个是非常容易犯的一个错误

因为我们在访问配置中心的时候是需要一定的格式的,具体的格式是http://localhost:9100/clientid-profile.yml|xml|json,这么写才可以,我们上面浏览器里面写的地址是不正确的不符合我们需要的格式

在配置中心我们添加2个文件名字分别member-dev.yml 和member-prd.yml,具体的内容如下所述:

 

 

 我们看到我们根据配置中心来添加两个对应的文件,根据这两个文件我们可以在浏览器中输入如下地址,如下图所示:

你会发现当我们输入上图的地址后他给我们现实了member-dev.yml里面的端口还会把member.yml的公共部分现实出来呢,server.port会以member-dev.yml的为准

我们来换个地址,如下图所示:

你也会发现他把所有的member.yml文件的公共部分显示过来,至于端口号部分只显示member-prd.yml里面设置的端口号

综上所述我们在配置中心可以设置一个公共的yml文件,然后设置几个不同的配置的yml文件,反问某一个的时候会把公共的部分也进行加载

当然配置中心不仅仅能显示一种yml文件,它还能显示json, properties,xml等格式的文件,你只需要把后缀名切换成json,properties或者是xml即可,但是xml文件不支持暂时

如下图:

现在我们要把我们的配置中心的项目member做远程的连接和我的配置中心做连接具体的操作如下所示:

我们要把resources目录下的application.yml删除

然后在resources目录中创建一个新的文件叫bootstrap.yml,为什么要切换成这个文件呢,是因为配置中心强制要求bootstrap.yml这个文件,并且必须是这个

具体的配置,如下所示:

spring:
  application:
    name: member   #这里的名字必须要和Eureka中的服务名称,和配置中心的名字保持一致

  #开启配置中心
  cloud:
    config:
      discovery:
        enabled: true
        service-id: config   #这里的名字要和我Eureka服务中的配置中心名称的服务保持一致

#注册进服务
eureka:
  client:
    service-url:
      defaultZone: defaultZone: http://localhost:8761/eureka/

让后我们启动项目member,但是它会报错,因为我们少了一个依赖,就是配置中心的客户端:

<!--配置中心的客户端-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-client</artifactId>
</dependency>

但是我们启动后依旧会报错,我们需要再次更改bootstrap.yml配置文件:

spring:
  application:
    name: member   #这里的名字必须要和Eureka中的服务名称,和配置中心的名字保持一致

  #开启配置中心
  cloud:
    config:
      discovery:
        enabled: true
        service-id: config   #这里的名字要和我Eureka服务中的配置中心名称的服务保持一致

#找的是配置中心的哪个配置文件,因为在配置中心中我有两个类型的文件一个是dev一个是prd

#注意上线的时候把dev切换成prd就OK了
      profile: dev     
#注册进服务
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

eureka可以不写

#注册进服务
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

见到如下操作表明成功

 我们可以在浏览器中输入地址进行测试即可,如返回对应信息表明OK:

构建图书管理模块:

创建项目:(book)

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>parent</artifactId>
        <groupId>com.pb</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>book</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-client</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

</project>

bootstrap.yml

spring:
  application:
    name: book   #这里的名字必须要和Eureka中的服务名称,和配置中心的名字保持一致

  #开启配置中心
  cloud:
    config:
      discovery:
        enabled: true
        service-id: config   #这里的名字要和我Eureka服务中的配置中心名称的服务保持一致
      #找的是配置中心的哪个配置文件,因为在配置中心中我有两个类型的文件一个是dev一个是prd
      #注意上线的时候把dev切换成prd就OK了
      profile: dev

然后到我们的git的仓库中进行创建yml文件名字叫做book-dev.yml,具体的内容如下所示:

 

好下面我们开始对book项目进行操作:

数据库:

/*
SQLyog Professional v13.1.1 (64 bit)
MySQL - 5.7.29 : Database - scbook
*********************************************************************
*/

/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`scbook` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `scbook`;

/*Table structure for table `t_book` */

DROP TABLE IF EXISTS `t_book`;

CREATE TABLE `t_book` (
  `bid` int(11) NOT NULL AUTO_INCREMENT,
  `sn` varchar(20) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  `author` varchar(20) DEFAULT NULL,
  `publishing` varchar(20) DEFAULT NULL,
  `bprice` float DEFAULT NULL,
  `sprice` float DEFAULT NULL,
  `btype` varchar(20) DEFAULT NULL,
  `stock` int(11) DEFAULT NULL,
  PRIMARY KEY (`bid`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

/*Data for the table `t_book` */

insert  into `t_book`(`bid`,`sn`,`name`,`author`,`publishing`,`bprice`,`sprice`,`btype`,`stock`) values 
(1,'aaa','java基础','admin','清华出版社',250,20,'动作',91),
(2,'bbb','spring强化','sasa','北大出版社',210,30,'言情',100),
(3,'admin','springboot','any','信息出版社',150,90,'java',99);

/*Table structure for table `t_borrow` */

DROP TABLE IF EXISTS `t_borrow`;

CREATE TABLE `t_borrow` (
  `brid` int(11) NOT NULL AUTO_INCREMENT,
  `bid` int(11) DEFAULT NULL,
  `mid` int(11) DEFAULT NULL,
  `takedate` datetime DEFAULT NULL,
  `returndate` datetime DEFAULT NULL,
  `createtime` datetime DEFAULT NULL,
  PRIMARY KEY (`brid`)
) ENGINE=InnoDB AUTO_INCREMENT=93 DEFAULT CHARSET=utf8;

/*Data for the table `t_borrow` */

insert  into `t_borrow`(`brid`,`bid`,`mid`,`takedate`,`returndate`,`createtime`) values 
(89,1,1,'2019-01-01 00:00:00','2019-05-05 00:00:00','2023-05-24 12:18:03'),
(90,1,1,'2019-01-01 00:00:00','2019-05-05 00:00:00','2023-05-24 12:20:04'),
(91,1,1,'2019-01-01 00:00:00','2019-05-05 00:00:00','2023-05-24 12:20:34'),
(92,3,1,'2023-05-02 00:00:00','2023-05-15 00:00:00','2023-05-24 12:32:24');

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

先创建好book项目中对应的实体类Book;

package com.laosan.book.entity;
import lombok.Data;
import javax.persistence.*;
@Data
@Entity
@Table(name="t_book")
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long bid;
    private String sn;
    private String name;
    private String author;
    private String publishing;
    private Float bprice;
    private Float sprice;
    private String btype;
    private Integer stock;
}

创建Dao层的代码:

package com.laosan.book.repository;
import com.laosan.book.entity.Book;
import org.springframework.data.jpa.repository.JpaRepository;
/**
 * Book的数据访问
 */
public interface BookRepository extends JpaRepository<Book, Long> {
}

创建Service层的代码:

package com.laosan.book.service;
import com.laosan.book.entity.Book;
import com.laosan.book.repository.BookRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class BookService {
    @Autowired
    private BookRepository repository;
    public List<Book> findAll() {
        List<Book> bookList = repository.findAll();
        return bookList;
    }
}

创建Controller层的代码:

package com.laosan.book.controller;
import com.laosan.book.entity.Book;
import com.laosan.book.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController

@CrossOrigin       //进行该Controller的跨域操作
public class BookController {
    @Autowired
    private BookService bookService;
    /**
     * book模块返回所有的操作
     * @return
     */
    @GetMapping("/list")
    public Map<String, Object> list() {
        Map<String, Object> map = new HashMap<>();
        try {
            List<Book> list = bookService.findAll();
            map.put("code", "0");
            map.put("message", "success");
            map.put("data", list);
        } catch (Exception e) {
            e.printStackTrace();
            map.put("code", e.getClass().getSimpleName());
            map.put("message", e.getMessage());
        }
        return map;
    }
}

写完之后我们先对book项目进行单体应用的测试操作即可,好重启我们的book项目,如下图所示:

我们再测试上通过网关的路由能够获得我们对应的book请求呢,如下图所示:以为我的book 项目也已经注册到了Eureka的服务中了 

下面我们完成对HTML页面部分ajax的开发:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>layui</title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="https://cdn.bootcss.com/weui/1.1.2/style/weui.min.css">
    <link rel="stylesheet" href="https://cdn.bootcss.com/jquery-weui/1.2.0/css/jquery-weui.min.css">

    <!-- 注意:如果你直接复制所有代码到本地,上述css路径需要改成你本地的 -->
</head>
<body>
<h2 style="text-align: center">图书借阅登记</h2>
<form id="frmBorrow" action="">
    <div class="weui-cells weui-cells_form">
        <div class="weui-cells__title">手机号<span id="errMobile" style="margin-left:10px;color: red"></span>
            <span id="succMobile" style="margin-left:10px;color: green"></span>
        </div>

        <div class="weui-cell weui-cell_vcode">
            <div class="weui-cell__bd">
                <input id="mobile" name="mobile" class="weui-input" type="tel" placeholder="请输入手机号">
            </div>
            <div class="weui-cell__ft">
                <button id="btnCheck" type="button" class="weui-vcode-btn">获取验证码</button>
            </div>
        </div>
        <div class="weui-cells__title">验证码</div>
        <div class="weui-cell weui-cell_vcode">
            <div class="weui-cell__bd">
                <input class="weui-input"  type="number" placeholder="请输入6位验证码">
            </div>

        </div>
        <div class="weui-cells__title">借阅图书</div>
        <div class="weui-cell">
            <div class="weui-cell__bd">
                <input class="weui-input" id="name" name="name" type="text" placeholder="请选择要借阅的图书">
                <input type="hidden" name="bid" id="bid">
            </div>
        </div>

        <div class="weui-cells__title">借阅时间</div>
        <div class="weui-cell">
            <div class="weui-cell__bd">
                <input type="text" name="takedate" class="weui-input" placeholder="请选择取书日期" id='takedate'/>
            </div>
        </div>

        <div class="weui-cells__title">归还时间</div>
        <div class="weui-cell">
            <div class="weui-cell__bd">
                <input type="text" name="returndate" class="weui-input" placeholder="请选择还书日期" id='returndate'/>
            </div>
        </div>
        <br>
        <a href="javascript:;" id="btnSubmit" class="weui-btn weui-btn_primary">提交</a>
    </div>

</form>
<script src="https://cdn.bootcss.com/jquery/1.11.0/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/jquery-weui/1.2.0/js/jquery-weui.min.js"></script>

<script>
    $("#takedate,#returndate").calendar({
        dateFormat: "yyyy-mm-dd"
    });


    //用户部分的开发
   $("#btnCheck").click(function() {
       var mobile = $("#mobile").val();
       $.ajax({
          url:"http://localhost:9000/member/check",
         type:"get",
         data:{"mobile":mobile},
         dataType:"json",
         success:function(json) {
             //console.log(json);   //测试
            if(json.code == "0") {
                $("#succMobile").text("会员:" + json.data.name);
               $("#succMobile").show();
               $("#errMobile").hide();
            }
            else {
                $("#errMobile").text(json.message);
               $("#succMobile").hide();
               $("#errMobile").show();
            }
         }
      });
   });

   //图书借阅部分的开发
    //我们先来通过ajax进行所有数据的查询超操作,并通过下拉菜单进行展示
    var name = $("#name").val();
    $.ajax({
        url:"http://localhost:9000/book/list",
        type:"get",
        dataType: "json",
        success : function(json) {
            //console.log(json);   //测试而已
            var books = json.data;
            var bs = new Array();  //创建一个数组用来封装多个book的信息
            for(var i = 0; i < books.length;i++) {
                var item = {};   //创建一个临时数组用来保存数据
                item.title = books[i].name;
                item.value = books[i].bid;
                bs.push(item);   //把item数组放入bs数组中
            }
            console.log(bs);    //进行数组的测试

            //jquery的weiui的下拉组件
            $("#name").select({           //下拉组件
                title: "请选择图书",      //小标题
                items: bs   //这里把刚才封装好的数组直接拿过来就可以了
            });
        }
    });
</script>
</body>
</html>

//我们先来通过ajax进行所有数据的查询超操作,并通过下拉菜单进行展示
    var name = $("#name").val();
    $.ajax({
        type:"GET",
        url:"http://localhost:9000/book/selectBookAll",
        dataType:"json",
        success:function (res) {
            console.log(res);
            var bs = new Array();   //javascript创建了一个数组
            for(var i = 0; i < res.length; i++) {
                var result = {};  //创建一个对象,这里JavaScript的一个对象操作,属性自己定义
                result.value= res[i].bid
                result.title  = res[i].name
                bs.push(result);
            }
            $("#name").select({           //下拉组件
                title: "请选择图书",      //小标题
                items: bs   //这里把刚才封装好的数组直接拿过来就可以了
            });

        }

    });

具体的效果如下图所示:

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

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

相关文章

uCOSii信号量

uCOSii信号量 主要用来测试使用uCOSii“创建信号量,发送信号量&#xff0c;接收信号量,删除信号量”。 学习uCOSii一定要先了解os_cfg.h文件。 信号量管理函数如下&#xff1a; OSSemAccept() 无条件地等待请求一个信号量函数,中断服务子程序只能用OSSemAccept()而不能用OS…

Docker介绍、常用命令、项目部署

什么是Docker 简单说&#xff1a;Docker就是一个虚拟机&#xff0c;专业说&#xff1a;它是一个开源的容器平台。它和我们常用的VMware有很多相似的地方。 名词解释 镜像/images 由本体打包出来的文件。并不是文件本身&#xff0c;但是具有该文件的功能。举个不太贴切的例子&…

离线安装python、pip和python的第三方库

1.安装python3 1.1下载python3 安装python3的网址为点击这里 选择想要下载的对应版本进行下载&#xff0c;这里使用的是63位的Windows系统&#xff0c;因此下载的选的是&#xff1a; 下载后如图&#xff1a; python-3.7.9-amd64.exe是python3的安装程序 1.2安装python3 1…

5月第3周榜单丨飞瓜数据B站UP主排行榜单(哔哩哔哩)发布!

飞瓜轻数发布2023年5月15日-5月21日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B…

BLE协议栈结构

// 开坑BLE协议栈 0 镇楼图 接下来会自下往上粗略分析各个层级&#xff0c;后续会有对各层的细致解读 1 CONTROLLER 1.1 PHY BLE使用ISM频段&#xff08;频率范围是2.400-2.4835 GHz&#xff09;。将整个频带分为40份&#xff0c;每份的带宽为2MHz&#xff0c;称作RF Chann…

CASAIM与北京体育大学达成合作,高精度三维扫描技术助力体育运动装备仿真分析

近期&#xff0c;CASAIM与北京体育大学开展合作交流&#xff0c;基于高精度三维扫描技术助力体育运动装备仿真分析&#xff0c;为体育运动装备可靠性研究提供准确的数据参考。 北京体育大学是全国重点院校、国家“211工程”重点建设大学、国家首批“双一流”建设高校&#xff0…

基于springboot+vue社区团购系统(分前后台springboot+mybatis+mysql+maven+vue+html)

基于springbootvue社区团购系统 一、项目简介二、技术实现三、开发运行环境四、系统功能五、页面展示六、数据库七、项目结构八、部分代码展示九、源码地址 一、项目简介 本项目是一套基于springboot社区团购系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项…

【正点原子STM32连载】 第十六章 外部中断实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十六…

【Sentinel】流控、熔断、热点基本介绍和使用

目录 环境介绍Sentinel的使用可以分为两个部分Sentinel管理控制台客户端接入控制台配置启动参数流控规则名词解释 熔断策略公共字段说明慢调用比例字段说明 异常比例字段说明异常数字段说明 热点规则 环境介绍 开发依赖版本Spring Boot3.0.6Spring Cloud2022.0.2Spring Cloud …

一文搞清RabbitMQ的部署运维及使用

1.通过docker-compose安装RabbitMQ 1.0 初始化yum和Docker yum update yum install epel-release -y yum clean all yum list yum install docker-io -y1.1 dockerfile FROM rabbitmq:management MAINTAINER LCJ # 添加插件到指定目录 可按照此方式自行扩展其他插件 # ADD .…

shopee虾皮跨境电商网站商品数据支持网站后缀(.com.my;.vn;.ph)

作为一名技术爱好者&#xff0c;我们总会遇到各种各样的技术问题&#xff0c;需要寻找合适的技术解决方案。而在互联网时代&#xff0c;我们可以快速通过搜索引擎获取丰富的技术资源和解决方案。然而&#xff0c;在不同的技术分享中&#xff0c;我们常常会遇到质量参差不齐的文…

【新星计划·2023】单臂路由的原理讲解

单臂路由是指在路由器的一个接口上通过配置子接口的方式&#xff0c;实现原来互相隔离的VLAN之间可以互相通信。 一、单臂路由概述 网络中通过VLAN技术来实现隔离广播、方便管理及提高安全性等功能&#xff0c;一旦划分VLAN后&#xff0c;同—VLAN之间可以相互通信&#xff0…

【统计模型】瑞典生育率现状与影响因素分析

目录 瑞典生育率现状与影响因素分析 一、研究目的 二、数据来源和相关说明 三、描述性分析 3.1 样本描述 3.2 数据可视化 四、数学建模 4.1 模型建立 4.2 模型结果 &#xff08;1&#xff09;全模型A &#xff08;2&#xff09;全模型B &#xff08;3&#xff09;全…

传奇手游三职业1.80合击服务端三端互通版搭建教程

传奇手游三职业1.80合击服务端三端互通版搭建教程 大家好&#xff0c;我是驰网艾西。随着时代的发展&#xff0c;以前我们热爱的传奇游戏也越来越没有时间玩了&#xff0c;到了一定的年纪大家都有自己的事业以及生活压力。以前我们总是玩PC端所谓的端游&#xff0c;现在大家都…

highcharts矢量图放在图表的最上方

将矢量图对应的y轴的top和height都设置为0 即可 下面红色标注全是y轴的设置 以上这中图怎么实现 其中top是指图表中每个模块的位置&#xff0c;offset表示偏移的位置&#xff0c;height表示每个模块占据整个图标的高度的百分比&#xff0c;opposite表示该y轴是否在右侧&#xf…

麒麟系统安装HDP【已解决】

麒麟系统安装HDP 麒麟系统安装HDP1、软件版本介绍2、文件替换3 报错解决3.1 解决KeyError: HDP-3.1&#xff08;所有机器&#xff09;3.2 安装smartsense-hst&#xff08;所有机器&#xff09;3.3 解决Non-ASCII character \xe5 in file&#xff08;所有机器&#xff09;3.4 解…

如何解决端口号被占用的方法

在学习JavaWeb的过程中&#xff0c;在运行代码的时候经常会提示端口号被占用的情况&#xff1b;出现这情况的主要原因就是没有正常关闭tomcat。 那么遇到这种情况应该怎么解决呢&#xff1f; 首先第一种方式就是把电脑关机重启&#xff0c;这种方法可谓是百试百灵&#xff1b;另…

分类逻辑回归实例一

一、实例背景 假设根据【推荐分值】来对推荐者类型进行分类&#xff1a;高推荐、中推荐、低推荐 二、任务目标 训练出一个模型&#xff0c;来实现根据【推荐分值】&#xff0c;来预测【推荐类型】的分类 三、机器学习实现 1. 核心步骤 实现全流程&#xff1a; 1. 1 建立…

Niagara—— Events and Event Handlers

目录 一&#xff0c;Events 二&#xff0c;Event Handlers 多数情况下&#xff0c;系统中的发射器需相互交互&#xff0c;才能创建所需效果&#xff1b;意味着&#xff0c;一发射器生成数据&#xff0c;另一发射器监听该数据&#xff0c;以执行相应行为&#xff1b;在Niagar…

Linux-初学者系列_docker

目录 Linux-初学者系列_docker一、概念二、安装docker&#xff08;可忽略 跳到第三步&#xff09;三、获取镜像1、下载nginx镜像2、查看本地镜像3、将镜像运行成一个容器01-查看运行的容器02-通过ip端口号访问03-删除端口04-指定镜像名字 4、dockerfile构建镜像5、dockersave构…