first commit

This commit is contained in:
编码猿
2024-09-27 01:32:49 +08:00
commit 28ebe05a64
7399 changed files with 1174529 additions and 0 deletions

23
芳林公司项目/zyhelp/.gitignore vendored Normal file
View File

@@ -0,0 +1,23 @@
.DS_Store
node_modules
# local env files
.env.local
.env.*.local
./memo.txt
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
/unpackage/

View File

@@ -0,0 +1 @@
96f52499-46b4-4b3b-b851-64ad3e7ab672

View File

@@ -0,0 +1,26 @@
<script>
export default {
globalData: {
status: {}
},
onLaunch: async function() {
if (this.$utils.isPcClient()) {
uni.showToast({
title: '为了获得更好的交互体验请使用手机访问或者下载APP',
duration: 4000,
icon: 'none'
});
}
},
onShow: async function() {
let address = (await this.$http.indexService.getCityList({})).data;
this.$utils.setLocalStorage("address", address);
},
onHide: function() {
}
};
</script>
<style lang="less">
@import "common/less/tpl/reset";
</style>

View File

@@ -0,0 +1 @@
b27aa540-ffe8-4add-917b-0e795d931d83

View File

@@ -0,0 +1 @@
c698dd28-a9e3-4ae0-93d8-d1745f927372

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,78 @@
export const config = {
// 测试地址
// baseUrl: 'http://www.zyhelp.test/index.php/api',
// 正式地址
baseUrl: 'http://www.zhiyuanhelp.com/index.php/api',
// 支付回调页面
PayResultUrl: 'http://www.zhiyuanhelp.com/#/pages/payResult/payResult',
apiList: {
appLogin: '/appLogin', // 用户登录
sendCode: '/sendCode', // 发送验证码
getArea: '/getArea', // 获取省份
getSchoolType: '/getSchoolType', //获取院校类型查询
provinceSubject: '/provinceSubject', // 根据省份获取高考科目
proScoreRank: '/proScoreRank', // 查询分数在省份里面的排名
modifyUser: '/modifyUser', // 修改用户信息
getSchools: '/getSchools', // 查询学校
checkAuth: '/checkAuth', // 用户权限查询
getProvinceBatch: '/getProvinceBatch', // 获取省份批次
createOrder: '/createOrder', // 用户下单接口
payOrder: '/payOrder', // 调用支付接口
checkPay: '/checkPay', // 查询支付是否成功
myOrders: '/myOrders', // 我的订单
getMesType: '/getMesType', // 获取联系客服类型
addMessage: '/addMessage', // 添加用户留言
addUserCollectSch: '/addUserCollectSch', // 收藏学校
myCollectSch: '/myCollectSch', // 获取所有的收藏院校
delUserCollect: '/delUserCollect', // 移除我的收藏
defaultMajor: '/defaultMajor', // 专业筛选首页默认显示数据
getPullDown: '/getPullDown', // 搜索下拉
getMajorAbout: '/getMajorAbout', // 根据标题查询专业
majorSchool: '/majorSchool', //外省向本省招收专业的学校
addUserCollectMajor: '/addUserCollectMajor', //收藏专业
myCollectMajor: '/myCollectMajor', // 查询我的收藏专业
delUserMajor: '/delUserMajor', // 移除我收藏的专业
getSchMajor: '/getSchMajor', // 获取院校专业
uploads: '/uploads', // 上传图片接口
getSchEnroll: '/getSchEnroll', // 查询学校往年招生情况
getUserMes: '/getUserMes', // 查询我的工单
getSchCount: '/getSchCount', // 根据条件查询院校数量
getMajorSch: '/getMajorSch', // 新高考院校查询
getNewMajor: '/getNewMajor', // 新高考专业查询接口
getNewMajorCount: '/getNewMajorCount', // 按专业查询数量
getNewSchCount: '/getNewSchCount', // 按学校查询数量
addUserNewMajor: '/addUserNewMajor', // 新高考专业收藏
addUserNewSch: '/addUserNewSch', // 新高考收藏院校
myNewSch: '/myNewSch', // 新高考查看收藏的院校
myNewMajor: '/myNewMajor', // 新高考查看收藏的专业
delNewSch: '/delNewSch', // 移除 新高考收藏院校
delNewMajor: '/delNewMajor', // 移除 新高考收藏专业
getNewSchMajor: '/getNewSchMajor', // 新高考查询院校的专业(弹窗)
newMajorSch: '/newMajorSch', // 新高考专业筛选查学校
getScoreGrade: '/getScoreGrade', // 查询收藏表分数段(新高考和普通高考)
},
AlertText: {
// 概率弹窗
probability: `由于你没有购买当前分数下所有<b style="color: #1aa3fa;">展示院校数据权限</b>,暂且无法使用筛选功能,请购买后重试!`,
// 筛选
screen: `由于你仅获当前分数院校<b style="color: #1aa3fa;">测算概率</b>权限,但暂未获得<b style="color: #1aa3fa;">筛选权限</b>,如需筛选院校功能,请购买筛选权限!`,
// 专业
major: `由于你仅获当前分数院校<b style="color: #1aa3fa;">测算概率</b>权限,但暂未获得<b style="color: #1aa3fa;">查看专业分数权限</b>,如需查阅,请购买该权限!`
},
loginViewPage: [
'pages/me/me',
'pages/orderStatus/orderStatus',
'pages/feedback/feedback',
'pages/mySchool/mySchool'
], // 需要登录的页面
publicKey: `-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCN7ijw6NrCLMhOC1pjkL8XdhXX
QfXASfU32f1UhvMSuPg05shdGMaQx5l1MmR8MznzA9WBwUQ1yII0ZH28j0LUprGq
IUmnSU/8Ujg9GXU+IDZ5+S4tLXMsBoLeizRKt5uugyptuZ6+GXCy+F2NAhD2caH0
8itmDTyOr4Hg/itXYwIDAQAB
-----END PUBLIC KEY-----`
}

View File

@@ -0,0 +1 @@
86a5c91d-3513-42c5-b7bf-ce74dc6c59c4

View File

@@ -0,0 +1,116 @@
import { config } from "../config/config.js";
import store from "../../store";
export class Http {
/**
* @param {Object} params
*/
async get (params) {
return new Promise(function(resolve, reject) {
uni.request({
method: 'GET',
url: config.baseUrl + params.url,
data: params.data,
header: params.header ? params.header : {},
success: (res) => {
if (res.data.status !== 1) {
uni.hideLoading();
uni.showToast({
title: res.data.msg,
duration: 2000,
icon: 'none'
});
} else {
uni.hideLoading();
resolve(res.data);
}
},
fail: (res => {
uni.hideLoading();
reject(res.data)
})
});
})
}
/**
* @param {Object} params
*/
async post (params) {
store.state.showStatus = 1
// uni.showLoading({ title: '请求中...' });
// 设请求头
let header = {
'content-type': 'application/x-www-form-urlencoded'
};
// 请求参数中如果有token那么设置请求头token后删除请求参数中多余的token
if (params.data.hasOwnProperty('token')) {
header.token = params.data.token
delete params.data['token']
}
return new Promise(function(resolve, reject) {
uni.request({
method: 'POST',
url: config.baseUrl + params.url,
data: params.data,
header: header,
success: (res) => {
if (res.data.status !== 1) {
switch (res.data.error_code) {
case 10001:
uni.showModal({
title: '温馨提示',
content: res.data.msg,
showCancel: false,
success: (res) => {
if (res.confirm) {
// uni.removeStorageSync('user_input');
uni.removeStorageSync('user_message');
uni.navigateTo({
url: '/pages/startUp/startUp'
});
}
}
});
break;
case 10000:
uni.showToast({
title: res.data.msg,
duration: 2000,
icon: 'none'
})
break;
case 999:
uni.showToast({
title: '后端'+res.data.msg,
duration: 2000,
icon: 'none'
})
break;
}
} else {
if (res.data.msg != '暂无数据!') {
store.state.showStatus = 2
resolve(res.data);
} else {
store.state.showStatus = 3
}
}
},
fail: (res => {
// uni.hideLoading();
reject(res)
})
});
})
}
}

View File

@@ -0,0 +1 @@
9abfefe4-8bed-41e4-bbdf-86d808996733

View File

@@ -0,0 +1,2 @@
@import "tpl/color";
@import "tpl/common";

View File

@@ -0,0 +1 @@
1e71f12b-2c4d-4d82-9550-9c1adc42603b

View File

@@ -0,0 +1,72 @@
@import "../tpl/color";
.work_order_content {
.order_content {
margin-top: 20px;
.order_l {
margin-bottom: 10px;
border: 1px solid #efefef;
border-radius: 8px;
.order_item {
padding: 5px;
padding-left: 10px;
background: #fff;
display: flex;
width: 100%;
align-items: center;
height: 70px;
justify-content: space-between;
box-sizing: border-box;
.iconfont {
font-size: 30px;
color: @themeColor;
flex: 1;
}
.item_center {
flex: 6;
border-right: 1px solid #f0f0f0;
padding-right: 15px;
box-sizing: border-box;
.top {
display: flex;
justify-content: space-between;
.title {
font-size: 15px;
font-weight: bolder;
}
.time {
font-size: 13px;
color: #bbb9b9;
}
}
.mess {
font-size: 13px;
color: #bbb9b9;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 240px;
}
}
.status {
flex: 2;
font-size: 14px;
text-align: center;
}
.error {
color: #fd5252;
}
.success {
color: #049004;
}
}
.show_content {
padding: 5px;
padding-left: 10px;
box-sizing: border-box;
border-top: 1px solid #efefef;
}
}
}
}

View File

@@ -0,0 +1,89 @@
@import "../tpl/color";
.feedback {
.problem {
display: flex;
align-items: center;
justify-content: space-around;
margin: 28.985rpx 0;
.uni-badge {
width: 126.811rpx !important;
padding: 7.246rpx;
font-size: 25.362rpx;
line-height: 36.231rpx;
height: 36.231rpx;
}
}
.user_mess {
width: 100%;
background: #F6F7FF 100%;
color: #B9B6B6 100%;
font-size: 25.362rpx;
padding: 28.985rpx 25.362rpx;
box-sizing: border-box;
margin-top: 28.985rpx;
border-radius: 21.739rpx;
}
.uploadImage {
display: flex;
margin: 25.362rpx 0;
.uni-padding-wrap {
width: 172.101rpx;
height: 152.173rpx;
border: 1.811rpx solid #eaeaea;
background: #f6f7fe;
margin-right: 28.985rpx;
.demo {
display: flex;
width: 100%;
height: 100%;
align-items: center;
justify-content: space-around;
image {
width: 172.101rpx !important;
height: 152.173rpx !important;
}
.uni-hello-addfile {
font-size: 25.362rpx;
text-align: center;
view:first-child {
font-size: 36.231rpx;
color: #8A8A8A;
}
view:last-child {
color: #8A8A8A;
}
}
}
}
}
.button_submit {
height: 67.028rpx;
background: @themeColor;
color: #fff;
line-height: 67.028rpx;
font-size: 28.985rpx;
text-align: center;
border-radius: 5px;
margin: 54.347rpx auto;
margin-top: 50px;
}
.user_phone {
height: 79.71rpx;
width: 100%;
background: #F6F7FF 100%;
position: relative;
margin-top: 23.55rpx;
.iconfont {
position: absolute;
left: 21.739rpx;
top:50%;
margin-top: -14.492rpx;
}
.phone {
line-height: 79.71rpx;
padding-left: 72.463rpx;
height: 100%;
font-size: 25.362rpx;
}
}
}

View File

@@ -0,0 +1,503 @@
@import "../tpl/common";
@import "../tpl/color";
.content {
position: absolute !important;
width: 100% !important;
left: 0 !important;
right: 0 ;
}
.t_title {
left: 0;
right: 0;
z-index: -1;
position: absolute;
background: #fff;
.new_tabs_title {
display: flex;
justify-content: center;
margin: 0 18.115rpx;
width: 95%;
border: 1px solid rgba(249, 241, 241, 1);
height: 72.463rpx;
align-items: center;
position: absolute;
top: 21.231rpx;
.title {
font-size: 27.173rpx;
width: 50%;
text-align: center;
line-height: 72.463rpx;
background: #fff;
}
.on {
color: #fff;
background: @themeColor;
}
}
.tabs_title {
position: absolute;
display: flex;
justify-content: center;
border-radius: 34.42rpx;
overflow: hidden;
border: 1.811rpx solid @themeColor;
margin: 0 18.115rpx;
z-index: 1;
width: 95%;
.title_item {
width: 23%;
color: #333;
line-height: 65.217rpx;
border-right: 1.811rpx solid @themeColor;
color: @themeColor;
text-align: center;
font-size: 27.673rpx;
background: #fff;
&:last-child {
border-right: none !important;
}
&:last-child,
&:first-child {
width: 27%;
}
}
.active {
color: #fff;
background: @themeColor;
}
}
}
.loginBuy {
position: absolute;
left: 0;
bottom: 0;
width: 100%;
height: 106.884rpx;
z-index: 99;
display: flex;
align-items: center;
.left_monkey {
width: 30%;
background: #1ba3fa;
text-align: center;
line-height: 106.884rpx;
height: 100%;
color: #fff;
font-size: 38.043rpx;
}
.right_buy {
background: @themeColor;
color: #fff;
width: 70%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
.iconfont {
font-size: 38.043rpx;
margin-right: 9.057rpx;
}
text {
color: #fff;
font-size: 36.231rpx;
}
}
}
.header {
width: 100%;
position: absolute;
background-image: linear-gradient(to top, #1a78fa 0%, #1aa3fa 100%);
left: 0;
top: 0;
right: 0;
z-index: 999;
padding-top: var(--status-bar-height);
box-shadow: 0 5.434rpx 25.362rpx 0 rgba(93, 92, 92, 0.75);
.menu {
.title {
color: #fff;
font-size: 25.362rpx;
}
.type_school {
h2 {
font-size: 17px;
margin-bottom: 19.927rpx;
margin-left: 27.773rpx;
font-weight: 400;
}
}
.city {
padding: 27.173rpx 0;
box-sizing: border-box;
position: relative;
height: 100%;
ul {
display: flex;
width: 96%;
flex-wrap: wrap;
justify-content: flex-start;
margin: 0 auto;
li {
width: 17%;
text-align: center;
margin-bottom: 18.615rpx;
color: #696969;
border: 1px solid #e6e6e6;
border-radius: 23.55rpx;
margin-right: 10.969rpx;
margin-left: 9.457rpx;
margin-bottom: 18.615rpx;
font-size: 27.673rpx;
padding: 3.623rpx 14.492rpx;
box-sizing: border-box;
&:nth-child(5n) {
margin-right: 0;
}
}
.on {
background: #f7fbfe;
border: 1px solid #eee;
color: @themeColor;
}
}
.school_ts li {
width: auto !important;
margin-right: 5.434rpx !important;
}
}
.batch_content {
padding: 18.115rpx;
.on {
background: #f7fbfe;
border: 1px solid #eee !important;
color: @themeColor !important;
}
.batch_item {
width: 100%;
height: 86.956rpx;
line-height: 86.956rpx;
border-radius: 10.869rpx;
color: #696969;
text-align: center;
border: 1.811rpx solid #e6e6e6;
font-size: 28.985rpx;
margin-bottom: 18.115rpx;
box-shadow: 0 10.869rpx 19.927rpx 0 rgba(24, 122, 184, 0.08);
}
}
.ranking {
padding: 18.115rpx;
.ranking_item {
width: 100%;
height: 86.956rpx;
line-height: 86.956rpx;
border-radius: 10.869rpx;
color: #696969;
text-align: center;
border: 1.811rpx solid #e6e6e6;
font-size: 27.173rpx;
margin-bottom: 18.115rpx;
box-shadow: 0 10.869rpx 19.927rpx 0 rgba(24, 122, 184, 0.08);
}
}
.professional_screening {
-webkit-overflow-scrolling:touch;
padding: 25.362rpx 16.304rpx;
.search {
width: 100%;
height: 72.463rpx;
position: relative;
display: flex;
justify-content: space-between;
align-items: center;
background: #f5f5f5;
border-radius: 19.927rpx;
position: relative;
.proposal{
position: absolute;
top: 42px;
background: #fff;
width: 100%;
padding: 18.115rpx 9.057rpx;
box-sizing: border-box;
box-shadow: 7.246rpx 3.623rpx 32.608rpx #e2dede;
.item {
font-size: 25.362rpx;
padding: 9.057rpx 9.057rpx;
color: #808080;
}
}
input {
padding-left: 27.173rpx;
box-sizing: border-box;
font-size: 25.362rpx;
width: 78%;
height: 100%;
}
.line {
width: 1.811rpx;
height: 36.231rpx;
background: #dcdada;
}
.right_search {
display: flex;
height: 100%;
align-items: center;
padding-right: 39.855rpx;
.iconfont {
margin-right: 9.057rpx;
color: @themeColor;
}
text {
font-size: 25.362rpx;
color: @themeColor;
}
}
}
.hot_list {
margin-top: 19.927rpx;
display: flex;
margin-left: 9.057rpx;
margin-bottom: 16.304rpx;
.title {
font-size: 25.362rpx;
color: #999595;
}
.list {
display: flex;
font-size: 25.362rpx;
color: #999595;
.item {
margin-left: 21.739rpx;
}
}
}
.major_list {
.major_header {
margin-top: 23.55rpx;
margin-bottom: 27.173rpx;
display: flex;
align-items: center;
img {
width: 43.478rpx;
height: 43.478rpx;
}
text {
font-size: 27.173rpx;
color: #101010;
font-weight: bolder;
margin-left: 14.492rpx;
}
}
.right {
text {
font-size: 25.662rpx;
font-weight: 400;
color: #696969;
}
.iconfont {
color: #ACACAC;
}
}
}
}
}
.login {
display: flex;
height: 72.463rpx;
align-items: center;
justify-content: flex-start;
padding: 0 18.115rpx;
padding-top: 16.604rpx;
box-sizing: border-box;
span {
color: #fff;
font-size: 27.673rpx;
display: flex;
align-items: center;
.login_message {
font-size: 36.231rpx;
vertical-align: text-bottom;
margin-right: 10.869rpx;
font-weight: 700;
}
}
.edit {
border-radius: 94.202rpx;
background: hsla(0,0%,100%,.1);
margin-left: 32.608rpx;
display: flex;
padding: 9.057rpx 14.492rpx;
align-items: center;
.message {
color: #fff;
font-size: 27.673rpx;
display: inline-block;
vertical-align: middle;
margin-right: 10.869rpx;
}
.iconfont {
font-size: 27.673rpx;
vertical-align: middle;
}
}
}
}
.nodata {
text-align: center;
font-size: 25.362rpx;
color: #8d8d8d;
margin-top: 60rpx;
}
.content {
height: 100%;
overflow: auto;
padding-top: 181rpx;
.tabs {
.tabs_content {
margin-top: 115.942rpx;
.bottom_tips {
color: #333;
font-size: 27.173rpx;
text-align: center;
margin-top: 39.855rpx;
.loginViewSchool {
width: 80%;
height: 105rpx;
background: @themeColor;
color: #fff;
text-align: center;
line-height: 105rpx;
border-radius: 54.347rpx;
margin: 0 auto;
margin-top: 54.347rpx;
margin-bottom: 161.231rpx;
box-shadow: 0 9.057rpx 19.927rpx 0 rgba(27,163,250,.5);
}
text {
color: @themeColor;
}
}
.show {
display: block;
}
.hidden {
display: none;
}
.tip {
font-size: 21.739rpx;
color: #a499a1;
line-height: 57.971rpx;
margin: 9.057rpx 18.115rpx 18.115rpx 18.115rpx;
text-align: center;
}
.content_item {
}
}
}
}
.major_dd {
.top_title {
font-size: 25.362rpx;
text-align: left;
padding: 25.362rpx 0;
padding-left: 23.55rpx;
.iconfont {
margin-right: 18.115rpx;
color: #4F6980;
}
}
}
.school_major {
.school_scroll {
padding: 16.304rpx;
box-sizing: border-box;
margin-bottom: 144.927rpx;
.top_title {
margin-top: 18.115rpx;
.t_t {
display: flex;
justify-content: space-between;
position: fixed;
top: 0;
right: 18.115rpx;
z-index: 999;
width: 100%;
padding: 0 18.515rpx;
padding-left: 29.185rpx;
padding-top: 14.692rpx;
padding-bottom: 9.557rpx;
box-sizing: border-box;
background: #fff;
text {
font-size: 36.231rpx;
color: #000;
}
.iconfont {
color: @themeColor;
font-size: 32.608rpx;
}
}
.tips {
margin-top: 43.778rpx;
text {
font-size: 25.362rpx;
}
.left_2 {
color: @themeColor;
margin-right: 18.115rpx;
}
.left_4 {
color: #999595;
margin-right: 30.797rpx;
}
.left_6 {
color: @themeColor;
}
}
.info {
font-size: 23.55rpx;
text-align: left;
padding: 23.55rpx 0;
background: #F6F7FF 100%;
margin-top: 18.115rpx;
padding-left: 16.304rpx;
span {
color: #4F6980;
margin-right: 18.115rpx;
}
}
}
.bottom_table {
margin-top: 27.173rpx;
.back {
background-image: linear-gradient(270deg,#fffcfe,#f8f5f7 49%,#fefafd);
}
.table_header {
display: flex;
padding: 19.927rpx 28.985rpx;
justify-content: space-around;
.item {
text-align: center;
font-size: 25.362rpx;
color: #696969;
line-height: 39.855rpx;
flex: 1;
}
.border {
flex: 1;
border-bottom: 1.811rpx solid #ecf6f4;
}
}
}
}
}

View File

@@ -0,0 +1,128 @@
@import "../tpl/color";
.login {
width: 100%;
height: 286.231rpx;
background: linear-gradient(to top, #1a78fa 0%, #1aa3fa 100%);
position: relative;
padding-top: var(--status-bar-height);
.login_page {
position: absolute;
top: 180rpx;
margin: 0 auto;
left: 50%;
margin-left: -95% / 2;
width: 95%;
border-radius: 19.927rpx;
background-color: rgba(255, 255, 255, 1);
text-align: center;
box-shadow: 0px 0px 2px 0px rgba(0, 0, 0, 0.4);
border: 1px solid rgba(255, 255, 255, 0);
display: flex;
flex-direction: column;
align-items: center;
padding-left: 28rpx;
padding-right: 28rpx;
padding-top: 36.231rpx;
box-sizing: border-box;
padding-bottom: 36.231rpx;
h2 {
font-size: 36.231rpx;
margin-bottom: 36.231rpx;
}
input {
width: 100%;
border-bottom: 1.811rpx solid #eaeaea;
text-align: left;
padding-left: 81.521rpx;
box-sizing: border-box;
font-size: 15px;
height: 72.463rpx;
}
.user_phone {
width: 100%;
input {
background: url("~@/static/img/phone.png") no-repeat;
background-size: 45.289rpx 45.289rpx;
background-position: 18.115rpx center;
}
}
.user_code {
margin-top: 18.115rpx;
width: 100%;
position: relative;
input {
background: url("~@/static/img/pwd.png") no-repeat;
background-size: 45.289rpx 45.289rpx;
background-position: 18.115rpx center;
}
.getcode {
position: absolute;
right: 18.115rpx;
bottom: 14.492rpx;
height: 50.724rpx;
font-size: 23.65rpx;
padding: 12.681rpx 18.115rpx;
background: @themeColor 100%;
color: #fff;
text-align: center;
line-height: 23.65rpx;
box-sizing: border-box;
border-radius: 32.608rpx;
}
.disable {
background: #b9bbbd 100%;
}
}
.login_submit {
width: 100%;
height: 81.521rpx;
text-align: center;
line-height: 81.521rpx;
color: #fff;
background: #00c6ff; /* fallback for old browsers */
background: -webkit-linear-gradient(to right, #0072ff, #00c6ff); /* Chrome 10-25, Safari 5.1-6 */
background: linear-gradient(to right, #0072ff, #00c6ff); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
font-size: 32.608rpx;
border-radius: 90.579rpx;
margin-top: 54.347rpx;
box-shadow: 0 8px 19px 0 rgba(27,163,250,.5);
}
.Agreement_consent {
display: flex;
align-items: center;
margin-top: 38.543rpx;
position: relative;
.yes {
background: @themeColor;
&:before {
content: '✓';
color: #fff;
font-size: 28.985rpx;
position: absolute;
left: 5.434rpx;
top: -3.623rpx;
}
}
.check {
margin-top: -3.623rpx;
width: 25.362rpx;
height: 25.362rpx;
border: 1.811rpx solid @themeColor;
border-radius: 50%;
}
text {
vertical-align: inherit;
font-size: 27.173rpx;
margin-left: 18.115rpx;
.xy {
margin-left: 0;
color: @themeColor;
}
}
}
}
}
.uni-checkbox-input {
border-radius: 50%;
}

View File

@@ -0,0 +1,37 @@
.me {
.setting_list {
padding: 18.115rpx 41.666rpx;
li {
display: flex;
justify-content: space-between;
align-items: center;
padding: 18.115rpx 0;
.list_left {
display: flex;
align-items: center;
image {
width: 67.028rpx;
height: 67.028rpx;
}
.setting_text {
color: rgba(55, 55, 55, 1);
font-size: 32.608rpx;
text-align: left;
margin-left: 27.173rpx;
}
}
.list_right {
display: flex;
align-items: center;
text{
font-size: 14px;
color: #bbb9b9;
}
uni-badge {}
uni-icons {
font-size: 43.478rpx;
}
}
}
}
}

View File

@@ -0,0 +1,25 @@
@import "../tpl/color";
.MySchool {
.nodata {
text-align: center;
font-size: 25.362rpx;
margin-top: 25%;
color: #bbb9b9;
}
.select_score {
display: flex;
align-items: center;
.iconfont {
color: #bbb9b9;
}
uni-view {
margin-left: 9.057rpx;
display: block;
font-size: 28.985rpx;
color: #bbb9b9;
}
}
}

View File

@@ -0,0 +1,68 @@
@import "../tpl/color";
.order_status {
.add_score {
padding: 9.057rpx 18.115rpx;
background: @themeColor;
color: #fff;
border-radius: 54.347rpx;
display: flex;
box-shadow: 0 2px 4px 0 rgba(27,120,250,.5);
align-items: center;
.iconfont {
color: #fff;
margin-top: 6.228rpx;
}
text {
font-size: 25.662rpx;
}
}
.order_status_content {
.error {
margin: 36.231rpx 0;
font-size: 27.173rpx;
color: #8d8d8d;
text-align: center;
}
.score_item {
width: 100%;
padding: 25.362rpx 28.985rpx;
display: flex;
justify-content: space-between;
background: #F9FAFE 100%;
border-radius: 23.55rpx;
box-sizing: border-box;
align-items: center;
margin: 21.939rpx 0;
.score {
font-size: 27.673rpx
}
.status {
display: flex;
li {
width: 47.101rpx;
height: 47.101rpx;
border-radius: 50%;
text-align: center;
line-height: 47.101rpx;
border: 1.811rpx solid #BBBBBB;
color: red;
font-size: 25.362rpx;
margin-left: 23.55rpx;
}
.no {
color: #BBBBBB;
}
}
.tips {
font-size: 23.55rpx;
padding: 9.057rpx 12.681rpx;
border-radius: 54.347rpx;
border: 1.811rpx solid #C8C3C3;
color: #C8C3C3;
}
}
.NoPayOrder {
-webkit-overflow-scrolling: touch;
}
}
}

View File

@@ -0,0 +1,171 @@
@import "../tpl/color";
.payment {
.payment_content {
.tips_title {
font-size: 33.197rpx;
padding-left: 21.739rpx;
color: #000;
border-left: 5.434rpx solid @themeColor;
}
.tips_content {
margin-top: 23.55rpx;
background: #f9f9f9;
padding: 18.115rpx;
box-sizing: border-box;
margin-bottom: 30.797rpx;
li {
font-size: 25.473rpx;
line-height: 47.101rpx;
margin-left: 12.681rpx;
color: #999595;
&:before {
content: "●";
color: #585757;
font-size: 3.623rpx;
margin-right: 12.681rpx;
}
}
}
.buy_score {
display: flex;
justify-content: space-between;
margin-top: 28.985rpx;
padding-left: 27.173rpx;
box-sizing: border-box;
padding-right: 14.492rpx;
align-items: center;
.score_item{
padding: 5.434rpx 27.173rpx;
background: #f9f9f9;
border-radius: 21.739rpx;
font-size: 30.797rpx;
}
.tips {
color: @themeColor
}
.new_num {
width: 150.851rpx;
font-size: 25.362rpx;
border-bottom: 1.811rpx solid #999595;
text-align: center;
padding-bottom: 5.434rpx;
}
.city_project {
font-size: 29.985rpx;
.radioF {
display: flex;
.radio_item {
display: flex;
align-items: center;
margin-right: 9.057rpx;
radio {
transform: scale(0.7);
}
view {
font-size: 25.362rpx;
padding-top: 10.869rpx;
}
}
}
}
.radio {
radio {
transform:scale(0.8)
}
text {
vertical-align: middle;
font-size: 30.797rpx;
}
}
.location{
.iconfont{
font-size: 30.997rpx;
color: @themeColor;
margin-right: 4px;
}
text,
.score{
font-size: 30.997rpx;
}
}
}
.buy_score_tips {
font-size: 23.85rpx;
color: #999595;
margin-top: 36.531rpx;
margin-left: 32.908rpx;
}
.pay_type {
display: flex;
margin-top: 120.86rpx;
margin-bottom: 36.231rpx;
justify-content: space-around;
.pay_button_alipay {
width: 40%;
background: #00c6ff;
background: linear-gradient(to right, #0072ff, #00c6ff);
height: 85.144rpx;
line-height: 85.144rpx;
text-align: center;
border-radius: 54.347rpx;
padding: 0 18.115rpx;
box-shadow: 0 7.246rpx 10.869rpx 0 rgba(7,160,248,.3);
}
.pay_button_weixin {
width: 40%;
background: #a8ff78;
background: linear-gradient(to right, #78ffd6, #a8ff78);
height: 85.144rpx;
line-height: 85.144rpx;
text-align: center;
border-radius: 54.647rpx;
box-shadow: 0 7.246rpx 10.869rpx 0 rgba(81,194,71,.3);
padding: 0 18.115rpx;
}
.iconfont {
color: #fff;
font-size: 45.689rpx;
vertical-align: bottom;
}
text {
margin-left: 18.415rpx;
color: #fff;
}
}
.pay_monkey {
display: flex;
justify-content: space-between;
padding: 0 34.62rpx;
margin-top: 36.631rpx;
.message{
font-size: 29.362rpx;
}
.monkey{
color: @themeColor;
font-size: 43.478rpx;
}
}
.bind_phone {
display: flex;
justify-content: space-between;
padding: 0 34.62rpx;
margin-top: 20px;
text {
font-size: 29.362rpx;
}
.input_phone {
font-size: 23.55rpx;
border-bottom: 1.811rpx solid #DDDDDD;
width: 70%;
text-align: center;
padding-bottom: 10.969rpx;
}
}
}
}

View File

@@ -0,0 +1,204 @@
@import "../tpl/common";
@import "../tpl/color";
.startUp {
.header {
width: 100%;
height: 286.231rpx;
background: url("~@/static/img/header_back.jpg") no-repeat;
background-size: cover;
position: relative;
padding-top: var(--status-bar-height);
.navigation {
width: 100%;
height: 79.71rpx;
font-size: 28.985rpx;
color: #fff;
display: flex;
align-items: center;
padding: 0 18.115rpx;
box-sizing: border-box;
display: flex;
justify-content: space-between;
span {
font-size: 36.231rpx;
vertical-align: text-bottom;
margin-right: 10.869rpx;
font-weight: 700;
}
text {
font-size: 29.185rpx;
}
}
.startUp_page {
.page_w();
padding-left: 28.985rpx;
padding-right: 28.985rpx;
box-shadow: 0px 3.623rpx 10.869rpx 0px rgba(0, 0, 0, 0.4);
h2 {
font-size: 36.241rpx;
margin-bottom: 57.971rpx;
}
.choice {
width: 100%;
.submitForm {
border-radius: 72.463rpx;
margin-top: 45.289rpx;
background: @themeColor;
font-size: 34.42rpx;
box-shadow: 0 8px 19px 0 rgba(27,163,250,.5);
background: #00c6ff; /* fallback for old browsers */
background: -webkit-linear-gradient(to right, #0072ff, #00c6ff); /* Chrome 10-25, Safari 5.1-6 */
background: linear-gradient(to right, #0072ff, #00c6ff); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
}
.special {
border-bottom: none !important;
.left {
display: flex;
border: 1.811rpx solid #eee;
padding-left: 16.304rpx;
box-sizing: border-box;
border-radius: 16.304rpx;
height: 67.028rpx;
width: 39%;
padding-right: 21.739rpx;
.left_leve {
padding-left: 21.739rpx;
border-left: 1.811rpx solid #ebebeb;
}
.left_city {
display: flex;
align-items: center;
padding-right: 16.304rpx;
.iconfont {}
.uni-input {
font-size: 25.362rpx;
}
}
}
.right {
display: flex;
border: 1.811rpx solid #eee;
padding-left: 16.304rpx;
box-sizing: border-box;
border-radius: 25.362rpx;
height: 67.028rpx;
width: 39%;
}
}
.project_radio {
align-items: center;
.new_test {
display: flex;
width: 60%;
justify-content: flex-start;
flex-wrap: wrap;
.uni-badge {
margin-right: 16.604rpx;
margin-bottom: 11.869rpx;
font-size: 25.762rpx;
color: #9a9a9a;
padding: 0 12.981rpx;
}
.uni-badge--primary {
color: #fff !important;
}
}
.radio_item {
float: left;
margin-left: 36.231rpx;
display: flex;
align-items: center;
radio {
transform:scale(0.7)
}
view {
padding-top: 10.869rpx;
font-size: 32.608rpx;
color: #696969;
}
}
}
.choice_item {
display: flex;
padding: 27.173rpx 0;
justify-content: space-between;
border-bottom: 1.811rpx solid #e8e8e8;
.city_title {
font-size: 29.285rpx;
color: #999;
}
.city_fraction {
display: flex;
align-items: center;
input {
text-align: center;
margin-right: 16.304rpx;
font-size: 30.997rpx !important;
}
text {
font-size: 32.608rpx;
color: #696969;
}
}
.city_address {
.iconfont {
color: @themeColor;
font-weight: bolder;
font-size: 32.908rpx;
}
text {
font-size: 32.608rpx;
color: #696969;
margin-left: 9.057rpx;
}
}
}
}
}
}
.action_list {
margin-top: 650.362rpx;
h2 {
text-align: center;
color: rgba(0, 114, 255, 1);
font-size: 32.608rpx;
margin-bottom: 48rpx;
}
ul {
display: flex;
justify-content: space-around;
flex-wrap: wrap;
width: 95%;
margin: 0 auto;
li {
width: 45%;
background: #E7F1FD;
border-radius: 21.739rpx;
padding: 9.057rpx 18.115rpx 16.304rpx 18.115rpx;
box-sizing: border-box;
margin-bottom: 28.985rpx;
.list_header{
.iconfont {
font-size: 43.478rpx;
vertical-align: middle;
margin-right: 9.057rpx;
color: @themeColor;
}
text {
font-size: 32.608rpx;
color: #000;
}
}
.list_mes {
color: #9F9F9F;
margin-top: 21.739rpx;
font-size: 28.985rpx;
}
}
}
}
}

View File

@@ -0,0 +1 @@
f035a185-ff46-48d5-a58a-bec100a40f6b

View File

@@ -0,0 +1 @@
@themeColor: #1b78fa;

View File

@@ -0,0 +1,28 @@
.page_w(){
position: absolute;
top: 163.043rpx;
margin: 0 auto;
left: 50%;
margin-left: -45%;
width: 90%;
border-radius: 19.927rpx;
background-color: #ffffff;
text-align: center;
box-shadow: 0 0 1px 0 rgba(0, 0, 0, 0.4);
border: 1px solid rgba(255, 255, 255, 0);
display: -webkit-box;
display: -webkit-flex;
display: flex;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-webkit-flex-direction: column;
flex-direction: column;
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center;
padding-left: 25.362rpx;
padding-right: 25.362rpx;
padding-top: 36.231rpx;
box-sizing: border-box;
padding-bottom: 36.231rpx;
}

View File

@@ -0,0 +1,167 @@
/*登录页面输入框样式重置*/
.login .login_page uni-input {
font-size: 27.573rpx !important;
}
/*父容器宽高必须设置100%为了兼容PC浏览器*/
html,
body,
uni-app,
uni-page,
uni-page-wrapper,
uni-page-body,
.container {
width: 100%;
height: 100%;
position: relative;
}
/*清除滚动条*/
::-webkit-scrollbar {
width: 0;
height: 0;
}
/* 解决头条小程序组件内引入字体不生效的问题 */
/* #ifdef MP-TOUTIAO */
@font-face {
font-family: uniicons;
src: url('/static/uni.ttf');
}
/* #endif */
/*字体样式 开始*/
@font-face {
font-family: 'iconfont'; /* project id 1750291 */
src: url('http://at.alicdn.com/t/font_1750291_rfhbjgayb8.eot');
src: url('http://at.alicdn.com/t/font_1750291_rfhbjgayb8.eot?#iefix') format('embedded-opentype'),
url('http://at.alicdn.com/t/font_1750291_rfhbjgayb8.woff2') format('woff2'),
url('http://at.alicdn.com/t/font_1750291_rfhbjgayb8.woff') format('woff'),
url('http://at.alicdn.com/t/font_1750291_rfhbjgayb8.ttf') format('truetype'),
url('http://at.alicdn.com/t/font_1750291_rfhbjgayb8.svg#iconfont') format('svg');
}
.iconfont {
font-family: "iconfont" !important;
font-size: 28.985rpx;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/*字体样式 结束*/
/*startUp 页面输入框提示文字的样式*/
.city_fraction .input-placeholder,
.city_fraction .uni-input-input{
color: #999999;
font-size: 28.985rpx;
}
/*默认样式清除*/
ul,li,h1,h2,h3,h4,h5,h6,p {
margin: 0;
padding: 0;
list-style: none;
}
/*弹窗的字体*/
.JurisdictionAlert {
.uni-icon-cancel {
font-size: 32.608rpx !important;
}
.uni-popup {
z-index: 999 !important;
}
.uni-popup__wrapper-box {
width: 80%;
padding: 5px 14px 14px 14px;
box-sizing: border-box;
border-radius: 10px;
}
}
/*边距*/
.content {
/* #ifdef MP-WEIXIN || APP-PLUS || MP-BAIDU */
padding-top: calc(var(--status-bar-height) + 181rpx) !important;
/* #endif */
}
/*用户登录后,内容区域和顶部的距离*/
.order_status_content,
.payment_content,
.setting_list,
.feedback_content,
.MySchool_content,
.work_order_content{
width: 95%;
margin: 0 auto;
box-sizing: border-box;
margin-top: 15%;
background: #fff;
border-radius: 11px;
}
/*列表底部样式*/
.item_message {
margin-top: 23.55rpx;
display: flex;
justify-content: space-between;
li {
flex: 1;
color: #666;
text-align: center;
text {
font-size: 21.739rpx;
opacity: .6;
padding-bottom: 10.869rpx;
}
view {
font-size: 25.362rpx;
}
}
}
/*专业筛选弹窗层级*/
.major_dd {
z-index: 999 !important;
.uni-transition {
background-color: rgba(0, 0, 0, 0.7);
height: 905.797rpx;
overflow-y: scroll;
background: #fff;
border-top-left-radius: 25.362rpx !important;
border-top-right-radius: 25.362rpx !important;
}
}
/*index页面院校点击的弹窗*/
.school_major {
z-index: 999 !important;
.uni-transition {
background-color: rgba(0, 0, 0, 0.7);
height: 905.797rpx;
overflow-y: scroll;
background: #fff;
border-top-left-radius: 25.362rpx !important;
border-top-right-radius: 25.362rpx !important;
}
}
/*公共组件 ListItem.vue 收藏按钮的样式*/
.like {
background: #fff;
border: 1.811rpx solid rgba(41,169,250,.3);
color: #1b78fa;
font-size: 28.985rpx;
border-radius: 28.985rpx;
line-height: 57.971rpx;
padding: 0 18.115rpx;
text-align: center;
height: 61.594rpx;
}
.yj_like {
color: #a4a4a4;
border: 1.811rpx solid #a4a4a4;
}

View File

@@ -0,0 +1 @@
3b485b2e-c784-44fc-896f-eddae9193138

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
16e1cbb8-6694-46d4-a11e-9c8defb5dece

View File

@@ -0,0 +1 @@
131ca1da-c3e0-4c09-a495-91a38e295d48

View File

@@ -0,0 +1,158 @@
import { Http } from "../../http/http.js";
import { config } from "../../config/config.js";
export class indexService extends Http {
constructor() {
super()
}
async getCityList(params) {
return await this.get({
url: config.apiList.getArea,
data: params
});
}
async getSchoolType(params) {
return await this.get({
url: config.apiList.getSchoolType,
data: params
});
}
async getSchools(params) {
return await this.post({
url: config.apiList.getSchools,
data: params
});
}
async checkAuth(params) {
return await this.post({
url: config.apiList.checkAuth,
data: params
});
}
async getProvinceBatch(params) {
return await this.get({
url: config.apiList.getProvinceBatch,
data: params
});
}
async defaultMajor(params) {
return await this.post({
url: config.apiList.defaultMajor,
data: params
});
}
async getPullDown(params) {
return await this.get({
url: config.apiList.getPullDown,
data: params
});
}
async getMajorAbout(params) {
return await this.post({
url: config.apiList.getMajorAbout,
data: params
});
}
async majorSchool(params) {
return await this.post({
url: config.apiList.majorSchool,
data: params
});
}
async addUserCollectMajor(params) {
return await this.post({
url: config.apiList.addUserCollectMajor,
data: params
});
}
async getSchMajor(params) {
return await this.post({
url: config.apiList.getSchMajor,
data: params
});
}
async getSchEnroll(params) {
return await this.post({
url: config.apiList.getSchEnroll,
data: params
});
}
async getSchCount(params) {
return await this.post({
url: config.apiList.getSchCount,
data: params
});
}
async getMajorSch(params) {
return await this.post({
url: config.apiList.getMajorSch,
data: params
});
}
async getNewMajor(params) {
return await this.post({
url: config.apiList.getNewMajor,
data: params
});
}
async getNewMajorCount(params) {
return await this.post({
url: config.apiList.getNewMajorCount,
data: params
});
}
async getNewSchCount(params) {
return await this.post({
url: config.apiList.getNewSchCount,
data: params
});
}
async addUserNewMajor(params) {
return await this.post({
url: config.apiList.addUserNewMajor,
data: params
});
}
async addUserNewSch(params) {
return await this.post({
url: config.apiList.addUserNewSch,
data: params
});
}
async getNewSchMajor(params) {
return await this.post({
url: config.apiList.getNewSchMajor,
data: params
});
}
async newMajorSch(params) {
return await this.post({
url: config.apiList.newMajorSch,
data: params
});
}
}

View File

@@ -0,0 +1,35 @@
import { Http } from "../../http/http.js";
import { config } from "../../config/config.js";
export class loginService extends Http {
constructor() {
super()
}
/**
* 用户登录接口
* @param params
* @returns {Promise<unknown>}
*/
async appLogin(params) {
return await this.post({
url: config.apiList.appLogin,
data: params
});
}
/**
* 发送短息验证码
* @param params
* @returns {Promise<unknown>}
*/
async sendCode(params) {
return await this.post({
url: config.apiList.sendCode,
data: params
});
}
}

View File

@@ -0,0 +1,32 @@
import { Http } from "../../http/http.js";
import { config } from "../../config/config.js";
export class startUpService extends Http {
constructor() {
super()
}
async provinceSubject(params) {
return await this.get({
url: config.apiList.provinceSubject,
data: params
});
}
async proScoreRank(params) {
return await this.get({
url: config.apiList.proScoreRank,
data: params
});
}
async modifyUser(params) {
return await this.post({
url: config.apiList.modifyUser,
data: params
});
}
}

View File

@@ -0,0 +1,130 @@
import { Http } from "../../http/http.js";
import { config } from "../../config/config.js";
export class userService extends Http {
constructor() {
super()
}
async createOrder(params) {
return await this.post({
url: config.apiList.createOrder,
data: params
});
}
async payOrder(params) {
return await this.post({
url: config.apiList.payOrder,
data: params
});
}
async checkPay(params) {
return await this.post({
url: config.apiList.checkPay,
data: params
});
}
async myOrders(params) {
return await this.post({
url: config.apiList.myOrders,
data: params
});
}
async getMesType(params) {
return await this.get({
url: config.apiList.getMesType,
data: params
});
}
async addMessage(params) {
return await this.post({
url: config.apiList.addMessage,
data: params
});
}
async addUserCollectSch(params) {
return await this.post({
url: config.apiList.addUserCollectSch,
data: params
});
}
async myCollectSch(params) {
return await this.post({
url: config.apiList.myCollectSch,
data: params
});
}
async delUserCollect(params) {
return await this.post({
url: config.apiList.delUserCollect,
data: params
});
}
async myCollectMajor(params) {
return await this.post({
url: config.apiList.myCollectMajor,
data: params
});
}
async delUserMajor(params) {
return await this.post({
url: config.apiList.delUserMajor,
data: params
});
}
async getUserMes(params) {
return await this.post({
url: config.apiList.getUserMes,
data: params
});
}
async myNewSch(params) {
return await this.post({
url: config.apiList.myNewSch,
data: params
});
}
async myNewMajor(params) {
return await this.post({
url: config.apiList.myNewMajor,
data: params
});
}
async delNewSch(params) {
return await this.post({
url: config.apiList.delNewSch,
data: params
});
}
async delNewMajor(params) {
return await this.post({
url: config.apiList.delNewMajor,
data: params
});
}
async getScoreGrade(params) {
return await this.post({
url: config.apiList.getScoreGrade,
data: params
});
}
}

View File

@@ -0,0 +1,11 @@
import { indexService } from "./impl/indexService";
import { loginService } from "./impl/loginService";
import { startUpService } from "./impl/startUpService";
import { userService } from "./impl/userService";
export class Imports {
indexService = new indexService()
loginService = new loginService()
startUpService = new startUpService()
userService = new userService()
}

View File

@@ -0,0 +1 @@
3f6abde8-1f51-49a3-82d7-d4a0ca1c0906

View File

@@ -0,0 +1,240 @@
import JSEncrypt from "../../static/js/wx_rsa.js"
import querystring from "querystring";
import { config } from "../config/config";
import { userService } from "../service/impl/userService";
export class Utils {
constructor() {
this.userService = new userService();
this.jse = new JSEncrypt();
this.jse.setPublicKey(config.publicKey)
}
/**
* 跳转页面
* @param path
*/
enterPage(path) {
uni.navigateTo({
url: path
});
}
/**
* 从所有地址中获取当前用户地址的下标
*/
getCurrentCity(city) {
let address = this.getLocalStorage("address");
for (let i = 0; i < address.length; i++) {
if (address[i].title == city) {
return i
}
}
}
/**
* 返回 user_input
* @returns {boolean|*}
*/
getUserInput() {
if (this.getLocalStorage("user_input")) {
return this.getLocalStorage("user_input")
} else {
return false
}
}
/**
* 判断是否为新高考
*/
checkNewTest() {
let status = "";
// 如果登录了
if (this.checkLogin()) {
// 如果两个同时有数值,那么以 user_message 数值为准
if (this.getLocalStorage("user_message") && this.getLocalStorage("user_input")) {
// 如果权限等于 2 表示新高考
if (this.getLocalStorage("user_message").provinceType == 2) {
status = true
} else {
status = false
}
// 如果两个不是同时有数值
} else {
// 如果只有 user_input 那么判断 user_input mySub 是否选过新高考
if (this.getLocalStorage("user_input")) {
if (this.getLocalStorage("user_input").mySub.length == 3) {
status = true
} else {
status = false
}
// 如果登录但是未填智能表单,那么获取本地的账户类型 provinceType
} else if (this.getLocalStorage("user_message")) {
// 如果权限等于 2 新高考
if (this.getLocalStorage("user_message").provinceType == 2) {
status = true
} else {
status = false
}
}
}
// 未登录情况,本地只可能有 user_input所以根据 user_input 来判断显示什么布局
} else if (this.getLocalStorage("user_input")) {
if (this.getLocalStorage("user_input").mySub.length == 3) {
status = true
} else {
status = false
}
// 如果是未登录未填智能表单的情况直接通过地址栏进入index
// 那么展示默认的布局。
} else {
status = false
}
return status
}
/**
* 关闭并跳转页面
* @param path
*/
closedEnterPage(path) {
uni.redirectTo({
url: path
});
}
/**
* 返回
*/
backPage() {
uni.navigateBack()
}
/**
* 是否需要登录,如果需要跳转去登陆
* @returns {Promise<void>}
*/
async isLogin() {
let token = this.getLocalStorage("user_message")
let pages = getCurrentPages();
let route = pages[pages.length - 1].route;
if(config.loginViewPage.includes(route)) {
if (!token) {
uni.showModal({
title: '提示',
content: '未登录,请先登录再使用',
showCancel: false,
success: function (res) {
if (res.confirm) {
uni.navigateTo({
url: `/pages/startUp/startUp`
})
}
}
});
}
}
}
/**
* 是否已经登录成功
* @returns {Promise<void>}
*/
checkLogin() {
if (this.getLocalStorage("user_message")) {
return true
} else {
return false
}
}
isPcClient() {
var u = navigator.userAgent;
if (!u.match(/AppleWebKit.*Mobile.*/)) {
return true
} else {
return false
}
}
/**
* 保存数据
* @param name
* @param key
*/
setLocalStorage (name, key) {
uni.setStorageSync(name, key);
}
/**
* 读取数据
* @param key
* @returns {boolean|*}
*/
getLocalStorage (key) {
try {
const value = uni.getStorageSync(key);
if (value) {
return value
} else {
return false
}
} catch (e) {
console.log("缓存读取失败:", e)
}
}
/**
* 序列化并加密前端需要传递给后端的参数
* @param url
* @returns {*}
* @constructor
*/
QueryString(url) {
return this.JSEncrypts(querystring.stringify(url))
}
/**
* 创建订单
* @param params
* @constructor
*/
async CreatedOrder(params) {
return await this.userService.createOrder(params);
}
/**
* 调起支付接口
* @constructor
*/
async PlayOrder(parmas) {
return await this.userService.payOrder(parmas)
}
async Pay(params) {
// #ifdef H5
location.href = location.href = params.data
// #endif
//#ifdef APP-PLUS || MP-WEIXIN
// #endif
}
/**
* 解密后端给的数据
* @param str
* @returns {PromiseLike<ArrayBuffer>}
* @constructor
*/
JSEncrypts(str) {
return this.jse.encrypt(str);
}
}

View File

@@ -0,0 +1 @@
135daf91-4a4e-40c4-8c09-0ea27f8e94aa

View File

@@ -0,0 +1 @@
d7fb2441-f04e-4593-9892-c85b50d34741

View File

@@ -0,0 +1,17 @@
## 简介
## 更新日志
**2019.12.30**
优化:
定位下拉内容
待实现:只同时展示一个下拉内容
**2019.12.27**
bug修复
支持H5、微信小程序
**2019.12.20**
第一次发布
支持H5下拉暂不支持小程序。
原因一些适配H5的方法是用vue来写的小程序不支持。
`this.$slots.`在小程序中不能用

View File

@@ -0,0 +1,216 @@
<template>
<div class="dropdown-item">
<!-- selected -->
<view class="dropdown-item__selected"
@click="changePopup">
<slot name="title" v-if="$slots.title"></slot>
<block v-else>
<view class="selected__name">{{title ? title : selectItem.text}}</view>
<view class="selected__icon"
:class="showClass === 'show'? 'up' : 'down'">
<span class="iconfont">{{ showOtherIcon ? '&#xe634;' : '&#xe611;' }} </span>
</view>
</block>
</view>
<view class="dropdown-item__content" :style="{top: contentTop + 'px'}" v-if="showList">
<!-- dropdown -->
<view :class="['list', showClass]">
<slot v-if="$slots.default"></slot>
<block v-else>
<view class="list__option"
v-for="(item, index) in list"
:key="index"
@click="choose(item)">
<view>{{item.text}}</view>
<icon v-if="item.value === value" type="success_no_circle" size="26"/>
</view>
</block>
</view>
<!-- dropdown-mask -->
<view :class="['dropdown-mask', showClass]" v-if="showList" @click="closePopup"></view>
</view>
</div>
</template>
<script>
export default {
components: {
},
props: {
showOtherIcon: false,
value: [Number, String, Object],
list: {
type: Array,
default: ()=> {
return []
}
},
title: [Number, String]
},
data() {
return {
showList: "",
showClass: '',
selectItem: {},
contentTop: 0,
isPcClient: false
}
},
watch: {
},
mounted() {
this.showList = this.active;
this.selectItem = this.list[this.value];
// document.addEventListener('click', e => {
// //this.$el 可以获取当前组件的容器节点
// if (!this.$el.contains(e.target)) {
// console.log('change');
// this.close()
// }
// });
},
methods: {
choose(item) {
this.selectItem = item
this.$emit('input', item.value)
this.closePopup()
},
changePopup() {
if(this.showList) {
this.closePopup()
} else {
this.openPopup()
}
},
openPopup() {
// this.$parent -> dropdown-menu
this.$parent.$emit('close')
this.showList = true
this.$nextTick(() => {
this.getElementData('.dropdown-item__selected', (data)=>{
this.contentTop = data[0].bottom
this.showClass = 'show'
})
})
},
closePopup() {
this.showClass = ''
setTimeout(() => {
this.showList = false
}, 300)
},
close() {
this.showClass = ''
this.showList = false
},
getElementData(el, callback){
uni.createSelectorQuery().in(this).selectAll(el).boundingClientRect().exec((data) => {
callback(data[0]);
});
}
}
}
</script>
<style lang="scss">
@font-face {
font-family: 'iconfont'; /* project id 1750291 */
src: url('https://at.alicdn.com/t/font_1750291_ffot1s5kjlf.eot');
src: url('https://at.alicdn.com/t/font_1750291_ffot1s5kjlf.eot?#iefix') format('embedded-opentype'),
url('https://at.alicdn.com/t/font_1750291_ffot1s5kjlf.woff2') format('woff2'),
url('https://at.alicdn.com/t/font_1750291_ffot1s5kjlf.woff') format('woff'),
url('https://at.alicdn.com/t/font_1750291_ffot1s5kjlf.ttf') format('truetype'),
url('https://at.alicdn.com/t/font_1750291_ffot1s5kjlf.svg#iconfont') format('svg');
}
.iconfont{
color: #fff;
font-family:"iconfont" !important;
font-size:28rpx;
font-style:normal;
-webkit-font-smoothing: antialiased;
-webkit-text-stroke-width: 0.2px;
-moz-osx-font-smoothing: grayscale;
}
.dropdown-item {
width: 100%;
flex:1;
position: relative;
&__selected {
position: relative;
display: flex;
align-items: center;
padding: 30rpx 12rpx;
box-sizing: border-box;
justify-content: center;
.selected__name {
font-size: 28.985rpx;
color: #fff;
}
.selected__icon {
margin-left: 10rpx;
&.down {
transition: transform .3s;
transform: rotateZ(0);
}
&.up {
transition: transform .3s;
transform: rotateZ(-180deg);
}
}
}
&__content {
position: fixed;
left: 0;
right: 0;
overflow: hidden;
top: 0;
bottom: 0;
z-index: 1;
.list {
height: 100%;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
position: absolute;
left: 0;
right: 0;
z-index: 3;
background: #fff;
transform: translateY(-100%);
transition: all .3s;
&.show {
transform: translateY(0);
}
&__option {
font-size:32rpx;
padding: 26rpx 28rpx;
display: flex;
justify-content: space-between;
&:not(:last-child) {
border-bottom: 1rpx solid #DDDDDD;
}
}
}
.dropdown-mask {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
transition: all .3s;
z-index: 2;
&.show {
background:rgba(0,0,0,0.5);
}
}
}
// &:not(:last-child):after {
// content: ' ';
// position: absolute;
// width: 2rpx;
// top: 36rpx;
// bottom: 36rpx;
// right: 0;
// background: $uni-border-color;
// }
}
</style>

View File

@@ -0,0 +1,36 @@
<template>
<div class="dropdown-menu">
<slot></slot>
</div>
</template>
<script>
export default {
data() {
return {
}
},
mounted() {
this.$on('close', this.closeDropdown)
},
methods: {
closeDropdown() {
this.$children.forEach(item =>{
item.close();
})
}
}
}
</script>
<style lang="scss">
.dropdown-menu {
display: flex;
overflow: auto;
justify-content: space-around;
white-space: nowrap;
}
dropdown-item {
flex: 1;
}
</style>

View File

@@ -0,0 +1 @@
1b90bfde-b6df-48c9-b59a-41d3ff312bf5

View File

@@ -0,0 +1,104 @@
<template>
<div class="AddressPopup">
<uni-popup class="AddressPopup" ref="AddressPopup" type="bottom">
<div class="title">
<text class="address">请选择省份</text>
<text class="submit" @click="close">关闭</text>
</div>
<ul>
<li v-for="(it,index) in address"
:class="{ on: index == cIndex }"
@click="addressChoice(it,index)"
:key="index">
{{ it.title }}
</li>
</ul>
</uni-popup>
</div>
</template>
<script>
import uniPopup from "@/components/uni-popup/uni-popup.vue"
export default {
components: {
uniPopup
},
props: {
address: {
type: Array,
default: []
},
currentIndex: {
type: Number,
default: 0
}
},
data() {
return {
cIndex: this.currentIndex, // 默认省份
}
},
watch:{
currentIndex: function (val){
this.cIndex = val
}
},
methods: {
open() {
this.$refs.AddressPopup.open()
},
close() {
this.$refs.AddressPopup.close()
},
addressChoice(it,index) {
this.cIndex = index;
this.$emit("itemChange", it)
}
}
}
</script>
<style lang="less" scoped>
@import url("../../common/less/tpl/color");
.AddressPopup {
padding: 18.115rpx;
box-sizing: border-box;
.title {
height: 81.521rpx;
display: flex;
justify-content: space-between;
align-items: center;
padding: 9.057rpx 36.231rpx;
border-bottom: 1.811rpx solid #ececec;
.address {
font-size: 28.985rpx;
}
.submit {
font-size: 27.173rpx;
color: @themeColor;
}
}
ul {
display: flex;
justify-content: space-around;
text-align: center;
padding: 0 9.057rpx;
padding-top: 27.173rpx;
flex-wrap: wrap;
li {
color: #8d8d8d;
font-size: 25.362rpx;
width: 16%;
padding: 5.434rpx;
border: 1.811rpx solid #e4e4e4;
border-radius: 54.347rpx;
margin-bottom: 18.115rpx;
}
.on {
color: @themeColor;
border: 1.811rpx solid @themeColor;
}
}
}
</style>

View File

@@ -0,0 +1,40 @@
<template>
<div class="CustomerService">
<view class="customer_service" @click="goToKf">
<span class="iconfont">&#xe614;</span>
<text>联系客服</text>
</view>
</div>
</template>
<script>
export default {
methods: {
goToKf(){
uni.navigateTo({
url: '../feedback/feedback?type=2&title=联系客服'
});
}
}
}
</script>
<style scoped lang="less">
@import "../../common/less/index";
.customer_service {
width: 100%;
bottom: 36.231rpx;
text-align: center;
margin: 52.536rpx 0 86.956rpx 0;
span {
color: @themeColor;
font-size: 30.797rpx;
font-weight: bolder;
margin-right: 18.115rpx;
}
text {
font-size: 30.797rpx;
color: #000;
}
}
</style>

View File

@@ -0,0 +1,101 @@
<template>
<view class="header">
<navigation :title="title"></navigation>
<div class="portrait">
<div class="left">
<image src="http://static.geekhelp.cn/auth.jpg" alt=""></image>
<view class="portrait_info">
<text>{{ UserMessage ? UserMessage.user_name : '未登录' }}</text>
<view class="phone">手机号{{ UserMessage ? UserMessage.phone : '购买后自动绑定' }}</view>
</view>
</div>
<div class="right">
<slot name="action"></slot>
</div>
</div>
</view>
</template>
<script>
import navigation from '@/components/tpl/navigation.vue'
export default {
components: {
navigation
},
props: {
title: {
type: String,
default: ""
}
},
data() {
return {
UserMessage: this.$utils.getLocalStorage("user_message")
}
},
methods: {
}
}
</script>
<style lang="less" scoped>
@import "../../common/less/index";
.header {
width: 100%;
height: 286.231rpx;
background: url("~@/static/img/header_back.jpg") no-repeat;
background-size: cover;
position: relative;
padding-top: var(--status-bar-height);
.portrait {
position: absolute;
bottom: -68.84rpx;
margin: 0 auto;
height: 217.391rpx;
left: 50%;
margin-left: -95% / 2;
width: 95%;
border-radius: 19.927rpx;
background-color: rgba(255, 255, 255, 1);
text-align: center;
box-shadow: 0px 0 9.057rpx 3.623rpx rgba(162, 159, 159, 0.4);
border: 1.811rpx solid rgba(255, 255, 255, 0);
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 28rpx;
box-sizing: border-box;
.left {
display: flex;
align-items: center;
image {
width: 124.999rpx;
height: 130.434rpx;
border-radius: 128.623rpx;
margin-right: 27.173rpx;
}
.portrait_info {
text-align: left;
text {
color: rgba(16, 16, 16, 1);
font-size: 27.173rpx;
text-align: left;
}
.phone {
color: rgba(187, 185, 185, 1);
font-size: 23.55rpx;
text-align: left;
}
}
}
.right {
}
}
}
</style>

View File

@@ -0,0 +1,126 @@
<template>
<div class="JurisdictionAlert">
<uni-popup ref="showpopup" :maskClick="false" class="showpopup" type="center">
<div class="title">
<div class="left_tips">
<span class="iconfont">&#xe660;</span>
<text>温馨提示</text>
</div>
<icon class="closed" @click="cancelPopup(true)" type="cancel" color="#1aa3fa" size="18"/>
</div>
<div class="contents" v-html="text"></div>
<div class="buy" @click="buy">点击购买</div>
<div v-if="showCancel" @click="cancelPopup(true)" class="cancel">以后再说</div>
</uni-popup>
</div>
</template>
<script>
import uniPopup from "@/components/uni-popup/uni-popup.vue";
export default {
props: {
text: {
type: String,
default: ''
},
showCancel: {
type: Boolean,
default: true
},
vipType: {
type: Number,
default: 1
}
},
data() {
return {
}
},
methods: {
buy() {
this.$emit("clearChoice")
// 已经登录成功去购买页面
if (this.$utils.checkLogin()) {
this.$utils.enterPage(`../payment/payment?type=${this.vipType}`)
// 没有登录,去登录页面登录
} else {
uni.showToast({
title: '尚未登录,请登录后购买',
duration: 2000,
icon: 'none',
complete: () =>
setTimeout(() =>
this.$utils.enterPage(`../login/login?type=${this.vipType}`),1800)
});
}
},
cancelPopup(type) {
if (type) {
this.$emit("clearChoice")
} else {
this.$refs.showpopup.close()
}
},
openPopup() {
this.$refs.showpopup.open()
}
},
components: {uniPopup}
}
</script>
<style lang="less" scoped>
@import "../../common/less/index";
.JurisdictionAlert {
.showpopup {
.title {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 41.666rpx;
.left_tips {
.iconfont {
font-size: 39.855rpx;
vertical-align: middle;
color: @themeColor;
}
text {
margin-left: 9.057rpx;
font-size: 27.173rpx;
}
}
}
.contents {
font-size: 30.797rpx;
width: 83%;
margin: 0 auto;
margin-bottom: 72.463rpx;
line-height: 50.724rpx;
b {
color: @themeColor;
}
}
.buy {
height: 63.405rpx;
background: @themeColor;
color: #fff;
text-align: center;
line-height: 63.405rpx;
border-radius: 54.347rpx;
font-size: 25.362rpx;
width: 90%;
margin: 0 auto;
}
.cancel {
color: #BAC2C8;
text-align: center;
margin-top: 19.927rpx;
font-size: 23.55rpx;
}
}
}
</style>

View File

@@ -0,0 +1,258 @@
<template>
<div class="listItem">
<div v-if="list.length != 0">
<view v-for="(i,index) in list" :key="index" class="list_item">
<view class="item_title">
<div class="title_left">
<text @click="titleClick(i)">{{i.alias || i.professionName || i.collegeName}}</text>
<view v-if="i.recommendType == 1" class="t chong"></view>
<view v-if="i.recommendType == 2" class="t wen"></view>
<view v-if="i.recommendType == 3" class="t ti"></view>
</div>
<!--新高考 按专业查询-->
<div v-if="i.chooseCns" class="title_right">
选科要求{{i.chooseCns}}
</div>
<!--新高考 按学校查询-->
<div v-else-if="i.is_sch" class="title_right" @click="recruit(i)">
匹配专业{{i.majorNum}}
<span v-if="showDown" class="iconfont">&#xe611;</span>
</div>
<!--普通高考-->
<div v-else class="title_right" @click="recruit(i)">
招收专业{{i.majorNum}}
<span v-if="showDown" class="iconfont">&#xe611;</span>
</div>
</view>
<div class="item_content">
<view class="content_center">
<img v-if="i.hasOwnProperty('logo')" :src="$img.url(i.sch_id || i.collegeId)"/>
<text v-else class="probability_text">{{i.probability}}%</text>
<view class="center_f">
<!--新高考 按专业查询-->
<view v-if="i.collegeCode" class="center_text">
院校代码 {{i.collegeCode}}
</view>
<!--新高考 按学校查询-->
<view v-else-if="i.majorCode" class="center_text">
<text>{{i.collegeName}}</text>
专业代码 {{i.professionCode}}
</view>
<!--普通高考-->
<view v-else class="center_text">
录取概率
<text>{{i.probability}}%</text>
{{i.batch_title}}
</view>
<ul class="center_li" v-if="i.hasOwnProperty('tags')">
<li v-for="(j,index) in i.tags" :key="index">{{j}}</li>
</ul>
</view>
</view>
<!--
collect: 1: 已收藏
2: 移除
0 收藏
-->
<view :class="i.is_collect == 1 ? 'yj_like like' : 'like' "
@tap="i.is_collect === 0 ? AddUserLike(i) : i.is_collect === 2 ? RemoveLike(i,index) : '' ">
<span v-if="i.is_collect == 0" class="iconfont">&#xe626;</span>
<text> {{ i.is_collect == 1 ? '已收藏' : i.is_collect == 2 ? '移除' : '收藏' }}</text>
</view>
</div>
<ul class="item_message">
<li>
<text>2019最低位次</text>
<view>{{i.lowestRank || '- ' }}</view>
</li>
<li>
<text>2019最低分</text>
<view>{{i.minScore == null || i.minScore == 0 ? '-' : `${i.minScore}` }}</view>
</li>
<li>
<text>2019招生</text>
<view>{{i.enterNum || i.planNum ? `${i.enterNum || i.planNum }` : '-' }}</view>
</li>
<li>
<text>全国排名</text>
<view>{{i.rankOfCn || '- '}}</view>
</li>
</ul>
</view>
<Loading></Loading>
</div>
<div v-else class="nodata">暂无数据</div>
</div>
</template>
<script>
import uniTransition from "@/components/uni-transition/uni-transition.vue"
import Loading from "@/components/tpl/Loading.vue"
export default {
components: {
uniTransition,
Loading
},
props: {
list: {
type: Array,
default: []
},
showDown: {
type: Boolean,
default: true
}
},
created() {
},
methods: {
titleClick(item) {
this.$emit('titleClick', item)
},
AddUserLike(item) {
this.$emit("AddUserLike", item)
},
RemoveLike(item,index) {
this.$emit("RemoveLike", item,index)
},
recruit(item) {
this.$emit("recruit", item)
}
}
}
</script>
<style scoped lang="less">
@import "../../common/less/tpl/color";
.nodata {
text-align: center;
font-size: 25.362rpx;
color: #8d8d8d;
margin-top: 60rpx;
}
.list_item {
margin: 9.057rpx 18.115rpx;
margin-bottom: 27.173rpx;
padding: 18.115rpx 27.173rpx;
box-shadow: 0 3px 15px 0 rgba(97,81,66,.18);
border-radius: 18.115rpx;
.item_title {
display: flex;
justify-content: space-between;
align-items: center;
.title_left{
width: 70%;
text {
font-size: 30.997rpx;
font-weight: 400;
}
.t {
display: inline-block;
margin-left: 5.434rpx;
min-width: 28.985rpx;
width: 28.985rpx;
height: 28.985rpx;
color: #fff;
font-size: 21.739rpx;
line-height: 28.985rpx;
text-align: center;
border-radius: 7.246rpx;
}
.ti {
background: #16d88e;
}
.wen {
background: #03bfff !important;
}
.chong {
background: #ff5f47 !important;
}
}
.title_right {
width: 30%;
text-align: center;
font-size: 23.95rpx;
color: #a9a9a9;
span {
vertical-align: middle;
margin-left: 5.434rpx;
}
}
}
.item_content {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 19.927rpx;
padding-bottom: 14.492rpx;
border-bottom: 1.811rpx dashed #ede8e3;
.content_center {
display: flex;
align-items: center;
img {
width: 90.579rpx;
height: 90.579rpx;
margin-right: 16.304rpx;
}
.probability_text {
font-size: 43.778rpx;
color: @themeColor;
margin-right: 21.739rpx;
}
.center_f {
.center_text {
font-size: 27.673rpx;
color: #696969;
margin-bottom: 10.869rpx;
width: 362.618rpx;
text {
color: @themeColor;
margin: 0 9.057rpx;
}
}
.center_li {
display: flex;
li {
background: #f0eeec;
border-radius: 1.811rpx;
line-height: 30.997rpx;
font-size: 23.75rpx;
color: #aea4ab;
padding: 1.811rpx 5.434rpx;
margin: 0 3.623rpx 3.623rpx 0;
}
}
}
}
}
}
</style>

View File

@@ -0,0 +1,50 @@
<template>
<div class="loading" :data-index="$store.state.showStatus">
<div class="WaitingText" v-if="$store.state.showStatus == 1">{{waitingText}}</div>
<div class="EndText" v-else-if="$store.state.showStatus == 2">{{endText}}</div>
<div class="EmptyText" v-else="$store.state.showStatus == 3">{{emptyText}}</div>
</div>
</template>
<script>
export default {
props: {
waitingText: {
type: String,
default: "正在加载.."
},
endText: {
type: String,
default: "加载完成"
},
emptyText: {
type: String,
default: "暂无数据"
}
},
data() {
return {
}
},
onLaunch() {
},
created() {
},
methods: {
}
}
</script>
<style scoped lang="less">
.loading {
.WaitingText,
.EmptyText,
.EndText{
margin-top: 20px;
font-size: 27.173rpx;
text-align: center;
color: #a499a1;
}
}
</style>

View File

@@ -0,0 +1,169 @@
<template>
<!--招生专业-->
<div class="Major">
<div class="major_list_item">
<div class="title">
<!--如果有学校名称那么现实学校名称 和专业名-->
<div v-if="item.sch_name">
<div class="m_title">概率 {{item.probability}}%</div>
<slot name="shctitle"></slot>
</div>
<!--如果没有学校名称那么只显示学习标题-->
<div v-else>
<div class="m_school_title">{{item.title}}</div>
</div>
</div>
<view class="item_content">
<div class="left" :data-index="item.logo">
<img :src="
item.hasOwnProperty('logo')
? $img.url(item.sch_id || item.collegeId)
: require('@/static/img/current_school.jpg')" alt="">
<!--判断是否有 学费如果有显示普通高考 全部院校的布局-->
<div v-if="item.hasOwnProperty('cost')" class="cen">
<div class="cen_t">专业代码{{item.code}} 专业学费 {{item.cost}}</div>
<text class="badeg" v-if="typeof item.tags == 'string' ">{{item.tags}}</text>
</div>
<div v-else class="cen">
<div class="cen_t">{{item.title}} {{item.learnYear}}学制 {{item.degree}}</div>
<text class="badeg">{{item.typeName}}</text>
<text class="proportion">男女比例{{item.sex_bili}}</text>
</div>
</div>
<div class="right" @click="showSchoolPopup(item)">
<slot name="action"></slot>
</div>
</view>
<div class="item_footer" v-if="item.hasOwnProperty('countSch')">
2020年在本省招生该专业院校共{{item.countSch}}招生人数共{{item.sumPlan}}
</div>
<div class="item_footer" v-else>
<ul class="item_message">
<li>
<text>2018最低位次</text>
<view>{{item.lowestRank || '- ' }}</view>
</li>
<li>
<text>2018最低分</text>
<view>{{item.minScore == null || item.minScore == 0 ? '-' : `${item.minScore}`}}</view>
</li>
<li>
<text>2019录取人数</text>
<view>{{item.enterNum == null || item.enterNum == 0 ? '-' : `${item.enterNum}` }}</view>
</li>
<li>
<text>2020招生人数</text>
<view>{{item.planNum || '- ' }}</view>
</li>
</ul>
</div>
</div>
</div>
</template>
<script>
export default {
props: {
item: {
type: Object,
default: {}
}
},
methods: {
showSchoolPopup(item) {
this.$emit("showPopup", item)
}
},
components: {
}
}
</script>
<style lang="less" scoped>
.major_list_item {
border-radius: 14.492rpx;
background-color: rgba(255, 255, 255, 1);
border: 1.811rpx solid rgba(255, 255, 255, 0);
box-shadow: 0 3px 15px 0 rgba(97,81,66,.18);
padding: 32.608rpx 19.927rpx;
margin-bottom: 32.608rpx;
padding-bottom: 0;
.title {
overflow: hidden;
.m_title {
float: right;
font-size: 27.173rpx;
color: #7c7777;
}
.m_school_title {
font-size: 27.173rpx;
font-weight: 400;
float: left;
width: 75%;
}
}
.item_content {
display: flex;
margin-top: 18.115rpx;
padding-bottom: 12.681rpx;
border-bottom: 1px dashed #ede8e3;
align-items: center;
justify-content: space-between;
padding-bottom: 21.739rpx;
.left {
display: flex;
img {
width: 88.768rpx;
height: 88.768rpx;
margin-right: 14.492rpx;
}
.cen {
.cen_t {
font-size: 25.362rpx;
color: #7D7878;
width: 362.318rpx;
white-space: pre-wrap;
}
.badeg {
padding: 3.923rpx 12.981rpx;
font-size: 23.75rpx;
background: #f0eeec;
border-radius: 52.536rpx;
margin-right: 12.681rpx;
color: #aea4ab;
}
.proportion {
font-size: 21.739rpx;
color: #999595;
}
}
}
}
.item_footer {
font-size: 23.55rpx;
color: #ACACAC;
padding: 28.985rpx 10.869rpx;
}
}
</style>

View File

@@ -0,0 +1,22 @@
<template>
<div class="nodata">
暂无数据
</div>
</template>
<script>
export default {
}
</script>
<style lang="less" scoped>
.nodata {
text-align: center;
font-size: 25.362rpx;
margin-top: 25%;
color: #bbb9b9;
}
</style>

View File

@@ -0,0 +1,87 @@
<template>
<div class="tabs_item">
<div class="city_action">
<view v-if="hiddenClosed" class="iconfont closed" @click="Closed">&#xe627;</view>
<view v-if="hiddenClear" class="clear" @click="Clear">重置</view>
<view v-if="hiddenSubmit" class="determine" @click="Submit">{{submitTitle}}</view>
</div>
</div>
</template>
<script>
export default {
props: {
refName: {
type: String,
default: ""
},
hiddenClear: {
type: Boolean,
default: true
},
submitTitle: {
type: String,
default: "确定"
},
hiddenSubmit: {
type: Boolean,
default: true
},
hiddenClosed: {
type: Boolean,
default: true
}
},
methods: {
Closed() {
this.$emit("Closed")
},
/**
* 重置
*/
Clear() {
this.$emit("Clear")
},
Submit() {
this.$emit("Submit")
}
}
}
</script>
<style scoped lang="less">
@import "../../common/less/index";
.city_action {
width: 100%;
height: 97.826rpx;
color: #fff;
font-size: 30.997rpx;
display: flex;
margin-top:126.811rpx;
position: fixed;
left: 0;
bottom: 0;
.closed {
position: absolute;
top: -112.318rpx;
color: #1b78fa;
font-size: 54.347rpx;
left: 50%;
margin-left: calc(-54.347rpx / 2);
}
.clear {
text-align: center;
width: 50%;
line-height: 97.826rpx;
background-color: #1ba3fa;
}
.determine {
width: 50%;
text-align: center;
line-height: 97.826rpx;
background-color: @themeColor;
}
}
</style>

View File

@@ -0,0 +1,29 @@
<template>
<div class="TipsTitle">
{{title}}
</div>
</template>
<script>
export default {
props: {
title: {
type: String,
default: ''
}
}
}
</script>
<style lang="less" scoped>
@import "../../common/less/index";
.TipsTitle {
margin-top: 18.115rpx;
font-size: 29.985rpx;
padding-left: 21.939rpx;
margin-bottom: 18.515rpx;
color: #000;
font-weight: 500;
border-left: 5.434rpx solid @themeColor;
}
</style>

View File

@@ -0,0 +1,71 @@
<template>
<!--如果是pc访问限制头部导航条宽度-->
<div :class=" scrolled ? 'nav back' : 'nav ddd'">
<view class="navigation" @click="back">
<span class="iconfont">&#xe654;</span>
<text>{{ title }}</text>
</view>
</div>
</template>
<script>
export default {
props: {
title: {
type: String,
default: ""
}
},
data() {
return {
scrolled: false
}
},
mounted() {
window.addEventListener('scroll', this.handleScroll);
},
methods: {
handleScroll () {
this.scrolled = window.scrollY > 50;
},
back() {
if (this.$utils.getLocalStorage("order_message")) {
this.$utils.enterPage("../index/index")
} else {
this.$utils.backPage()
}
}
}
}
</script>
<style scoped lang="less">
.nav {
position: fixed;
width: 100%;
left: 0;
top: 0;
z-index: 999;
background: rgba(27, 120, 250, 0);
transition: all 2s ease;
}
.back {
background: rgba(27, 120, 250, 1);
}
.navigation {
width: 100%;
height: 79.71rpx;
font-size: 28.985rpx;
color: #fff;
display: flex;
align-items: center;
padding: 0 18.115rpx;
box-sizing: border-box;
margin: 0;
span {
margin-right: 23.55rpx;
}
}
</style>

View File

@@ -0,0 +1 @@
3aa92039-e6a4-442f-b250-d6bb0009850f

View File

@@ -0,0 +1,146 @@
<template>
<text v-if="text" :class="inverted ? 'uni-badge--' + type + ' uni-badge--' + size + ' uni-badge--' + type + '-inverted' : 'uni-badge--' + type + ' uni-badge--' + size" :style="badgeStyle" class="uni-badge" @click="onClick()">{{ text }}</text>
</template>
<script>
/**
* Badge 数字角标
* @description 数字角标一般和其它控件列表、9宫格等配合使用用于进行数量提示默认为实心灰色背景
* @tutorial https://ext.dcloud.net.cn/plugin?id=21
* @property {String} text 角标内容
* @property {String} type = [default|primary|success|warning|error] 颜色类型
* @value default 灰色
* @value primary 蓝色
* @value success 绿色
* @value warning 黄色
* @value error 红色
* @property {String} size = [normal|small] Badge 大小
* @value normal 一般尺寸
* @value small 小尺寸
* @property {String} inverted = [true|false] 是否无需背景颜色
* @event {Function} click 点击 Badge 触发事件
* @example <uni-badge text="1"></uni-badge>
*/
export default {
name: 'UniBadge',
props: {
type: {
type: String,
default: 'default'
},
inverted: {
type: Boolean,
default: false
},
text: {
type: [String, Number],
default: ''
},
size: {
type: String,
default: 'normal'
}
},
data() {
return {
badgeStyle: ''
};
},
watch: {
text() {
this.setStyle()
}
},
mounted() {
this.setStyle()
},
methods: {
setStyle() {
this.badgeStyle = `width: ${String(this.text).length * 8 + 12}px`
},
onClick() {
this.$emit('click');
}
}
};
</script>
<style scoped>
.uni-badge {
/* #ifndef APP-PLUS */
display: flex;
/* #endif */
justify-content: center;
flex-direction: row;
height: 20px;
line-height: 20px;
color: #333;
border-radius: 100px;
background-color: #f1f1f1;
background-color: transparent;
text-align: center;
font-family: 'Helvetica Neue', Helvetica, sans-serif;
font-size: 12px;
padding: 0px 6px;
}
.uni-badge--inverted {
padding: 0 5px 0 0;
color: #f1f1f1;
}
.uni-badge--default {
color: #333;
background-color: #f1f1f1;
}
.uni-badge--default-inverted {
color: #999;
background-color: transparent;
}
.uni-badge--primary {
color: #fff;
background-color: #007aff;
}
.uni-badge--primary-inverted {
color: #007aff;
background-color: transparent;
}
.uni-badge--success {
color: #fff;
background-color: #4cd964;
}
.uni-badge--success-inverted {
color: #4cd964;
background-color: transparent;
}
.uni-badge--warning {
color: #fff;
background-color: #f0ad4e;
}
.uni-badge--warning-inverted {
color: #f0ad4e;
background-color: transparent;
}
.uni-badge--error {
color: #fff;
background-color: #dd524d;
}
.uni-badge--error-inverted {
color: #dd524d;
background-color: transparent;
}
.uni-badge--small {
transform: scale(0.8);
transform-origin: center center;
}
</style>

View File

@@ -0,0 +1 @@
cac3fd29-6441-4a88-afee-1c9b77417e15

View File

@@ -0,0 +1,546 @@
/**
* @1900-2100区间内的公历、农历互转
* @charset UTF-8
* @github https://github.com/jjonline/calendar.js
* @Author Jea杨(JJonline@JJonline.Cn)
* @Time 2014-7-21
* @Time 2016-8-13 Fixed 2033hex、Attribution Annals
* @Time 2016-9-25 Fixed lunar LeapMonth Param Bug
* @Time 2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year
* @Version 1.0.3
* @公历转农历calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0]
* @农历转公历calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0]
*/
/* eslint-disable */
var calendar = {
/**
* 农历1900-2100的润大小信息表
* @Array Of Property
* @return Hex
*/
lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, // 1900-1909
0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, // 1910-1919
0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, // 1920-1929
0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, // 1930-1939
0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, // 1940-1949
0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, // 1950-1959
0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, // 1960-1969
0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, // 1970-1979
0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, // 1980-1989
0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0, // 1990-1999
0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, // 2000-2009
0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, // 2010-2019
0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, // 2020-2029
0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, // 2030-2039
0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, // 2040-2049
/** Add By JJonline@JJonline.Cn**/
0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, // 2050-2059
0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, // 2060-2069
0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0, // 2070-2079
0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160, // 2080-2089
0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, // 2090-2099
0x0d520], // 2100
/**
* 公历每个月份的天数普通表
* @Array Of Property
* @return Number
*/
solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
/**
* 天干地支之天干速查表
* @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]
* @return Cn string
*/
Gan: ['\u7532', '\u4e59', '\u4e19', '\u4e01', '\u620a', '\u5df1', '\u5e9a', '\u8f9b', '\u58ec', '\u7678'],
/**
* 天干地支之地支速查表
* @Array Of Property
* @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]
* @return Cn string
*/
Zhi: ['\u5b50', '\u4e11', '\u5bc5', '\u536f', '\u8fb0', '\u5df3', '\u5348', '\u672a', '\u7533', '\u9149', '\u620c', '\u4ea5'],
/**
* 天干地支之地支速查表<=>生肖
* @Array Of Property
* @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"]
* @return Cn string
*/
Animals: ['\u9f20', '\u725b', '\u864e', '\u5154', '\u9f99', '\u86c7', '\u9a6c', '\u7f8a', '\u7334', '\u9e21', '\u72d7', '\u732a'],
/**
* 24节气速查表
* @Array Of Property
* @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"]
* @return Cn string
*/
solarTerm: ['\u5c0f\u5bd2', '\u5927\u5bd2', '\u7acb\u6625', '\u96e8\u6c34', '\u60ca\u86f0', '\u6625\u5206', '\u6e05\u660e', '\u8c37\u96e8', '\u7acb\u590f', '\u5c0f\u6ee1', '\u8292\u79cd', '\u590f\u81f3', '\u5c0f\u6691', '\u5927\u6691', '\u7acb\u79cb', '\u5904\u6691', '\u767d\u9732', '\u79cb\u5206', '\u5bd2\u9732', '\u971c\u964d', '\u7acb\u51ac', '\u5c0f\u96ea', '\u5927\u96ea', '\u51ac\u81f3'],
/**
* 1900-2100各年的24节气日期速查表
* @Array Of Property
* @return 0x string For splice
*/
sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f',
'97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
'97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa',
'97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f',
'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f',
'97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa',
'97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2',
'9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f',
'97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e',
'97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
'97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722',
'9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f',
'97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
'97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
'97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722',
'9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f',
'97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',
'97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',
'9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722',
'7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
'97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
'97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
'9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722',
'7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
'97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
'97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
'9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722',
'7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',
'97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',
'9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',
'7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',
'7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
'97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
'9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
'7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',
'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
'97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
'9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
'7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721',
'7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2',
'977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',
'7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd',
'7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
'977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
'7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd',
'7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
'977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
'7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721',
'7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5',
'7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722',
'7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
'7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',
'7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35',
'7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
'7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721',
'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd',
'7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35',
'7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
'7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721',
'7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5',
'7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35',
'665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
'7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',
'7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35',
'7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'],
/**
* 数字转中文速查表
* @Array Of Property
* @trans ['日','一','二','三','四','五','六','七','八','九','十']
* @return Cn string
*/
nStr1: ['\u65e5', '\u4e00', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341'],
/**
* 日期转农历称呼速查表
* @Array Of Property
* @trans ['初','十','廿','卅']
* @return Cn string
*/
nStr2: ['\u521d', '\u5341', '\u5eff', '\u5345'],
/**
* 月份转农历称呼速查表
* @Array Of Property
* @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊']
* @return Cn string
*/
nStr3: ['\u6b63', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341', '\u51ac', '\u814a'],
/**
* 返回农历y年一整年的总天数
* @param lunar Year
* @return Number
* @eg:var count = calendar.lYearDays(1987) ;//count=387
*/
lYearDays: function (y) {
var i; var sum = 348
for (i = 0x8000; i > 0x8; i >>= 1) { sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0 }
return (sum + this.leapDays(y))
},
/**
* 返回农历y年闰月是哪个月若y年没有闰月 则返回0
* @param lunar Year
* @return Number (0-12)
* @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6
*/
leapMonth: function (y) { // 闰字编码 \u95f0
return (this.lunarInfo[y - 1900] & 0xf)
},
/**
* 返回农历y年闰月的天数 若该年没有闰月则返回0
* @param lunar Year
* @return Number (0、29、30)
* @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29
*/
leapDays: function (y) {
if (this.leapMonth(y)) {
return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29)
}
return (0)
},
/**
* 返回农历y年m月非闰月的总天数计算m为闰月时的天数请使用leapDays方法
* @param lunar Year
* @return Number (-1、29、30)
* @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29
*/
monthDays: function (y, m) {
if (m > 12 || m < 1) { return -1 }// 月份参数从1至12参数错误返回-1
return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29)
},
/**
* 返回公历(!)y年m月的天数
* @param solar Year
* @return Number (-1、28、29、30、31)
* @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30
*/
solarDays: function (y, m) {
if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1
var ms = m - 1
if (ms == 1) { // 2月份的闰平规律测算后确认返回28或29
return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28)
} else {
return (this.solarMonth[ms])
}
},
/**
* 农历年份转换为干支纪年
* @param lYear 农历年的年份数
* @return Cn string
*/
toGanZhiYear: function (lYear) {
var ganKey = (lYear - 3) % 10
var zhiKey = (lYear - 3) % 12
if (ganKey == 0) ganKey = 10// 如果余数为0则为最后一个天干
if (zhiKey == 0) zhiKey = 12// 如果余数为0则为最后一个地支
return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1]
},
/**
* 公历月、日判断所属星座
* @param cMonth [description]
* @param cDay [description]
* @return Cn string
*/
toAstro: function (cMonth, cDay) {
var s = '\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf'
var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22]
return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + '\u5ea7'// 座
},
/**
* 传入offset偏移量返回干支
* @param offset 相对甲子的偏移量
* @return Cn string
*/
toGanZhi: function (offset) {
return this.Gan[offset % 10] + this.Zhi[offset % 12]
},
/**
* 传入公历(!)y年获得该年第n个节气的公历日期
* @param y公历年(1900-2100)n二十四节气中的第几个节气(1~24)从n=1(小寒)算起
* @return day Number
* @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春
*/
getTerm: function (y, n) {
if (y < 1900 || y > 2100) { return -1 }
if (n < 1 || n > 24) { return -1 }
var _table = this.sTermInfo[y - 1900]
var _info = [
parseInt('0x' + _table.substr(0, 5)).toString(),
parseInt('0x' + _table.substr(5, 5)).toString(),
parseInt('0x' + _table.substr(10, 5)).toString(),
parseInt('0x' + _table.substr(15, 5)).toString(),
parseInt('0x' + _table.substr(20, 5)).toString(),
parseInt('0x' + _table.substr(25, 5)).toString()
]
var _calday = [
_info[0].substr(0, 1),
_info[0].substr(1, 2),
_info[0].substr(3, 1),
_info[0].substr(4, 2),
_info[1].substr(0, 1),
_info[1].substr(1, 2),
_info[1].substr(3, 1),
_info[1].substr(4, 2),
_info[2].substr(0, 1),
_info[2].substr(1, 2),
_info[2].substr(3, 1),
_info[2].substr(4, 2),
_info[3].substr(0, 1),
_info[3].substr(1, 2),
_info[3].substr(3, 1),
_info[3].substr(4, 2),
_info[4].substr(0, 1),
_info[4].substr(1, 2),
_info[4].substr(3, 1),
_info[4].substr(4, 2),
_info[5].substr(0, 1),
_info[5].substr(1, 2),
_info[5].substr(3, 1),
_info[5].substr(4, 2)
]
return parseInt(_calday[n - 1])
},
/**
* 传入农历数字月份返回汉语通俗表示法
* @param lunar month
* @return Cn string
* @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月'
*/
toChinaMonth: function (m) { // 月 => \u6708
if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1
var s = this.nStr3[m - 1]
s += '\u6708'// 加上月字
return s
},
/**
* 传入农历日期数字返回汉字表示法
* @param lunar day
* @return Cn string
* @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一'
*/
toChinaDay: function (d) { // 日 => \u65e5
var s
switch (d) {
case 10:
s = '\u521d\u5341'; break
case 20:
s = '\u4e8c\u5341'; break
break
case 30:
s = '\u4e09\u5341'; break
break
default :
s = this.nStr2[Math.floor(d / 10)]
s += this.nStr1[d % 10]
}
return (s)
},
/**
* 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春”
* @param y year
* @return Cn string
* @eg:var animal = calendar.getAnimal(1987) ;//animal='兔'
*/
getAnimal: function (y) {
return this.Animals[(y - 4) % 12]
},
/**
* 传入阳历年月日获得详细的公历、农历object信息 <=>JSON
* @param y solar year
* @param m solar month
* @param d solar day
* @return JSON object
* @eg:console.log(calendar.solar2lunar(1987,11,01));
*/
solar2lunar: function (y, m, d) { // 参数区间1900.1.31~2100.12.31
// 年份限定、上限
if (y < 1900 || y > 2100) {
return -1// undefined转换为数字变为NaN
}
// 公历传参最下限
if (y == 1900 && m == 1 && d < 31) {
return -1
}
// 未传参 获得当天
if (!y) {
var objDate = new Date()
} else {
var objDate = new Date(y, parseInt(m) - 1, d)
}
var i; var leap = 0; var temp = 0
// 修正ymd参数
var y = objDate.getFullYear()
var m = objDate.getMonth() + 1
var d = objDate.getDate()
var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, 31)) / 86400000
for (i = 1900; i < 2101 && offset > 0; i++) {
temp = this.lYearDays(i)
offset -= temp
}
if (offset < 0) {
offset += temp; i--
}
// 是否今天
var isTodayObj = new Date()
var isToday = false
if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) {
isToday = true
}
// 星期几
var nWeek = objDate.getDay()
var cWeek = this.nStr1[nWeek]
// 数字表示周几顺应天朝周一开始的惯例
if (nWeek == 0) {
nWeek = 7
}
// 农历年
var year = i
var leap = this.leapMonth(i) // 闰哪个月
var isLeap = false
// 效验闰月
for (i = 1; i < 13 && offset > 0; i++) {
// 闰月
if (leap > 0 && i == (leap + 1) && isLeap == false) {
--i
isLeap = true; temp = this.leapDays(year) // 计算农历闰月天数
} else {
temp = this.monthDays(year, i)// 计算农历普通月天数
}
// 解除闰月
if (isLeap == true && i == (leap + 1)) { isLeap = false }
offset -= temp
}
// 闰月导致数组下标重叠取反
if (offset == 0 && leap > 0 && i == leap + 1) {
if (isLeap) {
isLeap = false
} else {
isLeap = true; --i
}
}
if (offset < 0) {
offset += temp; --i
}
// 农历月
var month = i
// 农历日
var day = offset + 1
// 天干地支处理
var sm = m - 1
var gzY = this.toGanZhiYear(year)
// 当月的两个节气
// bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year`
var firstNode = this.getTerm(y, (m * 2 - 1))// 返回当月「节」为几日开始
var secondNode = this.getTerm(y, (m * 2))// 返回当月「节」为几日开始
// 依据12节气修正干支月
var gzM = this.toGanZhi((y - 1900) * 12 + m + 11)
if (d >= firstNode) {
gzM = this.toGanZhi((y - 1900) * 12 + m + 12)
}
// 传入的日期的节气与否
var isTerm = false
var Term = null
if (firstNode == d) {
isTerm = true
Term = this.solarTerm[m * 2 - 2]
}
if (secondNode == d) {
isTerm = true
Term = this.solarTerm[m * 2 - 1]
}
// 日柱 当月一日与 1900/1/1 相差天数
var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10
var gzD = this.toGanZhi(dayCyclical + d - 1)
// 该日期所属的星座
var astro = this.toAstro(m, d)
return { 'lYear': year, 'lMonth': month, 'lDay': day, 'Animal': this.getAnimal(year), 'IMonthCn': (isLeap ? '\u95f0' : '') + this.toChinaMonth(month), 'IDayCn': this.toChinaDay(day), 'cYear': y, 'cMonth': m, 'cDay': d, 'gzYear': gzY, 'gzMonth': gzM, 'gzDay': gzD, 'isToday': isToday, 'isLeap': isLeap, 'nWeek': nWeek, 'ncWeek': '\u661f\u671f' + cWeek, 'isTerm': isTerm, 'Term': Term, 'astro': astro }
},
/**
* 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON
* @param y lunar year
* @param m lunar month
* @param d lunar day
* @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可]
* @return JSON object
* @eg:console.log(calendar.lunar2solar(1987,9,10));
*/
lunar2solar: function (y, m, d, isLeapMonth) { // 参数区间1900.1.31~2100.12.1
var isLeapMonth = !!isLeapMonth
var leapOffset = 0
var leapMonth = this.leapMonth(y)
var leapDay = this.leapDays(y)
if (isLeapMonth && (leapMonth != m)) { return -1 }// 传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同
if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) { return -1 }// 超出了最大极限值
var day = this.monthDays(y, m)
var _day = day
// bugFix 2016-9-25
// if month is leap, _day use leapDays method
if (isLeapMonth) {
_day = this.leapDays(y, m)
}
if (y < 1900 || y > 2100 || d > _day) { return -1 }// 参数合法性效验
// 计算农历的时间差
var offset = 0
for (var i = 1900; i < y; i++) {
offset += this.lYearDays(i)
}
var leap = 0; var isAdd = false
for (var i = 1; i < m; i++) {
leap = this.leapMonth(y)
if (!isAdd) { // 处理闰月
if (leap <= i && leap > 0) {
offset += this.leapDays(y); isAdd = true
}
}
offset += this.monthDays(y, i)
}
// 转换闰月农历 需补充该年闰月的前一个月的时差
if (isLeapMonth) { offset += day }
// 1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点)
var stmap = Date.UTC(1900, 1, 30, 0, 0, 0)
var calObj = new Date((offset + d - 31) * 86400000 + stmap)
var cY = calObj.getUTCFullYear()
var cM = calObj.getUTCMonth() + 1
var cD = calObj.getUTCDate()
return this.solar2lunar(cY, cM, cD)
}
}
export default calendar

View File

@@ -0,0 +1,151 @@
<template>
<view class="uni-calendar-item__weeks-box" :class="{
'uni-calendar-item--disable':weeks.disable,
'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
'uni-calendar-item--checked':(calendar.fullDate === weeks.fullDate && !weeks.isDay) ,
'uni-calendar-item--multiple': weeks.multiple
}" @click="choiceDate(weeks)">
<view class="uni-calendar-item__weeks-box-item">
<text v-if="selected&&weeks.extraInfo" class="uni-calendar-item__weeks-box-circle"></text>
<text class="uni-calendar-item__weeks-box-text" :class="{
'uni-calendar-item--isDay-text': weeks.isDay,
'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
'uni-calendar-item--multiple': weeks.multiple,
'uni-calendar-item--disable':weeks.disable,
}">{{weeks.date}}</text>
<text v-if="!lunar&&!weeks.extraInfo && weeks.isDay" class="uni-calendar-item__weeks-lunar-text" :class="{
'uni-calendar-item--isDay-text':weeks.isDay,
'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
'uni-calendar-item--multiple': weeks.multiple,
}">今天</text>
<text v-if="lunar&&!weeks.extraInfo" class="uni-calendar-item__weeks-lunar-text" :class="{
'uni-calendar-item--isDay-text':weeks.isDay,
'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
'uni-calendar-item--multiple': weeks.multiple,
'uni-calendar-item--disable':weeks.disable,
}">{{weeks.isDay?'今天': (weeks.lunar.IDayCn === '初一'?weeks.lunar.IMonthCn:weeks.lunar.IDayCn)}}</text>
<text v-if="weeks.extraInfo&&weeks.extraInfo.info" class="uni-calendar-item__weeks-lunar-text" :class="{
'uni-calendar-item--extra':weeks.extraInfo.info,
'uni-calendar-item--isDay-text':weeks.isDay,
'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
'uni-calendar-item--multiple': weeks.multiple,
'uni-calendar-item--disable':weeks.disable,
}">{{weeks.extraInfo.info}}</text>
</view>
</view>
</template>
<script>
export default {
props: {
weeks: {
type: Object,
default () {
return {}
}
},
calendar: {
type: Object,
default: () => {
return {}
}
},
selected: {
type: Array,
default: () => {
return []
}
},
lunar: {
type: Boolean,
default: false
}
},
methods: {
choiceDate(weeks) {
this.$emit('change', weeks)
}
}
}
</script>
<style scoped>
.uni-calendar-item__weeks-box {
flex: 1;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
justify-content: center;
align-items: center;
}
.uni-calendar-item__weeks-box-text {
font-size: 28rpx;
color: #333;
}
.uni-calendar-item__weeks-lunar-text {
font-size: 24rpx;
color: #333;
}
.uni-calendar-item__weeks-box-item {
position: relative;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
justify-content: center;
align-items: center;
width: 100rpx;
height: 100rpx;
}
.uni-calendar-item__weeks-box-circle {
position: absolute;
top: 5px;
right: 5px;
width: 8px;
height: 8px;
border-radius: 8px;
background-color: #dd524d;
}
.uni-calendar-item--disable {
background-color: rgba(249, 249, 249, 0.3);
color: #c0c0c0;
}
.uni-calendar-item--isDay-text {
color: #007aff;
}
.uni-calendar-item--isDay {
background-color: #007aff;
opacity: 0.8;
color: #fff;
}
.uni-calendar-item--extra {
color: #dd524d;
opacity: 0.8;
}
.uni-calendar-item--checked {
background-color: #007aff;
color: #fff;
opacity: 0.8;
}
.uni-calendar-item--multiple {
background-color: #007aff;
color: #fff;
opacity: 0.8;
}
</style>

View File

@@ -0,0 +1,431 @@
<template>
<view class="uni-calendar" @touchmove.stop.prevent="clean">
<view v-if="!insert&&show" class="uni-calendar__mask" :class="{'uni-calendar--mask-show':aniMaskShow}" @click="clean"></view>
<view v-if="insert || show" class="uni-calendar__content" :class="{'uni-calendar--fixed':!insert,'uni-calendar--ani-show':aniMaskShow}">
<view v-if="!insert" class="uni-calendar__header uni-calendar--fixed-top">
<view class="uni-calendar__header-btn-box" @click="close">
<text class="uni-calendar__header-text uni-calendar--fixed-width">取消</text>
</view>
<view class="uni-calendar__header-btn-box" @click="confirm">
<text class="uni-calendar__header-text uni-calendar--fixed-width">确定</text>
</view>
</view>
<view class="uni-calendar__header">
<view class="uni-calendar__header-btn-box" @click="pre">
<view class="uni-calendar__header-btn uni-calendar--left"></view>
</view>
<text class="uni-calendar__header-text">{{ (nowDate.year||'') +'年'+( nowDate.month||'') +'月'}}</text>
<view class="uni-calendar__header-btn-box" @click="next">
<view class="uni-calendar__header-btn uni-calendar--right"></view>
</view>
<text class="uni-calendar__backtoday" @click="backtoday">回到今天</text>
</view>
<view class="uni-calendar__box">
<view v-if="showMonth" class="uni-calendar__box-bg">
<text class="uni-calendar__box-bg-text">{{nowDate.month}}</text>
</view>
<view class="uni-calendar__weeks">
<view class="uni-calendar__weeks-day">
<text class="uni-calendar__weeks-day-text"></text>
</view>
<view class="uni-calendar__weeks-day">
<text class="uni-calendar__weeks-day-text"></text>
</view>
<view class="uni-calendar__weeks-day">
<text class="uni-calendar__weeks-day-text"></text>
</view>
<view class="uni-calendar__weeks-day">
<text class="uni-calendar__weeks-day-text"></text>
</view>
<view class="uni-calendar__weeks-day">
<text class="uni-calendar__weeks-day-text"></text>
</view>
<view class="uni-calendar__weeks-day">
<text class="uni-calendar__weeks-day-text"></text>
</view>
<view class="uni-calendar__weeks-day">
<text class="uni-calendar__weeks-day-text"></text>
</view>
</view>
<view class="uni-calendar__weeks" v-for="(item,weekIndex) in weeks" :key="weekIndex">
<view class="uni-calendar__weeks-item" v-for="(weeks,weeksIndex) in item" :key="weeksIndex">
<uni-calendar-item :weeks="weeks" :calendar="calendar" :selected="selected" :lunar="lunar" @change="choiceDate"></uni-calendar-item>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
import Calendar from './util.js';
import uniCalendarItem from './uni-calendar-item.vue'
/**
* Calendar 日历
* @description 日历组件可以查看日期,选择任意范围内的日期,打点操作。常用场景如:酒店日期预订、火车机票选择购买日期、上下班打卡等
* @tutorial https://ext.dcloud.net.cn/plugin?id=56
* @property {String} date 自定义当前时间,默认为今天
* @property {Boolean} lunar 显示农历
* @property {String} startDate 日期选择范围-开始日期
* @property {String} endDate 日期选择范围-结束日期
* @property {Boolean} range 范围选择
* @property {Boolean} insert = [true|false] 插入模式,默认为false
* @value true 弹窗模式
* @value false 插入模式
* @property {Array} selected 打点,期待格式[{date: '2019-06-27', info: '签到', data: { custom: '自定义信息', name: '自定义消息头',xxx:xxx... }}]
* @property {Boolean} showMonth 是否选择月份为背景
* @event {Function} change 日期改变,`insert :ture` 时生效
* @event {Function} confirm 确认选择`insert :false` 时生效
* @event {Function} monthSwitch 切换月份时触发
* @example <uni-calendar :insert="true":lunar="true" :start-date="'2019-3-2'":end-date="'2019-5-20'"@change="change" />
*/
export default {
components: {
uniCalendarItem
},
props: {
date: {
type: String,
default: ''
},
selected: {
type: Array,
default () {
return []
}
},
lunar: {
type: Boolean,
default: false
},
startDate: {
type: String,
default: ''
},
endDate: {
type: String,
default: ''
},
range: {
type: Boolean,
default: false
},
insert: {
type: Boolean,
default: true
},
showMonth: {
type: Boolean,
default: true
}
},
data() {
return {
show: false,
weeks: [],
calendar: {},
nowDate: '',
aniMaskShow: false
}
},
watch: {
selected(newVal) {
this.cale.setSelectInfo(this.nowDate.fullDate, newVal)
this.weeks = this.cale.weeks
}
},
created() {
// 获取日历方法实例
this.cale = new Calendar({
date: this.date,
selected: this.selected,
startDate: this.startDate,
endDate: this.endDate,
range: this.range,
})
this.init(this.cale.date.fullDate)
},
methods: {
// 取消穿透
clean() {},
init(date) {
this.weeks = this.cale.weeks
this.nowDate = this.calendar = this.cale.getInfo(date)
},
open() {
this.show = true
this.$nextTick(() => {
setTimeout(() => {
this.aniMaskShow = true
}, 50)
})
},
close() {
this.aniMaskShow = false
this.$nextTick(() => {
setTimeout(() => {
this.show = false
}, 300)
})
},
confirm() {
this.setEmit('confirm')
this.close()
},
change() {
if (!this.insert) return
this.setEmit('change')
},
monthSwitch() {
let {
year,
month
} = this.nowDate
this.$emit('monthSwitch', {
year,
month: Number(month)
})
},
setEmit(name) {
let {
year,
month,
date,
fullDate,
lunar,
extraInfo
} = this.calendar
this.$emit(name, {
range: this.cale.multipleStatus,
year,
month,
date,
fulldate: fullDate,
lunar,
extraInfo: extraInfo || {}
})
},
choiceDate(weeks) {
if (weeks.disable) return
this.calendar = weeks
// 设置多选
this.cale.setMultiple(this.calendar.fullDate)
this.weeks = this.cale.weeks
this.change()
},
backtoday() {
this.cale.setDate(this.date)
this.weeks = this.cale.weeks
this.nowDate = this.calendar = this.cale.getInfo(this.date)
this.change()
},
pre() {
const preDate = this.cale.getDate(this.nowDate.fullDate, -1, 'month').fullDate
this.setDate(preDate)
this.monthSwitch()
},
next() {
const nextDate = this.cale.getDate(this.nowDate.fullDate, +1, 'month').fullDate
this.setDate(nextDate)
this.monthSwitch()
},
setDate(date) {
this.cale.setDate(date)
this.weeks = this.cale.weeks
this.nowDate = this.cale.getInfo(date)
}
}
}
</script>
<style scoped>
.uni-calendar {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
}
.uni-calendar__mask {
position: fixed;
bottom: 0;
top: 0;
left: 0;
right: 0;
background-color: rgba(0, 0, 0, 0.4);
transition-property: opacity;
transition-duration: 0.3s;
opacity: 0;
/* #ifndef APP-NVUE */
z-index: 99;
/* #endif */
}
.uni-calendar--mask-show {
opacity: 1
}
.uni-calendar--fixed {
position: fixed;
bottom: 0;
left: 0;
right: 0;
transition-property: transform;
transition-duration: 0.3s;
transform: translateY(460px);
/* #ifndef APP-NVUE */
z-index: 99;
/* #endif */
}
.uni-calendar--ani-show {
transform: translateY(0);
}
.uni-calendar__content {
background-color: #fff;
}
.uni-calendar__header {
position: relative;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
justify-content: center;
align-items: center;
height: 50px;
border-bottom-color: #e5e5e5;
border-bottom-style: solid;
border-bottom-width: 1px;
}
.uni-calendar--fixed-top {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
justify-content: space-between;
border-top-color: #e5e5e5;
border-top-style: solid;
border-top-width: 1px;
}
.uni-calendar--fixed-width {
width: 50px;
/* padding: 0 15px;
*/
}
.uni-calendar__backtoday {
position: absolute;
right: 0;
top: 25rpx;
padding: 0 5px;
padding-left: 10px;
height: 25px;
line-height: 25px;
font-size: 12px;
border-top-left-radius: 25px;
border-bottom-left-radius: 25px;
color: #333;
background-color: #f1f1f1;
}
.uni-calendar__header-text {
text-align: center;
width: 100px;
font-size: 28rpx;
color: #333;
}
.uni-calendar__header-btn-box {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
align-items: center;
justify-content: center;
width: 50px;
height: 50px;
}
.uni-calendar__header-btn {
width: 10px;
height: 10px;
border-left-color: #808080;
border-left-style: solid;
border-left-width: 2px;
border-top-color: #555555;
border-top-style: solid;
border-top-width: 2px;
}
.uni-calendar--left {
transform: rotate(-45deg);
}
.uni-calendar--right {
transform: rotate(135deg);
}
.uni-calendar__weeks {
position: relative;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
}
.uni-calendar__weeks-item {
flex: 1;
}
.uni-calendar__weeks-day {
flex: 1;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
justify-content: center;
align-items: center;
height: 45px;
border-bottom-color: #F5F5F5;
border-bottom-style: solid;
border-bottom-width: 1px;
}
.uni-calendar__weeks-day-text {
font-size: 14px;
}
.uni-calendar__box {
position: relative;
}
.uni-calendar__box-bg {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
justify-content: center;
align-items: center;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
.uni-calendar__box-bg-text {
font-size: 200px;
font-weight: bold;
color: #999;
opacity: 0.1;
text-align: center;
/* #ifndef APP-NVUE */
line-height: 1;
/* #endif */
}
</style>

View File

@@ -0,0 +1,327 @@
import CALENDAR from './calendar.js'
class Calendar {
constructor({
date,
selected,
startDate,
endDate,
range
} = {}) {
// 当前日期
this.date = this.getDate(date) // 当前初入日期
// 打点信息
this.selected = selected || [];
// 范围开始
this.startDate = startDate
// 范围结束
this.endDate = endDate
this.range = range
// 多选状态
this.multipleStatus = {
before: '',
after: '',
data: []
}
// 每周日期
this.weeks = {}
this._getWeek(this.date.fullDate)
}
/**
* 获取任意时间
*/
getDate(date, AddDayCount = 0, str = 'day') {
if (!date) {
date = new Date()
}
if (typeof date !== 'object') {
date = date.replace(/-/g, '/')
}
const dd = new Date(date)
switch (str) {
case 'day':
dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期
break
case 'month':
if (dd.getDate() === 31) {
dd.setDate(dd.getDate() + AddDayCount)
} else {
dd.setMonth(dd.getMonth() + AddDayCount) // 获取AddDayCount天后的日期
}
break
case 'year':
dd.setFullYear(dd.getFullYear() + AddDayCount) // 获取AddDayCount天后的日期
break
}
const y = dd.getFullYear()
const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期不足10补0
const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号不足10补0
return {
fullDate: y + '-' + m + '-' + d,
year: y,
month: m,
date: d,
day: dd.getDay()
}
}
/**
* 获取上月剩余天数
*/
_getLastMonthDays(firstDay, full) {
let dateArr = []
for (let i = firstDay; i > 0; i--) {
const beforeDate = new Date(full.year, full.month - 1, -i + 1).getDate()
dateArr.push({
date: beforeDate,
month: full.month - 1,
lunar: this.getlunar(full.year, full.month - 1, beforeDate),
disable: true
})
}
return dateArr
}
/**
* 获取本月天数
*/
_currentMonthDys(dateData, full) {
let dateArr = []
let fullDate = this.date.fullDate
for (let i = 1; i <= dateData; i++) {
let isinfo = false
let nowDate = full.year + '-' + (full.month < 10 ?
full.month : full.month) + '-' + (i < 10 ?
'0' + i : i)
// 是否今天
let isDay = fullDate === nowDate
// 获取打点信息
let info = this.selected && this.selected.find((item) => {
if (this.dateEqual(nowDate, item.date)) {
return item
}
})
// 日期禁用
let disableBefore = true
let disableAfter = true
if (this.startDate) {
let dateCompBefore = this.dateCompare(this.startDate, fullDate)
disableBefore = this.dateCompare(dateCompBefore ? this.startDate : fullDate, nowDate)
}
if (this.endDate) {
let dateCompAfter = this.dateCompare(fullDate, this.endDate)
disableAfter = this.dateCompare(nowDate, dateCompAfter ? this.endDate : fullDate)
}
let multiples = this.multipleStatus.data
let checked = false
let multiplesStatus = -1
if (this.range) {
if (multiples) {
multiplesStatus = multiples.findIndex((item) => {
return this.dateEqual(item, nowDate)
})
}
if (multiplesStatus !== -1) {
checked = true
}
}
let data = {
fullDate: nowDate,
year: full.year,
date: i,
multiple: this.range ? checked : false,
month: full.month,
lunar: this.getlunar(full.year, full.month, i),
disable: !disableBefore || !disableAfter,
isDay
}
if (info) {
data.extraInfo = info
}
dateArr.push(data)
}
return dateArr
}
/**
* 获取下月天数
*/
_getNextMonthDays(surplus, full) {
let dateArr = []
for (let i = 1; i < surplus + 1; i++) {
dateArr.push({
date: i,
month: Number(full.month) + 1,
lunar: this.getlunar(full.year, Number(full.month) + 1, i),
disable: true
})
}
return dateArr
}
/**
* 设置日期
* @param {Object} date
*/
setDate(date) {
this._getWeek(date)
}
/**
* 获取当前日期详情
* @param {Object} date
*/
getInfo(date) {
if (!date) {
date = new Date()
}
const dateInfo = this.canlender.find(item => item.fullDate === this.getDate(date).fullDate)
return dateInfo
}
/**
* 比较时间大小
*/
dateCompare(startDate, endDate) {
// 计算截止时间
startDate = new Date(startDate.replace('-', '/').replace('-', '/'))
// 计算详细项的截止时间
endDate = new Date(endDate.replace('-', '/').replace('-', '/'))
if (startDate <= endDate) {
return true
} else {
return false
}
}
/**
* 比较时间是否相等
*/
dateEqual(before, after) {
// 计算截止时间
before = new Date(before.replace('-', '/').replace('-', '/'))
// 计算详细项的截止时间
after = new Date(after.replace('-', '/').replace('-', '/'))
if (before.getTime() - after.getTime() === 0) {
return true
} else {
return false
}
}
/**
* 获取日期范围内所有日期
* @param {Object} begin
* @param {Object} end
*/
geDateAll(begin, end) {
var arr = []
var ab = begin.split('-')
var ae = end.split('-')
var db = new Date()
db.setFullYear(ab[0], ab[1] - 1, ab[2])
var de = new Date()
de.setFullYear(ae[0], ae[1] - 1, ae[2])
var unixDb = db.getTime() - 24 * 60 * 60 * 1000
var unixDe = de.getTime() - 24 * 60 * 60 * 1000
for (var k = unixDb; k <= unixDe;) {
k = k + 24 * 60 * 60 * 1000
arr.push(this.getDate(new Date(parseInt(k))).fullDate)
}
return arr
}
/**
* 计算阴历日期显示
*/
getlunar(year, month, date) {
return CALENDAR.solar2lunar(year, month, date)
}
/**
* 设置打点
*/
setSelectInfo(data, value) {
this.selected = value
this._getWeek(data)
}
/**
* 获取多选状态
*/
setMultiple(fullDate) {
let {
before,
after
} = this.multipleStatus
if (!this.range) return
if (before && after) {
this.multipleStatus.before = ''
this.multipleStatus.after = ''
this.multipleStatus.data = []
this._getWeek(fullDate)
} else {
if (!before) {
this.multipleStatus.before = fullDate
} else {
this.multipleStatus.after = fullDate
if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) {
this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus.after);
} else {
this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus.before);
}
this._getWeek(fullDate)
}
}
}
/**
* 获取每周数据
* @param {Object} dateData
*/
_getWeek(dateData) {
const {
fullDate,
year,
month,
date,
day
} = this.getDate(dateData)
let firstDay = new Date(year, month - 1, 1).getDay()
let currentDay = new Date(year, month, 0).getDate()
let dates = {
lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 上个月末尾几天
currentMonthDys: this._currentMonthDys(currentDay, this.getDate(dateData)), // 本月天数
nextMonthDays: [], // 下个月开始几天
weeks: []
}
let canlender = []
const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length)
dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData))
canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays)
let weeks = {}
// 拼接数组 上个月开始几天 + 本月天数+ 下个月开始几天
for (let i = 0; i < canlender.length; i++) {
if (i % 7 === 0) {
weeks[parseInt(i / 7)] = new Array(7)
}
weeks[parseInt(i / 7)][i % 7] = canlender[i]
}
this.canlender = canlender
this.weeks = weeks
}
//静态方法
// static init(date) {
// if (!this.instance) {
// this.instance = new Calendar(date);
// }
// return this.instance;
// }
}
export default Calendar

View File

@@ -0,0 +1 @@
8ab67b6f-e554-4fd4-94ae-9f30e42a46d6

View File

@@ -0,0 +1,298 @@
<template>
<view :class="{ 'uni-card--full': isFull === true || isFull === 'true', 'uni-card--shadow': isShadow === true || isShadow === 'true' }" class="uni-card" @click="onClick">
<view v-if="mode === 'style'" class="uni-card__thumbnailimage">
<view class="uni-card__thumbnailimage-box">
<image class="uni-card__thumbnailimage-image" :src="thumbnail" mode="aspectFill" />
</view>
<view v-if="title" class="uni-card__thumbnailimage-title"><text class="uni-card__thumbnailimage-title-text">{{ title }}</text></view>
</view>
<view v-if="mode === 'title'" class="uni-card__title">
<view class="uni-card__title-header">
<image class="uni-card__title-header-image" :src="thumbnail" mode="scaleToFill" />
</view>
<view class="uni-card__title-content">
<text class="uni-card__title-content-title">{{ title }}</text>
<text class="uni-card__title-content-extra">{{ extra }}</text>
</view>
</view>
<!-- 标题 -->
<view v-if="mode === 'basic' && title" class="uni-card__header">
<view v-if="thumbnail" class="uni-card__header-extra-img-view">
<image :src="thumbnail" class="uni-card__header-extra-img" />
</view>
<text class="uni-card__header-title-text">{{ title }}</text>
<text v-if="extra" class="uni-card__header-extra-text">{{ extra }}</text>
</view>
<!-- 内容 -->
<view class="uni-card__content uni-card__content--pd">
<view v-if="mode === 'style' && extra" class=""><text class="uni-card__content-extra">{{ extra }}</text></view>
<slot />
</view>
<!-- 底部 -->
<view v-if="note" class="uni-card__footer">
<slot name="footer">
<text class="uni-card__footer-text">{{ note }}</text>
</slot>
</view>
</view>
</template>
<script>
/**
* Card 卡片
* @description 卡片视图组件
* @tutorial https://ext.dcloud.net.cn/plugin?id=22
* @property {String} title 标题文字
* @property {String} extra 标题额外信息
* @property {String} note 标题左侧缩略图
* @property {String} thumbnail 底部信息
* @property {String} mode = [basic|style|title] 卡片模式
* @value basic 基础卡片
* @value style 图文卡片
* @value title 标题卡片
* @property {Boolean} isFull = [true | false] 卡片内容是否通栏true 时将去除padding值
* @property {Boolean} isShadow = [true | false] 卡片内容是否开启阴影
* @event {Function} click 点击 Card 触发事件
* @example <uni-card title="标题文字" thumbnail="https://img-cdn-qiniu.dcloud.net.cn/new-page/uni.png" extra="额外信息" note="Tips">内容主体,可自定义内容及样式</uni-card>
*/
export default {
name: 'UniCard',
props: {
title: {
type: String,
default: ''
}, // 标题
extra: {
type: String,
default: ''
}, // 扩展信息
note: {
type: String,
default: ''
}, // Tips
thumbnail: {
type: String,
default: ''
}, // 缩略图
// 卡片模式 可选值 basic基础卡片 style :图文卡片 title :标题卡片
mode: {
type: String,
default: 'basic'
},
isFull: {
// 内容区域是否通栏
type: Boolean,
default: false
},
isShadow: {
// 是否开启阴影
type: Boolean,
default: false
}
},
methods: {
onClick() {
this.$emit('click')
}
}
}
</script>
<style scoped>
.uni-card {
/* #ifndef APP-NVUE */
display: flex;
flex: 1;
box-shadow: 0 0 0 rgba(0, 0, 0, 0);
/* #endif */
margin: 12px;
background-color: #ffffff;
position: relative;
flex-direction: column;
border-color: #e5e5e5;
border-style: solid;
border-width: 1px;
border-radius: 3px;
overflow: hidden;
}
.uni-card__thumbnailimage {
position: relative;
flex-direction: column;
justify-content: center;
height: 150px;
overflow: hidden;
}
.uni-card__thumbnailimage-box {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex: 1;
flex-direction: row;
overflow: hidden;
}
.uni-card__thumbnailimage-image {
flex: 1;
}
.uni-card__thumbnailimage-title {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
position: absolute;
bottom: 0;
left: 0;
right: 0;
flex-direction: row;
padding: 16rpx 24rpx;
background-color: rgba(0, 0, 0, 0.4);
}
.uni-card__thumbnailimage-title-text {
flex: 1;
font-size: 28rpx;
color: #fff;
}
.uni-card__title {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
padding: 10px;
border-bottom-color: #F5F5F5;
border-bottom-style: solid;
border-bottom-width: 1px;
}
.uni-card__title-header {
width: 40px;
height: 40px;
overflow: hidden;
border-radius: 5px;
}
.uni-card__title-header-image {
width: 40px;
height: 40px;
}
.uni-card__title-content {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
justify-content: center;
padding-left: 10px;
height: 40px;
overflow: hidden;
}
.uni-card__title-content-title {
font-size: 28rpx;
line-height: 22px;
lines: 1;
}
.uni-card__title-content-extra {
font-size: 26rpx;
line-height: 35rpx;
color: #999;
}
.uni-card__header {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
position: relative;
flex-direction: row;
padding: 24rpx;
align-items: center;
border-bottom-color: #e5e5e5;
border-bottom-style: solid;
border-bottom-width: 1px;
}
.uni-card__header-title {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
margin-right: 16rpx;
justify-content: flex-start;
align-items: center;
}
.uni-card__header-title-text {
font-size: 32rpx;
flex: 1;
/* #ifndef APP-NVUE */
white-space: nowrap;
/* #endif */
/* #ifdef APP-NVUE */
lines: 1;
/* #endif */
overflow: hidden;
text-overflow: ellipsis;
}
.uni-card__header-extra-img {
height: 40rpx;
width: 40rpx;
margin-right: 16rpx;
}
.uni-card__header-extra-text {
flex: 1;
margin-left: 16rpx;
font-size: 28rpx;
text-align: right;
color: #999;
}
.uni-card__content {
color: #333;
}
.uni-card__content--pd {
padding: 24rpx;
}
.uni-card__content-extra {
font-size: 28rpx;
padding-bottom: 10px;
color: #999;
}
.uni-card__footer {
justify-content: space-between;
padding: 10px;
border-top-color: #e5e5e5;
border-top-style: solid;
border-top-width: 1px;
}
.uni-card__footer-text {
color: #999;
font-size: 28rpx;
}
.uni-card--shadow {
border-color: #e5e5e5;
border-style: solid;
border-width: 1px;
/* #ifndef APP-NVUE */
box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2);
/* #endif */
}
.uni-card--full {
margin: 0;
border-radius: 0;
}
</style>

View File

@@ -0,0 +1 @@
751c65c7-05f0-48e7-a8e1-3fa5c538e6cb

View File

@@ -0,0 +1,217 @@
<template>
<view :class="{ 'uni-collapse-cell--disabled': disabled,'uni-collapse-cell--notdisabled': !disabled, 'uni-collapse-cell--open': isOpen,'uni-collapse-cell--hide':!isOpen }" class="uni-collapse-cell">
<view class="uni-collapse-cell__title" @click="onClick">
<image v-if="thumb" :src="thumb" class="uni-collapse-cell__title-img" />
<text class="uni-collapse-cell__title-text">{{ title }}</text>
<!-- #ifdef MP-ALIPAY -->
<view :class="{ 'uni-collapse-cell__title-arrow-active': isOpen, 'uni-collapse-cell--animation': showAnimation === true }" class="uni-collapse-cell__title-arrow">
<uni-icons color="#bbb" size="20" type="arrowdown" />
</view>
<!-- #endif -->
<!-- #ifndef MP-ALIPAY -->
<uni-icons :class="{ 'uni-collapse-cell__title-arrow-active': isOpen, 'uni-collapse-cell--animation': showAnimation === true }" class="uni-collapse-cell__title-arrow" color="#bbb" size="20" type="arrowdown" />
<!-- #endif -->
</view>
<view :class="{'uni-collapse-cell__content--hide':!isOpen}" class="uni-collapse-cell__content">
<view :class="{ 'uni-collapse-cell--animation': showAnimation === true }" class="uni-collapse-cell__wrapper" :style="{'transform':isOpen?'translateY(0)':'translateY(-50%)','-webkit-transform':isOpen?'translateY(0)':'translateY(-50%)'}">
<slot />
</view>
</view>
</view>
</template>
<script>
import uniIcons from '../uni-icons/uni-icons.vue'
/**
* CollapseItem 折叠面板子组件
* @description 折叠面板子组件
* @property {String} title 标题文字
* @property {String} thumb 标题左侧缩略图
* @property {Boolean} disabled = [true|false] 是否展开面板
* @property {Boolean} showAnimation = [true|false] 开启动画
*/
export default {
name: 'UniCollapseItem',
components: {
uniIcons
},
props: {
title: {
// 列表标题
type: String,
default: ''
},
name: {
// 唯一标识符
type: [Number, String],
default: 0
},
disabled: {
// 是否禁用
type: Boolean,
default: false
},
showAnimation: {
// 是否显示动画
type: Boolean,
default: false
},
open: {
// 是否展开
type: Boolean,
default: false
},
thumb: {
// 缩略图
type: String,
default: ''
}
},
data() {
return {
isOpen: false
}
},
watch: {
open(val) {
this.isOpen = val
}
},
inject: ['collapse'],
created() {
this.isOpen = this.open
this.nameSync = this.name ? this.name : this.collapse.childrens.length
this.collapse.childrens.push(this)
if (String(this.collapse.accordion) === 'true') {
if (this.isOpen) {
let lastEl = this.collapse.childrens[this.collapse.childrens.length - 2]
if (lastEl) {
this.collapse.childrens[this.collapse.childrens.length - 2].isOpen = false
}
}
}
},
methods: {
onClick() {
if (this.disabled) {
return
}
if (String(this.collapse.accordion) === 'true') {
this.collapse.childrens.forEach(vm => {
if (vm === this) {
return
}
vm.isOpen = false
})
}
this.isOpen = !this.isOpen
this.collapse.onChange && this.collapse.onChange()
this.$forceUpdate()
}
}
}
</script>
<style scoped>
.uni-collapse-cell {
flex-direction: column;
border-color: #e5e5e5;
border-bottom-width: 1px;
border-bottom-style: solid;
}
.uni-collapse-cell--hover {
background-color: #f1f1f1;
}
.uni-collapse-cell--open {
background-color: #f1f1f1;
}
.uni-collapse-cell--disabled {
background-color: #f1f1f1;
/* opacity: 0.3;
*/
}
.uni-collapse-cell--hide {
height: 48px;
}
.uni-collapse-cell--animation {
/* transition: transform 0.3s ease;
*/
transition-property: transform;
transition-duration: 0.3s;
transition-timing-function: ease;
}
.uni-collapse-cell__title {
padding: 12px 12px;
position: relative;
/* #ifndef APP-NVUE */
display: flex;
width: 100%;
box-sizing: border-box;
/* #endif */
height: 48px;
line-height: 24px;
flex-direction: row;
justify-content: space-between;
align-items: center;
}
.uni-collapse-cell__title:active {
background-color: #f1f1f1;
}
.uni-collapse-cell__title-img {
height: 52rpx;
width: 52rpx;
margin-right: 10px;
}
.uni-collapse-cell__title-arrow {
width: 20px;
height: 20px;
transform: rotate(0deg);
transform-origin: center center;
}
.uni-collapse-cell__title-arrow-active {
transform: rotate(180deg);
}
.uni-collapse-cell__title-text {
flex: 1;
font-size: 28rpx;
/* #ifndef APP-NVUE */
white-space: nowrap;
color: inherit;
/* #endif */
/* #ifdef APP-NVUE */
lines: 1;
/* #endif */
overflow: hidden;
text-overflow: ellipsis;
}
.uni-collapse-cell__content {
overflow: hidden;
}
.uni-collapse-cell__wrapper {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
}
.uni-collapse-cell__content--hide {
height: 0px;
line-height: 0px;
}
</style>

View File

@@ -0,0 +1 @@
4d0ddc6f-7ee4-450b-ac9a-869184af4fb5

View File

@@ -0,0 +1,59 @@
<template>
<view class="uni-collapse">
<slot />
</view>
</template>
<script>
/**
* Collapse 折叠面板
* @description 展示可以折叠 / 展开的内容区域
* @tutorial https://ext.dcloud.net.cn/plugin?id=23
* @property {Boolean} accordion = [true|false] 是否开启手风琴效果是否开启手风琴效果
* @event {Function} change 切换面板时触发activeNamesArray展开状态的uniCollapseItem的 name 值
*/
export default {
name: 'UniCollapse',
props: {
accordion: {
// 是否开启手风琴效果
type: [Boolean, String],
default: false
}
},
data() {
return {}
},
provide() {
return {
collapse: this
}
},
created() {
this.childrens = []
},
methods: {
onChange() {
let activeItem = []
this.childrens.forEach((vm, index) => {
if (vm.isOpen) {
activeItem.push(vm.nameSync)
}
})
this.$emit('change', activeItem)
}
}
}
</script>
<style scoped>
.uni-collapse {
/* #ifndef APP-NVUE */
width: 100%;
display: flex;
/* #endif */
/* #ifdef APP-NVUE */
flex: 1;
/* #endif */
flex-direction: column;
background-color: #ffffff;
}
</style>

View File

@@ -0,0 +1 @@
a1019794-8087-409a-b296-777550c44b55

View File

@@ -0,0 +1,202 @@
<template>
<view class="uni-combox">
<view v-if="label" class="uni-combox__label" :style="labelStyle">
<text>{{label}}</text>
</view>
<view class="uni-combox__input-box">
<input class="uni-combox__input" type="text" :placeholder="placeholder" v-model="inputVal" @input="onInput" @focus="onFocus" @blur="onBlur" />
<uni-icons class="uni-combox__input-arrow" type="arrowdown" size="14" @click="toggleSelector"></uni-icons>
<view class="uni-combox__selector" v-if="showSelector">
<scroll-view scroll-y="true" class="uni-combox__selector-scroll">
<view class="uni-combox__selector-empty" v-if="filterCandidatesLength === 0">
<text>{{emptyTips}}</text>
</view>
<view class="uni-combox__selector-item" v-for="(item,index) in filterCandidates" :key="index" @click="onSelectorClick(index)">
<text>{{item}}</text>
</view>
</scroll-view>
</view>
</view>
</view>
</template>
<script>
import uniIcons from '../uni-icons/uni-icons.vue'
export default {
name: 'uniCombox',
components: {
uniIcons
},
props: {
label: {
type: String,
default: ''
},
labelWidth: {
type: String,
default: 'auto'
},
placeholder: {
type: String,
default: ''
},
candidates: {
type: Array,
default () {
return []
}
},
emptyTips: {
type: String,
default: '无匹配项'
},
value: {
type: String,
default: ''
}
},
data() {
return {
showSelector: false,
inputVal: ''
}
},
computed: {
labelStyle() {
if (this.labelWidth === 'auto') {
return {}
}
return {
width: this.labelWidth
}
},
filterCandidates() {
return this.candidates.filter((item) => {
return item.indexOf(this.inputVal) > -1
})
},
filterCandidatesLength() {
return this.filterCandidates.length
}
},
watch: {
value: {
handler(newVal) {
this.inputVal = newVal
},
immediate: true
}
},
methods: {
toggleSelector() {
this.showSelector = !this.showSelector
},
onFocus() {
this.showSelector = true
},
onBlur() {
setTimeout(() => {
this.showSelector = false
}, 50)
},
onSelectorClick(index) {
this.inputVal = this.filterCandidates[index]
this.showSelector = false
this.$emit('input', this.inputVal)
},
onInput() {
setTimeout(() => {
this.$emit('input', this.inputVal)
})
}
}
}
</script>
<style scoped>
.uni-combox {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
height: 40px;
flex-direction: row;
align-items: center;
/* border-bottom: solid 1px #DDDDDD;
*/
}
.uni-combox__label {
font-size: 16px;
line-height: 22px;
padding-right: 10px;
color: #999999;
}
.uni-combox__input-box {
position: relative;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex: 1;
flex-direction: row;
align-items: center;
}
.uni-combox__input {
flex: 1;
font-size: 16px;
height: 22px;
line-height: 22px;
}
.uni-combox__input-arrow {
padding: 10px;
}
.uni-combox__selector {
box-sizing: border-box;
position: absolute;
top: 42px;
left: 0;
width: 100%;
background-color: #FFFFFF;
border-radius: 6px;
box-shadow: #DDDDDD 4px 4px 8px, #DDDDDD -4px -4px 8px;
z-index: 2;
}
.uni-combox__selector-scroll {
max-height: 200px;
box-sizing: border-box;
}
.uni-combox__selector::before {
content: '';
position: absolute;
width: 0;
height: 0;
border-bottom: solid 6px #FFFFFF;
border-right: solid 6px transparent;
border-left: solid 6px transparent;
left: 50%;
top: -6px;
margin-left: -6px;
}
.uni-combox__selector-empty,
.uni-combox__selector-item {
/* #ifdef APP-NVUE */
display: flex;
/* #endif */
line-height: 36px;
font-size: 14px;
text-align: center;
border-bottom: solid 1px #DDDDDD;
margin: 0px 10px;
}
.uni-combox__selector-empty:last-child,
.uni-combox__selector-item:last-child {
border-bottom: none;
}
</style>

View File

@@ -0,0 +1 @@
58ce3079-2b96-40c5-be41-14692893d411

View File

@@ -0,0 +1,200 @@
<template>
<view class="uni-countdown">
<text v-if="showDay" :style="{ borderColor: borderColor, color: color, backgroundColor: backgroundColor }" class="uni-countdown__number">{{ d }}</text>
<text v-if="showDay" :style="{ color: splitorColor }" class="uni-countdown__splitor"></text>
<text :style="{ borderColor: borderColor, color: color, backgroundColor: backgroundColor }" class="uni-countdown__number">{{ h }}</text>
<text :style="{ color: splitorColor }" class="uni-countdown__splitor">{{ showColon ? ':' : '时' }}</text>
<text :style="{ borderColor: borderColor, color: color, backgroundColor: backgroundColor }" class="uni-countdown__number">{{ i }}</text>
<text :style="{ color: splitorColor }" class="uni-countdown__splitor">{{ showColon ? ':' : '分' }}</text>
<text :style="{ borderColor: borderColor, color: color, backgroundColor: backgroundColor }" class="uni-countdown__number">{{ s }}</text>
<text v-if="!showColon" :style="{ color: splitorColor }" class="uni-countdown__splitor"></text>
</view>
</template>
<script>
/**
* Countdown 倒计时
* @description 倒计时组件
* @tutorial https://ext.dcloud.net.cn/plugin?id=25
* @property {String} backgroundColor 背景色
* @property {String} color 文字颜色
* @property {Number} day 天数
* @property {Number} hour 小时
* @property {Number} minute 分钟
* @property {Number} second 秒
* @property {Boolean} showDay = [true|false] 是否显示天数
* @property {Boolean} showColon = [true|false] 是否以冒号为分隔符
* @property {String} splitorColor 分割符号颜色
* @event {Function} timeup 倒计时时间到触发事件
* @example <uni-countdown :day="1" :hour="1" :minute="12" :second="40"></uni-countdown>
*/
export default {
name: 'UniCountdown',
props: {
showDay: {
type: Boolean,
default: true
},
showColon: {
type: Boolean,
default: true
},
backgroundColor: {
type: String,
default: '#FFFFFF'
},
borderColor: {
type: String,
default: '#000000'
},
color: {
type: String,
default: '#000000'
},
splitorColor: {
type: String,
default: '#000000'
},
day: {
type: Number,
default: 0
},
hour: {
type: Number,
default: 0
},
minute: {
type: Number,
default: 0
},
second: {
type: Number,
default: 0
}
},
data() {
return {
timer: null,
syncFlag: false,
d: '00',
h: '00',
i: '00',
s: '00',
leftTime: 0,
seconds: 0
}
},
watch: {
day(val) {
this.changeFlag()
},
hour(val) {
this.changeFlag()
},
minute(val) {
this.changeFlag()
},
second(val) {
this.changeFlag()
}
},
created: function(e) {
this.startData();
},
beforeDestroy() {
clearInterval(this.timer)
},
methods: {
toSeconds(day, hours, minutes, seconds) {
return day * 60 * 60 * 24 + hours * 60 * 60 + minutes * 60 + seconds
},
timeUp() {
clearInterval(this.timer)
this.$emit('timeup')
},
countDown() {
let seconds = this.seconds
let [day, hour, minute, second] = [0, 0, 0, 0]
if (seconds > 0) {
day = Math.floor(seconds / (60 * 60 * 24))
hour = Math.floor(seconds / (60 * 60)) - (day * 24)
minute = Math.floor(seconds / 60) - (day * 24 * 60) - (hour * 60)
second = Math.floor(seconds) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60)
} else {
this.timeUp()
}
if (day < 10) {
day = '0' + day
}
if (hour < 10) {
hour = '0' + hour
}
if (minute < 10) {
minute = '0' + minute
}
if (second < 10) {
second = '0' + second
}
this.d = day
this.h = hour
this.i = minute
this.s = second
},
startData() {
this.seconds = this.toSeconds(this.day, this.hour, this.minute, this.second)
if (this.seconds <= 0) {
return
}
this.countDown()
this.timer = setInterval(() => {
this.seconds--
if (this.seconds < 0) {
this.timeUp()
return
}
this.countDown()
}, 1000)
},
changeFlag() {
if (!this.syncFlag) {
this.seconds = this.toSeconds(this.day, this.hour, this.minute, this.second)
this.startData();
this.syncFlag = true;
}
}
}
}
</script>
<style scoped>
.uni-countdown {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
justify-content: flex-start;
padding: 2rpx 0;
}
.uni-countdown__splitor {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
justify-content: center;
line-height: 48rpx;
padding: 5rpx;
font-size: 24rpx;
}
.uni-countdown__number {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
justify-content: center;
align-items: center;
width: 52rpx;
height: 48rpx;
line-height: 48rpx;
margin: 5rpx;
text-align: center;
font-size: 24rpx;
}
</style>

View File

@@ -0,0 +1 @@
0a02d961-c136-4c3b-bfd5-6594c518b05f

View File

@@ -0,0 +1,155 @@
<template>
<view v-if="visibleSync" :class="{ 'uni-drawer--visible': showDrawer }" class="uni-drawer">
<view class="uni-drawer__mask" :class="{ 'uni-drawer__mask--visible': showDrawer && mask }" @tap="close" />
<view class="uni-drawer__content" :class="{'uni-drawer--right': rightMode,'uni-drawer--left': !rightMode, 'uni-drawer__content--visible': showDrawer}">
<slot />
</view>
</view>
</template>
<script>
/**
* Drawer 抽屉
* @description 抽屉侧滑菜单
* @tutorial https://ext.dcloud.net.cn/plugin?id=26
* @property {Boolean} visible = [true|false] Drawer的显示状态
* @property {Boolean} mask = [true | false] 是否显示遮罩
* @property {Boolean} mode = [left | right] Drawer 滑出位置
* @value left 从左侧滑出
* @value right 从右侧侧滑出
* @event {Function} close 组件关闭时触发事件
*/
export default {
name: 'UniDrawer',
props: {
/**
* 显示状态
*/
visible: {
type: Boolean,
default: false
},
/**
* 显示模式(左、右),只在初始化生效
*/
mode: {
type: String,
default: ''
},
/**
* 蒙层显示状态
*/
mask: {
type: Boolean,
default: true
}
},
data() {
return {
visibleSync: false,
showDrawer: false,
rightMode: false,
watchTimer: null
}
},
watch: {
visible(val) {
if (val) {
this.open()
} else {
this.close()
}
}
},
created() {
this.visibleSync = this.visible
setTimeout(() => {
this.showDrawer = this.visible
}, 100)
this.rightMode = this.mode === 'right'
},
methods: {
close() {
this._change('showDrawer', 'visibleSync', false)
},
open() {
this._change('visibleSync', 'showDrawer', true)
},
_change(param1, param2, status) {
this[param1] = status
if (this.watchTimer) {
clearTimeout(this.watchTimer)
}
this.watchTimer = setTimeout(() => {
this[param2] = status
this.$emit(status ? 'open' : 'close')
}, status ? 50 : 300)
}
}
}
</script>
<style scoped>
/* 抽屉宽度
*/
.uni-drawer {
/* #ifndef APP-NVUE */
display: block;
/* #endif */
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
overflow: hidden;
z-index: 999;
}
.uni-drawer__content {
/* #ifndef APP-NVUE */
display: block;
/* #endif */
position: absolute;
top: 0;
width: 220px;
bottom: 0;
background-color: #ffffff;
transition: transform 0.3s ease;
}
.uni-drawer--left {
left: 0;
transform: translateX(-220px);
}
.uni-drawer--right {
right: 0;
transform: translateX(220px);
}
.uni-drawer__content--visible {
transform: translateX(0px);
}
.uni-drawer__mask {
/* #ifndef APP-NVUE */
display: block;
/* #endif */
opacity: 0;
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
background-color: rgba(0, 0, 0, 0.4);
transition: opacity 0.3s;
}
.uni-drawer__mask--visible {
/* #ifndef APP-NVUE */
display: block;
/* #endif */
opacity: 1;
}
</style>

View File

@@ -0,0 +1 @@
e1aad173-14a7-46fe-a9ed-a1de9e005b39

View File

@@ -0,0 +1,428 @@
<template>
<view>
<view v-if="popMenu && (leftBottom||rightBottom||leftTop||rightTop)" :class="{
'uni-fab--leftBottom': leftBottom,
'uni-fab--rightBottom': rightBottom,
'uni-fab--leftTop': leftTop,
'uni-fab--rightTop': rightTop
}" class="uni-fab">
<view :class="{
'uni-fab__content--left': horizontal === 'left',
'uni-fab__content--right': horizontal === 'right',
'uni-fab__content--flexDirection': direction === 'vertical',
'uni-fab__content--flexDirectionStart': flexDirectionStart,
'uni-fab__content--flexDirectionEnd': flexDirectionEnd,
'uni-fab__content--other-platform': !isAndroidNvue
}" :style="{ width: boxWidth, height: boxHeight, backgroundColor: styles.backgroundColor }" class="uni-fab__content" elevation="5">
<view v-if="flexDirectionStart || horizontalLeft" class="uni-fab__item uni-fab__item--first" />
<view v-for="(item, index) in content" :key="index" :class="{ 'uni-fab__item--active': isShow }" class="uni-fab__item" @click="_onItemClick(index, item)">
<image :src="item.active ? item.selectedIconPath : item.iconPath" class="uni-fab__item-image" mode="widthFix" />
<text class="uni-fab__item-text" :style="{ color: item.active ? styles.selectedColor : styles.color }">{{ item.text }}</text>
</view>
<view v-if="flexDirectionEnd || horizontalRight" class="uni-fab__item uni-fab__item--first" />
</view>
</view>
<view :class="{
'uni-fab__circle--leftBottom': leftBottom,
'uni-fab__circle--rightBottom': rightBottom,
'uni-fab__circle--leftTop': leftTop,
'uni-fab__circle--rightTop': rightTop,
'uni-fab__content--other-platform': !isAndroidNvue
}" class="uni-fab__circle uni-fab__plus" :style="{ 'background-color': styles.buttonColor }" @click="_onClick">
<view class="fab-circle-v" :class="{'uni-fab__plus--active': isShow}"></view>
<view class="fab-circle-h" :class="{'uni-fab__plus--active': isShow}"></view>
</view>
</view>
</template>
<script>
let platform = 'other'
// #ifdef APP-NVUE
platform = uni.getSystemInfoSync().platform
// #endif
/**
* Fab 悬浮按钮
* @description 点击可展开一个图形按钮菜单
* @tutorial https://ext.dcloud.net.cn/plugin?id=144
* @property {Object} pattern 可选样式配置项
* @property {Object} horizontal = [left | right] 水平对齐方式
* @value left 左对齐
* @value right 右对齐
* @property {Object} vertical = [bottom | top] 垂直对齐方式
* @value bottom 下对齐
* @value top 上对齐
* @property {Object} direction = [horizontal | vertical] 展开菜单显示方式
* @value horizontal 水平显示
* @value vertical 垂直显示
* @property {Array} content 展开菜单内容配置项
* @property {Boolean} popMenu 是否使用弹出菜单
* @event {Function} trigger 展开菜单点击事件,返回点击信息
* @event {Function} fabClick 悬浮按钮点击事件
*/
export default {
name: 'UniFab',
props: {
pattern: {
type: Object,
default () {
return {}
}
},
horizontal: {
type: String,
default: 'left'
},
vertical: {
type: String,
default: 'bottom'
},
direction: {
type: String,
default: 'horizontal'
},
content: {
type: Array,
default () {
return []
}
},
show: {
type: Boolean,
default: false
},
popMenu: {
type: Boolean,
default: true
}
},
data() {
return {
fabShow: false,
isShow: false,
isAndroidNvue: platform === 'android',
styles: {
color: '#3c3e49',
selectedColor: '#007AFF',
backgroundColor: '#fff',
buttonColor: '#3c3e49'
}
}
},
computed: {
contentWidth(e) {
return (this.content.length + 1) * 55 + 10 + 'px'
},
contentWidthMin() {
return 55 + 'px'
},
// 动态计算宽度
boxWidth() {
return this.getPosition(3, 'horizontal')
},
// 动态计算高度
boxHeight() {
return this.getPosition(3, 'vertical')
},
// 计算左下位置
leftBottom() {
return this.getPosition(0, 'left', 'bottom')
},
// 计算右下位置
rightBottom() {
return this.getPosition(0, 'right', 'bottom')
},
// 计算左上位置
leftTop() {
return this.getPosition(0, 'left', 'top')
},
rightTop() {
return this.getPosition(0, 'right', 'top')
},
flexDirectionStart() {
return this.getPosition(1, 'vertical', 'top')
},
flexDirectionEnd() {
return this.getPosition(1, 'vertical', 'bottom')
},
horizontalLeft() {
return this.getPosition(2, 'horizontal', 'left')
},
horizontalRight() {
return this.getPosition(2, 'horizontal', 'right')
}
},
watch: {
pattern(newValue, oldValue) {
//console.log(JSON.stringify(newValue))
this.styles = Object.assign({}, this.styles, newValue)
}
},
created() {
this.isShow = this.show
if (this.top === 0) {
this.fabShow = true
}
// 初始化样式
this.styles = Object.assign({}, this.styles, this.pattern)
},
methods: {
_onClick() {
this.$emit('fabClick')
if (!this.popMenu) {
return
}
this.isShow = !this.isShow
},
open() {
this.isShow = true
},
close() {
this.isShow = false
},
/**
* 按钮点击事件
*/
_onItemClick(index, item) {
this.$emit('trigger', {
index,
item
})
},
/**
* 获取 位置信息
*/
getPosition(types, paramA, paramB) {
if (types === 0) {
return this.horizontal === paramA && this.vertical === paramB
} else if (types === 1) {
return this.direction === paramA && this.vertical === paramB
} else if (types === 2) {
return this.direction === paramA && this.horizontal === paramB
} else {
return this.isShow && this.direction === paramA ? this.contentWidth : this.contentWidthMin
}
}
}
}
</script>
<style scoped>
.uni-fab {
position: fixed;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
justify-content: center;
align-items: center;
z-index: 10;
}
.uni-fab--active {
opacity: 1;
}
.uni-fab--leftBottom {
left: 5px;
bottom: 20px;
/* #ifdef H5 */
bottom: calc(20px + var(--window-bottom));
/* #endif */
padding: 10px;
}
.uni-fab--leftTop {
left: 5px;
top: 30px;
/* #ifdef H5 */
top: calc(30px + var(--window-top));
/* #endif */
padding: 10px;
}
.uni-fab--rightBottom {
right: 5px;
bottom: 20px;
/* #ifdef H5 */
bottom: calc(20px + var(--window-bottom));
/* #endif */
padding: 10px;
}
.uni-fab--rightTop {
right: 5px;
top: 30px;
/* #ifdef H5 */
top: calc(30px + var(--window-top));
/* #endif */
padding: 10px;
}
.uni-fab__circle {
position: fixed;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
justify-content: center;
align-items: center;
width: 55px;
height: 55px;
background-color: #3c3e49;
border-radius: 55px;
z-index: 11;
}
.uni-fab__circle--leftBottom {
left: 15px;
bottom: 30px;
/* #ifdef H5 */
bottom: calc(30px + var(--window-bottom));
/* #endif */
}
.uni-fab__circle--leftTop {
left: 15px;
top: 40px;
/* #ifdef H5 */
top: calc(40px + var(--window-top));
/* #endif */
}
.uni-fab__circle--rightBottom {
right: 15px;
bottom: 30px;
/* #ifdef H5 */
bottom: calc(30px + var(--window-bottom));
/* #endif */
}
.uni-fab__circle--rightTop {
right: 15px;
top: 40px;
/* #ifdef H5 */
top: calc(40px + var(--window-top));
/* #endif */
}
.uni-fab__circle--left {
left: 0;
}
.uni-fab__circle--right {
right: 0;
}
.uni-fab__circle--top {
top: 0;
}
.uni-fab__circle--bottom {
bottom: 0;
}
.uni-fab__plus {
font-weight: bold;
}
.fab-circle-v {
position: absolute;
width: 3px;
height: 31px;
left: 26px;
top: 12px;
background-color: white;
transform: rotate(0deg);
transition: transform 0.3s;
}
.fab-circle-h {
position: absolute;
width: 31px;
height: 3px;
left: 12px;
top: 26px;
background-color: white;
transform: rotate(0deg);
transition: transform 0.3s;
}
.uni-fab__plus--active {
transform: rotate(135deg);
}
.uni-fab__content {
/* #ifndef APP-NVUE */
box-sizing: border-box;
display: flex;
/* #endif */
flex-direction: row;
border-radius: 55px;
overflow: hidden;
transition-property: width, height;
transition-duration: 0.2s;
width: 55px;
border-color: #DDDDDD;
border-width: 1rpx;
border-style: solid;
}
.uni-fab__content--other-platform {
border-width: 0px;
box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.2);
}
.uni-fab__content--left {
justify-content: flex-start;
}
.uni-fab__content--right {
justify-content: flex-end;
}
.uni-fab__content--flexDirection {
flex-direction: column;
justify-content: flex-end;
}
.uni-fab__content--flexDirectionStart {
flex-direction: column;
justify-content: flex-start;
}
.uni-fab__content--flexDirectionEnd {
flex-direction: column;
justify-content: flex-end;
}
.uni-fab__item {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
justify-content: center;
align-items: center;
width: 55px;
height: 55px;
opacity: 0;
transition: opacity 0.2s;
}
.uni-fab__item--active {
opacity: 1;
}
.uni-fab__item-image {
width: 25px;
height: 25px;
margin-bottom: 3px;
}
.uni-fab__item-text {
color: #FFFFFF;
font-size: 12px;
}
.uni-fab__item--first {
width: 55px;
}
</style>

View File

@@ -0,0 +1 @@
23545e98-dc6e-4dc1-986f-b7b7584a46c7

View File

@@ -0,0 +1,136 @@
<template>
<view :class="[circle === true || circle === 'true' ? 'uni-fav--circle' : '']" :style="[{ backgroundColor: checked ? bgColorChecked : bgColor }]" @click="onClick" class="uni-fav">
<!-- #ifdef MP-ALIPAY -->
<view class="uni-fav-star" v-if="!checked && (star === true || star === 'true')">
<uni-icons :color="fgColor" :style="{color: checked ? fgColorChecked : fgColor}" size="14" type="star-filled" />
</view>
<!-- #endif -->
<!-- #ifndef MP-ALIPAY -->
<uni-icons :color="fgColor" :style="{color: checked ? fgColorChecked : fgColor}" class="uni-fav-star" size="14" type="star-filled" v-if="!checked && (star === true || star === 'true')" />
<!-- #endif -->
<text :style="{color: checked ? fgColorChecked : fgColor}" class="uni-fav-text">{{ checked ? contentText.contentFav : contentText.contentDefault }}</text>
</view>
</template>
<script>
import uniIcons from "../uni-icons/uni-icons.vue";
/**
* Fav 收藏按钮
* @description 用于收藏功能,可点击切换选中、不选中的状态
* @tutorial https://ext.dcloud.net.cn/plugin?id=864
* @property {Boolean} star = [true|false] 按钮是否带星星
* @property {String} bgColor 未收藏时的背景色
* @property {String} bgColorChecked 已收藏时的背景色
* @property {String} fgColor 未收藏时的文字颜色
* @property {String} fgColorChecked 已收藏时的文字颜色
* @property {Boolean} circle = [true|false] 是否为圆角
* @property {Boolean} checked = [true|false] 是否为已收藏
* @property {Object} contentText = [true|false] 收藏按钮文字
* @event {Function} click 点击 fav按钮触发事件
* @example <uni-fav :checked="true"/>
*/
export default {
name: "UniFav",
components: {
uniIcons
},
props: {
star: {
type: [Boolean, String],
default: true
},
bgColor: {
type: String,
default: "#eeeeee"
},
fgColor: {
type: String,
default: "#666666"
},
bgColorChecked: {
type: String,
default: "#007aff"
},
fgColorChecked: {
type: String,
default: "#FFFFFF"
},
circle: {
type: [Boolean, String],
default: false
},
checked: {
type: Boolean,
default: false
},
contentText: {
type: Object,
default () {
return {
contentDefault: "收藏",
contentFav: "已收藏"
};
}
}
},
watch: {
checked() {
if (uni.report) {
if (this.checked) {
uni.report("收藏", "收藏");
} else {
uni.report("取消收藏", "取消收藏");
}
}
}
},
methods: {
onClick() {
this.$emit("click");
}
}
};
</script>
<style scoped>
.uni-fav {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
align-items: center;
justify-content: center;
width: 60px;
height: 25px;
line-height: 25px;
text-align: center;
border-radius: 3px;
}
.uni-fav--circle {
border-radius: 30px;
}
.uni-fav-star {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
height: 25px;
line-height: 24px;
margin-right: 3px;
align-items: center;
justify-content: center;
}
.uni-fav-text {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
height: 25px;
line-height: 25px;
align-items: center;
justify-content: center;
font-size: 28rpx;
}
</style>

View File

@@ -0,0 +1 @@
14f2cff4-2cef-4f8e-be97-808b4788f0b3

View File

@@ -0,0 +1,229 @@
<template>
<view class="uni-goods-nav">
<!-- 底部占位 -->
<view class="uni-tab__seat" />
<view class="uni-tab__cart-box flex">
<view class="flex uni-tab__cart-sub-left">
<view v-for="(item,index) in options" :key="index" class="flex uni-tab__cart-button-left uni-tab__shop-cart" @click="onClick(index,item)">
<view class="uni-tab__icon">
<uni-icons :type="item.icon" size="20" color="#646566"></uni-icons>
<!-- <image class="image" :src="item.icon" mode="widthFix" /> -->
</view>
<text class="uni-tab__text">{{ item.text }}</text>
<view class="flex uni-tab__dot-box">
<text v-if="item.info" :class="{ 'uni-tab__dots': item.info > 9 }" class="uni-tab__dot ">{{ item.info }}</text>
</view>
</view>
</view>
<view :class="{'uni-tab__right':fill}" class="flex uni-tab__cart-sub-right ">
<view v-for="(item,index) in buttonGroup" :key="index" :style="{backgroundColor:item.backgroundColor,color:item.color}" class="flex uni-tab__cart-button-right" @click="buttonClick(index,item)"><text class="uni-tab__cart-button-right-text">{{ item.text }}</text></view>
<!-- <view class="flex uni-tab__cart-button-right uni-tab__color-y ">立即购买</view> -->
</view>
</view>
</view>
</template>
<script>
import uniIcons from '../uni-icons/uni-icons.vue'
/**
* GoodsNav 商品导航
* @description 商品加入购物车、立即购买等
* @tutorial https://ext.dcloud.net.cn/plugin?id=865
* @property {Array} options 组件参数
* @property {Array} buttonGroup 组件按钮组参数
* @property {Boolean} fill = [true | false] 组件按钮组参数
* @event {Function} click 左侧点击事件
* @event {Function} buttonClick 右侧按钮组点击事件
* @example <uni-goods-nav :fill="true" options="" buttonGroup="buttonGroup" @click="" @buttonClick="" />
*/
export default {
name: 'UniGoodsNav',
components: {
uniIcons
},
props: {
options: {
type: Array,
default () {
return [{
icon: 'shop',
text: '店铺'
}, {
icon: 'cart',
text: '购物车'
}]
}
},
buttonGroup: {
type: Array,
default () {
return [{
text: '加入购物车',
backgroundColor: '#ffa200',
color: '#fff'
},
{
text: '立即购买',
backgroundColor: '#ff0000',
color: '#fff'
}
]
}
},
fill: {
type: Boolean,
default: false
}
},
methods: {
onClick(index, item) {
this.$emit('click', {
index,
content: item,
})
},
buttonClick(index, item) {
if (uni.report) {
uni.report(item.text, item.text)
}
this.$emit('buttonClick', {
index,
content: item
})
}
}
}
</script>
<style scoped>
.flex {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
}
.uni-goods-nav {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex: 1;
flex-direction: row;
}
.uni-tab__cart-box {
flex: 1;
height: 50px;
background-color: #fff;
z-index: 900;
}
.uni-tab__cart-sub-left {
padding: 0 5px;
}
.uni-tab__cart-sub-right {
flex: 1;
}
.uni-tab__right {
margin: 5px 0;
margin-right: 10px;
border-radius: 100px;
overflow: hidden;
}
.uni-tab__cart-button-left {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
/* flex: 1;
*/
position: relative;
justify-content: center;
align-items: center;
flex-direction: column;
margin: 0 10px;
}
.uni-tab__icon {
width: 18px;
height: 18px;
}
.image {
width: 18px;
height: 18px;
}
.uni-tab__text {
margin-top: 3px;
font-size: 24rpx;
color: #646566;
}
.uni-tab__cart-button-right {
/* #ifndef APP-NVUE */
display: flex;
flex-direction: column;
/* #endif */
flex: 1;
justify-content: center;
align-items: center;
}
.uni-tab__cart-button-right-text {
font-size: 28rpx;
color: #fff;
}
.uni-tab__cart-button-right:active {
opacity: 0.7;
}
.uni-tab__dot-box {
/* #ifndef APP-NVUE */
display: flex;
flex-direction: column;
/* #endif */
position: absolute;
right: -2px;
top: 2px;
justify-content: center;
align-items: center;
/* width: 0;
*/
/* height: 0;
*/
}
.uni-tab__dot {
/* width: 30rpx;
*/
/* height: 30rpx;
*/
padding: 0 4px;
line-height: 15px;
color: #ffffff;
text-align: center;
font-size: 12px;
background-color: #ff0000;
border-radius: 15px;
}
.uni-tab__dots {
padding: 0 4px;
/* width: auto;
*/
border-radius: 15px;
}
.uni-tab__color-y {
background-color: #ffa200;
}
.uni-tab__color-r {
background-color: #ff0000;
}
</style>

View File

@@ -0,0 +1 @@
7da56222-fc9a-4bec-9eb1-6fdf57b4fc6d

View File

@@ -0,0 +1,114 @@
<template>
<view v-if="width" :style="'width:'+width+';'+(square?'height:'+width:'')" class="uni-grid-item">
<view :class="{ 'uni-grid-item--border': showBorder, 'uni-grid-item--border-top': showBorder && index < column, 'uni-highlight': highlight }" :style="{ 'border-right-color': borderColor ,'border-bottom-color': borderColor ,'border-top-color': borderColor }" class="uni-grid-item__box" @click="_onClick">
<slot />
</view>
</view>
</template>
<script>
/**
* GridItem 宫格
* @description 宫格组件
* @tutorial https://ext.dcloud.net.cn/plugin?id=27
* @property {Number} index 子组件的唯一标识 点击gird会返回当前的标识
*/
export default {
name: 'UniGridItem',
inject: ['grid'],
props: {
index: {
type: Number,
default: 0
}
},
data() {
return {
column: 0,
showBorder: true,
square: true,
highlight: true,
left: 0,
top: 0,
openNum: 2,
width: 0,
borderColor: '#e5e5e5'
}
},
created() {
this.column = this.grid.column
this.showBorder = this.grid.showBorder
this.square = this.grid.square
this.highlight = this.grid.highlight
this.top = this.hor === 0 ? this.grid.hor : this.hor
this.left = this.ver === 0 ? this.grid.ver : this.ver
this.borderColor = this.grid.borderColor
this.grid.children.push(this)
// this.grid.init()
this.width = this.grid.width
},
beforeDestroy() {
this.grid.children.forEach((item, index) => {
if (item === this) {
this.grid.children.splice(index, 1)
}
})
},
methods: {
_onClick() {
this.grid.change({
detail: {
index: this.index
}
})
}
}
}
</script>
<style scoped>
.uni-grid-item {
/* #ifndef APP-NVUE */
height: 100%;
display: flex;
/* #endif */
}
.uni-grid-item__box {
/* #ifndef APP-NVUE */
display: flex;
width: 100%;
/* #endif */
position: relative;
flex: 1;
flex-direction: column;
/* justify-content: center;
*/
/* align-items: center;
*/
}
.uni-grid-item--border {
position: relative;
border-bottom-color: #e5e5e5;
border-bottom-style: solid;
border-bottom-width: 1px;
border-right-color: #e5e5e5;
border-right-style: solid;
border-right-width: 1px;
}
.uni-grid-item--border-top {
border-top-color: #e5e5e5;
border-top-style: solid;
border-top-width: 1px;
/* #ifndef APP-NVUE */
height: 100%;
box-sizing: border-box;
/* #endif */
}
.uni-highlight:active {
background-color: #f1f1f1;
}
</style>

View File

@@ -0,0 +1 @@
197d66f2-8305-49b3-a915-4de774842506

View File

@@ -0,0 +1,133 @@
<template>
<view class="uni-grid-wrap">
<view :id="elId" ref="uni-grid" class="uni-grid" :class="{ 'uni-grid--border': showBorder }" :style="{ 'border-left-style':'solid','border-left-color':borderColor, 'border-left-width':showBorder?'1px':0 }">
<slot />
</view>
</view>
</template>
<script>
// #ifdef APP-NVUE
const dom = uni.requireNativePlugin('dom');
// #endif
/**
* Grid 宫格
* @description 宫格组件
* @tutorial https://ext.dcloud.net.cn/plugin?id=27
* @property {Number} column 每列显示个数
* @property {String} borderColor 边框颜色
* @property {Boolean} showBorder 是否显示边框
* @property {Boolean} square 是否方形显示
* @property {Boolean} Boolean 点击背景是否高亮
* @event {Function} change 点击 grid 触发e={detail:{index:0}}index 为当前点击 gird 下标
*/
export default {
name: 'UniGrid',
props: {
// 每列显示个数
column: {
type: Number,
default: 3
},
// 是否显示边框
showBorder: {
type: Boolean,
default: true
},
// 边框颜色
borderColor: {
type: String,
default: '#e5e5e5'
},
// 是否正方形显示,默认为 true
square: {
type: Boolean,
default: true
},
highlight: {
type: Boolean,
default: true
}
},
provide() {
return {
grid: this
}
},
data() {
const elId = `Uni_${Math.ceil(Math.random() * 10e5).toString(36)}`
return {
elId,
width: 0
}
},
created() {
this.children = []
},
mounted() {
this.init()
},
methods: {
init() {
setTimeout(() => {
this._getSize((width) => {
this.children.forEach((item, index) => {
item.width = width
})
})
}, 50)
},
change(e) {
this.$emit('change', e)
},
_getSize(fn) {
// #ifndef APP-NVUE
uni.createSelectorQuery()
.in(this)
.select(`#${this.elId}`)
.boundingClientRect()
.exec(ret => {
this.width = parseInt((ret[0].width - 1) / this.column) + 'px'
fn(this.width)
})
// #endif
// #ifdef APP-NVUE
dom.getComponentRect(this.$refs['uni-grid'], (ret) => {
this.width = parseInt((ret.size.width - 1) / this.column) + 'px'
fn(this.width)
})
// #endif
}
}
}
</script>
<style scoped>
.uni-grid-wrap {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex: 1;
flex-direction: column;
/* #ifdef H5 */
width: 100%;
/* #endif */
}
.uni-grid {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
/* flex: 1;
*/
flex-direction: row;
flex-wrap: wrap;
}
.uni-grid--border {
border-left-color: #e5e5e5;
border-left-style: solid;
border-left-width: 1px;
}
</style>

View File

@@ -0,0 +1 @@
032c55c1-4024-4c40-ac61-cabb33de1dc0

View File

@@ -0,0 +1,132 @@
export default {
"pulldown": "\ue588",
"refreshempty": "\ue461",
"back": "\ue471",
"forward": "\ue470",
"more": "\ue507",
"more-filled": "\ue537",
"scan": "\ue612",
"qq": "\ue264",
"weibo": "\ue260",
"weixin": "\ue261",
"pengyouquan": "\ue262",
"loop": "\ue565",
"refresh": "\ue407",
"refresh-filled": "\ue437",
"arrowthindown": "\ue585",
"arrowthinleft": "\ue586",
"arrowthinright": "\ue587",
"arrowthinup": "\ue584",
"undo-filled": "\ue7d6",
"undo": "\ue406",
"redo": "\ue405",
"redo-filled": "\ue7d9",
"bars": "\ue563",
"chatboxes": "\ue203",
"camera": "\ue301",
"chatboxes-filled": "\ue233",
"camera-filled": "\ue7ef",
"cart-filled": "\ue7f4",
"cart": "\ue7f5",
"checkbox-filled": "\ue442",
"checkbox": "\ue7fa",
"arrowleft": "\ue582",
"arrowdown": "\ue581",
"arrowright": "\ue583",
"smallcircle-filled": "\ue801",
"arrowup": "\ue580",
"circle": "\ue411",
"eye-filled": "\ue568",
"eye-slash-filled": "\ue822",
"eye-slash": "\ue823",
"eye": "\ue824",
"flag-filled": "\ue825",
"flag": "\ue508",
"gear-filled": "\ue532",
"reload": "\ue462",
"gear": "\ue502",
"hand-thumbsdown-filled": "\ue83b",
"hand-thumbsdown": "\ue83c",
"hand-thumbsup-filled": "\ue83d",
"heart-filled": "\ue83e",
"hand-thumbsup": "\ue83f",
"heart": "\ue840",
"home": "\ue500",
"info": "\ue504",
"home-filled": "\ue530",
"info-filled": "\ue534",
"circle-filled": "\ue441",
"chat-filled": "\ue847",
"chat": "\ue263",
"mail-open-filled": "\ue84d",
"email-filled": "\ue231",
"mail-open": "\ue84e",
"email": "\ue201",
"checkmarkempty": "\ue472",
"list": "\ue562",
"locked-filled": "\ue856",
"locked": "\ue506",
"map-filled": "\ue85c",
"map-pin": "\ue85e",
"map-pin-ellipse": "\ue864",
"map": "\ue364",
"minus-filled": "\ue440",
"mic-filled": "\ue332",
"minus": "\ue410",
"micoff": "\ue360",
"mic": "\ue302",
"clear": "\ue434",
"smallcircle": "\ue868",
"close": "\ue404",
"closeempty": "\ue460",
"paperclip": "\ue567",
"paperplane": "\ue503",
"paperplane-filled": "\ue86e",
"person-filled": "\ue131",
"contact-filled": "\ue130",
"person": "\ue101",
"contact": "\ue100",
"images-filled": "\ue87a",
"phone": "\ue200",
"images": "\ue87b",
"image": "\ue363",
"image-filled": "\ue877",
"location-filled": "\ue333",
"location": "\ue303",
"plus-filled": "\ue439",
"plus": "\ue409",
"plusempty": "\ue468",
"help-filled": "\ue535",
"help": "\ue505",
"navigate-filled": "\ue884",
"navigate": "\ue501",
"mic-slash-filled": "\ue892",
"search": "\ue466",
"settings": "\ue560",
"sound": "\ue590",
"sound-filled": "\ue8a1",
"spinner-cycle": "\ue465",
"download-filled": "\ue8a4",
"personadd-filled": "\ue132",
"videocam-filled": "\ue8af",
"personadd": "\ue102",
"upload": "\ue402",
"upload-filled": "\ue8b1",
"starhalf": "\ue463",
"star-filled": "\ue438",
"star": "\ue408",
"trash": "\ue401",
"phone-filled": "\ue230",
"compose": "\ue400",
"videocam": "\ue300",
"trash-filled": "\ue8dc",
"download": "\ue403",
"chatbubble-filled": "\ue232",
"chatbubble": "\ue202",
"cloud-download": "\ue8e4",
"cloud-upload-filled": "\ue8e5",
"cloud-upload": "\ue8e6",
"cloud-download-filled": "\ue8e9",
"headphones":"\ue8bf",
"shop":"\ue609"
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
886b1144-11b6-4c09-b27f-fa27aa61a706

View File

@@ -0,0 +1,142 @@
<template>
<view>
<view v-if="loaded || list.itemIndex < 15" class="uni-indexed-list__title-wrapper">
<text v-if="list.items && list.items.length > 0" class="uni-indexed-list__title">{{ list.key }}</text>
</view>
<view v-if="(loaded || list.itemIndex < 15) && list.items && list.items.length > 0" class="uni-indexed-list__list">
<view v-for="(item, index) in list.items" :key="index" class="uni-indexed-list__item" hover-class="uni-indexed-list__item--hover">
<view class="uni-indexed-list__item-container" @click="onClick(idx, index)">
<view class="uni-indexed-list__item-border" :class="{'uni-indexed-list__item-border--last':index===list.items.length-1}">
<view v-if="showSelect" style="margin-right: 20rpx;">
<uni-icons :type="item.checked ? 'checkbox-filled' : 'circle'" :color="item.checked ? '#007aff' : '#aaa'" size="24" />
</view>
<text class="uni-indexed-list__item-content">{{ item.name }}</text>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
import uniIcons from '../uni-icons/uni-icons.vue'
export default {
name: 'UniIndexedList',
components: {
uniIcons
},
props: {
loaded: {
type: Boolean,
default: false
},
idx: {
type: Number,
default: 0
},
list: {
type: Object,
default () {
return {}
}
},
showSelect: {
type: Boolean,
default: false
}
},
methods: {
onClick(idx, index) {
this.$emit("itemClick", {
idx,
index
})
}
}
}
</script>
<style scoped>
.uni-indexed-list__list {
background-color: #ffffff;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
border-top-style: solid;
border-top-width: 1px;
border-top-color: #e5e5e5;
}
.uni-indexed-list__item {
font-size: 32rpx;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex: 1;
flex-direction: row;
justify-content: space-between;
align-items: center;
}
.uni-indexed-list__item-container {
padding-left: 30rpx;
flex: 1;
position: relative;
/* #ifndef APP-NVUE */
display: flex;
box-sizing: border-box;
/* #endif */
flex-direction: row;
justify-content: space-between;
align-items: center;
}
.uni-indexed-list__item-border {
flex: 1;
position: relative;
/* #ifndef APP-NVUE */
display: flex;
box-sizing: border-box;
/* #endif */
flex-direction: row;
justify-content: space-between;
align-items: center;
height: 50px;
padding: 30rpx;
padding-left: 0;
border-bottom-style: solid;
border-bottom-width: 1px;
border-bottom-color: #e5e5e5;
}
.uni-indexed-list__item-border--last {
border-bottom-width: 0px;
}
.uni-indexed-list__item-content {
flex: 1;
font-size: 14px;
}
.uni-indexed-list {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
}
.uni-indexed-list__title-wrapper {
/* #ifndef APP-NVUE */
display: flex;
width: 100%;
/* #endif */
background-color: #f7f7f7;
}
.uni-indexed-list__title {
padding: 6px 12px;
line-height: 24px;
font-size: 24rpx;
}
</style>

View File

@@ -0,0 +1,314 @@
<template>
<view class="uni-indexed-list" ref="list" id="list">
<!-- #ifdef APP-NVUE -->
<list class="uni-indexed-list__scroll" scrollable="true" show-scrollbar="false">
<cell v-for="(list, idx) in lists" :key="idx" :ref="'uni-indexed-list-' + idx">
<!-- #endif -->
<!-- #ifndef APP-NVUE -->
<scroll-view :scroll-into-view="scrollViewId" class="uni-indexed-list__scroll" scroll-y>
<view v-for="(list, idx) in lists" :key="idx" :id="'uni-indexed-list-' + idx">
<!-- #endif -->
<uni-indexed-list-item :list="list" :loaded="loaded" :idx="idx" :showSelect="showSelect" @itemClick="onClick"></uni-indexed-list-item>
<!-- #ifndef APP-NVUE -->
</view>
</scroll-view>
<!-- #endif -->
<!-- #ifdef APP-NVUE -->
</cell>
</list>
<!-- #endif -->
<view :class="touchmove ? 'uni-indexed-list__menu--active' : ''" @touchstart="touchStart" @touchmove.stop.prevent="touchMove" @touchend="touchEnd" class="uni-indexed-list__menu">
<view v-for="(list, key) in lists" :key="key" class="uni-indexed-list__menu-item">
<text class="uni-indexed-list__menu-text" :class="touchmoveIndex == key ? 'uni-indexed-list__menu-text--active' : ''">{{ list.key }}</text>
</view>
</view>
<view v-if="touchmove" class="uni-indexed-list__alert-wrapper">
<text class="uni-indexed-list__alert">{{ lists[touchmoveIndex].key }}</text>
</view>
</view>
</template>
<script>
import uniIcons from '../uni-icons/uni-icons.vue'
import uniIndexedListItem from './uni-indexed-list-item.vue'
// #ifdef APP-NVUE
const dom = weex.requireModule('dom');
// #endif
// #ifdef APP-PLUS
function throttle(func, delay) {
var prev = Date.now();
return function() {
var context = this;
var args = arguments;
var now = Date.now();
if (now - prev >= delay) {
func.apply(context, args);
prev = Date.now();
}
}
}
function touchMove(e) {
let pageY = e.touches[0].pageY
let index = Math.floor(pageY / this.itemHeight)
if (this.touchmoveIndex === index) {
return false
}
let item = this.lists[index]
if (item) {
// #ifndef APP-NVUE
this.scrollViewId = 'uni-indexed-list-' + index
this.touchmoveIndex = index
// #endif
// #ifdef APP-NVUE
dom.scrollToElement(this.$refs['uni-indexed-list-' + index][0], {
animated: false
})
this.touchmoveIndex = index
// #endif
}
}
const throttleTouchMove = throttle(touchMove, 40)
// #endif
/**
* IndexedList 索引列表
* @description 用于展示索引列表
* @tutorial https://ext.dcloud.net.cn/plugin?id=375
* @property {Boolean} showSelect = [true|false] 展示模式
* @value true 展示模式
* @value false 选择模式
* @property {Object} options 索引列表需要的数据对象
* @event {Function} click 点击列表事件 ,返回当前选择项的事件对象
* @example <uni-indexed-list options="" showSelect="false" @click=""></uni-indexed-list>
*/
export default {
name: 'UniIndexedList',
components: {
uniIcons,
uniIndexedListItem
},
props: {
options: {
type: Array,
default () {
return []
}
},
showSelect: {
type: Boolean,
default: false
}
},
data() {
return {
lists: [],
winHeight: 0,
itemHeight: 0,
touchmove: false,
touchmoveIndex: -1,
scrollViewId: '',
touchmoveTimeout: '',
loaded: false
}
},
watch: {
options: {
handler: function() {
this.setList()
},
deep: true
}
},
mounted() {
setTimeout(() => {
this.setList()
}, 50)
setTimeout(() => {
this.loaded = true
}, 300);
},
methods: {
setList() {
let index = 0;
this.lists = []
this.options.forEach((value, index) => {
if (value.data.length === 0) {
return
}
let indexBefore = index
let items = value.data.map(item => {
let obj = {}
obj['key'] = value.letter
obj['name'] = item
obj['itemIndex'] = index
index++
obj.checked = item.checked ? item.checked : false
return obj
})
this.lists.push({
title: value.letter,
key: value.letter,
items: items,
itemIndex: indexBefore
})
})
// #ifndef APP-NVUE
uni.createSelectorQuery()
.in(this)
.select('#list')
.boundingClientRect()
.exec(ret => {
this.winHeight = ret[0].height
this.itemHeight = this.winHeight / this.lists.length
})
// #endif
// #ifdef APP-NVUE
dom.getComponentRect(this.$refs['list'], (res) => {
this.winHeight = res.size.height
this.itemHeight = this.winHeight / this.lists.length
})
// #endif
},
touchStart(e) {
this.touchmove = true
let pageY = e.touches[0].pageY
let index = Math.floor(pageY / this.itemHeight)
let item = this.lists[index]
if (item) {
this.scrollViewId = 'uni-indexed-list-' + index
this.touchmoveIndex = index
// #ifdef APP-NVUE
dom.scrollToElement(this.$refs['uni-indexed-list-' + index][0], {
animated: false
})
// #endif
}
},
touchMove(e) {
// #ifndef APP-PLUS
let pageY = e.touches[0].pageY
let index = Math.floor(pageY / this.itemHeight)
if (this.touchmoveIndex === index) {
return false
}
let item = this.lists[index]
if (item) {
this.scrollViewId = 'uni-indexed-list-' + index
this.touchmoveIndex = index
}
// #endif
// #ifdef APP-PLUS
throttleTouchMove.call(this, e)
// #endif
},
touchEnd() {
this.touchmove = false
this.touchmoveIndex = -1
},
onClick(e) {
let {
idx,
index
} = e
let obj = {}
for (let key in this.lists[idx].items[index]) {
obj[key] = this.lists[idx].items[index][key]
}
let select = []
if (this.showSelect) {
this.lists[idx].items[index].checked = !this.lists[idx].items[index].checked
this.lists.forEach((value, idx) => {
value.items.forEach((item, index) => {
if (item.checked) {
let obj = {}
for (let key in this.lists[idx].items[index]) {
obj[key] = this.lists[idx].items[index][key]
}
select.push(obj)
}
})
})
}
this.$emit('click', {
item: obj,
select: select
})
}
}
}
</script>
<style scoped>
.uni-indexed-list {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
}
.uni-indexed-list__scroll {
flex: 1;
}
.uni-indexed-list__menu {
width: 24px;
background-color: lightgrey;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
}
.uni-indexed-list__menu-item {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex: 1;
align-items: center;
justify-content: center;
}
.uni-indexed-list__menu-text {
line-height: 20px;
font-size: 12px;
text-align: center;
color: #aaa;
}
.uni-indexed-list__menu--active {
background-color: rgb(200, 200, 200);
}
.uni-indexed-list__menu-text--active {
color: #007aff;
}
.uni-indexed-list__alert-wrapper {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
align-items: center;
justify-content: center;
}
.uni-indexed-list__alert {
width: 80px;
height: 80px;
border-radius: 80px;
text-align: center;
line-height: 80px;
font-size: 35px;
color: #fff;
background-color: rgba(0, 0, 0, 0.5);
}
</style>

View File

@@ -0,0 +1 @@
74bb6ef4-8d97-4b17-ae03-af153dd59b1c

View File

@@ -0,0 +1,71 @@
<template>
<text class="uni-link" :class="{'uni-link--withline':showUnderLine===true||showUnderLine==='true'}" :style="{color,fontSize:fontSize+'px'}" @click="openURL">{{text}}</text>
</template>
<script>
/**
* Link 外部网页超链接组件
* @description uni-link是一个外部网页超链接组件在小程序内复制url在app内打开外部浏览器在h5端打开新网页
* @property {String} href 点击后打开的外部网页url
* @property {String} text 显示的文字
* @property {Boolean} showUnderLine 是否显示下划线
* @property {String} copyTips 在小程序端复制链接时显示的提示语
* @property {String} color 链接文字颜色
* @property {String} fontSize 链接文字大小
* @example * <uni-link href="https://ext.dcloud.net.cn" text="https://ext.dcloud.net.cn"></uni-link>
*/
export default {
name: 'uniLink',
props: {
href: {
type: String,
default: ''
},
text: {
type: String,
default: ''
},
showUnderLine: {
type: [Boolean, String],
default: true
},
copyTips: {
type: String,
default: '已自动复制网址,请在手机浏览器里粘贴该网址'
},
color: {
type: String,
default: '#999999'
},
fontSize: {
type: [Number, String],
default: 14
}
},
methods: {
openURL() {
// #ifdef APP-PLUS
plus.runtime.openURL(this.href)
// #endif
// #ifdef H5
window.open(this.href)
// #endif
// #ifdef MP
uni.setClipboardData({
data: this.href
});
uni.showModal({
content: this.copyTips,
showCancel: false
});
// #endif
}
}
}
</script>
<style scoped>
.uni-link--withline {
text-decoration: underline;
}
</style>

View File

@@ -0,0 +1 @@
2b5b8d76-3a83-4bef-8079-79536cfca8c5

View File

@@ -0,0 +1,269 @@
<template>
<!-- #ifdef APP-NVUE -->
<cell>
<!-- #endif -->
<view :class="disabled ? 'uni-list-item--disabled' : ''" :hover-class="disabled || showSwitch ? '' : 'uni-list-item--hover'" class="uni-list-item" @click="onClick">
<view class="uni-list-item__container" :class="{'uni-list-item--first':isFirstChild}">
<view v-if="thumb" class="uni-list-item__icon">
<image :src="thumb" class="uni-list-item__icon-img" />
</view>
<view v-else-if="showExtraIcon" class="uni-list-item__icon">
<uni-icons :color="extraIcon.color" :size="extraIcon.size" :type="extraIcon.type" class="uni-icon-wrapper" />
</view>
<view class="uni-list-item__content">
<slot />
<text class="uni-list-item__content-title">{{ title }}</text>
<text v-if="note" class="uni-list-item__content-note">{{ note }}</text>
</view>
<view v-if="showBadge || showArrow || showSwitch" class="uni-list-item__extra">
<text v-if="rightText" class="uni-list-item__extra-text">{{rightText}}</text>
<uni-badge v-if="showBadge" :type="badgeType" :text="badgeText" />
<switch v-if="showSwitch" :disabled="disabled" :checked="switchChecked" @change="onSwitchChange" />
<uni-icons v-if="showArrow" :size="20" class="uni-icon-wrapper" color="#bbb" type="arrowright" />
</view>
</view>
</view>
<!-- #ifdef APP-NVUE -->
</cell>
<!-- #endif -->
</template>
<script>
import uniIcons from '../uni-icons/uni-icons.vue'
import uniBadge from '../uni-badge/uni-badge.vue'
/**
* ListItem 列表子组件
* @description 列表子组件
* @tutorial https://ext.dcloud.net.cn/plugin?id=24
* @property {String} title 标题
* @property {String} note 描述
* @property {String} thumb 左侧缩略图若thumb有值则不会显示扩展图标
* @property {String} badgeText 数字角标内容
* @property {String} badgeType 数字角标类型,参考[uni-icons](https://ext.dcloud.net.cn/plugin?id=21)
* @property {String} rightText 右侧文字内容
* @property {Boolean} disabled = [true|false]是否禁用
* @property {Boolean} showArrow = [true|false] 是否显示箭头图标
* @property {Boolean} showBadge = [true|false] 是否显示数字角标
* @property {Boolean} showSwitch = [true|false] 是否显示Switch
* @property {Boolean} switchChecked = [true|false] Switch是否被选中
* @property {Boolean} showExtraIcon = [true|false] 左侧是否显示扩展图标
* @property {Boolean} scrollY = [true|false] 允许纵向滚动,需要显式的设置其宽高
* @property {Object} extraIcon 扩展图标参数,格式为 {color: '#4cd964',size: '22',type: 'spinner'}
* @event {Function} click 点击 uniListItem 触发事件
* @event {Function} switchChange 点击切换 Switch 时触发
*/
export default {
name: 'UniListItem',
components: {
uniIcons,
uniBadge
},
props: {
title: {
type: String,
default: ''
}, // 列表标题
note: {
type: String,
default: ''
}, // 列表描述
disabled: {
// 是否禁用
type: [Boolean, String],
default: false
},
showArrow: {
// 是否显示箭头
type: [Boolean, String],
default: true
},
showBadge: {
// 是否显示数字角标
type: [Boolean, String],
default: false
},
showSwitch: {
// 是否显示Switch
type: [Boolean, String],
default: false
},
switchChecked: {
// Switch是否被选中
type: [Boolean, String],
default: false
},
badgeText: {
// badge内容
type: String,
default: ''
},
badgeType: {
// badge类型
type: String,
default: 'success'
},
rightText: {
// 右侧文字内容
type: String,
default: ''
},
thumb: {
// 缩略图
type: String,
default: ''
},
showExtraIcon: {
// 是否显示扩展图标
type: [Boolean, String],
default: false
},
extraIcon: {
type: Object,
default () {
return {
type: 'contact',
color: '#000000',
size: 20
}
}
}
},
inject: ['list'],
data() {
return {
isFirstChild: false
}
},
mounted() {
if (!this.list.firstChildAppend) {
this.list.firstChildAppend = true
this.isFirstChild = true
}
},
methods: {
onClick() {
this.$emit('click')
},
onSwitchChange(e) {
this.$emit('switchChange', e.detail)
}
}
}
</script>
<style scoped>
.uni-list-item {
font-size: 32rpx;
position: relative;
flex-direction: column;
justify-content: space-between;
padding-left: 30rpx;
}
.uni-list-item--disabled {
opacity: 0.3;
}
.uni-list-item--hover {
background-color: #f1f1f1;
}
.uni-list-item__container {
position: relative;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
padding: 24rpx 30rpx;
padding-left: 0;
flex: 1;
position: relative;
justify-content: space-between;
align-items: center;
/* #ifdef APP-PLUS */
border-top-color: #e5e5e5;
border-top-style: solid;
border-top-width: 0.5px;
/* #endif */
}
.uni-list-item--first {
border-top-width: 0px;
}
/* #ifndef APP-NVUE */
.uni-list-item__container:after {
position: absolute;
top: 0;
right: 0;
left: 0;
height: 1px;
content: '';
-webkit-transform: scaleY(.5);
transform: scaleY(.5);
background-color: #e5e5e5;
}
.uni-list-item--first:after {
height: 0px;
}
/* #endif */
.uni-list-item__content {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex: 1;
overflow: hidden;
flex-direction: column;
color: #3b4144;
}
.uni-list-item__content-title {
font-size: 28rpx;
color: #3b4144;
overflow: hidden;
}
.uni-list-item__content-note {
margin-top: 6rpx;
color: #999;
font-size: 24rpx;
overflow: hidden;
}
.uni-list-item__extra {
/* width: 25%;
*/
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
justify-content: flex-end;
align-items: center;
}
.uni-list-item__icon {
margin-right: 18rpx;
flex-direction: row;
justify-content: center;
align-items: center;
}
.uni-list-item__icon-img {
height: 52rpx;
width: 52rpx;
}
.uni-list-item__extra-text {
color: #999;
font-size: 24rpx;
}
</style>

View File

@@ -0,0 +1 @@
8b4d3016-efe9-44f9-9765-481fd88982d5

View File

@@ -0,0 +1,78 @@
<template>
<!-- #ifndef APP-NVUE -->
<view class="uni-list">
<slot />
</view>
<!-- #endif -->
<!-- #ifdef APP-NVUE -->
<list class="uni-list" :enableBackToTop="enableBackToTop" loadmoreoffset="15" :scroll-y="scrollY" @loadmore="loadMore">
<slot />
</list>
<!-- #endif -->
</template>
<script>
/**
* List 列表
* @description 列表组件
* @tutorial https://ext.dcloud.net.cn/plugin?id=24
*/
export default {
name: 'UniList',
'mp-weixin': {
options: {
multipleSlots: false
}
},
props: {
enableBackToTop: {
type: [Boolean, String],
default: false
},
scrollY: {
type: [Boolean, String],
default: false
}
},
provide() {
return {
list: this
}
},
created() {
this.firstChildAppend = false
},
methods: {
loadMore(e) {
this.$emit("scrolltolower");
}
}
}
</script>
<style scoped>
.uni-list {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
background-color: #ffffff;
position: relative;
flex-direction: column;
/* border-bottom-color: $uni-border-color;
*/
/* border-bottom-style: solid;
*/
/* border-bottom-width: 1px;
*/
}
/* #ifndef APP-NVUE */
.uni-list:before {
height: 0;
}
.uni-list:after {
height: 0;
}
/* #endif */
</style>

View File

@@ -0,0 +1,65 @@
<template>
<!-- #ifdef APP-NVUE -->
<refresh :display="display" @refresh="onrefresh" @pullingdown="onpullingdown">
<slot />
</refresh>
<!-- #endif -->
<!-- #ifndef APP-NVUE -->
<view ref="uni-refresh" class="uni-refresh" v-show="isShow">
<slot />
</view>
<!-- #endif -->
</template>
<script>
export default {
name: 'UniRefresh',
props: {
display: {
type: [String],
default: "hide"
}
},
data() {
return {
pulling: false
}
},
computed: {
isShow() {
if (this.display === "show" || this.pulling === true) {
return true;
}
return false;
}
},
created() {},
methods: {
onchange(value) {
this.pulling = value;
},
onrefresh(e) {
this.$emit("refresh", e);
},
onpullingdown(e) {
// #ifdef APP-NVUE
this.$emit("pullingdown", e);
// #endif
// #ifndef APP-NVUE
var detail = {
viewHeight: 90,
pullingDistance: e.height
}
this.$emit("pullingdown", detail);
// #endif
}
}
}
</script>
<style scoped>
.uni-refresh {
height: 0;
overflow: hidden;
}
</style>

View File

@@ -0,0 +1,87 @@
var pullDown = {
threshold: 95,
maxHeight: 200,
callRefresh: 'onrefresh',
callPullingDown: 'onpullingdown',
refreshSelector: '.uni-refresh'
};
function ready(newValue, oldValue, ownerInstance, instance) {
var state = instance.getState()
state.canPullDown = newValue;
// console.log(newValue);
}
function touchStart(e, instance) {
var state = instance.getState();
state.refreshInstance = instance.selectComponent(pullDown.refreshSelector);
state.canPullDown = (state.refreshInstance != null && state.refreshInstance != undefined);
if (!state.canPullDown) {
return
}
// console.log("touchStart");
state.height = 0;
state.touchStartY = e.touches[0].pageY || e.changedTouches[0].pageY;
state.refreshInstance.setStyle({
'height': 0
});
state.refreshInstance.callMethod("onchange", true);
}
function touchMove(e, ownerInstance) {
var instance = e.instance;
var state = instance.getState();
if (!state.canPullDown) {
return
}
var oldHeight = state.height;
var endY = e.touches[0].pageY || e.changedTouches[0].pageY;
var height = endY - state.touchStartY;
if (height > pullDown.maxHeight) {
return;
}
var refreshInstance = state.refreshInstance;
refreshInstance.setStyle({
'height': height + 'px'
});
height = height < pullDown.maxHeight ? height : pullDown.maxHeight;
state.height = height;
refreshInstance.callMethod(pullDown.callPullingDown, {
height: height
});
}
function touchEnd(e, ownerInstance) {
var state = e.instance.getState();
if (!state.canPullDown) {
return
}
state.refreshInstance.callMethod("onchange", false);
var refreshInstance = state.refreshInstance;
if (state.height > pullDown.threshold) {
refreshInstance.callMethod(pullDown.callRefresh);
return;
}
refreshInstance.setStyle({
'height': 0
});
}
function propObserver(newValue, oldValue, instance) {
pullDown = newValue;
}
module.exports = {
touchmove: touchMove,
touchstart: touchStart,
touchend: touchEnd,
propObserver: propObserver
}

View File

@@ -0,0 +1 @@
bd35f8f9-d8a4-48dc-a339-46f7815c553f

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
6e22ab6f-6c95-485a-8590-5d76191d1f48

View File

@@ -0,0 +1,235 @@
<template>
<view class="uni-navbar">
<view :class="{ 'uni-navbar--fixed': fixed, 'uni-navbar--shadow': shadow, 'uni-navbar--border': border }" :style="{ 'background-color': backgroundColor }" class="uni-navbar__content">
<uni-status-bar v-if="statusBar" />
<view :style="{ color: color,backgroundColor: backgroundColor }" class="uni-navbar__header uni-navbar__content_view">
<view @tap="onClickLeft" class="uni-navbar__header-btns uni-navbar__header-btns-left uni-navbar__content_view">
<view class="uni-navbar__content_view" v-if="leftIcon.length">
<uni-icons :color="color" :type="leftIcon" size="24" />
</view>
<view :class="{ 'uni-navbar-btn-icon-left': !leftIcon.length }" class="uni-navbar-btn-text uni-navbar__content_view" v-if="leftText.length">
<text :style="{ color: color, fontSize: '14px' }">{{ leftText }}</text>
</view>
<slot name="left" />
</view>
<view class="uni-navbar__header-container uni-navbar__content_view">
<view class="uni-navbar__header-container-inner uni-navbar__content_view" v-if="title.length">
<text class="uni-nav-bar-text" :style="{color: color }">{{ title }}</text>
</view>
<!-- 标题插槽 -->
<slot />
</view>
<view :class="title.length ? 'uni-navbar__header-btns-right' : ''" @tap="onClickRight" class="uni-navbar__header-btns uni-navbar__content_view">
<view class="uni-navbar__content_view" v-if="rightIcon.length">
<uni-icons :color="color" :type="rightIcon" size="24" />
</view>
<!-- 优先显示图标 -->
<view class="uni-navbar-btn-text uni-navbar__content_view" v-if="rightText.length && !rightIcon.length">
<text class="uni-nav-bar-right-text">{{ rightText }}</text>
</view>
<slot name="right" />
</view>
</view>
</view>
<view class="uni-navbar__placeholder" v-if="fixed">
<uni-status-bar v-if="statusBar" />
<view class="uni-navbar__placeholder-view" />
</view>
</view>
</template>
<script>
import uniStatusBar from "../uni-status-bar/uni-status-bar.vue";
import uniIcons from "../uni-icons/uni-icons.vue";
/**
* NavBar 自定义导航栏
* @description 导航栏组件,主要用于头部导航
* @tutorial https://ext.dcloud.net.cn/plugin?id=52
* @property {String} title 标题文字
* @property {String} leftText 左侧按钮文本
* @property {String} rightText 右侧按钮文本
* @property {String} leftIcon 左侧按钮图标(图标类型参考 [Icon 图标](http://ext.dcloud.net.cn/plugin?id=28) type 属性)
* @property {String} rightIcon 右侧按钮图标(图标类型参考 [Icon 图标](http://ext.dcloud.net.cn/plugin?id=28) type 属性)
* @property {String} color 图标和文字颜色
* @property {String} backgroundColor 导航栏背景颜色
* @property {Boolean} fixed = [true|false] 是否固定顶部
* @property {Boolean} statusBar = [true|false] 是否包含状态栏
* @property {Boolean} shadow = [true|false] 导航栏下是否有阴影
* @event {Function} clickLeft 左侧按钮点击时触发
* @event {Function} clickRight 右侧按钮点击时触发
*/
export default {
name: "UniNavBar",
components: {
uniStatusBar,
uniIcons
},
props: {
title: {
type: String,
default: ""
},
leftText: {
type: String,
default: ""
},
rightText: {
type: String,
default: ""
},
leftIcon: {
type: String,
default: ""
},
rightIcon: {
type: String,
default: ""
},
fixed: {
type: [Boolean, String],
default: false
},
color: {
type: String,
default: "#000000"
},
backgroundColor: {
type: String,
default: "#FFFFFF"
},
statusBar: {
type: [Boolean, String],
default: false
},
shadow: {
type: [Boolean, String],
default: false
},
border: {
type: [Boolean, String],
default: true
}
},
mounted() {
if (uni.report && this.title !== '') {
uni.report('title', this.title)
}
},
methods: {
onClickLeft() {
this.$emit("clickLeft");
},
onClickRight() {
this.$emit("clickRight");
}
}
};
</script>
<style scoped>
.uni-nav-bar-text {
/* #ifdef APP-PLUS */
font-size: 34rpx;
/* #endif */
/* #ifndef APP-PLUS */
font-size: 32rpx;
/* #endif */
}
.uni-nav-bar-right-text {
font-size: 28rpx;
}
.uni-navbar__content {
position: relative;
background-color: #ffffff;
overflow: hidden;
}
.uni-navbar__content_view {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
align-items: center;
flex-direction: row;
/* background-color: #FFFFFF;
*/
}
.uni-navbar__header {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
height: 44px;
line-height: 44px;
font-size: 16px;
/* background-color: #ffffff;
*/
}
.uni-navbar__header-btns {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-wrap: nowrap;
width: 120rpx;
padding: 0 6px;
justify-content: center;
align-items: center;
}
.uni-navbar__header-btns-left {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
width: 150rpx;
justify-content: flex-start;
}
.uni-navbar__header-btns-right {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
width: 150rpx;
padding-right: 30rpx;
justify-content: flex-end;
}
.uni-navbar__header-container {
flex: 1;
}
.uni-navbar__header-container-inner {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex: 1;
align-items: center;
justify-content: center;
font-size: 28rpx;
}
.uni-navbar__placeholder-view {
height: 44px;
}
.uni-navbar--fixed {
position: fixed;
z-index: 998;
}
.uni-navbar--shadow {
/* #ifndef APP-NVUE */
box-shadow: 0 1px 6px #ccc;
/* #endif */
}
.uni-navbar--border {
border-bottom-width: 1rpx;
border-bottom-style: solid;
border-bottom-color: #e5e5e5;
}
</style>

Some files were not shown because too many files have changed in this diff Show More