This commit is contained in:
2023-06-04 23:15:37 +08:00
parent 587f078d21
commit bdbda8b68e
17 changed files with 31669 additions and 8427 deletions

View File

@@ -1,3 +1,2 @@
/*.json /*.json
/*.ts
dist dist

4550
cdTMP/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -31,6 +31,8 @@
"vuedraggable": "^2.24.3" "vuedraggable": "^2.24.3"
}, },
"devDependencies": { "devDependencies": {
"@types/lodash": "^4.14.195",
"@types/qs": "^6.9.7",
"@vitejs/plugin-vue": "^4.1.0", "@vitejs/plugin-vue": "^4.1.0",
"@vitejs/plugin-vue-jsx": "^3.0.1", "@vitejs/plugin-vue-jsx": "^3.0.1",
"autoprefixer": "^10.4.14", "autoprefixer": "^10.4.14",

122
cdTMP/src/api/request.js Normal file
View File

@@ -0,0 +1,122 @@
import axios from "axios"
import { Message } from "@arco-design/web-vue"
import tool from "@/utils/tool"
import { get, isEmpty } from "lodash"
import qs, { stringify } from "qs"
import { h } from "vue"
import { IconFaceFrownFill } from "@arco-design/web-vue/dist/arco-vue-icon"
// createService
function createService() {
// 创建axios实例
const service = axios.create()
// 实例的request请求拦截器
service.interceptors.request.use(
(config) => config,
(error) => {
return Promise.reject(error)
}
)
// 实例的response响应拦截器
service.interceptors.response.use(
(res) => {
// 如果发现响应头有文件传输扩展或则响应头为application/json或者直接status=200
if (
(res.headers["content-disposition"] || !/^application\/json/.test(res.headers["content-type"])) &&
res.status === 200
) {
return res
// 如果发现data中有size字段直接报错
} else if (res.data.size) {
res.data.code = 500
res.data.message = "服务器内部错误"
res.data.success = false
} else if (res.data.code && res.data.code !== 200) {
Message.error({
content: res.data.message,
// 注意奇怪的用法
icon: () => h(IconFaceFrownFill)
})
}
return res.data
},
(error) => {
// 其实基本逻辑是有message写message
// 没用message再去找默认的response的status
const err = (text) => {
Message.error({
content:
error.response && error.response.data && error.response.data.message
? error.response.data.message
: text,
icon: () => h(IconFaceFrownFill)
})
}
if (error.response && error.response.data) {
switch (error.response.status) {
case 404:
err("服务器资源不存在")
break
case 500:
err("服务器内部错误")
break
case 401:
err("登录状态已过期,需要重新登录")
// 清楚本地localStorage
tool.local.clear()
// 移动到网站的根目录
window.location.href = "/"
break
case 403:
err("没有权限访问该资源")
break
default:
err("未知错误!")
}
} else {
err("请求超时,服务器无响应!")
}
return Promise.reject(error.response && error.response.data ? error.response.data : null)
}
)
return service
}
/**
* @description 创建请求方法
* @param {Object} service axios 实例
*/
function createRequest(service) {
return function (config) {
const env = import.meta.env
// localStorage获取token信息
const token = tool.local.get(env.VITE_APP_TOKEN_PREFIX)
const configDefault = {
headers: {
Authorization: "Bearer " + token,
"Accept-Language": "zh_CN",
"Content-Type": get(config, "headers.Content-Type", "application/json;charset=UTF-8")
},
timeout: 10000,
baseURL: env.VITE_APP_OPEN_PROXY === "true" ? env.VITE_APP_PROXY_PREFIX : env.VITE_APP_BASE_URL,
data: {}
}
// option是configDefault和传入的config合并
const option = Object.assign(configDefault, config)
// lodash的isEmpty函数可以判断对象属性是否为空/数组是否为空->为空则返回true
// qs中stringfy作用是urlencode
// { c: 'b', a: 'd' } -> 'c=b&a=d'
// 如果有params就转为urlencode样子
if (!isEmpty(option.params)) {
option.url = option.url + "?" + stringify(option.params)
option.params = {}
}
return service(option)
}
}
// 上面两个函数一个为增加实例拦截器,一个是传入实例后请求
export const service = createService()
// 返回的是一个函数这个函数传入config然后添加上默认config然后发出实例的请求
export const request = createRequest(service)

View File

View File

@@ -34,4 +34,30 @@ tool.capsule = (title, info, type = "primary") => {
) )
} }
// local函数处理localStorage
/**
* LocalStorage
*/
tool.local = {
set(table, settings) {
let _set = JSON.stringify(settings)
return localStorage.setItem(table, _set)
},
get(table) {
let data = localStorage.getItem(table)
try {
data = JSON.parse(data)
} catch (err) {
return null
}
return data
},
remove(table) {
return localStorage.removeItem(table)
},
clear() {
return localStorage.clear()
}
}
export default tool export default tool

View File

@@ -77,12 +77,17 @@
import { reactive, onMounted, ref } from "vue" import { reactive, onMounted, ref } from "vue"
import verifyCode from "@cps/ma-verifyCode/index.vue" import verifyCode from "@cps/ma-verifyCode/index.vue"
import { Message } from "@arco-design/web-vue" import { Message } from "@arco-design/web-vue"
import { useUserStore } from "@/store"
import { useRouter, useRoute } from "vue-router"
const router = useRouter()
const route = useRoute()
const userStore = useUserStore()
// 绑定登录form的数据 // 绑定登录form的数据
const form = reactive({ username: "superAdmin", password: "admin123", code: "" }) const form = reactive({ username: "superAdmin", password: "admin123", code: "" })
// 获取验证码dom && arco表单loading // 获取验证码dom && arco表单loading
const Verify = ref(null) const Verify = ref(null)
const loading = ref(null) const loading = ref(null)
// handle登录按钮表单校验以及验证码 // 点击登录按钮
const handleSubmit = async ({ values, errors }) => { const handleSubmit = async ({ values, errors }) => {
if (loading.value) { if (loading.value) {
return return
@@ -90,6 +95,18 @@ const handleSubmit = async ({ values, errors }) => {
loading.value = true loading.value = true
if (Verify.value.checkResult(form.code) && !errors) { if (Verify.value.checkResult(form.code) && !errors) {
// 登录逻辑需要用到userStore // 登录逻辑需要用到userStore
const result = await useUserStore.login(form)
if (!result) {
loading.value = false
return
}
// 1.注意router.currentRoute.value要加value
// 2.query是router的东西params是axios的东西
const { redirect, ...othersQuery } = router.currentRoute.value.query
router.push({
name: redirect || "WorkPlace",
query: { ...othersQuery }
})
} }
loading.value = false loading.value = false
} }

View File

@@ -1,7 +1,7 @@
{ {
"compilerOptions": { "compilerOptions": {
"composite": false, "composite": false,
"outDir": "./build", "outDir": "build",
"declaration": true, "declaration": true,
"declarationMap": true, "declarationMap": true,
"esModuleInterop": true, "esModuleInterop": true,
@@ -32,6 +32,9 @@
"@cps/*": [ "@cps/*": [
"src/components/*" "src/components/*"
], ],
"vue-i18n": [
"vue-i18n/dist/vue-i18n.cjs.js"
]
}, },
"lib": [ "lib": [
"dom", "dom",
@@ -52,6 +55,6 @@
], ],
"exclude": [ "exclude": [
"node_modules", "node_modules",
"build/**/*", "build/**/*"
] ]
} }

View File

@@ -1,3 +1,2 @@
### login页面样式 ### login页面样式
1.把login页面的业务写完->包括store的和router逻辑 1.明天了解arco和mine两个的user.jsstore里面的
2.login样式全理解

18468
cdtestplant/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -42,7 +42,9 @@
"vuedraggable": "^4.1.0" "vuedraggable": "^4.1.0"
}, },
"devDependencies": { "devDependencies": {
"@types/lodash": "^4.14.195",
"@types/nprogress": "^0.2.0", "@types/nprogress": "^0.2.0",
"@types/qs": "^6.9.7",
"@types/vue": "^2.0.0", "@types/vue": "^2.0.0",
"less": "^4.1.3", "less": "^4.1.3",
"less-loader": "^11.0.0", "less-loader": "^11.0.0",
@@ -1046,6 +1048,12 @@
"dev": true, "dev": true,
"peer": true "peer": true
}, },
"node_modules/@types/lodash": {
"version": "4.14.195",
"resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.195.tgz",
"integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==",
"dev": true
},
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.2.5", "version": "20.2.5",
"resolved": "https://registry.npmmirror.com/@types/node/-/node-20.2.5.tgz", "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.2.5.tgz",
@@ -1059,6 +1067,12 @@
"integrity": "sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==", "integrity": "sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==",
"dev": true "dev": true
}, },
"node_modules/@types/qs": {
"version": "6.9.7",
"resolved": "https://registry.npmmirror.com/@types/qs/-/qs-6.9.7.tgz",
"integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
"dev": true
},
"node_modules/@types/vue": { "node_modules/@types/vue": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmmirror.com/@types/vue/-/vue-2.0.0.tgz", "resolved": "https://registry.npmmirror.com/@types/vue/-/vue-2.0.0.tgz",

View File

@@ -44,7 +44,9 @@
"vuedraggable": "^4.1.0" "vuedraggable": "^4.1.0"
}, },
"devDependencies": { "devDependencies": {
"@types/lodash": "^4.14.195",
"@types/nprogress": "^0.2.0", "@types/nprogress": "^0.2.0",
"@types/qs": "^6.9.7",
"@types/vue": "^2.0.0", "@types/vue": "^2.0.0",
"less": "^4.1.3", "less": "^4.1.3",
"less-loader": "^11.0.0", "less-loader": "^11.0.0",

View File

@@ -1,12 +1,3 @@
<!--
- MineAdmin is committed to providing solutions for quickly building web applications
- Please view the LICENSE file that was distributed with this source code,
- For the full copyright and license information.
- Thank you very much for using MineAdmin.
-
- @Author X.Mo<root@imoi.cn>
- @Link https://gitee.com/xmo/mineadmin-vue
-->
<template> <template>
<a-cascader <a-cascader
v-if="props.type === 'cascader'" v-if="props.type === 'cascader'"

View File

@@ -22,6 +22,7 @@ function createService() {
// HTTP response 拦截器 // HTTP response 拦截器
service.interceptors.response.use( service.interceptors.response.use(
(response) => { (response) => {
// 请求正确情况
if ( if (
(response.headers["content-disposition"] || (response.headers["content-disposition"] ||
!/^application\/json/.test(response.headers["content-type"])) && !/^application\/json/.test(response.headers["content-type"])) &&

View File

@@ -3,16 +3,6 @@ import { reactive, ref } from "vue"
import verifyCode from "@cps/ma-verifyCode/index.vue" import verifyCode from "@cps/ma-verifyCode/index.vue"
import { useUserStore } from "@/store" import { useUserStore } from "@/store"
import { useRouter, useRoute } from "vue-router" import { useRouter, useRoute } from "vue-router"
import { request } from "@/utils/request"
// 首页图片暂时不用
// request({
// url: "system/getBingBackgroundImage",
// timeout: 10000,
// method: "get"
// }).then((res) => {
// document.getElementById("background").style.backgroundImage = `url(${res.data.url})`
// })
const router = useRouter() const router = useRouter()
const route = useRoute() const route = useRoute()

View File

@@ -523,6 +523,11 @@
resolved "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.12.tgz" resolved "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.12.tgz"
integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==
"@types/lodash@^4.14.195":
version "4.14.195"
resolved "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.195.tgz"
integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==
"@types/node@*", "@types/node@>= 14": "@types/node@*", "@types/node@>= 14":
version "20.2.5" version "20.2.5"
resolved "https://registry.npmmirror.com/@types/node/-/node-20.2.5.tgz" resolved "https://registry.npmmirror.com/@types/node/-/node-20.2.5.tgz"
@@ -533,6 +538,11 @@
resolved "https://registry.npmmirror.com/@types/nprogress/-/nprogress-0.2.0.tgz" resolved "https://registry.npmmirror.com/@types/nprogress/-/nprogress-0.2.0.tgz"
integrity sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A== integrity sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==
"@types/qs@^6.9.7":
version "6.9.7"
resolved "https://registry.npmmirror.com/@types/qs/-/qs-6.9.7.tgz"
integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==
"@types/vue@^2.0.0": "@types/vue@^2.0.0":
version "2.0.0" version "2.0.0"
resolved "https://registry.npmmirror.com/@types/vue/-/vue-2.0.0.tgz" resolved "https://registry.npmmirror.com/@types/vue/-/vue-2.0.0.tgz"