【尚筹网项目】 八、【前台】 环境搭建


一、会员系统架构

(1) 架构图

在这里插入图片描述

(2) 需要创建的工程

父工程、聚合工程:atcrowdfunding07-member-parent(唯一的 pom 工程)

注册中心:atcrowdfunding08-member-eureka

实体类模块:atcrowdfunding09-member-entity

MySQL 数据服务:atcrowdfunding10-member-mysql-provider

Redis 数据服务:atcrowdfunding11-member-redis-provider

会员中心:atcrowdfunding12-member-authentication-consumer

项目维护:atcrowdfunding13-member-project-consumer

订单维护:atcrowdfunding14-member-order-consumer

支付功能:atcrowdfunding15-member-pay-consumer

网关:atcrowdfunding16-member-zuul

API 模块:atcrowdfunding17-member-api

在这里插入图片描述


二、parent 工程配置 pom.xml

<!-- 配置在父工程中要管理的依赖 -->
<dependencyManagement>
  <dependencies>
    <!-- 导入 SpringCloud 需要使用的依赖信息 -->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>Greenwich.SR2</version>
      <type>pom</type>
      <!-- import 依赖范围表示将 spring-cloud-dependencies 包中的依赖信息导入 -->
      <scope>import</scope>
    </dependency>
    <!-- 导入 SpringBoot 需要使用的依赖信息 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-dependencies</artifactId>
      <version>2.1.6.RELEASE</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>2.1.0</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.0.5</version>
    </dependency>
  </dependencies>
</dependencyManagement>

三、搭建环境约定

(1) 包名约定

新创建的包都作为 com.atguigu.crowd 的子包

(2) 主启动类类名

CrowdMainClass

(3) 端口号

atcrowdfunding08-member-eureka 1000

atcrowdfunding10-member-mysql-provider 2000

atcrowdfunding11-member-redis-provider 3000

atcrowdfunding12-member-authentication-consumer 4000

atcrowdfunding13-member-project-consumer 5000

atcrowdfunding14-member-order-consumer 7000

atcrowdfunding15-member-pay-consumer 8000

atcrowdfunding16-member-zuul 80

四、eureka 工程

(1) 导入依赖

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

(2) 主启动类

在这里插入图片描述

// 启动eureka注册中心
@EnableEurekaServer
@SpringBootApplication
public class CrowdMainClass {
    public static void main(String[] args) {
        SpringApplication.run(CrowdMainClass.class,args);
    }
}

(3) application.yml

server:
  port: 1000  # eureka端口号
spring:
  application:
    name: atguigu-crowd-eureka # 应用名称,将会显示在Eureka界面的应用名称列
eureka:
  instance:
    hostname: localhost  # 应用实例主机名
  client:
    register-with-eureka: false # 不像注册中心注册自己
    fetch-registry: false # 不从eureka获取注册信息
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ # Eureka服务器的地址

五、entity 工程

(1) 实体类的进一步细分

VO
View Object 视图对象
用途 1:接收浏览器发送过来的数据
用途 2:把数据发送给浏览器去显示

PO
Persistent Object 持久化对象
用途 1:将数据封装到 PO 对象存入数据库
用途 2:将数据库数据查询出来存入 PO 对象
所以 PO 对象是和数据库表对应,一个数据库表对应一个 PO 对象

DO
Data Object 数据对象
用途 1:从 Redis 查询得到数据封装为 DO 对象
用途 2:从 ElasticSearch 查询得到数据封装为 DO 对象
用途 3:从 Solr 查询得到数据封装为 DO 对象
……
从中间件或其他第三方接口查询到的数据封装为 DO 对象

DTO
Data Transfer Object 数据传输对象
用途 1:从 Consumer 发送数据到 Provider
用途 2:Provider 返回数据给 Consumer

在这里插入图片描述

使用 org.springframework.beans.BeanUtils.copyProperties(Object, Object)在不同实体类之间复制属性。
MemberVO → 复制属性 → MemberPO

(2) 创建包

com.atguigu.crowd.entity.po

com.atguigu.crowd.entity.vo

(3) lombok

在这里插入图片描述

让我们在开发时不必编写 getXxx()setXxx()、有参构造器、无参构造器等等这样具备固定模式的代码。

原理
在这里插入图片描述

在这里插入图片描述

六、MySQL 工程基础环境

(1) 创建数据库表

CREATE TABLE t_member (
	id INT ( 11 ) NOT NULL auto_increment,
	loginacct VARCHAR ( 255 ) NOT NULL,
	userpswd CHAR ( 200 ) NOT NULL,
	username VARCHAR ( 255 ),
	email VARCHAR ( 255 ),
	authstatus INT ( 4 ) COMMENT '实名认证状态 0 - 未实名认证, 1 - 实名认证申
	请中, 2 - 已实名认证',
	usertype INT ( 4 ) COMMENT ' 0 - 个人, 1 - 企业',
	realname VARCHAR ( 255 ),
	cardnum VARCHAR ( 255 ),
	accttype INT ( 4 ) COMMENT '0 - 企业, 1 - 个体, 2 - 个人, 3 - 政府',
PRIMARY KEY ( id ) 
);

(2) 逆向生成

在这里插入图片描述

逆向工程生成的文件归位
在这里插入图片描述

(3) 依赖

mysql-provider的 pom.xml 中导入依赖

<!-- 整合 MyBatis -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!-- MySQL 驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 数据库连接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
</dependency>
<!-- SpringBoot 测试 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<!-- 对外暴露服务 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 作为客户端访问 Eureka 注册中心 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 为了能够使用实体类 -->
<dependency>
    <groupId>com.atguigu.crowd</groupId>
    <artifactId>atcrowdfunding09-member-entity</artifactId>
    <version>1.0-SNAPSHOT</version>
    <scope>compile</scope>
</dependency>
<!-- 为了能够使用工具类 -->
<dependency>
    <groupId>com.atguigu.crowd</groupId>
    <artifactId>atcrowdfunding05-common-util</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

(4) 创建主启动类

在这里插入图片描述

// 扫描mybatis 的 Mapper接口 所在包
@MapperScan("com/atguigu/crowd/mapper")
@SpringBootApplication
public class CrowdMainClass {
    public static void main(String[] args) {
        SpringApplication.run(CrowdMainClass.class,args);
    }
}

(5) application.yml

server:
  port: 2000
spring:
  application:
    name: atguigu-crowd-mysql
  datasource:
    name: mydb
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://127.0.0.1:3307/project_crowd?serverTimezone=UTC&characterEncoding=UTF-8
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
eureka:
  client:
    service-url:
      defaultZone: http://localhost:1000/eureka
mybatis:
  mapper-locations: classpath*:/mybatis/mapper/*Mapper.xml
ogging:
  level:
    com.atguigu.crowd.mapper: debug
    com.atguigu.crowd.test: debug

(6) 测试类

// 有@RunWith(SpringRunner.class)才能使用@Autowired注入的类,否则自动注入不生效
@RunWith(SpringRunner.class)
@SpringBootTest
public class MyBatisTest {

    @Autowired
    private DataSource dataSource;

    @Resource
    private MemberPOMapper memberPOMapper;

    // 日志
    private Logger logger = LoggerFactory.getLogger(MyBatisTest.class);


    // 测试向数据库中插入一个信息
    @Test
    public void testMapper() {

        // 盐值加密
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();

        // 明文
        String source = "123456";

        // 密文
        String encode = passwordEncoder.encode(source);

        MemberPO memberPO = new MemberPO(null,"ht",encode,"黑桃","ht@qq.com",1,1,"黑桃","123123",2);

        memberPOMapper.insertSelective(memberPO);
    }


    // 测试与数据库的连接是否成功
    @Test
    public void testConnection() throws SQLException {

        // 获取数据库连接
        Connection connection = dataSource.getConnection();

        // 在日志中打印连接信息
        logger.info("connection的内容: " + connection.toString());

    }

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


七、MySQL 工程对外暴露服

(1) api 工程

① 导入依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
    <groupId>com.atguigu.crowd</groupId>
    <artifactId>atcrowdfunding09-member-entity</artifactId>
    <version>1.0-SNAPSHOT</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>com.atguigu.crowd</groupId>
    <artifactId>atcrowdfunding05-common-util</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
② 创建接口

在这里插入图片描述

@FeignClient("atguigu-crowd-mysql")
public interface MySQLRemoteService {

    @RequestMapping("/get/memberpo/by/login/acct/remote")
    ResultEntity<MemberPO> getMemberPOByLoginAcctRemote(@RequestParam("loginacct") String loginacct);
    
}

(2) MySQL 工程

① 创建组件

在这里插入图片描述

② MemberProviderHandler
@RestController
public class MemberProviderHandler {

    @Autowired
    MemberService memberService;

    @RequestMapping("/get/memberpo/by/login/acct/remote")
    public ResultEntity<MemberPO> getMemberPOByLoginAcct(@RequestParam("loginacct") String loginacct) {

        try {

            MemberPO memberPO =  memberService.getMemberPOByLoginAcct(loginacct);

            // 执行成功,返回数据
            return ResultEntity.successWithData(memberPO);

        }catch (Exception e) {

            // 执行失败,返回错误信息
            return ResultEntity.failed(e.getMessage());
        }
    }
    
}
③ MemberService
public interface MemberService {

    MemberPO getMemberPOByLoginAcct(String loginacct);
}
④ MemberServiceImpl
// 在类上使用@Transactional(readOnly = true)针对查询操作设置事务属性
@Transactional(readOnly = true)
@Service
public class MemberServiceImpl implements MemberService {
    @Resource
    private MemberPOMapper memberPOMapper;

    @Override
    public MemberPO getMemberPOByLoginAcct(String loginacct) {

        // 创建 example 对象
        MemberPOExample example = new MemberPOExample();

        // 创建 criteria 对象
        Criteria criteria = example.createCriteria();

        // 封装查询条件
        criteria.andLoginacctEqualTo(loginacct);

        // 执行查询
        List<MemberPO> memberPOS = memberPOMapper.selectByExample(example);

        return memberPOS.get(0);
    }
}

八、Redis 工程基础环境

(1) 依赖

<!-- 整合 Redis -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 测试 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
</dependency>
<!-- 对外暴露服务 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 作为客户端访问 Eureka 注册中心 -->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 为了能够使用实体类 -->
<dependency>
  <groupId>com.atguigu.crowd</groupId>
  <artifactId>atcrowdfunding09-member-entity</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>
<!-- 为了能够使用工具类 -->
<dependency>
  <groupId>com.atguigu.crowd</groupId>
  <artifactId>atcrowdfunding05-common-util</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>

(2) 主启动类

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

(3) application.yml

★ 问题

连接虚拟中的redis时,在配置文件中reids.host设置为linux的ip,然后通过以下方式登录redis
在这里插入图片描述
在这里插入图片描述

server:
  port: 3000
spring:
  application:
    name: atguigu-crowd-redis
  redis:
    host: 192.168.44.129
    port: 6379
eureka:
  client:
    service-url:
      defaultZone: http://localhost:1000/eureka

(4) 测试类

在这里插入图片描述

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisTest {

    @Autowired
    private StringRedisTemplate redisTemplate;

    @Test
    public void testSet() {

        ValueOperations<String, String> Operations = redisTemplate.opsForValue();

        Operations.set("ccc","333");

        log.info("aaa: " + Operations.get("aaa"));
        log.info("bbb: " + Operations.get("bbb"));

    }
}

九、Redis 工程对外暴露服务

(1) api 工程创建接口

在这里插入图片描述

@FeignClient("atguigu-crowd-redis")
public interface RedisRemoteService {

    // 远程设置(添加)redis的键值对
    @RequestMapping("/set/redis/key/value/remote")
    ResultEntity<String> setRedisKeyValueRemote(
            @RequestParam("key") String key,
            @RequestParam("value") String value
    );

    // 远程设置(添加)redis的键值对(带time)
    @RequestMapping("/set/redis/key/value/remote/with/timeout")
    ResultEntity<String> setRedisKeyValueRemoteWithTimeout(
            @RequestParam("key") String key,
            @RequestParam("value") String value,
            @RequestParam("time") long time,
            @RequestParam("timeUnit") TimeUnit timeUnit
    );

    // 远程通过key获取redis的value
    @RequestMapping("/get/redis/string/value/by/key/remote")
    ResultEntity<String> getRedisStringValueByKeyRemote(
            @RequestParam("key") String key
    );

    // 远程移除redis的一个key
    @RequestMapping("/remove/redis/key/remote")
    ResultEntity<String> removeRedisKeyRemote(
            @RequestParam("key") String key
    );
}

(2) Redis 工程 handler 代码

在这里插入图片描述

@RestController
public class RedisHandler {

    @Autowired
    private StringRedisTemplate redisTemplate;

    // 远程设置(添加)redis的键值对
    @RequestMapping("/set/redis/key/value/remote")
    ResultEntity<String> setRedisKeyValueRemote(
            @RequestParam("key") String key,
            @RequestParam("value") String value
    ){
        try {

            ValueOperations<String, String> operations = redisTemplate.opsForValue();

            operations.set(key , value);

            return ResultEntity.successWithoutData() ;

        } catch (Exception e) {

            e.printStackTrace();

            return ResultEntity.failed(e.getMessage());
        }
    }

    // 远程设置(添加)redis的键值对(带time)
    @RequestMapping("/set/redis/key/value/remote/with/timeout")
    ResultEntity<String> setRedisKeyValueRemoteWithTimeout(
            @RequestParam("key") String key,
            @RequestParam("value") String value,
            @RequestParam("time") long time,
            @RequestParam("timeUnit") TimeUnit timeUnit
    ) {
        try {

            ValueOperations<String, String> operations = redisTemplate.opsForValue();

            operations.set(key, value, time, timeUnit);

            return ResultEntity.successWithoutData();

        } catch (Exception e) {

            e.printStackTrace();

            return ResultEntity.failed(e.getMessage());
        }
    }

    // 远程通过key获取redis的value
    @RequestMapping("/get/redis/string/value/by/key/remote")
    ResultEntity<String> getRedisStringValueByKeyRemote(
            @RequestParam("key") String key
    ) {

        try {

            ValueOperations<String, String> operations = redisTemplate.opsForValue();

            String value = operations.get(key);

            return ResultEntity.successWithData(value);

        } catch (Exception e) {

            e.printStackTrace();

            return ResultEntity.failed(e.getMessage());
        }
    }

    // 远程移除redis的一个key
    @RequestMapping("/remove/redis/key/remote")
    ResultEntity<String> removeRedisKeyRemote(
            @RequestParam("key") String key
    ) {
        try {
            redisTemplate.delete(key);

            return ResultEntity.successWithoutData();
            
        } catch (Exception e) {

            e.printStackTrace();

            return ResultEntity.failed(e.getMessage());
        }
    }
}

十、认证工程显示首页

(1) 依赖

在这里插入图片描述

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
  <groupId>com.atguigu.crowd</groupId>
  <artifactId>atcrowdfunding17-member-api</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>

(2) 主启动类

在这里插入图片描述

// 注册中心,当前版本可以不写
@EnableDiscoveryClient
@SpringBootApplication
public class CrowdMainClass {
    public static void main(String[] args) {
        SpringApplication.run(CrowdMainClass.class,args);
    }
}

(3) application.yml

在这里插入图片描述

server:
  port: 4000
spring:
  application:
    name: atguigu-crowd-auth
  thymeleaf:
    prefix: classpath:/templates/
    suffix: .html
eureka:
  client:
    service-url:
      defaultZone: http://localhost:1000/eureka

(4) 显示首页的 handler

在这里插入图片描述

@Controller
public class PortalHandler {
    @RequestMapping("/")
    public String showPortalPage() {

        // 这里实际开发中需要加载数据……

        return "portal";
    }
}

(5) 加入静态资源

① 静态资源

在这里插入图片描述

② 放入并调整 portal.html 页面

在这里插入图片描述

<!DOCTYPE html>
<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">
    <base th:href="@{/}"/>
    <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
    <link rel="stylesheet" href="css/font-awesome.min.css">
    <link rel="stylesheet" href="css/carousel.css">

在这里插入图片描述


十一、网关

(1) 依赖

在这里插入图片描述

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

(2) 主启动类

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

(3) 配置域名(可选)

在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要搭建前台服务,需要创建一个服务类并在其中实现服务的逻辑,然后将该服务绑定到应用程序的UI界面上。 下面是一个简单的前台服务搭建的步骤: 1. 创建一个服务类,继承自 Service 类。 ``` public class MyForegroundService extends Service { ... } ``` 2. 在服务类中实现服务的逻辑。 ``` public class MyForegroundService extends Service { ... @Override public int onStartCommand(Intent intent, int flags, int startId) { // 在此处编写服务逻辑 ... return START_STICKY; } ... } ``` 3. 在服务类中创建一个通知,用于在系统通知栏中显示服务的状态。 ``` public class MyForegroundService extends Service { ... @Override public void onCreate() { super.onCreate(); // 创建通知 Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID) .setContentTitle("My Foreground Service") .setContentText("Service is running...") .setSmallIcon(R.drawable.ic_notification) .build(); // 启动服务,并将服务设置为前台服务 startForeground(1, notification); } ... } ``` 4. 在服务类中实现 onBind() 方法,返回 null。 ``` public class MyForegroundService extends Service { ... @Nullable @Override public IBinder onBind(Intent intent) { return null; } ... } ``` 5. 在应用程序的 UI 界面中绑定服务,并启动服务。 ``` Intent intent = new Intent(this, MyForegroundService.class); startService(intent); ``` 以上就是搭建前台服务的基本步骤。需要注意的是,在 Android 8.0 及以上版本中,前台服务必须创建一个 NotificationChannel 并将其与通知相关联,否则服务将无法启动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值