feat: 🚀 邮箱模板可以查看;修复部分bug

This commit is contained in:
bunny 2024-11-18 16:37:55 +08:00
parent 31225dfc4a
commit c40b65cf66
21 changed files with 217 additions and 118 deletions

197
ReadMe.md
View File

@ -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`

View File

@ -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();
}
},
},

View File

@ -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),
});

View File

@ -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;"]

View File

@ -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;

View File

@ -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",

View File

@ -8,7 +8,7 @@ const Copyright = getConfig('Copyright');
<template>
<footer class="layout-footer text-[rgba(0,0,0,0.6)] dark:text-[rgba(220,220,242,0.8)]">
{{ Copyright }}
<a class="hover:text-primary" href="https://github.com/pure-admin" target="_blank"> &nbsp;{{ TITLE }} </a>
<a class="hover:text-primary" href="/" target="_blank"> &nbsp;{{ TITLE }} </a>
</footer>
</template>

View File

@ -22,6 +22,8 @@ export const useEmailUsersStore = defineStore('emailUsersStore', {
port: undefined,
// 邮箱协议
smtpAgreement: undefined,
// 是否启用SSL
openSSL: undefined,
},
// 分页查询结果
pagination: {

View File

@ -83,7 +83,7 @@ export const storeMessage = (result: BaseResult<any>) => {
if (result.code !== 200) {
return false;
}
message(result.message, { type: 'success' });
message(result.message, { type: 'success', duration: 3666 });
return true;
};

View File

@ -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<FormProps>(), {
formInline: () => ({
@ -54,6 +57,9 @@ defineExpose({ formRef });
<!-- 配置邮件发送体 -->
<el-form-item :label="$t('emailTemplate_body')" prop="body">
<el-input v-model="form.body" :autosize="{ minRows: 2, maxRows: 26 }" autocomplete="off" type="textarea" />
<el-button :icon="useRenderIcon(View)" class="reset-margin" link type="primary" @click="viewTemplate(form.body)">
{{ $t('viewTemplate') }}
</el-button>
</el-form-item>
<!--配置邮件类型-->

View File

@ -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(() => {
</template>
<template #operation="{ row }">
<el-button :icon="useRenderIcon(View)" :size="size" class="reset-margin" link type="primary" @click="viewTemplate(row.body)"> {{ $t('viewTemplate') }} </el-button>
<el-button v-if="hasAuth(auth.update)" :icon="useRenderIcon(EditPen)" :size="size" class="reset-margin" link type="primary" @click="onUpdate(row)"> {{ $t('modify') }} </el-button>
<el-popconfirm v-if="hasAuth(auth.deleted)" :title="`${$t('delete')} ${row.templateName}?`" @confirm="onDelete(row)">
<template #reference>

View File

@ -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' },
];
// 添加规则

View File

@ -133,3 +133,14 @@ export const onDeleteBatch = async () => {
},
});
};
/** 查看模板 */
export const viewTemplate = (template: string) => {
addDialog({
title: $t('viewTemplate'),
draggable: true,
fullscreenIcon: true,
closeOnClickModal: false,
contentRenderer: () => <div v-html={template} />,
});
};

View File

@ -59,6 +59,11 @@ defineExpose({ formRef });
<el-input v-model="form.smtpAgreement" autocomplete="off" maxlength="10" show-word-limit type="text" />
</el-form-item>
<!-- 是否启用SSL -->
<el-form-item label="ssl" prop="openSSL">
<el-switch v-model="form.openSSL" :active-text="$t('enable')" :active-value="true" :inactive-text="$t('disable')" :inactive-value="false" :style="switchStyle" inline-prompt />
</el-form-item>
<!-- 是否为默认 -->
<el-form-item :label="$t('emailUsers_isDefault')" prop="isDefault">
<el-switch v-model="form.isDefault" :active-text="$t('default')" :active-value="true" :inactive-text="$t('no_default')" :inactive-value="false" :style="switchStyle" inline-prompt />

View File

@ -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(() => {
<el-input v-model="emailUsersStore.form.smtpAgreement" :placeholder="`${$t('input')}${$t('emailUsers_smtpAgreement')}`" class="!w-[180px]" clearable />
</el-form-item>
<!-- 是否启用SSL -->
<el-form-item label="SSL" prop="openSSL">
<el-select v-model="emailUsersStore.form.openSSL" class="!w-[180px]" clearable filterable placeholder="SSL">
<el-option v-for="(item, index) in enabledOrNotStatus" :key="index" :label="item.label" :navigationBar="false" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-button :icon="useRenderIcon('ri:search-line')" :loading="emailUsersStore.loading" type="primary" @click="onSearch"> {{ $t('search') }} </el-button>
<el-button :icon="useRenderIcon(Refresh)" @click="resetForm(formRef)"> {{ $t('buttons.reset') }}</el-button>
@ -116,6 +124,11 @@ onMounted(() => {
@page-size-change="onPageSizeChange"
@page-current-change="onCurrentPageChange"
>
<template #openSSL="{ row }">
<el-tag v-show="row.openSSL" effect="plain" type="success">{{ $t('enable') }}</el-tag>
<el-tag v-show="!row.openSSL" effect="plain" type="danger">{{ $t('disable') }}</el-tag>
</template>
<template #isDefault="{ row, index }">
<el-switch
v-model="row.isDefault"

View File

@ -15,8 +15,10 @@ export const columns: TableColumnList = [
{ label: $t('emailUsers_port'), prop: 'port', width: 90 },
// 邮箱协议
{ label: $t('emailUsers_smtpAgreement'), prop: 'smtpAgreement', width: 100 },
// 是否为默认邮件
// 是否启用SSL
{ label: $t('emailUsers_isDefault'), prop: 'isDefault', slot: 'isDefault', width: 100 },
// 是否为默认邮件
{ label: 'SSL', prop: 'openSSL', slot: 'openSSL', width: 100 },
{ label: $t('table.updateTime'), prop: 'updateTime', sortable: true, width: 160 },
{ label: $t('table.createTime'), prop: 'createTime', sortable: true, width: 160 },
{ label: $t('table.createUser'), prop: 'createUser', slot: 'createUser', width: 130 },
@ -37,6 +39,8 @@ export const rules: any = reactive({
host: [{ required: true, message: `${$t('input')}${$t('emailUsers_host')}`, trigger: 'blur' }],
// 端口号
port: [{ required: true, message: `${$t('input')}${$t('emailUsers_port')}`, trigger: 'blur' }],
// 是否启用SSL
openSSL: [{ required: true, message: `SSL`, trigger: 'blur' }],
// 是否为默认邮件
isDefault: [{ required: true, message: `${$t('input')}${$t('emailUsers_isDefault')}`, trigger: 'blur' }],
});

View File

@ -33,6 +33,7 @@ export function onAdd() {
host: undefined,
port: undefined,
smtpAgreement: undefined,
openSSL: true,
isDefault: false,
},
},
@ -69,6 +70,7 @@ export function onUpdate(row: any) {
host: row.host,
port: row.port,
smtpAgreement: row.smtpAgreement,
openSSL: row.openSSL,
isDefault: row.isDefault,
},
},

View File

@ -10,6 +10,8 @@ export interface FormItemProps {
port: number;
// 邮箱协议
smtpAgreement: string;
// 是否启用SSL
openSSL: boolean;
// 是否为默认邮件
isDefault: boolean;
}

View File

@ -13,7 +13,7 @@ export const columns: TableColumnList = [
{ label: $t('table.createTime'), prop: 'createTime', sortable: true },
{ 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: 160, slot: 'operation' },
];
// 添加多语言表单规则

View File

@ -124,7 +124,7 @@ onMounted(() => {
</template>
<template #rank="{ row }">
<el-input v-model="row.rank" :max="9999" :min="1" type="number" @change="onChangeMenuRank(row)" />
<el-input v-model="row.rank" :max="9999" :min="1" type="number" @blur="onChangeMenuRank(row)" />
</template>
<template #createUser="{ row }">

View File

@ -201,6 +201,7 @@ export const onChangeMenuRank = async (row: any) => {
if (!confirm) return;
await routerStore.updateMenuByIdWithRank(data);
await onSearch();
};
/**