parent
5085e5a38a
commit
4fe89b0398
14 changed files with 273 additions and 4 deletions
@ -0,0 +1,4 @@ |
|||||||
|
# 变量必须以 VITE_ 为前缀才能暴露给外部读取 |
||||||
|
NODE_ENV = 'development' |
||||||
|
VITE_APP_TITLE = '无糖运营平台' |
||||||
|
VITE_APP_BASE_API = '/api' |
@ -0,0 +1,3 @@ |
|||||||
|
NODE_ENV = 'production' |
||||||
|
VITE_APP_TITLE = '无糖运营平台' |
||||||
|
VITE_APP_BASE_API = '/prod-api' |
@ -0,0 +1,4 @@ |
|||||||
|
# 变量必须以 VITE_ 为前缀才能暴露给外部读取 |
||||||
|
NODE_ENV = 'test' |
||||||
|
VITE_APP_TITLE = '无糖运营平台' |
||||||
|
VITE_APP_BASE_API = '/test-api' |
@ -0,0 +1,65 @@ |
|||||||
|
// @see https://eslint.bootcss.com/docs/rules/ |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
env: { |
||||||
|
browser: true, |
||||||
|
es2021: true, |
||||||
|
node: true, |
||||||
|
jest: true, |
||||||
|
}, |
||||||
|
globals: { |
||||||
|
VANTA: 'readonly', //VANTA 已经cdn引入 这里拒绝eslint报错 全局声明一下 |
||||||
|
ElMessage: 'readonly', |
||||||
|
ElMessageBox: 'readonly', |
||||||
|
ElLoading: 'readonly', |
||||||
|
}, |
||||||
|
/* 指定如何解析语法 */ |
||||||
|
parser: 'vue-eslint-parser', |
||||||
|
/** 优先级低于 parse 的语法解析配置 */ |
||||||
|
parserOptions: { |
||||||
|
ecmaVersion: 'latest', |
||||||
|
sourceType: 'module', |
||||||
|
parser: '@typescript-eslint/parser', |
||||||
|
jsxPragma: 'React', |
||||||
|
ecmaFeatures: { |
||||||
|
jsx: true, |
||||||
|
}, |
||||||
|
}, |
||||||
|
/* 继承已有的规则 */ |
||||||
|
extends: [ |
||||||
|
'eslint:recommended', |
||||||
|
'plugin:vue/vue3-essential', |
||||||
|
'plugin:@typescript-eslint/recommended', |
||||||
|
'plugin:prettier/recommended', |
||||||
|
], |
||||||
|
plugins: ['vue', '@typescript-eslint'], |
||||||
|
/* |
||||||
|
* "off" 或 0 ==> 关闭规则 |
||||||
|
* "warn" 或 1 ==> 打开的规则作为警告(不影响代码执行) |
||||||
|
* "error" 或 2 ==> 规则作为一个错误(代码不能执行,界面报错) |
||||||
|
*/ |
||||||
|
rules: { |
||||||
|
// eslint(https://eslint.bootcss.com/docs/rules/) |
||||||
|
'no-var': 'error', // 要求使用 let 或 const 而不是 var |
||||||
|
'no-multiple-empty-lines': ['warn', { max: 1 }], // 不允许多个空行 |
||||||
|
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', |
||||||
|
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', |
||||||
|
'no-unexpected-multiline': 'error', // 禁止空余的多行 |
||||||
|
'no-useless-escape': 'off', // 禁止不必要的转义字符 |
||||||
|
|
||||||
|
// typeScript (https://typescript-eslint.io/rules) |
||||||
|
'@typescript-eslint/no-unused-vars': 'error', // 禁止定义未使用的变量 |
||||||
|
'@typescript-eslint/prefer-ts-expect-error': 'off', // 禁止使用 @ts-ignore |
||||||
|
'@typescript-eslint/ban-ts-ignore': 'off', |
||||||
|
'@typescript-eslint/no-explicit-any': 'off', // 禁止使用 any 类型 |
||||||
|
'@typescript-eslint/no-non-null-assertion': 'off', |
||||||
|
'@typescript-eslint/no-namespace': 'off', // 禁止使用自定义 TypeScript 模块和命名空间。 |
||||||
|
'@typescript-eslint/semi': 'off', |
||||||
|
|
||||||
|
// eslint-plugin-vue (https://eslint.vuejs.org/rules/) |
||||||
|
'vue/multi-word-component-names': 'off', // 要求组件名称始终为 “-” 链接的单词 |
||||||
|
'vue/script-setup-uses-vars': 'error', // 防止<script setup>使用的变量<template>被标记为未使用 |
||||||
|
'vue/no-mutating-props': 'off', // 不允许组件 prop的改变 |
||||||
|
'vue/attribute-hyphenation': 'off', // 对模板中的自定义组件强制执行属性命名样式 |
||||||
|
}, |
||||||
|
} |
@ -0,0 +1,9 @@ |
|||||||
|
{ |
||||||
|
"singleQuote": true, |
||||||
|
"semi": false, |
||||||
|
"bracketSpacing": true, |
||||||
|
"htmlWhitespaceSensitivity": "ignore", |
||||||
|
"endOfLine": "auto", |
||||||
|
"trailingComma": "all", |
||||||
|
"tabWidth": 2 |
||||||
|
} |
@ -0,0 +1,53 @@ |
|||||||
|
// @see https://stylelint.bootcss.com/ |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
extends: [ |
||||||
|
'stylelint-config-standard', // 配置stylelint拓展插件 |
||||||
|
'stylelint-config-standard-vue', // 配置 vue 中 template 样式格式化 |
||||||
|
'stylelint-config-standard-scss', // 配置stylelint scss插件 |
||||||
|
'stylelint-config-recommended-vue/scss', // 配置 vue 中 scss 样式格式化 |
||||||
|
'stylelint-config-recess-order', // 配置stylelint css属性书写顺序插件, |
||||||
|
'stylelint-config-prettier', // 配置stylelint和prettier兼容 |
||||||
|
], |
||||||
|
overrides: [ |
||||||
|
{ |
||||||
|
files: ['**/*.(scss|css|vue|html)'], |
||||||
|
customSyntax: 'postcss-scss', |
||||||
|
}, |
||||||
|
{ |
||||||
|
files: ['**/*.(html|vue)'], |
||||||
|
customSyntax: 'postcss-html', |
||||||
|
}, |
||||||
|
], |
||||||
|
ignoreFiles: [ |
||||||
|
'**/*.js', |
||||||
|
'**/*.jsx', |
||||||
|
'**/*.tsx', |
||||||
|
'**/*.ts', |
||||||
|
'**/*.json', |
||||||
|
'**/*.md', |
||||||
|
'**/*.yaml', |
||||||
|
], |
||||||
|
/** |
||||||
|
* null => 关闭该规则 |
||||||
|
* always => 必须 |
||||||
|
*/ |
||||||
|
rules: { |
||||||
|
'value-keyword-case': null, // 在 css 中使用 v-bind,不报错 |
||||||
|
'no-descending-specificity': null, // 禁止在具有较高优先级的选择器后出现被其覆盖的较低优先级的选择器 |
||||||
|
'function-url-quotes': 'always', // 要求或禁止 URL 的引号 "always(必须加上引号)"|"never(没有引号)" |
||||||
|
'no-empty-source': null, // 关闭禁止空源码 |
||||||
|
'selector-class-pattern': null, // 关闭强制选择器类名的格式 |
||||||
|
'property-no-unknown': null, // 禁止未知的属性(true 为不允许) |
||||||
|
'block-opening-brace-space-before': 'always', //大括号之前必须有一个空格或不能有空白符 |
||||||
|
'value-no-vendor-prefix': null, // 关闭 属性值前缀 --webkit-box |
||||||
|
'property-no-vendor-prefix': null, // 关闭 属性前缀 -webkit-mask |
||||||
|
'selector-pseudo-class-no-unknown': [ |
||||||
|
// 不允许未知的选择器 |
||||||
|
true, |
||||||
|
{ |
||||||
|
ignorePseudoClasses: ['global', 'v-deep', 'deep'], // 忽略属性,修改element默认样式的时候能使用到 |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
} |
@ -0,0 +1,18 @@ |
|||||||
|
# Vue 3 + TypeScript + Vite |
||||||
|
|
||||||
|
This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more. |
||||||
|
|
||||||
|
## Recommended IDE Setup |
||||||
|
|
||||||
|
- [VS Code](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin). |
||||||
|
|
||||||
|
## Type Support For `.vue` Imports in TS |
||||||
|
|
||||||
|
TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin) to make the TypeScript language service aware of `.vue` types. |
||||||
|
|
||||||
|
If the standalone TypeScript plugin doesn't feel fast enough to you, Volar has also implemented a [Take Over Mode](https://github.com/johnsoncodehk/volar/discussions/471#discussioncomment-1361669) that is more performant. You can enable it by the following steps: |
||||||
|
|
||||||
|
1. Disable the built-in TypeScript Extension |
||||||
|
1. Run `Extensions: Show Built-in Extensions` from VSCode's command palette |
||||||
|
2. Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)` |
||||||
|
2. Reload the VSCode window by running `Developer: Reload Window` from the command palette. |
@ -0,0 +1,2 @@ |
|||||||
|
dist |
||||||
|
node_modules |
@ -0,0 +1,24 @@ |
|||||||
|
# Logs |
||||||
|
logs |
||||||
|
*.log |
||||||
|
npm-debug.log* |
||||||
|
yarn-debug.log* |
||||||
|
yarn-error.log* |
||||||
|
pnpm-debug.log* |
||||||
|
lerna-debug.log* |
||||||
|
|
||||||
|
node_modules |
||||||
|
dist |
||||||
|
dist-ssr |
||||||
|
*.local |
||||||
|
|
||||||
|
# Editor directories and files |
||||||
|
.vscode/* |
||||||
|
!.vscode/extensions.json |
||||||
|
.idea |
||||||
|
.DS_Store |
||||||
|
*.suo |
||||||
|
*.ntvs* |
||||||
|
*.njsproj |
||||||
|
*.sln |
||||||
|
*.sw? |
@ -0,0 +1,4 @@ |
|||||||
|
/node_modules/* |
||||||
|
/dist/* |
||||||
|
/html/* |
||||||
|
/public/* |
@ -0,0 +1,15 @@ |
|||||||
|
<!doctype html> |
||||||
|
<html lang="en"> |
||||||
|
<head> |
||||||
|
<meta charset="UTF-8" /> |
||||||
|
<link rel="icon" type="image/svg+xml" href="/vite.svg" /> |
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
||||||
|
<title>教学一体化后师生后台</title> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
<div id="app"></div> |
||||||
|
<script type="module" src="/src/main.ts"></script> |
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r134/three.min.js"></script> |
||||||
|
<script src="https://cdn.jsdelivr.net/npm/vanta@latest/dist/vanta.globe.min.js"></script> |
||||||
|
</body> |
||||||
|
</html> |
@ -0,0 +1,69 @@ |
|||||||
|
//用户信息数据
|
||||||
|
function createUserList() { |
||||||
|
return [ |
||||||
|
{ |
||||||
|
userId: 1, |
||||||
|
avatar: |
||||||
|
'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif', |
||||||
|
username: 'admin', |
||||||
|
password: '111111', |
||||||
|
desc: '平台管理员', |
||||||
|
roles: ['平台管理员'], |
||||||
|
buttons: ['cuser.detail'], |
||||||
|
routes: ['Home', 'Course', 'Student', 'Group', 'Message','BasicCourseInformation','CourseObjectives','CourseChapters','KnowledgePoints','CurriculumMap'], //老师权限
|
||||||
|
token: 'Admin Token', |
||||||
|
}, |
||||||
|
{ |
||||||
|
userId: 2, |
||||||
|
avatar: |
||||||
|
'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif', |
||||||
|
username: 'student', |
||||||
|
password: '111111', |
||||||
|
desc: '系统管理员', |
||||||
|
roles: ['系统管理员'], |
||||||
|
buttons: ['cuser.detail', 'cuser.user'], |
||||||
|
routes: ['Home', 'MyCourseStudy', 'CourseResources', 'Message','LearningProcess','CourseCollections','Courselikes','WebHome','CourseHome','LearningPathRecommendations','KnowledgePointLearning','CourseReports'], //学生权限
|
||||||
|
token: 'System Token', |
||||||
|
}, |
||||||
|
] |
||||||
|
} |
||||||
|
|
||||||
|
export default [ |
||||||
|
// 用户登录接口
|
||||||
|
{ |
||||||
|
url: '/api/user/login', //请求地址
|
||||||
|
method: 'post', //请求方式
|
||||||
|
response: ({ body }) => { |
||||||
|
//获取请求体携带过来的用户名与密码
|
||||||
|
const { username, password } = body |
||||||
|
//调用获取用户信息函数,用于判断是否有此用户
|
||||||
|
const checkUser = createUserList().find( |
||||||
|
(item) => item.username === username && item.password === password, |
||||||
|
) |
||||||
|
//没有用户返回失败信息
|
||||||
|
if (!checkUser) { |
||||||
|
return { code: 201, data: { message: '账号或者密码不正确' } } |
||||||
|
} |
||||||
|
//如果有返回成功信息
|
||||||
|
const { token } = checkUser |
||||||
|
return { code: 200, data: { token } } |
||||||
|
}, |
||||||
|
}, |
||||||
|
// 获取用户信息
|
||||||
|
{ |
||||||
|
url: '/api/user/info', |
||||||
|
method: 'get', |
||||||
|
response: (request) => { |
||||||
|
//获取请求头携带token
|
||||||
|
const token = request.headers.token |
||||||
|
//查看用户信息是否包含有次token用户
|
||||||
|
const checkUser = createUserList().find((item) => item.token === token) |
||||||
|
//没有返回失败的信息
|
||||||
|
if (!checkUser) { |
||||||
|
return { code: 201, data: { message: '获取用户信息失败' } } |
||||||
|
} |
||||||
|
//如果有返回成功信息
|
||||||
|
return { code: 200, data: { checkUser } } |
||||||
|
}, |
||||||
|
}, |
||||||
|
] |
Loading…
Reference in new issue