# vue3-ts-express-mysql **Repository Path**: atom__python/vue3-ts-express-mysql ## Basic Information - **Project Name**: vue3-ts-express-mysql - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-01-22 - **Last Updated**: 2024-02-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 一、项目初始化设置 ## 1. 初始化项目 **创建项目** ```bash npm create vue@latest ``` ![1. 项目创建](https://s2.loli.net/2024/01/27/hBD7UVztab5TAes.png) 通过git工具初始化项目,并且将其上传到新建的[github](https://github.com/)中。 ```bash cd vue3-ts-express-mysql npm install git init touch README.md git add README.md git commit -m "项目初始化设置" git remote add origin https://gitee.com/atom__python/vue3-ts-express-mysql.git git push -u origin "master" ```` ## 2. ESLint & prettier 配置代码风格 ### 2.1 环境同步: 1. 安装了插件 ESlint,开启保存自动修复 ```bash npm install eslint --save-dev ``` 1. 禁用了vscode插件 Prettier,并关闭保存自动格式化(format on save关闭) 2. 设置`settings.json`文件 ```jsx // ESlint插件 + Vscode配置 实现自动格式化修复 "editor.codeActionsOnSave": { "source.fixAll": true }, // 关闭保存自动格式化 "editor.formatOnSave": false, ``` ### 2.2 配置 .eslintrc.cjs 文件 1. prettier 风格配置 [https://prettier.io](https://prettier.io/docs/en/options.html ) 1. 单引号 2. 不使用分号 3. 每行宽度至多80字符 4. 不加对象|数组最后逗号 5. 换行符号不限制(win mac 不一致) 2. vue组件名称多单词组成(忽略index.vue) 3. props解构(关闭)【如果不关闭,结构props因为会失去响应式,所以会报错】 在`.eslintrc.cjs`文件中添加规则。 ```jsx rules: { 'prettier/prettier': [ 'warn', { singleQuote: true, // 单引号 semi: false, // 无分号 printWidth: 80, // 每行宽度至多80字符 trailingComma: 'none', // 不加对象|数组最后逗号 endOfLine: 'auto' // 换行符号不限制(win mac 不一致) } ], 'vue/multi-word-component-names': 'Off', 'vue/no-setup-props-destructure': ['off'], // 关闭 props 解构的校验,不关闭为什么报错,因为props结构后会失去响应式 // 💡 添加未定义变量错误提示。 'no-undef': 'error' } ``` > 备注一:`error Parsing error: Invalid ecmaVersion`报错需要将`.eslintrc.cjs`修改为**ecmaVersion: `12`** ## 3. 基于 husky 的代码检查工作流 ### 3.1 提交代码前进行代码检查 husky 是一个 git hooks 工具 ( git的钩子工具,可以在特定时机执行特定的命令 ) 1. git初始化 git init(前面已完成) ```bash git init ``` > 备注一:首先升级 git 到`2.42.0`(否则不会自动生成.husky/pre-commit) 2. 初始化 husky 工具配置 https://typicode.github.io/husky/ ```bash npx husky-init && npm install ``` 3. 修改 `.husky/pre-commit` 文件 将npm test修改为npm lint ```bash npm lint ``` **问题:**默认进行的是**全量**检查,耗时问题,历史问题。 ### 3.2 优化husky 我们只对当前代码进行校验,**lint-staged 配置**(`只格式化自己的代码`) 1. 安装 ```bash npm i lint-staged -D ``` 2. 配置 `package.json` ```jsx // 修改的启动 { "scripts": { // ... 省略 ... "lint-staged": "lint-staged" } } // 下列代码放在最后 { // ... 省略 ... "lint-staged": { "*.{js,ts,vue}": [ "eslint --fix" ] } } ``` 3. 修改 `.husky/pre-commit` 文件 ```jsx npm run lint-staged ``` ## 4. 调整项目目录 ### 4.1 基础调整 默认生成的目录结构不满足我们的开发需求,所以这里需要做一些自定义改动。主要是两个工作: - 删除初始化的默认文件 - 删除assets内文件 - 删除component内文件 - 清空stores中的文件 - 清空views中文件 - 清空`router/index.ts`中routes数组中内容 - App.vue中内容清空 - main.js中删除样式引入 - 新增调整我们需要的目录结构 - 新增api、utils、config文件夹 ```bash mkdir api utils config ``` - 安装 sass 依赖 ```bash npm install sass sass-loader -D ``` + 修改的`router.ts,app.js,main.ts`文件 ① `src/router/index.ts` ```jsx import { createRouter, createWebHistory } from 'vue-router' const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), routes: [] }) export default router ``` ② `src/App.vue` ```jsx ``` ③ `src/main.ts` ```jsx import { createApp } from 'vue' import { createPinia } from 'pinia' import App from './App.vue' import router from './router' const app = createApp(App) app.use(createPinia()) app.use(router) app.mount('#app') ``` ④ 安装`nomalize.css`文件并在`main.ts`中全局引用 ```jsx npm install normalize.css -S // main.js中引入 import 'normalize.css' ``` > 备注一:**normalize模块**用于创建一致的默认样式的 CSS 文件。它的主要作用是重置和标准化不同浏览器之间的默认样式差异,使网页在各种浏览器中拥有一致的表现。 ### 4.2 设置组件名 我们在使用**选项式api**时可以在export default内部写name值,但是如果我们采用**组合式api**中**setup**语法糖,就不需要export default,于是我们采用如下模块进行解决。 **① 采用分离式写法** ```js ``` **② 采用插件辅助(本项目的方法)** 1. 第一步:`npm i vite-plugin-vue-setup-extend -D` 2. 第二步:`vite.config.ts` ```jsx import VueSetupExtend from 'vite-plugin-vue-setup-extend' export default defineConfig({ plugins: [ VueSetupExtend() ] }) ``` 3. 第三步:直接将name写在script中即可。 ```ts ``` ### 1.3 数据验证 在上述静态页面中,我们可以看到在我们分别定义了如下数据: + 在`el-form`中定义了 + `:model='loginData'`或`:model='registerData'`用来进行数据绑定 + `:rules="rules"`用于基础表单验证 + `ref="loginRef"`或`ref="registerRef"`用于提交表单验证 + 在`el-form-item`中定义了`prop='account'`,`prop='password'`,`prop='repassword'`用于基础表单验证 + 在`el-intput`中定义的`v-model="loginData.account"`用于数据绑定 ```vue ``` ## 2. 忘记密码弹窗制作 ![image-20240131205224172](https://s2.loli.net/2024/01/31/iBDMHdAaIZ2YtTN.png) ### 2.1 静态页面 此弹窗采用了`el-dialog`组件配合`el-input`进行制作。 弹窗的隐藏与显示,本项目中我们将弹窗单独存储到`src/login/components/forgetDialog.vue`公共组件中,通过设置`el-dialog`中的`:model`来设置显示与隐藏,而我们想在**父组件中使用子组件**中的**属性**或**方法**,需要如下步骤: + 子组件中创建**属性**或**方法**,==并且要暴露属性或方法== + 引入子组件 + 给引入子组件添加ref,并定义ref 子组件为:`src/login/components/forgetDialog.vue`创建公共弹窗组件 ```vue ``` 父组件为:`src/login/login.vue` ```vue ``` 在`src/login/components/forgetDialog.vue`弹层组件中共分为2个弹窗,分别为:”忘记密码"、“修改密码”。 **① 忘记密码弹窗** 忘记密码"弹窗分为静态页面部分 + 基础数据部门 + 基础校验 + 取消与下一步方法 静态页面部分包含定义表单数据(**forgetData**)、验证数据(**forgetRules以及props**)、取消与下一步方法(**hCancelForget、hNext**) ```vue // 静态页面 ``` 基础部门数据、基础校验、取消与下一步方法 ```vue ``` **② 修改密码弹层** 修改密码"弹窗分为静态页面部分 + 基础数据部门 + 基础校验 + 取消与修改方法 静态页面部分包含定义表单数据(**changePasswordData**)、验证数据(**changePasswordRules以及props**)、取消与下一步方法(**hCancelChangeDialog、hChangePassword**) ```vue ``` 基础部门数据、基础校验、取消与确定方法 + 自定义验证规则,判断两次输入密码是否相同 + 确定修改密码时,需要额外添加**清空“忘记密码”页面的数据** ```vue ``` 添加“右上角关闭按钮”调用方法 ```vue ``` # 第三章、菜单页面制作 ## 1. 首页 -- 侧边栏 ![image-20240131221156749](https://s2.loli.net/2024/02/01/QFy3cEsSIivoeGl.png) 创建`src/views/Layout/Layout.vue`布局组件 ```vue ``` 在`router/index.ts`中创建路由 ```js routes: [ ... { path: '/layout', name: 'layout', component: Layout, children: [ { path: 'home', name: 'home', component: () => import('@/views/Home/Home.vue') } ] } ] ``` 设置侧边栏,采用`el-menu`组件,需要设置的参数为: + background-color:目录颜色 + active-text-color:选中时文字颜色 + default-active:设置默认选中路由 + text-color:文字颜色 + router:点击子目录可以跳转路由 在`el-menu-item`中设置`index`关联路由 ```vue 首页 系统概述 产品管理员 用户管理员 消息管理员 用户列表 产品列表 出库列表 消息列表 回收站 合同管理 操作日志 登录日志 系统设置 // 样式设置 ``` ## 2. 公共图标 ### 2.1 按需自动引入elementplus的图标。 安装所需模块 ```bash npm i element-plus @element-plus/icons-vue npm i -D unplugin-icons ``` 在`vite.config.ts`中进行设置 ```js // 自动引入图标 import Icons from 'unplugin-icons/vite' import IconsResolver from 'unplugin-icons/resolver' AutoImport({ resolvers: [ ElementPlusResolver(), // 自动导入图标组件 IconsResolver({ // 设置使用前缀 prefix: 'Icon' }) ] }), Components({ resolvers: [ // 自动导入Element plus组件 ElementPlusResolver(), // 自动注册图标组件 IconsResolver({ // 启用elementplus图标集 enabledCollections: ['ep'] }) ] }), Icons({ autoInstall: true }) ``` ### 2.2 Icon图标单独使用 ```vue ``` ### 2.3 动态使用 ```vue ``` ## 3. 首页 -- 头部 头部分为左右两部分 ```vue const state = reactive({ circleUrl: 'https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png' }) const { circleUrl } = toRefs(state) ``` > 备注一:当我们鼠标移动到下拉组件上focus时会出现一个黑色框,解决方法 > > ```scss > .el-dropdown-link:focus { > outline: none; > } > ``` > 备注二:因为解构会失去响应式,所以上面代码采用toRefs形式