From b9e3633331692b516012ced0bc4b33b6bc328281 Mon Sep 17 00:00:00 2001
From: kenken-xr <1071502670@qq.com>
Date: Sun, 23 Jan 2022 14:19:32 +0800
Subject: [PATCH] vue2
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
1.添加用户登录注册退出时的提示 弹出Toast提示1秒后跳转
2.增加列表下拉刷新
3.新建vue2不打包 方便本地调试 更新版本和结构
4.在远程服务器获取不到数据时使用mock进行数据模拟
---
codes/news_recsys/news_rec_web/README.md | 105 ++++++++++++++++++
.../Vue-newsinfo/package-lock.json | 40 +++++--
.../news_rec_web/Vue-newsinfo/package.json | 5 +-
.../Vue-newsinfo/src/components/hotLists.vue | 67 ++++++-----
.../Vue-newsinfo/src/components/recLists.vue | 57 ++++++----
.../Vue-newsinfo/src/components/signIn.vue | 22 +++-
.../news_rec_web/Vue-newsinfo/src/main.js | 5 +-
.../news_rec_web/Vue-newsinfo/src/store.js | 9 ++
8 files changed, 247 insertions(+), 63 deletions(-)
create mode 100644 codes/news_recsys/news_rec_web/README.md
diff --git a/codes/news_recsys/news_rec_web/README.md b/codes/news_recsys/news_rec_web/README.md
new file mode 100644
index 00000000..b78fff98
--- /dev/null
+++ b/codes/news_recsys/news_rec_web/README.md
@@ -0,0 +1,105 @@
+### 新闻推荐系统
+
+ + 基于vue的框架Vant UI的基本使用。
+
+ + 基于nodejs的npm包管理工具、打包工具webpack和与之相对应的插件。
+
+ + vue路由的相关知识,路由的配置和渲染以及路由守卫的使用。
+
+ + vue-axios的使用,项目里调用接口都是用的这个异步ajax插件。
+
+ + 全局组件的使用。
+
+---
+
+### 项目地址
+
+#### vue2(自动打包 方便运行在远程服务器)
+
+**源代码:**
+[GitHub](https://github.com/datawhalechina/fun-rec/tree/master/codes/news_recsys/news_rec_web/Vue-newsinfo)
+
+**演示链接:**
+http://47.108.56.188:8686/#/
+
+- 测试用户名: `11` 测试密码: `111111`
+
+
+
+#### vue2(不打包 方便本地调试)
+
+**源代码:**
+[GitHub](https://github.com/datawhalechina/fun-rec/tree/master/codes/news_recsys/news_rec_web/vue2-fun-rec) [Gitee](https://gitee.com/theNeverLemon/vue-fun-rec)
+
+**演示链接:**
+http://theneverlemon.gitee.io/vue2-fun-rec-project/#/
+
+- 测试用户名: `11` 测试密码: `111111` (连接远程服务器,具有推荐功能,优先使用这个)
+- 测试用户名: `user` 测试密码: `pass` (mock数据模拟,远程服务器获取不到数据时使用,没有推荐功能)
+
+---
+
+
+### 目标功能
+- [X] **用户登录** —— 老用户登录
+
+- `记住我`可以保存将登录信息保存7天
+
+- `忘记密码` 暂时没有写逻辑不能使用
+
+
+
+

+
+
+
+- [X] **用户注册** —— 新用户注册信息
+
+- 用户名可以为英文和数字
+
+- 密码是大于6位的英文和数字
+
+- 年龄是1-100的整数
+
+- 注册成功后将跳转至主页面
+
+
+

+
+
+
+- [X] **推荐页及热门页内容显示** —— 根据不同用户个性化显示不同新闻内容
+
+- 推荐页和热门页之间的切换(首次切换时会刷新,正在修复这个bug)
+
+- 点进新闻详情页后阅读次数会实时增加
+
+
+

+

+
+
+
+- [x] **新闻详情** —— 显示当前新闻的详细信息
+
+- 显示标题、内容等信息
+
+- 底部点击`喜欢`或者`收藏`可以记录将当前用户行为,并在列表页相应增加
+
+
+

+

+
+
+- [X] **个人中心** —— 记录用户的头像和用户名
+
+- 显示头像和登录名(头像暂时统一为DataWhle图标)
+
+- 显示DataWhale相关介绍
+
+- 点击`退出登录`回到登录页
+
+
+

+

+
\ No newline at end of file
diff --git a/codes/news_recsys/news_rec_web/Vue-newsinfo/package-lock.json b/codes/news_recsys/news_rec_web/Vue-newsinfo/package-lock.json
index d67b0c59..592aeb2c 100644
--- a/codes/news_recsys/news_rec_web/Vue-newsinfo/package-lock.json
+++ b/codes/news_recsys/news_rec_web/Vue-newsinfo/package-lock.json
@@ -10,12 +10,13 @@
"license": "ISC",
"dependencies": {
"@vant/area-data": "^1.1.3",
- "axios": "^0.19.0",
+ "axios": "^0.19.2",
"bootstrap": "^3.4.1",
"crypto-js": "^4.1.1",
"into": "^0.2.0",
"js-pinyin": "^0.1.9",
"less-loader": "^10.2.0",
+ "mockjs": "^1.1.0",
"moment": "^2.24.0",
"vant": "^2.12.34",
"vue": "^2.6.10",
@@ -41,7 +42,7 @@
"style-loader": "^0.23.1",
"url-loader": "^2.1.0",
"vue-loader": "^15.7.1",
- "vue-template-compiler": "^2.6.10",
+ "vue-template-compiler": "^2.6.14",
"vuex": "^2.5.0",
"webpack-cli": "^3.3.6",
"webpack-dev-server": "^3.7.2",
@@ -620,8 +621,8 @@
},
"node_modules/axios": {
"version": "0.19.2",
- "resolved": "https://registry.npmmirror.com/axios/download/axios-0.19.2.tgz?cache=0&sync_timestamp=1633067760110&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Faxios%2Fdownload%2Faxios-0.19.2.tgz",
- "integrity": "sha1-PqNsXYgY0NX4qKl6bTa4bNwAyyc=",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz",
+ "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==",
"deprecated": "Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410",
"dependencies": {
"follow-redirects": "1.5.10"
@@ -5421,6 +5422,17 @@
"mkdirp": "bin/cmd.js"
}
},
+ "node_modules/mockjs": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mockjs/-/mockjs-1.1.0.tgz",
+ "integrity": "sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==",
+ "dependencies": {
+ "commander": "*"
+ },
+ "bin": {
+ "random": "bin/random"
+ }
+ },
"node_modules/moment": {
"version": "2.29.1",
"resolved": "https://registry.nlark.com/moment/download/moment-2.29.1.tgz",
@@ -8088,8 +8100,8 @@
},
"node_modules/vue-template-compiler": {
"version": "2.6.14",
- "resolved": "https://registry.nlark.com/vue-template-compiler/download/vue-template-compiler-2.6.14.tgz",
- "integrity": "sha1-ovDn2YVnDULJye4NBE/tdpD092M=",
+ "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz",
+ "integrity": "sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g==",
"dev": true,
"dependencies": {
"de-indent": "^1.0.2",
@@ -9488,8 +9500,8 @@
},
"axios": {
"version": "0.19.2",
- "resolved": "https://registry.npmmirror.com/axios/download/axios-0.19.2.tgz?cache=0&sync_timestamp=1633067760110&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Faxios%2Fdownload%2Faxios-0.19.2.tgz",
- "integrity": "sha1-PqNsXYgY0NX4qKl6bTa4bNwAyyc=",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz",
+ "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==",
"requires": {
"follow-redirects": "1.5.10"
}
@@ -13486,6 +13498,14 @@
"minimist": "^1.2.5"
}
},
+ "mockjs": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mockjs/-/mockjs-1.1.0.tgz",
+ "integrity": "sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==",
+ "requires": {
+ "commander": "*"
+ }
+ },
"moment": {
"version": "2.29.1",
"resolved": "https://registry.nlark.com/moment/download/moment-2.29.1.tgz",
@@ -15679,8 +15699,8 @@
},
"vue-template-compiler": {
"version": "2.6.14",
- "resolved": "https://registry.nlark.com/vue-template-compiler/download/vue-template-compiler-2.6.14.tgz",
- "integrity": "sha1-ovDn2YVnDULJye4NBE/tdpD092M=",
+ "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz",
+ "integrity": "sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g==",
"dev": true,
"requires": {
"de-indent": "^1.0.2",
diff --git a/codes/news_recsys/news_rec_web/Vue-newsinfo/package.json b/codes/news_recsys/news_rec_web/Vue-newsinfo/package.json
index e83123f4..3000b525 100644
--- a/codes/news_recsys/news_rec_web/Vue-newsinfo/package.json
+++ b/codes/news_recsys/news_rec_web/Vue-newsinfo/package.json
@@ -5,12 +5,13 @@
"main": "webpack.config.js",
"dependencies": {
"@vant/area-data": "^1.1.3",
- "axios": "^0.19.0",
+ "axios": "^0.19.2",
"bootstrap": "^3.4.1",
"crypto-js": "^4.1.1",
"into": "^0.2.0",
"js-pinyin": "^0.1.9",
"less-loader": "^10.2.0",
+ "mockjs": "^1.1.0",
"moment": "^2.24.0",
"vant": "^2.12.34",
"vue": "^2.6.10",
@@ -36,7 +37,7 @@
"style-loader": "^0.23.1",
"url-loader": "^2.1.0",
"vue-loader": "^15.7.1",
- "vue-template-compiler": "^2.6.10",
+ "vue-template-compiler": "^2.6.14",
"vuex": "^2.5.0",
"webpack-cli": "^3.3.6",
"webpack-dev-server": "^3.7.2",
diff --git a/codes/news_recsys/news_rec_web/Vue-newsinfo/src/components/hotLists.vue b/codes/news_recsys/news_rec_web/Vue-newsinfo/src/components/hotLists.vue
index d5de9fcf..55cede7b 100644
--- a/codes/news_recsys/news_rec_web/Vue-newsinfo/src/components/hotLists.vue
+++ b/codes/news_recsys/news_rec_web/Vue-newsinfo/src/components/hotLists.vue
@@ -13,7 +13,7 @@
推荐
-
+
-
-
-
-
-
-
-
-
- {{item.cate}}
- {{ item.title }}
-
-
- {{ item.ctime}}
- 阅读:{{item.read_num}}
- 喜欢:{{item.likes}}
- 收藏:{{item.collections}}
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+ {{item.cate}}
+ {{ item.title }}
+
+
+
+ {{ item.ctime}}
+ 阅读:{{item.read_num}}
+ 喜欢:{{item.likes}}
+ 收藏:{{item.collections}}
+
+
+
+
+
+
+
+
+
@@ -63,13 +68,25 @@
vanListLoading: false, // 加载状态
finished: false, // 是否加载
finishedText: '', // 加载完成后的提示文案
- scrollTop:0
+ scrollTop:0,
+
+ isLoading: false,
};
},
components: {
bottomBar
},
+ mounted () {
+ window.addEventListener("scroll", this.handleScroll, true);
+ },
methods: {
+ onRefresh() {
+ setTimeout(() => {
+ this.isLoading = false;
+ this.$store.commit('clearList', "hotList")
+ this.getList()
+ }, 1000);
+ },
getList() {
let url = '/recsys/hot_list?' + 'user_id=' + this.$store.state.user.username
this.axios.get(url).then(res => {
@@ -90,7 +107,7 @@
},
toHot() {
this.$router.push('/hotLists')
- }
+ },
},
// 当组件在 内被切换,activated 会被对应执行
diff --git a/codes/news_recsys/news_rec_web/Vue-newsinfo/src/components/recLists.vue b/codes/news_recsys/news_rec_web/Vue-newsinfo/src/components/recLists.vue
index 9ffcb136..ca38481f 100644
--- a/codes/news_recsys/news_rec_web/Vue-newsinfo/src/components/recLists.vue
+++ b/codes/news_recsys/news_rec_web/Vue-newsinfo/src/components/recLists.vue
@@ -24,30 +24,33 @@
-
-
-
-
-
-
-
-
- {{item.cate}}
- {{ item.title }}
-
-
-
- {{ item.ctime}}
- 阅读:{{item.read_num}}
- 喜欢:{{item.likes}}
- 收藏:{{item.collections}}
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+ {{item.cate}}
+ {{ item.title }}
+
+
+ {{ item.ctime}}
+ 阅读:{{item.read_num}}
+ 喜欢:{{item.likes}}
+ 收藏:{{item.collections}}
+
+
+
+
+
+
+
+
@@ -65,12 +68,20 @@
finished: false, // 是否加载
finishedText: '', // 加载完成后的提示文案
scrollTop:0,
+ isLoading: false,
};
},
components: {
bottomBar
},
methods: {
+ onRefresh() {
+ setTimeout(() => {
+ this.isLoading = false;
+ this.$store.commit('clearList', "hotList")
+ this.getList()
+ }, 1000);
+ },
getList() {
var url;
if(this.$store.state.type == 'signIn'){
diff --git a/codes/news_recsys/news_rec_web/Vue-newsinfo/src/components/signIn.vue b/codes/news_recsys/news_rec_web/Vue-newsinfo/src/components/signIn.vue
index 9672943a..b7d21582 100644
--- a/codes/news_recsys/news_rec_web/Vue-newsinfo/src/components/signIn.vue
+++ b/codes/news_recsys/news_rec_web/Vue-newsinfo/src/components/signIn.vue
@@ -52,6 +52,8 @@
this.axios.post(url, res).then(resource => {
if (resource.data.code === 200) {
+ console.log('success');
+
let loginInfo = {
LoginName: res.username,
openId: "asfafsfsfsdfsdfsdfdsf"
@@ -67,8 +69,24 @@
this.$store.state.type = 'signIn'
this.$store.state.user.username = res.username
- this.$router.push({name:'recLists' ,params:{type:'signIn',username:this.model.username}})
-
+
+ const toast = Toast({
+ message: '登陆成功',
+ icon:'success'
+ });
+
+ let second = 1;
+ // 延迟一秒执行
+ const timer = setInterval(() => {
+ second--;
+ if (!second) {
+ clearInterval(timer);
+ // 手动清除 Toast
+ Toast.clear();
+ this.$router.push({name:'recLists' ,params:{type:'signIn',username:this.model.username}})
+ }
+ }, 1000);
+
}if(resource.data.code === 500){
Toast('登陆失败')
}if(resource.data.code === 501){
diff --git a/codes/news_recsys/news_rec_web/Vue-newsinfo/src/main.js b/codes/news_recsys/news_rec_web/Vue-newsinfo/src/main.js
index 2d18231e..2c384e22 100644
--- a/codes/news_recsys/news_rec_web/Vue-newsinfo/src/main.js
+++ b/codes/news_recsys/news_rec_web/Vue-newsinfo/src/main.js
@@ -15,6 +15,7 @@ import store from './store';
import axios from 'axios'
import VueAxios from 'vue-axios'
Vue.use(VueAxios, axios);
+
// axios公共基路径,以后所有的请求都会在前面加上这个路径
axios.defaults.baseURL = "http://47.108.56.188:3000";
// 设置表单提交方式,默认是 json
@@ -59,6 +60,7 @@ Vue.use(List);
import { Cell } from 'vant'
Vue.use(Cell)
import { PullRefresh } from 'vant'
+import 'vant/lib/pull-refresh/style';
Vue.use(PullRefresh)
import { Tabbar, TabbarItem } from 'vant';
import 'vant/lib/tabbar/style'
@@ -71,7 +73,8 @@ Vue.use(NavBar);
import { Button } from 'vant';
import 'vant/lib/button/style'
Vue.use(Button);
-import 'vant/lib/toast/style'
+import 'vant/lib/toast/style';
+
Vue.config.devtools = false; //生产环境中需要设置为false
diff --git a/codes/news_recsys/news_rec_web/Vue-newsinfo/src/store.js b/codes/news_recsys/news_rec_web/Vue-newsinfo/src/store.js
index 466687fc..cf929acf 100644
--- a/codes/news_recsys/news_rec_web/Vue-newsinfo/src/store.js
+++ b/codes/news_recsys/news_rec_web/Vue-newsinfo/src/store.js
@@ -15,6 +15,15 @@ export default new Vuex.Store({
hotList: [], //热门页的新闻列表
},
mutations: {
+ // 清空列表 在刷新时调用 重新给列表赋值
+ clearList(state, payload){
+ if(payload == "recList"){
+ state.recList = []
+ }else if(payload == "hotList"){
+ state.hotList = []
+ }
+ },
+
//点进新闻详情页时触发,让阅读次数增加
numChange(state, payload) {
let reg = /NewsInfo\//