diff --git a/ReadMe.md b/ReadMe.md
index a0f32e6..ff23455 100644
--- a/ReadMe.md
+++ b/ReadMe.md
@@ -35,7 +35,7 @@ https://www.bilibili.com/video/BV1AYm8YSEKY/
### 安装docker内容
-如果使用是centos或者是rocky
+#### centos或rocky
```shell
# 更新yum 和 dnf
@@ -57,20 +57,75 @@ systemctl enable docker
systemctl start docker
```
+#### Ubuntu环境搭建
+
+```bash
+sudo apt-get remove docker docker-engine docker.io containerd runc
+sudo apt update
+sudo apt upgrade
+sudo apt-get install ca-certificates curl gnupg lsb-release
+# 添加Docker官方GPG密钥
+sudo curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
+sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
+# 安装docker
+sudo apt-get install docker-ce docker-ce-cli containerd.io
+# 默认情况下,只有root用户和docker组的用户才能运行Docker命令。我们可以将当前用户添加到docker组,以避免每次使用Docker时都需要使用sudo,设置完成后退出当前用户之后再进入既可
+sudo usermod -aG docker $USER
+# 运行docker
+sudo systemctl start docker
+# 安装工具
+sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
+# 重启docker
+sudo service docker restart
+```
+
+> 安装docker会可能会遇到镜像无法拉去问题试下面的几个镜像地址,根据你自己的需要进行配置不是所有人都需要;同时也不能保证地址真的有效!!!
+>
+> ```bash
+> # 如果遇到没有这个文件的直接输入命令进行创建既可,之后记得重启docker
+> sudo touch /etc/docker/daemon.json
+> sudo vim /etc/docker/daemon.json
+> ```
+>
+> 复制下面的内容到`daemon.json`
+>
+> ```json
+> {
+> "registry-mirrors": [
+> "https://jockerhub.com",
+> "https://dockerhub.icu",
+> "https://docker.1panel.live",
+> "https://gwsg6nw9.mirror.aliyuncs.com",
+> "https://registry.docker-cn.com",
+> "http://hub-mirror.c.163.com",
+> "http://f1361db2.m.daocloud.io",
+> "https://mirror.ccs.tencentyun.com",
+> "https://phtv51hj.mirror.aliyuncs.com",
+> "https://gwsg6nw9.mirror.aliyuncs.com"
+> ]
+> }
+> ```
+>
+> 重启docker
+>
+> ```bash
+> sudo systemctl restart docker.socket
+> ```
+
### 安装Redis
#### 编写配置文件
```sh
-mkdir /bunny/docker_data/my_redis/ -p
-vim /bunny/docker_data/my_redis/redis.conf
+mkdir ~/docker/docker_data/redis_master/ -p
+vim ~/docker/docker_data/redis_master/redis.conf
```
**添加以下内容**
有注释大概率启动不了
-```
+```properties
# bind 127.0.0.1 #注释掉这部分,使redis可以外部访问
daemonize no #用守护线程的方式启动
requirepass 123456
@@ -80,7 +135,7 @@ tcp-keepalive 300 #防止出现远程主机强迫关闭了一个现有的连接
**删除注释**
-```
+```properties
daemonize no
requirepass 123456
appendonly yes
@@ -89,40 +144,102 @@ tcp-keepalive 300
#### 启动Redis
+密码是上面的:`123456`
+
```sh
docker pull redis:7.0.10
docker run -p 6379:6379 --name redis_master \
--v /bunny/docker_data/redis_master/redis.conf:/etc/redis/redis.conf \
--v/bunny/docker_data/redis_master/data:/data \
+-v ~/docker/docker_data/redis_master/redis.conf:/etc/redis/redis.conf \
+-v ~/docker/docker_data/redis_master/data:/data \
--restart=always -d redis:7.0.10 --appendonly yes
```
### 安装Minio
+在这个项目中进入之后输入你的用户名密码之后创建一个桶,桶名称为`auth-admin`,这个桶名称在后端的配置文件中可以修改
+
```sh
docker run -d \
-p 9000:9000 \
-p 9090:9090 \
--name minio_master --restart=always \
- -v /bunny/docker/minio/data:/data \
+ -v ~/docker/docker_data/minio/data:/data \
-e "MINIO_ROOT_USER=bunny" \
-e "MINIO_ROOT_PASSWORD=02120212" \
minio/minio server /data --console-address ":9090"
```
+![image-20241117201248420](http://116.196.101.14:9000/docs/image-20241117201248420.png)
+
+#### 搭建步骤
+
+**1、输入地址,之后登录进去**
+
+**2、创建桶**
+
+![image-20241117201444738](http://116.196.101.14:9000/docs/image-20241117201444738.png)
+
+**3、进入创建的桶,设置桶的权限时公开的,否则无法访问文件内容**
+
+![image-20241117201552805](http://116.196.101.14:9000/docs/image-20241117201552805.png)
+
+![image-20241117201622288](http://116.196.101.14:9000/docs/image-20241117201622288.png)
+
+![image-20241117201712911](http://116.196.101.14:9000/docs/image-20241117201712911.png)
+
### 安装MySQL
-**设置开机启动**
+#### 创建配置文件
+
+注意路径!!!
+
+```bash
+# 创建3306配置文件
+sudo mkdir -p /home/bunny/docker/docker_data/mysql/mysql_master/etc
+sudo vim /home/bunny/docker/docker_data/mysql/mysql_master/etc/my.cnf
+
+# 创建3304配置文件
+sudo mkdir -p /home/bunny/docker/docker_data/mysql/slave_3304/etc
+sudo vim /home/bunny/docker/docker_data/mysql/slave_3304/etc/my.cnf
+```
+
+**my.cnf 配置**
+
+```mysql
+[mysqld]
+skip-host-cache
+skip-name-resolve
+secure-file-priv=/var/lib/mysql-files
+user=mysql
+
+# 设置字符集
+character-set-server=utf8mb4
+collation-server=utf8mb4_unicode_ci
+
+# 设置服务器ID(如果是复制集群,确保每个节点的ID唯一)
+server-id=1
+
+# 启用二进制日志
+log-bin=mysql-bin
+
+# 设置表名不区分大小写
+lower_case_table_names = 1
+```
+
+#### 启动MySQL
+
+启动时会一直输出,等输出差不多了直接关掉既可
**执行启动3306:**
```sh
-docker stop master
-docker rm master
+docker stop mysql_master
+docker rm mysql_master
-docker run --name master -p 3306:3306 \
--v /bunny/docker_data/mysql/master/etc/my.cnf:/etc/my.cnf \
--v /bunny/docker_data/mysql/master/data:/var/lib/mysql \
+docker run --name mysql_master -p 3306:3306 \
+-v /home/bunny/docker/docker_data/mysql/mysql_master/etc/my.cnf:/etc/my.cnf \
+-v /home/bunny/docker/docker_data/mysql/mysql_master/data:/var/lib/mysql \
+-v /home/bunny/docker/docker_data/mysql/mysql_master/backup:/backup \
--restart=always --privileged=true \
-e MYSQL_ROOT_PASSWORD=02120212 \
-e TZ=Asia/Shanghai \
@@ -138,47 +255,23 @@ docker stop slave_3304
docker rm slave_3304
docker run --name slave_3304 -p 3304:3306 \
- -v /bunny/docker_data/mysql/slave_3304/etc/my.cnf:/etc/my.cnf \
- -v /bunny/docker_data/mysql/slave_3304/data:/var/lib/mysql \
- -v /bunny/docker_data/mysql/slave_3304/backup:\
+ -v /home/bunny/docker/docker_data/mysql/slave_3304/etc/my.cnf:/etc/my.cnf \
+ -v /home/bunny/docker/docker_data/mysql/slave_3304/data:/var/lib/mysql \
+ -v /home/bunny/docker/docker_data/mysql/slave_3304/backup:/backup \
--restart=always --privileged=true \
-e MYSQL_ROOT_PASSWORD=02120212 \
-e TZ=Asia/Shanghai \
mysql:8.0.33 --lower-case-table-names=1
```
-**修改密码:**
-
-```sh
-docker exec -it mysql_master /bin/bash
-mysql -uroot -p02120212
-use mysql
-ALTER USER 'root'@'%' IDENTIFIED BY "02120212";
-FLUSH PRIVILEGES;
-```
-
-> my.cnf 配置
->
-> ```sql
-> [mysqld]
-> skip-host-cache
-> skip-name-resolve
-> secure-file-priv=/var/lib/mysql-files
-> user=mysql
->
-> # 设置字符集
-> character-set-server=utf8mb4
-> collation-server=utf8mb4_unicode_ci
->
-> # 设置服务器ID(如果是复制集群,确保每个节点的ID唯一)
-> server-id=1
->
-> # 启用二进制日志
-> log-bin=mysql-bin
->
-> # 设置表名不区分大小写
-> lower_case_table_names = 1
+> **修改密码:**
>
+> ```sh
+> docker exec -it mysql_master /bin/bash
+> mysql -uroot -p02120212
+> use mysql
+> ALTER USER 'root'@'%' IDENTIFIED BY "02120212";
+> FLUSH PRIVILEGES;
> ```
### 数据库文件
@@ -1067,6 +1160,14 @@ server {
## 后端部署
+### 注意事项
+
+如果需要打包需要手动创建生产环境文件:`application-prod.yml`
+
+![image-20241117202134939](http://116.196.101.14:9000/docs/image-20241117202134939.png)
+
+### 环境设置
+
开发环境环境:对外暴露的端口是`7070`
生产环境:对外暴露的端口是`8000`
diff --git a/build/buildEnv.ts b/build/buildEnv.ts
index 074a3c2..283a2a9 100644
--- a/build/buildEnv.ts
+++ b/build/buildEnv.ts
@@ -43,6 +43,7 @@ export const buildEnvironment = () => {
// 如果是包含在包中则打包成 vendor
if (id.includes('node_modules')) {
return `vendor`;
+ // return id.toString().split('node_modules/')[1].split('/')[1].toString();
}
},
},
diff --git a/build/data.js b/build/data.js
index bc345a1..ff68766 100644
--- a/build/data.js
+++ b/build/data.js
@@ -76,7 +76,7 @@ async function add(data) {
headers: {
'Content-Type': 'application/json',
token:
- 'eyJhbGciOiJIUzI1NiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_yWLywqFIBQA_-WsE9Sjt2xXuz7jmAYGWfiAIu6_X-HuhmHmhVwtjDDXGB_owN8XjKJH3iMayTuo2afFNffHSIdv-eSOEEMuicqZ2raX0Kx22g4ciRkUyBRpw6yxgq1S0SBXubnPBt8fEjhnWnMAAAA.YwSm-NO_6Kg1k1GRwucIt50Y70FbPHoldsdTPVHK_Y4',
+ 'eyJhbGciOiJIUzI1NiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_yWLywqFIBQA_-WsE_RknWxXuz5DU8EgCx9QXO6_X-HuhmHmA7kamGGtMb7QgXtumAX1KEekQXVQs0ubbe6PUZ-u5Ys9Qwy5JF2u1LajhGaNFoZGLxlKS0xavjPjkbPBKS8Uql3TBN8fHTtSk3MAAAA.u-rDR1a46DoV0X-iQEz0Y9lfUGPm0Nsr2MuD4fvtVMg',
},
body: JSON.stringify(data),
});
diff --git a/docker/Dockerfile b/docker/Dockerfile
index 0461d86..c913909 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -6,10 +6,10 @@ RUN rm /etc/nginx/conf.d/default.conf
# 将自定义的 Nginx 配置文件复制到容器中
COPY nginx.conf /etc/nginx/conf.d/default.conf
-COPY bunny-web.site.csr /etc/nginx/bunny-web.site.csr
-COPY bunny-web.site.key /etc/nginx/bunny-web.site.key
-COPY bunny-web.site_bundle.crt /etc/nginx/bunny-web.site_bundle.crt
-COPY bunny-web.site_bundle.pem /etc/nginx/bunny-web.site_bundle.pem
+#COPY bunny-web.site.csr /etc/nginx/bunny-web.site.csr
+#COPY bunny-web.site.key /etc/nginx/bunny-web.site.key
+#COPY bunny-web.site_bundle.crt /etc/nginx/bunny-web.site_bundle.crt
+#COPY bunny-web.site_bundle.pem /etc/nginx/bunny-web.site_bundle.pem
# 设置时区,构建镜像时执行的命令
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
@@ -25,7 +25,7 @@ COPY dist/ /etc/nginx/html
# 暴露 Nginx 的默认端口
EXPOSE 80
-EXPOSE 443
+#EXPOSE 443
# 自动启动 Nginx
CMD ["nginx", "-g", "daemon off;"]
diff --git a/docker/nginx.conf b/docker/nginx.conf
index 05490e0..fca77a4 100644
--- a/docker/nginx.conf
+++ b/docker/nginx.conf
@@ -3,59 +3,10 @@ map $http_upgrade $connection_upgrade {
'' close;
}
-server {
- #SSL 默认访问端口号为 443
- listen 443 ssl;
- #请填写绑定证书的域名
- server_name localhost;
- #请填写证书文件的相对路径或绝对路径
- ssl_certificate bunny-web.site_bundle.crt;
- #请填写私钥文件的相对路径或绝对路径
- ssl_certificate_key bunny-web.site.key;
- ssl_session_timeout 5m;
- #请按照以下协议配置
- ssl_protocols TLSv1.2 TLSv1.3;
- #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
- ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
- ssl_prefer_server_ciphers on;
-
- location / {
- root /etc/nginx/html;
- index index.html index.htm;
- try_files $uri /index.html;
- }
-
- # 后端跨域请求
- location ~/admin/ {
- proxy_pass http://172.17.0.1:8000;
- proxy_set_header Host $http_host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Forwarded-Proto $scheme;
- }
-
- # 后端跨域请求
- location ~/api/v1/ {
- proxy_pass http://129.211.31.58:3000;
- proxy_set_header Host $http_host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Forwarded-Proto $scheme;
- proxy_redirect http:// https://;
- }
-
- error_page 404 404.html;
-
- location = /50x.html {
- root html;
- }
- }
-
server {
listen 80 ;
listen [::]:80;
server_name localhost;
- return 301 https://$host$request_uri;
location / {
root /etc/nginx/html;
diff --git a/package.json b/package.json
index 6f99234..4e8363f 100644
--- a/package.json
+++ b/package.json
@@ -1,11 +1,9 @@
{
- "name": "bunny-admin-element",
- "version": "1.0.0",
+ "name": "bunny-admin-web",
+ "version": "2.0.1",
"private": true,
"type": "module",
"keywords": [
- "bunny-admin-element",
- "bunny-cli",
"element-plus",
"tailwindcss",
"typescript",
@@ -14,19 +12,19 @@
"vite",
"esm"
],
- "homepage": "https://gitee.com/BunnyBoss/bunny-admin-element.git",
+ "homepage": "https://github.com/BunnyMaster/bunny-admin-web",
"repository": {
"type": "git",
- "url": "https://gitee.com/BunnyBoss/bunny-admin-element.git"
+ "url": "https://github.com/BunnyMaster/bunny-admin-web"
},
"bugs": {
- "url": "https://gitee.com/BunnyBoss/bunny-admin-element.git/issues"
+ "url": "https://github.com/BunnyMaster/bunny-admin-web/issues"
},
"license": "MIT",
"author": {
"name": "Bunny0212",
"email": "1319900154@qq.com",
- "url": "https://github.com/xiaoxian521"
+ "url": "https://github.com/BunnyMaster"
},
"scripts": {
"dev": "NODE_OPTIONS=--max-old-space-size=4096 vite",
diff --git a/src/layout/components/lay-footer/index.vue b/src/layout/components/lay-footer/index.vue
index 70e0985..58586b4 100644
--- a/src/layout/components/lay-footer/index.vue
+++ b/src/layout/components/lay-footer/index.vue
@@ -8,7 +8,7 @@ const Copyright = getConfig('Copyright');
diff --git a/src/store/configuration/emailUsers.ts b/src/store/configuration/emailUsers.ts
index c40f2ad..fe56b73 100644
--- a/src/store/configuration/emailUsers.ts
+++ b/src/store/configuration/emailUsers.ts
@@ -22,6 +22,8 @@ export const useEmailUsersStore = defineStore('emailUsersStore', {
port: undefined,
// 邮箱协议
smtpAgreement: undefined,
+ // 是否启用SSL
+ openSSL: undefined,
},
// 分页查询结果
pagination: {
diff --git a/src/utils/message.ts b/src/utils/message.ts
index fa55e76..12ea15a 100644
--- a/src/utils/message.ts
+++ b/src/utils/message.ts
@@ -83,7 +83,7 @@ export const storeMessage = (result: BaseResult) => {
if (result.code !== 200) {
return false;
}
- message(result.message, { type: 'success' });
+ message(result.message, { type: 'success', duration: 3666 });
return true;
};
diff --git a/src/views/configuration/emailTemplate/email-template-dialog.vue b/src/views/configuration/emailTemplate/email-template-dialog.vue
index c7e2287..e272187 100644
--- a/src/views/configuration/emailTemplate/email-template-dialog.vue
+++ b/src/views/configuration/emailTemplate/email-template-dialog.vue
@@ -5,6 +5,9 @@ import { rules } from '@/views/configuration/emailTemplate/utils/columns';
import { FormProps } from '@/views/configuration/emailTemplate/utils/types';
import { $t } from '@/plugins/i18n';
import { useEmailTemplateStore } from '@/store/configuration/emailTemplate';
+import { useRenderIcon } from '@/components/CommonIcon/src/hooks';
+import View from '@iconify-icons/ep/view';
+import { viewTemplate } from '@/views/configuration/emailTemplate/utils/hooks';
const props = withDefaults(defineProps(), {
formInline: () => ({
@@ -54,6 +57,9 @@ defineExpose({ formRef });
+
+ {{ $t('viewTemplate') }}
+
diff --git a/src/views/configuration/emailTemplate/index.vue b/src/views/configuration/emailTemplate/index.vue
index b022d56..2cf1a21 100644
--- a/src/views/configuration/emailTemplate/index.vue
+++ b/src/views/configuration/emailTemplate/index.vue
@@ -4,9 +4,10 @@ import { columns } from '@/views/configuration/emailTemplate/utils/columns';
import PureTableBar from '@/components/TableBar/src/bar';
import AddFill from '@iconify-icons/ri/add-circle-line';
import PureTable from '@pureadmin/table';
-import { onAdd, onDelete, onDeleteBatch, onSearch, onUpdate, selectRows } from '@/views/configuration/emailTemplate/utils/hooks';
+import { onAdd, onDelete, onDeleteBatch, onSearch, onUpdate, selectRows, viewTemplate } from '@/views/configuration/emailTemplate/utils/hooks';
import Delete from '@iconify-icons/ep/delete';
import EditPen from '@iconify-icons/ep/edit-pen';
+import View from '@iconify-icons/ep/view';
import Refresh from '@iconify-icons/ep/refresh';
import { selectUserinfo } from '@/components/Table/Userinfo/columns';
import { $t } from '@/plugins/i18n';
@@ -122,6 +123,7 @@ onMounted(() => {
+ {{ $t('viewTemplate') }}
{{ $t('modify') }}
diff --git a/src/views/configuration/emailTemplate/utils/columns.ts b/src/views/configuration/emailTemplate/utils/columns.ts
index 813941a..2abb8c4 100644
--- a/src/views/configuration/emailTemplate/utils/columns.ts
+++ b/src/views/configuration/emailTemplate/utils/columns.ts
@@ -19,7 +19,7 @@ export const columns: TableColumnList = [
{ label: $t('table.createTime'), prop: 'createTime', sortable: true, width: 160 },
{ label: $t('table.createUser'), prop: 'createUser', slot: 'createUser', width: 130 },
{ label: $t('table.updateUser'), prop: 'updateUser', slot: 'updateUser', width: 130 },
- { label: $t('table.operation'), fixed: 'right', width: 210, slot: 'operation' },
+ { label: $t('table.operation'), fixed: 'right', width: 230, slot: 'operation' },
];
// 添加规则
diff --git a/src/views/configuration/emailTemplate/utils/hooks.tsx b/src/views/configuration/emailTemplate/utils/hooks.tsx
index d498104..8c45bcf 100644
--- a/src/views/configuration/emailTemplate/utils/hooks.tsx
+++ b/src/views/configuration/emailTemplate/utils/hooks.tsx
@@ -133,3 +133,14 @@ export const onDeleteBatch = async () => {
},
});
};
+
+/** 查看模板 */
+export const viewTemplate = (template: string) => {
+ addDialog({
+ title: $t('viewTemplate'),
+ draggable: true,
+ fullscreenIcon: true,
+ closeOnClickModal: false,
+ contentRenderer: () => ,
+ });
+};
diff --git a/src/views/configuration/emailUsers/email-users-dialog.vue b/src/views/configuration/emailUsers/email-users-dialog.vue
index a5be2f0..271c266 100644
--- a/src/views/configuration/emailUsers/email-users-dialog.vue
+++ b/src/views/configuration/emailUsers/email-users-dialog.vue
@@ -59,6 +59,11 @@ defineExpose({ formRef });
+
+
+
+
+
diff --git a/src/views/configuration/emailUsers/index.vue b/src/views/configuration/emailUsers/index.vue
index 9ce5d8c..70def40 100644
--- a/src/views/configuration/emailUsers/index.vue
+++ b/src/views/configuration/emailUsers/index.vue
@@ -16,6 +16,7 @@ import { usePublicHooks } from '@/views/hooks';
import { FormInstance } from 'element-plus';
import { auth } from '@/views/configuration/emailUsers/utils/auth';
import { hasAuth } from '@/router/utils';
+import { enabledOrNotStatus } from '@/enums/baseConstant';
const tableRef = ref();
const formRef = ref();
@@ -76,6 +77,13 @@ onMounted(() => {
+
+
+
+
+
+
+
{{ $t('search') }}
{{ $t('buttons.reset') }}
@@ -116,6 +124,11 @@ onMounted(() => {
@page-size-change="onPageSizeChange"
@page-current-change="onCurrentPageChange"
>
+
+ {{ $t('enable') }}
+ {{ $t('disable') }}
+
+
{
-
+
diff --git a/src/views/system/menu/utils/hooks.tsx b/src/views/system/menu/utils/hooks.tsx
index a61ae81..c562f58 100644
--- a/src/views/system/menu/utils/hooks.tsx
+++ b/src/views/system/menu/utils/hooks.tsx
@@ -201,6 +201,7 @@ export const onChangeMenuRank = async (row: any) => {
if (!confirm) return;
await routerStore.updateMenuByIdWithRank(data);
+ await onSearch();
};
/**