# vue-cms
**Repository Path**: MonsterLQ/vue-cms
## Basic Information
- **Project Name**: vue-cms
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-06-09
- **Last Updated**: 2021-01-11
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
#vue项目
## 路由规则
| 路由 | 路由地址 |
| ------------------- | -------------- |
| / | 需重定向到首页 |
| /home | 首页 |
| /home/newslist | 新闻列表页 |
| /home/newslist/:id | 新闻详情页 |
| /member | 会员页 |
| /search | 搜索页 |
| /shopcar | 购物车 |
| /home/photolist | 图片列表页 |
| /home/photoInfo/:id | 图片列表详情页 |
| /home/goodsList | 商品列表 |
| /home/goodsInfo | 商品详情 |
| /home/goodsDes/:id | 商品图文 |
| /home/goodsCmt/:id | 商品评论 |
##接口文档
> 数据是利用json-server模拟出的数据,数据文件保存在根目录db文件夹中的db.json中
>
> 同时这个文件夹中还保存了一些请求的资源文件
>
> 运行数据 json-server db.json --port 3005
>
> 配置根域名
>
> ```javascript
> Vue.http.options.root = 'http://localhost:3005';
> ```
>
> **注意:在请求地址路径前面不要加/**
### 获取轮播图数据
> 图片数据均来自网络图片
| 请求地址 | 请求方式 | 返回结果 |
| -------- | -------- | ----------------- |
| lunbotu | get | 数组对象([obj]) |
> 制作轮播图过程
1. 利用vue-resource获取数据
2. this.$http.get获取数据
- 在methods中定义方法去获取数据,并保存在data中
- 在created生命周期中调用这个方法
3. 把获取到的数据保存在data中
4. 利用v-for循环每个item项
- 必须为每一个item项绑定key,由于图片的url地址不会重复,所以可以绑定url地址
### 获取新闻列表数据
| 请求地址 | 请求方式 | 返回结果 |
| ----------- | -------- | -------- |
| getnewsList | get | 数组对象 |
### 获取新闻详情
| 请求地址 | 请求方式 | 请求参数 | 返回结果 |
| --------------- | -------- | ---------- | -------- |
| getnewsList/:id | get | id(number) | 数组对象 |
### 获取新闻详情评论数据
| 请求地址 | 请求方式 | 请求参数 | 返回结果 |
| ------------ | -------- | ---------- | -------- |
| comments/:id | get | id(number) | 对象 |
### 发表评论
> 所有页面的发表评论接口一致
| 请求地址 | 请求方式 | 参数 | 返回结果 |
| ------------ | ----------- | ---- | -------- |
| comments/:id | put(需加id) | text | 无 |
### 获取图片分类
| 请求地址 | 请求方式 | 返回结果 |
| ----------- | -------- | -------- |
| picCategory | get | 数组对象 |
### 获取图片列表
| 请求地址 | 请求方式 | 参数 | 返回结果 |
| ----------- | -------- | ---- | -------- |
| picList/:id | get | id | 数组对象 |
### 获取图片详情数据
| 请求地址 | 请求方式 | 参数 | 返回结果 |
| ------------- | -------- | ---- | -------- |
| photoInfo/:id | get | id | 对象 |
### 获取商品列表
| 请求地址 | 请求方式 | 返回结果 |
| ------------------------------------ | -------- | -------- |
| goodsList?\_limit=5&\_page=1(分页) | get | 数组对象 |
### 获取商品详情
| 请求地址 | 请求方式 | 返回结果 |
| ------------- | -------- | -------- |
| goodsInfo/:id | get | 对象 |
## 问题解决
### 图片列表滑动菜单栏
> 滑动菜单栏是由mui制作,其中要注意的问题
1. 位置不准
- 去掉 `mui-fullscreen `这个类
2. 滑动需要初始化
- 引入mui.min.js文件
- 初始化代码
```javascript
mui(".mui-scroll-wrapper").scroll({
deceleration: 0.0005 //flick 减速系数,系数越大,滚动速度越慢,滚动距离越小,默认值0.0006
});
```
- **注意:**预览结果报错
```javascript
'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
```
> 错误信息的意思是 'caller', 'callee', and 'arguments'是不严格模式,但是webpack在打包的时候默认启用严格模式
- 解决方案:移除webpack的严格模式
> 使用插件*babel-plugin-transform-remove-strict-mode*
>
> 在babelrc文件中的plugins中配置一下即可
3. 问题:在进入这个页面的时候这个滚动条不起作用,刷新一下才起作用,这样肯定不合理
- 解决方案:如果想要滑动条生效,需要DOM元素加载完成,所以就把初始化代码放入`mounted`生命周期函数中
4. tabbar无法切换
- 解决方案:由于tabbar中的链接样式`mui-tab-item`与引入的js冲突,所以修改类名把以前的样式复制到新类名中,然后使用这个的类名就可解决
### 图片列表详情页的缩略图制作
> 这里的缩略图制作利用了vue-photo-preview插件,使用过程如下:
1. 下载插件并且安装
```javascript
import preview from 'vue-photo-preview'
import 'vue-photo-preview/dist/skin.css'
Vue.use(preview)
```
2. 使用
> 在想要展示的图片上设置preview属性,属性值一样的是一组图片
```html
```
3. 注意点:
> 如果图片是异步加载的数据,这时点击图片是不会有预览的效果,这是因为页面还没加载完成所以事件就不会触发,解决办法,在mounted生命周期函数中重新调用一次`this.$previewRefresh();`
### 商品列表vue-router编程式导航
```javascript
this.$router.push(路由地址)
```
> $route:这个是路由参数对象,跟url地址相关的都使用这个方法
>
> $router:这个是路由导航对象,它可以方便的实现路由的前进,后退,和路由之间的跳转
### 页面轮播图的宽度问题
> 应该让图片高为百分百,宽自适应
>
> 解决方案:添加一个类名full设置宽度为100%,然后人为决定是否要加这个类
>
> 由于轮播图被抽离成一个组件,那么使用组件的时候就可以父组件给子组件传值,来决定是否要加这个类
```html
父组件:
//swiper这个就是封装的轮播图组件,true就是要宽为百分百
子组件
.full{width:100%} //设置一个宽百分百
props:['isfull'] //接收数据
:class={'full':isfull} //根据传过来的值决定是否添加类
```
### 购物数量制作
1. 子组件向父组件传值(数量)
- 数量加减是被抽离出来的子组件,所以在数量改变的时候就应该把数量传给父组件(商品详情页)
> 父组件中定义方法同时保留数据
```javascript
@getCount="count"; //在父组件中引用子组件身上添加自定义属性
totalcount=1; //定义数据初始状态下有一件商品
count(num) {
this.totalCount = num;
console.log("接收到数据了");
} //添事件处理函数,用来保存数据
```
> 子组件触发事件并且传值
>
> this.$refs.numbox.value可以拿到输入框中的数量
```javascript
@change="postnum" //标签中添加事件,数量发生改变执行函数
postnum() {
this.$emit("getCount", parseInt(this.$refs.numbox.value));
} //触发引用组件身上的自定义函数,并且把数据传递过去,
```
2. 给数量输入框限制最大数量
> 数量输入框(子组件)的最大值限制是有库存的数量来决定的,而库存数量的值则来自商品详情页,这里就涉及到父向子传值
> 父组件自定义属性传值
```html
:max="goodsInfo.lave"
```
> 子组件接受值
````javascript
props:['max']
````
> 数字输入框用的是mui,标签中有个属性` data-numbox-max `可以限制最大值
>
> 这里有一个坑:子组件中利用props接收的max值是父组件异步获取数据得来的,所以在页面加载的时候就把max传递过去了,这个时候是没有数据的,打印信息可以发现是undefined
> 解决办法:既然数据是异步获取的,那么数据最终都是会发送过来的,那么我就可以监听这个数据,这个时候就不能使用mui提供属性来限制,而是需要使用元素js方法
```javascript
watch:{
max:function(newVal,oldVal){
mui(".mui-numbox")
.numbox()
.setOption("max", newVal);
}
}
```
> 这里就可以监听max数据,而newVal就是最新的最大值,所以最初发过来的是undefined,到最后异步请求数据完成后发过来的是最大值,已经监听到max的变化,然后就使用mui提供的js方法设置最大值