Skip to content

Commit d9e1f76

Browse files
author
15826954460
committed
解决权限验证相关的bug
1 parent c2ddfc8 commit d9e1f76

File tree

8 files changed

+352
-4
lines changed

8 files changed

+352
-4
lines changed

components/changeCity/categroy.vue

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
<template>
2+
<div class>
3+
<dl class="m-categroy">
4+
<dt>按拼音首字母选择:</dt>
5+
<dd v-for="item in list" :key="item">
6+
<!-- 通过锚点进行跳转 -->
7+
<a :href="'#city-'+item">{{ item }}</a>
8+
</dd>
9+
</dl>
10+
<!-- 根据拼音划分的省市模块 -->
11+
<dl v-for="item in block" :key="item.title" class="m-categroy-section">
12+
<dt :id="'city-'+item.title">{{ item.title }}</dt>
13+
<dd>
14+
<span v-for="c in item.city" :key="c">{{ c }}</span>
15+
</dd>
16+
</dl>
17+
</div>
18+
</template>
19+
20+
<script>
21+
import pyjs from "js-pinyin"; // 拼音的检索插件
22+
const axios = require("../../server/interface/utils/axios");
23+
export default {
24+
data() {
25+
return {
26+
list: "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""),
27+
block: []
28+
};
29+
},
30+
async mounted() {
31+
let self = this;
32+
let blocks = [];
33+
let {
34+
status,
35+
data: { city }
36+
} = await axios.get("/geo/city");
37+
if (status === 200) {
38+
let p; // 首字母
39+
let c; // 字母编码
40+
let d = {}; // 字母对应的所有的城市
41+
city.forEach(item => {
42+
// 使用第三方插件,获取首字母
43+
p = pyjs
44+
.getFullChars(item.name) // 将中文变成全拼音
45+
.toLocaleLowerCase()
46+
.slice(0, 1);
47+
c = p.charCodeAt(0); // 获取字母的code值
48+
//
49+
if (c > 96 && c < 123) {
50+
if (!d[p]) {
51+
d[p] = [];
52+
}
53+
d[p].push(item.name);
54+
}
55+
});
56+
for (let [k, v] of Object.entries(d)) {
57+
blocks.push({
58+
title: k.toUpperCase(),
59+
city: v
60+
});
61+
}
62+
// 排序
63+
blocks.sort((a, b) => a.title.charCodeAt(0) - b.title.charCodeAt(0));
64+
self.block = blocks;
65+
}
66+
}
67+
};
68+
</script>
69+
70+
<style lang="scss">
71+
@import "@/assets/css/changeCity/categroy.scss";
72+
</style>

components/changeCity/hot.vue

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<template>
2+
<div class="m-hcity">
3+
<dl>
4+
<dt>热门城市:</dt>
5+
<dd v-for="item in list" :key="item.id">{{ item.name==='市辖区'?item.province:item.name }}</dd>
6+
</dl>
7+
</div>
8+
</template>
9+
10+
<script>
11+
const axios = require("../../server/interface/utils/axios");
12+
export default {
13+
data() {
14+
return {
15+
list: []
16+
};
17+
},
18+
async mounted() {
19+
let {
20+
status,
21+
data: { hots }
22+
} = await axios.get("/geo/hotCity");
23+
if (status === 200) {
24+
this.list = hots;
25+
}
26+
}
27+
};
28+
</script>
29+
30+
<style lang="scss">
31+
@import "@/assets/css/changeCity/hot.scss";
32+
</style>

components/changeCity/iselect.vue

+108
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
<template>
2+
<div class="m-iselect">
3+
<span class="name">按省份选择:</span>
4+
<el-select v-model="pvalue" placeholder="省份">
5+
<el-option
6+
v-for="item in province"
7+
:key="item.value"
8+
:label="item.label"
9+
:value="item.value"
10+
/>
11+
</el-select>
12+
<el-select v-model="cvalue" :disabled="!city.length" placeholder="城市">
13+
<el-option v-for="item in city" :key="item.value" :label="item.label" :value="item.value"/>
14+
</el-select>
15+
<el-autocomplete
16+
v-model="input"
17+
:fetch-suggestions="querySearchAsync"
18+
placeholder="请输入城市中文或拼音"
19+
@select="handleSelect"
20+
/>
21+
</div>
22+
</template>
23+
24+
<script>
25+
import _ from "lodash";
26+
const axios = require("../../server/interface/utils/axios");
27+
import { createNamespacedHelpers } from "vuex";
28+
const { mapState, mapActions } = createNamespacedHelpers("geo");
29+
export default {
30+
data() {
31+
return {
32+
province: [],
33+
pvalue: "",
34+
city: [],
35+
cvalue: "",
36+
input: "",
37+
cities: []
38+
};
39+
},
40+
watch: {
41+
pvalue: async function(newPvalue) {
42+
let self = this;
43+
let {
44+
status,
45+
data: { city }
46+
} = await axios.get(`/geo/province/${newPvalue}`);
47+
if (status === 200) {
48+
self.city = city.map(item => {
49+
return {
50+
value: item.id,
51+
label: item.name
52+
};
53+
});
54+
self.cvalue = "";
55+
}
56+
}
57+
},
58+
// 初始化获取所有的省份
59+
mounted: async function() {
60+
let self = this;
61+
let {
62+
status,
63+
data: { province }
64+
} = await axios.get("/geo/province");
65+
if (status === 200) {
66+
self.province = province.map(item => {
67+
return {
68+
value: item.id,
69+
label: item.name
70+
};
71+
});
72+
}
73+
},
74+
methods: {
75+
...mapActions(["setPosition"]),
76+
querySearchAsync: _.debounce(async function(query, cb) {
77+
let self = this;
78+
if (self.cities.length) {
79+
cb(self.cities.filter(item => item.value.indexOf(query) > -1));
80+
} else {
81+
let {
82+
status,
83+
data: { city }
84+
} = await axios.get("/geo/city");
85+
if (status === 200) {
86+
self.cities = city.map(item => {
87+
return {
88+
value: item.name
89+
};
90+
});
91+
cb(self.cities.filter(item => item.value.indexOf(query) > -1));
92+
} else {
93+
cb([]);
94+
}
95+
}
96+
}, 200),
97+
handleSelect: function(item) {
98+
this.setPosition({ city: item.value });
99+
// 选中进行页面跳转
100+
window.location.href = "/";
101+
}
102+
}
103+
};
104+
</script>
105+
106+
<style lang="scss">
107+
@import "@/assets/css/changeCity/iselect.scss";
108+
</style>

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"cross-env": "^5.2.0",
1919
"crypto-js": "^3.1.9-1",
2020
"element-ui": "^2.4.11",
21+
"js-pinyin": "^0.1.9",
2122
"koa": "^2.6.2",
2223
"koa-bodyparser": "^4.2.1",
2324
"koa-generic-session": "^2.0.1",

pages/changeCity.vue

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<template>
2+
<div class="page-changeCity">
3+
<el-row>
4+
<el-col :span="24">
5+
<iSelect/>
6+
</el-col>
7+
</el-row>
8+
<el-row>
9+
<el-col :span="24">
10+
<hot/>
11+
</el-col>
12+
</el-row>
13+
<el-row>
14+
<el-col :span="24">
15+
<categroy/>
16+
</el-col>
17+
</el-row>
18+
</div>
19+
</template>
20+
21+
<script>
22+
import iSelect from '@/components/changeCity/iselect.vue'
23+
import Hot from '@/components/changeCity/hot.vue'
24+
import Categroy from '@/components/changeCity/categroy.vue'
25+
export default {
26+
layout: 'default',
27+
components:{
28+
iSelect,
29+
Hot,
30+
Categroy
31+
}
32+
}
33+
</script>
34+
35+
<style lang="css">
36+
</style>

server/interface/geo.js

+94-1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ router.get("/menu", async ctx => {
4646
}
4747
});
4848

49+
/** 获取所有身份 */
4950
router.get("/province", async ctx => {
5051
// 数据库中的部分数据
5152
// let province = await Province.find(); // 查询数据
@@ -69,6 +70,98 @@ router.get("/province", async ctx => {
6970
};
7071
});
7172

72-
router.get("/province/:id", async ctx => {});
73+
/** 获取省份 */
74+
router.get("/province/:id", async ctx => {
75+
// let city = await City.findOne({id: ctx.params.id})
76+
// ctx.body = {
77+
// code: 0,
78+
// city: city.value.map(item => {
79+
// return {province: item.province, id: item.id, name: item.name}
80+
// })
81+
// }
82+
let {
83+
status,
84+
data: { city }
85+
} = await axios.get(`http://cp-tools.cn/geo/province/${ctx.params.id}?sign=${sign}`);
86+
if (status === 200) {
87+
ctx.body = {
88+
city
89+
};
90+
} else {
91+
ctx.body = {
92+
city: []
93+
};
94+
}
95+
});
96+
97+
/** 获取身份下的城市 */
98+
router.get('/city', async (ctx) => {
99+
// let city = []
100+
// let result = await City.find()
101+
// result.forEach(item => {
102+
// city = city.concat(item.value)
103+
// })
104+
// ctx.body = {
105+
// code: 0,
106+
// city: city.map(item => {
107+
// return {
108+
// province: item.province,
109+
// id: item.id,
110+
// name: item.name === '市辖区' || item.name === '省直辖县级行政区划'
111+
// ? item.province
112+
// : item.name
113+
// }
114+
// })
115+
// }
116+
let {status, data: {
117+
city
118+
}} = await axios.get(`http://cp-tools.cn/geo/city?sign=${sign}`);
119+
if (status === 200) {
120+
ctx.body = {
121+
city
122+
}
123+
} else {
124+
ctx.body = {
125+
city: []
126+
}
127+
}
128+
})
129+
130+
/** 热门城市 */
131+
router.get('/hotCity', async (ctx) => {
132+
// let list = [
133+
// '北京市',
134+
// '上海市',
135+
// '广州市',
136+
// '深圳市',
137+
// '天津市',
138+
// '西安市',
139+
// '杭州市',
140+
// '南京市',
141+
// '武汉市',
142+
// '成都市'
143+
// ]
144+
// let result = await City.find()
145+
// let nList = []
146+
// result.forEach(item => {
147+
// nList = nList.concat(item.value.filter(k => list.includes(k.name) || list.includes(k.province)))
148+
// })
149+
// ctx.body = {
150+
// hots: nList
151+
// }
152+
let {status, data: {
153+
hots
154+
}} = await axios.get(`http://cp-tools.cn/geo/hotCity?sign=${sign}`);
155+
if (status === 200) {
156+
ctx.body = {
157+
hots
158+
}
159+
} else {
160+
ctx.body = {
161+
hots: []
162+
}
163+
}
164+
})
165+
73166

74167
module.exports = router;

server/interface/users.js

+5-3
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ router.post("/signin", async (ctx, next) => {
2929
msg: "登录成功",
3030
user
3131
};
32-
// return ctx.login(user); // 执行登录的动作
32+
// 执行登录操作后才会有 权限的验证
33+
return ctx.login(user); // 执行登录的动作
3334
} else {
3435
ctx.body = {
3536
code: 1, // 异常
@@ -195,14 +196,15 @@ router.get("/getUser", async ctx => {
195196
// 判断是否登录状态
196197
if (ctx.isAuthenticated()) {
197198
const { username, email } = ctx.session.passport.user;
199+
// console.log(11111122222, username, email);
198200
ctx.body = {
199201
username: username,
200-
email
202+
email,
201203
};
202204
} else {
203205
ctx.body = {
204206
username: "",
205-
email: ""
207+
email: "",
206208
};
207209
}
208210
});

0 commit comments

Comments
 (0)