Commit 7e94ccdf by 李新

会籍服务

0 parents
Showing 182 changed files with 11409 additions and 0 deletions
> 1%
last 2 versions
not dead
[*.{js,jsx,ts,tsx,vue}]
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
insert_final_newline = true
VUE_APP_NODE_ENV="development"
VUE_APP_VERSION="0.0.1"
VUE_APP_API="http://www.baidu.com"
\ No newline at end of file \ No newline at end of file
VUE_APP_NODE_ENV="development"
VUE_APP_VERSION="0.0.1"
VUE_APP_API="http://www.baidu.com"
\ No newline at end of file \ No newline at end of file
VUE_APP_NODE_ENV="production"
VUE_APP_VERSION="0.0.1"
VUE_APP_API="http://www.baidu.com"
\ No newline at end of file \ No newline at end of file
VUE_APP_NODE_ENV="test"
VUE_APP_VERSION="0.0.1"
VUE_APP_API="http://www.baidu.com"
\ No newline at end of file \ No newline at end of file
module.exports = {
root: true,
env: {
node: true
},
extends: [
'plugin:vue/essential',
'@vue/standard'
],
parserOptions: {
parser: 'babel-eslint'
},
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'arrow-parens': 0, // allow paren-less arrow functions
'generator-star-spacing': 0, // allow async-await
"no-unused-vars": [1, {
"vars": "local", //允许声明未使用变量
"args": "none" //参数不检查
}],
"semi": [0], //关闭语句强制分号结尾
"no-multiple-empty-lines": [0, { "max": 100 }], //空行最多不能超过100行
"no-mixed-spaces-and-tabs": [0], //关闭禁止混用tab和空格
"comma-dangle": [2, 'never'], //解决最后一行 有一个逗号问题
}
}
.DS_Store
node_modules
/dist
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
# polysoft-h5
## 安装依赖
```
yarn install
```
### 本地启动
```
开发环境
yarn dev or npm dev
测试环境
yarn test or npm run test
正式或者生产环境
yarn pro or npm run pro
```
### 打包编译
```
开发环境
yarn build:dev
测试环境
yarn build:test
正式或者生产环境
yarn build:pro
```
### Lints and fixes files
```
yarn lint
```
### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
],
plugins: [
['import', {
libraryName: 'vant',
libraryDirectory: 'es',
style: true
}, 'vant']
]
}
This diff could not be displayed because it is too large.
{
"name": "polysoft-h5",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "vue-cli-service serve",
"test": "vue-cli-service serve --mode test",
"pro": "vue-cli-service serve --mode pro",
"build:dev": "vue-cli-service build --mode dev",
"build:test": "vue-cli-service build --mode test",
"build:pro": "vue-cli-service build --mode pro",
"lint": "vue-cli-service lint"
},
"dependencies": {
"autoprefixer": "^9.7.6",
"axios": "^0.21.1",
"better-scroll": "^1.15.2",
"core-js": "^3.6.5",
"cropperjs": "^1.5.11",
"js-cookie": "^2.2.1",
"lib-flexible": "^0.3.2",
"vant": "2.12.6",
"vconsole": "^3.4.1",
"vue": "^2.6.11",
"vue-i18n": "^8.24.3",
"vue-pdf": "^4.2.0",
"vue-router": "^3.2.0",
"vuex": "^3.4.0",
"vuex-persist": "^3.1.3"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.5.0",
"@vue/cli-plugin-eslint": "~4.5.0",
"@vue/cli-plugin-router": "~4.5.0",
"@vue/cli-plugin-vuex": "~4.5.0",
"@vue/cli-service": "~4.5.0",
"@vue/eslint-config-standard": "^5.1.2",
"babel-eslint": "^10.1.0",
"babel-plugin-import": "^1.13.3",
"compression-webpack-plugin": "^3.1.0",
"eslint": "^6.7.2",
"eslint-plugin-import": "^2.20.2",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^4.2.1",
"eslint-plugin-standard": "^4.0.0",
"eslint-plugin-vue": "^6.2.2",
"less": "^3.0.4",
"less-loader": "^5.0.0",
"postcss-pxtorem": "^5.1.1",
"vue-template-compiler": "^2.6.11",
"webpack-spritesmith": "^1.1.0"
}
}
const autoprefixer = require('autoprefixer')
const pxtorem = require('postcss-pxtorem')
module.exports = ({ file }) => {
let rootValue
// console.log(file.dirname)
// vant 37.5 [link](https://github.com/youzan/vant/issues/1181)
// if (file && file.dirname && file.dirname.indexOf('vant') > -1 && file.dirname.indexOf('swiper') > -1) {
if (file && file.dirname && file.dirname.indexOf('vant') > -1) {
rootValue = 37.5
} else {
rootValue = 41.4 //75
}
return {
plugins: [
autoprefixer(),
pxtorem({
rootValue: rootValue,
propList: ['*'],
selectorBlackList: ['.swiper'], // 要忽略的选择器并保留为px。
minPixelValue: 0
})
]
}
}
\ No newline at end of file \ No newline at end of file
No preview for this file type
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,index-scalable=no,user-scalable=0,viewport-fit=cover" />
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<link rel="stylesheet" href="http://at.alicdn.com/t/font_1209422_r18qamg15s.css">
<title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
No preview for this file type
No preview for this file type
No preview for this file type
<template>
<div id="app">
<keep-alive>
<router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>
</div>
</template>
<script>
import Touch from '@/components/Touch'
export default {
mounted() {
new Touch('#app', { filter: [] })
}
}
</script>
export const NativeMethodNames = {
AppInfoApi: 'nativeAppInfo',
AppShare: 'nativeAppShare',
AppBottomMenu: 'nativeMenu',
nativeTextZoom: 'nativeTextZoom',
}
export const JsMethodNames = {
PayResult: 'payResult'
}
export const JsInterfaces = objVal2Array(JsMethodNames)
export const NativeMenuApi = {
nativeMenuShow: (param = {}) => {
const newParam = { ...param, type: '1' }
NativeApi.nativeMenuStatus(newParam).then(res => { }).catch(e => { })
},
nativeMenuHide: (param = {}) => {
const newParam = { ...param, type: '2' }
NativeApi.nativeMenuStatus(newParam).then(res => { }).catch(e => { })
}
}
export const NativeApi = {
on: (jsMethodName, callback) => {
$api.on(jsMethodName, callback)
},
call: (nativeMethodName, param, isBack) => {
return $api.call(nativeMethodName, param, isBack)
},
nativeAppInfo: (param) => {
return $api.call(NativeMethodNames.AppInfoApi, param, true)
},
nativeAppShare: (param) => {
return $api.call(NativeMethodNames.AppShare, param, true)
},
// {type: '1'-显示/'2'-隐藏, moduleName: '切换模块名称', routeName: '路由名称', routePath: '路由地址', url:'完整url'}
nativeMenuStatus: (param) => {
if (!param.type) {
Object.assign(param, { type: '1' })
}
return $api.call(NativeMethodNames.AppBottomMenu, param, false)
},
// {value: 100}
nativeTextZoom: (param) => {
if (!param.value) {
Object.assign(param, { value: 100 })
}
return $api.call(NativeMethodNames.nativeTextZoom, param, false)
}
}
function objVal2Array (obj) {
const arrays = []
for (const key in obj) {
arrays.push(obj[key])
}
return arrays
}
\ No newline at end of file \ No newline at end of file
* {
padding: 0;
margin: 0;
box-sizing: border-box;
touch-action: auto;
-webkit-overflow-scrolling: touch;
font-family: "苹方黑体-准-简", "PingFangSC-Regular", "PingFang SC", "Microsoft YaHei", "微软雅黑", "Helvetica Neue", Helvetica, Arial, "Hiragino Sans GB", "Source Han Sans", "Noto Sans CJK Sc", "Microsoft Jhenghei", sans-serif;
}
html,
body {
height: 100vh;
width: 100vw;
margin: 0;
padding: 0;
}
@supports (bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom)) {
.iPhone .NavBar {
padding-top: calc(env(safe-area-inset-top) / 1.5);
}
.iPhone .NavBarWrap {
margin-bottom: calc(env(safe-area-inset-top) / 1.5);
}
.iPhone .payment_nav {
padding-top: calc(env(safe-area-inset-top) / 1.5);
}
.iPhone .payment_navbar_wrap {
padding-top: calc(env(safe-area-inset-top) / 1.5);
}
.iPhone .home {
padding-bottom: env(safe-area-inset-top);
}
.iPhone .navigation {
padding-top: calc(env(safe-area-inset-top) / 1.5) !important;
}
.iPhone .addAddress,
.iPhone .shop_item {
padding-top: calc(env(safe-area-inset-top) / 1.5);
}
.iPhone .product_footer {
padding-bottom: calc(env(safe-area-inset-bottom) / 1.5) !important;
padding-top: 15px !important;
}
.iPhone .header {
padding-top: calc(env(safe-area-inset-top) / 1.5) !important;
}
}
::-webkit-scrollbar {
display: none;
/* background-color:transparent; */
}
.pay {
height: 100vh;
width: 100vw;
}
#app {
height: 100vh;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-weight: normal;
}
html {
-webkit-tap-highlight-color: transparent;
}
.icon {
width: 1.2em;
height: 1.2em;
fill: currentColor;
overflow: hidden;
}
.van-tabs__wrap--scrollable .van-tab {
flex: 1;
}
.van-tabs__line {
background-color: #729ae0;
bottom: 10px;
}
.van-button--default {
background-color: #292F42;
color: #fff;
}
.van-tab--active {
color: #729ae0;
}
.titlePaddingTop {
padding-top: 88px;
}
.left-enter,
.left-leave-to {
transform: translate3d(-100%, 0, 0);
}
.left-leave,
.left-enter-to {
transform: translate3d(0, 0, 0);
}
.left-enter-active,
.left-leave-active {
transition: all 0.2s;
}
.van-dialog__cancel {
background: #fff;
color: #545454;
}
.van-dialog__confirm {
background: #fff;
color: #5594E5;
}
.van-tabs__nav--line {
padding-bottom: 5px;
box-sizing: border-box;
}
.clearfix {
*zoom: 1;
}
.clearfix:before,
.clearfix:after {
display: block;
content: "";
line-height: 0;
}
.clearfix:after {
clear: both;
}
.van-list__finished-text {
position: relative;
}
.van-list__finished-text::before {
content: "";
background-color: #999;
height: 4px;
transform: scale(1, 0.3);
width: 100px;
position: absolute;
top: 50%;
margin-top: -3px;
left: 120px;
}
.van-list__finished-text::after {
content: "";
background-color: #999;
height: 4px;
transform: scale(1, 0.3);
width: 100px;
position: absolute;
top: 50%;
margin-top: -3px;
right: 120px;
}
.noList .van-list__finished-text {
visibility: hidden !important;
}
.van-image-preview__index {
top: 93%;
}
.van-list__finished-text::before {
left: 2.1rem;
}
.van-list__finished-text::after {
right: 2.1rem;
}
input {
border: none;
}
.nafmii-head-bg1 {
background: url("~@/assets/icon/bg_login.png") no-repeat !important;
background-size: 100% !important;
background-position: center center;
}
.nafmii-head-bg2 {
background: url("~@/assets/icon/bg_mine.png") no-repeat !important;
background-size: 100% !important;
background-position: center center;
}
.nafmii-head-bg3 {
background: url("~@/assets/icon/bg_common.png") no-repeat !important;
background-size: 100% !important;
background-position: center center;
}
@import "variable";
* {
padding: 0;
margin: 0;
box-sizing: border-box;
touch-action: auto;
-webkit-overflow-scrolling: touch;
font-family: "苹方黑体-准-简", "PingFangSC-Regular", "PingFang SC", "Microsoft YaHei", "微软雅黑", "Helvetica Neue", Helvetica, Arial, "Hiragino Sans GB", "Source Han Sans", "Noto Sans CJK Sc", "Microsoft Jhenghei", sans-serif;
}
html,
body {
height: 100vh;
width: 100vw;
margin: 0;
padding: 0;
}
img {
width: 100%;
}
@supports (bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom)) {
.iPhone {
//头部
.NavBar {
padding-top: calc(env(safe-area-inset-top) / 1.5)
}
.NavBarWrap {
margin-bottom: calc(env(safe-area-inset-top) / 1.5)
}
.payment_nav {
padding-top: calc(env(safe-area-inset-top) / 1.5)
}
.payment_navbar_wrap {
padding-top: calc(env(safe-area-inset-top) / 1.5)
}
.home {
padding-bottom: env(safe-area-inset-top)
}
.navigation {
padding-top: calc(env(safe-area-inset-top) / 1.5) !important
}
.addAddress,
.shop_item {
padding-top: calc(env(safe-area-inset-top) / 1.5)
}
.product_footer {
//bottom:calc(env(safe-area-inset-bottom) + 10px) !important;
padding-bottom: calc(env(safe-area-inset-bottom) / 1.5) !important;
padding-top: 15px !important;
}
.header {
padding-top: calc(env(safe-area-inset-top) / 1.5) !important
}
}
}
::-webkit-scrollbar {
// 直接复制黏贴到样式页.css,完美解决
display: none;
/* background-color:transparent; */
}
#app {
height: 100vh;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-weight: normal;
}
html {
-webkit-tap-highlight-color: transparent;
}
//iconfont start
.icon {
width: 1.2em;
height: 1.2em;
fill: currentColor;
overflow: hidden;
}
//iconfont end
//vant 相关
.van-tabs__wrap--scrollable .van-tab {
flex: 1
}
.van-tabs__line {
background-color: @theme;
bottom: 10px;
}
.van-button--default {
background-color: @headerBg;
color: #fff;
}
.van-tab--active {
color: @theme;
}
//vant 相关 end
.titlePaddingTop {
padding-top: 88px;
}
.left-enter,
.left-leave-to {
transform: translate3d(-100%, 0, 0)
}
.left-leave,
.left-enter-to {
transform: translate3d(0, 0, 0)
}
.left-enter-active,
.left-leave-active {
transition: all .2s
}
// vant Dialog 按钮背景色 和 字体颜色
.van-dialog__cancel {
background: #fff;
color: #545454;
}
.van-dialog__confirm {
background: #fff;
color: #5594E5;
}
//vant nav
.van-tabs__nav--line {
padding-bottom: 5px;
box-sizing: border-box;
}
// 清除浮动
.clearfix {
*zoom: 1;
&:before,
&:after {
display: block;
content: "";
line-height: 0;
}
&:after {
clear: both;
}
}
.noList {
.van-list__finished-text {
visibility: hidden !important;
}
}
// 预览大图页签
.van-image-preview__index {
top: 93%;
}
input {
border: none;
}
.nafmii-head-bg1 {
background: url("~@/assets/icon/bg_login.png") no-repeat !important;
background-size: 100% !important;
background-position: center center;
}
.nafmii-head-bg1-2 {
background: url("~@/assets/icon/bg_login_2.png") no-repeat !important;
background-size: 100% !important;
background-position: center center;
}
.nafmii-head-bg2 {
background: url("~@/assets/icon/bg_mine.png") no-repeat !important;
background-size: 100% !important;
background-position: center center;
}
.nafmii-head-bg3 {
background: url("~@/assets/icon/bg_common.png") no-repeat !important;
background-size: 100% !important;
background-position: center center;
}
.nafmii-head-bg4 {
background: url("~@/assets/icon/bg_member.png") no-repeat !important;
background-size: 100% !important;
background-position: center center;
}
\ No newline at end of file \ No newline at end of file
@import 'mixins.less';
@import 'common.less';
\ No newline at end of file \ No newline at end of file
.round-borders (@radius) {
border-radius : @radius;
-moz-border-radius : @radius;
-webkit-border-radius: @radius;
}
.justify-align-center() {
display : flex;
justify-content: center;
align-items : center;
}
.justify-align-between(){
display : flex;
align-items : center;
justify-content: space-between;
}
.justify-between{
display : flex;
justify-content: space-between;
}
.justify-center() {
display : flex;
justify-content: center;
}
.align-center() {
display : flex;
align-items: center;
}
.ellipsis() {
overflow : hidden;
text-overflow: ellipsis;
white-space : nowrap;
}
// 字重
.fw550 {
font-weight: 550;
}
// flex 水平、垂直都居中,默认主轴方向为水平方向
.flex-center(@direction: row) when (@direction =row),
(@direction =h) {
.justify-align-center();
flex-direction: row;
}
// flex 水平、垂直都居中
.flex-center(@direction: row) when(@direction =column),
(@direction =v) {
.justify-align-center();
flex-direction: column;
}
// flex水平居中主轴为水平方向
.flex-center-h(@direction: row) when (@direction =row),
(@direction =h) {
.justify-center();
flex-direction: row;
}
// flex水平居中主轴为垂直方向
.flex-center-h(@direction: row) when (@direction =column),
(@direction =v) {
.align-center();
flex-direction: column;
}
// flex垂直居中主轴为水平方向
.flex-center-v(@direction: row) when (@direction =row),
(@direction =h) {
.align-center();
flex-direction: row;
}
// flex垂直居中主轴为垂直方向
.flex-center-v(@direction: row) when (@direction =column),
(@direction =v) {
.justify-center();
flex-direction: column;
}
// 固定显示多上行,size:固定显示的行数
.line-clamp(@size) {
overflow : hidden;
text-overflow : ellipsis;
line-clamp : @size;
-webkit-line-clamp: @size;
display : -webkit-box;
-webkit-box-orient: vertical;
}
// 旋转角度
.transform-rotate(@deg) {
transform : rotate(@deg);
-ms-transform : rotate(@deg);
-moz-transform : rotate(@deg);
-webkit-transform: rotate(@deg);
-o-transform : rotate(@deg);
}
\ No newline at end of file \ No newline at end of file
form {
width: 100%;
}
.common_search {
/deep/ &&.van-search {
padding: 0;
margin: 10px 0;
background: inherit;
background-color: rgba(255, 255, 255, 0.2);
color: #fff;
border-radius: 16px;
height: 33px;
}
/deep/ .van-search__content {
background-color: rgba(255, 255, 255, 0.2);
border-radius: 16px;
color: #fff;
height: 33px;
}
/deep/ .van-field__left-icon .van-icon,
.van-field__right-icon .van-icon {
color: #fff;
}
/deep/ input::-webkit-input-placeholder {
color: #fff;
opacity: 0.8;
font-size: 12px;
}
/deep/ .van-field__control {
color: #fff;
font-size: 12px;
}
}
\ No newline at end of file \ No newline at end of file
.icon-sprite { display: inline-block; background-image: url(../images/sprite.png); background-size: 2060px 1529px; }
.icon-bg-common { width: 828px; height: 360px; background-position: 0px -1169px; }
.icon-bg-login-2 { width: 828px; height: 506px; background-position: -1232px 0px; }
.icon-bg-login { width: 828px; height: 412px; background-position: 0px -737px; }
.icon-bg-member-result { width: 1212px; height: 717px; background-position: 0px 0px; }
.icon-bg-member { width: 828px; height: 406px; background-position: -848px -737px; }
.icon-bg-mine { width: 828px; height: 340px; background-position: -848px -1169px; }
.icon-center-about { width: 36px; height: 36px; background-position: -1297px -670px; }
.icon-center-collect { width: 36px; height: 36px; background-position: -1353px -670px; }
.icon-center-feedback { width: 36px; height: 36px; background-position: -1409px -670px; }
.icon-center-message { width: 36px; height: 36px; background-position: -1465px -670px; }
.icon-center-question { width: 36px; height: 36px; background-position: -1521px -670px; }
.icon-center-setting { width: 36px; height: 36px; background-position: -1577px -670px; }
.icon-center-study { width: 36px; height: 36px; background-position: -1633px -670px; }
.icon-change-member { width: 90px; height: 90px; background-position: -1514px -526px; }
.icon-email { width: 36px; height: 36px; background-position: -1689px -670px; }
.icon-empty { width: 36px; height: 36px; background-position: -1745px -670px; }
.icon-filter { width: 44px; height: 50px; background-position: -1910px -981px; }
.icon-icon-arrow-right { width: 10px; height: 18px; background-position: -2050px -737px; }
.icon-icon-classify { width: 30px; height: 30px; background-position: -2030px -981px; }
.icon-icon-clock { width: 30px; height: 30px; background-position: -1874px -1055px; }
.icon-join-member { width: 90px; height: 90px; background-position: -1624px -526px; }
.icon-logo-2 { width: 118px; height: 112px; background-position: -1376px -526px; }
.icon-logo { width: 224px; height: 224px; background-position: -1696px -737px; }
.icon-message { width: 50px; height: 50px; background-position: -1770px -981px; }
.icon-more { width: 10px; height: 18px; background-position: -2050px -775px; }
.icon-password { width: 36px; height: 36px; background-position: -1801px -670px; }
.icon-pdf { width: 46px; height: 60px; background-position: -1696px -1055px; }
.icon-photo-default { width: 124px; height: 124px; background-position: -1232px -526px; }
.icon-question-icon { width: 36px; height: 36px; background-position: -1857px -670px; }
.icon-quit-member { width: 90px; height: 90px; background-position: -1734px -526px; }
.icon-shtyxydm { width: 54px; height: 54px; background-position: -1696px -981px; }
.icon-tel { width: 36px; height: 36px; background-position: -1913px -670px; }
.icon-time-update { width: 45px; height: 45px; background-position: -1232px -670px; }
.icon-trash { width: 50px; height: 50px; background-position: -1840px -981px; }
.icon-user-question { width: 32px; height: 36px; background-position: -2025px -670px; }
.icon-user { width: 36px; height: 36px; background-position: -1969px -670px; }
.icon-verification { width: 36px; height: 36px; background-position: -1974px -981px; }
.icon-wechat { width: 80px; height: 78px; background-position: -1940px -847px; }
.icon-progress-act { width: 36px; height: 36px; background-position: -1762px -1055px; }
.icon-progress-normal { width: 36px; height: 36px; background-position: -1818px -1055px; }
.icon-change-name { width: 90px; height: 90px; background-position: -1844px -526px; }
.icon-change-representive { width: 90px; height: 90px; background-position: -1954px -526px; }
.icon-change-membership { width: 90px; height: 90px; background-position: -1940px -737px; }
\ No newline at end of file \ No newline at end of file
// 字体 全局变量
@font47 : 47px;
@font30 : 30px;
@font27 : 27px;
@font24 : 24px;
@font22 : 22px;
@font20 : 20px;
@font18 : 18px;
@font16 : 16px;
@font14 : 14px;
@font12 : 12px;
@font10 : 10px;
// radius-size
@radius-size-medium : 5px;
@radius-size-medium10 : 10px;
@radius-size-medium20 : 20px;
@radius-size-medium30 : 30px;
@warn:red;
//页面背景颜色
@bgColor:#f8f8f8;
@headerBg:#292F42;
//当前主题颜色
@theme:#729ae0;
// 页面颜色
@color000: #000;
@colorfff: #fff;
@color333: #333;
No preview for this file type
<template>
<section class="data-list-item" @click="$emit('click')">
<div class="item-title">
<div class="title-tag">
<slot name="tag"></slot>
</div>
<span class="title-content" v-indent="10">{{data.title}}</span>
</div>
<div class="item-bottom">
<div class="bottom-content">
<slot v-bind:value="data" name="bottomLeft" />
<template v-if="!$slots.bottomLeft">
<img class="bottom-icon" src="@/assets/icon/icon_clock.png">
<span class="bottom-text">{{dateText}}{{data.date}}</span>
</template>
</div>
<div class="bottom-content">
<slot v-bind:value="data" name="bottomRight" />
<template v-if="!$slots.bottomRight">
<img class="bottom-icon" src="@/assets/icon/icon_classify.png">
<span>{{data.dataType}}</span>
</template>
</div>
</div>
</section>
</template>
<script>
export default {
name: 'DataListItem',
props: {
data: {
type: Object,
default: () => { return {} }
},
dateText: {
type: String
},
tag: {
type: String
}
},
data () {
return {}
},
methods: {
},
directives: {
indent: {
inserted (el, binding) {
setTimeout(() => {
const nodes = el.previousElementSibling.childNodes
const data = { width: 0 }
for (const node of nodes) {
data.width = data.width + node.offsetWidth
}
if (!data.width) return
const indentSize = data.width + (binding.value || 0)
console.log(indentSize);
el.style.textIndent = `${indentSize}px`
}, 0);
}
}
}
}
</script>
<style lang="less" scoped>
@import '~@/assets/css/mixins.less';
@PaddingSize: 11px;
.data-list-item {
padding: @PaddingSize 0;
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
.item-title {
display: flex;
flex-wrap: wrap;
align-items: center;
position: relative;
.title-tag {
position: absolute;
left: 0;
top: 0;
display: flex;
align-items: center;
height: 25px;
}
.title-content {
font-size: 16px;
color: #222222;
line-height: 25px;
.line-clamp(2);
}
}
.item-bottom {
padding-top: 10px;
display: flex;
justify-content: space-between;
.bottom-content {
display: flex;
align-items: center;
color: #999999;
line-height: 16px;
font-size: 12px;
@IconSize: 15px;
.bottom-icon {
width: @IconSize;
height: @IconSize;
margin-right: 7px;
}
}
}
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div class="footer_bottom_container">
已经到底了
</div>
</template>
<script>
export default {
name: 'FooterBottom'
}
</script>
<style lang="less" scoped>
.footer_bottom_container {
display: flex;
align-items: center;
justify-content: center;
color: #999;
font-size: 20px;
height: 100px;
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<section v-wrap:height="'v'">
<div class="nav_bar" :class="navClass" :style="navObj.barStyle">
<div class="nav_top_container" v-if="$slots.top">
<slot name="top" />
</div>
<div class="nav_content_container">
<!-- 左侧 自定义 -->
<div class="nav_left" v-if="$slots.left" slot="left">
<slot name="left" />
</div>
<!-- 左侧 默认 箭头以及文字描述 -->
<div class="nav_left" v-else @click="handleBack">
<i v-if="navObj.barLeftArrow" class="iconfont iconpreviewleft"></i>
{{navObj.barLeftText}}
</div>
<!-- 标题栏 默认 自定义 -->
<div v-if="$slots.default" v-wrap:height="'v'">
<div class="nav_title" v-wrap:height="'v'">
<slot />
</div>
</div>
<!-- 标题栏 -->
<div class="nav_title" v-else>{{navObj.barTitle}}</div>
<!-- 右侧插槽 -->
<div class="nav_right" v-if="$slots.right" slot="right">
<slot name="right" />
</div>
</div>
<div class="nav_bottom_container" v-if="$slots.bottom">
<slot name="bottom" />
</div>
</div>
</section>
</template>
<script>
import { mapGetters } from 'vuex'
export default {
name: 'NafmHeader',
props: {
bgColor: {
type: String,
},
isBgImg: {
type: Boolean,
default: true
},
navClass: {
type: String,
},
color: {
type: String
},
leftText: {
type: String
},
leftArrow: {
type: Boolean,
default: undefined
},
title: {
type: String
},
showBack: {
type: Boolean,
default: false
},
},
computed: {
...mapGetters('common', ['GStatusBarHeight']),
navObj () {
const meta = this.$route.meta
let leftArrowStatus = true
if (this.leftArrow != undefined) {
leftArrowStatus = this.leftArrow
} else if (meta.leftArrow != undefined) {
leftArrowStatus = meta.leftArrow
}
// 如果设置了背景图片 则不用设置 背景颜色了
// console.log('this.isBgImg',this.isBgImg)
const barStyleBg = this.isBgImg ? {} : { background: this.bgColor || meta.bgColor || '#729ae0' }
// console.log('meta',meta)
return {
barStyle: {
...barStyleBg,
color: this.color || meta.color || '#fff',
paddingTop: `${this.GStatusBarHeight}px`
},
barLeftText: this.leftText || meta.leftText || '',
barTitle: this.title || meta.title || '',
barLeftArrow: leftArrowStatus
}
},
},
methods: {
handleBack () {
if (this.showBack) {
this.$emit('onBack')
} else {
this.$router.back()
}
}
},
directives: {
wrap: {
inserted: function (el, binding, vnode, oldVnode) {
// setTimeout(() => {
const { arg, value } = binding
const style = { width: 0, height: 0 }
for (let i = 0; i < el.childNodes.length; i++) {
const element = el.childNodes[i];
if (arg == 'height') {
if (value == 'h') {
style.height = Math.max(style.height, element.offsetHeight)
} else if (value == 'v') {
style.height = style.height + element.offsetHeight
}
} else if (arg == 'width') {
if (value == 'h') {
style.width = Math.max(style.height, element.offsetWidth)
} else if (value == 'v') {
style.width = style.height + element.offsetWidth
}
}
}
style.width && (el.style.width = `${style.width}px`)
style.height && (el.style.height = `${style.height}px`)
// }, 0);
}
}
}
}
</script>
<style lang="less" scoped>
@NavHeight: 45px;
@PaddingSize: 15px;
section {
width: 100%;
position: relative;
z-index: 10;
.nav_bar {
position: fixed;
left: 0;
top: 0;
width: 100%;
padding: 0 @PaddingSize;
box-sizing: border-box;
.nav_content_container {
min-height: @NavHeight;
position: relative;
display: flex;
align-items: center;
justify-content: space-between;
}
}
.nav_left {
display: flex;
align-items: center;
z-index: 2;
:active {
opacity: 0.5;
}
.iconpreviewleft {
font-size: 25px;
}
img {
width: 51px;
height: 51px;
}
}
.nav_title {
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 100%;
min-height: @NavHeight;
display: flex;
align-items: center;
justify-content: center;
font-size: 18px;
}
.nav_right {
min-width: 100px;
display: flex;
align-items: center;
justify-content: flex-end;
z-index: 2;
}
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<van-popup :value="value" @input="val=>this.$emit('input',val)" position="right" :style="{ height: '100%',width: '85%' }">
<div class="filter_container">
<div :style="{paddingTop: GStatusBarHeight+'px',height: '85vh',overflowY:'scroll'}">
<slot />
</div>
<div class="button">
<div class="btn reset" @click="handleReset">重置</div>
<div class="btn sure" @click="handleSure">确定</div>
</div>
</div>
</van-popup>
</template>
<script>
import { mapGetters } from 'vuex';
export default {
name: 'Popup',
props: {
value: Boolean,
},
computed: {
...mapGetters('common', ['GStatusBarHeight']),
},
methods: {
handleReset() {
this.$emit('reset')
},
handleSure() {
this.$emit('sure')
}
}
}
</script>
<style lang="less" scoped>
.filter_container {
display: flex;
flex-direction: column;
padding: 50px 15px;
height: 100%;
}
.button {
display: flex;
align-items: flex-end;
flex: 1;
justify-content: space-between;
.btn {
width: 43%;
display: flex;
justify-content: center;
align-items: center;
height: 45px;
font-size: 15px;
border-radius: 5px;
}
.reset {
background-color: #f6f6f6;
color: #666;
}
.sure {
background-image: linear-gradient(to right, #25a3df, #106abc);
color: #fff;
}
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div class="history">
<div class="history_title" v-if="historys.length">
<span>搜索历史</span>
<img :src="require('@/assets/icon/trash.png')" @click="handleClear">
</div>
<div class="historyList" v-if="historys.length">
<ul>
<li v-for="(item,index) in historys" :key="index" @click="jumItem(item)">{{item}}</li>
</ul>
</div>
<div class="noData" v-else>
暂无历史记录
</div>
</div>
</template>
<script>
import { mapState } from 'vuex'
export default {
name: 'SearchHistory',
props: {
stateKey: String,
},
computed: {
...mapState('search', {
historys (state) {
return state[this.stateKey] || []
}
}),
},
methods: {
jumItem (val) {
this.$emit('jumpPage', val)
},
handleClear () {
this.$store.dispatch('search/ACleanHistory', this.stateKey)
this.$emit('clear')
}
}
}
</script>
<style lang="less" scoped>
.history {
display: flex;
flex-direction: column;
padding: 20px 15px;
background-color: #fafafa;
height: 100%;
.history_title {
display: flex;
justify-content: space-between;
span {
color: #666;
font-size: 11px;
}
img {
width: 25px;
height: 25px;
}
}
}
.historyList {
ul {
display: flex;
flex-wrap: wrap;
li {
display: flex;
justify-content: center;
padding: 7px 15px;
background-color: #fff;
border-radius: 15px;
margin-right: 10px;
margin-top: 10px;
min-width: 80px;
font-size: 12px;
color: #161818;
word-break: break-all;
}
}
}
.noData {
text-align: center;
color: #666;
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<form action="javascript:return true">
<van-search class="common_search" v-model.trim="searchValue" v-on="$listeners" v-bind="$attrs" />
</form>
</template>
<script>
export default {
name: 'SearchInput',
props: {
keyword: String
},
model: {
prop: ['keyword']
},
data () {
return {
searchValue: ''
}
},
watch: {
searchValue (val) {
this.$emit('input', val)
},
keyword (val) {
this.searchValue = val
}
}
}
</script>
<style lang="less" scoped>
@import '~@/assets/css/search.less';
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div>
<div class="sendCodeText" :class="{active:isValue}" @click="sendCode" v-show="show">获取验证码</div>
<div class="coutdDownText" v-show="!show"><span class="second">{{time}}s</span>后重新获取</div>
</div>
</template>
<script>
import utils from "@/utils/";
let timer = null;
export default {
name: 'SendVerificationCode',
props: {
coutDownNumber: {
type: Number,
default: 60
},
phone: {
type: [Number, String],
},
email: {
type: String
},
data: {
type: Object
}
},
data() {
return {
show: true,
time: 60,
isValue: false
}
},
watch: {
// 监控 手机号有值 则获取验证码 增加蓝色
phone(val) {
if (val) {
this.isValue = true
} else {
this.isValue = false
}
},
// 监控 邮箱号有值 则获取验证码 增加蓝色
email(val) {
if (val) {
this.isValue = true
} else {
this.isValue = false
}
},
},
methods: {
sendCode() {
console.log(this.data.type)
// 发送手机号验证码
if (this.data.type == 'phone') {
// 判断手机号不能为空
if (!this.phone) {
Toast('请输入手机号')
return
}
if (!utils.phoneRegCheck(this.phone)) {
Toast("请输入正确的手机号码!");
return
}
} else {
// 发送邮件验证码
if (!this.email) {
Toast('请输入邮箱')
return
}
if (!utils.emailRegCheck(this.email)) {
Toast("请输入正确的邮箱格式!");
return
}
}
this.time = this.coutDownNumber
this.show = false // 显示倒计时
if (timer) {
clearInterval(timer);
}
timer = setInterval(() => {
console.log(this.time)
if (this.time > 0 && this.time <= this.coutDownNumber) {
this.time--;
} else {
this.show = true
this.time = this.coutDownNumber
clearInterval(timer);
timer = null;
}
}, 1000);
}
},
destroyed() {
clearInterval(timer);
}
}
</script>
<style lang="less" scoped>
.sendCodeText {
color: #9c9c9c;
font-size: 12px;
}
.active {
color: #106abc;
}
.coutdDownText {
color: #9c9c9c;
font-size: 12px;
.second {
color: #106abc;
font-size: 16px;
}
}
</style>
\ No newline at end of file \ No newline at end of file
/**
* @name 下拉刷新
* @template new Touch("#app",{option}).then()
* @param {arguments[0]} String 非必填(建议填如id),下拉动态负载,默认body
* @param {option} Object 非必填
* @param {lazy} Number {lazy:100} 下拉响应惰性值默认 100
* @param {time} Number {time:1000} 数据防抖惰性值默认 1000
* @returns then Function xxx.then(arg=>arg) //下拉刷新后回掉
* @name vue页面注入
* @template { methods: {$$onTouch }}
*/
import Vue, { callHook } from "vue";
let setT, $event = new Vue();
class Touch {
constructor(id, opt = {}) {
this.main();
this.createElement(id);
this.generators = new Set();
this.next = null;
this.status = {};
this.opt = Object.assign({
lazy: 200,//下拉取惰性
time: 1000,//数据防抖动值
filter: []
}, opt)
return this;
}
main() {
this.options = {
start: 0,
move: 0,
end: 0,
isTrue: false,//是否拖动到有效值
}
}
then(fun) {
this.generators.add(fun);
return this;
}
createElement(id) {
const doc = (document.documentElement || document.body);
this.self = id ? document.querySelector(id) : doc;
this.parent = this.self == doc ? this.self : this.self.parentNode;
this.element = document.createElement("div");
Object.assign(this.element.style, {
"textAlign": "center", "height": "0", "transform": "translateY(50%)", "position": "fixed",
"top": "0", "left": "0", "width": "100%", "zIndex": "1", "overflow": "hidden"
})
this.arrow = document.createElement("span");
Object.assign(this.arrow.style, {
display: "inline-block",
borderRadius: "50%",
border: "#c00 solid 2px",
borderTop: "none",
width: "50px",
height: "50px",
transform: "translate3d(0,0,0),rotate(0deg)",
})
this.element.appendChild(this.arrow);
let first = this.parent.children[0];
this.parent.insertBefore(this.element, first);
this.addEvent();
}
//事件绑定
addEvent() {
window.addEventListener("touchstart", this.touchstart.bind(this), false);
window.addEventListener("touchmove", this.touchmove.bind(this), false);
window.addEventListener("touchend", this.touchend.bind(this), false)
}
scrollEvent(event) { }
touchstart(event) {
this.touchend();
let { pageX, pageY } = event.targetTouches[0];
if (this.parent.scrollTop <= 0) {
Object.assign(this.options, {
start: pageY,
touchs: true
})
}
}
touchmove(event) {
let { pageX, pageY } = event.targetTouches[0];
let path = location.hash.replace("#", "");
let check = this.opt.filter.filter(item => {
if (item.length > path.length) {
return item.includes(path)
} else {
return path.includes(item)
}
}).length;
if (!this.options.touchs || check) {
this.options.isTrue = false;
return
}
this.options.move = pageY;
let height = pageY - this.options.start;
if (height < 0) {
this.options.isTrue = false;
this.touchend();
return
}
if (height > this.opt.lazy) {
let _height = height - this.opt.lazy;
this.options.isTrue = true;
this.setTransform(_height);
}
//指针归位
this.next = this.generators.values();
}
touchend(event) {
this.setTransform(0); //位置复位
if (setT) { clearTimeout(setT) }
setT = setTimeout(() => {
if (
event && //用户事件
this.options.isTrue //有效拖动
) {
this.runNext(); //执行回掉
}
}, this.opt.time);
//复位
Object.assign(this.options, {
start: 0,
move: 0,
end: 0,
touchs: false
})
}
runNext(item = this.next, ...res) {
this.options.isTrue = false;
let next = item.next();
if (!next.done) {
let fun = next.value(res); //执行
if (/Promise/ig.test(Object.prototype.toString.call(fun))) {
fun.then((params) => {
this.runNext(item, params);
});//处理promise
} else {
this.runNext(item, fun);//处理普通事件
}
} else {
$event.$emit("$$onTouch", res);//发送事件给组件
//指针归位
this.next = this.generators.values();
}
}
setTransform(height) {
Object.assign(this.self.style, {
transform: height > 0 ? `translateY(${height}px)` : "none"
})
Object.assign(this.element.style, {
height: height >= 100 ? "100px" : "0.1px"
// height:height+"px"
})
Object.assign(this.arrow.style, {
transform: `rotate(${height}deg)`
})
}
}
const listeners = {}
$event.$on("$$onTouch", (arg) => {
for (const key in listeners) {
listeners[key](arg)
}
})
export function install(vue, options) {
vue.mixin({
mounted() {
this.refreshInit && (listeners[this._uid] = this.refreshInit)
},
activated() {
this.refreshInit && (listeners[this._uid] = this.refreshInit)
},
destroyed() {
delete listeners[this._uid]
},
deactivated() {
delete listeners[this._uid]
},
})
}
Vue.use(install)
export default Touch;
import Vue from 'vue'
import VueI18n from 'vue-i18n'
import messages from './lang/index'
import { getLocalStorage } from '@/utils/LocalStorage'
Vue.use(VueI18n)
const lang = getLocalStorage('lang') || 'zh'
console.log('lang',lang)
// 通过选项创建 VueI18n 实例
export default new VueI18n({
locale: lang, // 设置地区
messages, // 设置地区信息
silentTranslationWarn: true
})
const buttonEn = {
button: {
ok: 'Ok',
cancel: 'Cancel',
reset: 'Reset',
login: 'Login',
logout: 'Logout',
clickWrong: 'Cancel',
okUnbinding: 'Ok',
clear: 'Clear',
finish: 'Finish',
save: 'Save'
}
}
const buttonZh = {
button: {
ok: '确定',
cancel: '取消',
reset: '重置',
login: '登录',
logout: '退出登录',
clickWrong: '点错了',
okUnbinding: '确定解除',
clear: '清空',
finish: '完成',
save: '保存'
}
}
export default {
buttonEn,
buttonZh
};
\ No newline at end of file \ No newline at end of file
const feedbackEn = {
feedback: {
question: 'Question And FeedBack',
images: 'Image(Not Required,Provide a screenshot of the problem)',
tip: 'Tip: upload images support PNG / jpeg, the size of images is less than 1m, and the number of images is up to four',
}
}
const feedbackZh = {
feedback: {
question: '问题和意见',
images: '图片(选填,提供问题截图)',
tip: '提示:上传图片支持png/jpeg,图片大小1M以内,图片数量最多4张',
}
}
export default {
feedbackEn,
feedbackZh
};
\ No newline at end of file \ No newline at end of file
const En = {
home: {
searchPlaceholder: 'Please enter the content you want to search',
more: 'More',
recommend: 'Recommend',
top: 'Top',
updateDate: 'Update Date:',
disclosureDate: 'Disclosure Date:',
disclosure: 'Information Disclosure',
news: 'News',
registered: 'Registered Issue',
}
}
const Zh = {
home: {
searchPlaceholder: '请输入您想搜索的内容',
more: '更多',
recommend: '推荐',
top: '置顶',
updateDate: '更新日期:',
disclosureDate: '披露日期:',
disclosure: '信息披露',
news: '新闻动态',
registered: '注册发行',
}
}
export default { En, Zh }
\ No newline at end of file \ No newline at end of file
// 全局公用模块
import button from './button/index'
import toast from './toast/index'
// 单独页面模块
import title from './title/index'
import setting from './user/setting'
import center from './user/center'
import person from './user/person'
import feedback from './feedback/index'
import question from './question/index'
import member from './member/index'
import home from './home/index'
import agreement from './qulification/agreement'
import qulification from './qulification/index'
const messages = {
en: {
lang: 'English',
...button.buttonEn,
...toast.toastEn,
...title.titleEn,
...setting.settingEn,
...center.centerEn,
...person.personEn,
...feedback.feedbackEn,
...question.questionEn,
...member.memberEn,
...home.En,
...agreement.agreementEn,
...qulification.qulificationEn
},
zh: {
lang: "中文",
...button.buttonZh,
...toast.toastZh,
...title.titleZh,
...setting.settingZh,
...center.centerZh,
...person.personZh,
...feedback.feedbackZh,
...question.questionZh,
...member.memberZh,
...home.Zh,
...agreement.agreementZh,
...qulification.qulificationZh
}
}
export default messages
const memberEn = {
mlogin: {
code: 'Please input the social credit or the organization code', // 社会信用代码或组织机构代码
password: 'Please input the password', // 密码
verificationCode: 'Please input the verification code', // 验证码
warningTip: "Tip: Please input your unit's login name and password for the membership system(unit member)", // 提示
membershipGuide: 'Membership Guide', // 会员指南
FAQ: 'Membership Handling FAQ', // 户籍办理常见问题
memberRules: 'Member Management Rules' // 会员管理规则
},
mcontact: {
contactName: 'Contact Name', // 联系人姓名
contactType: 'Contact Type', // 联系人类型
dept: 'Department', // 所在部门
position: 'Position', // 职务
officePhone: 'Office Phone', // 办公电话
mobilePhone: 'Mobile Phone' // 移动电话
},
mdetail: {
socialCode: 'Uniform Social Credit Code', // 统一社会信用代码
orgCode: 'Organization Code', // 组织机构代码
orgType: 'Organization Type', // 机构类型
establishedTime: 'Established Time', // 成立时间
corporateRepresentative: 'Corporate Representative', // 法人代表
registeredCapital: 'Registered Capital(Ten Thousand)', // 注册资本(万元)
address: 'Address', // 通讯地址
memberStatus: 'Membership Status', // 会员状态
memberLevel: 'Membership Level', // 会员级别
memberType: 'Membership Type', // 会籍类别
representative: 'Company Representative Name', // 单位代表姓名
businessSituation: 'Business Situation', // 业务开展情况
contactList: 'Contact List' // 联系人列表
},
memberservice: {
tip1: 'Tip: Please log in the Membership System if you want to do some changes', // 提示:如需变更请登入会员系统办理
tip2: 'Tip: Please log in the Membership System if the informations like contact person, mail address, registered address, corporate representative and so on are changed.', // 提示:如联系人,通讯地址,注册地址,法人代表等变更,请登录会员系统办理
more: 'more', // 查看更多
join: 'Join', // 入会
quit: 'Quit', // 退会
change: 'Change', // 变更
},
mbusiness: {
updateTime: 'update time', // 更新时间
},
mprogress: {
joinProgress: 'Join Progress', // 入会进度
quitProgress: 'Quit Progress', // 退会进度
changeProgress: 'Change Progress', // 变更进度
organizationName: 'Organization Name', // 单位名称变更
organizationRepresentive: 'Organization Representive', // 单位代表变更
membershipType: 'Membership Type', // 会籍类别变更
}
}
const memberZh = {
mlogin: {
code: '请输入社会信用代码或组织机构代码', // 社会信用代码或组织机构代码
password: '请输入密码', // 密码
verificationCode: '请输入验证码', // 验证码
warningTip: "提示:请输入贵单位会员系统的登录名及密码登录(单位会员)",
membershipGuide: '入会指南', // 会员指南
FAQ: '会籍办理常见问题', // 户籍办理常见问题
memberRules: '会籍管理规则' // 会员管理规则
},
mcontact: {
contactName: '联系人姓名', // 联系人姓名
contactType: '联系人类型', // 联系人类型
dept: '所在部门', // 所在部门
position: '职务', // 职务
officePhone: '办公电话', // 办公电话
mobilePhone: '移动电话' // 移动电话
},
mdetail: {
socialCode: '统一社会信用代码', // 统一社会信用代码
orgCode: '组织机构代码', // 组织机构代码
orgType: '机构类型', // 机构类型
establishedTime: '成立时间', // 成立时间
corporateRepresentative: '法人代表', // 法人代表
registeredCapital: '注册资本(万元)', // 注册资本(万元)
address: '通讯地址', // 通讯地址
memberStatus: '会员状态', // 会员状态
memberLevel: '会员级别', // 会员级别
memberType: '会籍类别', // 会籍类别
representative: '单位代表姓名', // 单位代表姓名
businessSituation: '业务开展情况', // 业务开展情况
contactList: '联系人列表' // 联系人列表
},
memberservice: {
tip1: '提示:如需变更请登入会员系统办理', // 提示:如需变更请登入会员系统办理
tip2: '提示:如联系人,通讯地址,注册地址,法人代表等变更,请登录会员系统办理', // 提示:如联系人,通讯地址,注册地址,法人代表等变更,请登录会员系统办理
more: '查看更多', // 查看更多
join: '入会', // 入会
quit: '退会', // 退会
change: '变更', // 变更
},
mbusiness: {
updateTime: '更新时间', // 更新时间
},
mprogress: {
joinProgress: '入会进度', // 入会进度
quitProgress: '退会进度', // 退会进度
changeProgress: '变更进度', // 变更进度
organizationName: '单位名称变更', // 单位名称变更
organizationRepresentive: '单位代表变更', // 单位代表变更
membershipType: '会籍类别变更', // 会籍类别变更
}
}
export default {
memberEn,
memberZh
};
const questionEn = {
question: {
askPlaceholder: 'Please enter the question you want to ask',
classification: 'Classification',
question: 'Question'
}
}
const questionZh = {
question: {
askPlaceholder: '请输入您想咨询的问题',
classification: '问题分类',
question: '常见问题'
}
}
export default {
questionEn,
questionZh
};
\ No newline at end of file \ No newline at end of file
const agreementEn = {
agreement: {
time: "chronologically", // 按时间
letter: 'alphabetically', // 按字母
remark: 'Remark', // 备注
},
}
const agreementZh = {
agreement: {
time: "按时间", // 按时间
letter: '按字母', // 按字母
remark: '备注', // 备注
},
}
export default {
agreementEn,
agreementZh
};
const qulificationEn = {
qulification: {
title: "Memberships' and Market Participants' Inquiry", // 会员及市场参与者情况查询
searchAction: {
product: {
name: 'Product', // 非法人产品
key: 'product',
placeholder: "Please input the products' name/manage person", // 请输入产品名/管理人
},
org: {
name: 'Organization', // 机构
key: 'org',
placeholder: "Please input the organizations' name", // 请输入机构名称
}
},
product: 'Product', // 非法人产品
org: 'Organization', // 机构
orgType: 'Organization Type', // 机构类型
productInput: "Please input the products' name/manage person", // 请输入产品名/管理人
orgInput: "Please input the organizations' name", // 请输入机构名称
history: 'Search History', // 搜索历史
membership: 'Membership', // 是否会员
membershipType: 'Membership Type', // 会籍类别
underwriterType: 'Type of Lead Underwriter', // 主承销商类型
marketmaker: 'Market Maker', // 做市商
mitigation: 'Credit Risk Mitigation', // 信用风险缓释工具
masterAgree: 'Signed Master Agreement' // 已签署备案主协议
},
}
const qulificationZh = {
qulification: {
title: '会员及市场参与者情况查询', // 会员及市场参与者情况查询
searchAction: {
product: {
name: '非法人产品', // 非法人产品
key: 'product',
placeholder: '请输入产品名/管理人', // 请输入产品名/管理人
},
org: {
name: '机构', // 机构
key: 'org',
placeholder: '请输入机构名称', // 请输入机构名称
}
},
product: '非法人产品', // 非法人产品
org: '机构', // 机构
orgType: '机构类型', // 机构类型
productInput: "请输入产品名/管理人", // 请输入产品名/管理人
orgInput: "请输入机构名称", // 请输入机构名称
history: '搜索历史', // 搜索历史
membership: '是否会员', // 是否会员
membershipType: '会籍类别', // 会籍类别
underwriterType: '主承销商类型', // 主承销商类型
marketmaker: '做市商', // 做市商
mitigation: '信用风险缓释工具', // 信用风险缓释工具
masterAgree: '已签署备案主协议' // 已签署备案主协议
},
}
export default {
qulificationEn,
qulificationZh
};
const titleEn = {
title: {
home: 'Home',
membershipServices: 'Membership Services',
message: 'Message',
collect: 'Collection',
study: 'Study',
question: 'Question',
questionDetail: 'QuestionDetail',
feedBack: 'FeedBack',
about: 'About',
setting: 'Setting',
resetPassword: 'Reset Password',
privacyPolicy: 'Privacy Policy',
serviceAgreement: 'Service Agreement',
person: 'Personal',
photo: 'Edit Photo',
nickName: 'Edit NickName',
name: 'Edit Name',
nationality: 'Edit Nationality',
email: 'Edit Email',
company: 'Edit Compnay',
regIssue: 'Register Issue'
}
}
const titleZh = {
title: {
home: '首页',
membershipServices: '会籍服务',
message: '我的消息',
collect: '我的收藏',
study: '我的学习',
question: '常见问题',
questionDetail: '常见问题详情',
feedBack: '意见反馈',
about: '关于协会',
setting: '设置',
resetPassword: '重置密码',
privacyPolicy: '隐私政策',
serviceAgreement: '服务协议',
person: '个人信息',
photo: '设置昵称',
nickName: '设置昵称',
name: '设置姓名',
nationality: '设置国籍',
email: '设置邮箱',
company: '设置单位',
regIssue: '注册发行'
}
}
export default {
titleEn,
titleZh
};
\ No newline at end of file \ No newline at end of file
const toastEn = {
toast: {
userName: 'please input username',
phone: 'pleace input correct phone format',
email: 'pleace input correct email format',
tip: 'Tip',
tipMessage: 'After you unbind wechat, you will not be able to use wechat to log in quickly. Are you sure you want to unbind it',
verification: 'please input verification code',
unbindingSuccess: 'Finish!',
resetSuccess: 'Reset Successful',
isEmptyContent: 'Do you want to clear all data?',
freeLoginContent: 'After enabling free login, the system will keep your current login status, no need to go to the login page to login, open the APP to login.',
}
}
const toastZh = {
toast: {
userName: '请输入用户名',
phone: '请输入正确的手机格式',
email: '请输入正确的邮箱格式',
tip: '友情提示',
tipMessage: '解除微信绑定后,将无法使用微信快速登录,你确定解除吗?',
verification: '请输入验证码',
unbindingSuccess: '解绑成功!',
resetSuccess: '重置成功!',
isEmptyContent: '是否要清空全部数据?',
freeLoginContent: '开启免登录后,系统将保留您当前的登录状态,无需前往登录页面进行登录,打开APP即登录。',
}
}
export default {
toastEn,
toastZh
};
\ No newline at end of file \ No newline at end of file
const centerEn = {
center: {
login: 'Login',
konwMore: 'Know More Information',
message: 'Message',
collect: 'Collection',
study: 'Study',
question: 'Question',
feedBack: 'FeedBack',
about: 'About',
setting: 'Setting',
},
}
const centerZh = {
center: {
login: '立即登录',
konwMore: '登录后可了解更多信息',
message: '我的消息',
collect: '我的收藏',
study: '我的学习',
question: '常见问题',
feedBack: '意见反馈',
about: '关于协会',
setting: '设置',
},
}
export default {
centerEn,
centerZh
};
\ No newline at end of file \ No newline at end of file
const personEn = {
person: {
photo: 'Photo',
nickName: 'NickName',
nickNamePlaceholder: 'Please input your nickname',
phoneNumber: 'PhoneNumber',
name: 'Name',
namePlaceholder: 'Please input your name',
nationality: 'Nationality',
nationalityPlaceholder: 'Please select your Nationality',
country: 'Please input Nationality',
birthday: 'BirthDay',
birthdayPlaceholder: 'Please select your birthday',
email: 'Email',
emailPlaceholder: 'Please input your email',
company: 'Company',
companyPlaceholder: 'Please input your company',
},
}
const personZh = {
person: {
photo: '头像',
nickName: '昵称',
nickNamePlaceholder: '请输入您的昵称',
phoneNumber: '手机号',
name: '姓名',
namePlaceholder: '请输入您的姓名',
nationality: '国籍',
nationalityPlaceholder: '请选择您的国籍',
country: '请输入国籍名称',
birthday: '出生日',
birthdayPlaceholder: '请选择您的出生日',
email: '邮箱',
emailPlaceholder: '请输入您的邮箱',
company: '单位',
companyPlaceholder: '请选择您的单位',
},
}
export default {
personEn,
personZh
};
\ No newline at end of file \ No newline at end of file
const settingEn = {
setting: {
language: 'Language',
bindWechat: 'Binding Wechat',
freeLogin: 'Free Login',
resetPassword: 'Reset Password',
privacyPolicy: 'Privacy Policy',
serviceAgreement: 'Service Agreement',
questionAndFeedback: 'Question Feedback',
chinese: 'Chinese',
english: 'English',
fontSize: 'FontSize',
superFontSize: 'Super FontSize',
bigFontSize: 'Big FontSize',
standardFontSize: 'Standard FontSize',
smallFontSize: 'Smaill FontSize',
},
}
const settingZh = {
setting: {
language: '多语言',
bindWechat: '微信绑定',
freeLogin: '免登录',
resetPassword: '重置密码',
privacyPolicy: '隐私政策',
serviceAgreement: '服务协议',
questionAndFeedback: '问题及反馈',
chinese: '中文',
english: '英文',
fontSize: '字体大小',
superFontSize: '特大字体',
bigFontSize: '大字体',
standardFontSize: '标准字体',
smallFontSize: '小字体',
},
}
export default {
settingEn,
settingZh
};
\ No newline at end of file \ No newline at end of file
import Vue from 'vue'
import Vconsole from 'vconsole'
import 'lib-flexible/flexible' // 根据窗口不同,给html设置不同的font-size值
import App from './App.vue'
import router from './router'
import store from './store'
import Axios from '@/utils/Axios'
import '@/utils/Interface'
import '@/utils/vant-ui.js'
import i18n from '@/i18n'
import '@/assets/css/index.less'
const APP_ENV = process.env.VUE_APP_NODE_ENV
Vue.config.productionTip = false
console.log(window.location.href);
const url = window.location.href
if (APP_ENV != 'production') {
if (!url.includes('/#/pdf')) {
const vConsole = new Vconsole()
Vue.use(vConsole)
}
}
// 获取APP 相关信息
store.dispatch('common/AGetAppInfo')
Vue.use({
install(vue) {
Object.assign(vue.prototype, {
$axios: Axios,
$store: store
})
}
})
new Vue({
router,
store,
i18n,
render: h => h(App)
}).$mount('#app')
import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '@/views/home/index.vue'
import userRouter from './modules/user'
import memberRouter from './modules/member'
import qulificationRouter from './modules/qualification'
import regIssueRouter from './modules/regIssue'
import homeRouter from './modules/home'
import { NativeMenuApi } from '@/api/NativeApis'
const APP_ENV = process.env.VUE_APP_NODE_ENV
Vue.use(VueRouter)
const routes = [
{
path: '/',
meta: {
token: false,
topType: 3
},
redirect: {
name: 'Catalog'
}
},
{
path: '/home',
name: 'Home',
meta: {
menu: true,
title: '首页'
},
component: Home
},
{
path: '/catalog',
name: 'Catalog',
meta: {
menu: true,
title: '目录'
},
component: () => import(/* webpackChunkName: "catalog" */ '@/views/catalog/') // 首页
},
{
path: '/pdf',
name: 'PdfView',
meta: {
menu: true,
title: '目录'
},
component: () => import(/* webpackChunkName: "PdfView" */ '@/views/pdf/') // 首页
},
{
path: '/pdfTwo',
name: 'PdfViewTwo',
meta: {
menu: true,
title: '目录'
},
component: () => import(/* webpackChunkName: "PdfViewTwo" */ '@/views/pdf/two.vue') // 首页
}
].concat(userRouter, memberRouter, qulificationRouter, regIssueRouter, homeRouter)
const router = new VueRouter({
routes
})
router.beforeEach((to, from, next) => {
const { menu } = to.meta || {}
menu ? NativeMenuApi.nativeMenuShow() : NativeMenuApi.nativeMenuHide()
next()
})
// router后置守卫
router.afterEach((to, from) => {
})
export default router
const Routers = [
{
path: '/home/search',
name: 'GlobalSearch',
meta: {
title: '全局搜索',
isLogin: false
},
component: () => import(/* webpackChunkName: "GlobalSearch" */ '@/views/homeSearch/index.vue') // 全局搜索
},
{
path: '/home/search/result',
name: 'GlobalSearchResult',
meta: {
title: '全局搜索',
isLogin: false
},
component: () => import(/* webpackChunkName: "GlobalSearchResult" */ '@/views/homeSearch/result.vue') // 全局搜索
},
]
export default Routers
\ No newline at end of file \ No newline at end of file
const memberRouter = [{
path: '/member/login',
name: 'MemberLogin',
meta: {
menu: true,
title: '登录'
},
component: () => import( /* webpackChunkName: "memberLogin" */ '@/views/member/memberLogin.vue') // 会员登录
},
{
path: '/member/loginResult',
name: 'LoginResult',
meta: {
title: '会籍服务'
},
component: () => import( /* webpackChunkName: "loginResult" */ '@/views/member/result') // 会籍服务
},
{
path: '/member/memberDetail',
name: 'MemberDetail',
meta: {
title: '会员基本信息'
},
component: () => import( /* webpackChunkName: "memberDetail" */ '@/views/member/result/memberDetail.vue') // 会员基本信息
},
{
path: '/member/memberGuide',
name: 'MemberGuide',
meta: {
title: '入会指南'
},
component: () => import( /* webpackChunkName: "memberGuide" */ '@/views/member/memberGuide.vue') // 入会指南
},
{
path: '/member/contactList',
name: 'ContactList',
meta: {
title: '联系人'
},
component: () => import( /* webpackChunkName: "contactList" */ '@/views/member/contact') // 联系人
},
{
path: '/member/businessList',
name: 'BusinessList',
meta: {
title: '业务开展'
},
component: () => import( /* webpackChunkName: "businessList" */ '@/views/member/business') // 业务开展
},
{
path: '/member/joinProgress',
name: 'JoinProgress',
meta: {
title: '进会进度'
},
component: () => import( /* webpackChunkName: "joinProgress" */ '@/views/member/progress/join.vue') // 进会进度
},
{
path: '/member/quitProgress',
name: 'QuitProgress',
meta: {
title: '退回进度'
},
component: () => import( /* webpackChunkName: "quitProgress" */ '@/views/member/progress/quit.vue') // 退回进度
},
{
path: '/member/changeList',
name: 'ChangeList',
meta: {
title: '变更'
},
component: () => import( /* webpackChunkName: "changeList" */ '@/views/member/progress/change/list.vue') // 变更列表
},
{
path: '/member/changeProgress',
name: 'ChangeProgress',
meta: {
title: '变更进度'
},
component: () => import( /* webpackChunkName: "changeProgress" */ '@/views/member/progress/change') // 变更进度
},
{
path: '/member/projectDetail',
name: 'ProjectDetail',
meta: {
title: '项目详情'
},
component: () => import( /* webpackChunkName: "projectDetail" */ '@/views/member/projectDetail') // 项目详情
}
]
export default memberRouter
const qulificationRouter = [{
path: '/qulification/search',
name: 'QulificationSearch',
meta: {
title: '资质查询'
},
component: () => import( /* webpackChunkName: "qulificationSearch" */ '@/views/qulification/search.vue') // 资质查询
}, {
path: '/qulification/list',
name: 'QulificationList',
meta: {
title: '资质查询'
},
component: () => import( /* webpackChunkName: "qulificationList" */ '@/views/qulification/list.vue') // 业内搜索结果
}, {
path: '/qulification/detail',
name: 'QulificationDetail',
meta: {
title: '资质查询'
},
component: () => import( /* webpackChunkName: "qulificationDetail" */ '@/views/qulification/detail.vue') // 资质详情
}, {
path: '/qulification/masterAgreement',
name: 'MasterAgreement',
meta: {
title: '资质查询'
},
component: () => import( /* webpackChunkName: "masterAgreement" */ '@/views/qulification/agreement/master') // NFAMII主协议
}]
export default qulificationRouter
const regIssueRouter = [
{
path: '/regIssue',
name: 'RegIssue',
meta: {
title: '注册发行',
isLogin: false
},
component: () => import(/* webpackChunkName: "regIssue" */ '@/views/regIssue/index.vue') // 注册发行
},
{
path: '/regIssueSearch',
name: 'RegIssueSearch',
meta: {
title: '注册发行',
isLogin: false
},
component: () => import(/* webpackChunkName: "regIssueSearch" */ '@/views/regIssue/search.vue') // 注册发行 搜索页面
},
{
path: '/regIssueSearchResult',
name: 'RegIssueSearchResult',
meta: {
title: '注册发行',
isLogin: false
},
component: () => import(/* webpackChunkName: "regIssueSearchResult" */ '@/views/regIssue/searchResult.vue') // 注册发行 搜索页面结果页面
},
]
export default regIssueRouter
\ No newline at end of file \ No newline at end of file
const userRouter = [
{
path: '/user/login/phone',
name: 'LoginPhone',
meta: {
title: '登录',
isLogin: false
},
component: () => import(/* webpackChunkName: "loginPhone" */ '@/views/user/login/loginPhone.vue') // 手机号登录
},
{
path: '/user/login/username',
name: 'LoginUserName',
meta: {
title: '登录',
isLogin: false
},
component: () => import(/* webpackChunkName: "login" */ '@/views/user/login/loginUserName.vue') // 账号密码登录
},
{
path: '/user/register',
name: 'Register',
meta: {
title: '注册',
isLogin: false
},
component: () => import(/* webpackChunkName: "register" */ '@/views/user/login/register.vue') // 注册
},
{
path: '/user/findPassword',
name: 'FindPassword',
meta: {
title: '',
isLogin: false
},
component: () => import(/* webpackChunkName: "findPassword" */ '@/views/user/login/findPassword.vue') // 手机号找回密码 邮箱找回密码
},
{
path: '/user/setPassword',
name: 'SetPassword',
meta: {
title: '设置密码',
isLogin: false
},
component: () => import(/* webpackChunkName: "center" */ '@/views/user/login/setPassword.vue') // 设置密码
},
{
path: '/user/resetPassword',
name: 'ResetPassword',
meta: {
title: '重置密码',
isLogin: false
},
component: () => import(/* webpackChunkName: "center" */ '@/views/user/login/resetPassword.vue') // 重置密码
},
{
path: '/user/sendVerification',
name: 'SendVerification',
meta: {
title: '',
isLogin: true
},
component: () => import(/* webpackChunkName: "center" */ '@/views/user/setting/sendVerification.vue') // 重置密码或者解除绑定 输入验证码页面
},
{
path: '/user/center',
name: 'Center',
meta: {
menu: true,
title: '个人中心',
isLogin: false
},
component: () => import(/* webpackChunkName: "center" */ '@/views/user/center.vue') // 个人中心
},
{
path: '/user/message',
name: 'Message',
meta: {
title: '我的消息',
isLogin: true
},
component: () => import(/* webpackChunkName: "message" */ '@/views/user/message/list.vue') // 消息
},
{
path: '/user/collect',
name: 'Collect',
meta: {
title: '我的收藏',
isLogin: true
},
component: () => import(/* webpackChunkName: "collect" */ '@/views/user/collect/index.vue') // 我的收藏
},
{
path: '/user/study',
name: 'Study',
meta: {
title: '我的学习',
isLogin: true
},
component: () => import(/* webpackChunkName: "study" */ '@/views/user/study/index.vue') // 我到学习
},
{
path: '/user/question',
name: 'Question',
meta: {
title: '常见问题',
isLogin: false
},
component: () => import(/* webpackChunkName: "question" */ '@/views/user/question/list.vue') // 常见问题列表
},
{
path: '/user/questionDetail',
name: 'QuestionDetail',
meta: {
title: '常见详情',
isLogin: false
},
component: () => import(/* webpackChunkName: "questionDetail" */ '@/views/user/question/detail.vue') // 常见问题详情
},
{
path: '/user/feedback',
name: 'FeedBack',
meta: {
title: '意见反馈',
isLogin: true
},
component: () => import(/* webpackChunkName: "feedback" */ '@/views/user/feedback/index.vue') // 意见反馈
},
{
path: '/user/about',
name: 'About',
meta: {
title: '关于协会',
isLogin: false
},
component: () => import(/* webpackChunkName: "about" */ '@/views/user/about/index.vue') // 关于协会
},
{
path: '/user/setting',
name: 'Setting',
meta: {
title: '设置',
isLogin: true
},
component: () => import(/* webpackChunkName: "setting" */ '@/views/user/setting/index.vue') // 设置
},
{
path: '/user/privacy',
name: 'Privacy',
meta: {
title: '隐私协议',
isLogin: false
},
component: () => import(/* webpackChunkName: "privacy" */ '@/views/user/privacy/index.vue') // 隐私协议
},
{
path: '/user/service',
name: 'Service',
meta: {
title: '服务协议',
isLogin: false
},
component: () => import(/* webpackChunkName: "service" */ '@/views/user/service/index.vue') // 服务协议
},
{
path: '/user/person',
name: 'Person',
meta: {
title: '个人信息',
isLogin: true
},
component: () => import(/* webpackChunkName: "person" */ '@/views/user/person/index.vue') // 个人信息
},
{
path: '/user/commonEdit',
name: 'CommonEdit',
meta: {
title: '',
isLogin: true
},
component: () => import(/* webpackChunkName: "commonEdit" */ '@/views/user/person/commonEdit.vue') // 个人信息
},
{
path: '/user/nationality',
name: 'Nationality',
meta: {
title: '',
isLogin: true
},
component: () => import(/* webpackChunkName: "nationality" */ '@/views/user/nationality/index.vue') // 设置国籍
},
]
export default userRouter
\ No newline at end of file \ No newline at end of file
import Vue from 'vue'
import Vuex from 'vuex'
import VuexPersistence from 'vuex-persist'
import createLogger from 'vuex/dist/logger'
import home from './modules/home'
import user from './modules/user'
import common from './modules/common'
import search from './modules/search'
import regIssue from './modules/regIssue'
// vuex 数据存储 进行本地存储操作
const vuexLocal = new VuexPersistence({
storage: window.localStorage,
modules: ["user","search"]
})
Vue.use(Vuex)
const store = new Vuex.Store({
strict: process.env.NODE_ENV !== 'production',
modules: {
home,
user,
common,
search,
regIssue
},
plugins: [vuexLocal.plugin, createLogger()]
})
export default store
import { NativeApi } from '@/api/NativeApis'
const AppInfo = {
versionCode: 100,
versionName: '2.1',
statusBarHeight: 0,
sourceFlag: false
}
export default {
namespaced: true,
state: {
AppInfo: { ...AppInfo }
},
mutations: {
MSetAppInfo (state, data) {
Object.assign(state.AppInfo, data)
}
},
actions: {
AGetAppInfo ({ state, commit }) {
if (state.AppInfo.sourceFlag) {
return
}
NativeApi.nativeAppInfo({}).then(res => {
if (res.data) {
Object.assign(res.data, { sourceFlag: true })
}
commit('MSetAppInfo', res.data)
}).catch(e => {
commit('MSetAppInfo', AppInfo)
})
}
},
getters: {
GStatusBarHeight (state) {
return state.AppInfo.statusBarHeight
}
}
}
export default {
namespaced: true,
state: {
},
mutations: {
},
actions: {
},
modules: {
}
}
export default {
namespaced: true,
state: {
regIssuePamas: {},
regIssueList: []
},
mutations: {
MRegIssuePamas(state, datas) {
state.regIssuePamas = datas
},
MRegIssueList(state, datas) {
state.regIssueList = datas
},
},
actions: {
// 请求注册发行列表接口
ARequestRegIssueList({ state, commit }, params) {
console.log('params', params)
commit('MRegIssuePamas', params)
// todo api
const list = []
commit('MRegIssueList', list)
}
},
modules: {}
}
\ No newline at end of file \ No newline at end of file
const Types = {
Home: { size: 10 },
RegIssue: { size: 10 }
}
import utils from '@/utils/index'
export default {
namespaced: true,
state: {
Home: [],
RegIssue: []
},
mutations: {
MSetHistoryDatas(state, { key, datas }) {
state[key] = datas
},
MSetHomeHistory(state, datas) {
state.Home = datas
},
MSetRegIssueHistory(state, datas) {
state.RegIssue = datas
},
MCleanHistory(state, stateKey) {
state[stateKey] = []
}
},
actions: {
ACleanHistory({ commit }, stateKey) {
commit('MCleanHistory', stateKey)
},
APushSearchValue({ state, commit }, param = {}) {
const { stateKey, value } = param
if (Object.hasOwnProperty.call(Types, stateKey)) {
const newDatas = pushSearchValue(state[stateKey], value, Types[stateKey].size)
commit('MSetHistoryDatas', { key: stateKey, value: newDatas })
}
},
APushHomeSearchValue({ state, commit }, val) {
const newDatas = pushSearchValue(state.Home, val, Types.Home.size)
commit('MSetHomeHistory', newDatas)
},
APushRegIssueSearchValue({ state, commit }, val) {
const newDatas = pushSearchValue(state.RegIssue, val, Types.RegIssue.size)
commit('MSetRegIssueHistory', newDatas)
},
},
modules: {
}
}
function pushSearchValue(datas, value, size) {
const newDatas = [...datas]
if (!utils.isNull(value) && newDatas.indexOf(value) === -1) {
newDatas.unshift(value.trim())
if (newDatas.length > size) {
newDatas.pop()
}
}
return newDatas
}
export default {
namespaced: true,
state: {
userId: ''
},
mutations: {
MStoreUserId(state, data) {
Object.assign(state, data)
},
},
actions: {
AStoreUserInfo({ commit }, userInfo) {
commit("MStoreUserId", userInfo)
}
},
getters: {
// 是否登录
GIsLogin: (state) => {
// console.log('state', state.userId)
return state.userId ? true : false
}
}
}
import Cookies from 'js-cookie'
const TokenKey = 'NAFM_TOKEN'
export function getToken() {
return Cookies.get(TokenKey)
}
export function setToken(token) {
return Cookies.set(TokenKey, token)
}
export function removeToken() {
return Cookies.remove(TokenKey)
}
\ No newline at end of file \ No newline at end of file
import Vue from 'vue';
import Request from './Request'
const Axios = new Request()
Plugin.install = (Vue) => {
Vue.prototype.$http = Axios
}
Object.assign(window, {
$http: Axios
})
Vue.use(Plugin)
export default Axios
\ No newline at end of file \ No newline at end of file
import { JsInterfaces } from '@/api/NativeApis'
class Interface {
constructor(interfaces) {
this.listeners = {}
this.__init(interfaces)
}
on(methodName, callback) {
this.listeners[methodName] = callback
}
call(nativeMethod, data, isback) {
if (isback) {
return this.__callNativeApiBack(nativeMethod, data)
}
return this.__callNativeApiBack(nativeMethod, data)
}
__init(interfaces = []) {
interfaces.forEach(methodName => {
this[methodName] = (data) => {
this.listeners[methodName](data ? JSON.parse(data) : data)
}
});
}
__callNativeApiNotBack(nativeMethod, data) {
try {
if (that.__callNativeApi(nativeMethod, { data })) {
return Promise.reject(`无效调用:[${nativeMethod}]`)
}
return Promise.resolve()
} catch (e) {
return Promise.reject(`接口调用异常:[${nativeMethod}]`)
}
}
__callNativeApiBack(nativeMethod, data) {
const that = this
const jsMethodName = `js${Date.now()}`
return new Promise((resolve, reject) => {
try {
that[jsMethodName] = (data) => {
resolve(data ? JSON.parse(data) : data)
delete that[jsMethodName]
}
if (that.__callNativeApi(nativeMethod, { data, jsMethodName })) {
return reject(`无效调用:[${nativeMethod}]`)
}
} catch (e) {
return Promise.reject(`接口调用异常:[${nativeMethod}]`)
}
})
}
__callNativeApi(nativeMethod, data) {
if (window.$NativeApi && window.$NativeApi[nativeMethod]) {
window.$NativeApi[nativeMethod](JSON.stringify(data))
} else {
return true
}
}
}
window.$api = new Interface(JsInterfaces)
\ No newline at end of file \ No newline at end of file
export function getLocalStorage(key) {
try {
return JSON.parse(localStorage.getItem(key))
} catch {
}
}
export function setLocalStorage(key, value) {
return localStorage.setItem(key, JSON.stringify(value))
}
export function removeLocalStorage(key) {
return localStorage.removeItem(key)
}
\ No newline at end of file \ No newline at end of file
import axios from 'axios'
const APP_ENV = process.env.VUE_APP_NODE_ENV
const APP_API = process.env.VUE_APP_API
const codeMessage = {
200: '服务器成功返回请求的数据。',
201: '新建或修改数据成功。',
202: '一个请求已经进入后台排队(异步任务)。',
204: '删除数据成功。',
400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',
401: '用户没有权限(令牌、用户名、密码错误)。',
403: '用户得到授权,但是访问是被禁止的。',
404: '发出的请求是不存在的,服务器没有进行操作。',
406: '请求的格式不可得。',
410: '请求的资源被永久删除。',
422: '当创建一个对象时,发生一个验证错误。',
500: '服务器发生错误,请检查服务器。',
502: '网关错误。',
503: '服务不可用,服务器暂时过载或维护。',
504: '网关超时。'
}
const instance = axios.create({
baseURL: APP_ENV === 'development' ? '/api' : APP_API
})
class Request {
constructor(baseURL) {
this.baseURL = baseURL
}
// 检查返回状态
checkStatus(response) {
console.log(2)
const responseData = response.data
const errorText = response && (codeMessage[response.status] || response.statusText)
if (response && (response.stutus === 200 || response.stutus === 304 || response.status === 400)) {
if (responseData.stutus == 0) {
return responseData
}
if (responseData.status === 401 || responseData.status === 402) {
return Promise.reject(errorText)
}
return Promise.reject(responseData)
}
Promise.reject(response)
}
// 拦截器
interceptors(instance, scope) {
// 请求拦截器
instance.interceptors.request.use(config => {
config.url = baseURL
config.scope = scope
return config
}, error => {
return Promise.reject(error)
})
// 相应拦截器
instance.interceptors.response.use(res => {
return res
}, error => {
const { response, message } = error || {}
if (message && message.includes('timeout')) {
return Promise.reject({ statusText: '网络超时,请重新尝试!' })
}
let errorInfo = response
if (!errorInfo) {
try {
const { request: { status, statusText }, config } = JSON.parse(JSON.stringify(error))
errorInfo = {
status,
statusText,
request: { responseURL: config.url }
}
} catch (e) {
errorInfo = error
}
}
return Promise.reject(errorInfo)
})
}
// 设置请求
setRequest(method, url, data, scope, file = false) {
this.interceptors(instance, scope)
const options = { method, url }
let contentType = ''
if (file) {
contentType = 'multipart/form-data'
} else if (method == 'post') {
contentType = 'application/json'
} else {
contentType = 'application/x-www-form-urlencoded; charset=UTF-8'
}
const headers = {
'X-Requested-With': 'XMLHttpRequest',
'Content-Type': contentType
}
Object.assign(options, {
headers,
[method == 'post' ? 'data' : 'params']: data
})
return instance(options).then(this.checkStatus).catch(this.error)
}
// get
get(url, data, scope) {
return this.setRequest('get', url, data, scope)
}
// post
post(url, data, scope) {
console.log(1,url)
return this.setRequest('post', url, data, scope)
}
// GET
GET(url, data, scope) {
return this.setRequest('get', url, data, scope).then(this.success)
}
// POST
POST(url, data, scope) {
return this.setRequest('post', url, data, scope).them(this.success)
}
// 错误
error(e) {
return Promise.reject(e)
}
// 成功
success(da) {
return da.data
}
// 文件成功
fileSuccess(data) {
return data
}
}
export default Request;
\ No newline at end of file \ No newline at end of file
/**
* 工具类
* import utils from "@/utils";
*/
// 封装接口返回数据
const handlePromise = (promise) => {
return promise.then(res => {
return Promise.resolve(res)
}).catch(e => {
return Promise.resolve(res)
})
}
// 验证手机号
const phoneRegCheck = (phoneNo) => {
const Reg = /1[3-9]\d{9}/;
return Reg.test(phoneNo);
}
// 验证邮箱
const emailRegCheck = (email) => {
const Reg = /^[A-Za-z0-9-_\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;
return Reg.test(email);
}
// 判断是否为空
const isNull = (str) => {
if (str == null || str == "" || str == undefined || str==" ") {
return true
} else {
return false
}
}
// 复制值
const Copy = (node) => {
node = Array.isArray(node) ? node[0] : node
Object.assign(document.documentElement.style, {
webkitUserSelect: 'text', webkitTouchCallout: 'text'
})
const range = document.createRange()
range.selectNode(node)
const selection = window.getSelection()
if (selection.rangeCount > 0) selection.removeAllRanges()
selection.addRange(range)
document.execCommand('copy');
(window.Toast || alert)('复制成功')
selection.removeAllRanges()
}
export default {
handlePromise,
phoneRegCheck,
emailRegCheck,
isNull
}
\ No newline at end of file \ No newline at end of file
export const showLoading = duration => {
return Toast.loading({
duration,
message: '加载中...',
forbidClick: true,
loadingType: 'spinner'
})
}
\ No newline at end of file \ No newline at end of file
import Vue from 'vue'
import {
Loading,
Lazyload,
Tab,
Tabs,
Toast,
Dialog,
Icon,
Form,
Field,
Switch,
Overlay,
Cell,
CellGroup,
ActionSheet,
Button,
Step,
Steps,
Checkbox,
CheckboxGroup,
Picker,
Popup,
Swipe,
SwipeItem,
Uploader,
List,
PullRefresh,
SwipeCell,
DatetimePicker,
Search,
IndexBar,
IndexAnchor,
Sidebar,
SidebarItem
} from 'vant'
import NafmHeader from '@/components/NafmHeader'
import FooterBottom from '@/components/FooterBottom'
// 公共组建
[NafmHeader, FooterBottom].forEach(item => Vue.component(item.name, item));
// 默认vant组件
[
Loading,
Lazyload,
Tab,
Tabs,
Toast,
Dialog,
Icon,
Form,
Field,
Switch,
Overlay,
Cell,
CellGroup,
ActionSheet,
Button,
Step,
Steps,
Checkbox,
CheckboxGroup,
Picker,
Popup,
Swipe,
SwipeItem,
Uploader,
List,
PullRefresh,
SwipeCell,
DatetimePicker,
Search,
IndexBar,
IndexAnchor,
Sidebar,
SidebarItem
].forEach(item => Vue.use(item))
// 先预制,后期做统一调整
Object.assign(window, {
Toast,
Dialog
})
{
"finishDesc":"红色字体是制作完成的页面,接口已经联调完成",
"todoDesc":"蓝色字体是联调中或者制作中",
"list": [
{
"name": "范鑫",
"myselfList": [
{
"url": "/user/register",
"title": "注册",
"class": "block red"
},
{
"url": "/user/login/phone",
"title": "手机号登录",
"class": "block red"
},
{
"url": "/user/login/username",
"title": "账号密码登录",
"class": "block red"
},
{
"url": "/user/findPassword?type=phone",
"title": "手机号找回",
"class": "block red"
},
{
"url": "/user/findPassword?type=email",
"title": "邮箱找回",
"class": "block red"
},
{
"url": "/user/resetPassword",
"title": "重置",
"class": "block red"
},
{
"url": "/user/center",
"title": "个人中心",
"class": "block red"
},
{
"url": "/user/message",
"title": "我的消息",
"class": "block red"
},
{
"url": "/user/collect",
"title": "我的收藏",
"class": "block red"
},
{
"url": "/user/study",
"title": "我的学习",
"class": "block red"
},
{
"url": "/user/question",
"title": "常见问题",
"class": "block red"
},
{
"url": "/user/questionDetail",
"title": "常见问题详情",
"class": "block red"
},
{
"url": "/user/feedback",
"title": "意见反馈",
"class": "block red"
},
{
"url": "/user/about",
"title": "关于协会",
"class": "block red"
},
{
"url": "/user/setting",
"title": "设置",
"class": "block red"
},
{
"url": "/user/privacy",
"title": "隐私协议",
"class": "block red"
},
{
"url": "/user/service",
"title": "服务协议",
"class": "block red"
},
{
"url": "/user/person",
"title": "个人信息",
"class": "block red"
},
{
"url": "/user/commonEdit",
"title": "设置昵称",
"class": "block red"
},
{
"url": "/regIssue",
"title": "注册发行",
"class": "block red"
}
]
},
{
"name": "陈新",
"myselfList": [
{
"url": "/home",
"title": "首页",
"class": "block red"
}
]
},
{
"name": "李新",
"myselfList": [
{
"url": "/member/login",
"title": "会员登录",
"class": "block"
}
]
}
]
}
\ No newline at end of file \ No newline at end of file
<template>
<div class="page">
<h3>{{finishDesc}}</h3>
<h3>{{todoDesc}}</h3>
<div>
<van-field v-model="userId" name="userId" label="userId" placeholder="请输入userId" class="input" ref="input" />
<van-button round block type="info" @click="modify">修改</van-button>
</div>
<hr />
<span ref="copy">测试copy</span>
<button @click="EventCopy">copy</button>
<div v-for="(item,index) in list" :key="index">
<h4>{{item.name}}</h4>
<router-link v-for="(child,Index) in item.myselfList" :key="Index" :to="child.url" :class="child.class">{{child.title}}: {{child.url}}</router-link>
<hr />
</div>
</div>
</template>
<script>
import data from './data.json'
import utils from "@/utils/";
export default {
name: 'catalog',
data() {
return {
finishDesc: '',
todoDesc: '',
list: [],
userId: ''
}
},
created() {
const { finishDesc, todoDesc, list } = data
this.finishDesc = finishDesc
this.todoDesc = todoDesc
this.list = list
},
mounted() {
this.$refs.input.focus()
},
methods: {
EventCopy() {
utils.Copy(this.$refs.copy);
},
modify() {
if (this.userId) {
this.$store.commit('user/MStoreUserId', this.userId)
window.Toast('修改完成')
} else {
window.Toast('请填写userId')
}
}
}
}
</script>
<style lang="less" scoped>
.page {
padding: 30px;
}
.block {
display: block;
line-height: 40px;
}
.red {
color: red;
}
hr {
margin: 20px 0;
}
.input {
border: 2px solid #ccc;
border-radius: 10px;
margin-bottom: 10px;
}
</style>
<template>
<section class="data-module">
<div class="module-top-container">
<div class="module-top-left">
<span class="module-name">{{name}}</span>
<span v-if="!isTop" class="module-top-btn" @click="$emit('clickTop')">{{$t('home.top')}}</span>
</div>
<div class="module-more">
<span>{{$t('home.more')}}</span>
<img src="@/assets/icon/more.png" alt="">
</div>
</div>
<div class="module-content-container">
<DataListItem v-for="(item, idx) in data.list" :key="idx" :data="item" :dateText="dateText">
<template v-if="item.isRecommend" v-slot:tag>
<span class="item-recommend">{{$t('home.recommend')}}</span>
</template>
</DataListItem>
</div>
</section>
</template>
<script>
import DataListItem from '@/components/DataListItem'
export default {
name: 'DataModule',
components: { DataListItem },
props: {
name: {
type: String,
},
isTop: {
type: Boolean,
},
dateText: {
type: String,
}
},
data () {
return {
data: {
name: '协会动态',
isTop: true,
list: [
{
isRecommend: true,
title: '创新推出碳中和债,助理实现30·60目标创新推出碳中和债,助理实现30·60目标创新推出碳中和债,助理实现30·60目标',
date: '2020-02-02',
dataType: '产品创新'
},
{
isRecommend: false,
title: '创新推出碳中和债,助理实现30·60目标创新推出碳中和60目标',
date: '2020-02-02',
dataType: '产品创新'
},
{
isRecommend: false,
title: '创新推出碳中和债,助理实现30·60目标出',
date: '2020-02-02',
dataType: '产品创新'
},
]
}
}
},
methods: {
}
}
</script>
<style lang="less" scoped>
@import '~@/assets/css/mixins.less';
@ModuleTop: 30px;
.data-module {
padding-top: @ModuleTop;
.module-top-container {
display: flex;
align-items: center;
justify-content: space-between;
border-bottom: 1px solid #135faa;
.module-top-left {
display: flex;
align-items: center;
margin-bottom: -0.5px;
.module-name {
padding-bottom: 2px;
box-sizing: border-box;
font-size: 19px;
color: #222222;
line-height: 26px;
border-bottom: 2.5px solid #135faa;
}
.module-top-btn {
margin-left: 15px;
height: 17px;
line-height: 15px;
border-radius: 10px;
color: #135faa;
font-size: 12px;
padding: 0 5px;
text-align: center;
border: 0.5px solid #135faa;
}
}
.module-more {
display: flex;
align-items: center;
font-size: 12px;
color: #999999;
img {
margin-left: 5px;
margin-top: 2px;
width: auto;
height: 9px;
}
}
}
}
.module-content-container {
.item-recommend {
height: 18x;
line-height: 18px;
font-size: 10px;
color: white;
padding: 0 7px;
padding-bottom: 1px;
border-radius: 8px;
background: #ff4038;
text-align: center;
}
.content-item {
padding-top: 14px;
padding-bottom: 10px;
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
.item-title {
display: flex;
flex-wrap: wrap;
align-items: center;
line-height: 25px;
position: relative;
.item-recommend {
position: absolute;
left: 0;
top: 3.5px;
height: 18px;
line-height: 18px;
font-size: 10px;
color: white;
padding: 0 7px;
border-radius: 8px;
background: #ff4038;
text-align: center;
margin-right: 10px;
}
.item-title-content {
font-size: 16px;
color: #222222;
line-height: 25px;
.line-clamp(2);
}
&.item-recommend {
.item-title-content {
text-indent: 50px;
}
}
}
.item-content-bottom {
padding-top: 10px;
display: flex;
justify-content: space-between;
.item-bottom-item {
display: flex;
align-items: center;
@IconSize: 15px;
.item-bottom-icon {
width: @IconSize;
height: @IconSize;
}
.item-bottom-text {
line-height: 16px;
font-size: 12px;
color: #999999;
margin-left: 7px;
}
}
}
}
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<section class="home-banner">
<van-swipe class="banner-swiper" :autoplay="autoplay" lazy-render @change="handleChange">
<van-swipe-item class="swiper-item" v-for="(item, idx) in banners" :key="idx">
<img v-if="item.imgUrl" class="banner-img" :src="item.imgUrl" @click="handleItem(item)" />
<div v-else class="banner-img white">
<div class="banner-img skeleton"></div>
</div>
</van-swipe-item>
<template #indicator>
<div class="nafmii-indicator">
<span class="indicator-item" :class="{'indicator-active': active == idx}" v-for="(item, idx) in banners" :key="idx" />
</div>
</template>
</van-swipe>
</section>
</template>
<script>
export default {
name: 'HomeBanner',
props: {
},
data () {
return {
autoplay: 5000,
active: 0,
banners: [
{},
{}
]
}
},
methods: {
handleItem (banner) {
},
handleChange (index) {
this.active = index
}
}
}
</script>
<style lang="less" scoped>
.white {
background: #eee;
}
@PaddingSize: 15;
.home-banner {
margin-top: @PaddingSize;
.banner-swiper {
.banner-img {
height: 145px;
border-radius: 5px;
width: 100%;
}
@PointSize: 5px;
.nafmii-indicator {
position: absolute;
left: 0;
bottom: 10px;
right: 0;
display: flex;
align-items: center;
justify-content: center;
height: @PointSize;
.indicator-item {
background: rgba(255, 255, 255, 0.4);
width: @PointSize;
height: @PointSize;
border-radius: calc(@PointSize / 2);
margin: 0 4px;
&.indicator-active {
background: white;
width: 21.5px;
}
}
}
}
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<section class="menu-module">
<div class="menu-module-item" v-for="(item, idx) in datas" :key="idx" @click="handleClickItem(item)">
<img v-if="item.icon" class="menu-icon" :src="item.icon">
<div v-else class="menu-icon"></div>
<span v-if="item.name" class="menu-name">{{item.name}}</span>
<div v-else class="menu-name white"></div>
</div>
</section>
</template>
<script>
export default {
name: 'MenuModule',
props: {
},
data () {
return {
datas: [
{ id: 1, name: '', icon: '', type: '' },
{ id: 2, name: '', icon: '', type: '' },
{ id: 3, name: '', icon: '', type: '' },
{ id: 4, name: '', icon: '', type: '' },
{ id: 5, name: '', icon: '', type: '' },
{ id: 6, name: '', icon: '', type: '' },
{ id: 7, name: '', icon: '', type: '' },
{ id: 8, name: '', icon: '', type: '' },
]
}
},
methods: {
handleClickItem (item) {
}
}
}
</script>
<style lang="less" scoped>
.white {
width: 90%;
background: #eee;
}
.menu-module {
display: flex;
flex-wrap: wrap;
width: 100%;
padding-top: 5px;
@ModulePaddingTop: 25px;
.menu-module-item {
padding-top: @ModulePaddingTop;
width: 25%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
@IconSize: 50px;
.menu-icon {
background: #eee;
height: @IconSize;
width: @IconSize;
border-radius: calc(@IconSize / 2);
}
.menu-name {
display: block;
margin-top: 10px;
line-height: 20px;
min-height: 20px;
font-size: 14px;
text-align: center;
color: #444444;
}
}
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div class="home nafmii-head-bg1">
<nafm-header :leftArrow="false" navClass="nafmii-head-bg1">
<div class="head-custom-container">
<SearchInput :placeholder="$t('home.searchPlaceholder')" :readonly="true" @click="handleSearch" />
<div class="head-message-box">
<img src="@/assets/icon/message.png" alt="">
</div>
</div>
</nafm-header>
<main>
<HomeBanner />
<MenuModule />
<DataModule v-for="item in modules" :key="item.type" v-bind="item" @clickTop="handleTop(item)" />
</main>
</div>
</template>
<script>
import SearchInput from '@/components/SearchInput'
import HomeBanner from './components/HomeBanner'
import MenuModule from './components/MenuModule'
import DataModule from './components/DataModule'
export default {
name: "Home",
components: { HomeBanner, MenuModule, DataModule, SearchInput },
data () {
console.log();
return {
modules: [
{ type: '1', name: this.$t('home.disclosure'), dateText: this.$t('home.disclosureDate'), isTop: true },
{ type: '2', name: this.$t('home.news'), dateText: this.$t('home.updateDate'), isTop: false },
{ type: '3', name: this.$t('home.registered'), dateText: this.$t('home.updateDate'), isTop: false }
]
};
},
methods: {
jumpLogin () {
this.$router.push({
name: "Login",
});
},
handleSearch () {
this.$router.push({ name: 'GlobalSearch' })
},
handleTop (module) {
const modules = []
for (const item of this.modules) {
const isTop = item.type == module.type
isTop ? modules.unshift(item) : modules.push(item)
Object.assign(item, { isTop })
}
this.modules = modules
}
},
};
</script>
<style lang="less" scoped>
.home {
@PaddingSize: 15px;
main {
padding: 0 @PaddingSize;
}
}
@PaddingSize: 15px;
@HeadHeight: 50px;
.head-custom-container {
width: 100%;
height: @HeadHeight;
display: flex;
align-items: center;
@InputHeight: 33px;
.search-input-box {
width: 100%;
height: @InputHeight;
border-radius: calc(@InputHeight / 2);
background-color: rgba(255, 255, 255, 0.2);
padding: 0 @PaddingSize;
display: flex;
align-items: center;
@SearchIconSize: 12px;
.search-icon {
background: white;
width: @SearchIconSize;
height: @SearchIconSize;
}
.search-placeholder {
color: white;
font-size: 12px;
padding-left: 22px;
}
}
@MessageBoxSize: 23px;
.head-message-box {
width: @MessageBoxSize;
height: @MessageBoxSize;
margin-left: @PaddingSize;
}
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<section></section>
</template>
<script>
export default {
name: 'SearchDataLayout',
props: {
},
data () {
return {}
},
methods: {
}
}
</script>
\ No newline at end of file \ No newline at end of file
<template>
<div class="search-layout nafmii-head-bg3">
<nafm-header navClass="nafmii-head-bg3">
<SearchInput class="search-input" v-model="keyword" :placeholder="$t('home.searchPlaceholder')" @search="handleSearch" />
</nafm-header>
<div class="history-container" v-if="history">
<SearchHistory stateKey="Home" @jumpPage="emitSearchValue" />
</div>
<SearchDataLayout v-else />
</div>
</template>
<script>
import SearchInput from '@/components/SearchInput'
import SearchHistory from '@/components/SearchHistory'
import SearchDataLayout from './SearchDataLayout'
export default {
name: 'HomeSearch',
components: { SearchInput, SearchHistory, SearchDataLayout },
props: {
history: Boolean,
defKeyword: String
},
data () {
return {
keyword: ''
}
},
watch: {
defKeyword (val, old) {
this.keyword = val
}
},
methods: {
handleSearch (val) {
this.$store.dispatch('search/APushHomeSearchValue', val)
this.emitSearchValue(val)
},
emitSearchValue (val) {
this.$emit('search', val)
}
},
mounted () {
// this.keyword = this.defKeyword
}
}
</script>
<style lang="less" scoped>
.search-layout {
height: 100%;
display: flex;
flex-direction: column;
.search-input {
width: 100%;
padding-left: 40px;
}
.history-container {
flex: 1;
}
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<SearchLayout :history="true" @search="handleSearch" />
</template>
<script>
import SearchLayout from './components/SearchLayout'
export default {
name: 'HomeSearch',
components: { SearchLayout },
data () {
return {
}
},
methods: {
handleSearch (val) {
this.$router.push({ name: 'GlobalSearchResult', query: { keyword: val } })
}
}
}
</script>
<template>
<div class="home-search">
<SearchLayout :history="false" :defKeyword="keyword" />
</div>
</template>
<script>
import SearchLayout from './components/SearchLayout'
export default {
name: 'HomeSearchResult',
components: { SearchLayout },
data () {
return {
keyword: null
}
},
mounted () {
const { keyword } = this.$route.query
this.keyword = keyword
}
}
</script>
\ No newline at end of file \ No newline at end of file
<template>
<div class="business_container">
<NafmHeader navClass="nafmii-head-bg3" title="业务开展列表" />
<main class="business_content">
<van-list v-model="loading" :finished="finished" finished-text="没有更多了" @load="onLoad">
<van-cell v-for="(item, index) in businessList" :key="index">
<div slot="title" class="title">{{item.title}}</div>
<p slot="label" class="info">
<span class="update_time">
<van-icon :name="timeIcon" />
{{$t('mbusiness.updateTime')}}{{item.update_time}}
</span>
<span class="org">{{item.org}}</span>
</p>
</van-cell>
</van-list>
</main>
</div>
</template>
<script>
export default {
name: "BusinessList",
data() {
return {
businessList: [{
title: '南京市高淳区城市投资有限公司关于发行2021年度第一期中期票据的注册报告',
update_time: '2021-4-12',
org: 'MTN'
},{
title: '广州越秀金融控股集团股份有限公司关于发行2021年度第二期中期票据的注册报告',
update_time: '2021-4-12',
org: 'MTN'
}],
loading: false,
finished: false,
timeIcon: require('@/assets/icon/time_update.png')
}
},
methods: {
onLoad() {
setTimeout(() => {
this.finished = true
}, 3000)
}
}
}
</script>
<style lang="less" scoped>
.business_container {
.title {
color: #222222;
font-size: 16px;
text-align: justify;
}
.info {
color: #888d8d;
line-height: 16px;
font-size: 12px;
display: flex;
justify-content: space-between;
.update_time {
display: flex;
align-items: center;
.van-icon {
font-size: 14px;
margin-right: 6px;
}
}
}
::v-deep(.van-icon) {
line-height: 16px;
}
}
</style>
<template>
<div class="contact_item">
<p>
<span class="title">{{$t('mcontact.contactName')}}</span>
<span class="info">{{contact.name || '--'}}</span>
</p>
<p>
<span class="title">{{$t('mcontact.contactType')}}</span>
<span class="info">{{contact.name || '--'}}</span>
</p>
<p>
<span class="title">{{$t('mcontact.dept')}}</span>
<span class="info">{{contact.name || '--'}}</span>
</p>
<p>
<span class="title">{{$t('mcontact.position')}}</span>
<span class="info">{{contact.name || '--'}}</span>
</p>
<p>
<span class="title">{{$t('mcontact.officePhone')}}</span>
<span class="info">{{contact.name || '--'}}</span>
</p>
<p>
<span class="title">{{$t('mcontact.mobilePhone')}}</span>
<span class="info">{{contact.name || '--'}}</span>
</p>
</div>
</template>
<script>
export default {
name: "ContanctItem",
props: {
contact: {
type: Object,
default() {
return {}
}
}
},
data() {
return {
}
}
}
</script>
<style lang="less" scoped>
.contact_item {
padding: 6px 15px;
border-radius: 8px;
background-color: #ffffff;
box-shadow: 0px 0px 6px 0px rgba(2, 15, 41, 0.06);
margin-bottom: 10px;
p {
display: flex;
justify-content: space-between;
line-height: 34px;
font-size: 14px;
.title {
color: #666666;
}
.info {
color: #333333;
}
}
}
</style>
<template>
<div class="contact_containier">
<NafmHeader navClass="nafmii-head-bg3" title="联系人列表" />
<main class="contact_content">
<contact-item v-for="contactItem in contactList" :key="contactItem.id" :contact-item="contactItem"></contact-item>
</main>
</div>
</template>
<script>
export default {
data() {
return {
contactList: [{},{},{}]
}
},
components: {
contactItem: ()=>import("./contactItem.vue")
}
}
</script>
<style lang="less" scoped>
.contact_containier {
width: 100%;
height: 100%;
background-color: #fafafa;
.contact_content {
width: 384px;
margin: 16px auto 0;
display: flex;
flex-direction: column;
}
}
</style>
<template>
<div>
<NafmHeader navClass="nafmii-head-bg3" :title="$t('mlogin.membershipGuide')" />
{{$t('mlogin.membershipGuide')}}
</div>
</template>
<script>
export default {
name: 'MemberGuide',
data() {
return {
}
}
}
</script>
<style lang="less" scoped>
</style>
<template>
<div class="login_container">
<img src="@/assets/icon/bg_login_2.png" />
<div class="login_box">
<NafmHeader navClass="nafmii-head-bg1" title=" " />
</div>
<main class="login_content">
<van-form class="login_form">
<van-field v-model="code" :left-icon="shtyxydmIcon" :placeholder="$t('mlogin.code')">
</van-field>
<van-field v-model="password" :left-icon="passwordIcon" type="password" :placeholder="$t('mlogin.password')">
</van-field>
<van-field v-model="checkCode" :left-icon="verificationIcon" :placeholder="$t('mlogin.verificationCode')">
<template #button>
<span class="verfication_code">111111</span>
</template>
</van-field>
<p class="wraning_tip">
<span v-show="isLogin">{{$t('mlogin.warningTip')}}</span>
</p>
<div>
<van-button :class="isLogin ? 'login_btn' : 'act_btn login_btn'" block type="info" native-type="submit" @click="loginSubmit">登录</van-button>
</div>
</van-form>
</main>
<div class="membership_about">
<van-cell :title="$t('mlogin.membershipGuide')" is-link to="/member/memberGuide" />
<van-cell :title="$t('mlogin.FAQ')" is-link to="/member/membershipGuide" />
<van-cell :title="$t('mlogin.memberRules')" is-link to="/member/membershipGuide" />
</div>
</div>
</template>
<script>
export default {
name: "MemberLogin",
data() {
return {
code: '',
password: '',
checkCode: '',
passwordIcon: require('@/assets/icon/password.png'),
verificationIcon: require('@/assets/icon/verification.png'),
shtyxydmIcon: require('@/assets/icon/shtyxydm.png'),
}
},
computed: {
isLogin() {
return !this.code || this.code === '' || !this.password || this.password === '' || !this.checkCode || this.checkCode === ''
}
},
methods: {
loginSubmit() {
if (!this.code || this.code === '') {
return Toast(this.$t('mlogin.code'))
}
if (!this.password || this.password === '') {
return Toast(this.$t('mlogin.password'))
}
if (!this.checkCode || this.checkCode === '') {
return Toast(this.$t('mlogin.verificationCode'))
}
this.$router.push({
name: 'LoginResult'
})
}
}
}
</script>
<style lang="less" scoped>
.login_container {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
.login_box {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100px;
}
.login_content {
display: flex;
align-items: center;
justify-content: center;
.login_form {
width: 330px;
padding: 20px 0;
background-color: #ffffff;
::v-deep .van-cell:not(:last-child)::after {
border-bottom: 1px solid #efefef;
}
::v-deep .van-cell {
padding-right: 0 !important;
padding-left: 0 !important;
border-bottom: 1px solid #ebedf0;
}
::v-deep .van-cell:not(:last-child)::after {
border: none;
}
::v-deep .van-field__control {
font-size: 14px;
color: #333333;
}
input::-webkit-input-placeholder {
color: #8f9196;
}
input::-moz-input-placeholder {
color: #8f9196;
}
input::-ms-input-placeholder {
color: #8f9196;
}
.wraning_tip {
min-height: 17px;
color: #ea5c6d;
font-size: 12px;
margin-top: 16px;
}
.login_btn {
width: 100%;
border-radius: 5px;
text-align: center;
height: 45px;
line-height: 45px;
color: #fff;
font-size: 16px;
margin-top: 20px;
background-image: linear-gradient(to right, #25a3df, #106abc);
// background: linear-gradient(to right, #25a3df, #106abc);
border: none;
opacity: 0.3;
}
.act_btn {
opacity: 1;
}
}
}
.membership_about {
flex: 1;
background-color: #f6f6f6;
.van-cell {
background-color: #f6f6f6;
font-size: 14px;
}
}
}
</style>
<template>
<div class="change_container">
<NafmHeader navClass="nafmii-head-bg3" :title="$t('mprogress.changeProgress')" />
<main class="change_content">
<progress-component :steps-info="steps" :progress-title="$t('mprogress.changeProgress')">
<template slot="title">变更记录</template>
</progress-component>
</main>
</div>
</template>
<script>
export default {
name: "ChangeProgress",
components: {
progressComponent: ()=>import('../progress.vue')
},
data() {
return {
steps: [{
title: '1212121212',
time: '2021.01.01'
}, {
title: '1212121212',
time: '2021.01.01'
}, {
title: '1212121212',
time: '2021.01.01'
}]
}
}
}
</script>
<style lang="less" scoped>
.change_container {
width: 100%;
height: 100%;
background-color: #fafafa;
}
</style>
<template>
<div class="change_list_container">
<NafmHeader navClass="nafmii-head-bg3" :title="$t('memberservice.change')" />
<main class="change_list_content">
<section class="name list_item">
<van-cell is-link to="/member/changeProgress">
<div slot="title" class="item_info">
<div class="item_icon"></div>
<span>{{$t('mprogress.organizationName')}}</span>
</div>
</van-cell>
</section>
<section class="represent list_item">
<van-cell is-link to="/member/changeProgress">
<div class="item_info">
<div class="item_icon"></div>
<span>{{$t('mprogress.organizationRepresentive')}}</span>
</div>
</van-cell>
</section>
<section class="type list_item">
<van-cell is-link to="/member/changeProgress">
<div class="item_info">
<div class="item_icon"></div>
<span>{{$t('mprogress.membershipType')}}</span>
</div>
</van-cell>
</section>
</main>
</div>
</template>
<script>
export default {
name: "ChangeList",
data() {
return {
}
}
}
</script>
<style lang="less" scoped>
.change_list_container {
padding: 15px;
.list_item {
display: flex;
width: 100%;
margin-bottom: 10px;
&.name {
background-color: #e7efff;
.item_icon {
background: url("../../../../assets/icon/change_name.png") no-repeat;
}
}
&.represent {
background-color: #f8f1df;
.item_icon {
background: url("../../../../assets/icon/change_representive.png")
no-repeat;
}
}
&.type {
background-color: #f8e8eb;
.item_icon {
background: url("../../../../assets/icon/change_membership.png")
no-repeat;
}
}
::v-deep .van-cell {
background-color: transparent;
}
::v-deep .van-icon {
height: 50px;
line-height: 50px;
}
.item_info {
line-height: 30px;
padding: 10px 0;
display: flex;
align-items: center;
color: #444444;
font-size: 16px;
.item_icon {
width: 30px;
height: 30px;
background-size: contain;
margin-right: 10px;
}
span {
font-family: PingFangSC-Semibold;
}
}
}
}
</style>
<template>
<div class="join_container">
<NafmHeader navClass="nafmii-head-bg3" :title="$t('mprogress.joinProgress')" />
<main class="join_content">
<progress-component :steps-info="steps" :progress-title="$t('mprogress.joinProgress')"></progress-component>
</main>
</div>
</template>
<script>
export default {
name: "JoinProgress",
components: {
progressComponent: ()=>import('./progress.vue')
},
data() {
return {
steps: [{
title: '1212121212',
time: '2021.01.01'
}, {
title: '1212121212',
time: '2021.01.01'
}, {
title: '1212121212',
time: '2021.01.01'
}]
}
}
}
</script>
<style lang="less" scoped>
.join_container {
width: 100%;
height: 100%;
background-color: #fafafa;
}
</style>
<template>
<div class="progress_container">
<main class="progress_content">
<section class="progress_own">
<h3 class="section_title">{{progressTitle}}</h3>
<div class="section_content">
<van-steps direction="vertical" :active="1">
<van-step v-for="stepItem in stepsInfo" :key="stepItem.id">
<van-icon slot="active-icon" :name="actIcon" />
<van-icon slot="inactive-icon" :name="normalIcon" />
<van-icon slot="finish-icon" :name="normalIcon" />
<div class="step_content">
<span class="step_left">
<h3 class="step_title">{{stepItem.title}}</h3>
<a href="" class="step_link" v-if="stepItem.link">{{stepItem.link}}</a>
</span>
<span class="step_right">{{stepItem.time}}</span>
</div>
</van-step>
</van-steps>
</div>
</section>
<section v-if="progressTitle === '变更进度'" class="progress_expand">
<h3 class="section_title">
<slot name="title">
</slot>
</h3>
<main class="section_content">
<slot name="content">
</slot>
</main>
</section>
<section class="progress_dialogue">
<h3 class="section_title">
留言
</h3>
<main>
<h3 class="dialogue_time">
2021.05.31 14:00:00
</h3>
<div class="association">
<div class="avator">
</div>
<div class="left">
<h4 class="dialogue_name">aaaaaaa</h4>
<div class="dialogue_content">
<span class="arrow"></span>
你打开手机都是宝宝辅食的吧
</div>
</div>
</div>
<div class="member_org">
<div class="right">
<h4 class="dialogue_name">bbbbbb</h4>
<div class="dialogue_content">
<span class="arrow"></span>
城市的见客户反馈技术的开发计划第三空间发挥打开手机话费快结束的
</div>
</div>
<div class="avator">
</div>
</div>
</main>
</section>
</main>
</div>
</template>
<script>
export default {
name: "ProgressComponent",
props: {
stepsInfo: {
type: Object|Object,
default: ()=> {
return {}
}
},
progressTitle: {
type: String,
default: ()=> {
return ''
}
}
},
data() {
return {
actIcon: require('@/assets/icon/progress_act.png'),
normalIcon: require('@/assets/icon/progress_normal.png')
}
},
}
</script>
<style lang="less" scoped>
.progress_container {
margin: 15px;
.section_title {
font-size: 16px;
line-height: 16px;
padding-left: 6px;
color: #222222;
font-family: PingFangSC-Semibold;
border-left: 2.5px solid #135faa;
}
.section_content {
margin: 15px 0;
background-color: #ffffff;
border-radius: 8px;
box-shadow: 0px 0px 6px 0px rgba(2, 15, 41, 0.06);
}
}
.van-steps {
border-radius: 8px;
}
::v-deep .van-step--vertical {
opacity: 0.3;
.van-step__circle-container {
margin-left: 0.9px;
}
.van-step__line {
opacity: 0.3;
}
}
::v-deep .van-step--finish,
::v-deep .van-step--process {
opacity: 1;
}
::v-deep .van-step--finish {
.van-step__line {
opacity: 1;
}
}
::v-deep .van-step__line {
background: linear-gradient(
to bottom,
#106abc,
#106abc 2px,
transparent 2px,
transparent
);
background-size: 100% 4px;
}
::v-deep .van-hairline::after {
border: none;
}
.step_content {
display: flex;
justify-content: space-between;
.step_left {
.step_title {
font-size: 15px;
color: #333333;
line-height: 21px;
}
.step_link {
font-size: 12px;
line-height: 17px;
color: #388de2;
text-decoration: underline;
}
}
.step_right {
font-size: 12px;
color: #666666;
line-height: 17px;
}
}
.progress_dialogue {
.dialogue_time {
font-size: 10px;
font-family: PingFangSC-Regular;
color: #999999;
margin: 15px 0;
text-align: center;
}
.association {
margin-right: 46px;
}
.member_org {
margin-left: 46px;
}
.association,
.member_org {
display: flex;
justify-content: space-between;
.avator {
width: 36px;
height: 36px;
border-radius: 50%;
border: 1px solid red;
}
.dialogue_name {
font-size: 11px;
font-family: PingFangSC-Regular;
color: #737373;
}
.dialogue_content {
width: 290px;
padding: 10px;
font-size: 14px;
color: #202020;
line-height: 20px;
margin-bottom: 15px;
position: relative;
border-radius: 4px;
box-shadow: 0px 0px 6px 0px rgba(2, 15, 41, 0.06);
z-index: 5;
.arrow {
display: block;
position: absolute;
top: 10px;
width: 10px;
height: 10px;
background-color: #ffffff;
}
}
.left {
.dialogue_name {
text-align: left;
}
.dialogue_content {
background-color: #ffffff;
.arrow {
left: -5px;
background-color: #ffffff;
transform: rotate(-45deg);
}
}
}
.right {
.dialogue_name {
text-align: right;
}
.dialogue_content {
background-color: #ecf2ff;
.arrow {
right: -5px;
background-color: #ecf2ff;
transform: rotate(45deg);
}
}
}
}
}
</style>
<template>
<div class="quit_container">
<NafmHeader navClass="nafmii-head-bg3" :title="$t('mprogress.quitProgress')" />
<main class="quit content">
<progress-component :steps-info="steps" :progress-title="$t('mprogress.quitProgress')"></progress-component>
</main>
</div>
</template>
<script>
export default {
name: "QuitProgress",
components: {
progressComponent: ()=>import('./progress.vue')
},
data() {
return {
steps: [{
title: '1212121212',
time: '2021.01.01'
}, {
title: '1212121212',
time: '2021.01.01'
}, {
title: '1212121212',
time: '2021.01.01'
}]
}
}
}
</script>
<style lang="less" scoped>
.quit_container {
width: 100%;
height: 100%;
background-color: #fafafa;
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div class="project_container">
<NafmHeader navClass="nafmii-head-bg3" title="项目详情" />
<main class="project_content">
<h2 class="title">
{{detailInfo.title}}
</h2>
<p class="status">
<span>
{{detailInfo.status}}
</span>
</p>
<section class="basic_info">
<h3 class="section_title">
项目基本信息
</h3>
<div class="basic_content">
<p>
<span class="item_title">企业名称</span>
<span class="item_info">{{detailInfo.basicInfo.companyName}}</span>
</p>
<p>
<span class="item_title">品种</span>
<span class="item_info">{{detailInfo.basicInfo.variety}}</span>
</p>
<p>
<span class="item_title">注册或备案</span>
<span class="item_info">{{detailInfo.basicInfo.record}}</span>
</p>
<p>
<span class="item_title">注册金额(亿元)</span>
<span class="item_info">{{detailInfo.basicInfo.registeredCapital}}</span>
</p>
<p>
<span class="item_title">主承销商</span>
<span class="item_info">{{detailInfo.basicInfo.leadUnderwriter}}</span>
</p>
<p>
<span class="item_title">会计师事务所</span>
<span class="item_info">{{detailInfo.basicInfo.CPAFirm}}</span>
</p>
<p>
<span class="item_title">律师事务所</span>
<span class="item_info">{{detailInfo.basicInfo.lawFirm}}</span>
</p>
<p>
<span class="item_title">注册通知书文号</span>
<span class="item_info">{{detailInfo.basicInfo.registrationNoticeNo}}</span>
</p>
<p>
<span class="item_title">更新日期</span>
<span class="item_info">{{detailInfo.basicInfo.updateTime}}</span>
</p>
</div>
</section>
<section class="msg_open">
<h3 class="section_title">
信息披露
</h3>
<nav>
<span :class="actNav === item.id ? 'act_nav' : ''" v-for="item in navList" :key="item.id" @click="navSwitch(item.id)">{{item.name}}</span>
</nav>
<main class="msg_content">
<div class="msg_item" v-for="item in msgList" :key="item.id">
<p class="msg_title">
<van-icon :name="PDFIcon" />
<a href="">{{item.title}}</a>
</p>
<p class="update_time">
<van-icon :name="clockIcon" />
更新时间:
{{item.updateTime}}
</p>
</div>
</main>
</section>
</main>
</div>
</template>
<script>
export default {
name: 'ProjectDetail',
data() {
return {
detailInfo: {
title: '南京市高淳区城市投资有限公司关于发行2021年度第一期中期票据的注册文件',
status: '已受理',
basicInfo: {
companyName: '南京市高淳区城市投资有限公司',
variety: 'MTN',
record: '注册',
registeredCapital: '8',
leadUnderwriter: 'XXX',
CPAFirm: 'XXX',
lawFirm: 'XXX',
registrationNoticeNo: '中市协注[2021]MTN199号',
updateTime: '2021.05.01'
}
},
navList: [{
name: '初稿',
id: 'first',
}, {
name: '上会稿',
id: 'middle'
}, {
name: '终稿',
id: 'final'
}],
actNav: 'first',
msgList: [{
title: '【初稿】无锡产业发展集团有限公司2020年三季度财务报表',
updateTime: '2021-4-12 ',
id: 1
}, {
title: '【初稿】无锡产业发展集团有限公司2020年三季度财务报表',
updateTime: '2021-4-12 ',
id: 2
}],
PDFIcon: require('@/assets/icon/pdf.png'),
clockIcon: require('@/assets/icon/icon_clock.png')
}
},
methods: {
navSwitch(actNav) {
this.actNav = actNav
}
}
}
</script>
<style lang="less" scoped>
.project_container {
width: 100%;
height: 100%;
.project_content {
width: 384px;
margin: 16px auto 0;
.title {
color: #333333;
font-size: 19px;
font-family: PingFangSC-Semibold;
}
.status {
text-align: right;
padding: 13px 0;
span {
display: inline-block;
width: 51px;
text-align: center;
font-size: 11px;
line-height: 20px;
color: #ffffff;
border-radius: 10px;
background-color: #0079ff;
}
}
.section_title {
color: #222222;
font-size: 16px;
font-family: PingFangSC-Semibold;
line-height: 16px;
padding-left: 6px;
border-left: 2.5px solid #135faa;
}
.basic_info {
padding: 5px 0;
.basic_content {
margin: 15px 0;
padding: 0px 15px;
border-radius: 8px;
background-color: #ffffff;
box-shadow: 0px 0px 6px 0px rgba(2, 15, 41, 0.06);
p {
display: flex;
justify-content: space-between;
font-size: 14px;
line-height: 34px;
.item_title {
color: #666666;
}
.item_info {
color: #333333;
}
}
}
}
.msg_open {
nav {
text-align: center;
margin: 20px 0;
span {
color: #666666;
font-size: 12px;
margin: 0 24px;
}
.act_nav {
color: #135faa;
font-size: 14px;
font-family: PingFangSC-Semibold;
border-bottom: 2.5px solid #135faa;
}
}
.msg_item {
border-radius: 8px;
background-color: #ffffff;
box-shadow: 0px 0px 6px 0px rgba(2, 15, 41, 0.06);
margin-bottom: 10px;
}
.msg_title {
font-size: 13px;
margin-left: 15px;
border-bottom: 0.5px solid rgba(2, 15, 41, 0.06);
display: flex;
padding: 10px 0;
.van-icon {
font-size: 35px;
}
a {
color: #388de2;
padding: 0 15px;
}
}
.update_time {
display: flex;
align-items: center;
text-align: right;
color: #888d8d;
font-size: 12px;
padding: 10px 15px;
}
}
}
}
</style>
<template>
<div class="login_result">
<NafmHeader :title="$t('title.membershipServices')" />
<main class="result_content">
<section class="member_basic">
<van-cell class="bg_transparent">
<h3 slot="title" class="title">{{memberInfo.name}}</h3>
<div slot="label">
<p>
<span>{{$t('mdetail.socialCode')}}</span>
<span class="info">{{memberInfo.shtyxydm}}</span>
</p>
<p>
<span>{{$t('mdetail.memberStatus')}}</span>
<span class="info">{{memberInfo.status}}</span>
</p>
<p>
<span>{{$t('mdetail.memberLevel')}}</span>
<span class="info">{{memberInfo.level}}</span>
</p>
<p>
<span>{{$t('mdetail.memberType')}}</span>
<span class="info">{{memberInfo.type}}</span>
</p>
</div>
</van-cell>
<van-cell>
<p slot="default" class="tip_more">
<span class="warning_tip"> {{$t('memberservice.tip1')}} </span>
<span class="more" @click="toOtherRouter('MemberDetail')">
{{$t('memberservice.more')}}
<van-icon :name="moreIcon" />
</span>
</p>
</van-cell>
</section>
<section class="member_opration">
<div class="in">
<van-cell is-link :icon="joinIcon" @click="toOtherRouter('JoinProgress')">
<template #title>
<span class="oper_title">{{$t('memberservice.join')}}</span>
</template>
</van-cell>
</div>
<div class="out">
<van-cell is-link :icon="quitIcon" @click="toOtherRouter('QuitProgress')">
<template #title>
<span class="oper_title">{{$t('memberservice.quit')}}</span>
</template>
</van-cell>
</div>
<div class="change">
<van-cell is-link :icon="changeIcon" @click="toOtherRouter('ChangeList')">
<template #title>
<span class="oper_title">{{$t('memberservice.change')}}</span>
</template>
</van-cell>
</div>
</section>
</main>
<footer class="bottom_tip">
{{$t('memberservice.tip2')}}
</footer>
</div>
</template>
<script>
export default {
name: 'MembrshipService',
data() {
return {
memberInfo: {
name: '山证国际证券有限公司',
shtyxydm: 'HK344TZ00000000001',
status: '欠费状态',
level: '境外机构',
type: '投资人'
},
joinIcon: require('@/assets/icon/join_member.png'),
quitIcon: require('@/assets/icon/quit_member.png'),
changeIcon: require('@/assets/icon/change_member.png'),
moreIcon: require('@/assets/icon/icon_arrow_right.png')
}
},
methods: {
toOtherRouter(routerName) {
this.$router.push({
name: routerName
})
}
}
}
</script>
<style lang="less" scoped>
.login_result {
width: 100%;
height: 100%;
background: url("../../../assets/icon/bg_member.png") no-repeat;
background-size: 100%;
display: flex;
flex-direction: column;
.result_content {
flex: 1;
}
}
.van-cell {
border-radius: 8px;
background-color: transparent;
}
.member_basic {
width: 396px;
// height: 231px;
margin: 10px auto;
border-radius: 8px;
background: url("../../../assets/icon/bg_member_result.png") no-repeat;
background-size: 100% 100%;
.title {
font-weight: bold;
}
p {
line-height: 30px;
.info {
color: #000000;
}
}
.tip_more {
font-size: 12px;
display: flex;
justify-content: space-between;
align-items: center;
.warning_tip {
color: #ea5c6d;
}
.more {
display: inline-block;
width: 20%;
color: #666666;
align-items: center;
}
}
}
.member_opration {
margin: 15px;
.in {
.van-cell {
background-color: #e7efff;
}
}
.out {
.van-cell {
background-color: #f8e8eb;
}
}
.change {
.van-cell {
background-color: #f8f1df;
}
}
.van-cell {
margin-bottom: 10px;
.van-cell__left-icon {
font-size: 26px;
}
.oper_title {
margin-left: 10px;
font-size: 16px;
color: #444444;
font-family: PingFangSC-Semibold;
}
}
}
.bottom_tip {
flex: 0;
font-size: 12px;
color: #999999;
background: #f6f6f6;
padding: 10px 15px;
}
</style>
<template>
<div>
<NafmHeader navClass="nafmii-head-bg3" title="会员基本信息" />
<main class="member_basic">
<h3>
<span class="oper_title">{{memberInfo.name}}</span>
</h3>
<van-cell>
<p slot="default">
<span>{{$t('mdetail.socialCode')}}</span>
<span>{{memberInfo.shtyxydm || '--'}}</span>
</p>
</van-cell>
<van-cell>
<p slot="default">
<span>{{$t('mdetail.orgCode')}}</span>
<span>{{memberInfo.status || '--'}}</span>
</p>
</van-cell>
<van-cell>
<p slot="default">
<span>{{$t('mdetail.orgType')}}</span>
<span>{{memberInfo.orgType || '--'}}</span>
</p>
</van-cell>
<van-cell>
<p slot="default">
<span>{{$t('mdetail.establishedTime')}}</span>
<span>{{memberInfo.createTime || '--'}}</span>
</p>
</van-cell>
<van-cell>
<p slot="default">
<span>{{$t('mdetail.corporateRepresentative')}}</span>
<span>{{memberInfo.legalRepresentative || '--'}}</span>
</p>
</van-cell>
<van-cell>
<p slot="default">
<span>{{$t('mdetail.registeredCapital')}}</span>
<span>{{memberInfo.registeredCapital || '--'}}</span>
</p>
</van-cell>
<van-cell>
<p slot="default">
<span>{{$t('mdetail.address')}}</span>
<span>{{memberInfo.address || '--'}}</span>
</p>
</van-cell>
<van-cell>
<p slot="default">
<span>{{$t('mdetail.memberStatus')}}</span>
<span>{{memberInfo.status || '--'}}</span>
</p>
</van-cell>
<van-cell>
<p slot="default">
<span>{{$t('mdetail.memberLevel')}}</span>
<span>{{memberInfo.level || '--'}}</span>
</p>
</van-cell>
<van-cell>
<p slot="default">
<span>{{$t('mdetail.memberType')}}</span>
<span>{{memberInfo.type || '--'}}</span>
</p>
</van-cell>
<van-cell>
<p slot="default">
<span>{{$t('mdetail.representative')}}</span>
<span>{{memberInfo.representativeName || '--'}}</span>
</p>
</van-cell>
<van-cell is-link to="/member/businessList">
<p slot="default">
<span>{{$t('mdetail.businessSituation')}}</span>
</p>
</van-cell>
<van-cell is-link to="/member/contactList">
<p slot="default">
<span>{{$t('mdetail.contactList')}}</span>
</p>
</van-cell>
</main>
</div>
</template>
<script>
export default {
name: "MemberDetail",
data() {
return {
memberInfo: {
name: '山证国际证券有限公司',
shtyxydm: 'HK344TZ00000000001',
status: '欠费状态',
level: '境外机构',
type: '投资人'
}
}
}
}
</script>
<style lang="less" scoped>
.member_basic {
margin-top: 16px;
margin-right: 20px;
.oper_title {
display: inline-block;
height: 16px;
line-height: 16px;
color: #222222;
font-size: 16px;
font-family: PingFangSC-Semibold;
margin: 16px;
padding-left: 5px;
border-left: 2.5px solid #135faa;
vertical-align: middle;
}
p {
display: flex;
justify-content: space-between;
color: #333333;
font-size: 14px;
}
.van-cell {
margin-right: 20px;
}
}
</style>
<template>
<div class="pdf_container">
<NafmHeader navClass="nafmii-head-bg3" title="详情页面">
<template #bottom>
<div class="header">
<div class="header_left">
<span class="pre" @click="handlePre">上一页</span>
<span class="next" @click="handleNext">下一页</span>
</div>
<div class="center">
<input type="text" v-model.number="inputValue" class="inputClass" @change="handleChange"> <span>/ {{pageCount}}</span>
</div>
<div class="header_right">
<span class="pre" @click="handleScaleBig">放大</span>
<span class="pre" @click="handleScaleSmall">缩小</span>
<span class="next" @click="handleReset">重置</span>
</div>
</div>
</template>
</NafmHeader>
<Pdf :src="src" ref="wrapper" :page="currentPage" @num-pages="pageCount = $event" @page-loaded="currentPage = $event" @loaded="onLoad" />
</div>
</template>
<script>
import Pdf from 'vue-pdf'
export default {
components: {
Pdf
},
data() {
return {
inputValue: 1,
currentPage: 0,
pageCount: 0,
fileUrl: `${window.location.origin}/study.pdf`,
numPages: undefined,
src: '',
scale: 100,
}
},
created() {
this.src = Pdf.createLoadingTask(this.fileUrl)
},
mounted() {
// this.src.promise.then(pdf => {
// this.numPages = pdf.numPages
// })
console.log('---', this.currentPage)
},
methods: {
onLoad(val) {
this.currentPage = val || 1
this.inputValue = this.currentPage
// this.src.then(pdf => { this.currentPage = pdf.numPages; });
// this.src.promise.then(pdf => {
// this.currentPage = pdf.numPages
// })
},
handlePre() {
if (this.currentPage == 1) {
Toast('已在第一页')
return
} else {
this.currentPage--
}
this.inputValue = this.currentPage
},
handleNext() {
if (this.currentPage == this.pageCount) {
Toast('已在末页')
return
} else {
this.currentPage++
}
this.inputValue = this.currentPage
},
pageLoad(val) {
console.log(val, this.currentPage);
},
handleChange(e) {
console.log('val-->', val)
const val = e.target.value
if (val > this.pageCount) {
Toast('输入值不能大于总页数')
this.inputValue = ''
return
}
if (val < 1 || val == "" || val == '') {
Toast('输入值小于了最小页数')
this.inputValue = ''
return
}
try {
console.log('val', val);
this.currentPage = Number(val)
} catch (e) {
console.log(e);
}
},
handleScaleBig() {
this.scale += 5;
this.$refs.wrapper.$el.style.width = parseInt(this.scale) + "%";
},
handleScaleSmall() {
if (this.scale == 100) {
return;
}
this.scale += -5;
this.$refs.wrapper.$el.style.width = parseInt(this.scale) + "%";
},
handleReset(){
this.scale = 100;
this.$refs.wrapper.$el.style.width = parseInt(this.scale) + "%";
this.currentPage = 1
this.inputValue = 1
}
}
}
</script>
<style lang="less" scoped>
.header {
display: flex;
height: 50px;
align-items: center;
.pre {
width: 50px;
margin-right: 5px;
}
.next {
width: 50px;
}
.center {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
}
}
.inputClass {
width: 50px;
color: #333;
margin-right: 2px;
text-align: center;
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div class="pdf_container">
<NafmHeader navClass="nafmii-head-bg3" title="详情页面">
<template #bottom>
<div class="header">
<div class="header_left">
<span class="pre" @click="handlePre">上一页</span>
<span class="next" @click="handleNext">下一页</span>
</div>
<div class="center">
<input type="text" v-model.number="inputValue" class="inputClass" @change="handleChange"> <span>/ {{pageCount}}</span>
</div>
<div class="header_right">
<span class="pre" @click="handleScaleBig">放大</span>
<span class="pre" @click="handleScaleSmall">缩小</span>
<span class="next" @click="handleReset">重置</span>
</div>
</div>
</template>
</NafmHeader>
<Pdf v-for="(i,index) in numPages" :key="i" :src="src" :ref="`wrapper${index}`" :page="i" @num-pages="pageCount = $event" @page-loaded="currentPage = $event" />
</div>
</template>
<script>
import Pdf from 'vue-pdf'
export default {
components: {
Pdf
},
data() {
return {
inputValue: 1,
currentPage: 0,
pageCount: 0,
fileUrl: `${window.location.origin}/study.pdf`,
numPages: undefined,
src: '',
scale: 100,
}
},
created() {
this.src = Pdf.createLoadingTask(this.fileUrl)
this.src.promise.then(pdf => {
this.numPages = pdf.numPages
})
},
mounted() {
// this.src.promise.then(pdf => {
// this.numPages = pdf.numPages
// })
console.log('---', this.currentPage)
},
methods: {
onLoad(val) {
this.currentPage = val || 1
this.inputValue = this.currentPage
// this.src.then(pdf => { this.currentPage = pdf.numPages; });
},
handlePre() {
if (this.currentPage == 1) {
Toast('已在第一页')
return
} else {
this.currentPage--
}
this.inputValue = this.currentPage
},
handleNext() {
if (this.currentPage == this.pageCount) {
Toast('已在末页')
return
} else {
this.currentPage++
}
this.inputValue = this.currentPage
},
pageLoad(val) {
console.log(val, this.currentPage);
},
handleChange(e) {
console.log('val-->', val)
const val = e.target.value
if (val > this.pageCount) {
Toast('输入值不能大于总页数')
this.inputValue = ''
return
}
if (val < 1 || val == "" || val == '') {
Toast('输入值小于了最小页数')
this.inputValue = ''
return
}
try {
console.log('val', val);
this.currentPage = Number(val)
} catch (e) {
console.log(e);
}
},
handleScaleBig() {
const canvas = document.querySelector('canvas')
this.scale += 10;
// canvas.style.width = parseInt(this.scale) + "%";
canvas.style.width = parseInt(this.scale) + "%";
canvas.style.height = parseInt(100) + "%";
},
handleScaleSmall() {
const canvas = document.querySelector('canvas')
if (this.scale == 100) {
return;
}
this.scale += -10;
canvas.style.width = parseInt(this.scale) + "%";
canvas.style.height = parseInt(100) + "%";
},
handleReset() {
const canvas = document.querySelector('canvas')
canvas.style.width = parseInt(100) + "%";
canvas.style.height = parseInt(100) + "%";
this.currentPage = 1
this.inputValue = 1
}
}
}
</script>
<style lang="less" scoped>
.header {
display: flex;
height: 50px;
align-items: center;
.pre {
width: 50px;
margin-right: 5px;
}
.next {
width: 50px;
}
.center {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
}
}
.inputClass {
width: 50px;
color: #333;
margin-right: 2px;
text-align: center;
}
/deep/ .annotationLayer {
margin-bottom: 10px;
border-bottom: 10px solid #ccc;
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<section class="agreement_item">
<main v-if="navItem.children" class="item_content">
<p v-for="(item, index) in navItem.children" :key="index">
<span class="title">{{item.title}}</span>
<span class="update_time">{{item.time}}</span>
</p>
</main>
</section>
</template>
<script>
export default {
data() {
return {
}
},
props: {
navItem: {
type: Object,
default: () => {
return {}
}
}
},
updated() {
console.log(this.navItem)
}
}
</script>
<style lang="less" scoped>
.agreement_item {
.item_title {
font-size: 13px;
padding: 10px 0;
color: #999999;
}
.item_content {
padding: 15px;
border-radius: 8px;
background-color: #ffffff;
box-shadow: 0px 0px 6px 0px rgba(2, 15, 41, 0.06);
p {
display: flex;
justify-content: space-between;
line-height: 30px;
}
.title {
font-size: 14px;
color: #333333;
}
.update_time {
font-size: 13px;
color: #666666;
}
}
}
</style>
<template>
<section class="agreement_item">
<h3 class="item_title">{{agreementItem.time}}</h3>
<main v-if="agreementItem.children" class="item_content">
<p v-for="(item, index) in agreementItem.children" :key="index">
<span class="title">{{item.title}}</span>
<span v-if="item.manager" class="manager">{{item.manager}}</span>
</p>
</main>
</section>
</template>
<script>
export default {
data() {
return {
}
},
props: {
agreementItem: {
type: Object,
default: () => {
return {}
}
}
}
}
</script>
<style lang="less" scoped>
.agreement_item {
.item_title {
font-size: 13px;
padding: 10px 0;
color: #999999;
}
.item_content {
padding: 15px;
border-radius: 8px;
background-color: #ffffff;
box-shadow: 0px 0px 6px 0px rgba(2, 15, 41, 0.06);
p {
display: flex;
justify-content: space-between;
line-height: 30px;
}
.title {
font-size: 14px;
color: #333333;
}
.update_time {
font-size: 13px;
color: #666666;
}
}
}
</style>
<template>
<div class="agreement_container">
<NafmHeader navClass="nafmii-head-bg3" title="《NAGMII主协议》">
<template slot="bottom">
<nav class="tab_bar">
<div v-for="navItem in barList" :key="navItem.id" :class="actNav === navItem.id ? 'act_item' : 'nav_item'" @click="navSwitch(navItem.id)">
<p>{{navItem.title}}</p>
<div v-show="actNav === navItem.id" class="under_line"></div>
</div>
</nav>
</template>
</NafmHeader>
<main class="agreement_content">
<section v-if="actNav === 'time'">
<time-item v-for="(item, index) in timeAgreements" :key="index" :agreement-item="item">
</time-item>
</section>
<section v-if="actNav === 'letter'">
<van-index-bar :sticky-offset-top="80">
<div v-for="item in letterAgreements" :key="item.title">
<van-index-anchor :index="item.title" />
<letter-item :nav-item="item"></letter-item>
</div>
</van-index-bar>
</section>
</main>
<section class="remark">
<h3 class="title">备注:</h3>
<ul class="content">
<li>《NAFMII主协议》非法人产品管理人名单自2020年起进行公示</li>
<li>《债券回购主协议》非法人产品管理人名单自2018年起进行公示</li>
</ul>
</section>
</div>
</template>
<script>
export default {
computed: {
barList() {
return [{
title: this.$t('agreement.time'),
id: 'time'
}, {
title: this.$t('agreement.letter'),
id: 'letter'
}]
}
},
data() {
return {
actNav: 'time',
letterAgreements: [{
title: 'A',
children: [{
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-03'
}, {
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-04'
}, {
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-05'
}, {
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-06'
}, {
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-07'
}]
}, {
title: 'B',
children: [{
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-03'
}, {
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-04'
}, {
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-05'
}, {
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-06'
}, {
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-07'
}]
}, {
title: 'C',
children: [{
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-03'
}, {
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-04'
}, {
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-05'
}, {
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-06'
}, {
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-07'
}]
}, {
title: 'D',
children: [{
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-03'
}, {
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-04'
}, {
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-05'
}, {
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-06'
}, {
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-07'
}]
}, {
title: 'E',
children: [{
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-03'
}, {
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-04'
}, {
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-05'
}, {
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-06'
}, {
title: 'XXXXXXXXXXXXX公司',
time: '2020-03-07'
}]
}],
timeAgreements: [{
time: '2021-03-03',
children: [{
title: 'XXXXXXXXXXXXX公司'
}, {
title: 'XXXXXXXXXXXXX公司'
}, {
title: 'XXX产品',
manager: 'XXX'
}, {
title: 'XXXXXXXXXXXXX公司'
}]
}]
}
},
components: {
letterItem: ()=> import('./components/letterItem.vue'),
timeItem: ()=> import('./components/timeItem.vue')
},
methods: {
navSwitch(id) {
this.actNav = id
}
}
}
</script>
<style lang="less" scoped>
.agreement_container {
width: 384px;
margin: 0 auto;
}
.tab_bar {
width: 384px;
margin: 6px auto;
display: flex;
justify-content: space-around;
font-size: 15px;
color: #ffffff;
background: transparent;
.act_item {
font-size: 19px;
font-family: PingFangSC-Semibold;
}
.under_line {
width: 30px;
height: 2.5px;
background: #ffffff;
margin: 0 auto;
}
}
.remark {
line-height: 20px;
margin: 20px 0;
.title {
font-size: 14px;
color: #333333;
font-weight: bold;
}
.content {
font-size: 12px;
color: #999999;
}
}
::v-deep .van-index-bar__sidebar {
border: 0.5px solid #dadada;
background-color: #f2f2f2;
margin-right: 10px;
padding: 10px 0;
border-radius: 11px;
.van-index-bar__index {
display: block;
padding: 0;
width: 20px;
line-height: 22px;
text-align: center;
font-size: 10px;
color: #777879;
}
}
</style>
<template>
<div class="detail_container">
<NafmHeader navClass="nafmii-head-bg3" title="资质查询" />
<section class="detail_content">
<van-cell-group class="">
<van-cell>
<span slot="title" class="detail_title">{{qulificationDetail.name}}</span>
<span class="org_type">{{$t('qulification.orgType')}}{{qulificationDetail.orgType}}</span>
</van-cell>
<van-cell>
<span slot="title" class="label">{{$t('qulification.membership')}}</span>
<span class="info"></span>
</van-cell>
<van-cell>
<span slot="title" class="label">{{$t('qulification.membershipType')}}</span>
<span class="info">{{qulificationDetail.memberType}}</span>
</van-cell>
<van-cell>
<span slot="title" class="label">{{$t('qulification.underwriterType')}}</span>
<span class="info">{{qulificationDetail.memberType}}</span>
</van-cell>
<van-cell>
<span slot="title" class="label">{{$t('qulification.marketmaker')}}</span>
<span class="info">{{qulificationDetail.memberType}}</span>
</van-cell>
<van-cell>
<span slot="title" class="label">{{$t('qulification.mitigation')}}</span>
<span class="info">{{qulificationDetail.memberType}}</span>
</van-cell>
<van-cell>
<span slot="title" class="label">{{$t('qulification.masterAgree')}}</span>
<span class="info">
<div class="master_agreement" @click="toMasterAgreement">《NAFMII主协议》</div>
{{qulificationDetail.memberType}}
</span>
</van-cell>
</van-cell-group>
</section>
</div>
</template>
<script>
export default {
name: 'QulificationDetail',
data() {
return {
qulificationDetail: {
name: '中国银行诏安支行',
orgType: 'XXXX',
isMember: true,
memberType: '投资人',
}
}
},
methods: {
toMasterAgreement() {
this.$router.push({name: 'MasterAgreement'})
}
}
}
</script>
<style lang="less" scoped>
.detail_content {
.detail_title {
font-size: 16px;
color: #222222;
font-family: PingFangSC-Semibold;
border-left: 2.5px solid #135faa;
padding-left: 5px;
}
.org_type {
color: #999999;
font-size: 14px;
}
.label {
font-size: 14px;
color: #161818;
}
.info {
font-size: 14px;
color: #666666;
}
.master_agreement {
color: #245fae;
text-decoration: underline;
}
}
</style>
<template>
<div class="list_container">
<NafmHeader navClass="nafmii-head-bg3" title="资质查询">
<template slot="bottom">
<div class="search_bar">
<van-field v-model="searchName" placeholder="请输入机构名称">
<template #label>
<div class="select" :style="searchName && searchName!== '' ? 'opacity: 1' : 'opacity: 0.6'">
<van-icon name="search" />
<span class="qulification_type">{{qulificationType}}</span>
<van-icon name="play" />
</div>
</template>
</van-field>
</div>
</template>
</NafmHeader>
<main class="list_content">
<section class="content">
<van-cell-group>
<van-cell v-for="item in searchList" :key="item.id" icon="search">
<template slot="title">
<!-- <van-icon name="search" /> -->
<!-- <span>{{item.name.replace(new RegExp(searchName, 'g'), '<span></span>')}}</span> -->
<span>{{item.name}}</span>
</template>
</van-cell>
</van-cell-group>
</section>
</main>
</div>
</template>
<script>
export default {
name: 'QulificationList',
data() {
return {
searchName: 'aaa',
qulificationType: '机构',
searchList: [{name: 'aaaaaaabbbbb', id: 111}]
}
}
}
</script>
<style lang="less" scoped>
.search_bar {
width: 384px;
padding: 10px 15px;
.van-cell {
border-radius: 50px;
background-color: rgba(255, 255, 255, 0.3);
padding: 0px;
::v-deep .van-field__control {
font-size: 12px;
color: #ffffff;
}
::v-deep input::-webkit-input-placeholder {
color: rgba(255, 255, 255, 0.6);
}
::v-deep input::-moz-input-placeholder {
color: rgba(255, 255, 255, 0.6);
}
::v-deep input::-ms-input-placeholder {
color: rgba(255, 255, 255, 0.6);
}
}
}
.select {
color: #ffffff;
display: flex;
align-items: center;
padding: 0 10px 0 5px;
font-size: 12px;
.van-icon-search {
margin: 0 11px;
}
.qulification_type {
margin-right: 5px;
}
.van-icon-play {
transform: rotate(90deg);
-ms-transform: rotate(90deg); /* IE 9 */
-moz-transform: rotate(90deg); /* Firefox */
-webkit-transform: rotate(90deg); /* Safari 和 Chrome */
-o-transform: rotate(90deg);
}
}
</style>
<template>
<div class="qulification_search_container">
<NafmHeader navClass="nafmii-head-bg3" title="资质查询" />
<main class="qulification_content">
<section class="logo">
</section>
<h3 class="search_title">{{$t('qulification.title')}}</h3>
<section class="search_box">
<span class="select" @click="showSheet = true">
<van-icon name="search" />
<span class="qulification_type">{{qulificationType}}</span>
<van-icon name="play" />
</span>
<div class="visual_input" @click="toListSearch">
<span>{{placeholdTxt}}</span>
</div>
</section>
<section class="search_history">
<div class="history_header">
<span>{{$t('qulification.history')}}</span>
<span class="delete_circle">
<van-icon name="delete" />
</span>
</div>
<div>
<span class="history_item" v-for=" item in historyItems" :key="item.id" @click="toDetail">{{item.name}}</span>
</div>
</section>
</main>
<van-action-sheet v-model="showSheet" :actions="actions" :cancel-text="$t('button.cancel')" close-on-click-action @select="onSelect" />
</div>
</template>
<script>
export default {
name: 'QulificationSearch',
computed: {
actions() {
return [this.$t('qulification.searchAction').org, this.$t('qulification.searchAction').product ]
}
},
data() {
return {
// actions: [
// {name:'机构', type: 'org' },
// {name:'非法人产品', type: 'pro'}
// ],
qulificationType: '',
placeholdTxt: '',
showSheet: false,
historyItems: [{
name: 'jdnskjfnjkds',
id:11111
}, {
name: 'dksjnjkfdskjnkf',
id: 2222
}, {name: 'jdnskjfnjkds',
id:111112
}, {
name: 'dksjnjkfdskjnkf',
id: 22222
}]
}
},
created() {
this.defaultInput()
},
methods: {
defaultInput() {
this.qulificationType = this.$t('qulification.searchAction').org.name
this.placeholdTxt = this.$t('qulification.searchAction').org.placeholder
},
onSelect(item) {
this.show = false;
this.qulificationType = item.name;
this.placeholdTxt = this.$t('qulification.searchAction')[item.key].placeholder
},
toListSearch() {
this.$router.push({name: 'QulificationList'})
},
toDetail() {
this.$router.push({name: 'QulificationDetail'})
}
}
}
</script>
<style lang="less" scoped>
.qulification_search_container {
width: 384px;
margin: 0 auto;
.logo {
display: block;
width: 100px;
height: 100px;
margin: 15px auto;
background: url(../../assets/icon/logo.png) no-repeat;
background-size: contain;
}
.search_title {
font-size: 16px;
font-family: PingFangSC-Semibold;
color: #333333;
text-align: center;
}
.search_box {
width: 384px;
margin: 30px auto 25px;
border-radius: 16px;
background-color: rgba(246, 246, 246, 1);
display: flex;
font-size: 12px;
.select {
color: #999999;
display: flex;
align-items: center;
padding: 10px 10px 10px 5px;
.van-icon-search {
margin: 0 11px;
font-size: 12px;
}
.qulification_type {
color: #333333;
margin-right: 5px;
}
.van-icon-play {
transform: rotate(90deg);
-ms-transform: rotate(90deg); /* IE 9 */
-moz-transform: rotate(90deg); /* Firefox */
-webkit-transform: rotate(90deg); /* Safari 和 Chrome */
-o-transform: rotate(90deg);
}
}
.visual_input {
// width: 285px;
color: #999999;
padding: 10px 0;
overflow: hidden; /*超出部分隐藏*/
white-space: nowrap; /*不换行*/
text-overflow: ellipsis; /*超出部分文字以...显示*/
span {
padding-left: 15px;
border-left: 0.5px solid #999999;
}
}
}
.search_history {
.history_header {
line-height: 25px;
margin-bottom: 5px;
font-size: 14px;
display: flex;
justify-content: space-between;
align-items: center;
.delete_circle {
display: inline-block;
width: 25px;
height: 25px;
border-radius: 50%;
background-color: #f6f6f6;
text-align: center;
line-height: 25px;
// .van-icon-delete {
// align-self: middle;
// }
}
}
.history_item {
display: inline-block;
font-size: 12px;
color: #666666;
padding: 6px 20px;
border-radius: 50px;
background-color: #f6f6f6;
margin: 10px 10px 0 0;
}
}
}
</style>
<template>
<Popup :value="value" @input="val=>this.$emit('input',val)" @reset="handleReset" @sure="handleSure">
<h3>项目状态</h3>
<div class="status_list">
<van-checkbox-group v-model="resultOne" class="checkboxGroup" ref="groupOne">
<van-checkbox :name="item.value" class="checkbox_item_common checkbox_item_1" v-for="(item,index) in checkboxArrOne" :key="index">{{item.label}}</van-checkbox>
</van-checkbox-group>
</div>
<h3>品种</h3>
<div class="class_list">
<van-checkbox-group v-model="resultTwo" class="checkboxGroup" ref="groupTwo">
<van-checkbox :name="item.value" class="checkbox_item_common checkbox_item_2" v-for="(item,index) in checkboxArrTwo" :key="index">{{item.label}}</van-checkbox>
</van-checkbox-group>
</div>
</Popup>
</template>
<script>
import Popup from '@/components/Popup'
export default {
name: 'FilterPopup',
components: {
Popup
},
props: {
value: Boolean,
checkboxArrOne: {
type: Array,
default: () => []
},
checkboxArrTwo: {
type: Array,
default: () => []
},
},
data() {
return {
resultOne: [], // 项目状态 选择的结果
resultTwo: [] // 品种 选择的结果
}
},
methods: {
handleReset() {
this.$refs.groupOne.toggleAll(false)
this.$refs.groupTwo.toggleAll(false)
this.$emit('reset')
},
handleSure() {
this.$emit('sure', this.resultOne, this.resultTwo)
}
}
}
</script>
<style lang="less" scoped>
h3 {
display: flex;
height: 57px;
align-items: center;
}
.mtb15 {
margin: 15px 0;
}
.checkboxGroup {
display: flex;
width: 100%;
flex-wrap: wrap;
.checkbox_item_common {
position: relative;
display: flex;
height: 40px;
align-items: center;
justify-content: center;
background-color: #f6f6f6;
margin-right: 10px;
margin-bottom: 10px;
font-size: 12px;
}
.checkbox_item_1 {
width: calc(50% - 5px);
&:nth-child(2n + 2) {
margin-right: 0;
}
}
.checkbox_item_2 {
width: calc(33% - 10px);
&:nth-child(3n + 3) {
margin-right: 0;
}
}
}
/deep/ .van-icon-success {
display: none;
}
/deep/ .van-checkbox__label {
margin-left: 0;
color: #666;
}
/deep/ .van-checkbox__icon .van-icon {
border: 0;
}
/deep/ .van-checkbox__icon--checked {
position: absolute;
background-color: #135faa;
width: 100%;
height: 40px;
}
/deep/ .van-checkbox__icon--checked + .van-checkbox__label {
position: absolute;
color: #fff;
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div class="search-layout">
<nafm-header title="注册发行" navClass="nafmii-head-bg3">
<template #bottom>
<SearchInput v-model.trim="keyword" placeholder="请输入企业名称/注册报告名称/主承销商" :readonly="readonly" @click="jumpSearch" @search="handleSearch" />
<img :src="require('@/assets/icon/filter.png')" class="filter" v-if="!history" @click="show=true" />
</template>
</nafm-header>
<div class="history-container" v-if="history">
<SearchHistory stateKey="RegIssue" @jumpPage="handleSearch" />
</div>
<slot />
<FilterPopup :checkboxArrOne="checkboxArrOne" :checkboxArrTwo="checkboxArrTwo" v-model="show" @rest="handleReset" @sure="handleSure" />
</div>
</template>
<script>
import SearchInput from '@/components/SearchInput';
import SearchHistory from '@/components/SearchHistory';
import FilterPopup from './FilterPopup';
export default {
name: 'RegIssueLayout',
components: {
SearchInput,
SearchHistory,
FilterPopup
},
props: {
history: Boolean,
defKeyword: String,
readonly: Boolean
},
data() {
return {
keyword: '',
show: false,
checkboxArrOne: [{
label: '待上会',
value: 1
}],
checkboxArrTwo: [{
label: 'SCP',
value: 1
}],
}
},
watch: {
defKeyword(val, old) {
this.keyword = val
},
},
methods: {
// 点击历史搜索页面tag签 或者搜索关键字回车 跳转到 搜索页面
handleSearch(val) {
this.$store.dispatch('search/APushRegIssueSearchValue', val)
this.onSeachAction(val)
},
// 确定
handleSure(arrOne, arrTwo) {
console.log('arrOne', arrOne);
console.log('arrTwo', arrTwo);
this.show = false
this.onSeachAction()
},
// input click 跳转 注册发行 首页
jumpSearch() {
this.$emit('jumpSeachPage')
},
// 注册发行搜索 回车 跳转搜索结果页面 或者 直接搜索
onSeachAction(val) {
const params = {
keyword: val,
arrOne: this.arrOne,
arrTwo: this.arrTwo
}
this.$emit('search', params)
},
// 重置
handleReset() {
},
}
}
</script>
<style lang="less" scoped>
.search-layout {
height: 100%;
display: flex;
flex-direction: column;
.history-container {
flex: 1;
}
}
/deep/ .nav_bottom_container {
display: flex;
flex-direction: row;
align-items: center;
.filter {
width: 18px;
height: 21px;
margin-left: 15px;
}
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div class="regIssue_content">
<van-list v-model="loading" :finished="finished" finished-text="已经到底了" @load="onLoad">
<div class="regIssue_list">
<div class="regIssue_item" v-for="(item,index) in list" :key="index">
<h3>{{item.title}}</h3>
<div class="bottom">
<div class="btm_left">
<img :src="require('@/assets/icon/time_update.png')">
<span class="time">更新日期:{{item.time}} </span>
</div>
<div class="btm_right">{{item.type}}</div>
</div>
</div>
</div>
</van-list>
</div>
</template>
<script>
export default {
name: 'RegIssueList',
data() {
return {
loading: false,
finished: false,
show: false,
list: [
{
title: '南京市高淳区城市投资有限公司关于发行2021年度第一期中期票据的注册报告',
time: '2021-4-12',
type: 'MTN'
},
{
title: '南京市高淳区城市投资有限公司关于发行2021年度第一期中期票据的注册报告',
time: '2021-4-12',
type: 'MTN'
}
],
}
},
methods: {
onLoad() {
this.finished = true
this.loading = false
},
}
}
</script>
<style lang="less" scoped>
.regIssue_list {
padding: 0 15px;
.regIssue_item {
padding: 10px 0 12px 0;
border-bottom: 1px solid #f8f8f8;
display: flex;
flex-direction: column;
h3 {
color: #222;
font-size: 16px;
}
.bottom {
display: flex;
flex-direction: row;
margin-top: 10px;
color: #888d8d;
font-size: 12px;
justify-content: space-between;
.btm_left {
display: flex;
align-items: center;
}
img {
width: 17px;
height: 17px;
margin-right: 7px;
}
}
}
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<RegIssueLayout :history="false" :readonly="true" @jumpSeachPage="jumpSeachPage">
<RegIssueList />
</RegIssueLayout>
</template>
<script>
import RegIssueLayout from './components/RegIssueLayout';
import RegIssueList from './components/RegIssueList';
export default {
name: 'RegIssue', // 注册发行首页
components: {
RegIssueLayout,
RegIssueList
},
data() {
return {}
},
methods: {
jumpSeachPage() {
this.$router.push({
name: 'RegIssueSearch'
})
}
}
}
</script>
\ No newline at end of file \ No newline at end of file
<template>
<RegIssueLayout :history="true" @search="jumpResultPage" />
</template>
<script>
import RegIssueLayout from './components/RegIssueLayout';
export default {
name: 'ResIssueSearch', // 注册发行搜索页面
components: {
RegIssueLayout
},
data() {
return {}
},
mounted() {
},
methods: {
jumpResultPage(params) {
const { keyword } = params
if (!keyword) {
Toast('搜索内容不能为空')
return
}
this.$router.push({
name: 'RegIssueSearchResult',
query: {
keyword
}
})
}
}
}
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file \ No newline at end of file
<template>
<RegIssueLayout :history="false" :defKeyword="keyword" @search="handleSearch">
<RegIssueList />
</RegIssueLayout>
</template>
<script>
import RegIssueLayout from './components/RegIssueLayout';
import RegIssueList from './components/RegIssueList';
export default {
name: 'ResIssueSearch', // 注册发行 搜索结果页面
components: {
RegIssueLayout,
RegIssueList
},
data() {
return {
keyword: ''
}
},
mounted() {
const { keyword } = this.$route.query;
this.keyword = keyword
const params = {
keyword
}
this.handleRequest(params)
},
methods: {
handleRequest(params) {
this.$store.dispatch('regIssue/ARequestRegIssueList', params)
},
handleSearch(val) {
if (!val) {
Toast('搜索内容不能为空')
return
}
// todo
const params = {
keyword: val,
}
this.handleRequest(params)
}
}
}
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div class="about_container">
<NafmHeader navClass="nafmii-head-bg3" :title="$t('title.privacyPolicy')" />
<div class="about_content">
<img :src="logoIcon" alt="">
<h3>中国银行间市场交易商协会</h3>
<div class="version">Version 2.1</div>
<p>
中国银行间市场交易商协会是由市场参与者自愿组成的,包括银行间债券市场、同业拆借市场、外汇市场、票据市场和黄金市场在内的银行间市场的自律组织,会址设在北京。协会英文名称为National Association of Financial Market Institutional
Investors,缩写为NAFMII。协会经国务院同意、民政部批准于2007年9月3日成立,为全国性的非营利性社会团体法人,其业务主管部门为中国人民银行。协会会员包括单位会员和个人会员,银行间债券市场、拆借市场、外汇市场、票据市场和黄金市场的参与者、中介机构及相关领域的从业人员和专家学者均可自愿申请成为协会会员。协会单位会员将涵盖政策性银行、商业银行、信用社、保险公司、证券公司、信托公司、投资基金、财务公司、信用.评级公司、大中型工商企业等各类金融机构和非金融机构。
</p>
</div>
</div>
</template>
<script>
export default {
name: 'About',
data() {
return {
logoIcon: require('@/assets/icon/logo_2.png')
}
}
}
</script>
<style lang="less" scoped>
.about_container {
background: #fff;
height: 100vh;
}
.about_content {
display: flex;
flex-direction: column;
align-items: center;
img {
width: 59px;
height: 56px;
margin-top: 30px;
}
h3 {
color: #333;
font-size: 16px;
margin-top: 15px;
}
.version {
color: #666;
font-size: 14px;
margin-top: 3px;
}
p {
width: 384px;
text-align: justify;
line-height: 27px;
color: #666;
font-size: 15px;
margin-top: 20px;
}
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div class="user_center ">
<NafmHeader navClass="nafmii-head-bg2" :leftArrow="false">
<div class="header">
<div class="header_left">
<img :src="headerIcon">
</div>
<div class="header_right" @click="jumpPersonPage">
<div class="right_txt" v-if="GIsLogin">
<div class="nick">凝视你的目光</div>
<div class="phone">183****8924</div>
</div>
<div class="right_txt" v-else>
<div class="nick">{{$t('center.login')}}</div>
<div class="phone">{{$t('center.konwMore')}}</div>
</div>
<div class="iconfont iconright"></div>
</div>
</div>
</NafmHeader>
<div class="center_menu_list">
<van-cell :title="$t('center.message')" center is-link to="/user/message" :icon="icon.message" value-class="right_content">
<template #default>
<div class="dot" v-if="GIsLogin"></div>
</template>
</van-cell>
<van-cell :title="$t('center.collect')" center is-link to="/user/collect" :icon="icon.collect" />
<van-cell :title="$t('center.study')" center is-link @click="jumpStudyPage" :icon="icon.study" value-class="right_content" />
<van-cell :title="$t('center.question')" center is-link to="/user/question" :icon="icon.question" />
<van-cell :title="$t('center.feedBack')" center is-link to="/user/feedback" :icon="icon.feedback" />
<van-cell :title="$t('center.about')" center is-link to="/user/about" :icon="icon.about" value-class="right_content">
<template #default>
<div v-if="GIsLogin">版本2.1</div>
</template>
</van-cell>
<van-cell :title="$t('center.setting')" center is-link to="/user/setting" :icon="icon.setting" />
</div>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
export default {
name: 'Center',
data() {
return {
headerIcon: require('@/assets/icon/photo_default.png'),
icon: {
message: require('@/assets/icon/center_message.png'),
collect: require('@/assets/icon/center_collect.png'),
study: require('@/assets/icon/center_study.png'),
question: require('@/assets/icon/center_question.png'),
feedback: require('@/assets/icon/center_feedback.png'),
about: require('@/assets/icon/center_about.png'),
setting: require('@/assets/icon/center_setting.png'),
},
}
},
computed: {
...mapGetters('user', ['GIsLogin'])
},
methods: {
// 跳转到我到学习页面
jumpStudyPage() {
},
// 跳转到 个人设置中心
jumpPersonPage() {
this.$router.push({
path: '/user/person'
})
}
},
}
</script>
<style lang="less">
@import "~@/assets/css/variable.less";
.user_center {
background-color: #fafafa;
height: 100vh;
}
.nav_content_container {
position: relative;
z-index: 999;
}
.header {
padding: 35px 0;
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
.header_left {
width: 62px;
height: 62pxpx;
border-radius: 50%;
margin-right: 12px;
img {
width: 100%;
}
}
.header_right {
display: flex;
justify-content: space-between;
align-items: center;
flex: 1;
color: @colorfff;
.nick {
font-size: 19px;
}
.phone {
margin-top: 3px;
font-size: 14px;
}
}
}
.center_menu_list {
background-color: #fff;
.right_content {
display: flex;
align-items: center;
justify-content: flex-end;
}
.dot {
width: 8px;
height: 8px;
background: #ff4038;
border-radius: 50%;
}
}
.van-cell:not(:last-child)::after {
right: 16px;
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div class="collect_container">
<NafmHeader navClass="nafmii-head-bg3" :title="$t('title.collect')">
<template #right>
<div @click="handleClear">{{$t('button.clear')}}</div>
</template>
</NafmHeader>
<div class="collect_content">
<van-list v-model="loading" :finished="finished" finished-text="没有更多了" @load="onLoad">
<van-swipe-cell>
<div class="list">
</div>
<template #right>
<van-button square text="删除" type="danger" class="delete-button" />
</template>
</van-swipe-cell>
</van-list>
</div>
</div>
</template>
<script>
export default {
name: 'Collect',
data() {
return {
loading: false,
finished: false,
list: [
{
date: '2020-04-11',
content: [{
title: '《1中国银行间市场交易商协会会员代表大会会员代表产生办法》(协会公告[2011]10号)',
type: '自律规则'
}, {
title: '《2中国银行间市场交易商协会会员代表大会会员代表产生办法》(协会公告[2011]10号)',
type: '自律规则'
}]
},
{
date: '2020-04-10',
content: [{
title: '《3中国银行间市场交易商协会会员代表大会会员代表产生办法》(协会公告[2011]10号)',
type: '自律规则'
}, {
title: '《4中国银行间市场交易商协会会员代表大会会员代表产生办法》(协会公告[2011]10号)',
type: '自律规则'
}]
}
]
}
},
methods: {
// 清空收藏
handleClear() {
Dialog.confirm({
title: this.$t('toast.tip'),
message: this.$t('toast.isEmptyContent'),
cancelButtonText: this.$t('button.cancel'),
cancelButtonColor: '#206CB3',
confirmButtonText: this.$t('button.ok'),
confirmButtonColor: '#999999'
})
.then(() => {
// todo
})
.catch(() => {
});
},
// 页面滚动到底部加载数据
onLoad() {
this.loading = false
console.log('加载数据')
}
}
}
</script>
\ No newline at end of file \ No newline at end of file
<template>
<div class="feedback_container">
<NafmHeader navClass="nafmii-head-bg3" :title="$t('title.feedBack')" />
<div class="feedback_content">
<h3>{{$t('feedback.question')}}</h3>
<van-field v-model="content" rows="4" autosize label="" clearable type="textarea" maxlength="200" placeholder="请填写10个字以上的问题描述以便我们提供更好的帮助" show-word-limit />
<h3>{{$t('feedback.images')}}</h3>
<div class="upload_content">
<van-uploader v-model="fileList" multiple :max-count="4" accept="image/*" :max-size="1024 * 1024" @oversize="onOversize" />
<div class="tip">{{$t('feedback.tip')}}</div>
</div>
<h3>单位全称</h3>
<van-field v-model="unit" placeholder="请输入单位全称" />
<h3>联系人</h3>
<van-field v-model="unit" placeholder="请输入联系人名称" />
<h3>联系方式</h3>
<van-field v-model="unit" type="tel" placeholder="请输入联系方式" />
<div class="tip">注:请您务必准确填写单位全称、联系人及联系方式,以便协会工作人员与您核实相关信息。</div>
<div class="login_btn" :class="{loginActive:isBothValue}" @click="handleSubmit">提交</div>
</div>
</div>
</template>
<script>
export default {
name: 'FeedBack',
data() {
return {
content: '',
fileList: [
{ url: 'https://img01.yzcdn.cn/vant/leaf.jpg' },
{ url: 'https://img01.yzcdn.cn/vant/leaf.jpg' },
{ url: 'https://img01.yzcdn.cn/vant/leaf.jpg' },
],
unit: ''
}
},
computed: {
isBothValue() {
if (this.content) {
return true
} else {
return false
}
},
},
methods: {
// 超出1M提示
onOversize(file) {
console.log(file);
Toast('文件大小不能超过 1M');
},
// 提交
handleSubmit() {
}
}
}
</script>
<style lang="less" scoped>
.feedback_content {
display: flex;
flex-direction: column;
margin: 0px auto;
width: 384px;
h3 {
display: flex;
height: 50px;
align-items: center;
font-size: 16px;
color: #333;
}
/deep/ .van-field {
box-shadow: 0px 0px 5px #ddd;
border-radius: 10px;
}
.upload_content {
box-shadow: 0px 0px 5px #ddd;
border-radius: 10px;
padding: 10px 10px 5px;
}
.tip {
color: #999;
font-size: 11px;
margin-top: 10px;
}
/deep/ .van-uploader__preview-image {
width: 82px;
height: 82px;
}
/deep/ .van-uploader__upload {
width: 82px;
height: 82px;
}
.login_btn {
width: 340px;
margin: 80px auto 0;
border-radius: 5px;
text-align: center;
height: 45px;
line-height: 45px;
color: #fff;
font-size: 16px;
background-image: linear-gradient(to right, #25a3df, #106abc);
opacity: 0.3;
}
.loginActive {
opacity: 1;
}
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div class="login_tabs">
<router-link to="/user/login/phone" :class="{active:type==1}">
手机号登录
<div class="bottom-border-1" v-show="type==1"></div>
</router-link>
<router-link to="/user/login/username" :class="{active:type==2}">
账号密码登录
<div class="bottom-border-2" v-show="type==2"></div>
</router-link>
</div>
</template>
<script>
export default {
name: 'LoginTabs',
props: {
type: {
type: Number,
default: 1
}
},
}
</script>
<style lang="less" scoped>
.login_tabs {
display: flex;
justify-content: center;
position: relative;
a {
position: relative;
color: #6c6c6c;
font-size: 16px;
width: 120px;
height: 30px;
text-align: center;
border-bottom: 1px solid #ccc;
&.active {
color: #106abc;
}
}
.bottom-border-1 {
position: absolute;
width: 80px;
border-bottom: 3px solid #106abc;
top: 26px;
left: 20px;
}
.bottom-border-2 {
position: absolute;
width: 80px;
border-bottom: 3px solid #106abc;
top: 26px;
right: 20px;
}
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div class="login_others">
<div class="otherLogin_title">其他登录方式</div>
<div class="other_icon">
<div class="wechat">
<img :src="wechatIcon" alt="">
<span>微信快速登录</span>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'OtherLogin',
data() {
return {
wechatIcon: require('@/assets/icon/wechat.png'),
}
}
}
</script>
<style lang="less" scoped>
/** 其他登录方式 **/
.login_others {
display: flex;
flex: 1;
flex-direction: column;
justify-content: flex-end;
align-items: center;
padding-bottom: 20px;
.other_icon {
display: flex;
flex-direction: row;
justify-content: center;
margin-top: 5px;
.wechat {
display: flex;
flex-direction: column;
align-items: center;
span {
color: #666;
font-size: 11px;
margin-top: 5px;
}
}
img {
// display: block;
width: 38px;
}
}
}
.otherLogin_title {
position: relative;
color: #666;
font-size: 14px;
&:before {
content: "";
position: absolute;
top: 10px;
left: -30px;
width: 25px;
border-bottom: 1px solid #cfcfcf;
}
&:after {
content: "";
position: absolute;
top: 10px;
right: -30px;
width: 25px;
border-bottom: 1px solid #cfcfcf;
}
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div class="login_container">
<img src="@/assets/icon/bg_login_2.png" />
<div class="login_box">
<NafmHeader navClass="nafmii-head-bg1" :title="title" />
</div>
<div class="login_content">
<div class="login_form_box">
<div class="login_form">
<van-field v-show="type=='phone'" v-model.trim="userName" clearable type="tel" maxlength="11" :left-icon="telIcon" placeholder="请输入手机号" />
<van-field v-show="type=='email'" v-model.trim="email" clearable :left-icon="emailIcon" placeholder="请输入邮箱" />
<van-field v-model="password" clearable label="" maxlength="6" :left-icon="VerificationIcon" placeholder="请输入验证码">
<template #button>
<SendVerificationCode :phone="userName" :email="email" :data="objParams" />
</template>
</van-field>
<div class="login_btn" :class="{loginActive:isBothValue}" @click="jumpResetPasswordPage">确定</div>
</div>
</div>
</div>
</div>
</template>
<script>
import SendVerificationCode from '@/components/SendVerificationCode'
import utils from "@/utils/";
export default {
name: 'Login',
components: {
SendVerificationCode
},
data() {
return {
userName: null,
password: "",
title: '',
type: null,
objParams: {},
email: '',
phone: '',
telIcon: require('@/assets/icon/tel.png'),
emailIcon: require('@/assets/icon/email.png'),
VerificationIcon: require('@/assets/icon/verification.png'),
passwordIcon: require('@/assets/icon/password.png'),
}
},
created() {
const { type } = this.$route.query
this.type = type
Object.assign(this.objParams, {
type
})
if (type == 'phone') {
this.title = '手机号找回'
} else {
this.title = '邮箱找回'
}
},
computed: {
isBothValue() {
if ((this.userName && this.password) || (this.email && this.password)) {
return true
} else {
return false
}
},
},
methods: {
jumpResetPasswordPage() {
const { type } = this.$route.query
if (type == 'phone') {
// 判断手机号不能为空
if (!this.userName) {
Toast('请输入手机号')
return
}
if (!utils.phoneRegCheck(this.userName)) {
Toast("请输入正确的手机号码!");
return
}
} else {
// 判断邮箱不能为空
if (!this.email) {
Toast('请输入邮箱')
return
}
if (!utils.emailRegCheck(this.email)) {
Toast("请输入正确的邮箱格式!");
return
}
}
if (!this.password) {
Toast('请输入验证码')
return
}
this.$router.push({
path: '/user/resetPassword',
query: {
source: 'login'
}
})
}
}
}
</script>
<style lang="less" scoped>
@import "./less/login.less";
</style>
\ No newline at end of file \ No newline at end of file
.login_container {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
}
.login_box {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100px;
}
.login_content {
margin-top: 40px;
}
/deep/ .van-tabs__nav--line {
width: 60%;
margin: 0 auto;
}
/deep/ .van-tab {
border-bottom: 1px solid #b8cfe5;
}
/deep/ .van-tabs__line {
bottom: 4px;
}
.login_form_box {
display: flex;
align-items: center;
justify-content: center;
}
.login_form {
width: 330px;
margin-top: 20px;
}
/deep/ .van-cell:not(:last-child)::after {
border-bottom: 1px solid #efefef;
}
/deep/ .van-cell {
padding-right: 0 !important;
padding-left: 0 !important;
border-bottom: 1px solid #ebedf0;
}
/deep/ .van-cell:not(:last-child)::after {
border: none;
}
.form_second {
margin-top: 10px;
display: flex;
justify-content: flex-end;
color: #999;
.checkbox {
/deep/ .van-checkbox__label {
color: #999;
}
}
.forget {
text-decoration: underline;
}
}
.login_btn {
width: 100%;
border-radius: 5px;
text-align: center;
height: 45px;
line-height: 45px;
color: #fff;
font-size: 16px;
margin-top: 40px;
background-image: linear-gradient(to right, #25A3DF, #106abc);
opacity: 0.3;
}
.loginActive {
opacity: 1;
}
.register_btn {
margin-top: 10px;
display: flex;
justify-content: flex-end;
color: #106ABC;
font-size: 13px;
}
\ No newline at end of file \ No newline at end of file
<template>
<div class="login_container">
<img src="@/assets/icon/bg_login_2.png" />
<div class="login_box">
<NafmHeader navClass="nafmii-head-bg1" />
</div>
<div class="login_content">
<LoginTabs :type="1" />
<div class="login_form_box">
<div class="login_form">
<van-field v-model.trim="phone" clearable type="tel" maxlength="11" :left-icon="phoneIcon" placeholder="请输入手机号" />
<van-field v-model.trim="password" clearable label="" type="tel" maxlength="6" :left-icon="VerificationIcon" placeholder="请输入验证码">
<template #button>
<SendVerificationCode :phone="phone" :data="objParams" />
</template>
</van-field>
<div class="login_btn" :class="{loginActive:isBothValue}" @click="handleLogin">登 录</div>
<div class="register_btn" @click="jumpRigster">立即注册</div>
</div>
</div>
</div>
<OtherLogin />
</div>
</template>
<script>
import LoginTabs from './components/LoginTabs'
import OtherLogin from './components/OtherLogin'
import SendVerificationCode from '@/components/SendVerificationCode'
import utils from "@/utils/";
export default {
name: 'Login',
components: {
LoginTabs,
OtherLogin,
SendVerificationCode
},
data() {
return {
phone: null,
password: "",
objParams: {
type: 'phone'
},
type: 'phone',
phoneIcon: require('@/assets/icon/user.png'),
VerificationIcon: require('@/assets/icon/verification.png'),
}
},
computed: {
isBothValue() {
if (this.phone && this.password) {
return true
} else {
return false
}
},
},
methods: {
// 登录操作
handleLogin() {
if (!this.phone) {
Toast('请输入手机号')
return
}
if (!utils.phoneRegCheck(this.phone)) {
Toast("请输入正确的手机号码!");
return
}
if (!this.password) {
Toast('请输入验证码')
return
}
// todo 请求接口
console.log(1)
},
// 跳转注册页面
jumpRigster() {
this.$router.push({
path: '/user/register',
query:{
source: 'phone'
}
})
},
}
}
</script>
<style lang="less" scoped>
@import "./less/login.less";
// /deep/ .van-field__body input::-webkit-input-placeholder {
// color: #8F9196;
// }
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div class="login_container">
<img src="@/assets/icon/bg_login_2.png" />
<div class="login_box">
<NafmHeader navClass="nafmii-head-bg1" />
</div>
<div class="login_content">
<LoginTabs :type="2" />
<div class="login_form_box">
<div class="login_form">
<van-field v-model.trim="userName" clearable type="tel" maxlength="11" :left-icon="userNameIcon" placeholder="请输入手机号" />
<van-field v-model.trim="password" clearable type="password" label="" maxlength="16" :left-icon="passwordIcon" placeholder="请输入6-16位密码" />
<div class="form_second">
<!-- <van-checkbox v-model="checked" checked-color="#106abc" class="checkbox" shape="square" icon-size="12px">记住密码</van-checkbox> -->
<span class="forget" @click="controllForgetBox(true)">忘记密码</span>
</div>
<div class="login_btn" :class="{loginActive:isBothValue}" @click="handleLogin">登 录</div>
<div class="register_btn" @click="jumpRigster">立即注册</div>
</div>
</div>
</div>
<OtherLogin />
<van-action-sheet v-model="showForget" :actions="actionsForget" cancel-text="取消" close-on-click-action @cancel="controllForgetBox(false)" @select="selectForgetMethod" />
</div>
</template>
<script>
import LoginTabs from './components/LoginTabs'
import OtherLogin from './components/OtherLogin'
import SendVerificationCode from '@/components/SendVerificationCode'
import utils from "@/utils/";
export default {
name: 'Login',
components: {
LoginTabs,
OtherLogin,
SendVerificationCode
},
data() {
return {
userName: null,
password: "",
objParams: {
type: 'phone'
},
type: 'phone',
// checked: false,
userNameIcon: require('@/assets/icon/user.png'),
passwordIcon: require('@/assets/icon/password.png'),
actionsForget: [{ name: '手机号找回', key: 'phone' }, { name: '邮箱找回', key: 'email' }],
showForget: false,
}
},
computed: {
isBothValue() {
if (this.userName && this.password) {
return true
} else {
return false
}
},
},
methods: {
// 登录操作
handleLogin() {
if (!this.userName) {
Toast('请输入手机号')
return
}
if (!utils.phoneRegCheck(this.userName)) {
Toast("请输入正确的手机号码!");
return
}
if (!this.password) {
Toast('请输入验证码')
return
}
// todo 请求接口
console.log(1)
},
// 跳转注册页面
jumpRigster() {
this.$router.push({
path: '/user/register',
query:{
source:'username'
}
})
},
// 打开/关闭 忘记密码框
controllForgetBox(value) {
this.showForget = value
},
// 选择方式找回密码
selectForgetMethod(value) {
this.$router.push({
path: '/user/findPassword',
query: {
type: value.key
}
})
},
}
}
</script>
<style lang="less" scoped>
@import "./less/login.less";
// /deep/ .van-field__body input::-webkit-input-placeholder {
// color: #8F9196;
// }
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div class="register_container">
<img src="@/assets/icon/bg_login_2.png" />
<div class="login_box">
<NafmHeader navClass="nafmii-head-bg1" />
</div>
<div class="login_content">
<div class="login_form_box">
<div class="login_form">
<van-field v-model.trim="phone" clearable type="tel" maxlength="11" :left-icon="phoneIcon" placeholder="请输入手机号" />
<van-field v-model.trim="verification" clearable label="" type="tel" maxlength="6" :left-icon="VerificationIcon" placeholder="请输入验证码">
<template #button>
<SendVerificationCode :phone="phone" :data="objParams" />
</template>
</van-field>
<van-field v-model.trim="password" clearable type="password" maxlength="16" :left-icon="passwordIcon" placeholder="请输入6-16位密码" />
<van-field v-model.trim="aginPassword" clearable type="password" maxlength="16" :left-icon="emptyIcon" placeholder="再次输入6-16位密码" />
<div class="login_btn" :class="{loginActive:isBothValue}" @click="handleRegister">注 册</div>
<div class="go_login_btn " @click="jumpLoginPage">有账号去登录</div>
</div>
</div>
</div>
<div class="register_agreement">
<div class="agreement_content">
<van-checkbox v-model="checked" checked-color="#106abc" class="checkbox" shape="square" icon-size="12px">
用户注册即代表同意
</van-checkbox>
<router-link to="">《用户协议及隐私政策》</router-link>
</div>
</div>
</div>
</template>
<script>
import SendVerificationCode from '@/components/SendVerificationCode'
import utils from "@/utils/";
export default {
name: 'Register',
components: {
SendVerificationCode
},
data() {
return {
phone: null,
verification: "",
password: "",
aginPassword: "",
objParams: {
type: 'phone'
},
type: 'phone',
phoneIcon: require('@/assets/icon/user.png'),
VerificationIcon: require('@/assets/icon/verification.png'),
passwordIcon: require('@/assets/icon/password.png'),
emptyIcon: require('@/assets/icon/empty.png'),
checked: false
}
},
computed: {
isBothValue() {
if (this.phone && this.verification && this.password && this.aginPassword && this.checked) {
return true
} else {
return false
}
},
},
mounted() {
// this.
},
methods: {
// 注册操作
handleRegister() {
if (!this.phone) {
Toast('请输入手机号')
return
}
if (!utils.phoneRegCheck(this.phone)) {
Toast("请输入正确的手机号码!");
return
}
if (!this.verification) {
Toast('请输入验证码')
return
}
if (!this.password) {
Toast('请输入密码')
return
}
if (!this.aginPassword) {
Toast('请再次输入密码')
return
}
if (this.password != this.aginPassword) {
Toast('两次密码输入不一致,请重新输入')
return
}
if (!this.checked) {
Toast('选勾选用户协议及隐私政策')
return
}
// todo 请求接口 注册成功 查询用户信息 并且完成登录操作
console.log(1)
this.$router.push({
path: '/user/person',
query: {
status: 'first'
}
})
},
// 跳转到登录页面
jumpLoginPage() {
const { source } = this.$route.query
if (source == 'phone' || source == 'username') {
this.$router.back()
} else {
this.$router.push({
path: '/user/login/phone'
})
}
}
}
}
</script>
<style lang="less" scoped>
@import "./less/login.less";
.register_container {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
}
.go_login_btn {
margin-top: 10px;
display: flex;
justify-content: center;
color: #106abc;
font-size: 13px;
}
.register_agreement {
width: 384px;
display: flex;
flex: 1;
flex-direction: row;
align-items: flex-end;
margin-bottom: 30px;
justify-content: center;
a {
color: #106abc;
}
}
.agreement_content {
display: flex;
flex-direction: row;
align-items: center;
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div class="login_container">
<img src="@/assets/icon/bg_login_2.png" />
<div class="login_box">
<NafmHeader navClass="nafmii-head-bg1" />
</div>
<div class="login_content">
<div class="login_form_box">
<div class="login_form">
<van-field v-model.trim="password" clearable type="password" maxlength="16" :left-icon="passwordIcon" placeholder="请输入6-16位密码" />
<van-field v-model.trim="aginPassword" clearable type="password" maxlength="16" :left-icon="passwordIcon" placeholder="再次输入6-16位密码" />
<div class="login_btn" :class="{loginActive:isBothValue}" @click="handleReset">重 置</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { removeLocalStorage } from '@/utils/LocalStorage'
export default {
name: 'Login',
components: {},
data() {
return {
password: "",
aginPassword: "",
passwordIcon: require('@/assets/icon/password.png'),
}
},
computed: {
isBothValue() {
if (this.password && this.aginPassword) {
return true
} else {
return false
}
},
},
methods: {
// 登录操作
handleReset() {
if (!this.password) {
Toast('请输入密码')
return
}
if (!this.aginPassword) {
Toast('请再次输入密码')
return
}
if (this.password != this.aginPassword) {
Toast('两次输入的密码不一致')
return
}
/**
* 1.当source:phomeEmail
* 如果是通过 手机号码和邮箱找回 来进行重置密码的话 那么清除用户信息 跳转到登录页面
* 2.当source:login
* 如果是在我的--设置--重置密码 来进行重置密码的话 那么清除用户信息 跳转到我到为登录状态
*/
const { source } = this.$route.query;
// 清空用户信息
removeLocalStorage('user')
Toast(this.$t('toast.resetSuccess'))
if (source == 'mine') {
this.$router.push({
path: '/user/center'
})
} else {
this.$router.push({
path: '/user/login/username'
})
}
// todo 请求接口
console.log(1)
},
}
}
</script>
<style lang="less" scoped>
@import "./less/login.less";
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div class="login_container">
<img src="@/assets/icon/bg_login_2.png" />
<div class="login_box">
<NafmHeader navClass="nafmii-head-bg1" />
</div>
<div class="login_content">
<div class="login_form_box">
<div class="login_form">
<van-field v-model.trim="password" clearable type="password" maxlength="16" :left-icon="passwordIcon" placeholder="请输入6-16位密码" />
<van-field v-model.trim="aginPassword" clearable type="password" maxlength="16" :left-icon="passwordIcon" placeholder="再次输入6-16位密码" />
<div class="login_btn" :class="{loginActive:isBothValue}" @click="handleReset">重 置</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { removeLocalStorage } from '@/utils/LocalStorage'
export default {
name: 'Login',
components: {},
data() {
return {
password: "",
aginPassword: "",
passwordIcon: require('@/assets/icon/password.png'),
}
},
computed: {
isBothValue() {
if (this.password && this.aginPassword) {
return true
} else {
return false
}
},
},
methods: {
// 登录操作
handleReset() {
if (!this.password) {
Toast('请输入密码')
return
}
if (!this.aginPassword) {
Toast('请再次输入密码')
return
}
if (this.password != this.aginPassword) {
Toast('两次输入的密码不一致')
return
}
/**
* 1.当source:phomeEmail
* 如果是通过 手机号码和邮箱找回 来进行重置密码的话 那么清除用户信息 跳转到登录页面
* 2.当source:login
* 如果是在我的--设置--重置密码 来进行重置密码的话 那么清除用户信息 跳转到我到为登录状态
*/
const { source } = this.$route.query;
// 清空用户信息
removeLocalStorage('user')
Toast(this.$t('toast.resetSuccess'))
if (source == 'mine') {
this.$router.push({
path: '/user/center'
})
} else {
this.$router.push({
path: '/user/login/username'
})
}
// todo 请求接口
console.log(1)
},
}
}
</script>
<style lang="less" scoped>
@import "./less/login.less";
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div class="message_detail">
消息详情
</div>
</template>
\ No newline at end of file \ No newline at end of file
<template>
<div class="message_list">
<NafmHeader navClass="nafmii-head-bg3" />
</div>
</template>
\ No newline at end of file \ No newline at end of file
{
"list": [
{
"A": [
{
"id": null,
"cityName": "阿坝藏族羌族自治州",
"cityPinyin": "abazangzuqiangzuzizhizhou"
},
{
"id": null,
"cityName": "阿克苏地区",
"cityPinyin": "akesudiqu"
},
{
"id": null,
"cityName": "阿拉尔市",
"cityPinyin": "alaershi"
},
{
"id": null,
"cityName": "阿拉善盟",
"cityPinyin": "alashanmeng"
},
{
"id": null,
"cityName": "阿勒泰地区",
"cityPinyin": "aletaidiqu"
},
{
"id": null,
"cityName": "阿里地区",
"cityPinyin": "alidiqu"
},
{
"id": null,
"cityName": "安康市",
"cityPinyin": "ankangshi"
},
{
"id": null,
"cityName": "安庆市",
"cityPinyin": "anqingshi"
},
{
"id": null,
"cityName": "鞍山市",
"cityPinyin": "anshanshi"
},
{
"id": null,
"cityName": "安顺市",
"cityPinyin": "anshunshi"
},
{
"id": null,
"cityName": "安阳市",
"cityPinyin": "anyangshi"
}
],
"B": [
{
"id": null,
"cityName": "白城市",
"cityPinyin": "baichengshi"
},
{
"id": null,
"cityName": "百色市",
"cityPinyin": "baiseshi"
},
{
"id": null,
"cityName": "省直辖县级行政区划",
"cityPinyin": "baishalizuzizhixian"
},
{
"id": null,
"cityName": "白山市",
"cityPinyin": "baishanshi"
},
{
"id": null,
"cityName": "白银市",
"cityPinyin": "baiyinshi"
},
{
"id": null,
"cityName": "蚌埠市",
"cityPinyin": "bangbushi"
},
{
"id": null,
"cityName": "保定市",
"cityPinyin": "baodingshi"
},
{
"id": null,
"cityName": "宝鸡市",
"cityPinyin": "baojishi"
},
{
"id": null,
"cityName": "保山市",
"cityPinyin": "baoshanshi"
},
{
"id": null,
"cityName": "省直辖县级行政区划",
"cityPinyin": "baotinglizumiaozuzizhixian"
},
{
"id": null,
"cityName": "包头市",
"cityPinyin": "baotoushi"
},
{
"id": null,
"cityName": "巴彦淖尔市",
"cityPinyin": "bayannaoershi"
},
{
"id": null,
"cityName": "巴音郭楞蒙古自治州",
"cityPinyin": "bayinguolengmengguzizhizhou"
},
{
"id": null,
"cityName": "巴中市",
"cityPinyin": "bazhongshi"
},
{
"id": null,
"cityName": "北海市",
"cityPinyin": "beihaishi"
},
{
"id": null,
"cityName": "北京市",
"cityPinyin": "beijingshi"
},
{
"id": null,
"cityName": "本溪市",
"cityPinyin": "benxishi"
},
{
"id": null,
"cityName": "毕节市",
"cityPinyin": "bijieshi"
},
{
"id": null,
"cityName": "滨州市",
"cityPinyin": "binzhoushi"
},
{
"id": null,
"cityName": "博尔塔拉蒙古自治州",
"cityPinyin": "boertalamengguzizhizhou"
},
{
"id": null,
"cityName": "亳州市",
"cityPinyin": "bozhoushi"
}
],
"C": [
{
"id": null,
"cityName": "沧州市",
"cityPinyin": "cangzhoushi"
},
{
"id": null,
"cityName": "长春市",
"cityPinyin": "changchunshi"
},
{
"id": null,
"cityName": "常德市",
"cityPinyin": "changdeshi"
},
{
"id": null,
"cityName": "昌都市",
"cityPinyin": "changdoushi"
},
{
"id": null,
"cityName": "省直辖县级行政区划",
"cityPinyin": "changjianglizuzizhixian"
},
{
"id": null,
"cityName": "昌吉回族自治州",
"cityPinyin": "changjihuizuzizhizhou"
},
{
"id": null,
"cityName": "长沙市",
"cityPinyin": "changshashi"
},
{
"id": null,
"cityName": "长治市",
"cityPinyin": "changzhishi"
},
{
"id": null,
"cityName": "常州市",
"cityPinyin": "changzhoushi"
},
{
"id": null,
"cityName": "朝阳市",
"cityPinyin": "chaoyangshi"
},
{
"id": null,
"cityName": "潮州市",
"cityPinyin": "chaozhoushi"
},
{
"id": null,
"cityName": "承德市",
"cityPinyin": "chengdeshi"
},
{
"id": null,
"cityName": "成都市",
"cityPinyin": "chengdoushi"
},
{
"id": null,
"cityName": "省直辖县级行政区划",
"cityPinyin": "chengmaixian"
},
{
"id": null,
"cityName": "郴州市",
"cityPinyin": "chenzhoushi"
},
{
"id": null,
"cityName": "赤峰市",
"cityPinyin": "chifengshi"
},
{
"id": null,
"cityName": "池州市",
"cityPinyin": "chizhoushi"
},
{
"id": null,
"cityName": "重庆市",
"cityPinyin": "chongqingshi"
},
{
"id": null,
"cityName": "崇左市",
"cityPinyin": "chongzuoshi"
},
{
"id": null,
"cityName": "楚雄彝族自治州",
"cityPinyin": "chuxiongyizuzizhizhou"
},
{
"id": null,
"cityName": "滁州市",
"cityPinyin": "chuzhoushi"
}
],
"D": [
{
"id": null,
"cityName": "大连市",
"cityPinyin": "dalianshi"
},
{
"id": null,
"cityName": "大理白族自治州",
"cityPinyin": "dalibaizuzizhizhou"
},
{
"id": null,
"cityName": "丹东市",
"cityPinyin": "dandongshi"
},
{
"id": null,
"cityName": "儋州市",
"cityPinyin": "danzhoushi"
},
{
"id": null,
"cityName": "大庆市",
"cityPinyin": "daqingshi"
},
{
"id": null,
"cityName": "大同市",
"cityPinyin": "datongshi"
},
{
"id": null,
"cityName": "大兴安岭地区",
"cityPinyin": "daxinganlingdiqu"
},
{
"id": null,
"cityName": "达州市",
"cityPinyin": "dazhoushi"
},
{
"id": null,
"cityName": "德宏傣族景颇族自治州",
"cityPinyin": "dehongdaizujingpozuzizhizhou"
},
{
"id": null,
"cityName": "德阳市",
"cityPinyin": "deyangshi"
},
{
"id": null,
"cityName": "德州市",
"cityPinyin": "dezhoushi"
},
{
"id": null,
"cityName": "省直辖县级行政区划",
"cityPinyin": "dinganxian"
},
{
"id": null,
"cityName": "定西市",
"cityPinyin": "dingxishi"
},
{
"id": null,
"cityName": "省直辖县级行政区划",
"cityPinyin": "dingzhoushi"
},
{
"id": null,
"cityName": "迪庆藏族自治州",
"cityPinyin": "diqingzangzuzizhizhou"
},
{
"id": null,
"cityName": "省直辖县级行政区划",
"cityPinyin": "dongfangshi"
},
{
"id": null,
"cityName": "东方市",
"cityPinyin": "dongfangshi"
},
{
"id": null,
"cityName": "东莞市",
"cityPinyin": "dongguanshi"
},
{
"id": null,
"cityName": "东营市",
"cityPinyin": "dongyingshi"
}
],
"E": [
{
"id": null,
"cityName": "鄂尔多斯市",
"cityPinyin": "eerduosishi"
},
{
"id": null,
"cityName": "恩施土家族苗族自治州",
"cityPinyin": "enshitujiazumiaozuzizhizhou"
},
{
"id": null,
"cityName": "鄂州市",
"cityPinyin": "ezhoushi"
}
],
"F": [
{
"id": null,
"cityName": "防城港市",
"cityPinyin": "fangchenggangshi"
},
{
"id": null,
"cityName": "佛山市",
"cityPinyin": "foshanshi"
},
{
"id": null,
"cityName": "抚顺市",
"cityPinyin": "fushunshi"
},
{
"id": null,
"cityName": "阜新市",
"cityPinyin": "fuxinshi"
},
{
"id": null,
"cityName": "阜阳市",
"cityPinyin": "fuyangshi"
},
{
"id": null,
"cityName": "抚州市",
"cityPinyin": "fuzhoushi"
},
{
"id": null,
"cityName": "福州市",
"cityPinyin": "fuzhoushi"
}
],
"G": [
{
"id": null,
"cityName": "甘南藏族自治州",
"cityPinyin": "gannanzangzuzizhizhou"
},
{
"id": null,
"cityName": "赣州市",
"cityPinyin": "ganzhoushi"
},
{
"id": null,
"cityName": "甘孜藏族自治州",
"cityPinyin": "ganzizangzuzizhizhou"
},
{
"id": null,
"cityName": "广安市",
"cityPinyin": "guanganshi"
},
{
"id": null,
"cityName": "广元市",
"cityPinyin": "guangyuanshi"
},
{
"id": null,
"cityName": "广州市",
"cityPinyin": "guangzhoushi"
},
{
"id": null,
"cityName": "贵港市",
"cityPinyin": "guigangshi"
},
{
"id": null,
"cityName": "桂林市",
"cityPinyin": "guilinshi"
},
{
"id": null,
"cityName": "贵阳市",
"cityPinyin": "guiyangshi"
},
{
"id": null,
"cityName": "果洛藏族自治州",
"cityPinyin": "guoluozangzuzizhizhou"
},
{
"id": null,
"cityName": "固原市",
"cityPinyin": "guyuanshi"
}
],
"H": [
{
"id": null,
"cityName": "哈尔滨市",
"cityPinyin": "haerbinshi"
},
{
"id": null,
"cityName": "海北藏族自治州",
"cityPinyin": "haibeizangzuzizhizhou"
},
{
"id": null,
"cityName": "海东市",
"cityPinyin": "haidongshi"
},
{
"id": null,
"cityName": "海口市",
"cityPinyin": "haikoushi"
},
{
"id": null,
"cityName": "海南藏族自治州",
"cityPinyin": "hainanzangzuzizhizhou"
},
{
"id": null,
"cityName": "海西蒙古族藏族自治州",
"cityPinyin": "haiximengguzuzangzuzizhizhou"
},
{
"id": null,
"cityName": "哈密市",
"cityPinyin": "hamishi"
},
{
"id": null,
"cityName": "邯郸市",
"cityPinyin": "handanshi"
},
{
"id": null,
"cityName": "杭州市",
"cityPinyin": "hangzhoushi"
},
{
"id": null,
"cityName": "汉中市",
"cityPinyin": "hanzhongshi"
},
{
"id": null,
"cityName": "鹤壁市",
"cityPinyin": "hebishi"
},
{
"id": null,
"cityName": "河池市",
"cityPinyin": "hechishi"
},
{
"id": null,
"cityName": "合肥市",
"cityPinyin": "hefeishi"
},
{
"id": null,
"cityName": "鹤岗市",
"cityPinyin": "hegangshi"
},
{
"id": null,
"cityName": "黑河市",
"cityPinyin": "heiheshi"
},
{
"id": null,
"cityName": "衡水市",
"cityPinyin": "hengshuishi"
},
{
"id": null,
"cityName": "衡阳市",
"cityPinyin": "hengyangshi"
},
{
"id": null,
"cityName": "和田地区",
"cityPinyin": "hetiandiqu"
},
{
"id": null,
"cityName": "河源市",
"cityPinyin": "heyuanshi"
},
{
"id": null,
"cityName": "菏泽市",
"cityPinyin": "hezeshi"
},
{
"id": null,
"cityName": "贺州市",
"cityPinyin": "hezhoushi"
},
{
"id": null,
"cityName": "红河哈尼族彝族自治州",
"cityPinyin": "honghehanizuyizuzizhizhou"
},
{
"id": null,
"cityName": "淮安市",
"cityPinyin": "huaianshi"
},
{
"id": null,
"cityName": "淮北市",
"cityPinyin": "huaibeishi"
},
{
"id": null,
"cityName": "怀化市",
"cityPinyin": "huaihuashi"
},
{
"id": null,
"cityName": "淮南市",
"cityPinyin": "huainanshi"
},
{
"id": null,
"cityName": "黄冈市",
"cityPinyin": "huanggangshi"
},
{
"id": null,
"cityName": "黄南藏族自治州",
"cityPinyin": "huangnanzangzuzizhizhou"
},
{
"id": null,
"cityName": "黄山市",
"cityPinyin": "huangshanshi"
},
{
"id": null,
"cityName": "黄石市",
"cityPinyin": "huangshishi"
},
{
"id": null,
"cityName": "呼和浩特市",
"cityPinyin": "huhehaoteshi"
},
{
"id": null,
"cityName": "惠州市",
"cityPinyin": "huizhoushi"
},
{
"id": null,
"cityName": "葫芦岛市",
"cityPinyin": "huludaoshi"
},
{
"id": null,
"cityName": "呼伦贝尔市",
"cityPinyin": "hulunbeiershi"
},
{
"id": null,
"cityName": "湖州市",
"cityPinyin": "huzhoushi"
}
],
"I": [],
"J": [
{
"id": null,
"cityName": "佳木斯市",
"cityPinyin": "jiamusishi"
},
{
"id": null,
"cityName": "江门市",
"cityPinyin": "jiangmenshi"
},
{
"id": null,
"cityName": "吉安市",
"cityPinyin": "jianshi"
},
{
"id": null,
"cityName": "焦作市",
"cityPinyin": "jiaozuoshi"
},
{
"id": null,
"cityName": "嘉兴市",
"cityPinyin": "jiaxingshi"
},
{
"id": null,
"cityName": "嘉峪关市",
"cityPinyin": "jiayuguanshi"
},
{
"id": null,
"cityName": "揭阳市",
"cityPinyin": "jieyangshi"
},
{
"id": null,
"cityName": "吉林市",
"cityPinyin": "jilinshi"
},
{
"id": null,
"cityName": "济南市",
"cityPinyin": "jinanshi"
},
{
"id": null,
"cityName": "金昌市",
"cityPinyin": "jinchangshi"
},
{
"id": null,
"cityName": "晋城市",
"cityPinyin": "jinchengshi"
},
{
"id": null,
"cityName": "景德镇市",
"cityPinyin": "jingdezhenshi"
},
{
"id": null,
"cityName": "荆门市",
"cityPinyin": "jingmenshi"
},
{
"id": null,
"cityName": "荆州市",
"cityPinyin": "jingzhoushi"
},
{
"id": null,
"cityName": "金华市",
"cityPinyin": "jinhuashi"
},
{
"id": null,
"cityName": "济宁市",
"cityPinyin": "jiningshi"
},
{
"id": null,
"cityName": "晋中市",
"cityPinyin": "jinzhongshi"
},
{
"id": null,
"cityName": "锦州市",
"cityPinyin": "jinzhoushi"
},
{
"id": null,
"cityName": "九江市",
"cityPinyin": "jiujiangshi"
},
{
"id": null,
"cityName": "酒泉市",
"cityPinyin": "jiuquanshi"
},
{
"id": null,
"cityName": "鸡西市",
"cityPinyin": "jixishi"
},
{
"id": null,
"cityName": "省直辖县级行政区划",
"cityPinyin": "jiyuanshi"
}
],
"K": [
{
"id": null,
"cityName": "开封市",
"cityPinyin": "kaifengshi"
},
{
"id": null,
"cityName": "喀什地区",
"cityPinyin": "kashendiqu"
},
{
"id": null,
"cityName": "克拉玛依市",
"cityPinyin": "kelamayishi"
},
{
"id": null,
"cityName": "克孜勒苏柯尔克孜自治州",
"cityPinyin": "kezilesukeerkezizizhizhou"
},
{
"id": null,
"cityName": "昆明市",
"cityPinyin": "kunmingshi"
},
{
"id": null,
"cityName": "昆玉市",
"cityPinyin": "kunyushi"
}
],
"L": [
{
"id": null,
"cityName": "来宾市",
"cityPinyin": "laibinshi"
},
{
"id": null,
"cityName": "莱芜市",
"cityPinyin": "laiwushi"
},
{
"id": null,
"cityName": "廊坊市",
"cityPinyin": "langfangshi"
},
{
"id": null,
"cityName": "兰州市",
"cityPinyin": "lanzhoushi"
},
{
"id": null,
"cityName": "拉萨市",
"cityPinyin": "lasashi"
},
{
"id": null,
"cityName": "乐山市",
"cityPinyin": "leshanshi"
},
{
"id": null,
"cityName": "凉山彝族自治州",
"cityPinyin": "liangshanyizuzizhizhou"
},
{
"id": null,
"cityName": "连云港市",
"cityPinyin": "lianyungangshi"
},
{
"id": null,
"cityName": "聊城市",
"cityPinyin": "liaochengshi"
},
{
"id": null,
"cityName": "辽阳市",
"cityPinyin": "liaoyangshi"
},
{
"id": null,
"cityName": "辽源市",
"cityPinyin": "liaoyuanshi"
},
{
"id": null,
"cityName": "丽江市",
"cityPinyin": "lijiangshi"
},
{
"id": null,
"cityName": "临沧市",
"cityPinyin": "lincangshi"
},
{
"id": null,
"cityName": "临汾市",
"cityPinyin": "linfenshi"
},
{
"id": null,
"cityName": "省直辖县级行政区划",
"cityPinyin": "lingaoxian"
},
{
"id": null,
"cityName": "省直辖县级行政区划",
"cityPinyin": "lingshuilizuzizhixian"
},
{
"id": null,
"cityName": "临夏回族自治州",
"cityPinyin": "linxiahuizuzizhizhou"
},
{
"id": null,
"cityName": "临沂市",
"cityPinyin": "linyishi"
},
{
"id": null,
"cityName": "林芝市",
"cityPinyin": "linzhishi"
},
{
"id": null,
"cityName": "丽水市",
"cityPinyin": "lishuishi"
},
{
"id": null,
"cityName": "六安市",
"cityPinyin": "liuanshi"
},
{
"id": null,
"cityName": "六盘水市",
"cityPinyin": "liupanshuishi"
},
{
"id": null,
"cityName": "柳州市",
"cityPinyin": "liuzhoushi"
},
{
"id": null,
"cityName": "陇南市",
"cityPinyin": "longnanshi"
},
{
"id": null,
"cityName": "龙岩市",
"cityPinyin": "longyanshi"
},
{
"id": null,
"cityName": "娄底市",
"cityPinyin": "loudishi"
},
{
"id": null,
"cityName": "吕梁市",
"cityPinyin": "lu:liangshi"
},
{
"id": null,
"cityName": "漯河市",
"cityPinyin": "luoheshi"
},
{
"id": null,
"cityName": "洛阳市",
"cityPinyin": "luoyangshi"
},
{
"id": null,
"cityName": "泸州市",
"cityPinyin": "luzhoushi"
}
],
"M": [
{
"id": null,
"cityName": "马鞍山市",
"cityPinyin": "maanshanshi"
},
{
"id": null,
"cityName": "茂名市",
"cityPinyin": "maomingshi"
},
{
"id": null,
"cityName": "眉山市",
"cityPinyin": "meishanshi"
},
{
"id": null,
"cityName": "梅州市",
"cityPinyin": "meizhoushi"
},
{
"id": null,
"cityName": "绵阳市",
"cityPinyin": "mianyangshi"
},
{
"id": null,
"cityName": "牡丹江市",
"cityPinyin": "mudanjiangshi"
}
],
"N": [
{
"id": null,
"cityName": "南昌市",
"cityPinyin": "nanchangshi"
},
{
"id": null,
"cityName": "南充市",
"cityPinyin": "nanchongshi"
},
{
"id": null,
"cityName": "南京市",
"cityPinyin": "nanjingshi"
},
{
"id": null,
"cityName": "南宁市",
"cityPinyin": "nanningshi"
},
{
"id": null,
"cityName": "南平市",
"cityPinyin": "nanpingshi"
},
{
"id": null,
"cityName": "南通市",
"cityPinyin": "nantongshi"
},
{
"id": null,
"cityName": "南阳市",
"cityPinyin": "nanyangshi"
},
{
"id": null,
"cityName": "内江市",
"cityPinyin": "neijiangshi"
},
{
"id": null,
"cityName": "那曲地区",
"cityPinyin": "neiqudiqu"
},
{
"id": null,
"cityName": "宁波市",
"cityPinyin": "ningboshi"
},
{
"id": null,
"cityName": "宁德市",
"cityPinyin": "ningdeshi"
},
{
"id": null,
"cityName": "怒江傈僳族自治州",
"cityPinyin": "nujianglisuzuzizhizhou"
}
],
"O": [],
"P": [
{
"id": null,
"cityName": "盘锦市",
"cityPinyin": "panjinshi"
},
{
"id": null,
"cityName": "攀枝花市",
"cityPinyin": "panzhihuashi"
},
{
"id": null,
"cityName": "平顶山市",
"cityPinyin": "pingdingshanshi"
},
{
"id": null,
"cityName": "平凉市",
"cityPinyin": "pingliangshi"
},
{
"id": null,
"cityName": "萍乡市",
"cityPinyin": "pingxiangshi"
},
{
"id": null,
"cityName": "普洱市",
"cityPinyin": "puershi"
},
{
"id": null,
"cityName": "莆田市",
"cityPinyin": "putianshi"
},
{
"id": null,
"cityName": "濮阳市",
"cityPinyin": "puyangshi"
}
],
"Q": [
{
"id": null,
"cityName": "黔东南苗族侗族自治州",
"cityPinyin": "qiandongnanmiaozudongzuzizhizhou"
},
{
"id": null,
"cityName": "省直辖县级行政区划",
"cityPinyin": "qianjiangshi"
},
{
"id": null,
"cityName": "潜江市",
"cityPinyin": "qianjiangshi"
},
{
"id": null,
"cityName": "黔南布依族苗族自治州",
"cityPinyin": "qiannanbuyizumiaozuzizhizhou"
},
{
"id": null,
"cityName": "黔西南布依族苗族自治州",
"cityPinyin": "qianxinanbuyizumiaozuzizhizhou"
},
{
"id": null,
"cityName": "青岛市",
"cityPinyin": "qingdaoshi"
},
{
"id": null,
"cityName": "省直辖县级行政区划",
"cityPinyin": "qinghaishi"
},
{
"id": null,
"cityName": "庆阳市",
"cityPinyin": "qingyangshi"
},
{
"id": null,
"cityName": "清远市",
"cityPinyin": "qingyuanshi"
},
{
"id": null,
"cityName": "秦皇岛市",
"cityPinyin": "qinhuangdaoshi"
},
{
"id": null,
"cityName": "钦州市",
"cityPinyin": "qinzhoushi"
},
{
"id": null,
"cityName": "省直辖县级行政区划",
"cityPinyin": "qiongzhonglizumiaozuzizhixian"
},
{
"id": null,
"cityName": "齐齐哈尔市",
"cityPinyin": "qiqihaershi"
},
{
"id": null,
"cityName": "七台河市",
"cityPinyin": "qitaiheshi"
},
{
"id": null,
"cityName": "泉州市",
"cityPinyin": "quanzhoushi"
},
{
"id": null,
"cityName": "曲靖市",
"cityPinyin": "qujingshi"
},
{
"id": null,
"cityName": "衢州市",
"cityPinyin": "quzhoushi"
}
],
"R": [
{
"id": null,
"cityName": "日喀则市",
"cityPinyin": "rikazeshi"
},
{
"id": null,
"cityName": "日照市",
"cityPinyin": "rizhaoshi"
}
],
"S": [
{
"id": null,
"cityName": "三门峡市",
"cityPinyin": "sanmenxiashi"
},
{
"id": null,
"cityName": "三明市",
"cityPinyin": "sanmingshi"
},
{
"id": null,
"cityName": "三沙市",
"cityPinyin": "sanshashi"
},
{
"id": null,
"cityName": "三亚市",
"cityPinyin": "sanyashi"
},
{
"id": null,
"cityName": "厦门市",
"cityPinyin": "shamenshi"
},
{
"id": null,
"cityName": "上海市",
"cityPinyin": "shanghaishi"
},
{
"id": null,
"cityName": "商洛市",
"cityPinyin": "shangluoshi"
},
{
"id": null,
"cityName": "商丘市",
"cityPinyin": "shangqiushi"
},
{
"id": null,
"cityName": "上饶市",
"cityPinyin": "shangraoshi"
},
{
"id": null,
"cityName": "山南市",
"cityPinyin": "shannanshi"
},
{
"id": null,
"cityName": "汕头市",
"cityPinyin": "shantoushi"
},
{
"id": null,
"cityName": "汕尾市",
"cityPinyin": "shanweishi"
},
{
"id": null,
"cityName": "韶关市",
"cityPinyin": "shaoguanshi"
},
{
"id": null,
"cityName": "绍兴市",
"cityPinyin": "shaoxingshi"
},
{
"id": null,
"cityName": "邵阳市",
"cityPinyin": "shaoyangshi"
},
{
"id": null,
"cityName": "省直辖县级行政区划",
"cityPinyin": "shennongjialinqu"
},
{
"id": null,
"cityName": "神农架林区",
"cityPinyin": "shennongjialinqu"
},
{
"id": null,
"cityName": "沈阳市",
"cityPinyin": "shenyangshi"
},
{
"id": null,
"cityName": "深圳市",
"cityPinyin": "shenzhenshi"
},
{
"id": null,
"cityName": "石河子市",
"cityPinyin": "shihezishi"
},
{
"id": null,
"cityName": "石家庄市",
"cityPinyin": "shijiazhuangshi"
},
{
"id": null,
"cityName": "十堰市",
"cityPinyin": "shiyanshi"
},
{
"id": null,
"cityName": "石嘴山市",
"cityPinyin": "shizuishanshi"
},
{
"id": null,
"cityName": "双鸭山市",
"cityPinyin": "shuangyashanshi"
},
{
"id": null,
"cityName": "朔州市",
"cityPinyin": "shuozhoushi"
},
{
"id": null,
"cityName": "四平市",
"cityPinyin": "sipingshi"
},
{
"id": null,
"cityName": "松原市",
"cityPinyin": "songyuanshi"
},
{
"id": null,
"cityName": "绥化市",
"cityPinyin": "suihuashi"
},
{
"id": null,
"cityName": "遂宁市",
"cityPinyin": "suiningshi"
},
{
"id": null,
"cityName": "随州市",
"cityPinyin": "suizhoushi"
},
{
"id": null,
"cityName": "宿迁市",
"cityPinyin": "suqianshi"
},
{
"id": null,
"cityName": "宿州市",
"cityPinyin": "suzhoushi"
},
{
"id": null,
"cityName": "苏州市",
"cityPinyin": "suzhoushi"
}
],
"T": [
{
"id": null,
"cityName": "塔城地区",
"cityPinyin": "tachengdiqu"
},
{
"id": null,
"cityName": "泰安市",
"cityPinyin": "taianshi"
},
{
"id": null,
"cityName": "太原市",
"cityPinyin": "taiyuanshi"
},
{
"id": null,
"cityName": "台州市",
"cityPinyin": "taizhoushi"
},
{
"id": null,
"cityName": "泰州市",
"cityPinyin": "taizhoushi"
},
{
"id": null,
"cityName": "唐山市",
"cityPinyin": "tangshanshi"
},
{
"id": null,
"cityName": "天津市",
"cityPinyin": "tianjinshi"
},
{
"id": null,
"cityName": "天门市",
"cityPinyin": "tianmenshi"
},
{
"id": null,
"cityName": "省直辖县级行政区划",
"cityPinyin": "tianmenshi"
},
{
"id": null,
"cityName": "天水市",
"cityPinyin": "tianshuishi"
},
{
"id": null,
"cityName": "铁岭市",
"cityPinyin": "tielingshi"
},
{
"id": null,
"cityName": "铁门关市",
"cityPinyin": "tiemenguanshi"
},
{
"id": null,
"cityName": "铜川市",
"cityPinyin": "tongchuanshi"
},
{
"id": null,
"cityName": "通化市",
"cityPinyin": "tonghuashi"
},
{
"id": null,
"cityName": "通辽市",
"cityPinyin": "tongliaoshi"
},
{
"id": null,
"cityName": "铜陵市",
"cityPinyin": "tonglingshi"
},
{
"id": null,
"cityName": "铜仁市",
"cityPinyin": "tongrenshi"
},
{
"id": null,
"cityName": "吐鲁番市",
"cityPinyin": "tulufanshi"
},
{
"id": null,
"cityName": "图木舒克市",
"cityPinyin": "tumushukeshi"
},
{
"id": null,
"cityName": "省直辖县级行政区划",
"cityPinyin": "tunchangxian"
}
],
"U": [],
"V": [],
"W": [
{
"id": null,
"cityName": "省直辖县级行政区划",
"cityPinyin": "wanningshi"
},
{
"id": null,
"cityName": "潍坊市",
"cityPinyin": "weifangshi"
},
{
"id": null,
"cityName": "威海市",
"cityPinyin": "weihaishi"
},
{
"id": null,
"cityName": "渭南市",
"cityPinyin": "weinanshi"
},
{
"id": null,
"cityName": "省直辖县级行政区划",
"cityPinyin": "wenchangshi"
},
{
"id": null,
"cityName": "文山壮族苗族自治州",
"cityPinyin": "wenshanzhuangzumiaozuzizhizhou"
},
{
"id": null,
"cityName": "温州市",
"cityPinyin": "wenzhoushi"
},
{
"id": null,
"cityName": "乌海市",
"cityPinyin": "wuhaishi"
},
{
"id": null,
"cityName": "武汉市",
"cityPinyin": "wuhanshi"
},
{
"id": null,
"cityName": "芜湖市",
"cityPinyin": "wuhushi"
},
{
"id": null,
"cityName": "五家渠市",
"cityPinyin": "wujiaqushi"
},
{
"id": null,
"cityName": "乌兰察布市",
"cityPinyin": "wulanchabushi"
},
{
"id": null,
"cityName": "乌鲁木齐市",
"cityPinyin": "wulumuqishi"
},
{
"id": null,
"cityName": "武威市",
"cityPinyin": "wuweishi"
},
{
"id": null,
"cityName": "无锡市",
"cityPinyin": "wuxishi"
},
{
"id": null,
"cityName": "省直辖县级行政区划",
"cityPinyin": "wuzhishanshi"
},
{
"id": null,
"cityName": "吴忠市",
"cityPinyin": "wuzhongshi"
},
{
"id": null,
"cityName": "梧州市",
"cityPinyin": "wuzhoushi"
}
],
"X": [
{
"id": null,
"cityName": "湘潭市",
"cityPinyin": "xiangtanshi"
},
{
"id": null,
"cityName": "湘西土家族苗族自治州",
"cityPinyin": "xiangxitujiazumiaozuzizhizhou"
},
{
"id": null,
"cityName": "襄阳市",
"cityPinyin": "xiangyangshi"
},
{
"id": null,
"cityName": "咸宁市",
"cityPinyin": "xianningshi"
},
{
"id": null,
"cityName": "西安市",
"cityPinyin": "xianshi"
},
{
"id": null,
"cityName": "省直辖县级行政区划",
"cityPinyin": "xiantaoshi"
},
{
"id": null,
"cityName": "仙桃市",
"cityPinyin": "xiantaoshi"
},
{
"id": null,
"cityName": "咸阳市",
"cityPinyin": "xianyangshi"
},
{
"id": null,
"cityName": "孝感市",
"cityPinyin": "xiaoganshi"
},
{
"id": null,
"cityName": "锡林郭勒盟",
"cityPinyin": "xilinguolemeng"
},
{
"id": null,
"cityName": "兴安盟",
"cityPinyin": "xinganmeng"
},
{
"id": null,
"cityName": "邢台市",
"cityPinyin": "xingtaishi"
},
{
"id": null,
"cityName": "西宁市",
"cityPinyin": "xiningshi"
},
{
"id": null,
"cityName": "省直辖县级行政区划",
"cityPinyin": "xinjishi"
},
{
"id": null,
"cityName": "新乡市",
"cityPinyin": "xinxiangshi"
},
{
"id": null,
"cityName": "信阳市",
"cityPinyin": "xinyangshi"
},
{
"id": null,
"cityName": "新余市",
"cityPinyin": "xinyushi"
},
{
"id": null,
"cityName": "忻州市",
"cityPinyin": "xinzhoushi"
},
{
"id": null,
"cityName": "西双版纳傣族自治州",
"cityPinyin": "xishuangbannadaizuzizhizhou"
},
{
"id": null,
"cityName": "宣城市",
"cityPinyin": "xuanchengshi"
},
{
"id": null,
"cityName": "许昌市",
"cityPinyin": "xuchangshi"
},
{
"id": null,
"cityName": "徐州市",
"cityPinyin": "xuzhoushi"
}
],
"Y": [
{
"id": null,
"cityName": "雅安市",
"cityPinyin": "yaanshi"
},
{
"id": null,
"cityName": "延安市",
"cityPinyin": "yananshi"
},
{
"id": null,
"cityName": "延边朝鲜族自治州",
"cityPinyin": "yanbianchaoxianzuzizhizhou"
},
{
"id": null,
"cityName": "盐城市",
"cityPinyin": "yanchengshi"
},
{
"id": null,
"cityName": "阳江市",
"cityPinyin": "yangjiangshi"
},
{
"id": null,
"cityName": "阳泉市",
"cityPinyin": "yangquanshi"
},
{
"id": null,
"cityName": "扬州市",
"cityPinyin": "yangzhoushi"
},
{
"id": null,
"cityName": "烟台市",
"cityPinyin": "yantaishi"
},
{
"id": null,
"cityName": "宜宾市",
"cityPinyin": "yibinshi"
},
{
"id": null,
"cityName": "宜昌市",
"cityPinyin": "yichangshi"
},
{
"id": null,
"cityName": "伊春市",
"cityPinyin": "yichunshi"
},
{
"id": null,
"cityName": "宜春市",
"cityPinyin": "yichunshi"
},
{
"id": null,
"cityName": "伊犁哈萨克自治州",
"cityPinyin": "yilihasakezizhizhou"
},
{
"id": null,
"cityName": "银川市",
"cityPinyin": "yinchuanshi"
},
{
"id": null,
"cityName": "营口市",
"cityPinyin": "yingkoushi"
},
{
"id": null,
"cityName": "鹰潭市",
"cityPinyin": "yingtanshi"
},
{
"id": null,
"cityName": "益阳市",
"cityPinyin": "yiyangshi"
},
{
"id": null,
"cityName": "永州市",
"cityPinyin": "yongzhoushi"
},
{
"id": null,
"cityName": "省直辖县级行政区划",
"cityPinyin": "yuedonglizuzizhixian"
},
{
"id": null,
"cityName": "岳阳市",
"cityPinyin": "yueyangshi"
},
{
"id": null,
"cityName": "玉林市",
"cityPinyin": "yulinshi"
},
{
"id": null,
"cityName": "榆林市",
"cityPinyin": "yulinshi"
},
{
"id": null,
"cityName": "运城市",
"cityPinyin": "yunchengshi"
},
{
"id": null,
"cityName": "云浮市",
"cityPinyin": "yunfushi"
},
{
"id": null,
"cityName": "玉树藏族自治州",
"cityPinyin": "yushuzangzuzizhizhou"
},
{
"id": null,
"cityName": "玉溪市",
"cityPinyin": "yuxishi"
}
],
"Z": [
{
"id": null,
"cityName": "枣庄市",
"cityPinyin": "zaozhuangshi"
},
{
"id": null,
"cityName": "张家界市",
"cityPinyin": "zhangjiajieshi"
},
{
"id": null,
"cityName": "张家口市",
"cityPinyin": "zhangjiakoushi"
},
{
"id": null,
"cityName": "张掖市",
"cityPinyin": "zhangyeshi"
},
{
"id": null,
"cityName": "漳州市",
"cityPinyin": "zhangzhoushi"
},
{
"id": null,
"cityName": "湛江市",
"cityPinyin": "zhanjiangshi"
},
{
"id": null,
"cityName": "肇庆市",
"cityPinyin": "zhaoqingshi"
},
{
"id": null,
"cityName": "昭通市",
"cityPinyin": "zhaotongshi"
},
{
"id": null,
"cityName": "郑州市",
"cityPinyin": "zhengzhoushi"
},
{
"id": null,
"cityName": "镇江市",
"cityPinyin": "zhenjiangshi"
},
{
"id": null,
"cityName": "中卫市",
"cityPinyin": "zhongweishi"
},
{
"id": null,
"cityName": "周口市",
"cityPinyin": "zhoukoushi"
},
{
"id": null,
"cityName": "舟山市",
"cityPinyin": "zhoushanshi"
},
{
"id": null,
"cityName": "珠海市",
"cityPinyin": "zhuhaishi"
},
{
"id": null,
"cityName": "驻马店市",
"cityPinyin": "zhumadianshi"
},
{
"id": null,
"cityName": "株洲市",
"cityPinyin": "zhuzhoushi"
},
{
"id": null,
"cityName": "淄博市",
"cityPinyin": "ziboshi"
},
{
"id": null,
"cityName": "自贡市",
"cityPinyin": "zigongshi"
},
{
"id": null,
"cityName": "资阳市",
"cityPinyin": "ziyangshi"
},
{
"id": null,
"cityName": "遵义市",
"cityPinyin": "zunyishi"
}
]
}
]
}
\ No newline at end of file \ No newline at end of file
<template>
<div class="nationality_container">
<NafmHeader :title="$t('title.nationality')" navClass="nafmii-head-bg3">
<template #bottom>
<SearchInput v-model="keyword" :placeholder="$t('person.country')" @search="handleSearch" />
</template>
</NafmHeader>
<div class="search_content" ref="searchContent" v-show="keyword">
<ul>
<li class="search_item" v-for="(item,index) of list" :key="index" @click="handleCountryClick(item.cityName)">{{item.cityName}}</li>
<li class="search_item" v-show="hasNoData">没有搜索到匹配内容</li>
</ul>
</div>
<div class="city-area" ref="cityarea">
<van-index-bar :sticky="false" @select="handleSelect">
<div class="city-area-list" v-for="(item,key) in countryList" :key="key">
<van-index-anchor :index="key">{{key}}</van-index-anchor>
<van-cell v-for="(innerItem,Index) in item " :key="Index" :title="innerItem.cityName" @click="handleCountryClick(innerItem.cityName)"></van-cell>
</div>
</van-index-bar>
</div>
</div>
</template>
<script>
import BScroll from 'better-scroll'
import SearchInput from '@/components/SearchInput.vue'
import data from './city.json'
export default {
name: 'Nationality',
components: {
SearchInput
},
data() {
return {
keyword: '',
list: [],
countryList: {},
}
},
computed: {
hasNoData() {
return !this.list.length
}
},
watch: {
keyword() {
// console.log('keyword', this.keyword)
if (!this.keyword) {
this.list = []
return false
}
const result = []
for (const i in this.countryList) {
this.countryList[i].forEach(value => {
if (value.cityName.indexOf(this.keyword) > -1 || value.cityPinyin.indexOf(this.keyword) > -1) {
result.push(value)
}
})
}
this.list = result
},
countryList() {
setTimeout(() => {
this.$refs.cityarea.style.height = document.documentElement.clientHeight - this.$refs.cityarea.getBoundingClientRect().top - 10 + "px";
this.InsertElementBuildIos();
}, 1000)
}
},
mounted() {
this.scroll = new BScroll(this.$refs.searchContent, {
click: true
})
this.countryList = data.list[0]
},
methods: {
//修改a-z列表在ios中fixed未脱离文档流bug
InsertElementBuildIos() {
let li = document.querySelector(".nationality_container");
let el = document.querySelector(".van-index-bar__sidebar");
li.insertBefore(el, li.firstChild);
},
jumpPage() {
},
// 字母选择
handleSelect(value) {
let cityDom = document.querySelector(".city-area");
cityDom.scrollTop += 5;
},
//
handleCountryClick(value) {
console.log('value', value)
// 接口请求 返回上页
this.$router.back()
},
handleSearch(v){
console.log('handleSeach',v)
}
}
}
</script>
<style lang="less" scoped>
@import "~@/assets/css/search.less";
.nationality_container {
height: 100vh;
}
.search_content {
overflow: hidden;
position: absolute;
top: 94px;
left: 0;
right: 0;
bottom: 0;
background: #f7f7f7;
z-index: 9;
.search_item {
line-height: 35px;
padding-left: 35px;
border-bottom: 1px solid #efefef;
background: #fff;
color: #666;
}
}
.city-area {
overflow: hidden;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
}
/deep/ .van-index-bar__sidebar {
top: 55%;
right: 10px;
}
/deep/ .van-index-bar__index {
font-size: 10px;
width: 15px;
height: 15px;
text-align: center;
margin-bottom: 2px;
padding: 0;
}
/deep/ .van-index-bar__index--active {
color: #fff;
background: #5594e5;
padding: 2px;
border-radius: 50%;
}
</style>
\ No newline at end of file \ No newline at end of file
<!-- 设置用户名 设置姓名 设置邮箱 设置单位 -->
<template>
<div class="common_container">
<NafmHeader :title="title" class="header" navClass="nafmii-head-bg3">
<template slot="right">
<span class="finish" @click="handleFinish">{{$t('button.finish')}}</span>
</template>
</NafmHeader>
<div class="search">
<van-field v-model="value" :placeholder="placeholder" clearable />
</div>
</div>
</template>
<script>
export default {
name: 'CommonEdit',
data() {
return {
title: '',
value: '',
placeholder: ''
}
},
mounted() {
const { title, value } = this.$route.query
this.value = value
if (title == '设置昵称') {
this.title = this.$t('title.nickName')
this.placeholder = this.$t('person.nickNamePlaceholder')
} else if (title == '设置姓名') {
this.title = this.$t('title.name')
this.placeholder = this.$t('person.namePlaceholder')
} else if (title == '设置邮箱') {
this.title = this.$t('title.email')
this.placeholder = this.$t('person.emailPlaceholder')
} else if (title == '设置单位') {
this.title = this.$t('title.company')
this.placeholder = this.$t('person.companyPlaceholder')
}
},
methods: {
handleFinish() {
// 调用设置接口
this.$router.back()
},
}
}
</script>
<style lang="less" scoped>
.header .finish {
font-size: 14px;
}
.search {
margin: 15px;
position: relative;
}
/deep/ .van-cell {
background: #efefef;
border-radius: 8px;
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div class="updatePhoto_container">
<NafmHeader title=" " :showBack="true" bgColor="#000" @onBack="$emit('close')">
<template slot="right">
<span class="finish" @click="handleSave">{{$t('button.save')}}</span>
</template>
</NafmHeader>
<img :src="image" ref="image" class="image">
</div>
</template>
<script>
import 'cropperjs/dist/cropper.css';
import Cropper from 'cropperjs';
export default {
name: 'UpdataPhoto',
props: {
file: {
required: true
}
},
data() {
return {
image: window.URL.createObjectURL(this.file),
cropper: null,
}
},
mounted() {
const image = this.$refs.image;
this.cropper = new Cropper(image, {
viewMode: 1,
dragMode: 'move',
aspectRatio: 1,
cropBoxMovable: false,
cropBoxResizable: false,
background: false,
movable: true
});
},
methods: {
async getCroppedCanvas() {
return new Promise(resolve => {
this.cropper.getCroppedCanvas().toBlob((file) => {
resolve(file)
})
})
},
async handleSave() {
// 图片上传 格式Content-Type: multipart/form-data,则一定要提交FormatData对象
const fd = new FormData()
// fd.append('photo', this.file)
const file = await this.getCroppedCanvas()
fd.append('photo', file)
// api 调用 todo
// 更新父组件
this.$emit('upDataPhoto', window.URL.createObjectURL(file))
// 关闭弹出层
this.$emit('close')
// 保存成功
Toast('保存成功')
}
}
}
</script>
<style lang="less" scoped>
.updatePhoto_container {
height: 100vh;
background: #000;
}
/deep/ .cropper-view-box {
border-radius: 50%;
}
.image {
display: block;
max-width: 100%;
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div class="person_cantainer">
<NafmHeader :title="$t('title.person')" navClass="nafmii-head-bg3" />
<div class="setting_list">
<input type="file" hidden ref="file" accept="image/*" @change="onFileChange">
<van-cell :title="$t('person.photo')" center is-link value-class="right_content" @click="openFile">
<template #default>
<img :src="headerIcon" class="headerImg" alt="">
</template>
</van-cell>
<van-cell :title="$t('person.nickName')" center is-link @click="editCommon('设置昵称',nickname)" value-class="right_content">
<template #default>
<span v-if="nickname">{{nickname}}</span>
<span v-else>{{$t('person.nickNamePlaceholder')}}</span>
</template>
</van-cell>
<van-cell :title="$t('person.phoneNumber')" center value-class="right_content">
<template #default>
183****8924
</template>
</van-cell>
<van-cell :title="$t('person.name')" center is-link @click="editCommon('设置姓名',name)" value-class="right_content">
<template #default>
<span v-if="name">{{name}}</span>
<span v-else>{{$t('person.namePlaceholder')}}</span>
</template>
</van-cell>
<van-cell :title="$t('person.nationality')" center is-link value-class="right_content" @click="jumpNationality">
<template #default>
<span v-if="nationality">{{nationality}}</span>
<span v-else>{{$t('person.nationalityPlaceholder')}}</span>
</template>
</van-cell>
<van-cell :title="$t('person.birthday')" center is-link value-class="right_content" @click="openBirthday(true)">
<template #default>
<span v-if="birthday">{{birthday}}</span>
<span v-else>{{$t('person.birthdayPlaceholder')}}</span>
</template>
</van-cell>
<van-cell :title="$t('person.email')" center is-link @click="editCommon('设置邮箱',email)" value-class="right_content">
<template #default>
<span v-if="name">{{email}}</span>
<span v-else>{{$t('person.emailPlaceholder')}}</span>
</template>
</van-cell>
<van-cell :title="$t('person.company')" center is-link @click="editCommon('设置单位',company)" value-class="right_content">
<template #default>
<span v-if="name">{{company}}</span>
<span v-else>{{$t('person.companyPlaceholder')}}</span>
</template>
</van-cell>
</div>
<van-popup v-model="showPicker" position="bottom">
<van-datetime-picker v-model="currentDate" type="date" :min-date="minDate" :max-date="maxDate" @confirm="selectBirthday" @cancel="showPicker = false" />
</van-popup>
<van-popup v-model="showPhoto" position="bottom" style="height:100%">
<UpdatePhoto v-if="showPhoto" :file="previewImg" @close="showPhoto = false" @upDataPhoto="headerIcon=$event" />
</van-popup>
<div class="finish" v-if="showFinish" @click="jumpPageIndex">完成</div>
</div>
</template>
<script>
import UpdatePhoto from './components/UpdatePhoto';
export default {
name: 'Person',
data() {
return {
headerIcon: require('@/assets/icon/photo_default.png'),
nickname: '',
name: '',
nationality: '',
birthday: '',
email: '',
company: '',
showPicker: false,
minDate: new Date(1900, 0, 1),
maxDate: new Date(2220, 11, 1),
currentDate: new Date(),
showPhoto: false,
previewImg: null,
showFinish: false
}
},
components: {
UpdatePhoto
},
mounted() {
// 如果从注册跳转过来到 那么要显示 “完成” 按钮
const { status } = this.$route.query
if (status) {
this.showFinish = true
}
},
methods: {
// 跳转 昵称、姓名、邮箱 设置页面
editCommon(title, value) {
this.$router.push({
path: '/user/commonEdit',
query: {
title,
value
}
})
},
// 控制生日弹出框到展示和隐藏
openBirthday(value) {
this.showPicker = value
},
// 选择年月日
selectBirthday(value) {
console.log('date', value)
this.showPicker = false
},
// 打开图片预览和拍照
openFile() {
this.$refs.file.click()
},
// 选择图片操作
onFileChange() {
const file = this.$refs.file.files[0]
this.previewImg = file
this.showPhoto = true
// 为了解决相同图片 不触发 change事件 所以要清空file的value值
this.$refs.file.value = ''
},
// 点击完成 跳转到 我的
jumpPageIndex() {
this.$router.push({
path: '/user/center'
})
},
// 跳转到 国籍列表页面
jumpNationality() {
this.$router.push({
path: '/user/nationality'
})
}
}
}
</script>
<style lang="less" scoped>
.person_cantainer {
background: #fafafa;
height: 100vh;
}
.headerImg {
width: 50px;
height: 50px;
border-radius: 50%;
}
.right_content {
display: flex;
align-items: center;
justify-content: flex-end;
}
.finish {
margin-top: 33px;
width: 100%;
height: 45px;
display: flex;
justify-content: center;
align-items: center;
font-size: 18px;
color: #1170bf;
background: #fff;
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div class="privacy_container">
<NafmHeader navClass="nafmii-head-bg3" :title="$t('title.privacyPolicy')" />
</div>
</template>
\ No newline at end of file \ No newline at end of file
<template>
<div class="detail_container">
<NafmHeader :title="$t('title.questionDetail')" navClass="nafmii-head-bg3" />
<div class="detail_content">
<div class="title">入会准备资料</div>
<div class="time">
<span>发布时间</span>2021-4-12
</div>
<div class="content"></div>
</div>
</div>
</template>
<script>
export default {
name: 'QuestionDetail',
data() {
return {
list: [
{ id: '1', type: '产品创新', title: '问题一问题一问题一问题一问题一问题一问题一问题一问题一问题一' },
{ id: '2', type: '产品创新', title: '问题二问题二问题二问题二问题二问题二问题二问题二问题二问题二' },
]
}
},
mounted() {
// api 获取问题详情页面
},
methods: {
}
}
</script>
<style lang="less" scoped>
@import "./less/index.less";
.detail_container {
height: 100vh;
}
.detail_content {
padding: 15px;
display: flex;
flex-direction: column;
align-items: center;
.title {
color: #333;
font-size: 19px;
margin-bottom: 8px;
}
.time {
width: 100%;
display: flex;
flex-direction: row;
justify-content: flex-end;
color: #888d8d;
span {
margin-right: 15px;
}
}
.content {
margin-bottom: 30px;
}
}
</style>
\ No newline at end of file \ No newline at end of file
.question_some {
h3 {
position: relative;
color: #222;
font-size: 16px;
padding-left: 5px;
&::before {
content: "";
position: absolute;
top: 4px;
left: 0;
height: 15px;
border-left: 3px solid #135faa;
}
}
/deep/ .van-cell {
padding-right: 0 !important;
padding-left: 0 !important;
border-bottom: 1px solid #ebedf0;
font-size: 12px;
}
/deep/ .van-cell:not(:last-child)::after {
border-bottom: 0;
}
/deep/ .van-cell__title {
span {
display: block;
width: 354px;
overflow: hidden;
text-overflow: ellipsis;
word-break: break-all;
white-space: nowrap;
}
}
}
\ No newline at end of file \ No newline at end of file
<template>
<div class="question_container">
<NafmHeader :title="$t('title.question')" navClass="nafmii-head-bg3"></NafmHeader>
<div class="question_content">
<van-sidebar v-model="activeKey" class="left_menu">
<van-sidebar-item v-for="(item,index) in menu" :key="index">
<template #title>
<img :src="item.icon">
<span>{{item.name}}</span>
</template>
</van-sidebar-item>
</van-sidebar>
<div class="right_content">
<div class="list_content">
<van-cell :title="item.title" center is-link v-for="(item,index) in list" @click="jumpDetail(item.id)" :key="index" />
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'Question',
data() {
return {
icon: require('@/assets/icon/question_icon.png'),
list: [
{ id: '1', type: '产品创新', title: '1问题一问题一问题一问题' },
{ id: '2', type: '产品创新', title: '2问题二问题二问题二问题' },
{ id: '2', type: '产品创新', title: '问题二问题二问题二问题二问题二问题二问题二问题二问题二问题二' },
],
menu: [{
icon: require('@/assets/icon/question_icon.png'),
name: '产品创新1',
id: 1.
}, {
icon: require('@/assets/icon/question_icon.png'),
name: '产品创新',
id: 1.
}, {
icon: require('@/assets/icon/question_icon.png'),
name: '产品创新',
id: 1.
}],
activeKey: 0
}
},
methods: {
jumpPage() {
this.$router.push({
name: 'Home'
})
},
// 跳转问题详情
jumpDetail(id) {
this.$router.push({
path: '/user/questionDetail',
query: {
id
}
})
}
}
}
</script>
<style lang="less" scoped>
@import "./less/index.less";
.question_container {
overflow-y: hidden;
height: 100%;
}
.question_content {
display: flex;
flex-direction: row;
height: calc(100vh - 41px);
}
/deep/ .van-sidebar-item {
width: 125px !important;
padding: 0;
height: 56px;
display: flex;
justify-content: center;
background-color: #f6f6f6;
}
/deep/ .van-sidebar-item__text {
display: flex;
align-items: center;
}
.left_menu {
height: 100%;
overflow-y: scroll;
width: 125px !important;
background-color: #f6f6f6;
img {
width: 18px;
height: 18px;
margin-right: 10px;
}
}
.right_content {
height: 100%;
overflow-y: scroll;
display: flex;
flex-direction: column;
flex: 1;
}
/deep/ .van-sidebar-item--select::before {
height: 29px;
width: 3px;
background-color: #135faa;
}
/deep/ .van-sidebar-item--select {
color: #135faa;
background-color: #fff;
}
.van-cell__title {
overflow: hidden;
text-overflow: ellipsis;
word-break: break-all;
white-space: nowrap;
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div class="service_container">
<NafmHeader navClass="nafmii-head-bg3" :title="$t('title.serviceAgreement')" />
</div>
</template>
\ No newline at end of file \ No newline at end of file
<template>
<div class="setting_container">
<NafmHeader navClass="nafmii-head-bg3" :title="$t('title.setting')" />
<div class="setting_list">
<!--
<van-cell :title="$t('setting.newMsgTip')" center value-class="right_content">
<template #default>
<van-switch v-model="msgChecked" @click="changeMsgStatus" size="20px" />
</template>
</van-cell>
-->
<van-cell :title="$t('setting.freeLogin')" center value-class="right_content">
<template #default>
<van-switch v-model="isFreeLogin" @click="changeFreeLoginStatus" size="20px" />
</template>
</van-cell>
<van-cell :title="$t('setting.language')" center is-link @click="controllZhEn(true)" value-class="right_content">
<template #default>
{{$t("lang")}}
</template>
</van-cell>
<van-cell :title="$t('setting.bindWechat')" center is-link @click="jumpMessagePage('wechat')" value-class="right_content">
<template #default>
{{wechatNick}}
</template>
</van-cell>
<van-cell :title="$t('setting.resetPassword')" center is-link @click="jumpMessagePage('reset')" value-class="right_content" />
<!--
<van-cell title="指纹ID解锁" center value-class="right_content">
<template #default>
<van-switch v-model="fingerprintChecked" @click="changeFingerprintStatus" size="20px" />
</template>
</van-cell>
<van-cell title="面容ID解锁" center value-class="right_content">
<template #default>
<van-switch v-model="faceIdChecked" @click="changeFaceIdStatus" size="20px" />
</template>
</van-cell>
-->
</div>
<div class="mt15">
<van-cell :title="$t('setting.privacyPolicy')" center is-link @click="jumpPrivacyPage" value-class="right_content" />
<van-cell :title="$t('setting.serviceAgreement')" center is-link @click="jumpServicePage" value-class="right_content" />
<van-cell :title="$t('setting.questionAndFeedback')" center is-link @click="jumpServicePage" value-class="right_content" />
</div>
<div class="mt15">
<van-cell :title="$t('setting.fontSize')" center is-link @click="showSysFont=true" value-class="right_content">
<template #default>
<span>{{sysFontText}}</span>
</template>
</van-cell>
</div>
<van-button type="primary" plain color="#a4a4a4" class="logout_btn" @click="handleLogout">{{$t('button.logout')}}</van-button>
<van-action-sheet v-model="showZhEn" :actions="actions" :cancel-text="$t('button.cancel')" close-on-click-action @cancel="controllZhEn(false)" @select="changeLang" />
<van-popup v-model="showSysFont" position="bottom">
<van-picker show-toolbar :columns="columns" @confirm="onConfirm" @cancel="showSysFont = false" />
</van-popup>
</div>
</template>
<script>
import { setLocalStorage, getLocalStorage, removeLocalStorage } from '@/utils/LocalStorage'
import { NativeApi } from '@/api/NativeApis';
export default {
name: 'Setting',
data() {
return {
msgChecked: false, //新消息提醒
isFreeLogin: false, // 免登录开关
showZhEn: false, // 弹出中英文设置
fingerprintChecked: false, // 指纹ID解锁状态
faceIdChecked: false, // 面容ID解锁状态
wechatNick: '',// 微信昵称
showSysFont: false,
sysFontText: getLocalStorage('sysFontText') || this.$t('setting.standardFontSize'),
columns: [
{ text: this.$t('setting.superFontSize'), value: 120 },
{ text: this.$t('setting.bigFontSize'), value: 110 },
{ text: this.$t('setting.standardFontSize'), value: 100 },
{ text: this.$t('setting.smallFontSize'), value: 98 }
],
}
},
mounted() {
this.msgChecked = true
},
computed: {
// 中英文切换 切换 tab
actions() {
return [{ name: '中文', key: 'zh' }, { name: 'English', key: 'en' }] // 中英文切换选项
}
},
methods: {
// 切换消息操作
changeMsgStatus() {
this.msgChecked = !this.msgChecked
},
// 切换免登录状态
changeFreeLoginStatus() {
if (!this.isFreeLogin) {
// 开启需要弹出
Dialog.confirm({
title: this.$t('toast.tip'),
message: this.$t('toast.freeLoginContent'),
cancelButtonText: this.$t('button.clickWrong'),
cancelButtonColor: '#999999',
confirmButtonText: this.$t('button.okUnbinding'),
confirmButtonColor: '#206CB3'
})
.then(() => {
// 确定操作
this.isFreeLogin = true
// todo 完善存储用户逻辑
})
.catch(() => {
// 取消操作
console.log(2);
this.isFreeLogin = false
});
} else {
// 关闭免登录 清除用户信息
}
},
// 弹出/关闭 设置中英文框
controllZhEn(value) {
this.showZhEn = value
},
// 切换语言
changeLang(value) {
setLocalStorage('lang', value.key)
this.$i18n.locale = value.key
},
// 解绑微信/重置密码
jumpMessagePage(type) {
const phone = getLocalStorage('phone') || '18311098924'; //todo
if (type == 'wechat') {
// 解绑微信
Dialog.confirm({
title: this.$t('toast.tip'),
message: this.$t('toast.tipMessage'),
cancelButtonText: this.$t('button.clickWrong'),
cancelButtonColor: '#206CB3',
confirmButtonText: this.$t('button.okUnbinding'),
confirmButtonColor: '#999999'
})
.then(() => {
this.$router.push({
name: 'SendVerification',
query: {
phone,
type
}
})
})
.catch(() => {
});
} else {
// 重置密码
this.$router.push({
name: 'SendVerification',
query: {
phone,
type
}
})
}
},
// 更改 指纹ID状态
changeFingerprintStatus() {
this.fingerprintChecked = !this.fingerprintChecked
},
// 触发下啦刷新
refreshInit() {
console.log('__', this.fingerprintChecked);
},
// 更改 面容ID状态
changeFaceIdStatus() {
this.faceIdChecked = !this.faceIdChecked
},
// 跳转到隐私协议页面
jumpPrivacyPage() {
this.$router.push({
path: '/user/privacy'
})
},
// 跳转到服务协议页面
jumpServicePage() {
this.$router.push({
path: '/user/service'
})
},
// 退出登录
handleLogout() {
// 清空用户信息
removeLocalStorage('user')
this.$router.push({
path: '/user/center'
})
},
// 切换字体大小
onConfirm(opt) {
this.sysFontText = opt.text
setLocalStorage('sysFontText', this.sysFontText)
const size = opt.value
NativeApi.nativeTextZoom({
value: size
})
this.showSysFont = false
}
}
}
</script>
<style lang="less" scoped>
.setting_container {
background-color: #efefef;
height: 100vh;
}
.van-cell:not(:last-child)::after {
right: 16px;
}
.right_content {
display: flex;
justify-content: flex-end;
align-items: center;
}
.mt15 {
margin-top: 5px;
}
.logout_btn {
margin-top: 200px;
width: 100%;
border: 0;
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div class="verification_container">
<NafmHeader navClass="nafmii-head-bg3" />
<div class="verification">
<h2>输入短信验证码</h2>
<p>已经向您的手机<span>{{shortPhone}}</span>发送验证码</p>
<van-field v-model.trim="password" clearable label="" type="tel" maxlength="6" placeholder="请输入验证码">
<template #button>
<SendVerificationCode :phone="phone" :data="objParams" />
</template>
</van-field>
<div class="login_btn" :class="{loginActive:isBothValue}" @click="handleFinish">{{type=='wechat'?'完 成':'下一步'}}</div>
</div>
</div>
</template>
<script>
import SendVerificationCode from '@/components/SendVerificationCode'
export default {
name: 'SendVerification',
components: {
SendVerificationCode
},
data() {
return {
phone: '',
shortPhone: '',
password: '',
objParams: {
type: 'phone'
},
type: ''
}
},
computed: {
isBothValue() {
if (this.password) {
return true
} else {
return false
}
}
},
mounted() {
const { phone, type } = this.$route.query;
this.type = type
this.phone = phone
if (this.phone) {
const phoneArr = this.phone.split('');
this.shortPhone = phoneArr.splice(7, 11).join("")
}
},
methods: {
handleFinish() {
const { type } = this.$route.query
if (!this.password) {
Toast(this.$t('toast.verification'))
return
}
if (type == 'wechat') {
// todo wechat api
Toast(this.$t('toast.unbindingSuccess'))
this.$router.push({
path: '/user/setting'
})
} else {
// 重置密码
this.$router.push({
path: '/user/resetPassword',
query: {
source: 'mine'
}
})
}
}
}
}
</script>
<style lang="less" scoped>
.verification {
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
width: 384px;
margin: 0 auto;
h2 {
font-size: 24px;
color: #333;
margin-top: 16px;
}
p {
font-size: 12px;
color: #333;
margin-top: 8px;
margin-bottom: 50px;
span {
color: #106abc;
}
}
}
.login_btn {
width: 100%;
border-radius: 5px;
text-align: center;
height: 45px;
line-height: 45px;
color: #fff;
font-size: 16px;
margin-top: 40px;
background-image: linear-gradient(to right, #25a3df, #106abc);
opacity: 0.3;
}
.loginActive {
opacity: 1;
}
/deep/ .van-cell:not(:last-child)::after {
border-bottom: 1px solid #efefef;
}
/deep/ .van-cell {
padding-right: 0 !important;
padding-left: 0 !important;
border-bottom: 1px solid #ebedf0;
}
/deep/ .van-cell:not(:last-child)::after {
border: none;
}
</style>
\ No newline at end of file \ No newline at end of file
<template>
<div>
<NafmHeader/>
</div>
</template>
\ No newline at end of file \ No newline at end of file
const path = require('path')
const CompressionPlugin = require('compression-webpack-plugin')
const SpritesmithPlugin = require('webpack-spritesmith') // 雪碧图
const environment = process.env.VUE_APP_NODE_ENV // 定义变量 环境
const app_version = process.env.VUE_APP_VERSION // 定义变量 版本号
// cdn
const cdn = {
// 开发环境
dev: {
css: [],
js: []
},
// 生产环境
build: {
css: [],
js: [
// `https://lib.baomitu.com/vue/2.6.11/vue.min.js`,
// `https://lib.baomitu.com/vue-router/3.1.3/vue-router.min.js`,
// `https://lib.baomitu.com/vuex/3.1.2/vuex.min.js`
]
}
}
// 雪碧图的自定义模板
const templateFunction = function (data) {
var shared = '.icon-sprite { display: inline-block; background-image: url(I); background-size: Dpx Hpx; }'
.replace('I', data.sprites[0].image)
.replace('D', data.sprites[0].total_width)
.replace('H', data.sprites[0].total_height)
var perSprite = data.sprites.map(function (sprite) {
return '.icon-N { width: Wpx; height: Hpx; background-position: Xpx Ypx; }'
.replace('N', sprite.name.replace(/_/g, '-'))
.replace('W', sprite.width)
.replace('H', sprite.height)
.replace('X', sprite.offset_x)
.replace('Y', sprite.offset_y)
}).join('\n')
return shared + '\n' + perSprite
}
module.exports = {
outputDir: "dist",
assetsDir: "assets",
publicPath: "./",
devServer: {
host: '0.0.0.0',
port: "8080",
https: false,
hotOnly: false,
open: true,
overlay: {
warning: false,
errors: false
},
proxy: {
'/api': {
// 测试环境
target: process.env.VUE_APP_API, // http://192.168.0.114:8000/
changeOrigin: true, // 是否跨域
pathRewrite: {
'^/api': '' // 需要rewrite重写的, //
}
}
},
},
pages: {
index: {
entry: "./src/main.js",
template: path.join(__dirname, "public/index.html"),
filename: 'index.html',
title: 'NAFMII-H5',
chunks: ['chunk-vendors', 'chunk-common', 'index'],
// cdn: environment === 'development' ? cdn.dev : cdn.build
}
},
productionSourceMap: false,
css: {
loaderOptions: {
less: {
javascriptEnabled: true
},
}
},
configureWebpack: config => {
if (environment === "devproduction" || environment === 'test' || environment === "uat" || environment === "pro") {
//开发环境开启压缩
config.plugins.push(new CompressionPlugin({ // Gzip压缩配置
test: /\.js$|\.html$|\.less/, // 匹配文件名
threshold: 0,
deleteOriginalAssets: false // 是否删除原文件
}))
}
return {
externals: {
//moment: "moment",
//axios: "axios"
},
resolve: {
modules: ["node_modules", "spritesmith-generated"],
alias: {
// 别名
'@': path.resolve('src'),
}
},
plugins: [
new SpritesmithPlugin({
src: {
cwd: path.resolve(__dirname, './src/assets/icon'),
glob: '*.png'
},
target: { // 输出雪碧图文件及样式文件,这个是打包后,自动生成的雪碧图和样式
image: path.resolve(__dirname, './src/assets/images/sprite.png'),
css: [
[path.resolve(__dirname, './src/assets/css/sprite.less'), {
// 引用自己的模板
format: 'function_based_template'
}]
]
},
customTemplates: { // 自定义模板入口
function_based_template: templateFunction
},
apiOptions: { // 样式文件中调用雪碧图地址写法
cssImageRef: '../images/sprite.png'
},
spritesmithOptions: { // 让合成的每个图片有一定的距离
padding: 20
}
})
]
}
},
chainWebpack: config => {
const hashName = `assets/js/[name].[hash:8].${environment}.${app_version}.js`
config.output.filename(hashName).end()
config.output.chunkFilename(hashName).end()
},
lintOnSave: false
}
\ No newline at end of file \ No newline at end of file
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!