提交 0e8d2258 编写于 作者: 郝先瑞

feat: 基础框架升级完成

上级 f7c92b79
......@@ -3,6 +3,6 @@
# 变量必须以 VITE_ 为前缀才能暴露给外部读取
NODE_ENV='development'
VITE_APP_TITLE = 'vue3-element-admin'
VITE_APP_PORT = 3000
VITE_APP_TITLE = 'mall-admin'
VITE_APP_PORT = 9527
VITE_APP_BASE_API = '/dev-api'
## 生产环境
VITE_APP_TITLE = 'vue3-element-admin'
VITE_APP_PORT = 3000
VITE_APP_TITLE = 'mall-admin'
VITE_APP_PORT = 9527
VITE_APP_BASE_API = '/prod-api'
## 模拟环境
NODE_ENV='staging'
VITE_APP_TITLE = 'vue3-element-admin'
VITE_APP_PORT = 3000
VITE_APP_TITLE = 'mall-admin'
VITE_APP_PORT = 9527
VITE_APP_BASE_API = '/prod--api'
<p align="center">
<img src="https://img.shields.io/badge/Vue-3.3.1-brightgreen.svg"/>
<img src="https://img.shields.io/badge/Vite-4.3.5-green.svg"/>
<img src="https://img.shields.io/badge/Element Plus-2.3.6-blue.svg"/>
<img src="https://img.shields.io/badge/license-MIT-green.svg"/>
<img src="https://img.shields.io/badge/Vue-3.2.40-brightgreen.svg"/>
<img src="https://img.shields.io/badge/Vite-3.2.0-green.svg"/>
<img src="https://img.shields.io/badge/Element Plus-2.2.17-blue.svg"/>
<a src="https://github.com/hxrui" target="_blank">
<img src="https://img.shields.io/github/stars/youlaitech/youlai-mall.svg?style=social&label=Stars"/>
</a>
<a href="https://gitee.com/youlaitech/youlai-mall" target="_blank">
<img src="https://gitee.com/youlaitech/youlai-mall/badge/star.svg"/>
</a>
<br/>
<img src="https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg"/>
<a href="https://gitee.com/youlaiorg" target="_blank">
<img src="https://img.shields.io/badge/Author-有来开源组织-orange.svg"/>
</a>
</p>
<p align="center">
<a target="_blank" href="https://juejin.cn/post/7228990409909108793">vue3-element-admin官方文档</a> | <a target="_blank" href="http://vue3.youlai.tech">在线预览</a>
<a target="_blank" href="http://admin.youlai.tech">在线预览</a> | <a target="_blank" href="https://www.youlai.tech">官方文档</a>
</p>
## 项目介绍
[vue3-element-admin](https://gitee.com/youlaiorg/vue3-element-admin) 是基于 Vue3 + Vite4+ TypeScript5 + Element-Plus + Pinia 等最新主流技术栈构建的后台管理前端模板(配套后端源码)。
项目有以下特性:
[mall-admin](https://gitee.com/youlaiorg/mall-admin) 是基于 [vue3-element-admin](https://gitee.com/youlaiorg/vue3-element-admin) 升级的 Vue3 版本有来商城管理前端工程;使用前端主流技术栈 Vue3 + Vite3 + TypeScript + Vue Router + Pinia + Volar + Element Plus 等;实现功能包括不限于动态权限路由、按钮权限控制、国际化、主题大小切换等。
- 基于 vue-element-admin 升级到 vue3 版本,无自定义封装,易上手,减少学习成本。
- 提供了配套的 Java 后端接口,真实的接口数据,而非使用 Mock 数据。您可以访问在[线接口文档](https://www.apifox.cn/apidoc/shared-195e783f-4d85-4235-a038-eec696de4ea5)查看接口详情。
- 权限系统功能齐全,包括用户管理、角色管理、菜单管理、字典管理和部门管理等,以满足您对权限管理的需求。
- 项目还提供了基础设施支持,包括动态路由、按钮级别的权限控制、国际化支持、代码规范、Git 提交规范以及常用组件的封装,以便开发人员更高效地开发和维护项目。
## 项目预览
## 项目优势
- **在线预览**[https://vue3.youlai.tech/](https://vue3.youlai.tech/)
- 基于 vue-element-admin 升级的 Vue3 版本 ,极易上手,减少学习成本;
- 一套完整适配的微服务权限系统线上接口,企业级真实前后端接入场景,非 Mock 数据;
- 功能全面:国际化、动态路由、按钮权限、主题大小切换、Echarts、wangEditor;
- TypeScript 全面支持,包括组件和 API 调用层面;
- 主流 Vue3 生态和前端技术栈,常用组件极简封装;
- 从 0 到 1 的项目文档支持;
- 全栈技术支持: 微服务接口、Vue3 管理前端、uni-app 移动端和 K8S 持续集成交付;
- **控制台**
## 技术栈
![暗黑模式](https://foruda.gitee.com/images/1687755822903300961/a4d63e22_716974.png)
- **接口文档**
![接口文档](https://foruda.gitee.com/images/1687755822857820115/96054330_716974.png)
| 技术栈 | 描述 | 官网 |
| ------------ | -------------------------------------- | ------------------------------------ |
| Vue3 | 渐进式 JavaScript 框架 | https://v3.cn.vuejs.org/ |
| TypeScript | JavaScript 的一个超集 | https://www.tslang.cn/ |
| Vite | 前端开发与构建工具 | https://cn.vitejs.dev/ |
| Element Plus | 基于 Vue 3,面向设计师和开发者的组件库 | https://element-plus.gitee.io/zh-CN/ |
| Pinia | 新一代状态管理工具 | https://pinia.vuejs.org/ |
| Vue Router | Vue.js 的官方路由 | https://router.vuejs.org/zh/ |
## 项目预览
- **权限管理系统**
在线预览地址: [admin.youlai.tech](http://admin.youlai.tech)
|![在这里插入图片描述](https://foruda.gitee.com/images/1687755822816437081/b7620905_716974.png) | ![角色管理](https://foruda.gitee.com/images/1687755822852085747/c13a4d19_716974.png) |
| ------------------------------------------------------ | ------------------------------------------------------ |
| ![菜单管理](https://foruda.gitee.com/images/1687755822966247550/4d4f8118_716974.png) | ![在这里插入图片描述](https://foruda.gitee.com/images/1687755822828758939/8035a91f_716974.png)
| ![控制台](https://www.youlai.tech/files/blog/dashboard.png) | ![国际化](https://www.youlai.tech/files/blog/i18n.gif) |
| ----------------------------------------------------------- | --------------------------------------------------------- |
| ![菜单管理](https://www.youlai.tech/files/blog/menu.png) | ![角色管理](https://www.youlai.tech/files/blog/role.png) |
| ![商品管理](https://www.youlai.tech/files/blog/goods.png) | ![库存设置](https://www.youlai.tech/files/blog/stock.png) |
## 项目地址
| 项目 | Gitee | Github | GitCode |
| ---- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| 前端 | [vue3-element-admin](https://gitee.com/youlaiorg/vue3-element-admin) | [vue3-element-admin](https://github.com/youlaitech/vue3-element-admin) | [vue3-element-admin](https://gitcode.net/youlai/vue3-element-admin) |
| 后端 | [youlai-boot](https://gitee.com/youlaiorg/youlai-boot) | [youlai-boot](https://github.com/haoxianrui/youlai-boot.git) | [youlai-boot](https://gitcode.net/youlai/youlai-boot) |
## 环境准备
| 环境 | 名称版本 | 备注 |
| -------------------- | :----------------------------------------------------------- | ------------------------------------------------------------ |
| **开发工具** | VSCode | [下载地址](https://code.visualstudio.com/Download) |
| **运行环境** | Node 16+ | [下载地址](http://nodejs.cn/download) |
| **VSCode插件(必装)** | 1. `Vue Language Features (Volar) ` <br/> 2. `TypeScript Vue Plugin (Volar) ` <br/>3. 禁用 Vetur | ![vscode-plugin](https://foruda.gitee.com/images/1687755823108948048/d0198b2d_716974.png) |
## 项目启动
```bash
# 克隆代码
git clone https://gitee.com/youlaiorg/vue3-element-admin.git
# 切换目录
cd vue3-element-admin
# 安装 pnpm
npm install pnpm -g
# 安装依赖
pnpm install
# 启动运行
pnpm run dev
```
| | Gitee | Github | GitCode |
| ------------------ | -------------------------------------------------------------------- | ---------------------------------------------------------------------- | ----------------------------------------------------- |
| 开源组织 | [有来开源组织](https://gitee.com/youlaiorg) | [有来开源组织](https://github.com/youlaitech) | [有来开源组织](https://gitcode.net/youlai) |
| 技术团队 | [有来技术团队](https://gitee.com/youlaitech) | [有来技术团队](https://github.com/youlaitech) | - |
| 后端 | [youlai-mall](https://gitee.com/youlaiorg/youlai-mall) | [youlai-mall](https://github.com/youlaitech/youlai-mall) | [youlai-mall](https://gitcode.net/youlai/youlai-mall) |
| 管理前端 | [mall-admin](https://gitee.com/youlaiorg/mall-admin) | [mall-admin](https://github.com/youlaitech/mall-admin) | [mall-admin](https://gitcode.net/youlai/mall-admin) |
| 小程序/H5/移动端 | [mall-app](https://gitee.com/youlaiorg/mall-app) | [mall-app](https://github.com/youlaitech/mall-app) | [mall-app](https://gitcode.net/youlai/mall-app) |
| vue3-element-admin | [vue3-element-admin](https://gitee.com/youlaiorg/vue3-element-admin) | [vue3-element-admin](https://github.com/youlaitech/vue3-element-admin) | - |
## 项目部署
## 启动部署
```bash
# 项目打包
pnpm run build:prod
### 环境准备
# 上传文件至远程服务器
将打包生成在 `dist` 目录下的文件拷贝至 `/usr/share/nginx/html` 目录
- 安装 Node
# nginx.cofig 配置
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
# 反向代理配置
location /prod-api/ {
proxy_pass http://vapi.youlai.tech/; # vapi.youlai.tech替换成你的后端API地址
}
}
```
版本:16+
- 开发工具
VSCode
## 注意事项
- 必装插件
- **自动导入插件自动生成默认关闭**
- Vue Language Features (Volar)
- TypeScript Vue Plugin (Volar)
模板项目的组件类型声明已自动生成。如果添加和使用新的组件,请按照图示方法开启自动生成。在自动生成完成后,记得将其设置为 `false`,避免重复执行引发冲突。
### 项目启动
![](https://foruda.gitee.com/images/1687755823137387608/412ea803_716974.png)
> 如果前端开发人员或者本地没有启动 [后端接口](https://gitee.com/youlaitech/youlai-mall)的情况,需要修改 vite.config.ts 的代理地址 http://localhost:9999 为线上接口地址 https://api.youlai.tech
- **项目启动浏览器访问空白**
1. npm install
2. npm run dev
3. 浏览器访问 http://localhost:9527
请升级浏览器尝试,低版本浏览器内核可能不支持某些新的 JavaScript 语法,比如可选链操作符 `?.`
### 项目部署
- **项目同步仓库更新升级**
- 本地打包
项目同步仓库更新升级之后,建议 `pnpm install` 安装更新依赖之后启动 。
```
npm run build:prod
```
- **其他问题**
生成的静态文件位于项目根目录 dist 文件夹下
如果有其他问题或者建议,建议 [ISSUE](https://gitee.com/youlaiorg/vue3-element-admin/issues/new)
- nginx.cofig 配置
## 接口支持
```
server {
listen 80;
server_name localhost;
- **接口调用地址**[https://vapi.youlai.tech](https://vapi.youlai.tech)
location / {
root /usr/share/nginx/html/web;
index index.html index.htm;
}
- **接口文档地址**[在线接口文档](https://www.apifox.cn/apidoc/shared-195e783f-4d85-4235-a038-eec696de4ea5)
# 代理转发请求至网关,prod-api标识解决跨域问题
location /prod-api/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://api.youlai.tech/;
}
}
- **OpenAPI文档地址**[http://vapi.youlai.tech/v3/api-docs](http://vapi.youlai.tech/v3/api-docs)
```
- **本地接口**:默认使用线上接口,你可以通过以下步骤完成本地接口环境搭建:
> 1. 获取基于 `Java 、SpringBoot` 开发的后端 [youlai-boot](https://gitee.com/youlaiorg/youlai-boot.git) 源码 ;
> 2. 根据后端工程说明文档 [README.md](https://gitee.com/youlaiorg/youlai-boot#%E9%A1%B9%E7%9B%AE%E8%BF%90%E8%A1%8C) 完成本地启动;
> 3. 替换 [vite.config.ts](vite.config.ts) 的代理目标地址 `vapi.youlai.tech` 为本地的 `localhost:8989`
## 项目文档
- [基于 Vue3 + Vite4 + TypeScript + Element-Plus 从0到1搭建后台管理系统](https://blog.csdn.net/u013737132/article/details/130191394)
- [ESLint+Prettier+Stylelint+EditorConfig 约束和统一前端代码规范](https://blog.csdn.net/u013737132/article/details/130190788)
- [Husky + Lint-staged + Commitlint + Commitizen + cz-git 配置 Git 提交规范](https://blog.csdn.net/u013737132/article/details/130191363)
## 提交规范
执行 `pnpm run commit` 唤起 git commit 交互,根据提示完成信息的输入和选择。
![](https://foruda.gitee.com/images/1687755823165218215/c1705416_716974.png)
## 交流群🚀
## 交流群 🚀
> 关注「有来技术」公众号,获取交流群二维码。
>
......@@ -166,8 +128,6 @@ server {
>
> 为了避免营销广告人群混入,此举无奈,望理解!
| 公众号 | 交流群 |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| <img src="https://foruda.gitee.com/images/1687689212187063809/3c69eaee_716974.png" height="180px"/> | <img src="https://foruda.gitee.com/images/1687689212139273561/6a65ef69_716974.png" height="180px"/> |
| 公众号 | 交流群 |
| ------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------- |
| <img src="https://s2.loli.net/2023/05/28/JaG4L8ZHmkIgRQC.png" height="180px"/> | <img src="https://foruda.gitee.com/images/1687383898672561311/85a6d753_716974.png" height="180px"/> |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="vue-element-admin的vue3版本" />
<meta name="keywords" content="vue-element-admin,mall-admin" />
<title>mall-admin</title>
</head>
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="vue-element-admin的vue3版本" />
<meta name="keywords" content="vue-element-admin,vue3-element-admin" />
<title>vue3-element-admin</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
\ No newline at end of file
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
{
"name": "vue3-element-admin",
"name": "mall-admin",
"private": true,
"version": "2.4.0",
"version": "3.0.0",
"type": "module",
"scripts": {
"preinstall": "npx only-allow pnpm",
......@@ -102,7 +102,7 @@
"vite-plugin-svg-icons": "^2.0.1",
"vue-tsc": "^1.6.5 "
},
"repository": "https://gitee.com/youlaiorg/vue3-element-admin.git",
"repository": "https://gitee.com/youlaiorg/mall-admin.git",
"author": "有来开源组织",
"license": "MIT",
"engines": {
......
......@@ -14,12 +14,14 @@ export function loginApi(data: LoginData): AxiosPromise<LoginResult> {
formData.append("password", data.password);
formData.append("verifyCodeKey", data.verifyCodeKey || "");
formData.append("verifyCode", data.verifyCode || "");
formData.append("grant_type", "captcha");
return request({
url: "/api/v1/auth/login",
url: "/youlai-auth/oauth2/token",
method: "post",
data: formData,
headers: {
"Content-Type": "multipart/form-data",
Authorization: "Basic bWFsbC1hZG1pbjoxMjM0NTY=", // 客户端信息Base64明文:mall-admin:123456
},
});
}
......@@ -29,7 +31,7 @@ export function loginApi(data: LoginData): AxiosPromise<LoginResult> {
*/
export function logoutApi() {
return request({
url: "/api/v1/auth/logout",
url: "/youlai-auth/oauth/logout",
method: "delete",
});
}
......@@ -39,7 +41,7 @@ export function logoutApi() {
*/
export function getCaptchaApi(): AxiosPromise<CaptchaResult> {
return request({
url: "/api/v1/auth/captcha",
url: "/captcha",
method: "get",
});
}
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { DeptForm, DeptQuery, DeptVO } from './types';
import request from "@/utils/request";
import { AxiosPromise } from "axios";
import { DeptForm, DeptQuery, DeptVO } from "./types";
/**
* 部门树形表格
......@@ -9,9 +9,9 @@ import { DeptForm, DeptQuery, DeptVO } from './types';
*/
export function listDepts(queryParams?: DeptQuery): AxiosPromise<DeptVO[]> {
return request({
url: '/api/v1/dept',
method: 'get',
params: queryParams
url: "/youlai-system/api/v1/dept",
method: "get",
params: queryParams,
});
}
......@@ -20,8 +20,8 @@ export function listDepts(queryParams?: DeptQuery): AxiosPromise<DeptVO[]> {
*/
export function listDeptOptions(): AxiosPromise<[]> {
return request({
url: '/api/v1/dept/options',
method: 'get'
url: "/youlai-system/api/v1/dept/options",
method: "get",
});
}
......@@ -32,8 +32,8 @@ export function listDeptOptions(): AxiosPromise<[]> {
*/
export function getDeptForm(id: number): AxiosPromise<DeptForm> {
return request({
url: '/api/v1/dept/' + id + '/form',
method: 'get'
url: "/youlai-system/api/v1/dept/" + id + "/form",
method: "get",
});
}
......@@ -44,9 +44,9 @@ export function getDeptForm(id: number): AxiosPromise<DeptForm> {
*/
export function addDept(data: DeptForm) {
return request({
url: '/api/v1/dept',
method: 'post',
data: data
url: "/youlai-system/api/v1/dept",
method: "post",
data: data,
});
}
......@@ -58,9 +58,9 @@ export function addDept(data: DeptForm) {
*/
export function updateDept(id: number, data: DeptForm) {
return request({
url: '/api/v1/dept/' + id,
method: 'put',
data: data
url: "/youlai-system/api/v1/dept/" + id,
method: "put",
data: data,
});
}
......@@ -71,7 +71,7 @@ export function updateDept(id: number, data: DeptForm) {
*/
export function deleteDept(ids: string) {
return request({
url: '/api/v1/dept/' + ids,
method: 'delete'
url: "/youlai-system/api/v1/dept/" + ids,
method: "delete",
});
}
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import request from "@/utils/request";
import { AxiosPromise } from "axios";
import {
DictTypeQuery,
DictTypePageResult,
DictTypeForm,
DictQuery,
DictForm,
DictPageResult
} from './types';
DictPageResult,
} from "./types";
/**
* 字典类型分页列表
......@@ -18,9 +18,9 @@ export function getDictTypePage(
queryParams: DictTypeQuery
): AxiosPromise<DictTypePageResult> {
return request({
url: '/api/v1/dict/types/page',
method: 'get',
params: queryParams
url: "/youlai-system/api/v1/dict/types/page",
method: "get",
params: queryParams,
});
}
......@@ -31,8 +31,8 @@ export function getDictTypePage(
*/
export function getDictTypeForm(id: number): AxiosPromise<DictTypeForm> {
return request({
url: '/api/v1/dict/types/' + id + '/form',
method: 'get'
url: "/youlai-system/api/v1/dict/types/" + id + "/form",
method: "get",
});
}
......@@ -43,9 +43,9 @@ export function getDictTypeForm(id: number): AxiosPromise<DictTypeForm> {
*/
export function addDictType(data: DictTypeForm) {
return request({
url: '/api/v1/dict/types',
method: 'post',
data: data
url: "/youlai-system/api/v1/dict/types",
method: "post",
data: data,
});
}
......@@ -57,9 +57,9 @@ export function addDictType(data: DictTypeForm) {
*/
export function updateDictType(id: number, data: DictTypeForm) {
return request({
url: '/api/v1/dict/types/' + id,
method: 'put',
data: data
url: "/youlai-system/api/v1/dict/types/" + id,
method: "put",
data: data,
});
}
......@@ -68,8 +68,8 @@ export function updateDictType(id: number, data: DictTypeForm) {
*/
export function deleteDictTypes(ids: string) {
return request({
url: '/api/v1/dict/types/' + ids,
method: 'delete'
url: "/youlai-system/api/v1/dict/types/" + ids,
method: "delete",
});
}
......@@ -80,8 +80,8 @@ export function deleteDictTypes(ids: string) {
*/
export function getDictOptions(typeCode: string): AxiosPromise<OptionType[]> {
return request({
url: '/api/v1/dict/types/' + typeCode + '/items',
method: 'get'
url: "/youlai-system/api/v1/dict/types/" + typeCode + "/items",
method: "get",
});
}
......@@ -92,9 +92,9 @@ export function getDictPage(
queryParams: DictQuery
): AxiosPromise<DictPageResult> {
return request({
url: '/api/v1/dict/page',
method: 'get',
params: queryParams
url: "/youlai-system/api/v1/dict/page",
method: "get",
params: queryParams,
});
}
......@@ -105,8 +105,8 @@ export function getDictPage(
*/
export function getDictFormData(id: number): AxiosPromise<DictForm> {
return request({
url: '/api/v1/dict/' + id + '/form',
method: 'get'
url: "/youlai-system/api/v1/dict/" + id + "/form",
method: "get",
});
}
......@@ -117,9 +117,9 @@ export function getDictFormData(id: number): AxiosPromise<DictForm> {
*/
export function addDict(data: DictForm) {
return request({
url: '/api/v1/dict',
method: 'post',
data: data
url: "/youlai-system/api/v1/dict",
method: "post",
data: data,
});
}
......@@ -131,9 +131,9 @@ export function addDict(data: DictForm) {
*/
export function updateDict(id: number, data: DictForm) {
return request({
url: '/api/v1/dict/' + id,
method: 'put',
data: data
url: "/youlai-system/api/v1/dict/" + id,
method: "put",
data: data,
});
}
......@@ -144,7 +144,7 @@ export function updateDict(id: number, data: DictForm) {
*/
export function deleteDict(ids: string) {
return request({
url: '/api/v1/dict/' + ids,
method: 'delete'
url: "/youlai-system/api/v1/dict/" + ids,
method: "delete",
});
}
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { FileInfo } from './types';
import request from "@/utils/request";
import { AxiosPromise } from "axios";
import { FileInfo } from "./types";
/**
* 上传文件
......@@ -9,14 +9,14 @@ import { FileInfo } from './types';
*/
export function uploadFileApi(file: File): AxiosPromise<FileInfo> {
const formData = new FormData();
formData.append('file', file);
formData.append("file", file);
return request({
url: '/api/v1/files',
method: 'post',
url: "/youlai-system/api/v1/files",
method: "post",
data: formData,
headers: {
'Content-Type': 'multipart/form-data'
}
"Content-Type": "multipart/form-data",
},
});
}
......@@ -27,8 +27,8 @@ export function uploadFileApi(file: File): AxiosPromise<FileInfo> {
*/
export function deleteFileApi(filePath?: string) {
return request({
url: '/api/v1/files',
method: 'delete',
params: { filePath: filePath }
url: "/youlai-system/api/v1/files",
method: "delete",
params: { filePath: filePath },
});
}
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { MenuQuery, MenuVO, MenuForm } from './types';
import request from "@/utils/request";
import { AxiosPromise } from "axios";
import { MenuQuery, MenuVO, MenuForm } from "./types";
/**
* 获取路由列表
*/
export function listRoutes() {
return request({
url: '/api/v1/menus/routes',
method: 'get'
url: "/youlai-system/api/v1/menus/routes",
method: "get",
});
}
......@@ -19,9 +19,9 @@ export function listRoutes() {
*/
export function listMenus(queryParams: MenuQuery): AxiosPromise<MenuVO[]> {
return request({
url: '/api/v1/menus',
method: 'get',
params: queryParams
url: "/youlai-system/api/v1/menus",
method: "get",
params: queryParams,
});
}
......@@ -30,8 +30,8 @@ export function listMenus(queryParams: MenuQuery): AxiosPromise<MenuVO[]> {
*/
export function listMenuOptions(): AxiosPromise<OptionType[]> {
return request({
url: '/api/v1/menus/options',
method: 'get'
url: "/youlai-system/api/v1/menus/options",
method: "get",
});
}
......@@ -42,8 +42,8 @@ export function listMenuOptions(): AxiosPromise<OptionType[]> {
*/
export function getMenuForm(id: number): AxiosPromise<MenuForm> {
return request({
url: '/api/v1/menus/' + id + '/form',
method: 'get'
url: "/youlai-system/api/v1/menus/" + id + "/form",
method: "get",
});
}
......@@ -54,9 +54,9 @@ export function getMenuForm(id: number): AxiosPromise<MenuForm> {
*/
export function addMenu(data: MenuForm) {
return request({
url: '/api/v1/menus',
method: 'post',
data: data
url: "/youlai-system/api/v1/menus",
method: "post",
data: data,
});
}
......@@ -68,9 +68,9 @@ export function addMenu(data: MenuForm) {
*/
export function updateMenu(id: string, data: MenuForm) {
return request({
url: '/api/v1/menus/' + id,
method: 'put',
data: data
url: "/youlai-system/api/v1/menus/" + id,
method: "put",
data: data,
});
}
......@@ -81,7 +81,7 @@ export function updateMenu(id: string, data: MenuForm) {
*/
export function deleteMenu(id: number) {
return request({
url: '/api/v1/menus/' + id,
method: 'delete'
url: "/youlai-system/api/v1/menus/" + id,
method: "delete",
});
}
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { RoleQuery, RolePageResult, RoleForm } from './types';
import request from "@/utils/request";
import { AxiosPromise } from "axios";
import { RoleQuery, RolePageResult, RoleForm } from "./types";
/**
* 获取角色分页数据
......@@ -11,9 +11,9 @@ export function getRolePage(
queryParams?: RoleQuery
): AxiosPromise<RolePageResult> {
return request({
url: '/api/v1/roles/page',
method: 'get',
params: queryParams
url: "/youlai-system/api/v1/roles/page",
method: "get",
params: queryParams,
});
}
......@@ -26,9 +26,9 @@ export function listRoleOptions(
queryParams?: RoleQuery
): AxiosPromise<OptionType[]> {
return request({
url: '/api/v1/roles/options',
method: 'get',
params: queryParams
url: "/youlai-system/api/v1/roles/options",
method: "get",
params: queryParams,
});
}
......@@ -39,8 +39,8 @@ export function listRoleOptions(
*/
export function getRoleMenuIds(roleId: number): AxiosPromise<number[]> {
return request({
url: '/api/v1/roles/' + roleId + '/menuIds',
method: 'get'
url: "/youlai-system/api/v1/roles/" + roleId + "/menuIds",
method: "get",
});
}
......@@ -54,9 +54,9 @@ export function updateRoleMenus(
data: number[]
): AxiosPromise<any> {
return request({
url: '/api/v1/roles/' + roleId + '/menus',
method: 'put',
data: data
url: "/youlai-system/api/v1/roles/" + roleId + "/menus",
method: "put",
data: data,
});
}
......@@ -67,8 +67,8 @@ export function updateRoleMenus(
*/
export function getRoleForm(id: number): AxiosPromise<RoleForm> {
return request({
url: '/api/v1/roles/' + id + '/form',
method: 'get'
url: "/youlai-system/api/v1/roles/" + id + "/form",
method: "get",
});
}
......@@ -79,9 +79,9 @@ export function getRoleForm(id: number): AxiosPromise<RoleForm> {
*/
export function addRole(data: RoleForm) {
return request({
url: '/api/v1/roles',
method: 'post',
data: data
url: "/youlai-system/api/v1/roles",
method: "post",
data: data,
});
}
......@@ -93,9 +93,9 @@ export function addRole(data: RoleForm) {
*/
export function updateRole(id: number, data: RoleForm) {
return request({
url: '/api/v1/roles/' + id,
method: 'put',
data: data
url: "/youlai-system/api/v1/roles/" + id,
method: "put",
data: data,
});
}
......@@ -106,7 +106,7 @@ export function updateRole(id: number, data: RoleForm) {
*/
export function deleteRoles(ids: string) {
return request({
url: '/api/v1/roles/' + ids,
method: 'delete'
url: "/youlai-system/api/v1/roles/" + ids,
method: "delete",
});
}
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { UserForm, UserInfo, UserPageVO, UserQuery } from './types';
import request from "@/utils/request";
import { AxiosPromise } from "axios";
import { UserForm, UserInfo, UserPageVO, UserQuery } from "./types";
/**
* 登录成功后获取用户信息(昵称、头像、权限集合和角色集合)
*/
export function getUserInfo(): AxiosPromise<UserInfo> {
return request({
url: '/api/v1/users/me',
method: 'get'
url: "/youlai-system/api/v1/users/me",
method: "get",
});
}
......@@ -21,9 +21,9 @@ export function getUserPage(
queryParams: UserQuery
): AxiosPromise<PageResult<UserPageVO[]>> {
return request({
url: '/api/v1/users/page',
method: 'get',
params: queryParams
url: "/youlai-system/api/v1/users/page",
method: "get",
params: queryParams,
});
}
......@@ -34,8 +34,8 @@ export function getUserPage(
*/
export function getUserForm(userId: number): AxiosPromise<UserForm> {
return request({
url: '/api/v1/users/' + userId + '/form',
method: 'get'
url: "/youlai-system/api/v1/users/" + userId + "/form",
method: "get",
});
}
......@@ -46,9 +46,9 @@ export function getUserForm(userId: number): AxiosPromise<UserForm> {
*/
export function addUser(data: any) {
return request({
url: '/api/v1/users',
method: 'post',
data: data
url: "/youlai-system/api/v1/users",
method: "post",
data: data,
});
}
......@@ -60,9 +60,9 @@ export function addUser(data: any) {
*/
export function updateUser(id: number, data: UserForm) {
return request({
url: '/api/v1/users/' + id,
method: 'put',
data: data
url: "/youlai-system/api/v1/users/" + id,
method: "put",
data: data,
});
}
......@@ -74,9 +74,9 @@ export function updateUser(id: number, data: UserForm) {
*/
export function updateUserStatus(id: number, status: number) {
return request({
url: '/api/v1/users/' + id + '/status',
method: 'patch',
params: { status: status }
url: "/youlai-system/api/v1/users/" + id + "/status",
method: "patch",
params: { status: status },
});
}
......@@ -88,9 +88,9 @@ export function updateUserStatus(id: number, status: number) {
*/
export function updateUserPassword(id: number, password: string) {
return request({
url: '/api/v1/users/' + id + '/password',
method: 'patch',
params: { password: password }
url: "/youlai-system/api/v1/users/" + id + "/password",
method: "patch",
params: { password: password },
});
}
......@@ -101,8 +101,8 @@ export function updateUserPassword(id: number, password: string) {
*/
export function deleteUsers(ids: string) {
return request({
url: '/api/v1/users/' + ids,
method: 'delete'
url: "/youlai-system/api/v1/users/" + ids,
method: "delete",
});
}
......@@ -113,9 +113,9 @@ export function deleteUsers(ids: string) {
*/
export function downloadTemplateApi() {
return request({
url: '/api/v1/users/template',
method: 'get',
responseType: 'arraybuffer'
url: "/youlai-system/api/v1/users/template",
method: "get",
responseType: "arraybuffer",
});
}
......@@ -127,10 +127,10 @@ export function downloadTemplateApi() {
*/
export function exportUser(queryParams: UserQuery) {
return request({
url: '/api/v1/users/_export',
method: 'get',
url: "/youlai-system/api/v1/users/_export",
method: "get",
params: queryParams,
responseType: 'arraybuffer'
responseType: "arraybuffer",
});
}
......@@ -141,14 +141,14 @@ export function exportUser(queryParams: UserQuery) {
*/
export function importUser(deptId: number, file: File) {
const formData = new FormData();
formData.append('file', file);
formData.append("file", file);
return request({
url: '/api/v1/users/_import',
method: 'post',
url: "/youlai-system/api/v1/users/_import",
method: "post",
params: { deptId: deptId },
data: formData,
headers: {
'Content-Type': 'multipart/form-data'
}
"Content-Type": "multipart/form-data",
},
});
}
export default {
// 路由国际化
route: {
dashboard: 'Dashboard',
document: 'Document'
dashboard: "Dashboard",
document: "Document",
},
// 登录页面国际化
login: {
title: 'vue3-element-admin',
username: 'Username',
password: 'Password',
login: 'Login',
verifyCode: 'Verify Code',
title: "mall-admin",
username: "Username",
password: "Password",
login: "Login",
verifyCode: "Verify Code",
},
// 导航栏国际化
navbar: {
dashboard: 'Dashboard',
logout: 'Logout',
document: 'Document',
gitee: 'Gitee'
}
dashboard: "Dashboard",
logout: "Logout",
document: "Document",
gitee: "Gitee",
},
};
export default {
// 路由国际化
route: {
dashboard: '首页',
document: '项目文档'
dashboard: "首页",
document: "项目文档",
},
// 登录页面国际化
login: {
title: 'vue3-element-admin',
username: '用户名',
password: '密码',
login: '登 录',
verifyCode: '验证码'
title: "mall-admin",
username: "用户名",
password: "密码",
login: "登 录",
verifyCode: "验证码",
},
// 导航栏国际化
navbar: {
dashboard: '首页',
logout: '注销',
document: '项目文档',
gitee: '码云'
}
dashboard: "首页",
logout: "注销",
document: "项目文档",
gitee: "码云",
},
};
......@@ -88,10 +88,7 @@ function logout() {
<router-link to="/">
<el-dropdown-item>{{ $t("navbar.dashboard") }}</el-dropdown-item>
</router-link>
<a
target="_blank"
href="https://github.com/youlaitech/vue3-element-admin"
>
<a target="_blank" href="https://github.com/youlaitech/mall-admin">
<el-dropdown-item>Github</el-dropdown-item>
</a>
<a target="_blank" href="https://gitee.com/haoxr">
......
<script lang="ts" setup>
import { useSettingsStore } from '@/store/modules/settings';
import { useSettingsStore } from "@/store/modules/settings";
const settingsStore = useSettingsStore();
defineProps({
collapse: {
type: Boolean,
required: true
}
required: true,
},
});
const logo = ref(new URL(`../../../assets/logo.png`, import.meta.url).href);
......@@ -23,9 +23,7 @@ const logo = ref(new URL(`../../../assets/logo.png`, import.meta.url).href);
to="/"
>
<img v-if="settingsStore.sidebarLogo" :src="logo" class="w-5 h-5" />
<span v-else class="ml-3 text-white text-sm font-bold"
>vue3-element-admin</span
>
<span v-else class="ml-3 text-white text-sm font-bold">mall-admin</span>
</router-link>
<router-link
......@@ -35,9 +33,7 @@ const logo = ref(new URL(`../../../assets/logo.png`, import.meta.url).href);
to="/"
>
<img v-if="settingsStore.sidebarLogo" :src="logo" class="w-5 h-5" />
<span class="ml-3 text-white text-sm font-bold"
>vue3-element-admin</span
>
<span class="ml-3 text-white text-sm font-bold">mall-admin</span>
</router-link>
</transition>
</div>
......
......@@ -42,7 +42,7 @@ interface DefaultSettings {
}
const defaultSettings: DefaultSettings = {
title: "vue3-element-admin",
title: "mall-admin",
showSettings: true,
tagsView: true,
fixedHeader: false,
......
......@@ -29,8 +29,8 @@ export const useUserStore = defineStore("user", () => {
return new Promise<void>((resolve, reject) => {
loginApi(loginData)
.then((response) => {
const { tokenType, accessToken } = response.data;
token.value = tokenType + " " + accessToken; // Bearer eyJhbGciOiJIUzI1NiJ9.xxx.xxx
const { token_type, access_token } = response.data;
token.value = token_type + " " + access_token; // Bearer eyJhbGciOiJIUzI1NiJ9.xxx.xxx
resolve();
})
.catch((error) => {
......
......@@ -257,7 +257,7 @@ const handleSubmit = useThrottleFn(() => {
}
}
});
}, 3000);
}, 9527);
/**
* 删除用户
......
......@@ -43,8 +43,8 @@ export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
proxy: {
// 反向代理解决跨域
[env.VITE_APP_BASE_API]: {
target: "http://vapi.youlai.tech", // 线上接口地址
// target: 'http://localhost:8989', // 本地接口地址 , 后端工程仓库地址:https://gitee.com/youlaiorg/youlai-boot
// target: "http://api.youlai.tech", // 线上接口地址
target: "http://localhost:9999", // 本地接口地址
changeOrigin: true,
rewrite: (path) =>
path.replace(new RegExp("^" + env.VITE_APP_BASE_API), ""), // 替换 /dev-api 为 target 接口地址
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册