# adminSPA
**Repository Path**: ruochengflag/admin-spa
## Basic Information
- **Project Name**: adminSPA
- **Description**: 单页面应用
- **Primary Language**: JavaScript
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 0
- **Created**: 2020-11-04
- **Last Updated**: 2021-11-26
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 目录结构
```
|--
|-- .babelrc
|-- .editorconfig
|-- .eslintignore
|-- .eslintrc.js
|-- .gitignore
|-- .postcssrc.js
|-- .travis.yml
|-- favicon.ico
|-- index.html
|-- LICENSE
|-- package-lock.json
|-- package.json
|-- README.md
|-- build
|-- config
| |-- dev.env.js // 本地环境
| |-- index.js // 配置入口
| |-- prod.env.js // 线上环境
| |-- sit.env.js // 测试环境
|-- dist //打包目录
|-- src // 工程目录
| |-- App.vue
| |-- errorLog.js
| |-- main.js
| |-- permission.js
| |-- api //api 存放路径
| | |-- login.js
| |-- assets //静态资源
| | |-- 14.gif
| | |-- 401_images
| | | |-- 401.gif
| | |-- 404_images
| | | |-- 404.png
| | | |-- 404_cloud.png
| | |-- custom-theme
| | |-- index.css
| | |-- fonts
| | |-- element-icons.ttf
| | |-- element-icons.woff
| |-- components //组件存放位置
| | |-- Breadcrumb
| | | |-- index.vue
| | |-- DragSelect
| | | |-- index.vue
| | |-- ErrorLog
| | | |-- index.vue
| | |-- Hamburger
| | | |-- index.vue
| | |-- HeaderSearch
| | | |-- index.vue
| | |-- LangSelect
| | | |-- index.vue
| | |-- Screenfull
| | | |-- index.vue
| | |-- SizeSelect
| | | |-- index.vue
| | |-- SvgIcon
| | | |-- index.vue
| | |-- ThemePicker
| | | |-- index.vue
| | |-- TreeTable
| | |-- eval.js
| | |-- index.vue
| | |-- readme.md
| |-- directive
| | |-- sticky.js
| | |-- clipboard
| | | |-- clipboard.js
| | | |-- index.js
| | |-- el-dragDialog
| | |-- drag.js
| | |-- index.js
| |-- filters
| | |-- index.js
| |-- icons //icon图标
| |-- lang //多语言环境
| | |-- en.js
| | |-- index.js
| | |-- zh.js
| |-- router //路由
| | |-- index.js
| |-- store //vuex
| | |-- getters.js
| | |-- index.js
| | |-- modules
| | |-- app.js
| | |-- errorLog.js
| | |-- permission.js
| | |-- tagsView.js
| | |-- user.js
| |-- styles //公共样式
| | |-- btn.scss
| | |-- element-ui.scss
| | |-- index.scss
| | |-- mixin.scss
| | |-- sidebar.scss
| | |-- transition.scss
| | |-- variables.scss
| |-- utils //工具类
| | |-- auth.js
| | |-- clipboard.js
| | |-- i18n.js
| | |-- index.js
| | |-- openWindow.js
| | |-- permission.js
| | |-- request.js
| | |-- scrollTo.js
| | |-- validate.js
| |-- vendor // excel 表插件
| | |-- Export2Excel.js
| | |-- Export2Zip.js
| |-- views // 页面路径
| |-- dashboard
| | |-- index.vue
| |-- errorPage
| | |-- 401.vue
| | |-- 404.vue
| |-- layout // layout布局
| | |-- Layout.vue
| | |-- components
| | | |-- AppMain.vue
| | | |-- index.js
| | | |-- Navbar.vue
| | | |-- Sidebar
| | | | |-- FixiOSBug.js
| | | | |-- index.vue
| | | | |-- Item.vue
| | | | |-- Link.vue
| | | | |-- SidebarItem.vue
| | | |-- TagsView
| | | |-- index.vue
| | | |-- ScrollPane.vue
| | |-- mixin
| | |-- ResizeHandler.js
| |-- login
| | |-- index.vue
| |-- redirect
| | |-- index.vue
| |-- testNow
| |-- index.vue
|-- static
```
## 开发
```bash
# 安装依赖
npm install
# 启动服务
npm run dev
```
浏览器访问 http://localhost:9527
## 发布
```bash
# 构建测试环境
npm run build:sit
# 构建生产环境
npm run build:prod
```
## 其它
```
# 构建生产环境
npm run build:prod
# 生成一个bundle size分析。默认值:bundle-report.html
npm run build:prod --generate_report
# --在本地启动服务器进行预览
npm run build:prod --preview
# 代码格式检查
npm run lint
# 代码格式检查并自动修复
npm run lint -- --fix
```
## 代码规范
*1.所有接口写在api文件下请求
>示例如下
**get请求**
```
/* 所传参数如果需要二次修改可以在这里定义 params
如果不需要修改在request 直接扩展运算符也可以 */
export function getList(params) {
const data = {
'type': params.type,
'content_id': params.content_id,
'user': params.user,
'topic': params.topic,
'content': params.content,
'display': params.display,
'start_created_at': params.start_created_at,
'end_created_at': params.end_created_at,
'page': params.page,
'group_id': params.group_id,
'custom_score': params.custom_score,
'start_system_score': params.start_system_score,
'end_system_score': params.end_system_score,
'client_key': params.client_key || undefined
}
return request({
url: '/xxx/xxxx',
method: 'get',
params: data
})
}
```
**post请求**
```
/* 所传参数如果需要二次修改可以在这里定义 params
如果不需要修改在request 直接扩展运算符也可以 */
export function createContent(params) {
const data = {
'user_id': params.user_id,
'content': params.content,
'topics': JSON.stringify(params.topics),
'images': JSON.stringify(params.images) === '[]' ? undefined : JSON.stringify(params.images),
'video': JSON.stringify(params.video) === '{}' ? undefined : JSON.stringify(params.video),
'cover': params.cover ? params.cover : undefined,
'title': params.title ? params.title : undefined,
'type': params.type,
'product_id': params.product_id,
'source_id': params.source_id,
'group_ids': JSON.stringify(params.group_ids) === '[]' ? undefined : JSON.stringify(params.group_ids),
'custom_score': params.custom_score ? parseInt(params.custom_score) : undefined,
'system_score': params.system_score ? params.system_score : undefined
}
return request({
url: '/xxx/xxxx',
method: 'post',
data: data
})
}
```
> 接口调用时根据可以跟人习惯进行调用 但是必须在api文件下 进行接口调用方便进行管理 , 特殊的接口除外例如(导出表格,pdf ,word 等 )
* 2.公共组件放在components 中
* 3.views中存放可展示页面及二级页面, 可以根据个人习惯在views中建立的自己页面的文件夹下创建 components 文件夹 但是要确保可维护性
* 4.在utils文件中有validate.js 文件 里面添加自己的规则,根据需求而定
* 5.关于图标全部存放在icons => svg里
* 6.关于lang文件及router 文件使用说明
##### lang文件目录如下
> |-- lang
> | |-- en.js //english 英文环境
> | |-- index.js //配置文件
> | |-- zh.js //zh-ch chinese 中文环境
当然如果有其他需求可以在加语言环境 什么日文 , 俄文 , 韩文等等 (反正我是不会那么多语言哇 !!! 脑壳疼)
既然是多语言环境那么 zh.js 和en.js 配置需要同步 也就是写的时候加上就好了 对应好
>下面以zh.js (中文环境举例 以下皆是)
> 我们在zh.js有个键名叫 route 他的作用如其名 , 当我们每添加一个路由时需要在这里加一个对应的value
> 例如 :
我在views下面添加一个测试页面 命名为testNow 那么我的route的写法就是这样滴 :
```
{
path: '',
component: Layout,
redirect: '',
children: [
{
path: 'testNow',
component: () => import('@/views/testNow/index'),
name: 'testNow',
meta: { title: 'testNow', icon: 'dashboard', noCache: true }
}
]
}
```
再看下我们的zh.js 是如何配置的 :
```
route: {
dashboard: '首页',
testNow: '测试',
errorPages: '错误页面',
page401: '401',
page404: '404'
},
```
在route中设置侧边栏的名字
还有一种情况: 如果后端给我们返回的字段是动态的
例如:在多个json数据中每个一个对象中都有一个sex 但是sex字段可能是 female 也可能是 man 这种情况下 我们也不要 傻呵呵的一个个的去做判断啦 , 直接在zh.js 中定义个对象 在页面中用 $t('key.key') 方法引用就可以了
因为是后台管理系统 在这里我引入了 elementUI 这个神器 , 但是如果你的页面中有一部分样式与设计稿不一致提供以下两种hack:
1. 与产品 或者 UI 探讨下
2. 如果探讨失败建议用以下的解决方案
* 不要在全局修改 (重要 )
* 在本页面修改时 看看 你的 style 是不是私有的 如果是私有的没有问题 直接 /deep/ 修改就可以了
* 如果不是私有的 那就改成私有的吧 ...........
* 7. 关于页面布局及写法
> 布局篇
如果你的页面没有搜索框等内容时 第一层的div 包裹 类名 设定为 app-container
举例如下 :
```
```
如果你的页面存在搜素导航时 第一层的div 包裹类名不变 搜索框所包裹的div 类名为 filter-container
举例如下 :
```
```
关于loading 的使用 哪块有动态数据就加在哪就可以了
> 注意 : 如果使用全局切换大小的时候 那么在进行开发时所有的元素的 size 属性就都不要加啦 。。。。