docker-compose部署若依springCloud

若依官方文档–> https://doc.ruoyi.vip/ruoyi-cloud/document/hjbs.html#%E9%83%A8%E7%BD%B2%E7%B3%BB%E7%BB%9F

1.相关jar包准备

mvn clean

mvn package

打最新的jar包到target目录下

若依后台打包

image-20240827114809409

将本地开发测试数据库的数据导出成sql脚本,放入sql这个文件夹

image-20240827114106220

编写docker下copy.sh文件

image-20240827114343122

执行脚本,相应文件已经拷贝到docker目录下

image-20240827114401681

2.修改相关配置文件

2.1 mysql

1
2
3
4
5
6
7
# 基础镜像
FROM mysql:5.7
# author
MAINTAINER ruoyi

# 执行sql脚本
ADD ./db/*.sql /docker-entrypoint-initdb.d/

在使用 mysql:5.7 作为基础镜像时,MySQL 官方镜像提供了一个特性,即在容器启动时会自动执行 /docker-entrypoint-initdb.d/ 目录下的所有 .sql 文件。也就是说,当启动基于这个镜像的容器时,MySQL 会自动运行这些 SQL 脚本来初始化数据库。

2.2 nacos

1
2
3
4
5
6
7
# 基础镜像
FROM nacos/nacos-server
# author
MAINTAINER ruoyi

# 复制conf文件到路径
COPY ./conf/application.properties /home/nacos/conf/application.properties

2.3 nginx

nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
worker_processes  1;

events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;

server {
listen 80;
server_name localhost;

location / {
root /home/ruoyi/projects/ruoyi-ui;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}

location /prod-api/{
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://ruoyi-gateway:8080/;
}

# 避免actuator暴露
if ($request_uri ~ "/actuator") {
return 403;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

将所有发往 /prod-api/ 的请求代理转发到 ruoyi-gateway 服务器,同时保留和传递原始请求的相关头信息

2.4 redis

1
2
3
4
5
6
7
8
9
10
11
12
13
# 基础镜像
FROM redis
# author
MAINTAINER ruoyi

# 挂载目录
VOLUME /home/ruoyi/redis
# 创建目录
RUN mkdir -p /home/ruoyi/redis
# 指定路径
WORKDIR /home/ruoyi/redis
# 复制conf文件到路径
COPY ./conf/redis.conf /home/ruoyi/redis/redis.conf

2.5 ruoyi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 基础镜像
FROM docker.m.daocloud.io/library/eclipse-temurin:17-jre
# author
MAINTAINER ruoyi

# 定义 JAR 包文件名
ENV JAR_FILE=ruoyi-modules-midjourney-proxy-3.6.3.jar

# 挂载目录
VOLUME /home/ruoyi
# 创建目录
RUN mkdir -p /home/ruoyi
# 指定路径
WORKDIR /home/ruoyi
# 复制 jar 文件到路径
COPY ./jar/${JAR_FILE} /home/ruoyi/${JAR_FILE}
# 启动系统服务
ENTRYPOINT ["java","-jar","${JAR_FILE}"]

ruoyi文件下的其他dockerfile书写类似

2.6 docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
version : '3.8'
services:
ruoyi-nacos:
container_name: ruoyi-nacos
image: nacos/nacos-server
build:
context: ./nacos
environment:
- MODE=standalone
volumes:
- ./nacos/logs/:/home/nacos/logs
- ./nacos/conf/application.properties:/home/nacos/conf/application.properties
ports:
- "8850:8848"
depends_on:
- ruoyi-mysql
ruoyi-mysql:
container_name: ruoyi-mysql
image: mysql:5.7
build:
context: ./mysql
ports:
- "3307:3306"
volumes:
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/logs:/logs
- ./mysql/data:/var/lib/mysql
command: [
'mysqld',
'--innodb-buffer-pool-size=80M',
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci',
'--default-time-zone=+8:00',
'--lower-case-table-names=1'
]
environment:
MYSQL_DATABASE: 'ry-cloud'
MYSQL_ROOT_PASSWORD: password
ruoyi-redis:
container_name: ruoyi-redis
image: redis
build:
context: ./redis
ports:
- "6380:6379"
volumes:
- ./redis/conf/redis.conf:/home/ruoyi/redis/redis.conf
- ./redis/data:/data
command: redis-server /home/ruoyi/redis/redis.conf
ruoyi-nginx:
container_name: ruoyi-nginx
image: nginx
build:
context: ./nginx
ports:
- "81:80"
volumes:
- ./nginx/html/dist:/home/ruoyi/projects/ruoyi-ui
- ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/logs:/var/log/nginx
- ./nginx/conf.d:/etc/nginx/conf.d
depends_on:
- ruoyi-gateway
links:
- ruoyi-gateway
ruoyi-gateway:
container_name: ruoyi-gateway
build:
context: ./ruoyi/gateway
dockerfile: dockerfile
ports:
- "8081:8080"
depends_on:
- ruoyi-redis
links:
- ruoyi-redis
ruoyi-auth:
container_name: ruoyi-auth
build:
context: ./ruoyi/auth
dockerfile: dockerfile
ports:
- "9210:9200"
depends_on:
- ruoyi-redis
links:
- ruoyi-redis
ruoyi-modules-system:
container_name: ruoyi-modules-system
build:
context: ./ruoyi/modules/system
dockerfile: dockerfile
ports:
- "9201:9201"
depends_on:
- ruoyi-redis
- ruoyi-mysql
links:
- ruoyi-redis
- ruoyi-mysql
ruoyi-modules-midjourney-proxy:
container_name: ruoyi-modules-midjourney-proxy
build:
context: ./ruoyi/modules/midjourney
dockerfile: dockerfile
ports:
- "10086:10086"
depends_on:
- ruoyi-redis
- ruoyi-mysql
links:
- ruoyi-redis
- ruoyi-mysql

配置容器名称,构建方法,端口,依赖管理

3.运行部署

在开始之前,请确保你的系统上已经安装了 Docker 和 Docker Compose。如果还没有安装,可以根据你的操作系统类型进行安装。

​ • Docker 安装:Docker 官方安装指南

​ • Docker Compose 安装:Docker Compose 安装指南

使用 cd 命令导航到包含 docker-compose.yml 文件的目录

运行以下命令启动 docker-compose.yml 文件中定义的所有服务:

1
docker-compose up

如果你希望在后台运行这些服务(即以“守护进程”模式运行),可以使用 -d 选项

1
docker-compose up -d

直接将整个docker文件夹上传,然后运行

image-20240827132552431

有时候nacos的构建会报错,因为mysql没有初始化完成,nacos就开始读ry-config表

最后再测试即可

若依代码生成教程及生成代码详解

若依官方代码生成的文档–> https://doc.ruoyi.vip/ruoyi/document/htsc.html#%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90

官方文档太过简略,对新手不友好

单表增删改查

1.表生成

设计表

表的设计一定要详细完善,考虑周到,这样不用返工

image-20240813153637400

插入示例数据

image-20240815111701734

2.目录生成

2.1菜单生成

image-20240813154024960

路由地址–>我也不知道干啥用

2.2编辑代码生成配置

在系统工具代码生成中,点击导入,导入对应的数据表,进入编辑页面

image-20240813162141875

image-20240813162206292

字段信息这边,如果在创建数据表就已经完善,这边便无需修改

image-20240813162423865

生成模板–>单表的增删改查

生成包路径–>对应自己写的代码的包路径

生成模块名–>前端的模块名,与后端无关

生成业务名–>后端controller类上@RequestMapping 请求路径

生成功能名–>用作类描述

上级菜单–>选生图管理

2.3代码导入执行

生成的文件

image-20240813163849233

sql脚本在sys_menu中添加菜单和按钮

将这些代码粘贴到对应位置,重启前端和后端服务,并执行sql语句.

执行会报错

1
2
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)

是mapper层没有加注解@Mapper,加上即可

最后运行代码看到效果

image-20240813164909408

2.4前端优化

在自动生成代码的基础上,可以做一些自己的修改

这里我对显示url不满意

image-20240813165149476

使用el-image组件,将图片url预览出来
image-20240813165521321

3.代码详解

3.1后端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@RestController
@RequestMapping("/models")
public class SdModelsController extends BaseController
{
@Autowired
private ISdModelsService sdModelsService;

/**
* 查询SD模型库列表
*/
@RequiresPermissions("mj:models:list")
@GetMapping("/list")
public TableDataInfo list(SdModels sdModels)
{
startPage();
List<SdModels> list = sdModelsService.selectSdModelsList(sdModels);
return getDataTable(list);
}
...
}

@RequestMapping(“/models”)

models便是上文提到过的模块业务名

SdModelsController继承了BaseController–>web层通用数据处理

方法上有@RequiresPermissions进行权限认

startPage() 设置请求分页数据

查询和搜索用了同一个方法,请求都是list,携带参数不同

SdModels sdModels是由Spring自动创建并填充的,它从HTTP请求中获取数据,并通过Spring的自动数据绑定机制将这些数据注入到SdModels对象中

3.2 sql脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-- 菜单 SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('SD模型库', '1081', '1', 'models', 'mj/models/index', 1, 0, 'C', '0', '0', 'mj:models:list', '#', 'admin', sysdate(), '', null, 'SD模型库菜单');

-- 按钮父菜单ID
SELECT @parentId := LAST_INSERT_ID();

-- 按钮 SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('SD模型库查询', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', 'mj:models:query', '#', 'admin', sysdate(), '', null, '');

insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('SD模型库新增', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', 'mj:models:add', '#', 'admin', sysdate(), '', null, '');

insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('SD模型库修改', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', 'mj:models:edit', '#', 'admin', sysdate(), '', null, '');

insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('SD模型库删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', 'mj:models:remove', '#', 'admin', sysdate(), '', null, '');

insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('SD模型库导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', 'mj:models:export', '#', 'admin', sysdate(), '', null, '');

建立菜单用的

3.3前端代码

image-20240815144513145

image-20240815144557044

image-20240815144621388

树表增删改查

1.表生成

image-20240816110251110

2.目录生成

2.1编辑代码生成配置

image-20240816110457013

image-20240816110507599

image-20240816110808655

2.2代码导入执行

image-20240816110953585

代码导入步骤同单表.

效果如下

image-20240816111138154

2.3前端优化

可见,树形的下拉分类已经实现,但是第一列显示父类id

修改index.vue

image-20240816111311687

修改后效果如上

3.代码详解

查询list方法

image-20240816114228885

image-20240816141945758

handleTree 函数的作用是将平面结构的树形数组数据转换为嵌套的树形结构,写在/utils/ruoyi.js中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/**
* 构造树型结构数据
* @param {*} data 数据源
* @param {*} id id字段 默认 'id'
* @param {*} parentId 父节点字段 默认 'parentId'
* @param {*} children 孩子节点字段 默认 'children'
*/
export function handleTree(data, id, parentId, children) {
let config = {
id: id || 'id',
parentId: parentId || 'parentId',
childrenList: children || 'children'
};

var childrenListMap = {};
var nodeIds = {};
var tree = [];

// 构建 childrenListMap 和 nodeIds
for (let d of data) {
let parentId = d[config.parentId];
if (childrenListMap[parentId] == null) {
childrenListMap[parentId] = [];
}
nodeIds[d[config.id]] = d;
childrenListMap[parentId].push(d);
}

// 构建根节点
for (let d of data) {
let parentId = d[config.parentId];
if (nodeIds[parentId] == null) {
//如果节点的父节点为null即为根节点
tree.push(d);
}
}

// 递归构建子节点
for (let t of tree) {
adaptToChildrenList(t);
}

function adaptToChildrenList(o) {
//如果有子节点,添加进去
if (childrenListMap[o[config.id]] !== null) {
o[config.childrenList] = childrenListMap[o[config.id]];
}
//如果子节点不为null,则遍历子节点,再递归调用adaptToChildrenList
if (o[config.childrenList]) {
for (let c of o[config.childrenList]) {
adaptToChildrenList(c);
}
}
}
return tree;
}

变量解释

  • config: 用来存储函数内部使用的字段名称配置。

  • childrenListMap: 用来存储每个节点的子节点列表,键是父节点的 id,值是一个数组,包含了所有该父节点的直接子节点。

  • nodeIds: 用来存储所有节点的映射,键是节点的 id,值是节点对象。

  • tree: 用来存储最终的树结构根节点

原本使用父类id进行查询,只会返回儿子

修改查询的service层实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/**
* 查询分类列表
*
* @param categories 分类信息,包含查询条件
* @return 所有符合条件的分类列表,包括所有子分类
*/
@Override
public List<Categories> selectCategoriesList(Categories categories) {
if (categories.getParentId() == null) {
return categoriesMapper.selectCategoriesList(categories);
}
// 首先获取顶层分类列表
List<Categories> topCategories = categoriesMapper.selectCategoriesList(categories);

// 创建一个列表用于存储所有分类,包括子分类
List<Categories> allCategories = new ArrayList<>();

// 对每个顶层分类进行递归查询
for (Categories category : topCategories) {
allCategories.add(category);
// 递归查找子分类并加入到列表中
allCategories.addAll(getAllSubCategories(category));
}

return allCategories;
}

/**
* 递归获取所有子分类
*
* @param parentCategory 父分类
* @return 所有子分类列表
*/
private List<Categories> getAllSubCategories(Categories parentCategory) {
// 创建一个列表用于存储子分类
List<Categories> subCategories = new ArrayList<>();

// 创建查询条件,查找该父分类的所有子分类
Categories query = new Categories();
query.setParentId(parentCategory.getId());
List<Categories> childCategories = categoriesMapper.selectCategoriesList(query);

// 对每个子分类进行递归查询
for (Categories childCategory : childCategories) {
subCategories.add(childCategory);
subCategories.addAll(getAllSubCategories(childCategory));
}

return subCategories;
}

image-20240816155331461

实体类Categories

1
public class Categories extends TreeEntity

Categories继承了TreeEntity,TreeEntity中有parentId属性

主子表增删改查

TODO

遇到了再说

个人博客

hexo博客域名配置

接hexo搭建博客一文

1.域名配置

image-20240726101552165

当需要将域名指向另一个域名,再由另一个域名提供 IP 地址,就需要添加 CNAME 记录

主机记录就是域名前缀,常见用法有:

www:解析后的域名为www.hdbb.xyz

@:直接解析主域名 hdbb.xyz

2.github pages配置

image-20240726111718094

3.hexo配置

在完成前两步后,已经能通过个人域名访问托管在github的博客了

但存在一个问题,就是每次hexo d重新部署后,配置的 GitHub Pages 自定义域名消失

背景知识

.nojekyll 文件

  1. 作用

    • .nojekyll 文件用于告诉 GitHub Pages 不要使用 Jekyll 来生成静态网站。如果项目中有以 _ 开头的文件或文件夹(例如 _config.yml),默认情况下,Jekyll 会忽略这些文件。创建一个 .nojekyll 文件可以避免这种情况,使 GitHub Pages 直接使用用户提供的静态文件,而不进行额外的处理。
  2. 使用场景

    • 如果站点不是基于 Jekyll 构建的,例如使用 Hexo、Hugo 或其他静态网站生成器,则需要在项目根目录下添加 .nojekyll 文件,以确保所有文件都能正确部署和访问。

CNAME 文件

  1. 作用

    • CNAME 文件用于配置自定义域名。该文件的内容应该是你的自定义域名,例如 www.hdbb.xyz。当 GitHub Pages 看到 CNAME 文件时,它会将该域名绑定到 GitHub Pages 站点,使用户可以通过自定义域名访问站点。
  2. 使用场景

    • 当希望使用自己的域名而不是 GitHub 提供的 username.github.io 域名来访问站点时,需要在项目根目录下创建一个 CNAME 文件,并在该文件中写入自定义域名。

解决方法

image-20240726103208285

创建deploy.sh和CNAME文件

1
2
3
4
5
6
#!/bin/bash
hexo clean
hexo generate
cp CNAME public/
cp .nojekyll public/
hexo deploy

然后每次部署时,使用 ./deploy.sh 来替代 hexo d

个人博客

Spring注入bean发现多个候选bean错误

1.问题描述

image-20240721175229698

报错信息

1
2
3
4
5
6
7
8
9
***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 1 of constructor in com.hmall.trade.service.impl.OrderServiceImpl required a single bean, but 2 were found:
- orderDetailServiceImpl: defined in file [/Users/tom/Desktop/SpringCloud微服务—资料/day03-微服务01/资料/hmall/trade-service/target/classes/com/hmall/trade/service/impl/OrderDetailServiceImpl.class]
- IOrderDetailService: defined in file [/Users/tom/Desktop/SpringCloud微服务—资料/day03-微服务01/资料/hmall/trade-service/target/classes/com/hmall/trade/service/IOrderDetailService.class]

这个错误信息表明在 Spring 容器中有两个候选的 Bean 满足 OrderController 的构造函数参数要求,而 Spring 无法确定应该注入哪一个。这两个候选的 Bean 是 orderServiceImpl 和 IOrderService。

2.解决方法

在 Spring 依赖注入过程中,OrderDetailServiceImpl 类是 IOrderDetailService 接口的一个实现类,当使用接口类型(IOrderDetailService)进行注入时,Spring 容器中可能有多个该接口的实现类,而 Spring 无法自动决定使用哪一个实现类,所以会报错

解决方法有三种,推荐前两种

方法一:使用 @Qualifier 注解

在 OrderController 中使用 @Qualifier 注解明确指定要注入的实现类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements IOrderService {

private final ItemClient itemClient;
// private final OrderDetailServiceImpl detailService;
private final IOrderDetailService detailService;
private final CartClient cartClient;

public OrderServiceImpl(ItemClient itemClient, @Qualifier("orderDetailServiceImpl") IOrderDetailService orderDetailService, CartClient cartClient) {
this.itemClient = itemClient;
this.detailService = orderDetailService;
this.cartClient = cartClient;
}
//...
}

方法二:使用 @Primary 注解

在 OrderServiceImpl 类上添加 @Primary 注解,指定它为默认实现。

1
2
3
4
5
@Primary
@Service
public class OrderDetailServiceImpl extends ServiceImpl<OrderDetailMapper, OrderDetail> implements IOrderDetailService {

}

方法三:直接使用实现类创建(不推荐)

1
2
3
4
5
6
7
8
9
10
@Service
@RequiredArgsConstructor
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements IOrderService {

private final ItemClient itemClient;
private final OrderDetailServiceImpl detailService;
// private final IOrderDetailService detailService;
private final CartClient cartClient;
//...
}

直接找到该具体类型的 Bean 并注入,不会有歧义,所以不会报错.

虽然直接注入具体实现类可以解决问题,但从设计上考虑,通常推荐依赖接口而不是具体实现类。

3.疑问

为何一个接口一个实现类也会报错,黑马视频里就没有报错???

hexo搭建博客&github pages部署&picgo+typora图床

1.Hexo搭建博客

官方文档写的很详细

Setup | Hexo

1.1 创建博客目录

1
2
3
hexo init blog
cd ./blog
npm install

image-20240717104114808

1.2 本地运行

1
hexo s

image-20240717104251785

1.3 本地访问

image-20240717104352315

可以看到,访问localhost的4000端口,即可看到本地的博客网页

2.部署到github pages

2.1 创建一个新仓库

⚠️注意仓库名

image-20240717104927432

2.2 配置_config.yml

我是用的是ssh,需要配置!

image-20240717105611083

2.3 推送到github

安装个包

1
npm install hexo-deployer-git --save

image-20240717105917954

开始推送

1
2
hexo clean
hexo d

image-20240717110014374

image-20240717110150558

会有稍许延迟,github在你每次推送后都会自动部署

image-20240717110058271

部署完成后就可以访问啦

image-20240717110211257

3.picgo+typora图床

3.1 picgo

配置手册 | PicGo

获取token

image-20240717111826297

image-20240717111742385

设定存储路径只是简单的字符串拼接,以下是我设置为blog的错误截图

image-20240717111943422

可以看到,只是单纯的把blog和图片文件名拼接在了一起,所以要加上斜杠

3.2 typora

image-20240717111855015

此时粘贴图片会自动上传,包括图片链接

ping不通服务器公共IP地址

1.问题描述

在这里插入图片描述
ping不通服务器的公共ip地址

2.解决方法

在 Azure 门户中在服务器的网络安全组(NSG)中添加允许 ICMP 流量的规则

在这里插入图片描述
点击创建入站端口规则
在这里插入图片描述
如上图配置
创建成功后,重新打开terminal再次连接
在这里插入图片描述

3.原理

ping 是一个网络诊断工具,利用 ICMP 的回显请求和回显应答消息来测试网络连通性

在本例中,服务器网络配置阻止了 ICMP 流量,所以导致ping不通

mac安装部署nginx

1.安装homebrew

homebrew是mac上的包管理工具

查看homebrew是否安装

1
brew --version

在这里插入图片描述

2.安装nginx并启动

2.1 安装nginx

1
brew install nginx

在这里插入图片描述

2.2 查看nginx相关信息

1
brew info nginx

在这里插入图片描述
前端页面存放位置
/opt/homebrew/var/www

nginx配置文件
/opt/homebrew/etc/nginx/nginx.conf
默认端口为8080

2.3 启动nginx

1
brew services start nginx

在这里插入图片描述
确认 Nginx 是否正在运行,可以运行以下命令:

1
brew services list

如果 Nginx 正在运行,你将看到相关的输出

3.访问localhost:8080

在这里插入图片描述
看到这个页面nginx就配置完成了

4.配置前端项目

这里以黑马商城项目为例

4.1配置conf文件

在这里插入图片描述
设置监听端口和文件目录

4.2 放置html前端文件

在这里插入图片描述

4.3 测试访问

在这里插入图片描述

服务器用docker配置mysql并本地连接

1.云服务商防火墙设置

在这里插入图片描述

允许3306端口连接(mysql默认端口)

2.创建数据卷挂载目录及文件

在这里插入图片描述

3.docker运行mysql

3.1创建一个通用网络

1
docker network create hm-net

3.2查看docker网络

1
docker network ls

在这里插入图片描述

3.3在docker run之前,确保文件夹和文件权限

卡了我n久!!!!!!!
之前报的错误如下
在这里插入图片描述从日志信息中可以看到,MySQL 容器在启动过程中遇到了权限问题。具体来说:

1.  配置文件权限问题:
      • mysqld: File '/etc/mysql/conf.d/hm.cnf' not found (OS errno 13 - Permission denied)
2.  初始化 SQL 文件权限问题:
      • /usr/local/bin/docker-entrypoint.sh: line 75: /docker-entrypoint-initdb.d/hmall.sql: Permission denied
    所以在运行前,修改权限
1
2
3
4
sudo chown -R 999:999 /home/azureuser/mysql/conf
sudo chmod -R 644 /home/azureuser/mysql/conf/*.cnf
sudo chown -R 999:999 /home/azureuser/mysql/init
sudo chmod -R 644 /home/azureuser/mysql/init/*.sql

4.创建并运行mysql

1
2
3
4
5
6
7
8
9
10
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v /home/azureuser/mysql/data:/var/lib/mysql \
-v /home/azureuser/mysql/conf:/etc/mysql/conf.d \
-v /home/azureuser/mysql/init:/docker-entrypoint-initdb.d \
--network hm-net\
mysql

在这里插入图片描述
查看日志

1
docker logs mysql

在这里插入图片描述
查看mysql运行情况

1
docker ps

在这里插入图片描述

5.本地连接mysql

确保完成了第一步的设置
在这里插入图片描述

用dbeaver时报错,解决方法如下

连接MySQL时报错:Public Key Retrieval is not allowed的解决方法