Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DCloud
uni-starter
提交
70eb1e1e
U
uni-starter
项目概览
DCloud
/
uni-starter
通知
4690
Star
229
Fork
210
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
3
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
uni-starter
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
3
Issue
3
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
70eb1e1e
编写于
5月 12, 2021
作者:
DCloud_JSON
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
修改错别字
上级
5aafea99
变更
15
隐藏空白更改
内联
并排
Showing
15 changed file
with
135 addition
and
135 deletion
+135
-135
App.vue
App.vue
+26
-26
README.md
README.md
+29
-29
common/appInit.js
common/appInit.js
+4
-4
components/uni-quick-login/uni-quick-login.vue
components/uni-quick-login/uni-quick-login.vue
+22
-22
js_sdk/request.js
js_sdk/request.js
+1
-1
pages/list/detail.vue
pages/list/detail.vue
+1
-1
pages/ucenter/login-page/common/loginSuccess.js
pages/ucenter/login-page/common/loginSuccess.js
+2
-2
pages/ucenter/login-page/index/index.vue
pages/ucenter/login-page/index/index.vue
+4
-4
pages/ucenter/login-page/register/register.vue
pages/ucenter/login-page/register/register.vue
+20
-20
pages/ucenter/settings/settings.vue
pages/ucenter/settings/settings.vue
+16
-16
store/modules/user.js
store/modules/user.js
+3
-3
uni-starter.config.js
uni-starter.config.js
+1
-1
uniCloud-aliyun/cloudfunctions/user-center/index.js
uniCloud-aliyun/cloudfunctions/user-center/index.js
+4
-4
uni_modules/uni-captcha/readme.md
uni_modules/uni-captcha/readme.md
+1
-1
uni_modules/uni-list-detail/db_init.json
uni_modules/uni-list-detail/db_init.json
+1
-1
未找到文件。
App.vue
浏览文件 @
70eb1e1e
<
script
>
import
initApp
from
'
@/common/appInit.js
'
;
import
checkIsAgree
from
'
@/uni_modules/uni-agree/utils/uni-agree.js
'
;
import
initApp
from
'
@/common/appInit.js
'
;
import
checkIsAgree
from
'
@/uni_modules/uni-agree/utils/uni-agree.js
'
;
export
default
{
globalData
:
{
searchText
:
''
,
appVersion
:
{},
appVersion
:
{},
config
:{}
},
onLaunch
:
function
()
{
console
.
log
(
'
App Launch
'
)
initApp
();
// #ifdef APP-PLUS
//checkIsAgree(); 暂时先用默认生成的,自定义的等待原生支持后实现。因为启动vue界面时已经,请求了部分权限这并不符合国家的法规
console
.
log
(
'
App Launch
'
)
initApp
();
// #ifdef APP-PLUS
//checkIsAgree(); 暂时先用默认生成的,自定义的等待原生支持后实现。因为启动vue界面时已经,请求了部分权限这并不符合国家的法规
// #endif
// #ifdef APP-PLUS
//一键登录 功能预登
陆
//一键登录 功能预登
录
plus
.
oauth
.
getServices
(
oauthServices
=>
{
// console.log(oauthServices);
oauthServices
.
forEach
(({
...
...
@@ -45,19 +45,19 @@
function
onDBError
({
code
,
// 错误码详见https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=returnvalue
message
})
{
// 处理错误
console
.
log
(
code
,
message
);
if
([
'
TOKEN_INVALID_INVALID_CLIENTID
'
,
'
TOKEN_INVALID
'
,
'
TOKEN_INVALID_TOKEN_EXPIRED
'
,
'
TOKEN_INVALID_WRONG_TOKEN
'
,
'
TOKEN_INVALID_ANONYMOUS_USER
'
,
].
includes
(
code
)){
uni
.
navigateTo
({
url
:
'
/pages/ucenter/login-page/index/index
'
})
})
{
// 处理错误
console
.
log
(
code
,
message
);
if
([
'
TOKEN_INVALID_INVALID_CLIENTID
'
,
'
TOKEN_INVALID
'
,
'
TOKEN_INVALID_TOKEN_EXPIRED
'
,
'
TOKEN_INVALID_WRONG_TOKEN
'
,
'
TOKEN_INVALID_ANONYMOUS_USER
'
,
].
includes
(
code
)){
uni
.
navigateTo
({
url
:
'
/pages/ucenter/login-page/index/index
'
})
}
}
// 绑定clientDB错误事件
...
...
@@ -76,7 +76,7 @@
<
style
>
/*每个页面公共css */
/* #ifndef APP-NVUE */
/* #ifndef APP-NVUE */
view
,
scroll-view
,
text
,
...
...
@@ -91,5 +91,5 @@
scroll-view
{
-webkit-overflow-scrolling
:
touch
;
}
/* #endif */
</
style
>
/* #endif */
</
style
>
README.md
浏览文件 @
70eb1e1e
...
...
@@ -33,14 +33,14 @@ img{
</style>
### uni-starter集成的功能包括:
1.
个人中心:登录注册(含用户名密码登录、手机号验证码登录、app一键登
陆、微信登录、Apple登录、微信小程序登录)、修改密码、忘记密码、头像更换、昵称修改、积分查看、指纹绑定、退出登陆
1.
个人中心:登录注册(含用户名密码登录、手机号验证码登录、app一键登
录、微信登录、Apple登录、微信小程序登录)、修改密码、忘记密码、头像更换、昵称修改、积分查看、指纹绑定、退出登录
2.
设置:App更新(整包升级、wgt升级、强制升级,后台搭配uniCloud admin的升级中心插件管理)、权限引导(app)、推送开关(app)、清除缓存(app)、用户协议、隐私协议(app)、问题与反馈、分享推荐、关于
3.
启动引导:iOS初次启动被用户禁止网络权限后引导开启、Android弹出隐私协议后再申请权限
4.
首页集成banner(后台搭配uniCloud admin的banner插件管理)、搜索、列表、详情、分享,均为云端一体。实际使用中将clientDB的表名更改为自己业务表名即可
5.
首页采用nvue,fast编译模式,加快App端启动速度
6.
内置联网失败的重试页面(不是错误弹框,页面有重试按钮)、更漂亮的分享菜单页面
7.
内置拦截器:
-
页面路由拦截,配置需强制登
陆的页面;打开时检测,如果token无效就自动跳转到登陆
页
-
页面路由拦截,配置需强制登
录的页面;打开时检测,如果token无效就自动跳转到登录
页
-
优雅实现:自动引导打开
`选择图片`
所需要的权限。当调用
`uni.chooseImage`
时检测到无权限自动开启引导。并不是在每次调用接口时处理这类问题,你可以参考该例子做更多该类场景的处理。uni-starter也会持续完善
8.
h5版在页面顶部引导用户
`点击下载App`
...
...
@@ -49,7 +49,7 @@ img{
第三方路由拦截库,一般带有windows对象等问题并不适合在uni-app中使用;另外传统路由拦截方式都是给原生方法做嵌套,首先这种写法并不优雅,另外不同项目的作者可能会不同的第三方路由库,这非常不利于生态的建设。你可能从插件市场拉下来一个项目有太多的学习成本,与你自有项目结合有大量差异需要去磨平。为此
`uni-starter`
基于
`uni.addInterceptor`
拦截器。
拦截器顾名思义,是在框架方法执行的各个环节(包含:拦截前触发、成功回调拦截、失败回调拦截、完成回调拦截)篡改参数或终止运行。
```
const {"router": {needLogin,login} } = uniStarterConfig //需要登
陆
的页面
const {"router": {needLogin,login} } = uniStarterConfig //需要登
录
的页面
let list = ["navigateTo", "redirectTo", "reLaunch", "switchTab"];
list.forEach(item => { //用遍历的方式分别为,uni.navigateTo,uni.redirectTo,uni.reLaunch,uni.switchTab这4个路由方法添加拦截器
uni.addInterceptor(item, {
...
...
@@ -58,10 +58,10 @@ img{
const token = uni.getStorageSync('uni_id_token')
//获取当前页面路径(即url去掉"?"和"?"后的参数)
const url = e.url.split('?')[0]
//拦截强制登
陆
页面
//拦截强制登
录
页面
if (needLogin.includes(url) && token == '') {
uni.showToast({
title: '该页面需要登
陆才能访问,请先登陆
',
title: '该页面需要登
录才能访问,请先登录
',
icon: 'none'
})
uni.navigateTo({
...
...
@@ -69,9 +69,9 @@ img{
})
return false
}
//控制登
陆
优先级
//控制登
录
优先级
if (url == '/pages/ucenter/login-page/index/index') {
//一键登录(univerify)、账号(username)、验证码登
陆
(短信smsCode)
//一键登录(univerify)、账号(username)、验证码登
录
(短信smsCode)
if (login[0] == 'univerify') {
if(e.url == url) { e.url += '?' } //添加参数之前判断是否带了`?`号如果没有就补上,因为当开发场景本身有参数的情况下是已经带了`?`号
e.url += "univerify_first=true"
...
...
@@ -88,9 +88,9 @@ img{
})
```
#### 2.登
陆
模块
-
uni-start集成的登
陆方式有:验证码登陆(smsCode)、读取手机SIM卡一键登陆(univerify)、账号密码登陆(username)、微信登陆(weixin)、苹果登陆
(apple)
-
使用方式:在
`uni-starter.config.js`
->
`router`
->
`login`
下完全列举你需要的登
陆方式。这里支持用
[
条件编译
](
https://uniapp.dcloud.io/platform?id=%e6%9d%a1%e4%bb%b6%e7%bc%96%e8%af%91
)
因此你可以配置在不同平台下拥有的登陆
方式。
#### 2.登
录
模块
-
uni-start集成的登
录方式有:验证码登录(smsCode)、读取手机SIM卡一键登录(univerify)、账号密码登录(username)、微信登录(weixin)、苹果登录
(apple)
-
使用方式:在
`uni-starter.config.js`
->
`router`
->
`login`
下完全列举你需要的登
录方式。这里支持用
[
条件编译
](
https://uniapp.dcloud.io/platform?id=%e6%9d%a1%e4%bb%b6%e7%bc%96%e8%af%91
)
因此你可以配置在不同平台下拥有的登录
方式。
-
优先级策略:
如果:配置内容为:["username","smsCode"],用户执行如下代码:
```
...
...
@@ -98,9 +98,9 @@ img{
url: "/pages/ucenter/login-page/index/index"
})
```
访问登
陆页面,但会被拦截器自动切换到“配置的第0项的登陆方式对应的页面”,即账户登陆
方式页面,路径:
`/pages/ucenter/login-page/pwd-login/pwd-login`
。
访问登
录页面,但会被拦截器自动切换到“配置的第0项的登录方式对应的页面”,即账户登录
方式页面,路径:
`/pages/ucenter/login-page/pwd-login/pwd-login`
。
-
生效策略:未列举到的或设备环境不支持的登
陆
方式将被隐藏。
-
生效策略:未列举到的或设备环境不支持的登
录
方式将被隐藏。
-
配置:
+
服务端:uni-starter服务端使用
[
uni-config-center
](
https://ext.dcloud.net.cn/plugin?id=4425
)
统一管理这些配置,详情下文
[
目录结构
](
#id=catalogue
)
+
应用模块:
`manifest.json`
App模块配置 --> OAuth(登录鉴权)--> 勾选并配置你所需要的模块
...
...
@@ -193,16 +193,16 @@ img{
```
onLaunch生命周期执行了
1.
全局监听clientDB的err事件,
-
判断是否为token过期失效等需要重新登
陆的问题。自动跳转到登陆
页面
-
检测本地的token是否有效(存在且并未过期)否则跳转到登
陆
页面
2.
预登
陆
一键登录功能
-
判断是否为token过期失效等需要重新登
录的问题。自动跳转到登录
页面
-
检测本地的token是否有效(存在且并未过期)否则跳转到登
录
页面
2.
预登
录
一键登录功能
3.
执行了initApp()包含以下操作
1.
读取uni-starter.config并挂载到globalData的config下
2.
读取应用版本号,并存到globalData下
3.
检查是否有可更新的应用版本,决定是否启动在线更新版本
4.
监听设备的网络变化并以uni.showToast APi的方式提醒用户
5.
使用
[
拦截器
](
https://uniapp.dcloud.io/api/interceptor?id=addinterceptor
)
实现
-
页面路由拦截,配置需强制登
陆的页面;打开时检测,如果token无效就自动跳转到登陆
页
-
页面路由拦截,配置需强制登
录的页面;打开时检测,如果token无效就自动跳转到登录
页
-
优雅实现:自动引导打开
`选择图片`
所需要的权限。当调用
`uni.chooseImage`
时检测到无权限自动开启引导。并不是在每次调用接口时处理这类问题,你可以参考该例子做更多该类场景的处理。uni-starter也会持续完善
## 快速体验部署流程
...
...
@@ -248,7 +248,7 @@ module.exports = {
}
},
"router": {
//配置需要路由拦截的页面地址,在打开这些页面之前会自动检查(无需联网)uni_id_token的值,如果token无效就自动跳转到登
陆
页
//配置需要路由拦截的页面地址,在打开这些页面之前会自动检查(无需联网)uni_id_token的值,如果token无效就自动跳转到登
录
页
"needLogin": [
"/pages/ucenter/userinfo/userinfo",
"/uni_modules/uni-news-favorite/pages/uni-news-favorite/list",
...
...
@@ -256,8 +256,8 @@ module.exports = {
],
"login": ["smsCode","univerify", "username", "weixin", "apple"],
/*
这里会根据数组的第0项,决定登
陆方式的第一优先级是哪种登陆
方式。
所有你希望拥有的登
陆方式这里都需要一一列举,未列举到的或设备环境不支持的登陆
方式将被隐藏。
这里会根据数组的第0项,决定登
录方式的第一优先级是哪种登录
方式。
所有你希望拥有的登
录方式这里都需要一一列举,未列举到的或设备环境不支持的登录
方式将被隐藏。
如果你需要在不同平台有不同的配置,直接用条件编译即可。
*/
},
...
...
@@ -301,7 +301,7 @@ uni-starter
│ │ | ├─uni-config-center uni-starter的服务端配置中心,项目所有云函数的配置在这里填写
<a
target=
"_blank"
href=
"https://ext.dcloud.net.cn/plugin?id=4425"
>
详情
</a>
│ │ | | ├─index.js config-center入口文件
│ │ | | └─uni-id uni-id模块配置目录
│ │ | | ├─config.json uni-id对应的配置数据:微信登
陆、一键登录、短信验证码登陆
等key都在这里填写
<a
target=
"_blank"
href=
"https://ext.dcloud.net.cn/plugin?id=4425"
>
详情
</a>
│ │ | | ├─config.json uni-id对应的配置数据:微信登
录、一键登录、短信验证码登录
等key都在这里填写
<a
target=
"_blank"
href=
"https://ext.dcloud.net.cn/plugin?id=4425"
>
详情
</a>
│ │ | | └─file.cert uni-id依赖的配置文件,假如你使用微信发红包功能,需要的证书文件就是放到这里
│ | | └───uni-id uni-id用户体系
<a
target=
"_blank"
href=
"https://uniapp.dcloud.io/uniCloud/uni-id"
>
详情
</a>
│ | ├─uni-analyse-searchhot 云端一体搜索模板依赖的云函数
<a
target=
"_blank"
href=
"https://ext.dcloud.net.cn/plugin?id=3851"
>
详情
</a>
...
...
@@ -318,7 +318,7 @@ uni-starter
│ ├─opendb-search-hot.schema.json 热门搜索表,表结构文件
│ ├─opendb-search-log.schema.json 搜索记录表,表结构文件
│ ├─opendb-verify-codes.schema.json 验证码表,表结构文件
│ ├─uni-id-log.schema.json 登
陆
日志表,表结构文件
│ ├─uni-id-log.schema.json 登
录
日志表,表结构文件
│ ├─uni-id-scores.schema.json 用户积分表,表结构文件
│ └─uni-id-users.schema.json 用户表,表结构文件
├─pages 业务页面文件存放的目录
...
...
@@ -335,14 +335,14 @@ uni-starter
│ ├─ucenter
│ │ ├─about 关于我们
│ │ │ └─about
│ │ ├─login-page 登
陆
模块
│ | | ├─common 登
陆
模块公共库
│ │ ├─login-page 登
录
模块
│ | | ├─common 登
录
模块公共库
│ │ │ │ ├─login-page.css 公共样式库
│ │ │ │ ├─login-page.mixin.js 公共mixin
│ │ │ │ └─loginSuccess.js 公共登
陆
成功后操作
│ | | ├─index 短信验证码登
陆
,手机号码输入页面
│ | | ├─phone-code 短信验证码登
陆
,验证码输入页面
│ | | ├─pwd-login 账户密码登
陆
│ │ │ │ └─loginSuccess.js 公共登
录
成功后操作
│ | | ├─index 短信验证码登
录
,手机号码输入页面
│ | | ├─phone-code 短信验证码登
录
,验证码输入页面
│ | | ├─pwd-login 账户密码登
录
│ | | ├─pwd-retrieve 密码重置
│ │ │ └─register 注册账户模块
│ │ │ ├─validator.js
...
...
@@ -381,8 +381,8 @@ uni-starter
### 注意事项
1.
真机运行需要制作自定义基座,制作后选择运行到自定义基座
2.
苹果登
陆
的图标,需要满足苹果应用市场的审核规范请勿随便修改;如需修改请先阅读:
[
Human Interface Guidelines
](
https://developer.apple.com/design/human-interface-guidelines/sign-in-with-apple/overview/buttons/
)
3.
应用登
陆
功能,默认不勾选同意隐私权限是响应安卓应用市场的规范;请勿修改该逻辑。
2.
苹果登
录
的图标,需要满足苹果应用市场的审核规范请勿随便修改;如需修改请先阅读:
[
Human Interface Guidelines
](
https://developer.apple.com/design/human-interface-guidelines/sign-in-with-apple/overview/buttons/
)
3.
应用登
录
功能,默认不勾选同意隐私权限是响应安卓应用市场的规范;请勿修改该逻辑。
### FAQ:常见问题
1.
提示“公共模块uni-id缺少配置信息”解决方案:在cloudfunctions右键‘上传所有云函数、公共模块及actions’之后,需要在cloudfunctions -> common -> uni-config-center 目录单独上传一次,右键‘上传公共模块’。
...
...
common/appInit.js
浏览文件 @
70eb1e1e
...
...
@@ -18,7 +18,7 @@ export default function() {
这里应用了[拦截器](https://uniapp.dcloud.io/api/interceptor?id=addinterceptor)实现了,路由拦截。当应用无访问摄像头/相册权限,引导跳到设置界面
*/
//自定义路由拦截
const
{
"
router
"
:
{
needLogin
,
login
}
}
=
uniStarterConfig
//需要登
陆
的页面
const
{
"
router
"
:
{
needLogin
,
login
}
}
=
uniStarterConfig
//需要登
录
的页面
let
list
=
[
"
navigateTo
"
,
"
redirectTo
"
,
"
reLaunch
"
,
"
switchTab
"
];
list
.
forEach
(
item
=>
{
//用遍历的方式分别为,uni.navigateTo,uni.redirectTo,uni.reLaunch,uni.switchTab这4个路由方法添加拦截器
uni
.
addInterceptor
(
item
,
{
...
...
@@ -27,9 +27,9 @@ export default function() {
const
token
=
uni
.
getStorageSync
(
'
uni_id_token
'
)
//获取当前页面路径(即url去掉"?"和"?"后的参数)
const
url
=
e
.
url
.
split
(
'
?
'
)[
0
]
//控制登
陆
优先级
//控制登
录
优先级
if
(
url
==
'
/pages/ucenter/login-page/index/index
'
)
{
//一键登录(univerify)、账号(username)、验证码登
陆
(短信smsCode)
//一键登录(univerify)、账号(username)、验证码登
录
(短信smsCode)
if
(
login
[
0
]
==
'
univerify
'
)
{
if
(
e
.
url
==
url
)
{
e
.
url
+=
'
?
'
}
//添加参数之前判断是否带了`?`号如果没有就补上,因为当开发场景本身有参数的情况下是已经带了`?`号
e
.
url
+=
"
univerify_first=true
"
...
...
@@ -37,7 +37,7 @@ export default function() {
e
.
url
=
"
/pages/ucenter/login-page/pwd-login/pwd-login
"
}
}
else
{
//拦截强制登
陆
页面
//拦截强制登
录
页面
if
(
needLogin
.
includes
(
url
)
&&
token
==
''
)
{
uni
.
showToast
({
title
:
'
请先登录
'
,
...
...
components/uni-quick-login/uni-quick-login.vue
浏览文件 @
70eb1e1e
...
...
@@ -12,7 +12,7 @@
mapGetters
,
mapMutations
}
from
'
vuex
'
;
//前一个窗口的页面地址。控制点击切换快捷登
陆
方式是创建还是返回
//前一个窗口的页面地址。控制点击切换快捷登
录
方式是创建还是返回
import
loginSuccess
from
'
@/pages/ucenter/login-page/common/loginSuccess.js
'
;
export
default
{
computed
:
{
...
...
@@ -24,7 +24,7 @@
return
{
servicesList
:
[{
"
id
"
:
"
username
"
,
"
text
"
:
"
账号登
陆
"
,
"
text
"
:
"
账号登
录
"
,
"
logo
"
:
"
/static/uni-quick-login/user.png
"
,
"
path
"
:
"
/pages/ucenter/login-page/pwd-login/pwd-login
"
},
...
...
@@ -50,34 +50,34 @@
default
()
{
return
{
"
weixin
"
:
{
"
text
"
:
"
微信登
陆
"
,
"
text
"
:
"
微信登
录
"
,
"
logo
"
:
"
/static/uni-quick-login/wechat.png
"
,
"
isChecked
"
:
true
},
"
apple
"
:
{
"
text
"
:
"
苹果登
陆
"
,
"
text
"
:
"
苹果登
录
"
,
"
logo
"
:
"
/static/uni-quick-login/apple.png
"
,
"
isChecked
"
:
true
},
"
univerify
"
:
{
"
text
"
:
"
一键登
陆
"
,
"
text
"
:
"
一键登
录
"
,
"
logo
"
:
"
/static/uni-quick-login/univerify.png
"
,
"
isChecked
"
:
true
},
"
qq
"
:
{
"
text
"
:
"
QQ登
陆
"
,
"
text
"
:
"
QQ登
录
"
,
"
logo
"
:
"
/static/uni-quick-login/univerify.png
"
,
"
isChecked
"
:
false
//暂未提供该登
陆
方式的接口示例
"
isChecked
"
:
false
//暂未提供该登
录
方式的接口示例
},
"
xiaomi
"
:
{
"
text
"
:
"
小米登
陆
"
,
"
text
"
:
"
小米登
录
"
,
"
logo
"
:
"
/static/uni-quick-login/univerify.png
"
,
"
isChecked
"
:
false
//暂未提供该登
陆
方式的接口示例
"
isChecked
"
:
false
//暂未提供该登
录
方式的接口示例
},
"
sinaweibo
"
:
{
"
text
"
:
"
微博登录
"
,
"
logo
"
:
"
/static/uni-quick-login/univerify.png
"
,
"
isChecked
"
:
false
//暂未提供该登
陆
方式的接口示例
"
isChecked
"
:
false
//暂未提供该登
录
方式的接口示例
}
}
}
...
...
@@ -85,7 +85,7 @@
univerifyStyle
:
{
type
:
Object
,
default
()
{
return
{
//一键登
陆
弹出窗的样式配置参数
return
{
//一键登
录
弹出窗的样式配置参数
"
fullScreen
"
:
true
,
// 是否全屏显示,true表示全屏模式,false表示非全屏模式,默认值为false。
"
backgroundColor
"
:
"
#ffffff
"
,
// 授权页面背景颜色,默认值:#ffffff
}
...
...
@@ -96,7 +96,7 @@
console
.
log
(
'
loginConfig
'
,
this
.
loginConfig
);
console
.
log
(
'
this.getRoute(1)
'
,
this
.
getRoute
(
1
));
let
servicesList
=
this
.
servicesList
//去掉当前页面对应的登
陆
选项
//去掉当前页面对应的登
录
选项
for
(
var
i
=
0
;
i
<
servicesList
.
length
;
i
++
)
{
if
(
servicesList
[
i
].
path
==
this
.
getRoute
(
1
))
{
servicesList
.
splice
(
i
,
1
)
...
...
@@ -112,7 +112,7 @@
console
.
log
(
'
servicesList
'
,
servicesList
);
},
mounted
()
{
//获取当前环境能用的快捷登
陆
方式
//获取当前环境能用的快捷登
录
方式
// #ifdef APP-PLUS
plus
.
oauth
.
getServices
(
oauthServices
=>
{
this
.
oauthServices
=
oauthServices
...
...
@@ -170,7 +170,7 @@
})
}
},
login_before
(
type
,
navigateBack
=
true
)
{
login_before
(
type
,
navigateBack
=
true
)
{
if
(
!
this
.
agree
){
return
uni
.
showToast
({
title
:
'
你未同意隐私政策协议
'
,
...
...
@@ -183,7 +183,7 @@
// console.log(type);
// #ifdef APP-PLUS
//请勿直接使用前端获取的unionid或openid直接用于登
陆
,前端的数据都是不可靠的
//请勿直接使用前端获取的unionid或openid直接用于登
录
,前端的数据都是不可靠的
if
(
type
==
'
weixin
'
)
{
return
oauthService
.
authorize
(({
code
...
...
@@ -211,12 +211,12 @@
if
(
type
==
'
apple
'
)
{
let
res
=
await
this
.
getUserInfo
({
provider
:
"
apple
"
})
})
uni
.
hideLoading
()
Object
.
assign
(
e
.
authResult
,
res
.
userInfo
)
}
// #ifdef MP-WEIXIN
if
(
type
==
'
weixin
'
)
{
if
(
type
==
'
weixin
'
)
{
return
this
.
login
({
code
:
e
.
code
},
type
)
...
...
@@ -231,23 +231,23 @@
if
(
type
==
'
univerify
'
)
{
if
(
err
.
metadata
.
error_data
)
{
uni
.
showToast
({
title
:
"
一键登
陆
:
"
+
err
.
metadata
.
error_data
,
title
:
"
一键登
录
:
"
+
err
.
metadata
.
error_data
,
icon
:
'
none
'
});
}
switch
(
err
.
errCode
)
{
case
30002
:
console
.
log
(
'
在一键登
陆界面,点击其他登陆
方式
'
);
console
.
log
(
'
在一键登
录界面,点击其他登录
方式
'
);
break
;
case
30003
:
console
.
log
(
'
关闭了登
陆
'
);
console
.
log
(
'
关闭了登
录
'
);
if
(
navigateBack
)
{
uni
.
navigateBack
()
}
break
;
case
30006
:
uni
.
showModal
({
title
:
"
登
陆
服务初始化错误
"
,
title
:
"
登
录
服务初始化错误
"
,
content
:
err
.
metadata
.
error_data
,
showCancel
:
false
,
confirmText
:
'
知道了
'
,
...
...
@@ -260,7 +260,7 @@
}
})
},
login
(
params
,
type
)
{
//联网验证登
陆
login
(
params
,
type
)
{
//联网验证登
录
console
.
log
({
params
,
type
...
...
js_sdk/request.js
浏览文件 @
70eb1e1e
...
...
@@ -3,7 +3,7 @@
2.load自动显示与关闭
3.统一路由拦截
3.1 读取云端接口权限配置,先验证本地token再访问
3.2 处理因token过期等问题自动更新本地token,或token无效跳转至登
陆
页面
3.2 处理因token过期等问题自动更新本地token,或token无效跳转至登
录
页面
*/
const
debug
=
true
;
//开启后,会alert错误信息
export
default
function
request
(
name
,
params
,
callback
=
false
,{
showLoading
=
false
,
loadText
=
''
,
fail
=
()
=>
{}}
=
{}){
...
...
pages/list/detail.vue
浏览文件 @
70eb1e1e
...
...
@@ -133,7 +133,7 @@
},
setFavorite
()
{
if
(
!
this
.
hasLogin
){
return
console
.
log
(
'
未登
陆
用户
'
);
return
console
.
log
(
'
未登
录
用户
'
);
}
let
article_id
=
this
.
id
,
last_time
=
Date
.
now
();
...
...
pages/ucenter/login-page/common/loginSuccess.js
浏览文件 @
70eb1e1e
export
default
function
(
result
){
uni
.
showToast
({
title
:
'
登
陆
成功
'
,
title
:
'
登
录
成功
'
,
icon
:
'
none
'
});
console
.
log
(
'
登
陆
成功
'
,
result
);
console
.
log
(
'
登
录
成功
'
,
result
);
uni
.
setStorageSync
(
'
uni_id_uid
'
,
result
.
uid
)
uni
.
setStorageSync
(
'
uni_id_token
'
,
result
.
token
)
uni
.
setStorageSync
(
'
uni_id_token_expired
'
,
result
.
tokenExpired
)
...
...
pages/ucenter/login-page/index/index.vue
浏览文件 @
70eb1e1e
<
template
>
<view
class=
"content"
>
<!-- 顶部文字 -->
<text
class=
"title"
>
登
陆
后即可展示自己
</text>
<text
class=
"title"
>
登
录
后即可展示自己
</text>
<uni-agreements
@
setAgree=
"agree = $event"
></uni-agreements>
<!-- 登录框 -->
<input
type=
"number"
class=
"input-box"
:inputBorder=
"false"
v-model=
"phone"
maxlength=
"11"
placeholder=
"请输入手机号"
/>
...
...
@@ -14,7 +14,7 @@
</
template
>
<
script
>
var
univerify_first
,
currentWebview
;
//是否一键登
陆
优先
var
univerify_first
,
currentWebview
;
//是否一键登
录
优先
export
default
{
data
()
{
return
{
...
...
@@ -28,7 +28,7 @@ var univerify_first,currentWebview;//是否一键登陆优先
}
},
onLoad
(
e
)
{
//是否优先启动一键登
陆
。即:页面一加载就启动一键登录
//是否优先启动一键登
录
。即:页面一加载就启动一键登录
univerify_first
=
e
.
univerify_first
//#ifdef APP-PLUS
if
(
univerify_first
){
...
...
@@ -43,7 +43,7 @@ var univerify_first,currentWebview;//是否一键登陆优先
onReady
()
{
//#ifdef APP-PLUS
if
(
univerify_first
){
console
.
log
(
'
开始一键登
陆
'
);
console
.
log
(
'
开始一键登
录
'
);
setTimeout
(()
=>
{
this
.
$refs
.
uniQuickLogin
.
login
(
'
univerify
'
)
},
100
)
...
...
pages/ucenter/login-page/register/register.vue
浏览文件 @
70eb1e1e
...
...
@@ -12,24 +12,24 @@
</uni-forms-item>
<uni-forms-item
name=
"pwd2"
v-model=
"formData.pwd2"
required
>
<uni-easyinput
:inputBorder=
"false"
class=
"easyinput"
placeholder=
"再次输入密码"
type=
"password"
v-model=
"formData.pwd2"
trim=
"both"
/>
</uni-forms-item>
<uni-agreements></uni-agreements>
<button
class=
"send-btn"
type=
"primary"
@
click=
"submit"
>
注册并登
陆
</button>
</uni-forms-item>
<uni-agreements></uni-agreements>
<button
class=
"send-btn"
type=
"primary"
@
click=
"submit"
>
注册并登
录
</button>
</uni-forms>
</view>
</
template
>
<
script
>
import
rules
from
'
./validator.js
'
;
<
script
>
import
rules
from
'
./validator.js
'
;
import
mixin
from
'
../common/login-page.mixin.js
'
;
export
default
{
export
default
{
mixins
:[
mixin
],
data
()
{
return
{
formData
:
{
"
username
"
:
""
,
"
nickname
"
:
""
,
'
password
'
:
''
,
"
nickname
"
:
""
,
'
password
'
:
''
,
'
pwd2
'
:
''
},
rules
...
...
@@ -42,11 +42,11 @@ import mixin from '../common/login-page.mixin.js';
/**
* 触发表单提交
*/
submit
()
{
submit
()
{
uni
.
showLoading
({
mask
:
true
})
this
.
$refs
.
form
.
submit
().
then
((
res
)
=>
{
this
.
$refs
.
form
.
submit
().
then
((
res
)
=>
{
this
.
submitForm
(
res
)
}).
catch
((
errors
)
=>
{
console
.
log
(
errors
);
...
...
@@ -56,23 +56,23 @@ import mixin from '../common/login-page.mixin.js';
})
},
submitForm
(
value
)
{
this
.
request
(
'
user-center/register
'
,
value
,
result
=>
{
console
.
log
(
result
);
if
(
result
.
code
===
0
){
this
.
loginSuccess
(
result
)
}
this
.
request
(
'
user-center/register
'
,
value
,
result
=>
{
console
.
log
(
result
);
if
(
result
.
code
===
0
){
this
.
loginSuccess
(
result
)
}
})
}
}
}
</
script
>
<
style
>
<
style
>
@import
url("../common/login-page.css")
;
.uni-container
{
padding
:
15px
;
}
.send-btn
{
margin-top
:
5px
;
}
</
style
>
.send-btn
{
margin-top
:
5px
;
}
</
style
>
pages/ucenter/settings/settings.vue
浏览文件 @
70eb1e1e
<
template
>
<view
class=
"content"
>
<!-- 功能列表 -->
<uni-list
class=
"mt10"
:border=
"false"
>
<uni-list
class=
"mt10"
:border=
"false"
>
<uni-list-item
title=
"个人资料"
to=
"/pages/ucenter/userinfo/userinfo"
link=
"navigateTo"
></uni-list-item>
<uni-list-item
v-if=
"userInfo.mobile"
title=
"修改密码"
:to=
"'/pages/ucenter/login-page/pwd-retrieve/pwd-retrieve?phoneNumber='+ userInfo.mobile"
link=
"navigateTo"
></uni-list-item>
</uni-list>
<!-- #ifndef H5 -->
</uni-list>
<!-- #ifndef H5 -->
<uni-list
class=
"mt10"
:border=
"false"
>
<!-- #ifdef APP-PLUS -->
<!-- 检查push过程未结束不显示,push设置项 -->
<uni-list-item
title=
"清理缓存"
@
click=
"clearTmp"
link
></uni-list-item>
<uni-list-item
title=
"清理缓存"
@
click=
"clearTmp"
link
></uni-list-item>
<uni-list-item
v-if=
"pushIsOn != 'wait'"
@
click.native=
"pushIsOn?pushServer.off():pushServer.on()"
title=
"推送功能"
showSwitch
:switchChecked=
"pushIsOn"
></uni-list-item>
<!-- #endif -->
<uni-list-item
v-if=
"supportMode.includes('fingerPrint')"
title=
"指纹解锁"
@
click.native=
"startSoterAuthentication('fingerPrint')"
link
></uni-list-item>
<uni-list-item
v-if=
"supportMode.includes('facial')"
title=
"人脸解锁"
@
click=
"startSoterAuthentication('facial')"
link
></uni-list-item>
</uni-list>
</uni-list>
<!-- #endif -->
<!-- 退出/登
陆
按钮 -->
<!-- 退出/登
录
按钮 -->
<view
class=
"bottom-back"
@
click=
"clickLogout"
>
<text
class=
"bottom-back-text"
v-if=
"hasLogin"
>
退出登录
</text>
<text
class=
"bottom-back-text"
v-else
>
登录
</text>
...
...
@@ -33,7 +33,7 @@
}
from
'
vuex
'
;
export
default
{
data
()
{
return
{
return
{
pushServer
:
pushServer
,
supportMode
:[],
pushIsOn
:
"
wait
"
...
...
@@ -87,22 +87,22 @@
/**
* 开始生物认证
*/
startSoterAuthentication
(
checkAuthMode
)
{
startSoterAuthentication
(
checkAuthMode
)
{
console
.
log
(
checkAuthMode
);
let
title
=
{
"
fingerPrint
"
:
"
指纹解锁
"
,
"
facial
"
:
"
人脸解锁
"
}[
checkAuthMode
]
// 检查是否开启认证
this
.
checkIsSoterEnrolledInDevice
({
checkAuthMode
,
title
})
.
then
(()
=>
{
.
then
(()
=>
{
console
.
log
(
checkAuthMode
,
title
);
// 开始认证
uni
.
startSoterAuthentication
({
requestAuthModes
:
[
checkAuthMode
],
challenge
:
'
123456
'
,
// 微信端挑战因子
authContent
:
`请用
${
title
}
`
,
complete
:
(
res
)
=>
{
console
.
log
(
res
);
authContent
:
`请用
${
title
}
`
,
complete
:
(
res
)
=>
{
console
.
log
(
res
);
},
success
:
(
res
)
=>
{
success
:
(
res
)
=>
{
console
.
log
(
res
);
if
(
res
.
errCode
==
0
)
{
/**
...
...
@@ -122,7 +122,7 @@
icon
:
'
none
'
});
},
fail
:
(
err
)
=>
{
fail
:
(
err
)
=>
{
console
.
log
(
err
);
console
.
log
(
`认证失败:
${
err
.
errCode
}
`
);
uni
.
showToast
({
...
...
@@ -137,7 +137,7 @@
return
new
Promise
((
resolve
,
reject
)
=>
{
uni
.
checkIsSoterEnrolledInDevice
({
checkAuthMode
,
success
:
(
res
)
=>
{
success
:
(
res
)
=>
{
console
.
log
(
res
);
if
(
res
.
isEnrolled
)
{
return
resolve
(
res
);
...
...
@@ -148,7 +148,7 @@
});
reject
(
res
);
},
fail
:
(
err
)
=>
{
fail
:
(
err
)
=>
{
console
.
log
(
err
);
uni
.
showToast
({
title
:
`
${
title
}
失败`
,
...
...
store/modules/user.js
浏览文件 @
70eb1e1e
...
...
@@ -2,7 +2,7 @@
let
userInfoHistory
=
uni
.
getStorageSync
(
'
userInfo
'
)
||
{};
let
state
=
{
//是否已经登
陆
//是否已经登
录
hasLogin
:
Boolean
(
Object
.
keys
(
userInfoHistory
).
length
),
//用户信息
info
:
userInfoHistory
...
...
@@ -16,11 +16,11 @@ let state = {
}
},
mutations
=
{
login
(
state
,
info
)
{
//登
陆
成功后的操作
login
(
state
,
info
)
{
//登
录
成功后的操作
//原有的结合传来的参数
let
_info
=
state
.
info
;
state
.
info
=
Object
.
assign
({},
_info
,
info
);
//设置为已经登
陆
//设置为已经登
录
state
.
hasLogin
=
true
;
//存储最新的用户数据到本地持久化存储
uni
.
setStorageSync
(
'
userInfo
'
,
state
.
info
);
...
...
uni-starter.config.js
浏览文件 @
70eb1e1e
...
...
@@ -28,7 +28,7 @@ module.exports = {
],
"
login
"
:
[
"
smsCode
"
,
"
univerify
"
,
"
username
"
,
"
weixin
"
,
"
apple
"
],
/*
根据数组的第0项,决定登
陆
方式的第一优先级。
根据数组的第0项,决定登
录
方式的第一优先级。
未列举到的,或设备环境不支持的选项,将被隐藏。
如果你需要在不同平台有不同的配置,直接用条件编译即可
*/
...
...
uniCloud-aliyun/cloudfunctions/user-center/index.js
浏览文件 @
70eb1e1e
...
...
@@ -18,9 +18,9 @@ exports.main = async (event, context) => {
console
.
log
(
'
event :
'
+
JSON
.
stringify
(
event
))
let
params
=
event
.
params
||
{}
//防止黑客恶意破解登
陆,连续登陆
失败一定次数后,需要用户提供验证码
//防止黑客恶意破解登
录,连续登录
失败一定次数后,需要用户提供验证码
const
getNeedCaptcha
=
async
()
=>
{
//当用户最近“2小时内(recordDate)”登
陆
失败达到2次(recordSize)时。要求用户提交验证码
//当用户最近“2小时内(recordDate)”登
录
失败达到2次(recordSize)时。要求用户提交验证码
const
now
=
Date
.
now
(),
recordDate
=
120
*
60
*
1000
,
recordSize
=
2
;
...
...
@@ -36,7 +36,7 @@ exports.main = async (event, context) => {
return
recentRecord
.
data
.
filter
(
item
=>
item
.
state
===
0
).
length
===
recordSize
;
}
//设置某些模块不需要token(也就是登
陆
成功后)才能操作,如果需要token就获取当前操作账户的uid
//设置某些模块不需要token(也就是登
录
成功后)才能操作,如果需要token就获取当前操作账户的uid
let
noCheckAction
=
[
'
register
'
,
'
checkToken
'
,
'
login
'
,
'
logout
'
,
'
sendSmsCode
'
,
'
createCaptcha
'
,
'
verifyCaptcha
'
,
'
refreshCaptcha
'
,
'
inviteLogin
'
,
...
...
@@ -69,7 +69,7 @@ exports.main = async (event, context) => {
create_date
:
Date
.
now
()
})
}
//记录成功登
陆
的日志
//记录成功登
录
的日志
const
loginLog
=
async
(
res
=
{},
type
=
'
login
'
)
=>
{
const
now
=
Date
.
now
()
const
uniIdLogCollection
=
db
.
collection
(
'
uni-id-log
'
)
...
...
uni_modules/uni-captcha/readme.md
浏览文件 @
70eb1e1e
...
...
@@ -2,7 +2,7 @@
> 用途:主要使用在登录、需要人机校验或其他限制调用的场景
> 验证码生成、校验都在服务端。页面使用返回的 base64 显示。[云端一体登
陆
模板](https://ext.dcloud.net.cn/plugin?id=13)已集成,可下载体验。
> 验证码生成、校验都在服务端。页面使用返回的 base64 显示。[云端一体登
录
模板](https://ext.dcloud.net.cn/plugin?id=13)已集成,可下载体验。
> 数据表使用[opendb-verify-codes](https://gitee.com/dcloud/opendb/blob/master/collection/opendb-verify-codes/collection.json)
...
...
uni_modules/uni-list-detail/db_init.json
浏览文件 @
70eb1e1e
...
...
@@ -7,7 +7,7 @@
"user_name"
:
"未来汽车日报"
,
"category_id"
:
"223"
,
"title"
:
"干货:自由职业者如何搞定五险一金?"
,
"content"
:
"<p>编者按:本文来自微信公众号<a href=
\"
https://mp.weixin.qq.com/s/ahOP6VxdxWfxG70KBgh2JA
\"
>“土土土槽”(ID:xtutux6)</a>,作者:林安,36氪经授权发布。</p><p>大家好,我是林安。今天想跟你们聊一聊自由职业者的五险一金问题。</p><p>因为这个是想做自由职业的朋友问我最多的问题,也是自由职业初期必须思考的问题,所以今天就展开给大家讲讲。</p><p>在成为自由职业者以前,我没有任何一次裸辞经历,基本都是找好下家才跳槽,所以你应该看得出来,我不是一名“冲动型”选手,做任何决定前一定会三思后行。</p><p>所以产生了辞职想法后,我着手准备的第一件事,就是“搞清楚社保和公积金怎么交”,“断交或不交会对我的生活产生哪些影响”。</p><p>这些也是想做自由职业的朋友问我最多的问题。下面我就结合自己的实际情况,分4部分给大家讲讲。</p><p><img style=
\"
max-width:100%
\"
src=
\"
https://img.36krcdn.com/20200410/v2_823646324f724d8b9dae3ae9d06a7d1a_img_000
\"
data-img-size-val=
\"
720,480
\"
/></p><h2 > 一、自由职业后,还有必要交五险一金吗?</h2><p>其实五险一金中最重要的是“养老险”和“医疗险”。</p><p>一般社保交满15年后养老保险终身有效,养老金也是“多缴多得、长缴多得”;</p><p>社保交满25年后,医疗保险终身有效,看病时医保可以报销一部分费用。</p><p>关于“五险一金”交或不交,要根据不同人的不同情况来看。</p><p>如果你在户口所在地的城市工作,且在本地已有房,那么交不交、交多少完全看你需求。</p><p>如果你已经购买了性价比更高的商业保险,并且没有在本地再买房的打算,那你可以不交五险一金。</p><p>当然,如果你还是想买一份国民保险,图个安心,或者害怕以后办理一些事情被社保拖住(毕竟不同城市的政策也是经常变动),也可以自己在当地的社保局缴纳。</p><p>但如果你是外地户口且没有当地房产,将来又想在所在地买房落户,那我建议你最好继续缴纳五险,因为社保和大部分城市的落户买房政策挂钩,交不满年限,就无法买房落户。</p><p>而且五险中除了养老保险可以断交之外,其他一旦停交则不能补缴,需要重新开始再次缴纳。</p><p>我当初就是考虑到应该会在上海定居,才决定继续在上海缴纳五险的。</p><p>至于公积金,如果你近1年内没有买房需求,可以暂时不缴,等到你决定买房了,再开始重新缴纳也不迟。</p><p>停缴的公积金账户会暂时封存,等你重新交的时候,再去公积金中心解封就可以了。</p><p>但如果你没有在所在地定居的打算,比如很多朋友想年轻的时候在一线城市工作生活,等年纪大了或结婚成家了再退居二三线城市工作,这种情况其实可以不在当地缴纳社保,在户籍所在地缴纳或者给自己买一份商业保险也是OK的。</p><p><img style=
\"
max-width:100%
\"
src=
\"
https://img.36krcdn.com/20200410/v2_c46a9fc0cc444f118738fe09727de874_img_000
\"
data-img-size-val=
\"
720,480
\"
/></p><h2 > 二、不交五险一金会有什么影响?</h2><p>公积金断交只对已经存在公积金贷款者或者准备申请公积金贷款者存在影响,其他则无直接影响。</p><p>如果你还有房贷要还却断交公积金,那么剩余的贷款就会按照商业利率来计算了。</p><p>社保断交的影响主要有2点:</p><h3 >1.影响医疗报销和报销上限</h3><p>很多城市社保只要断缴一个月,第二月就不能继续使用了。</p><p>而且有的城市政策是连续缴纳社保的时间越久,报销上限就越高。这个具体看不同城市的政策,你们可以自行上网查一下。</p><h3 >2.影响买房买车、积分落户、孩子上学</h3><p>部分热门城市要求社保交够一定年份,才可以买房买车。</p><p>还有的一线城市会把社保缴纳的额度和积分落户、孩子上学捆绑在一起,比如北上广深。</p><p>我所在的上海,就是连续缴纳5年社保才有资格买房买车,交满7年,才有资格申请落户。</p><p><img style=
\"
max-width:100%
\"
src=
\"
https://img.36krcdn.com/20200410/v2_6f15c618ffda491bba453443419de4b8_img_000
\"
data-img-size-val=
\"
720,521
\"
/></p><h2 > 三、自由职业者如何缴纳五险一金?</h2><p>那么自由职业者应该如何缴纳五险一金呢?常见的方式有4种。</p><h3 >1.自己去社保局和公积金中心以灵活就业的方式缴纳</h3><p>这种只适合本地户籍的人,社保部分也只能缴纳养老保险和医疗保险。</p><p>你们可以根据自身的需求和具体状况,自由选择社保和公积金的缴费级别。</p><h3 >2.如果你是外地户籍,可以找第三方机构代缴</h3><p>通过这种方式缴纳的社保一般会像上班时一样把五险交齐,不同的是以前公司替员工缴纳的部分也要你自己承担。</p><p>现在网上类似的代理机构挺多的,支付宝、淘宝和小程序上有很多,一般每个月会收几十块的代理费。</p><p>记得一定要找正规、有名的机构,每次交完以后,也要登
陆
自己的账号查询是否有按时缴纳。</p><h3 >3.挂靠在朋友公司下缴纳</h3><p>如果你有朋友本身就是开公司的,可以把你的社保挂靠在他们公司下缴纳,这种比找机构省点钱,但是公司缴纳的部分金额也完全是你自己承担的。</p><h3 >4.开一家公司自行缴纳</h3><p>这种比较适合有稳定客户且业务量比较大的自由职业者,公司的用途除了可以帮你缴纳五险一金外,还可以给客户开正规发票。</p><p>但开一家公司又会面临很多税务上的问题,不太建议自由职业新人或收入不稳定的自由职业者开公司。具体原因我和自由税务师骆盈合开的课程里有详细讲到(传送门:<a href=
\"
http://mp.weixin.qq.com/s?__biz=MzA4MTYxNzMzNQ==&mid=2650502058&idx=1&sn=35885aa82b5555507197cf3b073daf1d&chksm=879d9b72b0ea12646260778c2b4720883703d9ecc29bc9363166c3a63ffcc2cee3064f8efe66&scene=21#wechat_redirect
\"
>不懂一点税务知识,你“敢”成为自由职业者吗?</a>)。</p><p><img style=
\"
max-width:100%
\"
src=
\"
https://img.36krcdn.com/20200410/v2_68e061036408488fbbe2bb8b6295d703_img_000
\"
data-img-size-val=
\"
720,480
\"
/></p><p>以上,就是不同类型自由职业者交五险一金的方式了。我目前的情况是挂靠在朋友公司下缴纳五险,公积金暂时断交了,等到要买房的时候再重新开始交。</p><p>大家可以根据自己的实际情况选择交或不交,以及缴纳方式和数额。</p>"
,
"content"
:
"<p>编者按:本文来自微信公众号<a href=
\"
https://mp.weixin.qq.com/s/ahOP6VxdxWfxG70KBgh2JA
\"
>“土土土槽”(ID:xtutux6)</a>,作者:林安,36氪经授权发布。</p><p>大家好,我是林安。今天想跟你们聊一聊自由职业者的五险一金问题。</p><p>因为这个是想做自由职业的朋友问我最多的问题,也是自由职业初期必须思考的问题,所以今天就展开给大家讲讲。</p><p>在成为自由职业者以前,我没有任何一次裸辞经历,基本都是找好下家才跳槽,所以你应该看得出来,我不是一名“冲动型”选手,做任何决定前一定会三思后行。</p><p>所以产生了辞职想法后,我着手准备的第一件事,就是“搞清楚社保和公积金怎么交”,“断交或不交会对我的生活产生哪些影响”。</p><p>这些也是想做自由职业的朋友问我最多的问题。下面我就结合自己的实际情况,分4部分给大家讲讲。</p><p><img style=
\"
max-width:100%
\"
src=
\"
https://img.36krcdn.com/20200410/v2_823646324f724d8b9dae3ae9d06a7d1a_img_000
\"
data-img-size-val=
\"
720,480
\"
/></p><h2 > 一、自由职业后,还有必要交五险一金吗?</h2><p>其实五险一金中最重要的是“养老险”和“医疗险”。</p><p>一般社保交满15年后养老保险终身有效,养老金也是“多缴多得、长缴多得”;</p><p>社保交满25年后,医疗保险终身有效,看病时医保可以报销一部分费用。</p><p>关于“五险一金”交或不交,要根据不同人的不同情况来看。</p><p>如果你在户口所在地的城市工作,且在本地已有房,那么交不交、交多少完全看你需求。</p><p>如果你已经购买了性价比更高的商业保险,并且没有在本地再买房的打算,那你可以不交五险一金。</p><p>当然,如果你还是想买一份国民保险,图个安心,或者害怕以后办理一些事情被社保拖住(毕竟不同城市的政策也是经常变动),也可以自己在当地的社保局缴纳。</p><p>但如果你是外地户口且没有当地房产,将来又想在所在地买房落户,那我建议你最好继续缴纳五险,因为社保和大部分城市的落户买房政策挂钩,交不满年限,就无法买房落户。</p><p>而且五险中除了养老保险可以断交之外,其他一旦停交则不能补缴,需要重新开始再次缴纳。</p><p>我当初就是考虑到应该会在上海定居,才决定继续在上海缴纳五险的。</p><p>至于公积金,如果你近1年内没有买房需求,可以暂时不缴,等到你决定买房了,再开始重新缴纳也不迟。</p><p>停缴的公积金账户会暂时封存,等你重新交的时候,再去公积金中心解封就可以了。</p><p>但如果你没有在所在地定居的打算,比如很多朋友想年轻的时候在一线城市工作生活,等年纪大了或结婚成家了再退居二三线城市工作,这种情况其实可以不在当地缴纳社保,在户籍所在地缴纳或者给自己买一份商业保险也是OK的。</p><p><img style=
\"
max-width:100%
\"
src=
\"
https://img.36krcdn.com/20200410/v2_c46a9fc0cc444f118738fe09727de874_img_000
\"
data-img-size-val=
\"
720,480
\"
/></p><h2 > 二、不交五险一金会有什么影响?</h2><p>公积金断交只对已经存在公积金贷款者或者准备申请公积金贷款者存在影响,其他则无直接影响。</p><p>如果你还有房贷要还却断交公积金,那么剩余的贷款就会按照商业利率来计算了。</p><p>社保断交的影响主要有2点:</p><h3 >1.影响医疗报销和报销上限</h3><p>很多城市社保只要断缴一个月,第二月就不能继续使用了。</p><p>而且有的城市政策是连续缴纳社保的时间越久,报销上限就越高。这个具体看不同城市的政策,你们可以自行上网查一下。</p><h3 >2.影响买房买车、积分落户、孩子上学</h3><p>部分热门城市要求社保交够一定年份,才可以买房买车。</p><p>还有的一线城市会把社保缴纳的额度和积分落户、孩子上学捆绑在一起,比如北上广深。</p><p>我所在的上海,就是连续缴纳5年社保才有资格买房买车,交满7年,才有资格申请落户。</p><p><img style=
\"
max-width:100%
\"
src=
\"
https://img.36krcdn.com/20200410/v2_6f15c618ffda491bba453443419de4b8_img_000
\"
data-img-size-val=
\"
720,521
\"
/></p><h2 > 三、自由职业者如何缴纳五险一金?</h2><p>那么自由职业者应该如何缴纳五险一金呢?常见的方式有4种。</p><h3 >1.自己去社保局和公积金中心以灵活就业的方式缴纳</h3><p>这种只适合本地户籍的人,社保部分也只能缴纳养老保险和医疗保险。</p><p>你们可以根据自身的需求和具体状况,自由选择社保和公积金的缴费级别。</p><h3 >2.如果你是外地户籍,可以找第三方机构代缴</h3><p>通过这种方式缴纳的社保一般会像上班时一样把五险交齐,不同的是以前公司替员工缴纳的部分也要你自己承担。</p><p>现在网上类似的代理机构挺多的,支付宝、淘宝和小程序上有很多,一般每个月会收几十块的代理费。</p><p>记得一定要找正规、有名的机构,每次交完以后,也要登
录
自己的账号查询是否有按时缴纳。</p><h3 >3.挂靠在朋友公司下缴纳</h3><p>如果你有朋友本身就是开公司的,可以把你的社保挂靠在他们公司下缴纳,这种比找机构省点钱,但是公司缴纳的部分金额也完全是你自己承担的。</p><h3 >4.开一家公司自行缴纳</h3><p>这种比较适合有稳定客户且业务量比较大的自由职业者,公司的用途除了可以帮你缴纳五险一金外,还可以给客户开正规发票。</p><p>但开一家公司又会面临很多税务上的问题,不太建议自由职业新人或收入不稳定的自由职业者开公司。具体原因我和自由税务师骆盈合开的课程里有详细讲到(传送门:<a href=
\"
http://mp.weixin.qq.com/s?__biz=MzA4MTYxNzMzNQ==&mid=2650502058&idx=1&sn=35885aa82b5555507197cf3b073daf1d&chksm=879d9b72b0ea12646260778c2b4720883703d9ecc29bc9363166c3a63ffcc2cee3064f8efe66&scene=21#wechat_redirect
\"
>不懂一点税务知识,你“敢”成为自由职业者吗?</a>)。</p><p><img style=
\"
max-width:100%
\"
src=
\"
https://img.36krcdn.com/20200410/v2_68e061036408488fbbe2bb8b6295d703_img_000
\"
data-img-size-val=
\"
720,480
\"
/></p><p>以上,就是不同类型自由职业者交五险一金的方式了。我目前的情况是挂靠在朋友公司下缴纳五险,公积金暂时断交了,等到要买房的时候再重新开始交。</p><p>大家可以根据自己的实际情况选择交或不交,以及缴纳方式和数额。</p>"
,
"excerpt"
:
"自由职业前,应该想清楚的问题。"
,
"article_status"
:
1
,
"view_count"
:
32053
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录