2019-04-21 11:50:48 +08:00

1435 lines
39 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<div class="content guide with-sidebar team-guide">
<h1>认识团队</h1>
<script id="vuer-profile-template" type="text/template">
<div class="vuer">
<div class="avatar">
<img v-if="profile.imageUrl"
:src="profile.imageUrl"
:alt="profile.name" width=80 height=80>
<img v-else-if="profile.github"
:src="'https://github.com/' + profile.github + '.png'"
:alt="profile.name" width=80 height=80>
<img v-else-if="profile.twitter"
:src="'https://avatars.io/twitter/' + profile.twitter"
:alt="profile.name" width=80 height=80>
</div>
<div class="profile">
<h3 :data-official-title="profile.title">
{{ profile.name }}
<sup v-if="profile.title && titleVisible" v-html="profile.title"></sup>
</h3>
<dl>
<template v-if="profile.reposOfficial">
<dt>Core focus</dt>
<dd>
<ul>
<li v-for="repo in profile.reposOfficial">
<a :href="githubUrl('vuejs', repo)" target=_blank>{{ repo.name || repo }}</a>
</li>
</ul>
</dd>
</template>
<template v-if="profile.github && profile.reposPersonal">
<dt>Ecosystem</dt>
<dd>
<ul>
<li v-for="repo in profile.reposPersonal">
<a :href="githubUrl(profile.github, repo)" target=_blank>{{ repo.name || repo }}</a>
</li>
</ul>
</dd>
</template>
<template v-if="profile.work">
<dt>
<i class="fa fa-briefcase"></i>
<span class="sr-only">Work</span>
</dt>
<dd v-html="workHtml"></dd>
</template>
<span v-if="profile.distanceInKm" class="distance">
<dt>
<i class="fa fa-map-marker"></i>
<span class="sr-only">Distance</span>
</dt>
<dd>
About
<span
v-if="profile.distanceInKm <= 150"
:title="profile.name + ' is close enough to commute to your location.'"
class="user-match"
>{{ textDistance }} away</span>
<template v-else>{{ textDistance }} away</template>
in {{ profile.city }}
</dd>
</span>
<template v-else-if="profile.city">
<dt>
<i class="fa fa-map-marker"></i>
<span class="sr-only">City</span>
</dt>
<dd>
{{ profile.city }}
</dd>
</template>
<template v-if="profile.languages">
<dt>
<i class="fa fa-globe"></i>
<span class="sr-only">Languages</span>
</dt>
<dd v-html="languageListHtml" class="language-list"></dd>
</template>
<template v-if="profile.links">
<dt>
<i class="fa fa-link"></i>
<span class="sr-only">Links</span>
</dt>
<dd>
<ul>
<li v-for="link in profile.links">
<a :href="link" target=_blank>{{ minimizeLink(link) }}</a>
</li>
</ul>
</dd>
</template>
<footer v-if="hasSocialLinks" class="social">
<a class=github v-if="profile.github" :href="githubUrl(profile.github)">
<i class="fa fa-github"></i>
<span class="sr-only">Github</span>
</a>
<a class=twitter v-if="profile.twitter" :href="'https://twitter.com/' + profile.twitter">
<i class="fa fa-twitter"></i>
<span class="sr-only">Twitter</span>
</a>
<a class=codepen v-if="profile.codepen" :href="'https://codepen.io/' + profile.codepen">
<i class="fa fa-codepen"></i>
<span class="sr-only">CodePen</span>
</a>
<a class=linkedin v-if="profile.linkedin" :href="'https://www.linkedin.com/in/' + profile.linkedin">
<i class="fa fa-linkedin"></i>
<span class="sr-only">LinkedIn</span>
</a>
</footer>
</dl>
</div>
</div>
</script>
<div id="team-members">
<div class="team">
<h2 id="active-core-team-members">
核心团队活跃成员
<button :disabled="isSorting" class="sort-by-distance-button" v-if="geolocationSupported &amp;&amp; !userPosition">
<i class="fa fa-refresh rotating-clockwise" v-if="isSorting"></i>
<template v-else="">
<i class="fa fa-map-marker"></i>
<span>谁在我附近</span>
</template>
</button>
</h2>
<p class="tip" v-if="errorGettingLocation">
未成功获取您的位置。
</p>
<p>
Vue 的研发及其生态建设出自一个国际化的团队,这里会展示其中部分团队成员的信息。
</p>
<p class="success" v-if="userPosition">
核心团队成员已经按照跟你的距离排序。
</p>
<vuer-profile :key="profile.name" :profile="profile" :title-visible="titleVisible" v-for="profile in sortedTeam"></vuer-profile>
</div>
<div class="team">
<h2 id="core-team-emeriti">
核心团队荣誉成员
</h2>
<p>
我们在此致敬过去曾做出过突出贡献的不再活跃的团队成员。
</p>
<vuer-profile :key="profile.name" :profile="profile" :title-visible="titleVisible" v-for="profile in teamEmeriti"></vuer-profile>
</div>
<div class="team">
<h2 id="community-partners">
社区伙伴
<button :disabled="isSorting" class="sort-by-distance-button" v-if="geolocationSupported &amp;&amp; !userPosition">
<i class="fa fa-refresh rotating-clockwise" v-if="isSorting"></i>
<template v-else="">
<i class="fa fa-map-marker"></i>
<span>谁在我附近</span>
</template>
</button>
</h2>
<p class="tip" v-if="errorGettingLocation">
未成功获取您的位置。
</p>
<p>
一些 Vue 的社区成员让这里变得更加丰富多彩,有必要在此特别提及。我们与这些主要合作伙伴建立了更加亲密的关系,经常与他们就即将到来的功能和新闻展开协作。
</p>
<p class="success" v-if="userPosition">
社区伙伴们已经按照跟你的距离排序。
</p>
<vuer-profile :key="profile.name" :profile="profile" :title-visible="titleVisible" v-for="profile in sortedPartners"></vuer-profile>
</div>
</div>
<script>
(function () {
var cityCoordsFor = {
'Annecy, France': [45.899247, 6.129384],
'Alicante, Spain' : [38.346543, -0.483838],
'Amsterdam, Netherlands': [4.895168, 52.370216],
'Bangalore, India': [12.971599, 77.594563],
'Beijing, China': [39.904200, 116.407396],
'Bordeaux, France': [44.837789, -0.579180],
'Bucharest, Romania': [44.426767, 26.102538],
'Chengdu, China': [30.572815, 104.066801],
'Chongqing, China': [29.431586, 106.912251],
'Denver, CO, USA': [39.739236, -104.990251],
'Dubna, Russia': [56.732020, 37.166897],
'East Lansing, MI, USA': [42.736979, -84.483865],
'Hangzhou, China': [30.274084, 120.155070],
'Jersey City, NJ, USA': [40.728157, -74.558716],
'Kingston, Jamaica': [18.017874, -76.809904],
'Krasnodar, Russia': [45.039267, 38.987221],
'Lansing, MI, USA': [42.732535, -84.555535],
'London, UK': [51.507351, -0.127758],
'Lyon, France': [45.764043, 4.835659],
'Mannheim, Germany': [49.487459, 8.466039],
'Moscow, Russia': [55.755826, 37.617300],
'Munich, Germany': [48.137154, 11.576124],
'Orlando, FL, USA': [28.538335, -81.379236],
'Paris, France': [48.856614, 2.352222],
'Poznań, Poland': [52.4006553, 16.761583],
'Seoul, South Korea': [37.566535, 126.977969],
'Shanghai, China': [31.230390, 121.473702],
'Singapore': [1.352083, 103.819839],
'Sydney, Australia': [-33.868820, 151.209290],
'Taquaritinga, Brazil': [-21.430094, -48.515285],
'Tehran, Iran': [35.689197, 51.388974],
'Thessaloniki, Greece': [40.640063, 22.944419],
'Tokyo, Japan': [35.689487, 139.691706],
'Toronto, Canada': [43.653226, -79.383184],
'Wrocław, Poland': [51.107885, 17.038538],
'Boston, MA, USA': [42.360081, -71.058884],
'Kyiv, Ukraine': [50.450100, 30.523399],
'Washington, DC, USA': [38.8935755,-77.0846156,12],
'Kraków, Poland': [50.064650, 19.936579]
}
var languageNameFor = {
en: 'English',
nl: 'Nederlands',
zh: '中文',
vi: 'Tiếng Việt',
pl: 'Polski',
pt: 'Português',
ru: 'Русский',
jp: '日本語',
fr: 'Français',
de: 'Deutsch',
el: 'Ελληνικά',
es: 'Español',
hi: 'हिंदी',
fa: 'فارسی',
ko: '한국어',
ro: 'Română',
uk: 'Українська'
}
var team = [{
name: 'Evan You',
title: 'Benevolent Dictator For Life',
city: 'Jersey City, NJ, USA',
languages: ['zh', 'en'],
github: 'yyx990803',
twitter: 'youyuxi',
work: {
role: 'Creator',
org: 'Vue.js'
},
reposOfficial: [
'vuejs/*', 'vuejs-templates/*'
],
links: [
'https://www.patreon.com/evanyou'
]
}]
team = team.concat(shuffle([
{
name: 'Chris Fritz',
title: 'Good Word Putter-Togetherer',
city: 'Lansing, MI, USA',
languages: ['en', 'de'],
github: 'chrisvfritz',
twitter: 'chrisvfritz',
work: {
role: 'Educator & Consultant'
},
reposOfficial: [
'vuejs.org', 'vue-migration-helper'
],
reposPersonal: [
'vue-2.0-simple-routing-example', 'vue-ssr-demo-simple'
],
links: [
'https://www.patreon.com/chrisvuefritz'
]
},
{
name: 'Eduardo',
title: 'Real-Time Rerouter',
city: 'Paris, France',
languages: ['es', 'fr', 'en'],
github: 'posva',
twitter: 'posva',
work: {
role: 'Lead Instructor',
org: 'IronHack',
orgUrl: 'https://www.ironhack.com/'
},
reposOfficial: [
'vuefire', 'vue-router'
],
reposPersonal: [
'vuexfire', 'vue-mdc', 'vue-motion'
],
links: [
'https://www.codementor.io/posva'
]
},
{
name: 'Sodatea',
city: 'Hangzhou, China',
languages: ['zh', 'en'],
github: 'sodatea',
twitter: 'haoqunjiang',
reposOfficial: [
'vue-cli', 'vue-loader'
]
},
{
name: 'Pine Wu',
languages: ['zh', 'en', 'jp'],
github: 'octref',
twitter: 'octref',
work: {
role: 'Engineer on VSCode',
org: 'Microsoft'
},
reposOfficial: [
'vetur'
]
},
{
name: 'Jinjiang',
title: 'Mobile Extrapolator',
city: 'Hangzhou, China',
languages: ['zh', 'en'],
github: 'jinjiang',
twitter: 'zhaojinjiang',
work: {
org: 'Alibaba',
orgUrl: 'https://www.alibaba.com/'
},
reposOfficial: [
'cn.vuejs.org'
],
reposPersonal: [
'apache/incubator-weex'
]
},
{
name: 'Katashin',
title: 'One of a Type State Manager',
city: 'Singapore',
languages: ['jp', 'en'],
work: {
role: 'Software Engineer',
org: 'ClassDo',
orgUrl: 'https://classdo.com'
},
github: 'ktsn',
twitter: 'ktsn',
reposOfficial: [
'vuex', 'vue-class-component'
],
reposPersonal: [
'vue-designer'
]
},
{
name: 'Kazupon',
title: 'Validated Internationalizing Missionary',
city: 'Tokyo, Japan',
languages: ['jp', 'en'],
github: 'kazupon',
twitter: 'kazu_pon',
work: {
role: 'CTO & Full Stack Developer'
},
reposOfficial: [
'vuejs.org', 'jp.vuejs.org'
],
reposPersonal: [
'vue-i18n', 'vue-cli-plugin-i18n', 'vue-i18n-loader', 'vue-i18n-extensions'
],
links: [
'https://www.patreon.com/kazupon', 'https://cuusoo.com', 'http://frapwings.jp'
]
},
{
name: 'Rahul Kadyan',
title: 'Ecosystem Glue Chemist',
city: 'Bangalore, India',
languages: ['hi', 'en'],
work: {
role: 'Software Engineer',
org: 'Myntra',
orgUrl: 'https://www.myntra.com/'
},
github: 'znck',
twitter: 'znck0',
reposOfficial: [
'rollup-plugin-vue', 'vue-issue-helper'
],
reposPersonal: [
'keynote', 'bootstrap-for-vue', 'vue-interop'
],
links: [
'https://znck.me', 'https://www.codementor.io/znck'
]
},
{
name: 'Linusborg',
title: 'Hive-Mind Community Wrangler (Probably a Bot)',
city: 'Mannheim, Germany',
languages: ['de', 'en'],
github: 'LinusBorg',
twitter: 'Linus_Borg',
reposOfficial: [
'vuejs/*'
],
reposPersonal: [
'portal-vue'
],
links: [
'https://forum.vuejs.org/'
]
},
{
name: 'Guillaume Chau',
title: 'Client-Server Astronaut',
city: 'Lyon, France',
languages: ['fr', 'en'],
github: 'Akryum',
twitter: 'Akryum',
work: {
role: 'Frontend Developer',
org: 'Livestorm',
orgUrl: 'https://livestorm.co/'
},
reposOfficial: [
'vue-devtools',
'vue-cli',
'vue-curated'
],
reposPersonal: [
'vue-apollo', 'vue-meteor', 'vue-virtual-scroller', 'v-tooltip'
],
links: [
'http://patreon.com/akryum'
]
},
{
name: 'Edd Yerburgh',
title: 'Testatron Alpha 9000',
city: 'London, UK',
languages: ['en'],
github: 'eddyerburgh',
twitter: 'EddYerburgh',
work: {
role: 'Full Stack Developer'
},
reposOfficial: [
'vue-test-utils'
],
reposPersonal: [
'avoriaz'
],
links: [
'https://www.eddyerburgh.me'
]
},
{
name: 'Sarah Drasner',
city: 'Denver, CO, USA',
languages: ['en'],
work: {
role: 'Senior Cloud Developer Advocate',
org: 'Microsoft',
orgUrl: 'https://www.microsoft.com/'
},
github: 'sdras',
twitter: 'sarah_edo',
codepen: 'sdras',
reposPersonal: [
'intro-to-vue', 'vue-vscode-snippets', 'vue-sublime-snippets', 'nuxt-type', 'animating-vue-workshop', 'cda-locale', 'vue-weather-notifier'
]
},
{
name: 'Damian Dulisz',
title: 'Dark Mage of Plugins, News, and Confs',
city: 'Wrocław, Poland',
languages: ['pl', 'en'],
github: 'shentao',
twitter: 'DamianDulisz',
work: {
role: 'Consultant'
},
reposOfficial: [
'news.vuejs.org'
],
reposPersonal: [
'shentao/vue-multiselect',
'shentao/vue-global-events'
]
},
{
name: 'Michał Sajnóg',
city: 'Poznań, Poland',
languages: ['pl', 'en'],
github: 'michalsnik',
twitter: 'michalsnik',
work: {
role: 'Senior Frontend Developer / Team Leader',
org: 'Netguru',
orgUrl: 'https://netguru.co/'
},
reposOfficial: [
'eslint-plugin-vue',
'vue-devtools'
],
reposPersonal: [
'vue-computed-helpers', 'vue-content-placeholders'
]
},
{
name: 'GU Yiling',
city: 'Shanghai, China',
languages: ['zh', 'en'],
work: {
role: 'Senior web developer',
org: 'Baidu, inc.',
orgUrl: 'https://www.baidu.com/'
},
github: 'Justineo',
twitter: '_justineo',
reposOfficial: [
'vue', 'cn.vuejs.org'
],
reposPersonal: [
'Justineo/vue-awesome', 'ecomfe/vue-echarts', 'ecomfe/veui'
]
},
{
name: 'ULIVZ',
city: 'Hangzhou, China',
languages: ['zh', 'en'],
work: {
role: 'Senior Frontend Developer',
org: 'AntFinancial',
orgUrl: 'https://www.antfin.com'
},
github: 'ulivz',
twitter: '_ulivz',
reposOfficial: [
'vuepress'
]
},
{
name: 'Darek Gusto Wędrychowski',
title: 'Google Search Virtuoso',
city: 'Kraków, Poland',
languages: ['pl', 'en'],
github: 'gustojs',
twitter: 'gustojs'
},
{
name: 'Phan An',
title: 'Backend Designer & Process Poet',
city: 'Munich, Germany',
languages: ['vi', 'en'],
github: 'phanan',
twitter: 'notphanan',
work: {
role: 'Engineering Team Lead',
org: 'InterNations',
orgUrl: 'https://www.internations.org/'
},
reposOfficial: [
'vuejs.org'
],
reposPersonal: [
'vuequery', 'vue-google-signin-button'
],
links: [
'https://vi.vuejs.org',
'https://phanan.net/'
]
},
]))
var emeriti = shuffle([
{
name: 'Blake Newman',
title: 'Performance Specializer & Code Deleter',
city: 'London, UK',
languages: ['en'],
work: {
role: 'Software Engineer',
org: 'Attest',
orgUrl: 'https://www.askattest.com/'
},
github: 'blake-newman',
twitter: 'blakenewman'
},
{
name: 'kingwl',
title: 'New Bee',
city: 'Beijing, China',
languages: ['zh'],
work: {
role: 'Software Development Engineer',
org: 'Chaitin',
orgUrl: 'https://chaitin.cn/'
},
github: 'kingwl',
reposOfficial: [
'vue'
]
},
{
name: 'Alan Song',
title: 'Regent of Routing',
city: 'Hangzhou, China',
languages: ['zh', 'en'],
work: {
role: 'Cofounder',
org: 'Futurenda',
orgUrl: 'https://www.futurenda.com/'
},
github: 'fnlctrl',
reposOfficial: [
'vue-router'
]
},
{
name: 'defcc',
title: 'Details Deity & Bug Surgeon',
city: 'Chongqing, China',
languages: ['zh', 'en'],
github: 'defcc',
work: {
org: 'zbj.com',
orgUrl: 'http://www.zbj.com/'
}
},
{
name: 'gebilaoxiong',
title: 'Issue Annihilator',
city: 'Chongqing, China',
languages: ['zh', 'en'],
github: 'gebilaoxiong',
work: {
org: 'zbj.com',
orgUrl: 'http://www.zbj.com/'
}
},
{
name: 'Denis Karabaza',
title: 'Director of Directives (Emoji-Human Hybrid)',
city: 'Dubna, Russia',
languages: ['ru', 'en'],
github: 'simplesmiler',
twitter: 'simplesmiler',
work: {
role: 'Software Engineer',
org: 'Neolant',
orgUrl: 'http://neolant.ru/'
}
},
])
var partners = [
{
name: 'Pratik Patel',
title: 'Organizer of VueConf US',
city: 'Atlanta, GA, USA',
languages: ['en'],
work: {
role: 'Organizer',
org: 'VueConf US'
},
twitter: 'prpatel',
links: [
'https://us.vuejs.org/'
]
},
{
name: 'Vincent Mayers',
title: 'Organizer of VueConf US',
city: 'Atlanta, GA, USA',
languages: ['en'],
work: {
role: 'Organizer',
org: 'VueConf US'
},
twitter: 'vincentmayers',
links: [
'https://us.vuejs.org/'
]
},
{
name: 'Luke Thomas',
title: 'Creator of Vue.js Amsterdam',
city: 'Amsterdam, Netherlands',
languages: ['nl', 'en', 'de'],
work: {
role: 'Creator',
org: 'Vue.js Amsterdam'
},
twitter: 'lukevscostas',
linkedin: 'luke-kenneth-thomas-578b3916a',
links: [
'https://vuejs.amsterdam'
]
},
{
name: 'Jos Gerards',
title: 'Organizer and Host of Vue.js Amsterdam & Frontend Love',
city: 'Amsterdam, Netherlands',
languages: ['nl', 'en', 'de'],
work: {
role: 'Event Manager',
org: 'Vue.js Amsterdam'
},
twitter: 'josgerards88',
linkedin: 'josgerards',
links: [
'https://vuejs.amsterdam'
]
},
{
name: 'James McGlasson',
title: 'Head of Marketing Communications',
imageUrl: 'https://media.licdn.com/dms/image/C4E03AQHxi_fy33l5Mg/profile-displayphoto-shrink_800_800/0?e=1556150400&v=beta&t=KADJ_7nuWuYFPQaKtK7QuI96iC0gPKc198GZ-_dXr_0',
city: 'Amsterdam, Netherlands',
languages: ['en', 'nl', 'de'],
work: {
role: 'Head Of Marketing Communications',
org: 'Vue.js Amsterdam'
},
linkedin: 'jdog',
links: [
'https://vuejs.amsterdam'
]
},
{
name: 'Jen Looper',
title: 'Queen Fox',
city: 'Boston, MA, USA',
languages: ['en', 'fr'],
work: {
role: 'CEO',
org: 'Vue Vixens'
},
github: 'jlooper',
twitter: 'jenlooper',
links: [
'https://vuevixens.org/',
'https://nativescript-vue.org/'
]
},
{
name: 'Natalia Tepluhina',
title: 'Fox Tech Guru',
city: 'Kyiv, Ukraine',
languages: ['uk', 'ru', 'en'],
reposOfficial: [
'vuejs.org'
],
work: {
role: 'Senior Frontend Engineer',
org: 'GitLab',
orgUrl: 'https://gitlab.com/'
},
github: 'NataliaTepluhina',
twitter: 'N_Tepluhina',
links: [
'https://vuevixens.org/'
]
},
{
name: 'Alex Jover',
title: 'Vue Components Squeezer',
city: 'Alicante, Spain',
languages: ['es', 'en'],
work: {
role: 'Web, PWA and Performance Consultant',
org: 'Freelance'
},
github: 'alexjoverm',
twitter: 'alexjoverm',
reposPersonal: [
'v-runtime-template', 'v-lazy-image', 'vue-testing-series'
],
links: [
'https://alexjover.com'
]
},
{
name: 'Sebastien Chopin',
title: '#1 Nuxt Brother',
city: 'Paris, France',
languages: ['fr', 'en'],
github: 'Atinux',
twitter: 'Atinux',
work: {
org: 'Orion',
orgUrl: 'https://orion.sh'
},
reposPersonal: [
'nuxt/*', 'nuxt-community/*', 'declandewet/vue-meta'
]
},
{
name: 'Alexandre Chopin',
title: '#1 Nuxt Brother',
city: 'Bordeaux, France',
languages: ['fr', 'en'],
github: 'alexchopin',
twitter: '_achopin',
work: {
org: 'Orion',
orgUrl: 'https://orion.sh'
},
reposPersonal: [
'nuxt/*', 'nuxt-community/*', 'vue-flexboxgrid'
]
},
{
name: 'Khary Sharpe',
title: 'Viral Newscaster',
city: 'Kingston, Jamaica',
languages: ['en'],
github: 'kharysharpe',
twitter: 'kharysharpe',
links: [
'https://twitter.com/VueJsNews',
'http://www.kharysharpe.com/'
]
},
{
name: 'Pooya Parsa',
title: 'Nuxtification Modularizer',
city: 'Tehran, Iran',
languages: ['fa', 'en'],
github: 'pi0',
twitter: '_pi0_',
work: {
role: 'Technical Advisor',
org: 'Fandogh (AUT University)',
orgUrl: 'https://fandogh.org'
},
reposPersonal: [
'nuxt/*', 'nuxt-community/*', 'bootstrap-vue/*'
]
},
{
name: 'Xin Du',
title: 'Nuxpert',
city: 'Dublin, Ireland',
languages: ['zh', 'en'],
github: 'clarkdo',
twitter: 'ClarkDu_',
reposPersonal: [
'nuxt/*', 'nuxt-community/*'
]
},
{
name: 'Yi Yang',
city: 'Shanghai, China',
title: 'Interface Elementologist',
languages: ['zh', 'en'],
github: 'Leopoldthecoder',
work: {
org: 'ele.me',
orgUrl: 'https://www.ele.me',
},
reposPersonal: [
'elemefe/element', 'elemefe/mint-ui'
]
},
{
name: 'Bruno Lesieur',
title: 'French Community Director',
city: 'Annecy, France',
languages: ['fr', 'en'],
github: 'Haeresis',
twitter: 'ZetesEthique',
work: {
role: 'Cofounder',
org: 'Orchard ID',
orgUrl: 'https://www.orchard-id.com/'
},
reposPersonal: [
'vuejs-fr/*', 'Haeresis/node-atlas-hello-vue'
],
links: [
'https://node-atlas.js.org/', 'https://blog.lesieur.name/'
]
},
{
name: 'ChangJoo Park',
title: 'Vuenthusiastic Korean Community Organizer',
city: 'Seoul, South Korea',
languages: ['ko', 'en'],
github: 'changjoo-park',
twitter: 'pcjpcj2',
reposPersonal: [
'vuejs-kr/kr.vuejs.org', 'ChangJoo-Park/vue-component-generator'
],
links: [
'https://vuejs-kr.github.io',
'https://twitter.com/pcjpcj2'
]
},
{
name: 'Erick Petrucelli',
title: 'Perfectionist Chief Translator for Portuguese',
city: 'Taquaritinga, Brazil',
languages: ['pt', 'en'],
github: 'ErickPetru',
twitter: 'erickpetru',
work: {
role: 'Teacher',
org: 'Fatec Taquaritinga',
orgUrl: 'http://www.fatectq.edu.br/'
},
reposPersonal: [
'vuejs-br/br.vuejs.org', 'ErickPetru/vue-feathers-chat'
]
},
{
name: 'Razvan Stoenescu',
title: 'Deep Space Quasar Creator',
city: 'Bucharest, Romania',
languages: ['ro', 'en'],
github: 'rstoenescu',
twitter: 'quasarframework',
work: {
role: 'Developer',
org: 'Quasar Framework',
orgUrl: 'http://quasar-framework.org/'
},
reposPersonal: [
'quasarframework/quasar', 'quasarframework/quasar-cli', 'quasarframework/quasar-play'
]
},
{
name: 'Jilson Thomas',
title: 'Vue Promoter and VueJobs Guy',
city: 'Toronto, Canada',
languages: ['en'],
github: 'JillzTom',
twitter: 'jilsonthomas',
work: {
role: 'Senior Frontend Developer',
org: 'Nominator',
orgUrl: 'https://nominator.com/'
},
links: [
'https://vuejobs.com'
]
},
{
name: 'Israel Ortuño',
title: 'VueJobs Buccaneer',
city: 'Alicante, Spain',
languages: ['es', 'en'],
github: 'IsraelOrtuno',
twitter: 'IsraelOrtuno',
work: {
role: 'Full Stack Web Developer',
org: 'Freelance'
},
links: [
'https://vuejobs.com'
]
},
{
name: 'John Leider',
title: 'Vuetiful Framework Sculptor',
city: 'Fort Worth, TX, USA',
languages: ['en'],
github: 'vuetifyjs',
twitter: 'vuetifyjs',
work: {
role: 'CEO',
org: 'Vuetify LLC',
orgUrl: 'https://vuetifyjs.com'
},
reposPersonal: [
'vuetifyjs/vuetify'
]
},
{
name: 'Grigoriy Beziuk',
title: 'Translation Gang Leader',
city: 'Moscow, Russia',
languages: ['ru', 'de', 'en'],
github: 'gbezyuk',
work: {
role: 'Full Stack Web Developer',
org: 'Self Employed',
orgUrl: 'http://gbezyuk.ru'
},
reposPersonal: [
'translation-gang/ru.vuejs.org'
]
},
{
name: 'Alexander Sokolov',
title: 'Russian Translation Sharp Eye',
city: 'Krasnodar, Russia',
languages: ['ru', 'en'],
github: 'Alex-Sokolov',
reposPersonal: [
'translation-gang/ru.vuejs.org'
]
},
{
name: 'Anthony Gore',
title: '',
city: 'Sydney, Australia',
languages: ['en'],
github: 'anthonygore',
twitter: 'anthonygore',
work: {
role: 'Author',
org: 'Vue.js Developers',
orgUrl: 'https://vuejsdevelopers.com/'
},
links: [
'https://vuejsdevelopers.com'
]
},
{
name: 'Ben Hong',
title: '',
city: 'Washington, DC, USA',
languages: ['en', 'zh'],
work: {
role: 'Senior Frontend Engineer',
org: 'GitLab (Meltano)',
},
reposOfficial: [
'vuejs/events'
],
github: 'bencodezen',
twitter: 'bencodezen',
links: [
'https://bencodezen.io/'
]
},
{
name: 'EGOIST',
title: 'Build Tool Simplificator',
city: 'Chengdu, China',
languages: ['zh', 'en'],
github: 'egoist',
twitter: '_egoistlily',
reposPersonal: [
'poi', 'ream', 'vue-play'
]
},
{
name: 'Alex Kyriakidis',
title: 'Vueducator Extraordinaire',
city: 'Thessaloniki, Greece',
languages: ['el', 'en'],
github: 'hootlex',
twitter: 'hootlex',
work: {
role: 'Consultant / Author'
},
reposPersonal: [
'vuejs-paginator', 'vuedo/vuedo', 'the-majesty-of-vuejs-2'
],
links: [
'https://vuejsfeed.com/', 'https://vueschool.io/'
]
},
{
name: 'Andrew Tomaka',
title: 'The Server Server',
city: 'East Lansing, MI, USA',
languages: ['en'],
github: 'atomaka',
twitter: 'atomaka',
reposOfficial: [
'vuejs/*'
],
work: {
org: 'Michigan State University',
orgUrl: 'https://msu.edu/'
},
links: [
'https://atomaka.com/'
]
},
{
name: 'Blake Newman',
title: 'Performance Specializer & Code Deleter',
city: 'London, UK',
languages: ['en'],
work: {
role: 'Software Engineer',
org: 'Attest',
orgUrl: 'https://www.askattest.com/'
},
github: 'blake-newman',
twitter: 'blakenewman',
links: [
'https://vuejs.london'
]
},
{
name: 'Filip Rakowski',
title: 'eCommerce & PWA mastah',
city: 'Wrocław, Poland',
languages: ['pl', 'en'],
github: 'filrak',
twitter: 'filrakowski',
work: {
role: 'FED & Vue Storefront Co-founder',
org: 'Divante',
orgUrl: 'https://divante.co/'
},
reposPersonal: [
'DivanteLtd/vue-storefront', 'filrak/vue-offline'
],
links: [
'https://vuestorefront.io'
]
},
{
name: 'Gregg Pollack',
title: '',
city: 'Orlando, FL',
languages: ['en'],
github: 'gregg',
twitter: 'greggpollack',
work: {
role: 'Vue Instructor',
org: 'Vue Mastery',
orgUrl: 'https://www.vuemastery.com/'
},
links: [
'https://www.vuemastery.com',
'https://news.vuejs.org/'
]
},
{
name: 'Adam Jahr',
title: '',
city: 'Orlando, FL',
languages: ['en'],
github: 'atomjar',
twitter: 'adamjahr',
work: {
role: 'Vue Instructor',
org: 'Vue Mastery',
orgUrl: 'https://www.vuemastery.com/'
},
links: [
'https://www.vuemastery.com',
'https://news.vuejs.org/'
]
}
]
Vue.component('vuer-profile', {
template: '#vuer-profile-template',
props: {
profile: Object,
titleVisible: Boolean
},
computed: {
workHtml: function () {
var work = this.profile.work
var html = ''
if (work.orgUrl) {
html += '<a href="' + work.orgUrl + '" target="_blank" rel="noopener noreferrer">'
if (work.org) {
html += work.org
} else {
this.minimizeLink(work.orgUrl)
}
html += '</a>'
} else if (work.org) {
html += work.org
}
if (work.role) {
if (html.length > 0) {
html = work.role + ' @ ' + html
} else {
html = work.role
}
}
return html
},
textDistance: function () {
var distanceInKm = this.profile.distanceInKm || 0
if (this.$root.useMiles) {
return roundDistance(kmToMi(distanceInKm)) + ' miles'
} else {
return roundDistance(distanceInKm) + ' km'
}
},
languageListHtml: function () {
var vm = this
var nav = window.navigator
if (!vm.profile.languages) return ''
var preferredLanguageCode = nav.languages
// The preferred language set in the browser
? nav.languages[0]
: (
// The system language in IE
nav.userLanguage ||
// The language in the current page
nav.language
)
return (
'<ul><li>' +
vm.profile.languages.map(function (languageCode, index) {
var language = languageNameFor[languageCode]
if (
languageCode !== 'en' &&
preferredLanguageCode &&
languageCode === preferredLanguageCode.slice(0, 2)
) {
return (
'<span ' +
'class="user-match" ' +
'title="' +
vm.profile.name +
' can give technical talks in your preferred language.' +
'"' +
'\>' + language + '</span>'
)
}
return language
}).join('</li><li>') +
'</li></ul>'
)
},
hasSocialLinks: function () {
return this.profile.github || this.profile.twitter || this.profile.codepen || this.profile.linkedin
}
},
methods: {
minimizeLink: function (link) {
return link
.replace(/^https?:\/\/(www\.)?/, '')
.replace(/\/$/, '')
.replace(/^mailto:/, '')
},
/**
* Generate a GitHub URL using a repo and a handle.
*/
githubUrl: function (handle, repo) {
if (repo && repo.url) {
return repo.url
}
if (repo && repo.indexOf('/') !== -1) {
// If the repo name has a slash, it must be an organization repo.
// In such a case, we discard the (personal) handle.
return (
'https://github.com/' +
repo.replace(/\/\*$/, '')
)
}
return 'https://github.com/' + handle + '/' + (repo || '')
}
}
})
new Vue({
el: '#team-members',
data: {
team: team,
teamEmeriti: emeriti,
partners: shuffle(partners),
geolocationSupported: false,
isSorting: false,
errorGettingLocation: false,
userPosition: null,
useMiles: false,
konami: {
position: 0,
code: [38, 38, 40, 40, 37, 39, 37, 39, 66, 65]
}
},
computed: {
sortedTeam: function () {
return this.sortVuersByDistance(this.team)
},
sortedPartners: function () {
return this.sortVuersByDistance(this.partners)
},
titleVisible: function () {
return this.konami.code.length === this.konami.position
}
},
created: function () {
var nav = window.navigator
if ('geolocation' in nav) {
this.geolocationSupported = true
var imperialLanguageCodes = [
'en-US', 'en-MY', 'en-MM', 'en-BU', 'en-LR', 'my', 'bu'
]
if (imperialLanguageCodes.indexOf(nav.language) !== -1) {
this.useMiles = true
}
}
document.addEventListener('keydown', this.konamiKeydown)
},
beforeDestroy: function () {
document.removeEventListener('keydown', this.konamiKeydown)
},
methods: {
getUserPosition: function () {
var vm = this
var nav = window.navigator
vm.isSorting = true
nav.geolocation.getCurrentPosition(
function (position) {
vm.userPosition = position
vm.isSorting = false
},
function (error) {
vm.isSorting = false
vm.errorGettingLocation = true
},
{
enableHighAccuracy: true
}
)
},
sortVuersByDistance: function (vuers) {
var vm = this
if (!vm.userPosition) return vuers
var vuersWithDistances = vuers.map(function (vuer) {
var cityCoords = cityCoordsFor[vuer.city]
return Object.assign({}, vuer, {
distanceInKm: getDistanceFromLatLonInKm(
vm.userPosition.coords.latitude,
vm.userPosition.coords.longitude,
cityCoords[0],
cityCoords[1]
)
})
})
vuersWithDistances.sort(function (a, b) {
return (
a.distanceInKm -
b.distanceInKm
)
})
return vuersWithDistances
},
konamiKeydown: function (event) {
if (this.titleVisible) {
return
}
if (event.keyCode !== this.konami.code[this.konami.position++]) {
this.konami.position = 0
}
}
}
})
/**
* Shuffles array in place.
* @param {Array} a items The array containing the items.
*/
function shuffle (a) {
a = a.concat([])
if (window.location.hostname === 'localhost') {
return a
}
var j, x, i
for (i = a.length; i; i--) {
j = Math.floor(Math.random() * i)
x = a[i - 1]
a[i - 1] = a[j]
a[j] = x
}
return a
}
/**
* Calculates great-circle distances between the two points that is, the shortest distance over the earths surface using the Haversine formula.
* @param {Number} lat1 The latitude of the 1st location.
* @param {Number} lon1 The longitute of the 1st location.
* @param {Number} lat2 The latitude of the 2nd location.
* @param {Number} lon2 The longitute of the 2nd location.
*/
function getDistanceFromLatLonInKm(lat1,lon1,lat2,lon2) {
var R = 6371 // Radius of the earth in km
var dLat = deg2rad(lat2-lat1) // deg2rad below
var dLon = deg2rad(lon2-lon1)
var a =
Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
Math.sin(dLon/2) * Math.sin(dLon/2)
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a))
var d = R * c // Distance in km
return d
}
function deg2rad(deg) {
return deg * (Math.PI/180)
}
function kmToMi (km) {
return km * 0.62137
}
function roundDistance (num) {
return Number(Math.ceil(num).toPrecision(2))
}
})()
</script>
<div class="guide-links">
<span><a href="join.html">加入 Vue.js 社区</a></span>
</div>
<div class="footer">
<script src="//m.servedby-buysellads.com/monetization.js" type="text/javascript"></script>
<div class="bsa-cpc"></div>
<script>
(function(){
if(typeof _bsa !== 'undefined' && _bsa) {
_bsa.init('default', 'CKYD62QM', 'placement:vuejsorg', {
target: '.bsa-cpc',
align: 'horizontal',
disable_css: 'true'
});
}
})();
</script>
发现错误?想参与编辑?
<a href="https://github.com/vuejs/cn.vuejs.org/blob/master/srcteam.md" target="_blank">
在 GitHub 上编辑此页!
</a>
</div>
</div>