# community **Repository Path**: hijs/community ## Basic Information - **Project Name**: community - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2019-04-10 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 钱香社区 **启动流程** - 1 npm install 安装依赖 - 2 npm run serve 运行 - 3 npm run build 打包 **技术栈** vuecli3 版本3.0.1 vue-router 版本3.0.1 vuex 版本3.0.1 axios 版本0.18.0 **适配:** 安卓4.4以上 + ios 9及以上 **目录:** ``` +-- node_modules 依赖库目录 +-- dist 打包文件目录 +-- public 公共资源目录 | +-- favicon.ico fav图标 | +-- index.html 入口html文件 +-- src 业务代码目录 | +-- assets 资源目录 | +-- components vue组件目录 | +-- views vue文件目录 | +-- router 路由目路 | +-- store vuex 目錄 | +-- App.vue | +-- main.js +-- test 测试代码目录 | +-- e2e e2e测试目录 | +-- unit 单元测试目录 +-- .browserslistrc 浏览器兼容性适配配置文件 +-- .env.development vue 开发环境配置文件 +-- .env.production vue 生产环境配置文件 +-- .eslintrc.js eslint配置文件 +-- .gitignore git .gitignore文件 +-- babel.config.js babel配置文件 +-- cypress.json e2e测试cypress框架配置文件 +-- package.json 项目package文件 +-- package-lock.json 项目package-lock文件 +-- postcss.config.js postcss配置文件 +-- README.md readme文件 +-- vue.config.js vuecli配置文件 ``` ### 配置相关 开发调试 vue.config.js - 跨域调接口配置:proxy: 'http://localhost:8988' - 执行 npm run serve 打包配置 vue.config.js - 执行 npm run build - baseUrl: '/community', 配置文件根目录 - 打包后生成目录:dist ### 与ios Android 相互调用相关函数 ```javascript // app主动调用,执行 QX_AppCallback.back_getQxToken('传token字符串'), js就可以获取token // window.QX_AppCallback = { // 传token back_getQxToken: function (res) { localStorage.setItem('token', res); console.log(res); document.getElementById("aa").innerHTML = 'token=' + res; }, // 传app信息 back_getQxAppInfo: function (res) { // localStorage.setItem('appinfo', res); console.log(res); document.getElementById("bb").innerHTML = 'appinfo=' + res; let appInfo = {}; if (res) { appInfo = JSON.parse(res); localStorage.setItem('appInfo', appInfo); } } } // js 主动调用 app方法 QxAppJump('login');// 登录 QxAppJump('home');// 主页 QxAppShowSharePanel()// 分享 等等 ``` ### vue文件 export default {}方法放置顺序 ``` name components props data created mounted activited update beforeRouteEnter beforeRouteUpdate methods filter 數據格式化 computed //计算属性 watch // 監控值的變化 export default { name: 'HomeHot', components: { CardList, [Swipe.name]: Swipe, [SwipeItem.name]: SwipeItem }, props: ['PropsOne', 'PropsTwo'], data () { return { id: '', name: '', count: 0, activeName: 'first', cardArr: [], topicObj: '' }; }, created () { this.setData(); }, mounted () { setData () { // ... } } beforeRouteEnter (to, from, next) { next(gui => { gui.setData() }); }, methods: { setData () { // ... } }, } 等等。。。 ``` ### vue 代码风格指南 > [vue 代码风格指南https://cn.vuejs.org/v2/style-guide/](https://cn.vuejs.org/v2/style-guide/) ### vue项目文件命名介绍 - css 文件名暂定
- image 小图(icon)名字:icon-xxx-xxx, 放入src/assets/images/icon文件夹
image 非小图分类存放:home文件夹,my文件夹,主要是为了查找方便,以及编辑器点开文件夹时,不会展开很长
- js router类文件名单词大写开头 (PascalCase):HomeRouter.js,后面加上Router 这么做为了一看就能识别这个js文件的用途
js api接口类文件单词大写开头 (PascalCase):HomeService.js,后面加Service,便于识别,分模块组合
- vue components文件(PascalCase):公用组件文件名后面加 Component.vue ,便于识别,区别于其他一般的视图页面组件,
vue 一般视图文件(PascalCase):至少两个单词,便于在编辑器里识别, - import HomeHotService from './HomeHotService'; import 后面 一般以大写开头 (PascalCase) - ```javascript export default{ name: 'HomeHot',//name:''(PascalCase) data () { // }, created () { //针对这类vue方法名括号前后加空格 } } ``` - js 文件中,export 的接口里的代码不要包含 this,会导致指向undefined ### webstorm对vue文件格式化设置 File->Settings->Editor->Code Style->Javascript->Spaces->
Before Parentheses->Function declaration parentheses 打勾 ```javascript export default{ data () { }, created () { //针对这类vue方法名括号前后加空格 } } ``` Before Parentheses->Function callparentheses 不打勾
等等 z-index 层级要集中备注, 最大值不要超过2000,防止页面层级高于vant提示框, vant组件的弹层值为2000 vant-Toast 提示框 2000 - 上下导航栏: 900-1000 评论输入框 900-1000 回复列表 router router.history.base + to.path http router.history.base + router.history.current.path; ### 移动端调试工具 ```html 方法一 方法二: ``` - 如何返回不刷新 ```javascript // 例子 //在HomeRouter.js中,定义keepAlive为true表示这个路由返回不刷新,isUseCache为false代表不缓存数据 { path: 'dynamic', name: 'dynamic', component: () => import('../views/home/DynamicList'), meta: { keepAlive: true, isUseCache: false } } // 在App.vue, v-if="$route.meta.keepAlive" 如果路由中keepAlive:true,那么就使用 // DynamicList.vue methods: { activated () { this.getDynamicTopThree(); // isUseCache为false时才重新刷新获取数据 // 因为对list使用keep-alive来缓存组件,所以默认是会使用缓存数据的 if (!this.$route.meta.isUseCache) { this.dynamicList = []; this.loading = true; this.changeRecommendList('refresh'); } this.$route.meta.isUseCache = false; }, beforeRouteLeave (to, from, next) { // 只有点击进入详情页,返回列表页才不会刷新,若进入其它页面,返回会刷新 if (to.name === 'detail') { from.meta.isUseCache = true; } next(); } } // 如果像进入详情页,然后要删除这个数据,返回的时候这个数不存在了,不需要显示了,怎么办?那点进去的时候,肯定知道是数组中的第几个,那么返回到页面的时候删除了呗 ``` - 如果我们在官网中,有好几个像社区这样的独立项目,而要共用账户信息怎么办? ```javascript // 在BootRouter.js 中,不同的项目的base值不一样,base: '/community',base: '/community2' ``` - 假如社区里面有一个不存在的地址怎么办? ```javascript // 在BootRouter.js 中,redirect的值就是地址不存在时,你希望跳转到的页面 { path: '*', redirect: '/' } ``` - 目前定义了哪些公用的板块? ```javascript // 说实话,目前项目未成熟,大约能剥离出去的只有 src/common 文件夹中的js文件了,而且尚未成长成大树 ``` - 数据是如何请求的 ```javascript // 我们以倒推的思维来理一下,以HomeHot.vue 为例, // 第1步:HomeHot.vue 只管字段传参(this.cardPageNum),不管其它事项 getHomeCardList (refresh) { this.cardPageNum++; this.$http.HomeHotService.getCardList(this.cardPageNum) .then(res=>{ // 这里只会接收到 code:'000000'的情况,其余code值都会在 catch()方法中,原因在后面继续推导。 // 这样的好处是1:错误可以集中处理 // 2:这样写的话,而不是直接在页面中调用ajax,像 jQuery中, // 如果这样的话,我们每次都要在 ajax方法外面定义一个类似 var self = this; ,在 success方法中 self.isLoading = res.isLoading; // 而可以直接使用 this.isLoading = res.isLoading; // }) .then(res=>{ //在 ECMA2015 的Promise 这个东西,这样子显得更好看 }) .catch(res=>{ }) } // jquery 请求 var self = this; $.ajax({ url:'', type:'get', success:function(res){ self.isLoading = res.isLoading; } }) // 第2步:HomeHotService.js 中,只管接受参数,和定义请求方式(get 或 post) // 首页热门推荐 getCardList (pageNum, ...pageSize) { // let pSize = pageSize[0]; let data = { page: pageNum }; return instanceAxios.get(base.homeHot.getCardList, data) .then(res => { // console.log(res); return res; }) .catch(err => { return Promise.reject(err); }); } // 第3步:HomeHotService.js 中,只管接受参数,接口和请求方式(get 或 post),base.homeHot.getCardList就是管理接口的(在BaseService.js) // 首页热门推荐 getCardList (pageNum, ...pageSize) { // let pSize = pageSize[0]; let data = { page: pageNum }; return instanceAxios.get(base.homeHot.getCardList, data) .then(res => { // console.log(res); return res; }) .catch(err => { return Promise.reject(err); }); } // 第4步:HttpService.js 中,使用 axios 插件来处理 ajax请求 // 1定义get和post请求, // 2将参数进行处理, // 3响应请求统一处理(000003 是未登录等等) // 4 设置 Content-type方式 // 创建axios实例 let instance = axios.create({ // baseURL: 'http://levi.mobile.qianxiangbank.com', // baseURL: 'http://levi.wap.qianxiangbank.com', // timeout: 2500, // headers: { // 'Content-type': 'application/x-www-form-urlencoded' // } }); let instanceAxios = { get (url, params) { return instance.get(url, { params: params }); }, post (url, params) { return instance.post(url, Qs.stringify(params)); } }; ``` - 当查看帖子详情中,点击跳转一个评论的评论列表页,看到一个有意思的评论,我可以分享这个评论页给朋友吗? - 答:可以的,每个页面都是一个地址,即使是一个评论中的回复页,我们都要尽可能的做成一个地址,以备将来做成一个可分享的地址。 - 威慑么发表评论不可以插入表情? - 答:这个功能后续再拓展。点击评论是跳转了一个页面,后续可拓展,发表图片等等。 - 威慑么发表评论跳转了一个页面,而不是直接在当前页面评论 - 答:因为把输入框放在底部,在ios中兼容性不是很好,如果有好的方法,欢迎贴代码就是上。