forked from FoundKeyGang/FoundKey
✌️
This commit is contained in:
parent
c10c534d02
commit
ab8eefda25
4 changed files with 96 additions and 42 deletions
|
@ -16,40 +16,38 @@ module.exports = (params, me) => new Promise(async (res, rej) => {
|
||||||
const [limit = 10, limitErr] = $(params.limit).optional.number().range(1, 100).$;
|
const [limit = 10, limitErr] = $(params.limit).optional.number().range(1, 100).$;
|
||||||
if (limitErr) return rej('invalid limit param');
|
if (limitErr) return rej('invalid limit param');
|
||||||
|
|
||||||
// Get 'since_id' parameter
|
// Get 'offset' parameter
|
||||||
const [sinceId, sinceIdErr] = $(params.since_id).optional.id().$;
|
const [offset = 0, offsetErr] = $(params.offset).optional.number().min(0).$;
|
||||||
if (sinceIdErr) return rej('invalid since_id param');
|
if (offsetErr) return rej('invalid offset param');
|
||||||
|
|
||||||
// Get 'until_id' parameter
|
// Get 'sort' parameter
|
||||||
const [untilId, untilIdErr] = $(params.until_id).optional.id().$;
|
const [sort, sortError] = $(params.sort).optional.string().or('+follower|-follower').$;
|
||||||
if (untilIdErr) return rej('invalid until_id param');
|
if (sortError) return rej('invalid sort param');
|
||||||
|
|
||||||
// Check if both of since_id and until_id is specified
|
|
||||||
if (sinceId && untilId) {
|
|
||||||
return rej('cannot set since_id and until_id');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Construct query
|
// Construct query
|
||||||
const sort = {
|
let _sort;
|
||||||
|
if (sort) {
|
||||||
|
if (sort == '+follower') {
|
||||||
|
_sort = {
|
||||||
|
followers_count: 1
|
||||||
|
};
|
||||||
|
} else if (sort == '-follower') {
|
||||||
|
_sort = {
|
||||||
|
followers_count: -1
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_sort = {
|
||||||
_id: -1
|
_id: -1
|
||||||
};
|
};
|
||||||
const query = {} as any;
|
|
||||||
if (sinceId) {
|
|
||||||
sort._id = 1;
|
|
||||||
query._id = {
|
|
||||||
$gt: sinceId
|
|
||||||
};
|
|
||||||
} else if (untilId) {
|
|
||||||
query._id = {
|
|
||||||
$lt: untilId
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Issue query
|
// Issue query
|
||||||
const users = await User
|
const users = await User
|
||||||
.find(query, {
|
.find({}, {
|
||||||
limit: limit,
|
limit: limit,
|
||||||
sort: sort
|
sort: _sort,
|
||||||
|
skip: offset
|
||||||
});
|
});
|
||||||
|
|
||||||
// Serialize
|
// Serialize
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="mk-welcome-timeline">
|
<div class="mk-welcome-timeline">
|
||||||
<div v-for="post in posts">
|
<div v-for="post in posts">
|
||||||
<router-link class="avatar-anchor" :to="`/${post.user.username}`">
|
<router-link class="avatar-anchor" :to="`/${post.user.username}`" v-user-preview="post.user.id">
|
||||||
<img class="avatar" :src="`${post.user.avatar_url}?thumbnail&size=96`" alt="avatar"/>
|
<img class="avatar" :src="`${post.user.avatar_url}?thumbnail&size=96`" alt="avatar"/>
|
||||||
</router-link>
|
</router-link>
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<header>
|
<header>
|
||||||
<router-link class="name" :to="`/${post.user.username}`">{{ post.user.name }}</router-link>
|
<router-link class="name" :to="`/${post.user.username}`" v-user-preview="post.user.id">{{ post.user.name }}</router-link>
|
||||||
<span class="username">@{{ post.user.username }}</span>
|
<span class="username">@{{ post.user.username }}</span>
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<router-link class="created-at" :to="`/${post.user.username}/${post.id}`">
|
<router-link class="created-at" :to="`/${post.user.username}/${post.id}`">
|
||||||
|
@ -100,6 +100,7 @@ export default Vue.extend({
|
||||||
overflow hidden
|
overflow hidden
|
||||||
font-weight bold
|
font-weight bold
|
||||||
text-overflow ellipsis
|
text-overflow ellipsis
|
||||||
|
color #627079
|
||||||
|
|
||||||
> .username
|
> .username
|
||||||
margin 0 .5em 0 0
|
margin 0 .5em 0 0
|
||||||
|
|
|
@ -5,8 +5,13 @@
|
||||||
<div>
|
<div>
|
||||||
<div>
|
<div>
|
||||||
<h1>Share<br>Everything!</h1>
|
<h1>Share<br>Everything!</h1>
|
||||||
<p>ようこそ! <b>Misskey</b>はTwitter風ミニブログSNSです。思ったことや皆と共有したいことを投稿しましょう。タイムラインを見れば、皆の関心事をすぐにチェックすることもできます。<a>詳しく...</a></p>
|
<p>ようこそ! <b>Misskey</b>はTwitter風ミニブログSNSです。思ったことや皆と共有したいことを投稿しましょう。タイムラインを見れば、皆の関心事をすぐにチェックすることもできます。<a :href="aboutUrl">詳しく...</a></p>
|
||||||
<p><button class="signup" @click="signup">はじめる</button><button class="signin" @click="signin">ログイン</button></p>
|
<p><button class="signup" @click="signup">はじめる</button><button class="signin" @click="signin">ログイン</button></p>
|
||||||
|
<div class="users">
|
||||||
|
<router-link v-for="user in users" :key="user.id" class="avatar-anchor" :to="`/${user.username}`" v-user-preview="user.id">
|
||||||
|
<img class="avatar" :src="`${user.avatar_url}?thumbnail&size=64`" alt="avatar"/>
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<div>
|
<div>
|
||||||
|
@ -37,14 +42,24 @@
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import { copyright } from '../../../config';
|
import { docsUrl, copyright, lang } from '../../../config';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
copyright
|
aboutUrl: `${docsUrl}/${lang}/about`,
|
||||||
|
copyright,
|
||||||
|
users: []
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
mounted() {
|
||||||
|
(this as any).api('users', {
|
||||||
|
sort: '+follower',
|
||||||
|
limit: 20
|
||||||
|
}).then(users => {
|
||||||
|
this.users = users;
|
||||||
|
});
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
signup() {
|
signup() {
|
||||||
this.$modal.show('signup');
|
this.$modal.show('signup');
|
||||||
|
@ -139,14 +154,22 @@ export default Vue.extend({
|
||||||
border-color darken($theme-color, 10%)
|
border-color darken($theme-color, 10%)
|
||||||
|
|
||||||
.signin
|
.signin
|
||||||
&:focus
|
|
||||||
color #444
|
|
||||||
|
|
||||||
&:hover
|
&:hover
|
||||||
color #444
|
color #fff
|
||||||
|
|
||||||
&:active
|
> .users
|
||||||
color #333
|
margin 16px 0 0 0
|
||||||
|
|
||||||
|
> *
|
||||||
|
display inline-block
|
||||||
|
margin 4px
|
||||||
|
|
||||||
|
> *
|
||||||
|
display inline-block
|
||||||
|
width 38px
|
||||||
|
height 38px
|
||||||
|
vertical-align top
|
||||||
|
border-radius 6px
|
||||||
|
|
||||||
> div:last-child
|
> div:last-child
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="welcome">
|
<div class="welcome">
|
||||||
<h1><b>Misskey</b>へようこそ</h1>
|
<h1><b>Misskey</b>へようこそ</h1>
|
||||||
<p>Twitter風ミニブログSNS、Misskeyへようこそ。思ったことを投稿したり、タイムラインでみんなの投稿を読むこともできます。<a href="/signup">アカウントを作成する</a></p>
|
<p>Twitter風ミニブログSNS、Misskeyへようこそ。思ったことを投稿したり、タイムラインでみんなの投稿を読むこともできます。<br><a href="/signup">アカウントを作成する</a></p>
|
||||||
<div class="form">
|
<div class="form">
|
||||||
<p>%fa:lock% ログイン</p>
|
<p>%fa:lock% ログイン</p>
|
||||||
<div>
|
<div>
|
||||||
|
@ -20,6 +20,11 @@
|
||||||
<p>%fa:comments R% タイムラインを見てみる</p>
|
<p>%fa:comments R% タイムラインを見てみる</p>
|
||||||
<mk-welcome-timeline/>
|
<mk-welcome-timeline/>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="users">
|
||||||
|
<router-link v-for="user in users" :key="user.id" class="avatar-anchor" :to="`/${user.username}`">
|
||||||
|
<img class="avatar" :src="`${user.avatar_url}?thumbnail&size=64`" alt="avatar"/>
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<small>{{ copyright }}</small>
|
<small>{{ copyright }}</small>
|
||||||
</footer>
|
</footer>
|
||||||
|
@ -39,11 +44,17 @@ export default Vue.extend({
|
||||||
password: '',
|
password: '',
|
||||||
token: '',
|
token: '',
|
||||||
apiUrl,
|
apiUrl,
|
||||||
copyright
|
copyright,
|
||||||
|
users: []
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
document.documentElement.style.background = '#293946';
|
(this as any).api('users', {
|
||||||
|
sort: '+follower',
|
||||||
|
limit: 20
|
||||||
|
}).then(users => {
|
||||||
|
this.users = users;
|
||||||
|
});
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
onUsernameChange() {
|
onUsernameChange() {
|
||||||
|
@ -82,7 +93,7 @@ export default Vue.extend({
|
||||||
padding 8px
|
padding 8px
|
||||||
font-size 1.5em
|
font-size 1.5em
|
||||||
font-weight normal
|
font-weight normal
|
||||||
color #c3c6ca
|
color #cacac3
|
||||||
|
|
||||||
& + p
|
& + p
|
||||||
margin 0 0 16px 0
|
margin 0 0 16px 0
|
||||||
|
@ -146,7 +157,7 @@ export default Vue.extend({
|
||||||
padding 16px
|
padding 16px
|
||||||
text-align center
|
text-align center
|
||||||
|
|
||||||
.tl
|
> .tl
|
||||||
background #fff
|
background #fff
|
||||||
border solid 1px rgba(0, 0, 0, 0.2)
|
border solid 1px rgba(0, 0, 0, 0.2)
|
||||||
border-radius 8px
|
border-radius 8px
|
||||||
|
@ -163,12 +174,33 @@ export default Vue.extend({
|
||||||
max-height 300px
|
max-height 300px
|
||||||
overflow auto
|
overflow auto
|
||||||
|
|
||||||
|
> .users
|
||||||
|
margin 12px 0 0 0
|
||||||
|
|
||||||
|
> *
|
||||||
|
display inline-block
|
||||||
|
margin 4px
|
||||||
|
|
||||||
|
> *
|
||||||
|
display inline-block
|
||||||
|
width 38px
|
||||||
|
height 38px
|
||||||
|
vertical-align top
|
||||||
|
border-radius 6px
|
||||||
|
|
||||||
> footer
|
> footer
|
||||||
text-align center
|
text-align center
|
||||||
color #949fa9
|
color #fff
|
||||||
|
|
||||||
> small
|
> small
|
||||||
display block
|
display block
|
||||||
margin 16px 0 0 0
|
margin 16px 0 0 0
|
||||||
|
opacity 0.7
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style lang="stylus">
|
||||||
|
html
|
||||||
|
body
|
||||||
|
background linear-gradient(to bottom, #1e1d65, #bd6659)
|
||||||
|
</style>
|
||||||
|
|
Loading…
Reference in a new issue